[ofa-general] [PATCH-for 2.6.25] ib/ipoib: don't drop multicast sends when it can be avoided
Or Gerlitz
ogerlitz at voltaire.com
Tue Mar 11 07:10:02 PDT 2008
When set_multicast_list is called the multicast task is restarted and the IPOIB_MCAST_STARTED
bit is cleared. As a result for some window of time, multicast packets are not transmitted nor
queued but rather dropped by ipoib_mcast_send. These dropped are painful specifically under
two flows: first, bonding fail-over which both calls set_multicast_list on the new active
slave and sends Gratuitous ARP through that slave, and second, IP_DROP_MEMBERSHIP code which
both calls set_multicast_list on the device and issues IGMP leave. On both these cases,
depending on the scheduling of the multicast task, the packets would be dropped. As a
result in the bonding case, the failover would not be detected by the peers until their
neighbouring subsystem will renew the neighbour (few tens of seconds). In the IGMP case,
the IP router doesn't get an IGMP leave and would only learn on that from further probes
on the group (also delay of at least few tens of seconds).
Fix this by allowing transmission (or queuing) depending on the IPOIB_FLAG_OPER_UP flag.
Signed-off-by: Olga Shern <olgas at voltaire.com>
Signed-off-by: Or Gerlitz <ogerlitz at voltaire.com>
Index: linux-2.6.25-rc4/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
===================================================================
--- linux-2.6.25-rc4.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-03-11 11:51:38.000000000 +0200
+++ linux-2.6.25-rc4/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 2008-03-11 15:10:17.000000000 +0200
@@ -650,7 +650,7 @@ void ipoib_mcast_send(struct net_device
*/
spin_lock(&priv->lock);
- if (!test_bit(IPOIB_MCAST_STARTED, &priv->flags) ||
+ if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
!priv->broadcast ||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
++dev->stats.tx_dropped;
More information about the general
mailing list