lkml.org 
[lkml]   [2021]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH 01/11] iommu: Add device dma ownership set/release interfaces
    From
    Date
    Hi Jason,

    On 11/16/21 9:46 PM, Jason Gunthorpe wrote:
    > On Tue, Nov 16, 2021 at 09:57:30AM +0800, Lu Baolu wrote:
    >> Hi Christoph,
    >>
    >> On 11/15/21 9:14 PM, Christoph Hellwig wrote:
    >>> On Mon, Nov 15, 2021 at 10:05:42AM +0800, Lu Baolu wrote:
    >>>> +enum iommu_dma_owner {
    >>>> + DMA_OWNER_NONE,
    >>>> + DMA_OWNER_KERNEL,
    >>>> + DMA_OWNER_USER,
    >>>> +};
    >>>> +
    >>>
    >>>> + enum iommu_dma_owner dma_owner;
    >>>> + refcount_t owner_cnt;
    >>>> + struct file *owner_user_file;
    >>>
    >>> I'd just overload the ownership into owner_user_file,
    >>>
    >>> NULL -> no owner
    >>> (struct file *)1UL) -> kernel
    >>> real pointer -> user
    >>>
    >>> Which could simplify a lot of the code dealing with the owner.
    >>>
    >>
    >> Yeah! Sounds reasonable. I will make this in the next version.
    >
    > It would be good to figure out how to make iommu_attach_device()
    > enforce no other driver binding as a kernel user without a file *, as
    > Robin pointed to, before optimizing this.
    >
    > This fixes an existing bug where iommu_attach_device() only checks the
    > group size and is vunerable to a hot plug increasing the group size
    > after it returns. That check should be replaced by this series's logic
    > instead.

    As my my understanding, the essence of this problem is that only the
    user owner of the iommu_group could attach an UNMANAGED domain to it.
    If I understand it right, how about introducing a new interface to
    allocate a user managed domain and storing the user file pointer in it.

    --- a/include/linux/iommu.h
    +++ b/include/linux/iommu.h
    @@ -94,6 +94,7 @@ struct iommu_domain {
    void *handler_token;
    struct iommu_domain_geometry geometry;
    struct iommu_dma_cookie *iova_cookie;
    + struct file *owner_user_file;
    };
    --- a/drivers/iommu/iommu.c
    +++ b/drivers/iommu/iommu.c
    @@ -1902,6 +1902,18 @@ struct iommu_domain *iommu_domain_alloc(struct
    bus_type *bus)
    }
    EXPORT_SYMBOL_GPL(iommu_domain_alloc);

    +struct iommu_domain *iommu_domain_alloc_user(struct bus_type *bus,
    + struct file *filep)
    +{
    + struct iommu_domain *domain;
    +
    + domain = __iommu_domain_alloc(bus, IOMMU_DOMAIN_UNMANAGED);
    + if (domain)
    + domain->owner_user_file = filep;
    +
    + return domain;
    +}

    When attaching a domain to an user-owned iommu_group, both group and
    domain should have matched user fd.

    Does above help here?

    Best regards,
    baolu
    \
     
     \ /
      Last update: 2021-11-17 06:29    [W:4.028 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site