[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH 08/10] xen: pci: remove pcidev_[un]lock[ed] calls
As pci devices are refcounted now and all list that store them are protected by separate locks, we can safely drop global pcidevs_lock. Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx> --- xen/arch/x86/domctl.c | 8 --- xen/arch/x86/hvm/vioapic.c | 2 - xen/arch/x86/hvm/vmsi.c | 12 ---- xen/arch/x86/irq.c | 7 --- xen/arch/x86/msi.c | 11 ---- xen/arch/x86/pci.c | 4 -- xen/arch/x86/physdev.c | 7 +-- xen/common/sysctl.c | 2 - xen/drivers/char/ns16550.c | 4 -- xen/drivers/passthrough/amd/iommu_init.c | 7 --- xen/drivers/passthrough/amd/iommu_map.c | 5 -- xen/drivers/passthrough/amd/pci_amd_iommu.c | 4 -- xen/drivers/passthrough/pci.c | 63 +-------------------- xen/drivers/passthrough/vtd/iommu.c | 8 --- xen/drivers/video/vga.c | 2 - 15 files changed, 4 insertions(+), 142 deletions(-) diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index 020df615bd..9f4ca03385 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -537,11 +537,7 @@ long arch_do_domctl( ret = -ESRCH; if ( is_iommu_enabled(d) ) - { - pcidevs_lock(); ret = pt_irq_create_bind(d, bind); - pcidevs_unlock(); - } if ( ret < 0 ) printk(XENLOG_G_ERR "pt_irq_create_bind failed (%ld) for dom%d\n", ret, d->domain_id); @@ -566,11 +562,7 @@ long arch_do_domctl( break; if ( is_iommu_enabled(d) ) - { - pcidevs_lock(); ret = pt_irq_destroy_bind(d, bind); - pcidevs_unlock(); - } if ( ret < 0 ) printk(XENLOG_G_ERR "pt_irq_destroy_bind failed (%ld) for dom%d\n", ret, d->domain_id); diff --git a/xen/arch/x86/hvm/vioapic.c b/xen/arch/x86/hvm/vioapic.c index cb7f440160..aa4e7766a3 100644 --- a/xen/arch/x86/hvm/vioapic.c +++ b/xen/arch/x86/hvm/vioapic.c @@ -197,7 +197,6 @@ static int vioapic_hwdom_map_gsi(unsigned int gsi, unsigned int trig, return ret; } - pcidevs_lock(); ret = pt_irq_create_bind(currd, &pt_irq_bind); if ( ret ) { @@ -207,7 +206,6 @@ static int vioapic_hwdom_map_gsi(unsigned int gsi, unsigned int trig, unmap_domain_pirq(currd, pirq); write_unlock(&currd->event_lock); } - pcidevs_unlock(); return ret; } diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c index c9e5f279c5..344bbd646c 100644 --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -470,7 +470,6 @@ int msixtbl_pt_register(struct domain *d, struct pirq *pirq, uint64_t gtable) struct msixtbl_entry *entry, *new_entry; int r = -EINVAL; - ASSERT(pcidevs_locked()); ASSERT(rw_is_write_locked(&d->event_lock)); if ( !msixtbl_initialised(d) ) @@ -540,7 +539,6 @@ void msixtbl_pt_unregister(struct domain *d, struct pirq *pirq) struct pci_dev *pdev; struct msixtbl_entry *entry; - ASSERT(pcidevs_locked()); ASSERT(rw_is_write_locked(&d->event_lock)); if ( !msixtbl_initialised(d) ) @@ -686,8 +684,6 @@ static int vpci_msi_update(const struct pci_dev *pdev, uint32_t data, { unsigned int i; - ASSERT(pcidevs_locked()); - if ( (address & MSI_ADDR_BASE_MASK) != MSI_ADDR_HEADER ) { gdprintk(XENLOG_ERR, "%pp: PIRQ %u: unsupported address %lx\n", @@ -728,7 +724,6 @@ void vpci_msi_arch_update(struct vpci_msi *msi, const struct pci_dev *pdev) ASSERT(msi->arch.pirq != INVALID_PIRQ); - pcidevs_lock(); for ( i = 0; i < msi->vectors && msi->arch.bound; i++ ) { struct xen_domctl_bind_pt_irq unbind = { @@ -747,7 +742,6 @@ void vpci_msi_arch_update(struct vpci_msi *msi, const struct pci_dev *pdev) msi->arch.bound = !vpci_msi_update(pdev, msi->data, msi->address, msi->vectors, msi->arch.pirq, msi->mask); - pcidevs_unlock(); } static int vpci_msi_enable(const struct pci_dev *pdev, unsigned int nr, @@ -785,10 +779,8 @@ int vpci_msi_arch_enable(struct vpci_msi *msi, const struct pci_dev *pdev, return rc; msi->arch.pirq = rc; - pcidevs_lock(); msi->arch.bound = !vpci_msi_update(pdev, msi->data, msi->address, vectors, msi->arch.pirq, msi->mask); - pcidevs_unlock(); return 0; } @@ -800,7 +792,6 @@ static void vpci_msi_disable(const struct pci_dev *pdev, int pirq, ASSERT(pirq != INVALID_PIRQ); - pcidevs_lock(); for ( i = 0; i < nr && bound; i++ ) { struct xen_domctl_bind_pt_irq bind = { @@ -816,7 +807,6 @@ static void vpci_msi_disable(const struct pci_dev *pdev, int pirq, write_lock(&pdev->domain->event_lock); unmap_domain_pirq(pdev->domain, pirq); write_unlock(&pdev->domain->event_lock); - pcidevs_unlock(); } void vpci_msi_arch_disable(struct vpci_msi *msi, const struct pci_dev *pdev) @@ -863,7 +853,6 @@ int vpci_msix_arch_enable_entry(struct vpci_msix_entry *entry, entry->arch.pirq = rc; - pcidevs_lock(); rc = vpci_msi_update(pdev, entry->data, entry->addr, 1, entry->arch.pirq, entry->masked); if ( rc ) @@ -871,7 +860,6 @@ int vpci_msix_arch_enable_entry(struct vpci_msix_entry *entry, vpci_msi_disable(pdev, entry->arch.pirq, 1, false); entry->arch.pirq = INVALID_PIRQ; } - pcidevs_unlock(); return rc; } diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index d8672a03e1..6a08830a55 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -2156,8 +2156,6 @@ int map_domain_pirq( struct pci_dev *pdev; unsigned int nr = 0; - ASSERT(pcidevs_locked()); - ret = -ENODEV; if ( !cpu_has_apic ) goto done; @@ -2317,7 +2315,6 @@ int unmap_domain_pirq(struct domain *d, int pirq) if ( (pirq < 0) || (pirq >= d->nr_pirqs) ) return -EINVAL; - ASSERT(pcidevs_locked()); ASSERT(rw_is_write_locked(&d->event_lock)); info = pirq_info(d, pirq); @@ -2423,7 +2420,6 @@ void free_domain_pirqs(struct domain *d) { int i; - pcidevs_lock(); write_lock(&d->event_lock); for ( i = 0; i < d->nr_pirqs; i++ ) @@ -2431,7 +2427,6 @@ void free_domain_pirqs(struct domain *d) unmap_domain_pirq(d, i); write_unlock(&d->event_lock); - pcidevs_unlock(); } static void cf_check dump_irqs(unsigned char key) @@ -2911,7 +2906,6 @@ int allocate_and_map_msi_pirq(struct domain *d, int index, int *pirq_p, msi->irq = irq; - pcidevs_lock(); /* Verify or get pirq. */ write_lock(&d->event_lock); pirq = allocate_pirq(d, index, *pirq_p, irq, type, &msi->entry_nr); @@ -2927,7 +2921,6 @@ int allocate_and_map_msi_pirq(struct domain *d, int index, int *pirq_p, done: write_unlock(&d->event_lock); - pcidevs_unlock(); if ( ret ) { switch ( type ) diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index 6b62c4f452..f04b90e235 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -623,7 +623,6 @@ static int msi_capability_init(struct pci_dev *dev, u8 slot = PCI_SLOT(dev->devfn); u8 func = PCI_FUNC(dev->devfn); - ASSERT(pcidevs_locked()); pos = pci_find_cap_offset(seg, bus, slot, func, PCI_CAP_ID_MSI); if ( !pos ) return -ENODEV; @@ -810,8 +809,6 @@ static int msix_capability_init(struct pci_dev *dev, if ( !pos ) return -ENODEV; - ASSERT(pcidevs_locked()); - control = pci_conf_read16(dev->sbdf, msix_control_reg(pos)); /* * Ensure MSI-X interrupts are masked during setup. Some devices require @@ -1032,7 +1029,6 @@ static int __pci_enable_msi(struct msi_info *msi, struct msi_desc **desc) struct msi_desc *old_desc; int ret; - ASSERT(pcidevs_locked()); pdev = pci_get_pdev(NULL, msi->sbdf); if ( !pdev ) return -ENODEV; @@ -1092,7 +1088,6 @@ static int __pci_enable_msix(struct msi_info *msi, struct msi_desc **desc) struct msi_desc *old_desc; int ret; - ASSERT(pcidevs_locked()); pdev = pci_get_pdev(NULL, msi->sbdf); if ( !pdev || !pdev->msix ) return -ENODEV; @@ -1191,7 +1186,6 @@ int pci_prepare_msix(u16 seg, u8 bus, u8 devfn, bool off) if ( !use_msi ) return 0; - pcidevs_lock(); pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bus, devfn)); if ( !pdev ) rc = -ENODEV; @@ -1204,7 +1198,6 @@ int pci_prepare_msix(u16 seg, u8 bus, u8 devfn, bool off) } else rc = msix_capability_init(pdev, NULL, NULL); - pcidevs_unlock(); pcidev_put(pdev); @@ -1217,8 +1210,6 @@ int pci_prepare_msix(u16 seg, u8 bus, u8 devfn, bool off) */ int pci_enable_msi(struct msi_info *msi, struct msi_desc **desc) { - ASSERT(pcidevs_locked()); - if ( !use_msi ) return -EPERM; @@ -1355,8 +1346,6 @@ int pci_restore_msi_state(struct pci_dev *pdev) unsigned int type = 0, pos = 0; u16 control = 0; - ASSERT(pcidevs_locked()); - if ( !use_msi ) return -EOPNOTSUPP; diff --git a/xen/arch/x86/pci.c b/xen/arch/x86/pci.c index 1d38f0df7c..4dcd6d96f3 100644 --- a/xen/arch/x86/pci.c +++ b/xen/arch/x86/pci.c @@ -88,15 +88,11 @@ int pci_conf_write_intercept(unsigned int seg, unsigned int bdf, if ( reg < 64 || reg >= 256 ) return 0; - pcidevs_lock(); - pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bdf)); if ( pdev ) { rc = pci_msi_conf_write_intercept(pdev, reg, size, data); pcidev_put(pdev); } - pcidevs_unlock(); - return rc; } diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c index 96214a3d40..a41366b609 100644 --- a/xen/arch/x86/physdev.c +++ b/xen/arch/x86/physdev.c @@ -162,11 +162,9 @@ int physdev_unmap_pirq(domid_t domid, int pirq) goto free_domain; } - pcidevs_lock(); write_lock(&d->event_lock); ret = unmap_domain_pirq(d, pirq); write_unlock(&d->event_lock); - pcidevs_unlock(); free_domain: rcu_unlock_domain(d); @@ -530,7 +528,6 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) if ( copy_from_guest(&restore_msi, arg, 1) != 0 ) break; - pcidevs_lock(); pdev = pci_get_pdev(NULL, PCI_SBDF(0, restore_msi.bus, restore_msi.devfn)); if ( pdev ) @@ -541,7 +538,6 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) else ret = -ENODEV; - pcidevs_unlock(); break; } @@ -553,7 +549,6 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) if ( copy_from_guest(&dev, arg, 1) != 0 ) break; - pcidevs_lock(); pdev = pci_get_pdev(NULL, PCI_SBDF(dev.seg, dev.bus, dev.devfn)); if ( pdev ) { @@ -562,7 +557,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) } else ret = -ENODEV; - pcidevs_unlock(); + break; } diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index 0feef94cd2..6bb8c5c295 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -446,7 +446,6 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) break; } - pcidevs_lock(); pdev = pci_get_pdev(NULL, PCI_SBDF(dev.seg, dev.bus, dev.devfn)); if ( !pdev ) node = XEN_INVALID_DEV; @@ -454,7 +453,6 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) node = XEN_INVALID_NODE_ID; else node = pdev->node; - pcidevs_unlock(); if ( pdev ) pcidev_put(pdev); diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c index 01a05c9aa8..66c10b18e5 100644 --- a/xen/drivers/char/ns16550.c +++ b/xen/drivers/char/ns16550.c @@ -445,8 +445,6 @@ static void __init cf_check ns16550_init_postirq(struct serial_port *port) { struct msi_desc *msi_desc = NULL; - pcidevs_lock(); - rc = pci_enable_msi(&msi, &msi_desc); if ( !rc ) { @@ -460,8 +458,6 @@ static void __init cf_check ns16550_init_postirq(struct serial_port *port) pci_disable_msi(msi_desc); } - pcidevs_unlock(); - if ( rc ) { uart->irq = 0; diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c index 7c1713a602..e42af65a40 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -638,10 +638,7 @@ static void cf_check parse_ppr_log_entry(struct amd_iommu *iommu, u32 entry[]) uint16_t device_id = iommu_get_devid_from_cmd(entry[0]); struct pci_dev *pdev; - pcidevs_lock(); pdev = pci_get_real_pdev(PCI_SBDF(iommu->seg, device_id)); - pcidevs_unlock(); - if ( pdev ) guest_iommu_add_ppr_log(pdev->domain, entry); pcidev_put(pdev); @@ -747,14 +744,12 @@ static bool_t __init set_iommu_interrupt_handler(struct amd_iommu *iommu) return 0; } - pcidevs_lock(); /* * XXX: it is unclear if this device can be removed. Right now * there is no code that clears msi.dev, so no one will decrease * refcount on it. */ iommu->msi.dev = pci_get_pdev(NULL, PCI_SBDF(iommu->seg, iommu->bdf)); - pcidevs_unlock(); if ( !iommu->msi.dev ) { AMD_IOMMU_WARN("no pdev for %pp\n", @@ -1289,9 +1284,7 @@ static int __init cf_check amd_iommu_setup_device_table( { if ( !pci_init ) continue; - pcidevs_lock(); pdev = pci_get_pdev(NULL, PCI_SBDF(seg, bdf)); - pcidevs_unlock(); } if ( pdev && (pdev->msix || pdev->msi_maxvec) ) diff --git a/xen/drivers/passthrough/amd/iommu_map.c b/xen/drivers/passthrough/amd/iommu_map.c index 9d621e3d36..d04aa37538 100644 --- a/xen/drivers/passthrough/amd/iommu_map.c +++ b/xen/drivers/passthrough/amd/iommu_map.c @@ -726,9 +726,7 @@ int cf_check amd_iommu_get_reserved_device_memory( /* May need to trigger the workaround in find_iommu_for_device(). */ struct pci_dev *pdev; - pcidevs_lock(); pdev = pci_get_pdev(NULL, sbdf); - pcidevs_unlock(); if ( pdev ) { @@ -848,7 +846,6 @@ int cf_check amd_iommu_quarantine_init(struct pci_dev *pdev, bool scratch_page) const struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(pdev->seg); int rc; - ASSERT(pcidevs_locked()); ASSERT(!hd->arch.amd.root_table); ASSERT(page_list_empty(&hd->arch.pgtables.list)); @@ -903,8 +900,6 @@ void amd_iommu_quarantine_teardown(struct pci_dev *pdev) { struct domain_iommu *hd = dom_iommu(dom_io); - ASSERT(pcidevs_locked()); - if ( !pdev->arch.amd.root_table ) return; diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c index 955f3af57a..919e30129e 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -268,8 +268,6 @@ static int __must_check amd_iommu_setup_domain_device( req_id, pdev->type, page_to_maddr(root_pg), domid, hd->arch.amd.paging_mode); - ASSERT(pcidevs_locked()); - if ( pci_ats_device(iommu->seg, bus, pdev->devfn) && !ivrs_dev->block_ats && iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) && @@ -416,8 +414,6 @@ static void amd_iommu_disable_domain_device(const struct domain *domain, if ( QUARANTINE_SKIP(domain, pdev) ) return; - ASSERT(pcidevs_locked()); - if ( pci_ats_device(iommu->seg, bus, pdev->devfn) && pci_ats_enabled(iommu->seg, bus, pdev->devfn) ) { diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index c83397211b..cc62a5aec4 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -517,7 +517,6 @@ int __init pci_hide_device(unsigned int seg, unsigned int bus, struct pci_seg *pseg; int rc = -ENOMEM; - pcidevs_lock(); pseg = alloc_pseg(seg); if ( pseg ) { @@ -528,7 +527,6 @@ int __init pci_hide_device(unsigned int seg, unsigned int bus, rc = 0; } } - pcidevs_unlock(); return rc; } @@ -588,8 +586,6 @@ struct pci_dev *pci_get_pdev(struct domain *d, pci_sbdf_t sbdf) { struct pci_dev *pdev; - ASSERT(d || pcidevs_locked()); - /* * The hardware domain owns the majority of the devices in the system. * When there are multiple segments, traversing the per-segment list is @@ -730,7 +726,6 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, pdev_type = "device"; else if ( info->is_virtfn ) { - pcidevs_lock(); pdev = pci_get_pdev(NULL, PCI_SBDF(seg, info->physfn.bus, info->physfn.devfn)); @@ -739,7 +734,6 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, pf_is_extfn = pdev->info.is_extfn; pcidev_put(pdev); } - pcidevs_unlock(); if ( !pdev ) pci_add_device(seg, info->physfn.bus, info->physfn.devfn, NULL, node); @@ -756,7 +750,6 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, ret = -ENOMEM; - pcidevs_lock(); pseg = alloc_pseg(seg); if ( !pseg ) goto out; @@ -858,7 +851,6 @@ int pci_add_device(u16 seg, u8 bus, u8 devfn, pci_enable_acs(pdev); out: - pcidevs_unlock(); if ( !ret ) { printk(XENLOG_DEBUG "PCI add %s %pp\n", pdev_type, &pdev->sbdf); @@ -889,7 +881,6 @@ int pci_remove_device(u16 seg, u8 bus, u8 devfn) if ( !pseg ) return -ENODEV; - pcidevs_lock(); spin_lock(&pseg->alldevs_lock); list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) if ( pdev->bus == bus && pdev->devfn == devfn ) @@ -910,12 +901,10 @@ int pci_remove_device(u16 seg, u8 bus, u8 devfn) break; } - pcidevs_unlock(); spin_unlock(&pseg->alldevs_lock); return ret; } -/* Caller should hold the pcidevs_lock */ static int deassign_device(struct domain *d, uint16_t seg, uint8_t bus, uint8_t devfn) { @@ -927,7 +916,6 @@ static int deassign_device(struct domain *d, uint16_t seg, uint8_t bus, if ( !is_iommu_enabled(d) ) return -EINVAL; - ASSERT(pcidevs_locked()); pdev = pci_get_pdev(d, PCI_SBDF(seg, bus, devfn)); if ( !pdev ) return -ENODEV; @@ -981,13 +969,10 @@ int pci_release_devices(struct domain *d) u8 bus, devfn; int ret; - pcidevs_lock(); ret = arch_pci_clean_pirqs(d); if ( ret ) - { - pcidevs_unlock(); return ret; - } + spin_lock(&d->pdevs_lock); list_for_each_entry_safe ( pdev, tmp, &d->pdev_list, domain_list ) { @@ -996,7 +981,6 @@ int pci_release_devices(struct domain *d) ret = deassign_device(d, pdev->seg, bus, devfn) ?: ret; } spin_unlock(&d->pdevs_lock); - pcidevs_unlock(); return ret; } @@ -1094,7 +1078,6 @@ void pci_check_disable_device(u16 seg, u8 bus, u8 devfn) s_time_t now = NOW(); u16 cword; - pcidevs_lock(); pdev = pci_get_real_pdev(PCI_SBDF(seg, bus, devfn)); if ( pdev ) { @@ -1108,7 +1091,6 @@ void pci_check_disable_device(u16 seg, u8 bus, u8 devfn) pdev = NULL; } } - pcidevs_unlock(); if ( !pdev ) return; @@ -1164,13 +1146,7 @@ static int __init cf_check _scan_pci_devices(struct pci_seg *pseg, void *arg) int __init scan_pci_devices(void) { - int ret; - - pcidevs_lock(); - ret = pci_segments_iterate(_scan_pci_devices, NULL); - pcidevs_unlock(); - - return ret; + return pci_segments_iterate(_scan_pci_devices, NULL); } struct setup_hwdom { @@ -1239,19 +1215,11 @@ static int __hwdom_init cf_check _setup_hwdom_pci_devices( pcidev_put(pdev); if ( iommu_verbose ) - { - pcidevs_unlock(); process_pending_softirqs(); - pcidevs_lock(); - } } if ( !iommu_verbose ) - { - pcidevs_unlock(); process_pending_softirqs(); - pcidevs_lock(); - } } return 0; @@ -1262,9 +1230,7 @@ void __hwdom_init setup_hwdom_pci_devices( { struct setup_hwdom ctxt = { .d = d, .handler = handler }; - pcidevs_lock(); pci_segments_iterate(_setup_hwdom_pci_devices, &ctxt); - pcidevs_unlock(); } /* APEI not supported on ARM yet. */ @@ -1396,9 +1362,7 @@ static int cf_check _dump_pci_devices(struct pci_seg *pseg, void *arg) static void cf_check dump_pci_devices(unsigned char ch) { printk("==== PCI devices ====\n"); - pcidevs_lock(); pci_segments_iterate(_dump_pci_devices, NULL); - pcidevs_unlock(); } static int __init cf_check setup_dump_pcidevs(void) @@ -1417,8 +1381,6 @@ static int iommu_add_device(struct pci_dev *pdev) if ( !pdev->domain ) return -EINVAL; - ASSERT(pcidevs_locked()); - hd = dom_iommu(pdev->domain); if ( !is_iommu_enabled(pdev->domain) ) return 0; @@ -1446,8 +1408,6 @@ static int iommu_enable_device(struct pci_dev *pdev) if ( !pdev->domain ) return -EINVAL; - ASSERT(pcidevs_locked()); - hd = dom_iommu(pdev->domain); if ( !is_iommu_enabled(pdev->domain) || !hd->platform_ops->enable_device ) @@ -1494,7 +1454,6 @@ static int device_assigned(struct pci_dev *pdev) { int rc = 0; - ASSERT(pcidevs_locked()); /* * If the device exists and it is not owned by either the hardware * domain or dom_io then it must be assigned to a guest, or be @@ -1507,7 +1466,6 @@ static int device_assigned(struct pci_dev *pdev) return rc; } -/* Caller should hold the pcidevs_lock */ static int assign_device(struct domain *d, struct pci_dev *pdev, u32 flag) { const struct domain_iommu *hd = dom_iommu(d); @@ -1521,7 +1479,6 @@ static int assign_device(struct domain *d, struct pci_dev *pdev, u32 flag) return -EXDEV; /* device_assigned() should already have cleared the device for assignment */ - ASSERT(pcidevs_locked()); ASSERT(pdev && (pdev->domain == hardware_domain || pdev->domain == dom_io)); @@ -1587,7 +1544,6 @@ static int iommu_get_device_group( if ( group_id < 0 ) return group_id; - pcidevs_lock(); spin_lock(&d->pdevs_lock); for_each_pdev( d, pdev ) { @@ -1603,7 +1559,6 @@ static int iommu_get_device_group( sdev_id = iommu_call(ops, get_device_group_id, seg, b, df); if ( sdev_id < 0 ) { - pcidevs_unlock(); spin_unlock(&d->pdevs_lock); return sdev_id; } @@ -1614,7 +1569,6 @@ static int iommu_get_device_group( if ( unlikely(copy_to_guest_offset(buf, i, &bdf, 1)) ) { - pcidevs_unlock(); spin_unlock(&d->pdevs_lock); return -EFAULT; } @@ -1622,7 +1576,6 @@ static int iommu_get_device_group( } } - pcidevs_unlock(); spin_unlock(&d->pdevs_lock); return i; @@ -1630,17 +1583,12 @@ static int iommu_get_device_group( void iommu_dev_iotlb_flush_timeout(struct domain *d, struct pci_dev *pdev) { - pcidevs_lock(); - /* iommu->ats_list_lock is taken by the caller of this function */ disable_ats_device(pdev); ASSERT(pdev->domain); if ( d != pdev->domain ) - { - pcidevs_unlock(); return; - } pdev->broken = true; @@ -1649,8 +1597,6 @@ void iommu_dev_iotlb_flush_timeout(struct domain *d, struct pci_dev *pdev) d->domain_id, &pdev->sbdf); if ( !is_hardware_domain(d) ) domain_crash(d); - - pcidevs_unlock(); } int iommu_do_pci_domctl( @@ -1740,7 +1686,6 @@ int iommu_do_pci_domctl( break; } - pcidevs_lock(); ret = device_assigned(pdev); if ( domctl->cmd == XEN_DOMCTL_test_assign_device ) { @@ -1755,7 +1700,7 @@ int iommu_do_pci_domctl( ret = assign_device(d, pdev, flags); pcidev_put(pdev); - pcidevs_unlock(); + if ( ret == -ERESTART ) ret = hypercall_create_continuation(__HYPERVISOR_domctl, "h", u_domctl); @@ -1787,9 +1732,7 @@ int iommu_do_pci_domctl( bus = PCI_BUS(machine_sbdf); devfn = PCI_DEVFN(machine_sbdf); - pcidevs_lock(); ret = deassign_device(d, seg, bus, devfn); - pcidevs_unlock(); break; default: diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 42661f22f4..87868188b7 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1490,7 +1490,6 @@ int domain_context_mapping_one( if ( QUARANTINE_SKIP(domain, pgd_maddr) ) return 0; - ASSERT(pcidevs_locked()); spin_lock(&iommu->lock); maddr = bus_to_context_maddr(iommu, bus); context_entries = (struct context_entry *)map_vtd_domain_page(maddr); @@ -1711,8 +1710,6 @@ static int domain_context_mapping(struct domain *domain, u8 devfn, if ( drhd && drhd->iommu->node != NUMA_NO_NODE ) dom_iommu(domain)->node = drhd->iommu->node; - ASSERT(pcidevs_locked()); - for_each_rmrr_device( rmrr, bdf, i ) { if ( rmrr->segment != pdev->seg || bdf != pdev->sbdf.bdf ) @@ -2072,8 +2069,6 @@ static void quarantine_teardown(struct pci_dev *pdev, { struct domain_iommu *hd = dom_iommu(dom_io); - ASSERT(pcidevs_locked()); - if ( !pdev->arch.vtd.pgd_maddr ) return; @@ -2341,8 +2336,6 @@ static int cf_check intel_iommu_add_device(u8 devfn, struct pci_dev *pdev) u16 bdf; int ret, i; - ASSERT(pcidevs_locked()); - if ( !pdev->domain ) return -EINVAL; @@ -3176,7 +3169,6 @@ static int cf_check intel_iommu_quarantine_init(struct pci_dev *pdev, bool rmrr_found = false; int rc; - ASSERT(pcidevs_locked()); ASSERT(!hd->arch.vtd.pgd_maddr); ASSERT(page_list_empty(&hd->arch.pgtables.list)); diff --git a/xen/drivers/video/vga.c b/xen/drivers/video/vga.c index 1298f3a7b6..1f7c496114 100644 --- a/xen/drivers/video/vga.c +++ b/xen/drivers/video/vga.c @@ -117,9 +117,7 @@ void __init video_endboot(void) struct pci_dev *pdev; u8 b = bus, df = devfn, sb; - pcidevs_lock(); pdev = pci_get_pdev(NULL, PCI_SBDF(0, bus, devfn)); - pcidevs_unlock(); if ( !pdev || pci_conf_read16(PCI_SBDF(0, bus, devfn), -- 2.36.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |