Re: [PATCH v9 6/6] KVM: x86/mmu: Handle non-refcounted pages

From: Sean Christopherson
Date: Mon Feb 05 2024 - 22:23:38 EST


On Mon, Sep 11, 2023, David Stevens wrote:
> From: David Stevens <stevensd@xxxxxxxxxxxx>
>
> Handle non-refcounted pages in __kvm_faultin_pfn. This allows the host
> to map memory into the guest that is backed by non-refcounted struct
> pages - for example, the tail pages of higher order non-compound pages
> allocated by the amdgpu driver via ttm_pool_alloc_page.
>
> The bulk of this change is tracking the is_refcounted_page flag so that
> non-refcounted pages don't trigger page_count() == 0 warnings. This is
> done by storing the flag in an unused bit in the sptes. There are no
> bits available in PAE SPTEs, so non-refcounted pages can only be handled
> on TDP and x86-64.

Can you split this into two patches? One to add all of the SPTE tracking, and
then one final patch to allow faulting in non-refcounted pages. I want to isolate
the latter as much as possible, both for review purposes and in case something
goes awry and needs to be reverted.

> @@ -4254,13 +4265,18 @@ void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work)
> static int __kvm_faultin_pfn(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
> {
> struct kvm_memory_slot *slot = fault->slot;
> + /*
> + * There are no extra bits for tracking non-refcounted pages in
> + * PAE SPTEs, so reject non-refcounted struct pages in that case.
> + */
> + bool has_spte_refcount_bit = tdp_enabled && IS_ENABLED(CONFIG_X86_64);

Eh, just drop the local variable and do

.allow_non_refcounted_struct_page = tdp_enabled &&
IS_ENABLED(CONFIG_X86_64);
(but keep the comment)