IOMMU Fix for v6.15-rc7:

- Core: Skip PASID validation for devices without PASID support.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEr9jSbILcajRFYWYyK/BELZcBGuMFAmgx5ggACgkQK/BELZcB
 GuPLAxAAsJWmrQhNQcVM2KHhnjmg18fSN7oPMxhk3zwuPmdVCqwafn15dEy9Pl6z
 UaPaXFwe3pbR1XAVC5rQkAfDvhQGFFMCdaBsN0BQtn4ghAki7AuchMO0LE1x9hJg
 Ea77j3kO+Fe97wFfpb4m9qdCPMDBkBaNhi12qdeOWxik6AKZPFcNg9t1TfmTuhnx
 Y+y/MnHmpIbxv06pGlejSbWjAYosM+LE1PnKHeJalv0xnK3W4NvgWSzbQgXqyhfl
 u9c7Ms9VlvE5TQjMun+0qC5/4tY3I2J1Vc8k0VdEk6bzsI/AW1kPVU8E+bEdXBcS
 q6afuwHKd/YJ0UtI1N8O2W9KWnjDFhgPcvr39S5GX0gMvsGsJ/Zn1A6APGMBQkGo
 JbhhzfxNUpqGhUn4HSbC9WHNjN0uIFL09HTDfci0LXSl7eT7JvPYvN3dNnrlQMqr
 ThbPKAKqB3WdZRuiT2t4vwmHlOzCZN2mVvz/u14C5AZqmk+XvTh/MrgduUUqULW6
 /PxXjsFnJxRsVcEhEPbh+Q9t9urAGyi1SyrirPu6EDEhqxrTdttbfWwZSQAX07rJ
 i9rIiBvaDNY1WO/Q4Z76Ilh8xYXS8+/EryXuus1V8TTu9aIS+UqX8nN9n2faAwQs
 7fuwX/2wKkRmJljyx85fLqqoRcUwh6CtGDrpclDN9J81R6NQZmI=
 =zbhA
 -----END PGP SIGNATURE-----

Merge tag 'iommu-fixes-v6.15-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux

Pull iommu fix from Joerg Roedel:

 - core: skip PASID validation for devices without PASID support

* tag 'iommu-fixes-v6.15-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux:
  iommu: Skip PASID validation for devices without PASID capability
This commit is contained in:
Linus Torvalds 2025-05-24 09:01:41 -07:00
commit b1427432d3

View File

@ -3366,10 +3366,12 @@ static int __iommu_set_group_pasid(struct iommu_domain *domain,
int ret;
for_each_group_device(group, device) {
ret = domain->ops->set_dev_pasid(domain, device->dev,
pasid, old);
if (ret)
goto err_revert;
if (device->dev->iommu->max_pasids > 0) {
ret = domain->ops->set_dev_pasid(domain, device->dev,
pasid, old);
if (ret)
goto err_revert;
}
}
return 0;
@ -3379,15 +3381,18 @@ static int __iommu_set_group_pasid(struct iommu_domain *domain,
for_each_group_device(group, device) {
if (device == last_gdev)
break;
/*
* If no old domain, undo the succeeded devices/pasid.
* Otherwise, rollback the succeeded devices/pasid to the old
* domain. And it is a driver bug to fail attaching with a
* previously good domain.
*/
if (!old || WARN_ON(old->ops->set_dev_pasid(old, device->dev,
if (device->dev->iommu->max_pasids > 0) {
/*
* If no old domain, undo the succeeded devices/pasid.
* Otherwise, rollback the succeeded devices/pasid to
* the old domain. And it is a driver bug to fail
* attaching with a previously good domain.
*/
if (!old ||
WARN_ON(old->ops->set_dev_pasid(old, device->dev,
pasid, domain)))
iommu_remove_dev_pasid(device->dev, pasid, domain);
iommu_remove_dev_pasid(device->dev, pasid, domain);
}
}
return ret;
}
@ -3398,8 +3403,10 @@ static void __iommu_remove_group_pasid(struct iommu_group *group,
{
struct group_device *device;
for_each_group_device(group, device)
iommu_remove_dev_pasid(device->dev, pasid, domain);
for_each_group_device(group, device) {
if (device->dev->iommu->max_pasids > 0)
iommu_remove_dev_pasid(device->dev, pasid, domain);
}
}
/*
@ -3440,7 +3447,13 @@ int iommu_attach_device_pasid(struct iommu_domain *domain,
mutex_lock(&group->mutex);
for_each_group_device(group, device) {
if (pasid >= device->dev->iommu->max_pasids) {
/*
* Skip PASID validation for devices without PASID support
* (max_pasids = 0). These devices cannot issue transactions
* with PASID, so they don't affect group's PASID usage.
*/
if ((device->dev->iommu->max_pasids > 0) &&
(pasid >= device->dev->iommu->max_pasids)) {
ret = -EINVAL;
goto out_unlock;
}