diff options
author | Or Gerlitz <ogerlitz@mellanox.com> | 2012-04-29 17:04:22 +0300 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2012-05-08 11:16:54 -0700 |
commit | c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1 (patch) | |
tree | f1802d86a4db8c263e6960c401c4f29be3f68b0a /drivers/infiniband | |
parent | d48b97b403d23f6df0b990cee652bdf9a52337a3 (diff) | |
download | linux-stable-c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1.tar.gz linux-stable-c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1.tar.bz2 linux-stable-c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1.zip |
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>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/verbs.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 575b78045aaf..c5b94d647e1e 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -1183,23 +1183,33 @@ EXPORT_SYMBOL(ib_dealloc_fmr); int ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) { + int ret; + if (!qp->device->attach_mcast) return -ENOSYS; if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD) 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); int ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) { + int ret; + if (!qp->device->detach_mcast) return -ENOSYS; if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD) 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); |