Re: [PATCH 15/17] iommu: remove DOMAIN_ATTR_NESTING
Hi Christoph, On 3/1/21 9:42 AM, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > --- > drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 40 ++--- > drivers/iommu/arm/arm-smmu/arm-smmu.c | 30 ++-- > drivers/iommu/intel/iommu.c | 28 +-- > drivers/iommu/iommu.c | 8 + > drivers/vfio/vfio_iommu_type1.c | 5 +-- > include/linux/iommu.h | 4 ++- > 6 files changed, 50 insertions(+), 65 deletions(-) As mentionned by Robin, there are series planning to use DOMAIN_ATTR_NESTING to get info about the nested caps of the iommu (ARM and Intel): [Patch v8 00/10] vfio: expose virtual Shared Virtual Addressing to VMs patches 1, 2, 3 Is the plan to introduce a new domain_get_nesting_info ops then? Thanks Eric > > diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c > b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c > index bf96172e8c1f71..8e6fee3ea454d3 100644 > --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c > +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c > @@ -2466,41 +2466,21 @@ static void arm_smmu_dma_enable_flush_queue(struct > iommu_domain *domain) > to_smmu_domain(domain)->non_strict = true; > } > > -static int arm_smmu_domain_set_attr(struct iommu_domain *domain, > - enum iommu_attr attr, void *data) > +static int arm_smmu_domain_enable_nesting(struct iommu_domain *domain) > { > - int ret = 0; > struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); > + int ret = -EPERM; > > - mutex_lock(&smmu_domain->init_mutex); > + if (domain->type != IOMMU_DOMAIN_UNMANAGED) > + return -EINVAL; > > - switch (domain->type) { > - case IOMMU_DOMAIN_UNMANAGED: > - switch (attr) { > - case DOMAIN_ATTR_NESTING: > - if (smmu_domain->smmu) { > - ret = -EPERM; > - goto out_unlock; > - } > - > - if (*(int *)data) > - smmu_domain->stage = ARM_SMMU_DOMAIN_NESTED; > - else > - smmu_domain->stage = ARM_SMMU_DOMAIN_S1; > - break; > - default: > - ret = -ENODEV; > - } > - break; > - case IOMMU_DOMAIN_DMA: > - ret = -ENODEV; > - break; > - default: > - ret = -EINVAL; > + mutex_lock(&smmu_domain->init_mutex); > + if (!smmu_domain->smmu) { > + smmu_domain->stage = ARM_SMMU_DOMAIN_NESTED; > + ret = 0; > } > - > -out_unlock: > mutex_unlock(&smmu_domain->init_mutex); > + > return ret; > } > > @@ -2603,7 +2583,7 @@ static struct iommu_ops arm_smmu_ops = { > .device_group = arm_smmu_device_group, > .dma_use_flush_queue= arm_smmu_dma_use_flush_queue, > .dma_enable_flush_queue = arm_smmu_dma_enable_flush_queue, > - .domain_set_attr= arm_smmu_domain_set_attr, > + .domain_enable_nesting = arm_smmu_domain_enable_nesting, > .of_xlate = arm_smmu_of_xlate, > .get_resv_regions = arm_smmu_get_resv_regions, > .put_resv_regions = generic_iommu_put_resv_regions, > diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c > b/drivers/iommu/arm/arm-smmu/arm-smmu.c > index e7893e96f5177a..2e17d990d04481 100644 > --- a/drivers/iommu/arm/arm-smmu/arm-smmu.c > +++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c > @@ -1497,6 +1497,24 @@ static void arm_smmu_dma_enable_flush_queue(struct > iommu_domain *domain) > to_smmu_domain(domain)->pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_NON_STRICT; > } > > +static int arm_smmu_domain_enable_nesting(struct iommu_domain *domain) > +{ > + struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); > + int ret = -EPERM; > + > + if (domain->type != IOMMU_DOMAIN_UNMANAGED) > + return -EINVAL; > + > + mutex_lock(&smmu_domain->init_mutex); > + if (!smmu_domain->smmu) { > + smmu_domain->stage = ARM_SMMU_DOMAIN_NESTED; > + ret = 0; > + } > + mutex_unlock(&smmu_domain->init_mutex); > + > + return ret; > +} > + > static int arm_smmu_domain_set_attr(struct iommu_domain *domain, > enum iommu_attr attr, void *data) > { > @@ -1508,17 +1526,6 @@ static int arm_smmu_domain_set_attr(struct > iommu_domain *domain, > switch(domain->type) { > case IOMMU_DOMAIN_UNMANAGED: > switch (attr) { > - case DOMAIN_ATTR_NESTING: > - if (smmu_domain->smmu) { > - ret = -EPERM; > - goto out_unlock; > - } > - > - if (*(int *)data) > - smmu_domain->stage = ARM_SMMU_
Re: [PATCH 15/17] iommu: remove DOMAIN_ATTR_NESTING
Hi Christoph, On 3/14/21 4:58 PM, Christoph Hellwig wrote: > On Sun, Mar 14, 2021 at 11:44:52AM +0100, Auger Eric wrote: >> As mentionned by Robin, there are series planning to use >> DOMAIN_ATTR_NESTING to get info about the nested caps of the iommu (ARM >> and Intel): >> >> [Patch v8 00/10] vfio: expose virtual Shared Virtual Addressing to VMs >> patches 1, 2, 3 >> >> Is the plan to introduce a new domain_get_nesting_info ops then? > > The plan as usual would be to add it the series adding that support. > Not sure what the merge plans are - if the series is ready to be > merged I could rebase on top of it, otherwise that series will need > to add the method. OK I think your series may be upstreamed first. Thanks Eric >
Re: [RESEND PATCH v2 0/6] vfio-pci: Add support for mmapping MSI-X table
Hi Yongji, Le 02/06/2016 à 08:09, Yongji Xie a écrit : > Current vfio-pci implementation disallows to mmap the page > containing MSI-X table in case that users can write directly > to MSI-X table and generate an incorrect MSIs. > > However, this will cause some performance issue when there > are some critical device registers in the same page as the > MSI-X table. We have to handle the mmio access to these > registers in QEMU emulation rather than in guest. > > To solve this issue, this series allows to expose MSI-X table > to userspace when hardware enables the capability of interrupt > remapping which can ensure that a given PCI device can only > shoot the MSIs assigned for it. And we introduce a new bus_flags > PCI_BUS_FLAGS_MSI_REMAP to test this capability on PCI side > for different archs. > > The patch 3 are based on the proposed patchset[1]. You may have noticed I sent a respin of [1] yesterday: http://www.gossamer-threads.com/lists/linux/kernel/2455187. Unfortunately you will see I removed the patch defining the new msi_domain_info MSI_FLAG_IRQ_REMAPPING flag you rely on in this series. I did so because I was not using it anymore. At the beginning this was used to detect whether the MSI assignment was safe but this method was covering cases where the MSI controller was upstream to the IOMMU. So now I rely on a mechanism where MSI controller are supposed to register their MSI doorbells and tag whether it is safe. I don't know yet how this change will be welcomed though. Depending on reviews/discussions, might happen we revert to the previous flag. If you need the feature you can embed the used patches in your series and follow the review process separately. Sorry for the setback. Best Regards Eric > > Changelog v2: > - Make the commit log more clear > - Replace pci_bus_check_msi_remapping() with pci_bus_msi_isolated() > so that we could clearly know what the function does > - Set PCI_BUS_FLAGS_MSI_REMAP in pci_create_root_bus() instead > of iommu_bus_notifier() > - Reserve VFIO_REGION_INFO_FLAG_CAPS when we allow to mmap MSI-X > table so that we can know whether we allow to mmap MSI-X table > in QEMU > > [1] > https://www.mail-archive.com/linux-kernel%40vger.kernel.org/msg1138820.html > > Yongji Xie (6): > PCI: Add a new PCI_BUS_FLAGS_MSI_REMAP flag > PCI: Set PCI_BUS_FLAGS_MSI_REMAP if MSI controller enables IRQ remapping > PCI: Set PCI_BUS_FLAGS_MSI_REMAP if IOMMU have capability of IRQ remapping > iommu: Set PCI_BUS_FLAGS_MSI_REMAP on iommu driver initialization > pci-ioda: Set PCI_BUS_FLAGS_MSI_REMAP for IODA host bridge > vfio-pci: Allow to expose MSI-X table to userspace if interrupt remapping > is enabled > > arch/powerpc/platforms/powernv/pci-ioda.c |8 > drivers/iommu/iommu.c |8 > drivers/pci/msi.c | 15 +++ > drivers/pci/probe.c |7 +++ > drivers/vfio/pci/vfio_pci.c | 17 ++--- > drivers/vfio/pci/vfio_pci_rdwr.c |3 ++- > include/linux/msi.h |5 - > include/linux/pci.h |1 + > 8 files changed, 59 insertions(+), 5 deletions(-) > ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev