From nobody Sun Apr 28 00:57:37 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1542140637823163.8932856574271; Tue, 13 Nov 2018 12:23:57 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3FA5D31524DA; Tue, 13 Nov 2018 20:23:55 +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 615BC19744; Tue, 13 Nov 2018 20:23:53 +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 A853E181A969; Tue, 13 Nov 2018 20:23:50 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id wADKL9I9012677 for ; Tue, 13 Nov 2018 15:21:09 -0500 Received: by smtp.corp.redhat.com (Postfix) id 03FC05C88D; Tue, 13 Nov 2018 20:21:09 +0000 (UTC) Received: from unknown4CEB42C824F4.redhat.com (ovpn-124-253.rdu2.redhat.com [10.10.124.253]) by smtp.corp.redhat.com (Postfix) with ESMTP id A80A55C1A1 for ; Tue, 13 Nov 2018 20:21:08 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 13 Nov 2018 15:21:04 -0500 Message-Id: <20181113202106.10130-2-jferlan@redhat.com> In-Reply-To: <20181113202106.10130-1-jferlan@redhat.com> References: <20181113202106.10130-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH RFC 1/3] qemu: Add check for whether nesting was enabled 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Tue, 13 Nov 2018 20:23:56 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Support for nested kvm is handled via a kernel module configuration adjustment which if done after libvirtd is started and/or the last QEMU capabilities adjustment can result in the inability to start a guest and use nested kvm until the capabilities cache is invalidated. Thus, let's fetch and save the setting during initialization and then when the capabilities are checked for various host related adjustments that could affect whether the capabilities cache is updated add a check whether the nested value was set for either kvm_intel or kvm_amd to force a refetch of the capabilities. Signed-off-by: John Ferlan --- src/qemu/qemu_capabilities.c | 43 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_capspriv.h | 2 ++ tests/qemucapabilitiestest.c | 3 +++ 3 files changed, 48 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 2ca5af3297..ebe0c0c7df 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -40,6 +40,7 @@ #include "virnodesuspend.h" #include "virnuma.h" #include "virhostcpu.h" +#include "virkmod.h" #include "qemu_monitor.h" #include "virstring.h" #include "qemu_hostdev.h" @@ -551,6 +552,7 @@ struct _virQEMUCaps { virObject parent; =20 bool usedQMP; + bool isNested; =20 char *binary; time_t ctime; @@ -1512,6 +1514,7 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemu= Caps) return NULL; =20 ret->usedQMP =3D qemuCaps->usedQMP; + ret->isNested =3D qemuCaps->isNested; =20 if (VIR_STRDUP(ret->binary, qemuCaps->binary) < 0) goto error; @@ -3567,6 +3570,9 @@ virQEMUCapsLoadCache(virArch hostArch, virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KVM); virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU); =20 + qemuCaps->isNested =3D virXPathBoolean("count(./isNested) > 0", + ctxt) > 0; + ret =3D 0; cleanup: VIR_FREE(str); @@ -3786,6 +3792,9 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps) if (qemuCaps->sevCapabilities) virQEMUCapsFormatSEVInfo(qemuCaps, &buf); =20 + if (qemuCaps->isNested) + virBufferAddLit(&buf, "\n"); + virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "\n"); =20 @@ -3826,6 +3835,28 @@ virQEMUCapsSaveFile(void *data, } =20 =20 +static bool +virQEMUCapsIsNested(void) +{ + VIR_AUTOFREE(char *) kConfig =3D NULL; + + if ((kConfig =3D virKModConfig()) && + (strstr(kConfig, "kvm_intel nested=3D1") || + strstr(kConfig, "kvm_amd nested=3D1"))) + return true; + return false; +} + + +void +virQEMUCapsClearIsNested(virQEMUCapsPtr qemuCaps) +{ + /* For qemucapabilitiestest to avoid printing the on + * hosts with nested set in the kernel */ + qemuCaps->isNested =3D false; +} + + static bool virQEMUCapsIsValid(void *data, void *privData) @@ -3834,6 +3865,7 @@ virQEMUCapsIsValid(void *data, virQEMUCapsCachePrivPtr priv =3D privData; bool kvmUsable; struct stat sb; + bool isNested; =20 if (!qemuCaps->binary) return true; @@ -3866,6 +3898,15 @@ virQEMUCapsIsValid(void *data, return false; } =20 + /* Check if someone changed the nested=3D{0|1} value for the kernel fr= om + * the previous time we checked. If so, then refresh the capabilities.= */ + isNested =3D virQEMUCapsIsNested(); + if (isNested !=3D qemuCaps->isNested) { + VIR_WARN("changed kernel nested kvm value was %d", qemuCaps->isNes= ted); + qemuCaps->isNested =3D isNested; + return false; + } + if (!virQEMUCapsGuestIsNative(priv->hostArch, qemuCaps->arch)) { VIR_DEBUG("Guest arch (%s) is not native to host arch (%s), " "skipping KVM-related checks", @@ -4452,6 +4493,8 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps, if (virQEMUCapsInitQMPMonitor(qemuCaps, cmd->mon) < 0) goto cleanup; =20 + qemuCaps->isNested =3D virQEMUCapsIsNested(); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) { virQEMUCapsInitQMPCommandAbort(cmd); if ((rc =3D virQEMUCapsInitQMPCommandRun(cmd, true)) !=3D 0) { diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h index 8d1a40fe74..b5d6aae2e5 100644 --- a/src/qemu/qemu_capspriv.h +++ b/src/qemu/qemu_capspriv.h @@ -48,6 +48,8 @@ int virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps, qemuMonitorPtr mon); =20 +void virQEMUCapsClearIsNested(virQEMUCapsPtr qemuCaps); + int virQEMUCapsInitQMPMonitorTCG(virQEMUCapsPtr qemuCaps, qemuMonitorPtr mon); diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c index 8fe5a55e1d..703fb6a125 100644 --- a/tests/qemucapabilitiestest.c +++ b/tests/qemucapabilitiestest.c @@ -63,6 +63,9 @@ testQemuCaps(const void *opaque) qemuMonitorTestGetMonitor(mon)) < 0) goto cleanup; =20 + /* Don't apply what the host has... force clear for testing purposes */ + virQEMUCapsClearIsNested(capsActual); + if (virQEMUCapsGet(capsActual, QEMU_CAPS_KVM)) { qemuMonitorResetCommandID(qemuMonitorTestGetMonitor(mon)); if (virQEMUCapsInitQMPMonitorTCG(capsActual, --=20 2.17.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun Apr 28 00:57:37 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1542140654607844.9689404221164; Tue, 13 Nov 2018 12:24:14 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2E6B23D95A; Tue, 13 Nov 2018 20:24:11 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EC64519744; Tue, 13 Nov 2018 20:24:10 +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 AACE24BB79; Tue, 13 Nov 2018 20:24:10 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id wADKL9Yn012685 for ; Tue, 13 Nov 2018 15:21:09 -0500 Received: by smtp.corp.redhat.com (Postfix) id 85E655C1A1; Tue, 13 Nov 2018 20:21:09 +0000 (UTC) Received: from unknown4CEB42C824F4.redhat.com (ovpn-124-253.rdu2.redhat.com [10.10.124.253]) by smtp.corp.redhat.com (Postfix) with ESMTP id 35E645E1BD for ; Tue, 13 Nov 2018 20:21:09 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 13 Nov 2018 15:21:05 -0500 Message-Id: <20181113202106.10130-3-jferlan@redhat.com> In-Reply-To: <20181113202106.10130-1-jferlan@redhat.com> References: <20181113202106.10130-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH RFC 2/3] util: Introduce virFileCacheForEach 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 13 Nov 2018 20:24:12 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Add an API to allow traversing each of the file cache elements and invoking a virHashIterator callback function for each element. Signed-off-by: John Ferlan --- src/libvirt_private.syms | 1 + src/util/virfilecache.c | 24 ++++++++++++++++++++++++ src/util/virfilecache.h | 5 +++++ 3 files changed, 30 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2343a757c1..d59126c83f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1882,6 +1882,7 @@ virFindFileInPath; =20 =20 # util/virfilecache.h +virFileCacheForEach; virFileCacheGetPriv; virFileCacheInsertData; virFileCacheLookup; diff --git a/src/util/virfilecache.c b/src/util/virfilecache.c index 15c0d99fd9..cb7580e11a 100644 --- a/src/util/virfilecache.c +++ b/src/util/virfilecache.c @@ -349,6 +349,30 @@ virFileCacheLookupByFunc(virFileCachePtr cache, } =20 =20 +/** + * virFileCacheForEach + * @cache: existing cache object + * @iter: an iterator to process each data + * @opaque: opaque data to pass to the iterator + * + * For each element in the file cache, run the @iter which uses + * @virHashIterator arguments with @opaque data. + */ +int +virFileCacheForEach(virFileCachePtr cache, + virHashIterator iter, + void *opaque) +{ + int ret; + + virObjectLock(cache); + ret =3D virHashForEach(cache->table, iter, opaque); + virObjectUnlock(cache); + + return ret; +} + + /** * virFileCacheGetPriv: * @cache: existing cache object diff --git a/src/util/virfilecache.h b/src/util/virfilecache.h index af6a189d7f..44b766153e 100644 --- a/src/util/virfilecache.h +++ b/src/util/virfilecache.h @@ -122,6 +122,11 @@ virFileCacheLookupByFunc(virFileCachePtr cache, virHashSearcher iter, const void *iterData); =20 +int +virFileCacheForEach(virFileCachePtr cache, + virHashIterator iter, + void *opaque); + void * virFileCacheGetPriv(virFileCachePtr cache); =20 --=20 2.17.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sun Apr 28 00:57:37 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1542141724607528.3797459412085; Tue, 13 Nov 2018 12:42:04 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F1D2F308339B; Tue, 13 Nov 2018 20:42:01 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7CED36013F; Tue, 13 Nov 2018 20:42:01 +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 2374F4BB79; Tue, 13 Nov 2018 20:42:01 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id wADKLA9D012692 for ; Tue, 13 Nov 2018 15:21:10 -0500 Received: by smtp.corp.redhat.com (Postfix) id 13C285C88D; Tue, 13 Nov 2018 20:21:10 +0000 (UTC) Received: from unknown4CEB42C824F4.redhat.com (ovpn-124-253.rdu2.redhat.com [10.10.124.253]) by smtp.corp.redhat.com (Postfix) with ESMTP id B87FF5C1A1 for ; Tue, 13 Nov 2018 20:21:09 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 13 Nov 2018 15:21:06 -0500 Message-Id: <20181113202106.10130-4-jferlan@redhat.com> In-Reply-To: <20181113202106.10130-1-jferlan@redhat.com> References: <20181113202106.10130-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH RFC 3/3] qemu: Add ability to invalidate the capabilities cache 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Tue, 13 Nov 2018 20:42:03 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Provide a mechanism via the QEMU driver reload functionality to invalidate all the capabilities cache and force a reread of the capabilities rather than requiring an admin to "know" they need to remove all the capability cache files and restart libvirtd. This still requires usage of the reload functionality, but it provides the "internal mechanism" in order to cause a reread rather than the "external need" to remove and restart. Signed-off-by: John Ferlan --- src/qemu/qemu_capabilities.c | 35 +++++++++++++++++++++++++++++++++++ src/qemu/qemu_capabilities.h | 2 ++ src/qemu/qemu_driver.c | 4 +++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index ebe0c0c7df..6b66ee006c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -553,6 +553,7 @@ struct _virQEMUCaps { =20 bool usedQMP; bool isNested; + bool invalid; =20 char *binary; time_t ctime; @@ -3870,6 +3871,11 @@ virQEMUCapsIsValid(void *data, if (!qemuCaps->binary) return true; =20 + if (qemuCaps->invalid) { + VIR_DEBUG("capabilities for '%s' invalidated", qemuCaps->binary); + return false; + } + if (qemuCaps->libvirtCtime !=3D virGetSelfLastChanged() || qemuCaps->libvirtVersion !=3D LIBVIR_VERSION_NUMBER) { VIR_DEBUG("Outdated capabilities for '%s': libvirt changed " @@ -4958,6 +4964,35 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache, return ret; } =20 + +/** virQEMUCapsInvalidateCapabilities: + * + * Using the @driver and existing qemuCapsCache, force all the data + * in the cache to be invalidated so that a subsequent isValid call + * force a refetch of the capabilities data. + */ + +static int +virQEMUCapsInvalidateData(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque ATTRIBUTE_UNUSED) +{ + virQEMUCaps *qemuCaps =3D payload; + + qemuCaps->invalid =3D true; + + return 0; +} + + +void +virQEMUCapsInvalidateCapabilities(virFileCachePtr cache) +{ + virFileCacheForEach(cache, virQEMUCapsInvalidateData, NULL); + return; +} + + bool virQEMUCapsSupportsVmport(virQEMUCapsPtr qemuCaps, const virDomainDef *def) diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 6bb9a2c8f0..0600ecd424 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -598,6 +598,8 @@ virCapsPtr virQEMUCapsInit(virFileCachePtr cache); int virQEMUCapsGetDefaultVersion(virCapsPtr caps, virFileCachePtr capsCache, unsigned int *version); +void +virQEMUCapsInvalidateCapabilities(virFileCachePtr cache); =20 VIR_ENUM_DECL(virQEMUCaps); =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 09e04b8544..3b6b399e5b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -968,7 +968,9 @@ qemuStateReload(void) if (!qemu_driver) return 0; =20 - if (!(caps =3D virQEMUDriverGetCapabilities(qemu_driver, false))) + virQEMUCapsInvalidateCapabilities(qemu_driver->qemuCapsCache); + + if (!(caps =3D virQEMUDriverGetCapabilities(qemu_driver, true))) goto cleanup; =20 cfg =3D virQEMUDriverGetConfig(qemu_driver); --=20 2.17.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list