Use raw_smp_processor_id() in rcu_random()
PATCH 1/1 Use raw_smp_processor_id() in rcu_random()
With CONFIG_PREEMPT=y on 2.6.23-rc8-mm2, rcu_random() calls smp_processor_id() from a preemptible context, triggering the following kernel error.
BUG: using smp_processor_id() in preemptible [00000001] code: rcu_torture_fak/5155 caller is rcu_random+0x16/0x39 [rcutorture] [<c010612f>] dump_trace+0x68/0x1d2 [<c01062b1>] show_trace_log_lvl+0x18/0x2c [<c0106c23>] show_trace+0xf/0x11 [<c0106d33>] dump_stack+0x12/0x14 [<c02a0a25>] debug_smp_processor_id+0xa1/0xb4 [<f887064c>] rcu_random+0x16/0x39 [rcutorture] [<f8870cdf>] <3>BUG: using smp_processor_id() in preemptible [00000001] code: rcu_torture_fak/5156 rcu_torture_fakewriter+0x4d/0xc5 [rcutorture] [<c0139b32>] caller is rcu_random+0x16/0x39 [rcutorture] kthread+0x38/0x5e [<c0105ca7>] kernel_thread_helper+0x7/0x10 ======================= [<c010612f>] dump_trace+0x68/0x1d2 [<c01062b1>] show_trace_log_lvl+0x18/0x2c [<c0106c23>] show_trace+0xf/0x11 [<c0106d33>] dump_stack+0x12/0x14 [<c02a0a25>] debug_smp_processor_id+0xa1/0xb4 [<f887064c>] rcu_random+0x16/0x39 [rcutorture] [<f8870cdf>] rcu_torture_fakewriter+0x4d/0xc5 [rcutorture]
rcu_random() can do with raw_smp_processor_id() as a parameter to cpu_clock() in this particular context.
--- kernel/rcutorture.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/rcutorture.c +2 -1
@@ -170,7 +170,8 @@ static unsigned long rcu_random(struct rcu_random_state *rrsp) {if (--rrsp->rrs_count <0 ) { - rrsp->rrs_state += (unsigned long )cpu_clock (smp_processor_id ()); + rrsp->rrs_state += + (unsigned long )cpu_clock (raw_smp_processor_id ()); rrsp->rrs_count =RCU_RANDOM_REFRESH ; } rrsp->rrs_state = rrsp->rrs_state *RCU_RANDOM_MULT +RCU_RANDOM_ADD ;
Signature · 5 lines
Gautham R Shenoy Linux Technology Center IBM India. "Freedom comes with a price tag of responsibility, which is still a bargain, because Freedom is priceless!"
Quoted 26 lines · Gautham R Shenoy
With
CONFIG_PREEMPT=yon 2.6.23-rc8-mm2,rcu_random()callssmp_processor_id()from a preemptible context, triggering the following kernel error.BUG: using smp_processor_id() in preemptible [00000001] code: rcu_torture_fak/5155 caller is rcu_random+0x16/0x39 [rcutorture] [<c010612f>] dump_trace+0x68/0x1d2 [<c01062b1>] show_trace_log_lvl+0x18/0x2c [<c0106c23>] show_trace+0xf/0x11 [<c0106d33>] dump_stack+0x12/0x14 [<c02a0a25>] debug_smp_processor_id+0xa1/0xb4 [<f887064c>] rcu_random+0x16/0x39 [rcutorture] [<f8870cdf>] <3>BUG: using smp_processor_id() in preemptible [00000001] code: rcu_torture_fak/5156 rcu_torture_fakewriter+0x4d/0xc5 [rcutorture] [<c0139b32>] caller is rcu_random+0x16/0x39 [rcutorture] kthread+0x38/0x5e [<c0105ca7>] kernel_thread_helper+0x7/0x10 ======================= [<c010612f>] dump_trace+0x68/0x1d2 [<c01062b1>] show_trace_log_lvl+0x18/0x2c [<c0106c23>] show_trace+0xf/0x11 [<c0106d33>] dump_stack+0x12/0x14 [<c02a0a25>] debug_smp_processor_id+0xa1/0xb4 [<f887064c>] rcu_random+0x16/0x39 [rcutorture] [<f8870cdf>] rcu_torture_fakewriter+0x4d/0xc5 [rcutorture]
Quoted 4 lines
rcu_random()can do withraw_smp_processor_id()as a parameter tocpu_clock()in this particular context.Signed-off-by Gautham R Shenoy <[email protected]>
Looks reasonable to me.
Quoted 27 lines · Gautham R Shenoy
With
CONFIG_PREEMPT=yon 2.6.23-rc8-mm2,rcu_random()callssmp_processor_id()from a preemptible context, triggering the following kernel error.BUG: using smp_processor_id() in preemptible [00000001] code: rcu_torture_fak/5155 caller is rcu_random+0x16/0x39 [rcutorture] [<c010612f>] dump_trace+0x68/0x1d2 [<c01062b1>] show_trace_log_lvl+0x18/0x2c [<c0106c23>] show_trace+0xf/0x11 [<c0106d33>] dump_stack+0x12/0x14 [<c02a0a25>] debug_smp_processor_id+0xa1/0xb4 [<f887064c>] rcu_random+0x16/0x39 [rcutorture] [<f8870cdf>] <3>BUG: using smp_processor_id() in preemptible [00000001] code: rcu_torture_fak/5156 rcu_torture_fakewriter+0x4d/0xc5 [rcutorture] [<c0139b32>] caller is rcu_random+0x16/0x39 [rcutorture] kthread+0x38/0x5e [<c0105ca7>] kernel_thread_helper+0x7/0x10 ======================= [<c010612f>] dump_trace+0x68/0x1d2 [<c01062b1>] show_trace_log_lvl+0x18/0x2c [<c0106c23>] show_trace+0xf/0x11 [<c0106d33>] dump_stack+0x12/0x14 [<c02a0a25>] debug_smp_processor_id+0xa1/0xb4 [<f887064c>] rcu_random+0x16/0x39 [rcutorture] [<f8870cdf>] rcu_torture_fakewriter+0x4d/0xc5 [rcutorture]
Quoted 2 lines
rcu_random()can do withraw_smp_processor_id()as a parameter tocpu_clock()in this particular context.
Good catch!!!
Quoted 26 lines
Signed-off-by Gautham R Shenoy <[email protected]>--- kernel/rcutorture.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)Index:
linux-2.6.23-rc8/kernel/rcutorture.c
===================================================================kernel/rcutorture.c +2
-1@@ -170,7 +170,8 @@ static unsigned long rcu_random(struct rcu_random_state *rrsp) {if (--rrsp->rrs_count <0 ) { - rrsp->rrs_state += (unsigned long )cpu_clock (smp_processor_id ()); + rrsp->rrs_state += + (unsigned long )cpu_clock (raw_smp_processor_id ()); rrsp->rrs_count =RCU_RANDOM_REFRESH ; } rrsp->rrs_state = rrsp->rrs_state *RCU_RANDOM_MULT +RCU_RANDOM_ADD ;Signature · 5 lines
Gautham R Shenoy Linux Technology Center IBM India. "Freedom comes with a price tag of responsibility, which is still a bargain, because Freedom is priceless!"