[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v1 1/3] cputlb: ensure tbl_set_dirty1 updates addr_w
From: |
Alex Bennée |
Subject: |
[Qemu-devel] [PATCH v1 1/3] cputlb: ensure tbl_set_dirty1 updates addr_write atomically |
Date: |
Mon, 20 Mar 2017 15:34:39 +0000 |
This was an oversight when the rest of cputlb was being updated. As
before it falls back to the non-atomic version when the host can't
support wider-than-bus atomics.
Signed-off-by: Alex Bennée <address@hidden>
---
cputlb.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/cputlb.c b/cputlb.c
index f5d056cc08..0d52e45dfd 100644
--- a/cputlb.c
+++ b/cputlb.c
@@ -540,9 +540,17 @@ void tlb_reset_dirty(CPUState *cpu, ram_addr_t start1,
ram_addr_t length)
static inline void tlb_set_dirty1(CPUTLBEntry *tlb_entry, target_ulong vaddr)
{
+#if TCG_OVERSIZED_GUEST
if (tlb_entry->addr_write == (vaddr | TLB_NOTDIRTY)) {
tlb_entry->addr_write = vaddr;
}
+#else
+ uintptr_t orig_addr = atomic_mb_read(&tlb_entry->addr_write);
+
+ if (orig_addr == (vaddr | TLB_NOTDIRTY)) {
+ atomic_cmpxchg(&tlb_entry->addr_write, orig_addr, vaddr);
+ }
+#endif
}
/* update the TLB corresponding to virtual page vaddr
--
2.11.0