Convert aio_bh_schedule_oneshot() to aio_bh_schedule_oneshot_event(), which can specify the clock type, making it compatible with record-replay.
Operations on SCSI reqs do affect target machine state, so it should use QEMU_CLOCK_VIRTUAL to recorded and replay the bh. This fixes hangs in record/replay when using SCSI devices. Signed-off-by: Nicholas Piggin <npig...@gmail.com> --- hw/scsi/scsi-bus.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c index 2f1678d51e7..16f294ce6b7 100644 --- a/hw/scsi/scsi-bus.c +++ b/hw/scsi/scsi-bus.c @@ -166,9 +166,17 @@ static void scsi_device_for_each_req_async(SCSIDevice *s, /* Paired with blk_dec_in_flight() in scsi_device_for_each_req_async_bh() */ blk_inc_in_flight(s->conf.blk); - aio_bh_schedule_oneshot(blk_get_aio_context(s->conf.blk), - scsi_device_for_each_req_async_bh, - data); + + /* + * This is called by device reset and does not affect the observable state + * of the target (because it is being reset), and by scsi_dma_restart_cb + * to restart DMA on vmstate change which also should not affect the state + * of the target (XXX is this really true?), so QEMU_CLOCK_REALTIME should + * be used to avoid record-replay of the bh event. + */ + aio_bh_schedule_oneshot_event(blk_get_aio_context(s->conf.blk), + scsi_device_for_each_req_async_bh, + data, QEMU_CLOCK_REALTIME); } static void scsi_device_realize(SCSIDevice *s, Error **errp) -- 2.45.2