diff options
author | Eli Cohen <eli@dev.mellanox.co.il> | 2008-04-17 00:09:35 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2008-04-17 00:09:35 -0400 |
commit | 4dc51b32582d45cb7e8322d750ffe0e6d82b506d (patch) | |
tree | 0d8549a6cc82b9719086a2673c76de8cd5b161e9 /drivers/net/mlx4/mcg.c | |
parent | c83b5b1cb2b050c7a9054f330598df99c31abb98 (diff) |
IB/mlx4: Fix race when detaching a QP from a multicast group
When detaching the last QP from an MCG entry, we need to make
sure that at any time, there will be no entry with zero number of
QPs which is linked to the list of the MCGs of the corresponding
hash index. So don't write back the MCG entry if we are removing the
last QP; just unlink the entry.
Also, remove an unnecessary MCG read when attaching a QP requires
allocation of a new entry in the AMGM.
Signed-off-by: Eli Cohen <eli@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/net/mlx4/mcg.c')
-rw-r--r-- | drivers/net/mlx4/mcg.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/drivers/net/mlx4/mcg.c b/drivers/net/mlx4/mcg.c index a99e7729d333..57f7f1f0d4ec 100644 --- a/drivers/net/mlx4/mcg.c +++ b/drivers/net/mlx4/mcg.c | |||
@@ -190,10 +190,6 @@ int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]) | |||
190 | } | 190 | } |
191 | index += dev->caps.num_mgms; | 191 | index += dev->caps.num_mgms; |
192 | 192 | ||
193 | err = mlx4_READ_MCG(dev, index, mailbox); | ||
194 | if (err) | ||
195 | goto out; | ||
196 | |||
197 | memset(mgm, 0, sizeof *mgm); | 193 | memset(mgm, 0, sizeof *mgm); |
198 | memcpy(mgm->gid, gid, 16); | 194 | memcpy(mgm->gid, gid, 16); |
199 | } | 195 | } |
@@ -301,12 +297,10 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]) | |||
301 | mgm->qp[loc] = mgm->qp[i - 1]; | 297 | mgm->qp[loc] = mgm->qp[i - 1]; |
302 | mgm->qp[i - 1] = 0; | 298 | mgm->qp[i - 1] = 0; |
303 | 299 | ||
304 | err = mlx4_WRITE_MCG(dev, index, mailbox); | 300 | if (i != 1) { |
305 | if (err) | 301 | err = mlx4_WRITE_MCG(dev, index, mailbox); |
306 | goto out; | ||
307 | |||
308 | if (i != 1) | ||
309 | goto out; | 302 | goto out; |
303 | } | ||
310 | 304 | ||
311 | if (prev == -1) { | 305 | if (prev == -1) { |
312 | /* Remove entry from MGM */ | 306 | /* Remove entry from MGM */ |