Commit e97a630e authored by Nick Piggin's avatar Nick Piggin Committed by Linus Torvalds

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: default avatarNick Piggin <npiggin@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 84877848
...@@ -14,6 +14,7 @@ ...@@ -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); ...@@ -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, ...@@ -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, ...@@ -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);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment