{"id":2174154,"url":"http://patchwork.ozlabs.org/api/patches/2174154/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20251215075747.2367-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":"<20251215075747.2367-1-wafer@jaguarmicro.com>","list_archive_url":null,"date":"2025-12-15T07:57:47","name":"[v2,3/4] vhost: SVQ get the indirect descriptors from used ring","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"4e61ab4dd1acdd59f3628fa20452f86262178f13","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/20251215075747.2367-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/2174154/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2174154/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=Hqj7C8nD;\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 4dVCBR1Yk2z1xyL\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 15 Dec 2025 18:59:11 +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 1vV3To-0007rC-4s; Mon, 15 Dec 2025 02:58:52 -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 1vV3Tk-0007qs-A6\n for qemu-devel@nongnu.org; Mon, 15 Dec 2025 02:58:48 -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 1vV3Ti-0004DR-Gg\n for qemu-devel@nongnu.org; Mon, 15 Dec 2025 02:58:48 -0500","from PUZPR06MB4713.apcprd06.prod.outlook.com (2603:1096:301:b4::10)\n by OSNPR06MB8228.apcprd06.prod.outlook.com (2603:1096:604:45e::6)\n with 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:58:39 +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:58:39 +0000"],"ARC-Seal":"i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=Af46oyGBJyAR+PHi9S7ya/LF1WIt+PJbBuXQThdwAqNoPtgfZ2Y90XIddmEkSsSFVgAE2xUlMtiMPWkYCsyeDx/SRvGxhMouGnLzRhrPkBGm0qqqdGdDfVF+xIdNaWC1ryzIM/zQMNScvLjD/3vNE2bmQG206GQLq1p5V4wNed+DQazXR51ZBxoCnb43vjPrEEqgYzzLo579zOBh1RLPuNQ0wKEXYMqCJs/m4sLy3hhVngZ0erugdamDdZG1Jfk4XFHPDcG1PyGQwgNE2T1u8NsM5jg+36BXKKGAcYudho68nR2Pr5B0wveHkLCDZ11jF8mqIFHRqhUnIsvbckqSyg==","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=ZqRtpSyWKiPcGehPjO7vHUtms4XA3YgPXOG0le3ZuqE=;\n b=kpjMba+nB8fcIAEsf1DsN46K6fGjbw36t4IPLP/+UVYr06myU0zx8cygBWEet+l0N+GfUVKDRUSvK51EdXn8M+xdj4ZbiZ5pUnQ1k6GIagfnvKOGq6av+Wx7QvbA+FSKJJCTy9cylWKn+9paMJZ9un26L+UWjlQFZINtgF/rlcmnktGQ/Baqa6/jvD1L91X8/eiexi3H1WMO4+WJWsm+xc1DYsDF7WFBzPkcqUzytvb2aDQxHSg3eiUbr8NRodSZaay0n1OMeME0KiwT/FUzC1ya8U+2JWjuJ3EpkkMzyfV/I7mp1V2YM4uvd9NZS70VCjxjtW9UUng+ab4qWgdR5Q==","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=ZqRtpSyWKiPcGehPjO7vHUtms4XA3YgPXOG0le3ZuqE=;\n b=Hqj7C8nDR7lqRUtXGSX2PJm3lDm6/708pRUBNEjlZwZ7vI+2Tsfho1BUZUcJIXUB7I8SgJX2KHcSBRXQWwlg5OwP5gsOdW/+DpTkzqIEqvr6yzHuqGUO+YwTK/VDgExnh1/9bKs6mHs3BD0oqHH03NjqpxK4pQIUom6mHdta6vwQsPfOKv1bua98Jdc47GTiRu+AF/uACd3E38vUZiZUzpvAwXWcl4JVhjQHuWjstcYJ7Fz0sJtkKAFZcliS4WUpyrVsXQnSqIKnmDI65tGXio4x3xE/mVNZNitDdF9OK0QnAm43xCVacgG5TtB3qGj8Qm3RK7nvihFvc8QdZnN1SA==","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 3/4] vhost: SVQ get the indirect descriptors from used ring","Date":"Mon, 15 Dec 2025 15:57:47 +0800","Message-Id":"<20251215075747.2367-1-wafer@jaguarmicro.com>","X-Mailer":"git-send-email 2.34.1","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain","X-ClientProxiedBy":"KU0P306CA0026.MYSP306.PROD.OUTLOOK.COM\n (2603:1096:d10:16::20) 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_|OSNPR06MB8228:EE_","X-MS-Office365-Filtering-Correlation-Id":"0552caf1-9d71-4444-70f3-08de3bafc1ea","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"BCL:0;\n ARA:13230040|1800799024|376014|52116014|366016|38350700014;","X-Microsoft-Antispam-Message-Info":"\n SiPhbl4x4VmB3Wtj+sfXl0x299lhUjNF5ump6NC4ih7XAT+qhSbOZ4xbDXqZ6cnYx4yV9yjUhquYUI6GPIpjAawS6TIli4rZNBHmKutv45wQqKK9qd4JzDKHSvN5oWIyzySqadmPlHnNMabsWbV/cRtoWMlqOwFILQ+jrmxYHZXa3mY9d92BpC9WtQ4bfXuTWd3lBs3SJfJ52S2YDIK5I+B1iSQMJ+xR0NxwxDEsOO83YmCi6OV3Mj7ReauorKclJrp+YKxeWvBCCQGobO25YECl0KXZyRsgokRQkC8H23/yVbtls04VBdVmd6fiAgkhi198jJtMgEHphqtMtysN9cBiEavM9qtLEdK2ZE7DiO/PUTcqvILGfTmJo1S8KB77hi7adthL8IovWh6xytcR+tFYz4T+d1mtob35I1NAGtpxrQkKxEEfuTlD6AORc/vA7tZXSkLM4CsVkVbgXM2AxpP7boQ/uRfSvtdgsvUVl5idu3JZHjfLK1PjmXkZ1Nouc35DOIq2qh1Fx7cRSVD3fJ/WjcQtPfq2zIPHYbj9LDf27ynYWhkqxC/4cYJyAniJjnwxaGlfjThJ77wRdU517/QM7POAEdu+clGrnRi20MQvpz+tiQgYgaepDRLcrSWt8REpuYN5bhdqpu4BJtzh395pgXyDNAf4hGMWzIvvnZRI3ClAQFI4nndJWNVIlFtOyKfVjBgvpa0jd662wB7DN5GxwojRvjaIT2k39tWhq4vUq5TI8p1CPnzeJIe13dbcp1HOJf4CjDrlw3Ca9kMYDBuKXaugAqaUj11xaW7sAgcDEtgzJ7j6xOXhKp9RnnY+Krn3eNIJD7zW5QVLcE4+BTLIB0hO2iI2j9jtVCxK+AKzvlFv3+HiLb8uZ6Vuf7uyL0IFdsvxT0EH56emR8StwbeyWyPdK8+DekHSPjZg15+m/fghOOL2pgQq7YhzBRg/Ch/o5wOf+z5njeBwxjS7aRcY8FcJVp7gBABOqubjIWL1OWbHF6MZk6QkTQdbqNNiip4xe4/q7wpK6hJgJy+O0eSgMZ9GzhO0pDRKhmpy6W6dQMprR+FZf+RMOAZoccyOp/vr7XMHeHhohJX/gTGJX/pmvO6bSIS7+yNsI48CDoepOHLyl/HiiWlL6Ini+flZ5EbCscRIj5Kjmex/8WfdPA7b1DPAldPpueyn5SRyrs0jvhqSgBgC72Yg4lhq5roD2RJx1dJlxC4Tf8LyltcnMvxy6zZqHTote+tEjdrLwdRdMUft/pC8iPaJekigH1SzljC9iwkoae7eLB8HPKq3eu9Je4alN++jBMU8rAOYZneGbIJOPFUn4KzLK2ULdr36dg3/fmz4KsHBMCJuyeO3VUlA2ynKt9Lf7lH4zeElfJMGsUKLjjphCeybgDEVi7NQlv6jr3QQmSaJF8s6pYq4Bf0H/K59aKFwiQUKwmKc21PWmPkWsd3UhppnMqGp5LGjxlW8hJfdKM5vDHV3DdCcsRbWZGY2Z/2I9ukbLkKkMbSfjk7RbIarj1AY7JqkjwD8","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)(1800799024)(376014)(52116014)(366016)(38350700014); DIR:OUT;\n SFP:1102;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"\n TiORgqK/Dd4XHnFCea/1ncHPcVZ+p8C6lg3sRsOPf4LcJwELPWmAd3DDUZqdD1/29RrW6cX4rbBbwE26RCK/VKWj9F9p6ckhUSD6EJEXu3HvY/DJZ6JNw118DWQPe+hIMcGxWyeebrZREpfp1VQeF/axh/cR/5DCmKrnFIT8c3JeraHsn3CUaDxYFNCL3qRy9JSMg7Vz7uZGArYMQrO0ZyITuHGpYdLbpqko9UjUFa3etiGcW7EROHUOQjbFfCODvrlpc3WqDnK+aVp0WrXQB6idYM0ZLIDnCJVwZwYtPr3LdKZtEq4yW6U59+ml3pNkwbpkX/FHVx5YrRUNq2iOOaypAs5Mv8/52nuAN/oPWZmY6OfLI/dqAXJrQ49NNzkbXtea2t9h4VU+cT50hs0ugZmHVlPU5krC0KzFFNooOS6JXDrQ3hngtDzfcAlUuIpIMsJ+UYOn+NlAuVKANh4N/H/BNsoiEf0OmAxc6HKL9ICAjDRqy0KiOuuyhARdPAn6KhuYfAg2Z1nLX6CwWaDcAWp9jO4i1M/NpEMTYW0yODrAf0vH76YM7nnmBtsAk9OqrNPM6iJx+G484HWWJehK15w3hyBluQ6q0yIHZY1T8j+G7n3KE6mAfai9umGjpSYEFhM/JR/b9U2Adsq1HFKQhSkGX0/RiQglKuimHGz0MMD67OKjA2WrPqON2QpF0aV5b04DBgI29yurSevQZ5jwvMxsVH3DDg5TSJM5G6pQcAcdXOBS6sm30fjVHywqaP631daoh5jwAkb0u4bNuTBi1HTquoJ0sJrkeBOxYNVplFSnmIdT3Zf5VpUCbvcbPJlU85zSruvW7iJFKfcLEelzxffugu96KuzbSCcdUkzwWCtMqc59djnh1RsagNLJaMcyDkWWjsiPk8n2v3XSodQ5Qg235j5QiwwlxBonudvk/MahEvYSiIgbY1wfX8AlmV8hyWbKbl2N3vHfMWQOZx7rW0hAxxJR+BfbD5BwuHXIpCOzaHJFx+3XQQAEEVzAG9nocbpeDtK79W/r6fTsx+6BLrwiXjW7PiG+32myIw6Q40/OCa3DSBC1yP7updUKDIhDfCsqu5Zi7nTGFGwmhs09trDQ65opAH0KLq+8TVp7aCXOSUiRDe1LRXPK2KTYYq9tatdRJDNxDqb3z8jsOKG9Pof8z43E+9S72A/rLs+EsM/LBuqbm4pvs6jV2/tKi+LJIF32dKkuGfOKoo0j8Uk7SUtG4mUs0b/0g2/XeA5QndZFgYjxpZUgdQCmlpYRg7fKlpVgsR4WBuMpWIhnifAu4Fh05VGglz4fiG6+NggKgDpKZoAWjQSrZxcQAHHJh7yTxt6zkRz0bsutqNiymiOo1sWQNOv09LyjxhM2cSoyHkMgccONNCwsBYvVlH0VUIZYOchVSP63eVWzOdO23gcjoX6x7Vg82JfqLNUEMZp5fpSCfAbS5pVLrax+m+eiORIOCYh66tf00BanOslf4qyFuS81GHKrF4YUpqViTBc5wuBLdu2gCfLwrO0EJFkGLzKRhiAlNm3gUp+v+Ms3SJSCep2IlnSYHxzNv/h0FNH2BLIJceQ4uxJeHgtnT/cEAacq","X-OriginatorOrg":"jaguarmicro.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n 0552caf1-9d71-4444-70f3-08de3bafc1ea","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:58:39.3632 (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 BDuaRmj3IN7F00kALnpxnol9OMffPeag9MiV3Paj8LU9UCmuDge2WAKFbRtzTlsc3pWF3O342VDyHxjAzXk24A==","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"OSNPR06MB8228","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\nFor the used ring, based on the state of the SVQ descriptor,\nif it is indirect, retrieve the corresponding indirect buffer by index\nand then increment the freeing counter.\nOnce all descriptors in this buffer have been released,\nupdate the current buffer state to SVQ_INDIRECT_BUF_FREED.\n\nSigned-off-by: wafer Xie <wafer@jaguarmicro.com>\n---\n hw/virtio/vhost-shadow-virtqueue.c | 43 +++++++++++++++++++++++++++---\n 1 file changed, 39 insertions(+), 4 deletions(-)","diff":"diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c\nindex 85eff1d841..9d43f13842 100644\n--- a/hw/virtio/vhost-shadow-virtqueue.c\n+++ b/hw/virtio/vhost-shadow-virtqueue.c\n@@ -469,12 +469,47 @@ static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq,\n         return NULL;\n     }\n \n+    /* Check if indirect descriptors were used */\n+    int indirect_buf_idx = svq->desc_state[used_elem.id].indirect_buf_idx;\n+    bool used_indirect = (indirect_buf_idx >= 0);\n+\n+    /* Update indirect buffer state if it was used */\n+    if (used_indirect) {\n+         SVQIndirectDescBuf *buf = &svq->indirect_bufs[indirect_buf_idx];\n+         unsigned int ndescs = svq->desc_state[used_elem.id].ndescs;\n+\n+         /* Increment freeing_descs for descriptors returned from used ring */\n+         buf->freeing_descs += ndescs;\n+\n+         /* Check if all descriptors are accounted for (freed + freeing == num) */\n+         if (buf->freed_descs + buf->freeing_descs >= buf->num_descs) {\n+             /* Reset buffer to freed state */\n+             buf->state = SVQ_INDIRECT_BUF_FREED;\n+             buf->freed_descs = buf->num_descs;\n+             buf->freeing_descs = 0;\n+             buf->freed_head = 0;\n+         }\n+\n+         svq->desc_state[used_elem.id].indirect_buf_idx = -1;\n+    }\n+\n     num = svq->desc_state[used_elem.id].ndescs;\n     svq->desc_state[used_elem.id].ndescs = 0;\n-    last_used_chain = vhost_svq_last_desc_of_chain(svq, num, used_elem.id);\n-    svq->desc_next[last_used_chain] = svq->free_head;\n-    svq->free_head = used_elem.id;\n-    svq->num_free += num;\n+\n+    /*\n+     * If using indirect descriptors, only 1 main descriptor is used.\n+     * Otherwise, we used 'num' descriptors in a chain.\n+     */\n+    if (used_indirect) {\n+        svq->desc_next[used_elem.id] = svq->free_head;\n+        svq->free_head = used_elem.id;\n+        svq->num_free += 1;\n+    } else {\n+        last_used_chain = vhost_svq_last_desc_of_chain(svq, num, used_elem.id);\n+        svq->desc_next[last_used_chain] = svq->free_head;\n+        svq->free_head = used_elem.id;\n+        svq->num_free += num;\n+    }\n \n     *len = used_elem.len;\n     return g_steal_pointer(&svq->desc_state[used_elem.id].elem);\n","prefixes":["v2","3/4"]}