• Chao Fan's avatar
    Change the method to calculate dirty-pages-rate · 1ffb5dfd
    Chao Fan authored
    In function cpu_physical_memory_sync_dirty_bitmap, file
    include/exec/ram_addr.h:
    
    if (src[idx][offset]) {
        unsigned long bits = atomic_xchg(&src[idx][offset], 0);
        unsigned long new_dirty;
        new_dirty = ~dest[k];
        dest[k] |= bits;
        new_dirty &= bits;
        num_dirty += ctpopl(new_dirty);
    }
    
    After these codes executed, only the pages not dirtied in bitmap(dest),
    but dirtied in dirty_memory[DIRTY_MEMORY_MIGRATION] will be calculated.
    For example:
    When ram_list.dirty_memory[DIRTY_MEMORY_MIGRATION] = 0b00001111,
    and atomic_rcu_read(&migration_bitmap_rcu)->bmap = 0b00000011,
    the new_dirty will be 0b00001100, and this function will return 2 but not
    4 which is expected.
    the dirty pages in dirty_memory[DIRTY_MEMORY_MIGRATION] are all new,
    so these should be calculated also.
    Signed-off-by: 's avatarChao Fan <fanc.fnst@cn.fujitsu.com>
    Signed-off-by: 's avatarLi Zhijian <lizhijian@cn.fujitsu.com>
    Reviewed-by: 's avatarJuan Quintela <quintela@redhat.com>
    Signed-off-by: 's avatarJuan Quintela <quintela@redhat.com>
    1ffb5dfd
ram.c 82.5 KB