All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring
@ 2026-08-13 18:16 Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 01/16] accel: Label outer / inner vCPU execution loops Philippe Mathieu-Daudé
                   ` (15 more replies)
  0 siblings, 16 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé

Hi,

While working on the hybrid-accelerator, I had to debug issues
with vCPU scheduling and BQL. This series contains patches I
wrote mostly as note for myself to better understand what was
going on. Please review carefully as I'm way out of my confort
zone...

Thanks,

Phil.

Philippe Mathieu-Daudé (16):
  accel: Label outer / inner vCPU execution loops
  cpus: Improve qemu_cpu_kick_self() docstring
  cpus: Rename cpu_stop_current() -> qemu_cpu_stop_self()
  cpus: Rename qemu_cpu_stop() to qemu_cpu_ack_stop_request()
  cpus: Improve cpu_pause() docstring
  cpus: Improve cpu_exit() docstring
  cpus: Document process_queued_cpu_work*() runs on current vCPU
  cpus: Slightly improve *run_on_cpu() docstrings
  accel/tcg: Use RUN_ON_CPU_NULL for tcg_commit() callbacks
  accel/kvm: Clarify use of @r variable in vcpu thread loop
  accel/kvm: Consistently return CPU halt state from
    process_async_events
  target/arm/hvf: Move flush_cpu_state() into the inner vCPU loop
  target/arm/hvf: Lock BQL outside of the vCPU inner execution loop
  target/i386/hvf: Lock BQL outside of the vCPU inner execution loop
  target/arm/powerctl: Move BQL assertions to async work context
  target/arm/whpx: Fix argument order typo in memory access error
    message

 include/hw/core/cpu.h             | 54 +++++++++++++++++++------------
 include/system/cpus.h             | 19 +++++++++--
 accel/dummy-cpus.c                |  1 +
 accel/hvf/hvf-accel-ops.c         |  1 +
 accel/kvm/kvm-accel-ops.c         | 10 +++---
 accel/kvm/kvm-all.c               |  1 +
 accel/mshv/mshv-all.c             |  2 ++
 accel/tcg/tcg-accel-ops-mttcg.c   |  1 +
 accel/whpx/whpx-accel-ops.c       |  1 +
 hw/ppc/spapr_rtas.c               |  2 +-
 system/cpus.c                     |  9 +++---
 system/physmem.c                  |  4 +--
 system/runstate.c                 |  6 ++--
 target/arm/arm-powerctl.c         |  9 +-----
 target/arm/hvf/hvf.c              | 16 +++++----
 target/arm/kvm.c                  |  2 +-
 target/arm/whpx/whpx-all.c        | 10 +++---
 target/i386/hvf/hvf.c             | 20 +++++++-----
 target/i386/nvmm/nvmm-accel-ops.c |  1 +
 target/i386/whpx/whpx-all.c       |  1 +
 target/riscv/kvm/kvm-cpu.c        |  2 +-
 21 files changed, 106 insertions(+), 66 deletions(-)

-- 
2.53.0


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 01/16] accel: Label outer / inner vCPU execution loops
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 02/16] cpus: Improve qemu_cpu_kick_self() docstring Philippe Mathieu-Daudé
                   ` (14 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Philippe Mathieu-Daudé,
	Roman Bolshakov, Phil Dennis-Jordan, Wei Liu, Doru Blânzeanu,
	Pedro Barbuda, Reinoud Zandijk

Distinguish between the 2 levels of vCPU execution loops:

 - "Outer vCPU loop" handles CPU events in vCPU thread
 - "Inner vCPU loop" handles actual vCPU execution

This helps following the same pattern between all our accelerators.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 accel/dummy-cpus.c                | 1 +
 accel/hvf/hvf-accel-ops.c         | 1 +
 accel/kvm/kvm-accel-ops.c         | 1 +
 accel/kvm/kvm-all.c               | 1 +
 accel/mshv/mshv-all.c             | 2 ++
 accel/tcg/tcg-accel-ops-mttcg.c   | 1 +
 accel/whpx/whpx-accel-ops.c       | 1 +
 target/arm/hvf/hvf.c              | 1 +
 target/arm/whpx/whpx-all.c        | 6 +++---
 target/i386/hvf/hvf.c             | 1 +
 target/i386/nvmm/nvmm-accel-ops.c | 1 +
 target/i386/whpx/whpx-all.c       | 1 +
 12 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/accel/dummy-cpus.c b/accel/dummy-cpus.c
index 5752f6302c8..f9a8d5fff07 100644
--- a/accel/dummy-cpus.c
+++ b/accel/dummy-cpus.c
@@ -42,6 +42,7 @@ static void *dummy_cpu_thread_fn(void *arg)
     cpu_thread_signal_created(cpu);
     qemu_guest_random_seed_thread_part2(cpu->random_seed);
 
+    /* Outer vCPU loop */
     do {
         qemu_process_cpu_events(cpu);
         bql_unlock();
diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c
index d2276d8513e..d8fc7be707f 100644
--- a/accel/hvf/hvf-accel-ops.c
+++ b/accel/hvf/hvf-accel-ops.c
@@ -172,6 +172,7 @@ static void *hvf_cpu_thread_fn(void *arg)
     cpu_thread_signal_created(cpu);
     qemu_guest_random_seed_thread_part2(cpu->random_seed);
 
+    /* Outer vCPU loop */
     do {
         qemu_process_cpu_events(cpu);
         if (cpu_can_run(cpu)) {
diff --git a/accel/kvm/kvm-accel-ops.c b/accel/kvm/kvm-accel-ops.c
index c8e7aa38709..73ff93aab67 100644
--- a/accel/kvm/kvm-accel-ops.c
+++ b/accel/kvm/kvm-accel-ops.c
@@ -47,6 +47,7 @@ static void *kvm_vcpu_thread_fn(void *arg)
     cpu_thread_signal_created(cpu);
     qemu_guest_random_seed_thread_part2(cpu->random_seed);
 
+    /* Outer vCPU loop */
     do {
         qemu_process_cpu_events(cpu);
 
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index 83cbd120a84..b74c7f96866 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -3438,6 +3438,7 @@ int kvm_cpu_exec(CPUState *cpu)
     bql_unlock();
     cpu_exec_start(cpu);
 
+    /* Inner vCPU loop */
     do {
         MemTxAttrs attrs;
 
diff --git a/accel/mshv/mshv-all.c b/accel/mshv/mshv-all.c
index 72721d0f0de..af172a8ee34 100644
--- a/accel/mshv/mshv-all.c
+++ b/accel/mshv/mshv-all.c
@@ -616,6 +616,7 @@ static int mshv_cpu_exec(CPUState *cpu)
     bql_unlock();
     cpu_exec_start(cpu);
 
+    /* Inner vCPU loop */
     do {
         if (cpu->vcpu_dirty) {
             ret = mshv_arch_store_vcpu_state(cpu);
@@ -705,6 +706,7 @@ static void *mshv_vcpu_thread(void *arg)
     cpu_thread_signal_created(cpu);
     qemu_guest_random_seed_thread_part2(cpu->random_seed);
 
+    /* Outer vCPU loop */
     do {
         qemu_process_cpu_events(cpu);
         if (cpu_can_run(cpu)) {
diff --git a/accel/tcg/tcg-accel-ops-mttcg.c b/accel/tcg/tcg-accel-ops-mttcg.c
index 69560fdb9d8..e33e35dab3d 100644
--- a/accel/tcg/tcg-accel-ops-mttcg.c
+++ b/accel/tcg/tcg-accel-ops-mttcg.c
@@ -86,6 +86,7 @@ static void *mttcg_cpu_thread_fn(void *arg)
     cpu_thread_signal_created(cpu);
     qemu_guest_random_seed_thread_part2(cpu->random_seed);
 
+    /* Outer vCPU loop */
     do {
         qemu_process_cpu_events(cpu);
 
diff --git a/accel/whpx/whpx-accel-ops.c b/accel/whpx/whpx-accel-ops.c
index ca5a119521a..535667061b3 100644
--- a/accel/whpx/whpx-accel-ops.c
+++ b/accel/whpx/whpx-accel-ops.c
@@ -42,6 +42,7 @@ static void *whpx_cpu_thread_fn(void *arg)
     cpu_thread_signal_created(cpu);
     qemu_guest_random_seed_thread_part2(cpu->random_seed);
 
+    /* Outer vCPU loop */
     do {
         qemu_process_cpu_events(cpu);
 
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index da3ec521fc7..3eeb9f70de4 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2600,6 +2600,7 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
 
     flush_cpu_state(cpu);
 
+    /* Inner vCPU loop */
     do {
         if (!(cpu->singlestep_flags & SSTEP_NOIRQ) &&
             hvf_inject_interrupts(cpu)) {
diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c
index 00a5de8cdc1..5e4c25bb7d5 100644
--- a/target/arm/whpx/whpx-all.c
+++ b/target/arm/whpx/whpx-all.c
@@ -407,9 +407,9 @@ int whpx_vcpu_run(CPUState *cpu)
     }
 
     bql_unlock();
-
-
     cpu_exec_start(cpu);
+
+    /* Inner vCPU loop */
     do {
         bool advance_pc = false;
         if (cpu->vcpu_dirty) {
@@ -495,8 +495,8 @@ int whpx_vcpu_run(CPUState *cpu)
     } while (!ret);
 
     cpu_exec_end(cpu);
-
     bql_lock();
+
     current_cpu = cpu;
 
     if (--whpx->running_cpus == 0) {
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 150598418e2..0ffa3658dc5 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -1009,6 +1009,7 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
         return EXCP_HLT;
     }
 
+    /* Inner vCPU loop */
     do {
         if (cpu->vcpu_dirty) {
             hvf_arch_put_registers(cpu);
diff --git a/target/i386/nvmm/nvmm-accel-ops.c b/target/i386/nvmm/nvmm-accel-ops.c
index dd5d5428b1c..da28fbe3de8 100644
--- a/target/i386/nvmm/nvmm-accel-ops.c
+++ b/target/i386/nvmm/nvmm-accel-ops.c
@@ -41,6 +41,7 @@ static void *qemu_nvmm_cpu_thread_fn(void *arg)
     cpu_thread_signal_created(cpu);
     qemu_guest_random_seed_thread_part2(cpu->random_seed);
 
+    /* Outer vCPU loop */
     do {
         qemu_process_cpu_events(cpu);
 
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index 634d5428219..b4f499905a7 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -2251,6 +2251,7 @@ int whpx_vcpu_run(CPUState *cpu)
         cpu_exec_start(cpu);
     }
 
+    /* Inner vCPU loop */
     do {
         if (cpu->vcpu_dirty) {
             whpx_set_registers(cpu, WHPX_LEVEL_RUNTIME_STATE);
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 02/16] cpus: Improve qemu_cpu_kick_self() docstring
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 01/16] accel: Label outer / inner vCPU execution loops Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 03/16] cpus: Rename cpu_stop_current() -> qemu_cpu_stop_self() Philippe Mathieu-Daudé
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Philippe Mathieu-Daudé

Be a bit more descriptive than "Unblock cpu" :)

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 include/system/cpus.h | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/include/system/cpus.h b/include/system/cpus.h
index 508444ccf1c..ade13e068eb 100644
--- a/include/system/cpus.h
+++ b/include/system/cpus.h
@@ -30,7 +30,15 @@ void resume_all_vcpus(void);
 void pause_all_vcpus(void);
 void cpu_stop_current(void);
 
-/* Unblock cpu */
+/**
+ * qemu_cpu_kick_self - Force vCPU to re-enter to its inner main loop
+ *
+ * Signal the current vCPU thread to exit any blocking operations and
+ * re-enter its inner execution loop to process pending requests,
+ * possibly returning to its outer execution loop.
+ *
+ * Must be called from within the vCPU thread itself.
+ */
 void qemu_cpu_kick_self(void);
 
 bool cpus_are_resettable(void);
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 03/16] cpus: Rename cpu_stop_current() -> qemu_cpu_stop_self()
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 01/16] accel: Label outer / inner vCPU execution loops Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 02/16] cpus: Improve qemu_cpu_kick_self() docstring Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 04/16] cpus: Rename qemu_cpu_stop() to qemu_cpu_ack_stop_request() Philippe Mathieu-Daudé
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Nicholas Piggin, Harsh Prateek Bora,
	Philippe Mathieu-Daudé

There is a single method with ending with _current() suffix.
Align with qemu_cpu_kick_self() and pthread conventions by
renaming cpu_stop_current() -> qemu_cpu_stop_self() for
consistency.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 include/system/cpus.h | 8 +++++++-
 hw/ppc/spapr_rtas.c   | 2 +-
 system/cpus.c         | 2 +-
 system/runstate.c     | 6 +++---
 4 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/include/system/cpus.h b/include/system/cpus.h
index ade13e068eb..2365c7c4597 100644
--- a/include/system/cpus.h
+++ b/include/system/cpus.h
@@ -28,7 +28,13 @@ bool qemu_in_vcpu_thread(void);
 void qemu_init_cpu_loop(void);
 void resume_all_vcpus(void);
 void pause_all_vcpus(void);
-void cpu_stop_current(void);
+
+/**
+ * qemu_cpu_stop_self - Stop execution of the current vCPU
+ *
+ * Note: No effect if not executing within a vCPU thread.
+ */
+void qemu_cpu_stop_self(void);
 
 /**
  * qemu_cpu_kick_self - Force vCPU to re-enter to its inner main loop
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
index 328fc27c400..80cd4246af8 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -93,7 +93,7 @@ static void rtas_power_off(PowerPCCPU *cpu, SpaprMachineState *spapr,
         return;
     }
     qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
-    cpu_stop_current();
+    qemu_cpu_stop_self();
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
diff --git a/system/cpus.c b/system/cpus.c
index f37e215c586..1a6fd286a81 100644
--- a/system/cpus.c
+++ b/system/cpus.c
@@ -674,7 +674,7 @@ void qemu_init_vcpu(CPUState *cpu)
     }
 }
 
-void cpu_stop_current(void)
+void qemu_cpu_stop_self(void)
 {
     if (current_cpu) {
         current_cpu->stop = true;
diff --git a/system/runstate.c b/system/runstate.c
index d3e64d2b625..1302fea9ccd 100644
--- a/system/runstate.c
+++ b/system/runstate.c
@@ -472,7 +472,7 @@ int vm_stop(RunState state)
          * FIXME: should not return to device code in case
          * vm_stop() has been requested.
          */
-        cpu_stop_current();
+        qemu_cpu_stop_self();
         return 0;
     }
 
@@ -900,7 +900,7 @@ void qemu_system_reset_request(ShutdownCause reason)
     } else {
         reset_requested = reason;
     }
-    cpu_stop_current();
+    qemu_cpu_stop_self();
     qemu_notify_event();
 }
 
@@ -918,7 +918,7 @@ void qemu_system_suspend_request(void)
         return;
     }
     suspend_requested = 1;
-    cpu_stop_current();
+    qemu_cpu_stop_self();
     qemu_notify_event();
 }
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 04/16] cpus: Rename qemu_cpu_stop() to qemu_cpu_ack_stop_request()
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 03/16] cpus: Rename cpu_stop_current() -> qemu_cpu_stop_self() Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 05/16] cpus: Improve cpu_pause() docstring Philippe Mathieu-Daudé
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Philippe Mathieu-Daudé

Stopping a vCPU is not a simple state transition: an asynchronous
request (CPUState::stop flag) is acknowledged (CPUState::stopped
flag). Use a better name to clarify.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 system/cpus.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/system/cpus.c b/system/cpus.c
index 1a6fd286a81..f69558c760c 100644
--- a/system/cpus.c
+++ b/system/cpus.c
@@ -382,7 +382,8 @@ void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
     do_run_on_cpu(cpu, func, data, &bql);
 }
 
-static void qemu_cpu_stop(CPUState *cpu, bool exit)
+/* Must be called by the owning thread */
+static void qemu_cpu_ack_stop_request(CPUState *cpu, bool exit)
 {
     g_assert(qemu_cpu_is_self(cpu));
     cpu->stop = false;
@@ -397,7 +398,7 @@ void qemu_process_cpu_events_common(CPUState *cpu)
 {
     qatomic_set_mb(&cpu->thread_kicked, false);
     if (cpu->stop) {
-        qemu_cpu_stop(cpu, false);
+        qemu_cpu_ack_stop_request(cpu, false);
     }
     process_queued_cpu_work(cpu);
 }
@@ -555,7 +556,7 @@ void cpu_thread_signal_destroyed(CPUState *cpu)
 void cpu_pause(CPUState *cpu)
 {
     if (qemu_cpu_is_self(cpu)) {
-        qemu_cpu_stop(cpu, true);
+        qemu_cpu_ack_stop_request(cpu, true);
     } else {
         cpu->stop = true;
         cpu_exit(cpu);
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 05/16] cpus: Improve cpu_pause() docstring
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (3 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 04/16] cpus: Rename qemu_cpu_stop() to qemu_cpu_ack_stop_request() Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 06/16] cpus: Improve cpu_exit() docstring Philippe Mathieu-Daudé
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Philippe Mathieu-Daudé,
	Zhao Liu

Mention cpu_pause() might not be immediately fullfilled: when the
requested vCPU is not the current one, the request is asynchroneous.

Mention the method goes in pair with cpu_resume().

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 include/hw/core/cpu.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 81af7b9ee1a..f1ac492714e 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -1045,10 +1045,13 @@ void cpu_reset_interrupt(CPUState *cpu, int mask);
 void cpu_exit(CPUState *cpu);
 
 /**
- * cpu_pause:
+ * cpu_pause - Request the CPU to pause execution
  * @cpu: The CPU to pause.
  *
- * Pauses CPU, i.e. puts CPU into stopped state.
+ * If @cpu is the current thread, immediately pause its execution;
+ * otherwise asynchronously request it to pause.
+ *
+ * Note: Use cpu_resume() to restart execution.
  */
 void cpu_pause(CPUState *cpu);
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 06/16] cpus: Improve cpu_exit() docstring
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (4 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 05/16] cpus: Improve cpu_pause() docstring Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 07/16] cpus: Document process_queued_cpu_work*() runs on current vCPU Philippe Mathieu-Daudé
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Philippe Mathieu-Daudé,
	Zhao Liu

