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)) {