Message ID | 20200605173422.1490-8-robert.foley@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add Thread Sanitizer support to QEMU | expand |
Robert Foley <robert.foley@linaro.org> writes: > From: "Emilio G. Cota" <cota@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 <cota@braap.org> > Signed-off-by: Robert Foley <robert.foley@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 3708aab36b..3fb71a1503 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); Erg that function is starting to look a bit ugly but I guess cleaning it up with some helpers is outside the current scope. Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index 3708aab36b..3fb71a1503 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; }