{"id":2174153,"url":"http://patchwork.ozlabs.org/api/patches/2174153/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20251215075642.2245-1-wafer@jaguarmicro.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","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":"<20251215075642.2245-1-wafer@jaguarmicro.com>","list_archive_url":null,"date":"2025-12-15T07:56:42","name":"[v2,1/4] vhost: add data structure of virtio indirect descriptors in SVQ","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"19a69fa04b49406e67715723dbbed65d6a4795e2","submitter":{"id":87629,"url":"http://patchwork.ozlabs.org/api/people/87629/?format=json","name":"Wafer","email":"wafer@jaguarmicro.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20251215075642.2245-1-wafer@jaguarmicro.com/mbox/","series":[{"id":485358,"url":"http://patchwork.ozlabs.org/api/series/485358/?format=json","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/2174153/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2174153/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=T08w3hFk;\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 4dVC942hmdz1xyL\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 15 Dec 2025 18:58:00 +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 1vV3SZ-0006yx-R8; Mon, 15 Dec 2025 02:57:35 -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 1vV3SX-0006yk-Gt\n for qemu-devel@nongnu.org; Mon, 15 Dec 2025 02:57:33 -0500","from mail-japanwestazlp170120003.outbound.protection.outlook.com\n ([2a01:111:f403:c406::3] helo=OS8PR02CU002.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 1vV3SV-0003fY-CU\n for qemu-devel@nongnu.org; Mon, 15 Dec 2025 02:57:33 -0500","from PUZPR06MB4713.apcprd06.prod.outlook.com (2603:1096:301:b4::10)\n by SE1PPF215029121.apcprd06.prod.outlook.com (2603:1096:108:1::40e)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.7; Mon, 15 Dec\n 2025 07:56:53 +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:56:53 +0000"],"ARC-Seal":"i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=JMmLO0wms889z8/dZ337oh04V6KOpvDKPN7CZv9GT6r+/w2wT23DrnfA6fO6+ZUA9L23goCE1rPWLTltAu+jpFx/6lSFRw44RswOIWVDn9VDIlracE2C9YLVU0/5fnWYSlG9xz8APvA8CuWl5cfOvh3NLjhJ5PNmFj0HBz9p5vtuoa7XxI5ReZ0NT+y/ia2ea5JUBS4nkZ1p2fv50LzLV59WO/rLUGiYLXuMFV12gd9eeFwADbCgOJf/V8FyttNbbyMqCV88mQeOW2/9tLh2VQtY/q+BB/dWGolonBLqyTl++uE38t+7LmiAN1n+c8BDCM4rrEPsbQX7u1bOkDnIyw==","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=bDBhK0ltn8U8oW54Y4E27+KDFWOMPNTHaisoipiJqNI=;\n b=bgjCy+UAPXPeZU5MHxbzhMYT/2uGm1OLgnuEaLkKEAtyFtjA5gG6rtdZJkjROz+fy75hIR18SuzsFfUZ0ZcSJeCgVc+dx/iV23emSQrINOgTeXjXabAxePU+89HBM9e5iOlkf5Djc09Lhprw7tHXd1nTS5SyR06EUJ2c2xetq3F6SZ/KYBeQn+qS7Q4lCt1Sslat3V9CjHy3ellsjqHeFRc516LKhQWQRAi4avdwxy3/G6aC57SYClgT4HPtf3bSwbOQjW6O8pHo6Dvs+6n22qGs3KVKVmAwP0+aI1KhLFhUstN1V4q4Jell9s1sigOjim2e0SCCRytCDJ5fgTYAsQ==","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=bDBhK0ltn8U8oW54Y4E27+KDFWOMPNTHaisoipiJqNI=;\n b=T08w3hFkxDQntc7+9c9Q4s2uT4MWBFXD5p0ev2qsliRQjzvKsQBq2gic2ETyAzOIdutmP0alz57pGzgVsGUnl3tX7y8MQ+2BhwpU0wQbVrQl7qxk40kZbOUk6y1T+JtSk+s/giiasC/dOPZL2lCfdtRCBB+q2Szn8rWoi531MIMcq9ZicVdOygbXetjIBqBIqAwBOlZ8OV9SuzIgn7ohHySigRKwdeTQ23s4nXbqvcj2Jmv2AgQX1zDFqmjPKVkGKpCjyQMBI51FcvdcTMGgibSCiBaVRyu/Uj3MoYyJ/TLwz0V0U8gjcIUIph+zW4J1wYR7kf5FvdZpTg1ogtJMOw==","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 1/4] vhost: add data structure of virtio indirect\n descriptors in SVQ","Date":"Mon, 15 Dec 2025 15:56:42 +0800","Message-Id":"<20251215075642.2245-1-wafer@jaguarmicro.com>","X-Mailer":"git-send-email 2.34.1","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain","X-ClientProxiedBy":"KUZPR02CA0021.apcprd02.prod.outlook.com\n (2603:1096:d10:31::17) 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_|SE1PPF215029121:EE_","X-MS-Office365-Filtering-Correlation-Id":"cd3781fb-4698-4a8e-19e9-08de3baf82c8","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"BCL:0;\n ARA:13230040|366016|376014|52116014|1800799024|38350700014;","X-Microsoft-Antispam-Message-Info":"\n y4jpp0EpH5kFi0KKCc8q08SDidTu1S1B+I9tzMnT7z+0b0Mx9Q4YN5gXbRdFQwO03a2mGbKF4F3a1UKq+W9JaY6nX0+GfiRNvEEvJYDSmA7DeqysYVWqg7uHeIigUykEGhN+Xz3aOIiwfUU2gvnQZO8Q3+dLSVn7ISJ6bFCA0mPw89MUeXljIE9+aRCBKwNfetqqlGxLOUi3FM5falyaWo+5zpTgQtcs+oX7l9rQubZ318zXbMEqK667gmPok5wI2D90dc1C2fUM4CeyoGfuOmmZj1Uj18XavlsIAMegWm2hhJ5hAnwT/wyJpQlxHE4Qi1etVtMbZQjVRpBl/EMXjDm1rmKiejcx4efpxoMC376GT9Ne9d5uAefK4u7rJg3kzJIU8n/fRbQy28IJzuMhen3wBiajU3am8mjL3HC8FSS7V0j208kMK7Yrgdpl/Gt+XZdrrxRnx8qrNXRR8kFQsRjqhGBxlpg9h9Xeh21y5kXLt/KqLvzhpq7+sjGw441SVCMRzFBmNoT/yRHAeiOIDolXbX41oZm/OoIjNgFMptk+vPIq3JFPIcNVAQtcIm2ErBvSmjwf3STypMwFDuHJgiwWUPFv6mkFH5KABvS5FSUjSRZAvitx3nJDHSyBAsm7P23+6QKxxBL9s5g7E/J89y+3Eo5XWBvVUoJ/U5ELC392RZZkfWNnPGTEZGuYUZ+R7ZJtaDl4DgEk3F1LhSlnQffbAb46nfiNW0UnjJkgiiFVY02VtObHuy+G99fqrR/Q4c1VyvLqtRDCoCTy5Cihsvs8AYYD2SkDK7Yf+fmG8qJh59fVcgc0xbchX9We9T3+wrNLtuKxjlBGffdkNTzzGNaJ6F7qkL/De0DV608NV266vBnh8IOy6eHpj1SXYdrHN+pxAVWeVH7bnKturZCL2l9BXZTs002cJNrmbuoxui4R5G2Hv2PS7fRoLNapZJOe3dLuohkmliw2ZVNZU2TYrPNXFUZjAl2CT2bHsx2F1OZa6niH/Yf7zVbJ1MznswxXMmK8L4FJsr0gvIwcstBtnZHx//YjGlN1xFZObnOaDApLwtgiXrOaNqyYUmGEAPb0hXm0G0/uo9HBufPPdRCIuMb1nxfh4JySQtr9Z6Yo/KAYQbDkUjuVqhvvJy15TGtyLC5nxG/FRnLRBtTfzDp9fQu59Kgq96sRaZWNI0+FNt/FhSPhiqi3sHRi5vqfcVn719AK8y2R6ijNQ7Ei7K4tBvF2VD+0KhXocwTW5SBXbSklT+pqrmyXZWgXYB7h595MyScR3rwTfBnbGy51eW0Zjfpz2KzPTS07y8cnfOaG74hECWSRrrYH2pyUB0lxUPatZFoAv15Lw1UaV+ukJ3n7OEwTE+z/UgXghYTXkHAGqYg5qI7M13/pIa2c0B268IRzSDvPkl0E3agezT/tZI1/W/z6Twcl1zWqKodpDKyscQkOfFDSXoaOQk3LMdYjlWwOV+kHBm+8CyDUUqjXURkT7wbmLsLGz3ED7Sp5tTT7Dgj1S/qndeGnwJhlm20hMQG4","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)(376014)(52116014)(1800799024)(38350700014); DIR:OUT;\n SFP:1102;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"\n dMLTunfXo+Y5v1l6AiQ7PRggrPfdCS6zxTIZ1Opw8C0bDyNi0ZN9e8nSUdVhvq6mP8/HCy/ou4HN5jYYUjjXnApu8Sy48DciuFqDdVooRHib3LE7C0sUDKnKCjcRf3MFD3pLH4L8AP6XcBsYkrAcTb+r3OTqcEyCfo78o5ZJStDlitwWrXvDuO5yiVKqGZzfuCMnsbxGTUF/jnxpqwjBqg+JZJtyMw1KfWhi4UEh2Q0OiIn6RoI+6vxui0pLOmNQ4JjvS21xrp94Y7bNZrCzopqB5lOZooS2AEtwHaZYazojlfJYM5T3Ct/7W88HSBcxDzA5OFEYNvUeih66sbLOvMMAshrPmEtq2O+0lZgMuwMus1R+dC0Ulhp/7/AdvNrINzXJhLhzXKhp2+VgT3y3xcw1jPDX+T13OHWVmGcG/XpzIkWs3+QlihIH1feDoy0oE19aVXLHzgYRYZcX9gJn4OdMmcW9kqff1h0u0SodU1ho3hj14uTTmeZPy8m8wv7f8m23sNti60UCb6XVZvwmRIwhZcpA528BL7LTjJIn2ZDoJcdaOqTfcuPXVr0LwlCDy9ys2ialZrHEzXsa2tvBoAumwBD3hLAK2li2NfBCKU1aTesbjlrE1Mmm6rb5vLXDBPHOpaXLTKvrZas93xBK8PfURBq42p9JC4YHnSslHLFM9bP5uVtPXvxv/mRWcyUyvuZFFdXc4OLlPXvvawehl8TrH1p+Ric7abA0J3p4v35FtZQTgn42tOHn7gnox8SEa02UPTvcbQorYqn/ccaGRvYD4QYVnq1tpYHcazf3EARhMGU1SxsSRsIgwNFn2wi6SwdrQ6CoHSmHKzRRr3R7xVB73/TFhigfUtIVcKSWVWH+Ej6mBHRsM1mum4evUZvy73u53VCquYN7WumMN2ulZrwzF/iCL+parDX1j3AJ0jwqV8PXoJFOQ7zoQxkjWaYN43sjdLbK8i2AY4xVKOOyq/hVhTGGu6UhxY4jts59TR4qCdbwbuVpMjIdR8KhyxDETdhS6rKlnC1yjqmREp1SYxDZDrlxJQ/rclTOXbYaJs8SOd3OW1eelm2j1usgc9MklYwW2RDmSHQN4a1zQsVnZludGMReA6aE2gMOY8wII43lBbhsU9SMKlrzDoKJ79WfbfZR3ihRWWRTC+yUCfW+13hpunBpmWT9PDLhID4VIA3tyroZ5abB7Kk2DdLonoR8Aiune/M6D1Z5X08amGoZ2fCw2Sxm7NMuANfn70xl3U4pS8ksEgC3GqFCuhpbgEZAjVdshZUSNXKzKNJNGw+WdWgerTQIaEk9vRSHqvt4y7ZDG5vS38ujgeRjr9aVarUYes5aC4hKa/Crf17ahPkTRsOQkPHeIxS9axgrQdKovsSI+pn0kkfNtN79GchRzzZ51zMpRH++jMSjCze1DUzlW9uHPDEjT1/+M8W1mBSYsyKQ4aUHggbaAJXtyz7ZsYOxyOB6A8BotuMef+mOba9IqF1jSmE5hlRFjupit9REzwW9jIp7TEOAX3zrbxZjLW3rywNSNauUKC6RB0yr2HI3wSOhtgEc0CZ0YkgniGOnZ5pqMb/Ajdw8YA5WfeP96FE4","X-OriginatorOrg":"jaguarmicro.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n cd3781fb-4698-4a8e-19e9-08de3baf82c8","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:56:53.4742 (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 qx3S+2Mwxqkdi8cV3Oz14BovjKPDWbzy5dF6qk0PSvX9HoJhZepkoRHOdWjxglXsfj4G/9K/5sQb5TyODRhSwA==","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"SE1PPF215029121","Received-SPF":"pass client-ip=2a01:111:f403:c406::3;\n envelope-from=wafer@jaguarmicro.com;\n helo=OS8PR02CU002.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, SPF_HELO_NONE=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\nUsing multiple statically allocated buffers to store virtio indirect descriptors\n\nSigned-off-by: wafer Xie <wafer@jaguarmicro.com>\n---\n hw/virtio/vhost-shadow-virtqueue.h | 45 ++++++++++++++++++++++++++++++\n 1 file changed, 45 insertions(+)","diff":"diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-virtqueue.h\nindex 9c273739d6..ee8f0660b6 100644\n--- a/hw/virtio/vhost-shadow-virtqueue.h\n+++ b/hw/virtio/vhost-shadow-virtqueue.h\n@@ -23,6 +23,12 @@ typedef struct SVQDescState {\n      * guest's\n      */\n     unsigned int ndescs;\n+\n+    /*\n+     * Index into the indirect descriptor buffer (0 or 1) if using indirect.\n+     * -1 if not using indirect descriptors.\n+     */\n+    int indirect_buf_idx;\n } SVQDescState;\n \n typedef struct VhostShadowVirtqueue VhostShadowVirtqueue;\n@@ -46,6 +52,32 @@ typedef struct VhostShadowVirtqueueOps {\n     VirtQueueAvailCallback avail_handler;\n } VhostShadowVirtqueueOps;\n \n+/**\n+ * State of an indirect descriptor buffer\n+ */\n+typedef enum SVQIndirectBufState {\n+    SVQ_INDIRECT_BUF_FREED,    /* Buffer is free and can be used */\n+    SVQ_INDIRECT_BUF_FREEING,  /* Buffer is being freed (descriptors recycling) */\n+} SVQIndirectBufState;\n+\n+/**\n+ * Pre-allocated indirect descriptor buffer\n+ * Each SVQ has two of these buffers for double-buffering\n+ */\n+typedef struct SVQIndirectDescBuf {\n+    vring_desc_t *desc;         /* Descriptor table size = num_descs) */\n+    hwaddr iova;                /* IOVA of the descriptor table */\n+    size_t size;                /* Size of the mmap'd region */\n+    SVQIndirectBufState state;  /* Current state of this buffer */\n+    uint16_t num_descs;         /* Total number of descriptors (N * vring.num) */\n+    uint16_t freed_descs;       /* Number of descriptors available for use */\n+    uint16_t freeing_descs;     /* Number of descriptors being freed from used ring */\n+    uint16_t freed_head;        /* Next free descriptor index in this buffer */\n+} SVQIndirectDescBuf;\n+\n+/* Number of indirect descriptor buffers per SVQ for double-buffering */\n+#define SVQ_NUM_INDIRECT_BUFS 2\n+\n /* Shadow virtqueue to relay notifications */\n typedef struct VhostShadowVirtqueue {\n     /* Shadow vring */\n@@ -96,6 +128,19 @@ typedef struct VhostShadowVirtqueue {\n     /* Caller callbacks opaque */\n     void *ops_opaque;\n \n+    /*\n+     * Pre-allocated indirect descriptor buffers for double-buffering.\n+     * These are allocated when SVQ starts if VIRTIO_RING_F_INDIRECT_DESC\n+     * is negotiated.\n+     */\n+    SVQIndirectDescBuf indirect_bufs[SVQ_NUM_INDIRECT_BUFS];\n+\n+    /* Index of the current active indirect buffer, -1 if not using */\n+    int current_indirect_buf;\n+\n+    /* Whether indirect descriptors are enabled */\n+    bool indirect_enabled;\n+\n     /* Next head to expose to the device */\n     uint16_t shadow_avail_idx;\n \n","prefixes":["v2","1/4"]}