svcrdma: Restore read and write stats
authorChuck Lever <chuck.lever@oracle.com>
Tue, 29 Dec 2020 21:09:36 +0000 (16:09 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 25 Jan 2021 14:36:28 +0000 (09:36 -0500)
Now that we have an efficient mechanism to update these two stats,
let's start maintaining them again.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
include/linux/sunrpc/svc_rdma.h
net/sunrpc/xprtrdma/svc_rdma.c
net/sunrpc/xprtrdma/svc_rdma_rw.c

index c06b16c..c882816 100644 (file)
@@ -66,10 +66,10 @@ extern unsigned int svcrdma_max_requests;
 extern unsigned int svcrdma_max_bc_requests;
 extern unsigned int svcrdma_max_req_size;
 
+extern struct percpu_counter svcrdma_stat_read;
 extern struct percpu_counter svcrdma_stat_recv;
-extern atomic_t rdma_stat_read;
-extern atomic_t rdma_stat_write;
 extern struct percpu_counter svcrdma_stat_sq_starve;
+extern struct percpu_counter svcrdma_stat_write;
 extern atomic_t rdma_stat_rq_starve;
 extern atomic_t rdma_stat_rq_poll;
 extern atomic_t rdma_stat_rq_prod;
index ee768d4..c8336df 100644 (file)
@@ -63,10 +63,10 @@ unsigned int svcrdma_max_req_size = RPCRDMA_DEF_INLINE_THRESH;
 static unsigned int min_max_inline = RPCRDMA_DEF_INLINE_THRESH;
 static unsigned int max_max_inline = RPCRDMA_MAX_INLINE_THRESH;
 
+struct percpu_counter svcrdma_stat_read;
 struct percpu_counter svcrdma_stat_recv;
-atomic_t rdma_stat_read;
-atomic_t rdma_stat_write;
 struct percpu_counter svcrdma_stat_sq_starve;
+struct percpu_counter svcrdma_stat_write;
 atomic_t rdma_stat_rq_starve;
 atomic_t rdma_stat_rq_poll;
 atomic_t rdma_stat_rq_prod;
@@ -178,10 +178,10 @@ static struct ctl_table svcrdma_parm_table[] = {
 
        {
                .procname       = "rdma_stat_read",
-               .data           = &rdma_stat_read,
-               .maxlen         = sizeof(atomic_t),
+               .data           = &svcrdma_stat_read,
+               .maxlen         = SVCRDMA_COUNTER_BUFSIZ,
                .mode           = 0644,
-               .proc_handler   = read_reset_stat,
+               .proc_handler   = svcrdma_counter_handler,
        },
        {
                .procname       = "rdma_stat_recv",
@@ -192,10 +192,10 @@ static struct ctl_table svcrdma_parm_table[] = {
        },
        {
                .procname       = "rdma_stat_write",
-               .data           = &rdma_stat_write,
-               .maxlen         = sizeof(atomic_t),
+               .data           = &svcrdma_stat_write,
+               .maxlen         = SVCRDMA_COUNTER_BUFSIZ,
                .mode           = 0644,
-               .proc_handler   = read_reset_stat,
+               .proc_handler   = svcrdma_counter_handler,
        },
        {
                .procname       = "rdma_stat_sq_starve",
@@ -267,8 +267,10 @@ static void svc_rdma_proc_cleanup(void)
        unregister_sysctl_table(svcrdma_table_header);
        svcrdma_table_header = NULL;
 
+       percpu_counter_destroy(&svcrdma_stat_write);
        percpu_counter_destroy(&svcrdma_stat_sq_starve);
        percpu_counter_destroy(&svcrdma_stat_recv);
+       percpu_counter_destroy(&svcrdma_stat_read);
 }
 
 static int svc_rdma_proc_init(void)
@@ -278,18 +280,26 @@ static int svc_rdma_proc_init(void)
        if (svcrdma_table_header)
                return 0;
 
+       rc = percpu_counter_init(&svcrdma_stat_read, 0, GFP_KERNEL);
+       if (rc)
+               goto out_err;
        rc = percpu_counter_init(&svcrdma_stat_recv, 0, GFP_KERNEL);
        if (rc)
                goto out_err;
        rc = percpu_counter_init(&svcrdma_stat_sq_starve, 0, GFP_KERNEL);
        if (rc)
                goto out_err;
+       rc = percpu_counter_init(&svcrdma_stat_write, 0, GFP_KERNEL);
+       if (rc)
+               goto out_err;
 
        svcrdma_table_header = register_sysctl_table(svcrdma_root_table);
        return 0;
 
 out_err:
+       percpu_counter_destroy(&svcrdma_stat_sq_starve);
        percpu_counter_destroy(&svcrdma_stat_recv);
+       percpu_counter_destroy(&svcrdma_stat_read);
        return rc;
 }
 
index d7d98b2..693d139 100644 (file)
@@ -469,6 +469,7 @@ svc_rdma_build_writes(struct svc_rdma_write_info *info,
                                           DMA_TO_DEVICE);
                if (ret < 0)
                        return -EIO;
+               percpu_counter_inc(&svcrdma_stat_write);
 
                list_add(&ctxt->rw_list, &cc->cc_rwctxts);
                cc->cc_sqecount += ret;
@@ -719,6 +720,7 @@ static int svc_rdma_build_read_segment(struct svc_rdma_read_info *info,
                                   segment->rs_handle, DMA_FROM_DEVICE);
        if (ret < 0)
                return -EIO;
+       percpu_counter_inc(&svcrdma_stat_read);
 
        list_add(&ctxt->rw_list, &cc->cc_rwctxts);
        cc->cc_sqecount += ret;