get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.2/patches/2225816/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2225816,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2225816/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260421161132.99878-5-kwolf@redhat.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260421161132.99878-5-kwolf@redhat.com>",
    "list_archive_url": null,
    "date": "2026-04-21T16:11:29",
    "name": "[4/7] ide: Minimal fix for deadlock between TRIM and drain",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "1f5ac388f4cc0be6b6a2d8c6c3e2a3798616dda4",
    "submitter": {
        "id": 2714,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/2714/?format=api",
        "name": "Kevin Wolf",
        "email": "kwolf@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260421161132.99878-5-kwolf@redhat.com/mbox/",
    "series": [
        {
            "id": 500847,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/500847/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=500847",
            "date": "2026-04-21T16:11:27",
            "name": "ide: Fix deadlock between TRIM and drain",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/500847/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2225816/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2225816/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=NnPokfQX;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g0S8W5zVSz1yJy\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 02:13:47 +1000 (AEST)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wFDi1-0001My-GV; Tue, 21 Apr 2026 12:12:21 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <kwolf@redhat.com>) id 1wFDi0-0001LM-3c\n for qemu-devel@nongnu.org; Tue, 21 Apr 2026 12:12:20 -0400",
            "from us-smtp-delivery-124.mimecast.com ([170.10.133.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <kwolf@redhat.com>) id 1wFDhv-0000FI-0t\n for qemu-devel@nongnu.org; Tue, 21 Apr 2026 12:12:19 -0400",
            "from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-154-M394sVNXPwG4yesRc778kQ-1; Tue,\n 21 Apr 2026 12:12:11 -0400",
            "from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 983041955F05; Tue, 21 Apr 2026 16:12:10 +0000 (UTC)",
            "from merkur.fritz.box (unknown [10.44.49.173])\n by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id CBA171800351; Tue, 21 Apr 2026 16:12:08 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776787934;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=vj54Ak3FmGNSQPY81ZQ81Ux00FAoPnunMSojWp63cjA=;\n b=NnPokfQXTTPD+iCc7D+UpPYn27bgBcn0T6N/ZorZZZ2dJktVY+vRiRQ9w99VNxZto45NjA\n C3TOM/CTkf/YjlHs7zUuDKcjpcsSMrrfMMVmA1/qeo35cIm0H+vttkXWzmFKjB3Yk6PPsk\n SILdDyswch2rh8xRgZGxHQuV7Tdeh/0=",
        "X-MC-Unique": "M394sVNXPwG4yesRc778kQ-1",
        "X-Mimecast-MFC-AGG-ID": "M394sVNXPwG4yesRc778kQ_1776787930",
        "From": "Kevin Wolf <kwolf@redhat.com>",
        "To": "qemu-block@nongnu.org",
        "Cc": "kwolf@redhat.com, hreitz@redhat.com, jsnow@redhat.com,\n qemu-devel@nongnu.org, qemu-stable@nongnu.org",
        "Subject": "[PATCH 4/7] ide: Minimal fix for deadlock between TRIM and drain",
        "Date": "Tue, 21 Apr 2026 18:11:29 +0200",
        "Message-ID": "<20260421161132.99878-5-kwolf@redhat.com>",
        "In-Reply-To": "<20260421161132.99878-1-kwolf@redhat.com>",
        "References": "<20260421161132.99878-1-kwolf@redhat.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.111",
        "Received-SPF": "pass client-ip=170.10.133.124; envelope-from=kwolf@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com",
        "X-Spam_score_int": "-20",
        "X-Spam_score": "-2.1",
        "X-Spam_bar": "--",
        "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_PASS=-0.001,\n SPF_PASS=-0.001 autolearn=unavailable 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 <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "The implementation of TRIM in IDE can chain multiple discard requests\nand uses blk_inc/dec_in_flight() to make sure that the whole TRIM\noperation has completed when the device needs to be quiescent (e.g. for\nthe drain when performing an IDE reset, it would be bad if an IDE\nrequest like TRIM were still in flight).\n\nThe problem is that each drain request calls blk_wait_while_drained()\nand when draining, it waits until the drained section ends. At the same\ntime, drain_begin can only return if the whole TRIM operation has\ncompleted. This is a classic deadlock.\n\nUse blk_co_start/end_request() and BDRV_REQ_NO_QUEUE to avoid the\nproblem. This requires moving the TRIM state machine to a coroutine.\nThis commit does the minimal conversion so that we do have a coroutine\nthat works for the fix, but it still looks much like a callback-based\nimplementation. This will be cleaned up in the next patch.\n\nCc: qemu-stable@nongnu.org\nFixes: 7e5cdb345f77 ('ide: Increment BB in-flight counter for TRIM BH')\nBuglink: https://redhat.atlassian.net/browse/RHEL-121686\nSigned-off-by: Kevin Wolf <kwolf@redhat.com>\n---\n hw/ide/core.c | 37 ++++++++++++++++++-------------------\n 1 file changed, 18 insertions(+), 19 deletions(-)",
    "diff": "diff --git a/hw/ide/core.c b/hw/ide/core.c\nindex 7a15d6cac9b..48359c934c1 100644\n--- a/hw/ide/core.c\n+++ b/hw/ide/core.c\n@@ -420,7 +420,6 @@ typedef struct TrimAIOCB {\n     QEMUBH *bh;\n     int ret;\n     QEMUIOVector *qiov;\n-    BlockAIOCB *aiocb;\n     int i, j;\n } TrimAIOCB;\n \n@@ -433,11 +432,6 @@ static void trim_aio_cancel(BlockAIOCB *acb)\n     iocb->i = (iocb->qiov->iov[iocb->j].iov_len / 8) - 1;\n \n     iocb->ret = -ECANCELED;\n-\n-    if (iocb->aiocb) {\n-        blk_aio_cancel_async(iocb->aiocb);\n-        iocb->aiocb = NULL;\n-    }\n }\n \n static const AIOCBInfo trim_aiocb_info = {\n@@ -456,15 +450,20 @@ static void ide_trim_bh_cb(void *opaque)\n     iocb->bh = NULL;\n     qemu_aio_unref(iocb);\n \n-    /* Paired with an increment in ide_issue_trim() */\n-    blk_dec_in_flight(blk);\n+    /* Paired with blk_co_start_request in ide_trim_co_entry() */\n+    blk_end_request(blk);\n }\n \n-static void ide_issue_trim_cb(void *opaque, int ret)\n+static void coroutine_fn ide_trim_co_entry(void *opaque)\n {\n     TrimAIOCB *iocb = opaque;\n     IDEState *s = iocb->s;\n+    int ret = 0;\n+\n+    /* Paired with blk_end_request in ide_trim_bh_cb() */\n+    blk_co_start_request(s->blk);\n \n+loop:\n     if (iocb->i >= 0) {\n         if (ret >= 0) {\n             block_acct_done(blk_get_stats(s->blk), &s->acct);\n@@ -499,11 +498,11 @@ static void ide_issue_trim_cb(void *opaque, int ret)\n                                  count << BDRV_SECTOR_BITS, BLOCK_ACCT_UNMAP);\n \n                 /* Got an entry! Submit and exit.  */\n-                iocb->aiocb = blk_aio_pdiscard(s->blk,\n-                                               sector << BDRV_SECTOR_BITS,\n-                                               count << BDRV_SECTOR_BITS,\n-                                               ide_issue_trim_cb, opaque);\n-                return;\n+                ret = blk_co_pdiscard(s->blk,\n+                                      sector << BDRV_SECTOR_BITS,\n+                                      count << BDRV_SECTOR_BITS,\n+                                      BDRV_REQ_NO_QUEUE);\n+                goto loop;\n             }\n \n             iocb->j++;\n@@ -514,7 +513,6 @@ static void ide_issue_trim_cb(void *opaque, int ret)\n     }\n \n done:\n-    iocb->aiocb = NULL;\n     if (iocb->bh) {\n         replay_bh_schedule_event(iocb->bh);\n     }\n@@ -527,9 +525,7 @@ BlockAIOCB *ide_issue_trim(\n     IDEState *s = opaque;\n     IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;\n     TrimAIOCB *iocb;\n-\n-    /* Paired with a decrement in ide_trim_bh_cb() */\n-    blk_inc_in_flight(s->blk);\n+    Coroutine *co;\n \n     iocb = blk_aio_get(&trim_aiocb_info, s->blk, cb, cb_opaque);\n     iocb->s = s;\n@@ -539,7 +535,10 @@ BlockAIOCB *ide_issue_trim(\n     iocb->qiov = qiov;\n     iocb->i = -1;\n     iocb->j = 0;\n-    ide_issue_trim_cb(iocb, 0);\n+\n+    co = qemu_coroutine_create(ide_trim_co_entry, iocb);\n+    aio_co_enter(qemu_get_current_aio_context(), co);\n+\n     return &iocb->common;\n }\n \n",
    "prefixes": [
        "4/7"
    ]
}