[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <qsj5cleufe4ljlfi7zq77ted6utdgaqzcwuifjeik5hnbvqzvi@xitzlce5si6o>
Date: Tue, 23 Dec 2025 23:40:27 +0000
From: Yosry Ahmed <yosry.ahmed@...ux.dev>
To: Sean Christopherson <seanjc@...gle.com>
Cc: Paolo Bonzini <pbonzini@...hat.com>, kvm@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v3 07/16] KVM: selftests: Move PTE bitmasks to kvm_mmu
On Tue, Dec 23, 2025 at 02:31:38PM -0800, Sean Christopherson wrote:
> On Thu, Nov 27, 2025, Yosry Ahmed wrote:
> > @@ -1449,11 +1439,44 @@ enum pg_level {
> > #define PG_SIZE_2M PG_LEVEL_SIZE(PG_LEVEL_2M)
> > #define PG_SIZE_1G PG_LEVEL_SIZE(PG_LEVEL_1G)
> >
> > +struct pte_masks {
> > + uint64_t present;
> > + uint64_t writable;
> > + uint64_t user;
> > + uint64_t accessed;
> > + uint64_t dirty;
> > + uint64_t huge;
> > + uint64_t nx;
> > + uint64_t c;
> > + uint64_t s;
> > +};
> > +
> > struct kvm_mmu {
> > uint64_t root_gpa;
> > int pgtable_levels;
> > + struct pte_masks pte_masks;
>
> And then introduce kvm_mmu_arch so that x86 can shove pte_masks into the mmu.
Makes sense.
>
> > };
> >
> > +#define PTE_PRESENT_MASK(mmu) ((mmu)->pte_masks.present)
> > +#define PTE_WRITABLE_MASK(mmu) ((mmu)->pte_masks.writable)
> > +#define PTE_USER_MASK(mmu) ((mmu)->pte_masks.user)
> > +#define PTE_ACCESSED_MASK(mmu) ((mmu)->pte_masks.accessed)
> > +#define PTE_DIRTY_MASK(mmu) ((mmu)->pte_masks.dirty)
> > +#define PTE_HUGE_MASK(mmu) ((mmu)->pte_masks.huge)
> > +#define PTE_NX_MASK(mmu) ((mmu)->pte_masks.nx)
> > +#define PTE_C_MASK(mmu) ((mmu)->pte_masks.c)
> > +#define PTE_S_MASK(mmu) ((mmu)->pte_masks.s)
> > +
> > +#define pte_present(mmu, pte) (!!(*(pte) & PTE_PRESENT_MASK(mmu)))
>
> I very, very strongly prefer is_present_pte(), is_huge_pte(), etc.
These were modeled after the kernel accessors (e.g. in
arch/x86/include/asm/pgtable.h). I think it's clearer if we use the same
naming here, but I don't feel as strongly as you -- so fine either way.
>
> > +#define pte_writable(mmu, pte) (!!(*(pte) & PTE_WRITABLE_MASK(mmu)))
> > +#define pte_user(mmu, pte) (!!(*(pte) & PTE_USER_MASK(mmu)))
> > +#define pte_accessed(mmu, pte) (!!(*(pte) & PTE_ACCESSED_MASK(mmu)))
> > +#define pte_dirty(mmu, pte) (!!(*(pte) & PTE_DIRTY_MASK(mmu)))
> > +#define pte_huge(mmu, pte) (!!(*(pte) & PTE_HUGE_MASK(mmu)))
> > +#define pte_nx(mmu, pte) (!!(*(pte) & PTE_NX_MASK(mmu)))
> > +#define pte_c(mmu, pte) (!!(*(pte) & PTE_C_MASK(mmu)))
> > +#define pte_s(mmu, pte) (!!(*(pte) & PTE_S_MASK(mmu)))
Powered by blists - more mailing lists