linux-rt-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org,
	linux-rt-users <linux-rt-users@vger.kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Carsten Emde <C.Emde@osadl.org>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	John Kacur <jkacur@redhat.com>, <stable-rt@vger.kernel.org>
Subject: [PATCH RT 07/19] kernel/cpu: fix cpu down problem if kthreads cpu is going down
Date: Sun, 08 Sep 2013 11:14:02 -0400	[thread overview]
Message-ID: <20130908151446.911305484@goodmis.org> (raw)
In-Reply-To: 20130908151355.362583092@goodmis.org

[-- Attachment #1: 0007-kernel-cpu-fix-cpu-down-problem-if-kthread-s-cpu-is-.patch --]
[-- Type: text/plain, Size: 2635 bytes --]

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

If kthread is pinned to CPUx and CPUx is going down then we get into
trouble:
- first the unplug thread is created
- it will set itself to hp->unplug. As a result, every task that is
  going to take a lock, has to leave the CPU.
- the CPU_DOWN_PREPARE notifier are started. The worker thread will
  start a new process for the "high priority worker".
  Now kthread would like to take a lock but since it can't leave the CPU
  it will never complete its task.

We could fire the unplug thread after the notifier but then the cpu is
no longer marked "online" and the unplug thread will run on CPU0 which
was fixed before :)

So instead the unplug thread is started and kept waiting until the
notfier complete their work.

Cc: stable-rt@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
 kernel/cpu.c |   16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 295bf9d..22063f3 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -83,6 +83,7 @@ struct hotplug_pcp {
 	int refcount;
 	int grab_lock;
 	struct completion synced;
+	struct completion unplug_wait;
 #ifdef CONFIG_PREEMPT_RT_FULL
 	spinlock_t lock;
 #else
@@ -180,6 +181,7 @@ static int sync_unplug_thread(void *data)
 {
 	struct hotplug_pcp *hp = data;
 
+	wait_for_completion(&hp->unplug_wait);
 	preempt_disable();
 	hp->unplug = current;
 	wait_for_pinned_cpus(hp);
@@ -245,6 +247,14 @@ static void __cpu_unplug_sync(struct hotplug_pcp *hp)
 	wait_for_completion(&hp->synced);
 }
 
+static void __cpu_unplug_wait(unsigned int cpu)
+{
+	struct hotplug_pcp *hp = &per_cpu(hotplug_pcp, cpu);
+
+	complete(&hp->unplug_wait);
+	wait_for_completion(&hp->synced);
+}
+
 /*
  * Start the sync_unplug_thread on the target cpu and wait for it to
  * complete.
@@ -268,6 +278,7 @@ static int cpu_unplug_begin(unsigned int cpu)
 	tell_sched_cpu_down_begin(cpu);
 
 	init_completion(&hp->synced);
+	init_completion(&hp->unplug_wait);
 
 	hp->sync_tsk = kthread_create(sync_unplug_thread, hp, "sync_unplug/%d", cpu);
 	if (IS_ERR(hp->sync_tsk)) {
@@ -283,8 +294,7 @@ static int cpu_unplug_begin(unsigned int cpu)
 	 * wait for tasks that are going to enter these sections and
 	 * we must not have them block.
 	 */
-	__cpu_unplug_sync(hp);
-
+	wake_up_process(hp->sync_tsk);
 	return 0;
 }
 
@@ -590,6 +600,8 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
 		goto out_release;
 	}
 
+	__cpu_unplug_wait(cpu);
+
 	/* Notifiers are done. Don't let any more tasks pin this CPU. */
 	cpu_unplug_sync(cpu);
 
-- 
1.7.10.4

  parent reply	other threads:[~2013-09-08 15:14 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-08 15:13 [PATCH RT 00/19] 3.6.11.8-rt41-rc1 stable review Steven Rostedt
2013-09-08 15:13 ` [PATCH RT 01/19] sched/workqueue: Only wake up idle workers if not blocked on sleeping spin lock Steven Rostedt
2013-09-08 15:13 ` [PATCH RT 02/19] x86/mce: fix mce timer interval Steven Rostedt
2013-09-08 15:13 ` [PATCH RT 03/19] genirq: Set irq thread to RT priority on creation Steven Rostedt
2013-09-08 15:13 ` [PATCH RT 04/19] list_bl.h: make list head locking RT safe Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 05/19] list_bl.h: fix it for for !SMP && !DEBUG_SPINLOCK Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 06/19] timers: prepare for full preemption improve Steven Rostedt
2013-09-08 15:14 ` Steven Rostedt [this message]
2013-09-08 15:14 ` [PATCH RT 08/19] kernel/hotplug: restore original cpu mask oncpu/down Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 09/19] gpu: i915: allow the user not to do the wbinvd Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 10/19] drm/i915: drop trace_i915_gem_ring_dispatch on rt Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 11/19] sched: Distangle worker accounting from rqlock Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 12/19] rt,ntp: Move call to schedule_delayed_work() to helper thread Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 13/19] hpsa: fix warning with smp_processor_id() in preemptible section Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 14/19] hwlat-detector: Update hwlat_detector to add outer loop detection Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 15/19] hwlat-detect/trace: Export trace_clock_local for hwlat-detector Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 16/19] hwlat-detector: Use trace_clock_local if available Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 17/19] hwlat-detector: Use thread instead of stop machine Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 18/19] genirq: do not invoke the affinity callback via a workqueue Steven Rostedt
2013-09-08 15:14 ` [PATCH RT 19/19] Linux 3.6.11.8-rt41-rc1 Steven Rostedt

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=20130908151446.911305484@goodmis.org \
    --to=rostedt@goodmis.org \
    --cc=C.Emde@osadl.org \
    --cc=bigeasy@linutronix.de \
    --cc=jkacur@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rt-users@vger.kernel.org \
    --cc=stable-rt@vger.kernel.org \
    --cc=tglx@linutronix.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).