Commit 535005ca authored by Yuval Avnery's avatar Yuval Avnery Committed by Jason Gunthorpe

IB/core: Destroy QP if XRC QP fails

The open-coded variant missed destroy of SELinux created QP, reuse already
existing ib_detroy_qp() call and use this opportunity to clean
ib_create_qp() from double prints and unclear exit paths.
Reported-by: default avatarParav Pandit <parav@mellanox.com>
Fixes: d291f1a6 ("IB/core: Enforce PKey security on QPs")
Signed-off-by: default avatarYuval Avnery <yuvalav@mellanox.com>
Reviewed-by: default avatarParav Pandit <parav@mellanox.com>
Reviewed-by: default avatarDaniel Jurgens <danielj@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent ff0244bb
...@@ -1106,8 +1106,8 @@ struct ib_qp *ib_open_qp(struct ib_xrcd *xrcd, ...@@ -1106,8 +1106,8 @@ struct ib_qp *ib_open_qp(struct ib_xrcd *xrcd,
} }
EXPORT_SYMBOL(ib_open_qp); EXPORT_SYMBOL(ib_open_qp);
static struct ib_qp *ib_create_xrc_qp(struct ib_qp *qp, static struct ib_qp *create_xrc_qp(struct ib_qp *qp,
struct ib_qp_init_attr *qp_init_attr) struct ib_qp_init_attr *qp_init_attr)
{ {
struct ib_qp *real_qp = qp; struct ib_qp *real_qp = qp;
...@@ -1122,10 +1122,10 @@ static struct ib_qp *ib_create_xrc_qp(struct ib_qp *qp, ...@@ -1122,10 +1122,10 @@ static struct ib_qp *ib_create_xrc_qp(struct ib_qp *qp,
qp = __ib_open_qp(real_qp, qp_init_attr->event_handler, qp = __ib_open_qp(real_qp, qp_init_attr->event_handler,
qp_init_attr->qp_context); qp_init_attr->qp_context);
if (!IS_ERR(qp)) if (IS_ERR(qp))
__ib_insert_xrcd_qp(qp_init_attr->xrcd, real_qp); return qp;
else
real_qp->device->ops.destroy_qp(real_qp); __ib_insert_xrcd_qp(qp_init_attr->xrcd, real_qp);
return qp; return qp;
} }
...@@ -1156,10 +1156,8 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, ...@@ -1156,10 +1156,8 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
return qp; return qp;
ret = ib_create_qp_security(qp, device); ret = ib_create_qp_security(qp, device);
if (ret) { if (ret)
ib_destroy_qp(qp); goto err;
return ERR_PTR(ret);
}
qp->real_qp = qp; qp->real_qp = qp;
qp->qp_type = qp_init_attr->qp_type; qp->qp_type = qp_init_attr->qp_type;
...@@ -1172,8 +1170,15 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, ...@@ -1172,8 +1170,15 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
INIT_LIST_HEAD(&qp->sig_mrs); INIT_LIST_HEAD(&qp->sig_mrs);
qp->port = 0; qp->port = 0;
if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
return ib_create_xrc_qp(qp, qp_init_attr); struct ib_qp *xrc_qp = create_xrc_qp(qp, qp_init_attr);
if (IS_ERR(xrc_qp)) {
ret = PTR_ERR(xrc_qp);
goto err;
}
return xrc_qp;
}
qp->event_handler = qp_init_attr->event_handler; qp->event_handler = qp_init_attr->event_handler;
qp->qp_context = qp_init_attr->qp_context; qp->qp_context = qp_init_attr->qp_context;
...@@ -1200,11 +1205,8 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, ...@@ -1200,11 +1205,8 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
if (qp_init_attr->cap.max_rdma_ctxs) { if (qp_init_attr->cap.max_rdma_ctxs) {
ret = rdma_rw_init_mrs(qp, qp_init_attr); ret = rdma_rw_init_mrs(qp, qp_init_attr);
if (ret) { if (ret)
pr_err("failed to init MR pool ret= %d\n", ret); goto err;
ib_destroy_qp(qp);
return ERR_PTR(ret);
}
} }
/* /*
...@@ -1217,6 +1219,11 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd, ...@@ -1217,6 +1219,11 @@ struct ib_qp *ib_create_qp(struct ib_pd *pd,
device->attrs.max_sge_rd); device->attrs.max_sge_rd);
return qp; return qp;
err:
ib_destroy_qp(qp);
return ERR_PTR(ret);
} }
EXPORT_SYMBOL(ib_create_qp); EXPORT_SYMBOL(ib_create_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