Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934773Ab3DONDf (ORCPT ); Mon, 15 Apr 2013 09:03:35 -0400 Received: from seldrel01.sonyericsson.com ([212.209.106.2]:15633 "EHLO seldrel01.sonyericsson.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751385Ab3DONDe (ORCPT ); Mon, 15 Apr 2013 09:03:34 -0400 From: Oskar Andero To: , CC: Greg Kroah-Hartman , Brian Swetland , Radovan Lekanovic , Snild Dolkow , Oskar Andero Subject: [PATCH] lowmemorykiller: prevent multiple instances of low memory killer Date: Mon, 15 Apr 2013 15:03:29 +0200 Message-ID: <1366031009-21958-1-git-send-email-oskar.andero@sonymobile.com> X-Mailer: git-send-email 1.8.1.5 MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2677 Lines: 81 From: Snild Dolkow 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 Cc: Brian Swetland Reviewed-by: Radovan Lekanovic Signed-off-by: Snild Dolkow Signed-off-by: Oskar Andero --- 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 #include #include +#include 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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/