From: Shivaprasad G Bhat <sbhat(a)linux.vnet.ibm.com>
Signed-off-by: Shivaprasad G Bhat <sbhat(a)linux.vnet.ibm.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413(a)gmail.com>
---
src/libvirt_private.syms | 1 +
src/util/virhostdev.c | 29 +++++++++++++++++++++++++++++
src/util/virhostdev.h | 2 ++
3 files changed, 32 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 962963a3ff..702cd958b1 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2166,6 +2166,7 @@ virHostdevIsPCIMultifunctionDevice;
virHostdevIsSCSIDevice;
virHostdevIsVFIODevice;
virHostdevManagerGetDefault;
+virHostdevPCIDevicesBelongToSameSlot;
virHostdevPCINodeDeviceDetach;
virHostdevPCINodeDeviceReAttach;
virHostdevPCINodeDeviceReset;
diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
index f0526d97d0..d870ca6c49 100644
--- a/src/util/virhostdev.c
+++ b/src/util/virhostdev.c
@@ -312,6 +312,35 @@ virHostdevIsVirtualFunction(virDomainHostdevDefPtr hostdev)
}
+bool
+virHostdevPCIDevicesBelongToSameSlot(virDomainHostdevDefPtr dev1,
+ virDomainHostdevDefPtr dev2)
+{
+ virPCIDeviceAddressPtr devAddr1 = NULL, devAddr2 = NULL;
+
+ if (!dev1 || !dev2)
+ return false;
+
+ devAddr1 = &dev1->source.subsys.u.pci.addr;
+ devAddr2 = &dev2->source.subsys.u.pci.addr;
+ if ((devAddr1->domain != devAddr2->domain) ||
+ (devAddr1->bus != devAddr2->bus) ||
+ (devAddr1->slot != devAddr2->slot) ||
+ (virPCIDeviceAddressEqual(devAddr1, devAddr2))) {
+ return false;
+ }
+
+ /* The Virtual Functions have multifunction false even though they have same
+ * domain:bus:slot as the Physical function. They are to be treated
+ * like non-multifunction devices
+ */
+ if (virHostdevIsVirtualFunction(dev1) || virHostdevIsVirtualFunction(dev2))
+ return false;
+
+ return true;
+}
+
+
static int
virHostdevNetDevice(virDomainHostdevDefPtr hostdev,
int pfNetDevIdx,
diff --git a/src/util/virhostdev.h b/src/util/virhostdev.h
index 80aea577ed..d6dfb0b388 100644
--- a/src/util/virhostdev.h
+++ b/src/util/virhostdev.h
@@ -214,6 +214,8 @@ int virHostdevPCINodeDeviceReAttach(virHostdevManagerPtr mgr,
int virHostdevPCINodeDeviceReset(virHostdevManagerPtr mgr,
virPCIDevicePtr pci)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+bool virHostdevPCIDevicesBelongToSameSlot(virDomainHostdevDefPtr dev1,
+ virDomainHostdevDefPtr dev2);
int
virHostdevPrepareOneNVMeDevice(virHostdevManagerPtr hostdev_mgr,
--
2.24.1