[libvirt] [PATCH 03/12] libxl: Earlier detection of not running on Xen

Michal Privoznik mprivozn at redhat.com
Mon Sep 2 11:08:39 UTC 2013


On 30.08.2013 23:46, Jim Fehlig wrote:
> Detect early on in libxl driver initialization if the driver
> should be loaded at all, avoiding needless initialization steps
> that only have to be undone later.  While at it, move th

s/th/the/

> detection to a helper function to improve readability.
> 
> After detecting that the driver should be loaded, subsequent
> failures such as initializing the log stream, allocating libxl
> ctx, etc. should be treated as failure to initialize the driver.
> 
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
>  src/libxl/libxl_driver.c | 62 +++++++++++++++++++++++++++++++-----------------
>  1 file changed, 40 insertions(+), 22 deletions(-)
> 
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index ff4f6be..759fed5 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -775,34 +775,54 @@ libxlStateCleanup(void)
>      return 0;
>  }
>  
> -static int
> -libxlStateInitialize(bool privileged,
> -                     virStateInhibitCallback callback ATTRIBUTE_UNUSED,
> -                     void *opaque ATTRIBUTE_UNUSED)
> +static bool
> +libxlDriverShouldLoad(bool privileged)
>  {
> -    const libxl_version_info *ver_info;
> -    char *log_file = NULL;
> +    bool ret = false;
>      virCommandPtr cmd;
> -    int status, ret = 0;
> -    unsigned int free_mem;
> -    char ebuf[1024];
> +    int status;
>  
> -    /* Disable libxl driver if non-root */
> +    /* Don't load if non-root */
>      if (!privileged) {
>          VIR_INFO("Not running privileged, disabling libxenlight driver");
> -        return 0;
> +        return ret;
> +    }
> +
> +    /* Don't load if not running on a Xen control domain (dom0) */
> +    if (!virFileExists("/proc/xen/capabilities")) {
> +        VIR_INFO("No Xen capabilities detected, probably not running "
> +                 "in a Xen Dom0.  Disabling libxenlight driver");
> +
> +        return ret;
>      }
>  
> -    /* Disable driver if legacy xen toolstack (xend) is in use */
> +   /* Don't load if legacy xen toolstack (xend) is in use */

Indentation off.

>      cmd = virCommandNewArgList("/usr/sbin/xend", "status", NULL);
>      if (virCommandRun(cmd, &status) == 0 && status == 0) {
>          VIR_INFO("Legacy xen tool stack seems to be in use, disabling "
>                    "libxenlight driver.");
> -        virCommandFree(cmd);
> -        return 0;
> +    } else {
> +        ret = true;
>      }
>      virCommandFree(cmd);
>  
> +    return ret;
> +}
> +
> +static int
> +libxlStateInitialize(bool privileged,
> +                     virStateInhibitCallback callback ATTRIBUTE_UNUSED,
> +                     void *opaque ATTRIBUTE_UNUSED)
> +{
> +    const libxl_version_info *ver_info;
> +    char *log_file = NULL;
> +    int ret = 0;
> +    unsigned int free_mem;
> +    char ebuf[1024];
> +
> +    if (!libxlDriverShouldLoad(privileged))
> +        return 0;
> +
>      if (VIR_ALLOC(libxl_driver) < 0)
>          return -1;
>  
> @@ -883,21 +903,20 @@ libxlStateInitialize(bool privileged,
>      libxl_driver->logger =
>              (xentoollog_logger *)xtl_createlogger_stdiostream(libxl_driver->logger_file, XTL_DEBUG, 0);
>      if (!libxl_driver->logger) {
> -        VIR_INFO("cannot create logger for libxenlight, disabling driver");
> -        goto fail;
> +        VIR_ERROR(_("Failed to create logger for libxenlight"));
> +        goto error;
>      }
>  
>      if (libxl_ctx_alloc(&libxl_driver->ctx,
>                         LIBXL_VERSION, 0,
>                         libxl_driver->logger)) {
> -        VIR_INFO("cannot initialize libxenlight context, probably not running "
> -                 "in a Xen Dom0, disabling driver");
> -        goto fail;
> +        VIR_ERROR(_("Failed to initialize libxenlight context"));
> +        goto error;
>      }
>  
>      if ((ver_info = libxl_get_version_info(libxl_driver->ctx)) == NULL) {
> -        VIR_INFO("cannot version information from libxenlight, disabling driver");
> -        goto fail;
> +        VIR_ERROR(_("Failed to get version information from libxenlight"));
> +        goto error;
>      }
>      libxl_driver->version = (ver_info->xen_version_major * 1000000) +
>              (ver_info->xen_version_minor * 1000);
> @@ -956,7 +975,6 @@ libxlStateInitialize(bool privileged,
>  
>  error:
>      ret = -1;
> -fail:
>      VIR_FREE(log_file);
>      if (libxl_driver)
>          libxlDriverUnlock(libxl_driver);
> 

ACK with those two nits fixed.

Michal




More information about the libvir-list mailing list