From: Nithin Dabilpuram Date: Wed, 22 Apr 2020 17:21:01 +0000 (+0530) Subject: ethdev: support TM for shaper config in packet mode X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=bf4e0faae97c89d9f704dc3c71b54248524ea71b;p=dpdk.git ethdev: support TM for shaper config in packet mode Some NIC hardware support shaper to work in packet mode i.e shaping or ratelimiting traffic is in packets per second (PPS) as opposed to default bytes per second (BPS). Hence this patch adds support to configure shared or private shaper in packet mode, provide rate in PPS and add related tm capabilities in port/level/node capability structures. This patch also updates tm port/level/node capability structures with exiting features of scheduler wfq packet mode, scheduler wfq byte mode and private/shared shaper byte mode. SoftNIC PMD is also updated with new capabilities. Signed-off-by: Nithin Dabilpuram Acked-by: Cristian Dumitrescu --- diff --git a/drivers/net/softnic/rte_eth_softnic_tm.c b/drivers/net/softnic/rte_eth_softnic_tm.c index 80a470c9e5..d30976378c 100644 --- a/drivers/net/softnic/rte_eth_softnic_tm.c +++ b/drivers/net/softnic/rte_eth_softnic_tm.c @@ -447,6 +447,8 @@ static const struct rte_tm_capabilities tm_cap = { .shaper_private_dual_rate_n_max = 0, .shaper_private_rate_min = 1, .shaper_private_rate_max = UINT32_MAX, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 1, .shaper_shared_n_max = UINT32_MAX, .shaper_shared_n_nodes_per_shaper_max = UINT32_MAX, @@ -454,6 +456,8 @@ static const struct rte_tm_capabilities tm_cap = { .shaper_shared_dual_rate_n_max = 0, .shaper_shared_rate_min = 1, .shaper_shared_rate_max = UINT32_MAX, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 1, .shaper_pkt_length_adjust_min = RTE_TM_ETH_FRAMING_OVERHEAD_FCS, .shaper_pkt_length_adjust_max = RTE_TM_ETH_FRAMING_OVERHEAD_FCS, @@ -463,6 +467,8 @@ static const struct rte_tm_capabilities tm_cap = { .sched_wfq_n_children_per_group_max = UINT32_MAX, .sched_wfq_n_groups_max = 1, .sched_wfq_weight_max = UINT32_MAX, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 1, .cman_wred_packet_mode_supported = WRED_SUPPORTED, .cman_wred_byte_mode_supported = 0, @@ -548,13 +554,19 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 1, .shaper_private_rate_max = UINT32_MAX, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 1, .shaper_shared_n_max = 0, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 0, .sched_n_children_max = UINT32_MAX, .sched_sp_n_priorities_max = 1, .sched_wfq_n_children_per_group_max = UINT32_MAX, .sched_wfq_n_groups_max = 1, .sched_wfq_weight_max = 1, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 1, .stats_mask = STATS_MASK_DEFAULT, } }, @@ -572,7 +584,11 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 1, .shaper_private_rate_max = UINT32_MAX, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 1, .shaper_shared_n_max = 0, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 0, .sched_n_children_max = UINT32_MAX, .sched_sp_n_priorities_max = 1, @@ -580,9 +596,14 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = { .sched_wfq_n_groups_max = 1, #ifdef RTE_SCHED_SUBPORT_TC_OV .sched_wfq_weight_max = UINT32_MAX, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 1, #else .sched_wfq_weight_max = 1, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 1, #endif + .stats_mask = STATS_MASK_DEFAULT, } }, }, @@ -599,7 +620,11 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 1, .shaper_private_rate_max = UINT32_MAX, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 1, .shaper_shared_n_max = 0, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 0, .sched_n_children_max = RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE, @@ -608,6 +633,8 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = { .sched_wfq_n_children_per_group_max = 1, .sched_wfq_n_groups_max = 0, .sched_wfq_weight_max = 1, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 0, .stats_mask = STATS_MASK_DEFAULT, } }, @@ -625,7 +652,11 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 1, .shaper_private_rate_max = UINT32_MAX, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 1, .shaper_shared_n_max = 1, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 1, .sched_n_children_max = RTE_SCHED_BE_QUEUES_PER_PIPE, @@ -634,6 +665,8 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = { RTE_SCHED_BE_QUEUES_PER_PIPE, .sched_wfq_n_groups_max = 1, .sched_wfq_weight_max = UINT32_MAX, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 1, .stats_mask = STATS_MASK_DEFAULT, } }, @@ -651,7 +684,11 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 0, .shaper_private_rate_max = 0, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 0, .shaper_shared_n_max = 0, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 0, .cman_head_drop_supported = 0, .cman_wred_packet_mode_supported = WRED_SUPPORTED, @@ -736,7 +773,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 1, .shaper_private_rate_max = UINT32_MAX, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 1, .shaper_shared_n_max = 0, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 0, {.nonleaf = { .sched_n_children_max = UINT32_MAX, @@ -744,6 +785,8 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { .sched_wfq_n_children_per_group_max = UINT32_MAX, .sched_wfq_n_groups_max = 1, .sched_wfq_weight_max = 1, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 1, } }, .stats_mask = STATS_MASK_DEFAULT, @@ -754,7 +797,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 1, .shaper_private_rate_max = UINT32_MAX, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 1, .shaper_shared_n_max = 0, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 0, {.nonleaf = { .sched_n_children_max = UINT32_MAX, @@ -762,6 +809,8 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { .sched_wfq_n_children_per_group_max = UINT32_MAX, .sched_wfq_n_groups_max = 1, .sched_wfq_weight_max = UINT32_MAX, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 1, } }, .stats_mask = STATS_MASK_DEFAULT, @@ -772,7 +821,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 1, .shaper_private_rate_max = UINT32_MAX, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 1, .shaper_shared_n_max = 0, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 0, {.nonleaf = { .sched_n_children_max = @@ -782,6 +835,8 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { .sched_wfq_n_children_per_group_max = 1, .sched_wfq_n_groups_max = 0, .sched_wfq_weight_max = 1, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 0, } }, .stats_mask = STATS_MASK_DEFAULT, @@ -792,7 +847,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 1, .shaper_private_rate_max = UINT32_MAX, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 1, .shaper_shared_n_max = 1, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 1, {.nonleaf = { .sched_n_children_max = @@ -802,6 +861,8 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { RTE_SCHED_BE_QUEUES_PER_PIPE, .sched_wfq_n_groups_max = 1, .sched_wfq_weight_max = UINT32_MAX, + .sched_wfq_packet_mode_supported = 0, + .sched_wfq_byte_mode_supported = 1, } }, .stats_mask = STATS_MASK_DEFAULT, @@ -812,7 +873,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = { .shaper_private_dual_rate_supported = 0, .shaper_private_rate_min = 0, .shaper_private_rate_max = 0, + .shaper_private_packet_mode_supported = 0, + .shaper_private_byte_mode_supported = 0, .shaper_shared_n_max = 0, + .shaper_shared_packet_mode_supported = 0, + .shaper_shared_byte_mode_supported = 0, {.leaf = { @@ -947,6 +1012,13 @@ shaper_profile_check(struct rte_eth_dev *dev, NULL, rte_strerror(EINVAL)); + /* Packet mode is not supported. */ + if (profile->packet_mode != 0) + return -rte_tm_error_set(error, + EINVAL, + RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PACKET_MODE, + NULL, + rte_strerror(EINVAL)); return 0; } diff --git a/lib/librte_ethdev/rte_tm.h b/lib/librte_ethdev/rte_tm.h index c80c0bc794..175417a15f 100644 --- a/lib/librte_ethdev/rte_tm.h +++ b/lib/librte_ethdev/rte_tm.h @@ -251,6 +251,23 @@ struct rte_tm_capabilities { */ uint64_t shaper_private_rate_max; + /** Shaper private packet mode supported. When non-zero, this parameter + * indicates that there is at least one node that can be configured + * with packet mode in its private shaper. When shaper is configured + * in packet mode, committed/peak rate provided is interpreted + * in packets per second. + */ + int shaper_private_packet_mode_supported; + + /** Shaper private byte mode supported. When non-zero, this parameter + * indicates that there is at least one node that can be configured + * with byte mode in its private shaper. When shaper is configured + * in byte mode, committed/peak rate provided is interpreted in + * bytes per second. + */ + int shaper_private_byte_mode_supported; + + /** Maximum number of shared shapers. The value of zero indicates that * shared shapers are not supported. */ @@ -285,6 +302,21 @@ struct rte_tm_capabilities { */ uint64_t shaper_shared_rate_max; + /** Shaper shared packet mode supported. When non-zero, this parameter + * indicates a shared shaper can be configured with packet mode. + * When shared shaper is configured in packet mode, committed/peak rate + * provided is interpreted in packets per second. + */ + int shaper_shared_packet_mode_supported; + + /** Shaper shared byte mode supported. When non-zero, this parameter + * indicates that a shared shaper can be configured with byte mode. + * When shared shaper is configured in byte mode, committed/peak rate + * provided is interpreted in bytes per second. + */ + int shaper_shared_byte_mode_supported; + + /** Minimum value allowed for packet length adjustment for any private * or shared shaper. */ @@ -340,6 +372,22 @@ struct rte_tm_capabilities { */ uint32_t sched_wfq_weight_max; + /** WFQ packet mode supported. When non-zero, this parameter indicates + * that there is at least one non-leaf node that supports packet mode + * for WFQ among its children. WFQ weights will be applied against + * packet count for scheduling children when a non-leaf node + * is configured appropriately. + */ + int sched_wfq_packet_mode_supported; + + /** WFQ byte mode supported. When non-zero, this parameter indicates + * that there is at least one non-leaf node that supports byte mode + * for WFQ among its children. WFQ weights will be applied against + * bytes for scheduling children when a non-leaf node is configured + * appropriately. + */ + int sched_wfq_byte_mode_supported; + /** WRED packet mode support. When non-zero, this parameter indicates * that there is at least one leaf node that supports the WRED packet * mode, which might not be true for all the leaf nodes. In packet @@ -486,6 +534,24 @@ struct rte_tm_level_capabilities { */ uint64_t shaper_private_rate_max; + /** Shaper private packet mode supported. When non-zero, + * this parameter indicates there is at least one + * non-leaf node at this level that can be configured + * with packet mode in its private shaper. When private + * shaper is configured in packet mode, committed/peak + * rate provided is interpreted in packets per second. + */ + int shaper_private_packet_mode_supported; + + /** Shaper private byte mode supported. When non-zero, + * this parameter indicates there is at least one + * non-leaf node at this level that can be configured + * with byte mode in its private shaper. When private + * shaper is configured in byte mode, committed/peak + * rate provided is interpreted in bytes per second. + */ + int shaper_private_byte_mode_supported; + /** Maximum number of shared shapers that any non-leaf * node on this level can be part of. The value of zero * indicates that shared shapers are not supported by @@ -496,6 +562,20 @@ struct rte_tm_level_capabilities { */ uint32_t shaper_shared_n_max; + /** Shaper shared packet mode supported. When non-zero, + * this parameter indicates that there is at least one + * non-leaf node on this level that can be part of + * shared shapers which work in packet mode. + */ + int shaper_shared_packet_mode_supported; + + /** Shaper shared byte mode supported. When non-zero, + * this parameter indicates that there is at least one + * non-leaf node on this level that can be part of + * shared shapers which work in byte mode. + */ + int shaper_shared_byte_mode_supported; + /** Maximum number of children nodes. This parameter * indicates that there is at least one non-leaf node on * this level that can be configured with this many @@ -555,6 +635,25 @@ struct rte_tm_level_capabilities { */ uint32_t sched_wfq_weight_max; + /** WFQ packet mode supported. When non-zero, this + * parameter indicates that there is at least one + * non-leaf node at this level that supports packet + * mode for WFQ among its children. WFQ weights will + * be applied against packet count for scheduling + * children when a non-leaf node is configured + * appropriately. + */ + int sched_wfq_packet_mode_supported; + + /** WFQ byte mode supported. When non-zero, this + * parameter indicates that there is at least one + * non-leaf node at this level that supports byte + * mode for WFQ among its children. WFQ weights will + * be applied against bytes for scheduling children + * when a non-leaf node is configured appropriately. + */ + int sched_wfq_byte_mode_supported; + /** Mask of statistics counter types supported by the * non-leaf nodes on this level. Every supported * statistics counter type is supported by at least one @@ -597,6 +696,24 @@ struct rte_tm_level_capabilities { */ uint64_t shaper_private_rate_max; + /** Shaper private packet mode supported. When non-zero, + * this parameter indicates there is at least one leaf + * node at this level that can be configured with + * packet mode in its private shaper. When private + * shaper is configured in packet mode, committed/peak + * rate provided is interpreted in packets per second. + */ + int shaper_private_packet_mode_supported; + + /** Shaper private byte mode supported. When non-zero, + * this parameter indicates there is at least one leaf + * node at this level that can be configured with + * byte mode in its private shaper. When private shaper + * is configured in byte mode, committed/peak rate + * provided is interpreted in bytes per second. + */ + int shaper_private_byte_mode_supported; + /** Maximum number of shared shapers that any leaf node * on this level can be part of. The value of zero * indicates that shared shapers are not supported by @@ -607,6 +724,20 @@ struct rte_tm_level_capabilities { */ uint32_t shaper_shared_n_max; + /** Shaper shared packet mode supported. When non-zero, + * this parameter indicates that there is at least one + * leaf node on this level that can be part of + * shared shapers which work in packet mode. + */ + int shaper_shared_packet_mode_supported; + + /** Shaper shared byte mode supported. When non-zero, + * this parameter indicates that there is at least one + * leaf node on this level that can be part of + * shared shapers which work in byte mode. + */ + int shaper_shared_byte_mode_supported; + /** WRED packet mode support. When non-zero, this * parameter indicates that there is at least one leaf * node on this level that supports the WRED packet @@ -687,12 +818,38 @@ struct rte_tm_node_capabilities { */ uint64_t shaper_private_rate_max; + /** Shaper private packet mode supported. When non-zero, this parameter + * indicates private shaper of current node can be configured with + * packet mode. When configured in packet mode, committed/peak rate + * provided is interpreted in packets per second. + */ + int shaper_private_packet_mode_supported; + + /** Shaper private byte mode supported. When non-zero, this parameter + * indicates private shaper of current node can be configured with + * byte mode. When configured in byte mode, committed/peak rate + * provided is interpreted in bytes per second. + */ + int shaper_private_byte_mode_supported; + /** Maximum number of shared shapers the current node can be part of. * The value of zero indicates that shared shapers are not supported by * the current node. */ uint32_t shaper_shared_n_max; + /** Shaper shared packet mode supported. When non-zero, + * this parameter indicates that current node can be part of + * shared shapers which work in packet mode. + */ + int shaper_shared_packet_mode_supported; + + /** Shaper shared byte mode supported. When non-zero, + * this parameter indicates that current node can be part of + * shared shapers which work in byte mode. + */ + int shaper_shared_byte_mode_supported; + RTE_STD_C11 union { /** Items valid only for non-leaf nodes. */ @@ -736,6 +893,23 @@ struct rte_tm_node_capabilities { * WFQ weight, so WFQ is reduced to FQ. */ uint32_t sched_wfq_weight_max; + + /** WFQ packet mode supported. When non-zero, this + * parameter indicates that current node supports packet + * mode for WFQ among its children. WFQ weights will be + * applied against packet count for scheduling children + * when configured appropriately. + */ + int sched_wfq_packet_mode_supported; + + /** WFQ byte mode supported. When non-zero, this + * parameter indicates that current node supports byte + * mode for WFQ among its children. WFQ weights will be + * applied against bytes for scheduling children when + * configured appropriately. + */ + int sched_wfq_byte_mode_supported; + } nonleaf; /** Items valid only for leaf nodes. */ @@ -837,10 +1011,10 @@ struct rte_tm_wred_params { * Token bucket */ struct rte_tm_token_bucket { - /** Token bucket rate (bytes per second) */ + /** Token bucket rate (bytes per second or packets per second) */ uint64_t rate; - /** Token bucket size (bytes), a.k.a. max burst size */ + /** Token bucket size (bytes or packets), a.k.a. max burst size */ uint64_t size; }; @@ -861,6 +1035,11 @@ struct rte_tm_token_bucket { * Dual rate shapers use both the committed and the peak token buckets. The * rate of the peak bucket has to be bigger than zero, as well as greater than * or equal to the rate of the committed bucket. + * + * @see struct rte_tm_capabilities::shaper_private_packet_mode_supported + * @see struct rte_tm_capabilities::shaper_private_byte_mode_supported + * @see struct rte_tm_capabilities::shaper_shared_packet_mode_supported + * @see struct rte_tm_capabilities::shaper_shared_byte_mode_supported */ struct rte_tm_shaper_params { /** Committed token bucket */ @@ -873,8 +1052,19 @@ struct rte_tm_shaper_params { * purpose of shaping. Can be used to correct the packet length with * the framing overhead bytes that are also consumed on the wire (e.g. * RTE_TM_ETH_FRAMING_OVERHEAD_FCS). + * This field is ignored when the profile enables packet mode. */ int32_t pkt_length_adjust; + + /** When zero, the byte mode is enabled for the current profile, so the + * *rate* and *size* fields in both the committed and peak token buckets + * are specified in bytes per second and bytes, respectively. + * When non-zero, the packet mode is enabled for the current profile, + * so the *rate* and *size* fields in both the committed and peak token + * buckets are specified in packets per second and packets, + * respectively. + */ + int packet_mode; }; /** @@ -926,6 +1116,8 @@ struct rte_tm_node_params { * When non-NULL, it points to a pre-allocated array of * *n_sp_priorities* values, with non-zero value for * byte-mode and zero for packet-mode. + * @see struct rte_tm_node_capabilities::sched_wfq_packet_mode_supported + * @see struct rte_tm_node_capabilities::sched_wfq_byte_mode_supported */ int *wfq_weight_mode; @@ -998,6 +1190,7 @@ enum rte_tm_error_type { RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PEAK_RATE, RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PEAK_SIZE, RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PKT_ADJUST_LEN, + RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PACKET_MODE, RTE_TM_ERROR_TYPE_SHAPER_PROFILE_ID, RTE_TM_ERROR_TYPE_SHARED_SHAPER_ID, RTE_TM_ERROR_TYPE_NODE_PARENT_NODE_ID,