From nobody Mon Sep 16 19:13:17 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1538926800652302.90309000676984; Sun, 7 Oct 2018 08:40:00 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 99D3C3001763; Sun, 7 Oct 2018 15:39:58 +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 5576810021B2; Sun, 7 Oct 2018 15:39:58 +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 044221808855; Sun, 7 Oct 2018 15:39:58 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w97Fdh8x000616 for ; Sun, 7 Oct 2018 11:39:43 -0400 Received: by smtp.corp.redhat.com (Postfix) id E91CB68716; Sun, 7 Oct 2018 15:39:43 +0000 (UTC) Received: from mx1.redhat.com (ext-mx11.extmail.prod.ext.phx2.redhat.com [10.5.110.40]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DF44F60C31 for ; Sun, 7 Oct 2018 15:39:40 +0000 (UTC) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 24E603084217 for ; Sun, 7 Oct 2018 15:39:33 +0000 (UTC) Received: from compute7.internal (compute7.nyi.internal [10.202.2.47]) by mailout.nyi.internal (Postfix) with ESMTP id 901DF21BD5; Sun, 7 Oct 2018 11:39:32 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute7.internal (MEProxy); Sun, 07 Oct 2018 11:39:32 -0400 Received: from localhost.localdomain (ip5b409b0b.dynamic.kabel-deutschland.de [91.64.155.11]) by mail.messagingengine.com (Postfix) with ESMTPA id B8E18102A0; Sun, 7 Oct 2018 11:39:31 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:in-reply-to:message-id:mime-version :references:references:subject:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=1zq7zaiDqrAU56P77 yowEwk+8o/trbXXpLD08IbYbVQ=; b=I75lpnuT46Jj/Iz0yKUIU4en6PiUP5Pma 8o1RXOJrF/5JqT0I9NgcVzKyS6sPpeXw02x59j1nkyI/X5e+pICDg6vJYH7STHUq Bwp0eWGwEzVVIzUTSNVgdxk994DgLtI8CZbojmv7NZuYJ7nOMm0GHTUE4RsjUalP 6xIwfWB02ORwK4LRIkO7IYuj97ezjpgOaXNCzhAVRUDWdkXzx+2n2V6/M6EwcUgl 2hFXYKcLieezPV93rxVzWimmMeDxeNynz3lRwKyxw4UZhsocoa3Mo1bL/YNs1cpn jvqSO9tiv7QtFmgHxAiCwfS2sK3GGKbYnP3UzYSQ5J1klQ/h1+Pjg== X-ME-Sender: X-ME-Proxy: From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= To: libvir-list@redhat.com Date: Sun, 7 Oct 2018 17:39:15 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 In-Reply-To: References: X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 214 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Sun, 07 Oct 2018 15:39:33 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Sun, 07 Oct 2018 15:39:33 +0000 (UTC) for IP:'66.111.4.27' DOMAIN:'out3-smtp.messagingengine.com' HELO:'out3-smtp.messagingengine.com' FROM:'marmarek@invisiblethingslab.com' RCPT:'' X-RedHat-Spam-Score: -0.701 (DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_LOW, SPF_HELO_PASS) 66.111.4.27 out3-smtp.messagingengine.com 66.111.4.27 out3-smtp.messagingengine.com X-Scanned-By: MIMEDefang 2.84 on 10.5.110.40 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v4 2/5] libxl: add support for PVH 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: , Content-Type: text/plain; charset="utf-8" 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.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Sun, 07 Oct 2018 15:39:59 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Since this is something between PV and HVM, it makes sense to put the setting in place where domain type is specified. To enable it, use .... It is also included in capabilities.xml, for every supported HVM guest type - it doesn't seems to be any other requirement (besides new enough Xen). Signed-off-by: Marek Marczykowski-G=C3=B3recki --- Changes in v2 proposed by Jim: - use new_arch_added var instead of i =3D=3D nr_guest_archs for clarity - improve comment - adjust for now required Xen >=3D 4.6 (remove part for Xen < 4.5) Changes in v3: - limit VIR_DOMAIN_OSTYPE_XEN -> VIR_DOMAIN_OSTYPE_LINUX conversion to Xen PV only - do not accept VIR_DOMAIN_OSTYPE_LINUX for PVH - fix reported capabilities for PVH - remove hostdev passthrough and video/graphics - use #ifdef LIBXL_DOMAIN_TYPE_PVH instead of hypervisor version to check for PVH support - compile fix for Xen < 4.9 Changes in v4: - revert to "i =3D=3D nr_guest_archs-1" check - let configure check for LIBXL_DOMAIN_TYPE_PVH and use #ifdef HAVE_XEN_PVH then - fix comment about Xen version --- docs/formatcaps.html.in | 4 +-- docs/schemas/domaincommon.rng | 1 +- m4/virt-driver-libxl.m4 | 3 ++- src/conf/domain_conf.c | 6 ++-- src/libxl/libxl_capabilities.c | 38 ++++++++++++++++++++++----- src/libxl/libxl_conf.c | 50 ++++++++++++++++++++++++++++++----- src/libxl/libxl_driver.c | 6 ++-- 7 files changed, 90 insertions(+), 18 deletions(-) diff --git a/docs/formatcaps.html.in b/docs/formatcaps.html.in index 0d9c53d..fe113bc 100644 --- a/docs/formatcaps.html.in +++ b/docs/formatcaps.html.in @@ -104,8 +104,8 @@
machine
Machine type, for use in machine= attribute of os/type element in domain XML. For example Xen - supports xenfv for HVM or xenpv for - PV.
+ supports xenfv for HVM, xenpv for + PV, or xenpvh for PVH.
domain
The type attribut= e of this element specifies the type of hypervisor required to ru= n the domain. Use in type diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 099a949..820a7c6 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -341,6 +341,7 @@ xenpv xenfv + xenpvh diff --git a/m4/virt-driver-libxl.m4 b/m4/virt-driver-libxl.m4 index 479d911..2cd97cc 100644 --- a/m4/virt-driver-libxl.m4 +++ b/m4/virt-driver-libxl.m4 @@ -75,6 +75,9 @@ AC_DEFUN([LIBVIRT_DRIVER_CHECK_LIBXL], [ ]) fi =20 + dnl Check if Xen has support for PVH + AC_CHECK_DECL(LIBXL_DOMAIN_TYPE_PVH, [AC_DEFINE([HAVE_XEN_PVH], [1], [De= fine to 1 if Xen has PVH support.])], [], [#include ]) + AC_SUBST([LIBXL_CFLAGS]) AC_SUBST([LIBXL_LIBS]) ]) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9911d56..a945ad4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -19094,7 +19094,8 @@ virDomainDefParseCaps(virDomainDefPtr def, * be 'xen'. So we accept the former and convert */ if (def->os.type =3D=3D VIR_DOMAIN_OSTYPE_LINUX && - def->virtType =3D=3D VIR_DOMAIN_VIRT_XEN) { + def->virtType =3D=3D VIR_DOMAIN_VIRT_XEN && + (!def->os.machine || STREQ(def->os.machine, "xenpv"))) { def->os.type =3D VIR_DOMAIN_OSTYPE_XEN; } =20 @@ -27705,7 +27706,8 @@ virDomainDefFormatInternal(virDomainDefPtr def, * be 'xen'. So we convert to the former for backcompat */ if (def->virtType =3D=3D VIR_DOMAIN_VIRT_XEN && - def->os.type =3D=3D VIR_DOMAIN_OSTYPE_XEN) + def->os.type =3D=3D VIR_DOMAIN_OSTYPE_XEN && + (!def->os.machine || STREQ(def->os.machine, "xenpv"))) virBufferAsprintf(buf, ">%s\n", virDomainOSTypeToString(VIR_DOMAIN_OSTYPE_LINUX)= ); else diff --git a/src/libxl/libxl_capabilities.c b/src/libxl/libxl_capabilities.c index 18596c7..eecd5e9 100644 --- a/src/libxl/libxl_capabilities.c +++ b/src/libxl/libxl_capabilities.c @@ -57,6 +57,7 @@ struct guest_arch { virArch arch; int bits; int hvm; + int pvh; int pae; int nonpae; int ia64_be; @@ -491,13 +492,33 @@ libxlCapsInitGuests(libxl_ctx *ctx, virCapsPtr caps) guest_archs[i].nonpae =3D nonpae; if (ia64_be) guest_archs[i].ia64_be =3D ia64_be; + + /* + * Xen 4.10 introduced support for the PVH guest type, which + * requires hardware virtualization support similar to the + * HVM guest type. Add a PVH guest type for each new HVM + * guest type. + */ +#ifdef HAVE_XEN_PVH + if (hvm && i =3D=3D nr_guest_archs-1) { + i =3D nr_guest_archs; + /* Ensure we have not exhausted the guest_archs array */ + if (nr_guest_archs >=3D ARRAY_CARDINALITY(guest_archs)) + continue; + guest_archs[nr_guest_archs].arch =3D arch; + guest_archs[nr_guest_archs].pvh =3D 1; + nr_guest_archs++; + } +#endif } } regfree(®ex); =20 for (i =3D 0; i < nr_guest_archs; ++i) { virCapsGuestPtr guest; - char const *const xen_machines[] =3D {guest_archs[i].hvm ? "xenfv"= : "xenpv"}; + char const *const xen_machines[] =3D { + guest_archs[i].hvm ? "xenfv" : + (guest_archs[i].pvh ? "xenpvh" : "xenpv")}; virCapsGuestMachinePtr *machines; =20 if ((machines =3D virCapabilitiesAllocMachines(xen_machines, 1)) = =3D=3D NULL) @@ -557,7 +578,9 @@ libxlCapsInitGuests(libxl_ctx *ctx, virCapsPtr caps) 1, 0) =3D=3D NULL) return -1; + } =20 + if (guest_archs[i].hvm || guest_archs[i].pvh) { if (virCapabilitiesAddGuestFeature(guest, "hap", 1, @@ -580,7 +603,7 @@ libxlMakeDomainOSCaps(const char *machine, =20 os->supported =3D true; =20 - if (STREQ(machine, "xenpv")) + if (STREQ(machine, "xenpv") || STREQ(machine, "xenpvh")) return 0; =20 capsLoader->supported =3D true; @@ -732,11 +755,14 @@ libxlMakeDomainCapabilities(virDomainCapsPtr domCaps, domCaps->maxvcpus =3D PV_MAX_VCPUS; =20 if (libxlMakeDomainOSCaps(domCaps->machine, os, firmwares, nfirmwares)= < 0 || - libxlMakeDomainDeviceDiskCaps(disk) < 0 || - libxlMakeDomainDeviceGraphicsCaps(graphics) < 0 || - libxlMakeDomainDeviceVideoCaps(video) < 0 || - libxlMakeDomainDeviceHostdevCaps(hostdev) < 0) + libxlMakeDomainDeviceDiskCaps(disk) < 0) + return -1; + if (STRNEQ(domCaps->machine, "xenpvh") && + (libxlMakeDomainDeviceGraphicsCaps(graphics) < 0 || + libxlMakeDomainDeviceVideoCaps(video) < 0 || + libxlMakeDomainDeviceHostdevCaps(hostdev) < 0)) return -1; + return 0; } =20 diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index f3da0ed..db50a73 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -133,8 +133,20 @@ libxlMakeDomCreateInfo(libxl_ctx *ctx, =20 libxl_domain_create_info_init(c_info); =20 - if (def->os.type =3D=3D VIR_DOMAIN_OSTYPE_HVM) { + if (def->os.type =3D=3D VIR_DOMAIN_OSTYPE_HVM || + (def->os.type =3D=3D VIR_DOMAIN_OSTYPE_XEN && + STREQ(def->os.machine, "xenpvh"))) { +#ifdef HAVE_XEN_PVH + c_info->type =3D def->os.type =3D=3D VIR_DOMAIN_OSTYPE_HVM ? + LIBXL_DOMAIN_TYPE_HVM : LIBXL_DOMAIN_TYPE_PVH; +#else + if (STREQ(def->os.machine, "xenpvh")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PVH guest type not supported")); + return -1; + } c_info->type =3D LIBXL_DOMAIN_TYPE_HVM; +#endif switch ((virTristateSwitch) def->features[VIR_DOMAIN_FEATURE_HAP])= { case VIR_TRISTATE_SWITCH_OFF: libxl_defbool_set(&c_info->hap, false); @@ -276,16 +288,26 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, virDomainClockDef clock =3D def->clock; libxl_ctx *ctx =3D cfg->ctx; libxl_domain_build_info *b_info =3D &d_config->b_info; - int hvm =3D def->os.type =3D=3D VIR_DOMAIN_OSTYPE_HVM; + bool hvm =3D def->os.type =3D=3D VIR_DOMAIN_OSTYPE_HVM; + bool pvh =3D STREQ(def->os.machine, "xenpvh"); size_t i; size_t nusbdevice =3D 0; =20 libxl_domain_build_info_init(b_info); =20 - if (hvm) + if (hvm) { libxl_domain_build_info_init_type(b_info, LIBXL_DOMAIN_TYPE_HVM); - else + } else if (pvh) { +#ifdef HAVE_XEN_PVH + libxl_domain_build_info_init_type(b_info, LIBXL_DOMAIN_TYPE_PVH); +#else + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("PVH guest type not supported")); + return -1; +#endif + } else { libxl_domain_build_info_init_type(b_info, LIBXL_DOMAIN_TYPE_PV); + } =20 b_info->max_vcpus =3D virDomainDefGetVcpusMax(def); if (libxl_cpu_bitmap_alloc(ctx, &b_info->avail_vcpus, b_info->max_vcpu= s)) @@ -375,7 +397,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, def->mem.cur_balloon =3D VIR_ROUND_UP(def->mem.cur_balloon, 1024); b_info->max_memkb =3D virDomainDefGetMemoryInitial(def); b_info->target_memkb =3D def->mem.cur_balloon; - if (hvm) { + if (hvm || pvh) { if (caps && def->cpu && def->cpu->mode =3D=3D (VIR_CPU_MODE_HOST_PASSTHROU= GH)) { bool hasHwVirt =3D false; @@ -647,6 +669,22 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, return -1; } #endif + } else if (pvh) { + if (VIR_STRDUP(b_info->cmdline, def->os.cmdline) < 0) + return -1; + if (VIR_STRDUP(b_info->kernel, def->os.kernel) < 0) + return -1; + if (VIR_STRDUP(b_info->ramdisk, def->os.initrd) < 0) + return -1; +#ifdef LIBXL_HAVE_BUILDINFO_BOOTLOADER + if (VIR_STRDUP(b_info->bootloader, def->os.bootloader) < 0) + return -1; + if (def->os.bootloaderArgs) { + if (!(b_info->bootloader_args =3D + virStringSplit(def->os.bootloaderArgs, " \t\n", 0))) + return -1; + } +#endif } else { /* * For compatibility with the legacy xen toolstack, default to pyg= rub @@ -1230,7 +1268,7 @@ libxlMakeNic(virDomainDefPtr def, STRNEQ(l_nic->model, "netfront")) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("only model 'netfront' is supported for " - "Xen PV domains")); + "Xen PV(H) domains")); return -1; } if (VIR_STRDUP(x_nic->model, l_nic->model) < 0) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index efd47a3..6287cef 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -6398,9 +6398,11 @@ libxlConnectGetDomainCapabilities(virConnectPtr conn, emulatorbin =3D "/usr/bin/qemu-system-x86_64"; =20 if (machine) { - if (STRNEQ(machine, "xenpv") && STRNEQ(machine, "xenfv")) { + if (STRNEQ(machine, "xenpv") && + STRNEQ(machine, "xenpvh") && + STRNEQ(machine, "xenfv")) { virReportError(VIR_ERR_INVALID_ARG, "%s", - _("Xen only supports 'xenpv' and 'xenfv' machin= es")); + _("Xen only supports 'xenpv', 'xenpvh' and 'xen= fv' machines")); goto cleanup; } } else { --=20 git-series 0.9.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list