From: Neil Brown <neilb@suse.de>
To: "J. Bruce Fields" <bfields@fieldses.org>
Cc: "J. Bruce Fields" <bfields@redhat.com>,
linux-nfs@vger.kernel.org,
Menyhart Zoltan <Zoltan.Menyhart@bull.net>
Subject: Re: [PATCH 1/4] svcrpc: never clear XPT_BUSY on dead xprt
Date: Tue, 26 Oct 2010 10:54:47 +1100 [thread overview]
Message-ID: <20101026105447.264b690e@notabene> (raw)
In-Reply-To: <20101025230331.GF13523@fieldses.org>
On Mon, 25 Oct 2010 19:03:35 -0400
"J. Bruce Fields" <bfields@fieldses.org> wrote:
> On Tue, Oct 26, 2010 at 09:58:36AM +1100, Neil Brown wrote:
> > On Mon, 25 Oct 2010 16:21:56 -0400
> > "J. Bruce Fields" <bfields@fieldses.org> wrote:
> >
> > > On Mon, Oct 25, 2010 at 12:43:57PM +1100, Neil Brown wrote:
> > > > On Sun, 24 Oct 2010 21:21:30 -0400
> > > > "J. Bruce Fields" <bfields@redhat.com> wrote:
> > > >
> > > > > Once an xprt has been deleted, there's no reason to allow it to be
> > > > > enqueued--at worst, that might cause the xprt to be re-added to some
> > > > > global list, resulting in later corruption.
> > > > >
> > > > > Signed-off-by: J. Bruce Fields <bfields@redhat.com>
> > > >
> > > > Yep, this makes svc_close_xprt() behave the same way as svc_recv() which
> > > > calls svc_delete_xprt but does not clear XPT_BUSY. The other branches in
> > > > svc_recv call svc_xprt_received, but the XPT_CLOSE branch doesn't
> > > >
> > > > Reviewed-by: NeilBrown <neilb@suse.de>
> > >
> > > Also, of course:
> > >
> > > > > svc_xprt_get(xprt);
> > > > > svc_delete_xprt(xprt);
> > > > > - clear_bit(XPT_BUSY, &xprt->xpt_flags);
> > > > > svc_xprt_put(xprt);
> > >
> > > The get/put is pointless: the only reason I can see for doing that of
> > > course was to be able to safely clear the bit afterwards.
> > >
> >
> > Agreed.
> >
> > I like patches that get rid of code!!
>
> Unfortunately, I'm stuck on just one more point: is svc_close_all()
> really safe? It assumes it doesn't need any locking to speak of any
> more because the server threads are gone--but the xprt's themselves
> could still be producing events, right? (So data could be arriving that
> results in calls to svc_xprt_enqueue, for example?)
>
> If that's right, I'm not sure what to do there....
>
> --b.
Yes, svc_close_all is racy w.r.t. svc_xprt_enqueue.
I guess we've never lost that race?
The race happens if the test_and_set(XPT_BUSY) in svc_xprt_enqueue happens
before the test_bit(XPT_BUSY) in svc_close_all, but the list_add_tail at the
end of svc_xprt_enqueue happens before (or during!) the list_del_init in
svc_close_all.
We cannot really lock against this race as svc_xprt_enqueue holds the pool
lock, and svc_close_all doesn't know which pool to lock (as xprt->pool isn't
set until after XPT_BUSY is set).
Maybe we just need to lock all pools in that case??
So svc_close_all becomes something like:
void svc_close_all(struct list_head *xprt_list)
{
struct svc_xprt *xprt;
struct svc_xprt *tmp;
struct svc_pool *pool;
list_for_each_entry_safe(xprt, tmp, xprt_list, xpt_list) {
set_bit(XPT_CLOSE, &xprt->xpt_flags);
if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) {
/* Waiting to be processed, but no threads left,
* So just remove it from the waiting list. First
* we need to ensure svc_xprt_enqueue isn't still
* queuing the xprt to some pool.
*/
for_each_pool(pool, xprt->xpt_server) {
spin_lock(&pool->sp_lock);
spin_unlock(&pool->sp_lock);
}
list_del_init(&xprt->xpt_ready);
}
svc_delete_xprt(xprt);
}
}
Note that once we always set XPT_BUSY and it stays set. So we call
svc_delete_xprt instread of svc_close_xprt.
Maybe we don't actually need to list_del_init - both the pool and the xprt
will soon be freed and if there is linkage between them, who cares??
In that case we wouldn't need to for_each_pool after all ???
NeilBrown
next prev parent reply other threads:[~2010-10-25 23:54 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-01 12:17 Relocate NFS root FS for maintenance Greg
2010-09-01 17:34 ` J. Bruce Fields
2010-09-01 21:52 ` Tom Haynes
2010-09-02 7:32 ` Greg
2010-09-02 16:06 ` J. Bruce Fields
2010-09-07 6:59 ` Greg
2010-09-02 6:56 ` statfs() gives ESTALE error Menyhart Zoltan
2010-09-07 18:32 ` Trond Myklebust
2010-09-08 13:33 ` Re :statfs() " Menyhart Zoltan
2010-09-08 20:25 ` Trond Myklebust
2010-09-09 8:12 ` Menyhart Zoltan
2010-09-20 12:49 ` Locking question around "...PagePrivate()" Menyhart Zoltan
2010-09-20 13:55 ` Trond Myklebust
2010-10-05 8:22 ` "xprt" reference count drops to 0 Menyhart Zoltan
2010-10-21 20:38 ` J. Bruce Fields
2010-10-22 15:00 ` Menyhart Zoltan
2010-10-22 21:20 ` J. Bruce Fields
2010-10-22 23:01 ` J. Bruce Fields
2010-10-22 23:21 ` J. Bruce Fields
2010-10-23 3:32 ` J. Bruce Fields
2010-10-25 1:09 ` J. Bruce Fields
2010-10-25 1:21 ` [PATCH 1/4] svcrpc: never clear XPT_BUSY on dead xprt J. Bruce Fields
2010-10-25 1:43 ` Neil Brown
2010-10-25 20:21 ` J. Bruce Fields
2010-10-25 22:58 ` Neil Brown
2010-10-25 23:03 ` J. Bruce Fields
2010-10-25 23:54 ` Neil Brown [this message]
2010-10-26 0:11 ` J. Bruce Fields
2010-10-26 0:28 ` J. Bruce Fields
2010-10-26 0:30 ` J. Bruce Fields
2010-10-26 1:28 ` Neil Brown
2010-10-26 12:59 ` J. Bruce Fields
2010-10-26 16:05 ` J. Bruce Fields
2010-11-12 19:00 ` J. Bruce Fields
2010-10-25 1:21 ` [PATCH 2/4] svcrpc: assume svc_delete_xprt() called only once J. Bruce Fields
2010-10-25 1:21 ` [PATCH 3/4] svcrpc: no need for XPT_DEAD check in svc_xprt_enqueue J. Bruce Fields
2010-10-25 1:21 ` [PATCH 4/4] svcrpc: svc_tcp_sendto XTP_DEAD check is redundant J. Bruce Fields
2010-10-25 2:10 ` Neil Brown
2010-10-25 15:03 ` J. Bruce Fields
2010-10-25 17:46 ` J. Bruce Fields
2010-10-25 23:08 ` Neil Brown
2010-10-26 1:33 ` J. Bruce Fields
2010-10-25 23:23 ` Neil Brown
2010-10-26 1:25 ` J. Bruce Fields
2010-10-25 11:56 ` "xprt" reference count drops to 0 Menyhart Zoltan
2010-10-25 14:36 ` J. Bruce Fields
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=20101026105447.264b690e@notabene \
--to=neilb@suse.de \
--cc=Zoltan.Menyhart@bull.net \
--cc=bfields@fieldses.org \
--cc=bfields@redhat.com \
--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.