diff options
Diffstat (limited to 'mm/vmalloc.c')
| -rw-r--r-- | mm/vmalloc.c | 20 | 
1 files changed, 15 insertions, 5 deletions
| diff --git a/mm/vmalloc.c b/mm/vmalloc.c index c5db9a7264d9..75f49d312e8c 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -14,7 +14,6 @@  #include <linux/highmem.h>  #include <linux/slab.h>  #include <linux/spinlock.h> -#include <linux/mutex.h>  #include <linux/interrupt.h>  #include <linux/proc_fs.h>  #include <linux/seq_file.h> @@ -24,6 +23,7 @@  #include <linux/rbtree.h>  #include <linux/radix-tree.h>  #include <linux/rcupdate.h> +#include <linux/bootmem.h>  #include <asm/atomic.h>  #include <asm/uaccess.h> @@ -495,7 +495,7 @@ static atomic_t vmap_lazy_nr = ATOMIC_INIT(0);  static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,  					int sync, int force_flush)  { -	static DEFINE_MUTEX(purge_lock); +	static DEFINE_SPINLOCK(purge_lock);  	LIST_HEAD(valist);  	struct vmap_area *va;  	int nr = 0; @@ -506,10 +506,10 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,  	 * the case that isn't actually used at the moment anyway.  	 */  	if (!sync && !force_flush) { -		if (!mutex_trylock(&purge_lock)) +		if (!spin_trylock(&purge_lock))  			return;  	} else -		mutex_lock(&purge_lock); +		spin_lock(&purge_lock);  	rcu_read_lock();  	list_for_each_entry_rcu(va, &vmap_area_list, list) { @@ -541,7 +541,7 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,  			__free_vmap_area(va);  		spin_unlock(&vmap_area_lock);  	} -	mutex_unlock(&purge_lock); +	spin_unlock(&purge_lock);  }  /* @@ -984,6 +984,8 @@ EXPORT_SYMBOL(vm_map_ram);  void __init vmalloc_init(void)  { +	struct vmap_area *va; +	struct vm_struct *tmp;  	int i;  	for_each_possible_cpu(i) { @@ -996,6 +998,14 @@ void __init vmalloc_init(void)  		vbq->nr_dirty = 0;  	} +	/* Import existing vmlist entries. */ +	for (tmp = vmlist; tmp; tmp = tmp->next) { +		va = alloc_bootmem(sizeof(struct vmap_area)); +		va->flags = tmp->flags | VM_VM_AREA; +		va->va_start = (unsigned long)tmp->addr; +		va->va_end = va->va_start + tmp->size; +		__insert_vmap_area(va); +	}  	vmap_initialized = true;  } | 
