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 F1E3DA0C47; Tue, 12 Oct 2021 09:09:11 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 25E75410F0; Tue, 12 Oct 2021 09:07:33 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id 6590C410E8 for ; Tue, 12 Oct 2021 09:07:31 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 19C4UO3j023866 for ; Tue, 12 Oct 2021 00:07:30 -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=xy94qb9m5FSHWUffaaukg08PQJPQesfGAjTekMoJDSQ=; b=VlifNjyZXoFU5LwxOKKu46nn3KOH7YY5xVGjcI62IWdLuaIP8pyAMyqu9OmONqd2s5Y5 WfSuCNO/dGP38PJ5wBLzQR/Zkc820vXkEs8ob9Qom21IhqOwOVPcB9VTVBG/8k7JaGQf gZWBlCsnzawTYFSjDMWR+QH5RKe3Ue/X+6IXMOHp7E9WWHa1HWDm6wTriIf2FyntuHPb pm7MIJ2SkMKA7GebkUpRb5HaoLeJYbsKrIG4f/XR8Wen+QjXU4bBW7JBiZJU4H5PXSXz vche/o9iuXRSiL+Mld4H7O4mp4KyjjDoKHt546MKzgss6ieCnSQ4bw4FFKaQof2Cx48X 9g== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0a-0016f401.pphosted.com with ESMTP id 3bn3d58jvb-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Tue, 12 Oct 2021 00:07:25 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Tue, 12 Oct 2021 00:07:23 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.18 via Frontend Transport; Tue, 12 Oct 2021 00:07:23 -0700 Received: from localhost.localdomain (unknown [10.28.34.25]) by maili.marvell.com (Postfix) with ESMTP id E45F73F707E; Tue, 12 Oct 2021 00:07:21 -0700 (PDT) From: To: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao CC: , Rakesh Kudurumalla Date: Tue, 12 Oct 2021 12:36:12 +0530 Message-ID: <20211012070612.352164-29-skori@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211012070612.352164-1-skori@marvell.com> References: <20211011155057.302142-2-skori@marvell.com> <20211012070612.352164-1-skori@marvell.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-ORIG-GUID: U5poqxRI3Yalc0m2IPpE4dB4hlG94xfx X-Proofpoint-GUID: U5poqxRI3Yalc0m2IPpE4dB4hlG94xfx 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-12_01,2021-10-11_01,2020-04-07_01 Subject: [dpdk-dev] [PATCH v5 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 --- v5: - Fix checkpatch errors - Fix patch apply errors 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 c29a7ec47b..22c85336d9 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