Mention that what the vCPU exits is the execution loop :)
Mention some of the reasons for calling cpu_exit().

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 include/hw/core/cpu.h | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index f1ac492714e..7da81f3ee85 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -1037,10 +1037,11 @@ static inline void cpu_set_pc(CPUState *cpu, vaddr addr)
 void cpu_reset_interrupt(CPUState *cpu, int mask);
 
 /**
- * cpu_exit:
- * @cpu: The CPU to exit.
+ * cpu_exit - Request the CPU to exit its execution loop
+ * @cpu: The CPU to interrupt.
  *
- * Requests the CPU @cpu to exit execution.
+ * Request an immediate exit from the CPU execution loop to process
+ * pending work such as interrupts, timers, or other async requests.
  */
 void cpu_exit(CPUState *cpu);
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 07/16] cpus: Document process_queued_cpu_work*() runs on current vCPU
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (5 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 06/16] cpus: Improve cpu_exit() docstring Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 08/16] cpus: Slightly improve *run_on_cpu() docstrings Philippe Mathieu-Daudé
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Philippe Mathieu-Daudé,
	Zhao Liu

Mention process_queued_cpu_work*() functions must run on
a vCPU thread.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 include/hw/core/cpu.h | 4 ++++
 include/system/cpus.h | 1 +
 2 files changed, 5 insertions(+)

diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 7da81f3ee85..183ef9f4ef2 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -1081,6 +1081,8 @@ void free_queued_cpu_work(CPUState *cpu);
 /**
  * process_queued_cpu_work() - process all items on CPU work queue
  * @cpu: The CPU which work queue to process.
+ *
+ * Must be called from within the vCPU thread itself.
  */
 void process_queued_cpu_work(CPUState *cpu);
 
@@ -1179,6 +1181,8 @@ G_NORETURN void cpu_abort(CPUState *cpu, const char *fmt, ...)
  *
  * Perform accelerator-independent work after the CPU has left
  * the inner execution loop.
+ *
+ * Must be called from within the vCPU thread itself.
  */
 void qemu_process_cpu_events(CPUState *cpu);
 
diff --git a/include/system/cpus.h b/include/system/cpus.h
index 2365c7c4597..0bdb231b996 100644
--- a/include/system/cpus.h
+++ b/include/system/cpus.h
@@ -17,6 +17,7 @@ bool cpu_work_list_empty(CPUState *cpu);
 bool cpu_thread_is_idle(CPUState *cpu);
 bool all_cpu_threads_idle(void);
 bool cpu_can_run(CPUState *cpu);
+/* Must be called from within the vCPU thread itself */
 void qemu_process_cpu_events_common(CPUState *cpu);
 void cpu_thread_signal_created(CPUState *cpu);
 void cpu_thread_signal_destroyed(CPUState *cpu);
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 08/16] cpus: Slightly improve *run_on_cpu() docstrings
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (6 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 07/16] cpus: Document process_queued_cpu_work*() runs on current vCPU Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 09/16] accel/tcg: Use RUN_ON_CPU_NULL for tcg_commit() callbacks Philippe Mathieu-Daudé
                   ` (7 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Philippe Mathieu-Daudé,
	Zhao Liu

Be a bit more precise mentioning BQL use and blocking calls.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 include/hw/core/cpu.h | 36 ++++++++++++++++++++----------------
 1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 183ef9f4ef2..d610f87abd3 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -908,36 +908,40 @@ void do_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data,
                    QemuMutex *mutex);
 
 /**
- * run_on_cpu:
+ * run_on_cpu - Execute a function on a vCPU and wait for completion
  * @cpu: The vCPU to run on.
  * @func: The function to be executed.
  * @data: Data to pass to the function.
  *
- * Schedules the function @func for execution on the vCPU @cpu.
+ * Schedules the function @func for execution on the vCPU @cpu and
+ * block until it completes.
+ *
+ * Note: The caller must hold the BQL.
  */
 void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data);
 
 /**
- * async_run_on_cpu:
- * @cpu: The vCPU to run on.
- * @func: The function to be executed.
- * @data: Data to pass to the function.
- *
- * Schedules the function @func for execution on the vCPU @cpu asynchronously.
- */
-void async_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data);
-
-/**
- * async_safe_run_on_cpu:
+ * async_run_on_cpu - Queue a function for execution on a vCPU
  * @cpu: The vCPU to run on.
  * @func: The function to be executed.
  * @data: Data to pass to the function.
  *
  * Schedules the function @func for execution on the vCPU @cpu asynchronously,
- * while all other vCPUs are sleeping.
+ * then return immediately without waiting.
  *
- * Unlike run_on_cpu and async_run_on_cpu, the function is run outside the
- * BQL.
+ * Note: The vCPU will hold the BQL when executing @func.
+ */
+void async_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data);
+
+/**
+ * async_safe_run_on_cpu - Queue a function to run with other vCPUs paused
+ * @cpu: The vCPU to run on.
+ * @func: The function to be executed.
+ * @data: Data to pass to the function.
+ *
+ * Schedules the function @func for execution on the vCPU @cpu asynchronously.
+ * Unlike async_run_on_cpu(), all other vCPUs are paused while @func executes,
+ * ensuring @cpu has exclusive access to shared state.
  */
 void async_safe_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data);
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 09/16] accel/tcg: Use RUN_ON_CPU_NULL for tcg_commit() callbacks
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (7 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 08/16] cpus: Slightly improve *run_on_cpu() docstrings Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 10/16] accel/kvm: Clarify use of @r variable in vcpu thread loop Philippe Mathieu-Daudé
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Peter Xu,
	Philippe Mathieu-Daudé

tcg_commit_cpu() does not consume the thread-local parameter.
Replace RUN_ON_CPU_HOST_PTR(cpuas) with RUN_ON_CPU_NULL when
scheduling the function to avoid any confusion.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
Maybe this AS parameter should be used?
---
 system/physmem.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/system/physmem.c b/system/physmem.c
index 362a00f76c0..b97016b1303 100644
--- a/system/physmem.c
+++ b/system/physmem.c
@@ -3088,9 +3088,9 @@ static void tcg_commit(MemoryListener *listener)
      * all of the tcg machinery for run-on is initialized: thus halt_cond.
      */
     if (cpu->halt_cond) {
-        async_run_on_cpu(cpu, tcg_commit_cpu, RUN_ON_CPU_HOST_PTR(cpuas));
+        async_run_on_cpu(cpu, tcg_commit_cpu, RUN_ON_CPU_NULL);
     } else {
-        tcg_commit_cpu(cpu, RUN_ON_CPU_HOST_PTR(cpuas));
+        tcg_commit_cpu(cpu, RUN_ON_CPU_NULL);
     }
 }
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 10/16] accel/kvm: Clarify use of @r variable in vcpu thread loop
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (8 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 09/16] accel/tcg: Use RUN_ON_CPU_NULL for tcg_commit() callbacks Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 11/16] accel/kvm: Consistently return CPU halt state from process_async_events Philippe Mathieu-Daudé
                   ` (5 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé

@r is used for 2 distinct concepts:

- kvm_init_vcpu() returns an errno. However we don't consume
  it, besides it is called with &error_fatal. Drop the
  unused returned value.

- kvm_cpu_exec() returns an exception code. Reduce the variable
  scope and rename @r as @excp to clarify.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 accel/kvm/kvm-accel-ops.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/accel/kvm/kvm-accel-ops.c b/accel/kvm/kvm-accel-ops.c
index 73ff93aab67..06f56773324 100644
--- a/accel/kvm/kvm-accel-ops.c
+++ b/accel/kvm/kvm-accel-ops.c
@@ -31,7 +31,6 @@
 static void *kvm_vcpu_thread_fn(void *arg)
 {
     CPUState *cpu = arg;
-    int r;
 
     rcu_register_thread();
 
@@ -40,7 +39,7 @@ static void *kvm_vcpu_thread_fn(void *arg)
     cpu->thread_id = qemu_get_thread_id();
     current_cpu = cpu;
 
-    r = kvm_init_vcpu(cpu, &error_fatal);
+    kvm_init_vcpu(cpu, &error_fatal);
     kvm_init_cpu_signals(cpu);
 
     /* signal CPU creation */
@@ -52,8 +51,10 @@ static void *kvm_vcpu_thread_fn(void *arg)
         qemu_process_cpu_events(cpu);
 
         if (cpu_can_run(cpu)) {
-            r = kvm_cpu_exec(cpu);
-            if (r == EXCP_DEBUG) {
+            int excp;
+
+            excp = kvm_cpu_exec(cpu);
+            if (excp == EXCP_DEBUG) {
                 cpu_handle_guest_debug(cpu);
             }
         }
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 11/16] accel/kvm: Consistently return CPU halt state from process_async_events
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (9 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 10/16] accel/kvm: Clarify use of @r variable in vcpu thread loop Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 12/16] target/arm/hvf: Move flush_cpu_state() into the inner vCPU loop Philippe Mathieu-Daudé
                   ` (4 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Palmer Dabbelt, Alistair Francis,
	Weiwei Li, Liu Zhiwei, Chao Liu

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 {
  ...

Change ARM and RISC-V to return cs->halted for consistent behavior.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 target/arm/kvm.c           | 2 +-
 target/riscv/kvm/kvm-cpu.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index d40a6a98591..5caabfab63f 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -1575,7 +1575,7 @@ bool kvm_arch_stop_on_emulation_error(CPUState *cs)
 
 int kvm_arch_process_async_events(CPUState *cs)
 {
-    return 0;
+    return cs->halted;
 }
 
 /**
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index 97069bf597a..1a61cd5ef37 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -1568,7 +1568,7 @@ int kvm_arch_irqchip_create(KVMState *s)
 
 int kvm_arch_process_async_events(CPUState *cs)
 {
-    return 0;
+    return cs->halted;
 }
 
 void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run)
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 12/16] target/arm/hvf: Move flush_cpu_state() into the inner vCPU loop
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (10 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 11/16] accel/kvm: Consistently return CPU halt state from process_async_events Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 13/16] target/arm/hvf: Lock BQL outside of the vCPU inner execution loop Philippe Mathieu-Daudé
                   ` (3 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé

To ensure the vCPU state is flushed on each inner loop iteration,
move the flush_cpu_state() inside it, right after the interrupt
injection check (catching any interrupt changes from previous loop).

Since flush_cpu_state() uses CPUState::vcpu_dirty field as a lazy
synchronization mechanism, there is no performance penalty if the
cache is clean.

This got missed while refactoring the inner loop in commit 93ac76507.

Fixes: 93ac765076a ("target/arm/hvf: Keep calling hv_vcpu_run() in loop")
Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 target/arm/hvf/hvf.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 3eeb9f70de4..c14ea54a67f 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2598,8 +2598,6 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
         }
     }
 
-    flush_cpu_state(cpu);
-
     /* Inner vCPU loop */
     do {
         if (!(cpu->singlestep_flags & SSTEP_NOIRQ) &&
@@ -2607,6 +2605,8 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
             return EXCP_INTERRUPT;
         }
 
+        flush_cpu_state(cpu);
+
         bql_unlock();
         cpu_exec_start(cpu);
         r = hv_vcpu_run(cpu->accel->fd);
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 13/16] target/arm/hvf: Lock BQL outside of the vCPU inner execution loop
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (11 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 12/16] target/arm/hvf: Move flush_cpu_state() into the inner vCPU loop Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 14/16] target/i386/hvf: " Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé

Reduce lock contention by acquiring / releasing the BQL
outside of the entire vCPU inner loop.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 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


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 14/16] target/i386/hvf: Lock BQL outside of the vCPU inner execution loop
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (12 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 13/16] target/arm/hvf: Lock BQL outside of the vCPU inner execution loop Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 15/16] target/arm/powerctl: Move BQL assertions to async work context Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 16/16] target/arm/whpx: Fix argument order typo in memory access error message Philippe Mathieu-Daudé
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Roman Bolshakov, Phil Dennis-Jordan

Reduce lock contention by acquiring / releasing the BQL
outside of the entire vCPU inner loop.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 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)) {
-            return EXCP_INTERRUPT;
+            ret = EXCP_INTERRUPT;
+            break;
         }
+
         vmx_update_tpr(cpu);
 
-        bql_unlock();
         if (!cpu_is_bsp(X86_CPU(cpu)) && cpu->halted) {
-            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;
 }
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 15/16] target/arm/powerctl: Move BQL assertions to async work context
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (13 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 14/16] target/i386/hvf: " Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  2026-08-13 18:16 ` [PATCH 16/16] target/arm/whpx: Fix argument order typo in memory access error message Philippe Mathieu-Daudé
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé

We can not guarantees the callers of the following public API
functions hold the BQL:

 - arm_set_cpu_on()
 - arm_set_cpu_on_and_reset()
 - arm_set_cpu_off()

Move the assertion to arm_reset_cpu_async_work() where the async
context guarantees the BQL is held.

Fixes: 062ba099e01 ("target-arm/powerctl: defer cpu reset work to CPU context")
Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 target/arm/arm-powerctl.c | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/target/arm/arm-powerctl.c b/target/arm/arm-powerctl.c
index a06be5cc997..a938b30943c 100644
--- a/target/arm/arm-powerctl.c
+++ b/target/arm/arm-powerctl.c
@@ -88,8 +88,6 @@ int arm_set_cpu_on(uint64_t cpuid, uint64_t entry, uint64_t context_id,
     ARMCPU *target_cpu;
     struct CpuOnInfo *info;
 
-    assert(bql_locked());
-
     trace_arm_powerctl_set_cpu_on(cpuid, target_el,
                                   target_aa64 ? "aarch64" : "aarch32",
                                   entry, context_id);
@@ -194,8 +192,6 @@ int arm_set_cpu_on_and_reset(uint64_t cpuid)
     CPUState *target_cpu_state;
     ARMCPU *target_cpu;
 
-    assert(bql_locked());
-
     trace_arm_powerctl_set_cpu_on_and_reset(cpuid);
 
     /* Retrieve the cpu we are powering up */
@@ -249,8 +245,6 @@ int arm_set_cpu_off(uint64_t cpuid)
     CPUState *target_cpu_state;
     ARMCPU *target_cpu;
 
-    assert(bql_locked());
-
     trace_arm_powerctl_set_cpu_off(cpuid);
 
     /* change to the cpu we are powering up */
@@ -276,6 +270,7 @@ int arm_set_cpu_off(uint64_t cpuid)
 static void arm_reset_cpu_async_work(CPUState *target_cpu_state,
                                      run_on_cpu_data data)
 {
+    assert(bql_locked());
     /* Reset the cpu */
     cpu_reset(target_cpu_state);
 }
@@ -285,8 +280,6 @@ int arm_reset_cpu(uint64_t cpuid)
     CPUState *target_cpu_state;
     ARMCPU *target_cpu;
 
-    assert(bql_locked());
-
     trace_arm_powerctl_set_cpu_off(cpuid);
 
     /* change to the cpu we are resetting */
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 16/16] target/arm/whpx: Fix argument order typo in memory access error message
  2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
                   ` (14 preceding siblings ...)
  2026-08-13 18:16 ` [PATCH 15/16] target/arm/powerctl: Move BQL assertions to async work context Philippe Mathieu-Daudé
