OSDN Git Service

core_ctl: Add a kernel parameter to disable core_ctl
authorPavankumar Kondeti <pkondeti@codeaurora.org>
Tue, 21 Mar 2017 08:30:09 +0000 (14:00 +0530)
committerPavankumar Kondeti <pkondeti@codeaurora.org>
Wed, 22 Mar 2017 04:07:33 +0000 (09:37 +0530)
Add a kernel parameter called "core_ctl_disable_cpumask" to
specify the CPUs for which core_ctl is not needed. As
core_ctl operates on a cluster basis, all of the CPUs in a
given cluster must be specified to disable core_ctl on that
cluster.

Change-Id: Idfdc5b3aa9f54bafe20489e5ded9d96da6eff21c
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
Documentation/kernel-parameters.txt
kernel/sched/core_ctl.c

index 45d6806..7d6fef1 100644 (file)
@@ -750,6 +750,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                        seconds. Defaults to 10*60 = 10mins. A value of 0
                        disables the blank timer.
 
+       core_ctl_disable_cpumask= [SMP]
+                       Exempt the CPUs from being managed by core_ctl.
+                       core_ctl operates on a cluster basis. So all the
+                       CPUs in a given cluster must be specified to disable
+                       core_ctl for that cluster.
+
        coredump_filter=
                        [KNL] Change the default value for
                        /proc/<pid>/coredump_filter.
index 983159c..a904c18 100644 (file)
@@ -931,6 +931,42 @@ static struct notifier_block __refdata cpu_notifier = {
 
 /* ============================ init code ============================== */
 
+static cpumask_var_t core_ctl_disable_cpumask;
+static bool core_ctl_disable_cpumask_present;
+
+static int __init core_ctl_disable_setup(char *str)
+{
+       if (!*str)
+               return -EINVAL;
+
+       alloc_bootmem_cpumask_var(&core_ctl_disable_cpumask);
+
+       if (cpulist_parse(str, core_ctl_disable_cpumask) < 0) {
+               free_bootmem_cpumask_var(core_ctl_disable_cpumask);
+               return -EINVAL;
+       }
+
+       core_ctl_disable_cpumask_present = true;
+       pr_info("disable_cpumask=%*pbl\n",
+                       cpumask_pr_args(core_ctl_disable_cpumask));
+
+       return 0;
+}
+early_param("core_ctl_disable_cpumask", core_ctl_disable_setup);
+
+static bool should_skip(const struct cpumask *mask)
+{
+       if (!core_ctl_disable_cpumask_present)
+               return false;
+
+       /*
+        * We operate on a cluster basis. Disable the core_ctl for
+        * a cluster, if all of it's cpus are specified in
+        * core_ctl_disable_cpumask
+        */
+       return cpumask_subset(mask, core_ctl_disable_cpumask);
+}
+
 static struct cluster_data *find_cluster_by_first_cpu(unsigned int first_cpu)
 {
        unsigned int i;
@@ -952,6 +988,9 @@ static int cluster_init(const struct cpumask *mask)
        unsigned int cpu;
        struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
 
+       if (should_skip(mask))
+               return 0;
+
        if (find_cluster_by_first_cpu(first_cpu))
                return 0;
 
@@ -1052,6 +1091,9 @@ static int __init core_ctl_init(void)
 {
        unsigned int cpu;
 
+       if (should_skip(cpu_possible_mask))
+               return 0;
+
        core_ctl_check_interval = (rq_avg_period_ms - RQ_AVG_TOLERANCE)
                                        * NSEC_PER_MSEC;