Bläddra i källkod

mm: vmalloc use mutex for purge

The vmalloc purge lock can be a mutex so we can sleep while a purge is
going on (purge involves a global kernel TLB invalidate, so it can take
quite a while).

Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Nick Piggin 16 år sedan
förälder
incheckning
e97a630eb0
1 ändrade filer med 5 tillägg och 4 borttagningar
  1. 5 4
      mm/vmalloc.c

+ 5 - 4
mm/vmalloc.c

@@ -14,6 +14,7 @@
 #include <linux/highmem.h>
 #include <linux/highmem.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/spinlock.h>
+#include <linux/mutex.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
 #include <linux/proc_fs.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/seq_file.h>
@@ -473,7 +474,7 @@ static atomic_t vmap_lazy_nr = ATOMIC_INIT(0);
 static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,
 static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,
 					int sync, int force_flush)
 					int sync, int force_flush)
 {
 {
-	static DEFINE_SPINLOCK(purge_lock);
+	static DEFINE_MUTEX(purge_lock);
 	LIST_HEAD(valist);
 	LIST_HEAD(valist);
 	struct vmap_area *va;
 	struct vmap_area *va;
 	int nr = 0;
 	int nr = 0;
@@ -484,10 +485,10 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,
 	 * the case that isn't actually used at the moment anyway.
 	 * the case that isn't actually used at the moment anyway.
 	 */
 	 */
 	if (!sync && !force_flush) {
 	if (!sync && !force_flush) {
-		if (!spin_trylock(&purge_lock))
+		if (!mutex_trylock(&purge_lock))
 			return;
 			return;
 	} else
 	} else
-		spin_lock(&purge_lock);
+		mutex_lock(&purge_lock);
 
 
 	rcu_read_lock();
 	rcu_read_lock();
 	list_for_each_entry_rcu(va, &vmap_area_list, list) {
 	list_for_each_entry_rcu(va, &vmap_area_list, list) {
@@ -519,7 +520,7 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,
 			__free_vmap_area(va);
 			__free_vmap_area(va);
 		spin_unlock(&vmap_area_lock);
 		spin_unlock(&vmap_area_lock);
 	}
 	}
-	spin_unlock(&purge_lock);
+	mutex_unlock(&purge_lock);
 }
 }
 
 
 /*
 /*