On Sat, Oct 14, 2023 at 09:06:09PM +0000, Vincent Jardin wrote: > On 10/14/23 18:37, Michael S. Tsirkin wrote: > > On Sat, Oct 14, 2023 at 06:22:34PM +0200, Vincent Jardin wrote: > >> Using interface's settings, let's enforce an always on link up. > >> > >> Signed-off-by: Vincent Jardin <vincent.jar...@ekinops.com> > > > > What is going on here? Just don't set it down. > > The purpose is to have a stable vLink for the VMs that don't support > such sysctl arp_evict_nocarrier: > https://patchwork.kernel.org/project/netdevbpf/patch/20211101173630.300969-2-prest...@gmail.com/ > > We are facing some users of vSwitches that use vhost-user and that > disconnect and reconnect during some operations. For most of the VMs on > their deployments with such vSwitches, those VMs' vLink should not flap. > > For those VMs, the flaps are critical and they can lead to some > convergence issues. > > If this capability is not at the virtio-net level, should it be at > qemu's net_vhost_user_event() ? > For instance, from > https://github.com/qemu/qemu/blob/63011373ad22c794a013da69663c03f1297a5c56/net/vhost-user.c#L266 > > ? > > best regards, > Vincent
makes sense > > > > >> --- > >> hw/net/virtio-net.c | 8 ++++++++ > >> include/hw/virtio/virtio-net.h | 2 ++ > >> 2 files changed, 10 insertions(+) > >> > >> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c > >> index 29e33ea5ed..e731b4fdea 100644 > >> --- a/hw/net/virtio-net.c > >> +++ b/hw/net/virtio-net.c > >> @@ -78,6 +78,9 @@ > >> tso/gso/gro 'off'. */ > >> #define VIRTIO_NET_RSC_DEFAULT_INTERVAL 300000 > >> > >> +/* force always link up */ > >> +#define VIRTIO_NET_LINK_UP false > >> + > >> #define VIRTIO_NET_RSS_SUPPORTED_HASHES (VIRTIO_NET_RSS_HASH_TYPE_IPv4 | > >> \ > >> VIRTIO_NET_RSS_HASH_TYPE_TCPv4 > >> | \ > >> VIRTIO_NET_RSS_HASH_TYPE_UDPv4 > >> | \ > >> @@ -447,6 +450,9 @@ static void virtio_net_set_link_status(NetClientState > >> *nc) > >> else > >> n->status |= VIRTIO_NET_S_LINK_UP; > >> > >> + if (n->net_conf.link_up) > >> + n->status |= VIRTIO_NET_S_LINK_UP; > >> + > >> if (n->status != old_status) > >> virtio_notify_config(vdev); > >> > >> @@ -3947,6 +3953,8 @@ static Property virtio_net_properties[] = { > >> VIRTIO_NET_F_GUEST_USO6, true), > >> DEFINE_PROP_BIT64("host_uso", VirtIONet, host_features, > >> VIRTIO_NET_F_HOST_USO, true), > >> + DEFINE_PROP_BOOL("link_up", VirtIONet, net_conf.link_up, > >> + VIRTIO_NET_LINK_UP), > >> DEFINE_PROP_END_OF_LIST(), > >> }; > >> > >> diff --git a/include/hw/virtio/virtio-net.h > >> b/include/hw/virtio/virtio-net.h > >> index 55977f01f0..385bebab34 100644 > >> --- a/include/hw/virtio/virtio-net.h > >> +++ b/include/hw/virtio/virtio-net.h > >> @@ -56,6 +56,7 @@ typedef struct virtio_net_conf > >> char *duplex_str; > >> uint8_t duplex; > >> char *primary_id_str; > >> + bool link_up; /* if set enforce link up, never down */ > >> } virtio_net_conf; > >> > >> /* Coalesced packets type & status */ > >> @@ -180,6 +181,7 @@ struct VirtIONet { > >> size_t guest_hdr_len; > >> uint64_t host_features; > >> uint32_t rsc_timeout; > >> + uint32_t link_up; /* if set enforce link up, never down */ > >> uint8_t rsc4_enabled; > >> uint8_t rsc6_enabled; > >> uint8_t has_ufo; > >> -- > >> 2.34.1 > > >