From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932485AbcFUFbN (ORCPT ); Tue, 21 Jun 2016 01:31:13 -0400 Received: from mail-pa0-f68.google.com ([209.85.220.68]:35130 "EHLO mail-pa0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754860AbcFUFbA (ORCPT ); Tue, 21 Jun 2016 01:31:00 -0400 From: Ganesh Mahendran To: devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Cc: gregkh@linuxfoundation.org, arve@android.com, riandrews@android.com, Ganesh Mahendran Subject: [PATCH 3/3] staging: lowmemorykiller: select the task with maximum rss to kill Date: Tue, 21 Jun 2016 13:30:18 +0800 Message-Id: <1466487018-5410-3-git-send-email-opensource.ganesh@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1466487018-5410-1-git-send-email-opensource.ganesh@gmail.com> References: <1466487018-5410-1-git-send-email-opensource.ganesh@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Current task selecting logic in LMK does not fully aware of the memory pressure. It may select the task with maximum score adj, but with least tasksize. For example, if min_score_adj is 200, and there are 2 tasks in system: task a: score adj 500, tasksize 200M task b: score adj 1000, tasksize 1M Current LMK logic will select *task b*. But now the system already have much memory pressure. We should select the task with maximum task from all the tasks which score adj >= min_score_adj. Signed-off-by: Ganesh Mahendran --- drivers/staging/android/lowmemorykiller.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index 1d8de47..5fcfcfe 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c @@ -122,8 +122,6 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) return 0; } - selected_oom_score_adj = min_score_adj; - rcu_read_lock(); for_each_process(tsk) { struct task_struct *p; @@ -151,18 +149,19 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) task_unlock(p); if (tasksize <= 0) continue; - if (selected) { - if (oom_score_adj < selected_oom_score_adj) - continue; - if (oom_score_adj == selected_oom_score_adj && - tasksize <= selected_tasksize) - continue; + + /* + * From the processes which score adj >= min_score_adj, + * we select the one with the maximum tasksize. + */ + if (selected_tasksize < tasksize) { + selected = p; + selected_tasksize = tasksize; + selected_oom_score_adj = oom_score_adj; + + lowmem_print(2, "select '%s' (%d), adj %hd, size %d, to kill\n", + p->comm, p->pid, oom_score_adj, tasksize); } - selected = p; - selected_tasksize = tasksize; - selected_oom_score_adj = oom_score_adj; - lowmem_print(2, "select '%s' (%d), adj %hd, size %d, to kill\n", - p->comm, p->pid, oom_score_adj, tasksize); } if (selected) { task_lock(selected); -- 1.9.1