Skip to content

Commit 88efd79

Browse files
Anna SchumakerTrond Myklebust
authored andcommitted
sunrpc: Add a sysfs files for rpc_clnt information
These files display useful information about the RPC client, such as the rpc version number, program name, and maximum number of connections allowed. Reviewed-by: Benjamin Coddington <bcodding@redhat.com> Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com> Link: https://lore.kernel.org/r/20250207204225.594002-4-anna@kernel.org Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent 41cb320 commit 88efd79

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

net/sunrpc/sysfs.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ static struct kobject *rpc_sysfs_object_alloc(const char *name,
5959
return NULL;
6060
}
6161

62+
static inline struct rpc_clnt *
63+
rpc_sysfs_client_kobj_get_clnt(struct kobject *kobj)
64+
{
65+
struct rpc_sysfs_client *c = container_of(kobj,
66+
struct rpc_sysfs_client, kobject);
67+
struct rpc_clnt *ret = c->clnt;
68+
69+
return refcount_inc_not_zero(&ret->cl_count) ? ret : NULL;
70+
}
71+
6272
static inline struct rpc_xprt *
6373
rpc_sysfs_xprt_kobj_get_xprt(struct kobject *kobj)
6474
{
@@ -86,6 +96,51 @@ rpc_sysfs_xprt_switch_kobj_get_xprt(struct kobject *kobj)
8696
return xprt_switch_get(x->xprt_switch);
8797
}
8898

99+
static ssize_t rpc_sysfs_clnt_version_show(struct kobject *kobj,
100+
struct kobj_attribute *attr,
101+
char *buf)
102+
{
103+
struct rpc_clnt *clnt = rpc_sysfs_client_kobj_get_clnt(kobj);
104+
ssize_t ret;
105+
106+
if (!clnt)
107+
return sprintf(buf, "<closed>\n");
108+
109+
ret = sprintf(buf, "%u", clnt->cl_vers);
110+
refcount_dec(&clnt->cl_count);
111+
return ret;
112+
}
113+
114+
static ssize_t rpc_sysfs_clnt_program_show(struct kobject *kobj,
115+
struct kobj_attribute *attr,
116+
char *buf)
117+
{
118+
struct rpc_clnt *clnt = rpc_sysfs_client_kobj_get_clnt(kobj);
119+
ssize_t ret;
120+
121+
if (!clnt)
122+
return sprintf(buf, "<closed>\n");
123+
124+
ret = sprintf(buf, "%s", clnt->cl_program->name);
125+
refcount_dec(&clnt->cl_count);
126+
return ret;
127+
}
128+
129+
static ssize_t rpc_sysfs_clnt_max_connect_show(struct kobject *kobj,
130+
struct kobj_attribute *attr,
131+
char *buf)
132+
{
133+
struct rpc_clnt *clnt = rpc_sysfs_client_kobj_get_clnt(kobj);
134+
ssize_t ret;
135+
136+
if (!clnt)
137+
return sprintf(buf, "<closed>\n");
138+
139+
ret = sprintf(buf, "%u\n", clnt->cl_max_connect);
140+
refcount_dec(&clnt->cl_count);
141+
return ret;
142+
}
143+
89144
static ssize_t rpc_sysfs_xprt_dstaddr_show(struct kobject *kobj,
90145
struct kobj_attribute *attr,
91146
char *buf)
@@ -423,6 +478,23 @@ static const void *rpc_sysfs_xprt_namespace(const struct kobject *kobj)
423478
kobject)->xprt->xprt_net;
424479
}
425480

481+
static struct kobj_attribute rpc_sysfs_clnt_version = __ATTR(rpc_version,
482+
0444, rpc_sysfs_clnt_version_show, NULL);
483+
484+
static struct kobj_attribute rpc_sysfs_clnt_program = __ATTR(program,
485+
0444, rpc_sysfs_clnt_program_show, NULL);
486+
487+
static struct kobj_attribute rpc_sysfs_clnt_max_connect = __ATTR(max_connect,
488+
0444, rpc_sysfs_clnt_max_connect_show, NULL);
489+
490+
static struct attribute *rpc_sysfs_rpc_clnt_attrs[] = {
491+
&rpc_sysfs_clnt_version.attr,
492+
&rpc_sysfs_clnt_program.attr,
493+
&rpc_sysfs_clnt_max_connect.attr,
494+
NULL,
495+
};
496+
ATTRIBUTE_GROUPS(rpc_sysfs_rpc_clnt);
497+
426498
static struct kobj_attribute rpc_sysfs_xprt_dstaddr = __ATTR(dstaddr,
427499
0644, rpc_sysfs_xprt_dstaddr_show, rpc_sysfs_xprt_dstaddr_store);
428500

@@ -459,6 +531,7 @@ ATTRIBUTE_GROUPS(rpc_sysfs_xprt_switch);
459531

460532
static const struct kobj_type rpc_sysfs_client_type = {
461533
.release = rpc_sysfs_client_release,
534+
.default_groups = rpc_sysfs_rpc_clnt_groups,
462535
.sysfs_ops = &kobj_sysfs_ops,
463536
.namespace = rpc_sysfs_client_namespace,
464537
};

0 commit comments

Comments
 (0)