• Zqiang's avatar
    doc/rcutorture: Add description of rcutorture.stall_cpu_block · 9e5d61c0
    Zqiang authored
    If you build a kernel with CONFIG_PREEMPTION=n and CONFIG_PREEMPT_COUNT=y,
    then run the rcutorture tests specifying stalls as follows:
    
    runqemu kvm slirp nographic qemuparams="-m 1024 -smp 4" \
    	bootparams="console=ttyS0 rcutorture.stall_cpu=30 \
    	rcutorture.stall_no_softlockup=1 rcutorture.stall_cpu_block=1" -d
    
    The tests will produce the following splat:
    
    [   10.841071] rcu-torture: rcu_torture_stall begin CPU stall
    [   10.841073] rcu_torture_stall start on CPU 3.
    [   10.841077] BUG: scheduling while atomic: rcu_torture_sta/66/0x0000000
    ....
    [   10.841108] Call Trace:
    [   10.841110]  <TASK>
    [   10.841112]  dump_stack_lvl+0x64/0xb0
    [   10.841118]  dump_stack+0x10/0x20
    [   10.841121]  __schedule_bug+0x8b/0xb0
    [   10.841126]  __schedule+0x2172/0x2940
    [   10.841157]  schedule+0x9b/0x150
    [   10.841160]  schedule_timeout+0x2e8/0x4f0
    [   10.841192]  schedule_timeout_uninterruptible+0x47/0x50
    [   10.841195]  rcu_torture_stall+0x2e8/0x300
    [   10.841199]  kthread+0x175/0x1a0
    [   10.841206]  ret_from_fork+0x2c/0x50
    
    This is because the rcutorture.stall_cpu_block=1 module parameter causes
    rcu_torture_stall() to invoke schedule_timeout_uninterruptible() within
    an RCU read-side critical section.  This in turn results in a quiescent
    state (which prevents the stall) and a sleep in an atomic context (which
    produces the above splat).
    
    Although this code is operating as designed, the design has proven to
    be counterintuitive to many.  This commit therefore updates the description
    in kernel-parameters.txt accordingly.
    
    [ paulmck: Apply Joel Fernandes feedback. ]
    Signed-off-by: default avatarZqiang <qiang1.zhang@intel.com>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    9e5d61c0
kernel-parameters.txt 252 KB