diff options
| author | Tejun Heo <tj@kernel.org> | 2009-08-14 15:00:52 +0900 | 
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2009-08-14 15:00:52 +0900 | 
| commit | cf88c79006bd6a09ad725ba0b34c0e23db20b19e (patch) | |
| tree | 7c1467a7350a33c2986fb0bb08d733b02a3fd259 | |
| parent | bba174f5e03a40a4ab1c63a2272ea5530b98a067 (diff) | |
| download | olio-linux-3.10-cf88c79006bd6a09ad725ba0b34c0e23db20b19e.tar.xz olio-linux-3.10-cf88c79006bd6a09ad725ba0b34c0e23db20b19e.zip  | |
vmalloc: separate out insert_vmalloc_vm()
Separate out insert_vmalloc_vm() from __get_vm_area_node().
insert_vmalloc_vm() initializes vm_struct from vmap_area and inserts
it into vmlist.  insert_vmalloc_vm() only initializes fields which can
be determined from @vm, @flags and @caller The rest should be
initialized by the caller.  For __get_vm_area_node(), all other fields
just need to be cleared and this is done by using kzalloc instead of
kmalloc.
This will be used to implement pcpu_get_vm_areas().
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Nick Piggin <npiggin@suse.de>
| -rw-r--r-- | mm/vmalloc.c | 45 | 
1 files changed, 24 insertions, 21 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index f8189a4b3e1..2eb461c3a46 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -1122,13 +1122,34 @@ EXPORT_SYMBOL_GPL(map_vm_area);  DEFINE_RWLOCK(vmlist_lock);  struct vm_struct *vmlist; +static void insert_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, +			      unsigned long flags, void *caller) +{ +	struct vm_struct *tmp, **p; + +	vm->flags = flags; +	vm->addr = (void *)va->va_start; +	vm->size = va->va_end - va->va_start; +	vm->caller = caller; +	va->private = vm; +	va->flags |= VM_VM_AREA; + +	write_lock(&vmlist_lock); +	for (p = &vmlist; (tmp = *p) != NULL; p = &tmp->next) { +		if (tmp->addr >= vm->addr) +			break; +	} +	vm->next = *p; +	*p = vm; +	write_unlock(&vmlist_lock); +} +  static struct vm_struct *__get_vm_area_node(unsigned long size,  		unsigned long flags, unsigned long start, unsigned long end,  		int node, gfp_t gfp_mask, void *caller)  {  	static struct vmap_area *va;  	struct vm_struct *area; -	struct vm_struct *tmp, **p;  	unsigned long align = 1;  	BUG_ON(in_interrupt()); @@ -1147,7 +1168,7 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,  	if (unlikely(!size))  		return NULL; -	area = kmalloc_node(sizeof(*area), gfp_mask & GFP_RECLAIM_MASK, node); +	area = kzalloc_node(sizeof(*area), gfp_mask & GFP_RECLAIM_MASK, node);  	if (unlikely(!area))  		return NULL; @@ -1162,25 +1183,7 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,  		return NULL;  	} -	area->flags = flags; -	area->addr = (void *)va->va_start; -	area->size = size; -	area->pages = NULL; -	area->nr_pages = 0; -	area->phys_addr = 0; -	area->caller = caller; -	va->private = area; -	va->flags |= VM_VM_AREA; - -	write_lock(&vmlist_lock); -	for (p = &vmlist; (tmp = *p) != NULL; p = &tmp->next) { -		if (tmp->addr >= area->addr) -			break; -	} -	area->next = *p; -	*p = area; -	write_unlock(&vmlist_lock); - +	insert_vmalloc_vm(area, va, flags, caller);  	return area;  }  |