diff mbox series

[2/9] replay: notify vCPU when BH is scheduled

Message ID 165062840023.526882.4524922830180183891.stgit@pasha-ThinkPad-X280
State New
Headers show
Series Record/replay refactoring and stuff | expand

Commit Message

Pavel Dovgalyuk April 22, 2022, 11:53 a.m. UTC
vCPU execution should be suspended when new BH is scheduled.
This is needed to avoid guest timeouts caused by the long cycles
of the execution. In replay mode execution may hang when
vCPU sleeps and block event comes to the queue.
This patch adds notification which wakes up vCPU or interrupts
execution of guest code.

Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru>
---
 include/sysemu/cpu-timers.h |    1 +
 softmmu/icount.c            |    8 ++++++++
 stubs/icount.c              |    4 ++++
 util/async.c                |    8 ++++++++
 4 files changed, 21 insertions(+)

Comments

Richard Henderson April 26, 2022, 6:45 p.m. UTC | #1
On 4/22/22 04:53, Pavel Dovgalyuk wrote:
> +void icount_notify_exit(void)
> +{
> +    if (icount_enabled() && first_cpu) {
> +        cpu_exit(first_cpu);
> +        qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
> +    }
> +}

Why first_cpu?  Did you really want to continue to the end of the round-robin?
Otherwise I'd expect qemu_cpu_kick(current_cpu), or something.


r~
Pavel Dovgalyuk May 4, 2022, 6:54 a.m. UTC | #2
On 26.04.2022 21:45, Richard Henderson wrote:
> On 4/22/22 04:53, Pavel Dovgalyuk wrote:
>> +void icount_notify_exit(void)
>> +{
>> +    if (icount_enabled() && first_cpu) {
>> +        cpu_exit(first_cpu);
>> +        qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
>> +    }
>> +}
> 
> Why first_cpu?  Did you really want to continue to the end of the 
> round-robin?
> Otherwise I'd expect qemu_cpu_kick(current_cpu), or something.

Looks reasonable, thank you.
diff mbox series

Patch

diff --git a/include/sysemu/cpu-timers.h b/include/sysemu/cpu-timers.h
index ed6ee5c46c..2e786fe7fb 100644
--- a/include/sysemu/cpu-timers.h
+++ b/include/sysemu/cpu-timers.h
@@ -59,6 +59,7 @@  int64_t icount_round(int64_t count);
 /* if the CPUs are idle, start accounting real time to virtual clock. */
 void icount_start_warp_timer(void);
 void icount_account_warp_timer(void);
+void icount_notify_exit(void);
 
 /*
  * CPU Ticks and Clock
diff --git a/softmmu/icount.c b/softmmu/icount.c
index 5ca271620d..880ed04900 100644
--- a/softmmu/icount.c
+++ b/softmmu/icount.c
@@ -486,3 +486,11 @@  void icount_configure(QemuOpts *opts, Error **errp)
                    qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
                    NANOSECONDS_PER_SECOND / 10);
 }
+
+void icount_notify_exit(void)
+{
+    if (icount_enabled() && first_cpu) {
+        cpu_exit(first_cpu);
+        qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
+    }
+}
diff --git a/stubs/icount.c b/stubs/icount.c
index f13c43568b..6df8c2bf7d 100644
--- a/stubs/icount.c
+++ b/stubs/icount.c
@@ -43,3 +43,7 @@  void icount_account_warp_timer(void)
 {
     abort();
 }
+
+void icount_notify_exit(void)
+{
+}
diff --git a/util/async.c b/util/async.c
index 2ea1172f3e..c376b6c2b4 100644
--- a/util/async.c
+++ b/util/async.c
@@ -33,6 +33,7 @@ 
 #include "block/raw-aio.h"
 #include "qemu/coroutine_int.h"
 #include "qemu/coroutine-tls.h"
+#include "sysemu/cpu-timers.h"
 #include "trace.h"
 
 /***********************************************************/
@@ -185,6 +186,13 @@  void qemu_bh_schedule_idle(QEMUBH *bh)
 void qemu_bh_schedule(QEMUBH *bh)
 {
     aio_bh_enqueue(bh, BH_SCHEDULED);
+    /*
+     * Workaround for record/replay.
+     * vCPU execution should be suspended when new BH is set.
+     * This is needed to avoid guest timeouts caused
+     * by the long cycles of the execution.
+     */
+    icount_notify_exit();
 }
 
 /* This func is async.