Commit c3852ab0 authored by Doug Ledford's avatar Doug Ledford

IB/ipoib: Make sendonly multicast joins create the mcast group

Since IPoIB should, as much as possible, emulate how multicast
sends work on Ethernet for regular TCP/IP apps, there should be
no requirement to subscribe to a multicast group before your
sends are properly sent.  However, due to the difference in how
multicast is handled on InfiniBand, we must join the appropriate
multicast group before we can send to it.  Previously we tried
not to trigger the auto-create feature of the subnet manager when
doing this because we didn't have tracking of these sendonly
groups and the auto-creation might never get undone.  The previous
patch added timing to these sendonly joins and allows us to
leave them after a reasonable idle expiration time.  So supply
all of the information needed to auto-create group.
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent bd99b2e0
...@@ -508,17 +508,19 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast) ...@@ -508,17 +508,19 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast)
rec.hop_limit = priv->broadcast->mcmember.hop_limit; rec.hop_limit = priv->broadcast->mcmember.hop_limit;
/* /*
* Historically Linux IPoIB has never properly supported SEND * Send-only IB Multicast joins do not work at the core
* ONLY join. It emulated it by not providing all the required * IB layer yet, so we can't use them here. However,
* attributes, which is enough to prevent group creation and * we are emulating an Ethernet multicast send, which
* detect if there are full members or not. A major problem * does not require a multicast subscription and will
* with supporting SEND ONLY is detecting when the group is * still send properly. The most appropriate thing to
* auto-destroyed as IPoIB will cache the MLID.. * do is to create the group if it doesn't exist as that
* most closely emulates the behavior, from a user space
* application perspecitive, of Ethernet multicast
* operation. For now, we do a full join, maybe later
* when the core IB layers support send only joins we
* will use them.
*/ */
#if 1 #if 0
if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
comp_mask &= ~IB_SA_MCMEMBER_REC_TRAFFIC_CLASS;
#else
if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
rec.join_state = 4; rec.join_state = 4;
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment