]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Refresh rx-filters more often
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 30 Sep 2022 14:28:24 +0000 (16:28 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 20 Oct 2022 06:48:31 +0000 (08:48 +0200)
There are couple of scenarios where we need to reflect MAC change
done in the guest:

  1) domain restore from a file (here, we don't store updated MAC
     in the save file and thus on restore create the macvtap with
     the original MAC),
  2) reconnecting to a running domain (here, the guest might have
     changed the MAC while we were not running),
  3) migration (here, guest might change the MAC address but we
     fail to respond to it,

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c
src/qemu/qemu_process.c

index 3ad01d7199ebfe3978a4afb56da97c339f75c50d..7cc58d9e2e25bb8b2129cc8553c8789aa4290018 100644 (file)
@@ -12017,14 +12017,17 @@ syncNicRxFilterMulticast(char *ifname,
 
 int
 qemuDomainSyncRxFilter(virDomainObj *vm,
-                       virDomainNetDef *def)
+                       virDomainNetDef *def,
+                       virDomainAsyncJob asyncJob)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
     g_autoptr(virNetDevRxFilter) guestFilter = NULL;
     g_autoptr(virNetDevRxFilter) hostFilter = NULL;
     int rc;
 
-    qemuDomainObjEnterMonitor(vm);
+    if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
+        return -1;
+
     rc = qemuMonitorQueryRxFilter(priv->mon, def->info.alias, &guestFilter);
     qemuDomainObjExitMonitor(vm);
     if (rc < 0)
@@ -12032,7 +12035,7 @@ qemuDomainSyncRxFilter(virDomainObj *vm,
 
     if (virDomainNetGetActualType(def) == VIR_DOMAIN_NET_TYPE_DIRECT) {
         if (virNetDevGetRxFilter(def->ifname, &hostFilter)) {
-            VIR_WARN("Couldn't get current RX filter for device %s while responding to NIC_RX_FILTER_CHANGED",
+            VIR_WARN("Couldn't get current RX filter for device %s",
                      def->ifname);
             return -1;
         }
index d5509d7e5f2e0a87b5bc0009c817bee742147efb..d2e5d4661a21b0d07353cee6acd3b2ac32377aeb 100644 (file)
@@ -1106,4 +1106,5 @@ qemuDomainRefreshStatsSchema(virDomainObj *dom);
 
 int
 qemuDomainSyncRxFilter(virDomainObj *vm,
-                       virDomainNetDef *def);
+                       virDomainNetDef *def,
+                       virDomainAsyncJob asyncJob);
index e2ca9a39610b6afd4dc7616b257db2673e895140..59a3b37b98e2a5c4f52133e19a237a3896e722ed 100644 (file)
@@ -3662,7 +3662,7 @@ processNicRxFilterChangedEvent(virDomainObj *vm,
     VIR_DEBUG("process NIC_RX_FILTER_CHANGED event for network "
               "device %s in domain %s", def->info.alias, vm->def->name);
 
-    if (qemuDomainSyncRxFilter(vm, def) < 0)
+    if (qemuDomainSyncRxFilter(vm, def, VIR_ASYNC_JOB_NONE) < 0)
         goto endjob;
 
  endjob:
index 1a9175f40ffec0d63f582d7ed96cdb9aa3a84a1a..fe98601fcebdb936bd202f97a9e819e29c82e769 100644 (file)
@@ -7756,6 +7756,26 @@ qemuProcessLaunch(virConnectPtr conn,
 }
 
 
+static int
+qemuProcessRefreshRxFilters(virDomainObj *vm,
+                            virDomainAsyncJob asyncJob)
+{
+    size_t i;
+
+    for (i = 0; i < vm->def->nnets; i++) {
+        virDomainNetDef *def = vm->def->nets[i];
+
+        if (!virDomainNetGetActualTrustGuestRxFilters(def))
+            continue;
+
+        if (qemuDomainSyncRxFilter(vm, def, asyncJob) < 0)
+            return -1;
+    }
+
+    return 0;
+}
+
+
 /**
  * qemuProcessRefreshState:
  * @driver: qemu driver data
@@ -7787,6 +7807,10 @@ qemuProcessRefreshState(virQEMUDriver *driver,
     if (qemuProcessRefreshDisks(vm, asyncJob) < 0)
         return -1;
 
+    VIR_DEBUG("Updating rx-filter data");
+    if (qemuProcessRefreshRxFilters(vm, asyncJob) < 0)
+        return -1;
+
     return 0;
 }
 
@@ -8807,6 +8831,9 @@ qemuProcessReconnect(void *opaque)
     if (qemuSecurityReserveLabel(driver->securityManager, obj->def, obj->pid) < 0)
         goto error;
 
+    if (qemuProcessRefreshRxFilters(obj, VIR_ASYNC_JOB_NONE) < 0)
+        goto error;
+
     qemuProcessNotifyNets(obj->def);
 
     qemuProcessFiltersInstantiate(obj->def);