From: Pranjal Shrivastava <praan@google.com>
To: Nicolin Chen <nicolinc@nvidia.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, 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
Subject: Re: [PATCH v2 20/22] iommu/tegra241-cmdqv: Do not statically map LVCMDQs
Date: Tue, 29 Apr 2025 22:32:19 +0000 [thread overview]
Message-ID: <aBFTc1Q1r_jrnJ63@google.com> (raw)
In-Reply-To: <3981a819a4714b21d11d5c6de561a2d0c6411947.1745646960.git.nicolinc@nvidia.com>
On Fri, Apr 25, 2025 at 10:58:15PM -0700, Nicolin Chen wrote:
> To simplify the mappings from global VCMDQs to VINTFs' LVCMDQs, the design
> chose to do static allocations and mappings in the global reset function.
>
> However, with the user-owned VINTF support, it exposes a security concern:
> if user space VM only wants one LVCMDQ for a VINTF, statically mapping two
> LVCMDQs creates a hidden VCMDQ that user space could DoS attack by writing
> ramdon stuff to overwhelm the kernel with unhandleable IRQs.
>
Nit: I think it's worth mentioning that the current HW only supports 2
LVCMDQs. Since it's not clear from the driver as it calculates this by:
regval = readl_relaxed(REG_CMDQV(cmdqv, PARAM));
cmdqv->num_vintfs = 1 << FIELD_GET(CMDQV_NUM_VINTF_LOG2,regval);
cmdqv->num_vcmdqs = 1 << FIELD_GET(CMDQV_NUM_VCMDQ_LOG2, regval);
cmdqv->num_lvcmdqs_per_vintf = cmdqv->num_vcmdqs / cmdqv->num_vintfs;
Or maybe, re-word it to "if user space VM only wants one LVCMDQ for a
VINTF, the current driver statically maps num_lvcmdqs_per_vintf which
creates hidden vCMDQs [..]"
> Thus, to support the user-owned VINTF feature, a LVCMDQ mapping has to be
> done dynamically.
>
> HW allows pre-assigning global VCMDQs in the CMDQ_ALLOC registers, without
> finalizing the mappings by keeping CMDQV_CMDQ_ALLOCATED=0. So, add a pair
> of map/unmap helper that simply sets/clears that bit.
>
> Delay the LVCMDQ mappings to tegra241_vintf_hw_init(), and the unmappings
> to tegra241_vintf_hw_deinit().
>
> However, the dynamic LVCMDQ mapping/unmapping can complicate the timing of
> calling tegra241_vcmdq_hw_init/deinit(), which write LVCMDQ address space,
> i.e. requiring LVCMDQ to be mapped. Highlight that with a note to the top
> of either of them.
>
> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
> ---
> .../iommu/arm/arm-smmu-v3/tegra241-cmdqv.c | 37 +++++++++++++++++--
> 1 file changed, 33 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
> index 8d418c131b1b..869c90b660c1 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
> +++ b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
> @@ -351,6 +351,7 @@ tegra241_cmdqv_get_cmdq(struct arm_smmu_device *smmu,
>
> /* HW Reset Functions */
>
> +/* This function is for LVCMDQ, so @vcmdq must not be unmapped yet */
> static void tegra241_vcmdq_hw_deinit(struct tegra241_vcmdq *vcmdq)
> {
> char header[64], *h = lvcmdq_error_header(vcmdq, header, 64);
> @@ -379,6 +380,7 @@ static void tegra241_vcmdq_hw_deinit(struct tegra241_vcmdq *vcmdq)
> dev_dbg(vcmdq->cmdqv->dev, "%sdeinited\n", h);
> }
>
> +/* This function is for LVCMDQ, so @vcmdq must be mapped prior */
> static int tegra241_vcmdq_hw_init(struct tegra241_vcmdq *vcmdq)
> {
> char header[64], *h = lvcmdq_error_header(vcmdq, header, 64);
> @@ -404,16 +406,42 @@ static int tegra241_vcmdq_hw_init(struct tegra241_vcmdq *vcmdq)
> return 0;
> }
>
> +/* Unmap a global VCMDQ from the pre-assigned LVCMDQ */
> +static void tegra241_vcmdq_unmap_lvcmdq(struct tegra241_vcmdq *vcmdq)
> +{
> + u32 regval = readl(REG_CMDQV(vcmdq->cmdqv, CMDQ_ALLOC(vcmdq->idx)));
> + char header[64], *h = lvcmdq_error_header(vcmdq, header, 64);
> +
> + writel(regval & ~CMDQV_CMDQ_ALLOCATED,
> + REG_CMDQV(vcmdq->cmdqv, CMDQ_ALLOC(vcmdq->idx)));
> + dev_dbg(vcmdq->cmdqv->dev, "%sunmapped\n", h);
> +}
> +
> static void tegra241_vintf_hw_deinit(struct tegra241_vintf *vintf)
> {
> - u16 lidx;
> + u16 lidx = vintf->cmdqv->num_lvcmdqs_per_vintf;
>
> - for (lidx = 0; lidx < vintf->cmdqv->num_lvcmdqs_per_vintf; lidx++)
> - if (vintf->lvcmdqs && vintf->lvcmdqs[lidx])
> + /* HW requires to unmap LVCMDQs in descending order */
> + while (lidx--) {
> + if (vintf->lvcmdqs && vintf->lvcmdqs[lidx]) {
> tegra241_vcmdq_hw_deinit(vintf->lvcmdqs[lidx]);
> + tegra241_vcmdq_unmap_lvcmdq(vintf->lvcmdqs[lidx]);
> + }
> + }
> vintf_write_config(vintf, 0);
> }
>
> +/* Map a global VCMDQ to the pre-assigned LVCMDQ */
> +static void tegra241_vcmdq_map_lvcmdq(struct tegra241_vcmdq *vcmdq)
> +{
> + u32 regval = readl(REG_CMDQV(vcmdq->cmdqv, CMDQ_ALLOC(vcmdq->idx)));
> + char header[64], *h = lvcmdq_error_header(vcmdq, header, 64);
> +
> + writel(regval | CMDQV_CMDQ_ALLOCATED,
> + REG_CMDQV(vcmdq->cmdqv, CMDQ_ALLOC(vcmdq->idx)));
> + dev_dbg(vcmdq->cmdqv->dev, "%smapped\n", h);
> +}
> +
> static int tegra241_vintf_hw_init(struct tegra241_vintf *vintf, bool hyp_own)
> {
> u32 regval;
> @@ -441,8 +469,10 @@ static int tegra241_vintf_hw_init(struct tegra241_vintf *vintf, bool hyp_own)
> */
> vintf->hyp_own = !!(VINTF_HYP_OWN & readl(REG_VINTF(vintf, CONFIG)));
>
> + /* HW requires to map LVCMDQs in ascending order */
> for (lidx = 0; lidx < vintf->cmdqv->num_lvcmdqs_per_vintf; lidx++) {
> if (vintf->lvcmdqs && vintf->lvcmdqs[lidx]) {
> + tegra241_vcmdq_map_lvcmdq(vintf->lvcmdqs[lidx]);
> ret = tegra241_vcmdq_hw_init(vintf->lvcmdqs[lidx]);
> if (ret) {
> tegra241_vintf_hw_deinit(vintf);
> @@ -476,7 +506,6 @@ static int tegra241_cmdqv_hw_reset(struct arm_smmu_device *smmu)
> for (lidx = 0; lidx < cmdqv->num_lvcmdqs_per_vintf; lidx++) {
> regval = FIELD_PREP(CMDQV_CMDQ_ALLOC_VINTF, idx);
> regval |= FIELD_PREP(CMDQV_CMDQ_ALLOC_LVCMDQ, lidx);
> - regval |= CMDQV_CMDQ_ALLOCATED;
> writel_relaxed(regval,
> REG_CMDQV(cmdqv, CMDQ_ALLOC(qidx++)));
> }
I can't confirm HW behaviour but the changes make sense to me.
Acked-by: Pranjal Shrivastava <praan@google.com>
Thanks!
> --
> 2.43.0
>
next prev parent reply other threads:[~2025-04-29 22:36 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
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 [this message]
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=aBFTc1Q1r_jrnJ63@google.com \
--to=praan@google.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=nicolinc@nvidia.com \
--cc=patches@lists.linux.dev \
--cc=peterz@infradead.org \
--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.