lkml.org 
[lkml]   [2023]   [Mar]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH 04/12] iommufd: Pass parent hwpt and user_data to iommufd_hw_pagetable_alloc()
    From
    On 3/9/23 4:09 PM, Yi Liu wrote:
    > Nested translation has stage-1 and stage-2 page tables. A stage-1 page
    > table is managed by user space, and it needs to work with a stage-2 page
    > table, which is a parent hwpt for the stage-1 hwpt.
    >
    > iommu core already supports accepting parent iommu_domain and user_data
    > to allocate an iommu_domain. This makes iommufd_hw_pagetable_alloc() to
    > accept the parent hwpt and user_data, and relays them to iommu core, to
    > prepare for supporting hw_pagetable allocation with user_data.
    >
    > Also, add a parent pointer in struct iommufd_hw_pagetable for taking and
    > releasing its refcount.
    >
    > Co-developed-by: Nicolin Chen <nicolinc@nvidia.com>
    > Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
    > Signed-off-by: Yi Liu <yi.l.liu@intel.com>
    > ---
    > drivers/iommu/iommufd/device.c | 2 +-
    > drivers/iommu/iommufd/hw_pagetable.c | 28 ++++++++++++++++++++++---
    > drivers/iommu/iommufd/iommufd_private.h | 5 ++++-
    > 3 files changed, 30 insertions(+), 5 deletions(-)
    >
    > diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c
    > index 5c352807d946..19cd6df46c6a 100644
    > --- a/drivers/iommu/iommufd/device.c
    > +++ b/drivers/iommu/iommufd/device.c
    > @@ -558,7 +558,7 @@ iommufd_device_auto_get_domain(struct iommufd_device *idev,
    > }
    >
    > hwpt = iommufd_hw_pagetable_alloc(idev->ictx, ioas, idev,
    > - immediate_attach);
    > + NULL, NULL, immediate_attach);
    > if (IS_ERR(hwpt)) {
    > destroy_hwpt = ERR_CAST(hwpt);
    > goto out_unlock;
    > diff --git a/drivers/iommu/iommufd/hw_pagetable.c b/drivers/iommu/iommufd/hw_pagetable.c
    > index 84b4a11e62f8..16e92a1c150b 100644
    > --- a/drivers/iommu/iommufd/hw_pagetable.c
    > +++ b/drivers/iommu/iommufd/hw_pagetable.c
    > @@ -24,6 +24,8 @@ void iommufd_hw_pagetable_destroy(struct iommufd_object *obj)
    > if (hwpt->domain)
    > iommu_domain_free(hwpt->domain);
    >
    > + if (hwpt->parent)
    > + refcount_dec(&hwpt->parent->obj.users);
    > refcount_dec(&hwpt->ioas->obj.users);
    > }
    >
    > @@ -46,6 +48,8 @@ int iommufd_hw_pagetable_enforce_cc(struct iommufd_hw_pagetable *hwpt)
    > * @ictx: iommufd context
    > * @ioas: IOAS to associate the domain with
    > * @idev: Device to get an iommu_domain for
    > + * @parent: Optional parent HWPT to associate with the domain with
    > + * @user_data: Optional user_data pointer
    > * @immediate_attach: True if idev should be attached to the hwpt
    > *
    > * Allocate a new iommu_domain and return it as a hw_pagetable. The HWPT
    > @@ -54,14 +58,20 @@ int iommufd_hw_pagetable_enforce_cc(struct iommufd_hw_pagetable *hwpt)
    > */
    > struct iommufd_hw_pagetable *
    > iommufd_hw_pagetable_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas,
    > - struct iommufd_device *idev, bool immediate_attach)
    > + struct iommufd_device *idev,
    > + struct iommufd_hw_pagetable *parent,
    > + void *user_data, bool immediate_attach)
    > {
    > const struct iommu_ops *ops = dev_iommu_ops(idev->dev);
    > + struct iommu_domain *parent_domain = NULL;
    > struct iommufd_hw_pagetable *hwpt;
    > int rc;
    >
    > lockdep_assert_held(&ioas->mutex);
    >
    > + if (parent && !ops->domain_alloc_user)
    > + return ERR_PTR(-EOPNOTSUPP);

    My understanding here is that we are checking whether domain_alloc_user
    is required. It seems that as long as the caller inputs a valid
    user_data or parent, domain_alloc_user is required. If so,

    if ((user_data || parent) && !ops->domain_alloc_user)
    return ERR_PTR(-EOPNOTSUPP);

    Best regards,
    baolu

    \
     
     \ /
      Last update: 2023-03-27 00:52    [W:3.337 / U:0.416 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site