Commit 29f834aa authored by Eric Dumazet's avatar Eric Dumazet Committed by Paolo Abeni

net_sched: sch_fq: add 3 bands and WRR scheduling

Before Google adopted FQ for its production servers,
we had to ensure AF4 packets would get a higher share
than BE1 ones.

As discussed this week in Netconf 2023 in Paris, it is time
to upstream this for public use.

After this patch FQ can replace pfifo_fast, with the following
differences :

- FQ uses WRR instead of strict prio, to avoid starvation of
  low priority packets.

- We make sure each band/prio tracks its own usage against sch->limit.
  This was done to make sure flood of low priority packets would not
  prevent AF4 packets to be queued. Contributed by Willem.

- priomap can be changed, if needed (default value are the ones
  coming from pfifo_fast).

In this patch, we set default band weights so that :

- high prio (band=0) packets get 90% of the bandwidth
  if they compete with low prio (band=2) packets.

- high prio packets get 75% of the bandwidth
  if they compete with medium prio (band=1) packets.

Following patch in this series adds the possibility to tune
the per-band weights.

As we added many fields in 'struct fq_sched_data', we had
to make sure to have the first cache line read-mostly, and
avoid wasting precious cache lines.

More optimizations are possible but will be sent separately.
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Acked-by: default avatarDave Taht <dave.taht@gmail.com>
Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
Reviewed-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 5579ee46
...@@ -941,15 +941,19 @@ enum { ...@@ -941,15 +941,19 @@ enum {
TCA_FQ_HORIZON_DROP, /* drop packets beyond horizon, or cap their EDT */ TCA_FQ_HORIZON_DROP, /* drop packets beyond horizon, or cap their EDT */
TCA_FQ_PRIOMAP, /* prio2band */
__TCA_FQ_MAX __TCA_FQ_MAX
}; };
#define TCA_FQ_MAX (__TCA_FQ_MAX - 1) #define TCA_FQ_MAX (__TCA_FQ_MAX - 1)
#define FQ_BANDS 3
struct tc_fq_qd_stats { struct tc_fq_qd_stats {
__u64 gc_flows; __u64 gc_flows;
__u64 highprio_packets; __u64 highprio_packets; /* obsolete */
__u64 tcp_retrans; __u64 tcp_retrans; /* obsolete */
__u64 throttled; __u64 throttled;
__u64 flows_plimit; __u64 flows_plimit;
__u64 pkts_too_long; __u64 pkts_too_long;
...@@ -963,6 +967,9 @@ struct tc_fq_qd_stats { ...@@ -963,6 +967,9 @@ struct tc_fq_qd_stats {
__u64 horizon_drops; __u64 horizon_drops;
__u64 horizon_caps; __u64 horizon_caps;
__u64 fastpath_packets; __u64 fastpath_packets;
__u64 band_drops[FQ_BANDS];
__u32 band_pkt_count[FQ_BANDS];
__u32 pad;
}; };
/* Heavy-Hitter Filter */ /* Heavy-Hitter Filter */
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment