diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2015-03-18 14:21:43 +0100 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-04-30 16:55:32 +0200 |
commit | 41063e1e7afcb2f13e103720fe96221657f5dbbc (patch) | |
tree | ce78dca7d90917ffc9bfe45fcec5dfba0f8a9320 /translate-all.c | |
parent | 4c6637525290dc863a00be7f58fc11d07b780bd4 (diff) |
exec: move rcu_read_lock/unlock to address_space_translate callers
Once address_space_translate will be called outside the BQL, the returned
MemoryRegion might disappear as soon as the RCU read-side critical section
ends. Avoid this by moving the critical section to the callers.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1426684909-95030-3-git-send-email-pbonzini@redhat.com>
Diffstat (limited to 'translate-all.c')
-rw-r--r-- | translate-all.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/translate-all.c b/translate-all.c index 65a76c5b9f..536008f52d 100644 --- a/translate-all.c +++ b/translate-all.c @@ -1416,14 +1416,17 @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr) MemoryRegion *mr; hwaddr l = 1; + rcu_read_lock(); mr = address_space_translate(as, addr, &addr, &l, false); if (!(memory_region_is_ram(mr) || memory_region_is_romd(mr))) { + rcu_read_unlock(); return; } ram_addr = (memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK) + addr; tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0); + rcu_read_unlock(); } #endif /* !defined(CONFIG_USER_ONLY) */ |