irq/s390: Add arch_is_isolated_msi() for s390
s390 doesn't use irq_domains, so it has no place to set IRQ_DOMAIN_FLAG_ISOLATED_MSI. Instead of continuing to abuse the iommu subsystem to convey this information add a simple define which s390 can make statically true. The define will cause msi_device_has_isolated() to return true. Remove IOMMU_CAP_INTR_REMAP from the s390 iommu driver. Link: https://lore.kernel.org/r/8-v3-3313bb5dd3a3+10f11-secure_msi_jgg@nvidia.com Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com> Tested-by: Matthew Rosato <mjrosato@linux.ibm.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
Родитель
f188bdb5f1
Коммит
bf210f7939
|
@ -0,0 +1,17 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_S390_MSI_H
|
||||
#define _ASM_S390_MSI_H
|
||||
#include <asm-generic/msi.h>
|
||||
|
||||
/*
|
||||
* Work around S390 not using irq_domain at all so we can't set
|
||||
* IRQ_DOMAIN_FLAG_ISOLATED_MSI. See for an explanation how it works:
|
||||
*
|
||||
* https://lore.kernel.org/r/31af8174-35e9-ebeb-b9ef-74c90d4bfd93@linux.ibm.com/
|
||||
*
|
||||
* Note this is less isolated than the ARM/x86 versions as userspace can trigger
|
||||
* MSI belonging to kernel devices within the same gisa.
|
||||
*/
|
||||
#define arch_is_isolated_msi() true
|
||||
|
||||
#endif
|
|
@ -34,8 +34,6 @@ static bool s390_iommu_capable(struct device *dev, enum iommu_cap cap)
|
|||
switch (cap) {
|
||||
case IOMMU_CAP_CACHE_COHERENCY:
|
||||
return true;
|
||||
case IOMMU_CAP_INTR_REMAP:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -48,6 +48,10 @@ typedef struct arch_msi_msg_data {
|
|||
} __attribute__ ((packed)) arch_msi_msg_data_t;
|
||||
#endif
|
||||
|
||||
#ifndef arch_is_isolated_msi
|
||||
#define arch_is_isolated_msi() false
|
||||
#endif
|
||||
|
||||
/**
|
||||
* msi_msg - Representation of a MSI message
|
||||
* @address_lo: Low 32 bits of msi message address
|
||||
|
@ -657,10 +661,10 @@ static inline bool msi_device_has_isolated_msi(struct device *dev)
|
|||
/*
|
||||
* Arguably if the platform does not enable MSI support then it has
|
||||
* "isolated MSI", as an interrupt controller that cannot receive MSIs
|
||||
* is inherently isolated by our definition. As nobody seems to needs
|
||||
* this be conservative and return false anyhow.
|
||||
* is inherently isolated by our definition. The default definition for
|
||||
* arch_is_isolated_msi() is conservative and returns false anyhow.
|
||||
*/
|
||||
return false;
|
||||
return arch_is_isolated_msi();
|
||||
}
|
||||
#endif /* CONFIG_GENERIC_MSI_IRQ */
|
||||
|
||||
|
|
|
@ -1647,6 +1647,6 @@ bool msi_device_has_isolated_msi(struct device *dev)
|
|||
for (; domain; domain = domain->parent)
|
||||
if (domain->flags & IRQ_DOMAIN_FLAG_ISOLATED_MSI)
|
||||
return true;
|
||||
return false;
|
||||
return arch_is_isolated_msi();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(msi_device_has_isolated_msi);
|
||||
|
|
Загрузка…
Ссылка в новой задаче