From: Andrea Arcangeli <andrea@suse.de>
To: linux-mm@kvack.org
Cc: David Rientjes <rientjes@google.com>
Subject: [PATCH 24 of 24] add oom_kill_asking_task flag
Date: Wed, 22 Aug 2007 14:49:11 +0200 [thread overview]
Message-ID: <96b5899e730ecaa20788.1187786951@v2.random> (raw)
In-Reply-To: <patchbomb.1187786927@v2.random>
# HG changeset patch
# User David Rientjes <rientjes@google.com>
# Date 1187778125 -7200
# Node ID 96b5899e730ecaa2078883f75e86765fa1a36431
# Parent a3d679df54ebb1f977b97ab6b3e501134bf9e7ef
add oom_kill_asking_task flag
Adds an oom_kill_asking_task flag to cpusets. If unset (by default), we
iterate through the task list via select_bad_process() during a
cpuset-constrained OOM to find the best candidate task to kill. If set,
we simply kill current to avoid the overhead which is needed for some
customers with a large number of threads or heavy workload.
Cc: Andrea Arcangeli <andrea@suse.de>
Cc: Paul Jackson <pj@sgi.com>
Cc: Christoph Lameter <clameter@sgi.com>
Signed-off-by: David Rientjes <rientjes@google.com>
---
Documentation/cpusets.txt | 3 +++
include/linux/cpuset.h | 5 +++++
kernel/cpuset.c | 39 ++++++++++++++++++++++++++++++++++++++-
mm/oom_kill.c | 7 +++++++
4 files changed, 53 insertions(+), 1 deletions(-)
diff --git a/Documentation/cpusets.txt b/Documentation/cpusets.txt
--- a/Documentation/cpusets.txt
+++ b/Documentation/cpusets.txt
@@ -181,6 +181,9 @@ containing the following files describin
- tasks: list of tasks (by pid) attached to that cpuset
- notify_on_release flag: run /sbin/cpuset_release_agent on exit?
- memory_pressure: measure of how much paging pressure in cpuset
+ - oom_kill_asking_task flag: when this cpuset OOM's, should we kill
+ the task that asked for the memory or should we iterate through
+ the task list to find the best task to kill (can be expensive)?
In addition, the root cpuset only has the following file:
- memory_pressure_enabled flag: compute memory_pressure?
diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h
--- a/include/linux/cpuset.h
+++ b/include/linux/cpuset.h
@@ -52,6 +52,7 @@ extern void cpuset_set_last_tif_memdie(s
unsigned long last_tif_memdie);
extern int cpuset_set_oom(struct task_struct *task);
extern void cpuset_clear_oom(struct task_struct *task);
+extern int cpuset_oom_kill_asking_task(struct task_struct *task);
#define cpuset_memory_pressure_bump() \
do { \
@@ -136,6 +137,10 @@ static inline int cpuset_set_oom(struct
return 0;
}
static inline void cpuset_clear_oom(struct task_struct *task) {}
+static inline int cpuset_oom_kill_asking_task(struct task_struct *task)
+{
+ return 0;
+}
static inline void cpuset_memory_pressure_bump(void) {}
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -116,6 +116,7 @@ typedef enum {
CS_SPREAD_PAGE,
CS_SPREAD_SLAB,
CS_OOM,
+ CS_OOM_KILL_ASKING_TASK,
} cpuset_flagbits_t;
/* convenient tests for these bits */
@@ -157,6 +158,11 @@ static inline int is_oom(const struct cp
static inline int is_oom(const struct cpuset *cs)
{
return test_bit(CS_OOM, &cs->flags);
+}
+
+static inline int is_oom_kill_asking_task(const struct cpuset *cs)
+{
+ return test_bit(CS_OOM_KILL_ASKING_TASK, &cs->flags);
}
/*
@@ -1068,7 +1074,8 @@ static int update_memory_pressure_enable
* update_flag - read a 0 or a 1 in a file and update associated flag
* bit: the bit to update (CS_CPU_EXCLUSIVE, CS_MEM_EXCLUSIVE,
* CS_NOTIFY_ON_RELEASE, CS_MEMORY_MIGRATE,
- * CS_SPREAD_PAGE, CS_SPREAD_SLAB)
+ * CS_SPREAD_PAGE, CS_SPREAD_SLAB,
+ * CS_OOM_KILL_ASKING_TASK)
* cs: the cpuset to update
* buf: the buffer where we read the 0 or 1
*
@@ -1320,6 +1327,7 @@ typedef enum {
FILE_NOTIFY_ON_RELEASE,
FILE_MEMORY_PRESSURE_ENABLED,
FILE_MEMORY_PRESSURE,
+ FILE_OOM_KILL_ASKING_TASK,
FILE_SPREAD_PAGE,
FILE_SPREAD_SLAB,
FILE_TASKLIST,
@@ -1382,6 +1390,9 @@ static ssize_t cpuset_common_file_write(
case FILE_MEMORY_PRESSURE:
retval = -EACCES;
break;
+ case FILE_OOM_KILL_ASKING_TASK:
+ retval = update_flag(CS_OOM_KILL_ASKING_TASK, cs, buffer);
+ break;
case FILE_SPREAD_PAGE:
retval = update_flag(CS_SPREAD_PAGE, cs, buffer);
cs->mems_generation = cpuset_mems_generation++;
@@ -1499,6 +1510,9 @@ static ssize_t cpuset_common_file_read(s
case FILE_MEMORY_PRESSURE:
s += sprintf(s, "%d", fmeter_getrate(&cs->fmeter));
break;
+ case FILE_OOM_KILL_ASKING_TASK:
+ *s++ = is_oom_kill_asking_task(cs) ? '1' : '0';
+ break;
case FILE_SPREAD_PAGE:
*s++ = is_spread_page(cs) ? '1' : '0';
break;
@@ -1861,6 +1875,11 @@ static struct cftype cft_memory_pressure
static struct cftype cft_memory_pressure = {
.name = "memory_pressure",
.private = FILE_MEMORY_PRESSURE,
+};
+
+static struct cftype cft_oom_kill_asking_task = {
+ .name = "oom_kill_asking_task",
+ .private = FILE_OOM_KILL_ASKING_TASK,
};
static struct cftype cft_spread_page = {
@@ -1891,6 +1910,8 @@ static int cpuset_populate_dir(struct de
return err;
if ((err = cpuset_add_file(cs_dentry, &cft_memory_pressure)) < 0)
return err;
+ if ((err = cpuset_add_file(cs_dentry, &cft_oom_kill_asking_task)) < 0)
+ return err;
if ((err = cpuset_add_file(cs_dentry, &cft_spread_page)) < 0)
return err;
if ((err = cpuset_add_file(cs_dentry, &cft_spread_slab)) < 0)
@@ -1923,6 +1944,8 @@ static long cpuset_create(struct cpuset
cs->flags = 0;
if (notify_on_release(parent))
set_bit(CS_NOTIFY_ON_RELEASE, &cs->flags);
+ if (is_oom_kill_asking_task(parent))
+ set_bit(CS_OOM_KILL_ASKING_TASK, &cs->flags);
if (is_spread_page(parent))
set_bit(CS_SPREAD_PAGE, &cs->flags);
if (is_spread_slab(parent))
@@ -2661,6 +2684,20 @@ void cpuset_clear_oom(struct task_struct
}
/*
+ * Returns 1 if current should simply be killed when a cpuset-constrained OOM
+ * occurs. Otherwise, we iterate through the task list and select the best
+ * candidate we can find.
+ */
+int cpuset_oom_kill_asking_task(struct task_struct *task)
+{
+ int ret;
+ task_lock(task);
+ ret = is_oom_kill_asking_task(task->cpuset);
+ task_unlock(task);
+ return ret;
+}
+
+/*
* Collection of memory_pressure is suppressed unless
* this flag is enabled by writing "1" to the special
* cpuset file 'memory_pressure_enabled' in the root cpuset.
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -457,6 +457,13 @@ void out_of_memory(struct zonelist *zone
case CONSTRAINT_CPUSET:
read_lock(&tasklist_lock);
+ if (cpuset_oom_kill_asking_task(current)) {
+ oom_kill_process(current, 0,
+ "No available memory in cpuset", gfp_mask,
+ order);
+ goto out_cpuset;
+ }
+
last_tif_memdie = cpuset_get_last_tif_memdie(current);
/*
* If current's cpuset is already in the OOM killer or its killed
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2007-08-22 12:49 UTC|newest]
Thread overview: 113+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-22 12:48 [PATCH 00 of 24] OOM related fixes Andrea Arcangeli
2007-08-22 12:48 ` [PATCH 01 of 24] remove nr_scan_inactive/active Andrea Arcangeli
2007-09-12 11:44 ` Andrew Morton
2008-01-02 17:50 ` Andrea Arcangeli
2007-08-22 12:48 ` [PATCH 02 of 24] avoid oom deadlock in nfs_create_request Andrea Arcangeli
2007-09-12 23:54 ` Christoph Lameter
2007-08-22 12:48 ` [PATCH 03 of 24] prevent oom deadlocks during read/write operations Andrea Arcangeli
2007-09-12 11:56 ` Andrew Morton
2007-09-12 2:18 ` Nick Piggin
2008-01-03 0:53 ` Andrea Arcangeli
2007-08-22 12:48 ` [PATCH 04 of 24] serialize oom killer Andrea Arcangeli
2007-09-12 12:02 ` Andrew Morton
2007-09-12 12:04 ` Andrew Morton
2007-09-12 12:11 ` Andrea Arcangeli
2008-01-03 0:55 ` Andrea Arcangeli
2007-09-13 0:09 ` Christoph Lameter
2007-09-13 18:32 ` David Rientjes
2007-09-13 18:37 ` Christoph Lameter
2007-09-13 18:46 ` David Rientjes
2007-09-13 18:53 ` Christoph Lameter
2007-09-14 0:36 ` David Rientjes
2007-09-14 2:31 ` Christoph Lameter
2007-09-14 3:33 ` David Rientjes
2007-09-18 16:44 ` David Rientjes
2007-09-18 16:44 ` [patch 1/4] oom: move prototypes to appropriate header file David Rientjes
2007-09-18 16:44 ` [patch 2/4] oom: move constraints to enum David Rientjes
2007-09-18 16:44 ` [patch 3/4] oom: save zonelist pointer for oom killer calls David Rientjes
2007-09-18 16:44 ` [patch 4/4] oom: serialize out of memory calls David Rientjes
2007-09-18 19:54 ` Christoph Lameter
2007-09-18 19:56 ` David Rientjes
2007-09-18 20:01 ` Christoph Lameter
2007-09-18 20:06 ` David Rientjes
2007-09-18 20:23 ` [patch 5/4] oom: rename serialization helper functions David Rientjes
2007-09-18 20:26 ` Christoph Lameter
2007-09-18 20:39 ` [patch 5/4 v2] " David Rientjes
2007-09-18 20:59 ` Christoph Lameter
2007-09-18 19:57 ` [patch 3/4] oom: save zonelist pointer for oom killer calls Christoph Lameter
2007-09-18 20:13 ` David Rientjes
2007-09-18 20:16 ` Christoph Lameter
2007-09-18 20:47 ` [patch 6/4] oom: pass null to kfree if zonelist is not cleared David Rientjes
2007-09-18 21:01 ` Christoph Lameter
2007-09-18 21:13 ` David Rientjes
2007-09-18 21:25 ` Christoph Lameter
2007-09-18 22:16 ` David Rientjes
2007-09-19 17:09 ` Paul Jackson
2007-09-19 18:21 ` David Rientjes
2007-09-18 19:55 ` [patch 2/4] oom: move constraints to enum Christoph Lameter
2007-08-22 12:48 ` [PATCH 05 of 24] avoid selecting already killed tasks Andrea Arcangeli
2007-09-13 0:13 ` Christoph Lameter
2007-08-22 12:48 ` [PATCH 06 of 24] reduce the probability of an OOM livelock Andrea Arcangeli
2007-09-12 12:17 ` Andrew Morton
2008-01-03 1:03 ` Andrea Arcangeli
2007-08-22 12:48 ` [PATCH 07 of 24] balance_pgdat doesn't return the number of pages freed Andrea Arcangeli
2007-09-12 12:18 ` Andrew Morton
2007-09-13 0:26 ` Christoph Lameter
2007-08-22 12:48 ` [PATCH 08 of 24] don't depend on PF_EXITING tasks to go away Andrea Arcangeli
2007-09-12 12:20 ` Andrew Morton
2008-01-03 0:56 ` Andrea Arcangeli
2007-08-22 12:48 ` [PATCH 09 of 24] fallback killing more tasks if tif-memdie doesn't " Andrea Arcangeli
2007-09-12 12:30 ` Andrew Morton
2007-09-12 12:34 ` Andrew Morton
2008-01-03 1:06 ` Andrea Arcangeli
2007-08-22 12:48 ` [PATCH 10 of 24] stop useless vm trashing while we wait the TIF_MEMDIE task to exit Andrea Arcangeli
2007-09-12 12:42 ` Andrew Morton
2007-09-13 0:36 ` Christoph Lameter
2007-09-21 19:10 ` David Rientjes
2008-01-03 1:08 ` Andrea Arcangeli
2007-08-22 12:48 ` [PATCH 11 of 24] the oom schedule timeout isn't needed with the VM_is_OOM logic Andrea Arcangeli
2007-09-12 12:44 ` Andrew Morton
2007-08-22 12:48 ` [PATCH 12 of 24] show mem information only when a task is actually being killed Andrea Arcangeli
2007-09-12 12:49 ` Andrew Morton
2007-08-22 12:49 ` [PATCH 13 of 24] simplify oom heuristics Andrea Arcangeli
2007-09-12 12:52 ` Andrew Morton
2007-09-12 13:40 ` Andrea Arcangeli
2007-09-12 20:52 ` Andrew Morton
2007-08-22 12:49 ` [PATCH 14 of 24] oom select should only take rss into account Andrea Arcangeli
2007-09-13 0:43 ` Christoph Lameter
2007-08-22 12:49 ` [PATCH 15 of 24] limit reclaim if enough pages have been freed Andrea Arcangeli
2007-09-12 12:57 ` Andrew Morton
2008-01-03 1:12 ` Andrea Arcangeli
2007-09-12 12:58 ` Andrew Morton
2007-09-12 13:38 ` Andrea Arcangeli
2007-08-22 12:49 ` [PATCH 16 of 24] avoid some lock operation in vm fast path Andrea Arcangeli
2007-09-12 12:59 ` Andrew Morton
2007-09-13 0:49 ` Christoph Lameter
2007-09-13 1:16 ` Andrew Morton
2007-09-13 1:33 ` Christoph Lameter
2007-09-13 1:41 ` KAMEZAWA Hiroyuki
2007-09-13 1:44 ` Andrew Morton
2007-08-22 12:49 ` [PATCH 17 of 24] apply the anti deadlock features only to global oom Andrea Arcangeli
2007-09-12 13:02 ` Andrew Morton
2007-09-13 0:53 ` Christoph Lameter
2007-09-13 0:52 ` Christoph Lameter
2007-08-22 12:49 ` [PATCH 18 of 24] run panic the same way in both places Andrea Arcangeli
2007-09-13 0:54 ` Christoph Lameter
2007-08-22 12:49 ` [PATCH 19 of 24] cacheline align VM_is_OOM to prevent false sharing Andrea Arcangeli
2007-09-12 13:02 ` Andrew Morton
2007-09-12 13:36 ` Andrea Arcangeli
2007-09-13 0:55 ` Christoph Lameter
2007-08-22 12:49 ` [PATCH 20 of 24] extract deadlock helper function Andrea Arcangeli
2007-08-22 12:49 ` [PATCH 21 of 24] select process to kill for cpusets Andrea Arcangeli
2007-09-12 13:05 ` Andrew Morton
2007-09-13 0:59 ` Christoph Lameter
2007-09-13 5:13 ` David Rientjes
2007-09-13 17:55 ` Christoph Lameter
2007-08-22 12:49 ` [PATCH 22 of 24] extract select helper function Andrea Arcangeli
2007-08-22 12:49 ` [PATCH 23 of 24] serialize for cpusets Andrea Arcangeli
2007-09-12 13:10 ` Andrew Morton
2007-09-12 13:34 ` Andrea Arcangeli
2007-09-12 19:08 ` David Rientjes
2007-09-13 1:02 ` Christoph Lameter
2007-08-22 12:49 ` Andrea Arcangeli [this message]
2007-09-12 13:11 ` [PATCH 24 of 24] add oom_kill_asking_task flag Andrew Morton
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=96b5899e730ecaa20788.1187786951@v2.random \
--to=andrea@suse.de \
--cc=linux-mm@kvack.org \
--cc=rientjes@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.