All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@infradead.org>
To: Jeff Layton <jlayton@redhat.com>
Cc: akpm@linux-foundation.org, neilb@suse.de,
	linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 6/6] NLM: Add reference counting to lockd
Date: Wed, 9 Jan 2008 17:47:07 +0000	[thread overview]
Message-ID: <20080109174707.GC30523@infradead.org> (raw)
In-Reply-To: <1199820798-5289-7-git-send-email-jlayton@redhat.com>

On Tue, Jan 08, 2008 at 02:33:18PM -0500, Jeff Layton wrote:
> ...and only have lockd exit when the last reference is dropped.
> 
> The problem is this:
> 
> When a lock that a client is blocking on comes free, lockd does this in
> nlmsvc_grant_blocked():
> 
>     nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG, &nlmsvc_grant_ops);
> 
> the callback from this call is nlmsvc_grant_callback(). That function
> does this at the end to wake up lockd:
> 
>     svc_wake_up(block->b_daemon);
> 
> However there is no guarantee that lockd will be up when this happens.
> If someone shuts down or restarts lockd before the async call completes,
> then the b_daemon pointer will point to freed memory and the kernel may
> oops.
> 
> I first noticed this on older kernels and had mistakenly thought that
> newer kernels weren't susceptible, but that's not correct. There's a bit
> of a race to make sure that the nlm_host is bound when the async call is
> done, but I can now reproduce this at will on current kernels.
> 
> This patch is based on Trond's suggestion to add a new reference counter
> to lockd, and only allows lockd to go down when it reaches 0. With this
> change we can't use kthread_stop here. nlmsvc_unlink_block is called by
> lockd and a kthread can't call kthread_stop on itself. So the patch
> changes lockd to check the refcount itself and to return if it goes to
> 0. We do the checking and exit while holding the nlmsvc_mutex to make
> sure that a new lockd is not started until the old one is down.

