From patchwork Tue Nov 8 10:04:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shun Hao X-Patchwork-Id: 119551 X-Patchwork-Delegate: rasland@nvidia.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 34207A0093; Tue, 8 Nov 2022 11:04:33 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 220C042D25; Tue, 8 Nov 2022 11:04:33 +0100 (CET) Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2065.outbound.protection.outlook.com [40.107.93.65]) by mails.dpdk.org (Postfix) with ESMTP id 92896400D7; Tue, 8 Nov 2022 11:04:30 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BQeGOe5NnkYZ+kOQDhqM9YsfRfvZ6RYavYlO4snOtZLkJOLaZmSm5dIush1L6XZgFlQ6T3I4kGWSPRHR7ilkkBG5Kl3V87Et4qyO0XK197Ns1ll6Mg57YvDtzgL54nyAbDDzuJryOX/FdrWVcJHAArqLlfAWI9Y3XrObjUugM746dNn011o+YlVPl3L5oIGDlM3nr3nd3B5+WVbSVCB3fD/YJ7/P4iRLvhQ4GMKSUOkncBqnSwMujNKsJG0M5JnWQwbWJCiHVexs/jS89+zZRr46A50AIbeEMCmbEYv2ZbVX99RtENiAdSbaqbXgp7aQ5T//zjOOnDiMj2adCkaGaw== 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=Hca59+UId5CcOyD3z+dKhEWiw9HJ/b9eDzUOaTHmcdY=; b=aE4Cg/LR4PrtUuXs9qnWb7JJZSo6Jk4dIsLSXOZsrS2s3Hx8VJw9/g13PiQEqEpbMjxvTkv1DMzstTUMblcVPovD/VArx/z0l1eT9lltLp2RF6nsgm4106pNLclnAWSMWwGIT1/tuWOTnpTiJsAh++2JlQRPevrFVptEUKxf5R03zQc26ydAEerfKbGvT2pZ2kuJESL2w0mdh+bDQSpBHiSw+zsY7cGlZc+xlJ1SSALjr9O+PswkZJn3m9bIywyxqP18RzwMkStRa603GprYGOcS2hJs7FwAupbUWAKtzh52NJwqMEn/yrWsJvJ2W5iS/lpjwKioKc1WFxdXgr9GBQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=dpdk.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=Hca59+UId5CcOyD3z+dKhEWiw9HJ/b9eDzUOaTHmcdY=; b=h4164hOAWRhFQKF44ZPs3/b/GLDoCqX8vgAIwMJ6r2ZTSEVZLPdhi0H456DloJRgi37rcGs49pg43OuAwy792M1It4tleuf1HVpDON/6y9Mu1i9tPp0j0sVdqiS1koILPVLCBkE59E6X/DnsRLBNWGNiQAE2rXYmAbp87mEwM5ev5FzVlHLY8TnqpXxFRXdbomrZ3iR50DV1y37tCn88lcnbYzJj1ytxVgbCx4G+cdbqZd9mBxXc/PBRUoGpZzRVBaio6dsgQKBdY21pAjn/xWBj+cPo7laLAICvdB/Tn68ZgM9HxhWOa9OgylgDifl6YIh01gRV7jyrsXWtFyXZIA== Received: from MW3PR05CA0015.namprd05.prod.outlook.com (2603:10b6:303:2b::20) by PH7PR12MB7793.namprd12.prod.outlook.com (2603:10b6:510:270::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5791.26; Tue, 8 Nov 2022 10:04:28 +0000 Received: from CO1NAM11FT040.eop-nam11.prod.protection.outlook.com (2603:10b6:303:2b:cafe::ac) by MW3PR05CA0015.outlook.office365.com (2603:10b6:303:2b::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.8 via Frontend Transport; Tue, 8 Nov 2022 10:04:28 +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 CO1NAM11FT040.mail.protection.outlook.com (10.13.174.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5791.20 via Frontend Transport; Tue, 8 Nov 2022 10:04:28 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.26; Tue, 8 Nov 2022 02:04:20 -0800 Received: from nvidia.com (10.126.230.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.29; Tue, 8 Nov 2022 02:04:18 -0800 From: Shun Hao To: , , CC: , , Subject: [PATCH v1 1/2] net/mlx5: fix meter hierarchy with modify header Date: Tue, 8 Nov 2022 12:04:00 +0200 Message-ID: <20221108100401.878296-2-shunh@nvidia.com> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20221108100401.878296-1-shunh@nvidia.com> References: <20221108100401.878296-1-shunh@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.230.35] X-ClientProxiedBy: rnnvmail201.nvidia.com (10.129.68.8) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT040:EE_|PH7PR12MB7793:EE_ X-MS-Office365-Filtering-Correlation-Id: f23ef8cc-4b77-4bd0-47c2-08dac1709fab X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /ARGNTOe2sYOqT0rmfADY6oMROeVcADURzQxgCSDwCp1xwgdSrARKIzql21X+kuJh9MFc9od/z1sXvHqqtdDaXhS9Hjd6VKKKU+z5VCEG7k7KOaOJ0mtEgWm6waMRb8sCCoyERG1lzlz3IUpULo/EuYGm+3irRds/rTvht7dqMSibCTM+J0IS4wBEfg3k9qZGZZ8J8nnZVRrAq+GI8/7ii+iAico8jVRWQY+epGAugoC3aWjP/l1Cp2vKXEOLRtfELoh3Rks74rDsbSHbBexyqyQMFPB4Wj9ttYxJezG0oGfVKCZnCYDDSiHJZo9RElVUZmFCQvhufDAx+xjphcAhhXjTsghPTGI3cWlqx+NmtSNs4GsQ75RU6IcD6w/fbW7Xia8Bnfo8FHLSdcvMgosza0XE3tBsW5sAkwWcn5bYQ4gdAGoa0EMMkqmj1mLEHgoqvpOaflpLzrJ/mpUplFZDorDa4tRnNe1bE5sqwJHz/aeBGIHzos5Ww+FHeC480920W28ZXuXhGF+S1imrTZkDMN8v1o6gg8xORzoImVTL5/qqyo79SwyCutbayDRYWvEbQr7wrr2lzon8701mGYWOpXM5Zi6i9+c13o8SQcMN7T9ntTFDpj40QxOdGuEg6Zs+iz7D+hldTVtrJ24kq8IwhSJWQQHRlNHjfG1r4L2KfQAfkwNzlATy8f3U6MrP3Hs80PZpSf/UWHo+dSVBeS6LfNskuw7kKW/ZbsBGdkAPow1/rUD1ULWKOl6U8a889JqjdkatHv4NcknMgWjR2hDKg== 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:(13230022)(4636009)(136003)(39860400002)(346002)(376002)(396003)(451199015)(40470700004)(36840700001)(46966006)(1076003)(426003)(16526019)(7696005)(47076005)(186003)(336012)(6666004)(6286002)(36860700001)(26005)(70206006)(83380400001)(2906002)(55016003)(40480700001)(40460700003)(316002)(110136005)(70586007)(450100002)(54906003)(6636002)(82310400005)(478600001)(41300700001)(5660300002)(8936002)(8676002)(4326008)(2616005)(36756003)(356005)(82740400003)(7636003)(86362001); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Nov 2022 10:04:28.4553 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f23ef8cc-4b77-4bd0-47c2-08dac1709fab 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: CO1NAM11FT040.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7793 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 If any meter in the hierarchy has a policy flow containing set_tag or modify_field action, the policy flow must match the src port to which the policy belongs, to determine the order of modify_hdr and meter action. But the meter hierarchy will not be able to use by user flow that matches another src port. To use this type of meter hierarchy for other src ports, we need to add a new policy flow matching the new src port from the user flow dynamically. But then it cannot be used by flow matching all ports. Fixes: ca7e6051 ("net/mlx5: limit meter flow when matching all ports") Cc: stable@dpdk.org Signed-off-by: Shun Hao Acked-by: Matan Azrad --- doc/guides/nics/mlx5.rst | 3 +++ drivers/net/mlx5/mlx5.h | 6 ++++-- drivers/net/mlx5/mlx5_flow.c | 2 +- drivers/net/mlx5/mlx5_flow_dv.c | 35 ++++++++++++++++++++++----------- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst index d5f9375a4e..4f0db21dde 100644 --- a/doc/guides/nics/mlx5.rst +++ b/doc/guides/nics/mlx5.rst @@ -511,6 +511,9 @@ Limitations if meter has drop count or meter hierarchy contains any meter that uses drop count, it cannot be used by flow rule matching all ports. + - When using DV flow engine (``dv_flow_en`` = 1), + if meter hierarchy contains any meter that has MODIFY_FIELD/SET_TAG, + it cannot be used by flow matching all ports. - When using HWS flow engine (``dv_flow_en`` = 2), only meter mark action is supported. diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index cbe2d88b9e..73d0329500 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -846,8 +846,10 @@ struct mlx5_flow_meter_policy { /* Is queue action in policy table. */ uint32_t is_hierarchy:1; /* Is meter action in policy table. */ - uint32_t hierarchy_drop_cnt:1; - /* Is any meter in hierarchy contains drop_cnt. */ + uint32_t match_port:1; + /* If policy flows match src port. */ + uint32_t hierarchy_match_port:1; + /* Is any meter in hierarchy contains policy flow that matches src port. */ uint32_t skip_r:1; /* If red color policy is skipped. */ uint32_t skip_y:1; diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index ea88882b88..de75c05602 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -5471,7 +5471,7 @@ flow_meter_split_prep(struct rte_eth_dev *dev, case RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT: if (mlx5_flow_get_item_vport_id(dev, items, &flow_src_port, NULL, error)) return -rte_errno; - if (!fm->def_policy && wks->policy->is_hierarchy && + if (!fm->def_policy && wks->policy->hierarchy_match_port && flow_src_port != priv->representor_id) { if (flow_drv_mtr_hierarchy_rule_create(dev, flow, fm, diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index acd7ea8b79..bb898d7569 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -5445,11 +5445,12 @@ mlx5_flow_validate_action_meter(struct rte_eth_dev *dev, "have different src port."); } /* When flow matching all src ports, meter should not have drop count. */ - if (all_ports && (fm->drop_cnt || mtr_policy->hierarchy_drop_cnt)) + if (all_ports && (fm->drop_cnt || mtr_policy->hierarchy_match_port)) return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_SPEC, NULL, - "Meter drop count not supported " - "when matching all ports."); + "Meter drop count or " + "modify_field/set_tag in meter hierarchy " + "not supported when matching all ports."); } else if (mtr_policy->is_rss) { struct mlx5_flow_meter_policy *fp; struct mlx5_meter_policy_action_container *acg; @@ -16661,8 +16662,8 @@ __flow_dv_create_domain_policy_acts(struct rte_eth_dev *dev, mtr_policy->dev = next_policy->dev; if (next_policy->mark) mtr_policy->mark = 1; - if (next_fm->drop_cnt || next_policy->hierarchy_drop_cnt) - mtr_policy->hierarchy_drop_cnt = 1; + mtr_policy->hierarchy_match_port = + next_policy->hierarchy_match_port; action_flags |= MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY; break; @@ -17408,6 +17409,10 @@ __flow_dv_create_policy_acts_rules(struct rte_eth_dev *dev, "Failed to create policy rules per domain."); goto err_exit; } + if (match_src_port) { + mtr_policy->match_port = match_src_port; + mtr_policy->hierarchy_match_port = match_src_port; + } return 0; err_exit: for (i = 0; i < RTE_COLORS; i++) @@ -18030,7 +18035,7 @@ mlx5_meter_hierarchy_skip_tag_rule(struct mlx5_priv *priv, NULL, "Failed to find next meter in hierarchy."); goto exit; } - if (!(*next_fm)->drop_cnt) { + if (!mtr_policy->match_port) { *skip = true; goto exit; } @@ -18130,6 +18135,9 @@ flow_dv_meter_hierarchy_rule_create(struct rte_eth_dev *dev, rte_spinlock_lock(&mtr_policy->sl); sub_policy = mtr_policy->sub_policys[domain][0]; for (j = 0; j < MLX5_MTR_RTE_COLORS; j++) { + uint8_t act_n = 0; + struct mlx5_flow_dv_modify_hdr_resource *modify_hdr; + if (mtr_policy->act_cnt[j].fate_action != MLX5_FLOW_FATE_MTR) continue; color_rule = mlx5_malloc(MLX5_MEM_ZERO, @@ -18160,15 +18168,18 @@ flow_dv_meter_hierarchy_rule_create(struct rte_eth_dev *dev, next_sub_policy = next_policy->sub_policys[domain][0]; tbl_data = container_of(next_sub_policy->tbl_rsc, struct mlx5_flow_tbl_data_entry, tbl); + modify_hdr = mtr_policy->act_cnt[j].modify_hdr; if (mtr_first) { - acts.dv_actions[0] = mtr_action; - acts.dv_actions[1] = mtr_policy->act_cnt[j].modify_hdr->action; + acts.dv_actions[act_n++] = mtr_action; + if (modify_hdr) + acts.dv_actions[act_n++] = modify_hdr->action; } else { - acts.dv_actions[0] = mtr_policy->act_cnt[j].modify_hdr->action; - acts.dv_actions[1] = mtr_action; + if (modify_hdr) + acts.dv_actions[act_n++] = modify_hdr->action; + acts.dv_actions[act_n++] = mtr_action; } - acts.dv_actions[2] = tbl_data->jump.action; - acts.actions_n = 3; + acts.dv_actions[act_n++] = tbl_data->jump.action; + acts.actions_n = act_n; if (__flow_dv_create_policy_matcher(dev, color_reg_c_idx, MLX5_MTR_POLICY_MATCHER_PRIO, sub_policy, &attr, true, item, &color_rule->matcher, error)) { From patchwork Tue Nov 8 10:04:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shun Hao X-Patchwork-Id: 119552 X-Patchwork-Delegate: rasland@nvidia.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7018FA0093; Tue, 8 Nov 2022 11:04:41 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9B99E42D38; Tue, 8 Nov 2022 11:04:37 +0100 (CET) Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2074.outbound.protection.outlook.com [40.107.92.74]) by mails.dpdk.org (Postfix) with ESMTP id BFCF0400D7; Tue, 8 Nov 2022 11:04:35 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KNOQbp/uvtdzwONcZic54QVbqua7v0YBN3sgRL7Wm8YnmycFM7djdvoZuAoEF2Ko57fKnspqnkVSZx/50j/e33wemJ+5E4COY6+EEPwBE4h/S3Rq9+qCnNuHo8ovAuKrseqjbEIScwrAHLCCHCn/tOxpG7M+xHXvNUlD9YafFN7w/VL8BmzbOGBGX2Uvc5k1zgq8hn/AXdlBZeS+Rl3ggk9uXhWXVJaHmcdc/NKLRXHxYRqR4yT456g8LycQ2Q7Zva7RfOX2vy6LWtziffK4e7GvtcXkNEujTkUzsKGiEAWHguD542EzzE4FokQP6kt88anuPCtNaxADS3ISRLPE6w== 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=SzEEuvP9H//0IYn9oFmSb3OOtKdD9Mq2KVebT4Wr8hs=; b=U0PKKoCHOu6MszftUJUw8eFMXkJ2toVfNW75oxcAbIqenkzrMBe3riD+g5o/tDDLNUm3DCqPdFzJ2K9RX9pMtMMz/oQNCOhhQconqO+d4uuW7RnziGt9sqrSk6PySjHzsAh5hsT/RxAibjstXVAt8B5FM5bWHs5luQCKY43J9Jj1B+EhZlf9qpZ+JvPaOV6bKjkt03iE1YNN1pATQl+WyXFrBYu98yM2qMxLVQoVhUlQbVWW4g6mhsh6LJHSWiYP23C6m0EcuDAyVEtsib8u8musF931gk0AjRMleGfMorkOywX7d1dQ9+I0DlWLeQ+jrOUowPK8uvajGeCzrbEEUQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=dpdk.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=SzEEuvP9H//0IYn9oFmSb3OOtKdD9Mq2KVebT4Wr8hs=; b=rIkeXHZk1mXPUe3dk7wf5C87gf1G7mIRilQW8p4dEKM57frnBXLknbh0ek6dGWkOyiDSaeDzZyp39Ob2I0PMyl+gALTH2YJuczMc5/OWYaEbGZwxePXhm1XX58mLXO8oO7bXJ7oo9Nc68fwqbgwDEKqJLAPE6LulycLCsYSX/fhQdE9Dnaj/YDDA3lu/02fJedfIGzc6S6MhhMclHnjgOUqe+WJmCnWLhVCFX8Z95JJ7phwXfFHTN3y/sxe9+XYO+DoL8g+84lbCM5TfsuvG+tiixbbWa0ZNVu04Qpr+1HZrrxnZ8hA3xrb5aSYJ9AHaEkliwWxbHCaE57vUJjhqDQ== Received: from MW3PR05CA0029.namprd05.prod.outlook.com (2603:10b6:303:2b::34) by BY5PR12MB4209.namprd12.prod.outlook.com (2603:10b6:a03:20d::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5791.27; Tue, 8 Nov 2022 10:04:33 +0000 Received: from CO1NAM11FT040.eop-nam11.prod.protection.outlook.com (2603:10b6:303:2b:cafe::d2) by MW3PR05CA0029.outlook.office365.com (2603:10b6:303:2b::34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.8 via Frontend Transport; Tue, 8 Nov 2022 10:04:33 +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 CO1NAM11FT040.mail.protection.outlook.com (10.13.174.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5791.20 via Frontend Transport; Tue, 8 Nov 2022 10:04:33 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) 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.26; Tue, 8 Nov 2022 02:04:23 -0800 Received: from nvidia.com (10.126.230.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.29; Tue, 8 Nov 2022 02:04:21 -0800 From: Shun Hao To: , , CC: , , Subject: [PATCH v1 2/2] net/mlx5: fix meter policy with port ID destination Date: Tue, 8 Nov 2022 12:04:01 +0200 Message-ID: <20221108100401.878296-3-shunh@nvidia.com> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20221108100401.878296-1-shunh@nvidia.com> References: <20221108100401.878296-1-shunh@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.230.35] X-ClientProxiedBy: rnnvmail201.nvidia.com (10.129.68.8) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT040:EE_|BY5PR12MB4209:EE_ X-MS-Office365-Filtering-Correlation-Id: 35d22a6a-ed69-44cb-db64-08dac170a2b6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: SZv5pjszoRlQ3moJM2LQ/YPgEyk7g9nrb9Re7bjkrm8PPIYB1K57Rff4w298tz7oQqKw6w2hUFjW5IaWDjcw3fQwmqklE1/DAK3U4E8T6uOu2h0rC+ti7esBfZqKNPrd+pcTqoWCmzex+DNYFnVjGNRBUTMxUp1pCvL7rXTw5rhoEkoEhjRGANKsk6LkANn4tMK7iSnb1yo61/Lb5KOwrNYLd68hsswRBmrJjy7U2vJlTE/jYZIbUEakQZe9jrQT3SGecbKMhl+XksvmxTd/J31J50owF3oMkA3Y579xcFLAiXvo+6it84WvG7kSUlrwQ1jQZ4JIq263DyBPYphlvcW4IsJOzrvBZatoxv4zJ3B3UfaDIGLoWR5ROkMo0X1DpZf7NKUYraHOQbgYQjSzhK786SStqPIRog7wsTLd7KsTR5LzrZzLc8al4gTI4/+umfwdgh/3MI7aHAPaJIGgSLOHiqxeBhhxrKM24tjy0jwkwzkMGVWMADmQCoWfCBUggq/qExT17mmdth5DKVBntVI8xr7C61PGs0XYX+GCiAqZE7lEI+xEC0waNuqdcGXXASUo8RAfGy/vnxXik8VDte72Rk2tJJULnF5/RIlKcb2wfTxmMw5lzvy3pNS25RBf1sXu2oQbOIuIJvJcjHa+F7GDj0kt66GnUT/FSfN/1ePGH61IhwCLLYHO+VcKNj8BQUAT5CyUuz/IZRkHg0QfWKKiBU2a5J3bcQAIBKUb7iX1j1d/nzlSAifiZRP0hYGrUeQj87ZNzrVbppO7BmBPrg== 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:(13230022)(4636009)(136003)(376002)(39860400002)(396003)(346002)(451199015)(46966006)(40470700004)(36840700001)(36756003)(7636003)(82740400003)(356005)(40460700003)(41300700001)(2906002)(5660300002)(36860700001)(86362001)(336012)(426003)(83380400001)(70586007)(70206006)(316002)(4326008)(450100002)(54906003)(110136005)(8676002)(26005)(186003)(1076003)(16526019)(6286002)(47076005)(6636002)(40480700001)(8936002)(82310400005)(55016003)(478600001)(7696005)(2616005)(6666004); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Nov 2022 10:04:33.5799 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 35d22a6a-ed69-44cb-db64-08dac170a2b6 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: CO1NAM11FT040.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4209 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 When a meter policy contains a fate action of port_id, the policy flow must match the src port to which the policy belongs. However, this meter cannot be used by a flow that matches another src port. This patch fixes this by adding a new policy flow matching the new src port from the user flow dynamically, but then the meter cannot be used by a flow that matches all the ports. Fixes: 48fbc1be ("net/mlx5: fix meter policy flow match item") Cc: stable@dpdk.org Signed-off-by: Shun Hao Acked-by: Matan Azrad --- drivers/net/mlx5/mlx5.h | 2 - drivers/net/mlx5/mlx5_flow_dv.c | 105 ++++++++++++++++---------------- 2 files changed, 53 insertions(+), 54 deletions(-) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 73d0329500..7d82cb7c8f 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -832,8 +832,6 @@ struct mlx5_meter_policy_action_container { /* Flow meter policy parameter structure. */ struct mlx5_flow_meter_policy { - struct rte_eth_dev *dev; - /* The port dev on which policy is created. */ uint32_t is_rss:1; /* Is RSS policy table. */ uint32_t ingress:1; diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index bb898d7569..362d236c89 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -5428,22 +5428,6 @@ mlx5_flow_validate_action_meter(struct rte_eth_dev *dev, return -rte_errno; } if (attr->transfer) { - if (mtr_policy->dev) { - /** - * When policy has fate action of port_id, - * the flow should have the same src port as policy. - */ - struct mlx5_priv *policy_port_priv = - mtr_policy->dev->data->dev_private; - - if (all_ports || flow_src_port != policy_port_priv->representor_id) - return rte_flow_error_set(error, - rte_errno, - RTE_FLOW_ERROR_TYPE_ITEM_SPEC, - NULL, - "Flow and meter policy " - "have different src port."); - } /* When flow matching all src ports, meter should not have drop count. */ if (all_ports && (fm->drop_cnt || mtr_policy->hierarchy_match_port)) return rte_flow_error_set(error, EINVAL, @@ -16659,7 +16643,6 @@ __flow_dv_create_domain_policy_acts(struct rte_eth_dev *dev, act_cnt->next_mtr_id = next_fm->meter_id; act_cnt->next_sub_policy = NULL; mtr_policy->is_hierarchy = 1; - mtr_policy->dev = next_policy->dev; if (next_policy->mark) mtr_policy->mark = 1; mtr_policy->hierarchy_match_port = @@ -17342,7 +17325,6 @@ __flow_dv_create_policy_acts_rules(struct rte_eth_dev *dev, acts[i].dv_actions[acts[i].actions_n] = port_action->action; acts[i].actions_n++; - mtr_policy->dev = dev; match_src_port = true; break; case MLX5_FLOW_FATE_DROP: @@ -18027,13 +18009,13 @@ mlx5_meter_hierarchy_skip_tag_rule(struct mlx5_priv *priv, *next_fm = NULL; *skip = false; rte_spinlock_lock(&mtr_policy->sl); - if (!mtr_policy->is_hierarchy) - goto exit; - *next_fm = mlx5_flow_meter_hierarchy_next_meter(priv, mtr_policy, NULL); - if (!*next_fm) { - ret = rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, - NULL, "Failed to find next meter in hierarchy."); - goto exit; + if (mtr_policy->is_hierarchy) { + *next_fm = mlx5_flow_meter_hierarchy_next_meter(priv, mtr_policy, NULL); + if (!*next_fm) { + ret = rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, + NULL, "Failed to find next meter in hierarchy."); + goto exit; + } } if (!mtr_policy->match_port) { *skip = true; @@ -18041,7 +18023,8 @@ mlx5_meter_hierarchy_skip_tag_rule(struct mlx5_priv *priv, } sub_policy = mtr_policy->sub_policys[domain][0]; for (i = 0; i < MLX5_MTR_RTE_COLORS; i++) { - if (mtr_policy->act_cnt[i].fate_action != MLX5_FLOW_FATE_MTR) + if (mtr_policy->act_cnt[i].fate_action != MLX5_FLOW_FATE_MTR && + mtr_policy->act_cnt[i].fate_action != MLX5_FLOW_FATE_PORT_ID) continue; TAILQ_FOREACH(color_rule, &sub_policy->color_rules[i], next_port) if (color_rule->src_port == src_port) { @@ -18115,7 +18098,7 @@ flow_dv_meter_hierarchy_rule_create(struct rte_eth_dev *dev, if (mlx5_meter_hierarchy_skip_tag_rule(priv, mtr_policy, src_port, &next_fm, &skip, error)) goto err_exit; - if (next_fm && !skip) { + if (!skip) { fm_info[fm_cnt].fm_policy = mtr_policy; fm_info[fm_cnt].next_fm = next_fm; if (++fm_cnt >= MLX5_MTR_CHAIN_MAX_NUM) { @@ -18137,8 +18120,10 @@ flow_dv_meter_hierarchy_rule_create(struct rte_eth_dev *dev, for (j = 0; j < MLX5_MTR_RTE_COLORS; j++) { uint8_t act_n = 0; struct mlx5_flow_dv_modify_hdr_resource *modify_hdr; + struct mlx5_flow_dv_port_id_action_resource *port_action; - if (mtr_policy->act_cnt[j].fate_action != MLX5_FLOW_FATE_MTR) + if (mtr_policy->act_cnt[j].fate_action != MLX5_FLOW_FATE_MTR && + mtr_policy->act_cnt[j].fate_action != MLX5_FLOW_FATE_PORT_ID) continue; color_rule = mlx5_malloc(MLX5_MEM_ZERO, sizeof(struct mlx5_sub_policy_color_rule), @@ -18151,35 +18136,51 @@ flow_dv_meter_hierarchy_rule_create(struct rte_eth_dev *dev, goto err_exit; } color_rule->src_port = src_port; - next_fm = fm_info[i].next_fm; - if (mlx5_flow_meter_attach(priv, next_fm, &attr, error)) { - mlx5_free(color_rule); - rte_spinlock_unlock(&mtr_policy->sl); - goto err_exit; - } - fm_info[i].tag_rule[j] = color_rule; - TAILQ_INSERT_TAIL(&sub_policy->color_rules[j], color_rule, next_port); - /* Prepare to create color rule. */ - mtr_action = (next_fm->color_aware && j == RTE_COLOR_YELLOW) ? - next_fm->meter_action_y : - next_fm->meter_action_g; - next_policy = mlx5_flow_meter_policy_find(dev, next_fm->policy_id, NULL); - MLX5_ASSERT(next_policy); - next_sub_policy = next_policy->sub_policys[domain][0]; - tbl_data = container_of(next_sub_policy->tbl_rsc, - struct mlx5_flow_tbl_data_entry, tbl); modify_hdr = mtr_policy->act_cnt[j].modify_hdr; - if (mtr_first) { - acts.dv_actions[act_n++] = mtr_action; - if (modify_hdr) - acts.dv_actions[act_n++] = modify_hdr->action; + /* Prepare to create color rule. */ + if (mtr_policy->act_cnt[j].fate_action == MLX5_FLOW_FATE_MTR) { + next_fm = fm_info[i].next_fm; + if (mlx5_flow_meter_attach(priv, next_fm, &attr, error)) { + mlx5_free(color_rule); + rte_spinlock_unlock(&mtr_policy->sl); + goto err_exit; + } + mtr_action = (next_fm->color_aware && j == RTE_COLOR_YELLOW) ? + next_fm->meter_action_y : + next_fm->meter_action_g; + next_policy = mlx5_flow_meter_policy_find(dev, next_fm->policy_id, + NULL); + MLX5_ASSERT(next_policy); + next_sub_policy = next_policy->sub_policys[domain][0]; + tbl_data = container_of(next_sub_policy->tbl_rsc, + struct mlx5_flow_tbl_data_entry, tbl); + if (mtr_first) { + acts.dv_actions[act_n++] = mtr_action; + if (modify_hdr) + acts.dv_actions[act_n++] = modify_hdr->action; + } else { + if (modify_hdr) + acts.dv_actions[act_n++] = modify_hdr->action; + acts.dv_actions[act_n++] = mtr_action; + } + acts.dv_actions[act_n++] = tbl_data->jump.action; + acts.actions_n = act_n; } else { + port_action = + mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_PORT_ID], + mtr_policy->act_cnt[j].rix_port_id_action); + if (!port_action) { + mlx5_free(color_rule); + rte_spinlock_unlock(&mtr_policy->sl); + goto err_exit; + } if (modify_hdr) acts.dv_actions[act_n++] = modify_hdr->action; - acts.dv_actions[act_n++] = mtr_action; + acts.dv_actions[act_n++] = port_action->action; + acts.actions_n = act_n; } - acts.dv_actions[act_n++] = tbl_data->jump.action; - acts.actions_n = act_n; + fm_info[i].tag_rule[j] = color_rule; + TAILQ_INSERT_TAIL(&sub_policy->color_rules[j], color_rule, next_port); if (__flow_dv_create_policy_matcher(dev, color_reg_c_idx, MLX5_MTR_POLICY_MATCHER_PRIO, sub_policy, &attr, true, item, &color_rule->matcher, error)) {