All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
To: paul@paulmenage.org, a.p.zijlstra@chello.nl, mingo@elte.hu,
	rjw@sisk.pl, tj@kernel.org
Cc: frank.rowand@am.sony.com, pjt@google.com, tglx@linutronix.de,
	lizf@cn.fujitsu.com, prashanth@linux.vnet.ibm.com,
	paulmck@linux.vnet.ibm.com, vatsa@linux.vnet.ibm.com,
	srivatsa.bhat@linux.vnet.ibm.com, linux-kernel@vger.kernel.org,
	linux-pm@vger.kernel.org
Subject: [PATCH 3/4] cpuset: Add function to introduce CPUs to cpusets during CPU online
Date: Wed, 08 Feb 2012 00:27:09 +0530	[thread overview]
Message-ID: <20120207185651.7482.18642.stgit@srivatsabhat.in.ibm.com> (raw)
In-Reply-To: <20120207185411.7482.43576.stgit@srivatsabhat.in.ibm.com>

During a CPU online operation, at present, that CPU is added only to
top_cpuset.cpus_allowed, but not to any of the other cpusets, which
is a mistake.

So, add a function to go through all the cpusets and add this CPU to
each cpuset which contained this CPU previously. In other words, add this
CPU to those cpusets, whose cpus_allowed_before_hotplug mask contains
this CPU.

Note that this function should not modify cpus_allowed_before_hotplug.
Hence, we move that particular piece of code from do_update_cpumask()
to update_cpumask().

Reported-by: Prashanth K. Nageshappa <prashanth@linux.vnet.ibm.com>
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Cc: stable@vger.kernel.org
---

 kernel/cpuset.c |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 2be71da..c56e705 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -900,7 +900,6 @@ static int do_update_cpumask(struct cpuset *cs, struct cpuset *trialcs)
 
 	mutex_lock(&callback_mutex);
 	cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed);
