From: sashiko-bot@kernel.org
To: "Wanwu Li" <liwanwu9113@163.com>
Cc: sched-ext@lists.linux.dev
Subject: Re: [PATCH] sched_ext/scx_flatcg: Fix cvtime_delta race and add hweight scaling to bypass charging
Date: Mon, 08 Jun 2026 04:35:58 +0000 [thread overview]
Message-ID: <20260608043558.ECBCE1F00893@smtp.kernel.org> (raw)
In-Reply-To: <20260608042230.3-1-liwanwu9113@163.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Incorrect tracking of cgroup virtual time delta in `fcg_dispatch` leads to double charging on early yield and permanent starvation on slice overrun due to sign inversion and unsigned division of negative values.
--
commit 26a5b29cfee7b890fe54a82847b9652c4700912d
Author: Wanwu Li <liwanwu@kylinos.cn>
sched_ext/scx_flatcg: Fix cvtime_delta race and add hweight scaling to bypass charging
This commit fixes a double-charging race condition in cgrp_cap_budget() by
using __sync_fetch_and_and() to read and clear cvtime_delta atomically. It
also updates the bypass charging path in fcg_stopping() to scale the raw
execution time by the inverse of the cgroup hweight before adding it to
cvtime_delta.
> diff --git a/tools/sched_ext/scx_flatcg.bpf.c b/tools/sched_ext/scx_flatcg.bpf.c
> index fec3595818269..0fd214cc61dae 100644
> --- a/tools/sched_ext/scx_flatcg.bpf.c
> +++ b/tools/sched_ext/scx_flatcg.bpf.c
[ ... ]
> @@ -570,7 +570,8 @@ void BPF_STRUCT_OPS(fcg_stopping, struct task_struct *p, bool runnable)
> cgc = find_cgrp_ctx(cgrp);
> if (cgc) {
> __sync_fetch_and_add(&cgc->cvtime_delta,
> - p->se.sum_exec_runtime - taskc->bypassed_at);
> + (p->se.sum_exec_runtime - taskc->bypassed_at) *
> + FCG_HWEIGHT_ONE / (cgc->hweight ?: 1));
[Severity: High]
This is a pre-existing issue, but seeing the hweight scaling logic added
here brings to mind a potential bug with the same pattern in fcg_dispatch().
Does the tracking of the cgroup virtual time delta in fcg_dispatch() suffer
from double-charging and underflow issues?
In fcg_dispatch(), the unused slice time is calculated as:
(cpuc->cur_at + cgrp_slice_ns - now)
Because the cgroup is charged a full slice upfront in try_pick_next_cgroup(),
should this unused time be refunded by subtracting it from cvtime_delta? The
current code uses __sync_fetch_and_add() which adds the positive unused time
and penalizes the cgroup a second time when it yields early.
Also, if the cgroup overruns its slice (now > cur_at + slice), the
calculation underflows. Because FCG_HWEIGHT_ONE is an unsigned value
(1LLU << 16), does the subsequent multiplication and division by cgc->hweight
destroy the two's complement representation of the negative value?
This unsigned division would shift zeros into the most significant bits,
resulting in a huge positive number being added to cvtime_delta. Could this
push the cgroup's virtual time days into the future and cause permanent
starvation?
> taskc->bypassed_at = 0;
> }
> bpf_cgroup_release(cgrp);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260608042230.3-1-liwanwu9113@163.com?part=1
next prev parent reply other threads:[~2026-06-08 4:35 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-08 4:22 [PATCH] sched_ext/scx_flatcg: Fix cvtime_delta race and add hweight scaling to bypass charging Wanwu Li
2026-06-08 4:35 ` sashiko-bot [this message]
2026-06-08 5:58 ` Andrea Righi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260608043558.ECBCE1F00893@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=liwanwu9113@163.com \
--cc=sashiko-reviews@lists.linux.dev \
--cc=sched-ext@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.