On 17/8/26 18:11, Paolo Bonzini wrote:
On 8/13/26 20:16, Philippe Mathieu-Daudé wrote:
Reduce lock contention by acquiring / releasing the BQL
outside of the entire vCPU inner loop.
Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
target/arm/hvf/hvf.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index c14ea54a67f..9c6408d2e25 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2598,20 +2598,20 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
}
}
+ bql_unlock();
+ cpu_exec_start(cpu);
+
/* Inner vCPU loop */
do {
if (!(cpu->singlestep_flags & SSTEP_NOIRQ) &&
hvf_inject_interrupts(cpu)) {
It always return zero, so you can make it void and change to
if (!(cpu->singlestep_flags & SSTEP_NOIRQ)) {
hvf_inject_interrupts(cpu);
}
However, a bigger question: who calls cpu_reset_interrupt() here:
if (cpu_test_interrupt(cpu, CPU_INTERRUPT_FIQ)) {
trace_hvf_inject_fiq();
hv_vcpu_set_pending_interrupt(cpu->accel->fd,
HV_INTERRUPT_TYPE_FIQ,
true);
}
if (cpu_test_interrupt(cpu, CPU_INTERRUPT_HARD)) {
trace_hvf_inject_irq();
hv_vcpu_set_pending_interrupt(cpu->accel->fd,
HV_INTERRUPT_TYPE_IRQ,
true);
}
and can this be changed to do something like arm_cpu_kvm_set_irq() instead?
Having the function called only with level == true is a bit unsettling...
Digging further this other change from a86024eb2df56f looks dubious:
int hvf_arch_vcpu_exec(CPUState *cpu)
{
int ret;
hv_return_t r;
if (cpu->halted) {
- return EXCP_HLT;
+ if (!cpu_has_work(cpu)) {
+ return EXCP_HLT;
+ }
+ cpu->halted = 0;
+ if (!hvf_irqchip_in_kernel()) {
+ timer_del(cpu->accel->wfi_timer);
+ }
}
Paolo
- return EXCP_INTERRUPT;
+ ret = EXCP_INTERRUPT;
+ break;
}
flush_cpu_state(cpu);
- bql_unlock();
- cpu_exec_start(cpu);
r = hv_vcpu_run(cpu->accel->fd);
- cpu_exec_end(cpu);
- bql_lock();
switch (r) {
case HV_SUCCESS:
ret = hvf_handle_vmexit(cpu, cpu->accel->exit);
@@ -2624,6 +2624,9 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
}
} while (ret == 0);
+ cpu_exec_end(cpu);
+ bql_lock();
+
return ret;
}