History

(IB, net)/mlx4: Add resource utilization support

Adding visibility of resource usage of QPs, CQs and counters used by virtual functions. This feature will be used to give the PF administrator more data while debugging VF status. Usage info was added to ALLOC_RES command, to notify the PF if the resource which is being reserved or allocated for the VF will be used by kernel driver or by user verbs. Updated reservation and allocation functions of QP, CQ and counter with additional usage parameter.

Moshe Shemesh committed 9 years ago

Commit f3301871 parent ea30b9611 files · +45 −20Browse files

Unified · Split

11 files
  1. drivers/infiniband/hw/mlx4/cq.c +2 −0
  2. drivers/infiniband/hw/mlx4/main.c +4 −2
  3. drivers/infiniband/hw/mlx4/qp.c +9 −4
  4. drivers/net/ethernet/mellanox/mlx4/cq.c +4 −3
  5. drivers/net/ethernet/mellanox/mlx4/en_cq.c +1 −0
  6. drivers/net/ethernet/mellanox/mlx4/en_netdev.c +2 −1
  7. drivers/net/ethernet/mellanox/mlx4/en_rx.c +4 −2
  8. drivers/net/ethernet/mellanox/mlx4/en_tx.c +2 −1
  9. drivers/net/ethernet/mellanox/mlx4/main.c +4 −3
  10. drivers/net/ethernet/mellanox/mlx4/qp.c +3 −2
  11. include/linux/mlx4/device.h +10 −2
