From: Mostafa Saleh <smostafa@google.com>
To: Will Deacon <will@kernel.org>
Cc: linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev,
linux-arm-kernel@lists.infradead.org, iommu@lists.linux.dev,
maz@kernel.org, oliver.upton@linux.dev, joey.gouly@arm.com,
suzuki.poulose@arm.com, yuzenghui@huawei.com,
catalin.marinas@arm.com, robin.murphy@arm.com,
jean-philippe@linaro.org, qperret@google.com, tabba@google.com,
jgg@ziepe.ca, mark.rutland@arm.com, praan@google.com
Subject: Re: [PATCH v4 22/28] iommu/arm-smmu-v3-kvm: Emulate CMDQ for host
Date: Tue, 16 Sep 2025 14:50:18 +0000 [thread overview]
Message-ID: <aMl5Ku6ZbzTOuGh-@google.com> (raw)
In-Reply-To: <aMQroI4NDu74PDGT@willie-the-truck>
On Fri, Sep 12, 2025 at 03:18:08PM +0100, Will Deacon wrote:
> On Tue, Aug 19, 2025 at 09:51:50PM +0000, Mostafa Saleh wrote:
> > Don’t allow access to the command queue from the host:
> > - ARM_SMMU_CMDQ_BASE: Only allowed to be written when CMDQ is disabled, we
> > use it to keep track of the host command queue base.
> > Reads return the saved value.
> > - ARM_SMMU_CMDQ_PROD: Writes trigger command queue emulation which sanitises
> > and filters the whole range. Reads returns the host copy.
> > - ARM_SMMU_CMDQ_CONS: Writes move the sw copy of the cons, but the host can’t
> > skip commands once submitted. Reads return the emulated value and the error
> > bits in the actual cons.
> >
> > Signed-off-by: Mostafa Saleh <smostafa@google.com>
> > ---
> > .../iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c | 108 +++++++++++++++++-
> > 1 file changed, 105 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c
> > index 554229e466f3..10c6461bbf12 100644
> > --- a/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c
> > +++ b/drivers/iommu/arm/arm-smmu-v3/pkvm/arm-smmu-v3.c
> > @@ -325,6 +325,88 @@ static bool is_cmdq_enabled(struct hyp_arm_smmu_v3_device *smmu)
> > return FIELD_GET(CR0_CMDQEN, smmu->cr0);
> > }
> >
> > +static bool smmu_filter_command(struct hyp_arm_smmu_v3_device *smmu, u64 *command)
> > +{
> > + u64 type = FIELD_GET(CMDQ_0_OP, command[0]);
> > +
> > + switch (type) {
> > + case CMDQ_OP_CFGI_STE:
> > + /* TBD: SHADOW_STE*/
> > + break;
> > + case CMDQ_OP_CFGI_ALL:
> > + {
> > + /*
> > + * Linux doesn't use range STE invalidation, and only use this
> > + * for CFGI_ALL, which is done on reset and not on an new STE
> > + * being used.
> > + * Although, this is not architectural we rely on the current Linux
> > + * implementation.
> > + */
> > + WARN_ON((FIELD_GET(CMDQ_CFGI_1_RANGE, command[1]) != 31));
> > + break;
> > + }
> > + case CMDQ_OP_TLBI_NH_ASID:
> > + case CMDQ_OP_TLBI_NH_VA:
> > + case 0x13: /* CMD_TLBI_NH_VAA: Not used by Linux */
> > + {
> > + /* Only allow VMID = 0*/
> > + if (FIELD_GET(CMDQ_TLBI_0_VMID, command[0]) == 0)
> > + break;
> > + break;
> > + }
> > + case 0x10: /* CMD_TLBI_NH_ALL: Not used by Linux */
> > + case CMDQ_OP_TLBI_EL2_ALL:
> > + case CMDQ_OP_TLBI_EL2_VA:
> > + case CMDQ_OP_TLBI_EL2_ASID:
> > + case CMDQ_OP_TLBI_S12_VMALL:
> > + case 0x23: /* CMD_TLBI_EL2_VAA: Not used by Linux */
> > + /* Malicous host */
> > + return WARN_ON(true);
> > + case CMDQ_OP_CMD_SYNC:
> > + if (FIELD_GET(CMDQ_SYNC_0_CS, command[0]) == CMDQ_SYNC_0_CS_IRQ) {
> > + /* Allow it, but let the host timeout, as this should never happen. */
> > + command[0] &= ~CMDQ_SYNC_0_CS;
> > + command[0] |= FIELD_PREP(CMDQ_SYNC_0_CS, CMDQ_SYNC_0_CS_SEV);
> > + command[1] &= ~CMDQ_SYNC_1_MSIADDR_MASK;
> > + }
> > + break;
> > + }
> > +
> > + return false;
> > +}
> > +
> > +static void smmu_emulate_cmdq_insert(struct hyp_arm_smmu_v3_device *smmu)
> > +{
> > + u64 *host_cmdq = hyp_phys_to_virt(smmu->cmdq_host.q_base & Q_BASE_ADDR_MASK);
> > + int idx;
> > + u64 cmd[CMDQ_ENT_DWORDS];
> > + bool skip;
> > +
> > + if (!is_cmdq_enabled(smmu))
> > + return;
> > +
> > + while (!queue_empty(&smmu->cmdq_host.llq)) {
> > + /* Wait for the command queue to have some space. */
> > + WARN_ON(smmu_wait_event(smmu, !smmu_cmdq_full(&smmu->cmdq)));
> > +
> > + idx = Q_IDX(&smmu->cmdq_host.llq, smmu->cmdq_host.llq.cons);
> > + /* Avoid TOCTOU */
> > + memcpy(cmd, &host_cmdq[idx * CMDQ_ENT_DWORDS], CMDQ_ENT_DWORDS << 3);
> > + skip = smmu_filter_command(smmu, cmd);
> > + if (!skip)
> > + smmu_add_cmd_raw(smmu, cmd);
> > + queue_inc_cons(&smmu->cmdq_host.llq);
> > + }
>
> Hmmm. There's something I'd not considered before here.
>
> Ideally, the data structures that are shadowed by the hypervisor would
> be mapped as normal-WB cacheable in both the host and the hypervisor so
> we don't have to worry about coherency and we get the performance
> benefits from the caches. Indeed, I think that's how you've mapped
> 'host_cmdq' above _however_ I sadly don't think we can do that if the
> actual SMMU hardware isn't coherent.
>
> We don't have a way to say things like "The STEs and CMDQ are coherent
> but the CDs and Stage-1 page-tables aren't" so that means we have to
> treat the shadowed structures populated by the host in the same way as
> the host-owned structures that are consumed directly by the hardware.
> Consequently, we should either be using non-cacheable mappings at EL2
> for these structures or doing CMOs around the accesses.
Thanks for catching that, I missed it, I think we can keep the host shared
as cacheable, and use CMOs when accessing it, I will have a closer look.
Thanks,
Mostafa
>
> Will
next prev parent reply other threads:[~2025-09-16 14:50 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-19 21:51 [PATCH v4 00/28] KVM: arm64: SMMUv3 driver for pKVM (trap and emulate) Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 01/28] KVM: arm64: Add a new function to donate memory with prot Mostafa Saleh
2025-09-09 13:46 ` Will Deacon
2025-09-14 19:23 ` Pranjal Shrivastava
2025-09-16 11:58 ` Mostafa Saleh
2025-09-16 11:56 ` Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 02/28] KVM: arm64: Donate MMIO to the hypervisor Mostafa Saleh
2025-09-09 14:12 ` Will Deacon
2025-09-16 13:27 ` Mostafa Saleh
2025-09-26 14:33 ` Will Deacon
2025-09-29 10:57 ` Mostafa Saleh
2025-09-14 20:41 ` Pranjal Shrivastava
2025-09-16 13:43 ` Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 03/28] KVM: arm64: pkvm: Add pkvm_time_get() Mostafa Saleh
2025-09-09 14:16 ` Will Deacon
2025-09-09 15:56 ` Marc Zyngier
2025-09-15 11:10 ` Pranjal Shrivastava
2025-09-16 14:04 ` Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 04/28] iommu/io-pgtable-arm: Move selftests to a separate file Mostafa Saleh
2025-09-15 14:37 ` Pranjal Shrivastava
2025-09-16 14:07 ` Mostafa Saleh
2025-09-15 16:45 ` Jason Gunthorpe
2025-09-16 14:09 ` Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 05/28] iommu/io-pgtable-arm: Factor kernel specific code out Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 06/28] iommu/arm-smmu-v3: Split code with hyp Mostafa Saleh
2025-09-09 14:23 ` Will Deacon
2025-09-16 14:10 ` Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 07/28] iommu/arm-smmu-v3: Move TLB range invalidation into a macro Mostafa Saleh
2025-09-09 14:25 ` Will Deacon
2025-08-19 21:51 ` [PATCH v4 08/28] iommu/arm-smmu-v3: Move IDR parsing to common functions Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 09/28] KVM: arm64: iommu: Introduce IOMMU driver infrastructure Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 10/28] KVM: arm64: iommu: Shadow host stage-2 page table Mostafa Saleh
2025-09-09 14:42 ` Will Deacon
2025-09-16 14:24 ` Mostafa Saleh
2025-09-26 14:42 ` Will Deacon
2025-09-29 11:01 ` Mostafa Saleh
2025-09-30 12:38 ` Jason Gunthorpe
2025-09-30 12:55 ` Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 11/28] KVM: arm64: iommu: Add memory pool Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 12/28] KVM: arm64: iommu: Support DABT for IOMMU Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 13/28] iommu/arm-smmu-v3-kvm: Add SMMUv3 driver Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 14/28] iommu/arm-smmu-v3: Add KVM mode in the driver Mostafa Saleh
2025-09-12 13:52 ` Will Deacon
2025-09-16 14:30 ` Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 15/28] iommu/arm-smmu-v3: Load the driver later in KVM mode Mostafa Saleh
2025-09-12 13:54 ` Will Deacon
2025-09-23 14:35 ` Mostafa Saleh
2025-09-23 17:38 ` Jason Gunthorpe
2025-09-29 11:10 ` Mostafa Saleh
2025-10-02 15:13 ` Jason Gunthorpe
2025-11-05 16:40 ` Mostafa Saleh
2025-11-05 17:12 ` Jason Gunthorpe
2025-11-06 11:06 ` Mostafa Saleh
2025-11-06 13:23 ` Jason Gunthorpe
2025-11-06 16:54 ` Mostafa Saleh
2025-11-06 17:16 ` Jason Gunthorpe
2025-08-19 21:51 ` [PATCH v4 16/28] iommu/arm-smmu-v3-kvm: Create array for hyp SMMUv3 Mostafa Saleh
2025-09-09 18:30 ` Daniel Mentz
2025-09-16 14:35 ` Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 17/28] iommu/arm-smmu-v3-kvm: Take over SMMUs Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 18/28] iommu/arm-smmu-v3-kvm: Probe SMMU HW Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 19/28] iommu/arm-smmu-v3-kvm: Add MMIO emulation Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 20/28] iommu/arm-smmu-v3-kvm: Shadow the command queue Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 21/28] iommu/arm-smmu-v3-kvm: Add CMDQ functions Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 22/28] iommu/arm-smmu-v3-kvm: Emulate CMDQ for host Mostafa Saleh
2025-09-12 14:18 ` Will Deacon
2025-09-15 16:38 ` Jason Gunthorpe
2025-09-16 15:19 ` Mostafa Saleh
2025-09-17 12:36 ` Jason Gunthorpe
2025-09-17 15:01 ` Will Deacon
2025-09-17 15:16 ` Jason Gunthorpe
2025-09-17 15:25 ` Will Deacon
2025-09-17 15:59 ` Jason Gunthorpe
2025-09-18 10:26 ` Will Deacon
2025-09-18 14:36 ` Jason Gunthorpe
2025-09-16 14:50 ` Mostafa Saleh [this message]
2025-08-19 21:51 ` [PATCH v4 23/28] iommu/arm-smmu-v3-kvm: Shadow stream table Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 24/28] iommu/arm-smmu-v3-kvm: Shadow STEs Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 25/28] iommu/arm-smmu-v3-kvm: Emulate GBPA Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 26/28] iommu/arm-smmu-v3-kvm: Support io-pgtable Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 27/28] iommu/arm-smmu-v3-kvm: Shadow the CPU stage-2 page table Mostafa Saleh
2025-08-19 21:51 ` [PATCH v4 28/28] iommu/arm-smmu-v3-kvm: Enable nesting Mostafa Saleh
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=aMl5Ku6ZbzTOuGh-@google.com \
--to=smostafa@google.com \
--cc=catalin.marinas@arm.com \
--cc=iommu@lists.linux.dev \
--cc=jean-philippe@linaro.org \
--cc=jgg@ziepe.ca \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=praan@google.com \
--cc=qperret@google.com \
--cc=robin.murphy@arm.com \
--cc=suzuki.poulose@arm.com \
--cc=tabba@google.com \
--cc=will@kernel.org \
--cc=yuzenghui@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.