* [Qemu-devel] [PATCH 0/8] Convert live migration to memory API
@ 2011-12-21 13:34 Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 1/8] Store MemoryRegion in RAMBlock Avi Kivity
` (8 more replies)
0 siblings, 9 replies; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 13:34 UTC (permalink / raw)
To: Anthony Liguori, qemu-devel, quintela
These patches, on top of "vmstate, memory: decouple vmstate from memory API",
convert live migration to use the memory API.
Patch 4 is an ABI change, please review carefully.
Avi Kivity (8):
Store MemoryRegion in RAMBlock
Switch ram_save to the memory API
Sort RAMBlocks by ID for migration, not by ram_addr
Remove support for version 3 ram_load
Convert ram_load() to the memory API
memory: obsolete cpu_physical_memory_[gs]et_dirty_tracking()
xen: convert framebuffer dirty tracking to memory API
memory: obsolete more dirty memory related functions
arch_init.c | 71 +++++++++++++++++++-----------------------------------
cpu-all.h | 54 +-----------------------------------------
exec-obsolete.h | 51 +++++++++++++++++++++++++++++++++++++++
exec.c | 11 +-------
memory.c | 2 +
xen-all.c | 5 +--
6 files changed, 82 insertions(+), 112 deletions(-)
--
1.7.7.1
^ permalink raw reply [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH 1/8] Store MemoryRegion in RAMBlock
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
@ 2011-12-21 13:34 ` Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 2/8] Switch ram_save to the memory API Avi Kivity
` (7 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 13:34 UTC (permalink / raw)
To: Anthony Liguori, qemu-devel, quintela
As a step in moving live migration from RAMBlocks to MemoryRegions,
store the MemoryRegion in a RAMBlock.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
cpu-all.h | 1 +
exec.c | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/cpu-all.h b/cpu-all.h
index 734833a..4acaa8b 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -476,6 +476,7 @@ extern ram_addr_t ram_size;
#define RAM_PREALLOC_MASK (1 << 0)
typedef struct RAMBlock {
+ struct MemoryRegion *mr;
uint8_t *host;
ram_addr_t offset;
ram_addr_t length;
diff --git a/exec.c b/exec.c
index dffceb9..a4116d9 100644
--- a/exec.c
+++ b/exec.c
@@ -2793,6 +2793,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
size = TARGET_PAGE_ALIGN(size);
new_block = g_malloc0(sizeof(*new_block));
+ new_block->mr = mr;
new_block->offset = find_ram_offset(size);
if (host) {
new_block->host = host;
--
1.7.7.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH 2/8] Switch ram_save to the memory API
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 1/8] Store MemoryRegion in RAMBlock Avi Kivity
@ 2011-12-21 13:34 ` Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 3/8] Sort RAMBlocks by ID for migration, not by ram_addr Avi Kivity
` (6 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 13:34 UTC (permalink / raw)
To: Anthony Liguori, qemu-devel, quintela
Avoid using ram_addr_t, instead use (MemoryRegion *, offset) pairs.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
arch_init.c | 34 ++++++++++++++--------------------
1 files changed, 14 insertions(+), 20 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index ceef26e..2743bfd 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -117,24 +117,22 @@ static int ram_save_block(QEMUFile *f)
{
RAMBlock *block = last_block;
ram_addr_t offset = last_offset;
- ram_addr_t current_addr;
int bytes_sent = 0;
+ MemoryRegion *mr;
if (!block)
block = QLIST_FIRST(&ram_list.blocks);
- current_addr = block->offset + offset;
-
do {
- if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
+ mr = block->mr;
+ if (memory_region_get_dirty(mr, offset, DIRTY_MEMORY_MIGRATION)) {
uint8_t *p;
int cont = (block == last_block) ? RAM_SAVE_FLAG_CONTINUE : 0;
- cpu_physical_memory_reset_dirty(current_addr,
- current_addr + TARGET_PAGE_SIZE,
- MIGRATION_DIRTY_FLAG);
+ memory_region_reset_dirty(mr, offset, TARGET_PAGE_SIZE,
+ DIRTY_MEMORY_MIGRATION);
- p = block->host + offset;
+ p = memory_region_get_ram_ptr(mr) + offset;
if (is_dup_page(p, *p)) {
qemu_put_be64(f, offset | cont | RAM_SAVE_FLAG_COMPRESS);
@@ -166,10 +164,7 @@ static int ram_save_block(QEMUFile *f)
if (!block)
block = QLIST_FIRST(&ram_list.blocks);
}
-
- current_addr = block->offset + offset;
-
- } while (current_addr != last_block->offset + last_offset);
+ } while (block != last_block || offset != last_offset);
last_block = block;
last_offset = offset;
@@ -186,9 +181,9 @@ static ram_addr_t ram_save_remaining(void)
QLIST_FOREACH(block, &ram_list.blocks, next) {
ram_addr_t addr;
- for (addr = block->offset; addr < block->offset + block->length;
- addr += TARGET_PAGE_SIZE) {
- if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) {
+ for (addr = 0; addr < block->length; addr += TARGET_PAGE_SIZE) {
+ if (memory_region_get_dirty(block->mr, addr,
+ DIRTY_MEMORY_MIGRATION)) {
count++;
}
}
@@ -275,11 +270,10 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
/* Make sure all dirty bits are set */
QLIST_FOREACH(block, &ram_list.blocks, next) {
- for (addr = block->offset; addr < block->offset + block->length;
- addr += TARGET_PAGE_SIZE) {
- if (!cpu_physical_memory_get_dirty(addr,
- MIGRATION_DIRTY_FLAG)) {
- cpu_physical_memory_set_dirty(addr);
+ for (addr = 0; addr < block->length; addr += TARGET_PAGE_SIZE) {
+ if (!memory_region_get_dirty(block->mr, addr,
+ DIRTY_MEMORY_MIGRATION)) {
+ memory_region_set_dirty(block->mr, addr);
}
}
}
--
1.7.7.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH 3/8] Sort RAMBlocks by ID for migration, not by ram_addr
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 1/8] Store MemoryRegion in RAMBlock Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 2/8] Switch ram_save to the memory API Avi Kivity
@ 2011-12-21 13:34 ` Avi Kivity
2011-12-21 13:55 ` Anthony Liguori
2011-12-21 13:34 ` [Qemu-devel] [PATCH 4/8] Remove support for version 3 ram_load Avi Kivity
` (5 subsequent siblings)
8 siblings, 1 reply; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 13:34 UTC (permalink / raw)
To: Anthony Liguori, qemu-devel, quintela
ram_addr is (a) unstable (b) going away. Sort by idstr instead.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
arch_init.c | 8 ++------
1 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index 2743bfd..8a3f052 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -217,12 +217,8 @@ static int block_compar(const void *a, const void *b)
{
RAMBlock * const *ablock = a;
RAMBlock * const *bblock = b;
- if ((*ablock)->offset < (*bblock)->offset) {
- return -1;
- } else if ((*ablock)->offset > (*bblock)->offset) {
- return 1;
- }
- return 0;
+
+ return strcmp((*ablock)->idstr, (*bblock)->idstr);
}
static void sort_ram_list(void)
--
1.7.7.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH 4/8] Remove support for version 3 ram_load
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
` (2 preceding siblings ...)
2011-12-21 13:34 ` [Qemu-devel] [PATCH 3/8] Sort RAMBlocks by ID for migration, not by ram_addr Avi Kivity
@ 2011-12-21 13:34 ` Avi Kivity
2011-12-21 13:57 ` Anthony Liguori
2011-12-21 13:34 ` [Qemu-devel] [PATCH 5/8] Convert ram_load() to the memory API Avi Kivity
` (4 subsequent siblings)
8 siblings, 1 reply; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 13:34 UTC (permalink / raw)
To: Anthony Liguori, qemu-devel, quintela
Version 3 ram_load depends on ram_addrs, which are not stable. Version 4
was introduced in 0.13 (and RHEL 6), so this means live migration from 0.12
and earlier to 1.1 or later will not work.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
arch_init.c | 18 ++++--------------
1 files changed, 4 insertions(+), 14 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index 8a3f052..9b8a1f3 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -366,7 +366,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_id)
int flags;
int error;
- if (version_id < 3 || version_id > 4) {
+ if (version_id < 4 || version_id > 4) {
return -EINVAL;
}
@@ -377,11 +377,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_id)
addr &= TARGET_PAGE_MASK;
if (flags & RAM_SAVE_FLAG_MEM_SIZE) {
- if (version_id == 3) {
- if (addr != ram_bytes_total()) {
- return -EINVAL;
- }
- } else {
+ if (version_id == 4) {
/* Synchronize RAM block list */
char id[256];
ram_addr_t length;
@@ -419,10 +415,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_id)
void *host;
uint8_t ch;
- if (version_id == 3)
- host = qemu_get_ram_ptr(addr);
- else
- host = host_from_stream_offset(f, addr, flags);
+ host = host_from_stream_offset(f, addr, flags);
if (!host) {
return -EINVAL;
}
@@ -438,10 +431,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_id)
} else if (flags & RAM_SAVE_FLAG_PAGE) {
void *host;
- if (version_id == 3)
- host = qemu_get_ram_ptr(addr);
- else
- host = host_from_stream_offset(f, addr, flags);
+ host = host_from_stream_offset(f, addr, flags);
qemu_get_buffer(f, host, TARGET_PAGE_SIZE);
}
--
1.7.7.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH 5/8] Convert ram_load() to the memory API
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
` (3 preceding siblings ...)
2011-12-21 13:34 ` [Qemu-devel] [PATCH 4/8] Remove support for version 3 ram_load Avi Kivity
@ 2011-12-21 13:34 ` Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 6/8] memory: obsolete cpu_physical_memory_[gs]et_dirty_tracking() Avi Kivity
` (3 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 13:34 UTC (permalink / raw)
To: Anthony Liguori, qemu-devel, quintela
Signed-off-by: Avi Kivity <avi@redhat.com>
---
arch_init.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index 9b8a1f3..381c055 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -344,7 +344,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
return NULL;
}
- return block->host + offset;
+ return memory_region_get_ram_ptr(block->mr) + offset;
}
len = qemu_get_byte(f);
@@ -353,7 +353,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
QLIST_FOREACH(block, &ram_list.blocks, next) {
if (!strncmp(id, block->idstr, sizeof(id)))
- return block->host + offset;
+ return memory_region_get_ram_ptr(block->mr) + offset;
}
fprintf(stderr, "Can't find block %s!\n", id);
--
1.7.7.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH 6/8] memory: obsolete cpu_physical_memory_[gs]et_dirty_tracking()
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
` (4 preceding siblings ...)
2011-12-21 13:34 ` [Qemu-devel] [PATCH 5/8] Convert ram_load() to the memory API Avi Kivity
@ 2011-12-21 13:34 ` Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 7/8] xen: convert framebuffer dirty tracking to memory API Avi Kivity
` (2 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 13:34 UTC (permalink / raw)
To: Anthony Liguori, qemu-devel, quintela
The getter is no longer used, so it is completely removed.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
arch_init.c | 7 +++----
cpu-all.h | 4 ----
exec-obsolete.h | 2 ++
exec.c | 10 ----------
memory.c | 2 ++
5 files changed, 7 insertions(+), 18 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index 381c055..d3adacf 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -251,7 +251,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
int ret;
if (stage < 0) {
- cpu_physical_memory_set_dirty_tracking(0);
+ memory_global_dirty_log_stop();
return 0;
}
@@ -274,8 +274,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
}
}
- /* Enable dirty memory tracking */
- cpu_physical_memory_set_dirty_tracking(1);
+ memory_global_dirty_log_start();
qemu_put_be64(f, ram_bytes_total() | RAM_SAVE_FLAG_MEM_SIZE);
@@ -320,7 +319,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
while ((bytes_sent = ram_save_block(f)) != 0) {
bytes_transferred += bytes_sent;
}
- cpu_physical_memory_set_dirty_tracking(0);
+ memory_global_dirty_log_stop();
}
qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
diff --git a/cpu-all.h b/cpu-all.h
index 4acaa8b..2fdb856 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -566,10 +566,6 @@ 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, fprintf_function cpu_fprintf);
#endif /* !CONFIG_USER_ONLY */
diff --git a/exec-obsolete.h b/exec-obsolete.h
index 3a2faae..880105e 100644
--- a/exec-obsolete.h
+++ b/exec-obsolete.h
@@ -61,6 +61,8 @@ static inline void cpu_register_physical_memory(target_phys_addr_t start_addr,
void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
+int cpu_physical_memory_set_dirty_tracking(int enable);
+
#endif
#endif
diff --git a/exec.c b/exec.c
index a4116d9..28c057c 100644
--- a/exec.c
+++ b/exec.c
@@ -2008,19 +2008,9 @@ int cpu_physical_memory_set_dirty_tracking(int enable)
{
int ret = 0;
in_migration = enable;
- if (enable) {
- memory_global_dirty_log_start();
- } else {
- memory_global_dirty_log_stop();
- }
return ret;
}
-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;
diff --git a/memory.c b/memory.c
index f7b3d50..868ffd0 100644
--- a/memory.c
+++ b/memory.c
@@ -1493,6 +1493,7 @@ void memory_global_dirty_log_start(void)
{
MemoryListener *listener;
+ cpu_physical_memory_set_dirty_tracking(1);
global_dirty_log = true;
QLIST_FOREACH(listener, &memory_listeners, link) {
listener->log_global_start(listener);
@@ -1507,6 +1508,7 @@ void memory_global_dirty_log_stop(void)
QLIST_FOREACH(listener, &memory_listeners, link) {
listener->log_global_stop(listener);
}
+ cpu_physical_memory_set_dirty_tracking(0);
}
static void listener_add_address_space(MemoryListener *listener,
--
1.7.7.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH 7/8] xen: convert framebuffer dirty tracking to memory API
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
` (5 preceding siblings ...)
2011-12-21 13:34 ` [Qemu-devel] [PATCH 6/8] memory: obsolete cpu_physical_memory_[gs]et_dirty_tracking() Avi Kivity
@ 2011-12-21 13:34 ` Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 8/8] memory: obsolete more dirty memory related functions Avi Kivity
2011-12-21 13:59 ` [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Anthony Liguori
8 siblings, 0 replies; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 13:34 UTC (permalink / raw)
To: Anthony Liguori, qemu-devel, quintela
Signed-off-by: Avi Kivity <avi@redhat.com>
---
xen-all.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/xen-all.c b/xen-all.c
index df70592..8f9db95 100644
--- a/xen-all.c
+++ b/xen-all.c
@@ -408,7 +408,6 @@ static int xen_sync_dirty_bitmap(XenIOState *state,
ram_addr_t size)
{
target_phys_addr_t npages = size >> TARGET_PAGE_BITS;
- target_phys_addr_t vram_offset = 0;
const int width = sizeof(unsigned long) * 8;
unsigned long bitmap[(npages + width - 1) / width];
int rc, i, j;
@@ -425,7 +424,6 @@ static int xen_sync_dirty_bitmap(XenIOState *state,
} else if (state->log_for_dirtybit != physmap) {
return -1;
}
- vram_offset = physmap->phys_offset;
rc = xc_hvm_track_dirty_vram(xen_xc, xen_domid,
start_addr >> TARGET_PAGE_BITS, npages,
@@ -439,7 +437,8 @@ static int xen_sync_dirty_bitmap(XenIOState *state,
while (map != 0) {
j = ffsl(map) - 1;
map &= ~(1ul << j);
- cpu_physical_memory_set_dirty(vram_offset + (i * width + j) * TARGET_PAGE_SIZE);
+ memory_region_set_dirty(framebuffer,
+ (i * width + j) * TARGET_PAGE_SIZE);
};
}
--
1.7.7.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH 8/8] memory: obsolete more dirty memory related functions
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
` (6 preceding siblings ...)
2011-12-21 13:34 ` [Qemu-devel] [PATCH 7/8] xen: convert framebuffer dirty tracking to memory API Avi Kivity
@ 2011-12-21 13:34 ` Avi Kivity
2011-12-21 13:59 ` [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Anthony Liguori
8 siblings, 0 replies; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 13:34 UTC (permalink / raw)
To: Anthony Liguori, qemu-devel, quintela
No longer used outside memory.c and exec.c.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
cpu-all.h | 49 -------------------------------------------------
exec-obsolete.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 49 deletions(-)
diff --git a/cpu-all.h b/cpu-all.h
index 2fdb856..31d5b27 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -515,55 +515,6 @@ extern int mem_prealloc;
/* Set if TLB entry is an IO callback. */
#define TLB_MMIO (1 << 5)
-#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)
-{
- return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] == 0xff;
-}
-
-static inline int cpu_physical_memory_get_dirty_flags(ram_addr_t addr)
-{
- return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS];
-}
-
-static inline int cpu_physical_memory_get_dirty(ram_addr_t addr,
- int dirty_flags)
-{
- return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] & dirty_flags;
-}
-
-static inline void cpu_physical_memory_set_dirty(ram_addr_t addr)
-{
- ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] = 0xff;
-}
-
-static inline int cpu_physical_memory_set_dirty_flags(ram_addr_t addr,
- int dirty_flags)
-{
- return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] |= dirty_flags;
-}
-
-static inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start,
- int length,
- int dirty_flags)
-{
- int i, mask, len;
- uint8_t *p;
-
- len = length >> TARGET_PAGE_BITS;
- mask = ~dirty_flags;
- p = ram_list.phys_dirty + (start >> TARGET_PAGE_BITS);
- for (i = 0; i < len; i++) {
- p[i] &= mask;
- }
-}
-
-void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
- int dirty_flags);
void cpu_tlb_update_dirty(CPUState *env);
void dump_exec_info(FILE *f, fprintf_function cpu_fprintf);
diff --git a/exec-obsolete.h b/exec-obsolete.h
index 880105e..698d7fc 100644
--- a/exec-obsolete.h
+++ b/exec-obsolete.h
@@ -63,6 +63,55 @@ void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
int cpu_physical_memory_set_dirty_tracking(int enable);
+#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)
+{
+ return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] == 0xff;
+}
+
+static inline int cpu_physical_memory_get_dirty_flags(ram_addr_t addr)
+{
+ return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS];
+}
+
+static inline int cpu_physical_memory_get_dirty(ram_addr_t addr,
+ int dirty_flags)
+{
+ return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] & dirty_flags;
+}
+
+static inline void cpu_physical_memory_set_dirty(ram_addr_t addr)
+{
+ ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] = 0xff;
+}
+
+static inline int cpu_physical_memory_set_dirty_flags(ram_addr_t addr,
+ int dirty_flags)
+{
+ return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] |= dirty_flags;
+}
+
+static inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start,
+ int length,
+ int dirty_flags)
+{
+ int i, mask, len;
+ uint8_t *p;
+
+ len = length >> TARGET_PAGE_BITS;
+ mask = ~dirty_flags;
+ p = ram_list.phys_dirty + (start >> TARGET_PAGE_BITS);
+ for (i = 0; i < len; i++) {
+ p[i] &= mask;
+ }
+}
+
+void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
+ int dirty_flags);
#endif
#endif
--
1.7.7.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH 3/8] Sort RAMBlocks by ID for migration, not by ram_addr
2011-12-21 13:34 ` [Qemu-devel] [PATCH 3/8] Sort RAMBlocks by ID for migration, not by ram_addr Avi Kivity
@ 2011-12-21 13:55 ` Anthony Liguori
2011-12-21 15:15 ` Avi Kivity
0 siblings, 1 reply; 14+ messages in thread
From: Anthony Liguori @ 2011-12-21 13:55 UTC (permalink / raw)
To: Avi Kivity; +Cc: qemu-devel, quintela
On 12/21/2011 07:34 AM, Avi Kivity wrote:
> ram_addr is (a) unstable (b) going away. Sort by idstr instead.
>
> Signed-off-by: Avi Kivity<avi@redhat.com>
I don't see this as a problem, per say, but this is a significant behavioral
change. ram_addr does correspond roughly to the location in memory and
historically we would send memory starting from 0 upward whereas now, the order
that we send RAMBlocks will be random for all intents and purposes.
Again, I don't think it's a problem, but we should note this in the commit
message in case it creates a problem down the road.
Regards,
Anthony Liguori
> ---
> arch_init.c | 8 ++------
> 1 files changed, 2 insertions(+), 6 deletions(-)
>
> diff --git a/arch_init.c b/arch_init.c
> index 2743bfd..8a3f052 100644
> --- a/arch_init.c
> +++ b/arch_init.c
> @@ -217,12 +217,8 @@ static int block_compar(const void *a, const void *b)
> {
> RAMBlock * const *ablock = a;
> RAMBlock * const *bblock = b;
> - if ((*ablock)->offset< (*bblock)->offset) {
> - return -1;
> - } else if ((*ablock)->offset> (*bblock)->offset) {
> - return 1;
> - }
> - return 0;
> +
> + return strcmp((*ablock)->idstr, (*bblock)->idstr);
> }
>
> static void sort_ram_list(void)
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH 4/8] Remove support for version 3 ram_load
2011-12-21 13:34 ` [Qemu-devel] [PATCH 4/8] Remove support for version 3 ram_load Avi Kivity
@ 2011-12-21 13:57 ` Anthony Liguori
2011-12-21 15:18 ` Avi Kivity
0 siblings, 1 reply; 14+ messages in thread
From: Anthony Liguori @ 2011-12-21 13:57 UTC (permalink / raw)
To: Avi Kivity; +Cc: qemu-devel, quintela
On 12/21/2011 07:34 AM, Avi Kivity wrote:
> Version 3 ram_load depends on ram_addrs, which are not stable. Version 4
> was introduced in 0.13 (and RHEL 6), so this means live migration from 0.12
> and earlier to 1.1 or later will not work.
Can you please make a note on http://wiki.qemu.org/ChangeLog/Next
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
Regards,
Anthony Liguori
>
> Signed-off-by: Avi Kivity<avi@redhat.com>
> ---
> arch_init.c | 18 ++++--------------
> 1 files changed, 4 insertions(+), 14 deletions(-)
>
> diff --git a/arch_init.c b/arch_init.c
> index 8a3f052..9b8a1f3 100644
> --- a/arch_init.c
> +++ b/arch_init.c
> @@ -366,7 +366,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_id)
> int flags;
> int error;
>
> - if (version_id< 3 || version_id> 4) {
> + if (version_id< 4 || version_id> 4) {
> return -EINVAL;
> }
>
> @@ -377,11 +377,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_id)
> addr&= TARGET_PAGE_MASK;
>
> if (flags& RAM_SAVE_FLAG_MEM_SIZE) {
> - if (version_id == 3) {
> - if (addr != ram_bytes_total()) {
> - return -EINVAL;
> - }
> - } else {
> + if (version_id == 4) {
> /* Synchronize RAM block list */
> char id[256];
> ram_addr_t length;
> @@ -419,10 +415,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_id)
> void *host;
> uint8_t ch;
>
> - if (version_id == 3)
> - host = qemu_get_ram_ptr(addr);
> - else
> - host = host_from_stream_offset(f, addr, flags);
> + host = host_from_stream_offset(f, addr, flags);
> if (!host) {
> return -EINVAL;
> }
> @@ -438,10 +431,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_id)
> } else if (flags& RAM_SAVE_FLAG_PAGE) {
> void *host;
>
> - if (version_id == 3)
> - host = qemu_get_ram_ptr(addr);
> - else
> - host = host_from_stream_offset(f, addr, flags);
> + host = host_from_stream_offset(f, addr, flags);
>
> qemu_get_buffer(f, host, TARGET_PAGE_SIZE);
> }
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH 0/8] Convert live migration to memory API
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
` (7 preceding siblings ...)
2011-12-21 13:34 ` [Qemu-devel] [PATCH 8/8] memory: obsolete more dirty memory related functions Avi Kivity
@ 2011-12-21 13:59 ` Anthony Liguori
8 siblings, 0 replies; 14+ messages in thread
From: Anthony Liguori @ 2011-12-21 13:59 UTC (permalink / raw)
To: Avi Kivity; +Cc: qemu-devel, quintela
On 12/21/2011 07:34 AM, Avi Kivity wrote:
> These patches, on top of "vmstate, memory: decouple vmstate from memory API",
> convert live migration to use the memory API.
>
> Patch 4 is an ABI change, please review carefully.
Using ram_addr_t for migration was badly, badly broken. I think it's been long
enough that we can safely remove that logic.
Other than my request for a better commit message, this whole series:
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
Regards,
Anthony Liguori
>
> Avi Kivity (8):
> Store MemoryRegion in RAMBlock
> Switch ram_save to the memory API
> Sort RAMBlocks by ID for migration, not by ram_addr
> Remove support for version 3 ram_load
> Convert ram_load() to the memory API
> memory: obsolete cpu_physical_memory_[gs]et_dirty_tracking()
> xen: convert framebuffer dirty tracking to memory API
> memory: obsolete more dirty memory related functions
>
> arch_init.c | 71 +++++++++++++++++++-----------------------------------
> cpu-all.h | 54 +-----------------------------------------
> exec-obsolete.h | 51 +++++++++++++++++++++++++++++++++++++++
> exec.c | 11 +-------
> memory.c | 2 +
> xen-all.c | 5 +--
> 6 files changed, 82 insertions(+), 112 deletions(-)
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH 3/8] Sort RAMBlocks by ID for migration, not by ram_addr
2011-12-21 13:55 ` Anthony Liguori
@ 2011-12-21 15:15 ` Avi Kivity
0 siblings, 0 replies; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 15:15 UTC (permalink / raw)
To: Anthony Liguori; +Cc: qemu-devel, quintela
On 12/21/2011 03:55 PM, Anthony Liguori wrote:
> On 12/21/2011 07:34 AM, Avi Kivity wrote:
>> ram_addr is (a) unstable (b) going away. Sort by idstr instead.
>>
>> Signed-off-by: Avi Kivity<avi@redhat.com>
>
> I don't see this as a problem, per say, but this is a significant
> behavioral change. ram_addr does correspond roughly to the location
> in memory and historically we would send memory starting from 0 upward
> whereas now, the order that we send RAMBlocks will be random for all
> intents and purposes.
>
> Again, I don't think it's a problem, but we should note this in the
> commit message in case it creates a problem down the road.
>
I (and the new commit message) note that the sort order used to be
random a while ago (before b2e0a138e), so this isn't entirely new.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH 4/8] Remove support for version 3 ram_load
2011-12-21 13:57 ` Anthony Liguori
@ 2011-12-21 15:18 ` Avi Kivity
0 siblings, 0 replies; 14+ messages in thread
From: Avi Kivity @ 2011-12-21 15:18 UTC (permalink / raw)
To: Anthony Liguori; +Cc: qemu-devel, quintela
On 12/21/2011 03:57 PM, Anthony Liguori wrote:
> On 12/21/2011 07:34 AM, Avi Kivity wrote:
>> Version 3 ram_load depends on ram_addrs, which are not stable.
>> Version 4
>> was introduced in 0.13 (and RHEL 6), so this means live migration
>> from 0.12
>> and earlier to 1.1 or later will not work.
>
> Can you please make a note on http://wiki.qemu.org/ChangeLog/Next
Done.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2011-12-21 15:19 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-12-21 13:34 [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 1/8] Store MemoryRegion in RAMBlock Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 2/8] Switch ram_save to the memory API Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 3/8] Sort RAMBlocks by ID for migration, not by ram_addr Avi Kivity
2011-12-21 13:55 ` Anthony Liguori
2011-12-21 15:15 ` Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 4/8] Remove support for version 3 ram_load Avi Kivity
2011-12-21 13:57 ` Anthony Liguori
2011-12-21 15:18 ` Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 5/8] Convert ram_load() to the memory API Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 6/8] memory: obsolete cpu_physical_memory_[gs]et_dirty_tracking() Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 7/8] xen: convert framebuffer dirty tracking to memory API Avi Kivity
2011-12-21 13:34 ` [Qemu-devel] [PATCH 8/8] memory: obsolete more dirty memory related functions Avi Kivity
2011-12-21 13:59 ` [Qemu-devel] [PATCH 0/8] Convert live migration to memory API Anthony Liguori
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.