From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Marczykowski Subject: [PATCH RESENT] libxl: add all pci devices to xenstore at once (during VM create) Date: Fri, 10 Jun 2011 12:59:16 +0200 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com Cc: marmarek@mimuw.edu.pl List-Id: xen-devel@lists.xenproject.org # HG changeset patch # User Marek Marczykowski # Date 1307661438 -7200 # Node ID dde7bd609f9b2e795e9c530e8422ae42a86f9b6b # Parent b2b8fef3732c10f012fc209d2850e80d95471582 libxl: add all pci devices to xenstore at once (during VM create) When adding pci devices one by one, pciback notice only the first one. For every next, "state" is left as is (usualy "4" in that time), so backend will not rescan xenstore. So when VM is starting all devices should be added at once and then backend can initialize it. This applies only to pci, because only pci backend have one xenstore dir for multiple devices. Signed-off-by: Marek Marczykowski diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -521,6 +521,11 @@ static int do_domain_create(libxl__gc *g for (i = 0; i < d_config->num_pcidevs; i++) libxl__device_pci_add(gc, domid, &d_config->pcidevs[i], 1); + ret = libxl__create_pci_backend(gc, domid, d_config->pcidevs, d_config->num_pcidevs); + if (ret < 0) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_create_pci_backend failed: %d", ret); + goto error_out; + } if ( cb && (d_config->c_info.hvm || d_config->b_info.u.pv.bootloader )) { if ( (*cb)(ctx, domid, priv) ) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -224,6 +224,7 @@ _hidden int libxl__wait_for_backend(libx /* from libxl_pci */ _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting); +_hidden int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int num); /* xl_exec */ diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -221,7 +221,7 @@ static void libxl_create_pci_backend_dev flexarray_append_pair(back, libxl__sprintf(gc, "state-%d", num), libxl__sprintf(gc, "%d", 1)); } -static int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int num) +int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int num) { libxl_ctx *ctx = libxl__gc_owner(gc); flexarray_t *front = NULL; @@ -705,7 +705,10 @@ out: } } - rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting); + if (!starting) + rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting); + else + rc = 0; return rc; }