All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nicolin Chen <nicolinc@nvidia.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: <kevin.tian@intel.com>, <corbet@lwn.net>, <will@kernel.org>,
	<bagasdotme@gmail.com>, <robin.murphy@arm.com>, <joro@8bytes.org>,
	<thierry.reding@gmail.com>, <vdumpa@nvidia.com>,
	<jonathanh@nvidia.com>, <shuah@kernel.org>, <jsnitsel@redhat.com>,
	<nathan@kernel.org>, <peterz@infradead.org>, <yi.l.liu@intel.com>,
	<mshavit@google.com>, <praan@google.com>,
	<zhangzekun11@huawei.com>, <iommu@lists.linux.dev>,
	<linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-tegra@vger.kernel.org>, <linux-kselftest@vger.kernel.org>,
	<patches@lists.linux.dev>, <mochs@nvidia.com>,
	<alok.a.tiwari@oracle.com>, <vasant.hegde@amd.com>,
	<dwmw2@infradead.org>, <baolu.lu@linux.intel.com>
Subject: Re: [PATCH v5 10/29] iommufd: Abstract iopt_pin_pages and iopt_unpin_pages helpers
Date: Wed, 4 Jun 2025 21:11:07 -0700	[thread overview]
Message-ID: <aEEY28ZXH+NqiE+T@Asurada-Nvidia> (raw)
In-Reply-To: <20250528171754.GY61950@nvidia.com>

On Wed, May 28, 2025 at 02:17:54PM -0300, Jason Gunthorpe wrote:
> On Sat, May 17, 2025 at 08:21:27PM -0700, Nicolin Chen wrote:
> > The new HW QUEUE object will be added for HW to access the guest queue for
> > HW-accelerated virtualization feature. Some of HW QUEUEs are designed in a
> > way of accessing the guest queue via a host physical address without doing
> > a translation using the nesting parent IO page table, while others can use
> > the guest physical address. For the former case, kernel working with a VMM
> > needs to pin the physical pages backing the guest memory to lock them when
> > HW QUEUE is accessing, and to ensure those physical pages to be contiguous
> > in the physical address space.
> > 
> > This is very like the existing iommufd_access_pin_pages() that outputs the
> > pinned page list for the caller to test its contiguity.
> > 
> > Move those code from iommufd_access_pin/unpin_pages() and related function
> > for a pair of iopt helpers that can be shared with the HW QUEUE allocator.
> > 
> > Rename check_area_prot() to align with the existing iopt_area helpers, and
> > inline it to the header since iommufd_access_rw() still uses it.
> > 
> > Reviewed-by: Pranjal Shrivastava <praan@google.com>
> > Reviewed-by: Kevin Tian <kevin.tian@intel.com>
> > Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> > Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
> > ---
> >  drivers/iommu/iommufd/io_pagetable.h    |   8 ++
> >  drivers/iommu/iommufd/iommufd_private.h |   6 ++
> >  drivers/iommu/iommufd/device.c          | 119 ++----------------------
> >  drivers/iommu/iommufd/io_pagetable.c    |  97 +++++++++++++++++++
> >  4 files changed, 119 insertions(+), 111 deletions(-)
> 
> And if you do what was suggested do we need this patch at all? Just
> use the normal access sequence:
> 
>  iommufd_access_create(ops=NULL)
>  iommufd_access_attach(viommu->hwpt->ioas)
>  iommufd_access_pin_pages()
> 
> And store a viommu->access pointer to undo it all.

I found the entire ictx would be locked by iommufd_access_create(),
then the release fop couldn't even get invoked to destroy objects.

I added a new flag to address this:
-----------------------------------------------------------------
diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c
index f25e272ae378c..a3e0ace583a66 100644
--- a/drivers/iommu/iommufd/device.c
+++ b/drivers/iommu/iommufd/device.c
@@ -1085,7 +1085,8 @@ void iommufd_access_destroy_object(struct iommufd_object *obj)
        if (access->ioas)
                WARN_ON(iommufd_access_change_ioas(access, NULL));
        mutex_unlock(&access->ioas_lock);
