From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: David Howells <dhowells@redhat.com>
Cc: Eric Dumazet <eric.dumazet@gmail.com>,
Trond.Myklebust@netapp.com, linux-nfs@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] NFS: Fix RCU warnings in nfs_inode_return_delegation_noreclaim() [ver #2]
Date: Wed, 31 Mar 2010 18:29:19 -0700 [thread overview]
Message-ID: <20100401012919.GK2461@linux.vnet.ibm.com> (raw)
In-Reply-To: <19556.1270076008@redhat.com>
On Wed, Mar 31, 2010 at 11:53:28PM +0100, David Howells wrote:
> Eric Dumazet <eric.dumazet@gmail.com> wrote:
>
> > If you dont own a lock, and test a pointer, what guarantee do you have
> > this pointer doesnt change right after you tested it ?
>
> There are five possibilities:
>
> (1) A pointer points to something when you check, and still points to the
> same thing after you've gained the lock.
>
> (2) A pointer points to something when you check, and points to something
> else after you've gained the lock.
>
> (3) A pointer points to something when you check, and is NULL after you've
> gained the lock.
>
> (4) A pointer points to NULL when you check, and points to something after
> you've gained the lock.
>
> (5) A pointer points to NULL when you check, and points to NULL after you've
> gained the lock.
>
> However, what if you _know_ that the pointer can only ever be made non-NULL
> during initialisation, and may even be left unset? That means possibility (4)
> can never happen, and that possibility (5) can be detected by testing before
> taking the lock. Now, what if (5) is a common occurrence? It might make
> sense to make the test.
>
> And what matter if the pointer _does_ change after you test it. If it was
> NULL before, it can only be NULL now - by the semantics defined for that
> particular pointer.
>
> > If *something* protects the pointer from being changed, then how can be
> > expressed this fact ?
> >
> > If nothing protects the pointer, why test it then, as result of test is
> > unreliable ?
>
> I think you may be misunderstanding the purpose of rcu_dereference(). It is
> to make sure the reading and dereferencing of the pointer are correctly
> ordered with respect to the setting up of the pointed to record and the
> changing of the pointer.
>
> There must be two memory accesses for the barrier implied to be of use. In
> nfs_inode_return_delegation() there aren't two memory accesses to order,
> therefore the barrier is pointless.
>
> > If NFS was using rcu_dereference(), it probably was for a reason, but if
> > nobody can recall it, it was a wrong reason ?
>
> I think it is incorrectly used. Given that the rcu_dereference() in:
>
> if (rcu_dereference(nfsi->delegation) != NULL) {
> spin_lock(&clp->cl_lock);
> delegation = nfs_detach_delegation_locked(nfsi, NULL);
> spin_unlock(&clp->cl_lock);
> if (delegation != NULL)
> nfs_do_return_delegation(inode, delegation, 0);
> }
And nfs_detach_delegation_locked() rechecks nfsi->delegation() under
the lock, so this is a legitimate use.
The pointer is not held constant, but any changes will be accounted
for and handled correctly. So I would argue that the pointer value is
in fact protected by the recheck-under-lock algorithm used here.
Thanx, Paul
> resolves to:
>
> _________p1 = nfsi->delegation;
> smp_read_barrier_depends();
> if (_________p1) {
> spin_lock(&clp->cl_lock); // implicit LOCK-class barrier
> ==>nfs_detach_delegation_locked(nfsi, NULL);
> [dereference nfsi->delegation]
> ...
> }
>
> do you actually need the smp_read_barrier_depends()? You _have_ a barrier in
> the form of the spin_lock(). In fact, the spin_lock() is avowedly sufficient
> to protect accesses to and dereferences of nfsi->delegation, which means that:
>
> static struct nfs_delegation *nfs_detach_delegation_locked(struct nfs_inode *nfsi, const nfs4_stateid *stateid)
> {
> struct nfs_delegation *delegation = rcu_dereference(nfsi->delegation);
> ...
> }
>
> has no need of the internal barrier provided by rcu_dereference() either.
>
> David
next prev parent reply other threads:[~2010-04-01 1:29 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-18 13:33 [PATCH] NFS: Fix RCU warnings in nfs_inode_return_delegation_noreclaim() [ver #2] David Howells
[not found] ` <20100318133302.29754.1584.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2010-03-19 2:25 ` Paul E. McKenney
2010-03-19 2:25 ` Paul E. McKenney
2010-03-29 19:02 ` David Howells
2010-03-29 19:21 ` Paul E. McKenney
2010-03-29 20:15 ` David Howells
2010-03-29 20:26 ` Eric Dumazet
2010-03-29 20:26 ` Eric Dumazet
2010-03-29 21:05 ` Paul E. McKenney
2010-03-29 22:22 ` David Howells
2010-03-29 22:36 ` Paul E. McKenney
2010-03-29 22:59 ` David Howells
2010-03-29 23:26 ` Paul E. McKenney
2010-03-30 15:40 ` Paul E. McKenney
2010-03-30 16:39 ` David Howells
2010-03-30 16:49 ` Paul E. McKenney
2010-03-30 17:04 ` Eric Dumazet
2010-03-30 17:04 ` Eric Dumazet
2010-03-30 17:25 ` Paul E. McKenney
2010-03-30 17:25 ` Paul E. McKenney
2010-03-30 23:51 ` David Howells
2010-03-31 0:08 ` Paul E. McKenney
2010-03-31 14:04 ` David Howells
2010-03-31 15:16 ` Paul E. McKenney
2010-03-31 17:37 ` David Howells
2010-03-31 18:30 ` Paul E. McKenney
2010-03-31 18:32 ` Eric Dumazet
2010-03-31 18:32 ` Eric Dumazet
2010-03-31 22:53 ` David Howells
2010-04-01 1:29 ` Paul E. McKenney [this message]
2010-04-01 11:45 ` David Howells
2010-04-01 14:39 ` Paul E. McKenney
2010-04-01 14:46 ` David Howells
2010-04-05 17:57 ` Paul E. McKenney
2010-04-06 9:30 ` David Howells
2010-04-06 16:14 ` David Howells
2010-04-06 17:29 ` Paul E. McKenney
2010-04-06 19:34 ` David Howells
2010-04-07 0:02 ` Paul E. McKenney
2010-04-07 13:22 ` David Howells
2010-04-07 15:57 ` Paul E. McKenney
2010-04-07 16:35 ` RCU condition checks David Howells
2010-04-07 17:10 ` Paul E. McKenney
2010-04-11 22:57 ` Trond Myklebust
[not found] ` <1271026643.6620.37.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2010-04-12 16:47 ` Paul E. McKenney
2010-04-12 16:47 ` Paul E. McKenney
2010-03-30 16:37 ` [PATCH] NFS: Fix RCU warnings in nfs_inode_return_delegation_noreclaim() [ver #2] David Howells
2010-03-30 17:01 ` 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=20100401012919.GK2461@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=Trond.Myklebust@netapp.com \
--cc=dhowells@redhat.com \
--cc=eric.dumazet@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.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.