From 930398583d5a590c511e58057d000e1ed7defb82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Fri, 23 Sep 2016 16:13:37 +0200 Subject: [PATCH 2/2] libxl: attach PCI device to qemu only after setting pciback/pcifront MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Organization: Invisible Things Lab Cc: Marek Marczykowski-Górecki When qemu is running in stubdomain, handling "pci-ins" command will fail if pcifront is not initialized already. Fix this by sending such command only after confirming that pciback/front is running. Signed-off-by: Marek Marczykowski-Górecki --- tools/libxl/libxl_pci.c | 50 ++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 2942772..88f8f5b 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -891,34 +891,15 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, i libxl_ctx *ctx = libxl__gc_owner(gc); libxl_domain_type type = libxl__domain_type(gc, domid); char *sysfs_path; + char *be_path; FILE *f; unsigned long long start, end, flags, size; - int irq, i, rc, hvm = 0; + int irq, i, rc, hvm = (type == LIBXL_DOMAIN_TYPE_HVM); uint32_t flag = XEN_DOMCTL_DEV_RDM_RELAXED; if (type == LIBXL_DOMAIN_TYPE_INVALID) return ERROR_FAIL; - if (type == LIBXL_DOMAIN_TYPE_HVM) { - hvm = 1; - if (libxl__wait_for_device_model_deprecated(gc, domid, "running", - NULL, NULL, NULL) < 0) { - return ERROR_FAIL; - } - switch (libxl__device_model_version_running(gc, domid)) { - case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: - rc = qemu_pci_add_xenstore(gc, domid, pcidev); - break; - case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: - rc = libxl__qmp_pci_add(gc, domid, pcidev); - break; - default: - return ERROR_INVAL; - } - if ( rc ) - return ERROR_FAIL; - } - sysfs_path = libxl__sprintf(gc, SYSFS_PCI_DEV"/"PCI_BDF"/resource", pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func); f = fopen(sysfs_path, "r"); @@ -1001,10 +982,33 @@ out: } } - if (!starting && !hvm) + if (!starting && !hvm) { rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting); - else + be_path = libxl__sprintf(gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(gc, 0), domid); + if (libxl__wait_for_backend(gc, be_path, GCSPRINTF("%d", XenbusStateConnected)) < 0) + return ERROR_FAIL; + } else rc = 0; + + if (type == LIBXL_DOMAIN_TYPE_HVM) { + if (libxl__wait_for_device_model_deprecated(gc, domid, "running", + NULL, NULL, NULL) < 0) { + return ERROR_FAIL; + } + switch (libxl__device_model_version_running(gc, domid)) { + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: + rc = qemu_pci_add_xenstore(gc, domid, pcidev); + break; + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: + rc = libxl__qmp_pci_add(gc, domid, pcidev); + break; + default: + return ERROR_INVAL; + } + if ( rc ) + return ERROR_FAIL; + } + return rc; } -- 2.5.5