IOMMU Fixes for Linux v5.10-rc2

Including:
 
 	- Fix a NULL-ptr dereference in the Intel VT-d driver
 
 	- Two fixes for Intel SVM support
 
 	- Increase IRQ remapping table size in the AMD IOMMU driver. The
 	  old number of 128 turned out to be too low for some recent
 	  devices.
 
 	- Fix a mask check in generic IOMMU code
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEr9jSbILcajRFYWYyK/BELZcBGuMFAl+ld3wACgkQK/BELZcB
 GuP6ng//aYLNroT0Hi0iz0AA3RAEs7gksHaTi7VA4xzo9m2wp3/Ph5I8pbzQ42a/
 mW8uNFyKKE7mfxoZQAwYjvfPoYDk7Va3tjQtNnEF3tL8M3LWBuMaHhZhfp3pHq/h
 OTLaNju9vI640hWsAROJZ6MssPQX1jgUI3trcS3q+2HwK87SbqKH51T3008FzxSt
 fS8S8uVnSx9x3M3XXFd4ENnv2zmTJUD6pDZ6RSzU/X6AjxFCfB+8ytw89zsvlXKl
 dHg78hCystfeIU4wuFV2625EuZjAQ73WxmkyFPq5JU2RPkTJknLlof97k23NaROZ
 Y8Dn20L8s6Nw3NTEK/JuUl6XFbuLcJAL2bYVVItPXI5bi9bxehovbZvLOj6LXGCu
 e52/dS+Vp2TckqScgY6Qo7BLlnk1v8Qh39izS0jwMSN135mT6fXItQXC/fEgP8HN
 XVYwadl+XutL9kBmBT9cjAyV7enetFtGCyT43ujRC3L8eUPtD8IAzJCRYtlH+sa0
 YkSAouMeL7ogtuGqBMMe1MP/vB0no+wtcHj742qthv3cXP5czSeDoj5MS4d/3UgU
 BYBDfRQH9Fz17En7oXDhNkFt95Z28Hv1y7HKjgdXul/b9gmyi8qXuBu4QcD5iq0C
 Ur5Sjyzg3iHSoCXuqQdjS7mKCFk76pnnvpvfwv0GYukzQ3RhjWs=
 =qlBN
 -----END PGP SIGNATURE-----

Merge tag 'iommu-fixes-v5.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu

Pull iommu fixes from Joerg Roedel:

 - Fix a NULL-ptr dereference in the Intel VT-d driver

 - Two fixes for Intel SVM support

 - Increase IRQ remapping table size in the AMD IOMMU driver. The old
   number of 128 turned out to be too low for some recent devices.

 - Fix a mask check in generic IOMMU code

* tag 'iommu-fixes-v5.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
  iommu: Fix a check in iommu_check_bind_data()
  iommu/vt-d: Fix a bug for PDP check in prq_event_thread
  iommu/vt-d: Fix sid not set issue in intel_svm_bind_gpasid()
  iommu/vt-d: Fix kernel NULL pointer dereference in find_domain()
  iommu/amd: Increase interrupt remapping table limit to 512 entries
This commit is contained in:
Linus Torvalds 2020-11-06 12:48:19 -08:00
Родитель 1669ecf9c8 4dd6ce4780
Коммит 02a2aa3500
4 изменённых файлов: 16 добавлений и 3 удалений

Просмотреть файл

@ -409,7 +409,11 @@ extern bool amd_iommu_np_cache;
/* Only true if all IOMMUs support device IOTLBs */
extern bool amd_iommu_iotlb_sup;
#define MAX_IRQS_PER_TABLE 256
/*
* AMD IOMMU hardware only support 512 IRTEs despite
* the architectural limitation of 2048 entries.
*/
#define MAX_IRQS_PER_TABLE 512
#define IRQ_TABLE_ALIGNMENT 128
struct irq_remap_table {

Просмотреть файл

@ -2525,6 +2525,9 @@ struct dmar_domain *find_domain(struct device *dev)
{
struct device_domain_info *info;
if (unlikely(!dev || !dev->iommu))
return NULL;
if (unlikely(attach_deferred(dev)))
return NULL;

Просмотреть файл

@ -279,6 +279,7 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,
struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
struct intel_svm_dev *sdev = NULL;
struct dmar_domain *dmar_domain;
struct device_domain_info *info;
struct intel_svm *svm = NULL;
int ret = 0;
@ -310,6 +311,10 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,
if (data->hpasid <= 0 || data->hpasid >= PASID_MAX)
return -EINVAL;
info = get_domain_info(dev);
if (!info)
return -EINVAL;
dmar_domain = to_dmar_domain(domain);
mutex_lock(&pasid_mutex);
@ -357,6 +362,7 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,
goto out;
}
sdev->dev = dev;
sdev->sid = PCI_DEVID(info->bus, info->devfn);
/* Only count users if device has aux domains */
if (iommu_dev_feature_enabled(dev, IOMMU_DEV_FEAT_AUX))
@ -1029,7 +1035,7 @@ no_pasid:
resp.qw0 = QI_PGRP_PASID(req->pasid) |
QI_PGRP_DID(req->rid) |
QI_PGRP_PASID_P(req->pasid_present) |
QI_PGRP_PDP(req->pasid_present) |
QI_PGRP_PDP(req->priv_data_present) |
QI_PGRP_RESP_CODE(result) |
QI_PGRP_RESP_TYPE;
resp.qw1 = QI_PGRP_IDX(req->prg_index) |

Просмотреть файл

@ -2071,7 +2071,7 @@ EXPORT_SYMBOL_GPL(iommu_uapi_cache_invalidate);
static int iommu_check_bind_data(struct iommu_gpasid_bind_data *data)
{
u32 mask;
u64 mask;
int i;
if (data->version != IOMMU_GPASID_BIND_VERSION_1)