Subject: Re: bonding (IEEE 802.3ad) not working with qemu/virtio

From: Nikolay Aleksandrov <[email-masked]>
Date: Fri, 29 Jan 2016 22:31:41 +0100

On 01/25/2016 05:24 PM, Bjørnar Ness wrote:
> As subject says, 802.3ad bonding is not working with virtio network model.
> 
> The only errors I see is:
> 
> No 802.3ad response from the link partner for any adapters in the bond.
> 
> Dumping the network traffic shows that no LACP packets are sent from the
> host running with virtio driver, changing to for example e1000 solves
> this problem
> with no configuration changes.
> 
> Is this a known problem?
> 
[Including bonding maintainers for comments]

Hi,
Here's a workaround patch for virtio_net devices that "cheats" the
duplex test (which is the actual problem). I've tested this locally
and it works for me.
I'd let the others comment on the implementation, there're other signs
that can be used to distinguish a virtio_net device so I'm open to suggestions.
Also feedback if this is at all acceptable would be appreciated.

Could you give it a try ?

diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index 4cbb8b27a891..0578a95e3ade 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -334,6 +334,7 @@ static u16 __get_link_speed(struct port *port)
 static u8 __get_duplex(struct port *port)
 {
 	struct slave *slave = port->slave;
+	const struct net_device *slave_dev = slave->dev;
 	u8 retval = 0x0;
 
 	/* handling a special case: when the configuration starts with
@@ -354,6 +355,15 @@ static u8 __get_duplex(struct port *port)
 			break;
 		}
 	}
+	if (!retval && slave_dev->dev.parent &&
+	    !strcmp(dev_driver_string(slave_dev->dev.parent),
+		    "virtio_net") &&
+	    netif_carrier_ok(slave_dev)) {
+		netdev_dbg(slave->bond->dev, "port %d: activating virtio_net workaround\n",
+			   port->actor_port_number);
+		retval = 1;
+	}
+
 	return retval;
 }