From nobody Sun Feb 8 08:22:30 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1644346124; cv=none; d=zohomail.com; s=zohoarc; b=TmUMr9OCXty3kIQDPBmdtcnvCnkBuMxyURxtKyAozvhRbKgjw3NhMcg2A4IaTIKJKiPCaKr/1eZh1S0Qfa+zm0odQT4TpUz7jOErFLSGkq4Fz0OCSNb7n5FURY2NiKO5xaJkSkKfdE+xKXoM1BZ7dtlw+Asxrn96aT4xgF9qysM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1644346124; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=5oZicreDdS16nOxUoevqGBF1w2RnWR/7/N8AbuAcYgw=; b=bfQjgXlTkxW+jVSEaxJ1kW05Y30B3W0mO6g1BBz62yFBlcIDUMIxpknr+C2CIln5zHgHZGwLWx2sZnCWdB10RxdYSOW4bJ4DLdTPoTBJF3TmY3Wa8ZmRVAhxrbnQRTnC8gqIUGUapnpNIdhpzrDCk+0sP32ywGJU2XLLqOFi+8U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1644346124913384.29917122107724; Tue, 8 Feb 2022 10:48:44 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-176-iRQBxoiTNZeT5KGXrHq3hw-1; Tue, 08 Feb 2022 13:48:41 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 222CE51081; Tue, 8 Feb 2022 18:48:36 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0504174EA0; Tue, 8 Feb 2022 18:48:36 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id CC87F181844A; Tue, 8 Feb 2022 18:48:35 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 217CbGZC003363 for ; Mon, 7 Feb 2022 07:37:16 -0500 Received: by smtp.corp.redhat.com (Postfix) id 907CB6F95B; Mon, 7 Feb 2022 12:37:16 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.33.36.143]) by smtp.corp.redhat.com (Postfix) with ESMTP id CFE396FB8C; Mon, 7 Feb 2022 12:37:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1644346123; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=5oZicreDdS16nOxUoevqGBF1w2RnWR/7/N8AbuAcYgw=; b=ikC5ehvMxzMULkN2ogh3s+hix1BOt2Xm/TRM7LKEdr6zU3q+lGktVBJV5Ikh7sR9D9Y7Rv ZoBO/oTQ8pRZZtH+nSaYGYxIsLh6lq5YRWw/KS42tcJJO3/sIpMPVta4zINYuisV999lbu kT9EM0RTK/DTt0hoWvfVyGb7BFq4GYA= X-MC-Unique: iRQBxoiTNZeT5KGXrHq3hw-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Subject: [libvirt PATCH 3/4] qemu: wire up support for resetting NVRAM Date: Mon, 7 Feb 2022 12:37:09 +0000 Message-Id: <20220207123711.1042287-4-berrange@redhat.com> In-Reply-To: <20220207123711.1042287-1-berrange@redhat.com> References: <20220207123711.1042287-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1644346125916100003 We can now replace the existing NVRAM file on startup when the API requests this. Signed-off-by: Daniel P. Berrang=C3=A9 --- src/qemu/qemu_driver.c | 24 ++++++++++++++++++------ src/qemu/qemu_process.c | 8 +++++--- src/qemu/qemu_process.h | 1 + src/qemu/qemu_saveimage.c | 9 +++++++-- src/qemu/qemu_saveimage.h | 1 + src/qemu/qemu_snapshot.c | 6 +++++- 6 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 698f57f00e..4831a81a78 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1589,7 +1589,8 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, =20 virCheckFlags(VIR_DOMAIN_START_PAUSED | VIR_DOMAIN_START_AUTODESTROY | - VIR_DOMAIN_START_VALIDATE, NULL); + VIR_DOMAIN_START_VALIDATE | + VIR_DOMAIN_START_RESET_NVRAM, NULL); =20 if (flags & VIR_DOMAIN_START_VALIDATE) parse_flags |=3D VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; @@ -1597,6 +1598,8 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, start_flags |=3D VIR_QEMU_PROCESS_START_PAUSED; if (flags & VIR_DOMAIN_START_AUTODESTROY) start_flags |=3D VIR_QEMU_PROCESS_START_AUTODESTROY; + if (flags & VIR_DOMAIN_START_RESET_NVRAM) + start_flags |=3D VIR_QEMU_PROCESS_START_RESET_NVRAM; =20 virNWFilterReadLockFilterUpdates(); =20 @@ -5754,11 +5757,15 @@ qemuDomainRestoreFlags(virConnectPtr conn, virQEMUSaveData *data =3D NULL; virFileWrapperFd *wrapperFd =3D NULL; bool hook_taint =3D false; + bool reset_nvram =3D false; =20 virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE | VIR_DOMAIN_SAVE_RUNNING | - VIR_DOMAIN_SAVE_PAUSED, -1); + VIR_DOMAIN_SAVE_PAUSED | + VIR_DOMAIN_SAVE_RESET_NVRAM, -1); =20 + if (flags & VIR_DOMAIN_SAVE_RESET_NVRAM) + reset_nvram =3D true; =20 virNWFilterReadLockFilterUpdates(); =20 @@ -5820,7 +5827,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, goto cleanup; =20 ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, data, path, - false, QEMU_ASYNC_JOB_START); + false, reset_nvram, QEMU_ASYNC_JOB_START); =20 qemuProcessEndJob(driver, vm); =20 @@ -6029,6 +6036,7 @@ qemuDomainObjRestore(virConnectPtr conn, const char *path, bool start_paused, bool bypass_cache, + bool reset_nvram, qemuDomainAsyncJob asyncJob) { g_autoptr(virDomainDef) def =3D NULL; @@ -6087,7 +6095,7 @@ qemuDomainObjRestore(virConnectPtr conn, virDomainObjAssignDef(vm, &def, true, NULL); =20 ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, data, path, - start_paused, asyncJob); + start_paused, reset_nvram, asyncJob); =20 cleanup: virQEMUSaveDataFree(data); @@ -6299,11 +6307,13 @@ qemuDomainObjStart(virConnectPtr conn, bool autodestroy =3D (flags & VIR_DOMAIN_START_AUTODESTROY) !=3D 0; bool bypass_cache =3D (flags & VIR_DOMAIN_START_BYPASS_CACHE) !=3D 0; bool force_boot =3D (flags & VIR_DOMAIN_START_FORCE_BOOT) !=3D 0; + bool reset_nvram =3D (flags & VIR_DOMAIN_START_RESET_NVRAM) !=3D 0; unsigned int start_flags =3D VIR_QEMU_PROCESS_START_COLD; qemuDomainObjPrivate *priv =3D vm->privateData; =20 start_flags |=3D start_paused ? VIR_QEMU_PROCESS_START_PAUSED : 0; start_flags |=3D autodestroy ? VIR_QEMU_PROCESS_START_AUTODESTROY : 0; + start_flags |=3D reset_nvram ? VIR_QEMU_PROCESS_START_RESET_NVRAM : 0; =20 /* * If there is a managed saved state restore it instead of starting @@ -6328,7 +6338,8 @@ qemuDomainObjStart(virConnectPtr conn, priv->job.current->operation =3D VIR_DOMAIN_JOB_OPERATION_REST= ORE; =20 ret =3D qemuDomainObjRestore(conn, driver, vm, managed_save, - start_paused, bypass_cache, asyncJo= b); + start_paused, bypass_cache, + reset_nvram, asyncJob); =20 if (ret =3D=3D 0) { if (unlink(managed_save) < 0) @@ -6380,7 +6391,8 @@ qemuDomainCreateWithFlags(virDomainPtr dom, unsigned = int flags) virCheckFlags(VIR_DOMAIN_START_PAUSED | VIR_DOMAIN_START_AUTODESTROY | VIR_DOMAIN_START_BYPASS_CACHE | - VIR_DOMAIN_START_FORCE_BOOT, -1); + VIR_DOMAIN_START_FORCE_BOOT | + VIR_DOMAIN_START_RESET_NVRAM, -1); =20 virNWFilterReadLockFilterUpdates(); =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index bc7c2a4dbc..659fba8672 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4411,7 +4411,8 @@ qemuProcessUpdateCPU(virQEMUDriver *driver, =20 static int qemuPrepareNVRAM(virQEMUDriver *driver, - virDomainObj *vm) + virDomainObj *vm, + bool reset_nvram) { g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); int ret =3D -1; @@ -4423,7 +4424,8 @@ qemuPrepareNVRAM(virQEMUDriver *driver, ssize_t r; g_autofree char *tmp_dst_path =3D NULL; =20 - if (!loader || !loader->nvram || virFileExists(loader->nvram)) + if (!loader || !loader->nvram || + (virFileExists(loader->nvram) && !reset_nvram)) return 0; =20 master_nvram_path =3D loader->templt; @@ -6973,7 +6975,7 @@ qemuProcessPrepareHost(virQEMUDriver *driver, qemuProcessMakeDir(driver, vm, priv->channelTargetDir) < 0) return -1; =20 - if (qemuPrepareNVRAM(driver, vm) < 0) + if (qemuPrepareNVRAM(driver, vm, flags & VIR_QEMU_PROCESS_START_RESET_= NVRAM) < 0) return -1; =20 if (vm->def->vsock) { diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index 1b1cc489f0..f6c0d63d11 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -79,6 +79,7 @@ typedef enum { VIR_QEMU_PROCESS_START_PRETEND =3D 1 << 3, VIR_QEMU_PROCESS_START_NEW =3D 1 << 4, /* internal, new VM is= starting */ VIR_QEMU_PROCESS_START_GEN_VMID =3D 1 << 5, /* Generate a new VMID= */ + VIR_QEMU_PROCESS_START_RESET_NVRAM =3D 1 << 5, /* Re-initialize NVRAM= from template */ } qemuProcessStartFlags; =20 int qemuProcessStart(virConnectPtr conn, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 557ee2cd21..c0139041eb 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -577,6 +577,7 @@ qemuSaveImageStartVM(virConnectPtr conn, virQEMUSaveData *data, const char *path, bool start_paused, + bool reset_nvram, qemuDomainAsyncJob asyncJob) { qemuDomainObjPrivate *priv =3D vm->privateData; @@ -590,6 +591,11 @@ qemuSaveImageStartVM(virConnectPtr conn, virQEMUSaveHeader *header =3D &data->header; g_autoptr(qemuDomainSaveCookie) cookie =3D NULL; int rc =3D 0; + unsigned int start_flags =3D VIR_QEMU_PROCESS_START_PAUSED | + VIR_QEMU_PROCESS_START_GEN_VMID; + + if (reset_nvram) + start_flags |=3D VIR_QEMU_PROCESS_START_RESET_NVRAM; =20 if (virSaveCookieParseString(data->cookie, (virObject **)&cookie, virDomainXMLOptionGetSaveCookie(driver->x= mlopt)) < 0) @@ -628,8 +634,7 @@ qemuSaveImageStartVM(virConnectPtr conn, if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL, asyncJob, "stdio", *fd, path, NULL, VIR_NETDEV_VPORT_PROFILE_OP_RESTORE, - VIR_QEMU_PROCESS_START_PAUSED | - VIR_QEMU_PROCESS_START_GEN_VMID) =3D=3D 0) + start_flags) =3D=3D 0) started =3D true; =20 if (intermediatefd !=3D -1) { diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 45c5f35e11..a0daa4ad2b 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -67,6 +67,7 @@ qemuSaveImageStartVM(virConnectPtr conn, virQEMUSaveData *data, const char *path, bool start_paused, + bool reset_nvram, qemuDomainAsyncJob asyncJob) ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5) ATTRIBUTE_NONNULL(6); =20 diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 1887c70708..a99f1246e0 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2243,7 +2243,11 @@ qemuSnapshotRevert(virDomainObj *vm, =20 virCheckFlags(VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED | - VIR_DOMAIN_SNAPSHOT_REVERT_FORCE, -1); + VIR_DOMAIN_SNAPSHOT_REVERT_FORCE | + VIR_DOMAIN_SNAPSHOT_REVERT_RESET_NVRAM, -1); + + if (flags & VIR_DOMAIN_SNAPSHOT_REVERT_RESET_NVRAM) + start_flags |=3D VIR_QEMU_PROCESS_START_RESET_NVRAM; =20 /* We have the following transitions, which create the following event= s: * 1. inactive -> inactive: none --=20 2.34.1