Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2174152/?format=api
{ "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" ] }