[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] libxl: Auto-assign NIC devids in initiate_domain_create



On Thu, 2014-01-09 at 11:33 +0100, Stefan Bader wrote:
> This appeared to be working on a quick test with a caller leaving
> all devids unset when starting an HVM guest and one that sets them
> all. Possible optimazations (maybe nice to have but probably not
> important):
> 1. something more complicated to find gaps in devids
> 2. limit auto-assignment in initiate_domain_create to HVM domains
> 
> -Stefan
> 
> From bafc8f62ee3e3175ec4d978bceba4b5f891a597d Mon Sep 17 00:00:00 2001
> From: Stefan Bader <stefan.bader@xxxxxxxxxxxxx>
> Date: Wed, 8 Jan 2014 18:26:59 +0100
> Subject: [PATCH] libxl: Auto-assign NIC devids in initiate_domain_create
> 
> This will change initiate_domain_create to walk through NIC definitions
> and automatically assign devids to those which have not assigned one.
> The devids are needed later in domcreate_launch_dm (for HVM domains
> using emulated NICs). The command string for starting the device-model
> has those ids as part of its arguments.
> Assignment of devids in the hotplug case is handled by libxl_device_nic_add
> but that would be called too late in the startup case.
> I also moved the call to libxl__device_nic_setdefault here as this seems
> to be the only path leading there and avoids doing the loop a third time.
> The two loops are trying to handle a case where the caller sets some devids
> (not sure that should be valid) but leaves some unset.
> 
> Signed-off-by: Stefan Bader <stefan.bader@xxxxxxxxxxxxx>

Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

I think from a release point of view we should take this since it is a
bug fix to the API which at least libvirt has tripped over (although
libvirt has worked around it, others may not have done so).

Ian J: Does that make sense?

> ---
>  tools/libxl/libxl_create.c |   35 ++++++++++++++++++++++++-----------
>  1 file changed, 24 insertions(+), 11 deletions(-)
> 
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index e03bb55..543e0c8 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -706,6 +706,7 @@ static void initiate_domain_create(libxl__egc *egc,
>      libxl_ctx *ctx = libxl__gc_owner(gc);
>      uint32_t domid;
>      int i, ret;
> +    size_t last_devid = -1;
>  
>      /* convenience aliases */
>      libxl_domain_config *const d_config = dcs->guest_config;
> @@ -746,6 +747,29 @@ static void initiate_domain_create(libxl__egc *egc,
>      libxl_device_disk *bootdisk =
>          d_config->num_disks > 0 ? &d_config->disks[0] : NULL;
>  
> +    /*
> +     * The devid has to be set before launching the device model. For the
> +     * hotplug case this is done in libxl_device_nic_add but on domain
> +     * creation this is called too late.
> +     * Make two runs over configured NICs in order to avoid duplicate IDs
> +     * in case the caller partially assigned IDs.
> +     */
> +    for (i = 0; i < d_config->num_nics; i++) {
> +        /* We have to init the nic here, because we still haven't
> +         * called libxl_device_nic_add when domcreate_launch_dm gets called,
> +         * but qemu needs the nic information to be complete.
> +         */
> +        ret = libxl__device_nic_setdefault(gc, &d_config->nics[i], domid);
> +        if (ret) goto error_out;
> +
> +        if (d_config->nics[i].devid > last_devid)
> +            last_devid = d_config->nics[i].devid;
> +    }
> +    for (i = 0; i < d_config->num_nics; i++) {
> +        if (d_config->nics[i].devid < 0)
> +            d_config->nics[i].devid = ++last_devid;
> +    }
> +
>      if (restore_fd >= 0) {
>          LOG(DEBUG, "restoring, not running bootloader\n");
>          domcreate_bootloader_done(egc, &dcs->bl, 0);
> @@ -1058,17 +1082,6 @@ static void domcreate_launch_dm(libxl__egc *egc, 
> libxl__multidev *multidev,
>          }
>      }
>  
> -
> -
> -    for (i = 0; i < d_config->num_nics; i++) {
> -        /* We have to init the nic here, because we still haven't
> -         * called libxl_device_nic_add at this point, but qemu needs
> -         * the nic information to be complete.
> -         */
> -        ret = libxl__device_nic_setdefault(gc, &d_config->nics[i], domid);
> -        if (ret)
> -            goto error_out;
> -    }
>      switch (d_config->c_info.type) {
>      case LIBXL_DOMAIN_TYPE_HVM:
>      {



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.