]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
passthrough: release assigned PCI devices earlier during domain shutdown
authorJan Beulich <jbeulich@suse.com>
Fri, 24 Feb 2012 10:46:32 +0000 (11:46 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 24 Feb 2012 10:46:32 +0000 (11:46 +0100)
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>
xen/arch/ia64/xen/domain.c
xen/arch/x86/domain.c
xen/drivers/passthrough/iommu.c

index a31bd325e4f0d58c8a6b607bbfbfe204dc9cb97e..7faa631b7a0364316e1e16a9a3a51e3f33ff4303 100644 (file)
@@ -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);
index f7182e73ec1a8b53d492d1fb1aa2690e7614d937..79d1ca229fa75a0f8208cd592b116e62e0e0bdc2 100644 (file)
@@ -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);
 
index f0da3ee0303a8263e98edcd4490265e6cb94ec07..890cb81cdbbb940ca4f4cf40db6a70fa20b2c7ea 100644 (file)
@@ -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");