Message ID | 20221205173137.607044-9-dwmw2@infradead.org |
---|---|
State | New |
Headers | show |
Series | None | expand |
On 5/12/22 18:31, David Woodhouse wrote: > From: Joao Martins <joao.m.martins@oracle.com> > > Such that PCI passthrough devices work for Xen emulated guests. > > Signed-off-by: Joao Martins <joao.m.martins@oracle.com> > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> > --- > hw/i386/xen/xen_platform.c | 18 +++++++++++++++--- > 1 file changed, 15 insertions(+), 3 deletions(-) > > diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c > index 710039851a..ae0a21f5bf 100644 > --- a/hw/i386/xen/xen_platform.c > +++ b/hw/i386/xen/xen_platform.c > @@ -109,12 +109,25 @@ static void log_writeb(PCIXenPlatformState *s, char val) > #define _UNPLUG_NVME_DISKS 3 > #define UNPLUG_NVME_DISKS (1u << _UNPLUG_NVME_DISKS) > > +static bool pci_device_is_passthrough(PCIDevice *d) > +{ > + if (!strcmp(d->name, "xen-pci-passthrough")) { The 'QOM way' to do this check is: if (object_dynamic_cast(OBJECT(d), TYPE_XEN_PT_DEVICE)) { > + return true; > + } > + > + if (xen_mode == XEN_EMULATE && !strcmp(d->name, "vfio-pci")) { if (xen_mode == XEN_EMULATE && object_dynamic_cast(OBJECT(d), TYPE_VFIO_PCI)) { > + return true; > + } > + > + return false; > +}
diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c index 710039851a..ae0a21f5bf 100644 --- a/hw/i386/xen/xen_platform.c +++ b/hw/i386/xen/xen_platform.c @@ -109,12 +109,25 @@ static void log_writeb(PCIXenPlatformState *s, char val) #define _UNPLUG_NVME_DISKS 3 #define UNPLUG_NVME_DISKS (1u << _UNPLUG_NVME_DISKS) +static bool pci_device_is_passthrough(PCIDevice *d) +{ + if (!strcmp(d->name, "xen-pci-passthrough")) { + return true; + } + + if (xen_mode == XEN_EMULATE && !strcmp(d->name, "vfio-pci")) { + return true; + } + + return false; +} + static void unplug_nic(PCIBus *b, PCIDevice *d, void *o) { /* We have to ignore passthrough devices */ if (pci_get_word(d->config + PCI_CLASS_DEVICE) == PCI_CLASS_NETWORK_ETHERNET - && strcmp(d->name, "xen-pci-passthrough") != 0) { + && !pci_device_is_passthrough(d)) { object_unparent(OBJECT(d)); } } @@ -187,9 +200,8 @@ static void unplug_disks(PCIBus *b, PCIDevice *d, void *opaque) !(flags & UNPLUG_IDE_SCSI_DISKS); /* We have to ignore passthrough devices */ - if (!strcmp(d->name, "xen-pci-passthrough")) { + if (pci_device_is_passthrough(d)) return; - } switch (pci_get_word(d->config + PCI_CLASS_DEVICE)) { case PCI_CLASS_STORAGE_IDE: