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 2236DA034F; Mon, 11 Oct 2021 17:54:06 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 72B334117A; Mon, 11 Oct 2021 17:52:14 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 58950411F3 for ; Mon, 11 Oct 2021 17:52:11 +0200 (CEST) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 19BEHauq030539 for ; Mon, 11 Oct 2021 08:52:10 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=VLd8NzPL0SFrkmCr7OBctD/3y+41eD5Tux0PPzgtCNQ=; b=eYwzC7i2hCIp1WKx9pzqntlJbM5qV8cGSC88r1zrMGvFRluw7LHsJqs+q/SAJcPt3Gpz s9aoEaWMO9UDjJSpH7Kx0V8USr2gJRdvhi4SxNYNCWHSp8o3uXN+mFSz2574Gecb+/Y5 i3iWSilp5NiEZmszvL7wnkp65nyKp5At0+QApRYAPlsGMdDxRm3n+mUPDdtZhWjjXuca 79Uf7RTHMfWlmHLfjaCjztoRJK/R6idi0JFilNG6UrI6Uf8PLxCGCArFydwRw4kzprh7 BI68pLSZHTe5hjPGsr9Z/rXu/b3KH/0/U5CWJuGBFWF/t6mWmtDF2Z/amBUYE8y+IAOA 0w== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com with ESMTP id 3bmpv4rc57-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Mon, 11 Oct 2021 08:52:10 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Mon, 11 Oct 2021 08:52:08 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.18 via Frontend Transport; Mon, 11 Oct 2021 08:52:08 -0700 Received: from localhost.localdomain (unknown [10.28.34.25]) by maili.marvell.com (Postfix) with ESMTP id C65C83F7079; Mon, 11 Oct 2021 08:52:06 -0700 (PDT) From: To: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao CC: , Rakesh Kudurumalla Date: Mon, 11 Oct 2021 21:20:56 +0530 Message-ID: <20211011155057.302142-29-skori@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211011155057.302142-1-skori@marvell.com> References: <20210930090844.1059326-1-skori@marvell.com> <20211011155057.302142-1-skori@marvell.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-ORIG-GUID: iQkHK4EzcDem59dWutT_oL3Tx_xMLwl9 X-Proofpoint-GUID: iQkHK4EzcDem59dWutT_oL3Tx_xMLwl9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.0.607.475 definitions=2021-10-11_05,2021-10-11_01,2020-04-07_01 Subject: [dpdk-dev] [PATCH v4 28/28] net/cnxk: support meter action to flow destroy 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 Sender: "dev" From: Sunil Kumar Kori Meters are configured per flow using rte_flow_create API. Patch adds support for destroy operation for meter action applied on the flow. Signed-off-by: Sunil Kumar Kori Signed-off-by: Rakesh Kudurumalla --- v4: - Rebase support on dpdk-next-net-mrvl branch - Handled meter action during flow destroy - Handled meter cleanup during port shutdown v3: - Rebase support on latest DPDK - Handled multilevel chaining for tree hierarchy - Fix naming convention v2: - Rebase support on latest DPDK - Handled multilevel chaining for linear hierarchy - Review comments incorporated drivers/net/cnxk/cn10k_rte_flow.c | 22 +++++++++++++++- drivers/net/cnxk/cnxk_ethdev.c | 40 ++++++++++++++++++++++++++++++ drivers/net/cnxk/cnxk_ethdev.h | 2 ++ drivers/net/cnxk/cnxk_ethdev_mtr.c | 7 ++++++ 4 files changed, 70 insertions(+), 1 deletion(-) diff --git a/drivers/net/cnxk/cn10k_rte_flow.c b/drivers/net/cnxk/cn10k_rte_flow.c index 00c0b172e4..8c87452934 100644 --- a/drivers/net/cnxk/cn10k_rte_flow.c +++ b/drivers/net/cnxk/cn10k_rte_flow.c @@ -12,6 +12,14 @@ cn10k_mtr_connect(struct rte_eth_dev *eth_dev, uint32_t mtr_id) return nix_mtr_connect(eth_dev, mtr_id); } +static int +cn10k_mtr_destroy(struct rte_eth_dev *eth_dev, uint32_t mtr_id) +{ + struct rte_mtr_error mtr_error; + + return nix_mtr_destroy(eth_dev, mtr_id, &mtr_error); +} + static int cn10k_mtr_configure(struct rte_eth_dev *eth_dev, const struct rte_flow_action actions[]) @@ -215,6 +223,8 @@ cn10k_flow_destroy(struct rte_eth_dev *eth_dev, struct rte_flow *rte_flow, struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); int mark_actions = 0, vtag_actions = 0; struct roc_npc *npc = &dev->npc; + uint32_t mtr_id; + int rc; mark_actions = roc_npc_mark_actions_get(npc); if (mark_actions) { @@ -237,5 +247,15 @@ cn10k_flow_destroy(struct rte_eth_dev *eth_dev, struct rte_flow *rte_flow, } } - return cnxk_flow_destroy(eth_dev, flow, error); + mtr_id = flow->mtr_id; + rc = cnxk_flow_destroy(eth_dev, flow, error); + if (!rc) { + rc = cn10k_mtr_destroy(eth_dev, mtr_id); + if (rc) { + rte_flow_error_set(error, ENXIO, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "Meter attached to this flow does not exist"); + } + } + return rc; } diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c index 2bb33d8f2d..69bd58ae45 100644 --- a/drivers/net/cnxk/cnxk_ethdev.c +++ b/drivers/net/cnxk/cnxk_ethdev.c @@ -141,6 +141,38 @@ nix_security_setup(struct cnxk_eth_dev *dev) return rc; } +static int +nix_meter_fini(struct cnxk_eth_dev *dev) +{ + struct cnxk_meter_node *next_mtr = NULL; + struct roc_nix_bpf_objs profs = {0}; + struct cnxk_meter_node *mtr = NULL; + struct cnxk_mtr *fms = &dev->mtr; + struct roc_nix *nix = &dev->nix; + struct roc_nix_rq *rq; + uint32_t i; + int rc; + + RTE_TAILQ_FOREACH_SAFE(mtr, fms, next, next_mtr) { + for (i = 0; i < mtr->rq_num; i++) { + rq = &dev->rqs[mtr->rq_id[i]]; + rc |= roc_nix_bpf_ena_dis(nix, mtr->bpf_id, rq, false); + } + + profs.level = mtr->level; + profs.count = 1; + profs.ids[0] = mtr->bpf_id; + rc = roc_nix_bpf_free(nix, &profs, 1); + + if (rc) + return rc; + + TAILQ_REMOVE(fms, mtr, next); + plt_free(mtr); + } + return 0; +} + static int nix_security_release(struct cnxk_eth_dev *dev) { @@ -1012,6 +1044,11 @@ cnxk_nix_configure(struct rte_eth_dev *eth_dev) if (rc) goto fail_configure; + /* Disable and free rte_meter entries */ + rc = nix_meter_fini(dev); + if (rc) + goto fail_configure; + /* Cleanup security support */ rc = nix_security_release(dev); if (rc) @@ -1668,6 +1705,9 @@ cnxk_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool reset) roc_nix_npc_rx_ena_dis(nix, false); + /* Disable and free rte_meter entries */ + nix_meter_fini(dev); + /* Disable and free rte_flow entries */ roc_npc_fini(&dev->npc); diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h index 7e13956572..2d4b073985 100644 --- a/drivers/net/cnxk/cnxk_ethdev.h +++ b/drivers/net/cnxk/cnxk_ethdev.h @@ -589,6 +589,8 @@ int nix_mtr_level_update(struct rte_eth_dev *eth_dev, uint32_t id, uint32_t level); int nix_mtr_configure(struct rte_eth_dev *eth_dev, uint32_t id); int nix_mtr_connect(struct rte_eth_dev *eth_dev, uint32_t id); +int nix_mtr_destroy(struct rte_eth_dev *eth_dev, uint32_t id, + struct rte_mtr_error *error); int nix_mtr_color_action_validate(struct rte_eth_dev *eth_dev, uint32_t id, uint32_t *prev_id, uint32_t *next_id, struct cnxk_mtr_policy_node *policy, diff --git a/drivers/net/cnxk/cnxk_ethdev_mtr.c b/drivers/net/cnxk/cnxk_ethdev_mtr.c index 7fde992d0f..bfae145f7c 100644 --- a/drivers/net/cnxk/cnxk_ethdev_mtr.c +++ b/drivers/net/cnxk/cnxk_ethdev_mtr.c @@ -1054,6 +1054,13 @@ nix_dscp_table_map(struct cnxk_meter_node *mtr, } } +int +nix_mtr_destroy(struct rte_eth_dev *eth_dev, uint32_t id, + struct rte_mtr_error *error) +{ + return cnxk_nix_mtr_destroy(eth_dev, id, error); +} + int nix_mtr_connect(struct rte_eth_dev *eth_dev, uint32_t id) { -- 2.25.1