summaryrefslogtreecommitdiffstats
path: root/src/net/infiniband
diff options
context:
space:
mode:
authorMichael Brown2016-03-05 16:33:28 +0100
committerMichael Brown2016-03-08 13:23:30 +0100
commitc335f8eae4e23f1f69418dfd1b2ec442e3c1a70a (patch)
tree21ac2142daf32fa36521c4ee62b3496aed8b7445 /src/net/infiniband
parent[infiniband] Do not use GRH for local paths (diff)
downloadipxe-c335f8eae4e23f1f69418dfd1b2ec442e3c1a70a.tar.gz
ipxe-c335f8eae4e23f1f69418dfd1b2ec442e3c1a70a.tar.xz
ipxe-c335f8eae4e23f1f69418dfd1b2ec442e3c1a70a.zip
[infiniband] Record multicast GID attachment as part of group membership
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/infiniband')
-rw-r--r--src/net/infiniband/ib_mcast.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/net/infiniband/ib_mcast.c b/src/net/infiniband/ib_mcast.c
index b7a6e8ce..3a055908 100644
--- a/src/net/infiniband/ib_mcast.c
+++ b/src/net/infiniband/ib_mcast.c
@@ -150,8 +150,9 @@ int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp,
DBGC ( ibdev, "IBDEV %s QPN %#lx joining " IB_GID_FMT "\n",
ibdev->name, qp->qpn, IB_GID_ARGS ( gid ) );
- /* Sanity check */
+ /* Sanity checks */
assert ( qp != NULL );
+ assert ( ! membership->attached );
/* Initialise structure */
membership->qp = qp;
@@ -164,6 +165,7 @@ int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp,
ibdev->name, qp->qpn, strerror ( rc ) );
goto err_mcast_attach;
}
+ membership->attached = 1;
/* Initiate multicast membership join */
ib_mcast_mad ( ibdev, gid, 1, &mad );
@@ -182,6 +184,7 @@ int ib_mcast_join ( struct ib_device *ibdev, struct ib_queue_pair *qp,
ib_destroy_madx ( ibdev, ibdev->gsi, membership->madx );
err_create_madx:
ib_mcast_detach ( ibdev, qp, gid );
+ membership->attached = 0;
err_mcast_attach:
return rc;
}
@@ -199,6 +202,10 @@ void ib_mcast_leave ( struct ib_device *ibdev, struct ib_queue_pair *qp,
union ib_mad mad;
int rc;
+ /* Do nothing if we are already detached from the multicast GID */
+ if ( ! membership->attached )
+ return;
+
DBGC ( ibdev, "IBDEV %s QPN %#lx leaving " IB_GID_FMT "\n",
ibdev->name, qp->qpn, IB_GID_ARGS ( gid ) );
@@ -207,6 +214,7 @@ void ib_mcast_leave ( struct ib_device *ibdev, struct ib_queue_pair *qp,
/* Detach from multicast GID */
ib_mcast_detach ( ibdev, qp, &membership->gid );
+ membership->attached = 0;
/* Cancel multicast membership join, if applicable */
if ( membership->madx ) {