drivers/infiniband/hw/mlx4/cq.c+2−0
@@ -218,6 +218,7 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev, · 217 unmodified lines
218218 goto err_mtt;
219219
220220 uar = &to_mucontext(context)->uar;
221+ cq->mcq.usage = MLX4_RES_USAGE_USER_VERBS;
221222 } else {
222223 err = mlx4_db_alloc(dev->dev, &cq->db, 1);
223224 if (err)
@@ -233,6 +234,7 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev, · 9 unmodified lines
233234 goto err_db;
234235
235236 uar = &dev->priv_uar;
237+ cq->mcq.usage = MLX4_RES_USAGE_DRIVER;
236238 }
237239
238240 if (dev->eq_table)
drivers/infiniband/hw/mlx4/main.c+4−2
@@ -2779,7 +2779,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) · 2778 unmodified lines
27792779 allocated = 0;
27802780 if (mlx4_ib_port_link_layer(&ibdev->ib_dev, i + 1) ==
27812781 IB_LINK_LAYER_ETHERNET) {
2782− err = mlx4_counter_alloc(ibdev->dev, &counter_index);
2782+ err = mlx4_counter_alloc(ibdev->dev, &counter_index,
2783+ MLX4_RES_USAGE_DRIVER);
27832784 /* if failed to allocate a new counter, use default */
27842785 if (err)
27852786 counter_index =
@@ -2834,7 +2835,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) · 48 unmodified lines
28342835 ibdev->steer_qpn_count = MLX4_IB_UC_MAX_NUM_QPS;
28352836 err = mlx4_qp_reserve_range(dev, ibdev->steer_qpn_count,
28362837 MLX4_IB_UC_STEER_QPN_ALIGN,
2837− &ibdev->steer_qpn_base, 0);
2838+ &ibdev->steer_qpn_base, 0,
2839+ MLX4_RES_USAGE_DRIVER);
28382840 if (err)
28392841 goto err_counter;
28402842
drivers/infiniband/hw/mlx4/qp.c+9−4
@@ -769,6 +769,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, · 768 unmodified lines
769769 if (err)
770770 goto err_mtt;
771771 }
772+ qp->mqp.usage = MLX4_RES_USAGE_USER_VERBS;
772773 } else {
773774 err = set_rq_size(dev, &init_attr->cap, !!pd->uobject,
774775 qp_has_rq(init_attr), qp, 0);
@@ -841,6 +842,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, · 66 unmodified lines
841842 err = -ENOMEM;
842843 goto err_wrid;
843844 }
845+ qp->mqp.usage = MLX4_RES_USAGE_DRIVER;
844846 }
845847
846848 if (sqpn) {
@@ -860,13 +862,14 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, · 13 unmodified lines
860862 (init_attr->cap.max_send_wr ?
861863 MLX4_RESERVE_ETH_BF_QP : 0) |
862864 (init_attr->cap.max_recv_wr ?
863− MLX4_RESERVE_A0_QP : 0));
865+ MLX4_RESERVE_A0_QP : 0),
866+ qp->mqp.usage);
864867 else
865868 if (qp->flags & MLX4_IB_QP_NETIF)
866869 err = mlx4_ib_steer_qp_alloc(dev, 1, &qpn);
867870 else
868871 err = mlx4_qp_reserve_range(dev->dev, 1, 1,
869− &qpn, 0);
872+ &qpn, 0, qp->mqp.usage);
870873 if (err)
871874 goto err_proxy;
872875 }
@@ -1218,7 +1221,9 @@ static struct ib_qp *_mlx4_ib_create_qp(struct ib_pd *pd, · 345 unmodified lines
12181221 if (udata)
12191222 return ERR_PTR(-EINVAL);
12201223 if (init_attr->create_flags & MLX4_IB_QP_CREATE_ROCE_V2_GSI) {
1221− int res = mlx4_qp_reserve_range(to_mdev(pd->device)->dev, 1, 1, &sqpn, 0);
1224+ int res = mlx4_qp_reserve_range(to_mdev(pd->device)->dev,
1225+ 1, 1, &sqpn, 0,
1226+ MLX4_RES_USAGE_DRIVER);
12221227
12231228 if (res)
12241229 return ERR_PTR(res);
@@ -1581,7 +1586,7 @@ static int create_qp_lb_counter(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp) · 356 unmodified lines
15811586 !(dev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_LB_SRC_CHK))
15821587 return 0;
15831588
1584− err = mlx4_counter_alloc(dev->dev, &tmp_idx);
1589+ err = mlx4_counter_alloc(dev->dev, &tmp_idx, MLX4_RES_USAGE_DRIVER);
15851590 if (err)
15861591 return err;
15871592
drivers/net/ethernet/mellanox/mlx4/cq.c+4−3
@@ -241,13 +241,14 @@ err_out: · 240 unmodified lines
241241 return err;
242242 }
243243
244−static int mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn)
244+static int mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn, u8 usage)
245245 {
246+ u32 in_modifier = RES_CQ | (((u32)usage & 3) << 30);
246247 u64 out_param;
247248 int err;
248249
249250 if (mlx4_is_mfunc(dev)) {
250− err = mlx4_cmd_imm(dev, 0, &out_param, RES_CQ,
251+ err = mlx4_cmd_imm(dev, 0, &out_param, in_modifier,
251252 RES_OP_RESERVE_AND_MAP, MLX4_CMD_ALLOC_RES,
252253 MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
253254 if (err)
@@ -303,7 +304,7 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, · 49 unmodified lines
303304
304305 cq->vector = vector;
305306
306− err = mlx4_cq_alloc_icm(dev, &cq->cqn);
307+ err = mlx4_cq_alloc_icm(dev, &cq->cqn, cq->usage);
307308 if (err)
308309 return err;
309310
drivers/net/ethernet/mellanox/mlx4/en_cq.c+1−0
@@ -140,6 +140,7 @@ int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq, · 139 unmodified lines
140140 (cq->type == RX && priv->hwtstamp_config.rx_filter))
141141 timestamp_en = 1;
142142
143+ cq->mcq.usage = MLX4_RES_USAGE_DRIVER;
143144 err = mlx4_cq_alloc(mdev->dev, cq->size, &cq->wqres.mtt,
144145 &mdev->priv_uar, cq->wqres.db.dma, &cq->mcq,
145146 cq->vector, 0, timestamp_en);
drivers/net/ethernet/mellanox/mlx4/en_netdev.c+2−1
@@ -651,7 +651,8 @@ static int mlx4_en_get_qp(struct mlx4_en_priv *priv) · 650 unmodified lines
651651 return 0;
652652 }
653653
654− err = mlx4_qp_reserve_range(dev, 1, 1, qpn, MLX4_RESERVE_A0_QP);
654+ err = mlx4_qp_reserve_range(dev, 1, 1, qpn, MLX4_RESERVE_A0_QP,
655+ MLX4_RES_USAGE_DRIVER);
655656 en_dbg(DRV, priv, "Reserved qp %d\n", *qpn);
656657 if (err) {
657658 en_err(priv, "Failed to reserve qp for mac registration\n");
drivers/net/ethernet/mellanox/mlx4/en_rx.c+4−2
@@ -1081,7 +1081,8 @@ int mlx4_en_create_drop_qp(struct mlx4_en_priv *priv) · 1080 unmodified lines
10811081 u32 qpn;
10821082
10831083 err = mlx4_qp_reserve_range(priv->mdev->dev, 1, 1, &qpn,
1084− MLX4_RESERVE_A0_QP);
1084+ MLX4_RESERVE_A0_QP,
1085+ MLX4_RES_USAGE_DRIVER);
10851086 if (err) {
10861087 en_err(priv, "Failed reserving drop qpn\n");
10871088 return err;
@@ -1127,7 +1128,8 @@ int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv) · 39 unmodified lines
11271128 flags = priv->rx_ring_num == 1 ? MLX4_RESERVE_A0_QP : 0;
11281129 err = mlx4_qp_reserve_range(mdev->dev, priv->rx_ring_num,
11291130 priv->rx_ring_num,
1130− &rss_map->base_qpn, flags);
1131+ &rss_map->base_qpn, flags,
1132+ MLX4_RES_USAGE_DRIVER);
11311133 if (err) {
11321134 en_err(priv, "Failed reserving %d qps\n", priv->rx_ring_num);
11331135 return err;
drivers/net/ethernet/mellanox/mlx4/en_tx.c+2−1
@@ -105,7 +105,8 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, · 104 unmodified lines
105105 (unsigned long long) ring->sp_wqres.buf.direct.map);
106106
107107 err = mlx4_qp_reserve_range(mdev->dev, 1, 1, &ring->qpn,
108− MLX4_RESERVE_ETH_BF_QP);
108+ MLX4_RESERVE_ETH_BF_QP,
109+ MLX4_RES_USAGE_DRIVER);
109110 if (err) {
110111 en_err(priv, "failed reserving qp for TX ring\n");
111112 goto err_hwq_res;
drivers/net/ethernet/mellanox/mlx4/main.c+4−3
@@ -2475,7 +2475,7 @@ static int mlx4_allocate_default_counters(struct mlx4_dev *dev) · 2474 unmodified lines
24752475 priv->def_counter[port] = -1;
24762476
24772477 for (port = 0; port < dev->caps.num_ports; port++) {
2478− err = mlx4_counter_alloc(dev, &idx);
2478+ err = mlx4_counter_alloc(dev, &idx, MLX4_RES_USAGE_DRIVER);
24792479
24802480 if (!err || err == -ENOSPC) {
24812481 priv->def_counter[port] = idx;
@@ -2517,13 +2517,14 @@ int __mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx) · 35 unmodified lines
25172517 return 0;
25182518 }
25192519
2520−int mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx)
2520+int mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx, u8 usage)
25212521 {
2522+ u32 in_modifier = RES_COUNTER | (((u32)usage & 3) << 30);
25222523 u64 out_param;
25232524 int err;
25242525
25252526 if (mlx4_is_mfunc(dev)) {
2526− err = mlx4_cmd_imm(dev, 0, &out_param, RES_COUNTER,
2527+ err = mlx4_cmd_imm(dev, 0, &out_param, in_modifier,
25272528 RES_OP_RESERVE, MLX4_CMD_ALLOC_RES,
25282529 MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
25292530 if (!err)
drivers/net/ethernet/mellanox/mlx4/qp.c+3−2
@@ -245,8 +245,9 @@ int __mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align, · 244 unmodified lines
245245 }
246246
247247 int mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align,
248− int *base, u8 flags)
248+ int *base, u8 flags, u8 usage)
249249 {
250+ u32 in_modifier = RES_QP | (((u32)usage & 3) << 30);
250251 u64 in_param = 0;
251252 u64 out_param;
252253 int err;
@@ -258,7 +259,7 @@ int mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align, · 5 unmodified lines
258259 set_param_l(&in_param, (((u32)flags) << 24) | (u32)cnt);
259260 set_param_h(&in_param, align);
260261 err = mlx4_cmd_imm(dev, in_param, &out_param,
261− RES_QP, RES_OP_RESERVE,
262+ in_modifier, RES_OP_RESERVE,
262263 MLX4_CMD_ALLOC_RES,
263264 MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
264265 if (err)
include/linux/mlx4/device.h+10−2
@@ -428,6 +428,12 @@ enum mlx4_steer_type { · 427 unmodified lines
428428 MLX4_NUM_STEERS
429429 };
430430
431+enum mlx4_resource_usage {
432+ MLX4_RES_USAGE_NONE,
433+ MLX4_RES_USAGE_DRIVER,
434+ MLX4_RES_USAGE_USER_VERBS,
435+};
436+
431437 enum {
432438 MLX4_NUM_FEXCH = 64 * 1024,
433439 };
@@ -748,6 +754,7 @@ struct mlx4_cq { · 314 unmodified lines
748754 } tasklet_ctx;
749755 int reset_notify_added;
750756 struct list_head reset_notify;
757+ u8 usage;
751758 };
752759
753760 struct mlx4_qp {
@@ -757,6 +764,7 @@ struct mlx4_qp { · 3 unmodified lines
757764
758765 atomic_t refcount;
759766 struct completion free;
767+ u8 usage;
760768 };
761769
762770 struct mlx4_srq {
@@ -1120,7 +1128,7 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt, · 357 unmodified lines
11201128 unsigned vector, int collapsed, int timestamp_en);
11211129 void mlx4_cq_free(struct mlx4_dev *dev, struct mlx4_cq *cq);
11221130 int mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align,
1123− int *base, u8 flags);
1131+ int *base, u8 flags, u8 usage);
11241132 void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt);
11251133
11261134 int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp);
@@ -1417,7 +1425,7 @@ int mlx4_get_phys_port_id(struct mlx4_dev *dev); · 290 unmodified lines
14171425 int mlx4_wol_read(struct mlx4_dev *dev, u64 *config, int port);
14181426 int mlx4_wol_write(struct mlx4_dev *dev, u64 config, int port);
14191427
1420−int mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx);
1428+int mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx, u8 usage);
14211429 void mlx4_counter_free(struct mlx4_dev *dev, u32 idx);
14221430 int mlx4_get_default_counter_index(struct mlx4_dev *dev, int port);
14231431

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t