lkml.org 
[lkml]   [2015]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 13/15] KVM: MTRR: simplify kvm_mtrr_get_guest_memory_type
    Date
    mtrr_for_each_mem_type() is ready now, use it to simplify
    kvm_mtrr_get_guest_memory_type()

    Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>
    ---
    arch/x86/kvm/mtrr.c | 61 +++++++++++++----------------------------------------
    1 file changed, 15 insertions(+), 46 deletions(-)

    diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c
    index 35f86303..bc90834 100644
    --- a/arch/x86/kvm/mtrr.c
    +++ b/arch/x86/kvm/mtrr.c
    @@ -581,56 +581,19 @@ static void mtrr_lookup_next(struct mtrr_looker *looker)
    u8 kvm_mtrr_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn)
    {
    struct kvm_mtrr *mtrr_state = &vcpu->arch.mtrr_state;
    - u64 base, mask, start = gfn_to_gpa(gfn);
    - int i, num_var_ranges = KVM_NR_VAR_MTRR, type_mask, type = -1;
    -
    - /* MTRR is completely disabled, use UC for all of physical memory. */
    - if (!mtrr_state->mtrr_enabled)
    - return MTRR_TYPE_UNCACHABLE;
    -
    - /* Look in fixed ranges. Just return the type as per start */
    - if (mtrr_state->fixed_mtrr_enabled && (start < 0x100000)) {
    - int idx;
    -
    - if (start < 0x80000) {
    - idx = 0;
    - idx += (start >> 16);
    - return mtrr_state->fixed_ranges[idx];
    - } else if (start < 0xC0000) {
    - idx = 1 * 8;
    - idx += ((start - 0x80000) >> 14);
    - return mtrr_state->fixed_ranges[idx];
    - } else if (start < 0x1000000) {
    - idx = 3 * 8;
    - idx += ((start - 0xC0000) >> 12);
    - return mtrr_state->fixed_ranges[idx];
    - }
    - }
    + struct mtrr_looker looker;
    + u64 start = gfn_to_gpa(gfn), end = start + PAGE_SIZE;
    + int type_mask, type = -1;

    - /*
    - * Look in variable ranges
    - * Look of multiple ranges matching this address and pick type
    - * as per MTRR precedence
    - */
    type_mask = (1 << MTRR_TYPE_WRBACK) | (1 << MTRR_TYPE_WRTHROUGH);
    - for (i = 0; i < num_var_ranges; ++i) {
    - int curr_type;
    -
    - if (!(mtrr_state->var_ranges[i].mask & (1 << 11)))
    - continue;
    -
    - base = mtrr_state->var_ranges[i].base & PAGE_MASK;
    - mask = mtrr_state->var_ranges[i].mask & PAGE_MASK;
    -
    - if ((start & mask) != (base & mask))
    - continue;
    + mtrr_for_each_mem_type(&looker, mtrr_state, start, end) {
    + int curr_type = looker.mem_type;

    /*
    * Please refer to Intel SDM Volume 3: 11.11.4.1 MTRR
    * Precedences.
    */

    - curr_type = mtrr_state->var_ranges[i].base & 0xff;
    if (type == -1) {
    type = curr_type;
    continue;
    @@ -670,9 +633,15 @@ u8 kvm_mtrr_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn)
    return MTRR_TYPE_WRBACK;
    }

    - if (type != -1)
    - return type;
    -
    - return mtrr_state->def_type;
    + /* It is not covered by MTRRs. */
    + if (looker.partial_map) {
    + /*
    + * We just check one page, partially covered by MTRRs is
    + * impossible.
    + */
    + WARN_ON(type != -1);
    + type = mtrr_state->def_type;
    + }
    + return type;
    }
    EXPORT_SYMBOL_GPL(kvm_mtrr_get_guest_memory_type);
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-05-30 13:41    [W:2.424 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site