From bcd5ae4e73607a34ef2b739925a2ad37556ff205 Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Mon, 30 Sep 2024 11:30:38 -0400 Subject: [PATCH] qemu: fix regression in update-device for interfaces Commit a37bd2a15b8f2e7aa09519c86fe1ba1e59ce113f eliminated a failure to update *any* change in an interface that was connected via a network that consisted of a pool of VFs using macvtap passthrough mode. Unfortunately it caused a regression that results in failure to update changes to bandwidth/vlan/trustGuestRxFilters in any interface connected via a network that uses a bridge to connect tap devices. This fixes that problem by narrowing the usage of the fix in the earlier patch to only be done in the case that the the interface is connected via a macvtap+passthrough network. Signed-off-by: Laine Stump Fixes: a37bd2a15b8f2e7aa09519c86fe1ba1e59ce113f Reviewed-by: Martin Kletzander --- src/qemu/qemu_hotplug.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 09a37caf85..4d4bcde1bc 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3918,12 +3918,19 @@ qemuDomainChangeNet(virQEMUDriver *driver, * free it if we fail for any reason */ if (newdev->type == VIR_DOMAIN_NET_TYPE_NETWORK) { - if (olddev->type == VIR_DOMAIN_NET_TYPE_NETWORK - && STREQ(olddev->data.network.name, newdev->data.network.name)) { + if (olddev->type == VIR_DOMAIN_NET_TYPE_NETWORK && + oldType == VIR_DOMAIN_NET_TYPE_DIRECT && + virDomainNetGetActualDirectMode(olddev) == VIR_NETDEV_MACVLAN_MODE_PASSTHRU && + STREQ(olddev->data.network.name, newdev->data.network.name)) { /* old and new are type='network', and the network name - * hasn't changed. In this case we *don't* want to get a - * new port ("actual device") from the network because we - * can use the old one (since it hasn't changed). + * hasn't changed *and* this is a network where each + * connection is allocated exclusive use of a VF + * device. In this case we *don't* want to get a new port + * ("actual device") from the network because attempting + * to allocate a new device would also allocate a + * new/different VF, causing the update to fail. And + * anyway we can use olddev's actualNetDef (since it + * hasn't changed). * * So instead we just duplicate *the pointer to* the * actualNetDef from olddev to newdev so that comparisons