From patchwork Tue Feb 20 13:30:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Rao, Nikhil" X-Patchwork-Id: 35303 X-Patchwork-Delegate: cristian.dumitrescu@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C84071D9E; Tue, 20 Feb 2018 14:31:38 +0100 (CET) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id F0D361BE0 for ; Tue, 20 Feb 2018 14:31:36 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Feb 2018 05:31:36 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,539,1511856000"; d="scan'208";a="36063923" Received: from unknown (HELO localhost.localdomain.localdomain) ([10.224.122.193]) by orsmga002.jf.intel.com with ESMTP; 20 Feb 2018 05:31:33 -0800 From: Nikhil Rao To: cristian.dumitrescu@intel.com Cc: dev@dpdk.org, benjamin.h.shelton@intel.com, narender.vangati@intel.com, abhinandan.gujjar@intel.com, nikhil.rao@intel.com Date: Tue, 20 Feb 2018 08:30:53 -0500 Message-Id: <1519133453-109024-1-git-send-email-nikhil.rao@intel.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH] ethdev: add support for WRED thresholds in bytes X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" WRED thresholds can be specified in bytes if the TM leaf node supports it. Also extend WRED thresholds to 32 bits from 16. TM capability (port/level/queue) fields cman_wred_packet_mode_supported and cman_wred_byte_mode_supported, when non-zero, indicate support for WRED thresholds in packets and bytes respectively. The packet_mode member of struct rte_tm_wred_params, when non-zero, indicates that the min and max thresholds are specified in packets and when zero, indicates that the min and max thresholds are specified in bytes. Signed-off-by: Nikhil Rao Acked-by: Cristian Dumitrescu --- Thanks to Cristian for his help with developing this patch. lib/librte_ether/rte_tm.h | 53 ++++++++++++++++++++++++++++++-- drivers/net/softnic/rte_eth_softnic_tm.c | 22 +++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/lib/librte_ether/rte_tm.h b/lib/librte_ether/rte_tm.h index 2b25a87..23098ab 100644 --- a/lib/librte_ether/rte_tm.h +++ b/lib/librte_ether/rte_tm.h @@ -377,6 +377,22 @@ struct rte_tm_capabilities { */ uint32_t sched_wfq_weight_max; + /** WRED packet mode support. When non-zero, this parameter indicates + * that there is atleast one leaf node that supports the WRED packet + * mode, which might not be true for all the leaf nodes. In packet + * mode, the WRED thresholds specify the queue length in packets, as + * opposed to bytes. + */ + int cman_wred_packet_mode_supported; + + /** WRED byte mode support. When non-zero, this parameter indicates that + * there is atleast one leaf node that supports the WRED byte mode, + * which might not be true for all the leaf nodes. In byte mode, the + * WRED thresholds specify the queue length in bytes, as opposed to + * packets. + */ + int cman_wred_byte_mode_supported; + /** Head drop algorithm support. When non-zero, this parameter * indicates that there is at least one leaf node that supports the head * drop algorithm, which might not be true for all the leaf nodes. @@ -628,6 +644,24 @@ struct rte_tm_level_capabilities { */ uint32_t shaper_shared_n_max; + /** WRED packet mode support. When non-zero, this + * parameter indicates that there is atleast one leaf + * node on this level that supports the WRED packet + * mode, which might not be true for all the leaf + * nodes. In packet mode, the WRED thresholds specify + * the queue length in packets, as opposed to bytes. + */ + int cman_wred_packet_mode_supported; + + /** WRED byte mode support. When non-zero, this + * parameter indicates that there is atleast one leaf + * node on this level that supports the WRED byte mode, + * which might not be true for all the leaf nodes. In + * byte mode, the WRED thresholds specify the queue + * length in bytes, as opposed to packets. + */ + int cman_wred_byte_mode_supported; + /** Head drop algorithm support. When non-zero, this * parameter indicates that there is at least one leaf * node on this level that supports the head drop @@ -743,6 +777,12 @@ struct rte_tm_node_capabilities { /** Items valid only for leaf nodes. */ struct { + /** WRED packet mode support for current node. */ + int cman_wred_packet_mode_supported; + + /** WRED byte mode support for current node. */ + int cman_wred_byte_mode_supported; + /** Head drop algorithm support for current node. */ int cman_head_drop_supported; @@ -791,10 +831,10 @@ enum rte_tm_cman_mode { */ struct rte_tm_red_params { /** Minimum queue threshold */ - uint16_t min_th; + uint32_t min_th; /** Maximum queue threshold */ - uint16_t max_th; + uint32_t max_th; /** Inverse of packet marking probability maximum value (maxp), i.e. * maxp_inv = 1 / maxp @@ -815,10 +855,19 @@ struct rte_tm_red_params { * WRED context is used to perform congestion management for a single leaf * node, while a shared WRED context is used to perform congestion management * for a group of leaf nodes. + * + * @see struct rte_tm_capabilities::cman_wred_packet_mode_supported + * @see struct rte_tm_capabilities::cman_wred_byte_mode_supported */ struct rte_tm_wred_params { /** One set of RED parameters per packet color */ struct rte_tm_red_params red_params[RTE_TM_COLORS]; + + /** When non-zero, the *min_th* and *max_th* thresholds are specified + * in packets (WRED packet mode). When zero, the *min_th* and *max_th* + * thresholds are specified in bytes (WRED byte mode) + */ + int packet_mode; }; /** diff --git a/drivers/net/softnic/rte_eth_softnic_tm.c b/drivers/net/softnic/rte_eth_softnic_tm.c index 79f1c6a..e915c36 100644 --- a/drivers/net/softnic/rte_eth_softnic_tm.c +++ b/drivers/net/softnic/rte_eth_softnic_tm.c @@ -479,6 +479,8 @@ .sched_wfq_n_groups_max = 1, .sched_wfq_weight_max = UINT32_MAX, + .cman_wred_packet_mode_supported = WRED_SUPPORTED, + .cman_wred_byte_mode_supported = 0, .cman_head_drop_supported = 0, .cman_wred_context_n_max = 0, .cman_wred_context_private_n_max = 0, @@ -667,6 +669,8 @@ .shaper_shared_n_max = 0, .cman_head_drop_supported = 0, + .cman_wred_packet_mode_supported = WRED_SUPPORTED, + .cman_wred_byte_mode_supported = 0, .cman_wred_context_private_supported = WRED_SUPPORTED, .cman_wred_context_shared_n_max = 0, @@ -828,6 +832,8 @@ {.leaf = { .cman_head_drop_supported = 0, + .cman_wred_packet_mode_supported = WRED_SUPPORTED, + .cman_wred_byte_mode_supported = 0, .cman_wred_context_private_supported = WRED_SUPPORTED, .cman_wred_context_shared_n_max = 0, } }, @@ -1226,6 +1232,14 @@ NULL, rte_strerror(EINVAL)); + /* WRED profile should be in packet mode */ + if (profile->packet_mode == 0) + return -rte_tm_error_set(error, + ENOTSUP, + RTE_TM_ERROR_TYPE_WRED_PROFILE, + NULL, + rte_strerror(ENOTSUP)); + /* WRED profile must not exist. */ wp = tm_wred_profile_search(dev, wred_profile_id); if (wp) @@ -1248,6 +1262,14 @@ uint16_t min_th = profile->red_params[color].min_th; uint16_t max_th = profile->red_params[color].max_th; + if (profile->red_params[color].min_th >= (1 << 16) || + profile->red_params[color].max_th >= (1 << 16)) + return -rte_tm_error_set(error, + EINVAL, + RTE_TM_ERROR_TYPE_WRED_PROFILE, + NULL, + rte_strerror(EINVAL)); + if (min_th > max_th || max_th == 0) return -rte_tm_error_set(error, EINVAL,