All of lore.kernel.org
 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>, Julia Cartwright <julia@ni.com>,
	Daniel Wagner <wagi@monom.org>, Tom Zanussi <zanussi@kernel.org>,
	Scott Wood <swood@redhat.com>
Subject: [PATCH RT 24/32] sched: migrate_enable: Use stop_one_cpu_nowait()
Date: Fri, 17 Jan 2020 12:41:35 -0500	[thread overview]
Message-ID: <20200117174131.019724236@goodmis.org> (raw)
In-Reply-To: 20200117174111.282847363@goodmis.org

4.19.94-rt39-rc1 stable review patch.
If anyone has any objections, please let me know.

------------------

From: Scott Wood <swood@redhat.com>

[ Upstream commit 6b39a1fa8c53cae08dc03afdae193b7d3a78a173 ]

migrate_enable() can be called with current->state != TASK_RUNNING.
Avoid clobbering the existing state by using stop_one_cpu_nowait().
Since we're stopping the current cpu, we know that we won't get
past __schedule() until migration_cpu_stop() has run (at least up to
the point of migrating us to another cpu).

Signed-off-by: Scott Wood <swood@redhat.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
 include/linux/stop_machine.h |  2 ++
 kernel/sched/core.c          | 23 +++++++++++++----------
 kernel/stop_machine.c        |  7 +++++--
 3 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h
index 6d3635c86dbe..82fc686ddd9e 100644
--- a/include/linux/stop_machine.h
+++ b/include/linux/stop_machine.h
@@ -26,6 +26,8 @@ struct cpu_stop_work {
 	cpu_stop_fn_t		fn;
 	void			*arg;
 	struct cpu_stop_done	*done;
+	/* Did not run due to disabled stopper; for nowait debug checks */
+	bool			disabled;
 };
 
 int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg);
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index e97ac751aad2..e465381b464d 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -990,6 +990,7 @@ static struct rq *move_queued_task(struct rq *rq, struct rq_flags *rf,
 struct migration_arg {
 	struct task_struct *task;
 	int dest_cpu;
+	bool done;
 };
 
 /*
@@ -1025,6 +1026,11 @@ static int migration_cpu_stop(void *data)
 	struct task_struct *p = arg->task;
 	struct rq *rq = this_rq();
 	struct rq_flags rf;
+	int dest_cpu = arg->dest_cpu;
+
+	/* We don't look at arg after this point. */
+	smp_mb();
+	arg->done = true;
 
 	/*
 	 * The original target CPU might have gone down and we might
@@ -1047,9 +1053,9 @@ static int migration_cpu_stop(void *data)
 	 */
 	if (task_rq(p) == rq) {
 		if (task_on_rq_queued(p))
-			rq = __migrate_task(rq, &rf, p, arg->dest_cpu);
+			rq = __migrate_task(rq, &rf, p, dest_cpu);
 		else
-			p->wake_cpu = arg->dest_cpu;
+			p->wake_cpu = dest_cpu;
 	}
 	rq_unlock(rq, &rf);
 	raw_spin_unlock(&p->pi_lock);
@@ -7322,6 +7328,7 @@ void migrate_enable(void)
 	WARN_ON(smp_processor_id() != cpu);
 	if (!is_cpu_allowed(p, cpu)) {
 		struct migration_arg arg = { p };
+		struct cpu_stop_work work;
 		struct rq_flags rf;
 
 		rq = task_rq_lock(p, &rf);
@@ -7329,15 +7336,11 @@ void migrate_enable(void)
 		arg.dest_cpu = select_fallback_rq(cpu, p);
 		task_rq_unlock(rq, p, &rf);
 
-		preempt_lazy_enable();
-		preempt_enable();
-
-		sleeping_lock_inc();
-		stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg);
-		sleeping_lock_dec();
+		stop_one_cpu_nowait(task_cpu(p), migration_cpu_stop,
+				    &arg, &work);
 		tlb_migrate_finish(p->mm);
-
-		return;
+		__schedule(true);
+		WARN_ON_ONCE(!arg.done && !work.disabled);
 	}
 
 out:
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
index 067cb83f37ea..2d15c0d50625 100644
--- a/kernel/stop_machine.c
+++ b/kernel/stop_machine.c
@@ -86,8 +86,11 @@ static bool cpu_stop_queue_work(unsigned int cpu, struct cpu_stop_work *work)
 	enabled = stopper->enabled;
 	if (enabled)
 		__cpu_stop_queue_work(stopper, work, &wakeq);
