summaryrefslogtreecommitdiff
path: root/exec.c
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2016-10-21 16:34:18 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2016-11-01 16:06:57 +0100
commitf35e44e7645edbb08e35b111c10c2fc57e2905c7 (patch)
tree7b818227243f7f62dcdabc4db83f23d9f474298a /exec.c
parent28017e010ddf6849cfa830e898da3e44e6610952 (diff)
downloadqemu-f35e44e7645edbb08e35b111c10c2fc57e2905c7.tar.gz
exec.c: ensure all AddressSpaceDispatch updates under RCU
The memory_dispatch field is meant to be protected by RCU so we should use the correct primitives when accessing it. This race was flagged up by the ThreadSanitizer. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20161021153418.21571-1-alex.bennee@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'exec.c')
-rw-r--r--exec.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/exec.c b/exec.c
index 4d085812ca..a19ed21bff 100644
--- a/exec.c
+++ b/exec.c
@@ -493,7 +493,7 @@ address_space_translate_for_iotlb(CPUState *cpu, int asidx, hwaddr addr,
hwaddr *xlat, hwaddr *plen)
{
MemoryRegionSection *section;
- AddressSpaceDispatch *d = cpu->cpu_ases[asidx].memory_dispatch;
+ AddressSpaceDispatch *d = atomic_rcu_read(&cpu->cpu_ases[asidx].memory_dispatch);
section = address_space_translate_internal(d, addr, xlat, plen, false);
@@ -2376,7 +2376,7 @@ static void tcg_commit(MemoryListener *listener)
* may have split the RCU critical section.
*/
d = atomic_rcu_read(&cpuas->as->dispatch);
- cpuas->memory_dispatch = d;
+ atomic_rcu_set(&cpuas->memory_dispatch, d);
tlb_flush(cpuas->cpu, 1);
}