From: Orit Wasserman <owasserm@redhat.com>
To: Juan Quintela <quintela@redhat.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 11/38] memory: cpu_physical_memory_mask_dirty_range() always clears a single flag
Date: Wed, 18 Dec 2013 12:14:04 +0200 [thread overview]
Message-ID: <52B1756C.8050407@redhat.com> (raw)
In-Reply-To: <1387293974-24718-12-git-send-email-quintela@redhat.com>
On 12/17/2013 05:25 PM, Juan Quintela wrote:
> Document it
>
> Signed-off-by: Juan Quintela <quintela@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
> cputlb.c | 4 ++--
> exec.c | 19 ++++++++++---------
> include/exec/memory-internal.h | 40 ++++++++++++++++++----------------------
> include/exec/memory.h | 3 ---
> memory.c | 10 ++++------
> 5 files changed, 34 insertions(+), 42 deletions(-)
>
> diff --git a/cputlb.c b/cputlb.c
> index 72452e5..dfd747a 100644
> --- a/cputlb.c
> +++ b/cputlb.c
> @@ -129,7 +129,7 @@ void tlb_protect_code(ram_addr_t ram_addr)
> {
> cpu_physical_memory_reset_dirty(ram_addr,
> ram_addr + TARGET_PAGE_SIZE,
> - CODE_DIRTY_FLAG);
> + DIRTY_MEMORY_CODE);
> }
>
> /* update the TLB so that writes in physical page 'phys_addr' are no longer
> @@ -137,7 +137,7 @@ void tlb_protect_code(ram_addr_t ram_addr)
> void tlb_unprotect_code_phys(CPUArchState *env, ram_addr_t ram_addr,
> target_ulong vaddr)
> {
> - cpu_physical_memory_set_dirty_flag(ram_addr, CODE_DIRTY_FLAG);
> + cpu_physical_memory_set_dirty_flag(ram_addr, DIRTY_MEMORY_CODE);
> }
>
> static bool tlb_is_dirty_ram(CPUTLBEntry *tlbe)
> diff --git a/exec.c b/exec.c
> index 45fdb84..9996da2 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -737,7 +737,7 @@ static void tlb_reset_dirty_range_all(ram_addr_t start, ram_addr_t end,
>
> /* Note: start and end must be within the same ram block. */
> void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
> - int dirty_flags)
> + unsigned client)
> {
> uintptr_t length;
>
> @@ -747,7 +747,7 @@ void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
> length = end - start;
> if (length == 0)
> return;
> - cpu_physical_memory_mask_dirty_range(start, length, dirty_flags);
> + cpu_physical_memory_mask_dirty_range(start, length, client);
>
> if (tcg_enabled()) {
> tlb_reset_dirty_range_all(start, end, length);
> @@ -1484,7 +1484,7 @@ found:
> static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
> uint64_t val, unsigned size)
> {
> - if (!cpu_physical_memory_get_dirty_flag(ram_addr, CODE_DIRTY_FLAG)) {
> + if (!cpu_physical_memory_get_dirty_flag(ram_addr, DIRTY_MEMORY_CODE)) {
> tb_invalidate_phys_page_fast(ram_addr, size);
> }
> switch (size) {
> @@ -1500,8 +1500,8 @@ static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
> default:
> abort();
> }
> - cpu_physical_memory_set_dirty_flag(ram_addr, MIGRATION_DIRTY_FLAG);
> - cpu_physical_memory_set_dirty_flag(ram_addr, VGA_DIRTY_FLAG);
> + cpu_physical_memory_set_dirty_flag(ram_addr, DIRTY_MEMORY_MIGRATION);
> + cpu_physical_memory_set_dirty_flag(ram_addr, DIRTY_MEMORY_VGA);
> /* we remove the notdirty callback only if the code has been
> flushed */
> if (cpu_physical_memory_is_dirty(ram_addr)) {
> @@ -1911,8 +1911,8 @@ static void invalidate_and_set_dirty(hwaddr addr,
> /* invalidate code */
> tb_invalidate_phys_page_range(addr, addr + length, 0);
> /* set dirty bit */
> - cpu_physical_memory_set_dirty_flag(addr, VGA_DIRTY_FLAG);
> - cpu_physical_memory_set_dirty_flag(addr, MIGRATION_DIRTY_FLAG);
> + cpu_physical_memory_set_dirty_flag(addr, DIRTY_MEMORY_VGA);
> + cpu_physical_memory_set_dirty_flag(addr, DIRTY_MEMORY_MIGRATION);
> }
> xen_modified_memory(addr, length);
> }
> @@ -2494,8 +2494,9 @@ void stl_phys_notdirty(hwaddr addr, uint32_t val)
> /* invalidate code */
> tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
> /* set dirty bit */
> - cpu_physical_memory_set_dirty_flag(addr1, MIGRATION_DIRTY_FLAG);
> - cpu_physical_memory_set_dirty_flag(addr1, VGA_DIRTY_FLAG);
> + cpu_physical_memory_set_dirty_flag(addr1,
> + DIRTY_MEMORY_MIGRATION);
> + cpu_physical_memory_set_dirty_flag(addr1, DIRTY_MEMORY_VGA);
> }
> }
> }
> diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h
> index 681d63b..b58010f 100644
> --- a/include/exec/memory-internal.h
> +++ b/include/exec/memory-internal.h
> @@ -40,29 +40,25 @@ void *qemu_get_ram_ptr(ram_addr_t addr);
> void qemu_ram_free(ram_addr_t addr);
> void qemu_ram_free_from_ptr(ram_addr_t addr);
>
> -#define VGA_DIRTY_FLAG 0x01
> -#define CODE_DIRTY_FLAG 0x02
> -#define MIGRATION_DIRTY_FLAG 0x08
> -
> static inline bool cpu_physical_memory_get_dirty_flag(ram_addr_t addr,
> - int dirty_flag)
> + unsigned client)
> {
> - return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] & dirty_flag;
> + return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] & (1 << client);
> }
>
> /* read dirty bit (return 0 or 1) */
> static inline bool cpu_physical_memory_is_dirty(ram_addr_t addr)
> {
> - bool vga = cpu_physical_memory_get_dirty_flag(addr, VGA_DIRTY_FLAG);
> - bool code = cpu_physical_memory_get_dirty_flag(addr, CODE_DIRTY_FLAG);
> + bool vga = cpu_physical_memory_get_dirty_flag(addr, DIRTY_MEMORY_VGA);
> + bool code = cpu_physical_memory_get_dirty_flag(addr, DIRTY_MEMORY_CODE);
> bool migration =
> - cpu_physical_memory_get_dirty_flag(addr, MIGRATION_DIRTY_FLAG);
> + cpu_physical_memory_get_dirty_flag(addr, DIRTY_MEMORY_MIGRATION);
> return vga && code && migration;
> }
>
> static inline int cpu_physical_memory_get_dirty(ram_addr_t start,
> ram_addr_t length,
> - int dirty_flag)
> + unsigned client)
> {
> int ret = 0;
> ram_addr_t addr, end;
> @@ -70,28 +66,28 @@ static inline int cpu_physical_memory_get_dirty(ram_addr_t start,
> end = TARGET_PAGE_ALIGN(start + length);
> start &= TARGET_PAGE_MASK;
> for (addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
> - ret |= cpu_physical_memory_get_dirty_flag(addr, dirty_flag);
> + ret |= cpu_physical_memory_get_dirty_flag(addr, client);
> }
> return ret;
> }
>
> static inline void cpu_physical_memory_set_dirty_flag(ram_addr_t addr,
> - int dirty_flag)
> + unsigned client)
> {
> - ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] |= dirty_flag;
> + ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] |= (1 << client);
> }
>
> static inline void cpu_physical_memory_set_dirty(ram_addr_t addr)
> {
> - cpu_physical_memory_set_dirty_flag(addr, MIGRATION_DIRTY_FLAG);
> - cpu_physical_memory_set_dirty_flag(addr, VGA_DIRTY_FLAG);
> - cpu_physical_memory_set_dirty_flag(addr, CODE_DIRTY_FLAG);
> + cpu_physical_memory_set_dirty_flag(addr, DIRTY_MEMORY_MIGRATION);
> + cpu_physical_memory_set_dirty_flag(addr, DIRTY_MEMORY_VGA);
> + cpu_physical_memory_set_dirty_flag(addr, DIRTY_MEMORY_CODE);
> }
>
> -static inline int cpu_physical_memory_clear_dirty_flags(ram_addr_t addr,
> - int dirty_flags)
> +static inline int cpu_physical_memory_clear_dirty_flag(ram_addr_t addr,
> + unsigned client)
> {
> - int mask = ~dirty_flags;
> + int mask = ~(1 << client);
>
> return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] &= mask;
> }
> @@ -111,19 +107,19 @@ static inline void cpu_physical_memory_set_dirty_range(ram_addr_t start,
>
> static inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start,
> ram_addr_t length,
> - int dirty_flags)
> + unsigned client)
> {
> ram_addr_t addr, end;
>
> end = TARGET_PAGE_ALIGN(start + length);
> start &= TARGET_PAGE_MASK;
> for (addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
> - cpu_physical_memory_clear_dirty_flags(addr, dirty_flags);
> + cpu_physical_memory_clear_dirty_flag(addr, client);
> }
> }
>
> void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
> - int dirty_flags);
> + unsigned client);
>
> #endif
>
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index 480dfbf..b8e76f4 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -33,9 +33,6 @@
> typedef struct MemoryRegionOps MemoryRegionOps;
> typedef struct MemoryRegionMmio MemoryRegionMmio;
>
> -/* Must match *_DIRTY_FLAGS in cpu-all.h. To be replaced with dynamic
> - * registration.
> - */
> #define DIRTY_MEMORY_VGA 0
> #define DIRTY_MEMORY_CODE 1
> #define DIRTY_MEMORY_MIGRATION 3
> diff --git a/memory.c b/memory.c
> index fb52e1c..a490cbd 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1174,8 +1174,7 @@ bool memory_region_get_dirty(MemoryRegion *mr, hwaddr addr,
> hwaddr size, unsigned client)
> {
> assert(mr->terminates);
> - return cpu_physical_memory_get_dirty(mr->ram_addr + addr, size,
> - 1 << client);
> + return cpu_physical_memory_get_dirty(mr->ram_addr + addr, size, client);
> }
>
> void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr,
> @@ -1190,12 +1189,11 @@ bool memory_region_test_and_clear_dirty(MemoryRegion *mr, hwaddr addr,
> {
> bool ret;
> assert(mr->terminates);
> - ret = cpu_physical_memory_get_dirty(mr->ram_addr + addr, size,
> - 1 << client);
> + ret = cpu_physical_memory_get_dirty(mr->ram_addr + addr, size, client);
> if (ret) {
> cpu_physical_memory_reset_dirty(mr->ram_addr + addr,
> mr->ram_addr + addr + size,
> - 1 << client);
> + client);
> }
> return ret;
> }
> @@ -1243,7 +1241,7 @@ void memory_region_reset_dirty(MemoryRegion *mr, hwaddr addr,
> assert(mr->terminates);
> cpu_physical_memory_reset_dirty(mr->ram_addr + addr,
> mr->ram_addr + addr + size,
> - 1 << client);
> + client);
> }
>
> void *memory_region_get_ram_ptr(MemoryRegion *mr)
>
Reviewed-by: Orit Wasserman <owasserm@redhat.com>
next prev parent reply other threads:[~2013-12-18 10:13 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-17 15:25 [Qemu-devel] [PATCH v3 00/38] bitmap queue Juan Quintela
2013-12-17 15:25 ` [Qemu-devel] [PATCH 01/38] bitmap: use long as index Juan Quintela
2013-12-17 18:05 ` Eric Blake
2013-12-17 18:27 ` Stefan Weil
2013-12-17 20:21 ` Juan Quintela
2013-12-24 13:24 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 02/38] memory: cpu_physical_memory_set_dirty_flags() result is never used Juan Quintela
2013-12-17 15:25 ` [Qemu-devel] [PATCH 03/38] memory: cpu_physical_memory_set_dirty_range() return void Juan Quintela
2013-12-17 15:25 ` [Qemu-devel] [PATCH 04/38] exec: use accessor function to know if memory is dirty Juan Quintela
2013-12-17 15:25 ` [Qemu-devel] [PATCH 05/38] memory: create function to set a single dirty bit Juan Quintela
2013-12-17 15:25 ` [Qemu-devel] [PATCH 06/38] exec: create function to get " Juan Quintela
2013-12-17 15:25 ` [Qemu-devel] [PATCH 07/38] memory: make cpu_physical_memory_is_dirty return bool Juan Quintela
2013-12-18 10:08 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 08/38] memory: all users of cpu_physical_memory_get_dirty used only one flag Juan Quintela
2013-12-18 10:09 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 09/38] memory: set single dirty flags when possible Juan Quintela
2013-12-18 10:10 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 10/38] memory: cpu_physical_memory_set_dirty_range() always dirty all flags Juan Quintela
2013-12-18 10:12 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 11/38] memory: cpu_physical_memory_mask_dirty_range() always clears a single flag Juan Quintela
2013-12-18 10:14 ` Orit Wasserman [this message]
2013-12-17 15:25 ` [Qemu-devel] [PATCH 12/38] memory: use bit 2 for migration Juan Quintela
2013-12-18 10:15 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 13/38] memory: make sure that client is always inside range Juan Quintela
2013-12-18 10:16 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 14/38] memory: only resize dirty bitmap when memory size increases Juan Quintela
2013-12-18 10:17 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 15/38] memory: cpu_physical_memory_clear_dirty_flag() result is never used Juan Quintela
2013-12-18 10:17 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 16/38] bitmap: Add bitmap_zero_extend operation Juan Quintela
2013-12-18 10:18 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 17/38] memory: split dirty bitmap into three Juan Quintela
2013-12-18 10:22 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 18/38] memory: unfold cpu_physical_memory_clear_dirty_flag() in its only user Juan Quintela
2013-12-18 10:28 ` Orit Wasserman
2013-12-18 10:36 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 19/38] memory: unfold cpu_physical_memory_set_dirty() " Juan Quintela
2013-12-18 10:28 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 20/38] memory: unfold cpu_physical_memory_set_dirty_flag() Juan Quintela
2013-12-18 10:29 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 21/38] memory: make cpu_physical_memory_get_dirty() the main function Juan Quintela
2013-12-18 10:30 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 22/38] memory: cpu_physical_memory_get_dirty() is used as returning a bool Juan Quintela
2013-12-18 10:33 ` Orit Wasserman
2013-12-17 15:25 ` [Qemu-devel] [PATCH 23/38] memory: s/mask/clear/ cpu_physical_memory_mask_dirty_range Juan Quintela
2013-12-18 10:38 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 24/38] memory: use find_next_bit() to find dirty bits Juan Quintela
2013-12-18 11:48 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 25/38] memory: cpu_physical_memory_set_dirty_range() now uses bitmap operations Juan Quintela
2013-12-18 11:50 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 26/38] memory: cpu_physical_memory_clear_dirty_range() " Juan Quintela
2013-12-18 11:50 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 27/38] memory: s/dirty/clean/ in cpu_physical_memory_is_dirty() Juan Quintela
2013-12-18 11:51 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 28/38] memory: make cpu_physical_memory_reset_dirty() take a length parameter Juan Quintela
2013-12-18 11:53 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 29/38] memory: cpu_physical_memory_set_dirty_tracking() should return void Juan Quintela
2013-12-18 11:54 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 30/38] memory: split cpu_physical_memory_* functions to its own include Juan Quintela
2013-12-18 12:12 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 31/38] memory: unfold memory_region_test_and_clear() Juan Quintela
2013-12-18 12:25 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 32/38] kvm: use directly cpu_physical_memory_* api for tracking dirty pages Juan Quintela
2013-12-19 10:03 ` Orit Wasserman
2013-12-19 10:06 ` Peter Maydell
2013-12-19 13:24 ` Juan Quintela
2013-12-17 15:26 ` [Qemu-devel] [PATCH 33/38] kvm: refactor start address calculation Juan Quintela
2013-12-19 10:04 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 34/38] memory: move bitmap synchronization to its own function Juan Quintela
2013-12-19 10:08 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 35/38] memory: syncronize kvm bitmap using bitmaps operations Juan Quintela
2013-12-19 10:25 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 36/38] ram: split function that synchronizes a range Juan Quintela
2013-12-19 10:45 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 37/38] migration: synchronize memory bitmap 64bits at a time Juan Quintela
2013-12-19 11:22 ` Orit Wasserman
2013-12-17 15:26 ` [Qemu-devel] [PATCH 38/38] ram: align ram_addr_t's regions in multiples of 64 Juan Quintela
2013-12-17 16:05 ` Juan Quintela
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52B1756C.8050407@redhat.com \
--to=owasserm@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.