Commit 2dee0e54 authored by Yishai Hadas's avatar Yishai Hadas Committed by Doug Ledford

IB/uverbs: Enable QP creation with a given source QP number

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: default avatarYishai Hadas <yishaih@mellanox.com>
Reviewed-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 02984cc7
...@@ -1383,8 +1383,9 @@ static int create_qp(struct ib_uverbs_file *file, ...@@ -1383,8 +1383,9 @@ static int create_qp(struct ib_uverbs_file *file,
attr.rwq_ind_tbl = ind_tbl; attr.rwq_ind_tbl = ind_tbl;
} }
if ((cmd_sz >= offsetof(typeof(*cmd), reserved1) + if (cmd_sz > sizeof(*cmd) &&
sizeof(cmd->reserved1)) && cmd->reserved1) { !ib_is_udata_cleared(ucore, sizeof(*cmd),
cmd_sz - sizeof(*cmd))) {
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
goto err_put; goto err_put;
} }
...@@ -1482,11 +1483,21 @@ static int create_qp(struct ib_uverbs_file *file, ...@@ -1482,11 +1483,21 @@ static int create_qp(struct ib_uverbs_file *file,
IB_QP_CREATE_MANAGED_SEND | IB_QP_CREATE_MANAGED_SEND |
IB_QP_CREATE_MANAGED_RECV | IB_QP_CREATE_MANAGED_RECV |
IB_QP_CREATE_SCATTER_FCS | IB_QP_CREATE_SCATTER_FCS |
IB_QP_CREATE_CVLAN_STRIPPING)) { IB_QP_CREATE_CVLAN_STRIPPING |
IB_QP_CREATE_SOURCE_QPN)) {
ret = -EINVAL; ret = -EINVAL;
goto err_put; 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); buf = (void *)cmd + sizeof(*cmd);
if (cmd_sz > sizeof(*cmd)) if (cmd_sz > sizeof(*cmd))
if (!(buf[0] == 0 && !memcmp(buf, buf + 1, if (!(buf[0] == 0 && !memcmp(buf, buf + 1,
......
...@@ -578,7 +578,7 @@ struct ib_uverbs_ex_create_qp { ...@@ -578,7 +578,7 @@ struct ib_uverbs_ex_create_qp {
__u32 comp_mask; __u32 comp_mask;
__u32 create_flags; __u32 create_flags;
__u32 rwq_ind_tbl_handle; __u32 rwq_ind_tbl_handle;
__u32 reserved1; __u32 source_qpn;
}; };
struct ib_uverbs_open_qp { struct ib_uverbs_open_qp {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment