From: Will Deacon <will@kernel.org>
To: Mark Rutland <mark.rutland@arm.com>
Cc: kvmarm@lists.linux.dev, Sean Christopherson <seanjc@google.com>,
Vincent Donnefort <vdonnefort@google.com>,
Alexandru Elisei <alexandru.elisei@arm.com>,
Catalin Marinas <catalin.marinas@arm.com>,
James Morse <james.morse@arm.com>,
Chao Peng <chao.p.peng@linux.intel.com>,
Quentin Perret <qperret@google.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Fuad Tabba <tabba@google.com>,
Oliver Upton <oliver.upton@linux.dev>,
Marc Zyngier <maz@kernel.org>,
kernel-team@android.com, kvm@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v4 14/25] KVM: arm64: Add per-cpu fixmap infrastructure at EL2
Date: Tue, 18 Oct 2022 15:05:14 +0100 [thread overview]
Message-ID: <20221018140514.GA3323@willie-the-truck> (raw)
In-Reply-To: <Y06Iihi/RPAOMuwR@FVFF77S0Q05N>
Hi Mark,
Cheers for having a look.
On Tue, Oct 18, 2022 at 12:06:14PM +0100, Mark Rutland wrote:
> On Mon, Oct 17, 2022 at 12:51:58PM +0100, Will Deacon wrote:
> > diff --git a/arch/arm64/kvm/hyp/nvhe/mm.c b/arch/arm64/kvm/hyp/nvhe/mm.c
> > index d3a3b47181de..b77215630d5c 100644
> > --- a/arch/arm64/kvm/hyp/nvhe/mm.c
> > +++ b/arch/arm64/kvm/hyp/nvhe/mm.c
> > @@ -14,6 +14,7 @@
> > #include <nvhe/early_alloc.h>
> > #include <nvhe/gfp.h>
> > #include <nvhe/memory.h>
> > +#include <nvhe/mem_protect.h>
> > #include <nvhe/mm.h>
> > #include <nvhe/spinlock.h>
> >
> > @@ -25,6 +26,12 @@ unsigned int hyp_memblock_nr;
> >
> > static u64 __io_map_base;
> >
> > +struct hyp_fixmap_slot {
> > + u64 addr;
> > + kvm_pte_t *ptep;
> > +};
> > +static DEFINE_PER_CPU(struct hyp_fixmap_slot, fixmap_slots);
> > +
> > static int __pkvm_create_mappings(unsigned long start, unsigned long size,
> > unsigned long phys, enum kvm_pgtable_prot prot)
> > {
> > @@ -212,6 +219,93 @@ int hyp_map_vectors(void)
> > return 0;
> > }
> >
> > +void *hyp_fixmap_map(phys_addr_t phys)
> > +{
> > + struct hyp_fixmap_slot *slot = this_cpu_ptr(&fixmap_slots);
> > + kvm_pte_t pte, *ptep = slot->ptep;
> > +
> > + pte = *ptep;
> > + pte &= ~kvm_phys_to_pte(KVM_PHYS_INVALID);
> > + pte |= kvm_phys_to_pte(phys) | KVM_PTE_VALID;
> > + WRITE_ONCE(*ptep, pte);
> > + dsb(nshst);
> > +
> > + return (void *)slot->addr;
> > +}
> > +
> > +static void fixmap_clear_slot(struct hyp_fixmap_slot *slot)
> > +{
> > + kvm_pte_t *ptep = slot->ptep;
> > + u64 addr = slot->addr;
> > +
> > + WRITE_ONCE(*ptep, *ptep & ~KVM_PTE_VALID);
> > + dsb(nshst);
> > + __tlbi_level(vale2, __TLBI_VADDR(addr, 0), (KVM_PGTABLE_MAX_LEVELS - 1));
> > + dsb(nsh);
> > + isb();
> > +}
>
> Does each CPU have independent Stage-1 tables at EL2? i.e. each has a distinct
> root table?
No, the CPUs share the same stage-1 table at EL2.
> If the tables are shared, you need broadcast maintenance and ISH barriers here,
> or you risk the usual issues with asynchronous MMU behaviour.
Can you elaborate a bit, please? What we're trying to do is reserve a page
of VA space for each CPU, which is only ever accessed explicitly by that
CPU using a normal memory mapping. The fixmap code therefore just updates
the relevant leaf entry for the CPU on which we're running and the TLBI
is there to ensure that the new mapping takes effect.
If another CPU speculatively walks another CPU's fixmap slot, then I agree
that it could access that page after the slot had been cleared. Although
I can see theoretical security arguments around avoiding that situation,
there's a very real performance cost to broadcast invalidation that we
were hoping to avoid on this fast path.
Of course, in the likely event that I've purged "the usual issues" from
my head and we need broadcasting for _correctness_, then we'll just have
to suck it up!
Cheers,
Will
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-10-18 14:06 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-17 11:51 [PATCH v4 00/25] KVM: arm64: Introduce pKVM hyp VM and vCPU state at EL2 Will Deacon
2022-10-17 11:51 ` [PATCH v4 01/25] KVM: arm64: Move hyp refcount manipulation helpers to common header file Will Deacon
2022-10-17 20:29 ` Philippe Mathieu-Daudé
2022-10-17 11:51 ` [PATCH v4 02/25] KVM: arm64: Allow attaching of non-coalescable pages to a hyp pool Will Deacon
2022-10-17 11:51 ` [PATCH v4 03/25] KVM: arm64: Back the hypervisor 'struct hyp_page' array for all memory Will Deacon
2022-10-17 11:51 ` [PATCH v4 04/25] KVM: arm64: Fix-up hyp stage-1 refcounts for all pages mapped at EL2 Will Deacon
2022-10-17 11:51 ` [PATCH v4 05/25] KVM: arm64: Unify identifiers used to distinguish host and hypervisor Will Deacon
2022-10-17 20:21 ` Philippe Mathieu-Daudé
2022-10-17 11:51 ` [PATCH v4 06/25] KVM: arm64: Implement do_donate() helper for donating memory Will Deacon
2022-10-17 11:51 ` [PATCH v4 07/25] KVM: arm64: Prevent the donation of no-map pages Will Deacon
2022-10-18 13:42 ` Philippe Mathieu-Daudé
2022-10-17 11:51 ` [PATCH v4 08/25] KVM: arm64: Add helpers to pin memory shared with the hypervisor at EL2 Will Deacon
2022-10-17 11:51 ` [PATCH v4 09/25] KVM: arm64: Include asm/kvm_mmu.h in nvhe/mem_protect.h Will Deacon
2022-10-17 20:22 ` Philippe Mathieu-Daudé
2022-10-17 11:51 ` [PATCH v4 10/25] KVM: arm64: Add hyp_spinlock_t static initializer Will Deacon
2022-10-18 13:51 ` Philippe Mathieu-Daudé
2022-10-17 11:51 ` [PATCH v4 11/25] KVM: arm64: Rename 'host_kvm' to 'host_mmu' Will Deacon
2022-10-18 13:47 ` Philippe Mathieu-Daudé
2022-10-17 11:51 ` [PATCH v4 12/25] KVM: arm64: Add infrastructure to create and track pKVM instances at EL2 Will Deacon
2022-10-18 15:13 ` Quentin Perret
2022-10-19 12:35 ` Will Deacon
2022-10-18 16:21 ` Quentin Perret
2022-10-19 12:45 ` Will Deacon
2022-10-18 16:33 ` Quentin Perret
2022-10-19 11:57 ` Will Deacon
2022-10-19 13:35 ` Quentin Perret
2022-10-18 16:40 ` Quentin Perret
2022-10-19 12:44 ` Will Deacon
2022-10-18 16:45 ` Quentin Perret
2022-10-19 12:18 ` Fuad Tabba
2022-10-17 11:51 ` [PATCH v4 13/25] KVM: arm64: Instantiate pKVM hypervisor VM and vCPU structures from EL1 Will Deacon
2022-10-19 15:46 ` Quentin Perret
2022-10-19 16:00 ` Quentin Perret
2022-10-19 16:34 ` Will Deacon
2022-10-17 11:51 ` [PATCH v4 14/25] KVM: arm64: Add per-cpu fixmap infrastructure at EL2 Will Deacon
2022-10-18 11:06 ` Mark Rutland
2022-10-18 14:05 ` Will Deacon [this message]
2022-10-18 16:52 ` Mark Rutland
2022-10-19 12:01 ` Will Deacon
2022-10-17 11:51 ` [PATCH v4 15/25] KVM: arm64: Initialise hypervisor copies of host symbols unconditionally Will Deacon
2022-10-17 20:26 ` Philippe Mathieu-Daudé
2022-10-17 11:52 ` [PATCH v4 16/25] KVM: arm64: Provide I-cache invalidation by virtual address at EL2 Will Deacon
2022-10-17 11:52 ` [PATCH v4 17/25] KVM: arm64: Add generic hyp_memcache helpers Will Deacon
2022-10-17 11:52 ` [PATCH v4 18/25] KVM: arm64: Consolidate stage-2 initialisation into a single function Will Deacon
2022-10-17 11:52 ` [PATCH v4 19/25] KVM: arm64: Instantiate guest stage-2 page-tables at EL2 Will Deacon
2022-10-17 11:52 ` [PATCH v4 20/25] KVM: arm64: Return guest memory from EL2 via dedicated teardown memcache Will Deacon
2022-10-19 15:52 ` Quentin Perret
2022-10-19 16:24 ` Will Deacon
2022-10-17 11:52 ` [PATCH v4 21/25] KVM: arm64: Unmap 'kvm_arm_hyp_percpu_base' from the host Will Deacon
2022-10-17 11:52 ` [PATCH v4 22/25] KVM: arm64: Maintain a copy of 'kvm_arm_vmid_bits' at EL2 Will Deacon
2022-10-17 11:52 ` [PATCH v4 23/25] KVM: arm64: Explicitly map 'kvm_vgic_global_state' " Will Deacon
2022-10-17 11:52 ` [PATCH v4 24/25] KVM: arm64: Don't unnecessarily map host kernel sections " Will Deacon
2022-10-17 11:52 ` [PATCH v4 25/25] KVM: arm64: Use the pKVM hyp vCPU structure in handle___kvm_vcpu_run() Will Deacon
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=20221018140514.GA3323@willie-the-truck \
--to=will@kernel.org \
--cc=alexandru.elisei@arm.com \
--cc=catalin.marinas@arm.com \
--cc=chao.p.peng@linux.intel.com \
--cc=james.morse@arm.com \
--cc=kernel-team@android.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=qperret@google.com \
--cc=seanjc@google.com \
--cc=suzuki.poulose@arm.com \
--cc=tabba@google.com \
--cc=vdonnefort@google.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