Message ID | 3500f44e3b6f8f05f9d05fa170817d5bc6f39f22.1606326929.git.rahul.singh@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | xen/arm: Make PCI passthrough code non-x86 specific | expand |
On Wed, 25 Nov 2020, Rahul Singh wrote: > passthrough/pci.c file is common for all architecture, but there is x86 > specific code in this file. > > Move x86 specific code to the drivers/passthrough/io.c file to avoid > compilation error for other architecture. > > As drivers/passthrough/io.c is compiled only for x86 move it to > x86 directory and rename it to hvm.c. > > No functional change intended. > > Signed-off-by: Rahul Singh <rahul.singh@arm.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> > --- > > Changes in v4: > - fixed compilation error when CONFIG_HVM is disabled > - remove iommu_update_ire_from_msi from the patch will send another patch > to fix. > > --- > xen/drivers/passthrough/Makefile | 3 - > xen/drivers/passthrough/pci.c | 71 +-------------------- > xen/drivers/passthrough/x86/Makefile | 1 + > xen/drivers/passthrough/{io.c => x86/hvm.c} | 66 +++++++++++++++++++ > xen/include/xen/pci.h | 9 +++ > 5 files changed, 77 insertions(+), 73 deletions(-) > rename xen/drivers/passthrough/{io.c => x86/hvm.c} (95%) > > diff --git a/xen/drivers/passthrough/Makefile b/xen/drivers/passthrough/Makefile > index e973e16c74..cc646612c7 100644 > --- a/xen/drivers/passthrough/Makefile > +++ b/xen/drivers/passthrough/Makefile > @@ -6,6 +6,3 @@ obj-$(CONFIG_ARM) += arm/ > obj-y += iommu.o > obj-$(CONFIG_HAS_PCI) += pci.o > obj-$(CONFIG_HAS_DEVICE_TREE) += device_tree.o > - > -x86-$(CONFIG_HVM) := io.o > -obj-$(CONFIG_X86) += $(x86-y) > diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c > index 51e584127e..3c6ab1bcb6 100644 > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -14,9 +14,6 @@ > * this program; If not, see <http://www.gnu.org/licenses/>. > */ > > -#include <xen/sched.h> > -#include <xen/pci.h> > -#include <xen/pci_regs.h> > #include <xen/pci_ids.h> > #include <xen/list.h> > #include <xen/prefetch.h> > @@ -24,7 +21,6 @@ > #include <xen/irq.h> > #include <xen/param.h> > #include <xen/vm_event.h> > -#include <asm/hvm/irq.h> > #include <xen/delay.h> > #include <xen/keyhandler.h> > #include <xen/event.h> > @@ -842,71 +838,6 @@ int pci_remove_device(u16 seg, u8 bus, u8 devfn) > return ret; > } > > -static int pci_clean_dpci_irq(struct domain *d, > - struct hvm_pirq_dpci *pirq_dpci, void *arg) > -{ > - struct dev_intx_gsi_link *digl, *tmp; > - > - pirq_guest_unbind(d, dpci_pirq(pirq_dpci)); > - > - if ( pt_irq_need_timer(pirq_dpci->flags) ) > - kill_timer(&pirq_dpci->timer); > - > - list_for_each_entry_safe ( digl, tmp, &pirq_dpci->digl_list, list ) > - { > - list_del(&digl->list); > - xfree(digl); > - } > - > - radix_tree_delete(&d->pirq_tree, dpci_pirq(pirq_dpci)->pirq); > - > - if ( !pt_pirq_softirq_active(pirq_dpci) ) > - return 0; > - > - domain_get_irq_dpci(d)->pending_pirq_dpci = pirq_dpci; > - > - return -ERESTART; > -} > - > -static int pci_clean_dpci_irqs(struct domain *d) > -{ > - struct hvm_irq_dpci *hvm_irq_dpci = NULL; > - > - if ( !is_iommu_enabled(d) ) > - return 0; > - > - if ( !is_hvm_domain(d) ) > - return 0; > - > - spin_lock(&d->event_lock); > - hvm_irq_dpci = domain_get_irq_dpci(d); > - if ( hvm_irq_dpci != NULL ) > - { > - int ret = 0; > - > - if ( hvm_irq_dpci->pending_pirq_dpci ) > - { > - if ( pt_pirq_softirq_active(hvm_irq_dpci->pending_pirq_dpci) ) > - ret = -ERESTART; > - else > - hvm_irq_dpci->pending_pirq_dpci = NULL; > - } > - > - if ( !ret ) > - ret = pt_pirq_iterate(d, pci_clean_dpci_irq, NULL); > - if ( ret ) > - { > - spin_unlock(&d->event_lock); > - return ret; > - } > - > - hvm_domain_irq(d)->dpci = NULL; > - free_hvm_irq_dpci(hvm_irq_dpci); > - } > - spin_unlock(&d->event_lock); > - return 0; > -} > - > /* Caller should hold the pcidevs_lock */ > static int deassign_device(struct domain *d, uint16_t seg, uint8_t bus, > uint8_t devfn) > @@ -966,7 +897,7 @@ int pci_release_devices(struct domain *d) > int ret; > > pcidevs_lock(); > - ret = pci_clean_dpci_irqs(d); > + ret = arch_pci_clean_pirqs(d); > if ( ret ) > { > pcidevs_unlock(); > diff --git a/xen/drivers/passthrough/x86/Makefile b/xen/drivers/passthrough/x86/Makefile > index a70cf9460d..69284a5d19 100644 > --- a/xen/drivers/passthrough/x86/Makefile > +++ b/xen/drivers/passthrough/x86/Makefile > @@ -1,2 +1,3 @@ > obj-y += ats.o > obj-y += iommu.o > +obj-$(CONFIG_HVM) += hvm.o > diff --git a/xen/drivers/passthrough/io.c b/xen/drivers/passthrough/x86/hvm.c > similarity index 95% > rename from xen/drivers/passthrough/io.c > rename to xen/drivers/passthrough/x86/hvm.c > index 6b1305a3e5..41cfa2e200 100644 > --- a/xen/drivers/passthrough/io.c > +++ b/xen/drivers/passthrough/x86/hvm.c > @@ -1036,6 +1036,72 @@ unlock: > spin_unlock(&d->event_lock); > } > > +static int pci_clean_dpci_irq(struct domain *d, > + struct hvm_pirq_dpci *pirq_dpci, void *arg) > +{ > + struct dev_intx_gsi_link *digl, *tmp; > + > + pirq_guest_unbind(d, dpci_pirq(pirq_dpci)); > + > + if ( pt_irq_need_timer(pirq_dpci->flags) ) > + kill_timer(&pirq_dpci->timer); > + > + list_for_each_entry_safe ( digl, tmp, &pirq_dpci->digl_list, list ) > + { > + list_del(&digl->list); > + xfree(digl); > + } > + > + radix_tree_delete(&d->pirq_tree, dpci_pirq(pirq_dpci)->pirq); > + > + if ( !pt_pirq_softirq_active(pirq_dpci) ) > + return 0; > + > + domain_get_irq_dpci(d)->pending_pirq_dpci = pirq_dpci; > + > + return -ERESTART; > +} > + > +int arch_pci_clean_pirqs(struct domain *d) > +{ > + struct hvm_irq_dpci *hvm_irq_dpci = NULL; > + > + if ( !is_iommu_enabled(d) ) > + return 0; > + > + if ( !is_hvm_domain(d) ) > + return 0; > + > + spin_lock(&d->event_lock); > + hvm_irq_dpci = domain_get_irq_dpci(d); > + if ( hvm_irq_dpci != NULL ) > + { > + int ret = 0; > + > + if ( hvm_irq_dpci->pending_pirq_dpci ) > + { > + if ( pt_pirq_softirq_active(hvm_irq_dpci->pending_pirq_dpci) ) > + ret = -ERESTART; > + else > + hvm_irq_dpci->pending_pirq_dpci = NULL; > + } > + > + if ( !ret ) > + ret = pt_pirq_iterate(d, pci_clean_dpci_irq, NULL); > + if ( ret ) > + { > + spin_unlock(&d->event_lock); > + return ret; > + } > + > + hvm_domain_irq(d)->dpci = NULL; > + free_hvm_irq_dpci(hvm_irq_dpci); > + } > + spin_unlock(&d->event_lock); > + > + return 0; > +} > + > /* > * Note: 'pt_pirq_softirq_reset' can clear the STATE_SCHED before we get to > * doing it. If that is the case we let 'pt_pirq_softirq_reset' do ref-counting. > diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h > index 20a54a5bb4..8e3d4d9454 100644 > --- a/xen/include/xen/pci.h > +++ b/xen/include/xen/pci.h > @@ -208,4 +208,13 @@ int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t gtable); > void msixtbl_pt_unregister(struct domain *, struct pirq *); > void msixtbl_pt_cleanup(struct domain *d); > > +#ifdef CONFIG_HVM > +int arch_pci_clean_pirqs(struct domain *d); > +#else > +static inline int arch_pci_clean_pirqs(struct domain *d) > +{ > + return 0; > +} > +#endif /* CONFIG_HVM */ > + > #endif /* __XEN_PCI_H__ */ > -- > 2.17.1 >
> On 25 Nov 2020, at 18:16, Rahul Singh <Rahul.Singh@arm.com> wrote: > > passthrough/pci.c file is common for all architecture, but there is x86 > specific code in this file. > > Move x86 specific code to the drivers/passthrough/io.c file to avoid > compilation error for other architecture. > > As drivers/passthrough/io.c is compiled only for x86 move it to > x86 directory and rename it to hvm.c. > > No functional change intended. > > Signed-off-by: Rahul Singh <rahul.singh@arm.com> Reviewed-by: Bertrand Marquis <bertrand.marquis@arm.com> Cheers Bertrand > --- > > Changes in v4: > - fixed compilation error when CONFIG_HVM is disabled > - remove iommu_update_ire_from_msi from the patch will send another patch > to fix. > > --- > xen/drivers/passthrough/Makefile | 3 - > xen/drivers/passthrough/pci.c | 71 +-------------------- > xen/drivers/passthrough/x86/Makefile | 1 + > xen/drivers/passthrough/{io.c => x86/hvm.c} | 66 +++++++++++++++++++ > xen/include/xen/pci.h | 9 +++ > 5 files changed, 77 insertions(+), 73 deletions(-) > rename xen/drivers/passthrough/{io.c => x86/hvm.c} (95%) > > diff --git a/xen/drivers/passthrough/Makefile b/xen/drivers/passthrough/Makefile > index e973e16c74..cc646612c7 100644 > --- a/xen/drivers/passthrough/Makefile > +++ b/xen/drivers/passthrough/Makefile > @@ -6,6 +6,3 @@ obj-$(CONFIG_ARM) += arm/ > obj-y += iommu.o > obj-$(CONFIG_HAS_PCI) += pci.o > obj-$(CONFIG_HAS_DEVICE_TREE) += device_tree.o > - > -x86-$(CONFIG_HVM) := io.o > -obj-$(CONFIG_X86) += $(x86-y) > diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c > index 51e584127e..3c6ab1bcb6 100644 > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -14,9 +14,6 @@ > * this program; If not, see <http://www.gnu.org/licenses/>. > */ > > -#include <xen/sched.h> > -#include <xen/pci.h> > -#include <xen/pci_regs.h> > #include <xen/pci_ids.h> > #include <xen/list.h> > #include <xen/prefetch.h> > @@ -24,7 +21,6 @@ > #include <xen/irq.h> > #include <xen/param.h> > #include <xen/vm_event.h> > -#include <asm/hvm/irq.h> > #include <xen/delay.h> > #include <xen/keyhandler.h> > #include <xen/event.h> > @@ -842,71 +838,6 @@ int pci_remove_device(u16 seg, u8 bus, u8 devfn) > return ret; > } > > -static int pci_clean_dpci_irq(struct domain *d, > - struct hvm_pirq_dpci *pirq_dpci, void *arg) > -{ > - struct dev_intx_gsi_link *digl, *tmp; > - > - pirq_guest_unbind(d, dpci_pirq(pirq_dpci)); > - > - if ( pt_irq_need_timer(pirq_dpci->flags) ) > - kill_timer(&pirq_dpci->timer); > - > - list_for_each_entry_safe ( digl, tmp, &pirq_dpci->digl_list, list ) > - { > - list_del(&digl->list); > - xfree(digl); > - } > - > - radix_tree_delete(&d->pirq_tree, dpci_pirq(pirq_dpci)->pirq); > - > - if ( !pt_pirq_softirq_active(pirq_dpci) ) > - return 0; > - > - domain_get_irq_dpci(d)->pending_pirq_dpci = pirq_dpci; > - > - return -ERESTART; > -} > - > -static int pci_clean_dpci_irqs(struct domain *d) > -{ > - struct hvm_irq_dpci *hvm_irq_dpci = NULL; > - > - if ( !is_iommu_enabled(d) ) > - return 0; > - > - if ( !is_hvm_domain(d) ) > - return 0; > - > - spin_lock(&d->event_lock); > - hvm_irq_dpci = domain_get_irq_dpci(d); > - if ( hvm_irq_dpci != NULL ) > - { > - int ret = 0; > - > - if ( hvm_irq_dpci->pending_pirq_dpci ) > - { > - if ( pt_pirq_softirq_active(hvm_irq_dpci->pending_pirq_dpci) ) > - ret = -ERESTART; > - else > - hvm_irq_dpci->pending_pirq_dpci = NULL; > - } > - > - if ( !ret ) > - ret = pt_pirq_iterate(d, pci_clean_dpci_irq, NULL); > - if ( ret ) > - { > - spin_unlock(&d->event_lock); > - return ret; > - } > - > - hvm_domain_irq(d)->dpci = NULL; > - free_hvm_irq_dpci(hvm_irq_dpci); > - } > - spin_unlock(&d->event_lock); > - return 0; > -} > - > /* Caller should hold the pcidevs_lock */ > static int deassign_device(struct domain *d, uint16_t seg, uint8_t bus, > uint8_t devfn) > @@ -966,7 +897,7 @@ int pci_release_devices(struct domain *d) > int ret; > > pcidevs_lock(); > - ret = pci_clean_dpci_irqs(d); > + ret = arch_pci_clean_pirqs(d); > if ( ret ) > { > pcidevs_unlock(); > diff --git a/xen/drivers/passthrough/x86/Makefile b/xen/drivers/passthrough/x86/Makefile > index a70cf9460d..69284a5d19 100644 > --- a/xen/drivers/passthrough/x86/Makefile > +++ b/xen/drivers/passthrough/x86/Makefile > @@ -1,2 +1,3 @@ > obj-y += ats.o > obj-y += iommu.o > +obj-$(CONFIG_HVM) += hvm.o > diff --git a/xen/drivers/passthrough/io.c b/xen/drivers/passthrough/x86/hvm.c > similarity index 95% > rename from xen/drivers/passthrough/io.c > rename to xen/drivers/passthrough/x86/hvm.c > index 6b1305a3e5..41cfa2e200 100644 > --- a/xen/drivers/passthrough/io.c > +++ b/xen/drivers/passthrough/x86/hvm.c > @@ -1036,6 +1036,72 @@ unlock: > spin_unlock(&d->event_lock); > } > > +static int pci_clean_dpci_irq(struct domain *d, > + struct hvm_pirq_dpci *pirq_dpci, void *arg) > +{ > + struct dev_intx_gsi_link *digl, *tmp; > + > + pirq_guest_unbind(d, dpci_pirq(pirq_dpci)); > + > + if ( pt_irq_need_timer(pirq_dpci->flags) ) > + kill_timer(&pirq_dpci->timer); > + > + list_for_each_entry_safe ( digl, tmp, &pirq_dpci->digl_list, list ) > + { > + list_del(&digl->list); > + xfree(digl); > + } > + > + radix_tree_delete(&d->pirq_tree, dpci_pirq(pirq_dpci)->pirq); > + > + if ( !pt_pirq_softirq_active(pirq_dpci) ) > + return 0; > + > + domain_get_irq_dpci(d)->pending_pirq_dpci = pirq_dpci; > + > + return -ERESTART; > +} > + > +int arch_pci_clean_pirqs(struct domain *d) > +{ > + struct hvm_irq_dpci *hvm_irq_dpci = NULL; > + > + if ( !is_iommu_enabled(d) ) > + return 0; > + > + if ( !is_hvm_domain(d) ) > + return 0; > + > + spin_lock(&d->event_lock); > + hvm_irq_dpci = domain_get_irq_dpci(d); > + if ( hvm_irq_dpci != NULL ) > + { > + int ret = 0; > + > + if ( hvm_irq_dpci->pending_pirq_dpci ) > + { > + if ( pt_pirq_softirq_active(hvm_irq_dpci->pending_pirq_dpci) ) > + ret = -ERESTART; > + else > + hvm_irq_dpci->pending_pirq_dpci = NULL; > + } > + > + if ( !ret ) > + ret = pt_pirq_iterate(d, pci_clean_dpci_irq, NULL); > + if ( ret ) > + { > + spin_unlock(&d->event_lock); > + return ret; > + } > + > + hvm_domain_irq(d)->dpci = NULL; > + free_hvm_irq_dpci(hvm_irq_dpci); > + } > + spin_unlock(&d->event_lock); > + > + return 0; > +} > + > /* > * Note: 'pt_pirq_softirq_reset' can clear the STATE_SCHED before we get to > * doing it. If that is the case we let 'pt_pirq_softirq_reset' do ref-counting. > diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h > index 20a54a5bb4..8e3d4d9454 100644 > --- a/xen/include/xen/pci.h > +++ b/xen/include/xen/pci.h > @@ -208,4 +208,13 @@ int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t gtable); > void msixtbl_pt_unregister(struct domain *, struct pirq *); > void msixtbl_pt_cleanup(struct domain *d); > > +#ifdef CONFIG_HVM > +int arch_pci_clean_pirqs(struct domain *d); > +#else > +static inline int arch_pci_clean_pirqs(struct domain *d) > +{ > + return 0; > +} > +#endif /* CONFIG_HVM */ > + > #endif /* __XEN_PCI_H__ */ > -- > 2.17.1 >
On 25.11.2020 19:16, Rahul Singh wrote: > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -14,9 +14,6 @@ > * this program; If not, see <http://www.gnu.org/licenses/>. > */ > > -#include <xen/sched.h> > -#include <xen/pci.h> > -#include <xen/pci_regs.h> > #include <xen/pci_ids.h> > #include <xen/list.h> > #include <xen/prefetch.h> At least the latter two of the lines you remove are clearly still needed here, and in such a case are better to specify explicitly than to depend on other headers including them. Since xen/sched.h very likely also gets included indirectly anyway, I'm inclined to suggest to drop this entire hunk (which ought to be doable while committing). With this Acked-by: Jan Beulich <jbeulich@suse.com> Jan
diff --git a/xen/drivers/passthrough/Makefile b/xen/drivers/passthrough/Makefile index e973e16c74..cc646612c7 100644 --- a/xen/drivers/passthrough/Makefile +++ b/xen/drivers/passthrough/Makefile @@ -6,6 +6,3 @@ obj-$(CONFIG_ARM) += arm/ obj-y += iommu.o obj-$(CONFIG_HAS_PCI) += pci.o obj-$(CONFIG_HAS_DEVICE_TREE) += device_tree.o - -x86-$(CONFIG_HVM) := io.o -obj-$(CONFIG_X86) += $(x86-y) diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index 51e584127e..3c6ab1bcb6 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -14,9 +14,6 @@ * this program; If not, see <http://www.gnu.org/licenses/>. */ -#include <xen/sched.h> -#include <xen/pci.h> -#include <xen/pci_regs.h> #include <xen/pci_ids.h> #include <xen/list.h> #include <xen/prefetch.h> @@ -24,7 +21,6 @@ #include <xen/irq.h> #include <xen/param.h> #include <xen/vm_event.h> -#include <asm/hvm/irq.h> #include <xen/delay.h> #include <xen/keyhandler.h> #include <xen/event.h> @@ -842,71 +838,6 @@ int pci_remove_device(u16 seg, u8 bus, u8 devfn) return ret; } -static int pci_clean_dpci_irq(struct domain *d, - struct hvm_pirq_dpci *pirq_dpci, void *arg) -{ - struct dev_intx_gsi_link *digl, *tmp; - - pirq_guest_unbind(d, dpci_pirq(pirq_dpci)); - - if ( pt_irq_need_timer(pirq_dpci->flags) ) - kill_timer(&pirq_dpci->timer); - - list_for_each_entry_safe ( digl, tmp, &pirq_dpci->digl_list, list ) - { - list_del(&digl->list); - xfree(digl); - } - - radix_tree_delete(&d->pirq_tree, dpci_pirq(pirq_dpci)->pirq); - - if ( !pt_pirq_softirq_active(pirq_dpci) ) - return 0; - - domain_get_irq_dpci(d)->pending_pirq_dpci = pirq_dpci; - - return -ERESTART; -} - -static int pci_clean_dpci_irqs(struct domain *d) -{ - struct hvm_irq_dpci *hvm_irq_dpci = NULL; - - if ( !is_iommu_enabled(d) ) - return 0; - - if ( !is_hvm_domain(d) ) - return 0; - - spin_lock(&d->event_lock); - hvm_irq_dpci = domain_get_irq_dpci(d); - if ( hvm_irq_dpci != NULL ) - { - int ret = 0; - - if ( hvm_irq_dpci->pending_pirq_dpci ) - { - if ( pt_pirq_softirq_active(hvm_irq_dpci->pending_pirq_dpci) ) - ret = -ERESTART; - else - hvm_irq_dpci->pending_pirq_dpci = NULL; - } - - if ( !ret ) - ret = pt_pirq_iterate(d, pci_clean_dpci_irq, NULL); - if ( ret ) - { - spin_unlock(&d->event_lock); - return ret; - } - - hvm_domain_irq(d)->dpci = NULL; - free_hvm_irq_dpci(hvm_irq_dpci); - } - spin_unlock(&d->event_lock); - return 0; -} - /* Caller should hold the pcidevs_lock */ static int deassign_device(struct domain *d, uint16_t seg, uint8_t bus, uint8_t devfn) @@ -966,7 +897,7 @@ int pci_release_devices(struct domain *d) int ret; pcidevs_lock(); - ret = pci_clean_dpci_irqs(d); + ret = arch_pci_clean_pirqs(d); if ( ret ) { pcidevs_unlock(); diff --git a/xen/drivers/passthrough/x86/Makefile b/xen/drivers/passthrough/x86/Makefile index a70cf9460d..69284a5d19 100644 --- a/xen/drivers/passthrough/x86/Makefile +++ b/xen/drivers/passthrough/x86/Makefile @@ -1,2 +1,3 @@ obj-y += ats.o obj-y += iommu.o +obj-$(CONFIG_HVM) += hvm.o diff --git a/xen/drivers/passthrough/io.c b/xen/drivers/passthrough/x86/hvm.c similarity index 95% rename from xen/drivers/passthrough/io.c rename to xen/drivers/passthrough/x86/hvm.c index 6b1305a3e5..41cfa2e200 100644 --- a/xen/drivers/passthrough/io.c +++ b/xen/drivers/passthrough/x86/hvm.c @@ -1036,6 +1036,72 @@ unlock: spin_unlock(&d->event_lock); } +static int pci_clean_dpci_irq(struct domain *d, + struct hvm_pirq_dpci *pirq_dpci, void *arg) +{ + struct dev_intx_gsi_link *digl, *tmp; + + pirq_guest_unbind(d, dpci_pirq(pirq_dpci)); + + if ( pt_irq_need_timer(pirq_dpci->flags) ) + kill_timer(&pirq_dpci->timer); + + list_for_each_entry_safe ( digl, tmp, &pirq_dpci->digl_list, list ) + { + list_del(&digl->list); + xfree(digl); + } + + radix_tree_delete(&d->pirq_tree, dpci_pirq(pirq_dpci)->pirq); + + if ( !pt_pirq_softirq_active(pirq_dpci) ) + return 0; + + domain_get_irq_dpci(d)->pending_pirq_dpci = pirq_dpci; + + return -ERESTART; +} + +int arch_pci_clean_pirqs(struct domain *d) +{ + struct hvm_irq_dpci *hvm_irq_dpci = NULL; + + if ( !is_iommu_enabled(d) ) + return 0; + + if ( !is_hvm_domain(d) ) + return 0; + + spin_lock(&d->event_lock); + hvm_irq_dpci = domain_get_irq_dpci(d); + if ( hvm_irq_dpci != NULL ) + { + int ret = 0; + + if ( hvm_irq_dpci->pending_pirq_dpci ) + { + if ( pt_pirq_softirq_active(hvm_irq_dpci->pending_pirq_dpci) ) + ret = -ERESTART; + else + hvm_irq_dpci->pending_pirq_dpci = NULL; + } + + if ( !ret ) + ret = pt_pirq_iterate(d, pci_clean_dpci_irq, NULL); + if ( ret ) + { + spin_unlock(&d->event_lock); + return ret; + } + + hvm_domain_irq(d)->dpci = NULL; + free_hvm_irq_dpci(hvm_irq_dpci); + } + spin_unlock(&d->event_lock); + + return 0; +} + /* * Note: 'pt_pirq_softirq_reset' can clear the STATE_SCHED before we get to * doing it. If that is the case we let 'pt_pirq_softirq_reset' do ref-counting. diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index 20a54a5bb4..8e3d4d9454 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -208,4 +208,13 @@ int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t gtable); void msixtbl_pt_unregister(struct domain *, struct pirq *); void msixtbl_pt_cleanup(struct domain *d); +#ifdef CONFIG_HVM +int arch_pci_clean_pirqs(struct domain *d); +#else +static inline int arch_pci_clean_pirqs(struct domain *d) +{ + return 0; +} +#endif /* CONFIG_HVM */ + #endif /* __XEN_PCI_H__ */
passthrough/pci.c file is common for all architecture, but there is x86 specific code in this file. Move x86 specific code to the drivers/passthrough/io.c file to avoid compilation error for other architecture. As drivers/passthrough/io.c is compiled only for x86 move it to x86 directory and rename it to hvm.c. No functional change intended. Signed-off-by: Rahul Singh <rahul.singh@arm.com> --- Changes in v4: - fixed compilation error when CONFIG_HVM is disabled - remove iommu_update_ire_from_msi from the patch will send another patch to fix. --- xen/drivers/passthrough/Makefile | 3 - xen/drivers/passthrough/pci.c | 71 +-------------------- xen/drivers/passthrough/x86/Makefile | 1 + xen/drivers/passthrough/{io.c => x86/hvm.c} | 66 +++++++++++++++++++ xen/include/xen/pci.h | 9 +++ 5 files changed, 77 insertions(+), 73 deletions(-) rename xen/drivers/passthrough/{io.c => x86/hvm.c} (95%)