[libvirt] [PATCH] libxl: small fix in parsing network

Signed-off-by: Chunyan Liu <cyliu@suse.com> --- src/libxl/libxl_conf.c | 2 +- src/libxl/libxl_domain.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 5133299..48b8826 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1471,7 +1471,7 @@ libxlMakeNicList(virDomainDefPtr def, libxl_domain_config *d_config) VIR_SHRINK_N(x_nics, nnics, nnics - nvnics); d_config->nics = x_nics; - d_config->num_nics = nnics; + d_config->num_nics = nvnics; return 0; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 632acfd..50f7eed 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -315,7 +315,7 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virDomainHostdevSubsysPCIPtr pcisrc; if (dev->type == VIR_DOMAIN_DEVICE_NET) - hostdev = &(dev->data.net)->data.hostdev.def; + hostdev = &dev->data.net->data.hostdev.def; else hostdev = dev->data.hostdev; pcisrc = &hostdev->source.subsys.u.pci; -- 2.1.4

Add codes to support creating domain with network defition of assigning SRIOV VF from a pool. And fix hot plug and unplug SRIOV VF under this kind of network defition. Signed-off-by: Chunyan Liu <cyliu@suse.com> --- Changes: * move bug fix to another patch * use virDomainNetGetActualType instead of multiple times checking --- src/libxl/libxl_conf.c | 3 ++- src/libxl/libxl_domain.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/libxl/libxl_driver.c | 12 ++++++++++++ tests/Makefile.am | 3 +++ 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 48b8826..3cefbaa 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1453,7 +1453,8 @@ libxlMakeNicList(virDomainDefPtr def, libxl_domain_config *d_config) return -1; for (i = 0; i < nnics; i++) { - if (l_nics[i]->type == VIR_DOMAIN_NET_TYPE_HOSTDEV) + if (virDomainNetGetActualType(l_nics[i]) + == VIR_DOMAIN_NET_TYPE_HOSTDEV) continue; if (libxlMakeNic(def, l_nics[i], &x_nics[nvnics])) diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 50f7eed..88d1399 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -36,6 +36,7 @@ #include "virtime.h" #include "locking/domain_lock.h" #include "xen_common.h" +#include "network/bridge_driver.h" #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -929,6 +930,48 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback) libxl_event_free(ctx, ev); } +static int +libxlNetworkPrepareDevices(virDomainDefPtr def) +{ + int ret = -1; + size_t i; + + for (i = 0; i < def->nnets; i++) { + virDomainNetDefPtr net = def->nets[i]; + int actualType; + + /* If appropriate, grab a physical device from the configured + * network's pool of devices, or resolve bridge device name + * to the one defined in the network definition. + */ + if (networkAllocateActualDevice(def, net) < 0) + goto cleanup; + + actualType = virDomainNetGetActualType(net); + if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV && + net->type == VIR_DOMAIN_NET_TYPE_NETWORK) { + /* Each type='hostdev' network device must also have a + * corresponding entry in the hostdevs array. For netdevs + * that are hardcoded as type='hostdev', this is already + * done by the parser, but for those allocated from a + * network / determined at runtime, we need to do it + * separately. + */ + virDomainHostdevDefPtr hostdev = virDomainNetGetActualHostdev(net); + virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci; + + if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && + hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) + pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; + + if (virDomainHostdevInsert(def, hostdev) < 0) + goto cleanup; + } + } + ret = 0; + cleanup: + return ret; +} /* * Start a domain through libxenlight. @@ -1005,6 +1048,9 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, vm, true) < 0) goto cleanup; + if (libxlNetworkPrepareDevices(vm->def) < 0) + goto cleanup; + if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def, cfg->ctx, &d_config) < 0) goto cleanup; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 404016e..eef6651 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3049,6 +3049,12 @@ libxlDomainAttachHostPCIDevice(libxlDriverPrivatePtr driver, libxl_device_pci_init(&pcidev); + /* For those allocated from a network pool/ determined at runtime, it's + * not handled by libxlDomainDeviceDefPostParse as hostdev, we need to + * set backend correctly. + */ + pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; + if (virDomainHostdevFind(vm->def, hostdev, &found) >= 0) { virReportError(VIR_ERR_OPERATION_FAILED, _("target pci device %.4x:%.2x:%.2x.%.1x already exists"), @@ -3390,6 +3396,12 @@ libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr driver, libxl_device_pci_init(&pcidev); + /* For those allocated from a network pool/ determined at runtime, it's + * not handled by libxlDomainDeviceDefPostParse as hostdev, we need to + * set backend correctly. + */ + pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; + idx = virDomainHostdevFind(vm->def, hostdev, &detach); if (idx < 0) { virReportError(VIR_ERR_OPERATION_FAILED, diff --git a/tests/Makefile.am b/tests/Makefile.am index 90981dc..b08cc7a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -530,6 +530,9 @@ endif ! WITH_XEN if WITH_LIBXL libxl_LDADDS = ../src/libvirt_driver_libxl_impl.la +if WITH_NETWORK +libxl_LDADDS += ../src/libvirt_driver_network_impl.la +endif WITH_NETWORK libxl_LDADDS += $(LDADDS) xlconfigtest_SOURCES = \ -- 2.1.4

Hi Chunyan, Sorry for the long delay... On 02/23/2016 01:07 AM, Chunyan Liu wrote:
Add codes to support creating domain with network defition of assigning SRIOV VF from a pool. And fix hot plug and unplug SRIOV VF under this kind of network defition.
Signed-off-by: Chunyan Liu <cyliu@suse.com> --- Changes: * move bug fix to another patch * use virDomainNetGetActualType instead of multiple times checking --- src/libxl/libxl_conf.c | 3 ++- src/libxl/libxl_domain.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/libxl/libxl_driver.c | 12 ++++++++++++ tests/Makefile.am | 3 +++ 4 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 48b8826..3cefbaa 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1453,7 +1453,8 @@ libxlMakeNicList(virDomainDefPtr def, libxl_domain_config *d_config) return -1;
for (i = 0; i < nnics; i++) { - if (l_nics[i]->type == VIR_DOMAIN_NET_TYPE_HOSTDEV) + if (virDomainNetGetActualType(l_nics[i]) + == VIR_DOMAIN_NET_TYPE_HOSTDEV)
AFAICT this change is unrelated to the patch subject and should be done in a separate patch. Also the patch no longer applies cleanly. Can you drop this hunk, rebase, and send a V3? Thanks! Regards, Jim
continue;
if (libxlMakeNic(def, l_nics[i], &x_nics[nvnics])) diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 50f7eed..88d1399 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -36,6 +36,7 @@ #include "virtime.h" #include "locking/domain_lock.h" #include "xen_common.h" +#include "network/bridge_driver.h"
#define VIR_FROM_THIS VIR_FROM_LIBXL
@@ -929,6 +930,48 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback) libxl_event_free(ctx, ev); }
+static int +libxlNetworkPrepareDevices(virDomainDefPtr def) +{ + int ret = -1; + size_t i; + + for (i = 0; i < def->nnets; i++) { + virDomainNetDefPtr net = def->nets[i]; + int actualType; + + /* If appropriate, grab a physical device from the configured + * network's pool of devices, or resolve bridge device name + * to the one defined in the network definition. + */ + if (networkAllocateActualDevice(def, net) < 0) + goto cleanup; + + actualType = virDomainNetGetActualType(net); + if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV && + net->type == VIR_DOMAIN_NET_TYPE_NETWORK) { + /* Each type='hostdev' network device must also have a + * corresponding entry in the hostdevs array. For netdevs + * that are hardcoded as type='hostdev', this is already + * done by the parser, but for those allocated from a + * network / determined at runtime, we need to do it + * separately. + */ + virDomainHostdevDefPtr hostdev = virDomainNetGetActualHostdev(net); + virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci; + + if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && + hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) + pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; + + if (virDomainHostdevInsert(def, hostdev) < 0) + goto cleanup; + } + } + ret = 0; + cleanup: + return ret; +}
/* * Start a domain through libxenlight. @@ -1005,6 +1048,9 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, vm, true) < 0) goto cleanup;
+ if (libxlNetworkPrepareDevices(vm->def) < 0) + goto cleanup; + if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def, cfg->ctx, &d_config) < 0) goto cleanup; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 404016e..eef6651 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3049,6 +3049,12 @@ libxlDomainAttachHostPCIDevice(libxlDriverPrivatePtr driver,
libxl_device_pci_init(&pcidev);
+ /* For those allocated from a network pool/ determined at runtime, it's + * not handled by libxlDomainDeviceDefPostParse as hostdev, we need to + * set backend correctly. + */ + pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; + if (virDomainHostdevFind(vm->def, hostdev, &found) >= 0) { virReportError(VIR_ERR_OPERATION_FAILED, _("target pci device %.4x:%.2x:%.2x.%.1x already exists"), @@ -3390,6 +3396,12 @@ libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr driver,
libxl_device_pci_init(&pcidev);
+ /* For those allocated from a network pool/ determined at runtime, it's + * not handled by libxlDomainDeviceDefPostParse as hostdev, we need to + * set backend correctly. + */ + pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; + idx = virDomainHostdevFind(vm->def, hostdev, &detach); if (idx < 0) { virReportError(VIR_ERR_OPERATION_FAILED, diff --git a/tests/Makefile.am b/tests/Makefile.am index 90981dc..b08cc7a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -530,6 +530,9 @@ endif ! WITH_XEN
if WITH_LIBXL libxl_LDADDS = ../src/libvirt_driver_libxl_impl.la +if WITH_NETWORK +libxl_LDADDS += ../src/libvirt_driver_network_impl.la +endif WITH_NETWORK libxl_LDADDS += $(LDADDS)
xlconfigtest_SOURCES = \

On 3/10/2016 at 08:08 AM, in message <56E0BB0F.3000705@suse.com>, Jim Fehlig <jfehlig@suse.com> wrote: Hi Chunyan,
Sorry for the long delay...
Add codes to support creating domain with network defition of assigning SRIOV VF from a pool. And fix hot plug and unplug SRIOV VF under this kind of network defition.
Signed-off-by: Chunyan Liu <cyliu@suse.com> --- Changes: * move bug fix to another patch * use virDomainNetGetActualType instead of multiple times checking --- src/libxl/libxl_conf.c | 3 ++- src/libxl/libxl_domain.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/libxl/libxl_driver.c | 12 ++++++++++++ tests/Makefile.am | 3 +++ 4 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 48b8826..3cefbaa 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1453,7 +1453,8 @@ libxlMakeNicList(virDomainDefPtr def,
On 02/23/2016 01:07 AM, Chunyan Liu wrote: libxl_domain_config *d_config)
return -1;
for (i = 0; i < nnics; i++) { - if (l_nics[i]->type == VIR_DOMAIN_NET_TYPE_HOSTDEV) + if (virDomainNetGetActualType(l_nics[i]) + == VIR_DOMAIN_NET_TYPE_HOSTDEV)
AFAICT this change is unrelated to the patch subject and should be done in a separate patch. Also the patch no longer applies cleanly. Can you drop this hunk, rebase, and send a V3? Thanks!
Updated. V3 is posted. Thanks, Chunyan
Regards, Jim
continue;
if (libxlMakeNic(def, l_nics[i], &x_nics[nvnics])) diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 50f7eed..88d1399 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -36,6 +36,7 @@ #include "virtime.h" #include "locking/domain_lock.h" #include "xen_common.h" +#include "network/bridge_driver.h"
#define VIR_FROM_THIS VIR_FROM_LIBXL
@@ -929,6 +930,48 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev,
void *for_callback)
libxl_event_free(ctx, ev); }
+static int +libxlNetworkPrepareDevices(virDomainDefPtr def) +{ + int ret = -1; + size_t i; + + for (i = 0; i < def->nnets; i++) { + virDomainNetDefPtr net = def->nets[i]; + int actualType; + + /* If appropriate, grab a physical device from the configured + * network's pool of devices, or resolve bridge device name + * to the one defined in the network definition. + */ + if (networkAllocateActualDevice(def, net) < 0) + goto cleanup; + + actualType = virDomainNetGetActualType(net); + if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV && + net->type == VIR_DOMAIN_NET_TYPE_NETWORK) { + /* Each type='hostdev' network device must also have a + * corresponding entry in the hostdevs array. For netdevs + * that are hardcoded as type='hostdev', this is already + * done by the parser, but for those allocated from a + * network / determined at runtime, we need to do it + * separately. + */ + virDomainHostdevDefPtr hostdev =
virDomainNetGetActualHostdev(net);
+ virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci; + + if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && + hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) + pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; + + if (virDomainHostdevInsert(def, hostdev) < 0) + goto cleanup; + } + } + ret = 0; + cleanup: + return ret; +}
/* * Start a domain through libxenlight. @@ -1005,6 +1048,9 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, vm, true) < 0) goto cleanup;
+ if (libxlNetworkPrepareDevices(vm->def) < 0) + goto cleanup; + if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def, cfg->ctx, &d_config) < 0) goto cleanup; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 404016e..eef6651 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3049,6 +3049,12 @@ libxlDomainAttachHostPCIDevice(libxlDriverPrivatePtr driver,
libxl_device_pci_init(&pcidev);
+ /* For those allocated from a network pool/ determined at runtime, it's + * not handled by libxlDomainDeviceDefPostParse as hostdev, we need to + * set backend correctly. + */ + pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; + if (virDomainHostdevFind(vm->def, hostdev, &found) >= 0) { virReportError(VIR_ERR_OPERATION_FAILED, _("target pci device %.4x:%.2x:%.2x.%.1x already exists"), @@ -3390,6 +3396,12 @@ libxlDomainDetachHostPCIDevice(libxlDriverPrivatePtr driver,
libxl_device_pci_init(&pcidev);
+ /* For those allocated from a network pool/ determined at runtime, it's + * not handled by libxlDomainDeviceDefPostParse as hostdev, we need to + * set backend correctly. + */ + pcisrc->backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN; + idx = virDomainHostdevFind(vm->def, hostdev, &detach); if (idx < 0) { virReportError(VIR_ERR_OPERATION_FAILED, diff --git a/tests/Makefile.am b/tests/Makefile.am index 90981dc..b08cc7a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -530,6 +530,9 @@ endif ! WITH_XEN
if WITH_LIBXL libxl_LDADDS = ../src/libvirt_driver_libxl_impl.la +if WITH_NETWORK +libxl_LDADDS += ../src/libvirt_driver_network_impl.la +endif WITH_NETWORK libxl_LDADDS += $(LDADDS)
xlconfigtest_SOURCES = \

On 02/23/2016 01:07 AM, Chunyan Liu wrote:
Signed-off-by: Chunyan Liu <cyliu@suse.com> --- src/libxl/libxl_conf.c | 2 +- src/libxl/libxl_domain.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
I know it is super nit-picking, but ideally this should have been two patches. I realized that after committing the patch :-). Regards, Jim
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 5133299..48b8826 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1471,7 +1471,7 @@ libxlMakeNicList(virDomainDefPtr def, libxl_domain_config *d_config)
VIR_SHRINK_N(x_nics, nnics, nnics - nvnics); d_config->nics = x_nics; - d_config->num_nics = nnics; + d_config->num_nics = nvnics;
return 0;
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 632acfd..50f7eed 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -315,7 +315,7 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virDomainHostdevSubsysPCIPtr pcisrc;
if (dev->type == VIR_DOMAIN_DEVICE_NET) - hostdev = &(dev->data.net)->data.hostdev.def; + hostdev = &dev->data.net->data.hostdev.def; else hostdev = dev->data.hostdev; pcisrc = &hostdev->source.subsys.u.pci;
participants (3)
-
Chun Yan Liu
-
Chunyan Liu
-
Jim Fehlig