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

Commit bef69267 authored by Riley Andrews's avatar Riley Andrews Committed by Pavankumar Kondeti
Browse files

ANDROID: cpuset: Make cpusets restore on hotplug



This deliberately changes the behavior of the per-cpuset
cpus file to not be effected by hotplug. When a cpu is offlined,
it will be removed from the cpuset/cpus file. When a cpu is onlined,
if the cpuset originally requested that that cpu was part of the cpuset,
that cpu will be restored to the cpuset. The cpus files still
have to be hierachical, but the ranges no longer have to be out of
the currently online cpus, just the physically present cpus.

Bug: 120444281
Change-Id: I22cdf33e7d312117bcefba1aeb0125e1ada289a9
Signed-off-by: default avatarDmitry Shmidt <dimitrysh@google.com>
[AmitP: Refactored original changes to align with upstream commit
        201af4c0 ("cgroup: move cgroup files under kernel/cgroup/")]
Signed-off-by: default avatarAmit Pundir <amit.pundir@linaro.org>
Git-commit: ea7de80972bb2243f64b8db99c07eca49518b197
Git-repo: https://android.googlesource.com/kernel/common


[pkondeti@codeaurora.org: Ported to 5.4 kernel]
Signed-off-by: default avatarPavankumar Kondeti <pkondeti@codeaurora.org>
parent 0afd6cbe
Loading
Loading
Loading
Loading
+23 −10
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ struct cpuset {

	/* user-configured CPUs and Memory Nodes allow to tasks */
	cpumask_var_t cpus_allowed;
	cpumask_var_t cpus_requested;
	nodemask_t mems_allowed;

	/* effective CPUs and Memory Nodes allow to tasks */
@@ -432,7 +433,7 @@ static void cpuset_update_task_spread_flag(struct cpuset *cs,

static int is_cpuset_subset(const struct cpuset *p, const struct cpuset *q)
{
	return	cpumask_subset(p->cpus_allowed, q->cpus_allowed) &&
	return	cpumask_subset(p->cpus_requested, q->cpus_requested) &&
		nodes_subset(p->mems_allowed, q->mems_allowed) &&
		is_cpu_exclusive(p) <= is_cpu_exclusive(q) &&
		is_mem_exclusive(p) <= is_mem_exclusive(q);
@@ -469,8 +470,13 @@ static inline int alloc_cpumasks(struct cpuset *cs, struct tmpmasks *tmp)
	if (!zalloc_cpumask_var(pmask3, GFP_KERNEL))
		goto free_two;

	if (cs && !zalloc_cpumask_var(&cs->cpus_requested, GFP_KERNEL))
		goto free_three;

	return 0;

free_three:
	free_cpumask_var(*pmask3);
free_two:
	free_cpumask_var(*pmask2);
free_one:
@@ -487,6 +493,7 @@ static inline void free_cpumasks(struct cpuset *cs, struct tmpmasks *tmp)
{
	if (cs) {
		free_cpumask_var(cs->cpus_allowed);
		free_cpumask_var(cs->cpus_requested);
		free_cpumask_var(cs->effective_cpus);
		free_cpumask_var(cs->subparts_cpus);
	}
@@ -515,6 +522,7 @@ static struct cpuset *alloc_trial_cpuset(struct cpuset *cs)
	}

	cpumask_copy(trial->cpus_allowed, cs->cpus_allowed);
	cpumask_copy(trial->cpus_requested, cs->cpus_requested);
	cpumask_copy(trial->effective_cpus, cs->effective_cpus);
	return trial;
}
@@ -583,7 +591,7 @@ static int validate_change(struct cpuset *cur, struct cpuset *trial)
	cpuset_for_each_child(c, css, par) {
		if ((is_cpu_exclusive(trial) || is_cpu_exclusive(c)) &&
		    c != cur &&
		    cpumask_intersects(trial->cpus_allowed, c->cpus_allowed))
		    cpumask_intersects(trial->cpus_requested, c->cpus_requested))
			goto out;
		if ((is_mem_exclusive(trial) || is_mem_exclusive(c)) &&
		    c != cur &&
@@ -1017,7 +1025,7 @@ static int update_cpus_allowed(struct cpuset *cs, struct task_struct *p,
#ifdef CONFIG_SCHED_WALT
	int ret;

	if (cpumask_subset(&p->wts.cpus_requested, cs->cpus_allowed)) {
	if (cpumask_subset(&p->wts.cpus_requested, cs->cpus_requested)) {
		ret = set_cpus_allowed_ptr(p, &p->wts.cpus_requested);
		if (!ret)
			return ret;
@@ -1063,10 +1071,10 @@ static void compute_effective_cpumask(struct cpumask *new_cpus,
	if (parent->nr_subparts_cpus) {
		cpumask_or(new_cpus, parent->effective_cpus,
			   parent->subparts_cpus);
		cpumask_and(new_cpus, new_cpus, cs->cpus_allowed);
		cpumask_and(new_cpus, new_cpus, cs->cpus_requested);
		cpumask_and(new_cpus, new_cpus, cpu_active_mask);
	} else {
		cpumask_and(new_cpus, cs->cpus_allowed, parent->effective_cpus);
		cpumask_and(new_cpus, cs->cpus_requested, parent_cs(cs)->effective_cpus);
	}
}

@@ -1497,17 +1505,18 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs,
	if (!*buf) {
		cpumask_clear(trialcs->cpus_allowed);
	} else {
		retval = cpulist_parse(buf, trialcs->cpus_allowed);
		retval = cpulist_parse(buf, trialcs->cpus_requested);
		if (retval < 0)
			return retval;

		if (!cpumask_subset(trialcs->cpus_allowed,
				    top_cpuset.cpus_allowed))
		if (!cpumask_subset(trialcs->cpus_requested, cpu_present_mask))
			return -EINVAL;

		cpumask_and(trialcs->cpus_allowed, trialcs->cpus_requested, cpu_active_mask);
	}

	/* Nothing to do if the cpus didn't change */
	if (cpumask_equal(cs->cpus_allowed, trialcs->cpus_allowed))
	if (cpumask_equal(cs->cpus_requested, trialcs->cpus_requested))
		return 0;

	retval = validate_change(cs, trialcs);
@@ -1535,6 +1544,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs,

	spin_lock_irq(&callback_lock);
	cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed);
	cpumask_copy(cs->cpus_requested, trialcs->cpus_requested);

	/*
	 * Make sure that subparts_cpus is a subset of cpus_allowed.
@@ -2416,7 +2426,7 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v)

	switch (type) {
	case FILE_CPULIST:
		seq_printf(sf, "%*pbl\n", cpumask_pr_args(cs->cpus_allowed));
		seq_printf(sf, "%*pbl\n", cpumask_pr_args(cs->cpus_requested));
		break;
	case FILE_MEMLIST:
		seq_printf(sf, "%*pbl\n", nodemask_pr_args(&cs->mems_allowed));
@@ -2785,6 +2795,7 @@ static int cpuset_css_online(struct cgroup_subsys_state *css)
	cs->mems_allowed = parent->mems_allowed;
	cs->effective_mems = parent->mems_allowed;
	cpumask_copy(cs->cpus_allowed, parent->cpus_allowed);
	cpumask_copy(cs->cpus_requested, parent->cpus_requested);
	cpumask_copy(cs->effective_cpus, parent->cpus_allowed);
	spin_unlock_irq(&callback_lock);
out_unlock:
@@ -2901,8 +2912,10 @@ int __init cpuset_init(void)
	BUG_ON(!alloc_cpumask_var(&top_cpuset.cpus_allowed, GFP_KERNEL));
	BUG_ON(!alloc_cpumask_var(&top_cpuset.effective_cpus, GFP_KERNEL));
	BUG_ON(!zalloc_cpumask_var(&top_cpuset.subparts_cpus, GFP_KERNEL));
	BUG_ON(!alloc_cpumask_var(&top_cpuset.cpus_requested, GFP_KERNEL));

	cpumask_setall(top_cpuset.cpus_allowed);
	cpumask_setall(top_cpuset.cpus_requested);
	nodes_setall(top_cpuset.mems_allowed);
	cpumask_setall(top_cpuset.effective_cpus);
	nodes_setall(top_cpuset.effective_mems);