irq/s390: Add arch_is_isolated_msi() for s390
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 29 Nov 2022 00:31:57 +0000 (20:31 -0400)
committerJason Gunthorpe <jgg@nvidia.com>
Wed, 11 Jan 2023 20:27:23 +0000 (16:27 -0400)
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>
arch/s390/include/asm/msi.h [new file with mode: 0644]
drivers/iommu/s390-iommu.c
include/linux/msi.h
kernel/irq/msi.c

diff --git a/arch/s390/include/asm/msi.h b/arch/s390/include/asm/msi.h
new file mode 100644 (file)
index 0000000..399343e
--- /dev/null
@@ -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
index ed33c6c..bb00580 100644 (file)
@@ -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;
        }
index e8a3f3a..13c9b74 100644 (file)
@@ -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 */
 
index ac5e224..4dec57f 100644 (file)
@@ -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);