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

Commit 4e74339a authored by Li Zefan's avatar Li Zefan Committed by Linus Torvalds
Browse files

cpuset: avoid changing cpuset's cpus when -errno returned



After the patch:

commit 0b2f630a
Author: Miao Xie <miaox@cn.fujitsu.com>
Date:   Fri Jul 25 01:47:21 2008 -0700

    cpusets: restructure the function update_cpumask() and update_nodemask()

It might happen that 'echo 0 > /cpuset/sub/cpus' returned failure but 'cpus'
has been changed, because cpus was changed before calling heap_init() which
may return -ENOMEM.

This patch restores the orginal behavior.

Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
Acked-by: default avatarPaul Menage <menage@google.com>
Cc: Paul Jackson <pj@sgi.com>
Cc: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dea420ce
Loading
Loading
Loading
Loading
+15 −22
Original line number Diff line number Diff line
@@ -843,37 +843,25 @@ static void cpuset_change_cpumask(struct task_struct *tsk,
/**
 * 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
 * @heap: if NULL, defer allocating heap memory to cgroup_scan_tasks()
 *
 * Called with cgroup_mutex held
 *
 * The cgroup_scan_tasks() function will scan all the tasks in a cgroup,
 * calling callback functions for each.
 *
 * Return 0 if successful, -errno if not.
 * No return value. It's guaranteed that cgroup_scan_tasks() always returns 0
 * if @heap != NULL.
 */
static int update_tasks_cpumask(struct cpuset *cs)
static void update_tasks_cpumask(struct cpuset *cs, struct ptr_heap *heap)
{
	struct cgroup_scanner scan;
	struct ptr_heap heap;
	int retval;

	/*
	 * cgroup_scan_tasks() will initialize heap->gt for us.
	 * heap_init() is still needed here for we should not change
	 * cs->cpus_allowed when heap_init() fails.
	 */
	retval = heap_init(&heap, PAGE_SIZE, GFP_KERNEL, NULL);
	if (retval)
		return retval;

	scan.cg = cs->css.cgroup;
	scan.test_task = cpuset_test_cpumask;
	scan.process_task = cpuset_change_cpumask;
	scan.heap = &heap;
	retval = cgroup_scan_tasks(&scan);

	heap_free(&heap);
	return retval;
	scan.heap = heap;
	cgroup_scan_tasks(&scan);
}

/**
@@ -883,6 +871,7 @@ static int update_tasks_cpumask(struct cpuset *cs)
 */
static int update_cpumask(struct cpuset *cs, const char *buf)
{
	struct ptr_heap heap;
	struct cpuset trialcs;
	int retval;
	int is_load_balanced;
@@ -917,6 +906,10 @@ static int update_cpumask(struct cpuset *cs, const char *buf)
	if (cpus_equal(cs->cpus_allowed, trialcs.cpus_allowed))
		return 0;

	retval = heap_init(&heap, PAGE_SIZE, GFP_KERNEL, NULL);
	if (retval)
		return retval;

	is_load_balanced = is_sched_load_balance(&trialcs);

	mutex_lock(&callback_mutex);
@@ -927,9 +920,9 @@ static int update_cpumask(struct cpuset *cs, const char *buf)
	 * Scan tasks in the cpuset, and update the cpumasks of any
	 * that need an update.
	 */
	retval = update_tasks_cpumask(cs);
	if (retval < 0)
		return retval;
	update_tasks_cpumask(cs, &heap);

	heap_free(&heap);

	if (is_load_balanced)
		async_rebuild_sched_domains();
@@ -1965,7 +1958,7 @@ static void scan_for_empty_cpusets(const struct cpuset *root)
		     nodes_empty(cp->mems_allowed))
			remove_tasks_in_empty_cpuset(cp);
		else {
			update_tasks_cpumask(cp);
			update_tasks_cpumask(cp, NULL);
			update_tasks_nodemask(cp, &oldmems);
		}
	}