So that pci_{add/remove}_device work correctly with vpci. Note that this requires moving vpci_add_handlers out of the init section.
Signed-off-by: Roger Pau Monné <roger....@citrix.com> Reviewed-by: Wei Liu <wei.l...@citrix.com> --- Cc: Andrew Cooper <andrew.coop...@citrix.com> Cc: George Dunlap <george.dun...@eu.citrix.com> Cc: Ian Jackson <ian.jack...@eu.citrix.com> Cc: Jan Beulich <jbeul...@suse.com> Cc: Julien Grall <julien.gr...@arm.com> Cc: Konrad Rzeszutek Wilk <konrad.w...@oracle.com> Cc: Stefano Stabellini <sstabell...@kernel.org> Cc: Tim Deegan <t...@xen.org> Cc: Wei Liu <wei.l...@citrix.com> --- xen/drivers/passthrough/pci.c | 8 ++++++++ xen/drivers/vpci/vpci.c | 2 +- xen/include/xen/vpci.h | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index a5d59b83b7..a712db0294 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -768,6 +768,13 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, goto out; } + ret = vpci_add_handlers(pdev); + if ( ret ) + { + pdev->domain = NULL; + goto out; + } + list_add(&pdev->domain_list, &hardware_domain->arch.pdev_list); } else @@ -812,6 +819,7 @@ int pci_remove_device(u16 seg, u8 bus, u8 devfn) list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) if ( pdev->bus == bus && pdev->devfn == devfn ) { + vpci_remove_device(pdev); ret = iommu_remove_device(pdev); if ( pdev->domain ) list_del(&pdev->domain_list); diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index 0569459699..732d3525ae 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -72,7 +72,7 @@ void vpci_remove_device(struct pci_dev *pdev) spin_unlock(&pdev->vpci_lock); } -int __hwdom_init vpci_add_handlers(struct pci_dev *pdev) +int vpci_add_handlers(struct pci_dev *pdev) { unsigned int i; int rc = 0; diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index 208667227e..e629224088 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -224,6 +224,8 @@ static inline int vpci_add_handlers(struct pci_dev *pdev) return 0; } +static inline void vpci_remove_device(struct pci_dev *pdev) { } + static inline void vpci_dump_msi(void) { } static inline uint32_t vpci_read(pci_sbdf_t sbdf, unsigned int reg, -- 2.17.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel