[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 11/29] memory: include DIRTY_MEMORY_MIGRATION in the
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 11/29] memory: include DIRTY_MEMORY_MIGRATION in the dirty log mask |
Date: |
Mon, 27 Apr 2015 18:28:19 +0200 |
The separate handling of DIRTY_MEMORY_MIGRATION, which does not
call log_start/log_stop callbacks when it changes in a region's
dirty logging mask, has caused several bugs.
One recent example is commit 4cc856f (kvm-all: Sync dirty-bitmap from
kvm before kvm destroy the corresponding dirty_bitmap, 2015-04-02).
Another performance problem is that KVM keeps tracking dirty pages
after a failed live migration, which causes bad performance due to
disallowing huge page mapping.
This patch removes the root cause of the problem by reporting
DIRTY_MEMORY_MIGRATION changes via log_start and log_stop.
Note that we now have to rebuild the FlatView when global dirty
logging is enabled or disabled; this ensures that log_start and
log_stop callbacks are invoked.
This will also be used to make the setting of bitmaps conditional.
Signed-off-by: Paolo Bonzini <address@hidden>
---
memory.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/memory.c b/memory.c
index 1966347..174cd15 100644
--- a/memory.c
+++ b/memory.c
@@ -537,7 +537,7 @@ static void render_memory_region(FlatView *view,
remain = clip.size;
fr.mr = mr;
- fr.dirty_log_mask = mr->dirty_log_mask;
+ fr.dirty_log_mask = memory_region_get_dirty_log_mask(mr);
fr.romd_mode = mr->romd_mode;
fr.readonly = readonly;
@@ -1329,7 +1329,11 @@ bool memory_region_is_skip_dump(MemoryRegion *mr)
uint8_t memory_region_get_dirty_log_mask(MemoryRegion *mr)
{
- return mr->dirty_log_mask;
+ uint8_t mask = mr->dirty_log_mask;
+ if (global_dirty_log) {
+ mask |= (1 << DIRTY_MEMORY_MIGRATION);
+ }
+ return mask;
}
bool memory_region_is_logging(MemoryRegion *mr, uint8_t client)
@@ -1892,10 +1896,20 @@ void memory_global_dirty_log_start(void)
{
global_dirty_log = true;
MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward);
+
+ /* Refresh DIRTY_LOG_MIGRATION bit. */
+ memory_region_transaction_begin();
+ memory_region_update_pending = true;
+ memory_region_transaction_commit();
}
void memory_global_dirty_log_stop(void)
{
+ /* Refresh DIRTY_LOG_MIGRATION bit. */
+ memory_region_transaction_begin();
+ memory_region_update_pending = true;
+ memory_region_transaction_commit();
+
global_dirty_log = false;
MEMORY_LISTENER_CALL_GLOBAL(log_global_stop, Reverse);
}
--
1.8.3.1
- [Qemu-devel] [PATCH v2 00/29] Dirty bitmap atomic access and optimizations, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 02/29] g364fb: remove pointless call to memory_region_set_coalescing, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 04/29] display: add memory_region_sync_dirty_bitmap calls, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 03/29] display: enable DIRTY_MEMORY_VGA tracking explicitly, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 05/29] memory: differentiate memory_region_is_logging and memory_region_get_dirty_log_mask, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 06/29] memory: prepare for multiple bits in the dirty log mask, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 07/29] framebuffer: check memory_region_is_logging, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 08/29] ui/console: remove dpy_gfx_update_dirty, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 10/29] kvm: accept non-mapped memory in kvm_dirty_pages_log_change, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 09/29] memory: track DIRTY_MEMORY_CODE in mr->dirty_log_mask, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 11/29] memory: include DIRTY_MEMORY_MIGRATION in the dirty log mask,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 12/29] kvm: remove special handling of DIRTY_MEMORY_MIGRATION in the dirty log mask, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 13/29] ram_addr: tweaks to xen_modified_memory, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 15/29] exec: move functions to translate-all.h, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 14/29] exec: use memory_region_get_dirty_log_mask to optimize dirty tracking, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 16/29] translate-all: remove unnecessary argument to tb_invalidate_phys_range, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 17/29] cputlb: remove useless arguments to tlb_unprotect_code_phys, rename, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 18/29] translate-all: make less of tb_invalidate_phys_page_range depend on is_cpu_write_access, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 21/29] exec: only check relevant bitmaps for cleanliness, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 20/29] exec: invert return value of cpu_physical_memory_get_clean, rename, Paolo Bonzini, 2015/04/27
- [Qemu-devel] [PATCH 22/29] memory: do not touch code dirty bitmap unless TCG is enabled, Paolo Bonzini, 2015/04/27