IB/core: Use qp->usecnt to track multicast attach/detach
Just as we don't allow PDs, CQs, etc. to be destroyed if there are QPs
that are attached to them, don't let a QP be destroyed if there are
multicast group(s) attached to it. Use the existing usecnt field of
struct ib_qp which was added by commit 0e0ec7e ("RDMA/core: Export
ib_open_qp() to share XRC TGT QPs") to track this.
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
committed by
Roland Dreier
parent
d48b97b403
commit
c3bccbfbb7
@@ -1183,23 +1183,33 @@ EXPORT_SYMBOL(ib_dealloc_fmr);
|
|||||||
|
|
||||||
int ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid)
|
int ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (!qp->device->attach_mcast)
|
if (!qp->device->attach_mcast)
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD)
|
if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return qp->device->attach_mcast(qp, gid, lid);
|
ret = qp->device->attach_mcast(qp, gid, lid);
|
||||||
|
if (!ret)
|
||||||
|
atomic_inc(&qp->usecnt);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ib_attach_mcast);
|
EXPORT_SYMBOL(ib_attach_mcast);
|
||||||
|
|
||||||
int ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid)
|
int ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (!qp->device->detach_mcast)
|
if (!qp->device->detach_mcast)
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD)
|
if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return qp->device->detach_mcast(qp, gid, lid);
|
ret = qp->device->detach_mcast(qp, gid, lid);
|
||||||
|
if (!ret)
|
||||||
|
atomic_dec(&qp->usecnt);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ib_detach_mcast);
|
EXPORT_SYMBOL(ib_detach_mcast);
|
||||||
|
|
||||||
|
|||||||
@@ -964,7 +964,7 @@ struct ib_qp {
|
|||||||
struct ib_srq *srq;
|
struct ib_srq *srq;
|
||||||
struct ib_xrcd *xrcd; /* XRC TGT QPs only */
|
struct ib_xrcd *xrcd; /* XRC TGT QPs only */
|
||||||
struct list_head xrcd_list;
|
struct list_head xrcd_list;
|
||||||
atomic_t usecnt; /* count times opened */
|
atomic_t usecnt; /* count times opened, mcast attaches */
|
||||||
struct list_head open_list;
|
struct list_head open_list;
|
||||||
struct ib_qp *real_qp;
|
struct ib_qp *real_qp;
|
||||||
struct ib_uobject *uobject;
|
struct ib_uobject *uobject;
|
||||||
|
|||||||
Reference in New Issue
Block a user