From: "Emilio G. Cota" <c...@braap.org> The radix tree is append-only, but we can fail to insert a PageDesc if the insertion races with another thread.
Signed-off-by: Emilio G. Cota <c...@braap.org> Signed-off-by: Robert Foley <robert.fo...@linaro.org> Reviewed-by: Alex Bennée <alex.ben...@linaro.org> Signed-off-by: Alex Bennée <alex.ben...@linaro.org> Message-Id: <20200609200738.445-8-robert.fo...@linaro.org> --- accel/tcg/translate-all.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index c937210e217..c3d37058a17 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -547,6 +547,15 @@ static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc) #endif existing = atomic_cmpxchg(lp, NULL, pd); if (unlikely(existing)) { +#ifndef CONFIG_USER_ONLY + { + int i; + + for (i = 0; i < V_L2_SIZE; i++) { + qemu_spin_destroy(&pd[i].lock); + } + } +#endif g_free(pd); pd = existing; } -- 2.20.1