Hi Alex,

On Wed, Sep 24, 2014 at 07:23:19PM +0100, Alex Williamson wrote:
> On Wed, 2014-09-24 at 10:21 +0100, Will Deacon wrote:
> > VFIO allows devices to be safely handed off to userspace by putting
> > them behind an IOMMU configured to ensure DMA and interrupt isolation.
> > This enables userspace KVM clients, such as kvmtool and qemu, to further
> > map the device into a virtual machine.
> > 
> > With IOMMUs such as the ARM SMMU, it is then possible to provide SMMU
> > translation services to the guest operating system, which are nested
> > with the existing translation installed by VFIO. However, enabling this
> > feature means that the IOMMU driver must be informed that the VFIO domain
> > is being created for the purposes of nested translation.
> > 
> > This patch adds a new IOMMU type (VFIO_TYPE1_NESTING_IOMMU) to the VFIO
> > type-1 driver. The new IOMMU type acts identically to the
> > VFIO_TYPE1v2_IOMMU type, but additionally sets the DOMAIN_ATTR_NESTING
> > attribute on its IOMMU domains.

[...]

> > diff --git a/drivers/vfio/vfio_iommu_type1.c 
> > b/drivers/vfio/vfio_iommu_type1.c
> > index 0734fbe5b651..d15b00700a31 100644
> > --- a/drivers/vfio/vfio_iommu_type1.c
> > +++ b/drivers/vfio/vfio_iommu_type1.c
> > @@ -57,7 +57,8 @@ struct vfio_iommu {
> >     struct list_head        domain_list;
> >     struct mutex            lock;
> >     struct rb_root          dma_list;
> > -   bool v2;
> > +   bool                    v2;
> > +   bool                    nesting;
> >  };
> >  
> >  struct vfio_domain {
> > @@ -671,7 +672,7 @@ static int vfio_iommu_type1_attach_group(void 
> > *iommu_data,
> >     struct vfio_group *group, *g;
> >     struct vfio_domain *domain, *d;
> >     struct bus_type *bus = NULL;
> > -   int ret;
> > +   int ret, attr = 1;
> >  
> >     mutex_lock(&iommu->lock);
> >  
> > @@ -705,6 +706,13 @@ static int vfio_iommu_type1_attach_group(void 
> > *iommu_data,
> >             goto out_free;
> >     }
> >  
> > +   if (iommu->nesting) {
> 
> nit, attr declaration could be moved here

Sure.

> > +           ret = iommu_domain_set_attr(domain->domain, DOMAIN_ATTR_NESTING,
> > +                                       &attr);
> > +           if (ret)
> > +                   goto out_domain;
> > +   }
> > +
> >     ret = iommu_attach_group(domain->domain, iommu_group);
> >     if (ret)
> >             goto out_domain;
> > @@ -819,17 +827,25 @@ static void *vfio_iommu_type1_open(unsigned long arg)
> >  {
> >     struct vfio_iommu *iommu;
> >  
> > -   if (arg != VFIO_TYPE1_IOMMU && arg != VFIO_TYPE1v2_IOMMU)
> > -           return ERR_PTR(-EINVAL);
> > -
> >     iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
> >     if (!iommu)
> >             return ERR_PTR(-ENOMEM);
> >  
> > +   switch (arg) {
> > +   case VFIO_TYPE1_IOMMU:
> > +           break;
> > +   case VFIO_TYPE1_NESTING_IOMMU:
> > +           iommu->nesting = true;
> > +   case VFIO_TYPE1v2_IOMMU:
> > +           iommu->v2 = true;
> > +           break;
> > +   default:
> 
> Leaks iommu

Yikes, sorry about that. Will fix.

Will
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to