sunrpc: provide multipath info in the sysfs directory
authorOlga Kornievskaia <kolga@netapp.com>
Tue, 8 Jun 2021 19:59:21 +0000 (15:59 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 8 Jul 2021 18:03:24 +0000 (14:03 -0400)
Allow to query xrpt_switch attributes. Currently showing the following
fields of the rpc_xprt_switch structure: xps_nxprts, xps_nactive,
xps_queuelen.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/sysfs.c

index f770eb7..b3bc76b 100644 (file)
@@ -67,6 +67,15 @@ rpc_sysfs_xprt_kobj_get_xprt(struct kobject *kobj)
        return xprt_get(x->xprt);
 }
 
+static inline struct rpc_xprt_switch *
+rpc_sysfs_xprt_switch_kobj_get_xprt(struct kobject *kobj)
+{
+       struct rpc_sysfs_xprt_switch *x = container_of(kobj,
+               struct rpc_sysfs_xprt_switch, kobject);
+
+       return xprt_switch_get(x->xprt_switch);
+}
+
 static ssize_t rpc_sysfs_xprt_dstaddr_show(struct kobject *kobj,
                                           struct kobj_attribute *attr,
                                           char *buf)
@@ -102,6 +111,23 @@ static ssize_t rpc_sysfs_xprt_info_show(struct kobject *kobj,
        return ret + 1;
 }
 
+static ssize_t rpc_sysfs_xprt_switch_info_show(struct kobject *kobj,
+                                              struct kobj_attribute *attr,
+                                              char *buf)
+{
+       struct rpc_xprt_switch *xprt_switch =
+               rpc_sysfs_xprt_switch_kobj_get_xprt(kobj);
+       ssize_t ret;
+
+       if (!xprt_switch)
+               return 0;
+       ret = sprintf(buf, "num_xprts=%u\nnum_active=%u\nqueue_len=%ld\n",
+                     xprt_switch->xps_nxprts, xprt_switch->xps_nactive,
+                     atomic_long_read(&xprt_switch->xps_queuelen));
+       xprt_switch_put(xprt_switch);
+       return ret + 1;
+}
+
 static ssize_t rpc_sysfs_xprt_dstaddr_store(struct kobject *kobj,
                                            struct kobj_attribute *attr,
                                            const char *buf, size_t count)
@@ -235,6 +261,14 @@ static struct attribute *rpc_sysfs_xprt_attrs[] = {
        NULL,
 };
 
+static struct kobj_attribute rpc_sysfs_xprt_switch_info =
+       __ATTR(xprt_switch_info, 0444, rpc_sysfs_xprt_switch_info_show, NULL);
+
+static struct attribute *rpc_sysfs_xprt_switch_attrs[] = {
+       &rpc_sysfs_xprt_switch_info.attr,
+       NULL,
+};
+
 static struct kobj_type rpc_sysfs_client_type = {
        .release = rpc_sysfs_client_release,
        .sysfs_ops = &kobj_sysfs_ops,
@@ -243,6 +277,7 @@ static struct kobj_type rpc_sysfs_client_type = {
 
 static struct kobj_type rpc_sysfs_xprt_switch_type = {
        .release = rpc_sysfs_xprt_switch_release,
+       .default_attrs = rpc_sysfs_xprt_switch_attrs,
        .sysfs_ops = &kobj_sysfs_ops,
        .namespace = rpc_sysfs_xprt_switch_namespace,
 };