Commit 28a42b9e authored by Paul Jackson's avatar Paul Jackson Committed by Linus Torvalds

[PATCH] cpusets: confine pdflush to its cpuset

This patch keeps pdflush daemons on the same cpuset as their parent, the
kthread daemon.

Some large NUMA configurations put as much as they can of kernel threads
and other classic Unix load in what's called a bootcpuset, keeping the rest
of the system free for dedicated jobs.

This effort is thwarted by pdflush, which dynamically destroys and
recreates pdflush daemons depending on load.

It's easy enough to force the originally created pdflush deamons into the
bootcpuset, at system boottime.  But the pdflush threads created later were
allowed to run freely across the system, due to the necessary line in their
startup kthread():

        set_cpus_allowed(current, CPU_MASK_ALL);

By simply coding pdflush to start its threads with the cpus_allowed
restrictions of its cpuset (inherited from kthread, its parent) we can
ensure that dynamically created pdflush threads are also kept in the
bootcpuset.

On systems w/o cpusets, or w/o a bootcpuset implementation, the following
will have no affect, leaving pdflush to run on any CPU, as before.
Signed-off-by: default avatarPaul Jackson <pj@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 18a19cb3
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/fs.h> // Needed by writeback.h #include <linux/fs.h> // Needed by writeback.h
#include <linux/writeback.h> // Prototypes pdflush_operation() #include <linux/writeback.h> // Prototypes pdflush_operation()
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/cpuset.h>
/* /*
...@@ -170,12 +171,24 @@ static int __pdflush(struct pdflush_work *my_work) ...@@ -170,12 +171,24 @@ static int __pdflush(struct pdflush_work *my_work)
static int pdflush(void *dummy) static int pdflush(void *dummy)
{ {
struct pdflush_work my_work; struct pdflush_work my_work;
cpumask_t cpus_allowed;
/* /*
* pdflush can spend a lot of time doing encryption via dm-crypt. We * pdflush can spend a lot of time doing encryption via dm-crypt. We
* don't want to do that at keventd's priority. * don't want to do that at keventd's priority.
*/ */
set_user_nice(current, 0); set_user_nice(current, 0);
/*
* Some configs put our parent kthread in a limited cpuset,
* which kthread() overrides, forcing cpus_allowed == CPU_MASK_ALL.
* Our needs are more modest - cut back to our cpusets cpus_allowed.
* This is needed as pdflush's are dynamically created and destroyed.
* The boottime pdflush's are easily placed w/o these 2 lines.
*/
cpus_allowed = cpuset_cpus_allowed(current);
set_cpus_allowed(current, cpus_allowed);
return __pdflush(&my_work); return __pdflush(&my_work);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment