Re: [PATCH v5 6/6] nfsd: export NFSv4 callback op stats via netlink
From: Chuck Lever
Date: Thu Jun 18 2026 - 20:17:43 EST
On Thu, Jun 18, 2026, at 12:58 PM, Jeff Layton wrote:
> Add a proc4cb-ops nested attribute to the server-stats netlink dump,
> reusing the existing server-proc-entry (op/count) layout. The first dump
> message emits one entry per callback opcode (OP_CB_GETATTR..OP_CB_OFFLOAD)
> from the per-netns callback counters; the set is small and fits alongside
> the scalar stats, so no extra paging is needed.
>
> This lets nfsstat report NFSv4 backchannel operation counts over netlink,
> including CB_GETATTR which corresponds to the procfs wdeleg_getattr line.
>
> Assisted-by: Claude:claude-opus-4-8
> Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
> ---
> Documentation/netlink/specs/nfsd.yaml | 6 ++++++
> fs/nfsd/nfsctl.c | 23 +++++++++++++++++++++++
> include/uapi/linux/nfsd_netlink.h | 1 +
> 3 files changed, 30 insertions(+)
> diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> index 9bedbe7096c3..674fab6a86a5 100644
> --- a/fs/nfsd/nfsctl.c
> +++ b/fs/nfsd/nfsctl.c
> @@ -2476,6 +2476,29 @@ int nfsd_nl_server_stats_get_dumpit(struct sk_buff *skb,
> }
> }
>
> +#ifdef CONFIG_NFSD_V4
> + /* NFSv4 callback (backchannel) per-operation counts */
> + for (int op = OP_CB_GETATTR; op <= OP_CB_OFFLOAD; op++) {
> + struct nlattr *nest;
> + u64 cnt;
> +
> + cnt = percpu_counter_sum_positive(
> + &nn->cb_counter[op]);
The loop emits an entry for every opcode in OP_CB_GETATTR..OP_CB_OFFLOAD,
but only opcodes with a nfsd4_callback_ops instance get incremented (via
nfsd4_run_cb() keyed on cb->cb_ops->opcode). Opcodes nfsd never sends
correctly report 0. The exception is op 11 / CB_SEQUENCE: it's written by
encode_cb_sequence4args() on every minorversion>0 callback, so it goes
out on the wire but is never counted. The dump always shows op 11 with
count 0, which could be misread as "none sent" rather than "not tracked."
Check what the forechannel counter does for SEQUENCE operations.
--
Chuck Lever