Skip to contentSkip to conversation

Allocate the per-port Q counter

PATCH Applied Leon Romanovsky 2 participants 6 messages Dec 9, 2018 – Dec 21, 2018

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

cover Allocate the per-port Q counter

From: Leon Romanovsky <[email protected]>

Hi

See commit message for the patch description.

Thanks

Leon Romanovsky (1):
net/mlx5: Add shared Q counter bits

Yishai Hadas (1):
IB/mlx5: Allocate the per-port Q counter shared when DEVX is supported

 drivers/infiniband/hw/mlx5/cmd.c  | 17 +++++++++++++++++
 drivers/infiniband/hw/mlx5/cmd.h  |  2 ++
 drivers/infiniband/hw/mlx5/main.c | 10 ++++++++--
 include/linux/mlx5/mlx5_ifc.h     |  6 +++++-
 4 files changed, 32 insertions(+), 3 deletions(-)
#1 lore raw

PATCH 1/2 net/mlx5: Add shared Q counter bits

From: Leon Romanovsky <[email protected]>

Updated HW specification file with needed bits to allow sharing of Q counters between DEVX contexts and kernel.

---
 include/linux/mlx5/mlx5_ifc.h | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
include/linux/mlx5/mlx5_ifc.h +5 -1
index 52393fbcf3b4..15093356a226 100644
@@ -85,6 +85,10 @@ enum {
 	MLX5_OBJ_TYPE_UMEM = 0x0005,
 };
 
+enum {
+	MLX5_SHARED_RESOURCE_UID = 0xffff,
+};
+
 enum {
 	MLX5_CMD_OP_QUERY_HCA_CAP                 = 0x100,
 	MLX5_CMD_OP_QUERY_ADAPTER                 = 0x101,
@@ -7464,7 +7468,7 @@ struct mlx5_ifc_alloc_q_counter_out_bits {
 
 struct mlx5_ifc_alloc_q_counter_in_bits {
 	u8         opcode[0x10];
-	u8         reserved_at_10[0x10];
+	u8         uid[0x10];
 
 	u8         reserved_at_20[0x10];
 	u8         op_mod[0x10];
Signature · 1 line
2.19.1
#2 lore raw

PATCH 2/2 IB/mlx5: Allocate the per-port Q counter shared when DEVX is supported

In reply to Leon Romanovsky

From: Yishai Hadas <[email protected]>

The per-port Q counter is some kernel resource and as such may be used by few UID(s) upon DEVX usage.

To enable using it for QP/RQ when DEVX context is used need to allocate it with a sharing mode indication to let firmware allows its usage.

The UID = 0xffff was chosen to mark it.

---
 drivers/infiniband/hw/mlx5/cmd.c  | 17 +++++++++++++++++
 drivers/infiniband/hw/mlx5/cmd.h  |  2 ++
 drivers/infiniband/hw/mlx5/main.c | 10 ++++++++--
 3 files changed, 27 insertions(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/cmd.c +17 -0
index ca060a2e2b36..752c60426a1c 100644
@@ -326,3 +326,20 @@ int mlx5_cmd_xrcd_dealloc(struct mlx5_core_dev *dev, u32 xrcdn, u16 uid)
 	MLX5_SET(dealloc_xrcd_in, in, uid, uid);
 	return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
+
+int mlx5_cmd_alloc_q_counter(struct mlx5_core_dev *dev, u16 *counter_id,
+			     u16 uid)
+{
+	u32 in[MLX5_ST_SZ_DW(alloc_q_counter_in)]   = {0};
+	u32 out[MLX5_ST_SZ_DW(alloc_q_counter_out)] = {0};
+	int err;
+
+	MLX5_SET(alloc_q_counter_in, in, opcode, MLX5_CMD_OP_ALLOC_Q_COUNTER);
+	MLX5_SET(alloc_q_counter_in, in, uid, uid);
+
+	err = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
+	if (!err)
+		*counter_id = MLX5_GET(alloc_q_counter_out, out,
+				       counter_set_id);
+	return err;
+}
drivers/infiniband/hw/mlx5/cmd.h +2 -0
index c03c56455534..1e76dc67a369 100644
@@ -61,4 +61,6 @@ int mlx5_cmd_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid,
 			u32 qpn, u16 uid);
 int mlx5_cmd_xrcd_alloc(struct mlx5_core_dev *dev, u32 *xrcdn, u16 uid);
 int mlx5_cmd_xrcd_dealloc(struct mlx5_core_dev *dev, u32 xrcdn, u16 uid);
+int mlx5_cmd_alloc_q_counter(struct mlx5_core_dev *dev, u16 *counter_id,
+			     u16 uid);
 #endif /* MLX5_IB_CMD_H */
drivers/infiniband/hw/mlx5/main.c +8 -2
index 4660f5f1547a..3477fa1b2289 100644
@@ -5114,6 +5114,10 @@ static int mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev)
 {
 	int err = 0;
 	int i;
+	bool is_shared;
+
+	is_shared = MLX5_CAP_GEN_64(dev->mdev, general_obj_types) &
+				MLX5_GENERAL_OBJ_TYPES_CAP_UCTX;
 
 	for (i = 0; i < dev->num_ports; i++) {
 		err = __mlx5_ib_alloc_counters(dev, &dev->port[i].cnts);
@@ -5123,8 +5127,10 @@ static int mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev)
 		mlx5_ib_fill_counters(dev, dev->port[i].cnts.names,
 				      dev->port[i].cnts.offsets);
 
-		err = mlx5_core_alloc_q_counter(dev->mdev,
-						&dev->port[i].cnts.set_id);
+		err = mlx5_cmd_alloc_q_counter(dev->mdev,
+					       &dev->port[i].cnts.set_id,
+					       is_shared ?
+					       MLX5_SHARED_RESOURCE_UID : 0);
 		if (err) {
 			mlx5_ib_warn(dev,
 				     "couldn't allocate queue counter for port %d, err %d\n",
Signature · 1 line
2.19.1
#3 lore raw
In reply to Leon Romanovsky
Quoted 6 lines · Leon Romanovsky

From: Leon Romanovsky <[email protected]>

Hi

See commit message for the patch description.

Quoted 7 lines

Thanks

Leon Romanovsky (1):
net/mlx5: Add shared Q counter bits

Yishai Hadas (1):
IB/mlx5: Allocate the per-port Q counter shared when DEVX is supported

This seems fine, please update the shared branch

Thanks,
Jason

#4 lore raw
Quoted 9 lines · Jason Gunthorpe
Quoted 8 lines · Leon Romanovsky

From: Leon Romanovsky <[email protected]>

Hi

See commit message for the patch description.

Thanks

Quoted 7 lines
Quoted 5 lines

Leon Romanovsky (1):
net/mlx5: Add shared Q counter bits

Yishai Hadas (1):
IB/mlx5: Allocate the per-port Q counter shared when DEVX is supported

This seems fine, please update the shared branch

Done,
2acc7957dbc3 net/mlx5: Add shared Q counter bits

Thanks

Quoted 3 lines

Thanks,
Jason

#5 lore raw
In reply to Leon Romanovsky
Quoted 6 lines · Leon Romanovsky

From: Leon Romanovsky <[email protected]>

Hi

See commit message for the patch description.

Quoted 7 lines

Thanks

Leon Romanovsky (1):
net/mlx5: Add shared Q counter bits

Yishai Hadas (1):
IB/mlx5: Allocate the per-port Q counter shared when DEVX is supported

Applied to for-next

Thanks,
Jason