diff options
author | Chris Metcalf <cmetcalf@ezchip.com> | 2015-06-24 19:55:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-06-24 20:49:40 -0400 |
commit | b5242e98c1cb834feb1e84026f09a4796b49eb4d (patch) | |
tree | 46f415a3fb41a6238f8e6d69675d2e22960c3447 /include/linux/smpboot.h | |
parent | 8c07a308ec5284fe41aefe48ac2ef4cfcd71ddbf (diff) |
smpboot: allow excluding cpus from the smpboot threads
This patch series allows the watchdog to run by default only on the
housekeeping cores when nohz_full is in effect; this seems to be a good
compromise short of turning it off completely (since the nohz_full cores
can't tolerate a watchdog).
To provide customizability, we add /proc/sys/kernel/watchdog_cpumask so
that the set of cores running the watchdog can be tuned to different
values after bootup.
To implement this customizability, we add a new
smpboot_update_cpumask_percpu_thread() API to the smpboot_thread
subsystem that lets us park or unpark "unwanted" threads.
And now that threads can be parked for long periods of time, we tweak the
/proc/<pid>/stat and /proc/<pid>/status code so parked threads aren't
reported as running, which is otherwise confusing.
This patch (of 3):
This change allows some cores to be excluded from running the
smp_hotplug_thread tasks. The following commit to update
kernel/watchdog.c to use this functionality is the motivating example, and
more information on the motivation is provided there.
A new smp_hotplug_thread field is introduced, "cpumask", which is cpumask
field managed by the smpboot subsystem that indicates whether or not the
given smp_hotplug_thread should run on that core; the cpumask is checked
when deciding whether to unpark the thread.
To limit the cpumask to less than cpu_possible, you must call
smpboot_update_cpumask_percpu_thread() after registering.
Signed-off-by: Chris Metcalf <cmetcalf@ezchip.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Ulrich Obergfell <uobergfe@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/smpboot.h')
-rw-r--r-- | include/linux/smpboot.h | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/include/linux/smpboot.h b/include/linux/smpboot.h index d600afb21926..da3c593f9845 100644 --- a/include/linux/smpboot.h +++ b/include/linux/smpboot.h | |||
@@ -27,6 +27,8 @@ struct smpboot_thread_data; | |||
27 | * @pre_unpark: Optional unpark function, called before the thread is | 27 | * @pre_unpark: Optional unpark function, called before the thread is |
28 | * unparked (cpu online). This is not guaranteed to be | 28 | * unparked (cpu online). This is not guaranteed to be |
29 | * called on the target cpu of the thread. Careful! | 29 | * called on the target cpu of the thread. Careful! |
30 | * @cpumask: Internal state. To update which threads are unparked, | ||
31 | * call smpboot_update_cpumask_percpu_thread(). | ||
30 | * @selfparking: Thread is not parked by the park function. | 32 | * @selfparking: Thread is not parked by the park function. |
31 | * @thread_comm: The base name of the thread | 33 | * @thread_comm: The base name of the thread |
32 | */ | 34 | */ |
@@ -41,11 +43,14 @@ struct smp_hotplug_thread { | |||
41 | void (*park)(unsigned int cpu); | 43 | void (*park)(unsigned int cpu); |
42 | void (*unpark)(unsigned int cpu); | 44 | void (*unpark)(unsigned int cpu); |
43 | void (*pre_unpark)(unsigned int cpu); | 45 | void (*pre_unpark)(unsigned int cpu); |
46 | cpumask_var_t cpumask; | ||
44 | bool selfparking; | 47 | bool selfparking; |
45 | const char *thread_comm; | 48 | const char *thread_comm; |
46 | }; | 49 | }; |
47 | 50 | ||
48 | int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread); | 51 | int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread); |
49 | void smpboot_unregister_percpu_thread(struct smp_hotplug_thread *plug_thread); | 52 | void smpboot_unregister_percpu_thread(struct smp_hotplug_thread *plug_thread); |
53 | int smpboot_update_cpumask_percpu_thread(struct smp_hotplug_thread *plug_thread, | ||
54 | const struct cpumask *); | ||
50 | 55 | ||
51 | #endif | 56 | #endif |