On Mon, Nov 11, 2024 at 02:14:15PM +0000, Marc Zyngier wrote: > On Mon, 11 Nov 2024 13:09:20 +0000, > Robin Murphy <robin.murphy@xxxxxxx> wrote: > > On 2024-11-09 5:48 am, Nicolin Chen wrote: > > > To solve this problem the VMM should capture the MSI IOVA allocated by the > > > guest kernel and relay it to the GIC driver in the host kernel, to program > > > the correct MSI IOVA. And this requires a new ioctl via VFIO. > > > > Once VFIO has that information from userspace, though, do we really > > need the whole complicated dance to push it right down into the > > irqchip layer just so it can be passed back up again? AFAICS > > vfio_msi_set_vector_signal() via VFIO_DEVICE_SET_IRQS already > > explicitly rewrites MSI-X vectors, so it seems like it should be > > pretty straightforward to override the message address in general at > > that level, without the lower layers having to be aware at all, no? > > +1. > > I would like to avoid polluting each and every interrupt controller > with usage-specific knowledge (they usually are brain-damaged enough). > We already have an indirection into the IOMMU subsystem and it > shouldn't be a big deal to intercept the message for all > implementations at this level. > > I also wonder how to handle the case of braindead^Wwonderful platforms > where ITS transactions are not translated by the SMMU. Somehow, VFIO > should be made aware of this situation. Perhaps we should do iommu_get_domain_for_dev(&vdev->pdev->dev) and check the returned domain->type: * if (domain->type & __IOMMU_DOMAIN_PAGING): 1-stage translation * if (domain->type == IOMMU_DOMAIN_NESTED): 2-stage translation And for this particular topic/series, we should do something like: if (vdev->msi_iovas && domain->type == IOMMU_DOMAIN_NESTED) { msg.address_lo = lower_32_bits(vdev->msi_iovas[vector]); msg.address_hi = upper_32_bits(vdev->msi_iovas[vector]); } ? Thanks Nicolin