mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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@canonical.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
(cherry picked from commit 2d03be65d5)
This commit is contained in:
1 parent
50082c5090
commit
449062ac36
1 file changed
+24
-11
+24
-11
@@ -628,6 +628,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;
|
||||
@@ -668,6 +669,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);
|
||||
@@ -980,17 +1004,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:
|
||||
{
|
||||
|
||||