Files
Jeff Layton f1775ed34e sunrpc: add per-netns per-procedure call counts to svc_stat
The existing per-procedure call counts live in global
svc_version->vs_count[] arrays which are not network-namespace-aware.
Add per-netns equivalents in struct svc_stat so the upcoming netlink
stats interface can return namespace-scoped statistics.

Add a vs_count pointer array to struct svc_stat, along with
svc_stat_alloc_counts() and svc_stat_free_counts() helpers to manage
per-version percpu call count arrays.

Increment the per-net counter alongside the global one in
svc_generic_init_request(). Call the alloc/free helpers from
nfsd_net_init() and nfsd_net_exit().

Assisted-by: LLM
Signed-off-by: Jeff Layton <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Chuck Lever <[email protected]>
2026-08-10 09:54:35 -04:00

83 lines
2.1 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* linux/include/linux/sunrpc/stats.h
*
* Client statistics collection for SUN RPC
*
* Copyright (C) 1996 Olaf Kirch <[email protected]>
*/
#ifndef _LINUX_SUNRPC_STATS_H
#define _LINUX_SUNRPC_STATS_H
#include <linux/proc_fs.h>
struct rpc_stat {
const struct rpc_program *program;
unsigned int netcnt,
netudpcnt,
nettcpcnt,
nettcpconn,
netreconn;
unsigned int rpccnt,
rpcretrans,
rpcauthrefresh,
rpcgarbage;
};
struct svc_stat {
struct svc_program * program;
unsigned int netcnt,
netudpcnt,
nettcpcnt,
nettcpconn;
unsigned int rpccnt,
rpcbadfmt,
rpcbadauth,
rpcbadclnt;
/* Per-version per-procedure call counts (per-cpu, per-netns) */
unsigned long __percpu **vs_count;
};
struct net;
int svc_stat_alloc_counts(struct svc_stat *statp);
void svc_stat_free_counts(struct svc_stat *statp);
#ifdef CONFIG_PROC_FS
int rpc_proc_init(struct net *);
void rpc_proc_exit(struct net *);
struct proc_dir_entry * rpc_proc_register(struct net *,struct rpc_stat *);
void rpc_proc_unregister(struct net *,const char *);
void rpc_proc_zero(const struct rpc_program *);
struct proc_dir_entry * svc_proc_register(struct net *, struct svc_stat *,
const struct proc_ops *);
void svc_proc_unregister(struct net *, const char *);
void svc_seq_show(struct seq_file *,
const struct svc_stat *);
#else
static inline int rpc_proc_init(struct net *net)
{
return 0;
}
static inline void rpc_proc_exit(struct net *net)
{
}
static inline struct proc_dir_entry *rpc_proc_register(struct net *net, struct rpc_stat *s) { return NULL; }
static inline void rpc_proc_unregister(struct net *net, const char *p) {}
static inline void rpc_proc_zero(const struct rpc_program *p) {}
static inline struct proc_dir_entry *svc_proc_register(struct net *net, struct svc_stat *s,
const struct proc_ops *proc_ops) { return NULL; }
static inline void svc_proc_unregister(struct net *net, const char *p) {}
static inline void svc_seq_show(struct seq_file *seq,
const struct svc_stat *st) {}
#endif
#endif /* _LINUX_SUNRPC_STATS_H */