ethdev: support WRED thresholds in bytes
authorNikhil Rao <nikhil.rao@intel.com>
Tue, 20 Feb 2018 13:30:53 +0000 (08:30 -0500)
committerCristian Dumitrescu <cristian.dumitrescu@intel.com>
Fri, 4 May 2018 14:23:19 +0000 (16:23 +0200)
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 <nikhil.rao@intel.com>
drivers/net/softnic/rte_eth_softnic_tm.c
lib/librte_ethdev/rte_tm.h

index 79f1c6a..11d638a 100644 (file)
@@ -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,
index f735f84..7255403 100644 (file)
@@ -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;
 };
 
 /**