From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org, mingo@kernel.org,
jiangshanlai@gmail.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
josh@joshtriplett.org, tglx@linutronix.de, rostedt@goodmis.org,
dhowells@redhat.com, edumazet@google.com, fweisbec@gmail.com,
oleg@redhat.com, bobby.prani@gmail.com, dvyukov@google.com,
will.deacon@arm.com
Subject: Re: [PATCH tip/core/rcu 07/13] rcu: Add smp_mb__after_atomic() to sync_exp_work_done()
Date: Wed, 19 Apr 2017 16:23:52 -0700 [thread overview]
Message-ID: <20170419232352.GC3956@linux.vnet.ibm.com> (raw)
In-Reply-To: <20170413175136.5qnzvqrmzyuvlqsj@hirez.programming.kicks-ass.net>
On Thu, Apr 13, 2017 at 07:51:36PM +0200, Peter Zijlstra wrote:
> On Thu, Apr 13, 2017 at 10:39:51AM -0700, Paul E. McKenney wrote:
>
> > Well, if there are no objections, I will fix up the smp_mb__before_atomic()
> > and smp_mb__after_atomic() pieces.
>
> Feel free.
How about if I add this in the atomic_ops.txt description of these
two primitives?
Preceding a non-value-returning read-modify-write atomic
operation with smp_mb__before_atomic() and following it with
smp_mb__after_atomic() provides the same full ordering that is
provided by value-returning read-modify-write atomic operations.
> > I suppose that one alternative is the new variant of kerneldoc, though
> > very few of these functions have comment headers, let alone kerneldoc
> > headers. Which reminds me, the question of spin_unlock_wait() and
> > spin_is_locked() semantics came up a bit ago. Here is what I believe
> > to be the case. Does this match others' expectations?
> >
> > o spin_unlock_wait() semantics:
> >
> > 1. Any access in any critical section prior to the
> > spin_unlock_wait() is visible to all code following
> > (in program order) the spin_unlock_wait().
> >
> > 2. Any access prior (in program order) to the
> > spin_unlock_wait() is visible to any critical
> > section following the spin_unlock_wait().
> >
> > o spin_is_locked() semantics: Half of spin_unlock_wait(),
> > but only if it returns false:
> >
> > 1. Any access in any critical section prior to the
> > spin_unlock_wait() is visible to all code following
> > (in program order) the spin_unlock_wait().
>
> Urgh.. yes those are pain. The best advise is to not use them.
>
> 055ce0fd1b86 ("locking/qspinlock: Add comments")
Ah, I must confess that I missed that one. Would you be OK with the
following patch, which adds a docbook header comment for both of them?
Thanx, Paul
------------------------------------------------------------------------
commit 5789953adc360b4d3685dc89513655e6bfb83980
Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Date: Wed Apr 19 16:20:07 2017 -0700
atomics: Add header comment so spin_unlock_wait() and spin_is_locked()
There is material describing the ordering guarantees provided by
spin_unlock_wait() and spin_is_locked(), but it is not necessarily
easy to find. This commit therefore adds a docbook header comment
to both functions informally describing their semantics.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h
index 59248dcc6ef3..2647dc7f3ea9 100644
--- a/include/linux/spinlock.h
+++ b/include/linux/spinlock.h
@@ -369,11 +369,49 @@ static __always_inline int spin_trylock_irq(spinlock_t *lock)
raw_spin_trylock_irqsave(spinlock_check(lock), flags); \
})
+/**
+ * spin_unlock_wait - Interpose between successive critical sections
+ * @lock: the spinlock whose critical sections are to be interposed.
+ *
+ * Semantically this is equivalent to a spin_lock() immediately
+ * followed by a spin_unlock(). However, most architectures have
+ * more efficient implementations in which the spin_unlock_wait()
+ * cannot block concurrent lock acquisition, and in some cases
+ * where spin_unlock_wait() does not write to the lock variable.
+ * Nevertheless, spin_unlock_wait() can have high overhead, so if
+ * you feel the need to use it, please check to see if there is
+ * a better way to get your job done.
+ *
+ * The ordering guarantees provided by spin_unlock_wait() are:
+ *
+ * 1. All accesses preceding the spin_unlock_wait() happen before
+ * any accesses in later critical sections for this same lock.
+ * 2. All accesses following the spin_unlock_wait() happen after
+ * any accesses in earlier critical sections for this same lock.
+ */
static __always_inline void spin_unlock_wait(spinlock_t *lock)
{
raw_spin_unlock_wait(&lock->rlock);
}
+/**
+ * spin_is_locked - Conditionally interpose after prior critical sections
+ * @lock: the spinlock whose critical sections are to be interposed.
+ *
+ * Semantically this is equivalent to a spin_trylock(), and, if
+ * the spin_trylock() succeeds, immediately followed by a (mythical)
+ * spin_unlock_relaxed(). The return value from spin_trylock() is returned
+ * by spin_is_locked(). Note that all current architectures have extremely
+ * efficient implementations in which the spin_is_locked() does not even
+ * write to the lock variable.
+ *
+ * A successful spin_is_locked() primitive in some sense "takes its place"
+ * after some critical section for the lock in question. Any accesses
+ * following a successful spin_is_locked() call will therefore happen
+ * after any accesses by any of the preceding critical section for that
+ * same lock. Note however, that spin_is_locked() provides absolutely no
+ * ordering guarantees for code preceding the call to that spin_is_locked().
+ */
static __always_inline int spin_is_locked(spinlock_t *lock)
{
return raw_spin_is_locked(&lock->rlock);
next prev parent reply other threads:[~2017-04-19 23:24 UTC|newest]
Thread overview: 119+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-12 16:54 [PATCH tip/core/rcu 0/13] Miscellaneous fixes for 4.12 Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 01/13] mm: Rename SLAB_DESTROY_BY_RCU to SLAB_TYPESAFE_BY_RCU Paul E. McKenney
2017-04-12 16:55 ` Paul E. McKenney
2017-04-13 9:12 ` Peter Zijlstra
2017-04-13 9:12 ` Peter Zijlstra
2017-04-13 11:06 ` Vlastimil Babka
2017-04-13 11:06 ` Vlastimil Babka
2017-04-13 16:00 ` Paul E. McKenney
2017-04-13 16:00 ` Paul E. McKenney
2017-04-13 16:17 ` Peter Zijlstra
2017-04-13 16:17 ` Peter Zijlstra
2017-04-13 17:24 ` Paul E. McKenney
2017-04-13 17:24 ` Paul E. McKenney
2017-04-13 21:30 ` Eric Dumazet
2017-04-13 21:30 ` Eric Dumazet
2017-04-14 8:45 ` Peter Zijlstra
2017-04-14 8:45 ` Peter Zijlstra
2017-04-14 13:39 ` Paul E. McKenney
2017-04-14 13:39 ` Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 02/13] lockdep: Use "WARNING" tag on lockdep splats Paul E. McKenney
2017-04-13 9:14 ` Peter Zijlstra
2017-04-13 16:01 ` Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 03/13] types: Update obsolete callback_head comment Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 04/13] rcu: Make RCU_FANOUT_LEAF help text more explicit about skew_tick Paul E. McKenney
2017-04-13 9:15 ` Peter Zijlstra
2017-04-13 16:03 ` Paul E. McKenney
2017-04-13 16:19 ` Peter Zijlstra
2017-04-13 16:55 ` Paul E. McKenney
2017-04-13 17:04 ` Peter Zijlstra
2017-04-13 17:31 ` Paul E. McKenney
2017-04-13 17:46 ` Peter Zijlstra
2017-04-13 18:19 ` Paul E. McKenney
2017-04-13 18:23 ` Peter Zijlstra
2017-04-13 18:42 ` Paul E. McKenney
2017-04-19 13:22 ` Peter Zijlstra
2017-04-19 13:48 ` Peter Zijlstra
2017-04-19 15:08 ` Paul E. McKenney
2017-04-19 15:40 ` Peter Zijlstra
2017-04-19 16:13 ` Paul E. McKenney
2017-04-19 14:50 ` Paul E. McKenney
2017-04-13 18:29 ` Peter Zijlstra
2017-04-13 19:42 ` Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 05/13] rcu: Remove obsolete comment from rcu_future_gp_cleanup() header Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 06/13] hlist_add_tail_rcu disable sparse warning Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 07/13] rcu: Add smp_mb__after_atomic() to sync_exp_work_done() Paul E. McKenney
2017-04-13 9:18 ` Peter Zijlstra
2017-04-13 9:33 ` Peter Zijlstra
2017-04-13 16:10 ` Paul E. McKenney
2017-04-13 16:24 ` Peter Zijlstra
2017-04-13 16:57 ` Paul E. McKenney
2017-04-13 17:10 ` Peter Zijlstra
2017-04-13 17:39 ` Paul E. McKenney
2017-04-13 17:51 ` Peter Zijlstra
2017-04-13 17:59 ` Peter Zijlstra
2017-04-19 23:24 ` Paul E. McKenney
2017-04-19 23:23 ` Paul E. McKenney [this message]
2017-04-20 11:17 ` Peter Zijlstra
2017-04-20 15:03 ` Paul E. McKenney
2017-04-20 15:08 ` Peter Zijlstra
2017-06-09 22:56 ` Paul E. McKenney
2017-06-12 14:51 ` Dmitry Vyukov
2017-06-12 21:54 ` Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 08/13] rcu: Improve comments for hotplug/suspend/hibernate functions Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 09/13] mm: Use static initialization for "srcu" Paul E. McKenney
2017-04-12 16:55 ` Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 10/13] torture: Use correct path for Kconfig fragment for duplicates Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 11/13] rcu: Use bool value directly Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 12/13] rcu: Use true/false in assignment to bool Paul E. McKenney
2017-04-12 16:55 ` [PATCH tip/core/rcu 13/13] rcu: Fix typo in PER_RCU_NODE_PERIOD header comment Paul E. McKenney
2017-04-17 23:27 ` [PATCH v2 tip/core/rcu 0/13] Miscellaneous fixes for 4.12 Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 01/11] mm: Rename SLAB_DESTROY_BY_RCU to SLAB_TYPESAFE_BY_RCU Paul E. McKenney
2017-04-17 23:28 ` Paul E. McKenney
2017-04-18 0:14 ` David Rientjes
2017-04-18 0:14 ` David Rientjes
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 02/11] lockdep: Use "WARNING" tag on lockdep splats Paul E. McKenney
2017-04-19 15:00 ` Josh Triplett
2017-04-19 16:26 ` Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 03/11] types: Update obsolete callback_head comment Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 04/11] rcu: Make RCU_FANOUT_LEAF help text more explicit about skew_tick Paul E. McKenney
2017-04-18 0:18 ` Josh Triplett
2017-04-18 18:42 ` Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 05/11] rcu: Remove obsolete comment from rcu_future_gp_cleanup() header Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 06/11] hlist_add_tail_rcu disable sparse warning Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 07/11] rcu: Improve comments for hotplug/suspend/hibernate functions Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 08/11] torture: Use correct path for Kconfig fragment for duplicates Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 09/11] rcu: Use bool value directly Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 10/11] rcu: Use true/false in assignment to bool Paul E. McKenney
2017-04-17 23:28 ` [PATCH v2 tip/core/rcu 11/11] rcu: Fix typo in PER_RCU_NODE_PERIOD header comment Paul E. McKenney
2017-04-19 11:28 ` [PATCH v2 tip/core/rcu 0/13] Miscellaneous fixes for 4.12 Peter Zijlstra
2017-04-19 11:35 ` Peter Zijlstra
2017-04-19 11:48 ` Christian Borntraeger
2017-04-19 12:08 ` Peter Zijlstra
2017-04-19 12:51 ` Marc Zyngier
2017-04-19 14:47 ` Paul E. McKenney
2017-04-19 14:52 ` Peter Zijlstra
2017-04-19 15:13 ` Paul E. McKenney
2017-04-19 14:58 ` Josh Triplett
2017-04-19 15:03 ` Peter Zijlstra
2017-04-19 15:17 ` Paul E. McKenney
2017-04-19 13:22 ` Paul E. McKenney
2017-04-19 13:25 ` Christian Borntraeger
2017-04-19 13:02 ` Paul E. McKenney
2017-04-19 13:15 ` Peter Zijlstra
2017-04-19 15:37 ` Paul E. McKenney
2017-04-19 15:43 ` Peter Zijlstra
2017-04-19 16:12 ` Paul E. McKenney
2017-04-19 16:45 ` Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 01/11] mm: Rename SLAB_DESTROY_BY_RCU to SLAB_TYPESAFE_BY_RCU Paul E. McKenney
2017-04-19 16:46 ` Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 02/11] lockdep: Use "WARNING" tag on lockdep splats Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 03/11] types: Update obsolete callback_head comment Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 04/11] rcu: Make RCU_FANOUT_LEAF help text more explicit about skew_tick Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 05/11] rcu: Remove obsolete comment from rcu_future_gp_cleanup() header Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 06/11] hlist_add_tail_rcu disable sparse warning Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 07/11] rcu: Improve comments for hotplug/suspend/hibernate functions Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 08/11] torture: Use correct path for Kconfig fragment for duplicates Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 09/11] rcu: Use bool value directly Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 10/11] rcu: Use true/false in assignment to bool Paul E. McKenney
2017-04-19 16:46 ` [PATCH v3 tip/core/rcu 11/11] rcu: Fix typo in PER_RCU_NODE_PERIOD header comment Paul E. McKenney
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=20170419232352.GC3956@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=bobby.prani@gmail.com \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=dvyukov@google.com \
--cc=edumazet@google.com \
--cc=fweisbec@gmail.com \
--cc=jiangshanlai@gmail.com \
--cc=josh@joshtriplett.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=will.deacon@arm.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.