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 21AC1A0C57 for ; Tue, 30 Nov 2021 13:17:44 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1917B410F7; Tue, 30 Nov 2021 13:17:44 +0100 (CET) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2086.outbound.protection.outlook.com [40.107.223.86]) by mails.dpdk.org (Postfix) with ESMTP id 21F6E410F7 for ; Tue, 30 Nov 2021 13:17:43 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SppNJkB6uotxDCEW7R/5OByC6Dq6o5cL9ZhrlqRRq8Q86ZGgi/mODFFnanrZ7tw1ouBeLRnAdFQgGwfRoTVBd6Oj00ulQxogtAbt4LMcj5CWYGEc784JD/G0g0Iyb/Tl1dMRZV3ipEIUdPdZUjSQSJSGctuNvoNvcSF7CKZIVTIse4vYYL5S/lgG6sJdObuRc0UTeS/v7ZW+Weu7yQa5cgwUuWfQnRdtAvFOYX1Rvx6cN6CQgxljOCX0ScjMgIto3wf1G3DeI0aQTHPYipJnkNsMBeWhmfk0ocBee7kcpSyZZzlwgp+9RaJvdMoTLlM7aHoLt9e6Q6ChvrD+0aCXkw== 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=NPJEbd15+4jJ/nJpi2DykoPQhlE3JqGnLz0Z+d2fJSQ=; b=R3Y0TiMa0mFL/1Zr5T4slGbjFHMJr1OJQMjnPUH+DbZhwWW9/+ukRi4nCErF37iMkNeu83zXXsctC+tN5nNEXmq7EZMwGHEMvaYk+tKbKktuHIgcL0vE4u1EiYnCYfrRzrLYP2u+2Df9drRWoYOkIdGTNId1t5cqgJ+0kWZtJiTzhyFVEO4SmpNG70el46jfiFpX80Nzcd939lH2xT5F1l7ik44ytmpCpudr3EEi+wNGN7Aow1BNy3ixxNJdWPW5gkjULwHPwgA/vhQ2mZjvzk+YRdh4j1qhIog646mhcmVD/TbrcBJw372kTdf597HCnloJJilAahDF7O0aM+Lc1Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.35) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com; dmarc=pass (p=quarantine sp=quarantine 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=NPJEbd15+4jJ/nJpi2DykoPQhlE3JqGnLz0Z+d2fJSQ=; b=SMbuNpWB6KKZkGYveVsu1imwN+EAEKfuqcshnXGEMO1re/TMF+s9jy+7c8nbVsodsgMVCrZ86DS+kis5rdwB3ANACoGd1y7A8rOlZge4cliqB3UQ6XQqnGCgxpta3TvPSsZO9V541djShCcuxlw8slw/RgCF1a0Cy+snQn9Zz9x6znpIGZyEhfQbNpZ42jYObk5wxG1yoWXdaDvIfcTaa6MGTR4cJjFppJGr9/UUR0tk5COS7bf0Ny0wvTQvx0rWUj/RdBs/h0JAmDdWaR91o/D7yDrSxUSpGE77R9qw9Fs/7P4rCu7pF6wPE3gTWUEGQc7n5E4SW+A1Um6cqlG0ww== Received: from MW4PR03CA0188.namprd03.prod.outlook.com (2603:10b6:303:b8::13) by CH2PR12MB5017.namprd12.prod.outlook.com (2603:10b6:610:36::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4734.22; Tue, 30 Nov 2021 12:17:41 +0000 Received: from CO1NAM11FT032.eop-nam11.prod.protection.outlook.com (2603:10b6:303:b8:cafe::f0) by MW4PR03CA0188.outlook.office365.com (2603:10b6:303:b8::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4734.23 via Frontend Transport; Tue, 30 Nov 2021 12:17:41 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.35) 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.112.35 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.35; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.35) by CO1NAM11FT032.mail.protection.outlook.com (10.13.174.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4734.22 via Frontend Transport; Tue, 30 Nov 2021 12:17:41 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by HQMAIL111.nvidia.com (172.20.187.18) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Tue, 30 Nov 2021 12:17:40 +0000 Received: from nvidia.com (172.20.187.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.986.5; Tue, 30 Nov 2021 04:17:39 -0800 From: Lior Margalit To: Matan Azrad CC: Lior Margalit , Subject: [PATCH 20.11 4/5] net/mlx5: fix RSS expansion for L2/L3 VXLAN Date: Tue, 30 Nov 2021 14:17:13 +0200 Message-ID: <20211130121714.4170879-4-lmargalit@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211130121714.4170879-1-lmargalit@nvidia.com> References: <20211130121714.4170879-1-lmargalit@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [172.20.187.6] X-ClientProxiedBy: HQMAIL111.nvidia.com (172.20.187.18) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c82037f8-9a94-4da0-c41a-08d9b3fb680b X-MS-TrafficTypeDiagnostic: CH2PR12MB5017: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:747; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 04XxI33CEfvNvjo18ETMUuylQQLwdMHs/6B3MsN8VyGCj+uQMG7wV31RmDPUPFBAtfw5fCm3xT5e5izwfJyiiEWKCXABKTtJdDb7ITQqui2hD8+qnmYpuOdUumcppVPE7qrBj6SZFTmG/Ocz9YhgS0e+pI2LDag61ink06Ixi/kq0eCD6eR2XepwtCwCwmjy4rh5elj48TgRGGPVU/v2F2yh7l4gCVAee7psqm92iXaNV3OANla9+GLswKBL2uUaXAU9gyT69fPs5USrA5vgm3NeDx3ZyVExM1c3F5n7TMnM3cWZpy3bITmhA9Jvl5jBTUZdH1rjI93MSr1pzsSS2QTBF+J9spj6crdvO05Hv210/2AogUE8Z2poQr7BcRXoSymFERDWL3cWv5JhWLkCxt9oFTFGoYTGWNrdJT6CQZKWCaoU/dclLyMQb5dBgGe/u8TvtoK0B/M8F0fT2dJIi5O49IVCM5nXQKNfwzn870rLHqpJECLrvzf5OX1G/d3U79q8X/jCjBjVKd+PUQQHZyZ4XgsAFpGsXBl8Q0MHp7FOPgN1nRNJgs5f12saewCU4t8wwLecFug4YQ/4uozNbIBX3IyLI34bF9Ek57BPAM5YWaUYlv+Rfyhhgl9L5qoK/Z8QAWbkDguM8R6ZjLf2M2pCj4t+7NTctQIi4bMNFPSMGQMyQS847Dd5OyPkfme8N+MbKspjQUqwAA9CTvs25lBHeWSn1VJJjfDnQ1BuNZ/k8nbgswio+xABvWZfyHVSs6h2kxA+1rW7wpzY2ZWnXQ== X-Forefront-Antispam-Report: CIP:216.228.112.35; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid04.nvidia.com; CAT:NONE; SFS:(4636009)(36840700001)(46966006)(40470700001)(7636003)(8676002)(47076005)(55016003)(86362001)(2616005)(82310400004)(26005)(37006003)(54906003)(6286002)(7696005)(70586007)(6666004)(186003)(5660300002)(16526019)(70206006)(36860700001)(6862004)(1076003)(8936002)(83380400001)(508600001)(336012)(4326008)(6636002)(2906002)(36756003)(356005)(40460700001)(426003)(316002); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2021 12:17:41.2441 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c82037f8-9a94-4da0-c41a-08d9b3fb680b X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.35]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT032.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR12MB5017 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org [ upstream commit 0c3fa683964ead2597a542e8dccb87b23343a15f ] The RSS expansion algorithm is using a graph to find the possible expansion paths. The current implementation does not differentiate between standard (L2) VXLAN and L3 VXLAN. As result the flow is expanded with all possible paths. For example: testpmd> flow create... / vxlan / end actions rss level 2 / end It is currently expanded to the following paths: ETH IPV4 UDP VXLAN END ETH IPV4 UDP VXLAN ETH IPV4 END ETH IPV4 UDP VXLAN ETH IPV6 END ETH IPV4 UDP VXLAN IPV4 END ETH IPV4 UDP VXLAN IPV6 END The fix is to adjust the expansion according to the outer UDP destination port. In case flow pattern defines a match on the standard udp port, 4789, or does not define a match on the destination port, which also implies setting the standard one, the expansion for the above example will be: ETH IPV4 UDP VXLAN END ETH IPV4 UDP VXLAN ETH IPV4 END ETH IPV4 UDP VXLAN ETH IPV6 END Otherwise, the expansion will be: ETH IPV4 UDP VXLAN END ETH IPV4 UDP VXLAN IPV4 END ETH IPV4 UDP VXLAN IPV6 END Fixes: f4f06e361516 ("net/mlx5: add flow VXLAN item") Cc: stable@dpdk.org Signed-off-by: Lior Margalit Acked-by: Matan Azrad --- drivers/net/mlx5/mlx5_flow.c | 71 +++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 5cebd5ed6f..befad22cbb 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -132,6 +132,12 @@ struct mlx5_flow_expand_rss { static void mlx5_dbg__print_pattern(const struct rte_flow_item *item); +static const struct mlx5_flow_expand_node * +mlx5_flow_expand_rss_adjust_node(const struct rte_flow_item *pattern, + unsigned int item_idx, + const struct mlx5_flow_expand_node graph[], + const struct mlx5_flow_expand_node *node); + static bool mlx5_flow_is_rss_expandable_item(const struct rte_flow_item *item) { @@ -341,7 +347,7 @@ mlx5_flow_expand_rss(struct mlx5_flow_expand_rss *buf, size_t size, const int *stack[MLX5_RSS_EXP_ELT_N]; int stack_pos = 0; struct rte_flow_item flow_items[MLX5_RSS_EXP_ELT_N]; - unsigned int i; + unsigned int i, item_idx, last_expand_item_idx = 0; size_t lsize; size_t user_pattern_size = 0; void *addr = NULL; @@ -349,7 +355,7 @@ mlx5_flow_expand_rss(struct mlx5_flow_expand_rss *buf, size_t size, struct rte_flow_item missed_item; int missed = 0; int elt = 0; - const struct rte_flow_item *last_item = NULL; + const struct rte_flow_item *last_expand_item = NULL; memset(&missed_item, 0, sizeof(missed_item)); lsize = offsetof(struct mlx5_flow_expand_rss, entry) + @@ -360,12 +366,15 @@ mlx5_flow_expand_rss(struct mlx5_flow_expand_rss *buf, size_t size, buf->entry[0].pattern = (void *)&buf->entry[MLX5_RSS_EXP_ELT_N]; buf->entries = 0; addr = buf->entry[0].pattern; - for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) { + for (item = pattern, item_idx = 0; + item->type != RTE_FLOW_ITEM_TYPE_END; + item++, item_idx++) { if (!mlx5_flow_is_rss_expandable_item(item)) { user_pattern_size += sizeof(*item); continue; } - last_item = item; + last_expand_item = item; + last_expand_item_idx = item_idx; i = 0; while (node->next && node->next[i]) { next = &graph[node->next[i]]; @@ -397,7 +406,7 @@ mlx5_flow_expand_rss(struct mlx5_flow_expand_rss *buf, size_t size, * Check if the last valid item has spec set, need complete pattern, * and the pattern can be used for expansion. */ - missed_item.type = mlx5_flow_expand_rss_item_complete(last_item); + missed_item.type = mlx5_flow_expand_rss_item_complete(last_expand_item); if (missed_item.type == RTE_FLOW_ITEM_TYPE_END) { /* Item type END indicates expansion is not required. */ return lsize; @@ -432,6 +441,9 @@ mlx5_flow_expand_rss(struct mlx5_flow_expand_rss *buf, size_t size, addr = (void *)(((uintptr_t)addr) + elt * sizeof(*item)); } + } else if (last_expand_item != NULL) { + node = mlx5_flow_expand_rss_adjust_node(pattern, + last_expand_item_idx, graph, node); } memset(flow_items, 0, sizeof(flow_items)); next_node = mlx5_flow_expand_rss_skip_explicit(graph, @@ -518,6 +530,8 @@ enum mlx5_expansion { MLX5_EXPANSION_OUTER_IPV6_UDP, MLX5_EXPANSION_OUTER_IPV6_TCP, MLX5_EXPANSION_VXLAN, + MLX5_EXPANSION_STD_VXLAN, + MLX5_EXPANSION_L3_VXLAN, MLX5_EXPANSION_VXLAN_GPE, MLX5_EXPANSION_GRE, MLX5_EXPANSION_NVGRE, @@ -617,6 +631,15 @@ static const struct mlx5_flow_expand_node mlx5_support_expansion[] = { MLX5_EXPANSION_IPV6), .type = RTE_FLOW_ITEM_TYPE_VXLAN, }, + [MLX5_EXPANSION_STD_VXLAN] = { + .next = MLX5_FLOW_EXPAND_RSS_NEXT(MLX5_EXPANSION_ETH), + .type = RTE_FLOW_ITEM_TYPE_VXLAN, + }, + [MLX5_EXPANSION_L3_VXLAN] = { + .next = MLX5_FLOW_EXPAND_RSS_NEXT(MLX5_EXPANSION_IPV4, + MLX5_EXPANSION_IPV6), + .type = RTE_FLOW_ITEM_TYPE_VXLAN, + }, [MLX5_EXPANSION_VXLAN_GPE] = { .next = MLX5_FLOW_EXPAND_RSS_NEXT(MLX5_EXPANSION_ETH, MLX5_EXPANSION_IPV4, @@ -8103,3 +8126,41 @@ mlx5_dbg__print_pattern(const struct rte_flow_item *item) } printf("END\n"); } + +static int +mlx5_flow_is_std_vxlan_port(const struct rte_flow_item *udp_item) +{ + const struct rte_flow_item_udp *spec = udp_item->spec; + const struct rte_flow_item_udp *mask = udp_item->mask; + uint16_t udp_dport = 0; + + if (spec != NULL) { + if (!mask) + mask = &rte_flow_item_udp_mask; + udp_dport = rte_be_to_cpu_16(spec->hdr.dst_port & + mask->hdr.dst_port); + } + return (!udp_dport || udp_dport == MLX5_UDP_PORT_VXLAN); +} + +static const struct mlx5_flow_expand_node * +mlx5_flow_expand_rss_adjust_node(const struct rte_flow_item *pattern, + unsigned int item_idx, + const struct mlx5_flow_expand_node graph[], + const struct mlx5_flow_expand_node *node) +{ + const struct rte_flow_item *item = pattern + item_idx, *prev_item; + switch (item->type) { + case RTE_FLOW_ITEM_TYPE_VXLAN: + MLX5_ASSERT(item_idx > 0); + prev_item = pattern + item_idx - 1; + MLX5_ASSERT(prev_item->type == RTE_FLOW_ITEM_TYPE_UDP); + if (mlx5_flow_is_std_vxlan_port(prev_item)) + return &graph[MLX5_EXPANSION_STD_VXLAN]; + else + return &graph[MLX5_EXPANSION_L3_VXLAN]; + break; + default: + return node; + } +} -- 2.25.1