]> git.proxmox.com Git - mirror_qemu.git/commit
qed: Use bottom half to resume waiting requests
authorKevin Wolf <kwolf@redhat.com>
Wed, 16 Nov 2016 16:31:14 +0000 (17:31 +0100)
committerKevin Wolf <kwolf@redhat.com>
Mon, 26 Jun 2017 12:51:14 +0000 (14:51 +0200)
commit3b7cd9fd8fc2d34da6a42f49421e3549918adf58
tree71e52b68f8001e4c6c5c6638201ec54ee78634cf
parent24990c5b959c3a24d76ccf96303c1f70556f1dd2
qed: Use bottom half to resume waiting requests

The qed driver serialises allocating write requests. When the active
allocation is finished, the AIO callback is called, but after this, the
next allocating request is immediately processed instead of leaving the
coroutine. Resuming another allocation request in the same request
coroutine means that the request now runs in the wrong coroutine.

The following is one of the possible effects of this: The completed
request will generally reenter its request coroutine in a bottom half,
expecting that it completes the request in bdrv_driver_pwritev().
However, if the second request actually yielded before leaving the
coroutine, the reused request coroutine is in an entirely different
place and is reentered prematurely. Not a good idea.

Let's make sure that we exit the coroutine after completing the first
request by resuming the next allocating request only with a bottom
half.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
block/qed.c