[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL v2 12/13] accel/tcg: Complete cpu initialization before registrati
From: |
Richard Henderson |
Subject: |
[PULL v2 12/13] accel/tcg: Complete cpu initialization before registration |
Date: |
Tue, 1 Nov 2022 09:01:12 +1100 |
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>
---
accel/tcg/cpu-exec.c | 8 +++++---
accel/tcg/translate-all.c | 16 +++++++---------
cpu.c | 10 +++++++++-
3 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index 82b06c1824..356fe348de 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -1052,23 +1052,25 @@ void tcg_exec_realizefn(CPUState *cpu, Error **errp)
cc->tcg_ops->initialize();
tcg_target_initialized = true;
}
- tlb_init(cpu);
- qemu_plugin_vcpu_init_hook(cpu);
+ cpu->tb_jmp_cache = g_new0(CPUJumpCache, 1);
+ tlb_init(cpu);
#ifndef CONFIG_USER_ONLY
tcg_iommu_init_notifier_list(cpu);
#endif /* !CONFIG_USER_ONLY */
+ /* qemu_plugin_vcpu_init_hook delayed until cpu_index assigned. */
}
/* undo the initializations in reverse order */
void tcg_exec_unrealizefn(CPUState *cpu)
{
+ qemu_plugin_vcpu_exit_hook(cpu);
#ifndef CONFIG_USER_ONLY
tcg_iommu_free_notifier_list(cpu);
#endif /* !CONFIG_USER_ONLY */
- qemu_plugin_vcpu_exit_hook(cpu);
tlb_destroy(cpu);
+ g_free(cpu->tb_jmp_cache);
}
#ifndef CONFIG_USER_ONLY
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);
}
}
diff --git a/cpu.c b/cpu.c
index 2a09b05205..4a7d865427 100644
--- a/cpu.c
+++ b/cpu.c
@@ -134,15 +134,23 @@ void cpu_exec_realizefn(CPUState *cpu, Error **errp)
/* cache the cpu class for the hotpath */
cpu->cc = CPU_GET_CLASS(cpu);
- cpu_list_add(cpu);
if (!accel_cpu_realizefn(cpu, errp)) {
return;
}
+
/* NB: errp parameter is unused currently */
if (tcg_enabled()) {
tcg_exec_realizefn(cpu, errp);
}
+ /* Wait until cpu initialization complete before exposing cpu. */
+ cpu_list_add(cpu);
+
+ /* Plugin initialization must wait until cpu_index assigned. */
+ if (tcg_enabled()) {
+ qemu_plugin_vcpu_init_hook(cpu);
+ }
+
#ifdef CONFIG_USER_ONLY
assert(qdev_get_vmsd(DEVICE(cpu)) == NULL ||
qdev_get_vmsd(DEVICE(cpu))->unmigratable);
--
2.34.1
- [PULL v2 02/13] tcg/sparc64: Rename from tcg/sparc, (continued)
- [PULL v2 02/13] tcg/sparc64: Rename from tcg/sparc, Richard Henderson, 2022/10/31
- [PULL v2 03/13] tcg/sparc64: Remove sparc32plus constraints, Richard Henderson, 2022/10/31
- [PULL v2 04/13] tcg/tci: fix logic error when registering helpers via FFI, Richard Henderson, 2022/10/31
- [PULL v2 09/13] accel/tcg: Remove will_exit argument from cpu_restore_state, Richard Henderson, 2022/10/31
- [PULL v2 08/13] target/openrisc: Use cpu_unwind_state_data for mfspr, Richard Henderson, 2022/10/31
- [PULL v2 05/13] accel/tcg: Introduce cpu_unwind_state_data, Richard Henderson, 2022/10/31
- [PULL v2 06/13] target/i386: Use cpu_unwind_state_data for tpr access, Richard Henderson, 2022/10/31
- [PULL v2 07/13] target/openrisc: Always exit after mtspr npc, Richard Henderson, 2022/10/31
- [PULL v2 10/13] accel/tcg: Remove reset_icount argument from cpu_restore_state_from_tb, Richard Henderson, 2022/10/31