aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-02-24 11:46:32 +0100
committerJan Beulich <jbeulich@suse.com>2012-02-24 11:46:32 +0100
commita8078b02351eb5085afb1941175bb3977863e849 (patch)
treed4dd3e2617c368507152d1af19ea7d448bbc268b
parente1dc98e3c3619cf7a050cc898ecb9288eceb5915 (diff)
downloadxen-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.c6
-rw-r--r--xen/arch/x86/domain.c3
-rw-r--r--xen/drivers/passthrough/iommu.c3
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");