-       iommufd_ctx_put(access->ictx);
+       if (!access->ops->internal_use)
+               iommufd_ctx_put(access->ictx);
 }
 
 /**
@@ -1126,7 +1127,8 @@ iommufd_access_create(struct iommufd_ctx *ictx,
        /* The calling driver is a user until iommufd_access_destroy() */
        refcount_inc(&access->obj.users);
        access->ictx = ictx;
-       iommufd_ctx_get(ictx);
+       if (!ops->internal_use)
+               iommufd_ctx_get(ictx);
        iommufd_object_finalize(ictx, &access->obj);
        *id = access->obj.id;
        mutex_init(&access->ioas_lock);
-----------------------------------------------------------------

Btw, I think we can have an ops but only set unmap to NULL:
 static const struct iommufd_access_ops hw_queue_access_ops = {
        .needs_pin_pages = 1,
+       .internal_use = 1,
        /* NULL unmap to reject IOMMUFD_CMD_IOAS_UNMAP */
 };

Having two flags makes the code slightly more readable. After all,
HW queue does need to pin pages.

Thanks
Nicolin


  reply	other threads:[~2025-06-05  4:13 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-18  3:21 [PATCH v5 00/29] iommufd: Add vIOMMU infrastructure (Part-4 HW QUEUE) Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 01/29] iommufd: Apply obvious cosmetic fixes Nicolin Chen
