Takuya Yoshikawa <yoshikawa.takuya@xxxxxxxxxxxxx> wrote: > -int kvm_mmu_rmap_write_protect(struct kvm *kvm, u64 gfn, > - struct kvm_memory_slot *slot) > +static int __rmap_write_protect(struct kvm *kvm, unsigned long *rmapp, int level) > { > - unsigned long *rmapp; > - u64 *spte; > - int i, write_protected = 0; > + u64 *spte = NULL; > + int write_protected = 0; > > - rmapp = __gfn_to_rmap(gfn, PT_PAGE_TABLE_LEVEL, slot); > - spte = rmap_next(rmapp, NULL); > - while (spte) { > + 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)) { > + > + if (!is_writable_pte(*spte)) > + continue; > + > + if (level == PT_PAGE_TABLE_LEVEL) { > mmu_spte_update(spte, *spte & ~PT_WRITABLE_MASK); > - write_protected = 1; > + } else { > + BUG_ON(!is_large_pte(*spte)); > + drop_spte(kvm, spte); > + --kvm->stat.lpages; > + spte = NULL; > } > - spte = rmap_next(rmapp, spte); > + > + write_protected = 1; > } Something may change here: when level > PT_PAGE_TABLE_LEVEL, this loop does not handle lower level mappings after dropping large-ptes. This may be incorrect. Takuya -- 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