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

Commit fef8883d authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cpuset: Restore tasks affinity while moving across cpusets"

parents 99c2af2c 435eea92
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -210,6 +210,7 @@ extern struct task_group root_task_group;
	.policy		= SCHED_NORMAL,					\
	.cpus_allowed	= CPU_MASK_ALL,					\
	.nr_cpus_allowed= NR_CPUS,					\
	.cpus_requested	= CPU_MASK_ALL,					\
	.mm		= NULL,						\
	.active_mm	= &init_mm,					\
	.restart_block = {						\
+1 −0
Original line number Diff line number Diff line
@@ -1803,6 +1803,7 @@ struct task_struct {
	unsigned int policy;
	int nr_cpus_allowed;
	cpumask_t cpus_allowed;
	cpumask_t cpus_requested;

#ifdef CONFIG_PREEMPT_RCU
	int rcu_read_lock_nesting;
+16 −2
Original line number Diff line number Diff line
@@ -847,6 +847,20 @@ void rebuild_sched_domains(void)
	put_online_cpus();
}

static int update_cpus_allowed(struct cpuset *cs, struct task_struct *p,
			       const struct cpumask *new_mask)
{
	int ret;

	if (cpumask_subset(&p->cpus_requested, cs->cpus_requested)) {
		ret = set_cpus_allowed_ptr(p, &p->cpus_requested);
		if (!ret)
			return ret;
	}

	return set_cpus_allowed_ptr(p, new_mask);
}

/**
 * update_tasks_cpumask - Update the cpumasks of tasks in the cpuset.
 * @cs: the cpuset in which each task's cpus_allowed mask needs to be changed
@@ -862,7 +876,7 @@ static void update_tasks_cpumask(struct cpuset *cs)

	css_task_iter_start(&cs->css, &it);
	while ((task = css_task_iter_next(&it)))
		set_cpus_allowed_ptr(task, cs->effective_cpus);
		update_cpus_allowed(cs, task, cs->effective_cpus);
	css_task_iter_end(&it);
}

@@ -1545,7 +1559,7 @@ static void cpuset_attach(struct cgroup_taskset *tset)
		 * can_attach beforehand should guarantee that this doesn't
		 * fail.  TODO: have a better way to handle failure here
		 */
		WARN_ON_ONCE(set_cpus_allowed_ptr(task, cpus_attach));
		WARN_ON_ONCE(update_cpus_allowed(cs, task, cpus_attach));

		cpuset_change_task_nodemask(task, &cpuset_attach_nodemask_to);
		cpuset_update_task_spread_flag(cs, task);
+4 −0
Original line number Diff line number Diff line
@@ -5015,6 +5015,9 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
		retval = -EINVAL;
	}

	if (!retval && !(p->flags & PF_KTHREAD))
		cpumask_and(&p->cpus_requested, in_mask, cpu_possible_mask);

out_free_new_mask:
	free_cpumask_var(new_mask);
out_free_cpus_allowed:
@@ -8142,6 +8145,7 @@ void __init sched_init_smp(void)
	/* Move init over to a non-isolated CPU */
	if (set_cpus_allowed_ptr(current, non_isolated_cpus) < 0)
		BUG();
	cpumask_copy(&current->cpus_requested, cpu_possible_mask);
	sched_init_granularity();
	free_cpumask_var(non_isolated_cpus);