]> err.no Git - linux-2.6/blobdiff - mm/vmalloc.c
[PATCH] swap: swap_lock replace list+device
[linux-2.6] / mm / vmalloc.c
index c6182f6f13058a2b25188df94f3f6548e67d18e9..8ff16a1eee6ad43e5a7bec93a207ee94392c2233 100644 (file)
@@ -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;
@@ -475,6 +482,10 @@ void *vmalloc(unsigned long size)
 
 EXPORT_SYMBOL(vmalloc);
 
+#ifndef PAGE_KERNEL_EXEC
+# define PAGE_KERNEL_EXEC PAGE_KERNEL
+#endif
+
 /**
  *     vmalloc_exec  -  allocate virtually contiguous, executable memory
  *
@@ -488,10 +499,6 @@ EXPORT_SYMBOL(vmalloc);
  *     use __vmalloc() instead.
  */
 
-#ifndef PAGE_KERNEL_EXEC
-# define PAGE_KERNEL_EXEC PAGE_KERNEL
-#endif
-
 void *vmalloc_exec(unsigned long size)
 {
        return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC);