linux-kselftest.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Nicolin Chen <nicolinc@nvidia.com>
To: Vasant Hegde <vasant.hegde@amd.com>
Cc: <jgg@nvidia.com>, <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>,
	Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Subject: Re: [PATCH v2 10/22] iommufd/viommmu: Add IOMMUFD_CMD_VCMDQ_ALLOC ioctl
Date: Mon, 28 Apr 2025 13:02:15 -0700	[thread overview]
Message-ID: <aA/exylmYJhIhEVL@Asurada-Nvidia> (raw)
In-Reply-To: <b0d01609-bdda-49a3-af0c-ca828a9c4cea@amd.com>

On Mon, Apr 28, 2025 at 05:42:27PM +0530, Vasant Hegde wrote:
> > +/**
> > + * struct iommu_vcmdq_alloc - ioctl(IOMMU_VCMDQ_ALLOC)
> > + * @size: sizeof(struct iommu_vcmdq_alloc)
> > + * @flags: Must be 0
> > + * @viommu_id: Virtual IOMMU ID to associate the virtual command queue with
> > + * @type: One of enum iommu_vcmdq_type
> > + * @index: The logical index to the virtual command queue per virtual IOMMU, for
> > + *         a multi-queue model
> > + * @out_vcmdq_id: The ID of the new virtual command queue
> > + * @addr: Base address of the queue memory in the guest physical address space
> 
> Sorry. I didn't get this part.
> 
> So here `addr` is command queue base address like
>  - NVIDIA's virtual command queue
>  - AMD vIOMMU's command buffer
> 
> .. and it will allocate vcmdq for each buffer type. Is that the correct
> understanding?

Yes. For AMD "vIOMMU", it needs a new type for iommufd vIOMMU:
	IOMMU_VIOMMU_TYPE_AMD_VIOMMU,

For AMD "vIOMMU" command buffer, it needs a new type too:
	IOMMU_VCMDQ_TYPE_AMD_VIOMMU, /* Kdoc it to be Command Buffer */

Then, use IOMMUFD_CMD_VIOMMU_ALLOC ioctl to allocate an vIOMMU
obj, and use IOMMUFD_CMD_VCMDQ_ALLOC ioctl(s) to allocate vCMDQ
objs.

> In case of AMD vIOMMU, buffer base address is programmed in different register
> (ex: MMIO Offset 0008h Command Buffer Base Address Register) and buffer
> enable/disable is done via different register (ex: MMIO Offset 0018h IOMMU
> Control Register). And we need to communicate both to hypervisor. Not sure this
> API can accommodate this as addr seems to be mandatory.

NVIDIA's CMDQV has all three of them too. What we do here is to
let VMM trap the buffer base address (in guest physical address
space) and forward it to kernel using this @addr. Then, kernel
will translate this @addr to host physical address space, and
program the physical address and size to the register.

> [1]
> https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/specifications/48882_IOMMU.pdf

Thanks for the doc. So, AMD has:

Command Buffer Base Address Register [MMIO Offset 0008h]
"used to program the system physical base address and size of the
 command buffer. The command buffer occupies contiguous physical
 memory starting at the programmed base address, up to the
 programmed size."
Command Buffer Head Pointer Register [MMIO Offset 2000h]
Command Buffer Tail Pointer Register [MMIO Offset 2008h]

IIUIC, AMD should do the same: VMM traps VM's Command Buffer Base
Address register when the guest kernel allocates a command buffer
by programming the VM's Command Buffer Base Address register, to
capture the guest PA and size. Then, VMM allocates a vCMDQ object
(for this command buffer) forwarding its buffer address and size
via @addr and @length to the host kernel. Then, the kernel should
translate the guest PA to host PA to program the HW.