-	else if (work->done)
-		cpu_stop_signal_done(work->done);
+	else {
+		work->disabled = true;
+		if (work->done)
+			cpu_stop_signal_done(work->done);
+	}
 	raw_spin_unlock_irqrestore(&stopper->lock, flags);
 
 	wake_up_q(&wakeq);
-- 
2.24.1



  parent reply	other threads:[~2020-01-17 17:41 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-17 17:41 [PATCH RT 00/32] Linux 4.19.94-rt39-rc1 Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 01/32] i2c: exynos5: Remove IRQF_ONESHOT Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 02/32] i2c: hix5hd2: " Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 03/32] sched/deadline: Ensure inactive_timer runs in hardirq context Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 04/32] thermal/x86_pkg_temp: make pkg_temp_lock a raw spinlock Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 05/32] dma-buf: Use seqlock_t instread disabling preemption Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 06/32] KVM: arm/arm64: Let the timer expire in hardirq context on RT Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 07/32] x86: preempt: Check preemption level before looking at lazy-preempt Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 08/32] hrtimer: Use READ_ONCE to access timer->base in hrimer_grab_expiry_lock() Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 09/32] hrtimer: Dont grab the expiry lock for non-soft hrtimer Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 10/32] hrtimer: Prevent using hrtimer_grab_expiry_lock() on migration_base Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 11/32] hrtimer: Add a missing bracket and hide `migration_base on !SMP Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 12/32] posix-timers: Unlock expiry lock in the early return Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 14/32] sched: __set_cpus_allowed_ptr: Check cpus_mask, not cpus_ptr Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 15/32] sched: Remove dead __migrate_disabled() check Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 16/32] sched: migrate disable: Protect cpus_ptr with lock Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 17/32] lib/smp_processor_id: Dont use cpumask_equal() Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 18/32] futex: Make the futex_hash_bucket spinlock_t again and bring back its old state Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 19/32] locking/rtmutex: Clean ->pi_blocked_on in the error case Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 20/32] lib/ubsan: Dont seralize UBSAN report Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 21/32] kmemleak: Change the lock of kmemleak_object to raw_spinlock_t Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 22/32] sched: migrate_enable: Use select_fallback_rq() Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 23/32] sched: Lazy migrate_disable processing Steven Rostedt
2020-01-17 17:41 ` Steven Rostedt [this message]
2020-01-22  8:31   ` [PATCH RT 24/32] sched: migrate_enable: Use stop_one_cpu_nowait() Sebastian Andrzej Siewior
2020-01-22 11:33     ` Steven Rostedt
2020-01-22 18:39       ` Scott Wood
2020-01-22 19:07         ` Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 25/32] Revert "cpufreq: drop K8s driver from beeing selected" Steven Rostedt
2020-01-22  8:38   ` Sebastian Andrzej Siewior
2020-01-22 11:34     ` Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 26/32] Revert "ARM: Initialize split page table locks for vector page" Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 28/32] locking: Make spinlock_t and rwlock_t a RCU section on RT Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 29/32] sched/core: migrate_enable() must access takedown_cpu_task on !HOTPLUG_CPU Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 30/32] lib/smp_processor_id: Adjust check_preemption_disabled() Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 31/32] sched: migrate_enable: Busy loop until the migration request is completed Steven Rostedt
2020-01-17 17:41 ` [PATCH RT 32/32] Linux 4.19.94-rt39-rc1 Steven Rostedt
     [not found] ` <20200117174131.455165326@goodmis.org>
2020-01-22  8:43   ` [PATCH RT 27/32] x86/fpu: Dont cache access to fpu_fpregs_owner_ctx Sebastian Andrzej Siewior
2020-01-22 11:34     ` 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=20200117174131.019724236@goodmis.org \
    --to=rostedt@goodmis.org \
    --cc=C.Emde@osadl.org \
    --cc=bigeasy@linutronix.de \
    --cc=jkacur@redhat.com \
    --cc=julia@ni.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rt-users@vger.kernel.org \
    --cc=swood@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=wagi@monom.org \
    --cc=zanussi@kernel.org \
    /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.