diff options
| author | Liu Yi L <yi.l.liu@intel.com> | 2021-08-18 21:48:52 +0800 | 
|---|---|---|
| committer | Joerg Roedel <jroedel@suse.de> | 2021-08-19 10:41:08 +0200 | 
| commit | 423d39d8518c1bba12e0889a92beeddbb1502392 (patch) | |
| tree | ef54fe6af710ec6ff82fc2f5da02c12e59b5c350 /drivers/iommu/intel/pasid.c | |
| parent | 8123b0b86855185357e4b12f29e327ba773fc58d (diff) | |
iommu/vt-d: Add present bit check in pasid entry setup helpers
The helper functions should not modify the pasid entries which are still
in use. Add a check against present bit.
Signed-off-by: Liu Yi L <yi.l.liu@intel.com>
Link: https://lore.kernel.org/r/20210817042425.1784279-1-yi.l.liu@intel.com
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/20210818134852.1847070-10-baolu.lu@linux.intel.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu/intel/pasid.c')
| -rw-r--r-- | drivers/iommu/intel/pasid.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c index 02e10491184b..b1d0c2945c9a 100644 --- a/drivers/iommu/intel/pasid.c +++ b/drivers/iommu/intel/pasid.c @@ -534,6 +534,10 @@ void intel_pasid_tear_down_entry(struct intel_iommu *iommu, struct device *dev,  		devtlb_invalidation_with_pasid(iommu, dev, pasid);  } +/* + * This function flushes cache for a newly setup pasid table entry. + * Caller of it should not modify the in-use pasid table entries. + */  static void pasid_flush_caches(struct intel_iommu *iommu,  				struct pasid_entry *pte,  			       u32 pasid, u16 did) @@ -585,6 +589,10 @@ int intel_pasid_setup_first_level(struct intel_iommu *iommu,  	if (WARN_ON(!pte))  		return -EINVAL; +	/* Caller must ensure PASID entry is not in use. */ +	if (pasid_pte_is_present(pte)) +		return -EBUSY; +  	pasid_clear_entry(pte);  	/* Setup the first level page table pointer: */ @@ -684,6 +692,10 @@ int intel_pasid_setup_second_level(struct intel_iommu *iommu,  		return -ENODEV;  	} +	/* Caller must ensure PASID entry is not in use. */ +	if (pasid_pte_is_present(pte)) +		return -EBUSY; +  	pasid_clear_entry(pte);  	pasid_set_domain_id(pte, did);  	pasid_set_slptr(pte, pgd_val); @@ -723,6 +735,10 @@ int intel_pasid_setup_pass_through(struct intel_iommu *iommu,  		return -ENODEV;  	} +	/* Caller must ensure PASID entry is not in use. */ +	if (pasid_pte_is_present(pte)) +		return -EBUSY; +  	pasid_clear_entry(pte);  	pasid_set_domain_id(pte, did);  	pasid_set_address_width(pte, iommu->agaw);  | 
