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: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Родитель
bd99b2e05c
Коммит
c3852ab0e6
|
@ -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;
|
||||
|
||||
/*
|
||||
* Historically Linux IPoIB has never properly supported SEND
|
||||
* ONLY join. It emulated it by not providing all the required
|
||||
* attributes, which is enough to prevent group creation and
|
||||
* detect if there are full members or not. A major problem
|
||||
* with supporting SEND ONLY is detecting when the group is
|
||||
* auto-destroyed as IPoIB will cache the MLID..
|
||||
* Send-only IB Multicast joins do not work at the core
|
||||
* IB layer yet, so we can't use them here. However,
|
||||
* we are emulating an Ethernet multicast send, which
|
||||
* does not require a multicast subscription and will
|
||||
* still send properly. The most appropriate thing to
|
||||
* 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 (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
|
||||
comp_mask &= ~IB_SA_MCMEMBER_REC_TRAFFIC_CLASS;
|
||||
#else
|
||||
#if 0
|
||||
if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
|
||||
rec.join_state = 4;
|
||||
#endif
|
||||
|
|
Загрузка…
Ссылка в новой задаче