* [Cake] [PATCH net 0/2] net/sched: sch_cake: fixes for cake_mq
@ 2026-02-26 11:40 Jonas Köppeler
2026-02-26 11:40 ` [Cake] [PATCH net 1/2] net/sched: sch_cake: avoid sync overhead when unlimited Jonas Köppeler
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Jonas Köppeler @ 2026-02-26 11:40 UTC (permalink / raw)
To: Toke Høiland-Jørgensen, Jamal Hadi Salim, Jiri Pirko,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Simon Horman
Cc: cake, netdev, Jonas Köppeler
This patch contains two fixes for cake_mq:
- do not sync when bandwidth is unlimited
- adjust the rates for all tins during sync
---
To: Toke Høiland-Jørgensen <toke@toke.dk>
To: Jamal Hadi Salim <jhs@mojatatu.com>
To: Jiri Pirko <jiri@resnulli.us>
To: David S. Miller <davem@davemloft.net>
To: Eric Dumazet <edumazet@google.com>
To: Jakub Kicinski <kuba@kernel.org>
To: Paolo Abeni <pabeni@redhat.com>
To: Simon Horman <horms@kernel.org>
Cc: cake@lists.bufferbloat.net
Cc: netdev@vger.kernel.org
Signed-off-by: Jonas Köppeler <j.koeppeler@tu-berlin.de>
---
Jonas Köppeler (2):
net/sched: sch_cake: avoid sync overhead when unlimited
net/sched: sch_cake: fixup cake_mq rate adjustment for diffserv config
net/sched/sch_cake.c | 53 +++++++++++++++++++++++++---------------------------
1 file changed, 25 insertions(+), 28 deletions(-)
---
base-commit: 2b7a25df823dc7d8f56f8ce7c2d2dac391cea9c2
change-id: 20260219-cake-mq-skip-sync-bandwidth-unlimited-57f3a4bac385
^ permalink raw reply [flat|nested] 6+ messages in thread* [Cake] [PATCH net 1/2] net/sched: sch_cake: avoid sync overhead when unlimited 2026-02-26 11:40 [Cake] [PATCH net 0/2] net/sched: sch_cake: fixes for cake_mq Jonas Köppeler @ 2026-02-26 11:40 ` Jonas Köppeler 2026-02-26 12:04 ` [Cake] " Toke Høiland-Jørgensen 2026-02-26 11:40 ` [Cake] [PATCH net 2/2] net/sched: sch_cake: fixup cake_mq rate adjustment for diffserv config Jonas Köppeler 2026-02-28 2:40 ` [Cake] Re: [PATCH net 0/2] net/sched: sch_cake: fixes for cake_mq patchwork-bot+netdevbpf 2 siblings, 1 reply; 6+ messages in thread From: Jonas Köppeler @ 2026-02-26 11:40 UTC (permalink / raw) To: Toke Høiland-Jørgensen, Jamal Hadi Salim, Jiri Pirko, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman Cc: cake, netdev, Jonas Köppeler Skip inter-instance sync when no rate limit is configured, as it serves no purpose and only adds overhead. Fixes: 1bddd758bac2 ("net/sched: sch_cake: share shaper state across sub-instances of cake_mq") Signed-off-by: Jonas Köppeler <j.koeppeler@tu-berlin.de> --- net/sched/sch_cake.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c index d2bbd5654d5b..3718200353b5 100644 --- a/net/sched/sch_cake.c +++ b/net/sched/sch_cake.c @@ -2013,7 +2013,8 @@ static struct sk_buff *cake_dequeue(struct Qdisc *sch) u64 delay; u32 len; - if (q->config->is_shared && now - q->last_checked_active >= q->config->sync_time) { + if (q->config->is_shared && q->rate_ns && + now - q->last_checked_active >= q->config->sync_time) { struct net_device *dev = qdisc_dev(sch); struct cake_sched_data *other_priv; u64 new_rate = q->config->rate_bps; -- 2.43.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Cake] Re: [PATCH net 1/2] net/sched: sch_cake: avoid sync overhead when unlimited 2026-02-26 11:40 ` [Cake] [PATCH net 1/2] net/sched: sch_cake: avoid sync overhead when unlimited Jonas Köppeler @ 2026-02-26 12:04 ` Toke Høiland-Jørgensen 0 siblings, 0 replies; 6+ messages in thread From: Toke Høiland-Jørgensen @ 2026-02-26 12:04 UTC (permalink / raw) To: Jonas Köppeler, Jamal Hadi Salim, Jiri Pirko, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman Cc: cake, netdev, Jonas Köppeler Jonas Köppeler <j.koeppeler@tu-berlin.de> writes: > Skip inter-instance sync when no rate limit is configured, as it serves > no purpose and only adds overhead. > > Fixes: 1bddd758bac2 ("net/sched: sch_cake: share shaper state across sub-instances of cake_mq") > Signed-off-by: Jonas Köppeler <j.koeppeler@tu-berlin.de> Acked-by: Toke Høiland-Jørgensen <toke@toke.dk> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Cake] [PATCH net 2/2] net/sched: sch_cake: fixup cake_mq rate adjustment for diffserv config 2026-02-26 11:40 [Cake] [PATCH net 0/2] net/sched: sch_cake: fixes for cake_mq Jonas Köppeler 2026-02-26 11:40 ` [Cake] [PATCH net 1/2] net/sched: sch_cake: avoid sync overhead when unlimited Jonas Köppeler @ 2026-02-26 11:40 ` Jonas Köppeler 2026-02-26 12:05 ` [Cake] " Toke Høiland-Jørgensen 2026-02-28 2:40 ` [Cake] Re: [PATCH net 0/2] net/sched: sch_cake: fixes for cake_mq patchwork-bot+netdevbpf 2 siblings, 1 reply; 6+ messages in thread From: Jonas Köppeler @ 2026-02-26 11:40 UTC (permalink / raw) To: Toke Høiland-Jørgensen, Jamal Hadi Salim, Jiri Pirko, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman Cc: cake, netdev, Jonas Köppeler cake_mq's rate adjustment during the sync periods did not adjust the rates for every tin in a diffserv config. This lead to inconsistencies of rates between the tins. Fix this by setting the rates for all tins during synchronization. Fixes: 1bddd758bac2 ("net/sched: sch_cake: share shaper state across sub-instances of cake_mq") Signed-off-by: Jonas Köppeler <j.koeppeler@tu-berlin.de> --- net/sched/sch_cake.c | 50 +++++++++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c index 3718200353b5..230ed16c6c91 100644 --- a/net/sched/sch_cake.c +++ b/net/sched/sch_cake.c @@ -391,8 +391,8 @@ static const u32 inv_sqrt_cache[REC_INV_SQRT_CACHE] = { 1239850263, 1191209601, 1147878294, 1108955788 }; -static void cake_set_rate(struct cake_tin_data *b, u64 rate, u32 mtu, - u64 target_ns, u64 rtt_est_ns); +static void cake_configure_rates(struct Qdisc *sch, u64 rate, bool rate_adjust); + /* http://en.wikipedia.org/wiki/Methods_of_computing_square_roots * new_invsqrt = (invsqrt / 2) * (3 - count * invsqrt^2) * @@ -2040,12 +2040,9 @@ static struct sk_buff *cake_dequeue(struct Qdisc *sch) if (num_active_qs > 1) new_rate = div64_u64(q->config->rate_bps, num_active_qs); - /* mtu = 0 is used to only update the rate and not mess with cobalt params */ - cake_set_rate(b, new_rate, 0, 0, 0); + cake_configure_rates(sch, new_rate, true); q->last_checked_active = now; q->active_queues = num_active_qs; - q->rate_ns = b->tin_rate_ns; - q->rate_shft = b->tin_rate_shft; } begin: @@ -2362,12 +2359,10 @@ static void cake_set_rate(struct cake_tin_data *b, u64 rate, u32 mtu, b->cparams.p_dec = 1 << 20; /* 1/4096 */ } -static int cake_config_besteffort(struct Qdisc *sch) +static int cake_config_besteffort(struct Qdisc *sch, u64 rate, u32 mtu) { struct cake_sched_data *q = qdisc_priv(sch); struct cake_tin_data *b = &q->tins[0]; - u32 mtu = psched_mtu(qdisc_dev(sch)); - u64 rate = q->config->rate_bps; q->tin_cnt = 1; @@ -2381,12 +2376,10 @@ static int cake_config_besteffort(struct Qdisc *sch) return 0; } -static int cake_config_precedence(struct Qdisc *sch) +static int cake_config_precedence(struct Qdisc *sch, u64 rate, u32 mtu) { /* convert high-level (user visible) parameters into internal format */ struct cake_sched_data *q = qdisc_priv(sch); - u32 mtu = psched_mtu(qdisc_dev(sch)); - u64 rate = q->config->rate_bps; u32 quantum = 256; u32 i; @@ -2457,7 +2450,7 @@ static int cake_config_precedence(struct Qdisc *sch) * Total 12 traffic classes. */ -static int cake_config_diffserv8(struct Qdisc *sch) +static int cake_config_diffserv8(struct Qdisc *sch, u64 rate, u32 mtu) { /* Pruned list of traffic classes for typical applications: * @@ -2474,8 +2467,6 @@ static int cake_config_diffserv8(struct Qdisc *sch) */ struct cake_sched_data *q = qdisc_priv(sch); - u32 mtu = psched_mtu(qdisc_dev(sch)); - u64 rate = q->config->rate_bps; u32 quantum = 256; u32 i; @@ -2505,7 +2496,7 @@ static int cake_config_diffserv8(struct Qdisc *sch) return 0; } -static int cake_config_diffserv4(struct Qdisc *sch) +static int cake_config_diffserv4(struct Qdisc *sch, u64 rate, u32 mtu) { /* Further pruned list of traffic classes for four-class system: * @@ -2518,8 +2509,6 @@ static int cake_config_diffserv4(struct Qdisc *sch) */ struct cake_sched_data *q = qdisc_priv(sch); - u32 mtu = psched_mtu(qdisc_dev(sch)); - u64 rate = q->config->rate_bps; u32 quantum = 1024; q->tin_cnt = 4; @@ -2547,7 +2536,7 @@ static int cake_config_diffserv4(struct Qdisc *sch) return 0; } -static int cake_config_diffserv3(struct Qdisc *sch) +static int cake_config_diffserv3(struct Qdisc *sch, u64 rate, u32 mtu) { /* Simplified Diffserv structure with 3 tins. * Latency Sensitive (CS7, CS6, EF, VA, TOS4) @@ -2555,8 +2544,6 @@ static int cake_config_diffserv3(struct Qdisc *sch) * Low Priority (LE, CS1) */ struct cake_sched_data *q = qdisc_priv(sch); - u32 mtu = psched_mtu(qdisc_dev(sch)); - u64 rate = q->config->rate_bps; u32 quantum = 1024; q->tin_cnt = 3; @@ -2581,32 +2568,33 @@ static int cake_config_diffserv3(struct Qdisc *sch) return 0; } -static void cake_reconfigure(struct Qdisc *sch) +static void cake_configure_rates(struct Qdisc *sch, u64 rate, bool rate_adjust) { + u32 mtu = likely(rate_adjust) ? 0 : psched_mtu(qdisc_dev(sch)); struct cake_sched_data *qd = qdisc_priv(sch); struct cake_sched_config *q = qd->config; int c, ft; switch (q->tin_mode) { case CAKE_DIFFSERV_BESTEFFORT: - ft = cake_config_besteffort(sch); + ft = cake_config_besteffort(sch, rate, mtu); break; case CAKE_DIFFSERV_PRECEDENCE: - ft = cake_config_precedence(sch); + ft = cake_config_precedence(sch, rate, mtu); break; case CAKE_DIFFSERV_DIFFSERV8: - ft = cake_config_diffserv8(sch); + ft = cake_config_diffserv8(sch, rate, mtu); break; case CAKE_DIFFSERV_DIFFSERV4: - ft = cake_config_diffserv4(sch); + ft = cake_config_diffserv4(sch, rate, mtu); break; case CAKE_DIFFSERV_DIFFSERV3: default: - ft = cake_config_diffserv3(sch); + ft = cake_config_diffserv3(sch, rate, mtu); break; } @@ -2617,6 +2605,14 @@ static void cake_reconfigure(struct Qdisc *sch) qd->rate_ns = qd->tins[ft].tin_rate_ns; qd->rate_shft = qd->tins[ft].tin_rate_shft; +} + +static void cake_reconfigure(struct Qdisc *sch) +{ + struct cake_sched_data *qd = qdisc_priv(sch); + struct cake_sched_config *q = qd->config; + + cake_configure_rates(sch, qd->config->rate_bps, false); if (q->buffer_config_limit) { qd->buffer_limit = q->buffer_config_limit; -- 2.43.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Cake] Re: [PATCH net 2/2] net/sched: sch_cake: fixup cake_mq rate adjustment for diffserv config 2026-02-26 11:40 ` [Cake] [PATCH net 2/2] net/sched: sch_cake: fixup cake_mq rate adjustment for diffserv config Jonas Köppeler @ 2026-02-26 12:05 ` Toke Høiland-Jørgensen 0 siblings, 0 replies; 6+ messages in thread From: Toke Høiland-Jørgensen @ 2026-02-26 12:05 UTC (permalink / raw) To: Jonas Köppeler, Jamal Hadi Salim, Jiri Pirko, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman Cc: cake, netdev, Jonas Köppeler Jonas Köppeler <j.koeppeler@tu-berlin.de> writes: > cake_mq's rate adjustment during the sync periods did not adjust the > rates for every tin in a diffserv config. This lead to inconsistencies > of rates between the tins. Fix this by setting the rates for all tins > during synchronization. > > Fixes: 1bddd758bac2 ("net/sched: sch_cake: share shaper state across sub-instances of cake_mq") > Signed-off-by: Jonas Köppeler <j.koeppeler@tu-berlin.de> Acked-by: Toke Høiland-Jørgensen <toke@toke.dk> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Cake] Re: [PATCH net 0/2] net/sched: sch_cake: fixes for cake_mq 2026-02-26 11:40 [Cake] [PATCH net 0/2] net/sched: sch_cake: fixes for cake_mq Jonas Köppeler 2026-02-26 11:40 ` [Cake] [PATCH net 1/2] net/sched: sch_cake: avoid sync overhead when unlimited Jonas Köppeler 2026-02-26 11:40 ` [Cake] [PATCH net 2/2] net/sched: sch_cake: fixup cake_mq rate adjustment for diffserv config Jonas Köppeler @ 2026-02-28 2:40 ` patchwork-bot+netdevbpf 2 siblings, 0 replies; 6+ messages in thread From: patchwork-bot+netdevbpf @ 2026-02-28 2:40 UTC (permalink / raw) To: =?utf-8?q?Jonas_K=C3=B6ppeler_=3Cj=2Ekoeppeler=40tu-berlin=2Ede=3E?= Cc: toke, jhs, jiri, davem, edumazet, kuba, pabeni, horms, cake, netdev Hello: This series was applied to netdev/net.git (main) by Jakub Kicinski <kuba@kernel.org>: On Thu, 26 Feb 2026 12:40:14 +0100 you wrote: > This patch contains two fixes for cake_mq: > - do not sync when bandwidth is unlimited > - adjust the rates for all tins during sync > > --- > To: Toke Høiland-Jørgensen <toke@toke.dk> > To: Jamal Hadi Salim <jhs@mojatatu.com> > To: Jiri Pirko <jiri@resnulli.us> > To: David S. Miller <davem@davemloft.net> > To: Eric Dumazet <edumazet@google.com> > To: Jakub Kicinski <kuba@kernel.org> > To: Paolo Abeni <pabeni@redhat.com> > To: Simon Horman <horms@kernel.org> > Cc: cake@lists.bufferbloat.net > Cc: netdev@vger.kernel.org > Signed-off-by: Jonas Köppeler <j.koeppeler@tu-berlin.de> > > [...] Here is the summary with links: - [net,1/2] net/sched: sch_cake: avoid sync overhead when unlimited https://git.kernel.org/netdev/net/c/0b3cd139be56 - [net,2/2] net/sched: sch_cake: fixup cake_mq rate adjustment for diffserv config https://git.kernel.org/netdev/net/c/15c2715a5264 You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-02-28 2:40 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-02-26 11:40 [Cake] [PATCH net 0/2] net/sched: sch_cake: fixes for cake_mq Jonas Köppeler 2026-02-26 11:40 ` [Cake] [PATCH net 1/2] net/sched: sch_cake: avoid sync overhead when unlimited Jonas Köppeler 2026-02-26 12:04 ` [Cake] " Toke Høiland-Jørgensen 2026-02-26 11:40 ` [Cake] [PATCH net 2/2] net/sched: sch_cake: fixup cake_mq rate adjustment for diffserv config Jonas Köppeler 2026-02-26 12:05 ` [Cake] " Toke Høiland-Jørgensen 2026-02-28 2:40 ` [Cake] Re: [PATCH net 0/2] net/sched: sch_cake: fixes for cake_mq patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox