From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B4A5B42BCC; Mon, 29 May 2023 08:51:27 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 575B9410DD; Mon, 29 May 2023 08:51:27 +0200 (CEST) Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id C7039410D7 for ; Mon, 29 May 2023 08:51:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1685343085; x=1716879085; h=from:to:subject:date:message-id:references:in-reply-to: content-transfer-encoding:mime-version; bh=DV3OwcJFQZkOWstt+EFKK41xodyfk/MhOjiPrB0u7Tc=; b=NgFfVUfWbaX7lF67RsPpuW4Rf3Ap0cwU378QwEpO+nEoTXKLRzQ+PA9P KeN/2cz6SRA6Q/TqlTkPQMKssu0A3jYzOL4v/u62b7z5cC9s/v3rdGjwh gAuT2ZCdoqQli7E5LSMPdHphRqroTuufExDLxotA1uT/FChPc1uG2Mzlq LhYetVMYMzOtSpq3rAAoj3Gd9Ke3sMzSCQEYEqnQhMtOrK8Enx11fExQ6 6pwcRcXXAdBrNufvBGWwTRSfuiEt4puQ+1wDxEP6KpeOwjLWddiSEcsgY /0Q+KNxqkZaLaoy8yErQdqGfZNVta3bemdT6ht0rqDmL5+VEma6VC+Yub A==; X-IronPort-AV: E=McAfee;i="6600,9927,10724"; a="418117397" X-IronPort-AV: E=Sophos;i="6.00,200,1681196400"; d="scan'208";a="418117397" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 May 2023 23:51:24 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10724"; a="830270705" X-IronPort-AV: E=Sophos;i="6.00,200,1681196400"; d="scan'208";a="830270705" Received: from orsmsx602.amr.corp.intel.com ([10.22.229.15]) by orsmga004.jf.intel.com with ESMTP; 28 May 2023 23:51:24 -0700 Received: from orsmsx610.amr.corp.intel.com (10.22.229.23) by ORSMSX602.amr.corp.intel.com (10.22.229.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Sun, 28 May 2023 23:51:24 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx610.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Frontend Transport; Sun, 28 May 2023 23:51:24 -0700 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.168) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.23; Sun, 28 May 2023 23:51:23 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=btZqbd5pC/rz9Jmk4z+WPrrx/fYSYfNRubudYBWZz/MxXgDgU2yqJfZ7pSm7ufsjqpbKu5oVpWMPL0dkYsUyccLAzL3ym7aFd64r/WFwfHhcdZmNPuvNHwKMCyAEDtdKKv18j/fZtWsSQg3tpr8r/t0mrPkgNN/VYrBElZRehqfor0zzYTVVazRKS83nZp83ZLCVtYyxjVmWITHQhG6UOMTAOtBZoFnOba8/Oc/hx6v6TmTf6wY8BQfB7d7Cpz8haS2WX0U7HZqLZDbBcxbE/YEDBo2wgl9gwk+hVhJFoFfBhHo7X92h11f+VROdoeIesBFGw6lRqXPKolH1nRlIBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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; bh=WYxyYpWKOijZgVioOHEfeEhFA+v6I93c/7s3uKOv29g=; b=NlskHGvJWi1KZPkTIKn9Whgx3cR7NfEAqKFegVLJwoN/xd0tXrCPmL8+WulOI3yfyc5RkBUxOgqKnC/efX4tlE0cJ+FRJZUf99M+BRKD610uAtvdg3lDXIc9CW3q104Im2WQx4YfuzBN9TibG9cl+LwTmZuL0UIQMLbYwpU6fBDTWwQs4W971e9l/gRwJZ1P8MsAmQn4cr50GKY4icgBEgYcyGlGHaeLqMHFMroy228leOzu2jIQx4ek4ZuyfqDs2QxNtQ+tcmWDmBvIgVxIHLnYUIGBfnG1WsSzquZkAwTGijgJxUq9w5h2IrOzbr3bZhjrqcHhe9cAOazaFCOGJA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from SN6PR11MB3504.namprd11.prod.outlook.com (2603:10b6:805:d0::17) by MW3PR11MB4602.namprd11.prod.outlook.com (2603:10b6:303:52::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6433.22; Mon, 29 May 2023 06:51:20 +0000 Received: from SN6PR11MB3504.namprd11.prod.outlook.com ([fe80::e427:f0a6:8472:d0f6]) by SN6PR11MB3504.namprd11.prod.outlook.com ([fe80::e427:f0a6:8472:d0f6%7]) with mapi id 15.20.6433.020; Mon, 29 May 2023 06:51:20 +0000 From: "Xia, Chenbo" To: Maxime Coquelin , "dev@dpdk.org" , "david.marchand@redhat.com" , "mkp@redhat.com" , "fbl@redhat.com" , "jasowang@redhat.com" , "Liang, Cunming" , "Xie, Yongji" , "echaudro@redhat.com" , "eperezma@redhat.com" , "amorenoz@redhat.com" , "lulu@redhat.com" Subject: RE: [PATCH v3 17/28] vhost: add control virtqueue support Thread-Topic: [PATCH v3 17/28] vhost: add control virtqueue support Thread-Index: AQHZjyY2a0OBduVnn0u/ZmIN5NgcMK9w1ZEQ Date: Mon, 29 May 2023 06:51:20 +0000 Message-ID: References: <20230525162551.70359-1-maxime.coquelin@redhat.com> <20230525162551.70359-18-maxime.coquelin@redhat.com> In-Reply-To: <20230525162551.70359-18-maxime.coquelin@redhat.com> Accept-Language: en-US, zh-CN Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SN6PR11MB3504:EE_|MW3PR11MB4602:EE_ x-ms-office365-filtering-correlation-id: 7a76bb6a-0131-4387-adf8-08db60111be7 x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: m4ZvChxNaO5Zc4aqQWjv++tuab1hnd1foiKKh2Hl5Ql9EVlfodB0dQMeI7jJeSkJKP2OL17p44ueaqOzoY1HHpC8ImGJxNSmJyvgs0P5jRh6H7NKz6FlsAHt87wHyxlprRlriiwgeOEd1m3l/BUNa9BowvRqQS93Skvd4fhlFD2U9SKIgKcpQr21QbWZSKRkfrS+i02Rp0O/ed/f+Dfr9DWp9ooR4Ux8qznKAAO00dk0Pi8cPGEU9AIilw5v8QB0xsYI+J77nRPrOOLQ5LOE72jbJoKvK4qf04i58uoGNVVAF+MTgQJPDhKiporFi1lcyINclhLLB2/J5uWDcHmd+rcczKOPkQcUJnN2lqtvtQOfkszLLA8idPEhy6VoQRXsL54EvKr9hKWV8GA7h3c6wtmDaire7bgZaD0dEa7s8JGq5LmrbnTIh6+xZN36Spr1Zg2VIldBtxkZJDJq4tZNW/w3aErjEcvjkyyGGid5PR3P3zLvaiHOXP+XPKsRph8UeT7wXsoWzlgXMP40XhlrLLME5X2PA2N+nLswx3hco9vp/ky/C/e9rJqRDRkF4MBfYm3SXMCyomxFTOkLy0TOgoPYmaQBMktNwshHwt50DTAqxuQl33DslxSXhwrQwxqMoZu5Rk+2RPXsWysaModxfg== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SN6PR11MB3504.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(39860400002)(366004)(136003)(346002)(376002)(396003)(451199021)(71200400001)(478600001)(110136005)(5660300002)(8936002)(8676002)(52536014)(7416002)(30864003)(2906002)(38070700005)(86362001)(33656002)(66946007)(66556008)(76116006)(66476007)(66446008)(64756008)(82960400001)(316002)(921005)(122000001)(55016003)(38100700002)(41300700001)(186003)(9686003)(53546011)(26005)(6506007)(7696005)(83380400001); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?zaeLE773Z/x/TXc6rJcMDSNSCBNutmh/VOXYit3jSBUMsI3qiCJtclxiOk0k?= =?us-ascii?Q?OLdNm26oo+CkuBrt2MMdugg4AYZc6erEkJVTOiHOMcFc14atUGIiq29xUDxf?= =?us-ascii?Q?7RA2VIFRNIjq+egdRElIeLm7jglvBgna+tWziBXr0mIOny3hvesKy5azH7u+?= =?us-ascii?Q?sN2SuwbQEnmokiuEApIwwCB4rSIQcbMdK8/2E9hYlC3EWU6lDRGxvMrCL3h0?= =?us-ascii?Q?qg1CPPN3t14wiPpvE5o+eRTNBJSL/x43izuHg8NUn/HrPTMINwJtwHD73i0K?= =?us-ascii?Q?ruOAJnL7caKex2+n5w6mO+yVOm+MjLC+M/OgoywnEjDO0tfRuSPmGak/F/VK?= =?us-ascii?Q?Jr/YpK5urGL92qL8YGV30wMMZIuFODdlpWK177jnP8q5l69OdEVzSGpPO/pz?= =?us-ascii?Q?67aLNc5SpPzKbnxmxwn8pUl1RMipfFXYX9LqoYzeP1NhY/76VirGGTyCkG8F?= =?us-ascii?Q?qMhFq1zN5Nuh9VnL+wiFMfUjES9LDv57+/k9MXqK1URi55EQSr1bg/egfmPQ?= =?us-ascii?Q?tGkteuUfKwsRsWHdFNs1LK+2BThpAZlGgm/oc3/GkF4YT9eT4CHtUUpxXVZT?= =?us-ascii?Q?REuRb51RPcJc/j/t77Dp+B2jGMh7WgRnjwB9Um/zvUnrqEga+TX2zZszVI3y?= =?us-ascii?Q?rg956pdehZOrYF1Vwdzwtl4Qgx67xuHfoWHXqFdqtbjkX/BBssVMrXaOVrZo?= =?us-ascii?Q?RLCp8gjFBgomcWRutBOKANBchyXZmSU/Ia6O2MwETRZ3i/qU4flwgV3u/c+l?= =?us-ascii?Q?RLVWDJi0DVK3dZxE4wJTz1tApQIumUxYWtmrKUQ9EwGkfAWuDHx9NGr4GvxC?= =?us-ascii?Q?hisHuTaz8+SIyUJsXuSVQKAO4sN/CL0P6lNwr5i0Yt3LFHsejb+5QPZHI3Gv?= =?us-ascii?Q?PuKL31dT8N2i0kFHXNRmkBNZCzX+gMy6vyv7M41epwaKyOH0brZtQMQRhWyh?= =?us-ascii?Q?U3XgcDsXOIXem0FtNLLBa58FHpq4QSiV1fJh2RSMFa5u1x8/hh603NwQ2/27?= =?us-ascii?Q?sXKrCIufrgnorJHRMdYp3F3/dWZVMGmm0O+GGDW9eplrJryR0EO+ji6eulrN?= =?us-ascii?Q?racATUYLYlpclqLeYIYEWSqVXbijrrR9m3YToKkqHK4g2pPpgoBB6mkUiJrw?= =?us-ascii?Q?zQ6BMHfhWRZs/e8CP6DSPEhAqfQnr/6mU/5mUFGsgJfi8RScUwmwkT+uBZeq?= =?us-ascii?Q?7PFBWNozSrJxE7wEsJx3RYWvjmTDOarpuRJdG+hZYACXHbcL2BYRTTWvfmr9?= =?us-ascii?Q?evsIx+nocDdOUU9T8dyHRqPXPw/4FGUdYmM6J2yEPZkJd0uvspKH2nF9K/Ln?= =?us-ascii?Q?aDURFkhF+p1ydGYDrFmajdAkeWlvGx9pGlPfGwtIIQ07QLsWRMbVttxYX+g1?= =?us-ascii?Q?Fw9yZV4knYilxlcsxxNWPkrT1u0EZOT8vn8EQiPJeEKJL38KEDvNadERmxkT?= =?us-ascii?Q?lKs3q9KQHDlarpf/BwxSgN64PaR8JMe5sGaRhQshIM9j5P/p0kKM560boZGP?= =?us-ascii?Q?PuxHuP2RlYFmwmzNfGht02l52I3jqDWttTrAJY+W2pnhIjrTrY1uNeOp4Fwa?= =?us-ascii?Q?8C/mlP0Vg5d4/4enMU1n0OUv9t3csWZc/1OonYmO?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN6PR11MB3504.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7a76bb6a-0131-4387-adf8-08db60111be7 X-MS-Exchange-CrossTenant-originalarrivaltime: 29 May 2023 06:51:20.1807 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Jn4q31cIOl3CZU6j1Fe+bTmbCmceN8sYOoxZ2R09EvJeyyaDf4GJ4a4zJbZP/eBjBzCwI2bEmZwcDaxUs41X5g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW3PR11MB4602 X-OriginatorOrg: intel.com X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org > -----Original Message----- > From: Maxime Coquelin > Sent: Friday, May 26, 2023 12:26 AM > To: dev@dpdk.org; Xia, Chenbo ; > david.marchand@redhat.com; mkp@redhat.com; fbl@redhat.com; > jasowang@redhat.com; Liang, Cunming ; Xie, Yongj= i > ; echaudro@redhat.com; eperezma@redhat.com; > amorenoz@redhat.com; lulu@redhat.com > Cc: Maxime Coquelin > Subject: [PATCH v3 17/28] vhost: add control virtqueue support >=20 > In order to support multi-queue with VDUSE, having > control queue support is required. >=20 > This patch adds control queue implementation, it will be > used later when adding VDUSE support. Only split ring > layout is supported for now, packed ring support will be > added later. >=20 > Signed-off-by: Maxime Coquelin > --- > lib/vhost/meson.build | 1 + > lib/vhost/vhost.h | 2 + > lib/vhost/virtio_net_ctrl.c | 286 ++++++++++++++++++++++++++++++++++++ > lib/vhost/virtio_net_ctrl.h | 10 ++ > 4 files changed, 299 insertions(+) > create mode 100644 lib/vhost/virtio_net_ctrl.c > create mode 100644 lib/vhost/virtio_net_ctrl.h >=20 > diff --git a/lib/vhost/meson.build b/lib/vhost/meson.build > index 0d1abf6283..83c8482c9e 100644 > --- a/lib/vhost/meson.build > +++ b/lib/vhost/meson.build > @@ -27,6 +27,7 @@ sources =3D files( > 'vhost_crypto.c', > 'vhost_user.c', > 'virtio_net.c', > + 'virtio_net_ctrl.c', > ) > headers =3D files( > 'rte_vdpa.h', > diff --git a/lib/vhost/vhost.h b/lib/vhost/vhost.h > index 8f0875b4e2..76663aed24 100644 > --- a/lib/vhost/vhost.h > +++ b/lib/vhost/vhost.h > @@ -525,6 +525,8 @@ struct virtio_net { > int postcopy_ufd; > int postcopy_listening; >=20 > + struct vhost_virtqueue *cvq; > + > struct rte_vdpa_device *vdpa_dev; >=20 > /* context data for the external message handlers */ > diff --git a/lib/vhost/virtio_net_ctrl.c b/lib/vhost/virtio_net_ctrl.c > new file mode 100644 > index 0000000000..f4b8d5f7cc > --- /dev/null > +++ b/lib/vhost/virtio_net_ctrl.c > @@ -0,0 +1,286 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright (c) 2023 Red Hat, Inc. > + */ > + > +#include > +#include > +#include > + > +#include "iotlb.h" > +#include "vhost.h" > +#include "virtio_net_ctrl.h" > + > +struct virtio_net_ctrl { > + uint8_t class; > + uint8_t command; > + uint8_t command_data[]; > +}; > + > +struct virtio_net_ctrl_elem { > + struct virtio_net_ctrl *ctrl_req; > + uint16_t head_idx; > + uint16_t n_descs; > + uint8_t *desc_ack; > +}; > + > +static int > +virtio_net_ctrl_pop(struct virtio_net *dev, struct vhost_virtqueue *cvq, > + struct virtio_net_ctrl_elem *ctrl_elem) > + __rte_shared_locks_required(&cvq->iotlb_lock) > +{ > + uint16_t avail_idx, desc_idx, n_descs =3D 0; > + uint64_t desc_len, desc_addr, desc_iova, data_len =3D 0; > + uint8_t *ctrl_req; > + struct vring_desc *descs; > + > + avail_idx =3D __atomic_load_n(&cvq->avail->idx, __ATOMIC_ACQUIRE); > + if (avail_idx =3D=3D cvq->last_avail_idx) { > + VHOST_LOG_CONFIG(dev->ifname, DEBUG, "Control queue empty\n"); > + return 0; > + } > + > + desc_idx =3D cvq->avail->ring[cvq->last_avail_idx]; > + if (desc_idx >=3D cvq->size) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, "Out of range desc index, > dropping\n"); > + goto err; > + } > + > + ctrl_elem->head_idx =3D desc_idx; > + > + if (cvq->desc[desc_idx].flags & VRING_DESC_F_INDIRECT) { > + desc_len =3D cvq->desc[desc_idx].len; > + desc_iova =3D cvq->desc[desc_idx].addr; > + > + descs =3D (struct vring_desc *)(uintptr_t)vhost_iova_to_vva(dev, > cvq, > + desc_iova, &desc_len, VHOST_ACCESS_RO); > + if (!descs || desc_len !=3D cvq->desc[desc_idx].len) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, "Failed to map ctrl > indirect descs\n"); > + goto err; > + } > + > + desc_idx =3D 0; > + } else { > + descs =3D cvq->desc; > + } > + > + while (1) { > + desc_len =3D descs[desc_idx].len; > + desc_iova =3D descs[desc_idx].addr; > + > + n_descs++; > + > + if (descs[desc_idx].flags & VRING_DESC_F_WRITE) { > + if (ctrl_elem->desc_ack) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, > + "Unexpected ctrl chain layout\n"); > + goto err; > + } > + > + if (desc_len !=3D sizeof(uint8_t)) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, > + "Invalid ack size for ctrl req, > dropping\n"); > + goto err; > + } > + > + ctrl_elem->desc_ack =3D (uint8_t > *)(uintptr_t)vhost_iova_to_vva(dev, cvq, > + desc_iova, &desc_len, VHOST_ACCESS_WO); > + if (!ctrl_elem->desc_ack || desc_len !=3D sizeof(uint8_t)) > { > + VHOST_LOG_CONFIG(dev->ifname, ERR, > + "Failed to map ctrl ack descriptor\n"); > + goto err; > + } > + } else { > + if (ctrl_elem->desc_ack) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, > + "Unexpected ctrl chain layout\n"); > + goto err; > + } > + > + data_len +=3D desc_len; > + } > + > + if (!(descs[desc_idx].flags & VRING_DESC_F_NEXT)) > + break; > + > + desc_idx =3D descs[desc_idx].next; > + } > + > + desc_idx =3D ctrl_elem->head_idx; > + > + if (cvq->desc[desc_idx].flags & VRING_DESC_F_INDIRECT) > + ctrl_elem->n_descs =3D 1; > + else > + ctrl_elem->n_descs =3D n_descs; > + > + if (!ctrl_elem->desc_ack) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, "Missing ctrl ack > descriptor\n"); > + goto err; > + } > + > + if (data_len < sizeof(ctrl_elem->ctrl_req->class) + > sizeof(ctrl_elem->ctrl_req->command)) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, "Invalid control header > size\n"); > + goto err; > + } > + > + ctrl_elem->ctrl_req =3D malloc(data_len); > + if (!ctrl_elem->ctrl_req) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, "Failed to alloc ctrl > request\n"); > + goto err; > + } > + > + ctrl_req =3D (uint8_t *)ctrl_elem->ctrl_req; > + > + if (cvq->desc[desc_idx].flags & VRING_DESC_F_INDIRECT) { > + desc_len =3D cvq->desc[desc_idx].len; > + desc_iova =3D cvq->desc[desc_idx].addr; > + > + descs =3D (struct vring_desc *)(uintptr_t)vhost_iova_to_vva(dev, > cvq, > + desc_iova, &desc_len, VHOST_ACCESS_RO); > + if (!descs || desc_len !=3D cvq->desc[desc_idx].len) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, "Failed to map ctrl > indirect descs\n"); > + goto free_err; > + } > + > + desc_idx =3D 0; > + } else { > + descs =3D cvq->desc; > + } > + > + while (!(descs[desc_idx].flags & VRING_DESC_F_WRITE)) { > + desc_len =3D descs[desc_idx].len; > + desc_iova =3D descs[desc_idx].addr; > + > + desc_addr =3D vhost_iova_to_vva(dev, cvq, desc_iova, &desc_len, > VHOST_ACCESS_RO); > + if (!desc_addr || desc_len < descs[desc_idx].len) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, "Failed to map ctrl > descriptor\n"); > + goto free_err; > + } > + > + memcpy(ctrl_req, (void *)(uintptr_t)desc_addr, desc_len); > + ctrl_req +=3D desc_len; > + > + if (!(descs[desc_idx].flags & VRING_DESC_F_NEXT)) > + break; > + > + desc_idx =3D descs[desc_idx].next; > + } > + > + cvq->last_avail_idx++; > + if (cvq->last_avail_idx >=3D cvq->size) > + cvq->last_avail_idx -=3D cvq->size; > + > + if (dev->features & (1ULL << VIRTIO_RING_F_EVENT_IDX)) > + vhost_avail_event(cvq) =3D cvq->last_avail_idx; > + > + return 1; > + > +free_err: > + free(ctrl_elem->ctrl_req); > +err: > + cvq->last_avail_idx++; > + if (cvq->last_avail_idx >=3D cvq->size) > + cvq->last_avail_idx -=3D cvq->size; > + > + if (dev->features & (1ULL << VIRTIO_RING_F_EVENT_IDX)) > + vhost_avail_event(cvq) =3D cvq->last_avail_idx; > + > + return -1; > +} > + > +static uint8_t > +virtio_net_ctrl_handle_req(struct virtio_net *dev, struct virtio_net_ctr= l > *ctrl_req) > +{ > + uint8_t ret =3D VIRTIO_NET_ERR; > + > + if (ctrl_req->class =3D=3D VIRTIO_NET_CTRL_MQ && > + ctrl_req->command =3D=3D VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET) { > + uint16_t queue_pairs; > + uint32_t i; > + > + queue_pairs =3D *(uint16_t *)(uintptr_t)ctrl_req->command_data; > + VHOST_LOG_CONFIG(dev->ifname, INFO, "Ctrl req: MQ %u queue > pairs\n", queue_pairs); > + ret =3D VIRTIO_NET_OK; > + > + for (i =3D 0; i < dev->nr_vring; i++) { > + struct vhost_virtqueue *vq =3D dev->virtqueue[i]; > + bool enable; > + > + if (vq =3D=3D dev->cvq) > + continue; > + > + if (i < queue_pairs * 2) > + enable =3D true; > + else > + enable =3D false; > + > + vq->enabled =3D enable; > + if (dev->notify_ops->vring_state_changed) > + dev->notify_ops->vring_state_changed(dev->vid, i, > enable); > + } > + } > + > + return ret; > +} > + > +static int > +virtio_net_ctrl_push(struct virtio_net *dev, struct virtio_net_ctrl_elem > *ctrl_elem) > +{ > + struct vhost_virtqueue *cvq =3D dev->cvq; > + struct vring_used_elem *used_elem; > + > + used_elem =3D &cvq->used->ring[cvq->last_used_idx]; > + used_elem->id =3D ctrl_elem->head_idx; > + used_elem->len =3D ctrl_elem->n_descs; > + > + cvq->last_used_idx++; > + if (cvq->last_used_idx >=3D cvq->size) > + cvq->last_used_idx -=3D cvq->size; > + > + __atomic_store_n(&cvq->used->idx, cvq->last_used_idx, > __ATOMIC_RELEASE); > + > + vhost_vring_call_split(dev, dev->cvq); > + > + free(ctrl_elem->ctrl_req); > + > + return 0; > +} > + > +int > +virtio_net_ctrl_handle(struct virtio_net *dev) > +{ > + int ret =3D 0; > + > + if (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, "Packed ring not supported > yet\n"); > + return -1; > + } > + > + if (!dev->cvq) { > + VHOST_LOG_CONFIG(dev->ifname, ERR, "missing control queue\n"); > + return -1; > + } > + > + rte_spinlock_lock(&dev->cvq->access_lock); > + vhost_user_iotlb_rd_lock(dev->cvq); > + > + while (1) { > + struct virtio_net_ctrl_elem ctrl_elem; > + > + memset(&ctrl_elem, 0, sizeof(struct virtio_net_ctrl_elem)); > + > + ret =3D virtio_net_ctrl_pop(dev, dev->cvq, &ctrl_elem); > + if (ret <=3D 0) > + break; > + > + *ctrl_elem.desc_ack =3D virtio_net_ctrl_handle_req(dev, > ctrl_elem.ctrl_req); > + > + ret =3D virtio_net_ctrl_push(dev, &ctrl_elem); > + if (ret < 0) > + break; > + } > + > + vhost_user_iotlb_rd_unlock(dev->cvq); > + rte_spinlock_unlock(&dev->cvq->access_lock); > + > + return ret; > +} > diff --git a/lib/vhost/virtio_net_ctrl.h b/lib/vhost/virtio_net_ctrl.h > new file mode 100644 > index 0000000000..9a90f4b9da > --- /dev/null > +++ b/lib/vhost/virtio_net_ctrl.h > @@ -0,0 +1,10 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright (c) 2023 Red Hat, Inc. > + */ > + > +#ifndef _VIRTIO_NET_CTRL_H > +#define _VIRTIO_NET_CTRL_H > + > +int virtio_net_ctrl_handle(struct virtio_net *dev); > + > +#endif > -- > 2.40.1 Reviewed-by: Chenbo Xia =20