block: Pause block jobs in bdrv_drain_all
This is necessary to suppress more IO requests from being generated from block job coroutines. Signed-off-by: Fam Zheng <famz@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Alberto Garcia <berto@igalia.com> Message-id: 1428069921-2957-3-git-send-email-famz@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
751ebd76e6
commit
69da3b0b47
20
block.c
20
block.c
@ -2040,6 +2040,16 @@ void bdrv_drain_all(void)
|
|||||||
bool busy = true;
|
bool busy = true;
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
|
||||||
|
AioContext *aio_context = bdrv_get_aio_context(bs);
|
||||||
|
|
||||||
|
aio_context_acquire(aio_context);
|
||||||
|
if (bs->job) {
|
||||||
|
block_job_pause(bs->job);
|
||||||
|
}
|
||||||
|
aio_context_release(aio_context);
|
||||||
|
}
|
||||||
|
|
||||||
while (busy) {
|
while (busy) {
|
||||||
busy = false;
|
busy = false;
|
||||||
|
|
||||||
@ -2051,6 +2061,16 @@ void bdrv_drain_all(void)
|
|||||||
aio_context_release(aio_context);
|
aio_context_release(aio_context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
|
||||||
|
AioContext *aio_context = bdrv_get_aio_context(bs);
|
||||||
|
|
||||||
|
aio_context_acquire(aio_context);
|
||||||
|
if (bs->job) {
|
||||||
|
block_job_resume(bs->job);
|
||||||
|
}
|
||||||
|
aio_context_release(aio_context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make a BlockDriverState anonymous by removing from bdrv_state and
|
/* make a BlockDriverState anonymous by removing from bdrv_state and
|
||||||
|
Loading…
Reference in New Issue
Block a user