archive mirror
 help / color / mirror / Atom feed
* [PATCH][FIX] ROCE Multicast: Do not send IGMP leaves for sendonly Multicast groups
@ 2021-09-08 11:43 Christoph Lameter
  2021-09-13 10:38 ` Leon Romanovsky
  2021-09-14 18:57 ` Jason Gunthorpe
  0 siblings, 2 replies; 5+ messages in thread
From: Christoph Lameter @ 2021-09-08 11:43 UTC (permalink / raw)
  To: linux-rdma; +Cc: Leon Romanovsky

ROCE uses IGMP for Multicast instead of the native Infiniband system where
joins are required in order to post messages on the Multicast group.
On Ethernet one can send Multicast messages to arbitrary addresses
without the need to subscribe to a group.

So ROCE correctly does not send IGMP joins during rdma_join_multicast().

F.e. in cma_iboe_join_multicast() we see:

   if (addr->sa_family == AF_INET) {
                if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) {
                        ib.rec.hop_limit = IPV6_DEFAULT_HOPLIMIT;
                        if (!send_only) {
                                err = cma_igmp_send(ndev, &ib.rec.mgid,
        } else {

So the IGMP join is suppressed as it is unnecessary.

However no such check is done in destroy_mc(). And therefore leaving a
sendonly multicast group will send an IGMP leave.

This means that the following scenario can lead to a multicast receiver
unexpectedly being unsubscribed from a MC group:

1. Sender thread does a sendonly join on MC group X. No IGMP join
   is sent.

2. Receiver thread does a regular join on the same MC Group x.
   IGMP join is sent and the receiver begins to get messages.

3. Sender thread terminates and destroys MC group X.
   IGMP leave is sent and the receiver no longer receives data.

This patch adds the same logic for sendonly joins to destroy_mc()
that is also used in cma_iboe_join_multicast().

Signed-off-by: Christoph Lameter <>

Index: linux/drivers/infiniband/core/cma.c
--- linux.orig/drivers/infiniband/core/cma.c	2021-09-08 12:59:51.602754272 +0200
+++ linux/drivers/infiniband/core/cma.c	2021-09-08 13:05:20.269838488 +0200
@@ -1810,6 +1810,8 @@ static void cma_release_port(struct rdma
 static void destroy_mc(struct rdma_id_private *id_priv,
 		       struct cma_multicast *mc)
+	bool send_only = mc->join_state == BIT(SENDONLY_FULLMEMBER_JOIN);
 	if (rdma_cap_ib_mcast(id_priv->id.device, id_priv->id.port_num))

@@ -1826,7 +1828,10 @@ static void destroy_mc(struct rdma_id_pr

 			cma_set_mgid(id_priv, (struct sockaddr *)&mc->addr,
-			cma_igmp_send(ndev, &mgid, false);
+			if (!send_only)
+				cma_igmp_send(ndev, &mgid, false);

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-09-15 19:44 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-08 11:43 [PATCH][FIX] ROCE Multicast: Do not send IGMP leaves for sendonly Multicast groups Christoph Lameter
2021-09-13 10:38 ` Leon Romanovsky
2021-09-14 18:38   ` Jason Gunthorpe
2021-09-15 19:44   ` Christoph Lameter
2021-09-14 18:57 ` Jason Gunthorpe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).