diff mbox series

rcu/rcuscale: Fix using smp_processor_id() in preemptible warnings

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

Commit Message

Zqiang May 21, 2022, 6:56 a.m. UTC
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(+)

Comments

Paul E. McKenney May 23, 2022, 11:18 p.m. UTC | #1
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 mbox series

Patch

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)