From patchwork Wed Mar 29 11:42:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Mi X-Patchwork-Id: 1762718 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::136; helo=smtp3.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=kGvMmoF/; dkim-atps=neutral Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Pml7l70Ybz1yYr for ; Wed, 29 Mar 2023 22:44:03 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 3C69A614C9; Wed, 29 Mar 2023 11:44:02 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 3C69A614C9 Authentication-Results: smtp3.osuosl.org; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=kGvMmoF/ X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id AzSQ4rDLlIBI; Wed, 29 Mar 2023 11:44:01 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp3.osuosl.org (Postfix) with ESMTPS id 34B6A614A3; Wed, 29 Mar 2023 11:44:00 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 34B6A614A3 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E5843C0036; Wed, 29 Mar 2023 11:43:59 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 14D08C002F for ; Wed, 29 Mar 2023 11:43:58 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 1093F41D4F for ; Wed, 29 Mar 2023 11:43:43 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 1093F41D4F Authentication-Results: smtp2.osuosl.org; dkim=pass (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=kGvMmoF/ X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 53RDkIDzoF-o for ; Wed, 29 Mar 2023 11:43:41 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org BC25F41D40 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on20601.outbound.protection.outlook.com [IPv6:2a01:111:f400:7eae::601]) by smtp2.osuosl.org (Postfix) with ESMTPS id BC25F41D40 for ; Wed, 29 Mar 2023 11:43:40 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=A1TRsQxCSKgnNipLGc8FmIuypSm0fU13qHQhBb7IVMXebMtxOB/LmHY18bWCtUi2hlijlMHVBw2re9hUMTWO2scwZ2kYLLzMex1Yy1by1MbHSirurPqarZZbyKBgcieBm0MRyXC6bqfK9GGA1fBep/QBVx8ZAu6faL905VZhOD79IuWA2Xa15O1BBZokFsuYrh7Md+RaplK1pI5GoX9zQS3yJNKRrw99uoxDeBdWt20FlUld7DXb/rth/9euhEkJw4G4lm9/w4OAoKdl++e4KNDp080/eNNPZwgpYkREoruah1JV9qtH19Cj4BshMRHtLUy3aaPBXUQsBGvMZ8M3ng== 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=ChO+WxZuHavWAXQsDVbPCTd9Tet2WNiHREBGtXdnKUY=; b=Zz+toGdWmOk4tyCKxZ08HSu4u2hyfrhKrImUZE8Aw5F35sk0JbCCx9fEsEMSEiWjz4MUO4/hBe/u1i3/TjplIszL+kb6diDzxshfUdOSk99UNLAbAZrMidAfUIjBMsazS9360GaaahnhsDUZ0uJRqSs9x584G0lqkKWIkw74qKtzAjidAV3u8wwaJCW6XOG6njBQnehZeKW6Xh2WTjv8wcbIYDIlh/xUHdbU8YTAhXvTIwGnX+jq+8ThbUq8eSRuDouUojgSbqAfI+D06N36M/Qsqdu6b5d8zVZKFcBsc2rXNykOHfDIZ7CjARKAbTB/kS6CRnpxRIGFGmDiWuQ57g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=openvswitch.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ChO+WxZuHavWAXQsDVbPCTd9Tet2WNiHREBGtXdnKUY=; b=kGvMmoF/R+SRfI6hOXxNyf4kpFwAXL6Xd011PQjpBuEk08OPio+UA9ZOgxrSo1K9gxCD/N1DTzXj2ssom0HBV6XvcYaYpbz0o+ZlGSJ7UtUapdEnBMDp5uWE0X+riP94rMBGCtgTr4tRP2yzsPwmy2T9oWxx2Br1o4ve/HLjnHD5ueqI8gjz3aNHIGFNP7916aejnc0uG1IJBJxukY2Oz9bTwlhqO1DAiOyq1/SHUj1w5UHkfqU8fJpKfoYwjJ8dNBBA3rmZh8z9DWk/aIHAYJ4fOsNbxqJ8PXZEgqBFRZNJAsYFG51KNowZJLbuuHDyCjqLYtCcWnPwsCoIDdOTnw== Received: from MW4PR03CA0132.namprd03.prod.outlook.com (2603:10b6:303:8c::17) by SN7PR12MB7276.namprd12.prod.outlook.com (2603:10b6:806:2af::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6222.30; Wed, 29 Mar 2023 11:43:37 +0000 Received: from CO1NAM11FT016.eop-nam11.prod.protection.outlook.com (2603:10b6:303:8c:cafe::fc) by MW4PR03CA0132.outlook.office365.com (2603:10b6:303:8c::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6254.20 via Frontend Transport; Wed, 29 Mar 2023 11:43:37 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by CO1NAM11FT016.mail.protection.outlook.com (10.13.175.141) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6222.22 via Frontend Transport; Wed, 29 Mar 2023 11:43:37 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.5; Wed, 29 Mar 2023 04:43:25 -0700 Received: from rnnvmail203.nvidia.com (10.129.68.9) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.37; Wed, 29 Mar 2023 04:43:25 -0700 Received: from c-237-115-60-065.mtl.labs.mlnx (10.127.8.10) by mail.nvidia.com (10.129.68.9) with Microsoft SMTP Server id 15.2.986.5 via Frontend Transport; Wed, 29 Mar 2023 04:43:22 -0700 To: Date: Wed, 29 Mar 2023 14:42:57 +0300 Message-ID: <20230329114259.110297-7-cmi@nvidia.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: <20230329114259.110297-1-cmi@nvidia.com> References: <20230329114259.110297-1-cmi@nvidia.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT016:EE_|SN7PR12MB7276:EE_ X-MS-Office365-Filtering-Correlation-Id: ec62a03f-13f7-4d99-4a03-08db304ad5c0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Zs7MTiRZk01UxFMSFXXfNQ1YFdxAsRyI9BLYvjJoAD8ZYLY3Er60MfYcM1U/SbHWLUcgS9VDDrtmhvbUsrs9dc5c4Qy6YemvBgUfr7qTrZ6kPjbHBKRE6boyGhFd/UB6Mv6rDfsNsNrIX4TXIjIU9ECzHPgXcrKIifCmRz7G3CQFPWRGA1ZzsZqplWX1qah/wCtkERB09hkthxNuqJvZRxRfeUJlmFRcCS6+z1ueY8R4LuDI6Jt4Qw1V/uG6f2kGuwnk3HZxV81MvCwlICRQU+REJThR25mfer0qVzkG7i5XN2iZkO7FJYs2zkFq/k1JmtAejD/n8Hm7jwhejqkT3g3wYRx3zmrOBVBkPfMCK6vpV/3whS404IiTCubxNX9Fs4JYDn4q9c5ChK0teyN+TAqeXog2edG2badnLVlRy8Vfqf1a7Z+0w5EybX3qhUVFYfhFv+MgF/hf57IHbjNmaz43h6awj1qanCXBFlLH9mg+/0GjXenGeQvD2F3RpBYM399Ap7mRM2Ya7KJbFIg95Ic/gJKQMF/p0DDNQdTvI7HiEVezX+PYL0QRUzcNFOog0p8Yg7DhIHZzinHpHqpsGIAidHUMEalRexvQtXkT+KM51XeQRNmPmXYtPB1tdXIFad6lZywV05/eKIKojKPPpb+QkjdBr94FHMqvssL6PnNixY49T+UYGL82dDs5vRGfCw3YX84etUOATjV8iAJp716k8i/wjManM6BPVwUPDIVbThmdkXZ48w7GIHtG8Psk+24mm7WlmLOZn8YsyKaWGrCqoHY+1tADL+R+LzeMmTY= X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230028)(4636009)(396003)(376002)(346002)(39860400002)(136003)(451199021)(46966006)(40470700004)(36840700001)(478600001)(40460700003)(41300700001)(8676002)(36860700001)(6916009)(34020700004)(70206006)(316002)(70586007)(5660300002)(82740400003)(7636003)(8936002)(186003)(356005)(26005)(47076005)(54906003)(2616005)(336012)(6666004)(107886003)(426003)(83380400001)(1076003)(4326008)(86362001)(2906002)(36756003)(82310400005)(40480700001)(66899021); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Mar 2023 11:43:37.3981 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ec62a03f-13f7-4d99-4a03-08db304ad5c0 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT016.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7276 Cc: elibr@nvidia.com, simon.horman@corigine.com, roniba@nvidia.com, i.maximets@ovn.org, konguyen@redhat.com, majd@nvidia.com, maord@nvidia.com Subject: [ovs-dev] [PATCH v26 6/8] dpif-netlink: Add netdev offload recv in normal recv upcalls X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Chris Mi via dev From: Chris Mi Reply-To: Chris Mi Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" In thread handler 0, add netdev offload recv in normal recv upcalls. To avoid starvation, introduce a flag to alternate the order of receiving normal upcalls and offload upcalls based on that flag. Add similar change for recv_wait. Signed-off-by: Chris Mi Reviewed-by: Roi Dayan --- lib/dpif-netlink.c | 41 ++++++++++++++++++++++++++++++----- ofproto/ofproto-dpif-upcall.c | 15 +++++++++---- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index ebe7b5cb1..4e56922f8 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -201,6 +201,11 @@ struct dpif_handler { struct nl_sock *sock; /* Each handler thread holds one netlink socket. */ + /* The receive handler thread deals with both normal and offload receive + * upcalls. To avoid starvation, the below flag is used to alternate the + * processing order. */ + bool recv_offload_first; + #ifdef _WIN32 /* Pool of sockets. */ struct dpif_windows_vport_sock *vport_sock_pool; @@ -3005,7 +3010,6 @@ dpif_netlink_recv_windows(struct dpif_netlink *dpif, uint32_t handler_id, static int dpif_netlink_recv_cpu_dispatch(struct dpif_netlink *dpif, uint32_t handler_id, struct dpif_upcall *upcall, struct ofpbuf *buf) - OVS_REQ_RDLOCK(dpif->upcall_lock) { struct dpif_handler *handler; int read_tries = 0; @@ -3056,7 +3060,6 @@ dpif_netlink_recv_vport_dispatch(struct dpif_netlink *dpif, uint32_t handler_id, struct dpif_upcall *upcall, struct ofpbuf *buf) - OVS_REQ_RDLOCK(dpif->upcall_lock) { struct dpif_handler *handler; int read_tries = 0; @@ -3130,13 +3133,12 @@ dpif_netlink_recv_vport_dispatch(struct dpif_netlink *dpif, #endif static int -dpif_netlink_recv(struct dpif *dpif_, uint32_t handler_id, - struct dpif_upcall *upcall, struct ofpbuf *buf) +dpif_netlink_recv__(struct dpif_netlink *dpif, uint32_t handler_id, + struct dpif_upcall *upcall, struct ofpbuf *buf) + OVS_REQ_RDLOCK(dpif->upcall_lock) { - struct dpif_netlink *dpif = dpif_netlink_cast(dpif_); int error; - fat_rwlock_rdlock(&dpif->upcall_lock); #ifdef _WIN32 error = dpif_netlink_recv_windows(dpif, handler_id, upcall, buf); #else @@ -3147,6 +3149,32 @@ dpif_netlink_recv(struct dpif *dpif_, uint32_t handler_id, handler_id, upcall, buf); } #endif + + return error; +} + +static int +dpif_netlink_recv(struct dpif *dpif_, uint32_t handler_id, + struct dpif_upcall *upcall, struct ofpbuf *buf) +{ + struct dpif_netlink *dpif = dpif_netlink_cast(dpif_); + struct dpif_handler *handler; + int error; + + fat_rwlock_rdlock(&dpif->upcall_lock); + handler = &dpif->handlers[handler_id]; + if (handler->recv_offload_first) { + error = netdev_offload_recv(upcall, buf, handler_id); + if (error == EAGAIN) { + error = dpif_netlink_recv__(dpif, handler_id, upcall, buf); + } + } else { + error = dpif_netlink_recv__(dpif, handler_id, upcall, buf); + if (error == EAGAIN) { + error = netdev_offload_recv(upcall, buf, handler_id); + } + } + handler->recv_offload_first = !handler->recv_offload_first; fat_rwlock_unlock(&dpif->upcall_lock); return error; @@ -3211,6 +3239,7 @@ dpif_netlink_recv_wait(struct dpif *dpif_, uint32_t handler_id) } else { dpif_netlink_recv_wait_vport_dispatch(dpif, handler_id); } + netdev_offload_recv_wait(handler_id); #endif fat_rwlock_unlock(&dpif->upcall_lock); } diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index cd57fdbd9..0b3ef30a0 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -855,10 +855,17 @@ recv_upcalls(struct handler *handler) break; } - upcall->fitness = odp_flow_key_to_flow(dupcall->key, dupcall->key_len, - flow, NULL); - if (upcall->fitness == ODP_FIT_ERROR) { - goto free_dupcall; + /* If key and key_len are available, use them to construct flow. + * Otherwise, use upcall->flow. */ + if (dupcall->key && dupcall->key_len) { + upcall->fitness = odp_flow_key_to_flow(dupcall->key, + dupcall->key_len, + flow, NULL); + if (upcall->fitness == ODP_FIT_ERROR) { + goto free_dupcall; + } + } else { + flow = &dupcall->flow; } if (dupcall->mru) {