The stubDriver name can be used to make useful decisions if readily available.
Set it if bound to a valid one during initialisation.
Signed-off-by: Shivaprasad G Bhat <sbhat(a)linux.vnet.ibm.com>
---
src/util/virpci.c | 36 ++++++++++++++++++++++++++----------
1 file changed, 26 insertions(+), 10 deletions(-)
diff --git a/src/util/virpci.c b/src/util/virpci.c
index 35b1459..5acf486 100644
--- a/src/util/virpci.c
+++ b/src/util/virpci.c
@@ -1080,6 +1080,22 @@ static const char *virPCIKnownStubs[] = {
NULL
};
+static bool virPCIIsAKnownStub(char *driver)
+{
+ const char **stubTest;
+ bool ret = false;
+
+ for (stubTest = virPCIKnownStubs; *stubTest != NULL; stubTest++) {
+ if (STREQ_NULLABLE(driver, *stubTest)) {
+ ret = true;
+ VIR_DEBUG("Found stub driver %s", *stubTest);
+ break;
+ }
+ }
+
+ return ret;
+}
+
static int
virPCIDeviceUnbindFromStub(virPCIDevicePtr dev)
{
@@ -1087,8 +1103,6 @@ virPCIDeviceUnbindFromStub(virPCIDevicePtr dev)
char *drvdir = NULL;
char *path = NULL;
char *driver = NULL;
- const char **stubTest;
- bool isStub = false;
/* If the device is currently bound to one of the "well known"
* stub drivers, then unbind it, otherwise ignore it.
@@ -1105,14 +1119,7 @@ virPCIDeviceUnbindFromStub(virPCIDevicePtr dev)
goto remove_slot;
/* If the device isn't bound to a known stub, skip the unbind. */
- for (stubTest = virPCIKnownStubs; *stubTest != NULL; stubTest++) {
- if (STREQ(driver, *stubTest)) {
- isStub = true;
- VIR_DEBUG("Found stub driver %s", *stubTest);
- break;
- }
- }
- if (!isStub)
+ if (!virPCIIsAKnownStub(driver))
goto remove_slot;
if (virPCIDeviceUnbind(dev, dev->reprobe) < 0)
@@ -1556,6 +1563,8 @@ virPCIDeviceNew(unsigned int domain,
virPCIDevicePtr dev;
char *vendor = NULL;
char *product = NULL;
+ char *drvpath = NULL;
+ char *driver = NULL;
if (VIR_ALLOC(dev) < 0)
return NULL;
@@ -1603,9 +1612,16 @@ virPCIDeviceNew(unsigned int domain,
goto error;
}
+ if (virPCIDeviceGetDriverPathAndName(dev, &drvpath, &driver) < 0)
+ goto cleanup;
+
+ if (virPCIIsAKnownStub(driver))
+ dev->stubDriver = driver;
+
VIR_DEBUG("%s %s: initialized", dev->id, dev->name);
cleanup:
+ VIR_FREE(drvpath);
VIR_FREE(product);
VIR_FREE(vendor);
return dev;