From patchwork Mon Jun 19 05:05:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Mi X-Patchwork-Id: 1796317 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::138; helo=smtp1.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=M6kXb8GH; dkim-atps=neutral Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) (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 4QkyS56HkYz20Wk for ; Mon, 19 Jun 2023 15:07:17 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id D59C282043; Mon, 19 Jun 2023 05:07:14 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org D59C282043 Authentication-Results: smtp1.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=M6kXb8GH X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hJDeaZqNsQr0; Mon, 19 Jun 2023 05:07:12 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp1.osuosl.org (Postfix) with ESMTPS id 1F03F8206E; Mon, 19 Jun 2023 05:07:11 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 1F03F8206E Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B19D4C008E; Mon, 19 Jun 2023 05:07:08 +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 12765C007A for ; Mon, 19 Jun 2023 05:07:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id E2B1F40B98 for ; Mon, 19 Jun 2023 05:06:37 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org E2B1F40B98 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=M6kXb8GH 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 uL7w69YbhxaP for ; Mon, 19 Jun 2023 05:06:37 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org D2CE140BB1 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 D2CE140BB1 for ; Mon, 19 Jun 2023 05:06:36 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HgRUjeiAD8sEUKmgpCkXVCRGs9JHTEJhg2lKme4975udBx9rOJrhBdgTXLKdiZHy9urnwzALG89xyH2Pwx8PGB3iHusA1STjv5mxaXMdgWQxGh9h0TB6ozTox3//iNcTdlGjeQvD/JiP5batvkKPriK2G1WEwNiJmb+A1OgxWR5N8s5XrJ3H2u0eiPx3DYXwYbU1IZY2UE6meqQCUq99VsfvZ/VyUBCjHHsneNFJaFkoHbMW4PZcOjlNQ8dzjuFTDDEd01RWuRuI1IpfMkSka7oMb9Gl/XO2rJtWPnH3Y61u+dmH3zlXOe8eYercask3A67loGDhLkxMWiEHInt8xw== 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=hlI2SsuK1p2EBr02eQQfH+8+z9nAOu0o7Rbp3Na6dhc=; b=f64DGurZ2iVMKWXwA3ftOt8gqC+dT/Uy1O+uMm22aUzxqeTQgwF8ZXS1GJXGLN8xAn2quD+dRtsgK9nm6ReV8xtJkOfag4IMWcTIpzX1Irg9+ibsLRVajEA+OsGu6AO/Xy6/sdfSp4qx//mGY7gvmy9LMnnUheMmEDwueDP2CM8h9H1+Y8Z0OziPBZ1bC9T9eYBotQwkfhOriVnEuZ9MR6kf5N+RiszHXfeifeqs+XuepdZwfZVYLLTE805CoPws0s/uBGaK4eiqrDCqDs7AYz9SEvB38jDedfmj7TZctaQjVxm7TxKowwIW2w0u9e64vd1C4vFY4CIbK5ZwB8PYOQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) 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=hlI2SsuK1p2EBr02eQQfH+8+z9nAOu0o7Rbp3Na6dhc=; b=M6kXb8GHOoGjhE3YCbq8H9iJxJkznCrfYhO4Y3DE6Ny6YFbf6+2KO3srkRLjsTnifz+YrOV6505BOQvi5r/52Pk9I0OviPx+MiIiTQCjS8u3I51zi/kg0IhPbnS4oPX23xP/ITmFMTE70f4/OlVgsFABOPdrheA9GnVbLHs9LXHKh+0c+ISuTkBdpqFzOqnS43ylALXqp08P0JujfcjOeKGX9ivc/uVSwdsKMaHg5teoHq21z5ZX7VD2enPCTf14N0gjSYP9s+gUAvU5jXWywDyLDFklBrg4bpxWi5xF979PNSghoVu9syjnaeNFrTO9llKA2UHulHzBpw/sfT7iiw== Received: from BN1PR12CA0002.namprd12.prod.outlook.com (2603:10b6:408:e1::7) by IA1PR12MB6187.namprd12.prod.outlook.com (2603:10b6:208:3e5::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6500.37; Mon, 19 Jun 2023 05:06:34 +0000 Received: from BN8NAM11FT023.eop-nam11.prod.protection.outlook.com (2603:10b6:408:e1:cafe::d) by BN1PR12CA0002.outlook.office365.com (2603:10b6:408:e1::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6500.37 via Frontend Transport; Mon, 19 Jun 2023 05:06:34 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) 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.118.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by BN8NAM11FT023.mail.protection.outlook.com (10.13.177.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6500.36 via Frontend Transport; Mon, 19 Jun 2023 05:06:33 +0000 Received: from drhqmail202.nvidia.com (10.126.190.181) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.5; Sun, 18 Jun 2023 22:06:23 -0700 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail202.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.37; Sun, 18 Jun 2023 22:06:23 -0700 Received: from c-237-115-160-164.mtl.labs.mlnx (10.127.8.13) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.986.37 via Frontend Transport; Sun, 18 Jun 2023 22:06:20 -0700 To: Date: Mon, 19 Jun 2023 08:05:55 +0300 Message-ID: <20230619050557.310690-7-cmi@nvidia.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: <20230619050557.310690-1-cmi@nvidia.com> References: <20230619050557.310690-1-cmi@nvidia.com> MIME-Version: 1.0 X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN8NAM11FT023:EE_|IA1PR12MB6187:EE_ X-MS-Office365-Filtering-Correlation-Id: a3827cfd-1669-429a-2d43-08db7082f3c0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: QUUWVbZuQfrLAmWp2IRBfmN2LHeZfI9jzvUuRDN4FtAOsHnjzTYiV0KAAroxhppk+GQR19eGSbvesGLe3F5JfMN4VjraxXuRQR8c4PSVWDHgp54ZoO2uwiDkm6ZQxa2AacBtdN+Gilg5y0QyLZvgxL1okMafye6/OG1iQWlTZ4YjdHfy/QQ0k4zQik3fjZiU8utn9YQyKZ2bYqVyWiL6tSJr/nXnVLoZ+NpCfBpxXtjR/YzXJIv78h4Um/ho9JLtPuasKztjpohciwj4f57YCJt+wtaDXR1HghkVylvQ7x6QPdog8txBE6XHNGh/o6sEP1F9DgTk2W9yfINr4aScqyh7GqBtUcgN/e2ltsLpY8ZD3txP3tkslNJTaF1EWPZjp7XQfNeb7cGiQvWo3mmqhDjiDtjddkHt6gJqmE4yAqnvIYrs9h4j3cGItG2DcvfOUoDONZniwAob1LZeic2+pZr3Uy37MS5d1Du9OQX2DGy/Rq0f4VXN+aBipVYzTDC0nV90rKhCZy+jJD5ed7Qgj2y3jwyvNN+kc5XLS2EnjAeKgEueumNJXCZWETIDG+Npj4yisq5tCsCgb/EUpoXdnfjdB+Yk8ZIodQIKW+wrGSE4AlWBOIsaBvLuBgsSsmrMSI0XZENpb0bMFuAV/TJMK4vGR7cIyOK/KUhXWsEXvsLNbttC+oANm/M9d+tjKujOcdRuRtknvTaa8OnmhPYXzddUz0GzQYY54NKzx4B/nGQ11RxHNj1sqxq2dgcycNTQ X-Forefront-Antispam-Report: CIP:216.228.118.232; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc7edge1.nvidia.com; CAT:NONE; SFS:(13230028)(4636009)(396003)(136003)(346002)(39860400002)(376002)(451199021)(46966006)(36840700001)(40470700004)(86362001)(54906003)(40480700001)(8676002)(26005)(40460700003)(41300700001)(186003)(2616005)(426003)(70206006)(70586007)(4326008)(6916009)(83380400001)(66899021)(82310400005)(316002)(5660300002)(1076003)(47076005)(36756003)(6666004)(107886003)(2906002)(36860700001)(336012)(82740400003)(7636003)(8936002)(478600001)(356005); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2023 05:06:33.8543 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a3827cfd-1669-429a-2d43-08db7082f3c0 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.118.232]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT023.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6187 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 v28 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 Acked-by: Eelco Chaudron --- 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 60bd39643..6e7b644e8 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; @@ -3010,7 +3015,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; @@ -3061,7 +3065,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; @@ -3135,13 +3138,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 @@ -3152,6 +3154,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; @@ -3217,6 +3245,7 @@ dpif_netlink_recv_wait(struct dpif *dpif_, uint32_t handler_id) dpif_netlink_recv_wait_vport_dispatch(dpif, handler_id); } #endif + netdev_offload_recv_wait(handler_id); fat_rwlock_unlock(&dpif->upcall_lock); } diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 04b583f81..c1fad9a8f 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) {