diff options
author | Jan Beulich <jbeulich@suse.com> | 2012-02-24 11:46:32 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2012-02-24 11:46:32 +0100 |
commit | a8078b02351eb5085afb1941175bb3977863e849 (patch) | |
tree | d4dd3e2617c368507152d1af19ea7d448bbc268b | |
parent | e1dc98e3c3619cf7a050cc898ecb9288eceb5915 (diff) | |
download | xen-a8078b02351eb5085afb1941175bb3977863e849.tar.gz xen-a8078b02351eb5085afb1941175bb3977863e849.tar.bz2 xen-a8078b02351eb5085afb1941175bb3977863e849.zip |
passthrough: release assigned PCI devices earlier during domain shutdown
At least with xend, where there's not even a tool stack side attempt to
de-assign devices during domain shutdown, this allows immediate re-
starts of a domain to work reliably. (There's no apparent reason why
c/s 18010:c1577f094ae4 chose to put this in the asynchronous part of
domain destruction).
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
-rw-r--r-- | xen/arch/ia64/xen/domain.c | 6 | ||||
-rw-r--r-- | xen/arch/x86/domain.c | 3 | ||||
-rw-r--r-- | xen/drivers/passthrough/iommu.c | 3 |
3 files changed, 7 insertions, 5 deletions
diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c index a31bd325e4..7faa631b7a 100644 --- a/xen/arch/ia64/xen/domain.c +++ b/xen/arch/ia64/xen/domain.c @@ -673,10 +673,8 @@ void arch_domain_destroy(struct domain *d) free_xenheap_pages(d->shared_info, get_order_from_shift(XSI_SHIFT)); - if ( iommu_enabled && need_iommu(d) ) { - pci_release_devices(d); + if ( iommu_enabled && need_iommu(d) ) iommu_domain_destroy(d); - } tlb_track_destroy(d); @@ -1721,6 +1719,8 @@ int domain_relinquish_resources(struct domain *d) switch (d->arch.relres) { case RELRES_not_started: + pci_release_devices(d); + /* Relinquish guest resources for VT-i domain. */ if (is_hvm_domain(d)) vmx_relinquish_guest_resources(d); diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index f7182e73ec..79d1ca229f 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -657,7 +657,6 @@ void arch_domain_destroy(struct domain *d) xfree(d->arch.pv_domain.e820); vmce_destroy_msr(d); - pci_release_devices(d); free_domain_pirqs(d); if ( !is_idle_domain(d) ) iommu_domain_destroy(d); @@ -2101,6 +2100,8 @@ int domain_relinquish_resources(struct domain *d) switch ( d->arch.relmem ) { case RELMEM_not_started: + pci_release_devices(d); + /* Tear down paging-assistance stuff. */ paging_teardown(d); diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index f0da3ee030..890cb81cdb 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -574,7 +574,8 @@ int iommu_do_domctl( break; case XEN_DOMCTL_assign_device: - if ( unlikely((d = get_domain_by_id(domctl->domain)) == NULL) ) + if ( unlikely((d = get_domain_by_id(domctl->domain)) == NULL) || + unlikely(d->is_dying) ) { printk(XENLOG_G_ERR "XEN_DOMCTL_assign_device: get_domain_by_id() failed\n"); |