# HG changeset patch
# User Tim Deegan <Tim.Deegan@xxxxxxxxxxxxx>
# Date 1170693619 0
# Node ID 8bc64a3a505413e4d3bd7def06539ef088f2ca0c
# Parent e825954d417918ec639b405a11741def54d60131
[QEMU] Unmap video RAM before telling the guest to free it.
This avoids a lot of "freeing in-use page" errors.
Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxxxxx>
---
tools/ioemu/hw/cirrus_vga.c | 31 +++++++++++++++----------------
1 files changed, 15 insertions(+), 16 deletions(-)
diff -r e825954d4179 -r 8bc64a3a5054 tools/ioemu/hw/cirrus_vga.c
--- a/tools/ioemu/hw/cirrus_vga.c Mon Feb 05 15:08:18 2007 +0000
+++ b/tools/ioemu/hw/cirrus_vga.c Mon Feb 05 16:40:19 2007 +0000
@@ -2571,7 +2571,8 @@ static void *set_vram_mapping(unsigned l
return vram_pointer;
}
-static int unset_vram_mapping(unsigned long begin, unsigned long end)
+static int unset_vram_mapping(unsigned long begin, unsigned long end,
+ void *mapping)
{
xen_pfn_t *extent_start = NULL;
unsigned long nr_extents;
@@ -2591,11 +2592,13 @@ static int unset_vram_mapping(unsigned l
return -1;
}
+ /* Drop our own references to the vram pages */
+ munmap(mapping, nr_extents * TARGET_PAGE_SIZE);
+
+ /* Now drop the guest's mappings */
memset(extent_start, 0, sizeof(xen_pfn_t) * nr_extents);
-
for (i = 0; i < nr_extents; i++)
extent_start[i] = (begin + (i * TARGET_PAGE_SIZE)) >> TARGET_PAGE_BITS;
-
unset_mm_mapping(xc_handle, domid, nr_extents, 0, extent_start);
free(extent_start);
@@ -2642,16 +2645,14 @@ static void cirrus_update_memory_access(
} else {
generic_io:
if (s->cirrus_lfb_addr && s->cirrus_lfb_end && s->map_addr) {
- int error;
- void *old_vram = NULL;
-
- error = unset_vram_mapping(s->cirrus_lfb_addr,
- s->cirrus_lfb_end);
- if (!error)
- old_vram = vga_update_vram((VGAState *)s, NULL,
- VGA_RAM_SIZE);
- if (old_vram)
- munmap(old_vram, s->map_addr - s->map_end);
+ void *old_vram;
+
+ old_vram = vga_update_vram((VGAState *)s, NULL, VGA_RAM_SIZE);
+
+ unset_vram_mapping(s->cirrus_lfb_addr,
+ s->cirrus_lfb_end,
+ old_vram);
+
s->map_addr = s->map_end = 0;
}
s->cirrus_linear_write[0] = cirrus_linear_writeb;
@@ -3016,10 +3017,8 @@ void cirrus_stop_acc(CirrusVGAState *s)
int error;
s->map_addr = 0;
error = unset_vram_mapping(s->cirrus_lfb_addr,
- s->cirrus_lfb_end);
+ s->cirrus_lfb_end, s->vram_ptr);
fprintf(stderr, "cirrus_stop_acc:unset_vram_mapping.\n");
-
- munmap(s->vram_ptr, VGA_RAM_SIZE);
}
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|