@@ -274,11 +274,9 @@ static void intel_mm_release(struct mmu_notifier *mn, struct mm_struct *mm)
274
274
* page) so that we end up taking a fault that the hardware really
275
275
* *has* to handle gracefully without affecting other processes.
276
276
*/
277
- svm -> iommu -> pasid_table [svm -> pasid ].val = 0 ;
278
- wmb ();
279
-
280
277
rcu_read_lock ();
281
278
list_for_each_entry_rcu (sdev , & svm -> devs , list ) {
279
+ intel_pasid_clear_entry (sdev -> dev , svm -> pasid );
282
280
intel_flush_pasid_dev (svm , sdev , svm -> pasid );
283
281
intel_flush_svm_range_dev (svm , sdev , 0 , -1 , 0 , !svm -> mm );
284
282
}
@@ -299,14 +297,15 @@ static LIST_HEAD(global_svm_list);
299
297
int intel_svm_bind_mm (struct device * dev , int * pasid , int flags , struct svm_dev_ops * ops )
300
298
{
301
299
struct intel_iommu * iommu = intel_svm_device_to_iommu (dev );
300
+ struct pasid_entry * entry ;
302
301
struct intel_svm_dev * sdev ;
303
302
struct intel_svm * svm = NULL ;
304
303
struct mm_struct * mm = NULL ;
305
304
u64 pasid_entry_val ;
306
305
int pasid_max ;
307
306
int ret ;
308
307
309
- if (!iommu || ! iommu -> pasid_table )
308
+ if (!iommu )
310
309
return - EINVAL ;
311
310
312
311
if (dev_is_pci (dev )) {
@@ -384,8 +383,8 @@ int intel_svm_bind_mm(struct device *dev, int *pasid, int flags, struct svm_dev_
384
383
}
385
384
svm -> iommu = iommu ;
386
385
387
- if (pasid_max > iommu -> pasid_max )
388
- pasid_max = iommu -> pasid_max ;
386
+ if (pasid_max > intel_pasid_max_id )
387
+ pasid_max = intel_pasid_max_id ;
389
388
390
389
/* Do not use PASID 0 in caching mode (virtualised IOMMU) */
391
390
ret = intel_pasid_alloc_id (svm ,
@@ -418,7 +417,8 @@ int intel_svm_bind_mm(struct device *dev, int *pasid, int flags, struct svm_dev_
418
417
if (cpu_feature_enabled (X86_FEATURE_LA57 ))
419
418
pasid_entry_val |= PASID_ENTRY_FLPM_5LP ;
420
419
421
- iommu -> pasid_table [svm -> pasid ].val = pasid_entry_val ;
420
+ entry = intel_pasid_get_entry (dev , svm -> pasid );
421
+ entry -> val = pasid_entry_val ;
422
422
423
423
wmb ();
424
424
@@ -453,7 +453,7 @@ int intel_svm_unbind_mm(struct device *dev, int pasid)
453
453
454
454
mutex_lock (& pasid_mutex );
455
455
iommu = intel_svm_device_to_iommu (dev );
456
- if (!iommu || ! iommu -> pasid_table )
456
+ if (!iommu )
457
457
goto out ;
458
458
459
459
svm = intel_pasid_lookup_id (pasid );
@@ -476,11 +476,9 @@ int intel_svm_unbind_mm(struct device *dev, int pasid)
476
476
intel_flush_pasid_dev (svm , sdev , svm -> pasid );
477
477
intel_flush_svm_range_dev (svm , sdev , 0 , -1 , 0 , !svm -> mm );
478
478
kfree_rcu (sdev , rcu );
479
+ intel_pasid_clear_entry (dev , svm -> pasid );
479
480
480
481
if (list_empty (& svm -> devs )) {
481
- svm -> iommu -> pasid_table [svm -> pasid ].val = 0 ;
482
- wmb ();
483
-
484
482
intel_pasid_free_id (svm -> pasid );
485
483
if (svm -> mm )
486
484
mmu_notifier_unregister (& svm -> notifier , svm -> mm );
@@ -513,7 +511,7 @@ int intel_svm_is_pasid_valid(struct device *dev, int pasid)
513
511
514
512
mutex_lock (& pasid_mutex );
515
513
iommu = intel_svm_device_to_iommu (dev );
516
- if (!iommu || ! iommu -> pasid_table )
514
+ if (!iommu )
517
515
goto out ;
518
516
519
517
svm = intel_pasid_lookup_id (pasid );
0 commit comments