diff mbox series

[v2,07/13] translate-all: call qemu_spin_destroy for PageDesc

Message ID 20200605173422.1490-8-robert.foley@linaro.org
State Superseded
Headers show
Series Add Thread Sanitizer support to QEMU | expand

Commit Message

Robert Foley June 5, 2020, 5:34 p.m. UTC
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(+)

-- 
2.17.1

Comments

Alex Bennée June 8, 2020, 3:04 p.m. UTC | #1
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>


-- 
Alex Bennée
diff mbox series

Patch

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;
         }