On 17/8/26 17:59, Paolo Bonzini wrote:
On 8/13/26 20:16, Philippe Mathieu-Daudé wrote:
When comparing the KVM implementations, RISCV and ARM differ
from S390x / PPC and LoongArch. The caller expects a non-zero
value to return pausing execution with the EXCP_HLT exception:
3427 int kvm_cpu_exec(CPUState *cpu)
3428 {
...
3434 if (kvm_arch_process_async_events(cpu)) {
3435 return EXCP_HLT;
3436 }
3437
3438 bql_unlock();
3439 cpu_exec_start(cpu);
3440
3441 /* Inner vCPU loop */
3442 do {
...
Your patch is correct because, even if cpu_thread_is_idle() sees cpu-
>halted == false, the flag could become true during
process_queued_cpu_work() because it releases the BQL.
However, I think the better fix is to remove the return code, and check
cpu->halted in kvm_cpu_exec().
Looking at it, even better would be to move *process_async_events()
from inner loop to outer loop for all accelerators. For HW accels it
seems quite trivial; for TCG I need to figure if it is safe to call
icount_prepare_for_run() with the BQL taken, due to the replay_mutex
uses -- here the win is cpu_handle_halt() ends restricted to system
and we can remove the odd EXCP_HLT handling in user emulation.
Thanks,
Paolo