Previously, on ..._pci_add, libxl only checks that a device is not assigned to another domain. This quick patch checks that the device is also owned by pciback, otherwise the call fails.
Signed-off-by: Doug Magee <djmagee@mageenet.net>
diff -r 5b2676ac1321 -r 301cc006677f tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c Mon Jan 09 16:01:44 2012 +0100
+++ b/tools/libxl/libxl_pci.c Mon Jan 16 17:31:25 2012 -0500
@@ -796,6 +796,9 @@ int libxl__device_pci_add(libxl__gc *gc,
libxl_device_pci *assigned;
int num_assigned, i, rc;
int stubdomid = 0;
+ struct dirent *de;
+ DIR *dir;
+ int assignable = 0;
rc = get_all_assigned_devices(gc, &assigned, &num_assigned);
if ( rc ) {
@@ -809,6 +812,35 @@ int libxl__device_pci_add(libxl__gc *gc,
goto out;
}
+ dir = opendir(SYSFS_PCIBACK_DRIVER);
+ if ( NULL == dir ) {
+ if ( errno == ENOENT ) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Looks like pciback driver not loaded");
+ }else{
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Couldn't open %s", SYSFS_PCIBACK_DRIVER);
+ }
+ rc = ERROR_FAIL;
+ goto out_closedir;
+ }
+
+ while( (de = readdir(dir)) ) {
+ unsigned dom, bus, dev, func;
+ if ( sscanf(de->d_name, PCI_BDF, &dom, &bus, &dev, &func) != 4 )
+ continue;
+ if ( dom == pcidev->domain && bus == pcidev->bus &&
+ dev == pcidev->dev && func == pcidev->func ) {
+ assignable = 1;
+ break;
+ }
+ }
+
+ if ( !assignable ) {
+ rc = ERROR_FAIL;
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device not owned by pciback");
+ goto out_closedir;
+ }
+
+
libxl__device_pci_reset(gc, pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
stubdomid = libxl_get_stubdom_id(ctx, domid);
@@ -817,7 +849,7 @@ int libxl__device_pci_add(libxl__gc *gc,
/* stubdomain is always running by now, even at create time */
rc = do_pci_add(gc, stubdomid, &pcidev_s, 0);
if ( rc )
- goto out;
+ goto out_closedir;
}
orig_vdev = pcidev->vdevfn & ~7U;
@@ -826,11 +858,11 @@ int libxl__device_pci_add(libxl__gc *gc,
if ( !(pcidev->vdevfn >> 3) ) {
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Must specify a v-slot for multi-function devices");
rc = ERROR_INVAL;
- goto out;
+ goto out_closedir;
}
if ( pci_multifunction_check(gc, pcidev, &pfunc_mask) ) {
rc = ERROR_FAIL;
- goto out;
+ goto out_closedir;
}
pcidev->vfunc_mask &= pfunc_mask;
/* so now vfunc_mask == pfunc_mask */
@@ -855,6 +887,8 @@ int libxl__device_pci_add(libxl__gc *gc,
}
}
+out_closedir:
+ closedir(dir);
out:
return rc;
}
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Signed-off-by: Doug Magee <djmagee@mageenet.net>
diff -r 5b2676ac1321 -r 301cc006677f tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c Mon Jan 09 16:01:44 2012 +0100
+++ b/tools/libxl/libxl_pci.c Mon Jan 16 17:31:25 2012 -0500
@@ -796,6 +796,9 @@ int libxl__device_pci_add(libxl__gc *gc,
libxl_device_pci *assigned;
int num_assigned, i, rc;
int stubdomid = 0;
+ struct dirent *de;
+ DIR *dir;
+ int assignable = 0;
rc = get_all_assigned_devices(gc, &assigned, &num_assigned);
if ( rc ) {
@@ -809,6 +812,35 @@ int libxl__device_pci_add(libxl__gc *gc,
goto out;
}
+ dir = opendir(SYSFS_PCIBACK_DRIVER);
+ if ( NULL == dir ) {
+ if ( errno == ENOENT ) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Looks like pciback driver not loaded");
+ }else{
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Couldn't open %s", SYSFS_PCIBACK_DRIVER);
+ }
+ rc = ERROR_FAIL;
+ goto out_closedir;
+ }
+
+ while( (de = readdir(dir)) ) {
+ unsigned dom, bus, dev, func;
+ if ( sscanf(de->d_name, PCI_BDF, &dom, &bus, &dev, &func) != 4 )
+ continue;
+ if ( dom == pcidev->domain && bus == pcidev->bus &&
+ dev == pcidev->dev && func == pcidev->func ) {
+ assignable = 1;
+ break;
+ }
+ }
+
+ if ( !assignable ) {
+ rc = ERROR_FAIL;
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device not owned by pciback");
+ goto out_closedir;
+ }
+
+
libxl__device_pci_reset(gc, pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
stubdomid = libxl_get_stubdom_id(ctx, domid);
@@ -817,7 +849,7 @@ int libxl__device_pci_add(libxl__gc *gc,
/* stubdomain is always running by now, even at create time */
rc = do_pci_add(gc, stubdomid, &pcidev_s, 0);
if ( rc )
- goto out;
+ goto out_closedir;
}
orig_vdev = pcidev->vdevfn & ~7U;
@@ -826,11 +858,11 @@ int libxl__device_pci_add(libxl__gc *gc,
if ( !(pcidev->vdevfn >> 3) ) {
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Must specify a v-slot for multi-function devices");
rc = ERROR_INVAL;
- goto out;
+ goto out_closedir;
}
if ( pci_multifunction_check(gc, pcidev, &pfunc_mask) ) {
rc = ERROR_FAIL;
- goto out;
+ goto out_closedir;
}
pcidev->vfunc_mask &= pfunc_mask;
/* so now vfunc_mask == pfunc_mask */
@@ -855,6 +887,8 @@ int libxl__device_pci_add(libxl__gc *gc,
}
}
+out_closedir:
+ closedir(dir);
out:
return rc;
}
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel