[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] libxl: Auto-assign NIC devids in initiate_domain_create
commit 2d03be65d5c50053fec4a5fa1d691972e5d953c9 Author: Stefan Bader <stefan.bader@xxxxxxxxxxxxx> AuthorDate: Wed Jan 8 18:26:59 2014 +0100 Commit: Ian Campbell <ian.campbell@xxxxxxxxxx> CommitDate: Thu Jan 9 15:29:03 2014 +0000 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> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- tools/libxl/libxl_create.c | 35 ++++++++++++++++++++++++----------- 1 files 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: { -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |