mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
rcutorture: Fix divide-by-zero with fwd_progress_div=1
When fwd_progress_div=1, the forward-progress test computes:
sd4 = (sd + div - 1) / div = sd
dur = sd4 + torture_random(&trs) % (sd - sd4) = sd4 + % 0
The modulo operation with a zero divisor triggers an integer
division by zero (undefined behavior at the C level, #DE trap on x86),
causing a kernel Oops and panic. On x86_64, this manifests as:
rcu_torture_fwd_prog_nr: Starting forward-progress test 0
Oops: divide error: 0000 [#1] SMP PTI
RIP: 0010:rcu_torture_fwd_prog+0x90b/0x1160
R12: 0000000000000000
The existing guard only handles non-positive values. However,
fwd_progress_div=1 also makes the random range empty because
sd4 == sd.
Change the guard to reject values below 2. The forward-progress test
only reaches this calculation when stall_dur() is positive, so
sd = stall_dur() + 1 >= 2. For fwd_progress_div >= 2, sd4 < sd,
ensuring that sd - sd4 is at least 1.
Keep the existing fallback to the default value of 4 for invalid
values.
Verified with QEMU/KVM: a 138-second run with fwd_progress_div=1
completed 81 forward-progress test cycles without a crash.
Fixes: 1b27291b1e ("rcutorture: Add forward-progress tests for RCU grace periods")
Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
13fbbaefb0
commit
5b748d8aa6
|
|
@ -4024,7 +4024,7 @@ static int __init rcu_torture_fwd_prog_init(void)
|
|||
}
|
||||
if (fwd_progress_holdoff <= 0)
|
||||
fwd_progress_holdoff = 1;
|
||||
if (fwd_progress_div <= 0)
|
||||
if (fwd_progress_div < 2)
|
||||
fwd_progress_div = 4;
|
||||
rfp = kzalloc_objs(*rfp, fwd_progress);
|
||||
fwd_prog_tasks = kzalloc_objs(*fwd_prog_tasks, fwd_progress);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user