sched/isolation: Add basic isolcpus flags
authorFrederic Weisbecker <frederic@kernel.org>
Fri, 27 Oct 2017 02:42:38 +0000 (04:42 +0200)
committerIngo Molnar <mingo@kernel.org>
Fri, 27 Oct 2017 07:55:31 +0000 (09:55 +0200)
Add flags to control NOHZ and domain isolation from "isolcpus=", in
order to centralize the isolation features to a common interface. Domain
isolation remains the default so not to break the existing isolcpus
boot paramater behaviour.

Further flags in the future may include 0hz (1hz tick offload) and timers,
workqueue, RCU, kthread, watchdog, likely all merged together in a
common flag ("async"?). In any case, this will have to be modifiable by
cpusets.

Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Chris Metcalf <cmetcalf@mellanox.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Wanpeng Li <kernellwp@gmail.com>
Link: http://lkml.kernel.org/r/1509072159-31808-12-git-send-email-frederic@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/sched/isolation.c

index 8f666bc5abe83b1a828e5a7fe5ffd2838fd64d68..b71b436f59f2734a8a92e54c18f806bd2798439d 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/static_key.h>
+#include <linux/ctype.h>
 
 DEFINE_STATIC_KEY_FALSE(housekeeping_overriden);
 EXPORT_SYMBOL_GPL(housekeeping_overriden);
@@ -126,6 +127,29 @@ __setup("nohz_full=", housekeeping_nohz_full_setup);
 
 static int __init housekeeping_isolcpus_setup(char *str)
 {
-       return housekeeping_setup(str, HK_FLAG_DOMAIN);
+       unsigned int flags = 0;
+
+       while (isalpha(*str)) {
+               if (!strncmp(str, "nohz,", 5)) {
+                       str += 5;
+                       flags |= HK_FLAG_TICK;
+                       continue;
+               }
+
+               if (!strncmp(str, "domain,", 7)) {
+                       str += 7;
+                       flags |= HK_FLAG_DOMAIN;
+                       continue;
+               }
+
+               pr_warn("isolcpus: Error, unknown flag\n");
+               return 0;
+       }
+
+       /* Default behaviour for isolcpus without flags */
+       if (!flags)
+               flags |= HK_FLAG_DOMAIN;
+
+       return housekeeping_setup(str, flags);
 }
 __setup("isolcpus=", housekeeping_isolcpus_setup);