From patchwork Mon Sep 27 08:22:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunil Kumar Kori X-Patchwork-Id: 99737 X-Patchwork-Delegate: jerinj@marvell.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 9A8E8A0547; Mon, 27 Sep 2021 10:24:56 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E92B341177; Mon, 27 Sep 2021 10:23:19 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 47FFF410DC for ; Mon, 27 Sep 2021 10:23:18 +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 18QNo0VT026911 for ; Mon, 27 Sep 2021 01:23:17 -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=QMdwdAH5n0BFByUXAfkhrZsgoSmB3TEvIJblEYEXU70=; b=iBFzzNxHOGbv2B2xFGGQ/lKiaoCOmadyIAEomCmeV8capqeJPYFgjx7Yi3XqrmAU8+Lg rAMmrWYoh/o7705LlUloNgyjg6QYPCwsXNrihZFwMq9qqwlbg1sOmtxLi8bU9ptMerk/ wO8dPnYFIgTPRujjE6DxYIIwtdoIxMXYQ6oUT8uzXkPY7tGfdFuTxF/KAkYRtQn60X21 UNgLyOvEOY7pSa2MGjReoPIxOZXoqhdlfcKzoCW95TW9B0uZ5P0lWhfmOoltmDuk8c/7 7l+gzZsmw+FHEWmpS/+a03JANXyyBT6XDVvgYbv+VZgCOXaJfhA9KZLjWznsQt/G9s8G Ng== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0b-0016f401.pphosted.com with ESMTP id 3bavvuhtun-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Mon, 27 Sep 2021 01:23:17 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Mon, 27 Sep 2021 01:23:15 -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, 27 Sep 2021 01:23:15 -0700 Received: from localhost.localdomain (unknown [10.28.34.25]) by maili.marvell.com (Postfix) with ESMTP id BD63B3F7099; Mon, 27 Sep 2021 01:23:13 -0700 (PDT) From: To: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao CC: , Rakesh Kudurumalla Date: Mon, 27 Sep 2021 13:52:16 +0530 Message-ID: <20210927082223.757436-20-skori@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210927082223.757436-1-skori@marvell.com> References: <20210927082223.757436-1-skori@marvell.com> MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: g4VaNAscseicAHfyqYgX_qEOK4PkjTxS X-Proofpoint-GUID: g4VaNAscseicAHfyqYgX_qEOK4PkjTxS X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-09-27_02,2021-09-24_02,2020-04-07_01 Subject: [dpdk-dev] [PATCH v2 20/27] 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 CN10K platform. Signed-off-by: Sunil Kumar Kori Signed-off-by: Rakesh Kudurumalla --- v2: - Rebase support on latest DPDK - Handled multilevel chaining for linear hierarchy - Review comments incorporated drivers/net/cnxk/cn10k_ethdev_mtr.c | 84 +++++++++++++++++++++++++++++ drivers/net/cnxk/cnxk_ethdev.c | 1 + drivers/net/cnxk/cnxk_ethdev.h | 31 +++++++++++ 3 files changed, 116 insertions(+) diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c index 922b06cb2b..14f33cfe91 100644 --- a/drivers/net/cnxk/cn10k_ethdev_mtr.c +++ b/drivers/net/cnxk/cn10k_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 @@ cn10k_nix_mtr_policy_validate(struct rte_eth_dev *dev, return 0; } +static void +cn10k_fill_policy_actions(struct cnxk_mtr_policy_node *fmp, + struct rte_mtr_meter_policy_params *policy) + +{ + const struct rte_flow_action *action; + const struct rte_flow_action_meter *mtr; + 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 +cn10k_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 = cn10k_nix_mtr_policy_validate(eth_dev, policy, error); + if (rc) + goto exit; + } + + fmp->id = policy_id; + cn10k_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 = cn10k_nix_mtr_capabilities_get, .meter_profile_add = cn10k_nix_mtr_profile_add, .meter_profile_delete = cn10k_nix_mtr_profile_delete, .meter_policy_validate = cn10k_nix_mtr_policy_validate, + .meter_policy_add = cn10k_nix_mtr_policy_add, }; int diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c index e952aa5ec5..9e75060513 100644 --- a/drivers/net/cnxk/cnxk_ethdev.c +++ b/drivers/net/cnxk/cnxk_ethdev.c @@ -508,6 +508,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 2b9b5beb83..4e45061c86 100644 --- a/drivers/net/cnxk/cnxk_ethdev.h +++ b/drivers/net/cnxk/cnxk_ethdev.h @@ -145,6 +145,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. */ @@ -153,6 +182,7 @@ struct cnxk_mtr_profile_node { }; TAILQ_HEAD(cnxk_mtr_profiles, cnxk_mtr_profile_node); +TAILQ_HEAD(cnxk_mtr_policy, cnxk_mtr_policy_node); struct cnxk_eth_dev { /* ROC NIX */ @@ -223,6 +253,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;