Commit 14de9d11 authored by Aaron Conole's avatar Aaron Conole Committed by David S. Miller

virtio-net: Add initial MTU advice feature

This commit adds the feature bit and associated mtu device entry for the
virtio network device.  When a virtio device comes up, it checks the
feature bit for the VIRTIO_NET_F_MTU feature.  If such feature bit is
enabled, the driver will read the advised MTU and use it as the initial
value.
Signed-off-by: default avatarAaron Conole <aconole@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3d9dc408
...@@ -1780,6 +1780,7 @@ static int virtnet_probe(struct virtio_device *vdev) ...@@ -1780,6 +1780,7 @@ static int virtnet_probe(struct virtio_device *vdev)
struct net_device *dev; struct net_device *dev;
struct virtnet_info *vi; struct virtnet_info *vi;
u16 max_queue_pairs; u16 max_queue_pairs;
int mtu;
if (!vdev->config->get) { if (!vdev->config->get) {
dev_err(&vdev->dev, "%s failure: config access disabled\n", dev_err(&vdev->dev, "%s failure: config access disabled\n",
...@@ -1896,6 +1897,14 @@ static int virtnet_probe(struct virtio_device *vdev) ...@@ -1896,6 +1897,14 @@ static int virtnet_probe(struct virtio_device *vdev)
if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ))
vi->has_cvq = true; vi->has_cvq = true;
if (virtio_has_feature(vdev, VIRTIO_NET_F_MTU)) {
mtu = virtio_cread16(vdev,
offsetof(struct virtio_net_config,
mtu));
if (virtnet_change_mtu(dev, mtu))
__virtio_clear_bit(vdev, VIRTIO_NET_F_MTU);
}
if (vi->any_header_sg) if (vi->any_header_sg)
dev->needed_headroom = vi->hdr_len; dev->needed_headroom = vi->hdr_len;
...@@ -2067,6 +2076,7 @@ static unsigned int features[] = { ...@@ -2067,6 +2076,7 @@ static unsigned int features[] = {
VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
VIRTIO_NET_F_CTRL_MAC_ADDR, VIRTIO_NET_F_CTRL_MAC_ADDR,
VIRTIO_F_ANY_LAYOUT, VIRTIO_F_ANY_LAYOUT,
VIRTIO_NET_F_MTU,
}; };
static struct virtio_driver virtio_net_driver = { static struct virtio_driver virtio_net_driver = {
......
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
#define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow #define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow
* Steering */ * Steering */
#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */
#define VIRTIO_NET_F_MTU 25 /* Initial MTU advice */
#ifndef VIRTIO_NET_NO_LEGACY #ifndef VIRTIO_NET_NO_LEGACY
#define VIRTIO_NET_F_GSO 6 /* Host handles pkts w/ any GSO type */ #define VIRTIO_NET_F_GSO 6 /* Host handles pkts w/ any GSO type */
...@@ -73,6 +74,8 @@ struct virtio_net_config { ...@@ -73,6 +74,8 @@ struct virtio_net_config {
* Legal values are between 1 and 0x8000 * Legal values are between 1 and 0x8000
*/ */
__u16 max_virtqueue_pairs; __u16 max_virtqueue_pairs;
/* Default maximum transmit unit advice */
__u16 mtu;
} __attribute__((packed)); } __attribute__((packed));
/* /*
......
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