From: Mostafa Saleh <smostafa@google.com>
To: sashiko-reviews@lists.linux.dev
Cc: kvmarm@lists.linux.dev, Oliver Upton <oupton@kernel.org>,
Marc Zyngier <maz@kernel.org>
Subject: Re: [PATCH v8 07/25] KVM: arm64: iommu: Shadow host stage-2 page table
Date: Tue, 22 Sep 2026 14:29:10 +0000 [thread overview]
Message-ID: <arKQttZkiX-kqMZN@google.com> (raw)
In-Reply-To: <20260922132359.BB0381F000FF@smtp.kernel.org>
On Tue, Sep 22, 2026 at 01:23:59PM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [High] kvm: arm64: pkvm: guest-triggerable hyp panic due to WARN_ON misuse
> --
>
> commit 68e26689446b14f6e5c91a79e4493c62586f9fb4
> Author: Mostafa Saleh <smostafa@google.com>
> Subject: KVM: arm64: iommu: Shadow host stage-2 page table
>
> This commit creates a page-table for the IOMMU that shadows the host CPU
> stage-2 to establish DMA isolation. An initial snapshot is created after
> the driver init, and on permission changes, a callback updates the IOMMU
> page table.
>
> > diff --git a/arch/arm64/kvm/hyp/nvhe/iommu.c b/arch/arm64/kvm/hyp/nvhe/iommu.c
> > index ef456eff42d29..3637b0327d9e8 100644
> > --- a/arch/arm64/kvm/hyp/nvhe/iommu.c
> > +++ b/arch/arm64/kvm/hyp/nvhe/iommu.c
>
> [ ... ]
>
> > @@ -4,16 +4,138 @@
> > int pkvm_iommu_init(void)
> > {
> > + int ret;
> > +
> > /* Keep DMA isolation optional. */
> > - if (!pkvm_iommu_ops || !pkvm_iommu_ops->init)
> > + if (!pkvm_iommu_ops || !pkvm_iommu_ops->init ||
> > + !pkvm_iommu_ops->host_stage2_idmap)
> > return 0;
> >
> > - return pkvm_iommu_ops->init();
> > + ret = pkvm_iommu_ops->init();
> > + if (ret)
> > + return ret;
> > +
> > + return WARN_ON(pkvm_iommu_snapshot_host_stage2());
>
> [Severity: High]
> Does this unintentionally cause a hypervisor panic if the snapshot fails?
>
> At EL2 (nVHE/pKVM), WARN_ON expands to a fatal BRK instruction rather than
> a warn-and-continue. Wrapping a fallible operation like this triggers a
> panic during initialization instead of returning the error.
That is intentional as there is no roll-back beyond this point, this
pattern is commonly used with pKVM.
>
> > +}
>
> [ ... ]
>
> > diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> > index c1a8fd811c0fa..da5014e4e96b6 100644
> > --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> > +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
>
> [ ... ]
>
> > @@ -603,16 +604,15 @@ static int host_stage2_set_owner_metadata_locked(phys_addr_t addr, u64 size,
> > ret = host_stage2_try(kvm_pgtable_stage2_annotate, &host_mmu.pgt,
> > addr, size, &host_s2_pool,
> > KVM_HOST_INVALID_PTE_TYPE_DONATION, annotation);
> > - if (!ret) {
> > - /*
> > - * After stage2 maintenance has happened, but before the page
> > - * owner has changed.
> > - */
> > - pkvm_sme_dvmsync_fw_call();
> > - __host_update_page_state(addr, size, PKVM_NOPAGE);
> > - }
> > -
> > - return ret;
> > + if (ret)
> > + return ret;
> > + /*
> > + * After stage2 maintenance has happened, but before the page
> > + * owner has changed.
> > + */
> > + pkvm_sme_dvmsync_fw_call();
> > + __host_update_page_state(addr, size, PKVM_NOPAGE);
> > + return WARN_ON(pkvm_iommu_host_stage2_idmap(addr, addr + size, 0));
>
> [Severity: High]
> Does this create a dead-branch trap that skips rolling back the page state?
>
> Since WARN_ON acts as a panic at EL2, any failure in the IOMMU mapping call
> will immediately crash the hypervisor. It also leaves the earlier mutation
> from __host_update_page_state without a rollback path on failure.
This is added for readability, not really a problem.
>
> > }
> >
> > int host_stage2_set_owner_locked(phys_addr_t addr, u64 size, u8 owner_id)
> > @@ -625,8 +625,10 @@ int host_stage2_set_owner_locked(phys_addr_t addr, u64 size, u8 owner_id)
> > return -EPERM;
> >
> > ret = host_stage2_idmap_locked(addr, size, PKVM_HOST_MEM_PROT);
> > - if (!ret)
> > - __host_update_page_state(addr, size, PKVM_PAGE_OWNED);
> > + if (ret)
> > + break;
> > + __host_update_page_state(addr, size, PKVM_PAGE_OWNED);
> > + ret = WARN_ON(pkvm_iommu_host_stage2_idmap(addr, addr + size, PKVM_HOST_MEM_PROT));
>
> [Severity: High]
> Is it intentional that a failure here panics instead of returning the error?
>
> Assigning WARN_ON to a variable suggests an expectation that it returns,
> but at EL2 it triggers a fatal BRK instruction. This also leaves the prior
> page state update without a rollback.
No need for rollback as it panics.
>
> > break;
>
> [ ... ]
>
> > @@ -1029,6 +1031,7 @@ int __pkvm_guest_share_host(struct pkvm_hyp_vcpu *vcpu, u64 gfn)
> > pkvm_mkstate(KVM_PGTABLE_PROT_RWX, PKVM_PAGE_SHARED_OWNED),
> > &vcpu->vcpu.arch.pkvm_memcache, 0));
> > WARN_ON(__host_set_page_state_range(phys, PAGE_SIZE, PKVM_PAGE_SHARED_BORROWED));
> > + WARN_ON(pkvm_iommu_host_stage2_idmap(phys, phys + PAGE_SIZE, PKVM_HOST_MEM_PROT));
>
> [Severity: High]
> Can an untrusted guest intentionally trigger a host denial of service here?
>
> By triggering memory sharing hypercalls, a guest might exhaust the IOMMU
> page pool, forcing an allocation failure in pkvm_iommu_host_stage2_idmap.
> Wrapping this fallible outcome in WARN_ON will trigger a hypervisor panic.
>
The IOMMU can't be exhasuted by design, the same WARN_ON() exist in the
line above for the CPU page table update also.
Thanks,
Mostafa
> > unlock:
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20260922131259.2975334-1-smostafa@google.com?part=7
next prev parent reply other threads:[~2026-09-22 14:29 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-22 13:12 [PATCH v8 00/25] KVM: arm64: SMMUv3 driver for pKVM (trap and emulate) Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 01/25] KVM: arm64: Donate MMIO to the hypervisor Mostafa Saleh
2026-09-22 13:29 ` sashiko-bot
2026-09-22 14:25 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 02/25] iommu/arm-smmu-v3: Move Queue and STE functions to header Mostafa Saleh
2026-09-22 18:23 ` Nicolin Chen
2026-09-22 13:12 ` [PATCH v8 03/25] iommu/arm-smmu-v3: Introduce RangeInval encoding helpers Mostafa Saleh
2026-09-22 18:45 ` Nicolin Chen
2026-09-22 13:12 ` [PATCH v8 04/25] iommu/arm-smmu-v3: Move IDR parsing to common functions Mostafa Saleh
2026-09-22 19:45 ` Nicolin Chen
2026-09-22 21:48 ` Jason Gunthorpe
2026-09-23 10:13 ` Mostafa Saleh
2026-09-23 11:55 ` Jason Gunthorpe
2026-09-23 12:21 ` Mostafa Saleh
2026-09-23 10:09 ` Mostafa Saleh
2026-09-23 11:52 ` Jason Gunthorpe
2026-09-23 12:18 ` Mostafa Saleh
2026-09-23 12:34 ` Jason Gunthorpe
2026-09-22 13:12 ` [PATCH v8 05/25] iommu/arm-smmu-v3: Move hitless machinery to common code Mostafa Saleh
2026-09-22 19:59 ` Nicolin Chen
2026-09-23 10:15 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 06/25] KVM: arm64: iommu: Introduce IOMMU driver infrastructure Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 07/25] KVM: arm64: iommu: Shadow host stage-2 page table Mostafa Saleh
2026-09-22 13:23 ` sashiko-bot
2026-09-22 14:29 ` Mostafa Saleh [this message]
2026-09-22 13:12 ` [PATCH v8 08/25] KVM: arm64: iommu: Add memory pool Mostafa Saleh
2026-09-22 13:25 ` sashiko-bot
2026-09-22 14:34 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 09/25] KVM: arm64: iommu: Support DABT for IOMMU Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 10/25] iommu/arm-smmu-v3-kvm: Add SMMUv3 driver Mostafa Saleh
2026-09-22 22:39 ` Nicolin Chen
2026-09-23 10:30 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 11/25] iommu/arm-smmu-v3-kvm: Add the kernel driver Mostafa Saleh
2026-09-22 13:28 ` sashiko-bot
2026-09-22 15:12 ` Mostafa Saleh
2026-09-23 0:22 ` Nicolin Chen
2026-09-23 11:52 ` Mostafa Saleh
2026-09-23 15:55 ` Jason Gunthorpe
2026-09-23 17:07 ` Mostafa Saleh
2026-09-23 17:22 ` Jason Gunthorpe
2026-09-22 13:12 ` [PATCH v8 12/25] iommu/arm-smmu-v3-kvm: Probe SMMU HW Mostafa Saleh
2026-09-23 1:43 ` Nicolin Chen
2026-09-23 12:03 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 13/25] iommu/arm-smmu-v3-kvm: Add MMIO emulation Mostafa Saleh
2026-09-22 13:22 ` sashiko-bot
2026-09-22 15:30 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 14/25] iommu/arm-smmu-v3-kvm: Shadow the command queue Mostafa Saleh
2026-09-22 13:32 ` sashiko-bot
2026-09-22 15:34 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 15/25] iommu/arm-smmu-v3-kvm: Add CMDQ functions Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 16/25] iommu/arm-smmu-v3-kvm: Emulate CMDQ for host Mostafa Saleh
2026-09-22 13:32 ` sashiko-bot
2026-09-22 15:48 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 17/25] iommu/arm-smmu-v3-kvm: Shadow stream table Mostafa Saleh
2026-09-22 13:33 ` sashiko-bot
2026-09-22 15:50 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 18/25] iommu/arm-smmu-v3-kvm: Shadow STEs Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 19/25] iommu/arm-smmu-v3-kvm: Share other queues Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 20/25] iommu/arm-smmu-v3-kvm: Emulate GBPA Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 21/25] iommu/io-pgtable-arm: Support io-pgtable-arm in the hypervisor Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 22/25] iommu/arm-smmu-v3-kvm: Shadow the CPU stage-2 page table Mostafa Saleh
2026-09-22 13:38 ` sashiko-bot
2026-09-22 15:52 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 23/25] iommu/arm-smmu-v3-kvm: Invalidate the SMMU TLBs Mostafa Saleh
2026-09-22 13:45 ` sashiko-bot
2026-09-22 15:55 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 24/25] iommu/arm-smmu-v3-kvm: Enable nesting Mostafa Saleh
2026-09-22 13:49 ` sashiko-bot
2026-09-22 15:57 ` Mostafa Saleh
2026-09-22 13:12 ` [PATCH v8 25/25] KVM: arm64: Add documentation for pKVM DMA isolation Mostafa Saleh
2026-09-22 18:07 ` [PATCH v8 00/25] KVM: arm64: SMMUv3 driver for pKVM (trap and emulate) Nicolin Chen
2026-09-23 8:52 ` 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=arKQttZkiX-kqMZN@google.com \
--to=smostafa@google.com \
--cc=kvmarm@lists.linux.dev \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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.