virtio_net: allow hypervisor to indicate linkspeed and duplex setting
Subsystems (4)
v2 cover virtio_net: allow hypervisor to indicate linkspeed and duplex setting
We have found it useful to be able to set the linkspeed and duplex settings from the host-side for virtio_net. This obviates the need for guest changes and settings for these fields, and does not require custom ethtool commands for virtio_net.
The ability to set linkspeed and duplex is useful in various cases as described here:
16032be virtio_net: add ethtool support for set and get of settings
Using 'ethtool -s' continues to over-write the linkspeed/duplex settings with this patch.
The 1/3 patch is against net-next, while the 2-3/3 patch are the associated qemu changes that would go in after as update-linux-headers.sh should be run first. So the qemu patches are a demonstration of how I intend this to work.
Thanks,
-Jason
linux changes:
Jason Baron (1):
virtio_net: propagate linkspeed/duplex settings from the hypervisor
drivers/net/virtio_net.c | 17 ++++++++++++++++- include/uapi/linux/virtio_net.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-)
qemu changes:
Jason Baron (2):
qemu: virtio-net: use 64-bit values for feature flags
qemu: add linkspeed and duplex settings to virtio-net
hw/net/virtio-net.c | 83 +++++++++++++++++++---------- include/hw/virtio/virtio-net.h | 5 +- include/standard-headers/linux/virtio_net.h | 4 ++ 3 files changed, 64 insertions(+), 28 deletions(-)
PATCH v2 2/3 qemu: use 64-bit values for feature flags in virtio-net
In prepartion for using some of the high order feature bits, make sure that virtio-net uses 64-bit values everywhere.
--- hw/net/virtio-net.c | 54 +++++++++++++++++++++--------------------- include/hw/virtio/virtio-net.h | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-)
hw/net/virtio-net.c +27 -27
@@ -48,18 +48,18 @@ (offsetof(container, field) + sizeof(((container *)0)->field))typedef struct VirtIOFeature { -uint32_t flags; +uint64_t flags;size_t end; }VirtIOFeature ;static VirtIOFeature feature_sizes[] = { - {.flags =1 <<VIRTIO_NET_F_MAC , + {.flags =1ULL <<VIRTIO_NET_F_MAC , .end = endof(struct virtio_net_config, mac)}, - {.flags =1 <<VIRTIO_NET_F_STATUS , + {.flags =1ULL <<VIRTIO_NET_F_STATUS , .end = endof(struct virtio_net_config, status)}, - {.flags =1 <<VIRTIO_NET_F_MQ , + {.flags =1ULL <<VIRTIO_NET_F_MQ , .end = endof(struct virtio_net_config, max_virtqueue_pairs)}, - {.flags =1 <<VIRTIO_NET_F_MTU , + {.flags =1ULL <<VIRTIO_NET_F_MTU , .end = endof(struct virtio_net_config, mtu)}, {} };
@@ -1938,7 +1938,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)int i;if (n->net_conf.mtu) { - n->host_features |= (0x1 <<VIRTIO_NET_F_MTU ); + n->host_features |= (1ULL <<VIRTIO_NET_F_MTU ); }virtio_net_set_config_size (n, n->host_features);
@@ -2109,45 +2109,45 @@ static const VMStateDescription vmstate_virtio_net = { };static Property virtio_net_properties[] = { -DEFINE_PROP_BIT ("csum" , VirtIONet, host_features,VIRTIO_NET_F_CSUM , true), -DEFINE_PROP_BIT ("guest_csum" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("csum" , VirtIONet, host_features,VIRTIO_NET_F_CSUM , true), +DEFINE_PROP_BIT64 ("guest_csum" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_CSUM , true), -DEFINE_PROP_BIT ("gso" , VirtIONet, host_features,VIRTIO_NET_F_GSO , true), -DEFINE_PROP_BIT ("guest_tso4" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("gso" , VirtIONet, host_features,VIRTIO_NET_F_GSO , true), +DEFINE_PROP_BIT64 ("guest_tso4" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_TSO4 , true), -DEFINE_PROP_BIT ("guest_tso6" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("guest_tso6" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_TSO6 , true), -DEFINE_PROP_BIT ("guest_ecn" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("guest_ecn" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_ECN , true), -DEFINE_PROP_BIT ("guest_ufo" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("guest_ufo" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_UFO , true), -DEFINE_PROP_BIT ("guest_announce" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("guest_announce" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_ANNOUNCE , true), -DEFINE_PROP_BIT ("host_tso4" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("host_tso4" , VirtIONet, host_features,VIRTIO_NET_F_HOST_TSO4 , true), -DEFINE_PROP_BIT ("host_tso6" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("host_tso6" , VirtIONet, host_features,VIRTIO_NET_F_HOST_TSO6 , true), -DEFINE_PROP_BIT ("host_ecn" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("host_ecn" , VirtIONet, host_features,VIRTIO_NET_F_HOST_ECN , true), -DEFINE_PROP_BIT ("host_ufo" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("host_ufo" , VirtIONet, host_features,VIRTIO_NET_F_HOST_UFO , true), -DEFINE_PROP_BIT ("mrg_rxbuf" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("mrg_rxbuf" , VirtIONet, host_features,VIRTIO_NET_F_MRG_RXBUF , true), -DEFINE_PROP_BIT ("status" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("status" , VirtIONet, host_features,VIRTIO_NET_F_STATUS , true), -DEFINE_PROP_BIT ("ctrl_vq" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_vq" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_VQ , true), -DEFINE_PROP_BIT ("ctrl_rx" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_rx" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_RX , true), -DEFINE_PROP_BIT ("ctrl_vlan" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_vlan" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_VLAN , true), -DEFINE_PROP_BIT ("ctrl_rx_extra" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_rx_extra" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_RX_EXTRA , true), -DEFINE_PROP_BIT ("ctrl_mac_addr" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_mac_addr" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_MAC_ADDR , true), -DEFINE_PROP_BIT ("ctrl_guest_offloads" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_guest_offloads" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_GUEST_OFFLOADS , true), -DEFINE_PROP_BIT ("mq" , VirtIONet, host_features,VIRTIO_NET_F_MQ , false), +DEFINE_PROP_BIT64 ("mq" , VirtIONet, host_features,VIRTIO_NET_F_MQ , false),DEFINE_NIC_PROPERTIES (VirtIONet, nic_conf),DEFINE_PROP_UINT32 ("x-txtimer" , VirtIONet, net_conf.txtimer,TX_TIMER_INTERVAL ),
include/hw/virtio/virtio-net.h +1 -1
@@ -67,7 +67,7 @@ typedef struct VirtIONet {uint32_t has_vnet_hdr;size_t host_hdr_len;size_t guest_hdr_len; -uint32_t host_features; +uint64_t host_features;uint8_t has_ufo;uint32_t mergeable_rx_bufs;uint8_t promisc;
Signature · 1 line
2.6.1
PATCH v2 2/3 qemu: use 64-bit values for feature flags in virtio-net
In reply to Jason BaronIn prepartion for using some of the high order feature bits, make sure that virtio-net uses 64-bit values everywhere.
--- hw/net/virtio-net.c | 54 +++++++++++++++++++++--------------------- include/hw/virtio/virtio-net.h | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-)
hw/net/virtio-net.c +27 -27
@@ -48,18 +48,18 @@ (offsetof(container, field) + sizeof(((container *)0)->field))typedef struct VirtIOFeature { -uint32_t flags; +uint64_t flags;size_t end; }VirtIOFeature ;static VirtIOFeature feature_sizes[] = { - {.flags =1 <<VIRTIO_NET_F_MAC , + {.flags =1ULL <<VIRTIO_NET_F_MAC , .end = endof(struct virtio_net_config, mac)}, - {.flags =1 <<VIRTIO_NET_F_STATUS , + {.flags =1ULL <<VIRTIO_NET_F_STATUS , .end = endof(struct virtio_net_config, status)}, - {.flags =1 <<VIRTIO_NET_F_MQ , + {.flags =1ULL <<VIRTIO_NET_F_MQ , .end = endof(struct virtio_net_config, max_virtqueue_pairs)}, - {.flags =1 <<VIRTIO_NET_F_MTU , + {.flags =1ULL <<VIRTIO_NET_F_MTU , .end = endof(struct virtio_net_config, mtu)}, {} };
@@ -1938,7 +1938,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)int i;if (n->net_conf.mtu) { - n->host_features |= (0x1 <<VIRTIO_NET_F_MTU ); + n->host_features |= (1ULL <<VIRTIO_NET_F_MTU ); }virtio_net_set_config_size (n, n->host_features);
@@ -2109,45 +2109,45 @@ static const VMStateDescription vmstate_virtio_net = { };static Property virtio_net_properties[] = { -DEFINE_PROP_BIT ("csum" , VirtIONet, host_features,VIRTIO_NET_F_CSUM , true), -DEFINE_PROP_BIT ("guest_csum" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("csum" , VirtIONet, host_features,VIRTIO_NET_F_CSUM , true), +DEFINE_PROP_BIT64 ("guest_csum" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_CSUM , true), -DEFINE_PROP_BIT ("gso" , VirtIONet, host_features,VIRTIO_NET_F_GSO , true), -DEFINE_PROP_BIT ("guest_tso4" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("gso" , VirtIONet, host_features,VIRTIO_NET_F_GSO , true), +DEFINE_PROP_BIT64 ("guest_tso4" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_TSO4 , true), -DEFINE_PROP_BIT ("guest_tso6" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("guest_tso6" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_TSO6 , true), -DEFINE_PROP_BIT ("guest_ecn" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("guest_ecn" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_ECN , true), -DEFINE_PROP_BIT ("guest_ufo" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("guest_ufo" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_UFO , true), -DEFINE_PROP_BIT ("guest_announce" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("guest_announce" , VirtIONet, host_features,VIRTIO_NET_F_GUEST_ANNOUNCE , true), -DEFINE_PROP_BIT ("host_tso4" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("host_tso4" , VirtIONet, host_features,VIRTIO_NET_F_HOST_TSO4 , true), -DEFINE_PROP_BIT ("host_tso6" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("host_tso6" , VirtIONet, host_features,VIRTIO_NET_F_HOST_TSO6 , true), -DEFINE_PROP_BIT ("host_ecn" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("host_ecn" , VirtIONet, host_features,VIRTIO_NET_F_HOST_ECN , true), -DEFINE_PROP_BIT ("host_ufo" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("host_ufo" , VirtIONet, host_features,VIRTIO_NET_F_HOST_UFO , true), -DEFINE_PROP_BIT ("mrg_rxbuf" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("mrg_rxbuf" , VirtIONet, host_features,VIRTIO_NET_F_MRG_RXBUF , true), -DEFINE_PROP_BIT ("status" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("status" , VirtIONet, host_features,VIRTIO_NET_F_STATUS , true), -DEFINE_PROP_BIT ("ctrl_vq" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_vq" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_VQ , true), -DEFINE_PROP_BIT ("ctrl_rx" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_rx" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_RX , true), -DEFINE_PROP_BIT ("ctrl_vlan" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_vlan" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_VLAN , true), -DEFINE_PROP_BIT ("ctrl_rx_extra" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_rx_extra" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_RX_EXTRA , true), -DEFINE_PROP_BIT ("ctrl_mac_addr" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_mac_addr" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_MAC_ADDR , true), -DEFINE_PROP_BIT ("ctrl_guest_offloads" , VirtIONet, host_features, +DEFINE_PROP_BIT64 ("ctrl_guest_offloads" , VirtIONet, host_features,VIRTIO_NET_F_CTRL_GUEST_OFFLOADS , true), -DEFINE_PROP_BIT ("mq" , VirtIONet, host_features,VIRTIO_NET_F_MQ , false), +DEFINE_PROP_BIT64 ("mq" , VirtIONet, host_features,VIRTIO_NET_F_MQ , false),DEFINE_NIC_PROPERTIES (VirtIONet, nic_conf),DEFINE_PROP_UINT32 ("x-txtimer" , VirtIONet, net_conf.txtimer,TX_TIMER_INTERVAL ),
include/hw/virtio/virtio-net.h +1 -1
@@ -67,7 +67,7 @@ typedef struct VirtIONet {uint32_t has_vnet_hdr;size_t host_hdr_len;size_t guest_hdr_len; -uint32_t host_features; +uint64_t host_features;uint8_t has_ufo;uint32_t mergeable_rx_bufs;uint8_t promisc;
Signature · 1 line
2.6.1
PATCH v2 1/3 virtio_net: propagate linkspeed/duplex settings from the hypervisor
The ability to set speed and duplex for virtio_net in useful in various scenarios as described here:
16032be virtio_net: add ethtool support for set and get of settings
However, it would be nice to be able to set this from the hypervisor, such that virtio_net doesn't require custom guest ethtool commands.
Introduce a new feature flag, VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.
--- drivers/net/virtio_net.c | 17 ++++++++++++++++- include/uapi/linux/virtio_net.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-)
drivers/net/virtio_net.c +16 -1
@@ -2621,6 +2621,20 @@ static int virtnet_probe(struct virtio_device *vdev)netif_set_real_num_rx_queues (dev, vi->curr_queue_pairs);virtnet_init_settings (dev); +if (virtio_has_feature (vdev,VIRTIO_NET_F_SPEED_DUPLEX )) { +u32 speed; +u8 duplex; + + speed =virtio_cread32 (vdev, offsetof(struct virtio_net_config , + speed)); +if (ethtool_validate_speed (speed)) + vi->speed = speed; + duplex =virtio_cread8 (vdev, + offsetof(struct virtio_net_config , + duplex)); +if (ethtool_validate_duplex (duplex)) + vi->duplex = duplex; + } err =register_netdev (dev);if (err) {
@@ -2746,7 +2760,8 @@ static struct virtio_device_id id_table[] = { VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \VIRTIO_NET_F_GUEST_ANNOUNCE ,VIRTIO_NET_F_MQ , \VIRTIO_NET_F_CTRL_MAC_ADDR , \ - VIRTIO_NET_F_MTU, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS +VIRTIO_NET_F_MTU ,VIRTIO_NET_F_CTRL_GUEST_OFFLOADS , \ +VIRTIO_NET_F_SPEED_DUPLEX static unsigned int features[] = {VIRTNET_FEATURES ,
include/uapi/linux/virtio_net.h +5 -0
@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */ +#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +#ifndef VIRTIO_NET_NO_LEGACY #define VIRTIO_NET_F_GSO 6/* Host handles pkts w/ any GSO type */ #endif /* VIRTIO_NET_NO_LEGACY */
@@ -76,6 +78,9 @@ struct virtio_net_config {__u16 max_virtqueue_pairs;/* Default maximum transmit unit advice */ __u16 mtu; +/* Host exported linkspeed and duplex */ +__u32 speed; +__u8 duplex; } __attribute__((packed));/*
Signature · 1 line
2.6.1
v2 cover virtio_net: allow hypervisor to indicate linkspeed and duplex setting
In reply to Jason BaronWe have found it useful to be able to set the linkspeed and duplex settings from the host-side for virtio_net. This obviates the need for guest changes and settings for these fields, and does not require custom ethtool commands for virtio_net.
The ability to set linkspeed and duplex is useful in various cases as described here:
16032be virtio_net: add ethtool support for set and get of settings
Using 'ethtool -s' continues to over-write the linkspeed/duplex settings with this patch.
The 1/3 patch is against net-next, while the 2-3/3 patch are the associated qemu changes that would go in after as update-linux-headers.sh should be run first. So the qemu patches are a demonstration of how I intend this to work.
Thanks,
-Jason
linux changes:
Jason Baron (1):
virtio_net: propagate linkspeed/duplex settings from the hypervisor
drivers/net/virtio_net.c | 17 ++++++++++++++++- include/uapi/linux/virtio_net.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-)
qemu changes:
Jason Baron (2):
qemu: virtio-net: use 64-bit values for feature flags
qemu: add linkspeed and duplex settings to virtio-net
hw/net/virtio-net.c | 83 +++++++++++++++++++---------- include/hw/virtio/virtio-net.h | 5 +- include/standard-headers/linux/virtio_net.h | 4 ++ 3 files changed, 64 insertions(+), 28 deletions(-)
PATCH v2 3/3 qemu: add linkspeed and duplex settings to virtio-net
In reply to Jason BaronAlthough linkspeed and duplex can be set in a linux guest via 'ethtool -s', this requires custom ethtool commands for virtio-net by default.
Introduce a new feature flag, VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.
Linkspeed and duplex settings can be set as:
'-device virtio-net,speed=10000,duplex=full'
where speed is [-1...INT_MAX], and duplex is ["half"|"full"].
--- hw/net/virtio-net.c | 29 +++++++++++++++++++++++++++++ include/hw/virtio/virtio-net.h | 3 +++ include/standard-headers/linux/virtio_net.h | 4 ++++ 3 files changed, 36 insertions(+) create mode 160000 pixman
hw/net/virtio-net.c +29 -0
@@ -40,6 +40,12 @@#define VIRTIO_NET_RX_QUEUE_MIN_SIZE VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE#define VIRTIO_NET_TX_QUEUE_MIN_SIZE VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE +/* duplex and speed defines */ +#define DUPLEX_UNKNOWN 0xff +#define DUPLEX_HALF 0x00 +#define DUPLEX_FULL 0x01 +#define SPEED_UNKNOWN -1 +/* * Calculate the number of bytes up to and including the given 'field' of * 'container'.
@@ -61,6 +67,8 @@ static VirtIOFeature feature_sizes[] = { .end = endof(struct virtio_net_config, max_virtqueue_pairs)}, {.flags = 1ULL << VIRTIO_NET_F_MTU, .end = endof(struct virtio_net_config, mtu)}, + {.flags = 1ULL << VIRTIO_NET_F_SPEED_DUPLEX, + .end = endof(struct virtio_net_config, duplex)}, {} };
@@ -88,6 +96,8 @@ static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)virtio_stw_p (vdev, &netcfg.status, n->status);virtio_stw_p (vdev, &netcfg.max_virtqueue_pairs, n->max_queues);virtio_stw_p (vdev, &netcfg.mtu, n->net_conf.mtu); +virtio_stl_p (vdev, &netcfg.speed, n->net_conf.speed); + netcfg.duplex = n->net_conf.duplex;memcpy (netcfg.mac, n->mac,ETH_ALEN );memcpy (config, &netcfg, n->config_size); }
@@ -1941,6 +1951,23 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) n->host_features |= (1ULL <<VIRTIO_NET_F_MTU ); } + n->host_features |= (1ULL <<VIRTIO_NET_F_SPEED_DUPLEX ); +if (n->net_conf.duplex_str) { +if (strncmp (n->net_conf.duplex_str,"half" ,5 ) ==0 ) { + n->net_conf.duplex =DUPLEX_HALF ; + }else if (strncmp (n->net_conf.duplex_str,"full" ,5 ) ==0 ) { + n->net_conf.duplex =DUPLEX_FULL ; + }else { +error_setg (errp,"'duplex' must be 'half' or 'full'" ); + } + }else { + n->net_conf.duplex =DUPLEX_UNKNOWN ; + } +if (n->net_conf.speed <SPEED_UNKNOWN ) { +error_setg (errp,"'speed' must be between -1 (SPEED_UNKOWN) and " +"INT_MAX" ); + } +virtio_net_set_config_size (n, n->host_features);virtio_init (vdev,"virtio-net" ,VIRTIO_ID_NET , n->config_size);
@@ -2160,6 +2187,8 @@ static Property virtio_net_properties[] = {DEFINE_PROP_UINT16 ("host_mtu" , VirtIONet, net_conf.mtu,0 ),DEFINE_PROP_BOOL ("x-mtu-bypass-backend" , VirtIONet, mtu_bypass_backend, true), +DEFINE_PROP_INT32 ("speed" , VirtIONet, net_conf.speed,SPEED_UNKNOWN ), +DEFINE_PROP_STRING ("duplex" , VirtIONet, net_conf.duplex_str), DEFINE_PROP_END_OF_LIST(), };
include/hw/virtio/virtio-net.h +3 -0
@@ -38,6 +38,9 @@ typedef struct virtio_net_confuint16_t rx_queue_size;uint16_t tx_queue_size;uint16_t mtu; +int32_t speed; +char *duplex_str; +uint8_t duplex; } virtio_net_conf;/* Maximum packet size we can receive from tap device: header + 64k */
include/standard-headers/linux/virtio_net.h +4 -0
@@ -36,6 +36,7 @@#define VIRTIO_NET_F_GUEST_CSUM 1/* Guest handles pkts w/ partial csum */ #define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS 2/* Dynamic offload configuration. */ #define VIRTIO_NET_F_MTU 3/* Initial MTU advice */ +#define VIRTIO_NET_F_SPEED_DUPLEX 4/* Host set linkspeed and duplex */ #define VIRTIO_NET_F_MAC 5/* Host has given MAC address. */ #define VIRTIO_NET_F_GUEST_TSO4 7/* Guest can handle TSOv4 in. */ #define VIRTIO_NET_F_GUEST_TSO6 8/* Guest can handle TSOv6 in. */
@@ -76,6 +77,9 @@ struct virtio_net_config {uint16_t max_virtqueue_pairs;/* Default maximum transmit unit advice */ uint16_t mtu; +/* Host exported linkspeed and duplex */ +uint32_t speed; +uint8_t duplex; }QEMU_PACKED ;/*
PATCH v2 1/3 virtio_net: propagate linkspeed/duplex settings from the hypervisor
In reply to Jason BaronThe ability to set speed and duplex for virtio_net in useful in various scenarios as described here:
16032be virtio_net: add ethtool support for set and get of settings
However, it would be nice to be able to set this from the hypervisor, such that virtio_net doesn't require custom guest ethtool commands.
Introduce a new feature flag, VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.
--- drivers/net/virtio_net.c | 17 ++++++++++++++++- include/uapi/linux/virtio_net.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-)
drivers/net/virtio_net.c +16 -1
@@ -2621,6 +2621,20 @@ static int virtnet_probe(struct virtio_device *vdev)netif_set_real_num_rx_queues (dev, vi->curr_queue_pairs);virtnet_init_settings (dev); +if (virtio_has_feature (vdev,VIRTIO_NET_F_SPEED_DUPLEX )) { +u32 speed; +u8 duplex; + + speed =virtio_cread32 (vdev, offsetof(struct virtio_net_config , + speed)); +if (ethtool_validate_speed (speed)) + vi->speed = speed; + duplex =virtio_cread8 (vdev, + offsetof(struct virtio_net_config , + duplex)); +if (ethtool_validate_duplex (duplex)) + vi->duplex = duplex; + } err =register_netdev (dev);if (err) {
@@ -2746,7 +2760,8 @@ static struct virtio_device_id id_table[] = { VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \VIRTIO_NET_F_GUEST_ANNOUNCE ,VIRTIO_NET_F_MQ , \VIRTIO_NET_F_CTRL_MAC_ADDR , \ - VIRTIO_NET_F_MTU, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS +VIRTIO_NET_F_MTU ,VIRTIO_NET_F_CTRL_GUEST_OFFLOADS , \ +VIRTIO_NET_F_SPEED_DUPLEX static unsigned int features[] = {VIRTNET_FEATURES ,
include/uapi/linux/virtio_net.h +5 -0
@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */ +#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +#ifndef VIRTIO_NET_NO_LEGACY #define VIRTIO_NET_F_GSO 6/* Host handles pkts w/ any GSO type */ #endif /* VIRTIO_NET_NO_LEGACY */
@@ -76,6 +78,9 @@ struct virtio_net_config {__u16 max_virtqueue_pairs;/* Default maximum transmit unit advice */ __u16 mtu; +/* Host exported linkspeed and duplex */ +__u32 speed; +__u8 duplex; } __attribute__((packed));/*
Signature · 1 line
2.6.1
David Miller
maintainerRe: [PATCH net-next v2 1/3] virtio_net: propagate linkspeed/duplex settings from the hypervisor
From: Jason Baron <[email protected]>
Date: Fri, 22 Dec 2017 16:54:01 -0500
Quoted 8 lines
The ability to set speed and duplex for
virtio_netin useful in various scenarios as described here:16032be
virtio_net: add ethtool support for set and get of settingsHowever, it would be nice to be able to set this from the hypervisor, such that
virtio_netdoesn't require custom guest ethtool commands.
Quoted 7 lines
Introduce a new feature flag,
VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.Signed-off-by Jason Baron <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Jason Wang <[email protected]>
Looks mostly fine to me but need some virtio_net reviewers on this one.
include/uapi/linux/virtio_net.h line 61
Quoted 6 lines
include/uapi/linux/virtio_net.h +2
-0@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */ +#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +
Why use a value so far away from the largest existing one?
Just curious.
David Miller
maintainerRe: [PATCH net-next v2 1/3] virtio_net: propagate linkspeed/duplex settings from the hypervisor
In reply to Jason BaronFrom: Jason Baron <[email protected]>
Date: Fri, 22 Dec 2017 16:54:01 -0500
Quoted 8 lines
The ability to set speed and duplex for
virtio_netin useful in various scenarios as described here:16032be
virtio_net: add ethtool support for set and get of settingsHowever, it would be nice to be able to set this from the hypervisor, such that
virtio_netdoesn't require custom guest ethtool commands.
Quoted 7 lines
Introduce a new feature flag,
VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.Signed-off-by Jason Baron <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Jason Wang <[email protected]>
Looks mostly fine to me but need some virtio_net reviewers on this one.
include/uapi/linux/virtio_net.h line 61
Quoted 6 lines
include/uapi/linux/virtio_net.h +2
-0@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */ +#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +
Why use a value so far away from the largest existing one?
Just curious.
Re: [PATCH net-next v2 1/3] virtio_net: propagate linkspeed/duplex settings from the hypervisor
Quoted 25 lines · David Miller
From: Jason Baron <[email protected]>
Date: Fri, 22 Dec 2017 16:54:01 -0500Quoted 8 lines
The ability to set speed and duplex for
virtio_netin useful in various scenarios as described here:16032be
virtio_net: add ethtool support for set and get of settingsHowever, it would be nice to be able to set this from the hypervisor, such that
virtio_netdoesn't require custom guest ethtool commands.Quoted 7 lines
Introduce a new feature flag,
VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.Signed-off-by Jason Baron <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Jason Wang <[email protected]>Looks mostly fine to me but need some
virtio_netreviewers on this one.Quoted 4 lines
include/uapi/linux/virtio_net.h +0
-0@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */
Quoted 7 lines
include/uapi/linux/virtio_net.h line 61
Quoted 2 lines
include/uapi/linux/virtio_net.h +2
-0+#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +Why use a value so far away from the largest existing one?
Just curious.
So that came from a discussion with Michael about which bit to use for this, and he suggested using 63:
"
Transports started from bit 24 and are growing up. So I would say devices should start from bit 63 and grow down. "
https://patchwork.ozlabs.org/patch/848814/#1826669
I will add a comment to explain it.
Thanks,
-Jason
Re: [PATCH net-next v2 1/3] virtio_net: propagate linkspeed/duplex settings from the hypervisor
In reply to David MillerQuoted 25 lines · David Miller
From: Jason Baron <[email protected]>
Date: Fri, 22 Dec 2017 16:54:01 -0500Quoted 8 lines
The ability to set speed and duplex for
virtio_netin useful in various scenarios as described here:16032be
virtio_net: add ethtool support for set and get of settingsHowever, it would be nice to be able to set this from the hypervisor, such that
virtio_netdoesn't require custom guest ethtool commands.Quoted 7 lines
Introduce a new feature flag,
VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.Signed-off-by Jason Baron <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Jason Wang <[email protected]>Looks mostly fine to me but need some
virtio_netreviewers on this one.Quoted 4 lines
include/uapi/linux/virtio_net.h +0
-0@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */
Quoted 7 lines
include/uapi/linux/virtio_net.h line 61
Quoted 2 lines
include/uapi/linux/virtio_net.h +2
-0+#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +Why use a value so far away from the largest existing one?
Just curious.
So that came from a discussion with Michael about which bit to use for this, and he suggested using 63:
"
Transports started from bit 24 and are growing up. So I would say devices should start from bit 63 and grow down. "
https://patchwork.ozlabs.org/patch/848814/#1826669
I will add a comment to explain it.
Thanks,
-Jason
Michael S. Tsirkin
maintainerRe: [PATCH net-next v2 1/3] virtio_net: propagate linkspeed/duplex settings from the hypervisor
Quoted 39 lines · Jason Baron
Quoted 25 lines · David Miller
From: Jason Baron <[email protected]>
Date: Fri, 22 Dec 2017 16:54:01 -0500Quoted 8 lines
The ability to set speed and duplex for
virtio_netin useful in various scenarios as described here:16032be
virtio_net: add ethtool support for set and get of settingsHowever, it would be nice to be able to set this from the hypervisor, such that
virtio_netdoesn't require custom guest ethtool commands.Quoted 7 lines
Introduce a new feature flag,
VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.Signed-off-by Jason Baron <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Jason Wang <[email protected]>Looks mostly fine to me but need some
virtio_netreviewers on this one.Quoted 4 lines
include/uapi/linux/virtio_net.h +0
-0@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */ Quoted 7 lines
include/uapi/linux/virtio_net.h line 61
Quoted 2 lines
include/uapi/linux/virtio_net.h +2
-0+#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +Why use a value so far away from the largest existing one?
Just curious.
So that came from a discussion with Michael about which bit to use for this, and he suggested using 63:
Quoted 8 lines
"
Transports started from bit 24 and are growing up. So I would say devices should start from bit 63 and grow down. "https://patchwork.ozlabs.org/patch/848814/#1826669
I will add a comment to explain it.
Maybe in the commit log. I don't think we need it in the header.
Quoted 3 lines
Thanks,
-Jason
Michael S. Tsirkin
maintainerRe: [PATCH net-next v2 1/3] virtio_net: propagate linkspeed/duplex settings from the hypervisor
In reply to Jason BaronQuoted 35 lines · Jason Baron
The ability to set speed and duplex for
virtio_netin useful in various scenarios as described here:16032be
virtio_net: add ethtool support for set and get of settingsHowever, it would be nice to be able to set this from the hypervisor, such that
virtio_netdoesn't require custom guest ethtool commands.Introduce a new feature flag,
VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.Signed-off-by Jason Baron <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Jason Wang <[email protected]>--- drivers/net/virtio_net.c | 17 ++++++++++++++++- include/uapi/linux/virtio_net.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-)drivers/net/virtio_net.c +7
-0@@ -2621,6 +2621,20 @@ static int virtnet_probe(struct virtio_device *vdev)netif_set_real_num_rx_queues (dev, vi->curr_queue_pairs);virtnet_init_settings (dev); +if (virtio_has_feature (vdev,VIRTIO_NET_F_SPEED_DUPLEX )) { +u32 speed; +u8 duplex; + + speed =virtio_cread32 (vdev, offsetof(struct virtio_net_config , + speed)); +if (ethtool_validate_speed (speed))
drivers/net/virtio_net.c static int virtnet_probe(struct virtio_device *vdev) · line 2640
Quoted 10 lines
drivers/net/virtio_net.c +7
-0+ vi->speed = speed; + duplex =virtio_cread8 (vdev, + offsetof(struct virtio_net_config , + duplex)); +if (ethtool_validate_duplex (duplex)) + vi->duplex = duplex; + } err =register_netdev (dev);if (err) {
It would seem that speed/duplex can change at link up time. Update it from virtnet_config_changed_work please.
Quoted 15 lines
drivers/net/virtio_net.c +2
-1@@ -2746,7 +2760,8 @@ static struct virtio_device_id id_table[] = { VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \VIRTIO_NET_F_GUEST_ANNOUNCE ,VIRTIO_NET_F_MQ , \VIRTIO_NET_F_CTRL_MAC_ADDR , \ - VIRTIO_NET_F_MTU, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS +VIRTIO_NET_F_MTU ,VIRTIO_NET_F_CTRL_GUEST_OFFLOADS , \ +VIRTIO_NET_F_SPEED_DUPLEX static unsigned int features[] = {VIRTNET_FEATURES ,include/uapi/linux/virtio_net.h +0
-0
include/uapi/linux/virtio_net.h line 61
Quoted 5 lines
include/uapi/linux/virtio_net.h +2
-0@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */ +#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +
Host -> device, to match virtio spec terminology.
include/uapi/linux/virtio_net.h struct virtio_net_config { · line 81
Quoted 8 lines
include/uapi/linux/virtio_net.h +1
-0#ifndef VIRTIO_NET_NO_LEGACY #define VIRTIO_NET_F_GSO 6/* Host handles pkts w/ any GSO type */ #endif /* VIRTIO_NET_NO_LEGACY */ @@ -76,6 +78,9 @@ struct virtio_net_config {__u16 max_virtqueue_pairs;/* Default maximum transmit unit advice */ __u16 mtu; +/* Host exported linkspeed and duplex */
I would rather drop this and document each field.
/*
speed, in units of 1Mb. All values 0 to INT_MAX are legal. Any other value stands for unknown.
*/
include/uapi/linux/virtio_net.h struct virtio_net_config { · line 82
Quoted 1 line
include/uapi/linux/virtio_net.h +1
-0+__u32 speed;
/*0x00 - half duplex0x01 - full duplex
Any other value stands for unknown.
*/
Quoted 8 lines
include/uapi/linux/virtio_net.h +1
-0+__u8 duplex; } __attribute__((packed));/*
Signature · 1 line
2.6.1
Michael S. Tsirkin
maintainerRe: [PATCH net-next v2 1/3] virtio_net: propagate linkspeed/duplex settings from the hypervisor
In reply to Jason BaronQuoted 35 lines · Jason Baron
The ability to set speed and duplex for
virtio_netin useful in various scenarios as described here:16032be
virtio_net: add ethtool support for set and get of settingsHowever, it would be nice to be able to set this from the hypervisor, such that
virtio_netdoesn't require custom guest ethtool commands.Introduce a new feature flag,
VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.Signed-off-by Jason Baron <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Jason Wang <[email protected]>--- drivers/net/virtio_net.c | 17 ++++++++++++++++- include/uapi/linux/virtio_net.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-)drivers/net/virtio_net.c +7
-0@@ -2621,6 +2621,20 @@ static int virtnet_probe(struct virtio_device *vdev)netif_set_real_num_rx_queues (dev, vi->curr_queue_pairs);virtnet_init_settings (dev); +if (virtio_has_feature (vdev,VIRTIO_NET_F_SPEED_DUPLEX )) { +u32 speed; +u8 duplex; + + speed =virtio_cread32 (vdev, offsetof(struct virtio_net_config , + speed)); +if (ethtool_validate_speed (speed))
drivers/net/virtio_net.c static int virtnet_probe(struct virtio_device *vdev) · line 2640
Quoted 10 lines
drivers/net/virtio_net.c +7
-0+ vi->speed = speed; + duplex =virtio_cread8 (vdev, + offsetof(struct virtio_net_config , + duplex)); +if (ethtool_validate_duplex (duplex)) + vi->duplex = duplex; + } err =register_netdev (dev);if (err) {
It would seem that speed/duplex can change at link up time. Update it from virtnet_config_changed_work please.
Quoted 15 lines
drivers/net/virtio_net.c +2
-1@@ -2746,7 +2760,8 @@ static struct virtio_device_id id_table[] = { VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \VIRTIO_NET_F_GUEST_ANNOUNCE ,VIRTIO_NET_F_MQ , \VIRTIO_NET_F_CTRL_MAC_ADDR , \ - VIRTIO_NET_F_MTU, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS +VIRTIO_NET_F_MTU ,VIRTIO_NET_F_CTRL_GUEST_OFFLOADS , \ +VIRTIO_NET_F_SPEED_DUPLEX static unsigned int features[] = {VIRTNET_FEATURES ,include/uapi/linux/virtio_net.h +0
-0
include/uapi/linux/virtio_net.h line 61
Quoted 5 lines
include/uapi/linux/virtio_net.h +2
-0@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */ +#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +
Host -> device, to match virtio spec terminology.
include/uapi/linux/virtio_net.h struct virtio_net_config { · line 81
Quoted 8 lines
include/uapi/linux/virtio_net.h +1
-0#ifndef VIRTIO_NET_NO_LEGACY #define VIRTIO_NET_F_GSO 6/* Host handles pkts w/ any GSO type */ #endif /* VIRTIO_NET_NO_LEGACY */ @@ -76,6 +78,9 @@ struct virtio_net_config {__u16 max_virtqueue_pairs;/* Default maximum transmit unit advice */ __u16 mtu; +/* Host exported linkspeed and duplex */
I would rather drop this and document each field.
/*
speed, in units of 1Mb. All values 0 to INT_MAX are legal. Any other value stands for unknown.
*/
include/uapi/linux/virtio_net.h struct virtio_net_config { · line 82
Quoted 1 line
include/uapi/linux/virtio_net.h +1
-0+__u32 speed;
/*0x00 - half duplex0x01 - full duplex
Any other value stands for unknown.
*/
Quoted 8 lines
include/uapi/linux/virtio_net.h +1
-0+__u8 duplex; } __attribute__((packed));/*
Signature · 1 line
2.6.1
Michael S. Tsirkin
maintainerRe: [PATCH net-next v2 1/3] virtio_net: propagate linkspeed/duplex settings from the hypervisor
In reply to Jason BaronQuoted 8 lines · Jason Baron
The ability to set speed and duplex for
virtio_netin useful in various scenarios as described here:16032be
virtio_net: add ethtool support for set and get of settingsHowever, it would be nice to be able to set this from the hypervisor, such that
virtio_netdoesn't require custom guest ethtool commands.
Quoted 7 lines
Introduce a new feature flag,
VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.Signed-off-by Jason Baron <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Jason Wang <[email protected]>
Same as any host/guest API change, please send a copy to the virtio TC to make sure we avoid conflicts.
Quoted 65 lines
--- drivers/net/virtio_net.c | 17 ++++++++++++++++- include/uapi/linux/virtio_net.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-)drivers/net/virtio_net.c +16
-1@@ -2621,6 +2621,20 @@ static int virtnet_probe(struct virtio_device *vdev)netif_set_real_num_rx_queues (dev, vi->curr_queue_pairs);virtnet_init_settings (dev); +if (virtio_has_feature (vdev,VIRTIO_NET_F_SPEED_DUPLEX )) { +u32 speed; +u8 duplex; + + speed =virtio_cread32 (vdev, offsetof(struct virtio_net_config , + speed)); +if (ethtool_validate_speed (speed)) + vi->speed = speed; + duplex =virtio_cread8 (vdev, + offsetof(struct virtio_net_config , + duplex)); +if (ethtool_validate_duplex (duplex)) + vi->duplex = duplex; + } err =register_netdev (dev);if (err) {@@ -2746,7 +2760,8 @@ static struct virtio_device_id id_table[] = { VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \VIRTIO_NET_F_GUEST_ANNOUNCE ,VIRTIO_NET_F_MQ , \VIRTIO_NET_F_CTRL_MAC_ADDR , \ - VIRTIO_NET_F_MTU, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS +VIRTIO_NET_F_MTU ,VIRTIO_NET_F_CTRL_GUEST_OFFLOADS , \ +VIRTIO_NET_F_SPEED_DUPLEX static unsigned int features[] = {VIRTNET_FEATURES ,include/uapi/linux/virtio_net.h +5
-0@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */ +#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +#ifndef VIRTIO_NET_NO_LEGACY #define VIRTIO_NET_F_GSO 6/* Host handles pkts w/ any GSO type */ #endif /* VIRTIO_NET_NO_LEGACY */ @@ -76,6 +78,9 @@ struct virtio_net_config {__u16 max_virtqueue_pairs;/* Default maximum transmit unit advice */ __u16 mtu; +/* Host exported linkspeed and duplex */ +__u32 speed; +__u8 duplex; } __attribute__((packed));/* Signature · 1 line
2.6.1
Michael S. Tsirkin
maintainerRe: [PATCH net-next v2 1/3] virtio_net: propagate linkspeed/duplex settings from the hypervisor
In reply to Jason BaronQuoted 8 lines · Jason Baron
The ability to set speed and duplex for
virtio_netin useful in various scenarios as described here:16032be
virtio_net: add ethtool support for set and get of settingsHowever, it would be nice to be able to set this from the hypervisor, such that
virtio_netdoesn't require custom guest ethtool commands.
Quoted 7 lines
Introduce a new feature flag,
VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.Signed-off-by Jason Baron <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Jason Wang <[email protected]>
Same as any host/guest API change, please send a copy to the virtio TC to make sure we avoid conflicts.
Quoted 65 lines
--- drivers/net/virtio_net.c | 17 ++++++++++++++++- include/uapi/linux/virtio_net.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-)drivers/net/virtio_net.c +16
-1@@ -2621,6 +2621,20 @@ static int virtnet_probe(struct virtio_device *vdev)netif_set_real_num_rx_queues (dev, vi->curr_queue_pairs);virtnet_init_settings (dev); +if (virtio_has_feature (vdev,VIRTIO_NET_F_SPEED_DUPLEX )) { +u32 speed; +u8 duplex; + + speed =virtio_cread32 (vdev, offsetof(struct virtio_net_config , + speed)); +if (ethtool_validate_speed (speed)) + vi->speed = speed; + duplex =virtio_cread8 (vdev, + offsetof(struct virtio_net_config , + duplex)); +if (ethtool_validate_duplex (duplex)) + vi->duplex = duplex; + } err =register_netdev (dev);if (err) {@@ -2746,7 +2760,8 @@ static struct virtio_device_id id_table[] = { VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \VIRTIO_NET_F_GUEST_ANNOUNCE ,VIRTIO_NET_F_MQ , \VIRTIO_NET_F_CTRL_MAC_ADDR , \ - VIRTIO_NET_F_MTU, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS +VIRTIO_NET_F_MTU ,VIRTIO_NET_F_CTRL_GUEST_OFFLOADS , \ +VIRTIO_NET_F_SPEED_DUPLEX static unsigned int features[] = {VIRTNET_FEATURES ,include/uapi/linux/virtio_net.h +5
-0@@ -57,6 +57,8 @@* Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23/* Set MAC address */ +#define VIRTIO_NET_F_SPEED_DUPLEX 63/* Host set linkspeed and duplex */ +#ifndef VIRTIO_NET_NO_LEGACY #define VIRTIO_NET_F_GSO 6/* Host handles pkts w/ any GSO type */ #endif /* VIRTIO_NET_NO_LEGACY */ @@ -76,6 +78,9 @@ struct virtio_net_config {__u16 max_virtqueue_pairs;/* Default maximum transmit unit advice */ __u16 mtu; +/* Host exported linkspeed and duplex */ +__u32 speed; +__u8 duplex; } __attribute__((packed));/* Signature · 1 line
2.6.1
PATCH v2 3/3 qemu: add linkspeed and duplex settings to virtio-net
In reply to Jason BaronAlthough linkspeed and duplex can be set in a linux guest via 'ethtool -s', this requires custom ethtool commands for virtio-net by default.
Introduce a new feature flag, VIRTIO_NET_F_SPEED_DUPLEX, which allows the hypervisor to export a linkspeed and duplex setting. The user can subsequently overwrite it later if desired via: 'ethtool -s'.
Linkspeed and duplex settings can be set as:
'-device virtio-net,speed=10000,duplex=full'
where speed is [-1...INT_MAX], and duplex is ["half"|"full"].
--- hw/net/virtio-net.c | 29 +++++++++++++++++++++++++++++ include/hw/virtio/virtio-net.h | 3 +++ include/standard-headers/linux/virtio_net.h | 4 ++++ 3 files changed, 36 insertions(+) create mode 160000 pixman
hw/net/virtio-net.c +29 -0
@@ -40,6 +40,12 @@#define VIRTIO_NET_RX_QUEUE_MIN_SIZE VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE#define VIRTIO_NET_TX_QUEUE_MIN_SIZE VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE +/* duplex and speed defines */ +#define DUPLEX_UNKNOWN 0xff +#define DUPLEX_HALF 0x00 +#define DUPLEX_FULL 0x01 +#define SPEED_UNKNOWN -1 +/* * Calculate the number of bytes up to and including the given 'field' of * 'container'.
@@ -61,6 +67,8 @@ static VirtIOFeature feature_sizes[] = { .end = endof(struct virtio_net_config, max_virtqueue_pairs)}, {.flags = 1ULL << VIRTIO_NET_F_MTU, .end = endof(struct virtio_net_config, mtu)}, + {.flags = 1ULL << VIRTIO_NET_F_SPEED_DUPLEX, + .end = endof(struct virtio_net_config, duplex)}, {} };
@@ -88,6 +96,8 @@ static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)virtio_stw_p (vdev, &netcfg.status, n->status);virtio_stw_p (vdev, &netcfg.max_virtqueue_pairs, n->max_queues);virtio_stw_p (vdev, &netcfg.mtu, n->net_conf.mtu); +virtio_stl_p (vdev, &netcfg.speed, n->net_conf.speed); + netcfg.duplex = n->net_conf.duplex;memcpy (netcfg.mac, n->mac,ETH_ALEN );memcpy (config, &netcfg, n->config_size); }
@@ -1941,6 +1951,23 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) n->host_features |= (1ULL <<VIRTIO_NET_F_MTU ); } + n->host_features |= (1ULL <<VIRTIO_NET_F_SPEED_DUPLEX ); +if (n->net_conf.duplex_str) { +if (strncmp (n->net_conf.duplex_str,"half" ,5 ) ==0 ) { + n->net_conf.duplex =DUPLEX_HALF ; + }else if (strncmp (n->net_conf.duplex_str,"full" ,5 ) ==0 ) { + n->net_conf.duplex =DUPLEX_FULL ; + }else { +error_setg (errp,"'duplex' must be 'half' or 'full'" ); + } + }else { + n->net_conf.duplex =DUPLEX_UNKNOWN ; + } +if (n->net_conf.speed <SPEED_UNKNOWN ) { +error_setg (errp,"'speed' must be between -1 (SPEED_UNKOWN) and " +"INT_MAX" ); + } +virtio_net_set_config_size (n, n->host_features);virtio_init (vdev,"virtio-net" ,VIRTIO_ID_NET , n->config_size);
@@ -2160,6 +2187,8 @@ static Property virtio_net_properties[] = {DEFINE_PROP_UINT16 ("host_mtu" , VirtIONet, net_conf.mtu,0 ),DEFINE_PROP_BOOL ("x-mtu-bypass-backend" , VirtIONet, mtu_bypass_backend, true), +DEFINE_PROP_INT32 ("speed" , VirtIONet, net_conf.speed,SPEED_UNKNOWN ), +DEFINE_PROP_STRING ("duplex" , VirtIONet, net_conf.duplex_str), DEFINE_PROP_END_OF_LIST(), };
include/hw/virtio/virtio-net.h +3 -0
@@ -38,6 +38,9 @@ typedef struct virtio_net_confuint16_t rx_queue_size;uint16_t tx_queue_size;uint16_t mtu; +int32_t speed; +char *duplex_str; +uint8_t duplex; } virtio_net_conf;/* Maximum packet size we can receive from tap device: header + 64k */
include/standard-headers/linux/virtio_net.h +4 -0
@@ -36,6 +36,7 @@#define VIRTIO_NET_F_GUEST_CSUM 1/* Guest handles pkts w/ partial csum */ #define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS 2/* Dynamic offload configuration. */ #define VIRTIO_NET_F_MTU 3/* Initial MTU advice */ +#define VIRTIO_NET_F_SPEED_DUPLEX 4/* Host set linkspeed and duplex */ #define VIRTIO_NET_F_MAC 5/* Host has given MAC address. */ #define VIRTIO_NET_F_GUEST_TSO4 7/* Guest can handle TSOv4 in. */ #define VIRTIO_NET_F_GUEST_TSO6 8/* Guest can handle TSOv6 in. */
@@ -76,6 +77,9 @@ struct virtio_net_config {uint16_t max_virtqueue_pairs;/* Default maximum transmit unit advice */ uint16_t mtu; +/* Host exported linkspeed and duplex */ +uint32_t speed; +uint8_t duplex; }QEMU_PACKED ;/*