[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v5 13/86] memory: separate building the final memory m
From: |
Avi Kivity |
Subject: |
[Qemu-devel] [RFC v5 13/86] memory: separate building the final memory map into two steps |
Date: |
Wed, 20 Jul 2011 19:49:23 +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 a2,
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 cc5a0a4..a8d4295 100644
--- a/memory.c
+++ b/memory.c
@@ -534,10 +534,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;
@@ -564,15 +565,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;
@@ -580,10 +586,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] [RFC v5 00/86] Memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 01/86] xen: fix xen-mapcache build on non-Xen capable targets, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 04/86] memory: merge adjacent segments of a single memory region, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 13/86] memory: separate building the final memory map into two steps,
Avi Kivity <=
- [Qemu-devel] [RFC v5 74/86] ppc405_uc: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 16/86] pc: grab system_memory, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 69/86] gt64xxx.c: convert to memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 34/86] pci: allow I/O BARs to be registered with pci_register_bar_region(), Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 18/86] pc: move global memory map out of pc_init1() and into its callers, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 83/86] isa: add isa_address_space(), Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 26/86] cirrus: simplify mmio BAR access functions, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 25/86] vga: convert vga and its derivatives to the memory API, Avi Kivity, 2011/07/20
- [Qemu-devel] [RFC v5 12/86] memory: add ioeventfd support, Avi Kivity, 2011/07/20