lkml.org 
[lkml]   [2007]   [Feb]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 1/13] KVM: mmu: add missing dirty page tracking cases
    From
    Date
    We fail to mark a page dirty in three cases:

    - setting the accessed bit in a pte
    - setting the dirty bit in a pte
    - emulating a write into a pagetable

    This fix adds the missing cases.

    Signed-off-by: Avi Kivity <avi@qumranet.com>

    Index: linux-2.6/drivers/kvm/paging_tmpl.h
    ===================================================================
    --- linux-2.6.orig/drivers/kvm/paging_tmpl.h
    +++ linux-2.6/drivers/kvm/paging_tmpl.h
    @@ -128,8 +128,10 @@ static int FNAME(walk_addr)(struct guest
    goto access_error;
    #endif

    - if (!(*ptep & PT_ACCESSED_MASK))
    - *ptep |= PT_ACCESSED_MASK; /* avoid rmw */
    + if (!(*ptep & PT_ACCESSED_MASK)) {
    + mark_page_dirty(vcpu->kvm, table_gfn);
    + *ptep |= PT_ACCESSED_MASK;
    + }

    if (walker->level == PT_PAGE_TABLE_LEVEL) {
    walker->gfn = (*ptep & PT_BASE_ADDR_MASK)
    @@ -185,6 +187,12 @@ static void FNAME(release_walker)(struct
    kunmap_atomic(walker->table, KM_USER0);
    }

    +static void FNAME(mark_pagetable_dirty)(struct kvm *kvm,
    + struct guest_walker *walker)
    +{
    + mark_page_dirty(kvm, walker->table_gfn[walker->level - 1]);
    +}
    +
    static void FNAME(set_pte)(struct kvm_vcpu *vcpu, u64 guest_pte,
    u64 *shadow_pte, u64 access_bits, gfn_t gfn)
    {
    @@ -348,12 +356,15 @@ static int FNAME(fix_write_pf)(struct kv
    } else if (kvm_mmu_lookup_page(vcpu, gfn)) {
    pgprintk("%s: found shadow page for %lx, marking ro\n",
    __FUNCTION__, gfn);
    + mark_page_dirty(vcpu->kvm, gfn);
    + FNAME(mark_pagetable_dirty)(vcpu->kvm, walker);
    *guest_ent |= PT_DIRTY_MASK;
    *write_pt = 1;
    return 0;
    }
    mark_page_dirty(vcpu->kvm, gfn);
    *shadow_ent |= PT_WRITABLE_MASK;
    + FNAME(mark_pagetable_dirty)(vcpu->kvm, walker);
    *guest_ent |= PT_DIRTY_MASK;
    rmap_add(vcpu, shadow_ent);

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-02-19 11:25    [W:0.019 / U:30.152 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site