[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] PCI device register/unregister + pci_dev cleanups
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1215190276 -3600 # Node ID 1e9df5cb885f8848f147c21758040978019aefd0 # Parent e42135b61dc6cf27fb192e71bb33e6d57ffe80f0 PCI device register/unregister + pci_dev cleanups Move pci_dev lists from hvm to arch_domain Move the pci_dev list from hvm to arch_domain since PCI devs are no longer hvm specific. Also removed locking for pci_dev lists. Will reintroduce them later. Signed-off-by: Espen Skoglund <espen.skoglund@xxxxxxxxxxxxx> --- xen/arch/x86/domain.c | 2 ++ xen/arch/x86/hvm/hvm.c | 2 +- xen/arch/x86/hvm/svm/svm.c | 2 +- xen/arch/x86/hvm/vmx/vmcs.c | 3 +-- xen/arch/x86/hvm/vmx/vmx.c | 2 +- xen/arch/x86/mm/shadow/multi.c | 3 +-- xen/drivers/passthrough/amd/pci_amd_iommu.c | 19 +++++-------------- xen/drivers/passthrough/iommu.c | 9 +++------ xen/drivers/passthrough/vtd/dmar.h | 4 ---- xen/drivers/passthrough/vtd/iommu.c | 19 +++++-------------- xen/include/asm-x86/domain.h | 4 ++++ xen/include/asm-x86/hvm/svm/amd-iommu-proto.h | 4 ---- xen/include/xen/hvm/iommu.h | 5 ----- xen/include/xen/pci.h | 7 ++++++- 14 files changed, 30 insertions(+), 55 deletions(-) diff -r e42135b61dc6 -r 1e9df5cb885f xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/arch/x86/domain.c Fri Jul 04 17:51:16 2008 +0100 @@ -350,6 +350,8 @@ int arch_domain_create(struct domain *d, hvm_funcs.hap_supported && (domcr_flags & DOMCRF_hap); + INIT_LIST_HEAD(&d->arch.pdev_list); + d->arch.relmem = RELMEM_not_started; INIT_LIST_HEAD(&d->arch.relmem_list); diff -r e42135b61dc6 -r 1e9df5cb885f xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/arch/x86/hvm/hvm.c Fri Jul 04 17:51:16 2008 +0100 @@ -911,7 +911,7 @@ int hvm_set_cr0(unsigned long value) } } - if ( !list_empty(&domain_hvm_iommu(v->domain)->pdev_list) ) + if ( has_arch_pdevs(v->domain) ) { if ( (value & X86_CR0_CD) && !(value & X86_CR0_NW) ) { diff -r e42135b61dc6 -r 1e9df5cb885f xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/arch/x86/hvm/svm/svm.c Fri Jul 04 17:51:16 2008 +0100 @@ -1132,7 +1132,7 @@ static void wbinvd_ipi(void *info) static void svm_wbinvd_intercept(void) { - if ( !list_empty(&(domain_hvm_iommu(current->domain)->pdev_list)) ) + if ( has_arch_pdevs(current->domain) ) on_each_cpu(wbinvd_ipi, NULL, 1, 1); } diff -r e42135b61dc6 -r 1e9df5cb885f xen/arch/x86/hvm/vmx/vmcs.c --- a/xen/arch/x86/hvm/vmx/vmcs.c Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/arch/x86/hvm/vmx/vmcs.c Fri Jul 04 17:51:16 2008 +0100 @@ -849,8 +849,7 @@ void vmx_do_resume(struct vcpu *v) * there is no wbinvd exit, or * 2: execute wbinvd on all dirty pCPUs when guest wbinvd exits. */ - if ( !list_empty(&(domain_hvm_iommu(v->domain)->pdev_list)) && - !cpu_has_wbinvd_exiting ) + if ( has_arch_pdevs(v->domain) && !cpu_has_wbinvd_exiting ) { int cpu = v->arch.hvm_vmx.active_cpu; if ( cpu != -1 ) diff -r e42135b61dc6 -r 1e9df5cb885f xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/arch/x86/hvm/vmx/vmx.c Fri Jul 04 17:51:16 2008 +0100 @@ -1926,7 +1926,7 @@ static void wbinvd_ipi(void *info) static void vmx_wbinvd_intercept(void) { - if ( list_empty(&(domain_hvm_iommu(current->domain)->pdev_list)) ) + if ( !has_arch_pdevs(current->domain) ) return; if ( cpu_has_wbinvd_exiting ) diff -r e42135b61dc6 -r 1e9df5cb885f xen/arch/x86/mm/shadow/multi.c --- a/xen/arch/x86/mm/shadow/multi.c Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/arch/x86/mm/shadow/multi.c Fri Jul 04 17:51:16 2008 +0100 @@ -840,8 +840,7 @@ _sh_propagate(struct vcpu *v, * For HVM domains with direct access to MMIO areas, set the correct * caching attributes in the shadows to match what was asked for. */ - if ( (level == 1) && is_hvm_domain(d) && - !list_empty(&(domain_hvm_iommu(d)->pdev_list)) && + if ( (level == 1) && is_hvm_domain(d) && has_arch_pdevs(d) && !is_xen_heap_mfn(mfn_x(target_mfn)) ) { unsigned int type; diff -r e42135b61dc6 -r 1e9df5cb885f xen/drivers/passthrough/amd/pci_amd_iommu.c --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Fri Jul 04 17:51:16 2008 +0100 @@ -292,7 +292,6 @@ static void amd_iommu_setup_domain_devic static void amd_iommu_setup_dom0_devices(struct domain *d) { - struct hvm_iommu *hd = domain_hvm_iommu(d); struct amd_iommu *iommu; struct pci_dev *pdev; int bus, dev, func; @@ -314,7 +313,7 @@ static void amd_iommu_setup_dom0_devices pdev = xmalloc(struct pci_dev); pdev->bus = bus; pdev->devfn = PCI_DEVFN(dev, func); - list_add_tail(&pdev->list, &hd->pdev_list); + list_add_tail(&pdev->domain_list, &d->arch.pdev_list); bdf = (bus << 8) | pdev->devfn; /* supported device? */ @@ -490,12 +489,9 @@ static int reassign_device( struct domai static int reassign_device( struct domain *source, struct domain *target, u8 bus, u8 devfn) { - struct hvm_iommu *source_hd = domain_hvm_iommu(source); - struct hvm_iommu *target_hd = domain_hvm_iommu(target); struct pci_dev *pdev; struct amd_iommu *iommu; int bdf; - unsigned long flags; for_each_pdev ( source, pdev ) { @@ -520,11 +516,7 @@ static int reassign_device( struct domai amd_iommu_disable_domain_device(source, iommu, bdf); /* Move pci device from the source domain to target domain. */ - spin_lock_irqsave(&source_hd->iommu_list_lock, flags); - spin_lock_irqsave(&target_hd->iommu_list_lock, flags); - list_move(&pdev->list, &target_hd->pdev_list); - spin_unlock_irqrestore(&target_hd->iommu_list_lock, flags); - spin_unlock_irqrestore(&source_hd->iommu_list_lock, flags); + list_move(&pdev->domain_list, &target->arch.pdev_list); amd_iommu_setup_domain_device(target, iommu, bdf); amd_iov_info("reassign %x:%x.%x domain %d -> domain %d\n", @@ -559,12 +551,11 @@ static int amd_iommu_assign_device(struc static void release_domain_devices(struct domain *d) { - struct hvm_iommu *hd = domain_hvm_iommu(d); struct pci_dev *pdev; - while ( !list_empty(&hd->pdev_list) ) - { - pdev = list_entry(hd->pdev_list.next, typeof(*pdev), list); + while ( has_arch_pdevs(d) ) + { + pdev = list_entry(d->arch.pdev_list.next, typeof(*pdev), domain_list); pdev_flr(pdev->bus, pdev->devfn); amd_iov_info("release domain %d devices %x:%x.%x\n", d->domain_id, pdev->bus, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn)); diff -r e42135b61dc6 -r 1e9df5cb885f xen/drivers/passthrough/iommu.c --- a/xen/drivers/passthrough/iommu.c Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/drivers/passthrough/iommu.c Fri Jul 04 17:51:16 2008 +0100 @@ -35,8 +35,6 @@ int iommu_domain_init(struct domain *dom struct hvm_iommu *hd = domain_hvm_iommu(domain); spin_lock_init(&hd->mapping_lock); - spin_lock_init(&hd->iommu_list_lock); - INIT_LIST_HEAD(&hd->pdev_list); INIT_LIST_HEAD(&hd->g2m_ioport_list); if ( !iommu_enabled ) @@ -68,7 +66,7 @@ int assign_device(struct domain *d, u8 b if ( (rc = hd->platform_ops->assign_device(d, bus, devfn)) ) return rc; - if ( has_iommu_pdevs(d) && !is_hvm_domain(d) && !need_iommu(d) ) + if ( has_arch_pdevs(d) && !is_hvm_domain(d) && !need_iommu(d) ) { d->need_iommu = 1; return iommu_populate_page_table(d); @@ -190,7 +188,7 @@ void deassign_device(struct domain *d, u hd->platform_ops->reassign_device(d, dom0, bus, devfn); - if ( !has_iommu_pdevs(d) && need_iommu(d) ) + if ( !has_arch_pdevs(d) && need_iommu(d) ) { d->need_iommu = 0; hd->platform_ops->teardown(d); @@ -242,8 +240,7 @@ int iommu_get_device_group(struct domain group_id = ops->get_device_group_id(bus, devfn); - list_for_each_entry(pdev, - &(dom0->arch.hvm_domain.hvm_iommu.pdev_list), list) + for_each_pdev( d, pdev ) { if ( (pdev->bus == bus) && (pdev->devfn == devfn) ) continue; diff -r e42135b61dc6 -r 1e9df5cb885f xen/drivers/passthrough/vtd/dmar.h --- a/xen/drivers/passthrough/vtd/dmar.h Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/drivers/passthrough/vtd/dmar.h Fri Jul 04 17:51:16 2008 +0100 @@ -70,10 +70,6 @@ struct acpi_atsr_unit { list_for_each_entry(iommu, \ &(domain->arch.hvm_domain.hvm_iommu.iommu_list), list) -#define for_each_pdev(domain, pdev) \ - list_for_each_entry(pdev, \ - &(domain->arch.hvm_domain.hvm_iommu.pdev_list), list) - #define for_each_drhd_unit(drhd) \ list_for_each_entry(drhd, &acpi_drhd_units, list) #define for_each_rmrr_device(rmrr, pdev) \ diff -r e42135b61dc6 -r 1e9df5cb885f xen/drivers/passthrough/vtd/iommu.c --- a/xen/drivers/passthrough/vtd/iommu.c Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/drivers/passthrough/vtd/iommu.c Fri Jul 04 17:51:16 2008 +0100 @@ -1022,8 +1022,6 @@ static int intel_iommu_domain_init(struc struct iommu *iommu = NULL; u64 i; struct acpi_drhd_unit *drhd; - - INIT_LIST_HEAD(&hd->pdev_list); drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list); iommu = drhd->iommu; @@ -1366,12 +1364,10 @@ void reassign_device_ownership( u8 bus, u8 devfn) { struct hvm_iommu *source_hd = domain_hvm_iommu(source); - struct hvm_iommu *target_hd = domain_hvm_iommu(target); struct pci_dev *pdev, *pdev2; struct acpi_drhd_unit *drhd; struct iommu *iommu; int status; - unsigned long flags; int found = 0; pdev_flr(bus, devfn); @@ -1388,11 +1384,7 @@ void reassign_device_ownership( domain_context_unmap(iommu, pdev); /* Move pci device from the source domain to target domain. */ - spin_lock_irqsave(&source_hd->iommu_list_lock, flags); - spin_lock_irqsave(&target_hd->iommu_list_lock, flags); - list_move(&pdev->list, &target_hd->pdev_list); - spin_unlock_irqrestore(&target_hd->iommu_list_lock, flags); - spin_unlock_irqrestore(&source_hd->iommu_list_lock, flags); + list_move(&pdev->domain_list, &target->arch.pdev_list); for_each_pdev ( source, pdev2 ) { @@ -1413,12 +1405,11 @@ void reassign_device_ownership( void return_devices_to_dom0(struct domain *d) { - struct hvm_iommu *hd = domain_hvm_iommu(d); struct pci_dev *pdev; - while ( !list_empty(&hd->pdev_list) ) - { - pdev = list_entry(hd->pdev_list.next, typeof(*pdev), list); + while ( has_arch_pdevs(d) ) + { + pdev = list_entry(d->arch.pdev_list.next, typeof(*pdev), domain_list); pci_cleanup_msi(pdev->bus, pdev->devfn); reassign_device_ownership(d, dom0, pdev->bus, pdev->devfn); } @@ -1631,7 +1622,7 @@ static void setup_dom0_devices(struct do pdev = xmalloc(struct pci_dev); pdev->bus = bus; pdev->devfn = PCI_DEVFN(dev, func); - list_add_tail(&pdev->list, &hd->pdev_list); + list_add_tail(&pdev->domain_list, &d->arch.pdev_list); drhd = acpi_find_matched_drhd_unit(pdev); ret = domain_context_mapping(d, drhd->iommu, pdev); diff -r e42135b61dc6 -r 1e9df5cb885f xen/include/asm-x86/domain.h --- a/xen/include/asm-x86/domain.h Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/include/asm-x86/domain.h Fri Jul 04 17:51:16 2008 +0100 @@ -228,6 +228,7 @@ struct arch_domain struct rangeset *ioport_caps; uint32_t pci_cf8; + struct list_head pdev_list; struct hvm_domain hvm_domain; struct paging_domain paging; @@ -265,6 +266,9 @@ struct arch_domain cpuid_input_t cpuids[MAX_CPUID_INPUT]; } __cacheline_aligned; + +#define has_arch_pdevs(d) (!list_empty(&(d)->arch.pdev_list)) + #ifdef __i386__ struct pae_l3_cache { diff -r e42135b61dc6 -r 1e9df5cb885f xen/include/asm-x86/hvm/svm/amd-iommu-proto.h --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Fri Jul 04 17:51:16 2008 +0100 @@ -27,10 +27,6 @@ #define for_each_amd_iommu(amd_iommu) \ list_for_each_entry(amd_iommu, \ &amd_iommu_head, list) - -#define for_each_pdev(domain, pdev) \ - list_for_each_entry(pdev, \ - &(domain->arch.hvm_domain.hvm_iommu.pdev_list), list) #define DMA_32BIT_MASK 0x00000000ffffffffULL #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK) diff -r e42135b61dc6 -r 1e9df5cb885f xen/include/xen/hvm/iommu.h --- a/xen/include/xen/hvm/iommu.h Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/include/xen/hvm/iommu.h Fri Jul 04 17:51:16 2008 +0100 @@ -36,8 +36,6 @@ struct g2m_ioport { }; struct hvm_iommu { - spinlock_t iommu_list_lock; /* protect iommu specific lists */ - struct list_head pdev_list; /* direct accessed pci devices */ u64 pgd_maddr; /* io page directory machine address */ spinlock_t mapping_lock; /* io page table lock */ int agaw; /* adjusted guest address width, 0 is level 2 30-bit */ @@ -55,7 +53,4 @@ struct hvm_iommu { struct iommu_ops *platform_ops; }; -#define has_iommu_pdevs(domain) \ - (!list_empty(&(domain->arch.hvm_domain.hvm_iommu.pdev_list))) - #endif /* __ASM_X86_HVM_IOMMU_H__ */ diff -r e42135b61dc6 -r 1e9df5cb885f xen/include/xen/pci.h --- a/xen/include/xen/pci.h Fri Jul 04 17:50:31 2008 +0100 +++ b/xen/include/xen/pci.h Fri Jul 04 17:51:16 2008 +0100 @@ -25,7 +25,7 @@ #define PCI_FUNC(devfn) ((devfn) & 0x07) struct pci_dev { - struct list_head list; + struct list_head domain_list; struct list_head msi_dev_list; u8 bus; u8 devfn; @@ -50,4 +50,9 @@ int pci_find_cap_offset(u8 bus, u8 dev, int pci_find_cap_offset(u8 bus, u8 dev, u8 func, u8 cap); int pci_find_next_cap(u8 bus, unsigned int devfn, u8 pos, int cap); + +#define for_each_pdev(domain, pdev) \ + list_for_each_entry(pdev, &(domain->arch.pdev_list), domain_list) + + #endif /* __XEN_PCI_H__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |