Commit 5dcecbc9 authored by Parav Pandit's avatar Parav Pandit Committed by Doug Ledford

IB/mlx5: Refactor code for counters allocation

To support per device counters in switchdev mode (instead of
per port counter), refactor query routines to work on mlx5_ib_counter
structure instead of mlx5_ib_port structure.
Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Reviewed-by: default avatarDaniel Jurgens <danielj@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Link: https://lore.kernel.org/r/20190723073117.7175-2-leon@kernel.orgSigned-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 0058eb58
...@@ -5466,21 +5466,21 @@ static struct rdma_hw_stats *mlx5_ib_alloc_hw_stats(struct ib_device *ibdev, ...@@ -5466,21 +5466,21 @@ static struct rdma_hw_stats *mlx5_ib_alloc_hw_stats(struct ib_device *ibdev,
u8 port_num) u8 port_num)
{ {
struct mlx5_ib_dev *dev = to_mdev(ibdev); struct mlx5_ib_dev *dev = to_mdev(ibdev);
struct mlx5_ib_port *port = &dev->port[port_num - 1]; const struct mlx5_ib_counters *cnts = &dev->port[port_num - 1].cnts;
/* We support only per port stats */ /* We support only per port stats */
if (port_num == 0) if (port_num == 0)
return NULL; return NULL;
return rdma_alloc_hw_stats_struct(port->cnts.names, return rdma_alloc_hw_stats_struct(cnts->names,
port->cnts.num_q_counters + cnts->num_q_counters +
port->cnts.num_cong_counters + cnts->num_cong_counters +
port->cnts.num_ext_ppcnt_counters, cnts->num_ext_ppcnt_counters,
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
static int mlx5_ib_query_q_counters(struct mlx5_core_dev *mdev, static int mlx5_ib_query_q_counters(struct mlx5_core_dev *mdev,
struct mlx5_ib_port *port, const struct mlx5_ib_counters *cnts,
struct rdma_hw_stats *stats, struct rdma_hw_stats *stats,
u16 set_id) u16 set_id)
{ {
...@@ -5497,8 +5497,8 @@ static int mlx5_ib_query_q_counters(struct mlx5_core_dev *mdev, ...@@ -5497,8 +5497,8 @@ static int mlx5_ib_query_q_counters(struct mlx5_core_dev *mdev,
if (ret) if (ret)
goto free; goto free;
for (i = 0; i < port->cnts.num_q_counters; i++) { for (i = 0; i < cnts->num_q_counters; i++) {
val = *(__be32 *)(out + port->cnts.offsets[i]); val = *(__be32 *)(out + cnts->offsets[i]);
stats->value[i] = (u64)be32_to_cpu(val); stats->value[i] = (u64)be32_to_cpu(val);
} }
...@@ -5508,10 +5508,10 @@ static int mlx5_ib_query_q_counters(struct mlx5_core_dev *mdev, ...@@ -5508,10 +5508,10 @@ static int mlx5_ib_query_q_counters(struct mlx5_core_dev *mdev,
} }
static int mlx5_ib_query_ext_ppcnt_counters(struct mlx5_ib_dev *dev, static int mlx5_ib_query_ext_ppcnt_counters(struct mlx5_ib_dev *dev,
struct mlx5_ib_port *port, const struct mlx5_ib_counters *cnts,
struct rdma_hw_stats *stats) struct rdma_hw_stats *stats)
{ {
int offset = port->cnts.num_q_counters + port->cnts.num_cong_counters; int offset = cnts->num_q_counters + cnts->num_cong_counters;
int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
int ret, i; int ret, i;
void *out; void *out;
...@@ -5524,12 +5524,10 @@ static int mlx5_ib_query_ext_ppcnt_counters(struct mlx5_ib_dev *dev, ...@@ -5524,12 +5524,10 @@ static int mlx5_ib_query_ext_ppcnt_counters(struct mlx5_ib_dev *dev,
if (ret) if (ret)
goto free; goto free;
for (i = 0; i < port->cnts.num_ext_ppcnt_counters; i++) { for (i = 0; i < cnts->num_ext_ppcnt_counters; i++)
stats->value[i + offset] = stats->value[i + offset] =
be64_to_cpup((__be64 *)(out + be64_to_cpup((__be64 *)(out +
port->cnts.offsets[i + offset])); cnts->offsets[i + offset]));
}
free: free:
kvfree(out); kvfree(out);
return ret; return ret;
...@@ -5540,7 +5538,7 @@ static int mlx5_ib_get_hw_stats(struct ib_device *ibdev, ...@@ -5540,7 +5538,7 @@ static int mlx5_ib_get_hw_stats(struct ib_device *ibdev,
u8 port_num, int index) u8 port_num, int index)
{ {
struct mlx5_ib_dev *dev = to_mdev(ibdev); struct mlx5_ib_dev *dev = to_mdev(ibdev);
struct mlx5_ib_port *port = &dev->port[port_num - 1]; struct mlx5_ib_counters *cnts = &dev->port[port_num - 1].cnts;
struct mlx5_core_dev *mdev; struct mlx5_core_dev *mdev;
int ret, num_counters; int ret, num_counters;
u8 mdev_port_num; u8 mdev_port_num;
...@@ -5548,18 +5546,17 @@ static int mlx5_ib_get_hw_stats(struct ib_device *ibdev, ...@@ -5548,18 +5546,17 @@ static int mlx5_ib_get_hw_stats(struct ib_device *ibdev,
if (!stats) if (!stats)
return -EINVAL; return -EINVAL;
num_counters = port->cnts.num_q_counters + num_counters = cnts->num_q_counters +
port->cnts.num_cong_counters + cnts->num_cong_counters +
port->cnts.num_ext_ppcnt_counters; cnts->num_ext_ppcnt_counters;
/* q_counters are per IB device, query the master mdev */ /* q_counters are per IB device, query the master mdev */
ret = mlx5_ib_query_q_counters(dev->mdev, port, stats, ret = mlx5_ib_query_q_counters(dev->mdev, cnts, stats, cnts->set_id);
port->cnts.set_id);
if (ret) if (ret)
return ret; return ret;
if (MLX5_CAP_PCAM_FEATURE(dev->mdev, rx_icrc_encapsulated_counter)) { if (MLX5_CAP_PCAM_FEATURE(dev->mdev, rx_icrc_encapsulated_counter)) {
ret = mlx5_ib_query_ext_ppcnt_counters(dev, port, stats); ret = mlx5_ib_query_ext_ppcnt_counters(dev, cnts, stats);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -5576,10 +5573,10 @@ static int mlx5_ib_get_hw_stats(struct ib_device *ibdev, ...@@ -5576,10 +5573,10 @@ static int mlx5_ib_get_hw_stats(struct ib_device *ibdev,
} }
ret = mlx5_lag_query_cong_counters(dev->mdev, ret = mlx5_lag_query_cong_counters(dev->mdev,
stats->value + stats->value +
port->cnts.num_q_counters, cnts->num_q_counters,
port->cnts.num_cong_counters, cnts->num_cong_counters,
port->cnts.offsets + cnts->offsets +
port->cnts.num_q_counters); cnts->num_q_counters);
mlx5_ib_put_native_port_mdev(dev, port_num); mlx5_ib_put_native_port_mdev(dev, port_num);
if (ret) if (ret)
...@@ -5594,20 +5591,21 @@ static struct rdma_hw_stats * ...@@ -5594,20 +5591,21 @@ static struct rdma_hw_stats *
mlx5_ib_counter_alloc_stats(struct rdma_counter *counter) mlx5_ib_counter_alloc_stats(struct rdma_counter *counter)
{ {
struct mlx5_ib_dev *dev = to_mdev(counter->device); struct mlx5_ib_dev *dev = to_mdev(counter->device);
struct mlx5_ib_port *port = &dev->port[counter->port - 1]; const struct mlx5_ib_counters *cnts =
&dev->port[counter->port - 1].cnts;
/* Q counters are in the beginning of all counters */ /* Q counters are in the beginning of all counters */
return rdma_alloc_hw_stats_struct(port->cnts.names, return rdma_alloc_hw_stats_struct(cnts->names,
port->cnts.num_q_counters, cnts->num_q_counters,
RDMA_HW_STATS_DEFAULT_LIFESPAN); RDMA_HW_STATS_DEFAULT_LIFESPAN);
} }
static int mlx5_ib_counter_update_stats(struct rdma_counter *counter) static int mlx5_ib_counter_update_stats(struct rdma_counter *counter)
{ {
struct mlx5_ib_dev *dev = to_mdev(counter->device); struct mlx5_ib_dev *dev = to_mdev(counter->device);
struct mlx5_ib_port *port = &dev->port[counter->port - 1]; struct mlx5_ib_counters *cnts = &dev->port[counter->port - 1].cnts;
return mlx5_ib_query_q_counters(dev->mdev, port, return mlx5_ib_query_q_counters(dev->mdev, cnts,
counter->stats, counter->id); counter->stats, counter->id);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment