diff -r c5d121fd35c0 tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Mon Feb 28 16:55:20 2011 +0000 +++ b/tools/libxl/libxl_pci.c Tue Mar 01 19:07:18 2011 -0800 @@ -764,6 +764,24 @@ return libxl__device_pci_add(ctx, domid, pcidev, 0); } +static int libxl_pcidev_assignable(libxl_ctx *ctx, libxl_device_pci *pcidev) +{ + libxl_device_pci *pcidevs; + int num, i; + + libxl_device_pci_list_assignable(ctx, &pcidevs, &num); + for (i = 0; i < num; i++) { + if (pcidevs[i].domain == pcidev->domain && + pcidevs[i].bus == pcidev->bus && + pcidevs[i].dev == pcidev->dev && + pcidevs[i].func == pcidev->func) + { + return 1; + } + } + return 0; +} + int libxl__device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev, int starting) { libxl__gc gc = LIBXL_INIT_GC(ctx); @@ -771,6 +789,13 @@ libxl_device_pci *assigned; int num_assigned, i, rc; int stubdomid = 0; + + if (!libxl_pcidev_assignable(ctx, pcidev)) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device %x:%x:%x.%x is not assignable", + pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func); + rc = ERROR_FAIL; + goto out; + } rc = get_all_assigned_devices(&gc, &assigned, &num_assigned); if ( rc ) {