From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mail.toke.dk; spf=pass smtp.mailfrom=; dkim=pass header.d=trailofbits.com; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=trailofbits.com policy.dmarc=reject Received: from mail-qv1-xf2a.google.com (mail-qv1-xf2a.google.com [IPv6:2607:f8b0:4864:20::f2a]) by mail.toke.dk (Postfix) with ESMTPS id BFCAE11DEE14 for ; Tue, 09 Jun 2026 02:08:50 +0200 (CEST) Received: by mail-qv1-xf2a.google.com with SMTP id 6a1803df08f44-8cc0ef7c306so46429106d6.3 for ; Mon, 08 Jun 2026 17:08:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=trailofbits.com; s=google; t=1780963728; x=1781568528; darn=lists.bufferbloat.net; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=4lidgO5F+++t6EB4HzmUPrlL28tLdwfkd2HVpHaeS1k=; b=Trecrh4n6aSVl5u/PDlshOqm99QbygyReZ/4JwfJCcChUKk8Q9F8hvaTzdRHGw+u4i t64llLGGF6i6p/I3zmI2J6Ia2i3muAdDgDOppMLNJnycYd+OhVsKn0JT6SjvJ/OEjuvB BeGnviMvwML1pCa8leNbGxKQStVFgC/EoPPr1Y+Mf/FuSoiX6ewLR6ndj1oRTAgJZfRy JWdtuZQAjeo7RN8cDDQUUx7ol2RCOAKlEDkDVYugbcX1FxhPZ4aj1/OZFueq1oF1Z8uC tbn+8FBCtVb+xf/qlwvW8ByMjciqm0q99Et0IFCB/vQZfEmEqjaY1LiZVV5qHsU1O1K+ /A1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780963728; x=1781568528; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=4lidgO5F+++t6EB4HzmUPrlL28tLdwfkd2HVpHaeS1k=; b=YQFGhtXUV2h7TUH/IIz/DamHwJKkTIq9o6lzPV1p0zRp7ZE7FY1W/VA7v/fbBvclSB M8i/iUapADVzPCeSqoaT4YkCgf3ji/HwSiiIbJKnBg3vQVl/dfX4QI/Vq/h9sSnG4fRa ZxfXrRPoZ1m0mQzGwYKtEyVeJ5PrBN4cWmwwP8SQBdfBJ6AXxtyHwCE1As/n0nsKrBNm wOnW3e6HzBw7Q106yz87DhuybtQ0rHBPsNWwwveBAOmAJUm+QhU8hXJDD2aqw1Rrg5AS /JVt5aF/LsjVOykCFeVXgVG833cHgxEKfqNRLKP3K0rufyk4ACgC+54NC+S7/kkZJLb3 0j9Q== X-Forwarded-Encrypted: i=1; AFNElJ/vH3gXC6Aop4eKzT9kOuoARFl8K0QDBNGzByle6OaH8NGqfxJy1DtmMoHuICzcs8JVmK7k@lists.bufferbloat.net X-Gm-Message-State: AOJu0YzUqQWIV8bix5GFPyayV0RcCiLQ3Qmz/PM4HuzGZvXPUHAnhHEz +ghoW3N2qnNzOm2yTPNvkuTy31XOV8EKWJDb1WNFe6WTf+90KOYdu7C4li2P0X9hR6Q= X-Gm-Gg: Acq92OFyMchyH1wflwJcS9MS5HAKhXb7kS4M07+mTpLusu9ivmINBmjy39TUPhn3EAf pfc1RWwA3Llp5Nf2HccDUiGxANDXijgo/UzcAhTpl9kr/3SLMTjfx72HrtCAGyhvX5M/Lnwvy8X 0dUXEucKDLlsYNosLlL8gqa0e9eSI2vdR71Faa6cZQZsIB0fdTtg6K5s920z90WbLDCTgKT3U7n fHTjuMGeYvNfcD7WXLqQ00VBrZPOAcFf2eWXc/+pXFShQMtbCRE9DDiFxpB+JHownvVI65TE8ir zmAElzyGblDkyPM2nVLQ0qwWa1QwwguKk4PLgfHiIdRlz1QP2PDT+oC5STYKo+GAJHBnHA0E1DH bun3AZRwDIiY8diHvmhN2PgMnR6vVQDnsTp0XIlFVwsrbWf3ROk2auNVsoNRfQfV0ydmSor1H0N YJ2fzqa36tUzMsVwTywF7ZDBBV6RYv7q8ZgcM5H1QLjhZge9nG X-Received: by 2002:a05:6214:4246:b0:8ca:16a6:3d40 with SMTP id 6a1803df08f44-8cee5f9f6c6mr222900836d6.5.1780963728475; Mon, 08 Jun 2026 17:08:48 -0700 (PDT) Received: from localhost ([161.35.96.86]) by smtp.gmail.com with UTF8SMTPSA id 6a1803df08f44-8ceccdcc968sm192900746d6.22.2026.06.08.17.08.46 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 08 Jun 2026 17:08:47 -0700 (PDT) From: Samuel Moelius To: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= Cc: Samuel Moelius , Jamal Hadi Salim , Jiri Pirko , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , cake@lists.bufferbloat.net (moderated list:CAKE QDISC), netdev@vger.kernel.org (open list:TC subsystem), linux-kernel@vger.kernel.org (open list) Date: Tue, 9 Jun 2026 00:08:43 +0000 Message-ID: <20260609000605.1234374.9ba17536ec9e.cake-rate-change-stale-flow-deficit@trailofbits.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-MailFrom: sam.moelius@trailofbits.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation Message-ID-Hash: QK2KSU5MFJO7BRZWE7F4DTGAV6WXR5QG X-Message-ID-Hash: QK2KSU5MFJO7BRZWE7F4DTGAV6WXR5QG X-Mailman-Approved-At: Tue, 09 Jun 2026 14:26:24 +0200 X-Mailman-Version: 3.3.10 Precedence: list Subject: [Cake] [PATCH] net/sched: cake: clamp active flow deficit on rate changes List-Id: Cake - FQ_codel the next generation Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Changing CAKE rate parameters updates the quantum used for future scheduling, but active flows can retain deficit computed under the old rate. That stale deficit lets an already active flow receive service based on the previous configuration after userspace changes the shaper rate. After recomputing rate-derived scheduling parameters, clamp positive active-flow deficits to the quantum that applies under the new configuration. Assisted-by: Codex:gpt-5.5-cyber-preview Signed-off-by: Samuel Moelius --- net/sched/sch_cake.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c index 5862933be8d7..048d313e70fe 100644 --- a/net/sched/sch_cake.c +++ b/net/sched/sch_cake.c @@ -2621,6 +2621,36 @@ static void cake_configure_rates(struct Qdisc *sch, u64 rate, bool rate_adjust) qd->rate_shft = qd->tins[ft].tin_rate_shft; } +static void cake_clamp_flow_deficit(struct cake_tin_data *b, + struct cake_flow *flow, + int flow_mode) +{ + s32 quantum; + + if (flow->deficit <= 0) + return; + + quantum = cake_get_flow_quantum(b, flow, flow_mode); + if (flow->deficit > quantum) + WRITE_ONCE(flow->deficit, quantum); +} + +static void cake_clamp_active_deficits(struct cake_sched_data *qd) +{ + struct cake_sched_config *q = qd->config; + struct cake_flow *flow; + u32 tin; + + for (tin = 0; tin < qd->tin_cnt; tin++) { + struct cake_tin_data *b = &qd->tins[tin]; + + list_for_each_entry(flow, &b->new_flows, flowchain) + cake_clamp_flow_deficit(b, flow, q->flow_mode); + list_for_each_entry(flow, &b->old_flows, flowchain) + cake_clamp_flow_deficit(b, flow, q->flow_mode); + } +} + static void cake_reconfigure(struct Qdisc *sch) { struct cake_sched_data *qd = qdisc_priv(sch); @@ -2628,6 +2658,7 @@ static void cake_reconfigure(struct Qdisc *sch) u32 buffer_limit; cake_configure_rates(sch, qd->config->rate_bps, false); + cake_clamp_active_deficits(qd); if (q->buffer_config_limit) { buffer_limit = q->buffer_config_limit; -- 2.43.0