Chunyan Liu wrote:
Extract code from qemu_hostdev.c and make it reusable for multiple
drivers,
meanwhile maintain a global hostdev state to solve conflict between different
drivers.
Signed-off-by: Chunyan Liu <cyliu(a)suse.com>
---
po/POTFILES.in | 1 +
src/Makefile.am | 1 +
src/libvirt_private.syms | 21 +
src/util/virhostdev.c | 1691 ++++++++++++++++++++++++++++++++++++++++++++++
src/util/virhostdev.h | 134 ++++
src/util/virpci.c | 30 +-
src/util/virpci.h | 9 +-
src/util/virscsi.c | 28 +-
src/util/virscsi.h | 8 +-
src/util/virusb.c | 29 +-
src/util/virusb.h | 8 +-
11 files changed, 1932 insertions(+), 28 deletions(-)
create mode 100644 src/util/virhostdev.c
create mode 100644 src/util/virhostdev.h
[...]
diff --git a/src/util/virpci.c b/src/util/virpci.c
index 8ec642f..7402898 100644
--- a/src/util/virpci.c
+++ b/src/util/virpci.c
@@ -58,7 +58,10 @@ struct _virPCIDevice {
char name[PCI_ADDR_LEN]; /* domain:bus:slot.function */
char id[PCI_ID_LEN]; /* product vendor */
char *path;
- const char *used_by; /* The domain which uses the device */
+
+ /* The driver:domain which uses the device */
+ char *used_by_drvname;
+ char *used_by_domname;
unsigned int pcie_cap_pos;
unsigned int pci_pm_cap_pos;
@@ -1562,6 +1565,8 @@ virPCIDeviceFree(virPCIDevicePtr dev)
VIR_DEBUG("%s %s: freeing", dev->id, dev->name);
VIR_FREE(dev->path);
VIR_FREE(dev->stubDriver);
+ VIR_FREE(dev->used_by_drvname);
+ VIR_FREE(dev->used_by_domname);
VIR_FREE(dev);
}
@@ -1631,16 +1636,27 @@ virPCIDeviceSetReprobe(virPCIDevicePtr dev, bool reprobe)
dev->reprobe = reprobe;
}
-void
-virPCIDeviceSetUsedBy(virPCIDevicePtr dev, const char *name)
+int
+virPCIDeviceSetUsedBy(virPCIDevicePtr dev,
+ const char *drv_name,
+ const char *dom_name)
{
- dev->used_by = name;
+ if (VIR_STRDUP(dev->used_by_drvname, drv_name) < 0)
+ return -1;
+
+ if (VIR_STRDUP(dev->used_by_domname, dom_name) < 0)
+ return -1;
+
+ return 0;
}
-const char *
-virPCIDeviceGetUsedBy(virPCIDevicePtr dev)
+void
+virPCIDeviceGetUsedBy(virPCIDevicePtr dev,
+ const char **drv_name,
+ const char **dom_name)
{
- return dev->used_by;
+ *drv_name = dev->used_by_drvname;
+ *dom_name = dev->used_by_domname;
}
void virPCIDeviceReattachInit(virPCIDevicePtr pci)
diff --git a/src/util/virpci.h b/src/util/virpci.h
index 0479f0b..2347b95 100644
--- a/src/util/virpci.h
+++ b/src/util/virpci.h
@@ -65,9 +65,12 @@ unsigned int virPCIDeviceGetManaged(virPCIDevice *dev);
int virPCIDeviceSetStubDriver(virPCIDevicePtr dev,
const char *driver);
const char *virPCIDeviceGetStubDriver(virPCIDevicePtr dev);
-void virPCIDeviceSetUsedBy(virPCIDevice *dev,
- const char *used_by);
-const char *virPCIDeviceGetUsedBy(virPCIDevice *dev);
+int virPCIDeviceSetUsedBy(virPCIDevice *dev,
+ const char *drv_name,
+ const char *dom_name);
+void virPCIDeviceGetUsedBy(virPCIDevice *dev,
+ const char **drv_name,
+ const char **dom_name);
This change, and the similar ones below for USB and SCSI, cause build
failures in the qemu driver without patch 2 applied. Recall that
'make', 'make syntax-check', and 'make check' should succeed after
each
patch in the series.
Regards,
Jim
unsigned int virPCIDeviceGetUnbindFromStub(virPCIDevicePtr dev);
void virPCIDeviceSetUnbindFromStub(virPCIDevice *dev,
bool unbind);
diff --git a/src/util/virscsi.c b/src/util/virscsi.c
index 7aca9e6..062e8bd 100644
--- a/src/util/virscsi.c
+++ b/src/util/virscsi.c
@@ -55,7 +55,10 @@ struct _virSCSIDevice {
char *name; /* adapter:bus:target:unit */
char *id; /* model:vendor */
char *sg_path; /* e.g. /dev/sg2 */
- const char *used_by; /* name of the domain using this dev */
+
+ /* driver:domain using this dev */
+ char *used_by_drvname;
+ char *used_by_domname;
bool readonly;
};
@@ -259,20 +262,31 @@ virSCSIDeviceFree(virSCSIDevicePtr dev)
VIR_FREE(dev->id);
VIR_FREE(dev->name);
VIR_FREE(dev->sg_path);
+ VIR_FREE(dev->used_by_drvname);
+ VIR_FREE(dev->used_by_domname);
VIR_FREE(dev);
}
-void
+int
virSCSIDeviceSetUsedBy(virSCSIDevicePtr dev,
- const char *name)
+ const char *drvname,
+ const char *domname)
{
- dev->used_by = name;
+ if (VIR_STRDUP(dev->used_by_drvname, drvname) < 0)
+ return -1;
+ if (VIR_STRDUP(dev->used_by_domname, domname) < 0)
+ return -1;
+
+ return 0;
}
-const char *
-virSCSIDeviceGetUsedBy(virSCSIDevicePtr dev)
+void
+virSCSIDeviceGetUsedBy(virSCSIDevicePtr dev,
+ const char **drvname,
+ const char **domname)
{
- return dev->used_by;
+ *drvname = dev->used_by_drvname;
+ *domname = dev->used_by_domname;
}
const char *
diff --git a/src/util/virscsi.h b/src/util/virscsi.h
index cce5df4..263b175 100644
--- a/src/util/virscsi.h
+++ b/src/util/virscsi.h
@@ -49,8 +49,12 @@ virSCSIDevicePtr virSCSIDeviceNew(const char *adapter,
bool readonly);
void virSCSIDeviceFree(virSCSIDevicePtr dev);
-void virSCSIDeviceSetUsedBy(virSCSIDevicePtr dev, const char *name);
-const char *virSCSIDeviceGetUsedBy(virSCSIDevicePtr dev);
+int virSCSIDeviceSetUsedBy(virSCSIDevicePtr dev,
+ const char *drvname,
+ const char *domname);
+void virSCSIDeviceGetUsedBy(virSCSIDevicePtr dev,
+ const char **drvname,
+ const char **domname);
const char *virSCSIDeviceGetName(virSCSIDevicePtr dev);
unsigned int virSCSIDeviceGetAdapter(virSCSIDevicePtr dev);
unsigned int virSCSIDeviceGetBus(virSCSIDevicePtr dev);
diff --git a/src/util/virusb.c b/src/util/virusb.c
index 3c82200..7b17b0a 100644
--- a/src/util/virusb.c
+++ b/src/util/virusb.c
@@ -55,7 +55,10 @@ struct _virUSBDevice {
char name[USB_ADDR_LEN]; /* domain:bus:slot.function */
char id[USB_ID_LEN]; /* product vendor */
char *path;
- const char *used_by; /* name of the domain using this dev */
+
+ /* driver:domain using this dev */
+ char *used_by_drvname;
+ char *used_by_domname;
};
struct _virUSBDeviceList {
@@ -375,19 +378,31 @@ virUSBDeviceFree(virUSBDevicePtr dev)
return;
VIR_DEBUG("%s %s: freeing", dev->id, dev->name);
VIR_FREE(dev->path);
+ VIR_FREE(dev->used_by_drvname);
+ VIR_FREE(dev->used_by_domname);
VIR_FREE(dev);
}
-
-void virUSBDeviceSetUsedBy(virUSBDevicePtr dev,
- const char *name)
+int
+virUSBDeviceSetUsedBy(virUSBDevicePtr dev,
+ const char *drv_name,
+ const char *dom_name)
{
- dev->used_by = name;
+ if (VIR_STRDUP(dev->used_by_drvname, drv_name) < 0)
+ return -1;
+ if (VIR_STRDUP(dev->used_by_domname, dom_name) < 0)
+ return -1;
+
+ return 0;
}
-const char * virUSBDeviceGetUsedBy(virUSBDevicePtr dev)
+void
+virUSBDeviceGetUsedBy(virUSBDevicePtr dev,
+ const char **drv_name,
+ const char **dom_name)
{
- return dev->used_by;
+ *drv_name = dev->used_by_drvname;
+ *dom_name = dev->used_by_domname;
}
const char *virUSBDeviceGetName(virUSBDevicePtr dev)
diff --git a/src/util/virusb.h b/src/util/virusb.h
index aa59d12..41e680f 100644
--- a/src/util/virusb.h
+++ b/src/util/virusb.h
@@ -60,8 +60,12 @@ int virUSBDeviceFind(unsigned int vendor,
virUSBDevicePtr *usb);
void virUSBDeviceFree(virUSBDevicePtr dev);
-void virUSBDeviceSetUsedBy(virUSBDevicePtr dev, const char *name);
-const char *virUSBDeviceGetUsedBy(virUSBDevicePtr dev);
+int virUSBDeviceSetUsedBy(virUSBDevicePtr dev,
+ const char *drv_name,
+ const char *dom_name);
+void virUSBDeviceGetUsedBy(virUSBDevicePtr dev,
+ const char **drv_name,
+ const char **dom_name);
const char *virUSBDeviceGetName(virUSBDevicePtr dev);
unsigned int virUSBDeviceGetBus(virUSBDevicePtr dev);