Commit bc221a34 authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller

ldmvsw: disable tso and gso for bridge operations

The ldmvsw driver is specifically for supporting the ldom virtual
networking by running in the primary ldom and using the LDC to connect
the remaining ldoms to the outside world via a bridge.  With TSO and GSO
supported while connected the bridge, things tend to misbehave as seen
in our case by delayed packets, enough to begin triggering retransmits
and affecting overall throughput.  By turning off advertised support for
TSO and GSO we restore stable traffic flow through the bridge.

Orabug: 23293104
Signed-off-by: default avatarShannon Nelson <shannon.nelson@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7602011f
...@@ -234,8 +234,7 @@ static struct net_device *vsw_alloc_netdev(u8 hwaddr[], ...@@ -234,8 +234,7 @@ static struct net_device *vsw_alloc_netdev(u8 hwaddr[],
dev->ethtool_ops = &vsw_ethtool_ops; dev->ethtool_ops = &vsw_ethtool_ops;
dev->watchdog_timeo = VSW_TX_TIMEOUT; dev->watchdog_timeo = VSW_TX_TIMEOUT;
dev->hw_features = NETIF_F_TSO | NETIF_F_GSO | NETIF_F_GSO_SOFTWARE | dev->hw_features = NETIF_F_HW_CSUM | NETIF_F_SG;
NETIF_F_HW_CSUM | NETIF_F_SG;
dev->features = dev->hw_features; dev->features = dev->hw_features;
/* MTU range: 68 - 65535 */ /* MTU range: 68 - 65535 */
...@@ -320,7 +319,7 @@ static int vsw_port_probe(struct vio_dev *vdev, const struct vio_device_id *id) ...@@ -320,7 +319,7 @@ static int vsw_port_probe(struct vio_dev *vdev, const struct vio_device_id *id)
port->vp = vp; port->vp = vp;
port->dev = dev; port->dev = dev;
port->switch_port = 1; port->switch_port = 1;
port->tso = true; port->tso = false; /* no tso in vsw, misbehaves in bridge */
port->tsolen = 0; port->tsolen = 0;
/* Mark the port as belonging to ldmvsw which directs the /* Mark the port as belonging to ldmvsw which directs the
......
...@@ -186,6 +186,7 @@ static int handle_attr_info(struct vio_driver_state *vio, ...@@ -186,6 +186,7 @@ static int handle_attr_info(struct vio_driver_state *vio,
} else { } else {
pkt->cflags &= ~VNET_LSO_IPV4_CAPAB; pkt->cflags &= ~VNET_LSO_IPV4_CAPAB;
pkt->ipv4_lso_maxlen = 0; pkt->ipv4_lso_maxlen = 0;
port->tsolen = 0;
} }
/* for version >= 1.6, ACK packet mode we support */ /* for version >= 1.6, ACK packet mode we support */
...@@ -1635,7 +1636,7 @@ static void vnet_port_reset(struct vnet_port *port) ...@@ -1635,7 +1636,7 @@ static void vnet_port_reset(struct vnet_port *port)
del_timer(&port->clean_timer); del_timer(&port->clean_timer);
sunvnet_port_free_tx_bufs_common(port); sunvnet_port_free_tx_bufs_common(port);
port->rmtu = 0; port->rmtu = 0;
port->tso = true; port->tso = (port->vsw == 0); /* no tso in vsw, misbehaves in bridge */
port->tsolen = 0; port->tsolen = 0;
} }
......
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