From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 1916570F33 for ; Tue, 6 Apr 2021 16:42:07 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 16B79866F for ; Tue, 6 Apr 2021 16:42:07 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 234BC8653 for ; Tue, 6 Apr 2021 16:42:06 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id E4EA6459C1 for ; Tue, 6 Apr 2021 16:42:05 +0200 (CEST) From: Thomas Lamprecht To: pve-devel@lists.proxmox.com Date: Tue, 6 Apr 2021 16:41:57 +0200 Message-Id: <20210406144159.1934669-1-t.lamprecht@proxmox.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.044 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] applied: [PATCH qemu 1/3] alloc track: acquire BS AIO context during dropping X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Apr 2021 14:42:07 -0000 ran into this when live-restoring a backup configured for IO-threads, got the good ol': > qemu: qemu_mutex_unlock_impl: Operation not permitted error. Checking out the history of the related bdrv_backup_top_drop(*bs) method, we can see that it used to do the AIO context acquiring too, but in the backup path this was problematic and was changed to be higher up in the call path in a upstream series from Stefan[0]. That said, this is a completely different code path and it is safe to do so here. We always run from the main threads's AIO context here and we call it only indirectly once, guarded by checking for `s->drop_state == DropNone` and set `s->drop_state = DropRequested` shortly before we schedule the track_drop() in a bh. [0]: https://lists.gnu.org/archive/html/qemu-devel/2020-03/msg09139.html Signed-off-by: Thomas Lamprecht --- It's for an opt-in, not yet exposed feature, so not much to break here (also it was clearly broken, and this _is_ the right fix IMO, if anything one could argue if here is the right place, but checking callers and testing various scenarios it seems right) debian/patches/pve/0047-block-add-alloc-track-driver.patch | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/debian/patches/pve/0047-block-add-alloc-track-driver.patch b/debian/patches/pve/0047-block-add-alloc-track-driver.patch index 232ad7e..8eed42f 100644 --- a/debian/patches/pve/0047-block-add-alloc-track-driver.patch +++ b/debian/patches/pve/0047-block-add-alloc-track-driver.patch @@ -34,7 +34,7 @@ new file mode 100644 index 0000000000..b579380279 --- /dev/null +++ b/block/alloc-track.c -@@ -0,0 +1,342 @@ +@@ -0,0 +1,345 @@ +/* + * Node to allow backing images to be applied to any node. Assumes a blank + * image to begin with, only new writes are tracked as allocated, thus this @@ -313,6 +313,8 @@ index 0000000000..b579380279 + aio_bh_schedule_oneshot(qemu_get_aio_context(), track_drop, opaque); + return; + } ++ AioContext *aio_context = bdrv_get_aio_context(bs); ++ aio_context_acquire(aio_context); + + bdrv_drained_begin(bs); + @@ -324,6 +326,7 @@ index 0000000000..b579380279 + bdrv_set_backing_hd(bs, NULL, &error_abort); + bdrv_drained_end(bs); + bdrv_unref(bs); ++ aio_context_release(aio_context); +} + +static int track_change_backing_file(BlockDriverState *bs, -- 2.29.2