From: Wenzhuo Lu <wenzhuo.lu@intel.com>
To: dev@dpdk.org
Cc: cristian.dumitrescu@intel.com, jasvinder.singh@intel.com,
Wenzhuo Lu <wenzhuo.lu@intel.com>
Subject: [dpdk-dev] [PATCH v3 10/20] net/i40e: support committing TM hierarchy
Date: Thu, 29 Jun 2017 12:23:47 +0800 [thread overview]
Message-ID: <1498710237-80285-11-git-send-email-wenzhuo.lu@intel.com> (raw)
In-Reply-To: <1498710237-80285-1-git-send-email-wenzhuo.lu@intel.com>
Add the support of the Traffic Management API,
rte_tm_hierarchy_commit.
When calling this API, the driver tries to enable
the TM configuration on HW.
Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
---
drivers/net/i40e/i40e_ethdev.c | 5 ++
drivers/net/i40e/i40e_ethdev.h | 9 +++
drivers/net/i40e/i40e_tm.c | 125 ++++++++++++++++++++++++++++++++++++++++
drivers/net/i40e/rte_pmd_i40e.c | 9 ---
4 files changed, 139 insertions(+), 9 deletions(-)
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 90457b1..0c16951 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2032,6 +2032,11 @@ static inline void i40e_GLQF_reg_init(struct i40e_hw *hw)
i40e_filter_restore(pf);
+ if (!pf->tm_conf.committed)
+ PMD_DRV_LOG(WARNING,
+ "please call hierarchy_commit() "
+ "before starting the port");
+
return I40E_SUCCESS;
err_up:
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h
index b8ded55..8989355 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -252,6 +252,15 @@ enum i40e_flxpld_layer_idx {
I40E_INSET_FLEX_PAYLOAD_W5 | I40E_INSET_FLEX_PAYLOAD_W6 | \
I40E_INSET_FLEX_PAYLOAD_W7 | I40E_INSET_FLEX_PAYLOAD_W8)
+/* The max bandwidth of i40e is 40Gbps. */
+#define I40E_QOS_BW_MAX 40000
+/* The bandwidth should be the multiple of 50Mbps. */
+#define I40E_QOS_BW_GRANULARITY 50
+/* The min bandwidth weight is 1. */
+#define I40E_QOS_BW_WEIGHT_MIN 1
+/* The max bandwidth weight is 127. */
+#define I40E_QOS_BW_WEIGHT_MAX 127
+
/**
* The overhead from MTU to max frame size.
* Considering QinQ packet, the VLAN tag needs to be counted twice.
diff --git a/drivers/net/i40e/i40e_tm.c b/drivers/net/i40e/i40e_tm.c
index 435975b..f2c6e33 100644
--- a/drivers/net/i40e/i40e_tm.c
+++ b/drivers/net/i40e/i40e_tm.c
@@ -63,6 +63,9 @@ static int i40e_node_capabilities_get(struct rte_eth_dev *dev,
uint32_t node_id,
struct rte_tm_node_capabilities *cap,
struct rte_tm_error *error);
+static int i40e_hierarchy_commit(struct rte_eth_dev *dev,
+ int clear_on_fail,
+ struct rte_tm_error *error);
const struct rte_tm_ops i40e_tm_ops = {
.capabilities_get = i40e_tm_capabilities_get,
@@ -73,6 +76,7 @@ static int i40e_node_capabilities_get(struct rte_eth_dev *dev,
.node_type_get = i40e_node_type_get,
.level_capabilities_get = i40e_level_capabilities_get,
.node_capabilities_get = i40e_node_capabilities_get,
+ .hierarchy_commit = i40e_hierarchy_commit,
};
int
@@ -847,3 +851,124 @@ static int i40e_node_capabilities_get(struct rte_eth_dev *dev,
return 0;
}
+
+static int
+i40e_hierarchy_commit(struct rte_eth_dev *dev,
+ int clear_on_fail,
+ struct rte_tm_error *error)
+{
+ struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
+ struct i40e_tm_node_list *tc_list = &pf->tm_conf.tc_list;
+ struct i40e_tm_node_list *queue_list = &pf->tm_conf.queue_list;
+ struct i40e_tm_node *tm_node;
+ struct i40e_vsi *vsi;
+ struct i40e_hw *hw;
+ struct i40e_aqc_configure_vsi_ets_sla_bw_data tc_bw;
+ uint64_t bw;
+ uint8_t tc_map;
+ int ret;
+ int i;
+
+ if (!error)
+ return -EINVAL;
+
+ /* check the setting */
+ if (!pf->tm_conf.root)
+ goto done;
+
+ vsi = pf->main_vsi;
+ hw = I40E_VSI_TO_HW(vsi);
+
+ /**
+ * Don't support bandwidth control for port and TCs in parallel.
+ * If the port has a max bandwidth, the TCs should have none.
+ */
+ /* port */
+ bw = pf->tm_conf.root->shaper_profile->profile.peak.rate;
+ if (bw) {
+ /* check if any TC has a max bandwidth */
+ TAILQ_FOREACH(tm_node, tc_list, node) {
+ if (tm_node->shaper_profile->profile.peak.rate) {
+ error->type = RTE_TM_ERROR_TYPE_SHAPER_PROFILE;
+ error->message = "no port and TC max bandwidth"
+ " in parallel";
+ goto fail_clear;
+ }
+ }
+
+ /* interpret Bps to 50Mbps */
+ bw = bw * 8 / 1000 / 1000 / I40E_QOS_BW_GRANULARITY;
+
+ /* set the max bandwidth */
+ ret = i40e_aq_config_vsi_bw_limit(hw, vsi->seid,
+ (uint16_t)bw, 0, NULL);
+ if (ret) {
+ error->type = RTE_TM_ERROR_TYPE_SHAPER_PROFILE;
+ error->message = "fail to set port max bandwidth";
+ goto fail_clear;
+ }
+
+ goto done;
+ }
+
+ /* TC */
+ memset(&tc_bw, 0, sizeof(tc_bw));
+ tc_bw.tc_valid_bits = vsi->enabled_tc;
+ tc_map = vsi->enabled_tc;
+ TAILQ_FOREACH(tm_node, tc_list, node) {
+ if (!tm_node->reference_count) {
+ error->type = RTE_TM_ERROR_TYPE_NODE_PARAMS;
+ error->message = "TC without queue assigned";
+ goto fail_clear;
+ }
+
+ i = 0;
+ while (i < I40E_MAX_TRAFFIC_CLASS && !(tc_map & BIT_ULL(i)))
+ i++;
+ if (i >= I40E_MAX_TRAFFIC_CLASS) {
+ error->type = RTE_TM_ERROR_TYPE_NODE_PARAMS;
+ error->message = "cannot find the TC";
+ goto fail_clear;
+ }
+ tc_map &= ~BIT_ULL(i);
+
+ bw = tm_node->shaper_profile->profile.peak.rate;
+ if (!bw)
+ continue;
+
+ /* interpret Bps to 50Mbps */
+ bw = bw * 8 / 1000 / 1000 / I40E_QOS_BW_GRANULARITY;
+
+ tc_bw.tc_bw_credits[i] = rte_cpu_to_le_16((uint16_t)bw);
+ }
+
+ TAILQ_FOREACH(tm_node, queue_list, node) {
+ bw = tm_node->shaper_profile->profile.peak.rate;
+ if (bw) {
+ error->type = RTE_TM_ERROR_TYPE_NODE_PARAMS;
+ error->message = "not support queue QoS";
+ goto fail_clear;
+ }
+ }
+
+ ret = i40e_aq_config_vsi_ets_sla_bw_limit(hw, vsi->seid, &tc_bw, NULL);
+ if (ret) {
+ error->type = RTE_TM_ERROR_TYPE_SHAPER_PROFILE;
+ error->message = "fail to set TC max bandwidth";
+ goto fail_clear;
+ }
+
+ goto done;
+
+done:
+ pf->tm_conf.committed = true;
+ return 0;
+
+fail_clear:
+ /* clear all the traffic manager configuration */
+ if (clear_on_fail) {
+ i40e_tm_conf_uninit(dev);
+ i40e_tm_conf_init(dev);
+ }
+ return -EINVAL;
+}
diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
index f7ce62b..4f94678 100644
--- a/drivers/net/i40e/rte_pmd_i40e.c
+++ b/drivers/net/i40e/rte_pmd_i40e.c
@@ -40,15 +40,6 @@
#include "i40e_rxtx.h"
#include "rte_pmd_i40e.h"
-/* The max bandwidth of i40e is 40Gbps. */
-#define I40E_QOS_BW_MAX 40000
-/* The bandwidth should be the multiple of 50Mbps. */
-#define I40E_QOS_BW_GRANULARITY 50
-/* The min bandwidth weight is 1. */
-#define I40E_QOS_BW_WEIGHT_MIN 1
-/* The max bandwidth weight is 127. */
-#define I40E_QOS_BW_WEIGHT_MAX 127
-
int
rte_pmd_i40e_ping_vfs(uint8_t port, uint16_t vf)
{
--
1.9.3
next prev parent reply other threads:[~2017-06-29 4:23 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-27 8:17 [dpdk-dev] [PATCH 00/20] traffic manager on i40e and ixgbe Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 01/20] net/i40e: support getting TM ops Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 02/20] net/i40e: support getting TM capability Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 03/20] net/i40e: support adding TM shaper profile Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 04/20] net/i40e: support deleting " Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 05/20] net/i40e: support adding TM node Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 06/20] net/i40e: support deleting " Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 07/20] net/i40e: support getting TM node type Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 08/20] net/i40e: support getting TM level capability Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 09/20] net/i40e: support getting TM node capability Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 10/20] net/i40e: support committing TM hierarchy Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 11/20] net/ixgbe: support getting TM ops Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 12/20] net/ixgbe: support getting TM capability Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 13/20] net/ixgbe: support adding TM shaper profile Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 14/20] net/ixgbe: support deleting " Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 15/20] net/ixgbe: support adding TM node Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 16/20] net/ixgbe: support deleting " Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 17/20] net/ixgbe: support getting TM node type Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 18/20] net/ixgbe: support getting TM level capability Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 19/20] net/ixgbe: support getting TM node capability Wenzhuo Lu
2017-05-27 8:17 ` [dpdk-dev] [PATCH 20/20] net/ixgbe: support committing TM hierarchy Wenzhuo Lu
2017-06-08 11:19 ` [dpdk-dev] [PATCH 00/20] traffic manager on i40e and ixgbe Ferruh Yigit
2017-06-08 12:52 ` Thomas Monjalon
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 " Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 01/20] net/i40e: support getting TM ops Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 02/20] net/i40e: support getting TM capability Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 03/20] net/i40e: support adding TM shaper profile Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 04/20] net/i40e: support deleting " Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 05/20] net/i40e: support adding TM node Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 06/20] net/i40e: support deleting " Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 07/20] net/i40e: support getting TM node type Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 08/20] net/i40e: support getting TM level capability Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 09/20] net/i40e: support getting TM node capability Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 10/20] net/i40e: support committing TM hierarchy Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 11/20] net/ixgbe: support getting TM ops Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 12/20] net/ixgbe: support getting TM capability Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 13/20] net/ixgbe: support adding TM shaper profile Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 14/20] net/ixgbe: support deleting " Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 15/20] net/ixgbe: support adding TM node Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 16/20] net/ixgbe: support deleting " Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 17/20] net/ixgbe: support getting TM node type Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 18/20] net/ixgbe: support getting TM level capability Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 19/20] net/ixgbe: support getting TM node capability Wenzhuo Lu
2017-06-19 5:43 ` [dpdk-dev] [PATCH v2 20/20] net/ixgbe: support committing TM hierarchy Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 00/20] traffic manager on i40e and ixgbe Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 01/20] net/i40e: support getting TM ops Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 02/20] net/i40e: support getting TM capability Wenzhuo Lu
2017-07-09 19:31 ` Thomas Monjalon
2017-07-10 11:17 ` Dumitrescu, Cristian
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 03/20] net/i40e: support adding TM shaper profile Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 04/20] net/i40e: support deleting " Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 05/20] net/i40e: support adding TM node Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 06/20] net/i40e: support deleting " Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 07/20] net/i40e: support getting TM node type Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 08/20] net/i40e: support getting TM level capability Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 09/20] net/i40e: support getting TM node capability Wenzhuo Lu
2017-06-29 4:23 ` Wenzhuo Lu [this message]
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 11/20] net/ixgbe: support getting TM ops Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 12/20] net/ixgbe: support getting TM capability Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 13/20] net/ixgbe: support adding TM shaper profile Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 14/20] net/ixgbe: support deleting " Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 15/20] net/ixgbe: support adding TM node Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 16/20] net/ixgbe: support deleting " Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 17/20] net/ixgbe: support getting TM node type Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 18/20] net/ixgbe: support getting TM level capability Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 19/20] net/ixgbe: support getting TM node capability Wenzhuo Lu
2017-06-29 4:23 ` [dpdk-dev] [PATCH v3 20/20] net/ixgbe: support committing TM hierarchy Wenzhuo Lu
2017-07-04 15:11 ` [dpdk-dev] [PATCH v3 00/20] traffic manager on i40e and ixgbe Dumitrescu, Cristian
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1498710237-80285-11-git-send-email-wenzhuo.lu@intel.com \
--to=wenzhuo.lu@intel.com \
--cc=cristian.dumitrescu@intel.com \
--cc=dev@dpdk.org \
--cc=jasvinder.singh@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).