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 6B0FE4547D; Mon, 17 Jun 2024 08:28:45 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C6C6040655; Mon, 17 Jun 2024 08:28:24 +0200 (CEST) Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2124.outbound.protection.outlook.com [40.107.220.124]) by mails.dpdk.org (Postfix) with ESMTP id 69EDB40DFD for ; Mon, 17 Jun 2024 08:28:03 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=axn7nA+WZMf3T5whP1faoyJRb8a1hVWuvvFLY/nLbpnCm5GyCGZS+beOcK6Hrn6zHHK9rJEMbfCVJYBLMCLbHhNw0nAoB9MLVfI5pxM73e9AChAVi0lK1ZOEBTMcbiR2CwkAb9azNP3fJABCfOo5QLTBuaXySXwOgS0xNmpCsDVP5wjzt+WXh8hvIPWr43MDFUiPuFdkglrWDnVdHwLNRs5YdHLaGynehvdytdmNn4DBxcltxFTXsKaDmINjTRarHsG9DB66OLEcGVDysHban557AyXgox/YCvAqxHHpb36D7uidLx1JlS0aU6u9xwQLbmotIRu5b+xMfvLZb2syNA== 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=LT86g7sQcgFGwpt99IYZhHc3kpMSnYxoebL6L+kIags=; b=DTh+z2YqwesE7kzd9d9C7i87zSGRxjWeANrBchePNJ9oBY6z03iqytbGOz9c9sw77i4teauv5pvgiCdA/E0WmwPS2CeAuBkPMFuaMcxpf8QGAJUOJ3ZFbssXIT+cfl1VZkEMmhDMVe5pVggQs1YMWt99fzShZH4SB2Z5zESV+tOYvstDgomsmwUsAcdHPMBjOxCBesUWMsYUmiSeQd9d9lbnRzceMhVE6T5c4NN/pa9lcKXyh6mMHVpZIzAL1c7uTkUBzpg28P4M1W/fYCdDd6MvjTPqPXl1tvg3gUCjq77H0Py5OndoTTY5vHU14boZE2maF0dTVw5FWBAuEArASQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LT86g7sQcgFGwpt99IYZhHc3kpMSnYxoebL6L+kIags=; b=AQ8VWCMb2T0L6m9RcKvscDBeq04i1MwWd3Pa25xkT9rnS8KBBurs3hurqiUihK7uvY9Pv2dHORGvPxQ16VB2dah+92KHljB7UdVGMt0KsPs3xQK2dtmA8ZcohFMQ7Ysb5hrWib2c1pF0FfwAfdYeMGN+pcXumjnfN7ovxKfoFXY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) by MW3PR13MB4106.namprd13.prod.outlook.com (2603:10b6:303:56::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7677.30; Mon, 17 Jun 2024 06:28:01 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::b900:5f05:766f:833]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::b900:5f05:766f:833%4]) with mapi id 15.20.7677.030; Mon, 17 Jun 2024 06:28:01 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Xinying Yu , Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH v3 09/11] vdpa/nfp: setup vring relay thread Date: Mon, 17 Jun 2024 14:27:06 +0800 Message-Id: <20240617062708.2932037-10-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20240617062708.2932037-1-chaoyong.he@corigine.com> References: <20240614070120.2663160-1-chaoyong.he@corigine.com> <20240617062708.2932037-1-chaoyong.he@corigine.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SG2PR04CA0175.apcprd04.prod.outlook.com (2603:1096:4:14::13) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|MW3PR13MB4106:EE_ X-MS-Office365-Filtering-Correlation-Id: 09fc027b-548c-4d5b-f59c-08dc8e96a329 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230037|376011|1800799021|52116011|366013|38350700011; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?J15n6yZWcnS5062gVpqU8+rUFrjHRxLIfTsvGl0J6B9bKemBXcZ0ubodt/1q?= =?us-ascii?Q?1xfrQsRCih7ZeZSz4j98aJsc6Qv2AlWZt3jNA4wWYDidEAl76+5HOZsBXbnS?= =?us-ascii?Q?xQ+52zuTakesDdwiy5+qNw7uqa9KjYNOK0cAq+bIxvJ2OJmlHFN5ADhyg1T7?= =?us-ascii?Q?f1b+goK/SZMr+w5QlYcBr+X6h8GRDR1MB4pG7Bnm72w0W/UZjqCcWu015R5l?= =?us-ascii?Q?UAlp/trIBV3aQpNhCUnopXwe1JtfBSemwzHHDIo31RskMExXY4uCcP/Uwoxb?= =?us-ascii?Q?RE1q8WO6eHU+8/dINty8Oj5jmYr68nu8YP1IaeU9b4F+SwiJapai2aA1Mddg?= =?us-ascii?Q?V6K1rLdMs4sHZ7gqLAX013TJYl/HehzKY/PYuIxvNsWe8KovaelgdBWIDqP0?= =?us-ascii?Q?VP5plTWxeiqUaCvQRgZR4aCil9AB4KFyvAT7RLPeoARpbv0U20TE0o7Mz38K?= =?us-ascii?Q?etnlWVq9mxpKiTNrR6szdfkZ/PxukhUPWS6Vqlq/KsNTIJpkcShECAGwxv7F?= =?us-ascii?Q?CEDHW9SbjHRfKtuWO9zr3xMug7SNB+QdKSn5b83yPK/Vhua5REv2zS1MgtcI?= =?us-ascii?Q?HHz0/DHH0J3a0G/uz1mSVTMMiW/mNn0ZefvKXAmITZIc6jMoNkE7jFwTdwf2?= =?us-ascii?Q?FCo15qSTPZVyzjj9Dhfv31G0XFbGPqiGfCL0Jy4sOgl91BfNiNs7wV80ORkt?= =?us-ascii?Q?+eQ2EzDWyxT8Ccz5gmI4soH2vyYuGSm5N65aPU66nyZEBZQRp0c8pgntvAg8?= =?us-ascii?Q?JJekDvl/obt7NOfgCGO4Cz8n5RdqXRl9NGVuBWuwIRaBFQHrT7xdLZlkYtb7?= =?us-ascii?Q?xfWft2NBu3AVglMNQldVMIzYpYSebIkYsi14rrydogypRI9szB/Ft+Fyt7I9?= =?us-ascii?Q?2vdvrd/ijXV10b+XiWKT3tGvNqLYwS549FFa2fhHQXchw+UdV50wYw3BQp5K?= =?us-ascii?Q?ygMMnDUBG2jlCOUImSgsZ2/b3kKbxIhYorcgsLVFx1pN/R+mAfDWBZELE8so?= =?us-ascii?Q?svafzUf0eFd1E+8xdDye4iqOOWgqxy/fKeVEJcZsYMtoAIwbRkONxC0QemUo?= =?us-ascii?Q?Sa4XNntzvLvkUJODriEcYSKTZeHUedFyj9q4Na7L01hj7hmvrjZvEpqi7lpq?= =?us-ascii?Q?cRuEsskQNcSSX/7ldgcEEaZJp4vD1qqT+EAMp3mEs4BFYsgbuYd7ZRySi0PW?= =?us-ascii?Q?SAbz4kNQH0aot2G6/g4plFammlV9VqXHg0WiULlR4Az99FTG70PDhQtURFjU?= =?us-ascii?Q?n+NMudQSVZXZKVhiewq6Gs4893YUWGeQgcDBrwpjYusFKcU9lBOYs54lovnz?= =?us-ascii?Q?VczYeWP5c9RMDM4hwEvKmnpfZUaTVbDI2w7LFABYVabXGgt/VAvOx7pGBdWY?= =?us-ascii?Q?ojFhghU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230037)(376011)(1800799021)(52116011)(366013)(38350700011); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?NXoN53UZP4H5Q/uSlCudbFtaPn4zUJO5DMuTNt+3llwO259D8ST97tBdKe/V?= =?us-ascii?Q?sPp4Ziz9WgN4pmawh91R9ea+0dk4+8hGmmuvgqmV2E5yXc2x37c2fWYg9Fdx?= =?us-ascii?Q?mdH1KxjMegw/+w5A/vaEtAHDxvhBQmG9407G7BivR5Q5hgIXD3adKPSwYZBT?= =?us-ascii?Q?un8yCmym0dRFaudKb76roAjX9iZ8zZ8b+14SpBP/AARUGYojHapysUBobJFg?= =?us-ascii?Q?1jpSfmF92vblTqS4lJH+8ujr8lB8MDMCRuXRV/LjbWDgIiPQlauDEaklEM0x?= =?us-ascii?Q?PcA1RS4LUWNk6Hyzr3hy58bCc1IPr4cF/x7EiNGf/8YXXzz0J7p6aNg0zNE1?= =?us-ascii?Q?NEHtK7Z0tCz1k7jVW82yFJnkoKmgiZrMKIhGiWx4mKqDYoBc6KPSRhciRsZE?= =?us-ascii?Q?0zICiRw27N/bllNMjY8LzJERfL1wzeVBuDxpfkZsMrElEKlv6Yo4OJxj+Rge?= =?us-ascii?Q?8hkuAHffuENJ9vJxOXr9H8XGf0h93sriElZ0oK8ZeXkN3bxon66fdh8N+POx?= =?us-ascii?Q?S3JPY/yCX8a6co20HC7HhMSvh4tU9Aupk+Gx+VFepm+b4Cf0vJC8innQDeu2?= =?us-ascii?Q?A1Z5z/VPHeYk9eMeXBk106mNEpVnt6GqR9YysC2oJt6lyUbHvdyEsT0BPMHr?= =?us-ascii?Q?k7U9XS87TAEh8lqEG/aBiyxOAubO/I3hKZ2YxXt5XxofoNuIHK9K3XtJb1/L?= =?us-ascii?Q?NysunL1SgMDk8JnENw+C0QW1gDDywSD1iLoZrGftnP5c8aXtsGE+ckxm85jK?= =?us-ascii?Q?KxLTJo3+zu4TDz5W7CUtyFZq2WqEPMjeWPxFG9G7OlcmlojMVuiJRC6Ngwxp?= =?us-ascii?Q?nIkh8IZhnBZS1DY1NDY1lVC24sfMTGV+ASnmvqrkdI0HswBPkv4ctjRH2eqG?= =?us-ascii?Q?nDX17iHV2yJWgjE3OMZK2dlQGKLD+yUpGv3hY6AiEHXSTwBOBxq8XR2PVvJx?= =?us-ascii?Q?6MyGzUFXB8gg0KxdH9O5/NbhvJeF0Ylyb7yVAiwVCg7jq0NFynXWUdjJorXy?= =?us-ascii?Q?RkGgGw5OcN0fT2zVBHK/iZOj8l9/ISU3LlZpLR19SWqNDn+3UemFn0ioynSj?= =?us-ascii?Q?5XL3khYUqCEJ5+ZyzxBE9QAhNt34MB+yEuv9/JUOJqi7fxBw7Se++FSvvos8?= =?us-ascii?Q?7S3EXl/0+36w4dWW9LdRkYbVwIwhl8Rx2VxG9+VhQQJgS4ihjQ6fpUVBZsBD?= =?us-ascii?Q?SoLoCx6pyxPCvrCtS8Z4yohJmr38zkPvbp5KDYKnNXyuwwa1ga29vwx6w3yx?= =?us-ascii?Q?7Qn1zQ5gdvUGkyQVgffzYqyhsa9PDm7BgfoVfpkGXotdyHNZqwhUiWhl4x95?= =?us-ascii?Q?BlPDn30pB7XEMX0CSf5hhqsodsRQru6oNMm2xzITbOxx63DXRH2kz6ypeyVE?= =?us-ascii?Q?enZPJyvwdLpa8fYUf9QSLCQZdsgq1VAAEy1SEhKj9E+xxef52FBbsZ2aBvHx?= =?us-ascii?Q?RGn3viDQbhgn2q6lRHFIeMsxwjF/sGUj5Byoggmx0lBP05nlX8tcufEe0M5k?= =?us-ascii?Q?nJPoq0RjXp3G+brN5scZsv7gu+3TjWhDpbHnzyupEXDhE1TIJuhbs7B4xknf?= =?us-ascii?Q?bJLJ4A15LEgeSljkxFE9m41+8nXHGASNvcWiVUwDQT4A6gsR4Di53bsc7ms3?= =?us-ascii?Q?2Q=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 09fc027b-548c-4d5b-f59c-08dc8e96a329 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jun 2024 06:28:01.5126 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: NLDvBPYqd/kKzlpJdhiK8NK5I46vozyHlWaD3lNzocsRartSLD5mDhHp+KgH2GVlTe4k58bnBV40f5TNUHh3iF4L/+EDNzjfyQCN8mTtgFs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW3PR13MB4106 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 From: Xinying Yu Setup the vring relay thread to monitor the interruption from device. And do the dirty page logging or notify device according to event data. Signed-off-by: Xinying Yu Reviewed-by: Chaoyong He Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- drivers/vdpa/nfp/nfp_vdpa.c | 148 +++++++++++++++++++++++++++++++ drivers/vdpa/nfp/nfp_vdpa_core.c | 9 ++ drivers/vdpa/nfp/nfp_vdpa_core.h | 2 + 3 files changed, 159 insertions(+) diff --git a/drivers/vdpa/nfp/nfp_vdpa.c b/drivers/vdpa/nfp/nfp_vdpa.c index 983123ba08..91f1b8d779 100644 --- a/drivers/vdpa/nfp/nfp_vdpa.c +++ b/drivers/vdpa/nfp/nfp_vdpa.c @@ -26,6 +26,8 @@ #define NFP_VDPA_USED_RING_LEN(size) \ ((size) * sizeof(struct vring_used_elem) + sizeof(struct vring_used)) +#define EPOLL_DATA_INTR 1 + struct nfp_vdpa_dev { struct rte_pci_device *pci_dev; struct rte_vdpa_device *vdev; @@ -777,6 +779,139 @@ update_datapath(struct nfp_vdpa_dev *device) return ret; } +static int +nfp_vdpa_vring_epoll_ctl(uint32_t queue_num, + struct nfp_vdpa_dev *device) +{ + int ret; + uint32_t qid; + struct epoll_event ev; + struct rte_vhost_vring vring; + + for (qid = 0; qid < queue_num; qid++) { + ev.events = EPOLLIN | EPOLLPRI; + rte_vhost_get_vhost_vring(device->vid, qid, &vring); + ev.data.u64 = qid << 1 | (uint64_t)vring.kickfd << 32; + ret = epoll_ctl(device->epoll_fd, EPOLL_CTL_ADD, vring.kickfd, &ev); + if (ret < 0) { + DRV_VDPA_LOG(ERR, "Epoll add error for queue %u", qid); + return ret; + } + } + + /* vDPA driver interrupt */ + for (qid = 0; qid < queue_num; qid += 2) { + ev.events = EPOLLIN | EPOLLPRI; + /* Leave a flag to mark it's for interrupt */ + ev.data.u64 = EPOLL_DATA_INTR | qid << 1 | + (uint64_t)device->intr_fd[qid] << 32; + ret = epoll_ctl(device->epoll_fd, EPOLL_CTL_ADD, + device->intr_fd[qid], &ev); + if (ret < 0) { + DRV_VDPA_LOG(ERR, "Epoll add error for queue %u", qid); + return ret; + } + + nfp_vdpa_update_used_ring(device, qid); + } + + return 0; +} + +static int +nfp_vdpa_vring_epoll_wait(uint32_t queue_num, + struct nfp_vdpa_dev *device) +{ + int i; + int fds; + int kickfd; + uint32_t qid; + struct epoll_event events[NFP_VDPA_MAX_QUEUES * 2]; + + for (;;) { + fds = epoll_wait(device->epoll_fd, events, queue_num * 2, -1); + if (fds < 0) { + if (errno == EINTR) + continue; + + DRV_VDPA_LOG(ERR, "Epoll wait fail"); + return -EACCES; + } + + for (i = 0; i < fds; i++) { + qid = events[i].data.u32 >> 1; + kickfd = (uint32_t)(events[i].data.u64 >> 32); + + nfp_vdpa_read_kickfd(kickfd); + if ((events[i].data.u32 & EPOLL_DATA_INTR) != 0) { + nfp_vdpa_update_used_ring(device, qid); + nfp_vdpa_irq_unmask(&device->hw); + } else { + nfp_vdpa_notify_queue(&device->hw, qid); + } + } + } + + return 0; +} + +static uint32_t +nfp_vdpa_vring_relay(void *arg) +{ + int ret; + int epoll_fd; + uint16_t queue_id; + uint32_t queue_num; + struct nfp_vdpa_dev *device = arg; + + epoll_fd = epoll_create(NFP_VDPA_MAX_QUEUES * 2); + if (epoll_fd < 0) { + DRV_VDPA_LOG(ERR, "failed to create epoll instance."); + return 1; + } + + device->epoll_fd = epoll_fd; + + queue_num = rte_vhost_get_vring_num(device->vid); + + ret = nfp_vdpa_vring_epoll_ctl(queue_num, device); + if (ret != 0) + goto notify_exit; + + /* Start relay with a first kick */ + for (queue_id = 0; queue_id < queue_num; queue_id++) + nfp_vdpa_notify_queue(&device->hw, queue_id); + + ret = nfp_vdpa_vring_epoll_wait(queue_num, device); + if (ret != 0) + goto notify_exit; + + return 0; + +notify_exit: + close(device->epoll_fd); + device->epoll_fd = -1; + + return 1; +} + +static int +nfp_vdpa_setup_vring_relay(struct nfp_vdpa_dev *device) +{ + int ret; + char name[RTE_THREAD_INTERNAL_NAME_SIZE]; + + snprintf(name, sizeof(name), "nfp_vring%d", device->vid); + ret = rte_thread_create_internal_control(&device->tid, name, + nfp_vdpa_vring_relay, (void *)device); + if (ret != 0) { + DRV_VDPA_LOG(ERR, "Failed to create vring relay pthread."); + return -EPERM; + } + + return 0; +} + static int nfp_vdpa_sw_fallback(struct nfp_vdpa_dev *device) { @@ -803,10 +938,17 @@ nfp_vdpa_sw_fallback(struct nfp_vdpa_dev *device) if (ret != 0) goto unset_intr; + /* Setup vring relay thread */ + ret = nfp_vdpa_setup_vring_relay(device); + if (ret != 0) + goto stop_vf; + device->hw.sw_fallback_running = true; return 0; +stop_vf: + nfp_vdpa_stop(device, true); unset_intr: nfp_vdpa_disable_vfio_intr(device); error: @@ -860,6 +1002,12 @@ nfp_vdpa_dev_close(int vid) /* Reset VF */ nfp_vdpa_stop(device, true); + /* Remove interrupt setting */ + nfp_vdpa_disable_vfio_intr(device); + + /* Unset DMA map for guest memory */ + nfp_vdpa_dma_map(device, false); + device->hw.sw_fallback_running = false; rte_atomic_store_explicit(&device->dev_attached, 0, diff --git a/drivers/vdpa/nfp/nfp_vdpa_core.c b/drivers/vdpa/nfp/nfp_vdpa_core.c index d7c48e2490..3b3481a99c 100644 --- a/drivers/vdpa/nfp/nfp_vdpa_core.c +++ b/drivers/vdpa/nfp/nfp_vdpa_core.c @@ -270,3 +270,12 @@ nfp_vdpa_notify_queue(struct nfp_vdpa_hw *vdpa_hw, nfp_qcp_notify_ptr_add(vdpa_hw->notify_addr[qid], NFP_QCP_NOTIFY_WRITE_PTR, qid); } + +void nfp_vdpa_irq_unmask(struct nfp_vdpa_hw *vdpa_hw) +{ + struct nfp_hw *hw = &vdpa_hw->super; + + /* Make sure all updates are written before un-masking */ + rte_wmb(); + nn_cfg_writeb(hw, NFP_NET_CFG_ICR(1), NFP_NET_CFG_ICR_UNMASKED); +} diff --git a/drivers/vdpa/nfp/nfp_vdpa_core.h b/drivers/vdpa/nfp/nfp_vdpa_core.h index a339ace601..bc4db556a2 100644 --- a/drivers/vdpa/nfp/nfp_vdpa_core.h +++ b/drivers/vdpa/nfp/nfp_vdpa_core.h @@ -60,4 +60,6 @@ void nfp_vdpa_notify_queue(struct nfp_vdpa_hw *vdpa_hw, uint16_t qid); uint64_t nfp_vdpa_get_queue_notify_offset(struct nfp_vdpa_hw *vdpa_hw, int qid); +void nfp_vdpa_irq_unmask(struct nfp_vdpa_hw *vdpa_hw); + #endif /* __NFP_VDPA_CORE_H__ */ -- 2.39.1