Commit 0dc89684 authored by Aharon Landau's avatar Aharon Landau Committed by Jason Gunthorpe
Browse files

RDMA/counter: Add an is_disabled field in struct rdma_hw_stats

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: default avatarAharon Landau <aharonl@nvidia.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarMark Zhang <markzhang@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 0a0800ce
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -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,
+13 −0
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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[];
};