Hi, The goal of this series is to expose vCPUs in a stable state to the accelerators, in particular the QDev 'REALIZED' step. To do so we split the QTAILQ_INSERT/REMOVE calls from cpu_list_add() / cpu_list_remove(), by moving them to the DeviceClass::[un]wire() handlers, guaranty to be called just before a vCPU is exposed to the guest, as "realized". First we have to modify how &first_cpu is used in TCG round robin implementation, and ensure we invalidate the TB jmpcache with &qemu_cpu_list locked. I'm really out of my comfort zone here, so posting as RFC. At least all test suite is passing... I expect these changes to allow CPUState::cpu_index clarifications and simplifications, but this will be addressed (and commented) in a separate series. Regards, Phil. Philippe Mathieu-Daudé (9): accel/tcg: Simplify use of &first_cpu in rr_cpu_thread_fn() accel/tcg: Invalidate TB jump cache with global vCPU queue locked cpus: Remove cpu from global queue after UNREALIZE completed hw/qdev: Introduce DeviceClass::[un]wire() handlers cpus: Add DeviceClass::[un]wire() stubs cpus: Call hotplug handlers in DeviceWire() cpus: Only expose REALIZED vCPUs to global &cpus_queue accel/kvm: Assert vCPU is created when calling kvm_dirty_ring_reap*() accel/kvm: Remove unreachable assertion in kvm_dirty_ring_reap*() include/hw/qdev-core.h | 7 +++++++ accel/kvm/kvm-all.c | 9 --------- accel/tcg/tb-maint.c | 2 ++ accel/tcg/tcg-accel-ops-rr.c | 15 ++++++++------- cpu-common.c | 2 -- cpu-target.c | 7 ++----- hw/core/cpu-common.c | 18 +++++++++++++++++- hw/core/qdev.c | 20 +++++++++++++++++++- 8 files changed, 55 insertions(+), 25 deletions(-) -- 2.47.1