diff options
| author | Richard Henderson <richard.henderson@linaro.org> | 2022-10-31 13:26:36 +1100 |
|---|---|---|
| committer | Richard Henderson <richard.henderson@linaro.org> | 2022-11-01 08:31:41 +1100 |
| commit | 4e4fa6c12d97ee3ee87623c153009a5abd7b428e (patch) | |
| tree | 41554ff61d55922864d39fdc147d0f61238fbee1 /accel/tcg/translate-all.c | |
| parent | 631793308679cf0436cd7145a9ff318331c982c9 (diff) | |
| download | focaccia-qemu-4e4fa6c12d97ee3ee87623c153009a5abd7b428e.tar.gz focaccia-qemu-4e4fa6c12d97ee3ee87623c153009a5abd7b428e.zip | |
accel/tcg: Complete cpu initialization before registration
Delay cpu_list_add until realize is complete, so that cross-cpu
interaction does not happen with incomplete cpu state. For this,
we must delay plugin initialization out of tcg_exec_realizefn,
because no cpu_index has been assigned.
Fixes a problem with cross-cpu jump cache flushing, when the
jump cache has not yet been allocated.
Fixes: a976a99a2975 ("include/hw/core: Create struct CPUJumpCache")
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
Reported-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'accel/tcg/translate-all.c')
| -rw-r--r-- | accel/tcg/translate-all.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index 0089578f8f..921944a5ab 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -1580,15 +1580,13 @@ void tcg_flush_jmp_cache(CPUState *cpu) { CPUJumpCache *jc = cpu->tb_jmp_cache; - if (likely(jc)) { - for (int i = 0; i < TB_JMP_CACHE_SIZE; i++) { - qatomic_set(&jc->array[i].tb, NULL); - } - } else { - /* This should happen once during realize, and thus never race. */ - jc = g_new0(CPUJumpCache, 1); - jc = qatomic_xchg(&cpu->tb_jmp_cache, jc); - assert(jc == NULL); + /* During early initialization, the cache may not yet be allocated. */ + if (unlikely(jc == NULL)) { + return; + } + + for (int i = 0; i < TB_JMP_CACHE_SIZE; i++) { + qatomic_set(&jc->array[i].tb, NULL); } } |