IB/uverbs: Enable QP creation with a given source QP number
authorYishai Hadas <yishaih@mellanox.com>
Thu, 8 Jun 2017 13:15:07 +0000 (16:15 +0300)
committerDoug Ledford <dledford@redhat.com>
Mon, 24 Jul 2017 14:40:46 +0000 (10:40 -0400)
Enable QP creation with a given source QP number, the created QP will
use the source QPN as its wire QP number.

To create such a QP, root privileges (i.e. CAP_NET_RAW) are required
from the user application.

This comes as a pre-patch for downstream patches in this series to
allow user space applications to accelerate traffic which is typically
handled by IPoIB ULP.

Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/uverbs_cmd.c
include/uapi/rdma/ib_user_verbs.h

index 2c98533..60535c7 100644 (file)
@@ -1383,8 +1383,9 @@ static int create_qp(struct ib_uverbs_file *file,
                attr.rwq_ind_tbl = ind_tbl;
        }
 
-       if ((cmd_sz >= offsetof(typeof(*cmd), reserved1) +
-                      sizeof(cmd->reserved1)) && cmd->reserved1) {
+       if (cmd_sz > sizeof(*cmd) &&
+           !ib_is_udata_cleared(ucore, sizeof(*cmd),
+                                cmd_sz - sizeof(*cmd))) {
                ret = -EOPNOTSUPP;
                goto err_put;
        }
@@ -1482,11 +1483,21 @@ static int create_qp(struct ib_uverbs_file *file,
                                IB_QP_CREATE_MANAGED_SEND |
                                IB_QP_CREATE_MANAGED_RECV |
                                IB_QP_CREATE_SCATTER_FCS |
-                               IB_QP_CREATE_CVLAN_STRIPPING)) {
+                               IB_QP_CREATE_CVLAN_STRIPPING |
+                               IB_QP_CREATE_SOURCE_QPN)) {
                ret = -EINVAL;
                goto err_put;
        }
 
+       if (attr.create_flags & IB_QP_CREATE_SOURCE_QPN) {
+               if (!capable(CAP_NET_RAW)) {
+                       ret = -EPERM;
+                       goto err_put;
+               }
+
+               attr.source_qpn = cmd->source_qpn;
+       }
+
        buf = (void *)cmd + sizeof(*cmd);
        if (cmd_sz > sizeof(*cmd))
                if (!(buf[0] == 0 && !memcmp(buf, buf + 1,
index 270c350..63656d2 100644 (file)
@@ -578,7 +578,7 @@ struct ib_uverbs_ex_create_qp {
        __u32 comp_mask;
        __u32 create_flags;
        __u32 rwq_ind_tbl_handle;
-       __u32  reserved1;
+       __u32  source_qpn;
 };
 
 struct ib_uverbs_open_qp {