On Fri, 29 Aug 2025 17:31:09 +0200 Paolo Bonzini <pbonz...@redhat.com> wrote:
> Right now, cpu_exit() is not usable from all accelerators because it > includes a TCG-specific thread kick. In fact, cpu_exit() doubles as > the TCG thread-kick via tcg_kick_vcpu_thread(). > > In preparation for changing that, inline cpu_exit() into > tcg_kick_vcpu_thread(). The direction of the calls can then be > reversed, with an accelerator-independent cpu_exit() calling into > qemu_vcpu_kick() rather than the opposite. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> Reviewed-by: Igor Mammedov <imamm...@redhat.com> > --- > accel/tcg/cpu-exec.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c > index 9241bcadb5f..3ae545e888f 100644 > --- a/accel/tcg/cpu-exec.c > +++ b/accel/tcg/cpu-exec.c > @@ -751,7 +751,16 @@ static inline bool cpu_handle_exception(CPUState *cpu, > int *ret) > > void tcg_kick_vcpu_thread(CPUState *cpu) > { > - cpu_exit(cpu); > + /* > + * Ensure cpu_exec will see the reason why the exit request was set. > + * FIXME: this is not always needed. Other accelerators instead > + * read interrupt_request and set exit_request on demand from the > + * CPU thread; see kvm_arch_pre_run() for example. > + */ > + qatomic_store_release(&cpu->exit_request, true); > + > + /* Ensure cpu_exec will see the exit request after TCG has exited. */ > + qatomic_store_release(&cpu->neg.icount_decr.u16.high, -1); > } > > static inline bool icount_exit_request(CPUState *cpu) > @@ -780,7 +789,8 @@ static inline bool cpu_handle_interrupt(CPUState *cpu, > /* Clear the interrupt flag now since we're processing > * cpu->interrupt_request and cpu->exit_request. > * Ensure zeroing happens before reading cpu->exit_request or > - * cpu->interrupt_request (see also smp_wmb in cpu_exit()) > + * cpu->interrupt_request (see also store-release in > + * tcg_kick_vcpu_thread()) > */ > qatomic_set_mb(&cpu->neg.icount_decr.u16.high, 0); >