Merge tag 'v4.4.76' into linux-linaro-lsk-v4.4
[firefly-linux-kernel-4.4.55.git] / arch / x86 / kvm / paging_tmpl.h
index 8ebc3a5560cec96c73e8b1e1b7d6caf9a14455ab..7be8a251363eaa59d12ba2c7878c1e1b43058d42 100644 (file)
@@ -249,7 +249,7 @@ static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu,
                        return ret;
 
                kvm_vcpu_mark_page_dirty(vcpu, table_gfn);
-               walker->ptes[level] = pte;
+               walker->ptes[level - 1] = pte;
        }
        return 0;
 }
@@ -698,15 +698,14 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code,
        int r;
        pfn_t pfn;
        int level = PT_PAGE_TABLE_LEVEL;
-       bool force_pt_level;
+       bool force_pt_level = false;
        unsigned long mmu_seq;
        bool map_writable, is_self_change_mapping;
 
        pgprintk("%s: addr %lx err %x\n", __func__, addr, error_code);
 
        if (unlikely(error_code & PFERR_RSVD_MASK)) {
-               r = handle_mmio_page_fault(vcpu, addr, error_code,
-                                             mmu_is_nested(vcpu));
+               r = handle_mmio_page_fault(vcpu, addr, mmu_is_nested(vcpu));
                if (likely(r != RET_MMIO_PF_INVALID))
                        return r;
 
@@ -744,9 +743,9 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code,
              &walker, user_fault, &vcpu->arch.write_fault_to_shadow_pgtable);
 
        if (walker.level >= PT_DIRECTORY_LEVEL && !is_self_change_mapping) {
-               force_pt_level = mapping_level_dirty_bitmap(vcpu, walker.gfn);
-               if (!force_pt_level) {
-                       level = min(walker.level, mapping_level(vcpu, walker.gfn));
+               level = mapping_level(vcpu, walker.gfn, &force_pt_level);
+               if (likely(!force_pt_level)) {
+                       level = min(walker.level, level);
                        walker.gfn = walker.gfn & ~(KVM_PAGES_PER_HPAGE(level) - 1);
                }
        } else