All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Dmitry Vyukov <dvyukov@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Ingo Molnar <mingo@kernel.org>,
	Lai Jiangshan <jiangshanlai@gmail.com>,
	dipankar@in.ibm.com, Andrew Morton <akpm@linux-foundation.org>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	Josh Triplett <josh@joshtriplett.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Steven Rostedt <rostedt@goodmis.org>,
	David Howells <dhowells@redhat.com>,
	Eric Dumazet <edumazet@google.com>,
	fweisbec@gmail.com, Oleg Nesterov <oleg@redhat.com>,
	bobby.prani@gmail.com, Will Deacon <will.deacon@arm.com>,
	Andrea Parri <parri.andrea@gmail.com>,
	hiralpat@cisco.com, satishkh@cisco.com, sebaddel@cisco.com,
	kartilak@cisco.com
Subject: Re: [PATCH tip/core/rcu 07/13] rcu: Add smp_mb__after_atomic() to sync_exp_work_done()
Date: Mon, 12 Jun 2017 14:54:29 -0700	[thread overview]
Message-ID: <20170612215429.GH3721@linux.vnet.ibm.com> (raw)
In-Reply-To: <CACT4Y+bpbAAjhKXntxrs5hujM7925GZJjq9EaN4J=Zsp181f5g@mail.gmail.com>

On Mon, Jun 12, 2017 at 04:51:43PM +0200, Dmitry Vyukov wrote:
> On Sat, Jun 10, 2017 at 12:56 AM, Paul E. McKenney
> <paulmck@linux.vnet.ibm.com> wrote:
> >> > > > +/**
> >> > > > + * 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);
> >> > >
> >> > > I'm current confused on this one. The case listed in the qspinlock code
> >> > > doesn't appear to exist in the kernel anymore (or at least, I'm having
> >> > > trouble finding it).
> >> > >
> >> > > That said, I'm also not sure spin_is_locked() provides an acquire, as
> >> > > that comment has an explicit smp_acquire__after_ctrl_dep();
> >> >
> >> > OK, I have dropped this portion of the patch for the moment.
> >> >
> >> > Going forward, exactly what semantics do you believe spin_is_locked()
> >> > provides?
> >> >
> >> > Do any of the current implementations need to change to provide the
> >> > semantics expected by the various use cases?
> >>
> >> I don't have anything other than the comment I wrote back then. I would
> >> have to go audit all spin_is_locked() implementations and users (again).
> >
> > And Andrea (CCed) and I did a review of the v4.11 uses of
> > spin_is_locked(), and none of the current uses requires any particular
> > ordering.
> >
> > There is one very strange use of spin_is_locked() in __fnic_set_state_flags()
> > in drivers/scsi/fnic/fnic_scsi.c.  This code checks spin_is_locked(),
> > and then acquires the lock only if it wasn't held.  I am having a very
> > hard time imagining a situation where this would do something useful.
> > My guess is that the author thought that spin_is_locked() meant that
> > the current CPU holds the lock, when it instead means that some CPU
> > (possibly the current one, possibly not) holds the lock.
> >
> > Adding the FNIC guys on CC so that they can enlighten me.

And if my guess is correct, the usual fix is to use a variable to track
which CPU is holding the lock, with -1 indicating that no one holds it.
Then the spin_is_locked() check becomes a test to see if the value of
this variable is equal to the ID of the current CPU, but with preemption
disabled across the test.  If this makes no sense, let me know, and I
can supply a prototype patch.

> > Ignoring the FNIC use case for the moment, anyone believe that
> > spin_is_locked() needs to provide any ordering guarantees?
> 
> Not providing any ordering guarantees for spin_is_locked() sounds good to me.
> Restricting all types of mutexes/locks to the simple canonical use
> case (protecting a critical section of code) makes it easier to reason
> about code, enables a bunch of possible static/dynamic correctness
> checking and reliefs lock/unlock function from providing unnecessary
> ordering (i.e. acquire in spin_is_locked() pairing with release in
> spin_lock()).
> Tricky uses of is_locked and try_lock can resort to atomic operations
> (or maybe be removed).

One vote in favor of dropping ordering guarantees.  Any objections?

							Thanx, Paul

  reply	other threads:[~2017-06-12 21:54 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
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 [this message]
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=20170612215429.GH3721@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=hiralpat@cisco.com \
    --cc=jiangshanlai@gmail.com \
    --cc=josh@joshtriplett.org \
    --cc=kartilak@cisco.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mingo@kernel.org \
    --cc=oleg@redhat.com \
    --cc=parri.andrea@gmail.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=satishkh@cisco.com \
    --cc=sebaddel@cisco.com \
    --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.