From: Simon Horman <horms@kernel.org>
To: Lorenzo Bianconi <lorenzo@kernel.org>
Cc: linux-nfs@vger.kernel.org, lorenzo.bianconi@redhat.com,
chuck.lever@oracle.com, jlayton@kernel.org, neilb@suse.de,
netdev@vger.kernel.org
Subject: Re: [PATCH v8 3/3] NFSD: add rpc_status netlink support
Date: Tue, 12 Sep 2023 17:13:40 +0200 [thread overview]
Message-ID: <20230912151340.GH401982@kernel.org> (raw)
In-Reply-To: <ac18892ea3f718c63f0a12e39aeaac812c081515.1694436263.git.lorenzo@kernel.org>
On Mon, Sep 11, 2023 at 02:49:46PM +0200, Lorenzo Bianconi wrote:
> Introduce rpc_status netlink support for NFSD in order to dump pending
> RPC requests debugging information from userspace.
>
> Tested-by: Jeff Layton <jlayton@kernel.org>
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
o
Hi Lorenzo,
some minor feedback from my side.
...
> int nfsd_server_nl_rpc_status_get_dumpit(struct sk_buff *skb,
> struct netlink_callback *cb)
> {
> + struct nfsd_net *nn = net_generic(sock_net(skb->sk), nfsd_net_id);
> + int i, ret, rqstp_index;
> +
> + rcu_read_lock();
> +
> + for (i = 0; i < nn->nfsd_serv->sv_nrpools; i++) {
> + struct svc_rqst *rqstp;
> +
> + if (i < cb->args[0]) /* already consumed */
> + continue;
> +
> + rqstp_index = 0;
> + list_for_each_entry_rcu(rqstp,
> + &nn->nfsd_serv->sv_pools[i].sp_all_threads,
> + rq_all) {
> + struct nfsd_genl_rqstp genl_rqstp;
> + unsigned int status_counter;
> +
> + if (rqstp_index++ < cb->args[1]) /* already consumed */
> + continue;
> + /*
> + * Acquire rq_status_counter before parsing the rqst
> + * fields. rq_status_counter is set to an odd value in
> + * order to notify the consumers the rqstp fields are
> + * meaningful.
> + */
> + status_counter =
> + smp_load_acquire(&rqstp->rq_status_counter);
> + if (!(status_counter & 1))
> + continue;
> +
> + genl_rqstp.rq_xid = rqstp->rq_xid;
> + genl_rqstp.rq_flags = rqstp->rq_flags;
> + genl_rqstp.rq_vers = rqstp->rq_vers;
> + genl_rqstp.rq_prog = rqstp->rq_prog;
> + genl_rqstp.rq_proc = rqstp->rq_proc;
> + genl_rqstp.rq_stime = rqstp->rq_stime;
> + genl_rqstp.opcnt = 0;
> + memcpy(&genl_rqstp.daddr, svc_daddr(rqstp),
> + sizeof(struct sockaddr));
> + memcpy(&genl_rqstp.saddr, svc_addr(rqstp),
> + sizeof(struct sockaddr));
> +
> +#ifdef CONFIG_NFSD_V4
> + if (rqstp->rq_vers == NFS4_VERSION &&
> + rqstp->rq_proc == NFSPROC4_COMPOUND) {
> + /* NFSv4 compund */
nit: compound
> + struct nfsd4_compoundargs *args;
> + int j;
> +
> + args = rqstp->rq_argp;
> + genl_rqstp.opcnt = args->opcnt;
> + for (j = 0; j < genl_rqstp.opcnt; j++)
> + genl_rqstp.opnum[j] =
> + args->ops[j].opnum;
> + }
> +#endif /* CONFIG_NFSD_V4 */
> +
> + /*
> + * Acquire rq_status_counter before reporting the rqst
> + * fields to the user.
> + */
> + if (smp_load_acquire(&rqstp->rq_status_counter) !=
> + status_counter)
> + continue;
> +
> + ret = nfsd_genl_rpc_status_compose_msg(skb, cb,
> + &genl_rqstp);
> + if (ret)
> + goto out;
> + }
> + }
> +
> + cb->args[0] = i;
> + cb->args[1] = rqstp_index;
I'm unsure if this is possible, but if the for loop above iterates zero
times, or for all iterations (i < cb->args[0]), then rqstp_index will
be used uninitialised here.
Flagged by Smatch.
> + ret = skb->len;
> +out:
> + rcu_read_unlock();
> +
> + return ret;
> +}
...
> diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h
> index 11c14faa6c67..d787bd38c053 100644
> --- a/fs/nfsd/nfsd.h
> +++ b/fs/nfsd/nfsd.h
> @@ -62,6 +62,22 @@ struct readdir_cd {
> __be32 err; /* 0, nfserr, or nfserr_eof */
> };
>
> +/* Maximum number of operations per session compound */
> +#define NFSD_MAX_OPS_PER_COMPOUND 50
> +
> +struct nfsd_genl_rqstp {
> + struct sockaddr daddr;
> + struct sockaddr saddr;
> + unsigned long rq_flags;
> + ktime_t rq_stime;
> + __be32 rq_xid;
> + u32 rq_vers;
> + u32 rq_prog;
> + u32 rq_proc;
> + /* NFSv4 compund */
nit: compound
> + u32 opnum[NFSD_MAX_OPS_PER_COMPOUND];
> + u16 opcnt;
> +};
>
> extern struct svc_program nfsd_program;
> extern const struct svc_version nfsd_version2, nfsd_version3, nfsd_version4;
...
next prev parent reply other threads:[~2023-09-12 15:13 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-11 12:49 [PATCH v8 0/3] add rpc_status netlink support for NFSD Lorenzo Bianconi
2023-09-11 12:49 ` [PATCH v8 1/3] Documentation: netlink: add a YAML spec for nfsd_server Lorenzo Bianconi
2023-09-11 17:20 ` Jeff Layton
2023-09-11 18:10 ` Chuck Lever
2023-09-14 10:46 ` Lorenzo Bianconi
2023-10-03 17:55 ` Jakub Kicinski
2023-10-03 18:40 ` Chuck Lever III
2023-10-03 19:02 ` Jakub Kicinski
2023-10-03 23:00 ` Chuck Lever III
2023-10-04 0:24 ` Jakub Kicinski
2023-09-11 12:49 ` [PATCH v8 2/3] NFSD: introduce netlink rpc_status stubs Lorenzo Bianconi
2023-09-11 19:35 ` Jeff Layton
2023-09-11 19:55 ` Chuck Lever
2023-09-14 11:20 ` Lorenzo Bianconi
2023-09-12 15:07 ` Simon Horman
2023-09-14 11:25 ` Lorenzo Bianconi
2023-09-11 12:49 ` [PATCH v8 3/3] NFSD: add rpc_status netlink support Lorenzo Bianconi
2023-09-11 19:43 ` Jeff Layton
2023-09-12 15:13 ` Simon Horman [this message]
2023-09-14 11:41 ` Lorenzo Bianconi
2023-10-03 18:03 ` Jakub Kicinski
2023-10-04 10:14 ` Lorenzo Bianconi
2023-10-04 13:27 ` Chuck Lever III
2023-10-04 14:04 ` Lorenzo Bianconi
2023-12-11 18:56 ` Jeff Layton
2023-12-12 12:07 ` Jeff Layton
2023-09-15 19:24 ` [PATCH v8 0/3] add rpc_status netlink support for NFSD Chuck Lever
2023-09-15 21:30 ` Lorenzo Bianconi
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=20230912151340.GH401982@kernel.org \
--to=horms@kernel.org \
--cc=chuck.lever@oracle.com \
--cc=jlayton@kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=lorenzo.bianconi@redhat.com \
--cc=lorenzo@kernel.org \
--cc=neilb@suse.de \
--cc=netdev@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.