]> git.proxmox.com Git - mirror_qemu.git/commit - block/throttle-groups.c
throttle-groups: drain before detaching ThrottleState
authorStefan Hajnoczi <stefanha@redhat.com>
Fri, 10 Nov 2017 15:19:34 +0000 (15:19 +0000)
committerStefan Hajnoczi <stefanha@redhat.com>
Mon, 13 Nov 2017 14:02:09 +0000 (14:02 +0000)
commitdc868fb03b9b829ed9d2ecdae0fcc12f3fe19b4f
tree21130555d5c54a977907bd8e7e8e1fc836fc6874
parent632a77354317df32c7ff2d23424f0559c23fee51
throttle-groups: drain before detaching ThrottleState

I/O requests hang after stop/cont commands at least since QEMU 2.10.0
with -drive iops=100:

  (guest)$ dd if=/dev/zero of=/dev/vdb oflag=direct count=1000
  (qemu) stop
  (qemu) cont
  ...I/O is stuck...

This happens because blk_set_aio_context() detaches the ThrottleState
while requests may still be in flight:

  if (tgm->throttle_state) {
      throttle_group_detach_aio_context(tgm);
      throttle_group_attach_aio_context(tgm, new_context);
  }

This patch encloses the detach/attach calls in a drained region so no
I/O request is left hanging.  Also add assertions so we don't make the
same mistake again in the future.

Reported-by: Yongxue Hong <yhong@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-id: 20171110151934.16883-1-stefanha@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
block/block-backend.c
block/throttle-groups.c