On Wed, Apr 01, 2020 at 08:50:56PM +0800, Zhuang Yanying wrote: > From: LinFeng <linfeng23@xxxxxxxxxx> > > Just adding !is_zero_page() to kvm_is_reserved_pfn() is too > rough. According to commit:e433e83bc3("KVM: MMU: Do not treat > ZONE_DEVICE pages as being reserved"), special handling in some > other flows is also need by zero_page, if not treat zero_page as > being reserved. > > Signed-off-by: LinFeng <linfeng23@xxxxxxxxxx> > Signed-off-by: Zhuang Yanying <ann.zhuangyanying@xxxxxxxxxx> > --- > arch/x86/kvm/mmu.c | 2 ++ > virt/kvm/kvm_main.c | 6 +++--- > 2 files changed, 5 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c > index 732c0270a489..e8db17d87c1a 100644 > --- a/arch/x86/kvm/mmu.c > +++ b/arch/x86/kvm/mmu.c > @@ -2961,6 +2961,7 @@ static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu, > * here. > */ > if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn) && > + !is_zero_pfn(pfn) && > level == PT_PAGE_TABLE_LEVEL && > PageTransCompoundMap(pfn_to_page(pfn)) && > !mmu_gfn_lpage_is_disallowed(vcpu, gfn, PT_DIRECTORY_LEVEL)) { > @@ -5010,6 +5011,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *kvm, > */ > if (sp->role.direct && > !kvm_is_reserved_pfn(pfn) && > + !is_zero_pfn(pfn) && > PageTransCompoundMap(pfn_to_page(pfn))) { > drop_spte(kvm, sptep); > need_tlb_flush = 1; > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 7f7c22a687c0..fc0446bb393b 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -1660,7 +1660,7 @@ static struct page *kvm_pfn_to_page(kvm_pfn_t pfn) > if (is_error_noslot_pfn(pfn)) > return KVM_ERR_PTR_BAD_PAGE; > > - if (kvm_is_reserved_pfn(pfn)) { > + if (kvm_is_reserved_pfn(pfn) && is_zero_pfn(pfn)) { > WARN_ON(1); > return KVM_ERR_PTR_BAD_PAGE; > } > @@ -1719,7 +1719,7 @@ static void kvm_release_pfn_dirty(kvm_pfn_t pfn) > > void kvm_set_pfn_dirty(kvm_pfn_t pfn) > { > - if (!kvm_is_reserved_pfn(pfn)) { > + if (!kvm_is_reserved_pfn(pfn) && !is_zero_pfn(pfn)) { > struct page *page = pfn_to_page(pfn); > > if (!PageReserved(page)) > @@ -1730,7 +1730,7 @@ EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty); > > void kvm_set_pfn_accessed(kvm_pfn_t pfn) > { > - if (!kvm_is_reserved_pfn(pfn)) > + if (!kvm_is_reserved_pfn(pfn) && !is_zero_pfn(pfn)) > mark_page_accessed(pfn_to_page(pfn)); > } > EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed); > -- > 2.23.0 > > <formletter> This is not the correct way to submit patches for inclusion in the stable kernel tree. Please read: https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html for how to do this properly. </formletter>