We can see that the Head/Tail registers are in a different MMIO
page (offset by two 4K pages), which is very like NVIDIA CMDQV
that allows VMM to mmap that MMIO page of the Head/Tail registers
for guest OS to directly control the HW (i.e. VMM doesn't trap
these two registers.

When guest OS wants to issue a new command, the guest kernel can
just fill the guest command buffer at the entry that the Head
register points to, and program the Tail register (backed by an
mmap'd MMIO page), then the HW will read the programmed physical
address from the entry (Head) till the entry (Tail) in the guest
command buffer.

> > @@ -170,3 +170,97 @@ int iommufd_vdevice_alloc_ioctl(struct iommufd_ucmd *ucmd)
> >  	iommufd_put_object(ucmd->ictx, &viommu->obj);
> >  	return rc;
> >  }
> > +
> > +void iommufd_vcmdq_destroy(struct iommufd_object *obj)
> > +{
> 
> I didn't understood destroy flow in general. Can you please help me to understand:
> 
> VMM is expected to track all buffers and call this interface?  OR iommufd will
> take care of it? What happens if VM crashes ?

In a normal routine, VMM gets a vCMDQ object ID for each vCMDQ
object it allocated. So, it should track all the IDs and release
them when VM shuts down.

The iommufd core does track all the objects that belong to an
iommufd context (ictx), and automatically release them. But, it
can't resolve certain dependency on other FD, e.g. vEVENTQ and
FAULT QUEUE would return another FD that user space listens to
and must be closed properly to destroy the QUEUE object.

> > +	/* The underlying physical pages must be pinned in the IOAS */
> > +	rc = iopt_pin_pages(&viommu->hwpt->ioas->iopt, cmd->addr, cmd->length,
> > +			    pages, 0);
> 
> Why do we need this? is it not pinned already as part of vfio binding?

I think this could be clearer:
	/*
	 * The underlying physical pages must be pinned to prevent them from
	 * being unmapped (via IOMMUFD_CMD_IOAS_UNMAP) during the life cycle
	 * of the vCMDQ object.
	 */

Thanks
Nicolin

  reply	other threads:[~2025-04-28 20:02 UTC|newest]

Thread overview: 146+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-26  5:57 [PATCH v2 00/22] iommufd: Add vIOMMU infrastructure (Part-4 vCMDQ) Nicolin Chen
2025-04-26  5:57 ` [PATCH v2 01/22] iommufd/viommu: Add driver-allocated vDEVICE support Nicolin Chen
2025-04-27  6:23   ` Baolu Lu
2025-04-28  0:41     ` Tian, Kevin
2025-04-28 18:08       ` Nicolin Chen
2025-04-26  5:57 ` [PATCH v2 02/22] iommu: Pass in a driver-level user data structure to viommu_alloc op Nicolin Chen
2025-04-27  6:31   ` Baolu Lu
2025-04-28 17:19     ` Nicolin Chen
2025-04-28 17:28       ` Pranjal Shrivastava
2025-04-26  5:57 ` [PATCH v2 03/22] iommufd/viommu: Allow driver-specific user data for a vIOMMU object Nicolin Chen
2025-04-27  6:36   ` Baolu Lu
2025-04-28 17:52   ` Pranjal Shrivastava
2025-04-30 14:58   ` ALOK TIWARI
2025-04-26  5:57 ` [PATCH v2 04/22] iommu: Add iommu_copy_struct_to_user helper Nicolin Chen
2025-04-27  6:39   ` Baolu Lu
2025-04-28 17:50   ` Pranjal Shrivastava
2025-04-28 18:21     ` Nicolin Chen
2025-04-29  8:31       ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 05/22] iommufd: Add iommufd_struct_destroy to revert iommufd_viommu_alloc Nicolin Chen
2025-04-27  6:55   ` Baolu Lu
2025-04-28 17:24     ` Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 06/22] iommufd/selftest: Support user_data in mock_viommu_alloc Nicolin Chen
2025-04-28 18:56   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 07/22] iommufd/selftest: Add covearge for viommu data Nicolin Chen
2025-04-28 19:02   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 08/22] iommufd: Abstract iopt_pin_pages and iopt_unpin_pages helpers Nicolin Chen
2025-04-27  7:22   ` Baolu Lu
2025-04-28 17:41     ` Nicolin Chen
2025-05-05 15:01       ` Jason Gunthorpe
2025-05-05 15:44         ` Nicolin Chen
2025-05-05 15:55           ` Jason Gunthorpe
2025-05-05 16:03             ` Nicolin Chen
2025-05-05 16:05               ` Jason Gunthorpe
2025-05-05 16:19                 ` Nicolin Chen
2025-05-05 16:56                   ` Jason Gunthorpe
2025-04-28 20:14   ` Pranjal Shrivastava
2025-04-28 22:12     ` Nicolin Chen
2025-04-28 23:34       ` Nicolin Chen
2025-04-29 18:03         ` Pranjal Shrivastava
2025-05-06  9:36   ` Tian, Kevin
2025-05-06 19:17     ` Nicolin Chen
2025-05-07  7:22       ` Tian, Kevin
2025-05-07  7:36         ` Nicolin Chen
2025-05-07  7:51           ` Tian, Kevin
2025-04-26  5:58 ` [PATCH v2 09/22] iommufd/viommu: Introduce IOMMUFD_OBJ_VCMDQ and its related struct Nicolin Chen
2025-04-28  1:09   ` Baolu Lu
2025-04-28 18:10     ` Nicolin Chen
2025-05-05 15:02       ` Jason Gunthorpe
2025-05-05 15:45         ` Nicolin Chen
2025-04-28 21:01   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 10/22] iommufd/viommmu: Add IOMMUFD_CMD_VCMDQ_ALLOC ioctl Nicolin Chen
2025-04-28  1:32   ` Baolu Lu
2025-04-28 18:58     ` Nicolin Chen
2025-04-29  6:11       ` Baolu Lu
2025-04-28 12:12   ` Vasant Hegde
2025-04-28 20:02     ` Nicolin Chen [this message]
2025-04-29  5:34       ` Vasant Hegde
2025-04-29  6:45         ` Nicolin Chen
2025-04-29 10:22           ` Vasant Hegde
2025-04-29 17:14             ` Nicolin Chen
2025-04-30  4:22               ` Vasant Hegde
2025-04-30  8:01                 ` Nicolin Chen
2025-04-30 10:21                   ` Vasant Hegde
2025-05-06  9:25               ` Tian, Kevin
2025-05-06 20:12                 ` Nicolin Chen
2025-05-07  7:25                   ` Tian, Kevin
2025-05-07  7:37                     ` Nicolin Chen
2025-05-07 12:33                       ` Jason Gunthorpe
2025-05-07 20:51                         ` Nicolin Chen
2025-04-28 21:34   ` Pranjal Shrivastava
2025-04-28 22:44     ` Nicolin Chen
2025-04-29  8:28       ` Pranjal Shrivastava
2025-04-29 18:10         ` Pranjal Shrivastava
2025-04-29 18:15           ` Nicolin Chen
2025-04-29 18:57             ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 11/22] iommufd: Add for-driver helpers iommufd_vcmdq_depend/undepend() Nicolin Chen
2025-04-28  2:22   ` Baolu Lu
2025-04-28 18:17     ` Nicolin Chen
2025-04-29 12:40   ` Pranjal Shrivastava
2025-04-29 17:10     ` Nicolin Chen
2025-04-29 17:59       ` Pranjal Shrivastava
2025-04-29 18:07         ` Nicolin Chen
2025-04-29 18:44           ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 12/22] iommufd/selftest: Add coverage for IOMMUFD_CMD_VCMDQ_ALLOC Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 13/22] iommufd: Add mmap interface Nicolin Chen
2025-04-28  2:50   ` Baolu Lu
2025-04-28 18:54     ` Nicolin Chen
2025-05-05 16:50     ` Jason Gunthorpe
2025-05-05 17:21       ` Nicolin Chen
2025-05-05 17:28         ` Jason Gunthorpe
2025-05-05 20:07           ` Nicolin Chen
2025-05-06  9:22             ` Tian, Kevin
2025-05-06 12:55               ` Jason Gunthorpe
2025-05-06 12:54             ` Jason Gunthorpe
2025-05-06 20:54               ` Nicolin Chen
2025-05-07 12:36                 ` Jason Gunthorpe
2025-05-07 20:49                   ` Nicolin Chen
2025-04-29 20:24   ` Pranjal Shrivastava
2025-04-29 20:34     ` Pranjal Shrivastava
2025-04-29 20:39       ` Nicolin Chen
2025-04-29 20:55         ` Pranjal Shrivastava
2025-04-29 21:05           ` Nicolin Chen
2025-04-29 21:35             ` Pranjal Shrivastava
2025-04-29 21:46               ` Nicolin Chen
2025-04-29 21:57                 ` Pranjal Shrivastava
2025-05-05 16:55                 ` Jason Gunthorpe
2025-05-05 17:27                   ` Nicolin Chen
2025-05-05 17:31                     ` Jason Gunthorpe
2025-05-05 19:50                       ` Nicolin Chen
2025-05-06 12:52                         ` Jason Gunthorpe
2025-05-06 19:30                           ` Nicolin Chen
2025-05-07 12:39                             ` Jason Gunthorpe
2025-05-07 21:09                               ` Nicolin Chen
2025-05-07 22:08                                 ` Jason Gunthorpe
2025-05-08  3:49                                   ` Nicolin Chen
2025-05-08  9:15                                     ` Tian, Kevin
2025-05-08 12:12                                       ` Jason Gunthorpe
2025-05-08 17:14                                         ` Nicolin Chen
2025-05-05 18:47                   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 14/22] iommufd/selftest: Add coverage for the new " Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 15/22] Documentation: userspace-api: iommufd: Update vCMDQ Nicolin Chen
2025-04-28 14:31   ` Bagas Sanjaya
2025-04-28 19:00     ` Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 16/22] iommu/arm-smmu-v3-iommufd: Add vsmmu_alloc impl op Nicolin Chen
2025-04-29 21:36   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 17/22] iommu/arm-smmu-v3-iommufd: Support implementation-defined hw_info Nicolin Chen
2025-04-29 21:44   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 18/22] iommu/tegra241-cmdqv: Use request_threaded_irq Nicolin Chen
2025-04-29 21:47   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 19/22] iommu/tegra241-cmdqv: Simplify deinit flow in tegra241_cmdqv_remove_vintf() Nicolin Chen
2025-04-29 22:05   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 20/22] iommu/tegra241-cmdqv: Do not statically map LVCMDQs Nicolin Chen
2025-04-29 20:43   ` ALOK TIWARI
2025-04-29 22:32   ` Pranjal Shrivastava
2025-04-29 22:37     ` Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 21/22] iommu/tegra241-cmdqv: Add user-space use support Nicolin Chen
2025-04-29 19:47   ` ALOK TIWARI
2025-04-29 21:12     ` Nicolin Chen
2025-04-30 21:59   ` Pranjal Shrivastava
2025-04-30 22:39     ` Nicolin Chen
2025-05-01  0:54       ` Nicolin Chen
2025-05-01 21:46         ` Pranjal Shrivastava
2025-05-01 21:45       ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 22/22] iommu/tegra241-cmdqv: Add IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV support Nicolin Chen
2025-04-30 15:07   ` ALOK TIWARI
2025-04-30 22:03   ` Pranjal Shrivastava

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=aA/exylmYJhIhEVL@Asurada-Nvidia \
    --to=nicolinc@nvidia.com \
    --cc=alok.a.tiwari@oracle.com \
    --cc=bagasdotme@gmail.com \
    --cc=corbet@lwn.net \
    --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=suravee.suthikulpanit@amd.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).