From: Jeff Layton <jlayton@kernel.org>
To: Chuck Lever <chuck.lever@oracle.com>, NeilBrown <neilb@suse.de>
Cc: linux-nfs@vger.kernel.org,
Olga Kornievskaia <okorniev@redhat.com>,
Dai Ngo <Dai.Ngo@oracle.com>, Tom Talpey <tom@talpey.com>
Subject: Re: [PATCH 2/2] sunrpc: remove all connection limit configuration
Date: Tue, 10 Dec 2024 07:29:21 -0500 [thread overview]
Message-ID: <c152bd8f69185a3c1efd7b22a748f890049ad02c.camel@kernel.org> (raw)
In-Reply-To: <6803341d-5071-46f2-971a-b1699572d833@oracle.com>
On Mon, 2024-12-09 at 12:27 -0500, Chuck Lever wrote:
> On 12/8/24 7:41 PM, NeilBrown wrote:
> > Now that the connection limit only apply to unconfirmed connections,
> > there is no need to configure it. So remove all the configuration and
> > fix the number of unconfirmed connections as always 64 - which is
> > now given a name: XPT_MAX_TMP_CONN
> >
> > Reviewed-by: Jeff Layton <jlayton@kernel.org>
> > Signed-off-by: NeilBrown <neilb@suse.de>
> > ---
> > fs/lockd/svc.c | 8 -------
> > fs/nfsd/netns.h | 6 -----
> > fs/nfsd/nfsctl.c | 42 ---------------------------------
> > fs/nfsd/nfssvc.c | 5 ----
> > include/linux/sunrpc/svc.h | 4 ----
> > include/linux/sunrpc/svc_xprt.h | 6 +++++
> > net/sunrpc/svc_xprt.c | 8 +------
> > 7 files changed, 7 insertions(+), 72 deletions(-)
> >
> > diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
> > index 4ec22c2f2ea3..7ded57ec3a60 100644
> > --- a/fs/lockd/svc.c
> > +++ b/fs/lockd/svc.c
> > @@ -70,9 +70,6 @@ static unsigned long nlm_grace_period;
> > unsigned long nlm_timeout = LOCKD_DFLT_TIMEO;
> > static int nlm_udpport, nlm_tcpport;
> >
> > -/* RLIM_NOFILE defaults to 1024. That seems like a reasonable default here. */
> > -static unsigned int nlm_max_connections = 1024;
> > -
> > /*
> > * Constants needed for the sysctl interface.
> > */
> > @@ -136,9 +133,6 @@ lockd(void *vrqstp)
> > * NFS mount or NFS daemon has gone away.
> > */
> > while (!svc_thread_should_stop(rqstp)) {
> > - /* update sv_maxconn if it has changed */
> > - rqstp->rq_server->sv_maxconn = nlm_max_connections;
> > -
> > nlmsvc_retry_blocked(rqstp);
> > svc_recv(rqstp);
> > }
> > @@ -340,7 +334,6 @@ static int lockd_get(void)
> > return -ENOMEM;
> > }
> >
> > - serv->sv_maxconn = nlm_max_connections;
> > error = svc_set_num_threads(serv, NULL, 1);
> > if (error < 0) {
> > svc_destroy(&serv);
> > @@ -542,7 +535,6 @@ module_param_call(nlm_udpport, param_set_port, param_get_int,
> > module_param_call(nlm_tcpport, param_set_port, param_get_int,
> > &nlm_tcpport, 0644);
> > module_param(nsm_use_hostnames, bool, 0644);
> > -module_param(nlm_max_connections, uint, 0644);
>
> We've discussed deprecation and removal of items from /proc/fs/nfsd
> before, but removing a module parameter seems like it needs to be
> handled with the usual deprecation schedule?
>
Yeah, that could break someone on an upgrade. What we should probably
do is keep the knob around, but just make it not do anything now, and
throw a pr_warn message or something if someone tries to set it.
Eventually in a year or two, we should be able to remove it.
> > static int lockd_init_net(struct net *net)
> > {
> > diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h
> > index a05a45bb1978..4a07b8d0837b 100644
> > --- a/fs/nfsd/netns.h
> > +++ b/fs/nfsd/netns.h
> > @@ -128,12 +128,6 @@ struct nfsd_net {
> > seqlock_t writeverf_lock;
> > unsigned char writeverf[8];
> >
> > - /*
> > - * Max number of non-validated connections this nfsd container
> > - * will allow. Defaults to '0' gets mapped to 64.
> > - */
> > - unsigned int max_connections;
> > -
> > u32 clientid_base;
> > u32 clientid_counter;
> > u32 clverifier_counter;
> > diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> > index 3adbc05ebaac..95ea4393305b 100644
> > --- a/fs/nfsd/nfsctl.c
> > +++ b/fs/nfsd/nfsctl.c
> > @@ -48,7 +48,6 @@ enum {
> > NFSD_Versions,
> > NFSD_Ports,
> > NFSD_MaxBlkSize,
> > - NFSD_MaxConnections,
> > NFSD_Filecache,
> > NFSD_Leasetime,
> > NFSD_Gracetime,
> > @@ -68,7 +67,6 @@ static ssize_t write_pool_threads(struct file *file, char *buf, size_t size);
> > static ssize_t write_versions(struct file *file, char *buf, size_t size);
> > static ssize_t write_ports(struct file *file, char *buf, size_t size);
> > static ssize_t write_maxblksize(struct file *file, char *buf, size_t size);
> > -static ssize_t write_maxconn(struct file *file, char *buf, size_t size);
> > #ifdef CONFIG_NFSD_V4
> > static ssize_t write_leasetime(struct file *file, char *buf, size_t size);
> > static ssize_t write_gracetime(struct file *file, char *buf, size_t size);
> > @@ -87,7 +85,6 @@ static ssize_t (*const write_op[])(struct file *, char *, size_t) = {
> > [NFSD_Versions] = write_versions,
> > [NFSD_Ports] = write_ports,
> > [NFSD_MaxBlkSize] = write_maxblksize,
> > - [NFSD_MaxConnections] = write_maxconn,
> > #ifdef CONFIG_NFSD_V4
> > [NFSD_Leasetime] = write_leasetime,
> > [NFSD_Gracetime] = write_gracetime,
> > @@ -902,44 +899,6 @@ static ssize_t write_maxblksize(struct file *file, char *buf, size_t size)
> > nfsd_max_blksize);
> > }
> >
> > -/*
> > - * write_maxconn - Set or report the current max number of connections
> > - *
> > - * Input:
> > - * buf: ignored
> > - * size: zero
> > - * OR
> > - *
> > - * Input:
> > - * buf: C string containing an unsigned
> > - * integer value representing the new
> > - * number of max connections
> > - * size: non-zero length of C string in @buf
> > - * Output:
> > - * On success: passed-in buffer filled with '\n'-terminated C string
> > - * containing numeric value of max_connections setting
> > - * for this net namespace;
> > - * return code is the size in bytes of the string
> > - * On error: return code is zero or a negative errno value
> > - */
> > -static ssize_t write_maxconn(struct file *file, char *buf, size_t size)
> > -{
> > - char *mesg = buf;
> > - struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
> > - unsigned int maxconn = nn->max_connections;
> > -
> > - if (size > 0) {
> > - int rv = get_uint(&mesg, &maxconn);
> > -
> > - if (rv)
> > - return rv;
> > - trace_nfsd_ctl_maxconn(netns(file), maxconn);
> > - nn->max_connections = maxconn;
> > - }
> > -
> > - return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%u\n", maxconn);
> > -}
> > -
> > #ifdef CONFIG_NFSD_V4
> > static ssize_t __nfsd4_write_time(struct file *file, char *buf, size_t size,
> > time64_t *time, struct nfsd_net *nn)
> > @@ -1372,7 +1331,6 @@ static int nfsd_fill_super(struct super_block *sb, struct fs_context *fc)
> > [NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR},
> > [NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO},
> > [NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO},
> > - [NFSD_MaxConnections] = {"max_connections", &transaction_ops, S_IWUSR|S_IRUGO},
> > [NFSD_Filecache] = {"filecache", &nfsd_file_cache_stats_fops, S_IRUGO},
> > #ifdef CONFIG_NFSD_V4
> > [NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR},
> > diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
> > index 49e2f32102ab..b77097de5936 100644
> > --- a/fs/nfsd/nfssvc.c
> > +++ b/fs/nfsd/nfssvc.c
> > @@ -668,7 +668,6 @@ int nfsd_create_serv(struct net *net)
> > if (serv == NULL)
> > return -ENOMEM;
> >
> > - serv->sv_maxconn = nn->max_connections;
> > error = svc_bind(serv, net);
> > if (error < 0) {
> > svc_destroy(&serv);
> > @@ -954,11 +953,7 @@ nfsd(void *vrqstp)
> > * The main request loop
> > */
> > while (!svc_thread_should_stop(rqstp)) {
> > - /* Update sv_maxconn if it has changed */
> > - rqstp->rq_server->sv_maxconn = nn->max_connections;
> > -
> > svc_recv(rqstp);
> > -
> > nfsd_file_net_dispose(nn);
> > }
> >
> > diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
> > index 617ebfff2f30..9d288a673705 100644
> > --- a/include/linux/sunrpc/svc.h
> > +++ b/include/linux/sunrpc/svc.h
> > @@ -72,10 +72,6 @@ struct svc_serv {
> > spinlock_t sv_lock;
> > unsigned int sv_nprogs; /* Number of sv_programs */
> > unsigned int sv_nrthreads; /* # of server threads */
> > - unsigned int sv_maxconn; /* max connections allowed or
> > - * '0' causing max to be based
> > - * on number of threads. */
> > -
> > unsigned int sv_max_payload; /* datagram payload size */
> > unsigned int sv_max_mesg; /* max_payload + 1 page for overheads */
> > unsigned int sv_xdrsize; /* XDR buffer size */
> > diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h
> > index 35929a7727c7..114051ad985a 100644
> > --- a/include/linux/sunrpc/svc_xprt.h
> > +++ b/include/linux/sunrpc/svc_xprt.h
> > @@ -105,6 +105,12 @@ enum {
> > */
> > };
> >
> > +/*
> > + * Maximum number of "tmp" connections - those without XPT_PEER_VALID -
> > + * permitted on any service.
> > + */
> > +#define XPT_MAX_TMP_CONN 64
> > +
> > static inline void svc_xprt_set_valid(struct svc_xprt *xpt)
> > {
> > if (test_bit(XPT_TEMP, &xpt->xpt_flags) &&
> > diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
> > index ff5b8bb8a88f..070bdeb50496 100644
> > --- a/net/sunrpc/svc_xprt.c
> > +++ b/net/sunrpc/svc_xprt.c
> > @@ -619,16 +619,10 @@ int svc_port_is_privileged(struct sockaddr *sin)
> > * The only somewhat efficient mechanism would be if drop old
> > * connections from the same IP first. But right now we don't even
> > * record the client IP in svc_sock.
> > - *
> > - * single-threaded services that expect a lot of clients will probably
> > - * need to set sv_maxconn to override the default value which is based
> > - * on the number of threads
> > */
> > static void svc_check_conn_limits(struct svc_serv *serv)
> > {
> > - unsigned int limit = serv->sv_maxconn ? serv->sv_maxconn : 64;
> > -
> > - if (serv->sv_tmpcnt > limit) {
> > + if (serv->sv_tmpcnt > XPT_MAX_TMP_CONN) {
> > struct svc_xprt *xprt = NULL, *xprti;
> > spin_lock_bh(&serv->sv_lock);
> > if (!list_empty(&serv->sv_tempsocks)) {
>
>
--
Jeff Layton <jlayton@kernel.org>
next prev parent reply other threads:[~2024-12-10 12:29 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-09 0:41 [PATCH 0/2] nfsd: don't use sv_nrthreads in connection limiting NeilBrown
2024-12-09 0:41 ` [PATCH 1/2] nfsd: don't use sv_nrthreads in connection limiting calculations NeilBrown
2024-12-09 17:25 ` Chuck Lever
2024-12-09 0:41 ` [PATCH 2/2] sunrpc: remove all connection limit configuration NeilBrown
2024-12-09 17:27 ` Chuck Lever
2024-12-10 12:29 ` Jeff Layton [this message]
2024-12-11 3:48 ` NeilBrown
2024-12-09 14:54 ` [PATCH 0/2] nfsd: don't use sv_nrthreads in connection limiting 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=c152bd8f69185a3c1efd7b22a748f890049ad02c.camel@kernel.org \
--to=jlayton@kernel.org \
--cc=Dai.Ngo@oracle.com \
--cc=chuck.lever@oracle.com \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
--cc=okorniev@redhat.com \
--cc=tom@talpey.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox