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/i386/hvf/hvf.c | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 0ffa3658dc5..f8bc01d38d3 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -1009,6 +1009,9 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
return EXCP_HLT;
}
+ bql_unlock();
+ cpu_exec_start(cpu);
+
/* Inner vCPU loop */
do {
if (cpu->vcpu_dirty) {
@@ -1017,26 +1020,26 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
}
if (hvf_inject_interrupts(cpu)) {
Nope, hvf_inject_interrupts() calls cpu_get_pic_interrupt() which needs
the BQL.
Paolo
- return EXCP_INTERRUPT;
+ ret = EXCP_INTERRUPT;
+ break;
}
+
vmx_update_tpr(cpu);
- bql_unlock();
if (!cpu_is_bsp(X86_CPU(cpu)) && cpu->halted) {
This is also incorrect by the way - chceking cpu->halted needs the BQL.
So bql_unlock() must be moved right before cpu_exec_start(). Can you
fix it?
Thanks,
Paolo
- bql_lock();
- return EXCP_HLT;
+ ret = EXCP_HLT;
+ break;
}
- cpu_exec_start(cpu);
-
hv_return_t r = hv_vcpu_run_until(cpu->accel->fd,
HV_DEADLINE_FOREVER);
assert_hvf_ok(r);
- cpu_exec_end(cpu);
-
ret = hvf_handle_vmexit(cpu);
} while (ret == 0);
+ cpu_exec_end(cpu);
+ bql_lock();
+
return ret;
}