FAILED: patch "[PATCH] KVM: x86/mmu: Set SPTE_AD_WRPROT_ONLY_MASK if and only if PML" failed to apply to 5.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 44ac5958a6c1fd91ac8810fbb37194e377d78db5 Mon Sep 17 00:00:00 2001
From: Sean Christopherson <[email protected]>
Date: Thu, 25 Feb 2021 12:47:26 -0800
Subject: [PATCH] KVM: x86/mmu: Set SPTE_AD_WRPROT_ONLY_MASK if and only if PML
is enabled
Check that PML is actually enabled before setting the mask to force a SPTE to be write-protected. The bits used for the !AD_ENABLED case are in the upper half of the SPTE. With 64-bit paging and EPT, these bits are ignored, but with 32-bit PAE paging they are reserved. Setting them for L2 SPTEs without checking PML breaks NPT on 32-bit KVM.
Message-Id: <[email protected]>
arch/x86/kvm/mmu/mmu_internal.h +8 -8
@@ -81,15 +81,15 @@ static inline struct kvm_mmu_page *sptep_to_sp(u64 *sptep)static inline bool kvm_vcpu_ad_need_write_protect (struct kvm_vcpu *vcpu) {/* -* When using the EPT page-modification log, the GPAs in the log -* would come from L2 rather than L1. Therefore, we need to rely -* on write protection to record dirty pages. This also bypasses -* PML, since writes now result in a vmexit. Note, this helper will -* tag SPTEs as needing write-protection even if PML is disabled or -* unsupported, but that's ok because the tag is consumed if and only -* if PML is enabled. Omit the PML check to save a few uops. +* When using the EPT page-modification log, the GPAs in the CPU dirty +* log would come from L2 rather than L1. Therefore, we need to rely +* on write protection to record dirty pages, which bypasses PML, since +* writes now result in a vmexit. Note, the check on CPU dirty logging +* being enabled is mandatory as the bits used to denote WP-only SPTEs +* are reserved for NPT w/ PAE (32-bit KVM). */ -return vcpu->arch.mmu == &vcpu->arch.guest_mmu; +return vcpu->arch.mmu == &vcpu->arch.guest_mmu && + kvm_x86_ops.cpu_dirty_log_size; }bool is_nx_huge_page_enabled (void );