History

RDMA/mlx5: Allow creating RAW ethernet QP with loopback support

Expose two new flags: MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC Those flags can be used at creation time in order to allow a QP to be able to receive loopback traffic (unicast and multicast). We store the state in the QP to be used on the destroy path to indicate with which flags the QP was created with.

Mark Bloch committed 8 years ago

Commit 175edba1 parent a560f1d3 files · +52 −14Browse files

Unified · Split

3 files
  1. drivers/infiniband/hw/mlx5/mlx5_ib.h +1 −1
  2. drivers/infiniband/hw/mlx5/qp.c +49 −13
  3. include/uapi/rdma/mlx5-abi.h +2 −0
drivers/infiniband/hw/mlx5/mlx5_ib.h+1−1
@@ -428,7 +428,7 @@ struct mlx5_ib_qp { · 427 unmodified lines
428428 struct list_head cq_send_list;
429429 struct mlx5_rate_limit rl;
430430 u32 underlay_qpn;
431− bool tunnel_offload_en;
431+ u32 flags_en;
432432 /* storage for qp sub type when core qp type is IB_QPT_DRIVER */
433433 enum ib_qp_type qp_sub_type;
434434 };
drivers/infiniband/hw/mlx5/qp.c+49−13
@@ -1258,8 +1258,9 @@ static bool tunnel_offload_supported(struct mlx5_core_dev *dev) · 1257 unmodified lines
12581258
12591259 static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
12601260 struct mlx5_ib_rq *rq, u32 tdn,
1261− bool tunnel_offload_en)
1261+ u32 *qp_flags_en)
12621262 {
1263+ u8 lb_flag = 0;
12631264 u32 *in;
12641265 void *tirc;
12651266 int inlen;
@@ -1274,12 +1275,21 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev, · 8 unmodified lines
12741275 MLX5_SET(tirc, tirc, disp_type, MLX5_TIRC_DISP_TYPE_DIRECT);
12751276 MLX5_SET(tirc, tirc, inline_rqn, rq->base.mqp.qpn);
12761277 MLX5_SET(tirc, tirc, transport_domain, tdn);
1277− if (tunnel_offload_en)
1278+ if (*qp_flags_en & MLX5_QP_FLAG_TUNNEL_OFFLOADS)
12781279 MLX5_SET(tirc, tirc, tunneled_offload_en, 1);
12791280
1280− if (dev->rep)
1281− MLX5_SET(tirc, tirc, self_lb_block,
1282− MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);
1281+ if (*qp_flags_en & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC)
1282+ lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST;
1283+
1284+ if (*qp_flags_en & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC)
1285+ lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST;
1286+
1287+ if (dev->rep) {
1288+ lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST;
1289+ *qp_flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC;
1290+ }
1291+
1292+ MLX5_SET(tirc, tirc, self_lb_block, lb_flag);
12831293
12841294 err = mlx5_core_create_tir(dev->mdev, in, inlen, &rq->tirn);
12851295
@@ -1332,8 +1342,7 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 46 unmodified lines
13321342 goto err_destroy_sq;
13331343
13341344
1335− err = create_raw_packet_qp_tir(dev, rq, tdn,
1336− qp->tunnel_offload_en);
1345+ err = create_raw_packet_qp_tir(dev, rq, tdn, &qp->flags_en);
13371346 if (err)
13381347 goto err_destroy_rq;
13391348 }
@@ -1410,6 +1419,7 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 70 unmodified lines
14101419 u32 tdn = mucontext->tdn;
14111420 struct mlx5_ib_create_qp_rss ucmd = {};
14121421 size_t required_cmd_sz;
1422+ u8 lb_flag = 0;
14131423
14141424 if (init_attr->qp_type != IB_QPT_RAW_PACKET)
14151425 return -EOPNOTSUPP;
@@ -1444,7 +1454,9 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 28 unmodified lines
14441454 return -EOPNOTSUPP;
14451455 }
14461456
1447− if (ucmd.flags & ~MLX5_QP_FLAG_TUNNEL_OFFLOADS) {
1457+ if (ucmd.flags & ~(MLX5_QP_FLAG_TUNNEL_OFFLOADS |
1458+ MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC |
1459+ MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC)) {
14481460 mlx5_ib_dbg(dev, "invalid flags\n");
14491461 return -EOPNOTSUPP;
14501462 }
@@ -1461,6 +1473,16 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 10 unmodified lines
14611473 return -EOPNOTSUPP;
14621474 }
14631475
1476+ if (ucmd.flags & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC || dev->rep) {
1477+ lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST;
1478+ qp->flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC;
1479+ }
1480+
1481+ if (ucmd.flags & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC) {
1482+ lb_flag |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST;
1483+ qp->flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC;
1484+ }
1485+
14641486 err = ib_copy_to_udata(udata, &resp, min(udata->outlen, sizeof(resp)));
14651487 if (err) {
14661488 mlx5_ib_dbg(dev, "copy failed\n");
@@ -1484,6 +1506,8 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 17 unmodified lines
14841506 if (ucmd.flags & MLX5_QP_FLAG_TUNNEL_OFFLOADS)
14851507 MLX5_SET(tirc, tirc, tunneled_offload_en, 1);
14861508
1509+ MLX5_SET(tirc, tirc, self_lb_block, lb_flag);
1510+
14871511 if (ucmd.rx_hash_fields_mask & MLX5_RX_HASH_INNER)
14881512 hfso = MLX5_ADDR_OF(tirc, tirc, rx_hash_field_selector_inner);
14891513 else
@@ -1580,10 +1604,6 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, · 90 unmodified lines
15801604 MLX5_SET(rx_hash_field_select, hfso, selected_fields, selected_fields);
15811605
15821606 create_tir:
1583− if (dev->rep)
1584− MLX5_SET(tirc, tirc, self_lb_block,
1585− MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);
1586−
15871607 err = mlx5_core_create_tir(dev->mdev, in, inlen, &qp->rss_qp.tirn);
15881608
15891609 if (err)
@@ -1710,7 +1730,23 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, · 120 unmodified lines
17101730 mlx5_ib_dbg(dev, "Tunnel offload isn't supported\n");
17111731 return -EOPNOTSUPP;
17121732 }
1713− qp->tunnel_offload_en = true;
1733+ qp->flags_en |= MLX5_QP_FLAG_TUNNEL_OFFLOADS;
1734+ }
1735+
1736+ if (ucmd.flags & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC) {
1737+ if (init_attr->qp_type != IB_QPT_RAW_PACKET) {
1738+ mlx5_ib_dbg(dev, "Self-LB UC isn't supported\n");
1739+ return -EOPNOTSUPP;
1740+ }
1741+ qp->flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC;
1742+ }
1743+
1744+ if (ucmd.flags & MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC) {
1745+ if (init_attr->qp_type != IB_QPT_RAW_PACKET) {
1746+ mlx5_ib_dbg(dev, "Self-LB UM isn't supported\n");
1747+ return -EOPNOTSUPP;
1748+ }
1749+ qp->flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC;
17141750 }
17151751
17161752 if (init_attr->create_flags & IB_QP_CREATE_SOURCE_QPN) {
include/uapi/rdma/mlx5-abi.h+2−0
@@ -45,6 +45,8 @@ enum { · 44 unmodified lines
4545 MLX5_QP_FLAG_BFREG_INDEX = 1 << 3,
4646 MLX5_QP_FLAG_TYPE_DCT = 1 << 4,
4747 MLX5_QP_FLAG_TYPE_DCI = 1 << 5,
48+ MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC = 1 << 6,
49+ MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC = 1 << 7,
4850 };
4951
5052 enum {

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