summaryrefslogtreecommitdiff
path: root/drivers/infiniband/hw/ipath/ipath_verbs_mcast.c
diff options
context:
space:
mode:
authorBryan O'Sullivan <bos@pathscale.com>2006-08-25 11:24:27 -0700
committerRoland Dreier <rolandd@cisco.com>2006-09-22 15:22:27 -0700
commitc27fef26271d352b5546c33239edeb0dcb4fc0cc (patch)
tree3dc284784c4218c80d7806c05324be1599d6c6c6 /drivers/infiniband/hw/ipath/ipath_verbs_mcast.c
parenteb9dc6f48dc7537ce53163109625bd992150e0cf (diff)
downloadlwn-c27fef26271d352b5546c33239edeb0dcb4fc0cc.tar.gz
lwn-c27fef26271d352b5546c33239edeb0dcb4fc0cc.zip
IB/ipath: lock resource limit counters correctly
Signed-off-by: Bryan O'Sullivan <bryan.osullivan@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw/ipath/ipath_verbs_mcast.c')
-rw-r--r--drivers/infiniband/hw/ipath/ipath_verbs_mcast.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs_mcast.c b/drivers/infiniband/hw/ipath/ipath_verbs_mcast.c
index ee0e1d96d723..cb35679e4a18 100644
--- a/drivers/infiniband/hw/ipath/ipath_verbs_mcast.c
+++ b/drivers/infiniband/hw/ipath/ipath_verbs_mcast.c
@@ -207,12 +207,15 @@ static int ipath_mcast_add(struct ipath_ibdev *dev,
goto bail;
}
+ spin_lock(&dev->n_mcast_grps_lock);
if (dev->n_mcast_grps_allocated == ib_ipath_max_mcast_grps) {
+ spin_unlock(&dev->n_mcast_grps_lock);
ret = ENOMEM;
goto bail;
}
dev->n_mcast_grps_allocated++;
+ spin_unlock(&dev->n_mcast_grps_lock);
list_add_tail_rcu(&mqp->list, &mcast->qp_list);
@@ -343,7 +346,9 @@ int ipath_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
atomic_dec(&mcast->refcount);
wait_event(mcast->wait, !atomic_read(&mcast->refcount));
ipath_mcast_free(mcast);
+ spin_lock(&dev->n_mcast_grps_lock);
dev->n_mcast_grps_allocated--;
+ spin_unlock(&dev->n_mcast_grps_lock);
}
ret = 0;