Message ID | 687101e7e0e6feb64dd8ea63c8cf1aacf1684049.1604417224.git.rahul.singh@arm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | xen/arm: Make PCI passthrough code non-x86 specific | expand |
> On 3 Nov 2020, at 15:59, Rahul Singh <Rahul.Singh@arm.com> wrote: > > passthrough/pci.c file is common for all architecture, but there is x86 > sepcific code in this file. > > Move x86 specific code to the x86 directory to avoid compilation error > for other architecture. > > No functional change. > > Signed-off-by: Rahul Singh <rahul.singh@arm.com> Reviewed-by: Bertrand Marquis <bertrand.marquis@arm.com> Cheers Bertrand > --- > > Changes is v2: > - fixed comments. > - rename pci_clean_dpci_irqs() to arch_pci_clean_pirqs(). > > --- > xen/drivers/passthrough/pci.c | 76 +---------------------- > xen/drivers/passthrough/x86/Makefile | 1 + > xen/drivers/passthrough/x86/iommu.c | 7 +++ > xen/drivers/passthrough/x86/pci.c | 91 ++++++++++++++++++++++++++++ > xen/include/xen/pci.h | 2 + > 5 files changed, 102 insertions(+), 75 deletions(-) > create mode 100644 xen/drivers/passthrough/x86/pci.c > > diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c > index 2a3bce1462..04d3e2c0f9 100644 > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -14,7 +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> > @@ -24,7 +23,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> > @@ -847,71 +845,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) > @@ -971,7 +904,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(); > @@ -1375,13 +1308,6 @@ static int __init setup_dump_pcidevs(void) > } > __initcall(setup_dump_pcidevs); > > -int iommu_update_ire_from_msi( > - struct msi_desc *msi_desc, struct msi_msg *msg) > -{ > - return iommu_intremap > - ? iommu_call(&iommu_ops, update_ire_from_msi, msi_desc, msg) : 0; > -} > - > static int iommu_add_device(struct pci_dev *pdev) > { > const struct domain_iommu *hd; > diff --git a/xen/drivers/passthrough/x86/Makefile b/xen/drivers/passthrough/x86/Makefile > index aa515c680d..d02ff75de5 100644 > --- a/xen/drivers/passthrough/x86/Makefile > +++ b/xen/drivers/passthrough/x86/Makefile > @@ -1,2 +1,3 @@ > obj-$(CONFIG_PCI_ATS) += ats.o > obj-y += iommu.o > +obj-y += pci.o > diff --git a/xen/drivers/passthrough/x86/iommu.c b/xen/drivers/passthrough/x86/iommu.c > index f17b1820f4..875e67b53b 100644 > --- a/xen/drivers/passthrough/x86/iommu.c > +++ b/xen/drivers/passthrough/x86/iommu.c > @@ -308,6 +308,13 @@ struct page_info *iommu_alloc_pgtable(struct domain *d) > return pg; > } > > +int iommu_update_ire_from_msi( > + struct msi_desc *msi_desc, struct msi_msg *msg) > +{ > + return iommu_intremap > + ? iommu_call(&iommu_ops, update_ire_from_msi, msi_desc, msg) : 0; > +} > + > /* > * Local variables: > * mode: C > diff --git a/xen/drivers/passthrough/x86/pci.c b/xen/drivers/passthrough/x86/pci.c > new file mode 100644 > index 0000000000..59588aa8d4 > --- /dev/null > +++ b/xen/drivers/passthrough/x86/pci.c > @@ -0,0 +1,91 @@ > +/* > + * This program is free software; you can redistribute it and/or modify it > + * under the terms and conditions of the GNU General Public License, > + * version 2, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * > + * You should have received a copy of the GNU General Public License along with > + * this program; If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include <xen/sched.h> > +#include <xen/pci.h> > + > +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; > +} > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * indent-tabs-mode: nil > + * End: > + */ > diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h > index c4d3879761..fd28d11f6e 100644 > --- a/xen/include/xen/pci.h > +++ b/xen/include/xen/pci.h > @@ -209,4 +209,6 @@ 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); > > +int arch_pci_clean_pirqs(struct domain *d); > + > #endif /* __XEN_PCI_H__ */ > -- > 2.17.1 >
On Tue, 3 Nov 2020, Rahul Singh wrote: > passthrough/pci.c file is common for all architecture, but there is x86 > sepcific code in this file. ^ specific Aside from that: Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> > Move x86 specific code to the x86 directory to avoid compilation error > for other architecture. > > No functional change. > > Signed-off-by: Rahul Singh <rahul.singh@arm.com> > --- > > Changes is v2: > - fixed comments. > - rename pci_clean_dpci_irqs() to arch_pci_clean_pirqs(). > > --- > xen/drivers/passthrough/pci.c | 76 +---------------------- > xen/drivers/passthrough/x86/Makefile | 1 + > xen/drivers/passthrough/x86/iommu.c | 7 +++ > xen/drivers/passthrough/x86/pci.c | 91 ++++++++++++++++++++++++++++ > xen/include/xen/pci.h | 2 + > 5 files changed, 102 insertions(+), 75 deletions(-) > create mode 100644 xen/drivers/passthrough/x86/pci.c > > diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c > index 2a3bce1462..04d3e2c0f9 100644 > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -14,7 +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> > @@ -24,7 +23,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> > @@ -847,71 +845,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) > @@ -971,7 +904,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(); > @@ -1375,13 +1308,6 @@ static int __init setup_dump_pcidevs(void) > } > __initcall(setup_dump_pcidevs); > > -int iommu_update_ire_from_msi( > - struct msi_desc *msi_desc, struct msi_msg *msg) > -{ > - return iommu_intremap > - ? iommu_call(&iommu_ops, update_ire_from_msi, msi_desc, msg) : 0; > -} > - > static int iommu_add_device(struct pci_dev *pdev) > { > const struct domain_iommu *hd; > diff --git a/xen/drivers/passthrough/x86/Makefile b/xen/drivers/passthrough/x86/Makefile > index aa515c680d..d02ff75de5 100644 > --- a/xen/drivers/passthrough/x86/Makefile > +++ b/xen/drivers/passthrough/x86/Makefile > @@ -1,2 +1,3 @@ > obj-$(CONFIG_PCI_ATS) += ats.o > obj-y += iommu.o > +obj-y += pci.o > diff --git a/xen/drivers/passthrough/x86/iommu.c b/xen/drivers/passthrough/x86/iommu.c > index f17b1820f4..875e67b53b 100644 > --- a/xen/drivers/passthrough/x86/iommu.c > +++ b/xen/drivers/passthrough/x86/iommu.c > @@ -308,6 +308,13 @@ struct page_info *iommu_alloc_pgtable(struct domain *d) > return pg; > } > > +int iommu_update_ire_from_msi( > + struct msi_desc *msi_desc, struct msi_msg *msg) > +{ > + return iommu_intremap > + ? iommu_call(&iommu_ops, update_ire_from_msi, msi_desc, msg) : 0; > +} > + > /* > * Local variables: > * mode: C > diff --git a/xen/drivers/passthrough/x86/pci.c b/xen/drivers/passthrough/x86/pci.c > new file mode 100644 > index 0000000000..59588aa8d4 > --- /dev/null > +++ b/xen/drivers/passthrough/x86/pci.c > @@ -0,0 +1,91 @@ > +/* > + * This program is free software; you can redistribute it and/or modify it > + * under the terms and conditions of the GNU General Public License, > + * version 2, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * > + * You should have received a copy of the GNU General Public License along with > + * this program; If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include <xen/sched.h> > +#include <xen/pci.h> > + > +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; > +} > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * indent-tabs-mode: nil > + * End: > + */ > diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h > index c4d3879761..fd28d11f6e 100644 > --- a/xen/include/xen/pci.h > +++ b/xen/include/xen/pci.h > @@ -209,4 +209,6 @@ 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); > > +int arch_pci_clean_pirqs(struct domain *d); > + > #endif /* __XEN_PCI_H__ */ > -- > 2.17.1 >
On 03.11.2020 16:59, Rahul Singh wrote: > --- a/xen/drivers/passthrough/pci.c > +++ b/xen/drivers/passthrough/pci.c > @@ -14,7 +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> I think this hunk wants dropping - struct domain continues to be used in this file, for example. > @@ -847,71 +845,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; > -} If this code gets moved, I think it ought to move into xen/drivers/passthrough/io.c, as that's where all the companion code sits. (The file as a whole, getting built for x86/HVM only, may want moving to xen/drivers/passthrough/x86/ if the underlying model isn't suitable for Arm. Then it probably also would want to be named hvm.c, to express its limited purpose.) Jan
Hello Jan, > On 6 Nov 2020, at 9:09 am, Jan Beulich <jbeulich@suse.com> wrote: > > On 03.11.2020 16:59, Rahul Singh wrote: >> --- a/xen/drivers/passthrough/pci.c >> +++ b/xen/drivers/passthrough/pci.c >> @@ -14,7 +14,6 @@ >> * this program; If not, see <http://www.gnu.org/licenses/>. >> */ >> >> -#include <xen/sched.h> Removed in this patch series 3/4 >> #include <xen/pci.h> >> #include <xen/pci_regs.h> I will remove in next version. >> #include <xen/pci_ids.h> It is required for PCI_VENDOR_ID_INTEL that is referenced in apply_quirks function. > > I think this hunk wants dropping - struct domain continues to be used > in this file, for example. > >> @@ -847,71 +845,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; >> -} > > If this code gets moved, I think it ought to move into > xen/drivers/passthrough/io.c, as that's where all the companion code > sits. (The file as a whole, getting built for x86/HVM only, may want > moving to xen/drivers/passthrough/x86/ if the underlying model isn't > suitable for Arm. Then it probably also would want to be named hvm.c, > to express its limited purpose.) Ok I will move the code to the file io.c and move that file to x86 directory and rename it hvm.c > > Jan Regards, Rahul
diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index 2a3bce1462..04d3e2c0f9 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -14,7 +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> @@ -24,7 +23,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> @@ -847,71 +845,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) @@ -971,7 +904,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(); @@ -1375,13 +1308,6 @@ static int __init setup_dump_pcidevs(void) } __initcall(setup_dump_pcidevs); -int iommu_update_ire_from_msi( - struct msi_desc *msi_desc, struct msi_msg *msg) -{ - return iommu_intremap - ? iommu_call(&iommu_ops, update_ire_from_msi, msi_desc, msg) : 0; -} - static int iommu_add_device(struct pci_dev *pdev) { const struct domain_iommu *hd; diff --git a/xen/drivers/passthrough/x86/Makefile b/xen/drivers/passthrough/x86/Makefile index aa515c680d..d02ff75de5 100644 --- a/xen/drivers/passthrough/x86/Makefile +++ b/xen/drivers/passthrough/x86/Makefile @@ -1,2 +1,3 @@ obj-$(CONFIG_PCI_ATS) += ats.o obj-y += iommu.o +obj-y += pci.o diff --git a/xen/drivers/passthrough/x86/iommu.c b/xen/drivers/passthrough/x86/iommu.c index f17b1820f4..875e67b53b 100644 --- a/xen/drivers/passthrough/x86/iommu.c +++ b/xen/drivers/passthrough/x86/iommu.c @@ -308,6 +308,13 @@ struct page_info *iommu_alloc_pgtable(struct domain *d) return pg; } +int iommu_update_ire_from_msi( + struct msi_desc *msi_desc, struct msi_msg *msg) +{ + return iommu_intremap + ? iommu_call(&iommu_ops, update_ire_from_msi, msi_desc, msg) : 0; +} + /* * Local variables: * mode: C diff --git a/xen/drivers/passthrough/x86/pci.c b/xen/drivers/passthrough/x86/pci.c new file mode 100644 index 0000000000..59588aa8d4 --- /dev/null +++ b/xen/drivers/passthrough/x86/pci.c @@ -0,0 +1,91 @@ +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; If not, see <http://www.gnu.org/licenses/>. + */ + +#include <xen/sched.h> +#include <xen/pci.h> + +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; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index c4d3879761..fd28d11f6e 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -209,4 +209,6 @@ 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); +int arch_pci_clean_pirqs(struct domain *d); + #endif /* __XEN_PCI_H__ */
passthrough/pci.c file is common for all architecture, but there is x86 sepcific code in this file. Move x86 specific code to the x86 directory to avoid compilation error for other architecture. No functional change. Signed-off-by: Rahul Singh <rahul.singh@arm.com> --- Changes is v2: - fixed comments. - rename pci_clean_dpci_irqs() to arch_pci_clean_pirqs(). --- xen/drivers/passthrough/pci.c | 76 +---------------------- xen/drivers/passthrough/x86/Makefile | 1 + xen/drivers/passthrough/x86/iommu.c | 7 +++ xen/drivers/passthrough/x86/pci.c | 91 ++++++++++++++++++++++++++++ xen/include/xen/pci.h | 2 + 5 files changed, 102 insertions(+), 75 deletions(-) create mode 100644 xen/drivers/passthrough/x86/pci.c