2025-05-23  7:43   ` Tian, Kevin
2025-05-28 16:55   ` Jason Gunthorpe
2025-05-18  3:21 ` [PATCH v5 02/29] iommufd: Introduce iommufd_object_alloc_ucmd helper Nicolin Chen
2025-05-23  7:46   ` Tian, Kevin
2025-05-23 21:17     ` Nicolin Chen
2025-05-28 16:56   ` Jason Gunthorpe
2025-05-18  3:21 ` [PATCH v5 03/29] iommu: Apply the new " Nicolin Chen
2025-05-23  7:49   ` Tian, Kevin
2025-05-23 21:34     ` Nicolin Chen
2025-05-28  8:11       ` Tian, Kevin
2025-05-28 16:57   ` Jason Gunthorpe
2025-05-18  3:21 ` [PATCH v5 04/29] iommu: Add iommu_copy_struct_to_user helper Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 05/29] iommu: Pass in a driver-level user data structure to viommu_alloc op Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 06/29] iommufd/viommu: Allow driver-specific user data for a vIOMMU object Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 07/29] iommufd/selftest: Support user_data in mock_viommu_alloc Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 08/29] iommufd/selftest: Add coverage for viommu data Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 09/29] iommufd: Do not unmap an owned iopt_area Nicolin Chen
2025-05-23  7:53   ` Tian, Kevin
2025-05-23 21:38     ` Nicolin Chen
2025-05-24  3:30   ` Nicolin Chen
2025-05-28 17:08   ` Jason Gunthorpe
2025-05-28 18:07     ` Nicolin Chen
2025-06-05  4:30     ` Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 10/29] iommufd: Abstract iopt_pin_pages and iopt_unpin_pages helpers Nicolin Chen
2025-05-28 17:17   ` Jason Gunthorpe
2025-06-05  4:11     ` Nicolin Chen [this message]
2025-06-05 15:16       ` Jason Gunthorpe
2025-06-05 17:04         ` Nicolin Chen
2025-06-05 19:40           ` Jason Gunthorpe
2025-06-06  4:46             ` Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 11/29] iommufd/driver: Let iommufd_viommu_alloc helper save ictx to viommu->ictx Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 12/29] iommufd/viommu: Add driver-allocated vDEVICE support Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 13/29] iommufd/viommu: Introduce IOMMUFD_OBJ_HW_QUEUE and its related struct Nicolin Chen
2025-05-23  7:55   ` Tian, Kevin
2025-05-23 21:45     ` Nicolin Chen
2025-05-28  8:12       ` Tian, Kevin
2025-05-28 18:01         ` Nicolin Chen
2025-05-30 16:07   ` Jason Gunthorpe
2025-05-30 16:33     ` Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 14/29] iommufd/viommu: Add IOMMUFD_CMD_HW_QUEUE_ALLOC ioctl Nicolin Chen
2025-05-23  8:00   ` Tian, Kevin
2025-05-24  0:30     ` Nicolin Chen
2025-05-30 16:14   ` Jason Gunthorpe
2025-05-30 17:38     ` Nicolin Chen
2025-05-30 17:40       ` Jason Gunthorpe
2025-05-30 18:23         ` Nicolin Chen
2025-05-30 18:25           ` Jason Gunthorpe
2025-05-30 18:39             ` Nicolin Chen
2025-06-03  5:41     ` Nicolin Chen
2025-06-03 12:24       ` Jason Gunthorpe
2025-05-18  3:21 ` [PATCH v5 15/29] iommufd/driver: Add iommufd_hw_queue_depend/undepend() helpers Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 16/29] iommufd/selftest: Add coverage for IOMMUFD_CMD_HW_QUEUE_ALLOC Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 17/29] iommufd: Add mmap interface Nicolin Chen
2025-05-30 16:29   ` Jason Gunthorpe
2025-05-30 16:59     ` Nicolin Chen
2025-05-30 17:12       ` Jason Gunthorpe
2025-05-18  3:21 ` [PATCH v5 18/29] iommufd/selftest: Add coverage for the new " Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 19/29] Documentation: userspace-api: iommufd: Update HW QUEUE Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 20/29] iommu: Allow an input type in hw_info op Nicolin Chen
2025-05-23  8:04   ` Tian, Kevin
2025-05-30 16:52   ` Jason Gunthorpe
2025-05-18  3:21 ` [PATCH v5 21/29] iommufd: Allow an input data_type via iommu_hw_info Nicolin Chen
2025-05-23  8:06   ` Tian, Kevin
2025-05-30 16:52   ` Jason Gunthorpe
2025-05-30 17:11     ` Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 22/29] iommufd/selftest: Update hw_info coverage for an input data_type Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 23/29] iommu/arm-smmu-v3-iommufd: Add vsmmu_alloc impl op Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 24/29] iommu/arm-smmu-v3-iommufd: Add hw_info to impl_ops Nicolin Chen
2025-05-30 16:57   ` Jason Gunthorpe
2025-05-18  3:21 ` [PATCH v5 25/29] iommu/tegra241-cmdqv: Use request_threaded_irq Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 26/29] iommu/tegra241-cmdqv: Simplify deinit flow in tegra241_cmdqv_remove_vintf() Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 27/29] iommu/tegra241-cmdqv: Do not statically map LVCMDQs Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 28/29] iommu/tegra241-cmdqv: Add user-space use support Nicolin Chen
2025-05-30 17:10   ` Jason Gunthorpe
2025-05-30 17:19     ` Nicolin Chen
2025-05-18  3:21 ` [PATCH v5 29/29] iommu/tegra241-cmdqv: Add IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV support Nicolin Chen
2025-05-30 17:09   ` Jason Gunthorpe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aEEY28ZXH+NqiE+T@Asurada-Nvidia \
    --to=nicolinc@nvidia.com \
    --cc=alok.a.tiwari@oracle.com \
    --cc=bagasdotme@gmail.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=corbet@lwn.net \
    --cc=dwmw2@infradead.org \
    --cc=iommu@lists.linux.dev \
    --cc=jgg@nvidia.com \
    --cc=jonathanh@nvidia.com \
    --cc=joro@8bytes.org \
    --cc=jsnitsel@redhat.com \
    --cc=kevin.tian@intel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=mochs@nvidia.com \
    --cc=mshavit@google.com \
    --cc=nathan@kernel.org \
    --cc=patches@lists.linux.dev \
    --cc=peterz@infradead.org \
    --cc=praan@google.com \
    --cc=robin.murphy@arm.com \
    --cc=shuah@kernel.org \
    --cc=thierry.reding@gmail.com \
    --cc=vasant.hegde@amd.com \
    --cc=vdumpa@nvidia.com \
    --cc=will@kernel.org \
    --cc=yi.l.liu@intel.com \
    --cc=zhangzekun11@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.