On Fri, 2014-09-12 at 17:55 +0100, Will Deacon wrote:
> Hi Alex,
>
> Thanks for taking a look.
>
> On Thu, Sep 11, 2014 at 08:12:28PM +0100, Alex Williamson wrote:
> > On Tue, 2014-09-02 at 10:53 +0100, Will Deacon wrote:
> > > diff --git a/drivers/vfio/vfio_iommu_type1.c
> > > b/drivers/vfio/vfio_iommu_type1.c
> > > index 0734fbe5b651..50aa56c7b6a7 100644
> > > --- a/drivers/vfio/vfio_iommu_type1.c
> > > +++ b/drivers/vfio/vfio_iommu_type1.c
> > > @@ -53,11 +53,15 @@ module_param_named(disable_hugepages,
> > > MODULE_PARM_DESC(disable_hugepages,
> > > "Disable VFIO IOMMU support for IOMMU hugepages.");
> > >
> > > +/* Feature flags for VFIO Type-1 IOMMUs */
> > > +#define VFIO_IOMMU_FEAT_V2 (1 << 0)
> > > +#define VFIO_IOMMU_FEAT_NESTING (1 << 1)
> > > +
> > > struct vfio_iommu {
> > > struct list_head domain_list;
> > > struct mutex lock;
> > > struct rb_root dma_list;
> > > - bool v2;
> > > + int features;
> >
> > Personally I'd rather add a nesting bool than mask out flag bits.
>
> Sure.
>
> > > @@ -705,6 +710,9 @@ static int vfio_iommu_type1_attach_group(void
> > > *iommu_data,
> > > goto out_free;
> > > }
> > >
> > > + if (iommu->features & VFIO_IOMMU_FEAT_NESTING)
> > > + iommu_domain_set_attr(domain->domain, DOMAIN_ATTR_NESTING,
> > > &attr);
> > > +
> >
> > Shouldn't we fail if this doesn't work?
>
> The reason I don't fail is because device passthrough can still work with an
> IOMMU that isn't capable of nesting. The part that won't work is attempting
> to instantiate a virtual SMMU interface for the guest.
>
> However, it just struck me that userspace knows whether or not it's going to
> want a virtual SMMU interface. If it does, then failure to set NESTING is
> fatal. If it doesn't, then it doesn't need to set the flag so there is no
> issue.
>
> > > ret = iommu_attach_group(domain->domain, iommu_group);
> > > if (ret)
> > > goto out_domain;
> > > @@ -815,12 +823,50 @@ done:
> > > mutex_unlock(&iommu->lock);
> > > }
> > >
> > > +static int vfio_iommus_have_nesting(void)
> > > +{
> > > + static struct bus_type *bus_types[] = { &pci_bus_type };
> >
> > Hmm, we just got rid of all traces of pci in this file, so I'm not too
> > excited about adding it back. Don't we no longer include pci.h? I'm
> > surprised this doesn't throw a warning. We should try to be independent
> > of CONFIG_PCI here.
>
> I don't see any warning here.
>
> > > + if (!iommu_present(bus))
> > > + continue;
> > > +
> > > + domain = iommu_domain_alloc(bus);
> > > + if (!domain)
> > > + continue;
> > > +
> > > + if (!iommu_domain_set_attr(domain, DOMAIN_ATTR_NESTING, &attr))
> > > + ret = 1;
> > > +
> > > + iommu_domain_free(domain);
> > > + }
> >
> > Can this support Joerg's iommu_capable() interface so we can test w/o
> > creating a domain? We still have the bus_type problem though.
>
> [...]
>
> > > @@ -886,6 +955,10 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
> > > case VFIO_TYPE1_IOMMU:
> > > case VFIO_TYPE1v2_IOMMU:
> > > return 1;
> > > + case VFIO_TYPE1_NESTING_IOMMU:
> > > + if (!iommu)
> > > + return vfio_iommus_have_nesting();
> > > + return vfio_domains_have_iommu_nesting(iommu);
> >
> > I'd just about prefer to statically return 1 for NESTING and then fail
> > to add groups if we can't set the attribute. It sucks, but here we test
> > an arbitrary bus type to determine whether nesting is supported, allow a
> > nesting iommu type to be set regardless of what kind of devices are
> > about to go into it, and require that the user test to see whether the
> > requested IOMMU attribute actually stuck. That's not a very intuitive
> > interface. Thanks,
>
> Yes, I totally agree that the interface is clunky. Returning 1 for NESTING
> solves both the pci bus problem and the iommu_capable issue, so that sounds
> like a great simplification of the code.
>
> That means userspace:
>
> - Can always open a VFIO_TYPE1_NESTING_IOMMU
> - VFIO_CHECK_EXTENSION will always return 1
> - When adding groups (e.g. SET_IOMMU), the iommu_domain_set_attr can
> fail, which will cause the corresponding ioctl to fail
>
> If nesting is not required because there is no virtual SMMU interface,
> then the usual TYPE1 IOMMU can be used.
>
> Sound good?
It's not 100% satisfying, but I can't think of anything better.
VFIO_TYPE1_NESTING_IOMMU is then just a VFIO level indication of support
with no indication of underlying hardware support. The user doesn't
know until they add a group if it's really possible. Not ideal from a
user perspective, but VFIO has always left itself the option of
disallowing groups from being added to a container. Thanks,
Alex
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu