@@ -365,6 +365,21 @@ EXPORT_SYMBOL_GPL(intel_iommu_gfx_mapped);
365
365
366
366
#define DUMMY_DEVICE_DOMAIN_INFO ((struct device_domain_info *)(-1))
367
367
#define DEFER_DEVICE_DOMAIN_INFO ((struct device_domain_info *)(-2))
368
+ struct device_domain_info * get_domain_info (struct device * dev )
369
+ {
370
+ struct device_domain_info * info ;
371
+
372
+ if (!dev )
373
+ return NULL ;
374
+
375
+ info = dev -> archdata .iommu ;
376
+ if (unlikely (info == DUMMY_DEVICE_DOMAIN_INFO ||
377
+ info == DEFER_DEVICE_DOMAIN_INFO ))
378
+ return NULL ;
379
+
380
+ return info ;
381
+ }
382
+
368
383
DEFINE_SPINLOCK (device_domain_lock );
369
384
static LIST_HEAD (device_domain_list );
370
385
@@ -2429,7 +2444,7 @@ struct dmar_domain *find_domain(struct device *dev)
2429
2444
dev = & pci_real_dma_dev (to_pci_dev (dev ))-> dev ;
2430
2445
2431
2446
/* No lock here, assumes no domain exit in normal case */
2432
- info = dev -> archdata . iommu ;
2447
+ info = get_domain_info ( dev ) ;
2433
2448
if (likely (info ))
2434
2449
return info -> domain ;
2435
2450
@@ -5012,9 +5027,8 @@ static void dmar_remove_one_dev_info(struct device *dev)
5012
5027
unsigned long flags ;
5013
5028
5014
5029
spin_lock_irqsave (& device_domain_lock , flags );
5015
- info = dev -> archdata .iommu ;
5016
- if (info && info != DEFER_DEVICE_DOMAIN_INFO
5017
- && info != DUMMY_DEVICE_DOMAIN_INFO )
5030
+ info = get_domain_info (dev );
5031
+ if (info )
5018
5032
__dmar_remove_one_dev_info (info );
5019
5033
spin_unlock_irqrestore (& device_domain_lock , flags );
5020
5034
}
@@ -5104,7 +5118,7 @@ static void intel_iommu_domain_free(struct iommu_domain *domain)
5104
5118
static inline bool
5105
5119
is_aux_domain (struct device * dev , struct iommu_domain * domain )
5106
5120
{
5107
- struct device_domain_info * info = dev -> archdata . iommu ;
5121
+ struct device_domain_info * info = get_domain_info ( dev ) ;
5108
5122
5109
5123
return info && info -> auxd_enabled &&
5110
5124
domain -> type == IOMMU_DOMAIN_UNMANAGED ;
@@ -5113,7 +5127,7 @@ is_aux_domain(struct device *dev, struct iommu_domain *domain)
5113
5127
static void auxiliary_link_device (struct dmar_domain * domain ,
5114
5128
struct device * dev )
5115
5129
{
5116
- struct device_domain_info * info = dev -> archdata . iommu ;
5130
+ struct device_domain_info * info = get_domain_info ( dev ) ;
5117
5131
5118
5132
assert_spin_locked (& device_domain_lock );
5119
5133
if (WARN_ON (!info ))
@@ -5126,7 +5140,7 @@ static void auxiliary_link_device(struct dmar_domain *domain,
5126
5140
static void auxiliary_unlink_device (struct dmar_domain * domain ,
5127
5141
struct device * dev )
5128
5142
{
5129
- struct device_domain_info * info = dev -> archdata . iommu ;
5143
+ struct device_domain_info * info = get_domain_info ( dev ) ;
5130
5144
5131
5145
assert_spin_locked (& device_domain_lock );
5132
5146
if (WARN_ON (!info ))
@@ -5214,7 +5228,7 @@ static void aux_domain_remove_dev(struct dmar_domain *domain,
5214
5228
return ;
5215
5229
5216
5230
spin_lock_irqsave (& device_domain_lock , flags );
5217
- info = dev -> archdata . iommu ;
5231
+ info = get_domain_info ( dev ) ;
5218
5232
iommu = info -> iommu ;
5219
5233
5220
5234
auxiliary_unlink_device (domain , dev );
@@ -5404,7 +5418,7 @@ intel_iommu_sva_invalidate(struct iommu_domain *domain, struct device *dev,
5404
5418
5405
5419
spin_lock_irqsave (& device_domain_lock , flags );
5406
5420
spin_lock (& iommu -> lock );
5407
- info = dev -> archdata . iommu ;
5421
+ info = get_domain_info ( dev ) ;
5408
5422
if (!info ) {
5409
5423
ret = - EINVAL ;
5410
5424
goto out_unlock ;
@@ -5768,7 +5782,7 @@ int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct device *dev)
5768
5782
spin_lock (& iommu -> lock );
5769
5783
5770
5784
ret = - EINVAL ;
5771
- info = dev -> archdata . iommu ;
5785
+ info = get_domain_info ( dev ) ;
5772
5786
if (!info || !info -> pasid_supported )
5773
5787
goto out ;
5774
5788
@@ -5864,7 +5878,7 @@ static int intel_iommu_enable_auxd(struct device *dev)
5864
5878
return - ENODEV ;
5865
5879
5866
5880
spin_lock_irqsave (& device_domain_lock , flags );
5867
- info = dev -> archdata . iommu ;
5881
+ info = get_domain_info ( dev ) ;
5868
5882
info -> auxd_enabled = 1 ;
5869
5883
spin_unlock_irqrestore (& device_domain_lock , flags );
5870
5884
@@ -5877,7 +5891,7 @@ static int intel_iommu_disable_auxd(struct device *dev)
5877
5891
unsigned long flags ;
5878
5892
5879
5893
spin_lock_irqsave (& device_domain_lock , flags );
5880
- info = dev -> archdata . iommu ;
5894
+ info = get_domain_info ( dev ) ;
5881
5895
if (!WARN_ON (!info ))
5882
5896
info -> auxd_enabled = 0 ;
5883
5897
spin_unlock_irqrestore (& device_domain_lock , flags );
@@ -5954,7 +5968,7 @@ intel_iommu_dev_disable_feat(struct device *dev, enum iommu_dev_features feat)
5954
5968
static bool
5955
5969
intel_iommu_dev_feat_enabled (struct device * dev , enum iommu_dev_features feat )
5956
5970
{
5957
- struct device_domain_info * info = dev -> archdata . iommu ;
5971
+ struct device_domain_info * info = get_domain_info ( dev ) ;
5958
5972
5959
5973
if (feat == IOMMU_DEV_FEAT_AUX )
5960
5974
return scalable_mode_support () && info && info -> auxd_enabled ;
0 commit comments