@@ -2015,10 +2015,10 @@ static int arm_smmu_atc_inv_master(struct arm_smmu_master *master)
2015
2015
int arm_smmu_atc_inv_domain (struct arm_smmu_domain * smmu_domain , int ssid ,
2016
2016
unsigned long iova , size_t size )
2017
2017
{
2018
+ struct arm_smmu_master_domain * master_domain ;
2018
2019
int i ;
2019
2020
unsigned long flags ;
2020
2021
struct arm_smmu_cmdq_ent cmd ;
2021
- struct arm_smmu_master * master ;
2022
2022
struct arm_smmu_cmdq_batch cmds ;
2023
2023
2024
2024
if (!(smmu_domain -> smmu -> features & ARM_SMMU_FEAT_ATS ))
@@ -2046,7 +2046,10 @@ int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid,
2046
2046
cmds .num = 0 ;
2047
2047
2048
2048
spin_lock_irqsave (& smmu_domain -> devices_lock , flags );
2049
- list_for_each_entry (master , & smmu_domain -> devices , domain_head ) {
2049
+ list_for_each_entry (master_domain , & smmu_domain -> devices ,
2050
+ devices_elm ) {
2051
+ struct arm_smmu_master * master = master_domain -> master ;
2052
+
2050
2053
if (!master -> ats_enabled )
2051
2054
continue ;
2052
2055
@@ -2534,9 +2537,26 @@ static void arm_smmu_disable_pasid(struct arm_smmu_master *master)
2534
2537
pci_disable_pasid (pdev );
2535
2538
}
2536
2539
2540
+ static struct arm_smmu_master_domain *
2541
+ arm_smmu_find_master_domain (struct arm_smmu_domain * smmu_domain ,
2542
+ struct arm_smmu_master * master )
2543
+ {
2544
+ struct arm_smmu_master_domain * master_domain ;
2545
+
2546
+ lockdep_assert_held (& smmu_domain -> devices_lock );
2547
+
2548
+ list_for_each_entry (master_domain , & smmu_domain -> devices ,
2549
+ devices_elm ) {
2550
+ if (master_domain -> master == master )
2551
+ return master_domain ;
2552
+ }
2553
+ return NULL ;
2554
+ }
2555
+
2537
2556
static void arm_smmu_detach_dev (struct arm_smmu_master * master )
2538
2557
{
2539
2558
struct iommu_domain * domain = iommu_get_domain_for_dev (master -> dev );
2559
+ struct arm_smmu_master_domain * master_domain ;
2540
2560
struct arm_smmu_domain * smmu_domain ;
2541
2561
unsigned long flags ;
2542
2562
@@ -2547,7 +2567,11 @@ static void arm_smmu_detach_dev(struct arm_smmu_master *master)
2547
2567
arm_smmu_disable_ats (master , smmu_domain );
2548
2568
2549
2569
spin_lock_irqsave (& smmu_domain -> devices_lock , flags );
2550
- list_del_init (& master -> domain_head );
2570
+ master_domain = arm_smmu_find_master_domain (smmu_domain , master );
2571
+ if (master_domain ) {
2572
+ list_del (& master_domain -> devices_elm );
2573
+ kfree (master_domain );
2574
+ }
2551
2575
spin_unlock_irqrestore (& smmu_domain -> devices_lock , flags );
2552
2576
2553
2577
master -> ats_enabled = false;
@@ -2561,6 +2585,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
2561
2585
struct iommu_fwspec * fwspec = dev_iommu_fwspec_get (dev );
2562
2586
struct arm_smmu_device * smmu ;
2563
2587
struct arm_smmu_domain * smmu_domain = to_smmu_domain (domain );
2588
+ struct arm_smmu_master_domain * master_domain ;
2564
2589
struct arm_smmu_master * master ;
2565
2590
struct arm_smmu_cd * cdptr ;
2566
2591
@@ -2597,6 +2622,11 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
2597
2622
return - ENOMEM ;
2598
2623
}
2599
2624
2625
+ master_domain = kzalloc (sizeof (* master_domain ), GFP_KERNEL );
2626
+ if (!master_domain )
2627
+ return - ENOMEM ;
2628
+ master_domain -> master = master ;
2629
+
2600
2630
/*
2601
2631
* Prevent arm_smmu_share_asid() from trying to change the ASID
2602
2632
* of either the old or new domain while we are working on it.
@@ -2610,7 +2640,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
2610
2640
master -> ats_enabled = arm_smmu_ats_supported (master );
2611
2641
2612
2642
spin_lock_irqsave (& smmu_domain -> devices_lock , flags );
2613
- list_add (& master -> domain_head , & smmu_domain -> devices );
2643
+ list_add (& master_domain -> devices_elm , & smmu_domain -> devices );
2614
2644
spin_unlock_irqrestore (& smmu_domain -> devices_lock , flags );
2615
2645
2616
2646
switch (smmu_domain -> stage ) {
@@ -2925,7 +2955,6 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)
2925
2955
master -> dev = dev ;
2926
2956
master -> smmu = smmu ;
2927
2957
INIT_LIST_HEAD (& master -> bonds );
2928
- INIT_LIST_HEAD (& master -> domain_head );
2929
2958
dev_iommu_priv_set (dev , master );
2930
2959
2931
2960
ret = arm_smmu_insert_master (smmu , master );
0 commit comments