summaryrefslogtreecommitdiff
path: root/kernel/torture.c
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@kernel.org>2020-09-23 02:42:42 +0300
committerPaul E. McKenney <paulmck@kernel.org>2020-11-07 04:13:54 +0300
commitab1b7880dec86bbdacd31a4c5cf104de4cf903f2 (patch)
tree00b58346317e403e0a707fe666a0c6aa25a01830 /kernel/torture.c
parentc1e06287583e5ec496e4c02bf5b319e5e41a1fd2 (diff)
downloadlinux-ab1b7880dec86bbdacd31a4c5cf104de4cf903f2.tar.xz
rcutorture: Make stutter_wait() caller restore priority
Currently, stutter_wait() will happily spin waiting for the stutter interval to end even if the caller is running at a real-time priority level. This could starve normal-priority tasks for no good reason. This commit therefore drops the calling task's priority to SCHED_OTHER MAX_NICE if stutter_wait() needs to wait. But when it waits, stutter_wait() returns true, which allows the caller to restore the priority if needed. Callers that were already running at SCHED_OTHER MAX_NICE obviously do not need any changes, but this commit also restores priority for higher-priority callers. Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Diffstat (limited to 'kernel/torture.c')
-rw-r--r--kernel/torture.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/kernel/torture.c b/kernel/torture.c
index 56ff02bf444f..8562ac18d2eb 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -604,19 +604,19 @@ bool stutter_wait(const char *title)
{
ktime_t delay;
unsigned int i = 0;
- int oldnice;
bool ret = false;
int spt;
cond_resched_tasks_rcu_qs();
spt = READ_ONCE(stutter_pause_test);
for (; spt; spt = READ_ONCE(stutter_pause_test)) {
- ret = true;
+ if (!ret) {
+ sched_set_normal(current, MAX_NICE);
+ ret = true;
+ }
if (spt == 1) {
schedule_timeout_interruptible(1);
} else if (spt == 2) {
- oldnice = task_nice(current);
- set_user_nice(current, MAX_NICE);
while (READ_ONCE(stutter_pause_test)) {
if (!(i++ & 0xffff)) {
set_current_state(TASK_INTERRUPTIBLE);
@@ -625,7 +625,6 @@ bool stutter_wait(const char *title)
}
cond_resched();
}
- set_user_nice(current, oldnice);
} else {
schedule_timeout_interruptible(round_jiffies_relative(HZ));
}