OSDN Git Service

exec.c: Use atomic_rcu_read() to access dispatch in memory_region_section_get_iotlb()
authorPeter Maydell <peter.maydell@linaro.org>
Mon, 20 Jul 2015 11:27:16 +0000 (12:27 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 23 Jul 2015 05:37:38 +0000 (07:37 +0200)
When accessing the dispatch pointer in an AddressSpace within an RCU
critical section we should always use atomic_rcu_read(). Fix an
access within memory_region_section_get_iotlb() which was incorrectly
doing a direct pointer access.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-Id: <1437391637-31576-1-git-send-email-peter.maydell@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec.c

diff --git a/exec.c b/exec.c
index 7d60e15..0a4a0c5 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -954,7 +954,10 @@ hwaddr memory_region_section_get_iotlb(CPUState *cpu,
             iotlb |= PHYS_SECTION_ROM;
         }
     } else {
-        iotlb = section - section->address_space->dispatch->map.sections;
+        AddressSpaceDispatch *d;
+
+        d = atomic_rcu_read(&section->address_space->dispatch);
+        iotlb = section - d->map.sections;
         iotlb += xlat;
     }