[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 13/23] memory: separate building the final memory
From: |
Avi Kivity |
Subject: |
[Qemu-devel] [PATCH v2 13/23] memory: separate building the final memory map into two steps |
Date: |
Tue, 26 Jul 2011 14:26:12 +0300 |
Instead of adding and deleting regions in one pass, do a delete
pass followed by an add pass. This fixes the following case:
from:
0x0000-0x0fff ram (a1)
0x1000-0x1fff mmio (a2)
0x2000-0x2fff ram (a3)
to:
0x0000-0x2fff ram (b1)
The single pass algorithm removed a1, added b2, then removed a2 and a3,
which caused the wrong memory map to be built. The two pass algorithm
removes a1, a2, and a3, then adds b1.
Signed-off-by: Avi Kivity <address@hidden>
---
memory.c | 38 +++++++++++++++++++++++++++++---------
1 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/memory.c b/memory.c
index 686bbf2..7a5670e 100644
--- a/memory.c
+++ b/memory.c
@@ -549,10 +549,11 @@ static void address_space_update_ioeventfds(AddressSpace
*as)
as->ioeventfd_nb = ioeventfd_nb;
}
-static void address_space_update_topology(AddressSpace *as)
+static void address_space_update_topology_pass(AddressSpace *as,
+ FlatView old_view,
+ FlatView new_view,
+ bool adding)
{
- FlatView old_view = as->current_map;
- FlatView new_view = generate_memory_topology(as->root);
unsigned iold, inew;
FlatRange *frold, *frnew;
@@ -579,15 +580,20 @@ static void address_space_update_topology(AddressSpace
*as)
&& !flatrange_equal(frold, frnew)))) {
/* In old, but (not in new, or in new but attributes changed). */
- as->ops->range_del(as, frold);
+ if (!adding) {
+ as->ops->range_del(as, frold);
+ }
+
++iold;
} else if (frold && frnew && flatrange_equal(frold, frnew)) {
/* In both (logging may have changed) */
- if (frold->dirty_log_mask && !frnew->dirty_log_mask) {
- as->ops->log_stop(as, frnew);
- } else if (frnew->dirty_log_mask && !frold->dirty_log_mask) {
- as->ops->log_start(as, frnew);
+ if (adding) {
+ if (frold->dirty_log_mask && !frnew->dirty_log_mask) {
+ as->ops->log_stop(as, frnew);
+ } else if (frnew->dirty_log_mask && !frold->dirty_log_mask) {
+ as->ops->log_start(as, frnew);
+ }
}
++iold;
@@ -595,10 +601,24 @@ static void address_space_update_topology(AddressSpace
*as)
} else {
/* In new */
- as->ops->range_add(as, frnew);
+ if (adding) {
+ as->ops->range_add(as, frnew);
+ }
+
++inew;
}
}
+}
+
+
+static void address_space_update_topology(AddressSpace *as)
+{
+ FlatView old_view = as->current_map;
+ FlatView new_view = generate_memory_topology(as->root);
+
+ address_space_update_topology_pass(as, old_view, new_view, false);
+ address_space_update_topology_pass(as, old_view, new_view, true);
+
as->current_map = new_view;
flatview_destroy(&old_view);
address_space_update_ioeventfds(as);
--
1.7.5.3
[Qemu-devel] [PATCH v2 03/23] memory: implement dirty tracking, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 10/23] memory: add backward compatibility for old portio registration, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 17/23] pc: grab system_memory, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 08/23] memory: late initialization of ram_addr, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 11/23] memory: add backward compatibility for old mmio registration, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 13/23] memory: separate building the final memory map into two steps,
Avi Kivity <=
[Qemu-devel] [PATCH v2 06/23] memory: abstract address space operations, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 14/23] memory: transaction API, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 09/23] memory: I/O address space support, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 15/23] exec.c: initialize memory map, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 05/23] Internal interfaces for memory API, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 19/23] pc: move global memory map out of pc_init1() and into its callers, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 02/23] Hierarchical memory region API, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 07/23] memory: rename MemoryRegion::has_ram_addr to ::terminates, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 22/23] sysbus: add MemoryRegion based memory management API, Avi Kivity, 2011/07/26
[Qemu-devel] [PATCH v2 18/23] pc: convert pc_memory_init() to memory API, Avi Kivity, 2011/07/26