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>,
"Srivatsa S. Bhat" <srivatsa@csail.mit.edu>,
Scott Wood <swood@redhat.com>
Subject: [PATCH RT 2/8] sched: migrate_enable: Use per-cpu cpu_stop_work
Date: Fri, 06 Mar 2020 13:40:37 -0500 [thread overview]
Message-ID: <20200306184052.026866157@goodmis.org> (raw)
In-Reply-To: 20200306184035.948924528@goodmis.org
4.19.106-rt45-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Scott Wood <swood@redhat.com>
[ Upstream commit 2dcd94b443c5dcbc20281666321b7f025f9cc85c ]
Commit e6c287b1512d ("sched: migrate_enable: Use stop_one_cpu_nowait()")
adds a busy wait to deal with an edge case where the migrated thread
can resume running on another CPU before the stopper has consumed
cpu_stop_work. However, this is done with preemption disabled and can
potentially lead to deadlock.
While it is not guaranteed that the cpu_stop_work will be consumed before
the migrating thread resumes and exits the stack frame, it is guaranteed
that nothing other than the stopper can run on the old cpu between the
migrating thread scheduling out and the cpu_stop_work being consumed.
Thus, we can store cpu_stop_work in per-cpu data without it being
reused too early.
Fixes: e6c287b1512d ("sched: migrate_enable: Use stop_one_cpu_nowait()")
Suggested-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Scott Wood <swood@redhat.com>
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
kernel/sched/core.c | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 4616c086dd26..c4290fa5c0b6 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7291,6 +7291,9 @@ static void migrate_disabled_sched(struct task_struct *p)
p->migrate_disable_scheduled = 1;
}
+static DEFINE_PER_CPU(struct cpu_stop_work, migrate_work);
+static DEFINE_PER_CPU(struct migration_arg, migrate_arg);
+
void migrate_enable(void)
{
struct task_struct *p = current;
@@ -7329,23 +7332,26 @@ void migrate_enable(void)
WARN_ON(smp_processor_id() != cpu);
if (!is_cpu_allowed(p, cpu)) {
- struct migration_arg arg = { .task = p };
- struct cpu_stop_work work;
+ struct migration_arg __percpu *arg;
+ struct cpu_stop_work __percpu *work;
struct rq_flags rf;
+ work = this_cpu_ptr(&migrate_work);
+ arg = this_cpu_ptr(&migrate_arg);
+ WARN_ON_ONCE(!arg->done && !work->disabled && work->arg);
+
+ arg->task = p;
+ arg->done = false;
+
rq = task_rq_lock(p, &rf);
update_rq_clock(rq);
- arg.dest_cpu = select_fallback_rq(cpu, p);
+ arg->dest_cpu = select_fallback_rq(cpu, p);
task_rq_unlock(rq, p, &rf);
stop_one_cpu_nowait(task_cpu(p), migration_cpu_stop,
- &arg, &work);
+ arg, work);
tlb_migrate_finish(p->mm);
__schedule(true);
- if (!work.disabled) {
- while (!arg.done)
- cpu_relax();
- }
}
out:
--
2.25.0
next prev parent reply other threads:[~2020-03-06 18:41 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-06 18:40 [PATCH RT 0/8] Linux 4.19.106-rt45-rc1 Steven Rostedt
2020-03-06 18:40 ` [PATCH RT 1/8] userfaultfd: Use a seqlock instead of seqcount Steven Rostedt
2020-03-06 18:40 ` Steven Rostedt [this message]
2020-03-06 18:40 ` [PATCH RT 3/8] sched: migrate_enable: Remove __schedule() call Steven Rostedt
2020-03-06 18:40 ` [PATCH RT 4/8] mm/memcontrol: Move misplaced local_unlock_irqrestore() Steven Rostedt
2020-03-06 18:40 ` [PATCH RT 5/8] locallock: Include header for the `current macro Steven Rostedt
2020-03-06 18:40 ` [PATCH RT 6/8] drm/vmwgfx: Drop preempt_disable() in vmw_fifo_ping_host() Steven Rostedt
2020-03-06 18:40 ` [PATCH RT 7/8] tracing: make preempt_lazy and migrate_disable counter smaller Steven Rostedt
2020-03-06 18:40 ` [PATCH RT 8/8] Linux 4.19.106-rt45-rc1 Steven Rostedt
-- strict thread matches above, loose matches on Subject: below --
2020-03-09 19:47 [PATCH RT 0/8] Linux v4.14.172-rt78-rc1 zanussi
2020-03-09 19:47 ` [PATCH RT 2/8] sched: migrate_enable: Use per-cpu cpu_stop_work zanussi
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=20200306184052.026866157@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=srivatsa@csail.mit.edu \
--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 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).