@@ -232,7 +232,8 @@ void block_job_sleep_ns(BlockJob *job, QEMUClockType type, int64_t ns)
if (block_job_is_paused(job)) {
qemu_coroutine_yield();
} else {
- co_aio_sleep_ns(bdrv_get_aio_context(job->bs), type, ns);
+ co_aio_sleep_ns(bdrv_get_aio_context(job->bs), type,
+ MAX(ns, BLOCK_JOB_SLEEP_MIN));
}
job->busy = true;
}
@@ -140,11 +140,15 @@ void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs,
int64_t speed, BlockCompletionFunc *cb,
void *opaque, Error **errp);
+#define BLOCK_JOB_SLEEP_MIN 100000LL
/**
* block_job_sleep_ns:
* @job: The job that calls the function.
* @clock: The clock to sleep on.
- * @ns: How many nanoseconds to stop for.
+ * @ns: How many nanoseconds to stop for. It would be meaningless if it is
+ * very short, because the timer to wake up the job could fire right very
+ * quickly even before anything else is done. Hence, a minimum,
+ * BLOCK_JOB_SLEEP_MIN, is defined.
*
* Put the job to sleep (assuming that it wasn't canceled) for @ns
* nanoseconds. Canceling the job will interrupt the wait immediately.
A timer that will immediately wake the job up spoils the point to call block_job_sleep_ns in the first place - bdrv_drain_all has to return. Let's sleep longer to let aio_poll return, before the job resumes and submitts more IO requests. Signed-off-by: Fam Zheng <famz@redhat.com> --- blockjob.c | 3 ++- include/block/blockjob.h | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-)