[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH, RFC]: qemu: hang-free/error-tolerant PCI hot-plug protocol



On Thu, 2010-07-29 at 18:54 +0100, Gianni Tedesco wrote:
> Hi,
> 
> The interface for PCI hotplug is flexible enough to shoot ones-self in
> the foot. It is possible to try to insert a PCI device in to a slot
> already occupied by a qemu emulated device (NIC, PIIX, ISA-bridge, etc.)
> In this case qemu (wisely) refuses to do the hotplug. Since there is no
> way for a toolstack to query qemu's pci device layout there is no way to
> check for this ahead of time. In this case the toolstack must wait for
> device-model state to change to pci-inserted which never happens.
> 
> I propose that when qemu decides not to hot-plug a device that it raise
> the "pci-inserted" status anyway. The tools must then check the
> "parameter" key in xenbus for a non-error string. In other words:
> 
> send_command("pci-ins")
> wait_for_device_model("pci-inserted")
> if parameter[0-2] == "0x" {
>       /* success */
> }else{
>       /* fail */
> }

FYI: The corresponding patch I am proposing is actually this (should
apply cleanly albeit with offsets):

diff -r 414e906dd623 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c   Thu Jul 29 17:58:38 2010 +0100
+++ b/tools/libxl/libxl_pci.c   Thu Jul 29 18:59:32 2010 +0100
@@ -404,6 +479,12 @@ static int do_pci_add(libxl_ctx *ctx, ui
             XL_LOG(ctx, XL_LOG_ERROR, "Device Model didn't respond in time");
         path = libxl_sprintf(ctx, "/local/domain/0/device-model/%d/parameter", 
domid);
         vdevfn = libxl_xs_read(ctx, XBT_NULL, path);
+        if ( strncmp(vdevfn, "0x", 2) ) {
+            XL_LOG(ctx, XL_LOG_ERROR, "qemu refused to add device: %s", 
vdevfn);
+            path = libxl_sprintf(ctx, "/local/domain/0/device-model/%d/state", 
domid);
+            xs_write(ctx->xsh, XBT_NULL, path, "running", strlen("running"));
+            return ERROR_FAIL;
+        }
         sscanf(vdevfn + 2, "%x", &pcidev->vdevfn);
         path = libxl_sprintf(ctx, "/local/domain/0/device-model/%d/state", 
domid);
         xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.