RDMA/counter: Add an is_disabled field in struct rdma_hw_stats
authorAharon Landau <aharonl@nvidia.com>
Fri, 8 Oct 2021 12:24:31 +0000 (15:24 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 12 Oct 2021 15:48:05 +0000 (12:48 -0300)
Add a bitmap in rdma_hw_stat structure, with each bit indicates whether
the corresponding counter is currently disabled or not. By default
hwcounters are enabled.

Link: https://lore.kernel.org/r/20211008122439.166063-6-markzhang@nvidia.com
Signed-off-by: Aharon Landau <aharonl@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Mark Zhang <markzhang@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/nldev.c
drivers/infiniband/core/verbs.c
include/rdma/ib_verbs.h

index 3f6b98a8756683c8ea69d846c257da0d81e84695..67519730b1acaf76f6b0cfd4727fbfabfdbd442c 100644 (file)
@@ -968,15 +968,21 @@ static int fill_stat_counter_hwcounters(struct sk_buff *msg,
        if (!table_attr)
                return -EMSGSIZE;
 
-       for (i = 0; i < st->num_counters; i++)
+       mutex_lock(&st->lock);
+       for (i = 0; i < st->num_counters; i++) {
+               if (test_bit(i, st->is_disabled))
+                       continue;
                if (rdma_nl_stat_hwcounter_entry(msg, st->descs[i].name,
                                                 st->value[i]))
                        goto err;
+       }
+       mutex_unlock(&st->lock);
 
        nla_nest_end(msg, table_attr);
        return 0;
 
 err:
+       mutex_unlock(&st->lock);
        nla_nest_cancel(msg, table_attr);
        return -EMSGSIZE;
 }
@@ -2104,6 +2110,9 @@ static int stat_get_doit_default_counter(struct sk_buff *skb,
                goto err_stats;
        }
        for (i = 0; i < num_cnts; i++) {
+               if (test_bit(i, stats->is_disabled))
+                       continue;
+
                v = stats->value[i] +
                        rdma_counter_get_hwstat_value(device, port, i);
                if (rdma_nl_stat_hwcounter_entry(msg,
index 8e72290d6b38186fd5d70fe5c23958f5488f274d..47cf273d06780da0f576622e131648d44b53903c 100644 (file)
@@ -2994,11 +2994,20 @@ struct rdma_hw_stats *rdma_alloc_hw_stats_struct(
        if (!stats)
                return NULL;
 
+       stats->is_disabled = kcalloc(BITS_TO_LONGS(num_counters),
+                                    sizeof(*stats->is_disabled), GFP_KERNEL);
+       if (!stats->is_disabled)
+               goto err;
+
        stats->descs = descs;
        stats->num_counters = num_counters;
        stats->lifespan = msecs_to_jiffies(lifespan);
 
        return stats;
+
+err:
+       kfree(stats);
+       return NULL;
 }
 EXPORT_SYMBOL(rdma_alloc_hw_stats_struct);
 
@@ -3008,6 +3017,10 @@ EXPORT_SYMBOL(rdma_alloc_hw_stats_struct);
  */
 void rdma_free_hw_stats_struct(struct rdma_hw_stats *stats)
 {
+       if (!stats)
+               return;
+
+       kfree(stats->is_disabled);
        kfree(stats);
 }
 EXPORT_SYMBOL(rdma_free_hw_stats_struct);
index 938c0c0a1c19734aed8996cbf4a94a5d1ab0beba..ae467365706bbeec7831eb0b5615808784c0b7ed 100644 (file)
@@ -565,6 +565,8 @@ struct rdma_stat_desc {
  *   their own value during their allocation routine.
  * @descs - Array of pointers to static descriptors used for the counters
  *   in directory.
+ * @is_disabled - A bitmap to indicate each counter is currently disabled
+ *   or not.
  * @num_counters - How many hardware counters there are.  If name is
  *   shorter than this number, a kernel oops will result.  Driver authors
  *   are encouraged to leave BUILD_BUG_ON(ARRAY_SIZE(@name) < num_counters)
@@ -577,6 +579,7 @@ struct rdma_hw_stats {
        unsigned long   timestamp;
        unsigned long   lifespan;
        const struct rdma_stat_desc *descs;
+       unsigned long   *is_disabled;
        int             num_counters;
        u64             value[];
 };