Additional 4.5-rc6 fixes
- One fix to an error path in the core - One fix for RoCE in the core - Two related fixes for the core/mlx5 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJW2F4JAAoJELgmozMOVy/dDMkP/A2yE2fzBvle4Tbx6d68Z6BE i/HqiYCh37Bbxv4dy57S95VM+3Snjk0MrwvvyxLegL2P5kpCBK2fX9hb+TcBMr19 BXPt8NgTjtoWbcYL55VoMVo0QLGUKy4H9H8R40ajtoRnUYGceZnwiGOVvtm2SsfP Ua6YbN4E1OK8ZlAzJWRPdlOWJ/rCq9yIa/0HkDhCI0gbxDbwJwae8OnVzgmK7WT6 TxpG/ewfK2Nwo9GpAJq7Zemb96qnRzZCTP9EcAb/QA3CYLUTZbr57uFqzZfF8t8g UVv1mlmnwDjbz+HZQfOxwIvpoD1xVUY2qAmrRxGWrwSNH/Peib++LcTaAxXWo/AP lH9P9ZHFqdy4E7QmmchU0Pi2KV9jsT+ISIL2fqPrt4e3FKxbpEheDd9vPwwdLMUW co2o0cmYRf9VLQSa67mG8GO7+Wjyk63e0TLxVbCK+JBv8XXuhwyeGo+Sfdodelk+ qeU+vsOpjbx9+YiPUhu4HcOvL5KqjZzas/PJpvAYzW6/UDVOeKwj2f+3Im8LdTu8 Zxdz7Q/0epagAramMD5f5v3QZeDKCQvHUnCGbZT3/Mj4tYTj4pUCTKfsNaTvMXKh vXj8MiJH8wwL3VE/2ddZqQqcf0PQUJQQgDsJ5/rH4Rkuq6wQ4/1je+34simGWATp la6CHiqauSdqiBDMEUJq =e9oB -----END PGP SIGNATURE----- Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma Pull rdma fixes from Doug Ledford: "Additional 4.5-rc6 fixes. I have four patches today. I had previously thought I had submitted two of them last week, but they were accidentally skipped :-(. - One fix to an error path in the core - One fix for RoCE in the core - Two related fixes for the core/mlx5" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: IB/core: Use GRH when the path hop-limit > 0 IB/{core, mlx5}: Fix input len in vendor part of create_qp/srq IB/mlx5: Avoid using user-index for SRQs IB/core: Fix missed clean call in registration path
This commit is contained in:
commit
bdf9d29799
|
@ -358,6 +358,7 @@ int ib_register_device(struct ib_device *device,
|
||||||
ret = device->query_device(device, &device->attrs, &uhw);
|
ret = device->query_device(device, &device->attrs, &uhw);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk(KERN_WARNING "Couldn't query the device attributes\n");
|
printk(KERN_WARNING "Couldn't query the device attributes\n");
|
||||||
|
ib_cache_cleanup_one(device);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1071,7 +1071,7 @@ int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rec->hop_limit > 1 || use_roce) {
|
if (rec->hop_limit > 0 || use_roce) {
|
||||||
ah_attr->ah_flags = IB_AH_GRH;
|
ah_attr->ah_flags = IB_AH_GRH;
|
||||||
ah_attr->grh.dgid = rec->dgid;
|
ah_attr->grh.dgid = rec->dgid;
|
||||||
|
|
||||||
|
|
|
@ -1970,7 +1970,8 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
|
||||||
resp_size);
|
resp_size);
|
||||||
INIT_UDATA(&uhw, buf + sizeof(cmd),
|
INIT_UDATA(&uhw, buf + sizeof(cmd),
|
||||||
(unsigned long)cmd.response + resp_size,
|
(unsigned long)cmd.response + resp_size,
|
||||||
in_len - sizeof(cmd), out_len - resp_size);
|
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||||
|
out_len - resp_size);
|
||||||
|
|
||||||
memset(&cmd_ex, 0, sizeof(cmd_ex));
|
memset(&cmd_ex, 0, sizeof(cmd_ex));
|
||||||
cmd_ex.user_handle = cmd.user_handle;
|
cmd_ex.user_handle = cmd.user_handle;
|
||||||
|
@ -3413,7 +3414,8 @@ ssize_t ib_uverbs_create_srq(struct ib_uverbs_file *file,
|
||||||
|
|
||||||
INIT_UDATA(&udata, buf + sizeof cmd,
|
INIT_UDATA(&udata, buf + sizeof cmd,
|
||||||
(unsigned long) cmd.response + sizeof resp,
|
(unsigned long) cmd.response + sizeof resp,
|
||||||
in_len - sizeof cmd, out_len - sizeof resp);
|
in_len - sizeof cmd - sizeof(struct ib_uverbs_cmd_hdr),
|
||||||
|
out_len - sizeof resp);
|
||||||
|
|
||||||
ret = __uverbs_create_xsrq(file, ib_dev, &xcmd, &udata);
|
ret = __uverbs_create_xsrq(file, ib_dev, &xcmd, &udata);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -3439,7 +3441,8 @@ ssize_t ib_uverbs_create_xsrq(struct ib_uverbs_file *file,
|
||||||
|
|
||||||
INIT_UDATA(&udata, buf + sizeof cmd,
|
INIT_UDATA(&udata, buf + sizeof cmd,
|
||||||
(unsigned long) cmd.response + sizeof resp,
|
(unsigned long) cmd.response + sizeof resp,
|
||||||
in_len - sizeof cmd, out_len - sizeof resp);
|
in_len - sizeof cmd - sizeof(struct ib_uverbs_cmd_hdr),
|
||||||
|
out_len - sizeof resp);
|
||||||
|
|
||||||
ret = __uverbs_create_xsrq(file, ib_dev, &cmd, &udata);
|
ret = __uverbs_create_xsrq(file, ib_dev, &cmd, &udata);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -75,7 +75,8 @@ static void mlx5_ib_srq_event(struct mlx5_core_srq *srq, enum mlx5_event type)
|
||||||
|
|
||||||
static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
|
static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
|
||||||
struct mlx5_create_srq_mbox_in **in,
|
struct mlx5_create_srq_mbox_in **in,
|
||||||
struct ib_udata *udata, int buf_size, int *inlen)
|
struct ib_udata *udata, int buf_size, int *inlen,
|
||||||
|
int is_xrc)
|
||||||
{
|
{
|
||||||
struct mlx5_ib_dev *dev = to_mdev(pd->device);
|
struct mlx5_ib_dev *dev = to_mdev(pd->device);
|
||||||
struct mlx5_ib_create_srq ucmd = {};
|
struct mlx5_ib_create_srq ucmd = {};
|
||||||
|
@ -87,13 +88,8 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
|
||||||
int ncont;
|
int ncont;
|
||||||
u32 offset;
|
u32 offset;
|
||||||
u32 uidx = MLX5_IB_DEFAULT_UIDX;
|
u32 uidx = MLX5_IB_DEFAULT_UIDX;
|
||||||
int drv_data = udata->inlen - sizeof(struct ib_uverbs_cmd_hdr);
|
|
||||||
|
|
||||||
if (drv_data < 0)
|
ucmdlen = min(udata->inlen, sizeof(ucmd));
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
ucmdlen = (drv_data < sizeof(ucmd)) ?
|
|
||||||
drv_data : sizeof(ucmd);
|
|
||||||
|
|
||||||
if (ib_copy_from_udata(&ucmd, udata, ucmdlen)) {
|
if (ib_copy_from_udata(&ucmd, udata, ucmdlen)) {
|
||||||
mlx5_ib_dbg(dev, "failed copy udata\n");
|
mlx5_ib_dbg(dev, "failed copy udata\n");
|
||||||
|
@ -103,15 +99,17 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
|
||||||
if (ucmd.reserved0 || ucmd.reserved1)
|
if (ucmd.reserved0 || ucmd.reserved1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (drv_data > sizeof(ucmd) &&
|
if (udata->inlen > sizeof(ucmd) &&
|
||||||
!ib_is_udata_cleared(udata, sizeof(ucmd),
|
!ib_is_udata_cleared(udata, sizeof(ucmd),
|
||||||
drv_data - sizeof(ucmd)))
|
udata->inlen - sizeof(ucmd)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
err = get_srq_user_index(to_mucontext(pd->uobject->context),
|
if (is_xrc) {
|
||||||
&ucmd, udata->inlen, &uidx);
|
err = get_srq_user_index(to_mucontext(pd->uobject->context),
|
||||||
if (err)
|
&ucmd, udata->inlen, &uidx);
|
||||||
return err;
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE);
|
srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE);
|
||||||
|
|
||||||
|
@ -151,7 +149,8 @@ static int create_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq,
|
||||||
(*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
|
(*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
|
||||||
(*in)->ctx.pgoff_cqn = cpu_to_be32(offset << 26);
|
(*in)->ctx.pgoff_cqn = cpu_to_be32(offset << 26);
|
||||||
|
|
||||||
if (MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) {
|
if ((MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) &&
|
||||||
|
is_xrc){
|
||||||
xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
|
xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
|
||||||
xrc_srq_context_entry);
|
xrc_srq_context_entry);
|
||||||
MLX5_SET(xrc_srqc, xsrqc, user_index, uidx);
|
MLX5_SET(xrc_srqc, xsrqc, user_index, uidx);
|
||||||
|
@ -170,7 +169,7 @@ err_umem:
|
||||||
|
|
||||||
static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
|
static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
|
||||||
struct mlx5_create_srq_mbox_in **in, int buf_size,
|
struct mlx5_create_srq_mbox_in **in, int buf_size,
|
||||||
int *inlen)
|
int *inlen, int is_xrc)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
int i;
|
int i;
|
||||||
|
@ -224,7 +223,8 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
|
||||||
|
|
||||||
(*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
|
(*in)->ctx.log_pg_sz = page_shift - MLX5_ADAPTER_PAGE_SHIFT;
|
||||||
|
|
||||||
if (MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) {
|
if ((MLX5_CAP_GEN(dev->mdev, cqe_version) == MLX5_CQE_VERSION_V1) &&
|
||||||
|
is_xrc){
|
||||||
xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
|
xsrqc = MLX5_ADDR_OF(create_xrc_srq_in, *in,
|
||||||
xrc_srq_context_entry);
|
xrc_srq_context_entry);
|
||||||
/* 0xffffff means we ask to work with cqe version 0 */
|
/* 0xffffff means we ask to work with cqe version 0 */
|
||||||
|
@ -302,10 +302,14 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
|
||||||
desc_size, init_attr->attr.max_wr, srq->msrq.max, srq->msrq.max_gs,
|
desc_size, init_attr->attr.max_wr, srq->msrq.max, srq->msrq.max_gs,
|
||||||
srq->msrq.max_avail_gather);
|
srq->msrq.max_avail_gather);
|
||||||
|
|
||||||
|
is_xrc = (init_attr->srq_type == IB_SRQT_XRC);
|
||||||
|
|
||||||
if (pd->uobject)
|
if (pd->uobject)
|
||||||
err = create_srq_user(pd, srq, &in, udata, buf_size, &inlen);
|
err = create_srq_user(pd, srq, &in, udata, buf_size, &inlen,
|
||||||
|
is_xrc);
|
||||||
else
|
else
|
||||||
err = create_srq_kernel(dev, srq, &in, buf_size, &inlen);
|
err = create_srq_kernel(dev, srq, &in, buf_size, &inlen,
|
||||||
|
is_xrc);
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
mlx5_ib_warn(dev, "create srq %s failed, err %d\n",
|
mlx5_ib_warn(dev, "create srq %s failed, err %d\n",
|
||||||
|
@ -313,7 +317,6 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
|
||||||
goto err_srq;
|
goto err_srq;
|
||||||
}
|
}
|
||||||
|
|
||||||
is_xrc = (init_attr->srq_type == IB_SRQT_XRC);
|
|
||||||
in->ctx.state_log_sz = ilog2(srq->msrq.max);
|
in->ctx.state_log_sz = ilog2(srq->msrq.max);
|
||||||
flgs = ((srq->msrq.wqe_shift - 4) | (is_xrc << 5) | (srq->wq_sig << 7)) << 24;
|
flgs = ((srq->msrq.wqe_shift - 4) | (is_xrc << 5) | (srq->wq_sig << 7)) << 24;
|
||||||
xrcdn = 0;
|
xrcdn = 0;
|
||||||
|
|
Loading…
Reference in a new issue