sched,psi: fix the 'int' underflow for psi
Subsystems (2)
PATCH v2 1/1 sched,psi: fix the 'int' underflow for psi
psi_group_cpu->tasks, represented by the unsigned int, stores the number of tasks that could be stalled on a psi resource(io/mem/cpu). Decrementing these counters at zero leads to wrapping which further leads to the psi_group_cpu->state_mask is being set with the respective pressure state. This could result into the unnecessary time sampling for the pressure state thus cause the spurious psi events. This can further lead to wrong actions being taken at the user land based on these psi events.
Though psi_bug is set under these conditions but that just for debug purpose. Fix it by decrementing the ->tasks count only when it is non-zero.
---
Changes in V1: https://lore.kernel.org/patchwork/patch/1413894/
kernel/sched/psi.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/sched/psi.c +3 -2
@@ -711,14 +711,15 @@ static void psi_group_change(struct psi_group *group, int cpu,for (t =0 , m = clear; m; m &= ~(1 << t), t++) {if (!(m & (1 << t)))continue ; -if (groupc->tasks[t] ==0 && !psi_bug) { +if (groupc->tasks[t]) { + groupc->tasks[t]--; + }else if (!psi_bug) {printk_deferred (KERN_ERR "psi: task underflow! cpu=%d t=%d tasks=[%u %u %u %u] clear=%x set=%x\n" , cpu, t, groupc->tasks[0 ], groupc->tasks[1 ], groupc->tasks[2 ], groupc->tasks[3 ], clear, set); psi_bug =1 ; } - groupc->tasks[t]--; }for (t =0 ; set; set &= ~(1 << t), t++)
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation
Quoted 12 lines · Charan Teja Reddy
psi_group_cpu->tasks, represented by the unsigned int, stores the number of tasks that could be stalled on a psi resource(io/mem/cpu). Decrementing these counters at zero leads to wrapping which further leads to thepsi_group_cpu->state_maskis being set with the respective pressure state. This could result into the unnecessary time sampling for the pressure state thus cause the spurious psi events. This can further lead to wrong actions being taken at the user land based on these psi events.
Thoughpsi_bugis set under these conditions but that just for debug purpose. Fix it by decrementing the ->tasks count only when it is non-zero.
Quoted 1 line
Signed-off-by Charan Teja Reddy <[email protected]>
The subject should be
psi: handle potential task count underflow bugs more gracefully
since it's not fixing a known bug at this point. Otherwise,
Peter Zijlstra
maintainerQuoted 13 lines · Johannes Weiner
Quoted 12 lines · Charan Teja Reddy
psi_group_cpu->tasks, represented by the unsigned int, stores the number of tasks that could be stalled on a psi resource(io/mem/cpu). Decrementing these counters at zero leads to wrapping which further leads to thepsi_group_cpu->state_maskis being set with the respective pressure state. This could result into the unnecessary time sampling for the pressure state thus cause the spurious psi events. This can further lead to wrong actions being taken at the user land based on these psi events.
Thoughpsi_bugis set under these conditions but that just for debug purpose. Fix it by decrementing the ->tasks count only when it is non-zero.
Quoted 5 lines
Quoted 1 line
Signed-off-by Charan Teja Reddy <[email protected]>The subject should be
psi: handle potential task count underflow bugs more gracefully
Done.
Quoted 3 lines
since it's not fixing a known bug at this point. Otherwise,
Acked-by Johannes Weiner <[email protected]>
Thanks!
[tip: sched/core] sched,psi: Handle potential task count underflow bugs more gracefully
In reply to Charan Teja ReddyThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 9d10a13d1e4c349b76f1c675a874a7f981d6d3b4 Gitweb: https://git.kernel.org/tip/9d10a13d1e4c349b76f1c675a874a7f981d6d3b4 Author: Charan Teja Reddy <[email protected]> AuthorDate: Fri, 16 Apr 2021 20:32:16 +05:30 Committer: Peter Zijlstra <[email protected]> CommitterDate: Wed, 21 Apr 2021 13:55:41 +02:00
sched,psi: Handle potential task count underflow bugs more gracefully
psi_group_cpu->tasks, represented by the unsigned int, stores the number of tasks that could be stalled on a psi resource(io/mem/cpu). Decrementing these counters at zero leads to wrapping which further leads to the psi_group_cpu->state_mask is being set with the respective pressure state. This could result into the unnecessary time sampling for the pressure state thus cause the spurious psi events. This can further lead to wrong actions being taken at the user land based on these psi events.
Though psi_bug is set under these conditions but that just for debug purpose. Fix it by decrementing the ->tasks count only when it is non-zero.
--- kernel/sched/psi.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/sched/psi.c +3 -2
@@ -699,14 +699,15 @@ static void psi_group_change(struct psi_group *group, int cpu,for (t =0 , m = clear; m; m &= ~(1 << t), t++) {if (!(m & (1 << t)))continue ; -if (groupc->tasks[t] ==0 && !psi_bug) { +if (groupc->tasks[t]) { + groupc->tasks[t]--; + }else if (!psi_bug) {printk_deferred (KERN_ERR "psi: task underflow! cpu=%d t=%d tasks=[%u %u %u %u] clear=%x set=%x\n" , cpu, t, groupc->tasks[0 ], groupc->tasks[1 ], groupc->tasks[2 ], groupc->tasks[3 ], clear, set); psi_bug =1 ; } - groupc->tasks[t]--; }for (t =0 ; set; set &= ~(1 << t), t++)