From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: mathieu.desnoyers@efficios.com
Cc: linux-kernel@vger.kernel.org, peterz@infradead.org,
boqun.feng@gmail.com, ahh@google.com, maged.michael@gmail.com,
gromer@google.com, avi@scylladb.com, benh@kernel.crashing.org,
paulus@samba.org, mpe@ellerman.id.au, davejwatson@fb.com
Subject: sys_membarrier() scheduler barrier requirements: dropped
Date: Mon, 18 Sep 2017 10:07:52 -0700 [thread overview]
Message-ID: <20170918170752.GA12654@linux.vnet.ibm.com> (raw)
Hello!
Commit 3ed668659e95 ("membarrier: Document scheduler barrier
requirements") did not make it into the v4.14 merge window, and rebasing
to v4.14-rc1 results in conflicts. I have therefore dropped it.
If someone would be willing to forward-port it, I would be quite happy
to pull it back in for the v4.15 merge window. Or potentially as part
of the fix to sys_membarrier() for 4.14, for that matter.
Thanx, Paul
------------------------------------------------------------------------
commit 3ed668659e95ecfb6f6be0a3e7ff0fa6d27b2f5c
Author: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Date: Fri Aug 18 21:39:16 2017 -0700
membarrier: Document scheduler barrier requirements
Document the membarrier requirement on having a full memory barrier in
__schedule() after coming from user-space, before storing to rq->curr.
It is provided by smp_mb__before_spinlock() in __schedule().
Document that membarrier requires a full barrier on transition from
kernel thread to userspace thread, which skips the call to switch_mm(). We
currently have an implicit barrier from atomic_dec_and_test() in mmdrop() that
ensures this.
The x86 switch_mm_irqs_off() full barrier is currently provided by many cpumask
update operations as well as load_cr3(). Document that load_cr3() is providing
this barrier.
[ Rebased on top of linux-rcu for-mingo branch.
Applies on top of "membarrier: Provide expedited private command". ]
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
CC: Peter Zijlstra <peterz@infradead.org>
CC: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
CC: Boqun Feng <boqun.feng@gmail.com>
CC: Andrew Hunter <ahh@google.com>
CC: Maged Michael <maged.michael@gmail.com>
CC: gromer@google.com
CC: Avi Kivity <avi@scylladb.com>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
CC: Paul Mackerras <paulus@samba.org>
CC: Michael Ellerman <mpe@ellerman.id.au>
CC: Dave Watson <davejwatson@fb.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
index 014d07a80053..cd815b63420a 100644
--- a/arch/x86/mm/tlb.c
+++ b/arch/x86/mm/tlb.c
@@ -133,6 +133,9 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
* and neither LOCK nor MFENCE orders them.
* Fortunately, load_cr3() is serializing and gives the
* ordering guarantee we need.
+ *
+ * This full barrier is also required by the membarrier
+ * system call.
*/
load_cr3(next->pgd);
diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h
index 2b24a6974847..fe29d06e2800 100644
--- a/include/linux/sched/mm.h
+++ b/include/linux/sched/mm.h
@@ -38,6 +38,10 @@ static inline void mmgrab(struct mm_struct *mm)
extern void __mmdrop(struct mm_struct *);
static inline void mmdrop(struct mm_struct *mm)
{
+ /*
+ * The implicit full barrier implied by atomic_dec_and_test is
+ * required by the membarrier system call.
+ */
if (unlikely(atomic_dec_and_test(&mm->mm_count)))
__mmdrop(mm);
}
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 3f29c6a89d80..b0f199f9ec62 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2654,6 +2654,12 @@ static struct rq *finish_task_switch(struct task_struct *prev)
finish_arch_post_lock_switch();
fire_sched_in_preempt_notifiers(current);
+ /*
+ * When transitioning from a kernel thread to a userspace
+ * thread, mmdrop()'s implicit full barrier is required by the
+ * membarrier system call, because the current active_mm can
+ * become the current mm without going through switch_mm().
+ */
if (mm)
mmdrop(mm);
if (unlikely(prev_state == TASK_DEAD)) {
@@ -3295,6 +3301,9 @@ static void __sched notrace __schedule(bool preempt)
* Make sure that signal_pending_state()->signal_pending() below
* can't be reordered with __set_current_state(TASK_INTERRUPTIBLE)
* done by the caller to avoid the race with signal_wake_up().
+ *
+ * The membarrier system call requires a full memory barrier
+ * after coming from user-space, before storing to rq->curr.
*/
smp_mb__before_spinlock();
rq_lock(rq, &rf);
reply other threads:[~2017-09-18 17:08 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20170918170752.GA12654@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=ahh@google.com \
--cc=avi@scylladb.com \
--cc=benh@kernel.crashing.org \
--cc=boqun.feng@gmail.com \
--cc=davejwatson@fb.com \
--cc=gromer@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=maged.michael@gmail.com \
--cc=mathieu.desnoyers@efficios.com \
--cc=mpe@ellerman.id.au \
--cc=paulus@samba.org \
--cc=peterz@infradead.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.