[libvirt] [PATCH 1/2] libxl: expose multiple emulators per guest in the capabilities XML
Jim Fehlig
jfehlig at suse.com
Mon Apr 29 18:18:56 UTC 2013
David Scott wrote:
> libxl allows users to choose between two standard emulators:
> 1. (default in xen-4.2): qemu "traditional" (aka "qemu-dm")
> 2. (default in xen-4.3): qemu "upstream" (aka "qemu-system-i386")
>
> The person who builds and packages xen gets to choose which
> emulators are built. We examine the filesystem for the emulators
> at runtime and expose them as separate "domains" within the same
> "guest" architecture.
>
> Signed-off-by: David Scott <dave.scott at eu.citrix.com>
> ---
> src/libxl/libxl_conf.c | 87 ++++++++++++++++++++++++++++++++++++-----------
> 1 files changed, 66 insertions(+), 21 deletions(-)
>
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index 7e0753a..472d116 100644
> --- a/src/libxl/libxl_conf.c
> +++ b/src/libxl/libxl_conf.c
> @@ -29,6 +29,8 @@
> #include <libxl.h>
> #include <sys/types.h>
> #include <sys/socket.h>
> +#include <sys/stat.h>
> +#include <unistd.h>
>
> #include "internal.h"
> #include "virlog.h"
> @@ -50,6 +52,28 @@
> /* see xen-unstable.hg/xen/include/asm-x86/cpufeature.h */
> #define LIBXL_X86_FEATURE_PAE_MASK 0x40
>
> +enum emulator_type {
> + emulator_traditional = 0,
> + emulator_upstream = 1,
> + emulator_last = 2,
> + /* extend with specific qemu versions later */
> +};
>
Do you think this will need to be extended in the future? As
'qemu-traditional' goes by way of the Dodo, this won't be needed right?
> +
> +#define EMULATOR_LIB64 "/usr/lib64/xen/bin/"
> +#define EMULATOR_LIB32 "/usr/lib/xen/bin/"
> +
> +#define EMULATOR_TRADITIONAL "qemu-dm"
> +#define EMULATOR_UPSTREAM "qemu-system-i386"
>
I think this could be made quite a bit simpler with something like
#define LIBXL_EMULATOR_TRADITIONAL_PATH LIBDIR "/xen/bin/qemu-dm"
#define LIBXL_EMULATOR_UPSTREAM_PATH LIBDIR "/xen/bin/qemu-sytstem-i386"
> +
> +static const char* emulator_lib64_path [] = {
> + EMULATOR_LIB64 EMULATOR_TRADITIONAL,
> + EMULATOR_LIB64 EMULATOR_UPSTREAM,
> +};
> +
> +static const char* emulator_lib32_path [] = {
> + EMULATOR_LIB32 EMULATOR_TRADITIONAL,
> + EMULATOR_LIB32 EMULATOR_UPSTREAM,
> +};
>
> struct guest_arch {
> virArch arch;
> @@ -68,10 +92,11 @@ static virCapsPtr
> libxlBuildCapabilities(virArch hostarch,
> int host_pae,
> struct guest_arch *guest_archs,
> - int nr_guest_archs)
> + int nr_guest_archs,
> + int emulators_found[])
> {
> virCapsPtr caps;
> - int i;
> + int i, j;
>
> if ((caps = virCapabilitiesNew(hostarch, 1, 1)) == NULL)
> goto no_memory;
> @@ -91,12 +116,8 @@ libxlBuildCapabilities(virArch hostarch,
> if ((guest = virCapabilitiesAddGuest(caps,
> guest_archs[i].hvm ? "hvm" : "xen",
> guest_archs[i].arch,
> - ((hostarch == VIR_ARCH_X86_64) ?
> - "/usr/lib64/xen/bin/qemu-dm" :
> - "/usr/lib/xen/bin/qemu-dm"),
> - (guest_archs[i].hvm ?
> - "/usr/lib/xen/boot/hvmloader" :
> - NULL),
> + NULL,
> + NULL,
> 1,
> machines)) == NULL) {
> virCapabilitiesFreeMachines(machines, 1);
> @@ -104,13 +125,21 @@ libxlBuildCapabilities(virArch hostarch,
> }
> machines = NULL;
>
> - if (virCapabilitiesAddGuestDomain(guest,
> - "xen",
> - NULL,
> - NULL,
> - 0,
> - NULL) == NULL)
> - goto no_memory;
> + for (j = 0; j < emulator_last; ++j) {
> + if (emulators_found[j] == -1) /* failure from stat(2) */
> + continue;
> + if (virCapabilitiesAddGuestDomain(guest,
> + "xen",
> + ((hostarch == VIR_ARCH_X86_64) ?
> + emulator_lib64_path[j] :
> + emulator_lib32_path[j]),
> + (guest_archs[i].hvm ?
> + "/usr/lib/xen/boot/hvmloader" :
> + NULL),
> + 0,
> + NULL) == NULL)
> + goto no_memory;
> + }
>
and then just add the emulators here. E.g.
if (virFileExists(LIBXL_EMULATOR_TRADITIONAL_PATH) {
if (virCapabilitiesAddGuestDomain(guest,
"xen",
LIBXL_EMULATOR_TRADITIONAL_PATH
(guest_archs[i].hvm ?
"/usr/lib/xen/boot/hvmloader" :
NULL),
0,
NULL) == NULL)
goto no_memory;
}
if (virFileExists(LIBXL_EMULATOR_UPSTREAM_PATH) {
if (virCapabilitiesAddGuestDomain(guest,
"xen",
LIBXL_EMULATOR_UPSTREAM_PATH
(guest_archs[i].hvm ?
"/usr/lib/xen/boot/hvmloader" :
NULL),
0,
NULL) == NULL)
goto no_memory;
}
Regards,
Jim
>
> if (guest_archs[i].pae &&
> virCapabilitiesAddGuestFeature(guest,
> @@ -163,7 +192,8 @@ libxlBuildCapabilities(virArch hostarch,
> static virCapsPtr
> libxlMakeCapabilitiesInternal(virArch hostarch,
> libxl_physinfo *phy_info,
> - char *capabilities)
> + char *capabilities,
> + int emulators_found[])
> {
> char *str, *token;
> regmatch_t subs[4];
> @@ -243,7 +273,7 @@ libxlMakeCapabilitiesInternal(virArch hostarch,
> continue;
> }
>
> - /* Search for existing matching (model,hvm) tuple */
> + /* Search for existing matching (arch,hvm) tuple */
> for (i = 0 ; i < nr_guest_archs ; i++) {
> if ((guest_archs[i].arch == arch) &&
> guest_archs[i].hvm == hvm) {
> @@ -277,7 +307,8 @@ libxlMakeCapabilitiesInternal(virArch hostarch,
> if ((caps = libxlBuildCapabilities(hostarch,
> host_pae,
> guest_archs,
> - nr_guest_archs)) == NULL)
> + nr_guest_archs,
> + emulators_found)) == NULL)
> goto no_memory;
>
> return caps;
> @@ -756,9 +787,13 @@ error:
> virCapsPtr
> libxlMakeCapabilities(libxl_ctx *ctx)
> {
> - int err;
> + int i, err;
> libxl_physinfo phy_info;
> const libxl_version_info *ver_info;
> + struct stat sbuf;
> + const char *path;
> + virArch hostarch;
> + int emulators_found[emulator_last];
>
> err = regcomp(&xen_cap_rec, xen_cap_re, REG_EXTENDED);
> if (err != 0) {
> @@ -782,9 +817,19 @@ libxlMakeCapabilities(libxl_ctx *ctx)
> return NULL;
> }
>
> - return libxlMakeCapabilitiesInternal(virArchFromHost(),
> + hostarch = virArchFromHost();
> +
> + for (i = 0; i < emulator_last; i++){
> + path = (hostarch == VIR_ARCH_X86_64)?
> + emulator_lib64_path[i]:
> + emulator_lib32_path[i];
> + emulators_found[i] = stat(path, &sbuf);
> + }
> +
> + return libxlMakeCapabilitiesInternal(hostarch,
> &phy_info,
> - ver_info->capabilities);
> + ver_info->capabilities,
> + emulators_found);
> }
>
> int
>
More information about the libvir-list
mailing list