[libvirt] [PATCH] libxl: support dom0

Michal Privoznik mprivozn at redhat.com
Wed Jul 8 12:04:14 UTC 2015


On 07.07.2015 01:27, Jim Fehlig wrote:
> 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
> 

ACK with this squashed in.

Michal




More information about the libvir-list mailing list