Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932145AbbFICuG (ORCPT ); Mon, 8 Jun 2015 22:50:06 -0400 Received: from mga02.intel.com ([134.134.136.20]:5738 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752584AbbFICt4 (ORCPT ); Mon, 8 Jun 2015 22:49:56 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,577,1427785200"; d="scan'208";a="739826934" Message-ID: <5576535E.2070207@linux.intel.com> Date: Tue, 09 Jun 2015 10:45:50 +0800 From: Xiao Guangrong User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: David Matlack CC: Paolo Bonzini , Gleb Natapov , Marcelo Tosatti , kvm list , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH 12/15] KVM: MTRR: introduce mtrr_for_each_mem_type References: <1432983566-15773-1-git-send-email-guangrong.xiao@linux.intel.com> <1432983566-15773-13-git-send-email-guangrong.xiao@linux.intel.com> In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4103 Lines: 129 On 06/09/2015 08:36 AM, David Matlack wrote: > On Sat, May 30, 2015 at 3:59 AM, Xiao Guangrong > wrote: >> It walks all MTRRs and gets all the memory cache type setting for the >> specified range also it checks if the range is fully covered by MTRRs >> >> Signed-off-by: Xiao Guangrong >> --- >> arch/x86/kvm/mtrr.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 183 insertions(+) >> >> diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c >> index e59d138..35f86303 100644 >> --- a/arch/x86/kvm/mtrr.c >> +++ b/arch/x86/kvm/mtrr.c >> @@ -395,6 +395,189 @@ void kvm_vcpu_mtrr_init(struct kvm_vcpu *vcpu) >> INIT_LIST_HEAD(&vcpu->arch.mtrr_state.head); >> } >> >> +struct mtrr_looker { >> + /* input fields. */ >> + struct kvm_mtrr *mtrr_state; >> + u64 start; >> + u64 end; >> + >> + /* output fields. */ >> + int mem_type; >> + /* [start, end) is fully covered in MTRRs? */ > > s/fully/not fully/ ? Yup, thanks for pointing it out. > >> + bool partial_map; >> + >> + /* private fields. */ >> + union { >> + /* used for fixed MTRRs. */ >> + struct { >> + int index; >> + int seg; >> + }; >> + >> + /* used for var MTRRs. */ >> + struct { >> + struct kvm_mtrr_range *range; >> + /* max address has been covered in var MTRRs. */ >> + u64 start_max; >> + }; >> + }; >> + >> + bool fixed; >> +}; >> + >> +static void mtrr_lookup_init(struct mtrr_looker *looker, >> + struct kvm_mtrr *mtrr_state, u64 start, u64 end) >> +{ >> + looker->mtrr_state = mtrr_state; >> + looker->start = start; >> + looker->end = end; >> +} >> + >> +static u64 fixed_mtrr_range_end_addr(int seg, int index) >> +{ >> + struct fixed_mtrr_segment *mtrr_seg = &fixed_seg_table[seg]; >> + >> + return mtrr_seg->start + mtrr_seg->range_size * index; > > Should be (index + 1)? Good eyes, will fix. > >> +} >> + >> +static bool mtrr_lookup_fixed_start(struct mtrr_looker *looker) >> +{ >> + int seg, index; >> + >> + if (!looker->mtrr_state->fixed_mtrr_enabled) >> + return false; >> + >> + seg = fixed_mtrr_addr_to_seg(looker->start); >> + if (seg < 0) >> + return false; >> + >> + looker->fixed = true; >> + index = fixed_mtrr_addr_seg_to_range_index(looker->start, seg); >> + looker->index = index; >> + looker->seg = seg; >> + looker->mem_type = looker->mtrr_state->fixed_ranges[index]; >> + looker->start = fixed_mtrr_range_end_addr(seg, index); >> + return true; >> +} >> + >> +static bool match_var_range(struct mtrr_looker *looker, >> + struct kvm_mtrr_range *range) >> +{ >> + u64 start, end; >> + >> + var_mtrr_range(range, &start, &end); >> + if (!(start >= looker->end || end <= looker->start)) { >> + looker->range = range; >> + looker->mem_type = range->base & 0xff; >> + >> + /* >> + * the function is called when we do kvm_mtrr.head walking >> + * that means range has the minimum base address interleaves >> + * with [looker->start_max, looker->end). >> + */ > > I'm having trouble understanding this comment. I think this is what you > are trying to say: > > this function is called when we do kvm_mtrr.head walking. range has the > minimum base address which interleaves [looker->start_max, looker->end). > > Let me know if I parsed it wrong. Yes, it is, will improve the comment. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/