[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 14/22] exec: only check relevant bitmaps for cle
From: |
Fam Zheng |
Subject: |
Re: [Qemu-devel] [PATCH 14/22] exec: only check relevant bitmaps for cleanliness |
Date: |
Fri, 27 Mar 2015 14:10:17 +0800 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
On Thu, 03/26 18:38, Paolo Bonzini wrote:
> Most of the time, not all bitmaps have to be marked as dirty;
> do not do anything if the interesting ones are already dirty.
> Previously, any clean bitmap would have cause all the bitmaps to be
> marked dirty.
>
> In fact, unless running TCG most of the time bitmap operations
> are not done at all because memory_region_is_logging returns
> zero. In this case, skip cpu_physical_memory_range_includes_clean
> as well.
>
> With this patch, cpu_physical_memory_set_dirty_range is called
> unconditionally, so there need not be anymore a separate call to
> xen_modified_memory.
>
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
> exec.c | 18 +++++++++---------
> include/exec/ram_addr.h | 19 +++++++++++++------
> 2 files changed, 22 insertions(+), 15 deletions(-)
>
> diff --git a/exec.c b/exec.c
> index 94b7644..83c58ff 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -2236,16 +2236,16 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong
> addr,
> static void invalidate_and_set_dirty(MemoryRegion *mr, hwaddr addr,
> hwaddr length)
> {
> - if (cpu_physical_memory_range_includes_clean(addr, length)) {
> - uint8_t dirty_log_mask = memory_region_is_logging(mr);
> - if (dirty_log_mask & (1 << DIRTY_MEMORY_CODE)) {
> - tb_invalidate_phys_range(addr, addr + length, 0);
> - dirty_log_mask &= ~(1 << DIRTY_MEMORY_CODE);
> - }
> - cpu_physical_memory_set_dirty_range(addr, length, dirty_log_mask);
> - } else {
> - xen_modified_memory(addr, length);
> + uint8_t dirty_log_mask = memory_region_is_logging(mr);
> + if (dirty_log_mask &&
> + !cpu_physical_memory_range_includes_clean(addr, length,
> dirty_log_mask)) {
> + dirty_log_mask = 0;
> + }
> + if (dirty_log_mask & (1 << DIRTY_MEMORY_CODE)) {
> + tb_invalidate_phys_range(addr, addr + length, 0);
> + dirty_log_mask &= ~(1 << DIRTY_MEMORY_CODE);
> }
> + cpu_physical_memory_set_dirty_range(addr, length, dirty_log_mask);
> }
>
> static int memory_access_size(MemoryRegion *mr, unsigned l, hwaddr addr)
> diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
> index 6c3b74e..b408408 100644
> --- a/include/exec/ram_addr.h
> +++ b/include/exec/ram_addr.h
> @@ -90,13 +90,20 @@ static inline bool
> cpu_physical_memory_is_clean(ram_addr_t addr)
> }
>
> static inline bool cpu_physical_memory_range_includes_clean(ram_addr_t start,
> - ram_addr_t
> length)
> + ram_addr_t
> length,
> + uint8_t mask)
> {
> - bool vga = cpu_physical_memory_get_clean(start, length,
> DIRTY_MEMORY_VGA);
> - bool code = cpu_physical_memory_get_clean(start, length,
> DIRTY_MEMORY_CODE);
> - bool migration =
> - cpu_physical_memory_get_clean(start, length, DIRTY_MEMORY_MIGRATION);
> - return vga || code || migration;
> + bool clean = false;
> + if (mask & (1 << DIRTY_MEMORY_VGA)) {
> + clean = cpu_physical_memory_get_clean(start, length,
> DIRTY_MEMORY_VGA);
> + }
> + if (!clean && (mask & (1 << DIRTY_MEMORY_CODE))) {
> + clean = cpu_physical_memory_get_clean(start, length,
> DIRTY_MEMORY_CODE);
> + }
> + if (!clean && (mask & (1 << DIRTY_MEMORY_MIGRATION))) {
> + clean = cpu_physical_memory_get_clean(start, length,
> DIRTY_MEMORY_MIGRATION);
> + }
> + return clean;
> }
Out of curiosity, is it valid that a mask bit is cleared but the corresponding
dirty bit is set?
>
> static inline void cpu_physical_memory_set_dirty_flag(ram_addr_t addr,
> --
> 2.3.3
>
>
>
- Re: [Qemu-devel] [PATCH 05/22] memory: return bitmap from memory_region_is_logging, (continued)
- [Qemu-devel] [PATCH 09/22] memory: return DIRTY_MEMORY_MIGRATION from memory_region_is_logging, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 12/22] exec: use memory_region_is_logging to optimize dirty tracking, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 06/22] framebuffer: check memory_region_is_logging, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 10/22] ram_addr: tweaks to xen_modified_memory, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 08/22] memory: track DIRTY_MEMORY_CODE in mr->dirty_log_mask, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 13/22] exec: pass client mask to cpu_physical_memory_set_dirty_range, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 11/22] exec: simplify notdirty_mem_write, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 14/22] exec: only check relevant bitmaps for cleanliness, Paolo Bonzini, 2015/03/26
- Re: [Qemu-devel] [PATCH 14/22] exec: only check relevant bitmaps for cleanliness,
Fam Zheng <=
- [Qemu-devel] [PATCH 15/22] memory: do not touch code dirty bitmap unless TCG is enabled, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 17/22] bitmap: add atomic test and clear, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 18/22] memory: use atomic ops for setting dirty memory bits, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 16/22] bitmap: add atomic set functions, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 19/22] migration: move dirty bitmap sync to ram_addr.h, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 21/22] memory: make cpu_physical_memory_sync_dirty_bitmap() fully atomic, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 20/22] memory: replace cpu_physical_memory_reset_dirty() with test-and-clear, Paolo Bonzini, 2015/03/26