[PATCH] qemuFirmwareFillDomain: Fill NVRAM template on migration too

Michal Privoznik posted 1 patch 3 years, 8 months ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/aed6716bca280ae52e40100625593aac9f1ba124.1599586083.git.mprivozn@redhat.com
src/qemu/qemu_firmware.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
[PATCH] qemuFirmwareFillDomain: Fill NVRAM template on migration too
Posted by Michal Privoznik 3 years, 8 months ago
In 8e1804f9f66 I've tried to fix the following use case: domain
is started with path to UEFI only and relies on libvirt to figure
out corresponding NVRAM template to create a per-domain copy
from. The fix consisted of having a check tailored exactly for
this use case and if it's hit then using FW autoselection to
figure it out. Unfortunately, the NVRAM template is not saved in
the inactive XML (well, the domain might be transient anyway).
Then, as a part of that check we see whether the per-domain copy
doesn't exist already and if it does then no template is looked
up hence no template will appear in the live XML.

This works, until the domain is migrated. At the destination, the
per-domain copy will not exist so we need to know the template to
create the per-domain copy from. But we don't even get to the
check because we are not starting a fresh new domain and thus the
qemuFirmwareFillDomain() function quits early.

The solution is to switch order of these two checks. That is
evaluate the check for the old style before checking flags.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1852910
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 src/qemu/qemu_firmware.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c
index 2edc0efabb..ffe2df20aa 100644
--- a/src/qemu/qemu_firmware.c
+++ b/src/qemu/qemu_firmware.c
@@ -1228,9 +1228,6 @@ qemuFirmwareFillDomain(virQEMUDriverPtr driver,
     size_t i;
     int ret = -1;
 
-    if (!(flags & VIR_QEMU_PROCESS_START_NEW))
-        return 0;
-
     /* Fill in FW paths if either os.firmware is enabled, or
      * loader path was provided with no nvram varstore. */
     if (def->os.firmware == VIR_DOMAIN_OS_DEF_FIRMWARE_NONE) {
@@ -1246,6 +1243,11 @@ qemuFirmwareFillDomain(virQEMUDriverPtr driver,
         /* ... then we want to consult JSON FW descriptors first,
          * but we don't want to fail if we haven't found a match. */
         needResult = false;
+    } else {
+        /* Domain has FW autoselection enabled => do nothing if
+         * we are not starting it from scratch. */
+        if (!(flags & VIR_QEMU_PROCESS_START_NEW))
+            return 0;
     }
 
     if ((nfirmwares = qemuFirmwareFetchParsedConfigs(driver->privileged,
-- 
2.26.2

Re: [PATCH] qemuFirmwareFillDomain: Fill NVRAM template on migration too
Posted by Andrea Bolognani 3 years, 8 months ago
On Tue, 2020-09-08 at 19:28 +0200, Michal Privoznik wrote:
> In 8e1804f9f66 I've tried to fix the following use case: domain
> is started with path to UEFI only and relies on libvirt to figure
> out corresponding NVRAM template to create a per-domain copy
> from. The fix consisted of having a check tailored exactly for
> this use case and if it's hit then using FW autoselection to
> figure it out. Unfortunately, the NVRAM template is not saved in
> the inactive XML (well, the domain might be transient anyway).
> Then, as a part of that check we see whether the per-domain copy
> doesn't exist already and if it does then no template is looked
> up hence no template will appear in the live XML.
> 
> This works, until the domain is migrated. At the destination, the
> per-domain copy will not exist so we need to know the template to
> create the per-domain copy from. But we don't even get to the
> check because we are not starting a fresh new domain and thus the
> qemuFirmwareFillDomain() function quits early.
> 
> The solution is to switch order of these two checks. That is
> evaluate the check for the old style before checking flags.
> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1852910
> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>  src/qemu/qemu_firmware.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)

Reviewed-by: Andrea Bolognani <abologna@redhat.com>

-- 
Andrea Bolognani / Red Hat / Virtualization