Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752769AbcCYNfL (ORCPT ); Fri, 25 Mar 2016 09:35:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60629 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751091AbcCYNfI (ORCPT ); Fri, 25 Mar 2016 09:35:08 -0400 Subject: Re: [PATCH 1/4] KVM: MMU: fix permission_fault() To: Xiao Guangrong References: <1458911978-19430-1-git-send-email-guangrong.xiao@linux.intel.com> Cc: gleb@kernel.org, mtosatti@redhat.com, kvm@vger.kernel.org, linux-kernel@vger.kernel.org From: Paolo Bonzini Message-ID: <56F53E87.6010304@redhat.com> Date: Fri, 25 Mar 2016 14:35:03 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <1458911978-19430-1-git-send-email-guangrong.xiao@linux.intel.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2270 Lines: 68 On 25/03/2016 14:19, Xiao Guangrong wrote: > kvm-unit-tests complained about the PFEC is not set properly, e.g,: > test pte.rw pte.d pte.nx pde.p pde.rw pde.pse user fetch: FAIL: error code 15 > expected 5 > Dump mapping: address: 0x123400000000 > ------L4: 3e95007 > ------L3: 3e96007 > ------L2: 2000083 What's the command line for the reproducer? > diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h > index b70df72..81bffd1 100644 > --- a/arch/x86/kvm/mmu.h > +++ b/arch/x86/kvm/mmu.h > @@ -154,7 +154,7 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, > unsigned pfec) > { > int cpl = kvm_x86_ops->get_cpl(vcpu); > - unsigned long rflags = kvm_x86_ops->get_rflags(vcpu); > + unsigned long errcode, rflags = kvm_x86_ops->get_rflags(vcpu); > > /* > * If CPL < 3, SMAP prevention are disabled if EFLAGS.AC = 1. > @@ -175,7 +175,7 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, > bool fault = (mmu->permissions[index] >> pte_access) & 1; > > WARN_ON(pfec & (PFERR_PK_MASK | PFERR_RSVD_MASK)); > - pfec |= PFERR_PRESENT_MASK; > + errcode = PFERR_PRESENT_MASK; So is this patch doing the same as "KVM: MMU: precompute page fault error code"? It was necessary after all. :) Paolo > > if (unlikely(mmu->pkru_mask)) { > u32 pkru_bits, offset; > @@ -193,11 +193,11 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, > ((pte_access & PT_USER_MASK) << (PFERR_RSVD_BIT - PT_USER_SHIFT)); > > pkru_bits &= mmu->pkru_mask >> offset; > - pfec |= -pkru_bits & PFERR_PK_MASK; > + errcode |= -pkru_bits & PFERR_PK_MASK; > fault |= (pkru_bits != 0); > } > > - return -(uint32_t)fault & pfec; > + return -(uint32_t)fault & errcode; > } > > void kvm_mmu_invalidate_zap_all_pages(struct kvm *kvm); > diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h > index 1d971c7..bc019f7 100644 > --- a/arch/x86/kvm/paging_tmpl.h > +++ b/arch/x86/kvm/paging_tmpl.h > @@ -360,7 +360,7 @@ retry_walk: > goto error; > > if (unlikely(is_rsvd_bits_set(mmu, pte, walker->level))) { > - errcode |= PFERR_RSVD_MASK | PFERR_PRESENT_MASK; > + errcode = PFERR_RSVD_MASK | PFERR_PRESENT_MASK; > goto error; > } >