Only test present bit is not enough since mmio spte is also set this bit, use is_rmap_spte() instead of it Also move the BUG_ONs to the common function to cleanup the code Signed-off-by: Xiao Guangrong <xiaoguangrong@xxxxxxxxxxxxxxxxxx> --- arch/x86/kvm/mmu.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index dc5f245..c759e4f 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -989,7 +989,12 @@ static int rmap_add(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn) static u64 *rmap_next(unsigned long *rmapp, u64 *spte) { - return pte_list_next(rmapp, spte); + u64 *sptep; + + sptep = pte_list_next(rmapp, spte); + + WARN_ON(sptep && !is_rmap_spte(*sptep)); + return sptep; } static void rmap_remove(struct kvm *kvm, u64 *spte) @@ -1016,7 +1021,6 @@ static int __rmap_write_protect(struct kvm *kvm, unsigned long *rmapp, int level int write_protected = 0; while ((spte = rmap_next(rmapp, spte))) { - BUG_ON(!(*spte & PT_PRESENT_MASK)); rmap_printk("rmap_write_protect: spte %p %llx\n", spte, *spte); if (!is_writable_pte(*spte)) @@ -1087,7 +1091,6 @@ static int kvm_unmap_rmapp(struct kvm *kvm, unsigned long *rmapp, int need_tlb_flush = 0; while ((spte = rmap_next(rmapp, NULL))) { - BUG_ON(!(*spte & PT_PRESENT_MASK)); rmap_printk("kvm_rmap_unmap_hva: spte %p %llx\n", spte, *spte); drop_spte(kvm, spte); need_tlb_flush = 1; @@ -1107,7 +1110,6 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, unsigned long *rmapp, new_pfn = pte_pfn(*ptep); spte = rmap_next(rmapp, NULL); while (spte) { - BUG_ON(!is_shadow_present_pte(*spte)); rmap_printk("kvm_set_pte_rmapp: spte %p %llx\n", spte, *spte); need_flush = 1; if (pte_write(*ptep)) { @@ -1200,7 +1202,6 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp, while (spte) { int _young; u64 _spte = *spte; - BUG_ON(!(_spte & PT_PRESENT_MASK)); _young = _spte & PT_ACCESSED_MASK; if (_young) { young = 1; @@ -1228,7 +1229,6 @@ static int kvm_test_age_rmapp(struct kvm *kvm, unsigned long *rmapp, spte = rmap_next(rmapp, NULL); while (spte) { u64 _spte = *spte; - BUG_ON(!(_spte & PT_PRESENT_MASK)); young = _spte & PT_ACCESSED_MASK; if (young) { young = 1; -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html