From: "J. Bruce Fields" <bfields@fieldses.org>
To: Jeff Layton <jlayton@redhat.com>
Cc: Neil Brown <neilb@suse.de>,
linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH - take 2] knfsd: nfsd: Handle ERESTARTSYS from syscalls. (and possible kthread_stop changes)
Date: Mon, 30 Jun 2008 15:29:51 -0400 [thread overview]
Message-ID: <20080630192951.GC6502@fieldses.org> (raw)
In-Reply-To: <20080630140946.34154d4c-xSBYVWDuneFaJnirhKH9O4GKTjYczspe@public.gmane.org>
On Mon, Jun 30, 2008 at 02:09:46PM -0400, Jeff Layton wrote:
> On Mon, 30 Jun 2008 13:10:19 -0400
> "J. Bruce Fields" <bfields@fieldses.org> wrote:
>
> > On Mon, Jun 30, 2008 at 08:35:36AM -0400, Jeff Layton wrote:
> > > The idea looks reasonable, but the patch above doesn't apply to Bruce's
> > > for-2.6.27 tree. The nfsd() function has changed a bit. Actually, I
> > > think we can make this even simpler. kthreads start with all signals
> > > ignored and the new patch enables all of the ones in SHUTDOWN_SIGS. So
> > > I don't think we need any signal masking at all.
> > >
> > > How about this patch? It should apply on top of the patchset already
> > > in Bruce's tree.
> >
> > Looks reasonable to me; applied for 2.6.27 barring any test failures or
> > objections.
> >
> > --b.
> >
>
> Actually, here's an even simpler version. How about we just get rid of
> the loop and just have a series of allow_signal() calls. We can get
> rid of a local variable that way and since we're only referencing
> SHUTDOWN_SIGS once, I don't see any reason to keep it around.
Yep, it's one less definition to track down when you read the code....
Thanks!
--b.
>
> -------[snip]-----------
>
> knfsd: treat all shutdown signals as equivalent
>
> knfsd currently uses 2 signal masks when processing requests. A "loose"
> mask (SHUTDOWN_SIGS) that it uses when receiving network requests, and
> then a more "strict" mask (ALLOWED_SIGS, which is just SIGKILL) that it
> allows when doing the actual operation on the local storage.
>
> This is apparently unnecessarily complicated. The underlying filesystem
> should be able to sanely handle a signal in the middle of an operation.
> This patch removes the signal mask handling from knfsd altogether. When
> knfsd is started as a kthread, all signals are ignored. It then allows
> all of the signals in SHUTDOWN_SIGS. There's no need to set the mask
> as well.
>
> Signed-off-by: Jeff Layton <jlayton@redhat.com>
> ---
> fs/nfsd/nfssvc.c | 30 +++++-------------------------
> 1 files changed, 5 insertions(+), 25 deletions(-)
>
> diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
> index 96fdbca..80292ff 100644
> --- a/fs/nfsd/nfssvc.c
> +++ b/fs/nfsd/nfssvc.c
> @@ -37,15 +37,6 @@
>
> #define NFSDDBG_FACILITY NFSDDBG_SVC
>
> -/* these signals will be delivered to an nfsd thread
> - * when handling a request
> - */
> -#define ALLOWED_SIGS (sigmask(SIGKILL))
> -/* these signals will be delivered to an nfsd thread
> - * when not handling a request. i.e. when waiting
> - */
> -#define SHUTDOWN_SIGS (sigmask(SIGKILL) | sigmask(SIGHUP) | sigmask(SIGINT) | sigmask(SIGQUIT))
> -
> extern struct svc_program nfsd_program;
> static int nfsd(void *vrqstp);
> struct timeval nfssvc_boot;
> @@ -414,9 +405,7 @@ nfsd(void *vrqstp)
> {
> struct svc_rqst *rqstp = (struct svc_rqst *) vrqstp;
> struct fs_struct *fsp;
> - sigset_t shutdown_mask, allowed_mask;
> int err, preverr = 0;
> - unsigned int signo;
>
> /* Lock module and set up kernel thread */
> mutex_lock(&nfsd_mutex);
> @@ -433,17 +422,14 @@ nfsd(void *vrqstp)
> current->fs = fsp;
> current->fs->umask = 0;
>
> - siginitsetinv(&shutdown_mask, SHUTDOWN_SIGS);
> - siginitsetinv(&allowed_mask, ALLOWED_SIGS);
> -
> /*
> * thread is spawned with all signals set to SIG_IGN, re-enable
> - * the ones that matter
> + * the ones that will bring down the thread
> */
> - for (signo = 1; signo <= _NSIG; signo++) {
> - if (!sigismember(&shutdown_mask, signo))
> - allow_signal(signo);
> - }
> + allow_signal(SIGKILL);
> + allow_signal(SIGHUP);
> + allow_signal(SIGINT);
> + allow_signal(SIGQUIT);
>
> nfsdstats.th_cnt++;
> mutex_unlock(&nfsd_mutex);
> @@ -460,9 +446,6 @@ nfsd(void *vrqstp)
> * The main request loop
> */
> for (;;) {
> - /* Block all but the shutdown signals */
> - sigprocmask(SIG_SETMASK, &shutdown_mask, NULL);
> -
> /*
> * Find a socket with data available and call its
> * recvfrom routine.
> @@ -487,9 +470,6 @@ nfsd(void *vrqstp)
> /* Lock the export hash tables for reading. */
> exp_readlock();
>
> - /* Process request with signals blocked. */
> - sigprocmask(SIG_SETMASK, &allowed_mask, NULL);
> -
> svc_process(rqstp);
>
> /* Unlock export hash tables */
> --
> 1.5.5.1
>
WARNING: multiple messages have this Message-ID (diff)
From: "J. Bruce Fields" <bfields@fieldses.org>
To: Jeff Layton <jlayton@redhat.com>
Cc: Neil Brown <neilb@suse.de>,
linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH - take 2] knfsd: nfsd: Handle ERESTARTSYS from syscalls. (and possible kthread_stop changes)
Date: Mon, 30 Jun 2008 15:29:51 -0400 [thread overview]
Message-ID: <20080630192951.GC6502@fieldses.org> (raw)
In-Reply-To: <20080630140946.34154d4c@barsoom.rdu.redhat.com>
On Mon, Jun 30, 2008 at 02:09:46PM -0400, Jeff Layton wrote:
> On Mon, 30 Jun 2008 13:10:19 -0400
> "J. Bruce Fields" <bfields@fieldses.org> wrote:
>
> > On Mon, Jun 30, 2008 at 08:35:36AM -0400, Jeff Layton wrote:
> > > The idea looks reasonable, but the patch above doesn't apply to Bruce's
> > > for-2.6.27 tree. The nfsd() function has changed a bit. Actually, I
> > > think we can make this even simpler. kthreads start with all signals
> > > ignored and the new patch enables all of the ones in SHUTDOWN_SIGS. So
> > > I don't think we need any signal masking at all.
> > >
> > > How about this patch? It should apply on top of the patchset already
> > > in Bruce's tree.
> >
> > Looks reasonable to me; applied for 2.6.27 barring any test failures or
> > objections.
> >
> > --b.
> >
>
> Actually, here's an even simpler version. How about we just get rid of
> the loop and just have a series of allow_signal() calls. We can get
> rid of a local variable that way and since we're only referencing
> SHUTDOWN_SIGS once, I don't see any reason to keep it around.
Yep, it's one less definition to track down when you read the code....
Thanks!
--b.
>
> -------[snip]-----------
>
> knfsd: treat all shutdown signals as equivalent
>
> knfsd currently uses 2 signal masks when processing requests. A "loose"
> mask (SHUTDOWN_SIGS) that it uses when receiving network requests, and
> then a more "strict" mask (ALLOWED_SIGS, which is just SIGKILL) that it
> allows when doing the actual operation on the local storage.
>
> This is apparently unnecessarily complicated. The underlying filesystem
> should be able to sanely handle a signal in the middle of an operation.
> This patch removes the signal mask handling from knfsd altogether. When
> knfsd is started as a kthread, all signals are ignored. It then allows
> all of the signals in SHUTDOWN_SIGS. There's no need to set the mask
> as well.
>
> Signed-off-by: Jeff Layton <jlayton@redhat.com>
> ---
> fs/nfsd/nfssvc.c | 30 +++++-------------------------
> 1 files changed, 5 insertions(+), 25 deletions(-)
>
> diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
> index 96fdbca..80292ff 100644
> --- a/fs/nfsd/nfssvc.c
> +++ b/fs/nfsd/nfssvc.c
> @@ -37,15 +37,6 @@
>
> #define NFSDDBG_FACILITY NFSDDBG_SVC
>
> -/* these signals will be delivered to an nfsd thread
> - * when handling a request
> - */
> -#define ALLOWED_SIGS (sigmask(SIGKILL))
> -/* these signals will be delivered to an nfsd thread
> - * when not handling a request. i.e. when waiting
> - */
> -#define SHUTDOWN_SIGS (sigmask(SIGKILL) | sigmask(SIGHUP) | sigmask(SIGINT) | sigmask(SIGQUIT))
> -
> extern struct svc_program nfsd_program;
> static int nfsd(void *vrqstp);
> struct timeval nfssvc_boot;
> @@ -414,9 +405,7 @@ nfsd(void *vrqstp)
> {
> struct svc_rqst *rqstp = (struct svc_rqst *) vrqstp;
> struct fs_struct *fsp;
> - sigset_t shutdown_mask, allowed_mask;
> int err, preverr = 0;
> - unsigned int signo;
>
> /* Lock module and set up kernel thread */
> mutex_lock(&nfsd_mutex);
> @@ -433,17 +422,14 @@ nfsd(void *vrqstp)
> current->fs = fsp;
> current->fs->umask = 0;
>
> - siginitsetinv(&shutdown_mask, SHUTDOWN_SIGS);
> - siginitsetinv(&allowed_mask, ALLOWED_SIGS);
> -
> /*
> * thread is spawned with all signals set to SIG_IGN, re-enable
> - * the ones that matter
> + * the ones that will bring down the thread
> */
> - for (signo = 1; signo <= _NSIG; signo++) {
> - if (!sigismember(&shutdown_mask, signo))
> - allow_signal(signo);
> - }
> + allow_signal(SIGKILL);
> + allow_signal(SIGHUP);
> + allow_signal(SIGINT);
> + allow_signal(SIGQUIT);
>
> nfsdstats.th_cnt++;
> mutex_unlock(&nfsd_mutex);
> @@ -460,9 +446,6 @@ nfsd(void *vrqstp)
> * The main request loop
> */
> for (;;) {
> - /* Block all but the shutdown signals */
> - sigprocmask(SIG_SETMASK, &shutdown_mask, NULL);
> -
> /*
> * Find a socket with data available and call its
> * recvfrom routine.
> @@ -487,9 +470,6 @@ nfsd(void *vrqstp)
> /* Lock the export hash tables for reading. */
> exp_readlock();
>
> - /* Process request with signals blocked. */
> - sigprocmask(SIG_SETMASK, &allowed_mask, NULL);
> -
> svc_process(rqstp);
>
> /* Unlock export hash tables */
> --
> 1.5.5.1
>
next prev parent reply other threads:[~2008-06-30 19:29 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20080619101025.24263.patches@notabene>
2008-06-19 0:11 ` [PATCH - take 2] knfsd: nfsd: Handle ERESTARTSYS from syscalls NeilBrown
2008-06-19 1:09 ` Jeff Layton
2008-06-19 2:29 ` Neil Brown
2008-06-19 10:38 ` Jeff Layton
[not found] ` <20080619063824.00ca6381-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2008-06-20 17:50 ` J. Bruce Fields
2008-06-20 17:50 ` J. Bruce Fields
2008-06-23 0:20 ` Neil Brown
[not found] ` <18526.60523.584503.68076-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2008-06-23 0:52 ` Jeff Layton
2008-06-23 0:52 ` Jeff Layton
2008-06-23 23:55 ` [PATCH - take 2] knfsd: nfsd: Handle ERESTARTSYS from syscalls. (and possible kthread_stop changes) Neil Brown
[not found] ` <18528.14347.525397.917553-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2008-06-30 12:35 ` Jeff Layton
2008-06-30 12:35 ` Jeff Layton
[not found] ` <20080630083536.680b093a-xSBYVWDuneFaJnirhKH9O4GKTjYczspe@public.gmane.org>
2008-06-30 17:10 ` J. Bruce Fields
2008-06-30 17:10 ` J. Bruce Fields
2008-06-30 18:09 ` Jeff Layton
[not found] ` <20080630140946.34154d4c-xSBYVWDuneFaJnirhKH9O4GKTjYczspe@public.gmane.org>
2008-06-30 19:29 ` J. Bruce Fields [this message]
2008-06-30 19:29 ` J. Bruce Fields
2008-06-20 17:34 ` [PATCH - take 2] knfsd: nfsd: Handle ERESTARTSYS from syscalls 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=20080630192951.GC6502@fieldses.org \
--to=bfields@fieldses.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.