RDMA/core: Create and destroy rdma_counter using rdma_zalloc_drv_obj()

Change rdma_counter allocation to use rdma_zalloc_drv_obj() instead of,
explicitly allocating at core, in order to be contained inside driver
specific structures.

Adjust all drivers that use it to have their containing structure, and
add driver specific initialization operation.

This change is needed to allow upcoming patches to implement
optional-counters binding whereas inside each driver specific counter
struct his bound optional-counters will be maintained.

Signed-off-by: Patrisious Haddad <phaddad@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Link: https://patch.msgid.link/a5a484f421fc2e5595158e61a354fba43272b02d.1741875070.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
Patrisious Haddad 2025-03-13 16:18:42 +02:00 committed by Leon Romanovsky
parent d375db42a8
commit 7e53b31acc
5 changed files with 30 additions and 1 deletions

View File

@ -149,13 +149,15 @@ static struct rdma_counter *alloc_and_bind(struct ib_device *dev, u32 port,
if (!dev->ops.counter_dealloc || !dev->ops.counter_alloc_stats) if (!dev->ops.counter_dealloc || !dev->ops.counter_alloc_stats)
return NULL; return NULL;
counter = kzalloc(sizeof(*counter), GFP_KERNEL); counter = rdma_zalloc_drv_obj(dev, rdma_counter);
if (!counter) if (!counter)
return NULL; return NULL;
counter->device = dev; counter->device = dev;
counter->port = port; counter->port = port;
dev->ops.counter_init(counter);
rdma_restrack_new(&counter->res, RDMA_RESTRACK_COUNTER); rdma_restrack_new(&counter->res, RDMA_RESTRACK_COUNTER);
counter->stats = dev->ops.counter_alloc_stats(counter); counter->stats = dev->ops.counter_alloc_stats(counter);
if (!counter->stats) if (!counter->stats)

View File

@ -2683,6 +2683,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
SET_DEVICE_OP(dev_ops, counter_alloc_stats); SET_DEVICE_OP(dev_ops, counter_alloc_stats);
SET_DEVICE_OP(dev_ops, counter_bind_qp); SET_DEVICE_OP(dev_ops, counter_bind_qp);
SET_DEVICE_OP(dev_ops, counter_dealloc); SET_DEVICE_OP(dev_ops, counter_dealloc);
SET_DEVICE_OP(dev_ops, counter_init);
SET_DEVICE_OP(dev_ops, counter_unbind_qp); SET_DEVICE_OP(dev_ops, counter_unbind_qp);
SET_DEVICE_OP(dev_ops, counter_update_stats); SET_DEVICE_OP(dev_ops, counter_update_stats);
SET_DEVICE_OP(dev_ops, create_ah); SET_DEVICE_OP(dev_ops, create_ah);
@ -2797,6 +2798,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
SET_OBJ_SIZE(dev_ops, ib_srq); SET_OBJ_SIZE(dev_ops, ib_srq);
SET_OBJ_SIZE(dev_ops, ib_ucontext); SET_OBJ_SIZE(dev_ops, ib_ucontext);
SET_OBJ_SIZE(dev_ops, ib_xrcd); SET_OBJ_SIZE(dev_ops, ib_xrcd);
SET_OBJ_SIZE(dev_ops, rdma_counter);
} }
EXPORT_SYMBOL(ib_set_device_ops); EXPORT_SYMBOL(ib_set_device_ops);

View File

@ -1105,6 +1105,8 @@ static int mlx5_ib_modify_stat(struct ib_device *device, u32 port,
return 0; return 0;
} }
static void mlx5_ib_counter_init(struct rdma_counter *counter) {}
static const struct ib_device_ops hw_stats_ops = { static const struct ib_device_ops hw_stats_ops = {
.alloc_hw_port_stats = mlx5_ib_alloc_hw_port_stats, .alloc_hw_port_stats = mlx5_ib_alloc_hw_port_stats,
.get_hw_stats = mlx5_ib_get_hw_stats, .get_hw_stats = mlx5_ib_get_hw_stats,
@ -1115,6 +1117,9 @@ static const struct ib_device_ops hw_stats_ops = {
.counter_update_stats = mlx5_ib_counter_update_stats, .counter_update_stats = mlx5_ib_counter_update_stats,
.modify_hw_stat = IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS) ? .modify_hw_stat = IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS) ?
mlx5_ib_modify_stat : NULL, mlx5_ib_modify_stat : NULL,
.counter_init = mlx5_ib_counter_init,
INIT_RDMA_OBJ_SIZE(rdma_counter, mlx5_rdma_counter, rdma_counter),
}; };
static const struct ib_device_ops hw_switchdev_vport_op = { static const struct ib_device_ops hw_switchdev_vport_op = {
@ -1129,6 +1134,9 @@ static const struct ib_device_ops hw_switchdev_stats_ops = {
.counter_dealloc = mlx5_ib_counter_dealloc, .counter_dealloc = mlx5_ib_counter_dealloc,
.counter_alloc_stats = mlx5_ib_counter_alloc_stats, .counter_alloc_stats = mlx5_ib_counter_alloc_stats,
.counter_update_stats = mlx5_ib_counter_update_stats, .counter_update_stats = mlx5_ib_counter_update_stats,
.counter_init = mlx5_ib_counter_init,
INIT_RDMA_OBJ_SIZE(rdma_counter, mlx5_rdma_counter, rdma_counter),
}; };
static const struct ib_device_ops counters_ops = { static const struct ib_device_ops counters_ops = {

View File

@ -8,6 +8,17 @@
#include "mlx5_ib.h" #include "mlx5_ib.h"
struct mlx5_rdma_counter {
struct rdma_counter rdma_counter;
};
static inline struct mlx5_rdma_counter *
to_mcounter(struct rdma_counter *counter)
{
return container_of(counter, struct mlx5_rdma_counter, rdma_counter);
}
int mlx5_ib_counters_init(struct mlx5_ib_dev *dev); int mlx5_ib_counters_init(struct mlx5_ib_dev *dev);
void mlx5_ib_counters_cleanup(struct mlx5_ib_dev *dev); void mlx5_ib_counters_cleanup(struct mlx5_ib_dev *dev);
void mlx5_ib_counters_clear_description(struct ib_counters *counters); void mlx5_ib_counters_clear_description(struct ib_counters *counters);

View File

@ -2665,6 +2665,11 @@ struct ib_device_ops {
*/ */
int (*counter_update_stats)(struct rdma_counter *counter); int (*counter_update_stats)(struct rdma_counter *counter);
/**
* counter_init - Initialize the driver specific rdma counter struct.
*/
void (*counter_init)(struct rdma_counter *counter);
/** /**
* Allows rdma drivers to add their own restrack attributes * Allows rdma drivers to add their own restrack attributes
* dumped via 'rdma stat' iproute2 command. * dumped via 'rdma stat' iproute2 command.
@ -2716,6 +2721,7 @@ struct ib_device_ops {
DECLARE_RDMA_OBJ_SIZE(ib_srq); DECLARE_RDMA_OBJ_SIZE(ib_srq);
DECLARE_RDMA_OBJ_SIZE(ib_ucontext); DECLARE_RDMA_OBJ_SIZE(ib_ucontext);
DECLARE_RDMA_OBJ_SIZE(ib_xrcd); DECLARE_RDMA_OBJ_SIZE(ib_xrcd);
DECLARE_RDMA_OBJ_SIZE(rdma_counter);
}; };
struct ib_core_device { struct ib_core_device {