Skip to content

Commit

Permalink
net_sched: sch_fq: add 3 bands and WRR scheduling
Browse files Browse the repository at this point in the history
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: Eric Dumazet <edumazet@google.com>
Acked-by: Dave Taht <dave.taht@gmail.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Eric Dumazet authored and Paolo Abeni committed Oct 5, 2023
1 parent 5579ee4 commit 29f834a
Show file tree
Hide file tree
Showing 2 changed files with 171 additions and 44 deletions.
11 changes: 9 additions & 2 deletions include/uapi/linux/pkt_sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -941,15 +941,19 @@ enum {

TCA_FQ_HORIZON_DROP, /* drop packets beyond horizon, or cap their EDT */

TCA_FQ_PRIOMAP, /* prio2band */

__TCA_FQ_MAX
};

#define TCA_FQ_MAX (__TCA_FQ_MAX - 1)

#define FQ_BANDS 3

struct tc_fq_qd_stats {
__u64 gc_flows;
__u64 highprio_packets;
__u64 tcp_retrans;
__u64 highprio_packets; /* obsolete */
__u64 tcp_retrans; /* obsolete */
__u64 throttled;
__u64 flows_plimit;
__u64 pkts_too_long;
Expand All @@ -963,6 +967,9 @@ struct tc_fq_qd_stats {
__u64 horizon_drops;
__u64 horizon_caps;
__u64 fastpath_packets;
__u64 band_drops[FQ_BANDS];
__u32 band_pkt_count[FQ_BANDS];
__u32 pad;
};

/* Heavy-Hitter Filter */
Expand Down
Loading

0 comments on commit 29f834a

Please sign in to comment.