Reduce lock contention by acquiring / releasing the BQL outside of the entire vCPU inner loop. Signed-off-by: Philippe Mathieu-Daudé --- 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)) { - 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; } -- 2.53.0