[dpdk-dev] [RFC PATCH v4 1/3] sched: add PIE based congestion management
Dumitrescu, Cristian
cristian.dumitrescu at intel.com
Fri Jul 16 15:20:13 CEST 2021
Hi Wojciech,
> -----Original Message-----
> From: Liguzinski, WojciechX <wojciechx.liguzinski at intel.com>
> Sent: Monday, July 5, 2021 9:04 AM
> To: dev at dpdk.org; Singh, Jasvinder <jasvinder.singh at intel.com>;
> Dumitrescu, Cristian <cristian.dumitrescu at intel.com>
> Cc: Dharmappa, Savinay <savinay.dharmappa at intel.com>; Ajmera, Megha
> <megha.ajmera at intel.com>
> Subject: [RFC PATCH v4 1/3] sched: add PIE based congestion management
>
> Implement PIE based congestion management based on rfc8033
>
> Signed-off-by: Liguzinski, WojciechX <wojciechx.liguzinski at intel.com>
> ---
> drivers/net/softnic/rte_eth_softnic_tm.c | 6 +-
> lib/sched/meson.build | 10 +-
> lib/sched/rte_pie.c | 82 +++++
> lib/sched/rte_pie.h | 393 +++++++++++++++++++++++
> lib/sched/rte_sched.c | 229 +++++++++----
> lib/sched/rte_sched.h | 53 ++-
> lib/sched/version.map | 3 +
> 7 files changed, 685 insertions(+), 91 deletions(-)
> create mode 100644 lib/sched/rte_pie.c
> create mode 100644 lib/sched/rte_pie.h
>
<snip>
> diff --git a/lib/sched/rte_sched.h b/lib/sched/rte_sched.h
> index c1a772b70c..a5fe6266cd 100644
> --- a/lib/sched/rte_sched.h
> +++ b/lib/sched/rte_sched.h
> @@ -61,9 +61,10 @@ extern "C" {
> #include <rte_mbuf.h>
> #include <rte_meter.h>
>
> -/** Random Early Detection (RED) */
> -#ifdef RTE_SCHED_RED
> +/** Active Queue Management */
> +#ifdef RTE_SCHED_AQM
We typically use the term Congestion Management for this, it is already used in rte_tm.h for example. Please replace AQM with CMAN _everywhere_:
#ifdef RTE_SCHED_CMAN
> #include "rte_red.h"
> +#include "rte_pie.h"
> #endif
>
> /** Maximum number of queues per pipe.
> @@ -110,6 +111,28 @@ extern "C" {
> #define RTE_SCHED_FRAME_OVERHEAD_DEFAULT 24
> #endif
>
> +/**
> + * Active Queue Management (AQM) mode
> + *
> + * This is used for controlling the admission of packets into a packet queue
> or
> + * group of packet queues on congestion.
> + *
> + * The *Random Early Detection (RED)* algorithm works by proactively
> dropping
> + * more and more input packets as the queue occupancy builds up. When
> the queue
> + * is full or almost full, RED effectively works as *tail drop*. The *Weighted
> + * RED* algorithm uses a separate set of RED thresholds for each packet
> color.
> + *
> + * Similar to RED, Proportional Integral Controller Enhanced (PIE) randomly
> + * drops a packet at the onset of the congestion and tries to control the
> + * latency around the target value. The congestion detection, however, is
> based
> + * on the queueing latency instead of the queue length like RED. For more
> + * information, refer RFC8033.
> + */
> +enum rte_sched_aqm_mode {
> + RTE_SCHED_AQM_WRED, /**< Weighted Random Early Detection
> (WRED) */
> + RTE_SCHED_AQM_PIE, /**< Proportional Integral Controller
> Enhanced (PIE) */
> +};
> +
> /*
> * Pipe configuration parameters. The period and credits_per_period
> * parameters are measured in bytes, with one byte meaning the time
> @@ -174,9 +197,17 @@ struct rte_sched_subport_params {
> /** Max allowed profiles in the pipe profile table */
> uint32_t n_max_pipe_profiles;
>
> -#ifdef RTE_SCHED_RED
> - /** RED parameters */
> - struct rte_red_params
> red_params[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE][RTE_COLORS];
> +#ifdef RTE_SCHED_AQM
> + /** Active Queue Management mode */
> + enum rte_sched_aqm_mode aqm;
> +
> + RTE_STD_C11
> + union {
> + /** WRED parameters */
> + struct rte_red_params
> wred_params[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE][RTE_COLORS];
> + /** PIE parameters */
> + struct rte_pie_params
> pie_params[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];
> + };
> #endif
> };
>
We cannot have definitions of global variables in header files, we can only have extern declarations in header files and the definition in .c files.
Please create a global structure called rte_sched_cman_params that includes the both the WRED and the PIE parameters:
struct rte_sched_cman_params {
enum rte_sched_cman cman_mode;
union {
/** WRED parameters */
struct rte_red_params red_params[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE][RTE_COLORS];
/** PIE parameters */
struct rte_pie_params pie_params[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];
};
};
Then please instantiate this structure in one of the .c files.
Please do not rename red to wred (as done in multiple places in this patch set).
> @@ -208,9 +239,9 @@ struct rte_sched_subport_stats {
> /** Number of bytes dropped for each traffic class */
> uint64_t
> n_bytes_tc_dropped[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];
>
> -#ifdef RTE_SCHED_RED
> - /** Number of packets dropped by red */
> - uint64_t
> n_pkts_red_dropped[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];
> +#ifdef RTE_SCHED_AQM
> + /** Number of packets dropped by active queue management
> scheme */
> + uint64_t
> n_pkts_aqm_dropped[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];
> #endif
> };
>
Please remove the #ifdefs and consolidate these stats into a single generic structure:
struct rte_sched_subport_stats {
...
uint64_t n_pkts_cman_dropped[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE];
...
};
You can use the n_pkts_cman_dropped field for both WRED and PIE, depending on the cman_mode.
> @@ -222,9 +253,9 @@ struct rte_sched_queue_stats {
> /** Packets dropped */
> uint64_t n_pkts_dropped;
>
> -#ifdef RTE_SCHED_RED
> - /** Packets dropped by RED */
> - uint64_t n_pkts_red_dropped;
> +#ifdef RTE_SCHED_AQM
> + /** Packets dropped by active queue management scheme */
> + uint64_t n_pkts_aqm_dropped;
> #endif
>
> /** Bytes successfully written */
Please remove the #ifdefs and consolidate these stats into a single generic structure:
struct rte_sched_queue_stats {
...
uint64_t n_pkts_cman_dropped;
...
};
You can use the n_pkts_cman_dropped field for both WRED and PIE, depending on the cman_mode.
Regards,
Cristian
More information about the dev
mailing list