I don't like this signals/kthread mixture at all.  Why can't we simply
call kthread_stop when the refcount hits zero and keep all the nice
kthread helpers?


  reply	other threads:[~2008-01-09 17:47 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-08 19:33 [PATCH 0/6] Intro: convert lockd to kthread and fix use-after-free (try #6) Jeff Layton
2008-01-08 19:33 ` [PATCH 1/6] SUNRPC: spin svc_rqst initialization to its own function Jeff Layton
2008-01-08 19:33   ` [PATCH 2/6] SUNRPC: export svc_sock_update_bufs Jeff Layton
2008-01-08 19:33     ` [PATCH 3/6] NLM: Initialize completion variable in lockd_up Jeff Layton
2008-01-08 19:33       ` [PATCH 4/6] NLM: Have lockd call try_to_freeze Jeff Layton
2008-01-08 19:33         ` [PATCH 5/6] NLM: Convert lockd to use kthreads Jeff Layton
2008-01-08 19:33           ` [PATCH 6/6] NLM: Add reference counting to lockd Jeff Layton
2008-01-09 17:47             ` Christoph Hellwig [this message]
2008-01-09 18:36               ` Jeff Layton
     [not found]                 ` <20080109133621.72f611ec-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2008-01-09 18:48                   ` Christoph Hellwig
2008-01-09 18:48                     ` Christoph Hellwig
2008-01-09 18:59                     ` Jeff Layton
2008-01-10  3:29             ` Neil Brown
     [not found]               ` <18309.37138.207880.305870-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2008-01-10 11:58                 ` Jeff Layton
2008-01-10 11:58                   ` Jeff Layton
2008-01-09 17:45           ` [PATCH 5/6] NLM: Convert lockd to use kthreads Christoph Hellwig
2008-01-09 18:08             ` Jeff Layton
2008-01-09 17:35       ` [PATCH 3/6] NLM: Initialize completion variable in lockd_up Christoph Hellwig
2008-01-09 18:05         ` Jeff Layton
     [not found]           ` <20080109130554.550ccde5-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2008-01-09 18:14             ` Christoph Hellwig
2008-01-09 18:14               ` Christoph Hellwig
2008-01-13 13:27         ` Jeff Layton
     [not found]           ` <20080113082718.396890f7-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2008-01-13 18:17             ` Christoph Hellwig
2008-01-13 18:17               ` Christoph Hellwig
2008-01-13 19:12               ` J. Bruce Fields
2008-01-14 14:24               ` Jeff Layton
     [not found]                 ` <20080114092454.66a41c29-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2008-01-14 14:25                   ` Christoph Hellwig
2008-01-14 14:25                     ` Christoph Hellwig
2008-03-15  3:44               ` Mike Snitzer
     [not found]                 ` <170fa0d20803142044i3e4d134fq5b287134248a113f-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-03-15  6:34                   ` Christoph Hellwig
2008-03-15  6:34                     ` Christoph Hellwig
  -- strict thread matches above, loose matches on Subject: below --
2008-01-05 12:02 [PATCH 0/6] Intro: convert lockd to kthread and fix use-after-free (try #5) Jeff Layton
2008-01-05 12:02 ` [PATCH 1/6] SUNRPC: spin svc_rqst initialization to its own function Jeff Layton
2008-01-05 12:02   ` [PATCH 2/6] SUNRPC: export svc_sock_update_bufs Jeff Layton
2008-01-05 12:02     ` [PATCH 3/6] NLM: Initialize completion variable in lockd_up Jeff Layton
2008-01-05 12:02       ` [PATCH 4/6] NLM: Have lockd call try_to_freeze Jeff Layton
2008-01-05 12:02         ` [PATCH 5/6] NLM: Convert lockd to use kthreads Jeff Layton
2008-01-05 12:02           ` [PATCH 6/6] NLM: Add reference counting to lockd Jeff Layton
2008-01-08  6:46             ` Neil Brown
     [not found]               ` <18307.7241.831689.998668-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2008-01-08 13:26                 ` Jeff Layton
2008-01-08 13:26                   ` Jeff Layton
     [not found]                   ` <20080108082603.089718fc-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2008-01-08 15:52                     ` Wendy Cheng
2008-01-08 15:52                       ` Wendy Cheng
2008-01-08 16:13                       ` Jeff Layton
2008-01-08 16:13                     ` Peter Staubach
2008-01-08 16:13                       ` Peter Staubach
2007-12-21 15:28 [PATCH 0/6] Intro: convert lockd to kthread and fix use-after-free (try #4) Jeff Layton
2007-12-21 15:28 ` [PATCH 1/6] SUNRPC: spin svc_rqst initialization to its own function Jeff Layton
2007-12-21 15:28   ` [PATCH 2/6] SUNRPC: export svc_sock_update_bufs Jeff Layton
2007-12-21 15:28     ` [PATCH 3/6] NLM: Initialize completion variable in lockd_up Jeff Layton
2007-12-21 15:28       ` [PATCH 4/6] NLM: Have lockd call try_to_freeze Jeff Layton
2007-12-21 15:28         ` [PATCH 5/6] NLM: Convert lockd to use kthreads Jeff Layton
2007-12-21 15:28           ` [PATCH 6/6] NLM: Add reference counting to lockd Jeff Layton
2007-12-21 16:43             ` Chuck Lever
2007-12-21 17:02               ` Jeff Layton
     [not found]                 ` <20071221120215.03beada0-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2007-12-21 17:51                   ` Chuck Lever
2007-12-21 18:25                     ` Jeff Layton
2007-12-21 19:54                     ` Jeff Layton
     [not found]                       ` <20071221145456.122174d0-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2007-12-21 20:25                         ` Chuck Lever
2007-12-21 20:46                           ` Jeff Layton
2007-12-13 20:40 [PATCH 0/6] Intro: convert lockd to kthread and fix use-after-free Jeff Layton
2007-12-13 20:40 ` [PATCH 1/6] SUNRPC: Allow svc_pool_map_set_cpumask to work with any task Jeff Layton
2007-12-13 20:40   ` [PATCH 2/6] SUNRPC: Break up __svc_create_thread and make svc_create_kthread Jeff Layton
2007-12-13 20:40     ` [PATCH 3/6] NLM: Initialize completion variable in lockd_up Jeff Layton
2007-12-13 20:40       ` [PATCH 4/6] NLM: Have lockd call try_to_freeze Jeff Layton
2007-12-13 20:40         ` [PATCH 5/6] NLM: Convert lockd to use kthreads Jeff Layton
2007-12-13 20:40           ` [PATCH 6/6] NLM: Add reference counting to lockd Jeff Layton

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=20080109174707.GC30523@infradead.org \
    --to=hch@infradead.org \
    --cc=akpm@linux-foundation.org \
    --cc=jlayton@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=neilb@suse.de \
    /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.