Merge tag 'v6.2' into iommufd.git for-next
[sfrench/cifs-2.6.git] / kernel / irq / msi.c
index 783a3e6a0b1075a995096e6c68869a978aa3c252..d0f0389920c110c4aa990feb6d33f86fe5e52860 100644 (file)
@@ -1627,3 +1627,30 @@ struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain)
 {
        return (struct msi_domain_info *)domain->host_data;
 }
+
+/**
+ * msi_device_has_isolated_msi - True if the device has isolated MSI
+ * @dev: The device to check
+ *
+ * Isolated MSI means that HW modeled by an irq_domain on the path from the
+ * initiating device to the CPU will validate that the MSI message specifies an
+ * interrupt number that the device is authorized to trigger. This must block
+ * devices from triggering interrupts they are not authorized to trigger.
+ * Currently authorization means the MSI vector is one assigned to the device.
+ *
+ * This is interesting for securing VFIO use cases where a rouge MSI (eg created
+ * by abusing a normal PCI MemWr DMA) must not allow the VFIO userspace to
+ * impact outside its security domain, eg userspace triggering interrupts on
+ * kernel drivers, a VM triggering interrupts on the hypervisor, or a VM
+ * triggering interrupts on another VM.
+ */
+bool msi_device_has_isolated_msi(struct device *dev)
+{
+       struct irq_domain *domain = dev_get_msi_domain(dev);
+
+       for (; domain; domain = domain->parent)
+               if (domain->flags & IRQ_DOMAIN_FLAG_ISOLATED_MSI)
+                       return true;
+       return arch_is_isolated_msi();
+}
+EXPORT_SYMBOL_GPL(msi_device_has_isolated_msi);