OSDN Git Service

RDMA/rtrs-srv: Use per-cpu variables for rdma stats
authorSantosh Kumar Pradhan <santosh.pradhan@ionos.com>
Tue, 12 Jul 2022 10:31:11 +0000 (12:31 +0200)
committerLeon Romanovsky <leonro@nvidia.com>
Mon, 18 Jul 2022 09:27:49 +0000 (12:27 +0300)
Convert server stat counters from atomic to per-cpu variables.

Link: https://lore.kernel.org/r/20220712103113.617754-4-haris.iqbal@ionos.com
Signed-off-by: Santosh Kumar Pradhan <santosh.pradhan@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c
drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c
drivers/infiniband/ulp/rtrs/rtrs-srv.c
drivers/infiniband/ulp/rtrs/rtrs-srv.h

index 44b1c16..2aff121 100644 (file)
 int rtrs_srv_reset_rdma_stats(struct rtrs_srv_stats *stats, bool enable)
 {
        if (enable) {
-               struct rtrs_srv_stats_rdma_stats *r = &stats->rdma_stats;
+               int cpu;
+               struct rtrs_srv_stats_rdma_stats *r;
+
+               for_each_possible_cpu(cpu) {
+                       r = per_cpu_ptr(stats->rdma_stats, cpu);
+                       memset(r, 0, sizeof(*r));
+               }
 
-               memset(r, 0, sizeof(*r));
                return 0;
        }
 
@@ -25,11 +30,22 @@ int rtrs_srv_reset_rdma_stats(struct rtrs_srv_stats *stats, bool enable)
 
 ssize_t rtrs_srv_stats_rdma_to_str(struct rtrs_srv_stats *stats, char *page)
 {
-       struct rtrs_srv_stats_rdma_stats *r = &stats->rdma_stats;
+       int cpu;
+       struct rtrs_srv_stats_rdma_stats sum;
+       struct rtrs_srv_stats_rdma_stats *r;
+
+       memset(&sum, 0, sizeof(sum));
+
+       for_each_possible_cpu(cpu) {
+               r = per_cpu_ptr(stats->rdma_stats, cpu);
+
+               sum.dir[READ].cnt         += r->dir[READ].cnt;
+               sum.dir[READ].size_total  += r->dir[READ].size_total;
+               sum.dir[WRITE].cnt        += r->dir[WRITE].cnt;
+               sum.dir[WRITE].size_total += r->dir[WRITE].size_total;
+       }
 
-       return sysfs_emit(page, "%lld %lld %lld %lldn %u\n",
-                         (s64)atomic64_read(&r->dir[READ].cnt),
-                         (s64)atomic64_read(&r->dir[READ].size_total),
-                         (s64)atomic64_read(&r->dir[WRITE].cnt),
-                         (s64)atomic64_read(&r->dir[WRITE].size_total), 0);
+       return sysfs_emit(page, "%llu %llu %llu %llu\n",
+                         sum.dir[READ].cnt, sum.dir[READ].size_total,
+                         sum.dir[WRITE].cnt, sum.dir[WRITE].size_total);
 }
index b94ae12..2a3c9ac 100644 (file)
@@ -220,6 +220,8 @@ static void rtrs_srv_path_stats_release(struct kobject *kobj)
 
        stats = container_of(kobj, struct rtrs_srv_stats, kobj_stats);
 
+       free_percpu(stats->rdma_stats);
+
        kfree(stats);
 }
 
index 24024bc..8278d36 100644 (file)
@@ -1513,6 +1513,7 @@ static void free_path(struct rtrs_srv_path *srv_path)
                kobject_del(&srv_path->kobj);
                kobject_put(&srv_path->kobj);
        } else {
+               free_percpu(srv_path->stats->rdma_stats);
                kfree(srv_path->stats);
                kfree(srv_path);
        }
@@ -1755,13 +1756,17 @@ static struct rtrs_srv_path *__alloc_path(struct rtrs_srv_sess *srv,
        if (!srv_path->stats)
                goto err_free_sess;
 
+       srv_path->stats->rdma_stats = alloc_percpu(struct rtrs_srv_stats_rdma_stats);
+       if (!srv_path->stats->rdma_stats)
+               goto err_free_stats;
+
        srv_path->stats->srv_path = srv_path;
 
        srv_path->dma_addr = kcalloc(srv->queue_depth,
                                     sizeof(*srv_path->dma_addr),
                                     GFP_KERNEL);
        if (!srv_path->dma_addr)
-               goto err_free_stats;
+               goto err_free_percpu;
 
        srv_path->s.con = kcalloc(con_num, sizeof(*srv_path->s.con),
                                  GFP_KERNEL);
@@ -1813,6 +1818,8 @@ err_free_con:
        kfree(srv_path->s.con);
 err_free_dma_addr:
        kfree(srv_path->dma_addr);
+err_free_percpu:
+       free_percpu(srv_path->stats->rdma_stats);
 err_free_stats:
        kfree(srv_path->stats);
 err_free_sess:
index 6292e87..186a63c 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <linux/device.h>
 #include <linux/refcount.h>
+#include <linux/percpu.h>
 #include "rtrs-pri.h"
 
 /*
@@ -29,15 +30,15 @@ enum rtrs_srv_state {
  */
 struct rtrs_srv_stats_rdma_stats {
        struct {
-               atomic64_t      cnt;
-               atomic64_t      size_total;
+               u64 cnt;
+               u64 size_total;
        } dir[2];
 };
 
 struct rtrs_srv_stats {
-       struct kobject                          kobj_stats;
-       struct rtrs_srv_stats_rdma_stats        rdma_stats;
-       struct rtrs_srv_path                    *srv_path;
+       struct kobject                                  kobj_stats;
+       struct rtrs_srv_stats_rdma_stats __percpu       *rdma_stats;
+       struct rtrs_srv_path                            *srv_path;
 };
 
 struct rtrs_srv_con {
@@ -130,8 +131,8 @@ void close_path(struct rtrs_srv_path *srv_path);
 static inline void rtrs_srv_update_rdma_stats(struct rtrs_srv_stats *s,
                                              size_t size, int d)
 {
-       atomic64_inc(&s->rdma_stats.dir[d].cnt);
-       atomic64_add(size, &s->rdma_stats.dir[d].size_total);
+       this_cpu_inc(s->rdma_stats->dir[d].cnt);
+       this_cpu_add(s->rdma_stats->dir[d].size_total, size);
 }
 
 /* functions which are implemented in rtrs-srv-stats.c */