Loading Documentation/kernel-parameters.txt +6 −0 Original line number Diff line number Diff line Loading @@ -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. Loading arch/arm/boot/dts/qcom/sdm630.dtsi +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ chosen { stdout-path = "serial0"; bootargs = "rcupdate.rcu_expedited=1"; bootargs = "rcupdate.rcu_expedited=1 core_ctl_disable_cpumask=0-7"; }; psci { Loading kernel/sched/core_ctl.c +45 −0 Original line number Diff line number Diff line Loading @@ -653,6 +653,9 @@ int core_ctl_set_boost(bool boost) int ret = 0; bool boost_state_changed = false; if (unlikely(!initialized)) return 0; spin_lock_irqsave(&state_lock, flags); for_each_cluster(cluster, index) { if (cluster->is_big_cluster) { Loading Loading @@ -931,6 +934,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; Loading @@ -952,6 +991,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; Loading Loading @@ -1052,6 +1094,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; Loading Loading
Documentation/kernel-parameters.txt +6 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
arch/arm/boot/dts/qcom/sdm630.dtsi +1 −1 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ chosen { stdout-path = "serial0"; bootargs = "rcupdate.rcu_expedited=1"; bootargs = "rcupdate.rcu_expedited=1 core_ctl_disable_cpumask=0-7"; }; psci { Loading
kernel/sched/core_ctl.c +45 −0 Original line number Diff line number Diff line Loading @@ -653,6 +653,9 @@ int core_ctl_set_boost(bool boost) int ret = 0; bool boost_state_changed = false; if (unlikely(!initialized)) return 0; spin_lock_irqsave(&state_lock, flags); for_each_cluster(cluster, index) { if (cluster->is_big_cluster) { Loading Loading @@ -931,6 +934,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; Loading @@ -952,6 +991,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; Loading Loading @@ -1052,6 +1094,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; Loading