sched/debug: Fix avg_vruntime() usage
PATCH 1/1 sched/debug: Fix avg_vruntime() usage
From: Peter Zijlstra <[email protected]>
commit e08d007f9d813616ce7093600bc4fdb9c9d81d89 upstream.
John reported that stress-ng-yield could make his machine unhappy and managed to bisect it to commit b3d99f43c72b ("sched/fair: Fix zero_vruntime tracking").
The commit in question changes avg_vruntime() from a function that is a pure reader, to a function that updates variables. This turns an unlocked sched/debug usage of this function from a minor mistake into a data corruptor.
Fixes af4cf40470c2 ("sched/fair: Add cfs_rq::avg_vruntime")
Fixes b3d99f43c72b ("sched/fair: Fix zero_vruntime tracking")
Reported-by John Stultz <[email protected]>
Signed-off-by Peter Zijlstra (Intel) <[email protected]>
Reviewed-by Vincent Guittot <[email protected]>
Tested-by K Prateek Nayak <[email protected]>
Tested-by John Stultz <[email protected]>
Signed-off-by John Stultz <[email protected]>
--- kernel/sched/debug.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/sched/debug.c +3 -1
@@ -798,6 +798,7 @@ static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu)void print_cfs_rq (struct seq_file *m,int cpu,struct cfs_rq *cfs_rq) {s64 left_vruntime =-1 , zero_vruntime, right_vruntime =-1 , left_deadline =-1 , spread; +u64 avruntime;struct sched_entity *last, *first, *root;struct rq *rq =cpu_rq (cpu);unsigned long flags;
@@ -821,6 +822,7 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)if (last) right_vruntime = last->vruntime; zero_vruntime = cfs_rq->zero_vruntime; + avruntime =avg_vruntime (cfs_rq);raw_spin_rq_unlock_irqrestore (rq, flags); SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "left_deadline",
@@ -830,7 +832,7 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"zero_vruntime" ,SPLIT_NS (zero_vruntime));SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"avg_vruntime" , -SPLIT_NS (avg_vruntime (cfs_rq))); +SPLIT_NS (avruntime));SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"right_vruntime" ,SPLIT_NS (right_vruntime)); spread = right_vruntime - left_vruntime;
Signature · 1 line
2.54.0.rc2.533.g4f5dca5207-goog