[libvirt] [PATCH] libxl: support dom0

Jim Fehlig jfehlig at suse.com
Mon Jul 6 23:27:12 UTC 2015


On 07/06/2015 03:46 PM, Jim Fehlig wrote:
> In Xen, dom0 is really just another domain that supports ballooning,
> adding/removing devices, changing vcpu configuration, etc. This patch
> adds support to the libxl driver for managing dom0. Note that the
> legacy xend driver has long supported managing dom0.
>
> Operations that are not supported on dom0 are filtered in libvirt
> where a sensible error is reported. Errors from libxl are not
> always helpful. E.g., attempting a save on dom0 results in
>
> 2015-06-23 15:25:05 MDT libxl: debug: libxl_dom.c:1570:libxl__toolstack_save: domain=0 toolstack data size=8
> 2015-06-23 15:25:05 MDT libxl: debug: libxl.c:979:do_libxl_domain_suspend: ao 0x7f7e68000b70: inprogress: poller=0x7f7e68000930, flags=i
> 2015-06-23 15:25:05 MDT libxl-save-helper: debug: starting save: Success
> 2015-06-23 15:25:05 MDT xc: detail: xc_domain_save_suse: starting save of domid 0
> 2015-06-23 15:25:05 MDT xc: error: Couldn't map live_shinfo (3 = No such process): Internal error
> 2015-06-23 15:25:05 MDT xc: detail: Save exit of domid 0 with errno=3
> 2015-06-23 15:25:05 MDT libxl-save-helper: debug: complete r=1: No such process
> 2015-06-23 15:25:05 MDT libxl: error: libxl_dom.c:1876:libxl__xc_domain_save_done: saving domain: domain did not respond to suspend request: No such process
> 2015-06-23 15:25:05 MDT libxl: error: libxl_dom.c:2033:remus_teardown_done: Remus: failed to teardown device for guest with domid 0, rc -8
>
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
>   src/libxl/libxl_driver.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 95 insertions(+)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 149ef70..d0b76ac 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -79,6 +79,15 @@ VIR_LOG_INIT("libxl.libxl_driver");
>   /* Number of Xen scheduler parameters */
>   #define XEN_SCHED_CREDIT_NPARAM   2
>   
> +#define LIBXL_CHECK_DOM0_GOTO(name, label)                               \
> +    do {                                                                  \
> +        if (STREQ_NULLABLE(name, "Domain-0")) {                           \
> +            virReportError(VIR_ERR_OPERATION_INVALID, "%s",               \
> +                           _("Domain-0 does not support requested operation")); \
> +            goto label;                                                   \
> +        }                                                                 \
> +    } while (0)
> +
>   
>   static libxlDriverPrivatePtr libxl_driver;
>   
> @@ -501,6 +510,62 @@ const struct libxl_event_hooks ev_hooks = {
>   };
>   
>   static int
> +libxlAddDom0(libxlDriverPrivatePtr driver)
> +{
> +    libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
> +    virDomainDefPtr def = NULL;
> +    virDomainObjPtr vm = NULL;
> +    virDomainDefPtr oldDef = NULL;
> +    libxl_dominfo d_info;
> +    int ret = -1;
> +
> +    libxl_dominfo_init(&d_info);
> +
> +    /* Ensure we have a dom0 */
> +    if (libxl_domain_info(cfg->ctx, &d_info, 0) != 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "%s", _("unable to get Domain-0 information from libxenlight"));
> +        goto cleanup;
> +    }
> +
> +    if (!(def = virDomainDefNew()))
> +        goto cleanup;
> +
> +    def->id = 0;
> +    def->virtType = VIR_DOMAIN_VIRT_XEN;
> +    if (VIR_STRDUP(def->name, "Domain-0") < 0)
> +        goto cleanup;
> +
> +    def->os.type = VIR_DOMAIN_OSTYPE_XEN;
> +
> +    if (virUUIDParse("00000000-0000-0000-0000-000000000000", def->uuid) < 0)
> +        goto cleanup;
> +
> +    vm->def->vcpus = d_info.vcpu_online;
> +    vm->def->maxvcpus = d_info.vcpu_max_id + 1;
> +    vm->def->mem.cur_balloon = d_info.current_memkb;
> +    vm->def->mem.max_balloon = d_info.max_memkb;

Opps. Before sending the patch, but after testing it again, I moved the call to 
libxl_domain_info to the beginning of this function.  I also moved setting the 
vcpu and memory info earlier, but

> +
> +    if (!(vm = virDomainObjListAdd(driver->domains, def,
> +                                   driver->xmlopt,
> +                                   0,
> +                                   &oldDef)))
> +        goto cleanup;
> +
> +    def = NULL;
> +    ret = 0;

before getting a virDomainObj - ouch.  Consider the following obvious fix 
squashed in

diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index d0b76ac..c0dd00b 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -541,18 +541,19 @@ libxlAddDom0(libxlDriverPrivatePtr driver)
      if (virUUIDParse("00000000-0000-0000-0000-000000000000", def->uuid) < 0)
          goto cleanup;

+    if (!(vm = virDomainObjListAdd(driver->domains, def,
+                                   driver->xmlopt,
+                                   0,
+                                   &oldDef)))
+        goto cleanup;
+
+    def = NULL;
+
      vm->def->vcpus = d_info.vcpu_online;
      vm->def->maxvcpus = d_info.vcpu_max_id + 1;
      vm->def->mem.cur_balloon = d_info.current_memkb;
      vm->def->mem.max_balloon = d_info.max_memkb;

-    if (!(vm = virDomainObjListAdd(driver->domains, def,
-                                   driver->xmlopt,
-                                   0,
-                                   &oldDef)))
-        goto cleanup;
-
-    def = NULL;
      ret = 0;

   cleanup:

Regards,
Jim




More information about the libvir-list mailing list