mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 15:41:52 +02:00
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:
commit
b1427432d3
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user