From nobody Wed Aug 26 14:17:29 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1779486809; cv=none; d=zohomail.com; s=zohoarc; b=fxkusZWMSRHLzQYbuc08HTPjHUpRHkPlSnwAgch3zBhSdOcZCUebLnwT25fzTUSYR0K+IARs2DCXhsdlbxchR5p34KGKUP7xqFMEcYexgyX3VOvywMzz+kyQYhzmUMPf3Dq7KCXxsTlpaGiIJppapKpzLRLvmgoBFM1mVjXK+eo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1779486809; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=VIbBD6d0vSngmuo3KmQnMK+Nb+SBuWPAy+2ZoZsF6QE=; b=VTv9rGz1Ur5Hnxvn4RZ3/yP48vkPFEyiVqaZjYOqJFyZL2AYVJvGCP0RRS3mR1bw92O5UgrULH5ztTiBRYdeAken6GRTr0c6L7D5XCl9WZQ2pmu+Y7E81n9WQyQGoseZ25XE+qr/BpfI+gOdHX+E/D4rCmUiy1DrOZ8LSTkMJWM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1779486809296861.2648693251296; Fri, 22 May 2026 14:53:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wQXnf-0007sJ-TV; Fri, 22 May 2026 17:53:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wQXnd-0007Yh-7L; Fri, 22 May 2026 17:52:57 -0400 Received: from isrv.corpit.ru ([212.248.84.144]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wQXnb-0004t5-6m; Fri, 22 May 2026 17:52:56 -0400 Received: from tsrv.corpit.ru (tsrv.tls.msk.ru [192.168.177.2]) by isrv.corpit.ru (Postfix) with ESMTP id 9D3911AFB81; Sat, 23 May 2026 00:49:21 +0300 (MSK) Received: from think4mjt.tls.msk.ru (mjtthink.wg.tls.msk.ru [192.168.177.146]) by tsrv.corpit.ru (Postfix) with ESMTP id C71E63B71D0; Sat, 23 May 2026 00:49:25 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tls.msk.ru; s=202602; t=1779486561; bh=pRuzxg2xfxbxyj6206LkAip8Se84uW0D06jJxQlUGkM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=XEakNSqKs4nSA6uBIDsGUQBf/g44RmsbmBLmil7R/cyE2aGzgrwSaP6VcTAGQHyZC 4UIxGQpQhfJ/0wVA9TINUULNpObH9RY6aM6FLrM0tTvPkjXK3JbMI4MsdCqPteP7Qa OX2Q+wXyJWbq0rZiUd4klKW1YtM/aI0aoEYhwXTUcYq1sCzhMnERdAgzx7Nl1PqHhX d8zm6LpyeOjruYfIYdpGz4QfjE1sXv9QOaGACYc+U/GJhD6aEt7dXf7j26uZ4lBWsB pPh+l5L4UP05qbFcRz93qTwIY3kLpF0YRZRrmfpaOz8Z2CvrtvugQnESYZnNkypCNj Z6JqNzKClXCQw== From: Michael Tokarev To: qemu-devel@nongnu.org Cc: qemu-stable@nongnu.org, Kevin Wolf , Michael Tokarev Subject: [Stable-10.2.3 139/149] ide: Minimal fix for deadlock between TRIM and drain Date: Sat, 23 May 2026 00:49:11 +0300 Message-ID: <20260522214923.807017-40-mjt@tls.msk.ru> X-Mailer: git-send-email 2.47.3 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=212.248.84.144; envelope-from=mjt@tls.msk.ru; helo=isrv.corpit.ru X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @tls.msk.ru) X-ZM-MESSAGEID: 1779486810818154100 Content-Type: text/plain; charset="utf-8" From: Kevin Wolf The implementation of TRIM in IDE can chain multiple discard requests and uses blk_inc/dec_in_flight() to make sure that the whole TRIM operation has completed when the device needs to be quiescent (e.g. for the drain when performing an IDE reset, it would be bad if an IDE request like TRIM were still in flight). The problem is that each drain request calls blk_wait_while_drained() and when draining, it waits until the drained section ends. At the same time, drain_begin can only return if the whole TRIM operation has completed. This is a classic deadlock. Use blk_co_start/end_request() and BDRV_REQ_NO_QUEUE to avoid the problem. This requires moving the TRIM state machine to a coroutine. This commit does the minimal conversion so that we do have a coroutine that works for the fix, but it still looks much like a callback-based implementation. This will be cleaned up in the next patch. Cc: qemu-stable@nongnu.org Fixes: 7e5cdb345f77 ('ide: Increment BB in-flight counter for TRIM BH') Buglink: https://redhat.atlassian.net/browse/RHEL-121686 Signed-off-by: Kevin Wolf Message-ID: <20260421161132.99878-5-kwolf@redhat.com> Signed-off-by: Kevin Wolf (cherry picked from commit 095c08a7ba68cabaa6e0ce7a8a0804a949542c4c) Signed-off-by: Michael Tokarev diff --git a/hw/ide/core.c b/hw/ide/core.c index c66a9d8df0..a2430f3a8e 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -420,7 +420,6 @@ typedef struct TrimAIOCB { QEMUBH *bh; int ret; QEMUIOVector *qiov; - BlockAIOCB *aiocb; int i, j; } TrimAIOCB; =20 @@ -433,11 +432,6 @@ static void trim_aio_cancel(BlockAIOCB *acb) iocb->i =3D (iocb->qiov->iov[iocb->j].iov_len / 8) - 1; =20 iocb->ret =3D -ECANCELED; - - if (iocb->aiocb) { - blk_aio_cancel_async(iocb->aiocb); - iocb->aiocb =3D NULL; - } } =20 static const AIOCBInfo trim_aiocb_info =3D { @@ -456,15 +450,20 @@ static void ide_trim_bh_cb(void *opaque) iocb->bh =3D NULL; qemu_aio_unref(iocb); =20 - /* Paired with an increment in ide_issue_trim() */ - blk_dec_in_flight(blk); + /* Paired with blk_co_start_request in ide_trim_co_entry() */ + blk_end_request(blk); } =20 -static void ide_issue_trim_cb(void *opaque, int ret) +static void coroutine_fn ide_trim_co_entry(void *opaque) { TrimAIOCB *iocb =3D opaque; IDEState *s =3D iocb->s; + int ret =3D 0; + + /* Paired with blk_end_request in ide_trim_bh_cb() */ + blk_co_start_request(s->blk); =20 +loop: if (iocb->i >=3D 0) { if (ret >=3D 0) { block_acct_done(blk_get_stats(s->blk), &s->acct); @@ -499,11 +498,11 @@ static void ide_issue_trim_cb(void *opaque, int ret) count << BDRV_SECTOR_BITS, BLOCK_ACCT_UNM= AP); =20 /* Got an entry! Submit and exit. */ - iocb->aiocb =3D blk_aio_pdiscard(s->blk, - sector << BDRV_SECTOR_BITS, - count << BDRV_SECTOR_BITS, - ide_issue_trim_cb, opaque); - return; + ret =3D blk_co_pdiscard(s->blk, + sector << BDRV_SECTOR_BITS, + count << BDRV_SECTOR_BITS, + BDRV_REQ_NO_QUEUE); + goto loop; } =20 iocb->j++; @@ -514,7 +513,6 @@ static void ide_issue_trim_cb(void *opaque, int ret) } =20 done: - iocb->aiocb =3D NULL; if (iocb->bh) { replay_bh_schedule_event(iocb->bh); } @@ -527,9 +525,7 @@ BlockAIOCB *ide_issue_trim( IDEState *s =3D opaque; IDEDevice *dev =3D s->unit ? s->bus->slave : s->bus->master; TrimAIOCB *iocb; - - /* Paired with a decrement in ide_trim_bh_cb() */ - blk_inc_in_flight(s->blk); + Coroutine *co; =20 iocb =3D blk_aio_get(&trim_aiocb_info, s->blk, cb, cb_opaque); iocb->s =3D s; @@ -539,7 +535,10 @@ BlockAIOCB *ide_issue_trim( iocb->qiov =3D qiov; iocb->i =3D -1; iocb->j =3D 0; - ide_issue_trim_cb(iocb, 0); + + co =3D qemu_coroutine_create(ide_trim_co_entry, iocb); + aio_co_enter(qemu_get_current_aio_context(), co); + return &iocb->common; } =20 --=20 2.47.3