diff mbox

virtio_net: large tx MTU support

Message ID 200811281052.33474.rusty@rustcorp.com.au
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Rusty Russell Nov. 28, 2008, 12:22 a.m. UTC
On Friday 28 November 2008 00:27:05 Mark McLoughlin wrote:
> Hi Rusty,
>
> On Thu, 2008-11-27 at 23:00 +1030, Rusty Russell wrote:
> > On Thursday 27 November 2008 00:28:11 Mark McLoughlin wrote:
> > > We don't really have a max tx packet size limit, so allow configuring
> > > the device with up to 64k tx MTU.
> >
> > Hi Mark,
> >
> > Just one comment: maybe we should be conservative and maybe limit to 1500
> > if the host doesn't offer any of the GSO or MRG_RXBUF features?
>
> That was actually what I was going to do until I thought about it a bit
> more and discussed it with Herbert.
>
> The virtio_net MTU only affects the transmit path, so there shouldn't be
> any issue with a host that doesn't support those features.

Not quite what I meant.  A minimal host can reasonably expect ethernet-fitting
packets.  If it supports GSO of course it must handle larger ones.  Otherwise
we should add YA feature bit or even a max-mtu field.

So, I was thinking something like this over your patch (I also removed the
used-once MAX and MIN definitions; I dislike gratuitous indirection):


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Mark McLoughlin Nov. 28, 2008, 9:29 a.m. UTC | #1
On Fri, 2008-11-28 at 10:52 +1030, Rusty Russell wrote:
> On Friday 28 November 2008 00:27:05 Mark McLoughlin wrote:
> > Hi Rusty,
> >
> > On Thu, 2008-11-27 at 23:00 +1030, Rusty Russell wrote:
> > > On Thursday 27 November 2008 00:28:11 Mark McLoughlin wrote:
> > > > We don't really have a max tx packet size limit, so allow configuring
> > > > the device with up to 64k tx MTU.
> > >
> > > Hi Mark,
> > >
> > > Just one comment: maybe we should be conservative and maybe limit to 1500
> > > if the host doesn't offer any of the GSO or MRG_RXBUF features?
> >
> > That was actually what I was going to do until I thought about it a bit
> > more and discussed it with Herbert.
> >
> > The virtio_net MTU only affects the transmit path, so there shouldn't be
> > any issue with a host that doesn't support those features.
> 
> Not quite what I meant.

Well, you did mention MRG_RXBUF :-)

> A minimal host can reasonably expect ethernet-fitting packets.  If it
> supports GSO of course it must handle larger ones.

I think this is orthogonal to GSO - e.g. a host may support GSO even if
it can only physically transmit 1500 byte frames.

MTU configuration is commonly a trial and error thing, so we're better
off allowing larger MTU sizes in cases where the host might not support
it rather than disallowing it in cases where the host can support it.

> Otherwise we should add YA feature bit or even a max-mtu field.

If e.g. we allowed physical device assignment via virtio, then the MTU
would be limited to the MTU supported by the physical device. In that
case it might make sense to add a max-mtu field or similar, but IMHO
it's fine to allow larger MTU sizes in the mean time.

Cheers,
Mark.

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rusty Russell Dec. 1, 2008, 4:02 a.m. UTC | #2
On Friday 28 November 2008 19:59:55 Mark McLoughlin wrote:
> On Fri, 2008-11-28 at 10:52 +1030, Rusty Russell wrote:
> > On Friday 28 November 2008 00:27:05 Mark McLoughlin wrote:
> > > Hi Rusty,
> > >
> > > On Thu, 2008-11-27 at 23:00 +1030, Rusty Russell wrote:
> > > > On Thursday 27 November 2008 00:28:11 Mark McLoughlin wrote:
> > > > > We don't really have a max tx packet size limit, so allow
> > > > > configuring the device with up to 64k tx MTU.
> > > >
> > > > Hi Mark,
> > > >
> > > > Just one comment: maybe we should be conservative and maybe limit to
> > > > 1500 if the host doesn't offer any of the GSO or MRG_RXBUF features?
> > >
> > > That was actually what I was going to do until I thought about it a bit
> > > more and discussed it with Herbert.
> > >
> > > The virtio_net MTU only affects the transmit path, so there shouldn't
> > > be any issue with a host that doesn't support those features.
> >
> > Not quite what I meant.
>
> Well, you did mention MRG_RXBUF :-)

Yeah, but you should know by now not to listen to me!

> > A minimal host can reasonably expect ethernet-fitting packets.  If it
> > supports GSO of course it must handle larger ones.
>
> I think this is orthogonal to GSO - e.g. a host may support GSO even if
> it can only physically transmit 1500 byte frames.

Sure, but we know at least it can take large packets in some respect.

> MTU configuration is commonly a trial and error thing, so we're better
> off allowing larger MTU sizes in cases where the host might not support
> it rather than disallowing it in cases where the host can support it.

We're changing the driver behaviour; we *should* add a feature bit.  The only 
counter-argument to this is that all the existing hosts we know of allow the 
behaviour we're specifying.

(Grovelling through an old qemu here it seems to be true, and old tun/tap 
would take anything).

> If e.g. we allowed physical device assignment via virtio, then the MTU
> would be limited to the MTU supported by the physical device. In that
> case it might make sense to add a max-mtu field or similar, but IMHO
> it's fine to allow larger MTU sizes in the mean time.

OK, I'm swayed.  Only because the user has to make a conscious decision to up 
the MTU; and if they choose wrong, networking won't work.

I've applied your original patch.

Thanks!
Rusty.

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -480,26 +480,24 @@  static struct ethtool_ops virtnet_ethtoo
 	.set_sg = ethtool_op_set_sg,
 };
 
-#define MIN_MTU 68
-#define MAX_MTU 65535
-
 static int virtnet_change_mtu(struct net_device *dev, int new_mtu)
 {
 	struct virtnet_info *vi = netdev_priv(dev);
 	int max_mtu;
 
-	/* Only allow a large MTU if we know we have a chance
-	 * of also supporting that MTU on the receive side. */
-	if (vi->mergeable_rx_bufs || vi->big_packets)
-		max_mtu = MAX_MTU;
+	/* A host which can handle GSO must handle large packets. */
+	if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_GSO)
+	    || virtio_has_feature(vi->vdev, VIRTIO_NET_F_HOST_TSO4)
+	    || virtio_has_feature(vi->vdev, VIRTIO_NET_F_HOST_TSO6)
+	    || virtio_has_feature(vi->vdev, VIRTIO_NET_F_HOST_UFO))
+		max_mtu = 65535;
 	else
 		max_mtu = ETH_DATA_LEN;
 
-	if (new_mtu < MIN_MTU || new_mtu > max_mtu)
+	if (new_mtu < 68 || new_mtu > max_mtu)
 		return -EINVAL;
 
 	dev->mtu = new_mtu;
-
 	return 0;
 }