Message ID | 20220521065626.1815175-1-qiang1.zhang@intel.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 22419ae655b3eb58f994a805d801259fb59d52e2 |
Headers | show |
Series | rcu/rcuscale: Fix using smp_processor_id() in preemptible warnings | expand |
On Sat, May 21, 2022 at 02:56:26PM +0800, Zqiang wrote: > BUG: using smp_processor_id() in preemptible [00000000] code: rcu_scale_write/69 > CPU: 0 PID: 66 Comm: rcu_scale_write Not tainted 5.18.0-rc7-next-20220517-yoctodev-standard+ > caller is debug_smp_processor_id+0x17/0x20 > Call Trace: > <TASK> > dump_stack_lvl+0x49/0x5e > dump_stack+0x10/0x12 > check_preemption_disabled+0xdf/0xf0 > debug_smp_processor_id+0x17/0x20 > rcu_scale_writer+0x2b5/0x580 > kthread+0x177/0x1b0 > ret_from_fork+0x22/0x30 > </TASK> > > Reproduction method: > runqemu kvm slirp nographic qemuparams="-m 4096 -smp 8" bootparams="isolcpus=2,3 > nohz_full=2,3 rcu_nocbs=2,3 rcutree.dump_tree=1 rcuscale.shutdown=false > rcuscale.gp_async=true" -d > > when the CONFIG_DEBUG_PREEMPT is enabled, this_cpu_ptr() will call > debug_smp_processor_id() get current CPU number, this warning is triggered by > is_percpu_thread() in debug_smp_processor_id(), the is_percpu_thread() need to > check whether 'current->nr_cpus_allowed == 1' and 'current->flags & PF_NO_SETAFFINITY', > invoke set_cpus_allowed_ptr() only set kthreads->nr_cpus_allowed, but the > PF_NO_SETAFFINITY is not set to kthread->flags, so add PF_NO_SETAFFINITY flags > setting. > > Signed-off-by: Zqiang <qiang1.zhang@intel.com> Good catch! Queued for v5.20 (or v6.0, as Linus decides), thank you! Thanx, Paul > --- > kernel/rcu/rcuscale.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c > index 277a5bfb37d4..3ef02d4a8108 100644 > --- a/kernel/rcu/rcuscale.c > +++ b/kernel/rcu/rcuscale.c > @@ -419,6 +419,7 @@ rcu_scale_writer(void *arg) > VERBOSE_SCALEOUT_STRING("rcu_scale_writer task started"); > WARN_ON(!wdpp); > set_cpus_allowed_ptr(current, cpumask_of(me % nr_cpu_ids)); > + current->flags |= PF_NO_SETAFFINITY; > sched_set_fifo_low(current); > > if (holdoff) > -- > 2.25.1 >
diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c index 277a5bfb37d4..3ef02d4a8108 100644 --- a/kernel/rcu/rcuscale.c +++ b/kernel/rcu/rcuscale.c @@ -419,6 +419,7 @@ rcu_scale_writer(void *arg) VERBOSE_SCALEOUT_STRING("rcu_scale_writer task started"); WARN_ON(!wdpp); set_cpus_allowed_ptr(current, cpumask_of(me % nr_cpu_ids)); + current->flags |= PF_NO_SETAFFINITY; sched_set_fifo_low(current); if (holdoff)
BUG: using smp_processor_id() in preemptible [00000000] code: rcu_scale_write/69 CPU: 0 PID: 66 Comm: rcu_scale_write Not tainted 5.18.0-rc7-next-20220517-yoctodev-standard+ caller is debug_smp_processor_id+0x17/0x20 Call Trace: <TASK> dump_stack_lvl+0x49/0x5e dump_stack+0x10/0x12 check_preemption_disabled+0xdf/0xf0 debug_smp_processor_id+0x17/0x20 rcu_scale_writer+0x2b5/0x580 kthread+0x177/0x1b0 ret_from_fork+0x22/0x30 </TASK> Reproduction method: runqemu kvm slirp nographic qemuparams="-m 4096 -smp 8" bootparams="isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3 rcutree.dump_tree=1 rcuscale.shutdown=false rcuscale.gp_async=true" -d when the CONFIG_DEBUG_PREEMPT is enabled, this_cpu_ptr() will call debug_smp_processor_id() get current CPU number, this warning is triggered by is_percpu_thread() in debug_smp_processor_id(), the is_percpu_thread() need to check whether 'current->nr_cpus_allowed == 1' and 'current->flags & PF_NO_SETAFFINITY', invoke set_cpus_allowed_ptr() only set kthreads->nr_cpus_allowed, but the PF_NO_SETAFFINITY is not set to kthread->flags, so add PF_NO_SETAFFINITY flags setting. Signed-off-by: Zqiang <qiang1.zhang@intel.com> --- kernel/rcu/rcuscale.c | 1 + 1 file changed, 1 insertion(+)