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 AE77142A9D; Tue, 9 May 2023 07:31:36 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8C280410FA; Tue, 9 May 2023 07:31:36 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mails.dpdk.org (Postfix) with ESMTP id AA595410D7 for ; Tue, 9 May 2023 07:31:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1683610294; x=1715146294; h=from:to:subject:date:message-id:references:in-reply-to: content-transfer-encoding:mime-version; bh=IEp0VICJp03WRbzKrpPa7GQheOj0xd4z1gNL5fW/Gic=; b=iwwglDAX/vOMAJveJ8j1Z1rkNCLjV4BC1DsY/nFCOoTh0rPtXMMiyOrP lPpYDkSITHpGFroLOd5Lns5BMEvHnWwnpbiaHKVlIXB/YBPQ3V/6xS4+p zPSMuNxHlZNLx/nj+GX74OwHaJLjoGKWtrE2oVdf/DdTnAyIPVifyXdz1 ESDOLeOtvIN3uapWXXhwc70BJwfOO7NBJS/oJUg+rtRqYWEYtUiQWGM8F 79aM0YH7VyxAczz1pkH0SyF975LCuIMtXDq2PP660IOD+IPIDnN2tR/bX w/FDNIG9CYSFN/8hHef/ShHOnJQ3l7NZ/6bL6EtFbJDv8veE9EYZmaUm4 Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10704"; a="352873600" X-IronPort-AV: E=Sophos;i="5.99,261,1677571200"; d="scan'208";a="352873600" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2023 22:31:33 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10704"; a="788373847" X-IronPort-AV: E=Sophos;i="5.99,261,1677571200"; d="scan'208";a="788373847" Received: from orsmsx601.amr.corp.intel.com ([10.22.229.14]) by FMSMGA003.fm.intel.com with ESMTP; 08 May 2023 22:31:33 -0700 Received: from orsmsx612.amr.corp.intel.com (10.22.229.25) by ORSMSX601.amr.corp.intel.com (10.22.229.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Mon, 8 May 2023 22:31:32 -0700 Received: from orsmsx610.amr.corp.intel.com (10.22.229.23) by ORSMSX612.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Mon, 8 May 2023 22:31:32 -0700 Received: from ORSEDG602.ED.cps.intel.com (10.7.248.7) 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; Mon, 8 May 2023 22:31:32 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (104.47.57.169) by edgegateway.intel.com (134.134.137.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.23; Mon, 8 May 2023 22:31:32 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HtycqrqOicpiN9ThBGyV96Cwg/oEmj2vYM1u9SBdo5tL1Y8dCZz322FkM2SDF4Ol57SbcvmXUUjQg22Bv4zWHVm2U9X6m4J4uueHo62gK43/6hGbVrLzHaO5qq2rO8R86h7QYBQg1U4UVZ2boykrn4kL681dM4b7GmyouupBGU/3F6HElg1UIfK8syNCpeUBTz/lD3ozJk+6PjZllFL4EioNO4ob5CtPxCb7qkdbfnUq6mRZrvQGyZIJjj3hEcMZeCUktyHjOUkpPzeokskIpYqr7G4iGNQRLHgWLbxqsXfwE/A+k/+dTL4CVvLmi0qY0F1CeOFaODe1hDYe8D9lNA== 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=BRSng3kBCR67siaaUsnx2PC4ekD25ORvYHqa7CAmwio=; b=BwiVxWYdXm8B4vA0ChhF6CfHE08k1Bj49QI7Fzbfu41KYyqOPOIKAC++VFCWr6kKvKEFc7q4NXNQqMOtxCELKRTKWQChQ9CIw30qrw89YnpLPrUelOhI5MXQbZggYNtHbs9u7MbV68b7ZDdtCKUrTGPBMCf+RmQM9aZCc6s96mDApKHA1+cQco094eckYh5JBsSFkpzdXa3Ulx/sjola3xdC8eUD148DVZB7ctujuEOtA5ajzP5jUE11/x5P7NgEkUCSQlT1sLZQYH0rY2fjfMhD/Qc+dMfGWre9fRT71/wNxefiPlh2KcBCxTuF2xUAARVYSsC351zyZ0+XSgaGkw== 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 IA1PR11MB6147.namprd11.prod.outlook.com (2603:10b6:208:3ed::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6363.32; Tue, 9 May 2023 05:31:29 +0000 Received: from SN6PR11MB3504.namprd11.prod.outlook.com ([fe80::5797:849:7a10:560d]) by SN6PR11MB3504.namprd11.prod.outlook.com ([fe80::5797:849:7a10:560d%6]) with mapi id 15.20.6363.032; Tue, 9 May 2023 05:31:28 +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" Subject: RE: [RFC 18/27] vhost: add VDUSE device creation and destruction Thread-Topic: [RFC 18/27] vhost: add VDUSE device creation and destruction Thread-Index: AQHZY+ehgJ5aRgTi6UWV/7FA+Nhea69Rpw9g Date: Tue, 9 May 2023 05:31:28 +0000 Message-ID: References: <20230331154259.1447831-1-maxime.coquelin@redhat.com> <20230331154259.1447831-19-maxime.coquelin@redhat.com> In-Reply-To: <20230331154259.1447831-19-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_|IA1PR11MB6147:EE_ x-ms-office365-filtering-correlation-id: 8b6d48da-7b7c-473b-4cd3-08db504ea3a6 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: +jkmunIOPxvjS+l5xWN+yXkcRhKnOvlcl9riTDUjWRlmY3TsfKZe1G0gL1xaO/5OFfB3LOhhS2ioNkevjT5tK5uDsfGV1Ek894o8i+x5t7Sow8E9ws7/+8wtm/T98UJOHZOrmj5a9j37DqvCKVjSuqbPgzYMlPWT+JHe5pXJ+OCiWqNVKGh5HWkJStQ6xRqZo9Tk4ITeu72SyA55VQs4ORr8Y8w32dimDwH8p/XKLZspjWqtdtw+vCAsnDJgPJ1nimQ/jDQ0JIoT4ZHCpR0JkhkCSUozXSbbg+LW4oo63zRSy0Z80RXkgcosqmYW52hxFvvmTs/Zxpd9pvF7UbK9eDgncj/UnG4a1Ol8wNNlWKchlaw2/kaceTnOuDD3ie2TPcIBjSVpNzPAzBehYMlGmHuumGe/Nih2YzSLSsy1RWZGsyGgcv1MniUhPq1l5sV2dRu+YSyuO2v6IzKPlEd9F4AxGFY8fxChC1kc/bUaQ8l53iKP4+owkdmZrqL1LcXcfhRrTnXyiTj9mywtfRo+o3kJQLNQoSJvSCg9EYqvvnNXoh1slSIDisbA9mJz5eWxoxI2jsM0dB7GOapER4LE0ZLauzs07f5Z5t2bHFRCwWw36DBI4Ym6aK+nIcec0DBzvLQke4s+I11vKKSsLNz0SA== 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)(346002)(136003)(376002)(366004)(396003)(451199021)(83380400001)(55016003)(86362001)(110136005)(921005)(122000001)(38100700002)(66476007)(2906002)(64756008)(66556008)(66446008)(76116006)(66946007)(316002)(186003)(478600001)(8676002)(71200400001)(8936002)(7696005)(53546011)(26005)(6506007)(9686003)(82960400001)(41300700001)(5660300002)(33656002)(52536014)(38070700005)(7416002); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?F3N5llpYJCrUJXMir7VWJ+JYWaDqf4aC1SHTJreDSTa4bp80NgdK59HeIKbN?= =?us-ascii?Q?yLipkUgfzFJTQQBdNWfTLG5/vH0GcUXv/xJh9yYvZawFu51+fabHyUdB/Yo+?= =?us-ascii?Q?6IViXGmkCZqCKV26ee03l40J6+d2CzPAicq1L30lSRxb30IZCTpf6niorqD5?= =?us-ascii?Q?ezU97SxhxzJl4F6iIFb12CZVdrCzz5GqVydHkqyN9fVcwjaIfWczoqGTz1Fe?= =?us-ascii?Q?E+eWElTvbtTlJ1mFSMWVETc9j2D8lWtAkyK/DD9D/04N8WJftXlx8XhEvyoF?= =?us-ascii?Q?aX2yA4rV3qYTe3oQ5eWOOQHZ1hsvDogdwWSEdk++zAb6yDgJLTMKbrDQbVad?= =?us-ascii?Q?YoCxl9HV/xecTi1ZUzHz31qcxYLV9Gyq6ZXov8cH72FpLPRsxpKJ11ETxAyz?= =?us-ascii?Q?jKgMOpv2G+NGv14qAGHOvVTrhl0nXU+e7+YhW/uC7wHnwp2hUeC4U9RT6cR5?= =?us-ascii?Q?N2ZxSSMq2oSH5WKHw1c1nI1cEHgEoW/46iNoaXoMLYI0RhkBPxd7UTou1Lqy?= =?us-ascii?Q?IGuab87dXC/SztxofWtlsvQpHoofj84v5tpicnizy3Cy4+3zIwiO+p2Z6XCu?= =?us-ascii?Q?x5Ozf3nHwcOslmK+2oN+7oi3RbXb036NzOQ0d8BH4toWt0ChemQq6KO0Y6sW?= =?us-ascii?Q?77n4ol7jwR8Sb9hNtaxtIvkblaGKjnVBSkpPj1NFveN1cwIexK78SODj3NWS?= =?us-ascii?Q?7FwWH5u5tfTB9hdTvGKhyPO8ifIyUOXJtMfwMSKcsmFACP0lA9urcc99BS/i?= =?us-ascii?Q?FgohngvuxBbuZ2c0+RVzMZwqb9r2zXWRwntzSuD3sp0ZumQKOtplqyMVf0au?= =?us-ascii?Q?B2a7FLcCJM571QPMnDaEmQui9F+930/v//LRAY2yMihBRQ+BiUh6zNwttHzy?= =?us-ascii?Q?Iz1/0lvCrOto1/3PmyHIXrR941L1iE1SFDsrjj8tzGxoiEJLzq9c2uiIhOO6?= =?us-ascii?Q?BuZts0adj7GTTpaKqZIH0JpB9OQMBOf42EfuxCElkOrxNEPUvWffRGI8su62?= =?us-ascii?Q?rv8j9VC6jhq3vASaWggwhn6rMhD+LVt65JvYsYuvXKmXyP35y+zExm3szB9A?= =?us-ascii?Q?eMEFyRHW1QWyWkY65G7Tov0exo/5PsWouCu0la7tpa3vhvmrsltxC+iGRkZf?= =?us-ascii?Q?Y85QRN7JqeXtAU9elr4oIGnZqoN1BAOIkzW0CsgzHE1qDVJ54u7DdxGfgcWO?= =?us-ascii?Q?F2bPAfouZbhh0VaLmI0g7Pde4jg3Ofq+q98UN2pTX06IbK6AVpiSmqvXxdfp?= =?us-ascii?Q?AHCsE5JVNRwJuI6RRUtXstZmadqtFYIoSeaVQ1Z67i4H7icx2FR+1sLqUIER?= =?us-ascii?Q?0B0+adsoRvYRbCHoxm26uHDnuok4iFL1qZOFmm7ECNyZkdhc3KR6TZpUwhfs?= =?us-ascii?Q?9QPbMFwAX2MTUPos9yzKSIT+Z+sodvDS5g2UL1p7XR28gyisOyj+XyOIZ6kH?= =?us-ascii?Q?Cx2QbIbtu2YTs7E7DZuDWz+62hy30oQyCk8A4lo+25HBr2TnmPsRziPgsoGT?= =?us-ascii?Q?FY4BM/Fb7KlSESwv7MW51td+oSFicve9r4qsNMfNasH43Xa0tw+kkAJad5Xh?= =?us-ascii?Q?3bYSbPPqxCDfcVsT7OPrXWMGHtARS0q5EiuVxfnc?= 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: 8b6d48da-7b7c-473b-4cd3-08db504ea3a6 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 May 2023 05:31:28.6187 (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: Iw35HtA6wteh4VrcsFTgnE49wUb63t0sY34rNoWb0JQMBUk0kSMUe8ExzAuBrQBmDpkc93Y1LWQrnkWZZDYgBg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR11MB6147 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, March 31, 2023 11:43 PM > To: dev@dpdk.org; david.marchand@redhat.com; Xia, Chenbo > ; mkp@redhat.com; fbl@redhat.com; > jasowang@redhat.com; Liang, Cunming ; Xie, Yongj= i > ; echaudro@redhat.com; eperezma@redhat.com; > amorenoz@redhat.com > Cc: Maxime Coquelin > Subject: [RFC 18/27] vhost: add VDUSE device creation and destruction >=20 > This patch adds initial support for VDUSE, which includes > the device creation and destruction. >=20 > It does not include the virtqueues configuration, so this is > not functionnal at this point. >=20 > Signed-off-by: Maxime Coquelin > --- > lib/vhost/meson.build | 4 + > lib/vhost/socket.c | 34 +++++--- > lib/vhost/vduse.c | 184 ++++++++++++++++++++++++++++++++++++++++++ > lib/vhost/vduse.h | 33 ++++++++ > lib/vhost/vhost.h | 2 + > 5 files changed, 245 insertions(+), 12 deletions(-) > create mode 100644 lib/vhost/vduse.c > create mode 100644 lib/vhost/vduse.h >=20 > diff --git a/lib/vhost/meson.build b/lib/vhost/meson.build > index cdcd403df3..a57a15937f 100644 > --- a/lib/vhost/meson.build > +++ b/lib/vhost/meson.build > @@ -30,6 +30,10 @@ sources =3D files( > 'virtio_net.c', > 'virtio_net_ctrl.c', > ) > +if cc.has_header('linux/vduse.h') > + sources +=3D files('vduse.c') > + cflags +=3D '-DVHOST_HAS_VDUSE' > +endif > headers =3D files( > 'rte_vdpa.h', > 'rte_vhost.h', > diff --git a/lib/vhost/socket.c b/lib/vhost/socket.c > index e95c3ffeac..a8a1c4cd2b 100644 > --- a/lib/vhost/socket.c > +++ b/lib/vhost/socket.c > @@ -18,6 +18,7 @@ > #include >=20 > #include "fd_man.h" > +#include "vduse.h" > #include "vhost.h" > #include "vhost_user.h" >=20 > @@ -35,6 +36,7 @@ struct vhost_user_socket { > int socket_fd; > struct sockaddr_un un; > bool is_server; > + bool is_vduse; > bool reconnect; > bool iommu_support; > bool use_builtin_virtio_net; > @@ -992,18 +994,21 @@ rte_vhost_driver_register(const char *path, uint64_= t > flags) > #endif > } >=20 > - if ((flags & RTE_VHOST_USER_CLIENT) !=3D 0) { > - vsocket->reconnect =3D !(flags & RTE_VHOST_USER_NO_RECONNECT); > - if (vsocket->reconnect && reconn_tid =3D=3D 0) { > - if (vhost_user_reconnect_init() !=3D 0) > - goto out_mutex; > - } > + if (!strncmp("/dev/vduse/", path, strlen("/dev/vduse/"))) { > + vsocket->is_vduse =3D true; > } else { > - vsocket->is_server =3D true; > - } > - ret =3D create_unix_socket(vsocket); > - if (ret < 0) { > - goto out_mutex; > + if ((flags & RTE_VHOST_USER_CLIENT) !=3D 0) { > + vsocket->reconnect =3D !(flags & > RTE_VHOST_USER_NO_RECONNECT); > + if (vsocket->reconnect && reconn_tid =3D=3D 0) { > + if (vhost_user_reconnect_init() !=3D 0) > + goto out_mutex; > + } > + } else { > + vsocket->is_server =3D true; > + } > + ret =3D create_unix_socket(vsocket); > + if (ret < 0) > + goto out_mutex; > } >=20 > vhost_user.vsockets[vhost_user.vsocket_cnt++] =3D vsocket; > @@ -1068,7 +1073,9 @@ rte_vhost_driver_unregister(const char *path) > if (strcmp(vsocket->path, path)) > continue; >=20 > - if (vsocket->is_server) { > + if (vsocket->is_vduse) { > + vduse_device_destroy(path); > + } else if (vsocket->is_server) { > /* > * If r/wcb is executing, release vhost_user's > * mutex lock, and try again since the r/wcb > @@ -1171,6 +1178,9 @@ rte_vhost_driver_start(const char *path) > if (!vsocket) > return -1; >=20 > + if (vsocket->is_vduse) > + return vduse_device_create(path); > + > if (fdset_tid =3D=3D 0) { > /** > * create a pipe which will be waited by poll and notified to > diff --git a/lib/vhost/vduse.c b/lib/vhost/vduse.c > new file mode 100644 > index 0000000000..336761c97a > --- /dev/null > +++ b/lib/vhost/vduse.c > @@ -0,0 +1,184 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright (c) 2023 Red Hat, Inc. > + */ > + > +#include > +#include > +#include > +#include > + > + > +#include > +#include > + > +#include > +#include > + > +#include > + > +#include "vduse.h" > +#include "vhost.h" > + > +#define VHOST_VDUSE_API_VERSION 0 > +#define VDUSE_CTRL_PATH "/dev/vduse/control" > + > +#define VDUSE_NET_SUPPORTED_FEATURES ((1ULL << VIRTIO_NET_F_MRG_RXBUF) | > \ > + (1ULL << VIRTIO_F_ANY_LAYOUT) | \ > + (1ULL << VIRTIO_F_VERSION_1) | \ > + (1ULL << VIRTIO_RING_F_INDIRECT_DESC) | \ > + (1ULL << VIRTIO_RING_F_EVENT_IDX) | \ > + (1ULL << VIRTIO_F_IN_ORDER) | \ > + (1ULL << VIRTIO_F_IOMMU_PLATFORM)) > + > +static struct vhost_backend_ops vduse_backend_ops =3D { > +}; > + > +int > +vduse_device_create(const char *path) > +{ > + int control_fd, dev_fd, vid, ret; > + uint32_t i; > + struct virtio_net *dev; > + uint64_t ver =3D VHOST_VDUSE_API_VERSION; > + struct vduse_dev_config *dev_config =3D NULL; > + const char *name =3D path + strlen("/dev/vduse/"); > + > + control_fd =3D open(VDUSE_CTRL_PATH, O_RDWR); > + if (control_fd < 0) { > + VHOST_LOG_CONFIG(name, ERR, "Failed to open %s: %s\n", > + VDUSE_CTRL_PATH, strerror(errno)); > + return -1; > + } > + > + if (ioctl(control_fd, VDUSE_SET_API_VERSION, &ver)) { > + VHOST_LOG_CONFIG(name, ERR, "Failed to set API version: %" > PRIu64 ": %s\n", > + ver, strerror(errno)); > + ret =3D -1; > + goto out_ctrl_close; > + } > + > + dev_config =3D malloc(offsetof(struct vduse_dev_config, config)); > + if (!dev_config) { > + VHOST_LOG_CONFIG(name, ERR, "Failed to allocate VDUSE > config\n"); > + ret =3D -1; > + goto out_ctrl_close; > + } > + > + memset(dev_config, 0, sizeof(struct vduse_dev_config)); > + > + strncpy(dev_config->name, name, VDUSE_NAME_MAX - 1); > + dev_config->device_id =3D VIRTIO_ID_NET; > + dev_config->vendor_id =3D 0; > + dev_config->features =3D VDUSE_NET_SUPPORTED_FEATURES; > + dev_config->vq_num =3D 2; > + dev_config->vq_align =3D sysconf(_SC_PAGE_SIZE); > + dev_config->config_size =3D 0; > + > + ret =3D ioctl(control_fd, VDUSE_CREATE_DEV, dev_config); > + if (ret < 0) { > + VHOST_LOG_CONFIG(name, ERR, "Failed to create VDUSE > device: %s\n", > + strerror(errno)); > + goto out_free; > + } > + > + dev_fd =3D open(path, O_RDWR); > + if (dev_fd < 0) { > + VHOST_LOG_CONFIG(name, ERR, "Failed to open device %s: %s\n", > + path, strerror(errno)); > + ret =3D -1; > + goto out_dev_close; > + } > + > + vid =3D vhost_new_device(&vduse_backend_ops); > + if (vid < 0) { > + VHOST_LOG_CONFIG(name, ERR, "Failed to create new Vhost > device\n"); > + ret =3D -1; > + goto out_dev_close; > + } > + > + dev =3D get_device(vid); > + if (!dev) { > + ret =3D -1; > + goto out_dev_close; > + } > + > + strncpy(dev->ifname, path, IF_NAME_SZ - 1); > + dev->vduse_ctrl_fd =3D control_fd; > + dev->vduse_dev_fd =3D dev_fd; > + vhost_setup_virtio_net(dev->vid, true, true, true, true); > + > + for (i =3D 0; i < 2; i++) { > + struct vduse_vq_config vq_cfg =3D { 0 }; > + > + ret =3D alloc_vring_queue(dev, i); > + if (ret) { > + VHOST_LOG_CONFIG(name, ERR, "Failed to alloc vring %d > metadata\n", i); > + goto out_dev_destroy; > + } > + > + vq_cfg.index =3D i; > + vq_cfg.max_size =3D 1024; > + > + ret =3D ioctl(dev->vduse_dev_fd, VDUSE_VQ_SETUP, &vq_cfg); > + if (ret) { > + VHOST_LOG_CONFIG(name, ERR, "Failed to set-up VQ %d\n", > i); > + goto out_dev_destroy; > + } > + } > + > + free(dev_config); > + > + return 0; > + > +out_dev_destroy: > + vhost_destroy_device(vid); > +out_dev_close: > + if (dev_fd >=3D 0) > + close(dev_fd); > + ioctl(control_fd, VDUSE_DESTROY_DEV, name); > +out_free: > + free(dev_config); > +out_ctrl_close: > + close(control_fd); > + > + return ret; > +} > + > +int > +vduse_device_destroy(const char *path) > +{ > + const char *name =3D path + strlen("/dev/vduse/"); > + struct virtio_net *dev; > + int vid, ret; > + > + for (vid =3D 0; vid < RTE_MAX_VHOST_DEVICE; vid++) { > + dev =3D vhost_devices[vid]; > + > + if (dev =3D=3D NULL) > + continue; > + > + if (!strcmp(path, dev->ifname)) > + break; > + } > + > + if (vid =3D=3D RTE_MAX_VHOST_DEVICE) > + return -1; > + > + if (dev->vduse_dev_fd >=3D 0) { > + close(dev->vduse_dev_fd); > + dev->vduse_dev_fd =3D -1; > + } > + > + if (dev->vduse_ctrl_fd >=3D 0) { > + ret =3D ioctl(dev->vduse_ctrl_fd, VDUSE_DESTROY_DEV, name); > + if (ret) > + VHOST_LOG_CONFIG(name, ERR, "Failed to destroy VDUSE > device: %s\n", > + strerror(errno)); > + close(dev->vduse_ctrl_fd); > + dev->vduse_ctrl_fd =3D -1; > + } > + > + vhost_destroy_device(vid); > + > + return 0; > +} > diff --git a/lib/vhost/vduse.h b/lib/vhost/vduse.h > new file mode 100644 > index 0000000000..a15e5d4c16 > --- /dev/null > +++ b/lib/vhost/vduse.h > @@ -0,0 +1,33 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright (c) 2023 Red Hat, Inc. > + */ > + > +#ifndef _VDUSE_H > +#define _VDUSE_H > + > +#include "vhost.h" > + > +#ifdef VHOST_HAS_VDUSE > + > +int vduse_device_create(const char *path); > +int vduse_device_destroy(const char *path); > + > +#else > + > +static inline int > +vduse_device_create(const char *path) > +{ > + VHOST_LOG_CONFIG(path, ERR, "VDUSE support disabled at build > time\n"); > + return -1; > +} > + > +static inline int > +vduse_device_destroy(const char *path) > +{ > + VHOST_LOG_CONFIG(path, ERR, "VDUSE support disabled at build > time\n"); > + return -1; > +} > + > +#endif /* VHOST_HAS_VDUSE */ > + > +#endif /* _VDUSE_H */ > diff --git a/lib/vhost/vhost.h b/lib/vhost/vhost.h > index 76663aed24..c8f2a0d43a 100644 > --- a/lib/vhost/vhost.h > +++ b/lib/vhost/vhost.h > @@ -524,6 +524,8 @@ struct virtio_net { >=20 > int postcopy_ufd; > int postcopy_listening; > + int vduse_ctrl_fd; > + int vduse_dev_fd; >=20 > struct vhost_virtqueue *cvq; >=20 > -- > 2.39.2 Reviewed-by: Chenbo Xia =20