pci: keep a stubDriver in each virPCIDevice

This can be set when the virPCIDevice is created and placed on a list,
then used later when traversing the list to determine which stub
driver to bind/unbind for managed devices.

The existing Detach and Attach functions' signatures haven't been
changed (they still accept a stub driver name in the arg list), but if
the arg list has NULL for stub driver and one is available in the
device's object, that will be used. (we may later deprecate and remove
the arg from those functions).
This commit is contained in:
Laine Stump 2013-04-23 14:50:15 -04:00
parent 731b0f36f1
commit be64199e17
3 changed files with 25 additions and 1 deletions

View File

@ -1606,6 +1606,7 @@ virPCIDeviceGetManaged;
virPCIDeviceGetName;
virPCIDeviceGetRemoveSlot;
virPCIDeviceGetReprobe;
virPCIDeviceGetStubDriver;
virPCIDeviceGetUnbindFromStub;
virPCIDeviceGetUsedBy;
virPCIDeviceIsAssignable;
@ -1625,6 +1626,7 @@ virPCIDeviceReset;
virPCIDeviceSetManaged;
virPCIDeviceSetRemoveSlot;
virPCIDeviceSetReprobe;
virPCIDeviceSetStubDriver;
virPCIDeviceSetUnbindFromStub;
virPCIDeviceSetUsedBy;
virPCIDeviceWaitForCleanup;

View File

@ -67,6 +67,7 @@ struct _virPCIDevice {
bool has_flr;
bool has_pm_reset;
bool managed;
const char *stubDriver;
/* used by reattach function */
bool unbind_from_stub;
@ -1152,6 +1153,9 @@ virPCIDeviceDetach(virPCIDevicePtr dev,
virPCIDeviceList *inactiveDevs,
const char *driver)
{
if (!driver && dev->stubDriver)
driver = dev->stubDriver;
if (virPCIProbeStubDriver(driver) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to load PCI stub module %s"), driver);
@ -1182,6 +1186,9 @@ virPCIDeviceReattach(virPCIDevicePtr dev,
virPCIDeviceListPtr inactiveDevs,
const char *driver)
{
if (!driver && dev->stubDriver)
driver = dev->stubDriver;
if (virPCIProbeStubDriver(driver) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to load PCI stub module %s"), driver);
@ -1467,6 +1474,18 @@ virPCIDeviceGetManaged(virPCIDevicePtr dev)
return dev->managed;
}
void
virPCIDeviceSetStubDriver(virPCIDevicePtr dev, const char *driver)
{
dev->stubDriver = driver;
}
const char *
virPCIDeviceGetStubDriver(virPCIDevicePtr dev)
{
return dev->stubDriver;
}
unsigned int
virPCIDeviceGetUnbindFromStub(virPCIDevicePtr dev)
{

View File

@ -1,7 +1,7 @@
/*
* virpci.h: helper APIs for managing host PCI devices
*
* Copyright (C) 2009, 2011-2012 Red Hat, Inc.
* Copyright (C) 2009, 2011-2013 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -63,6 +63,9 @@ int virPCIDeviceReset(virPCIDevicePtr dev,
void virPCIDeviceSetManaged(virPCIDevice *dev,
bool managed);
unsigned int virPCIDeviceGetManaged(virPCIDevice *dev);
void virPCIDeviceSetStubDriver(virPCIDevicePtr dev,
const char *driver);
const char *virPCIDeviceGetStubDriver(virPCIDevicePtr dev);
void virPCIDeviceSetUsedBy(virPCIDevice *dev,
const char *used_by);
const char *virPCIDeviceGetUsedBy(virPCIDevice *dev);