Re: [PATCH v2 2/5] nfsd: make nfsd_svc call nfsd_set_nrthreads

From: Jeff Layton
Date: Thu Jun 13 2024 - 12:58:29 EST


On Thu, 2024-06-13 at 11:57 -0400, Chuck Lever wrote:
> On Thu, Jun 13, 2024 at 08:16:39AM -0400, Jeff Layton wrote:
> > Now that the refcounting is fixed, rework nfsd_svc to use the same
> > thread setup as the pool_threads interface. Since the new netlink
> > interface doesn't have the same restriction as pool_threads, move
> > the
> > guard against shutting down all threads to write_pool_threads.
> >
> > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
> > ---
> >  fs/nfsd/nfsctl.c | 14 ++++++++++++--
> >  fs/nfsd/nfsd.h   |  3 ++-
> >  fs/nfsd/nfssvc.c | 18 ++----------------
> >  3 files changed, 16 insertions(+), 19 deletions(-)
> >
> > diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> > index 202140df8f82..121b866125d4 100644
> > --- a/fs/nfsd/nfsctl.c
> > +++ b/fs/nfsd/nfsctl.c
> > @@ -406,7 +406,7 @@ static ssize_t write_threads(struct file *file,
> > char *buf, size_t size)
> >   return -EINVAL;
> >   trace_nfsd_ctl_threads(net, newthreads);
> >   mutex_lock(&nfsd_mutex);
> > - rv = nfsd_svc(newthreads, net, file->f_cred,
> > NULL);
> > + rv = nfsd_svc(1, &newthreads, net, file->f_cred,
> > NULL);
> >   mutex_unlock(&nfsd_mutex);
> >   if (rv < 0)
> >   return rv;
> > @@ -481,6 +481,16 @@ static ssize_t write_pool_threads(struct file
> > *file, char *buf, size_t size)
> >   goto out_free;
> >   trace_nfsd_ctl_pool_threads(net, i,
> > nthreads[i]);
> >   }
> > +
> > + /*
> > + * There must always be a thread in pool 0; the
> > admin
> > + * can't shut down NFS completely using
> > pool_threads.
> > + *
> > + * FIXME: do we really need this?
>
> Hi, how do you plan to decide this question?
>

Probably by ignoring it and letting the restriction (eventually) die
with the old pool_threads interface. I'm amenable to dropping this
restriction altogether though.

>
> > + */
> > + if (nthreads[0] == 0)
> > + nthreads[0] = 1;
> > +
> >   rv = nfsd_set_nrthreads(i, nthreads, net);
> >   if (rv)
> >   goto out_free;
> > @@ -1722,7 +1732,7 @@ int nfsd_nl_threads_set_doit(struct sk_buff
> > *skb, struct genl_info *info)
> >   scope = nla_data(attr);
> >   }
> >  
> > - ret = nfsd_svc(nthreads, net, get_current_cred(), scope);
> > + ret = nfsd_svc(1, &nthreads, net, get_current_cred(),
> > scope);
> >  
> >  out_unlock:
> >   mutex_unlock(&nfsd_mutex);
> > diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h
> > index 8f4f239d9f8a..cec8697b1cd6 100644
> > --- a/fs/nfsd/nfsd.h
> > +++ b/fs/nfsd/nfsd.h
> > @@ -103,7 +103,8 @@
> > bool nfssvc_encode_voidres(struct svc_rqst *rqstp,
> >  /*
> >   * Function prototypes.
> >   */
> > -int nfsd_svc(int nrservs, struct net *net, const
> > struct cred *cred, const char *scope);
> > +int nfsd_svc(int n, int *nservers, struct net *net,
> > + const struct cred *cred, const char
> > *scope);
> >  int nfsd_dispatch(struct svc_rqst *rqstp);
> >  
> >  int nfsd_nrthreads(struct net *);
> > diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
> > index cd9a6a1a9fc8..076f35dc17e4 100644
> > --- a/fs/nfsd/nfssvc.c
> > +++ b/fs/nfsd/nfssvc.c
> > @@ -744,13 +744,6 @@ int nfsd_set_nrthreads(int n, int *nthreads,
> > struct net *net)
>
> Since you are slightly changing the API contract for this publicly
> visible function, now would be a good time to add a kdoc comment.
>

Ok.

>
> >   }
> >   }
> >  
> > - /*
> > - * There must always be a thread in pool 0; the admin
> > - * can't shut down NFS completely using pool_threads.
> > - */
> > - if (nthreads[0] == 0)
> > - nthreads[0] = 1;
> > -
> >   /* apply the new numbers */
> >   for (i = 0; i < n; i++) {
> >   err = svc_set_num_threads(nn->nfsd_serv,
> > @@ -768,7 +761,7 @@ int nfsd_set_nrthreads(int n, int *nthreads,
> > struct net *net)
> >   * this is the first time nrservs is nonzero.
> >   */
> >  int
> > -nfsd_svc(int nrservs, struct net *net, const struct cred *cred,
> > const char *scope)
> > +nfsd_svc(int n, int *nthreads, struct net *net, const struct cred
> > *cred, const char *scope)
>
> Ditto: the patch changes the synopsis of nfsd_svc(), so I'd like a
> kdoc comment to go with it.
>
> And, this particular change is the reason for this patch, so the
> description should state that (especially since subsequent
> patch descriptions refer to "now that nfsd_svc takes an array
> of threads..." : I had to come back to this patch and blink twice
> to see why it said that).
>
> A kdoc comment from sunrpc_get_pool_mode() should also be added
> in 4/5.
>

I'll do that and resend soon.

>
> >  {
> >   int error;
> >   struct nfsd_net *nn = net_generic(net, nfsd_net_id);
> > @@ -778,13 +771,6 @@ nfsd_svc(int nrservs, struct net *net, const
> > struct cred *cred, const char *scop
> >  
> >   dprintk("nfsd: creating service\n");
> >  
> > - nrservs = max(nrservs, 0);
> > - nrservs = min(nrservs, NFSD_MAXSERVS);
> > - error = 0;
> > -
> > - if (nrservs == 0 && nn->nfsd_serv == NULL)
> > - goto out;
> > -
> >   strscpy(nn->nfsd_name, scope ? scope : utsname()-
> > >nodename,
> >   sizeof(nn->nfsd_name));
> >  
> > @@ -796,7 +782,7 @@ nfsd_svc(int nrservs, struct net *net, const
> > struct cred *cred, const char *scop
> >   error = nfsd_startup_net(net, cred);
> >   if (error)
> >   goto out_put;
> > - error = svc_set_num_threads(serv, NULL, nrservs);
> > + error = nfsd_set_nrthreads(n, nthreads, net);
> >   if (error)
> >   goto out_put;
> >   error = serv->sv_nrthreads;
> >
> > --
> > 2.45.2
> >
>

--
Jeff Layton <jlayton@xxxxxxxxxx>