get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2174152,
    "url": "http://patchwork.ozlabs.org/api/patches/2174152/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20251215075713.2306-1-wafer@jaguarmicro.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/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": "<20251215075713.2306-1-wafer@jaguarmicro.com>",
    "list_archive_url": null,
    "date": "2025-12-15T07:57:13",
    "name": "[v2,2/4] vdpa: implement a statically allocated buffer for SVQ",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "c255eb494e3e9593cf7a4261de498704da627d41",
    "submitter": {
        "id": 87629,
        "url": "http://patchwork.ozlabs.org/api/people/87629/?format=api",
        "name": "Wafer",
        "email": "wafer@jaguarmicro.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20251215075713.2306-1-wafer@jaguarmicro.com/mbox/",
    "series": [
        {
            "id": 485358,
            "url": "http://patchwork.ozlabs.org/api/series/485358/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=485358",
            "date": "2025-12-15T07:57:13",
            "name": "[v2,1/4] vhost: add data structure of virtio indirect descriptors in SVQ",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/485358/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2174152/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2174152/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=jaguarmicro.com header.i=@jaguarmicro.com\n header.a=rsa-sha256 header.s=selector2 header.b=hWUmX7KX;\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=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)",
            "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=jaguarmicro.com;"
        ],
        "Received": [
            "from lists.gnu.org (lists.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 4dVC921sKsz1xyL\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 15 Dec 2025 18:57:58 +1100 (AEDT)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1vV3Sb-0006zN-Ph; Mon, 15 Dec 2025 02:57:37 -0500",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <wafer@jaguarmicro.com>)\n id 1vV3Sa-0006zF-FJ\n for qemu-devel@nongnu.org; Mon, 15 Dec 2025 02:57:36 -0500",
            "from mail-japaneastazlp170120005.outbound.protection.outlook.com\n ([2a01:111:f403:c405::5] helo=TYPPR03CU001.outbound.protection.outlook.com)\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <wafer@jaguarmicro.com>)\n id 1vV3SX-0003jH-QT\n for qemu-devel@nongnu.org; Mon, 15 Dec 2025 02:57:36 -0500",
            "from PUZPR06MB4713.apcprd06.prod.outlook.com (2603:1096:301:b4::10)\n by SEYPR06MB6081.apcprd06.prod.outlook.com (2603:1096:101:d6::7) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.13; Mon, 15 Dec\n 2025 07:57:28 +0000",
            "from PUZPR06MB4713.apcprd06.prod.outlook.com\n ([fe80::1b36:28b0:4e5:de66]) by PUZPR06MB4713.apcprd06.prod.outlook.com\n ([fe80::1b36:28b0:4e5:de66%6]) with mapi id 15.20.9412.011; Mon, 15 Dec 2025\n 07:57:27 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=LFi2jguYiQifX7xe3F1j1rgn+f5aW8yXwMAdpRLQnXfJ4y8ZFEqmv1aia82cG+ZGGp/8bZf8swYl7XSQrwEZkXd2gCEgAIjx66X24NYh1mi6q6B0Dk8BO8QEWmDx7IU3038pBS1gA9M2LUc9iDbi99BONKzvty/r5g9jJGbPGh96hQW32/F9VXUbHT/ncHN5tm2Y0ghGUyAXgYM3QsSm6WmCvZT00kHFD9qcRRp2wBK+9T1I+ywI5RIV5uf3DMkEsJfC1Iclzj9PPuXIrzpvwjwwvgkTY5jDwwapeJU15KnLCjoFRP06VS+EPM/4BLO/JgW+vpyf5Gs9zm5+WbVFMA==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=4TH9K4oMnrsU4tCvsW0w1nRq+IT1Z1oO4Ed7GZp5oYw=;\n b=sFqom5wsz97PEQXyA5ir6nzJTO3uYQ3W3cOWwfBWkxoY9GTjuUidVUD19p9siI3AJN8/ECIpxj3wrXqYl08XrZgIdRZ+a318CtyY5PE+AMtlzxvyS5Ym0yY9U1BCITgnRdm6gw1PR0Lue2sXTrIj6QFVQnC1d7bd17edZGZkkeBlVrwPYJbIVG3YggcTxEHGBmT1Nl6CpT2ZOC2LaxOddLm14um4/JFktuowC+u0uX9xdQqbR5lVFprsN53XWIUMPQ5zso0i3CnKFEDpea3Ls2eqicig5stzGVrweVlpVJ62L8oV5TtWeqlR5x30/rA1miIyl/M9reLIanWz5z/xEA==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=jaguarmicro.com; dmarc=pass action=none\n header.from=jaguarmicro.com; dkim=pass header.d=jaguarmicro.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=jaguarmicro.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=4TH9K4oMnrsU4tCvsW0w1nRq+IT1Z1oO4Ed7GZp5oYw=;\n b=hWUmX7KXWp4D3Dj1GUMZ6pnLL7OzP3U4q14vImZkKDZ9pWn6hJ4hzW2b0nCAl/n5/FMAVWzYazgJheaKf/cIwlRFx0BdlScsLY7DOZmEFLVex53099Vy3mzPCvIZ4ISN5vTcAK9RprPfqPEGSMOcuqZ+ZDrwo603cgN6jJeePdPNPT8xBM++JckOc7ipakviZ8GMwDGm8ChSirQKLmIus6Ai9ojeEs6A5RgNqlG1aME3gDGLt13nLLmSNEN/3VfUPKfz8nPPKWa3BlxMMhnwx51hOM8CBDUttsw1VB7UnUppYg71tGM46b/OygWiK24ASF9UqwMzdDg3tKXe6W9xxw==",
        "From": "Wafer Xie <wafer@jaguarmicro.com>",
        "To": "mst@redhat.com, eperezma@redhat.com, jasowang@redhat.com,\n qemu-devel@nongnu.org",
        "Cc": "leiyang@redhat.com, sgarzare@redhat.com, angus.chen@jaguarmicro.com,\n wafer@jaguarmicro.com",
        "Subject": "[PATCH v2 2/4] vdpa: implement a statically allocated buffer for SVQ",
        "Date": "Mon, 15 Dec 2025 15:57:13 +0800",
        "Message-Id": "<20251215075713.2306-1-wafer@jaguarmicro.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "TP0P295CA0012.TWNP295.PROD.OUTLOOK.COM\n (2603:1096:910:2::16) To PUZPR06MB4713.apcprd06.prod.outlook.com\n (2603:1096:301:b4::10)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "PUZPR06MB4713:EE_|SEYPR06MB6081:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "301de4e0-d6a5-45be-b9e0-08de3baf9748",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230040|366016|1800799024|52116014|376014|38350700014;",
        "X-Microsoft-Antispam-Message-Info": "\n N+yJ8I6+KzbcXw6oO41gPSBk3ldxFtNYcqU/+JgLAmJLG2nZojU/RLTnK/u4SUBKm1aFKUJLc3yJOsn4SDiSm3OEs/3gnud5DwfQ47klIWbr1JXYc9QCJDNwzMkCHZfjp9SLPusMZTbeahm/tN6NZeM4jwIc45A1V9BqF1IjyhuZbPerBea/iKJuBR8K3oLE0c09ZqPaYL+Zrz5MEQ6xpKsLCJvzkghlgBkPSLbPLFk7/bKRQAf7g0QLbHJT4WT59zgImDIWKOxUoMcl40p6Ah0Vewp4xflKMYosFDyB5t5hZPopTuaK1EfNryxM3PBRY0rta5ncHB37AslEoZwbT42iOVo1dso3T24bPC0VZOHrMba78B1oNVG3ah0e1S9zGzeq33k0s8Nh5/Z90kYPVm7nXAPryIeKkzJ7QVGzdZqHEfxr1qwCCYlxI5yURsd2dylEjiJ7hYB14JVaUoRGqc1Fdo/VPN4GEFxFv0Jep3nxbQNLSFVnlc9cF09nass0ao8bSsOJsTlNIvBXUsuosmuZ/pTxcDquFqb6mT1teUnHJUHPfbXAHEWSsKbNg7YwE9oRgG8QycmZ4/HJ9geExCKvJ4BPjIQxM5tbga/dFcQWZBhu77vpT0diwyLvHujVKn13mUoSBY0L+Cx76Hq8099U+wepiaiMfFUttfXIIhxBDDF6VT8YLDpbFg7dTY2rIDdO4OO4Hixt9ZTerrTaF4KdgaEuqzw7wFfdLgY3Fk2jsg7MNGooud33gJGYcilawa9Qj2tQTHdC8OPYMQ6xGUKkWnVpiixKZ+f7qG6SEOyzctdBkAWiw3uJ924iCpdG5R5QxhlY07kPh2lQRbCox3Fo1zcqNf2Drqpcuo6PgQ46c7dxq+ffJrxM4omQN3zenunz/x5hKaai5dtYr29rZmGUBLJqN0Enah2MNJHqP3oKEdaLIkVFxaGn0qQzDF51jfU30FndRZEQq0z8Vl+OF5tC++xmeFYSgbi5VJCY9iCVqiWxw4KizlV7FjWwCSNOycwTJkyuBE5OTKQ3XK0pyBibKFT8HfPnvMTAZvX3q9SUZa06IuMY6tWDW+yzdreoQiK3smRThtx66NVwL+3X6cTQV6ZWl0NtDZLMMXx17R7BNLB6E6Uko0RBRZPRlWxKAXqdoiHPW/aFhLfiq7X43Q3pl79neykjDzGEGI6QsE7c47XqQ7Jh0IXSWpMyqKDC8UrpXAL+yRM9ttrYyYSZvM20s7lBCVISKbVpFMKj8tjQqYBRAIdEvBSZaggXbVPyOdnyaWJZltG2tB4nSqonYISxgjYposW/MfrajHYqEHjiZkqN9cZfc7WS0oBkv3gx8rY3xneTSi/0Fr+tuKrPfFC+7BOLI2jONesB5YOy0nTi7Wne1uI+AiqnsC8acORIOqnTQvReErQmyY/2viMfDO+xmvp+Wnz5Ysp6uwLJhTOeO7sW5rggoll9KN5IwZEU+vutt4lH0GJ/3v/3sw/A36juF/q5m2ukwfgK3WRqIpvvE4mwYgMOJk1xVEbUqVPn",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:PUZPR06MB4713.apcprd06.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230040)(366016)(1800799024)(52116014)(376014)(38350700014); DIR:OUT;\n SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n 8wwSfDBi4jleY0NTV1oAwbJhx0YtR+Bwg+kd9WtBaP46dWtz+MiUs5mc/sMYAdfe4yVncqMGhR6gIfSvimhzrelhnbJU6h+6fOpamWGDSMf5x6+qnxlTMCComyyZmi3aFxNbEHobU7awixcBsKqTwftlsfbYblou2qBPY3GhREF/iQw/GscZB7iiw4wDoMhGhLwyZ4M7He81mMZZhL4AvJZA7IX+vYDRRDfH0XhMxwf9UWfftakCkqg6zqkNR4WfQWmrQyZMNBK1/8G1PQGgwcC7+GEsdk9cy2PRd+Pvd+KlE49fucSDxDxSWAFAd8aQtB8L5TjrC6Ar72xL/4IPS4ZTKt5ujeZnswA33YCZ+M4w0Umy7/429xdqrf14OPsbcHbfOa15Y3TEgdrUVGvndpyotjoBUVdkWBAld9exUkXGjbhOhwPhd54bTCa/rYHLqMMLSwcPUXd67mJGt1GNJuI8yyQgzFdjgxSTzRWrAHJBmCX4QT755/8c/GFOeyN/1BoGUfxM/MGFZ9tFUWNDko8O8eLN3GGr97zU3IS8cjbepEhC92FtaCLIRbaya4EijnRmQy/xvyKB+6k9TgfgilDoz3SCIqrzywPoAQ1pcz37zOkyNEZd5rpJ1SQpHdvWZSGUBXiEgxP3VY2Sq2CWpIta8NhE9EtrDNf+vSI5/AyGl2Ot+X8PlFr8k7wyH65O3NlMyCxRz1DqGcgQVEGxZjHx74ULWF/gRt0cYw5kDEhsDl+bDAdJiDNwWAnsY3yk6LIpB9B2l8X37SzYU6jkxDg3Jt8+k6iuKqsleNCWcwggScGqhTUcOe78bsZBFvl6fwXeq0LB2P/Ekn217wJD7mCeKRzGS4LyFHnyn8sNXeQcCS+JYpkhPhYLdECTX3Uhphm1CWW31rusAX/8sH0Jv+ZTQgVJtOuaeIqitbbd7nKGqs2xTgUxt6k7HfVNYLK1WDvxVMRkfcbwNnDLtvW9CnbYu2bdgoGLu9UOnbBFKJ3p1D8uqoT4rVGUH+YIYJHKDw/uwfKc98RQqsKPJZVO/bD1GGfwz9nUZgj3nHTTnoEsPCAiJ+H07CmmAx+lUsyYwXL6IpqP7IC+U8p+zz/AJi8lk4Weir/pCsIpNV1AqBRvHP5wvTD2VSn4wlAGifrkVn3b24H+cvE4jnURCQjtr2pkgpkmixjEgZ5miwAzKKUWF0c+/gDj8j0LXFxoVJfvsk/kfAfYVMmd3V/rti1aZ0cmMNLl9nXvbXQcqfxk5Ei3TU9E38EuLAqx18O1X/aw9cctk0kir0D6sR9bKiG3jXU0NXgAbT4EhyJXMwFu2zmx93DWla87R83cQuuLed1wmEv89qrgEANYB7lFdl/0PLDHe9txdCsWVncFut6ln6wQTw0fIp5Hc5DuhsP15+eHl8xW0PH2uzcHgI0LSwVcfz9TqHHZU32RnhKa4+kmzoh5CabBdvZrMirT531RY95fL2ZNVG0faLc9KFEPF2fV6c7/xeMzI3Xx9bjoBtI4V83gJ5X6WSLomb3cLoU7u+9jFIrElDvYqjpkLN8e6pe5ZRoKy2G2IJF7EWChT3QDkeF9Aark7RJNBw17FiYv53UM",
        "X-OriginatorOrg": "jaguarmicro.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 301de4e0-d6a5-45be-b9e0-08de3baf9748",
        "X-MS-Exchange-CrossTenant-AuthSource": "PUZPR06MB4713.apcprd06.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "15 Dec 2025 07:57:27.9060 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "1e45a5c2-d3e1-46b3-a0e6-c5ebf6d8ba7b",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n YM57bh5n4mJW+xRpSib7fNhClXIkFnwgPMAjpDI9UIZnF4hzPSTK0Opn2FrsbgiYftqoqGJflfhJjyOPXMnH8Q==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SEYPR06MB6081",
        "Received-SPF": "pass client-ip=2a01:111:f403:c405::5;\n envelope-from=wafer@jaguarmicro.com;\n helo=TYPPR03CU001.outbound.protection.outlook.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,\n SPF_HELO_PASS=-0.001,\n 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-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": "From: wafer Xie <wafer@jaguarmicro.com>\n\nallocated and initialized when creating the vhost-vdpa device,\nand release the indirect buffer when vhost-vdpa is stopped.\n\nSigned-off-by: wafer Xie <wafer@jaguarmicro.com>\n---\n hw/virtio/vhost-shadow-virtqueue.c |  25 +++++\n hw/virtio/vhost-vdpa.c             | 163 ++++++++++++++++++++++++++++-\n 2 files changed, 187 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c\nindex 2481d49345..85eff1d841 100644\n--- a/hw/virtio/vhost-shadow-virtqueue.c\n+++ b/hw/virtio/vhost-shadow-virtqueue.c\n@@ -708,6 +708,25 @@ void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev,\n     for (unsigned i = 0; i < svq->vring.num - 1; i++) {\n         svq->desc_next[i] = i + 1;\n     }\n+\n+    /* Initialize indirect descriptor state */\n+    svq->indirect_enabled = false;\n+    svq->current_indirect_buf = -1;\n+    for (int i = 0; i < SVQ_NUM_INDIRECT_BUFS; i++) {\n+        svq->indirect_bufs[i].desc = NULL;\n+        svq->indirect_bufs[i].iova = 0;\n+        svq->indirect_bufs[i].size = 0;\n+        svq->indirect_bufs[i].state = SVQ_INDIRECT_BUF_FREED;\n+        svq->indirect_bufs[i].num_descs = 0;\n+        svq->indirect_bufs[i].freed_descs = 0;\n+        svq->indirect_bufs[i].freeing_descs = 0;\n+        svq->indirect_bufs[i].freed_head = 0;\n+    }\n+\n+    /* Initialize desc_state indirect_buf_idx to -1 */\n+    for (unsigned i = 0; i < svq->vring.num; i++) {\n+        svq->desc_state[i].indirect_buf_idx = -1;\n+    }\n }\n \n /**\n@@ -748,6 +767,10 @@ void vhost_svq_stop(VhostShadowVirtqueue *svq)\n     munmap(svq->vring.desc, vhost_svq_driver_area_size(svq));\n     munmap(svq->vring.used, vhost_svq_device_area_size(svq));\n     event_notifier_set_handler(&svq->hdev_call, NULL);\n+\n+    /* Reset indirect descriptor state (memory is freed by vhost-vdpa) */\n+    svq->indirect_enabled = false;\n+    svq->current_indirect_buf = -1;\n }\n \n /**\n@@ -765,6 +788,8 @@ VhostShadowVirtqueue *vhost_svq_new(const VhostShadowVirtqueueOps *ops,\n     event_notifier_init_fd(&svq->svq_kick, VHOST_FILE_UNBIND);\n     svq->ops = ops;\n     svq->ops_opaque = ops_opaque;\n+    svq->indirect_enabled = false;\n+    svq->current_indirect_buf = -1;\n     return svq;\n }\n \ndiff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c\nindex 7061b6e1a3..816868d153 100644\n--- a/hw/virtio/vhost-vdpa.c\n+++ b/hw/virtio/vhost-vdpa.c\n@@ -584,6 +584,155 @@ static int vhost_vdpa_get_dev_features(struct vhost_dev *dev,\n     return ret;\n }\n \n+/**\n+ * Allocate a single indirect descriptor buffer for SVQ\n+ *\n+ * @v: vhost_vdpa instance\n+ * @num_descs: Number of descriptors (should be vring.num)\n+ * @buf: Output buffer structure to fill\n+ *\n+ * Returns true on success, false on failure.\n+ */\n+static bool vhost_vdpa_alloc_indirect_buf(struct vhost_vdpa *v,\n+                                           uint16_t num_descs,\n+                                           SVQIndirectDescBuf *buf)\n+{\n+    size_t desc_size = sizeof(vring_desc_t) * num_descs;\n+    size_t alloc_size = ROUND_UP(desc_size, qemu_real_host_page_size());\n+    DMAMap needle = {\n+        .size = alloc_size - 1,\n+        .perm = IOMMU_RO,\n+    };\n+    vring_desc_t *indirect_desc;\n+    int r;\n+\n+    /* Allocate memory for indirect descriptors */\n+    indirect_desc = mmap(NULL, alloc_size, PROT_READ | PROT_WRITE,\n+                         MAP_SHARED | MAP_ANONYMOUS, -1, 0);\n+    if (indirect_desc == MAP_FAILED) {\n+        error_report(\"Cannot allocate indirect descriptor buffer\");\n+        return false;\n+    }\n+\n+    /* Allocate IOVA for the indirect descriptor buffer */\n+    r = vhost_iova_tree_map_alloc(v->shared->iova_tree, &needle,\n+                                  (hwaddr)(uintptr_t)indirect_desc);\n+    if (unlikely(r != IOVA_OK)) {\n+        error_report(\"Cannot allocate iova for indirect descriptors (%d)\", r);\n+        munmap(indirect_desc, alloc_size);\n+        return false;\n+    }\n+\n+    /* Map to device */\n+    r = vhost_vdpa_dma_map(v->shared, v->address_space_id, needle.iova,\n+                           alloc_size, indirect_desc, true);\n+    if (unlikely(r != 0)) {\n+        error_report(\"Cannot map indirect descriptors to device: %s (%d)\",\n+                     g_strerror(-r), -r);\n+        vhost_iova_tree_remove(v->shared->iova_tree, needle);\n+        munmap(indirect_desc, alloc_size);\n+        return false;\n+    }\n+\n+    buf->desc = indirect_desc;\n+    buf->iova = needle.iova;\n+    buf->size = alloc_size;\n+    buf->state = SVQ_INDIRECT_BUF_FREED;\n+    buf->num_descs = num_descs;\n+    buf->freed_descs = num_descs;  /* All descriptors are free initially */\n+    buf->freeing_descs = 0;\n+    buf->freed_head = 0;\n+\n+    return true;\n+}\n+\n+/**\n+ * Free a single indirect descriptor buffer\n+ *\n+ * @v: vhost_vdpa instance\n+ * @buf: Buffer to free\n+ */\n+static void vhost_vdpa_free_indirect_buf(struct vhost_vdpa *v,\n+                                          SVQIndirectDescBuf *buf)\n+{\n+    DMAMap needle;\n+    const DMAMap *result;\n+    int r;\n+\n+    if (!buf->desc) {\n+        return;\n+    }\n+\n+    needle = (DMAMap) {\n+        .translated_addr = (uint64_t)(uintptr_t)buf->desc,\n+    };\n+    result = vhost_iova_tree_find_iova(v->shared->iova_tree, &needle);\n+\n+    if (result) {\n+        r = vhost_vdpa_dma_unmap(v->shared, v->address_space_id,\n+                                 result->iova, buf->size);\n+        if (unlikely(r != 0)) {\n+            error_report(\"Cannot unmap indirect descriptors: %s (%d)\",\n+                         g_strerror(-r), -r);\n+        }\n+\n+        vhost_iova_tree_remove(v->shared->iova_tree, *result);\n+    }\n+\n+    munmap(buf->desc, buf->size);\n+    buf->desc = NULL;\n+    buf->iova = 0;\n+    buf->size = 0;\n+}\n+\n+/**\n+ * Initialize indirect descriptor buffers for a single SVQ\n+ *\n+ * @v: vhost_vdpa instance\n+ * @svq: Shadow virtqueue to initialize\n+ *\n+ * Returns true on success, false on failure.\n+ */\n+static bool vhost_vdpa_svq_init_indirect(struct vhost_vdpa *v,\n+                                          VhostShadowVirtqueue *svq)\n+{\n+    if (!svq->vring.num) {\n+        return true;\n+    }\n+\n+    /* Allocate indirect descriptor buffers for this SVQ */\n+    for (int j = 0; j < SVQ_NUM_INDIRECT_BUFS; j++) {\n+        if (!vhost_vdpa_alloc_indirect_buf(v, svq->vring.num * 4,\n+                                           &svq->indirect_bufs[j])) {\n+            /* Cleanup already allocated buffers */\n+            for (int k = 0; k < j; k++) {\n+                vhost_vdpa_free_indirect_buf(v, &svq->indirect_bufs[k]);\n+            }\n+            return false;\n+        }\n+    }\n+\n+    svq->indirect_enabled = true;\n+    svq->current_indirect_buf = 0;\n+    return true;\n+}\n+\n+/**\n+ * Cleanup indirect descriptor buffers for a single SVQ\n+ *\n+ * @v: vhost_vdpa instance\n+ * @svq: Shadow virtqueue to cleanup\n+ */\n+static void vhost_vdpa_svq_cleanup_indirect(struct vhost_vdpa *v,\n+                                             VhostShadowVirtqueue *svq)\n+{\n+    for (int j = 0; j < SVQ_NUM_INDIRECT_BUFS; j++) {\n+        vhost_vdpa_free_indirect_buf(v, &svq->indirect_bufs[j]);\n+    }\n+    svq->indirect_enabled = false;\n+    svq->current_indirect_buf = -1;\n+}\n+\n static void vhost_vdpa_init_svq(struct vhost_dev *hdev, struct vhost_vdpa *v)\n {\n     g_autoptr(GPtrArray) shadow_vqs = NULL;\n@@ -791,8 +940,11 @@ static void vhost_vdpa_svq_cleanup(struct vhost_dev *dev)\n     size_t idx;\n \n     for (idx = 0; idx < v->shadow_vqs->len; ++idx) {\n-        vhost_svq_stop(g_ptr_array_index(v->shadow_vqs, idx));\n+        VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, idx);\n+        vhost_vdpa_svq_cleanup_indirect(v, svq);\n+        vhost_svq_stop(svq);\n     }\n+\n     g_ptr_array_free(v->shadow_vqs, true);\n }\n \n@@ -1299,6 +1451,13 @@ static bool vhost_vdpa_svqs_start(struct vhost_dev *dev)\n             error_setg_errno(&err, -r, \"Cannot set device address\");\n             goto err_set_addr;\n         }\n+\n+        /* Initialize indirect descriptor buffers for this SVQ */\n+        if (!vhost_vdpa_svq_init_indirect(v, svq)) {\n+            /* Non-fatal: will fallback to chain mode */\n+            warn_report(\"Cannot initialize indirect descriptor for SVQ %u\",\n+                virtio_get_queue_index(vq));\n+        }\n     }\n \n     return true;\n@@ -1313,6 +1472,7 @@ err:\n     error_reportf_err(err, \"Cannot setup SVQ %u: \", i);\n     for (unsigned j = 0; j < i; ++j) {\n         VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, j);\n+        vhost_vdpa_svq_cleanup_indirect(v, svq);\n         vhost_vdpa_svq_unmap_rings(dev, svq);\n         vhost_svq_stop(svq);\n     }\n@@ -1331,6 +1491,7 @@ static void vhost_vdpa_svqs_stop(struct vhost_dev *dev)\n     for (unsigned i = 0; i < v->shadow_vqs->len; ++i) {\n         VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, i);\n \n+        vhost_vdpa_svq_cleanup_indirect(v, svq);\n         vhost_svq_stop(svq);\n         vhost_vdpa_svq_unmap_rings(dev, svq);\n \n",
    "prefixes": [
        "v2",
        "2/4"
    ]
}