From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57858) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1amfPU-0001q6-Pu for qemu-devel@nongnu.org; Sun, 03 Apr 2016 06:37:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1amfPT-0002yz-W1 for qemu-devel@nongnu.org; Sun, 03 Apr 2016 06:37:36 -0400 Date: Sun, 3 Apr 2016 13:37:25 +0300 From: "Michael S. Tsirkin" Message-ID: <1459679740-17519-1-git-send-email-mst@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Subject: [Qemu-devel] [PATCH] virtio-blk: assert on starting/stopping List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , qemu-block@nongnu.org, Christian Borntraeger , Stefan Hajnoczi , Cornelia Huck , Paolo Bonzini Reentrancy cannot happen while the BQL is being held, so we should never enter this condition. Cc: Christian Borntraeger Cc: Cornelia Huck Cc: Paolo Bonzini Signed-off-by: Michael S. Tsirkin --- This is a replacement for [PATCH 9/9] virtio: remove starting/stopping checks Christian, could you please give it a spin with debug enabled? Since you reported above Paolo's patch triggers segfaults, I expect this one to trigger assertions as well, which should give us more info on the root cause. hw/block/dataplane/virtio-blk.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c index fd06726..04e0e0d 100644 --- a/hw/block/dataplane/virtio-blk.c +++ b/hw/block/dataplane/virtio-blk.c @@ -203,10 +203,12 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s) VirtIOBlock *vblk = VIRTIO_BLK(s->vdev); int r; - if (vblk->dataplane_started || s->starting) { + if (vblk->dataplane_started) { return; } + assert(!s->starting); + s->starting = true; s->vq = virtio_get_queue(s->vdev, 0); @@ -257,10 +259,12 @@ void virtio_blk_data_plane_stop(VirtIOBlockDataPlane *s) VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus); VirtIOBlock *vblk = VIRTIO_BLK(s->vdev); - if (!vblk->dataplane_started || s->stopping) { + if (!vblk->dataplane_started) { return; } + assert(!s->stopping); + /* Better luck next time. */ if (vblk->dataplane_disabled) { vblk->dataplane_disabled = false; -- MST