mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 06:10:56 +00:00
iommu: Add iommu_group_has_isolated_msi()
Compute the isolated_msi over all the devices in the IOMMU group because iommufd and vfio both need to know that the entire group is isolated before granting access to it. Link: https://lore.kernel.org/r/2-v3-3313bb5dd3a3+10f11-secure_msi_jgg@nvidia.com Tested-by: Matthew Rosato <mjrosato@linux.ibm.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
17cde5e601
commit
efc30a8f15
2 changed files with 27 additions and 0 deletions
|
@ -30,6 +30,7 @@
|
|||
#include <linux/cc_platform.h>
|
||||
#include <trace/events/iommu.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/msi.h>
|
||||
|
||||
#include "dma-iommu.h"
|
||||
|
||||
|
@ -1897,6 +1898,31 @@ bool device_iommu_capable(struct device *dev, enum iommu_cap cap)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(device_iommu_capable);
|
||||
|
||||
/**
|
||||
* iommu_group_has_isolated_msi() - Compute msi_device_has_isolated_msi()
|
||||
* for a group
|
||||
* @group: Group to query
|
||||
*
|
||||
* IOMMU groups should not have differing values of
|
||||
* msi_device_has_isolated_msi() for devices in a group. However nothing
|
||||
* directly prevents this, so ensure mistakes don't result in isolation failures
|
||||
* by checking that all the devices are the same.
|
||||
*/
|
||||
bool iommu_group_has_isolated_msi(struct iommu_group *group)
|
||||
{
|
||||
struct group_device *group_dev;
|
||||
bool ret = true;
|
||||
|
||||
mutex_lock(&group->mutex);
|
||||
list_for_each_entry(group_dev, &group->devices, list) {
|
||||
ret &= msi_device_has_isolated_msi(group_dev->dev) ||
|
||||
device_iommu_capable(group_dev->dev, IOMMU_CAP_INTR_REMAP);
|
||||
}
|
||||
mutex_unlock(&group->mutex);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iommu_group_has_isolated_msi);
|
||||
|
||||
/**
|
||||
* iommu_set_fault_handler() - set a fault handler for an iommu domain
|
||||
* @domain: iommu domain
|
||||
|
|
|
@ -455,6 +455,7 @@ static inline const struct iommu_ops *dev_iommu_ops(struct device *dev)
|
|||
extern int bus_iommu_probe(struct bus_type *bus);
|
||||
extern bool iommu_present(struct bus_type *bus);
|
||||
extern bool device_iommu_capable(struct device *dev, enum iommu_cap cap);
|
||||
extern bool iommu_group_has_isolated_msi(struct iommu_group *group);
|
||||
extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
|
||||
extern struct iommu_group *iommu_group_get_by_id(int id);
|
||||
extern void iommu_domain_free(struct iommu_domain *domain);
|
||||
|
|
Loading…
Reference in a new issue