get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2233301,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2233301/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/3472fb763391a8efa096adc5d169c55e327112df.1778053560.git.jeuk20.kim@samsung.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": "<3472fb763391a8efa096adc5d169c55e327112df.1778053560.git.jeuk20.kim@samsung.com>",
    "list_archive_url": null,
    "date": "2026-05-06T07:54:31",
    "name": "[4/4] hw/ufs: Keep MCQ SQs alive while requests are outstanding",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "730bad6b283e03516811af986f670bfa8e062e35",
    "submitter": {
        "id": 86755,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/86755/?format=api",
        "name": "Jeuk Kim",
        "email": "jeuk20.kim@gmail.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/3472fb763391a8efa096adc5d169c55e327112df.1778053560.git.jeuk20.kim@samsung.com/mbox/",
    "series": [
        {
            "id": 502929,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/502929/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=502929",
            "date": "2026-05-06T07:54:27",
            "name": "hw/ufs: Fix guest-triggerable MCQ crashes",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/502929/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2233301/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2233301/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 (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=OEjv26td;\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 4g9SQ021pcz1yJq\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 06 May 2026 17:56:40 +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 1wKX6R-0002ih-Bh; Wed, 06 May 2026 03:55:31 -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 <jeuk20.kim@gmail.com>)\n id 1wKX6E-0002el-0v\n for qemu-devel@nongnu.org; Wed, 06 May 2026 03:55:20 -0400",
            "from mail-pj1-x1036.google.com ([2607:f8b0:4864:20::1036])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <jeuk20.kim@gmail.com>)\n id 1wKX6B-00085p-6e\n for qemu-devel@nongnu.org; Wed, 06 May 2026 03:55:17 -0400",
            "by mail-pj1-x1036.google.com with SMTP id\n 98e67ed59e1d1-3658c87160eso800131a91.0\n for <qemu-devel@nongnu.org>; Wed, 06 May 2026 00:55:14 -0700 (PDT)",
            "from jeuk-MS-7D42.. ([211.226.54.223])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-365b4bcaa49sm1380997a91.1.2026.05.06.00.55.10\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 06 May 2026 00:55:12 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1778054113; x=1778658913; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=0IdASMODNaa9Qa5EkhRzMRiJsje/vGTTLmetdjczDI4=;\n b=OEjv26tdWnScgYlYdNVtoFyH6Jt2lZsGbH2KI3yS1yxdcAeZWxSGyQsDLTzlb0nIeE\n WBzLreYc8VXw6I+yXYr8O/Ed72Yf8aYx0p7qtDKUS6p4u1JwfEdmaCjFhLX5odcjif09\n lMROU5CMmTxcKauC63suH1pU2wQHy9PvnRXNhuO+HFLANu+BY4MQXIWQkvbNZntcVoHd\n lY+eAN9Kye2OIWzhgNNqeMLQwu64Gu1zC04Q5QuU4I8aaeSfLOC/drOOkQK5IegVNGQN\n i5F+MitPxoB2lpi5k12qdk2IlKqkaGZZxVeY9KDb1RjGJu4PZ8n3zDqe5oJv34M+QWqi\n 7JEw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1778054113; x=1778658913;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=0IdASMODNaa9Qa5EkhRzMRiJsje/vGTTLmetdjczDI4=;\n b=M0dvKL48DeQu5FhfSFKF831P3TZD0mRCuLEbqUEQBoFiwTxXCyq1VAmOTWIOAxOeMM\n gem+vZl8A13Frp7ule1wC9l4AekNZybittbFSS5JpA7itFrXLDmmxmuF7j35NEifmM2B\n Qsnp9WJBzvo+Upjp6dMCQUDfgQcX86raZQoJHdFERD4oEvlG+z3l49KCj+iz+uef02gW\n hrbRKamz1BwrhV9IA6nZuWxizv3ZCgd4DkYgOhueMJ7zinAZjaFTF7Lx2elxPVF8LHz+\n lcG8YyiPMJMq1AhR9qqTQCPyO1wzQ7DSuuUjj25JxbG6msD+eRjkuqLEpTvYk5wI602x\n FyXA==",
        "X-Gm-Message-State": "AOJu0Yxuz8hsYw66RIlqtgr7cSiFiWwgBSPXhaGd7pE4iPivxXxBk7JP\n 1P2S3lVJZZr56+7ulVE34zupBGFWUWo/8u0pn3g4J+pM9pkb83B5hWeS22XGyQ==",
        "X-Gm-Gg": "AeBDietJK0WMQffuBfV8DAdk2tZwgns/E+cAUfVPuRXiSz+0Yzpi1teQAhaJdWhehki\n S9L6Uxhc56HOvfK0dK83OA2x8QAMB5kFr3XuyI3Qc67bYygMqvuCA7MTDswjIRXr90wiX72n94C\n 8YKpegcGXrV3b1t0BuC1lgj7/w2MqlEBa2rJOWNExNQySP+GC7squYsRIxN3+8ADN69FnPV3lgn\n 14Pl2HUaA0aYuxWnxeLclEpWqb+rCOmnZq8NBk7aa+q+JVAcB9McXynHY8WVif688xVG5+lf7v+\n +y5DxGd+TAvJwRuWkRy97KiYF+ndaISJArNiuIePYYJj8iRndHPc2lG/LxjxTj7wlMlR0el2ebS\n OCOsYQu0wdwroD61Qlru2AO/tBE2O7chHt7r55tJhV9Fjromm3T5kLi78X+59hTr9+5ue0DI7GL\n Owm+r1UrERTFdLt8wuNagjjsnBeFIwksf1DSefNec3QQ==",
        "X-Received": "by 2002:a17:90b:1c8b:b0:364:534b:a898 with SMTP id\n 98e67ed59e1d1-365abad59c2mr2116123a91.8.1778054112510;\n Wed, 06 May 2026 00:55:12 -0700 (PDT)",
        "From": "Jeuk Kim <jeuk20.kim@gmail.com>",
        "X-Google-Original-From": "Jeuk Kim <jeuk20.kim@samsung.com>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "jeuk20.kim@samsung.com, qemu-block@nongnu.org, qemu-stable@nongnu.org,\n j-young.choi@samsung.com",
        "Subject": "[PATCH 4/4] hw/ufs: Keep MCQ SQs alive while requests are outstanding",
        "Date": "Wed,  6 May 2026 16:54:31 +0900",
        "Message-ID": "\n <3472fb763391a8efa096adc5d169c55e327112df.1778053560.git.jeuk20.kim@samsung.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<cover.1778053560.git.jeuk20.kim@samsung.com>",
        "References": "<cover.1778053560.git.jeuk20.kim@samsung.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Received-SPF": "pass client-ip=2607:f8b0:4864:20::1036;\n envelope-from=jeuk20.kim@gmail.com; helo=mail-pj1-x1036.google.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, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=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": "MCQ requests are allocated with their SQ, but can remain in flight on the\nCQ list or in the SCSI layer after leaving the SQ free list.\n\nReject runtime SQ deletion while any request is still outstanding, and\nuse separate teardown helpers so device exit can still release MCQ\nqueues after child devices have been unrealized.\n\nFixes: 5c079578d2e (\"hw/ufs: Add support MCQ of UFSHCI 4.0\")\nCc: qemu-stable@nongnu.org\nSigned-off-by: Jeuk Kim <jeuk20.kim@samsung.com>\n---\n hw/ufs/trace-events |  1 +\n hw/ufs/ufs.c        | 49 ++++++++++++++++++++++++++++++++++++++-------\n 2 files changed, 43 insertions(+), 7 deletions(-)",
    "diff": "diff --git a/hw/ufs/trace-events b/hw/ufs/trace-events\nindex 7734b35f08..6f7ea9c95f 100644\n--- a/hw/ufs/trace-events\n+++ b/hw/ufs/trace-events\n@@ -44,6 +44,7 @@ ufs_err_mcq_create_sq_invalid_size(uint8_t qid) \"invalid mcq sq size for sqid %\"\n ufs_err_mcq_create_sq_already_exists(uint8_t qid) \"mcq sqid %\"PRIu8 \"already exists\"\n ufs_err_mcq_delete_sq_invalid_sqid(uint8_t qid) \"invalid mcq sqid %\"PRIu8\"\"\n ufs_err_mcq_delete_sq_not_exists(uint8_t qid) \"mcq sqid %\"PRIu8 \"not exists\"\n+ufs_err_mcq_delete_sq_busy(uint8_t qid) \"mcq sqid %\"PRIu8\" has outstanding requests\"\n ufs_err_mcq_create_cq_invalid_cqid(uint8_t qid) \"invalid mcq cqid %\"PRIu8\"\"\n ufs_err_mcq_create_cq_invalid_size(uint8_t qid) \"invalid mcq cq size for cqid %\"PRIu8\"\"\n ufs_err_mcq_create_cq_already_exists(uint8_t qid) \"mcq cqid %\"PRIu8 \"already exists\"\ndiff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c\nindex 4ccd7aa64d..6548f0f637 100644\n--- a/hw/ufs/ufs.c\n+++ b/hw/ufs/ufs.c\n@@ -556,6 +556,31 @@ static bool ufs_mcq_create_sq(UfsHc *u, uint8_t qid, uint32_t attr)\n     return true;\n }\n \n+static bool ufs_mcq_sq_has_outstanding_req(UfsSq *sq)\n+{\n+    UfsRequest *req;\n+    uint16_t free_reqs = 0;\n+\n+    QTAILQ_FOREACH(req, &sq->req_list, entry)\n+    {\n+        free_reqs++;\n+    }\n+\n+    return free_reqs != sq->size;\n+}\n+\n+static void ufs_mcq_free_sq(UfsSq *sq)\n+{\n+    qemu_bh_delete(sq->bh);\n+\n+    for (int i = 0; i < sq->size; i++) {\n+        ufs_clear_req(&sq->req[i]);\n+    }\n+\n+    g_free(sq->req);\n+    g_free(sq);\n+}\n+\n static bool ufs_mcq_delete_sq(UfsHc *u, uint8_t qid)\n {\n     UfsSq *sq;\n@@ -572,9 +597,12 @@ static bool ufs_mcq_delete_sq(UfsHc *u, uint8_t qid)\n \n     sq = u->sq[qid];\n \n-    qemu_bh_delete(sq->bh);\n-    g_free(sq->req);\n-    g_free(sq);\n+    if (ufs_mcq_sq_has_outstanding_req(sq)) {\n+        trace_ufs_err_mcq_delete_sq_busy(qid);\n+        return false;\n+    }\n+\n+    ufs_mcq_free_sq(sq);\n     u->sq[qid] = NULL;\n     return true;\n }\n@@ -617,6 +645,12 @@ static bool ufs_mcq_create_cq(UfsHc *u, uint8_t qid, uint32_t attr)\n     return true;\n }\n \n+static void ufs_mcq_free_cq(UfsCq *cq)\n+{\n+    qemu_bh_delete(cq->bh);\n+    g_free(cq);\n+}\n+\n static bool ufs_mcq_delete_cq(UfsHc *u, uint8_t qid)\n {\n     UfsCq *cq;\n@@ -640,8 +674,7 @@ static bool ufs_mcq_delete_cq(UfsHc *u, uint8_t qid)\n \n     cq = u->cq[qid];\n \n-    qemu_bh_delete(cq->bh);\n-    g_free(cq);\n+    ufs_mcq_free_cq(cq);\n     u->cq[qid] = NULL;\n     return true;\n }\n@@ -1884,12 +1917,14 @@ static void ufs_exit(PCIDevice *pci_dev)\n \n     for (int i = 0; i < ARRAY_SIZE(u->sq); i++) {\n         if (u->sq[i]) {\n-            ufs_mcq_delete_sq(u, i);\n+            ufs_mcq_free_sq(u->sq[i]);\n+            u->sq[i] = NULL;\n         }\n     }\n     for (int i = 0; i < ARRAY_SIZE(u->cq); i++) {\n         if (u->cq[i]) {\n-            ufs_mcq_delete_cq(u, i);\n+            ufs_mcq_free_cq(u->cq[i]);\n+            u->cq[i] = NULL;\n         }\n     }\n }\n",
    "prefixes": [
        "4/4"
    ]
}