Takuya Yoshikawa <yoshikawa.tak...@oss.ntt.co.jp> 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to