From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, qemu-stable@nongnu.org
Subject: [Qemu-devel] [PATCH 29/36] block: Fix AioContext switch for bs->drv == NULL
Date: Tue, 23 Jul 2019 12:00:57 -0500 [thread overview]
Message-ID: <20190723170104.4327-30-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <20190723170104.4327-1-mdroth@linux.vnet.ibm.com>
From: Kevin Wolf <kwolf@redhat.com>
Even for block nodes with bs->drv == NULL, we can't just ignore a
bdrv_set_aio_context() call. Leaving the node in its old context can
mean that it's still in an iothread context in bdrv_close_all() during
shutdown, resulting in an attempted unlock of the AioContext lock which
we don't hold.
This is an example stack trace of a related crash:
#0 0x00007ffff59da57f in raise () at /lib64/libc.so.6
#1 0x00007ffff59c4895 in abort () at /lib64/libc.so.6
#2 0x0000555555b97b1e in error_exit (err=<optimized out>, msg=msg@entry=0x555555d386d0 <__func__.19059> "qemu_mutex_unlock_impl") at util/qemu-thread-posix.c:36
#3 0x0000555555b97f7f in qemu_mutex_unlock_impl (mutex=mutex@entry=0x5555568002f0, file=file@entry=0x555555d378df "util/async.c", line=line@entry=507) at util/qemu-thread-posix.c:97
#4 0x0000555555b92f55 in aio_context_release (ctx=ctx@entry=0x555556800290) at util/async.c:507
#5 0x0000555555b05cf8 in bdrv_prwv_co (child=child@entry=0x7fffc80012f0, offset=offset@entry=131072, qiov=qiov@entry=0x7fffffffd4f0, is_write=is_write@entry=true, flags=flags@entry=0)
at block/io.c:833
#6 0x0000555555b060a9 in bdrv_pwritev (qiov=0x7fffffffd4f0, offset=131072, child=0x7fffc80012f0) at block/io.c:990
#7 0x0000555555b060a9 in bdrv_pwrite (child=0x7fffc80012f0, offset=131072, buf=<optimized out>, bytes=<optimized out>) at block/io.c:990
#8 0x0000555555ae172b in qcow2_cache_entry_flush (bs=bs@entry=0x555556810680, c=c@entry=0x5555568cc740, i=i@entry=0) at block/qcow2-cache.c:51
#9 0x0000555555ae18dd in qcow2_cache_write (bs=bs@entry=0x555556810680, c=0x5555568cc740) at block/qcow2-cache.c:248
#10 0x0000555555ae15de in qcow2_cache_flush (bs=0x555556810680, c=<optimized out>) at block/qcow2-cache.c:259
#11 0x0000555555ae16b1 in qcow2_cache_flush_dependency (c=0x5555568a1700, c=0x5555568a1700, bs=0x555556810680) at block/qcow2-cache.c:194
#12 0x0000555555ae16b1 in qcow2_cache_entry_flush (bs=bs@entry=0x555556810680, c=c@entry=0x5555568a1700, i=i@entry=0) at block/qcow2-cache.c:194
#13 0x0000555555ae18dd in qcow2_cache_write (bs=bs@entry=0x555556810680, c=0x5555568a1700) at block/qcow2-cache.c:248
#14 0x0000555555ae15de in qcow2_cache_flush (bs=bs@entry=0x555556810680, c=<optimized out>) at block/qcow2-cache.c:259
#15 0x0000555555ad242c in qcow2_inactivate (bs=bs@entry=0x555556810680) at block/qcow2.c:2124
#16 0x0000555555ad2590 in qcow2_close (bs=0x555556810680) at block/qcow2.c:2153
#17 0x0000555555ab0c62 in bdrv_close (bs=0x555556810680) at block.c:3358
#18 0x0000555555ab0c62 in bdrv_delete (bs=0x555556810680) at block.c:3542
#19 0x0000555555ab0c62 in bdrv_unref (bs=0x555556810680) at block.c:4598
#20 0x0000555555af4d72 in blk_remove_bs (blk=blk@entry=0x5555568103d0) at block/block-backend.c:785
#21 0x0000555555af4dbb in blk_remove_all_bs () at block/block-backend.c:483
#22 0x0000555555aae02f in bdrv_close_all () at block.c:3412
#23 0x00005555557f9796 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4776
The reproducer I used is a qcow2 image on gluster volume, where the
virtual disk size (4 GB) is larger than the gluster volume size (64M),
so we can easily trigger an ENOSPC. This backend is assigned to a
virtio-blk device using an iothread, and then from the guest a
'dd if=/dev/zero of=/dev/vda bs=1G count=1' causes the VM to stop
because of an I/O error. qemu_gluster_co_flush_to_disk() sets
bs->drv = NULL on error, so when virtio-blk stops the dataplane, the
block nodes stay in the iothread AioContext. A 'quit' monitor command
issued from this paused state crashes the process.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1631227
Cc: qemu-stable@nongnu.org
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
(cherry picked from commit 1bffe1ae7a7b707c3a14ea2ccd00d3609d3ce4d8)
*drop context dependency on e64f25f30b8
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
block.c | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/block.c b/block.c
index 1ec4512d1e..3405a652a3 100644
--- a/block.c
+++ b/block.c
@@ -5056,10 +5056,6 @@ void bdrv_detach_aio_context(BlockDriverState *bs)
BdrvAioNotifier *baf, *baf_tmp;
BdrvChild *child;
- if (!bs->drv) {
- return;
- }
-
assert(!bs->walking_aio_notifiers);
bs->walking_aio_notifiers = true;
QLIST_FOREACH_SAFE(baf, &bs->aio_notifiers, list, baf_tmp) {
@@ -5074,7 +5070,7 @@ void bdrv_detach_aio_context(BlockDriverState *bs)
*/
bs->walking_aio_notifiers = false;
- if (bs->drv->bdrv_detach_aio_context) {
+ if (bs->drv && bs->drv->bdrv_detach_aio_context) {
bs->drv->bdrv_detach_aio_context(bs);
}
QLIST_FOREACH(child, &bs->children, next) {
@@ -5090,16 +5086,12 @@ void bdrv_attach_aio_context(BlockDriverState *bs,
BdrvAioNotifier *ban, *ban_tmp;
BdrvChild *child;
- if (!bs->drv) {
- return;
- }
-
bs->aio_context = new_context;
QLIST_FOREACH(child, &bs->children, next) {
bdrv_attach_aio_context(child->bs, new_context);
}
- if (bs->drv->bdrv_attach_aio_context) {
+ if (bs->drv && bs->drv->bdrv_attach_aio_context) {
bs->drv->bdrv_attach_aio_context(bs, new_context);
}
--
2.17.1
next prev parent reply other threads:[~2019-07-23 17:05 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-23 17:00 [Qemu-devel] [PATCH 00/36] Patch Round-up for stable 3.1.1, freeze on 2019-07-29 Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 01/36] i2c: Move typedef of bitbang_i2c_interface to i2c.h Michael Roth
2019-07-23 18:57 ` BALATON Zoltan
2019-07-23 19:01 ` Thomas Huth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 02/36] iotests: make 235 work on s390 (and others) Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 03/36] Changes requirement for "vsubsbs" instruction Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 04/36] pcie: set link state inactive/active after hot unplug/plug Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 05/36] pc:piix4: Update smbus I/O space after a migration Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 06/36] hw/s390x: Fix bad mask in time2tod() Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 07/36] linux-user: make pwrite64/pread64(fd, NULL, 0, offset) return 0 Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 08/36] s390x: Return specification exception for unimplemented diag 308 subcodes Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 09/36] exec.c: Don't reallocate IOMMUNotifiers that are in use Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 10/36] tpm: Make sure new locality passed to tpm_tis_prep_abort() is valid Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 11/36] tpm: Make sure the locality received from backend " Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 12/36] block: Fix invalidate_cache error path for parent activation Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 13/36] hw/rdma: another clang compilation fix Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 14/36] slirp: check sscanf result when emulating ident Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 15/36] tpm_tis: fix loop that cancels any seizure by a lower locality Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 16/36] vfio-ap: flag as compatible with balloon Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 17/36] i386: remove the new CPUID 'PCONFIG' from Icelake-Server CPU model Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 18/36] i386: remove the 'INTEL_PT' CPUID bit from named CPU models Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 19/36] json: Fix % handling when not interpolating Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 20/36] qga-win: include glib when building VSS DLL Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 21/36] configure: improve usbfs check Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 22/36] mac_oldworld: use node name instead of alias name for hd device in FWPathProvider Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 23/36] mac_newworld: " Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 24/36] qga: update docs with systemd suspend support info Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 25/36] usb-mtp: use O_NOFOLLOW and O_CLOEXEC Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 26/36] qemu-img: fix error reporting for -object Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 27/36] qcow2: Avoid COW during metadata preallocation Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 28/36] cutils: Fix size_to_str() on 32-bit platforms Michael Roth
2019-07-23 17:00 ` Michael Roth [this message]
2019-07-23 17:00 ` [Qemu-devel] [PATCH 30/36] do not call vhost_net_cleanup() on running net from char user event Michael Roth
2019-07-23 17:00 ` [Qemu-devel] [PATCH 31/36] s390x/cpumodel: ignore csske for expansion Michael Roth
2019-07-23 17:01 ` [Qemu-devel] [PATCH 32/36] megasas: fix mapped frame size Michael Roth
2019-07-23 17:01 ` [Qemu-devel] [PATCH 33/36] iotests: Filter second BLOCK_JOB_ERROR from 229 Michael Roth
2019-07-23 17:01 ` [Qemu-devel] [PATCH 34/36] block/file-posix: Unaligned O_DIRECT block-status Michael Roth
2019-07-23 17:01 ` [Qemu-devel] [PATCH 35/36] iotests: Test unaligned raw images with O_DIRECT Michael Roth
2019-07-23 17:01 ` [Qemu-devel] [PATCH 36/36] vhost: fix vhost_log size overflow during migration Michael Roth
2019-07-23 17:12 ` [Qemu-devel] [PATCH 00/36] Patch Round-up for stable 3.1.1, freeze on 2019-07-29 Aleksandar Markovic
2019-07-23 18:52 ` Michael Roth
2019-07-23 18:50 ` [Qemu-devel] [Qemu-stable] " Michael Roth
2019-07-24 13:21 ` Philippe Mathieu-Daudé
2019-08-02 17:54 ` Philippe Mathieu-Daudé
2019-07-24 17:07 ` Cole Robinson
2019-07-29 20:13 ` Bruce Rogers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190723170104.4327-30-mdroth@linux.vnet.ibm.com \
--to=mdroth@linux.vnet.ibm.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).