From 2fcf2f104fa2ed26b3cea2f4018b25974dc59c2d Mon Sep 17 00:00:00 2001 From: Nikhil Rao Date: Tue, 20 Feb 2018 08:30:53 -0500 Subject: [PATCH] ethdev: support WRED thresholds in bytes 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 --- drivers/net/softnic/rte_eth_softnic_tm.c | 23 ++++++++-- lib/librte_ethdev/rte_tm.h | 53 +++++++++++++++++++++++- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/drivers/net/softnic/rte_eth_softnic_tm.c b/drivers/net/softnic/rte_eth_softnic_tm.c index 79f1c6a8e5..11d638a98a 100644 --- a/drivers/net/softnic/rte_eth_softnic_tm.c +++ b/drivers/net/softnic/rte_eth_softnic_tm.c @@ -479,6 +479,8 @@ static const struct rte_tm_capabilities tm_cap = { .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 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = { .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 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { {.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, } }, @@ -1243,12 +1249,23 @@ wred_profile_check(struct rte_eth_dev *dev, 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)); + /* min_th <= max_th, max_th > 0 */ for (color = RTE_TM_GREEN; color < RTE_TM_COLORS; color++) { - uint16_t min_th = profile->red_params[color].min_th; - uint16_t max_th = profile->red_params[color].max_th; + uint32_t min_th = profile->red_params[color].min_th; + uint32_t max_th = profile->red_params[color].max_th; - if (min_th > max_th || max_th == 0) + if (min_th > max_th || + max_th == 0 || + min_th > UINT16_MAX || + max_th > UINT16_MAX) return -rte_tm_error_set(error, EINVAL, RTE_TM_ERROR_TYPE_WRED_PROFILE, diff --git a/lib/librte_ethdev/rte_tm.h b/lib/librte_ethdev/rte_tm.h index f735f8459f..7255403847 100644 --- a/lib/librte_ethdev/rte_tm.h +++ b/lib/librte_ethdev/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; }; /**