From nobody Fri Oct 24 09:56:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail header.i=idgar@virtualoco.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519829493232764.9342070267519; Wed, 28 Feb 2018 06:51:33 -0800 (PST) Received: from localhost ([::1]:44755 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1er34l-00038S-Q7 for importer@patchew.org; Wed, 28 Feb 2018 09:51:23 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50572) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1er1xO-0002wz-JZ for qemu-devel@nongnu.org; Wed, 28 Feb 2018 08:39:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1er1xL-0004HW-DM for qemu-devel@nongnu.org; Wed, 28 Feb 2018 08:39:42 -0500 Received: from sender-of-o52.zoho.com ([135.84.80.217]:21436) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1er1xL-0004Fa-4v for qemu-devel@nongnu.org; Wed, 28 Feb 2018 08:39:39 -0500 Received: from idgar.com (bzq-82-81-161-50.red.bezeqint.net [82.81.161.50]) by mx.zohomail.com with SMTPS id 1519825167144763.0108293342327; Wed, 28 Feb 2018 05:39:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1519825167; s=it; d=virtualoco.com; i=idgar@virtualoco.com; h=From:To:Cc:Subject:Date:Message-Id; l=5924; bh=rJFA/oRaRdeJj75E9YzwrqVNJ2pdNi6L2tJW8Y5bi1w=; b=PfW+Sli7XD8Mg9XdSP6CCJnG97CgvXqOmGF1tV0PD2u1tTr+9xQL0wbYnsU1eeIa v/+0cncRMc56zkbjQWTEG1tiRS2/ElHtf/BOL43WWlKewTrk08F0VKSIoNmlWj/U0MK eX3Ds71a50wJGA9Y009aQNxRALaDdM38jlyXQwaM= From: Or Idgar To: ben@skyportsystems.com, dgilbert@redhat.com, mst@redhat.com, imammedo@redhat.com, eblake@redhat.com, armbru@redhat.com, qemu-devel@nongnu.org Date: Wed, 28 Feb 2018 15:39:12 +0200 Message-Id: <20180228133912.21496-1-idgar@virtualoco.com> X-Mailer: git-send-email 2.9.5 X-ZohoMailClient: External X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 135.84.80.217 X-Mailman-Approved-At: Wed, 28 Feb 2018 09:50:03 -0500 Subject: [Qemu-devel] [PATCH v2] vmgenid: allow VM Generation ID modification via QMP/HMP X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ghammer@redhat.com, oidgar@redhat.com, idgar@virtualoco.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Or Idgar This patch allow changing the Virtual Machine Generation ID through QMP/HMP while the vm guest is running. As the definition block of VMGENID in ACPI includes the "Notify" method, we can use it to notify the guest about ID changes. QMP command example: { "execute": "set-vm-generation-id", "arguments": { "guid": "324e6eaf-d1d1-4bf6-bf41-b9bb6c91fb87" } } HMP command example: set-vm-generation-id 324e6eaf-d1d1-4bf6-bf41-b9bb6c91fb87 This patch is based off an earlier version by Igor Mammedov (imammedo@redhat.com) Signed-off-by: Or Idgar Reviewed-by: Gal Hammer --- changes in v2: - sending to imammedo@redhat.com instead imammendo@redhat.com docs/specs/vmgenid.txt | 7 ++++--- hmp-commands.hx | 13 +++++++++++++ hmp.c | 10 ++++++++++ hmp.h | 1 + hw/acpi/vmgenid.c | 10 ++++++++++ qapi-schema.json | 11 +++++++++++ tests/vmgenid-test.c | 31 +++++++++++++++++++++++++++++++ 7 files changed, 80 insertions(+), 3 deletions(-) diff --git a/docs/specs/vmgenid.txt b/docs/specs/vmgenid.txt index aa9f518..04443de 100644 --- a/docs/specs/vmgenid.txt +++ b/docs/specs/vmgenid.txt @@ -240,6 +240,7 @@ The property may be queried via QMP/HMP: (QEMU) query-vm-generation-id {"return": {"guid": "324e6eaf-d1d1-4bf6-bf41-b9bb6c91fb87"}} =20 -Setting of this parameter is intentionally left out from the QMP/HMP -interfaces. There are no known use cases for changing the GUID once QEMU = is -running, and adding this capability would greatly increase the complexity. +Also, the property may be set via QMP/HMP: + + (QEMU) set-vm-generation-id guid=3Dee6726ce-73b4-4a8b-863c-708f26515847 + {"return": {}} diff --git a/hmp-commands.hx b/hmp-commands.hx index 4afd57c..4524669 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1871,5 +1871,18 @@ ETEXI }, =20 STEXI +@item set-vm-generation-id @var{uuid} +Set Virtual Machine Generation ID counter to @var{guid} +ETEXI + + { + .name =3D "set-vm-generation-id", + .args_type =3D "guid:s", + .params =3D "guid", + .help =3D "Set Virtual Machine Generation ID counter", + .cmd =3D hmp_set_vm_generation_id, + }, + +STEXI @end table ETEXI diff --git a/hmp.c b/hmp.c index 35a7041..73f9b00 100644 --- a/hmp.c +++ b/hmp.c @@ -2901,6 +2901,16 @@ void hmp_info_vm_generation_id(Monitor *mon, const Q= Dict *qdict) qapi_free_GuidInfo(info); } =20 +void hmp_set_vm_generation_id(Monitor *mon, const QDict *qdict) +{ + Error *errp =3D NULL; + const char *guid =3D qdict_get_str(qdict, "guid"); + + qmp_set_vm_generation_id(guid, &errp); + if (errp) + hmp_handle_error(mon, &errp); +} + void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict) { Error *err =3D NULL; diff --git a/hmp.h b/hmp.h index a6f56b1..8cc74d5 100644 --- a/hmp.h +++ b/hmp.h @@ -147,5 +147,6 @@ void hmp_info_ramblock(Monitor *mon, const QDict *qdict= ); void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict); void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict); void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict); +void hmp_set_vm_generation_id(Monitor *mon, const QDict *qdict); =20 #endif diff --git a/hw/acpi/vmgenid.c b/hw/acpi/vmgenid.c index 105044f..5319d70 100644 --- a/hw/acpi/vmgenid.c +++ b/hw/acpi/vmgenid.c @@ -129,6 +129,16 @@ void vmgenid_add_fw_cfg(VmGenIdState *vms, FWCfgState = *s, GArray *guid) ARRAY_SIZE(vms->vmgenid_addr_le), false); } =20 +void qmp_set_vm_generation_id(const char *guid, Error **errp) +{ + Object *obj =3D find_vmgenid_dev(); + + if (!obj) { + return; + } + object_property_set_str(obj, guid, VMGENID_GUID, errp); +} + static void vmgenid_update_guest(VmGenIdState *vms) { Object *obj =3D object_resolve_path_type("", TYPE_ACPI_DEVICE_IF, NULL= ); diff --git a/qapi-schema.json b/qapi-schema.json index 1845795..c2ab733 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3193,6 +3193,17 @@ { 'command': 'query-vm-generation-id', 'returns': 'GuidInfo' } =20 ## +# @set-vm-generation-id: +# +# Set Virtual Machine Generation ID +# +# @guid: new GUID to set as Virtual Machine Generation ID +# +# Since 2.12 +## +{ 'command': 'set-vm-generation-id', 'data': { 'guid': 'str' } } + +## # @watchdog-set-action: # # Set watchdog action diff --git a/tests/vmgenid-test.c b/tests/vmgenid-test.c index 5a86b40..544cf0f 100644 --- a/tests/vmgenid-test.c +++ b/tests/vmgenid-test.c @@ -130,6 +130,24 @@ static void read_guid_from_monitor(QemuUUID *guid) QDECREF(rsp); } =20 +static void set_guid_via_monitor(QemuUUID *guid) +{ + QDict *rsp, *rsp_ret; + char command[256]; + char *guid_str; + + guid_str =3D qemu_uuid_unparse_strdup(guid); + sprintf(command, "{ 'execute': 'set-vm-generation-id', 'arguments': \ + { 'guid': '%s' } }", + guid_str); + free(guid_str); + rsp =3D qmp(command); + if (qdict_haskey(rsp, "return")) { + rsp_ret =3D qdict_get_qdict(rsp, "return"); + g_assert(qdict_size(rsp_ret) =3D=3D 0); + } +} + static char disk[] =3D "tests/vmgenid-test-disk-XXXXXX"; =20 #define GUID_CMD(guid) \ @@ -182,6 +200,17 @@ static void vmgenid_query_monitor_test(void) qtest_quit(global_qtest); } =20 +static void vmgenid_set_monitor_test(void) +{ + QemuUUID expected, measured; + + global_qtest =3D qtest_startf(GUID_CMD(VGID_GUID)); + qemu_uuid_generate(&expected); + set_guid_via_monitor(&expected); + read_guid_from_monitor(&measured); + g_assert(memcmp(measured.data, expected.data, sizeof(measured.data)) = =3D=3D 0); +} + int main(int argc, char **argv) { int ret; @@ -199,6 +228,8 @@ int main(int argc, char **argv) vmgenid_set_guid_auto_test); qtest_add_func("/vmgenid/vmgenid/query-monitor", vmgenid_query_monitor_test); + qtest_add_func("/vmgenid/vmgenid/set-guid-qmp", + vmgenid_set_monitor_test); ret =3D g_test_run(); boot_sector_cleanup(disk); =20 --=20 2.9.5