On Wed, Sep 08, 2021 at 01:43:28PM +0200, Christoph Lameter wrote: > 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, > true); > } > } > } 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 <cl@xxxxxxxxx> I added the missing fixes line: Fixes: ab15c95a17b3 ("IB/core: Support for CMA multicast join flags") Applied to for-rc, thanks Jason