IB/mlx4: Add support for blocking multicast loopback QP creation user flag
authorEran Ben Elisha <eranbe@mellanox.com>
Thu, 15 Oct 2015 11:44:42 +0000 (14:44 +0300)
committerDoug Ledford <dledford@redhat.com>
Thu, 22 Oct 2015 03:16:47 +0000 (23:16 -0400)
MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK is now supported downstream.

In addition, this flag was supported only for IB_QPT_UD, now, with the
new implementation it is supported for all QP types.

Support IB_USER_VERBS_EX_CMD_CREATE_QP in order to get the flag from
user space using the extension create qp command.

Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx4/qp.c

index 232b104c1d041c1983102b0f026085b55c6b307a..8779d26d1e61f13a44f403c02bb7aab350388199 100644 (file)
@@ -2312,7 +2312,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
 
        ibdev->ib_dev.uverbs_ex_cmd_mask |=
                (1ull << IB_USER_VERBS_EX_CMD_QUERY_DEVICE) |
-               (1ull << IB_USER_VERBS_EX_CMD_CREATE_CQ);
+               (1ull << IB_USER_VERBS_EX_CMD_CREATE_CQ) |
+               (1ull << IB_USER_VERBS_EX_CMD_CREATE_QP);
 
        mlx4_ib_alloc_eqs(dev, ibdev);
 
index 28719494ad6e70765a36126c8d08fc8a25218a59..ba25a1bfa52f67f2b0d4da54a9e67a5db3f83890 100644 (file)
@@ -758,9 +758,6 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
        } else {
                qp->sq_no_prefetch = 0;
 
-               if (init_attr->create_flags & IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK)
-                       qp->flags |= MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK;
-
                if (init_attr->create_flags & IB_QP_CREATE_IPOIB_UD_LSO)
                        qp->flags |= MLX4_IB_QP_LSO;
 
@@ -834,6 +831,9 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
                        goto err_proxy;
        }
 
+       if (init_attr->create_flags & IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK)
+               qp->flags |= MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK;
+
        err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp, gfp);
        if (err)
                goto err_qpn;
@@ -1098,6 +1098,7 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd,
 {
        struct mlx4_ib_qp *qp = NULL;
        int err;
+       int sup_u_create_flags = MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK;
        u16 xrcdn = 0;
        gfp_t gfp;
 
@@ -1121,8 +1122,10 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd,
        }
 
        if (init_attr->create_flags &&
-           (udata ||
-            ((init_attr->create_flags & ~(MLX4_IB_SRIOV_SQP | MLX4_IB_QP_CREATE_USE_GFP_NOIO)) &&
+           ((udata && init_attr->create_flags & ~(sup_u_create_flags)) ||
+            ((init_attr->create_flags & ~(MLX4_IB_SRIOV_SQP |
+                                          MLX4_IB_QP_CREATE_USE_GFP_NOIO |
+                                          MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK)) &&
              init_attr->qp_type != IB_QPT_UD) ||
             ((init_attr->create_flags & MLX4_IB_SRIOV_SQP) &&
              init_attr->qp_type > IB_QPT_GSI)))