Skip to content

Commit 3f27958

Browse files
zhidao suhtejun
authored andcommitted
sched_ext: Use READ_ONCE() for plain reads of scx_watchdog_timeout
scx_watchdog_timeout is written with WRITE_ONCE() in scx_enable(): WRITE_ONCE(scx_watchdog_timeout, timeout); However, three read-side accesses use plain reads without the matching READ_ONCE(): /* check_rq_for_timeouts() - L2824 */ last_runnable + scx_watchdog_timeout /* scx_watchdog_workfn() - L2852 */ scx_watchdog_timeout / 2 /* scx_enable() - L5179 */ scx_watchdog_timeout / 2 The KCSAN documentation requires that if one accessor uses WRITE_ONCE() to annotate lock-free access, all other accesses must also use the appropriate accessor. Plain reads alongside WRITE_ONCE() leave the pair incomplete and can trigger KCSAN warnings. Note that scx_tick() already uses the correct READ_ONCE() annotation: last_check + READ_ONCE(scx_watchdog_timeout) Fix the three remaining plain reads to match, making all accesses to scx_watchdog_timeout consistently annotated and KCSAN-clean. Signed-off-by: zhidao su <suzhidao@xiaomi.com> Signed-off-by: Tejun Heo <tj@kernel.org>
1 parent 494eaf4 commit 3f27958

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

kernel/sched/ext.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2739,7 +2739,7 @@ static bool check_rq_for_timeouts(struct rq *rq)
27392739
unsigned long last_runnable = p->scx.runnable_at;
27402740

27412741
if (unlikely(time_after(jiffies,
2742-
last_runnable + scx_watchdog_timeout))) {
2742+
last_runnable + READ_ONCE(scx_watchdog_timeout)))) {
27432743
u32 dur_ms = jiffies_to_msecs(jiffies - last_runnable);
27442744

27452745
scx_exit(sch, SCX_EXIT_ERROR_STALL, 0,
@@ -2767,7 +2767,7 @@ static void scx_watchdog_workfn(struct work_struct *work)
27672767
cond_resched();
27682768
}
27692769
queue_delayed_work(system_unbound_wq, to_delayed_work(work),
2770-
scx_watchdog_timeout / 2);
2770+
READ_ONCE(scx_watchdog_timeout) / 2);
27712771
}
27722772

27732773
void scx_tick(struct rq *rq)
@@ -5081,7 +5081,7 @@ static int scx_enable(struct sched_ext_ops *ops, struct bpf_link *link)
50815081
WRITE_ONCE(scx_watchdog_timeout, timeout);
50825082
WRITE_ONCE(scx_watchdog_timestamp, jiffies);
50835083
queue_delayed_work(system_unbound_wq, &scx_watchdog_work,
5084-
scx_watchdog_timeout / 2);
5084+
READ_ONCE(scx_watchdog_timeout) / 2);
50855085

50865086
/*
50875087
* Once __scx_enabled is set, %current can be switched to SCX anytime.

0 commit comments

Comments
 (0)