diff options
Diffstat (limited to 'mm/vmalloc.c')
| -rw-r--r-- | mm/vmalloc.c | 33 | 
1 files changed, 20 insertions, 13 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 2bd83e5c2bb..8ff16a1eee6 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -248,31 +248,20 @@ struct vm_struct *get_vm_area(unsigned long size, unsigned long flags)  	return __get_vm_area(size, flags, VMALLOC_START, VMALLOC_END);  } -/** - *	remove_vm_area  -  find and remove a contingous kernel virtual area - * - *	@addr:		base address - * - *	Search for the kernel VM area starting at @addr, and remove it. - *	This function returns the found VM area, but using it is NOT safe - *	on SMP machines. - */ -struct vm_struct *remove_vm_area(void *addr) +/* Caller must hold vmlist_lock */ +struct vm_struct *__remove_vm_area(void *addr)  {  	struct vm_struct **p, *tmp; -	write_lock(&vmlist_lock);  	for (p = &vmlist ; (tmp = *p) != NULL ;p = &tmp->next) {  		 if (tmp->addr == addr)  			 goto found;  	} -	write_unlock(&vmlist_lock);  	return NULL;  found:  	unmap_vm_area(tmp);  	*p = tmp->next; -	write_unlock(&vmlist_lock);  	/*  	 * Remove the guard page. @@ -281,6 +270,24 @@ found:  	return tmp;  } +/** + *	remove_vm_area  -  find and remove a contingous kernel virtual area + * + *	@addr:		base address + * + *	Search for the kernel VM area starting at @addr, and remove it. + *	This function returns the found VM area, but using it is NOT safe + *	on SMP machines, except for its size or flags. + */ +struct vm_struct *remove_vm_area(void *addr) +{ +	struct vm_struct *v; +	write_lock(&vmlist_lock); +	v = __remove_vm_area(addr); +	write_unlock(&vmlist_lock); +	return v; +} +  void __vunmap(void *addr, int deallocate_pages)  {  	struct vm_struct *area;  |