Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1aeb977e authored by Pavankumar Kondeti's avatar Pavankumar Kondeti Committed by Gerrit - the friendly Code Review server
Browse files

core_ctl: Add a kernel parameter to disable core_ctl



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.

Signed-off-by: default avatarPavankumar Kondeti <pkondeti@codeaurora.org>
[markivx: doc moved to Documentation/admin-guide/]
Signed-off-by: default avatarVikram Mulukutla <markivx@codeaurora.org>

Change-Id: I2468b10d4f8b1c9ddcdb8e2eb10124975a6a34d4
Signed-off-by: default avatarSatya Durga Srinivasu Prabhala <satyap@codeaurora.org>
parent 8754b7f9
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -648,6 +648,12 @@
			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.
+42 −0
Original line number Diff line number Diff line
@@ -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;