-	cpumask_copy(cs->cpus_allowed_before_hotplug, cs->cpus_allowed);
 	mutex_unlock(&callback_mutex);
 
 	/*
@@ -948,7 +947,10 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs,
 			return -EINVAL;
 	}
 
-	return do_update_cpumask(cs, trialcs);
+	retval = do_update_cpumask(cs, trialcs);
+
+	cpumask_copy(cs->cpus_allowed_before_hotplug, cs->cpus_allowed);
+	return retval;
 }
 
 /*
@@ -2079,6 +2081,71 @@ static void remove_tasks_in_empty_cpuset(struct cpuset *cs)
 	move_member_tasks_to_cpuset(cs, parent);
 }
 
+
+/*
+ * Walk the specified cpuset subtree and add the newly onlined CPU to the
+ * cpuset, if that CPU was in this cpuset previously (IOW, if this CPU
+ * is still in the cpuset_allowed_before_hotplug mask of this cpuset).
+ *
+ * Called with cgroup_mutex held.
+ *
+ * This walk processes the tree from top to bottom, completing one layer
+ * before dropping down to the next.  It always processes a node before
+ * any of its children.
+ */
+static void scan_cpusets_during_cpu_online(struct cpuset *root)
+{
+	LIST_HEAD(queue);
+	struct cpuset *cp;	/* scans cpusets being updated */
+	struct cpuset *child;	/* scans child cpusets of cp */
+	struct cgroup *cont;
+	struct cpuset *trialcs;
+
+	trialcs = alloc_trial_cpuset(root);
+	if (!trialcs)
+		return;
+
+	list_add_tail((struct list_head *)&root->stack_list, &queue);
+
+	while (!list_empty(&queue)) {
+		cp = list_first_entry(&queue, struct cpuset, stack_list);
+		list_del(queue.next);
+		list_for_each_entry(cont, &cp->css.cgroup->children, sibling) {
+			child = cgroup_cs(cont);
+			list_add_tail(&child->stack_list, &queue);
+		}
+
+		/*
+		 * Continue past cpusets which didn't have this CPU previously
+		 * (Note that when this CPU went offline, it had been removed
+		 * from all cpusets.)
+		 */
+		if (cpumask_equal(cp->cpus_allowed,
+					cp->cpus_allowed_before_hotplug))
+			continue;
+
+		/*
+		 * Add newly onlined CPUs to this cpuset if they were part of
+		 * this cpuset previously.
+		 */
+		cpumask_and(trialcs->cpus_allowed,
+				cp->cpus_allowed_before_hotplug,
+				cpu_active_mask);
+
+		/* Update the cpuset */
+		do_update_cpumask(cp, trialcs);
+
+		/*
+		 * Do NOT update cpus_allowed_before_hotplug here. We want it
+		 * to reflect the value of cpus_allowed as seen *before* the
+		 * hotplug event.
+		 */
+	}
+
+	free_trial_cpuset(trialcs);
+}
+
+
 /*
  * Walk the specified cpuset subtree and look for empty cpusets.
  * The tasks of such cpuset must be moved to a parent cpuset.


  parent reply	other threads:[~2012-02-07 18:57 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-07 18:55 [PATCH 0/4] CPU hotplug, cpusets: Fix CPU online handling related to cpusets Srivatsa S. Bhat
2012-02-07 18:56 ` [PATCH 1/4] CPU hotplug, cpuset: Maintain a copy of the cpus_allowed mask before CPU hotplug Srivatsa S. Bhat
2012-02-07 18:56 ` [PATCH 2/4] cpuset: Split up update_cpumask() so that its functionality can be reused Srivatsa S. Bhat
2012-02-07 18:57 ` Srivatsa S. Bhat [this message]
2012-02-07 18:57 ` [PATCH 4/4] CPU hotplug, cpusets: Differentiate the CPU online and CPU offline callbacks Srivatsa S. Bhat
2012-02-08  3:22 ` [PATCH 0/4] CPU hotplug, cpusets: Fix CPU online handling related to cpusets Peter Zijlstra
2012-02-08  6:33   ` Srivatsa S. Bhat
2012-02-09  7:57     ` Ingo Molnar
2012-02-09  8:42       ` Srivatsa S. Bhat
2012-02-09 15:11         ` Ingo Molnar
2012-02-10 15:52           ` Peter Zijlstra
2012-02-10 16:53             ` Paul E. McKenney
2012-02-10 17:34               ` Peter Zijlstra
2012-02-10 21:51                 ` Alan Stern
2012-02-10 22:39                   ` Rafael J. Wysocki
2012-02-11  2:07                     ` Peter Zijlstra
2012-02-11  4:26                       ` Srivatsa S. Bhat
2012-02-13 17:47                         ` Srivatsa S. Bhat
2012-02-17 12:15                           ` Srivatsa S. Bhat
2012-02-20 12:49                             ` Peter Zijlstra
2012-02-20 12:59                               ` Srivatsa S. Bhat
2012-02-23  9:57                                 ` Srivatsa S. Bhat
2012-02-24 23:24                                   ` Rafael J. Wysocki
2012-02-27 10:18                                   ` Peter Zijlstra
2012-02-27 12:09                                   ` [tip:sched/urgent] CPU hotplug, cpusets, suspend: Don' t touch cpusets during suspend/resume tip-bot for Srivatsa S. Bhat
2012-02-11 16:00                 ` [PATCH 0/4] CPU hotplug, cpusets: Fix CPU online handling related to cpusets Paul E. McKenney
2012-02-13 17:47               ` Srivatsa S. Bhat
2012-02-13 20:39                 ` Paul E. McKenney
2012-02-13 20:49                   ` Srivatsa S. Bhat
2012-02-11 13:39             ` Ingo Molnar
2012-02-10 15:53         ` Peter Zijlstra
2012-02-09 16:43     ` Peter Zijlstra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120207185651.7482.18642.stgit@srivatsabhat.in.ibm.com \
    --to=srivatsa.bhat@linux.vnet.ibm.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=frank.rowand@am.sony.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=lizf@cn.fujitsu.com \
    --cc=mingo@elte.hu \
    --cc=paul@paulmenage.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=pjt@google.com \
    --cc=prashanth@linux.vnet.ibm.com \
    --cc=rjw@sisk.pl \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=vatsa@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.