[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v2 6/6] memory: make cpu_physical_memory_sync_dirty_bi
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [RFC v2 6/6] memory: make cpu_physical_memory_sync_dirty_bitmap() fully atomic |
Date: |
Tue, 2 Dec 2014 11:23:19 +0000 |
The fast path of cpu_physical_memory_sync_dirty_bitmap() directly
manipulates the dirty bitmap. Use atomic_xchg() to make the
test-and-clear atomic.
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
include/exec/ram_addr.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
index cdcbe9a..3d2a4c1 100644
--- a/include/exec/ram_addr.h
+++ b/include/exec/ram_addr.h
@@ -195,13 +195,13 @@ uint64_t cpu_physical_memory_sync_dirty_bitmap(unsigned
long *dest,
unsigned long *src = ram_list.dirty_memory[DIRTY_MEMORY_MIGRATION];
for (k = page; k < page + nr; k++) {
- if (src[k]) {
+ unsigned long bits = atomic_xchg(&src[k], 0);
+ if (bits) {
unsigned long new_dirty;
new_dirty = ~dest[k];
- dest[k] |= src[k];
- new_dirty &= src[k];
+ dest[k] |= bits;
+ new_dirty &= bits;
num_dirty += ctpopl(new_dirty);
- src[k] = 0;
}
}
} else {
--
2.1.0
- [Qemu-devel] [RFC v2 0/6] memory: make dirty_memory[] accesses atomic, Stefan Hajnoczi, 2014/12/02
- [Qemu-devel] [RFC v2 1/6] bitmap: add atomic set functions, Stefan Hajnoczi, 2014/12/02
- [Qemu-devel] [RFC v2 2/6] bitmap: add atomic test and clear, Stefan Hajnoczi, 2014/12/02
- [Qemu-devel] [RFC v2 3/6] memory: use atomic ops for setting dirty memory bits, Stefan Hajnoczi, 2014/12/02
- [Qemu-devel] [RFC v2 4/6] migration: move dirty bitmap sync to ram_addr.h, Stefan Hajnoczi, 2014/12/02
- [Qemu-devel] [RFC v2 5/6] memory: replace cpu_physical_memory_reset_dirty() with test-and-clear, Stefan Hajnoczi, 2014/12/02
- [Qemu-devel] [RFC v2 6/6] memory: make cpu_physical_memory_sync_dirty_bitmap() fully atomic,
Stefan Hajnoczi <=