From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756757AbbJVGvB (ORCPT ); Thu, 22 Oct 2015 02:51:01 -0400 Received: from sci-ig2.spreadtrum.com ([222.66.158.135]:26161 "EHLO SHSQR01.spreadtrum.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1752725AbbJVGu7 convert rfc822-to-8bit (ORCPT ); Thu, 22 Oct 2015 02:50:59 -0400 From: =?iso-2022-jp?B?SG9uZ2ppZSBGYW5nICgbJEJKfTk/Wz8bKEIp?= To: David Rientjes , Michal Hocko , "Eric W. Biederman" CC: "linux-kernel@vger.kernel.org" Subject: [PATCHv2 4.3-rc6] proc: fix convert from oom_score_adj to oom_adj Thread-Topic: [PATCHv2 4.3-rc6] proc: fix convert from oom_score_adj to oom_adj Thread-Index: AQHRDJPj1n65VdZ04USteDiw5uf/hg== Date: Thu, 22 Oct 2015 06:49:01 +0000 Message-ID: <1f80189385e540c2a5b2747a7a265d8c@SHMBX01.spreadtrum.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.0.1.200] Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 X-MAIL: SHSQR01.spreadtrum.com t9M6n3Wu054791 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The oom_adj has been replaced by oom_score_adj in kernel, but the /proc/pid/oom_adj is provided for legacy purposes. When write/read a value into/from /proc/pid/oom_adj, there is a transformation between oom_adj and oom_score_adj. After writing a new value into /proc/pid/oom_adj, then read it. The return value is a different value than you wrote. Fix this by adding a adjustment factor. Signed-off-by: Hongjie Fang --- Encountered the problem when I changed a task's oom_adj on an Android smart phone. As follows, 1. # cat /proc/1450/oom_adj 15 2. # echo 10 > /proc/1450/oom_adj 3. # cat /proc/1450/oom_adj 9 diff --git a/fs/proc/base.c b/fs/proc/base.c index b25eee4..2312e43 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1019,15 +1019,19 @@ static ssize_t oom_adj_read(struct file *file, char __user *buf, size_t count, int oom_adj = OOM_ADJUST_MIN; size_t len; unsigned long flags; + int adjust; if (!task) return -ESRCH; if (lock_task_sighand(task, &flags)) { - if (task->signal->oom_score_adj == OOM_SCORE_ADJ_MAX) + if (task->signal->oom_score_adj == OOM_SCORE_ADJ_MAX) { oom_adj = OOM_ADJUST_MAX; - else - oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE) / + } else { + adjust = task->signal->oom_score_adj > 0 ? + (OOM_SCORE_ADJ_MAX-1) : -(OOM_SCORE_ADJ_MAX-1); + oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE + adjust) / OOM_SCORE_ADJ_MAX; + } unlock_task_sighand(task, &flags); } put_task_struct(task);