From: Snild Dolkow <snild.dolkow@xxxxxxxxxxxxxx> Running multiple instances of LMK is not useful since it will try to kill the same process. This patch adds a spinlock to prevent multiple instances of the LMK running at the same time. Uses spin_trylock and return on failure to avoid blocking. Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> Cc: Brian Swetland <swetland@xxxxxxxxxx> Reviewed-by: Radovan Lekanovic <radovan.lekanovic@xxxxxxxxxxxxxx> Signed-off-by: Snild Dolkow <snild.dolkow@xxxxxxxxxxxxxx> Signed-off-by: Oskar Andero <oskar.andero@xxxxxxxxxxxxxx> --- drivers/staging/android/lowmemorykiller.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index 3b91b0f..0b19353 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c @@ -38,6 +38,7 @@ #include <linux/rcupdate.h> #include <linux/profile.h> #include <linux/notifier.h> +#include <linux/spinlock.h> static uint32_t lowmem_debug_level = 2; static short lowmem_adj[6] = { @@ -57,6 +58,8 @@ static int lowmem_minfree_size = 4; static unsigned long lowmem_deathpending_timeout; +#define LMK_BUSY (-1) + #define lowmem_print(level, x...) \ do { \ if (lowmem_debug_level >= (level)) \ @@ -65,6 +68,7 @@ static unsigned long lowmem_deathpending_timeout; static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) { + static DEFINE_SPINLOCK(lowmem_lock); struct task_struct *tsk; struct task_struct *selected = NULL; int rem = 0; @@ -104,6 +108,9 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) } selected_oom_score_adj = min_score_adj; + if (spin_trylock(&lowmem_lock) == 0) + return LMK_BUSY; + rcu_read_lock(); for_each_process(tsk) { struct task_struct *p; @@ -120,6 +127,7 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) time_before_eq(jiffies, lowmem_deathpending_timeout)) { task_unlock(p); rcu_read_unlock(); + spin_unlock(&lowmem_lock); return 0; } oom_score_adj = p->signal->oom_score_adj; @@ -156,6 +164,7 @@ static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc) lowmem_print(4, "lowmem_shrink %lu, %x, return %d\n", sc->nr_to_scan, sc->gfp_mask, rem); rcu_read_unlock(); + spin_unlock(&lowmem_lock); return rem; } -- 1.8.1.5 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel