提交 de8607d7 编写于 作者: J Joao Martins 提交者: Jim Fehlig

libxl: reverse defaults on HVM net device attach

libvirt libxl picks its own default with respect to the default NIC
to use. libxlMakeNic is the one responsible for this and on boot it
picks LIBXL_NIC_TYPE_VIF_IOEMU for HVM domains such that it accomodates
both PV and emulated one. The good behaving guest at boot will then
select the pv and unplug the emulated device.

Now, on HVM when attaching an interface it will pick the same default
that is LIBXL_NIC_TYPE_VIF_IOEMU which as a result will fail the attach
(see xen commit 32e9d0f ("libxl: nic type defaults to vif in hotplug for
hvm guest"). Xen doesn't yet support the hotplug of emulated devices,
but we don't want to rule out that case either, which might get support
in the future. Hence we simply reverse the defaults when we are
attaching the interface which allows libvirt to prefer the PV nic first
without adding "model='netfront'" following the same pattern as above
commit. Also to avoid ruling out the emulated one we set to
LIBXL_NIC_TYPE_IOEMU when setting a model type that is not 'netfront'.
Signed-off-by: NJoao Martins <joao.m.martins@oracle.com>
Signed-off-by: NJim Fehlig <jfehlig@suse.com>
上级 340bb6b7
...@@ -892,9 +892,9 @@ libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config *d_config) ...@@ -892,9 +892,9 @@ libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config *d_config)
int int
libxlMakeNic(virDomainDefPtr def, libxlMakeNic(virDomainDefPtr def,
virDomainNetDefPtr l_nic, virDomainNetDefPtr l_nic,
libxl_device_nic *x_nic) libxl_device_nic *x_nic,
bool attach)
{ {
bool ioemu_nic = def->os.type == VIR_DOMAIN_OSTYPE_HVM;
virDomainNetType actual_type = virDomainNetGetActualType(l_nic); virDomainNetType actual_type = virDomainNetGetActualType(l_nic);
virNetworkPtr network = NULL; virNetworkPtr network = NULL;
virConnectPtr conn = NULL; virConnectPtr conn = NULL;
...@@ -918,16 +918,39 @@ libxlMakeNic(virDomainDefPtr def, ...@@ -918,16 +918,39 @@ libxlMakeNic(virDomainDefPtr def,
virMacAddrGetRaw(&l_nic->mac, x_nic->mac); virMacAddrGetRaw(&l_nic->mac, x_nic->mac);
if (ioemu_nic) /*
x_nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU; * The nictype field of libxl_device_nic structure tells Xen which type of
else * NIC device to create for the domain. LIBXL_NIC_TYPE_VIF specifies a
x_nic->nictype = LIBXL_NIC_TYPE_VIF; * PV NIC. LIBXL_NIC_TYPE_VIF_IOEMU specifies a PV and emulated NIC,
* allowing the domain to choose which NIC to use and unplug the unused
* one. LIBXL_NIC_TYPE_VIF_IOEMU is only valid for HVM domains. Further,
* if hotplugging the NIC, emulated NICs are currently not supported.
* Alternatively one could set LIBXL_NIC_TYPE_UNKNOWN and let libxl decide,
* but its behaviour might not be consistent across all libvirt supported
* versions. The other nictype values are well established already, hence
* we manually select our own default and mimic xl/libxl behaviour starting
* xen commit 32e9d0f ("libxl: nic type defaults to vif in hotplug for
* hvm guest").
*/
if (l_nic->model) { if (l_nic->model) {
if (def->os.type == VIR_DOMAIN_OSTYPE_XEN &&
STRNEQ(l_nic->model, "netfront")) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("only model 'netfront' is supported for "
"Xen PV domains"));
return -1;
}
if (VIR_STRDUP(x_nic->model, l_nic->model) < 0) if (VIR_STRDUP(x_nic->model, l_nic->model) < 0)
goto cleanup; goto cleanup;
if (STREQ(l_nic->model, "netfront")) if (STREQ(l_nic->model, "netfront"))
x_nic->nictype = LIBXL_NIC_TYPE_VIF; x_nic->nictype = LIBXL_NIC_TYPE_VIF;
else
x_nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU;
} else {
if (def->os.type == VIR_DOMAIN_OSTYPE_HVM && !attach)
x_nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU;
else
x_nic->nictype = LIBXL_NIC_TYPE_VIF;
} }
if (VIR_STRDUP(x_nic->ifname, l_nic->ifname) < 0) if (VIR_STRDUP(x_nic->ifname, l_nic->ifname) < 0)
...@@ -1058,7 +1081,7 @@ libxlMakeNicList(virDomainDefPtr def, libxl_domain_config *d_config) ...@@ -1058,7 +1081,7 @@ libxlMakeNicList(virDomainDefPtr def, libxl_domain_config *d_config)
if (virDomainNetGetActualType(l_nics[i]) == VIR_DOMAIN_NET_TYPE_HOSTDEV) if (virDomainNetGetActualType(l_nics[i]) == VIR_DOMAIN_NET_TYPE_HOSTDEV)
continue; continue;
if (libxlMakeNic(def, l_nics[i], &x_nics[nvnics])) if (libxlMakeNic(def, l_nics[i], &x_nics[nvnics], false))
goto error; goto error;
/* /*
* The devid (at least right now) will not get initialized by * The devid (at least right now) will not get initialized by
......
...@@ -178,7 +178,8 @@ libxlMakeDisk(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev); ...@@ -178,7 +178,8 @@ libxlMakeDisk(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev);
int int
libxlMakeNic(virDomainDefPtr def, libxlMakeNic(virDomainDefPtr def,
virDomainNetDefPtr l_nic, virDomainNetDefPtr l_nic,
libxl_device_nic *x_nic); libxl_device_nic *x_nic,
bool attach);
int int
libxlMakeVfb(virPortAllocatorPtr graphicsports, libxlMakeVfb(virPortAllocatorPtr graphicsports,
virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb); virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb);
......
...@@ -3379,7 +3379,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver, ...@@ -3379,7 +3379,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
goto cleanup; goto cleanup;
} }
if (libxlMakeNic(vm->def, net, &nic) < 0) if (libxlMakeNic(vm->def, net, &nic, true) < 0)
goto cleanup; goto cleanup;
if (libxl_device_nic_add(cfg->ctx, vm->def->id, &nic, 0)) { if (libxl_device_nic_add(cfg->ctx, vm->def->id, &nic, 0)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册