From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Kd9F0-0001dh-Cw for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:51:10 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Kd9Ev-0001Tr-TG for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:51:08 -0400 Received: from [199.232.76.173] (port=35811 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Kd9Eu-0001Tg-Ps for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:51:04 -0400 Received: from e31.co.us.ibm.com ([32.97.110.149]:39381) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Kd9Ev-0001vM-0P for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:51:05 -0400 Received: from d03relay02.boulder.ibm.com (d03relay02.boulder.ibm.com [9.17.195.227]) by e31.co.us.ibm.com (8.13.8/8.13.8) with ESMTP id m89Jor5s022495 for ; Tue, 9 Sep 2008 15:50:53 -0400 Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id m89JoplT200512 for ; Tue, 9 Sep 2008 13:50:52 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m89Jopmq007688 for ; Tue, 9 Sep 2008 13:50:51 -0600 From: Anthony Liguori Date: Tue, 9 Sep 2008 14:49:56 -0500 Message-Id: <1220989802-13706-5-git-send-email-aliguori@us.ibm.com> In-Reply-To: <1220989802-13706-1-git-send-email-aliguori@us.ibm.com> References: <1220989802-13706-1-git-send-email-aliguori@us.ibm.com> Subject: [Qemu-devel] [PATCH 4/10] Add dirty tracking for live migration Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Chris Wright , Uri Lublin , Anthony Liguori , kvm@vger.kernel.org This patch adds a dirty tracking bit for live migration. We use 0x08 because kqemu uses 0x04. Signed-off-by: Anthony Liguori diff --git a/cpu-all.h b/cpu-all.h index d350b30..fdac353 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -944,6 +944,7 @@ int cpu_memory_rw_debug(CPUState *env, target_ulong addr, #define VGA_DIRTY_FLAG 0x01 #define CODE_DIRTY_FLAG 0x02 +#define MIGRATION_DIRTY_FLAG 0x08 /* read dirty bit (return 0 or 1) */ static inline int cpu_physical_memory_is_dirty(ram_addr_t addr) @@ -966,6 +967,10 @@ void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end, int dirty_flags); void cpu_tlb_update_dirty(CPUState *env); +int cpu_physical_memory_set_dirty_tracking(int enable); + +int cpu_physical_memory_get_dirty_tracking(void); + void dump_exec_info(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...)); diff --git a/exec.c b/exec.c index 3ab4ad0..9dba5c8 100644 --- a/exec.c +++ b/exec.c @@ -38,6 +38,7 @@ #include "qemu-common.h" #include "tcg.h" #include "hw/hw.h" +#include "osdep.h" #if defined(CONFIG_USER_ONLY) #include #endif @@ -113,6 +114,7 @@ ram_addr_t phys_ram_size; int phys_ram_fd; uint8_t *phys_ram_base; uint8_t *phys_ram_dirty; +static int in_migration; static ram_addr_t phys_ram_alloc_offset = 0; #endif @@ -1777,6 +1779,17 @@ void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end, } } +int cpu_physical_memory_set_dirty_tracking(int enable) +{ + in_migration = enable; + return 0; +} + +int cpu_physical_memory_get_dirty_tracking(void) +{ + return in_migration; +} + static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry) { ram_addr_t ram_addr; @@ -2932,9 +2945,19 @@ void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val) io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val); } else { - ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) + - (addr & ~TARGET_PAGE_MASK); + unsigned long addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK); + ptr = phys_ram_base + addr1; stl_p(ptr, val); + + if (unlikely(in_migration)) { + if (!cpu_physical_memory_is_dirty(addr1)) { + /* invalidate code */ + tb_invalidate_phys_page_range(addr1, addr1 + 4, 0); + /* set dirty bit */ + phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |= + (0xff & ~CODE_DIRTY_FLAG); + } + } } }