PT_PRESENT_MASK bit is not enough to see the spte has already been mapped
into pte-list for mmio spte also set this bit. Use is_shadow_present_pte
instead to fix it

Also, this patch move many assertions to the common place to clean up the
code

Signed-off-by: Xiao Guangrong <xiaoguangr...@linux.vnet.ibm.com>
---
 arch/x86/kvm/mmu.c |   20 ++++++--------------
 1 files changed, 6 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 2291ea3..58f813a 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -1009,7 +1009,9 @@ static u64 *pte_list_get_next(struct pte_list_iterator 
*iter)

 #define for_each_spte_in_pte_list(pte_list, iter, spte)                \
           for (spte = pte_list_get_first(pte_list, &(iter));   \
-             spte != NULL; spte = pte_list_get_next(&(iter)))
+             spte != NULL &&                                   \
+             ({WARN_ON(!is_shadow_present_pte(*(spte))); 1; });\
+                  spte = pte_list_get_next(&iter))

 #define for_each_spte_in_rmap(rmap, iter, spte)                        \
           for_each_spte_in_pte_list(rmap, iter, spte)
@@ -1128,11 +1130,8 @@ static bool __rmap_write_protect(struct kvm *kvm, 
unsigned long *rmapp,
        struct pte_list_iterator iter;
        bool flush = false;

-       for_each_spte_in_rmap(*rmapp, iter, sptep) {
-               BUG_ON(!(*sptep & PT_PRESENT_MASK));
-
+       for_each_spte_in_rmap(*rmapp, iter, sptep)
                flush |= spte_write_protect(kvm, sptep, pt_protect);
-       }

        return flush;
 }
@@ -1215,7 +1214,6 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, unsigned 
long *rmapp,
                need_flush = kvm_unmap_rmapp(kvm, rmapp, slot, data);
        else
                for_each_spte_in_rmap(*rmapp, iter, sptep) {
-                       BUG_ON(!is_shadow_present_pte(*sptep));
                        rmap_printk("kvm_set_pte_rmapp: spte %p %llx\n",
                                    sptep, *sptep);

@@ -1336,15 +1334,12 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long 
*rmapp,
                goto out;
        }

-       for_each_spte_in_rmap(*rmapp, iter, sptep) {
-               BUG_ON(!is_shadow_present_pte(*sptep));
-
+       for_each_spte_in_rmap(*rmapp, iter, sptep)
                if (*sptep & shadow_accessed_mask) {
                        young = 1;
                        clear_bit((ffs(shadow_accessed_mask) - 1),
                                 (unsigned long *)sptep);
                }
-       }
 out:
        /* @data has hva passed to kvm_age_hva(). */
        trace_kvm_age_page(data, slot, young);
@@ -1366,14 +1361,11 @@ static int kvm_test_age_rmapp(struct kvm *kvm, unsigned 
long *rmapp,
        if (!shadow_accessed_mask)
                goto out;

-       for_each_spte_in_rmap(*rmapp, iter, sptep) {
-               BUG_ON(!is_shadow_present_pte(*sptep));
-
+       for_each_spte_in_rmap(*rmapp, iter, sptep)
                if (*sptep & shadow_accessed_mask) {
                        young = 1;
                        break;
                }
-       }
 out:
        return young;
 }
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to