lkml.org 
[lkml]   [2010]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 3/6] KVM: MMU: fix page dirty tracking lost while sync page
    In sync-page path, if spte.writable is changed, it will lose page dirty
    tracking, for example:

    assume spte.writable = 0 in a unsync-page, when it's synced, it map spte
    to writable(that is spte.writable = 1), later guest write spte.gfn, it means
    spte.gfn is dirty, then guest changed this mapping to read-only, after it's
    synced, spte.writable = 0

    So, when host release the spte, it detect spte.writable = 0 and not mark page
    dirty

    Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
    ---
    arch/x86/kvm/mmu.c | 10 +++-------
    1 files changed, 3 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
    index 5937054..b3896bf 100644
    --- a/arch/x86/kvm/mmu.c
    +++ b/arch/x86/kvm/mmu.c
    @@ -1981,6 +1981,8 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
    mark_page_dirty(vcpu->kvm, gfn);

    set_pte:
    + if (is_writable_pte(*sptep) && !is_writable_pte(spte))
    + kvm_set_pfn_dirty(pfn);
    update_spte(sptep, spte);
    done:
    return ret;
    @@ -1994,7 +1996,6 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
    bool reset_host_protection)
    {
    int was_rmapped = 0;
    - int was_writable = is_writable_pte(*sptep);
    int rmap_count;

    pgprintk("%s: spte %llx access %x write_fault %d"
    @@ -2044,15 +2045,10 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
    page_header_update_slot(vcpu->kvm, sptep, gfn);
    if (!was_rmapped) {
    rmap_count = rmap_add(vcpu, sptep, gfn);
    - kvm_release_pfn_clean(pfn);
    if (rmap_count > RMAP_RECYCLE_THRESHOLD)
    rmap_recycle(vcpu, sptep, gfn);
    - } else {
    - if (was_writable)
    - kvm_release_pfn_dirty(pfn);
    - else
    - kvm_release_pfn_clean(pfn);
    }
    + kvm_release_pfn_clean(pfn);
    if (speculative) {
    vcpu->arch.last_pte_updated = sptep;
    vcpu->arch.last_pte_gfn = gfn;
    --
    1.6.1.2




    \
     
     \ /
      Last update: 2010-07-16 05:31    [W:0.020 / U:23.592 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site