[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/22] framebuffer: check memory_region_is_logging
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 06/22] framebuffer: check memory_region_is_logging |
Date: |
Thu, 26 Mar 2015 18:38:24 +0100 |
framebuffer.c expects DIRTY_MEMORY_VGA logging to be always on, but that
will not be the case soon. Because framebuffer.c computes the memory
region on the fly for every update (with memory_region_find), it cannot
enable/disable logging by itself.
Instead, always treat updates as invalidations if dirty logging is
not enabled, assuming that the board will enable logging on the
RAM region that includes the framebuffer.
To simplify the code, replace memory_region_get_dirty with
memory_region_test_and_clear_dirty. Then memory_region_reset_dirty
is only needed in the invalidate case.
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/display/framebuffer.c | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/hw/display/framebuffer.c b/hw/display/framebuffer.c
index 4546e42..49fe204 100644
--- a/hw/display/framebuffer.c
+++ b/hw/display/framebuffer.c
@@ -62,7 +62,16 @@ void framebuffer_update_display(
assert(mem);
assert(mem_section.offset_within_address_space == base);
- memory_region_sync_dirty_bitmap(mem);
+ if (memory_region_is_logging(mem) & (1 << DIRTY_MEMORY_VGA)) {
+ memory_region_sync_dirty_bitmap(mem);
+ if (invalidate) {
+ memory_region_reset_dirty(mem, mem_section.offset_within_region,
+ src_len, DIRTY_MEMORY_VGA);
+ }
+ } else {
+ invalidate = true;
+ }
+
src_base = cpu_physical_memory_map(base, &src_len, 0);
/* If we can't map the framebuffer then bail. We could try harder,
but it's not really worth it as dirty flag tracking will probably
@@ -88,9 +97,13 @@ void framebuffer_update_display(
dest += i * dest_row_pitch;
for (; i < rows; i++) {
- dirty = memory_region_get_dirty(mem, addr, src_width,
- DIRTY_MEMORY_VGA);
- if (dirty || invalidate) {
+ if (invalidate) {
+ dirty = true;
+ } else {
+ dirty = memory_region_test_and_clear_dirty(mem, addr, src_width,
+ DIRTY_MEMORY_VGA);
+ }
+ if (dirty) {
fn(opaque, dest, src, cols, dest_col_pitch);
if (first == -1)
first = i;
@@ -104,8 +117,6 @@ void framebuffer_update_display(
if (first < 0) {
goto out;
}
- memory_region_reset_dirty(mem, mem_section.offset_within_region, src_len,
- DIRTY_MEMORY_VGA);
*first_row = first;
*last_row = last;
out:
--
2.3.3
- Re: [Qemu-devel] [PATCH 02/22] acpi-build: remove dependency from ram_addr.h, (continued)
- [Qemu-devel] [PATCH 03/22] memory: the only dirty memory flag for users is DIRTY_MEMORY_VGA, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 04/22] display: enable DIRTY_MEMORY_VGA tracking explicitly, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 07/22] ui/console: check memory_region_is_logging, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 05/22] memory: return bitmap from memory_region_is_logging, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 09/22] memory: return DIRTY_MEMORY_MIGRATION from memory_region_is_logging, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 12/22] exec: use memory_region_is_logging to optimize dirty tracking, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 06/22] framebuffer: check memory_region_is_logging,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 10/22] ram_addr: tweaks to xen_modified_memory, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 08/22] memory: track DIRTY_MEMORY_CODE in mr->dirty_log_mask, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 13/22] exec: pass client mask to cpu_physical_memory_set_dirty_range, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 11/22] exec: simplify notdirty_mem_write, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 14/22] exec: only check relevant bitmaps for cleanliness, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 15/22] memory: do not touch code dirty bitmap unless TCG is enabled, Paolo Bonzini, 2015/03/26
- [Qemu-devel] [PATCH 17/22] bitmap: add atomic test and clear, Paolo Bonzini, 2015/03/26