Hi,

On Mon, Nov 26, 2018 at 07:29:45AM +0000, Tian, Kevin wrote:
> btw Baolu just reminded me one thing which is worthy of noting here.
> 'primary' vs. 'aux' concept makes sense only when we look from a device
> p.o.v. That binding relationship is not (*should not be*) carry-and-forwarded
> cross devices. every domain must be explicitly attached to other devices
> (instead of implicitly attached being above example), and new primary/aux
> attribute on another device will be decided at attach time.

Okay, so after all the discussions we had I learned a few more things
about the scalable mode feature and thought a bit longer about how to
best support it in the IOMMU-API.

The concept of sub-domains I initially proposed certainly makes no
sense, but scalable-mode specific attach/detach functions do. So instead
of a sub-domain mode, I'd like to propose device-feature sets.

The posted patch-set already includes this as device-attributes, but I
don't like this naming as we are really talking about additional
feature sets of a device. So how about we introduce this:

        enum iommu_dev_features {
                /* ... */
                IOMMU_DEV_FEAT_AUX,
                IOMMU_DEV_FEAT_SVA,
                /* ... */
        };

        /* Check if a device supports a given feature of the IOMMU-API */
        bool iommu_dev_has_feature(struct device *dev, enum iommu_dev_features 
*feat);

        /*
         * Only works if iommu_dev_has_feature(dev, IOMMU_DEV_FEAT_AUX)
         * returns true
         *
         * Also, as long as domains are attached to a device through
         * this interface, any trys to call iommu_attach_device() should
         * fail (iommu_detach_device() can't fail, so we fail on the
         * tryint to re-attach). This should make us safe against a
         * device being attached to a guest as a whole while there are
         * still pasid users on it (aux and sva).
         */
        int iommu_aux_attach_device(struct iommu_domain *domain,
                                    struct device *dev);

        int iommu_aux_detach_device(struct iommu_domain *domain,
                                    struct device *dev);
        /*
         * I know we are targeting a system-wide pasid-space, so that
         * the pasid would be the same for one domain on all devices,
         * let's just keep the option open to have different
         * pasid-spaces in one system. Also this way we can use it to
         * check whether the domain is attached to this device at all.
         *
         * returns pasid or <0 if domain has no pasid on that device.
         */
        int iommu_aux_get_pasid(struct iommu_domain *domain,
                                struct device *dev);

        /* So we need a iommu_aux_detach_all()? */

This concept can also be easily extended for supporting SVA in parallel
on the same device, with the same constraints regarding the behavior of
iommu_attach_device()/iommu_detach_device().

So what do you think about that approach?

Regards,

        Joerg

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

Reply via email to