[PATCH v3 04/18] KVM: arm64: Move host page ownership tracking to the hyp vmemmap
Quentin Perret
qperret at google.com
Tue Dec 17 05:09:19 PST 2024
On Tuesday 17 Dec 2024 at 11:03:08 (+0000), Marc Zyngier wrote:
> On Mon, 16 Dec 2024 17:57:49 +0000,
> Quentin Perret <qperret at google.com> wrote:
> >
> > We currently store part of the page-tracking state in PTE software bits
> > for the host, guests and the hypervisor. This is sub-optimal when e.g.
> > sharing pages as this forces to break block mappings purely to support
> > this software tracking. This causes an unnecessarily fragmented stage-2
> > page-table for the host in particular when it shares pages with Secure,
> > which can lead to measurable regressions. Moreover, having this state
> > stored in the page-table forces us to do multiple costly walks on the
> > page transition path, hence causing overhead.
> >
> > In order to work around these problems, move the host-side page-tracking
> > logic from SW bits in its stage-2 PTEs to the hypervisor's vmemmap.
> >
> > Signed-off-by: Quentin Perret <qperret at google.com>
> > ---
> > arch/arm64/kvm/hyp/include/nvhe/memory.h | 6 +-
> > arch/arm64/kvm/hyp/nvhe/mem_protect.c | 100 ++++++++++++++++-------
> > arch/arm64/kvm/hyp/nvhe/setup.c | 7 +-
> > 3 files changed, 77 insertions(+), 36 deletions(-)
> >
> > diff --git a/arch/arm64/kvm/hyp/include/nvhe/memory.h b/arch/arm64/kvm/hyp/include/nvhe/memory.h
> > index 45b8d1840aa4..8bd9a539f260 100644
> > --- a/arch/arm64/kvm/hyp/include/nvhe/memory.h
> > +++ b/arch/arm64/kvm/hyp/include/nvhe/memory.h
> > @@ -8,7 +8,7 @@
> > #include <linux/types.h>
> >
> > /*
> > - * SW bits 0-1 are reserved to track the memory ownership state of each page:
> > + * Bits 0-1 are reserved to track the memory ownership state of each page:
> > * 00: The page is owned exclusively by the page-table owner.
> > * 01: The page is owned by the page-table owner, but is shared
> > * with another entity.
> > @@ -43,7 +43,9 @@ static inline enum pkvm_page_state pkvm_getstate(enum kvm_pgtable_prot prot)
> > struct hyp_page {
> > u16 refcount;
> > u8 order;
> > - u8 reserved;
> > +
> > + /* Host (non-meta) state. Guarded by the host stage-2 lock. */
> > + enum pkvm_page_state host_state : 8;
>
> An enum as a bitfield? Crazy! :)
Hehe, it works so why not :)
> You probably want an assert somewhere that ensures that hyp_page is a
> 32bit quantity, just to make sure (and avoid hard to track bugs).
Sounds like a good idea, I'll stick a BUILD_BUG_ON() somewhere.
More information about the linux-arm-kernel
mailing list