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: 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>
This commit is contained in:
parent
02984cc7b3
commit
2dee0e5458
|
@ -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,
|
||||||
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 {
|
||||||
__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 {
|
||||||
|
|
Loading…
Reference in New Issue