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 CF4DFA034F; Mon, 11 Oct 2021 17:53:16 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2706941175; Mon, 11 Oct 2021 17:51:54 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 9C6A44115A for ; Mon, 11 Oct 2021 17:51:52 +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 19BEHcPv030591 for ; Mon, 11 Oct 2021 08:51:51 -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=vpI3k8nnJM+uQAdeVgLfYIq5pQ0CnA5fBqA8EtN2YkU=; b=OZvr5V0M7x6MFt+mQdy+wo8cmEn0XOQwYtAhvdvW+VPB6IuP/Bbi3HnA7DakT7xRDbEB YZPJgi1YreNYQlsiFWfvRGMHIQ26pPSPUEZbEm2xqfWU0N0xUQTo7IxFb/sxoir1cmfl mVCqp/2H93lWljEYcKcaOFrrPKr/CehRPNTK3vA/3Oxdhjy2jcPtW/EDEqJha/yRmeA/ WQMflIRd+mxtaZG/7MO2BUCxc7Ys9GIIu4KzLWK6kXeI+wQDyrP3VxJ8cY39RI7jrBcB 87ApuwHPLXgqFYb9tPcU8wSjmjheGG+Ij96q8LJ1h59Quwvra4VP1KkatEK0/e7JXG/5 DA== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com with ESMTP id 3bmpv4rc3x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Mon, 11 Oct 2021 08:51:51 -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:51:49 -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:51:49 -0700 Received: from localhost.localdomain (unknown [10.28.34.25]) by maili.marvell.com (Postfix) with ESMTP id 89AEE3F705B; Mon, 11 Oct 2021 08:51:47 -0700 (PDT) From: To: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao CC: , Rakesh Kudurumalla Date: Mon, 11 Oct 2021 21:20:48 +0530 Message-ID: <20211011155057.302142-21-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: Kl70R2J2I4nblf1_UILwGygUS4slKcQj X-Proofpoint-GUID: Kl70R2J2I4nblf1_UILwGygUS4slKcQj 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 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 --- 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 ec34327756..187a0b90b2 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