mirror of https://github.com/xemu-project/xemu.git
tcg: add memory barriers in page_find_alloc accesses
page_find is reading the radix tree outside all locks, so it has to use the RCU primitives. It does not need RCU critical sections because the PageDescs are never removed, so there is never a need to wait for the end of code sections that use a PageDesc. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
2496ff1311
commit
6940fab84b
|
@ -431,26 +431,26 @@ static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc)
|
|||
|
||||
/* Level 2..N-1. */
|
||||
for (i = V_L1_SHIFT / V_L2_BITS - 1; i > 0; i--) {
|
||||
void **p = *lp;
|
||||
void **p = atomic_rcu_read(lp);
|
||||
|
||||
if (p == NULL) {
|
||||
if (!alloc) {
|
||||
return NULL;
|
||||
}
|
||||
p = g_new0(void *, V_L2_SIZE);
|
||||
*lp = p;
|
||||
atomic_rcu_set(lp, p);
|
||||
}
|
||||
|
||||
lp = p + ((index >> (i * V_L2_BITS)) & (V_L2_SIZE - 1));
|
||||
}
|
||||
|
||||
pd = *lp;
|
||||
pd = atomic_rcu_read(lp);
|
||||
if (pd == NULL) {
|
||||
if (!alloc) {
|
||||
return NULL;
|
||||
}
|
||||
pd = g_new0(PageDesc, V_L2_SIZE);
|
||||
*lp = pd;
|
||||
atomic_rcu_set(lp, pd);
|
||||
}
|
||||
|
||||
return pd + (index & (V_L2_SIZE - 1));
|
||||
|
|
Loading…
Reference in New Issue