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 6EA03A0C47; Tue, 12 Oct 2021 09:08:25 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0340941183; Tue, 12 Oct 2021 09:07:12 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id CACD54115D for ; Tue, 12 Oct 2021 09:07:06 +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 19C4UeLJ024079 for ; Tue, 12 Oct 2021 00:07:05 -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=NfLF3fKOUVBP8BqgB2NzGLrom1OHVRQoM8QJIXRvoRQ=; b=XqnO/4EnaYgSo11+7uNb5SbLmMQnaR4cpHUyuUCbFSAlwPIspv6rN6pdJ2w9oGSBm9Mm q6dF5YY7zHAL2kAjqMkeg1VZzjsvxZFjf2L3F2hY59PFBWC70H5f6QNoMWU9SWOaKtRg k6CUY7XTYqEJFPOHAqMWjPe6wPRLgTcUMEoMRdIb4hm+T0/zX3FU87BOUzYERy1kslpL 5PI6cDrtHI9HCswiiQibRfttdnlC3OW4fOseV9p1i+dTxkcpNvqu0fG2vLMXVIlVXEK+ mtslX/Pkyfc7JVPkFaEBvrJZMzVzyz+RSUf5YKRZeYY0ENs8HM2w3YFoaVs6MfpuAckp lQ== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0a-0016f401.pphosted.com with ESMTP id 3bn3d58jsx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Tue, 12 Oct 2021 00:07:05 -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:04 -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:04 -0700 Received: from localhost.localdomain (unknown [10.28.34.25]) by maili.marvell.com (Postfix) with ESMTP id 9EDA03F7082; Tue, 12 Oct 2021 00:07:02 -0700 (PDT) From: To: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao CC: , Rakesh Kudurumalla Date: Tue, 12 Oct 2021 12:36:04 +0530 Message-ID: <20211012070612.352164-21-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: lfcHbXc9b91CncjF72QuAOXbM-MI-qkS X-Proofpoint-GUID: lfcHbXc9b91CncjF72QuAOXbM-MI-qkS 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 20/28] net/cnxk: support ops to create meter policy 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 Implement API to add meter policy for CNXK platform. 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/cnxk_ethdev.c | 1 + drivers/net/cnxk/cnxk_ethdev.h | 31 +++++++++++ drivers/net/cnxk/cnxk_ethdev_mtr.c | 84 ++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+) diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c index d748d5da04..6295fa0557 100644 --- a/drivers/net/cnxk/cnxk_ethdev.c +++ b/drivers/net/cnxk/cnxk_ethdev.c @@ -705,6 +705,7 @@ static int nix_ingress_policer_setup(struct cnxk_eth_dev *dev) { TAILQ_INIT(&dev->mtr_profiles); + TAILQ_INIT(&dev->mtr_policy); return 0; } diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h index c076208d77..4cdce5dfd0 100644 --- a/drivers/net/cnxk/cnxk_ethdev.h +++ b/drivers/net/cnxk/cnxk_ethdev.h @@ -159,6 +159,35 @@ struct cnxk_timesync_info { uint64_t *tx_tstamp; } __plt_cache_aligned; +struct action_rss { + enum rte_eth_hash_function func; + uint32_t level; + uint64_t types; + uint32_t key_len; + uint32_t queue_num; + uint8_t *key; + uint16_t *queue; +}; + +struct policy_actions { + uint32_t action_fate; + union { + uint16_t queue; + uint32_t mtr_id; + struct action_rss *rss_desc; + }; +}; + +struct cnxk_mtr_policy_node { + TAILQ_ENTRY(cnxk_mtr_policy_node) next; + /**< Pointer to the next flow meter structure. */ + uint32_t id; /**< Policy id */ + uint32_t mtr_id; /** Meter id */ + struct rte_mtr_meter_policy_params policy; + struct policy_actions actions[RTE_COLORS]; + uint32_t ref_cnt; +}; + struct cnxk_mtr_profile_node { TAILQ_ENTRY(cnxk_mtr_profile_node) next; struct rte_mtr_meter_profile profile; /**< Profile detail. */ @@ -167,6 +196,7 @@ struct cnxk_mtr_profile_node { }; TAILQ_HEAD(cnxk_mtr_profiles, cnxk_mtr_profile_node); +TAILQ_HEAD(cnxk_mtr_policy, cnxk_mtr_policy_node); /* Security session private data */ struct cnxk_eth_sec_sess { @@ -315,6 +345,7 @@ struct cnxk_eth_dev { /* Ingress policer */ struct cnxk_mtr_profiles mtr_profiles; + struct cnxk_mtr_policy mtr_policy; /* Rx burst for cleanup(Only Primary) */ eth_rx_burst_t rx_pkt_burst_no_offload; diff --git a/drivers/net/cnxk/cnxk_ethdev_mtr.c b/drivers/net/cnxk/cnxk_ethdev_mtr.c index c042da6fa5..91b9f618ce 100644 --- a/drivers/net/cnxk/cnxk_ethdev_mtr.c +++ b/drivers/net/cnxk/cnxk_ethdev_mtr.c @@ -50,6 +50,18 @@ nix_mtr_profile_find(struct cnxk_eth_dev *dev, uint32_t profile_id) return NULL; } +static struct cnxk_mtr_policy_node * +nix_mtr_policy_find(struct cnxk_eth_dev *dev, uint32_t meter_policy_id) +{ + struct cnxk_mtr_policy *fmps = &dev->mtr_policy; + struct cnxk_mtr_policy_node *fmp; + + TAILQ_FOREACH(fmp, fmps, next) + if (meter_policy_id == fmp->id) + return fmp; + return NULL; +} + static int nix_mtr_profile_validate(struct cnxk_eth_dev *dev, uint32_t profile_id, struct rte_mtr_meter_profile *profile, @@ -266,11 +278,83 @@ cnxk_nix_mtr_policy_validate(struct rte_eth_dev *dev, return 0; } +static void +cnxk_fill_policy_actions(struct cnxk_mtr_policy_node *fmp, + struct rte_mtr_meter_policy_params *policy) + +{ + const struct rte_flow_action_meter *mtr; + const struct rte_flow_action *action; + int i; + + for (i = 0; i < RTE_COLORS; i++) { + if (policy->actions[i]) { + for (action = policy->actions[i]; + action->type != RTE_FLOW_ACTION_TYPE_END; + action++) { + if (action->type == + RTE_FLOW_ACTION_TYPE_METER) { + fmp->actions[i].action_fate = + action->type; + mtr = (const struct + rte_flow_action_meter *) + action->conf; + fmp->actions[i].mtr_id = mtr->mtr_id; + } + + if (action->type == RTE_FLOW_ACTION_TYPE_DROP) { + fmp->actions[i].action_fate = + action->type; + } + } + } + } +} + +static int +cnxk_nix_mtr_policy_add(struct rte_eth_dev *eth_dev, uint32_t policy_id, + struct rte_mtr_meter_policy_params *policy, + struct rte_mtr_error *error) +{ + struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); + struct cnxk_mtr_policy *fmps = &dev->mtr_policy; + struct cnxk_mtr_policy_node *fmp; + int rc; + + fmp = nix_mtr_policy_find(dev, policy_id); + if (fmp) { + return -rte_mtr_error_set(error, EEXIST, + RTE_MTR_ERROR_TYPE_METER_POLICY_ID, + NULL, "Policy already exist"); + } + + fmp = plt_zmalloc(sizeof(struct cnxk_mtr_policy_node), ROC_ALIGN); + if (fmp == NULL) { + return -rte_mtr_error_set(error, ENOMEM, + RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL, + "Memory allocation failure"); + } else { + rc = cnxk_nix_mtr_policy_validate(eth_dev, policy, error); + if (rc) + goto exit; + } + + fmp->id = policy_id; + cnxk_fill_policy_actions(fmp, policy); + TAILQ_INSERT_TAIL(fmps, fmp, next); + return 0; + +exit: + plt_free(fmp); + return rc; +} + const struct rte_mtr_ops nix_mtr_ops = { .capabilities_get = cnxk_nix_mtr_capabilities_get, .meter_profile_add = cnxk_nix_mtr_profile_add, .meter_profile_delete = cnxk_nix_mtr_profile_delete, .meter_policy_validate = cnxk_nix_mtr_policy_validate, + .meter_policy_add = cnxk_nix_mtr_policy_add, }; int -- 2.25.1