@ 2026-08-13 18:16 ` Philippe Mathieu-Daudé
  15 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-08-13 18:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel Henrique Barboza, Paolo Bonzini, Pierrick Bouvier,
	Mohamed Mediouni, Alexander Graf, qemu-ppc, qemu-riscv, kvm,
	Richard Henderson, qemu-arm, Magnus Kulke, Peter Maydell,
	Philippe Mathieu-Daudé, Pedro Barbuda

The format string expects "Gva = ... Gpa = ..." but we provide
these addresses swapped, causing confusing misaligned debug output.
Re-order by swapping back.

Fixes: 59432082cef ("whpx: add arm64 support")
Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 target/arm/whpx/whpx-all.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c
index 5e4c25bb7d5..e59580d54ee 100644
--- a/target/arm/whpx/whpx-all.c
+++ b/target/arm/whpx/whpx-all.c
@@ -442,8 +442,8 @@ int whpx_vcpu_run(CPUState *cpu)
                 error_report("WHPX: cached access to unmapped memory"
                 "Pc = 0x%llx Gva = 0x%llx Gpa = 0x%llx",
                 vcpu->exit_ctx.MemoryAccess.Header.Pc,
-                vcpu->exit_ctx.MemoryAccess.Gpa,
-                vcpu->exit_ctx.MemoryAccess.Gva);
+                vcpu->exit_ctx.MemoryAccess.Gva,
+                vcpu->exit_ctx.MemoryAccess.Gpa);
                 break;
             }
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2026-08-13 18:18 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-13 18:16 [PATCH 00/16] cpus: Improvements around BQL locking, improving docstring Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 01/16] accel: Label outer / inner vCPU execution loops Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 02/16] cpus: Improve qemu_cpu_kick_self() docstring Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 03/16] cpus: Rename cpu_stop_current() -> qemu_cpu_stop_self() Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 04/16] cpus: Rename qemu_cpu_stop() to qemu_cpu_ack_stop_request() Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 05/16] cpus: Improve cpu_pause() docstring Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 06/16] cpus: Improve cpu_exit() docstring Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 07/16] cpus: Document process_queued_cpu_work*() runs on current vCPU Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 08/16] cpus: Slightly improve *run_on_cpu() docstrings Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 09/16] accel/tcg: Use RUN_ON_CPU_NULL for tcg_commit() callbacks Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 10/16] accel/kvm: Clarify use of @r variable in vcpu thread loop Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 11/16] accel/kvm: Consistently return CPU halt state from process_async_events Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 12/16] target/arm/hvf: Move flush_cpu_state() into the inner vCPU loop Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 13/16] target/arm/hvf: Lock BQL outside of the vCPU inner execution loop Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 14/16] target/i386/hvf: " Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 15/16] target/arm/powerctl: Move BQL assertions to async work context Philippe Mathieu-Daudé
2026-08-13 18:16 ` [PATCH 16/16] target/arm/whpx: Fix argument order typo in memory access error message Philippe Mathieu-Daudé

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.