@@ -1391,20 +1391,19 @@ static struct page *free_sub_pt(unsigned long root, int mode,
1391
1391
return freelist ;
1392
1392
}
1393
1393
1394
- static void free_pagetable (struct protection_domain * domain )
1394
+ static void free_pagetable (struct domain_pgtable * pgtable )
1395
1395
{
1396
- struct domain_pgtable pgtable ;
1397
1396
struct page * freelist = NULL ;
1398
1397
unsigned long root ;
1399
1398
1400
- amd_iommu_domain_get_pgtable ( domain , & pgtable );
1401
- atomic64_set ( & domain -> pt_root , 0 ) ;
1399
+ if ( pgtable -> mode == PAGE_MODE_NONE )
1400
+ return ;
1402
1401
1403
- BUG_ON (pgtable . mode < PAGE_MODE_NONE ||
1404
- pgtable . mode > PAGE_MODE_6_LEVEL );
1402
+ BUG_ON (pgtable -> mode < PAGE_MODE_NONE ||
1403
+ pgtable -> mode > PAGE_MODE_6_LEVEL );
1405
1404
1406
- root = (unsigned long )pgtable . root ;
1407
- freelist = free_sub_pt (root , pgtable . mode , freelist );
1405
+ root = (unsigned long )pgtable -> root ;
1406
+ freelist = free_sub_pt (root , pgtable -> mode , freelist );
1408
1407
1409
1408
free_page_list (freelist );
1410
1409
}
@@ -1823,12 +1822,16 @@ static void free_gcr3_table(struct protection_domain *domain)
1823
1822
*/
1824
1823
static void dma_ops_domain_free (struct protection_domain * domain )
1825
1824
{
1825
+ struct domain_pgtable pgtable ;
1826
+
1826
1827
if (!domain )
1827
1828
return ;
1828
1829
1829
1830
iommu_put_dma_cookie (& domain -> domain );
1830
1831
1831
- free_pagetable (domain );
1832
+ amd_iommu_domain_get_pgtable (domain , & pgtable );
1833
+ atomic64_set (& domain -> pt_root , 0 );
1834
+ free_pagetable (& pgtable );
1832
1835
1833
1836
if (domain -> id )
1834
1837
domain_id_free (domain -> id );
@@ -2496,9 +2499,8 @@ static void amd_iommu_domain_free(struct iommu_domain *dom)
2496
2499
break ;
2497
2500
default :
2498
2501
amd_iommu_domain_get_pgtable (domain , & pgtable );
2499
-
2500
- if (pgtable .mode != PAGE_MODE_NONE )
2501
- free_pagetable (domain );
2502
+ atomic64_set (& domain -> pt_root , 0 );
2503
+ free_pagetable (& pgtable );
2502
2504
2503
2505
if (domain -> flags & PD_IOMMUV2_MASK )
2504
2506
free_gcr3_table (domain );
@@ -2796,26 +2798,20 @@ void amd_iommu_domain_direct_map(struct iommu_domain *dom)
2796
2798
struct protection_domain * domain = to_pdomain (dom );
2797
2799
struct domain_pgtable pgtable ;
2798
2800
unsigned long flags ;
2799
- u64 pt_root ;
2800
2801
2801
2802
spin_lock_irqsave (& domain -> lock , flags );
2802
2803
2803
2804
/* First save pgtable configuration*/
2804
2805
amd_iommu_domain_get_pgtable (domain , & pgtable );
2805
2806
2806
2807
/* Update data structure */
2807
- pt_root = amd_iommu_domain_encode_pgtable (NULL , PAGE_MODE_NONE );
2808
- atomic64_set (& domain -> pt_root , pt_root );
2808
+ atomic64_set (& domain -> pt_root , 0 );
2809
2809
2810
2810
/* Make changes visible to IOMMUs */
2811
2811
update_domain (domain );
2812
2812
2813
- /* Restore old pgtable in domain->ptroot to free page-table */
2814
- pt_root = amd_iommu_domain_encode_pgtable (pgtable .root , pgtable .mode );
2815
- atomic64_set (& domain -> pt_root , pt_root );
2816
-
2817
2813
/* Page-table is not visible to IOMMU anymore, so free it */
2818
- free_pagetable (domain );
2814
+ free_pagetable (& pgtable );
2819
2815
2820
2816
spin_unlock_irqrestore (& domain -> lock , flags );
2821
2817
}
0 commit comments