From: Mandeep Singh Baines <msb@chromium.org>
To: Andrew Morton <akpm@linux-foundation.org>,
David Rientjes <rientjes@google.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Rik van Riel <riel@redhat.com>, Ying Han <yinghan@google.com>
Cc: linux-kernel@vger.kernel.org, gspencer@chromium.org,
piman@chromium.org, wad@chromium.org, olofj@chromium.org
Subject: [PATCH] oom: create a resource limit for oom_adj
Date: Wed, 10 Nov 2010 20:35:41 -0800 [thread overview]
Message-ID: <20101111043541.GA4588@google.com> (raw)
For ChromiumOS, we'd like to be able to oom_adj a process up/down
as its leaves/enters the foreground. Currently, it is not possible
to oom_adj down without CAP_SYS_RESOURCE. This patch creates a new
resource limit, RLIMIT_OOMADJ, which is works in a similar fashion
to RLIMIT_NICE. This allows a process's oom_adj to be lowered
without CAP_SYS_RESOURCE as long as the new value is greater
than the resource limit.
Alternative considered:
* a setuid binary
* a daemon with CAP_SYS_RESOURCE
Since you don't wan't all processes to be able to reduce their
oom_adj, a setuid or daemon implementation would be complex. The
alternatives also have much higher overhead.
Signed-off-by: Mandeep Singh Baines <msb@chromium.org>
---
fs/proc/base.c | 12 ++++++++++--
include/asm-generic/resource.h | 5 ++++-
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/fs/proc/base.c b/fs/proc/base.c
index f3d02ca..4384013 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -462,6 +462,7 @@ static const struct limit_names lnames[RLIM_NLIMITS] = {
[RLIMIT_NICE] = {"Max nice priority", NULL},
[RLIMIT_RTPRIO] = {"Max realtime priority", NULL},
[RLIMIT_RTTIME] = {"Max realtime timeout", "us"},
+ [RLIMIT_OOMADJ] = {"Max OOM adjust", NULL},
};
/* Display limits for a process */
@@ -1057,8 +1058,15 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf,
}
if (oom_adjust < task->signal->oom_adj && !capable(CAP_SYS_RESOURCE)) {
- err = -EACCES;
- goto err_sighand;
+ /* convert oom_adj [15,-17] to rlimit style value [1,33] */
+ long oom_rlim = OOM_ADJUST_MAX + 1 - oom_adjust;
+
+ if (oom_rlim > task->signal->rlim[RLIMIT_OOMADJ].rlim_cur) {
+ unlock_task_sighand(task, &flags);
+ put_task_struct(task);
+ err = -EACCES;
+ goto err_sighand;
+ }
}
if (oom_adjust != task->signal->oom_adj) {
diff --git a/include/asm-generic/resource.h b/include/asm-generic/resource.h
index 587566f..a8640a4 100644
--- a/include/asm-generic/resource.h
+++ b/include/asm-generic/resource.h
@@ -45,7 +45,9 @@
0-39 for nice level 19 .. -20 */
#define RLIMIT_RTPRIO 14 /* maximum realtime priority */
#define RLIMIT_RTTIME 15 /* timeout for RT tasks in us */
-#define RLIM_NLIMITS 16
+#define RLIMIT_OOMADJ 16 /* max oom_adj allowed to lower to
+ 0-32 for oom level 15 .. -17 */
+#define RLIM_NLIMITS 17
/*
* SuS says limits have to be unsigned.
@@ -86,6 +88,7 @@
[RLIMIT_MSGQUEUE] = { MQ_BYTES_MAX, MQ_BYTES_MAX }, \
[RLIMIT_NICE] = { 0, 0 }, \
[RLIMIT_RTPRIO] = { 0, 0 }, \
+ [RLIMIT_OOMADJ] = { 0, 0 }, \
[RLIMIT_RTTIME] = { RLIM_INFINITY, RLIM_INFINITY }, \
}
--
1.7.3.1
next reply other threads:[~2010-11-11 4:36 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-11 4:35 Mandeep Singh Baines [this message]
2010-11-11 7:35 ` [PATCH] oom: create a resource limit for oom_adj David Rientjes
2010-11-11 18:30 ` Mandeep Singh Baines
2010-11-11 20:57 ` David Rientjes
2010-11-11 22:25 ` Mandeep Singh Baines
2010-11-11 23:19 ` David Rientjes
2010-11-11 23:56 ` Mandeep Singh Baines
2010-11-13 0:46 ` [PATCH] oom: allow a non-CAP_SYS_RESOURCE proces to oom_score_adj down Mandeep Singh Baines
2010-11-14 1:37 ` David Rientjes
2010-11-15 22:01 ` [PATCH v2] " Mandeep Singh Baines
2010-11-15 22:06 ` David Rientjes
2010-11-16 0:03 ` [PATCH v3] " Mandeep Singh Baines
2010-11-14 5:07 ` [PATCH] oom: create a resource limit for oom_adj KOSAKI Motohiro
-- strict thread matches above, loose matches on Subject: below --
2010-11-11 5:19 Figo.zhang
[not found] <fNx73-1cI-1@gated-at.bofh.it>
[not found] ` <fNzVf-5UY-3@gated-at.bofh.it>
[not found] ` <fNKdY-6FU-11@gated-at.bofh.it>
[not found] ` <fNMps-1S1-21@gated-at.bofh.it>
2010-11-11 23:15 ` Bodo Eggert
2010-11-11 23:21 ` David Rientjes
2010-11-14 5:07 ` KOSAKI Motohiro
2010-11-14 21:42 ` David Rientjes
2010-11-23 7:16 ` KOSAKI Motohiro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101111043541.GA4588@google.com \
--to=msb@chromium.org \
--cc=akpm@linux-foundation.org \
--cc=gspencer@chromium.org \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=olofj@chromium.org \
--cc=piman@chromium.org \
--cc=riel@redhat.com \
--cc=rientjes@google.com \
--cc=wad@chromium.org \
--cc=yinghan@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.