All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] rcutorture: Avoid create fwd_prog_tasks for tasks-rude and srcu-atomic
@ 2026-10-23  9:37 Zqiang
  2026-10-23 19:23 ` Paul E. McKenney
  0 siblings, 1 reply; 4+ messages in thread
From: Zqiang @ 2026-10-23  9:37 UTC (permalink / raw)
  To: paulmck, frederic, neeraj.upadhyay, joelagnelf, urezki, boqun
  Cc: qiang.zhang, rcu, linux-kernel

When running the tasks-rude and srcu-atomic tests, the fwd_prog_tasks
kthread is created because the default value of fwd_progress is 1.
however, the two RCU flavors not support ->call():

1. tasks-rude: commit b428a9de9bba ("rcutorture: Stop testing RCU Tasks
   Rude asynchronous APIs") removed .call and .cb_barrier from tasks-rude,
   but left the .cbflood_max = 50000.

2. srcu-atomic: srcu_torture_init_forbidden_apis() sets ->call to NULL
   for SRCU_READ_FLAVOR_ATOMIC runs, but leaves ->cbflood_max untouched.

In both cases, the non-zero ->cbflood_max fools the check above into
creating the fwd_prog_tasks kthreads, even though those kthreads cannot
possibly carry out any forward-progress test:

1. The rcu_torture_fwd_prog_cr() returns immediately due to cur_ops->call
   is NULL:

[   68.022674] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
[  129.462046] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
[  190.902123] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
[  252.343809] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0

2. The rcu_torture_fwd_prog_nr() is never even invoked, because its caller
   requires cur_ops->stall_dur, and neither tasks-rude nor srcu-atomic
   provide ->stall_dur (only rcu_ops does).

Therefore, creating fwd_prog_tasks kthreads is pointless, this commit adds
->call and ->cb_barrier to the forward-progress check, rejecting flavors
that lack the cbflood_max set and a positive ->stall_dur.

simple verification output:

[    3.062959][    T1] srcu-torture: rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test
[    2.922323][    T1] tasks-rude-torture: rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test

Suggested-by: Joel Fernandes <joelagnelf@nvidia.com> 
Signed-off-by: Zqiang <qiang.zhang@linux.dev>
---
 kernel/rcu/rcutorture.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 968343be4e0d..92ff197f4789 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -4007,9 +4007,8 @@ static int __init rcu_torture_fwd_prog_init(void)
 	} else if (fwd_progress < 0) {
 		fwd_progress = nr_cpu_ids;
 	}
-	if ((!cur_ops->sync && !cur_ops->call) ||
-	    (!cur_ops->cbflood_max && (!cur_ops->stall_dur || cur_ops->stall_dur() <= 0)) ||
-	    cur_ops == &rcu_busted_ops) {
+	if (!cur_ops->sync || ((!cur_ops->call || !cur_ops->cb_barrier || !cur_ops->cbflood_max) &&
+	    (!cur_ops->stall_dur || cur_ops->stall_dur() <= 0))) {
 		VERBOSE_TOROUT_STRING("rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test");
 		fwd_progress = 0;
 		return 0;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] rcutorture: Avoid create fwd_prog_tasks for tasks-rude and srcu-atomic
  2026-10-23  9:37 [PATCH v2] rcutorture: Avoid create fwd_prog_tasks for tasks-rude and srcu-atomic Zqiang
@ 2026-10-23 19:23 ` Paul E. McKenney
  2026-10-30 12:14   ` Zqiang
  0 siblings, 1 reply; 4+ messages in thread
From: Paul E. McKenney @ 2026-10-23 19:23 UTC (permalink / raw)
  To: Zqiang
  Cc: frederic, neeraj.upadhyay, joelagnelf, urezki, boqun, rcu,
	linux-kernel

On Fri, Oct 23, 2026 at 05:37:16PM +0800, Zqiang wrote:
> When running the tasks-rude and srcu-atomic tests, the fwd_prog_tasks
> kthread is created because the default value of fwd_progress is 1.
> however, the two RCU flavors not support ->call():
> 
> 1. tasks-rude: commit b428a9de9bba ("rcutorture: Stop testing RCU Tasks
>    Rude asynchronous APIs") removed .call and .cb_barrier from tasks-rude,
>    but left the .cbflood_max = 50000.
> 
> 2. srcu-atomic: srcu_torture_init_forbidden_apis() sets ->call to NULL
>    for SRCU_READ_FLAVOR_ATOMIC runs, but leaves ->cbflood_max untouched.
> 
> In both cases, the non-zero ->cbflood_max fools the check above into
> creating the fwd_prog_tasks kthreads, even though those kthreads cannot
> possibly carry out any forward-progress test:
> 
> 1. The rcu_torture_fwd_prog_cr() returns immediately due to cur_ops->call
>    is NULL:
> 
> [   68.022674] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
> [  129.462046] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
> [  190.902123] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
> [  252.343809] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
> 
> 2. The rcu_torture_fwd_prog_nr() is never even invoked, because its caller
>    requires cur_ops->stall_dur, and neither tasks-rude nor srcu-atomic
>    provide ->stall_dur (only rcu_ops does).
> 
> Therefore, creating fwd_prog_tasks kthreads is pointless, this commit adds
> ->call and ->cb_barrier to the forward-progress check, rejecting flavors
> that lack the cbflood_max set and a positive ->stall_dur.
> 
> simple verification output:
> 
> [    3.062959][    T1] srcu-torture: rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test
> [    2.922323][    T1] tasks-rude-torture: rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test
> 
> Suggested-by: Joel Fernandes <joelagnelf@nvidia.com> 
> Signed-off-by: Zqiang <qiang.zhang@linux.dev>

Reviewed-by: Paul E. McKenney <paulmck@kernel.org>

It would nevertheless be good to run tests demonstrating that
forward-progress testing happens and does not happen on the same
rcu_torture_ops structures as before.  Just in case I lost my
way through that boolean expression.  ;-)

> ---
>  kernel/rcu/rcutorture.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
> index 968343be4e0d..92ff197f4789 100644
> --- a/kernel/rcu/rcutorture.c
> +++ b/kernel/rcu/rcutorture.c
> @@ -4007,9 +4007,8 @@ static int __init rcu_torture_fwd_prog_init(void)
>  	} else if (fwd_progress < 0) {
>  		fwd_progress = nr_cpu_ids;
>  	}
> -	if ((!cur_ops->sync && !cur_ops->call) ||
> -	    (!cur_ops->cbflood_max && (!cur_ops->stall_dur || cur_ops->stall_dur() <= 0)) ||
> -	    cur_ops == &rcu_busted_ops) {
> +	if (!cur_ops->sync || ((!cur_ops->call || !cur_ops->cb_barrier || !cur_ops->cbflood_max) &&
> +	    (!cur_ops->stall_dur || cur_ops->stall_dur() <= 0))) {
>  		VERBOSE_TOROUT_STRING("rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test");
>  		fwd_progress = 0;
>  		return 0;
> -- 
> 2.17.1
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] rcutorture: Avoid create fwd_prog_tasks for tasks-rude and srcu-atomic
  2026-10-23 19:23 ` Paul E. McKenney
@ 2026-10-30 12:14   ` Zqiang
  0 siblings, 0 replies; 4+ messages in thread
From: Zqiang @ 2026-10-30 12:14 UTC (permalink / raw)
  To: paulmck
  Cc: frederic, neeraj.upadhyay, joelagnelf, urezki, boqun, rcu,
	linux-kernel

> 
> On Fri, Oct 23, 2026 at 05:37:16PM +0800, Zqiang wrote:
> 
> > 
> > When running the tasks-rude and srcu-atomic tests, the fwd_prog_tasks
> >  kthread is created because the default value of fwd_progress is 1.
> >  however, the two RCU flavors not support ->call():
> >  
> >  1. tasks-rude: commit b428a9de9bba ("rcutorture: Stop testing RCU Tasks
> >  Rude asynchronous APIs") removed .call and .cb_barrier from tasks-rude,
> >  but left the .cbflood_max = 50000.
> >  
> >  2. srcu-atomic: srcu_torture_init_forbidden_apis() sets ->call to NULL
> >  for SRCU_READ_FLAVOR_ATOMIC runs, but leaves ->cbflood_max untouched.
> >  
> >  In both cases, the non-zero ->cbflood_max fools the check above into
> >  creating the fwd_prog_tasks kthreads, even though those kthreads cannot
> >  possibly carry out any forward-progress test:
> >  
> >  1. The rcu_torture_fwd_prog_cr() returns immediately due to cur_ops->call
> >  is NULL:
> >  
> >  [ 68.022674] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
> >  [ 129.462046] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
> >  [ 190.902123] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
> >  [ 252.343809] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
> >  
> >  2. The rcu_torture_fwd_prog_nr() is never even invoked, because its caller
> >  requires cur_ops->stall_dur, and neither tasks-rude nor srcu-atomic
> >  provide ->stall_dur (only rcu_ops does).
> >  
> >  Therefore, creating fwd_prog_tasks kthreads is pointless, this commit adds
> >  ->call and ->cb_barrier to the forward-progress check, rejecting flavors
> >  that lack the cbflood_max set and a positive ->stall_dur.
> >  
> >  simple verification output:
> >  
> >  [ 3.062959][ T1] srcu-torture: rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test
> >  [ 2.922323][ T1] tasks-rude-torture: rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test
> >  
> >  Suggested-by: Joel Fernandes <joelagnelf@nvidia.com> 
> >  Signed-off-by: Zqiang <qiang.zhang@linux.dev>
> > 
> Reviewed-by: Paul E. McKenney <paulmck@kernel.org>
> 
> It would nevertheless be good to run tests demonstrating that
> forward-progress testing happens and does not happen on the same
> rcu_torture_ops structures as before. Just in case I lost my
> way through that boolean expression. ;-)

Ok, I see. thanks Paul ;-) .

> 
> > 
> > ---
> >  kernel/rcu/rcutorture.c | 5 ++---
> >  1 file changed, 2 insertions(+), 3 deletions(-)
> >  
> >  diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
> >  index 968343be4e0d..92ff197f4789 100644
> >  --- a/kernel/rcu/rcutorture.c
> >  +++ b/kernel/rcu/rcutorture.c
> >  @@ -4007,9 +4007,8 @@ static int __init rcu_torture_fwd_prog_init(void)
> >  } else if (fwd_progress < 0) {
> >  fwd_progress = nr_cpu_ids;
> >  }
> >  - if ((!cur_ops->sync && !cur_ops->call) ||
> >  - (!cur_ops->cbflood_max && (!cur_ops->stall_dur || cur_ops->stall_dur() <= 0)) ||
> >  - cur_ops == &rcu_busted_ops) {
> >  + if (!cur_ops->sync || ((!cur_ops->call || !cur_ops->cb_barrier || !cur_ops->cbflood_max) &&
> >  + (!cur_ops->stall_dur || cur_ops->stall_dur() <= 0))) {
> >  VERBOSE_TOROUT_STRING("rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test");
> >  fwd_progress = 0;
> >  return 0;
> >  -- 
> >  2.17.1
> >
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] rcutorture: Avoid create fwd_prog_tasks for tasks-rude and srcu-atomic
@ 2026-10-30 12:46 Joel Fernandes
  0 siblings, 0 replies; 4+ messages in thread
From: Joel Fernandes @ 2026-10-30 12:46 UTC (permalink / raw)
  To: Zqiang
  Cc: paulmck@kernel.org, frederic@kernel.org,
	neeraj.upadhyay@kernel.org, urezki@gmail.com, boqun@kernel.org,
	rcu@vger.kernel.org, linux-kernel@vger.kernel.org



> On Oct 30, 2026, at 8:14 AM, Zqiang <qiang.zhang@linux.dev> wrote:
> 
> 
>> 
>> 
>>> On Fri, Oct 23, 2026 at 05:37:16PM +0800, Zqiang wrote:
>>> 
>>> 
>>> When running the tasks-rude and srcu-atomic tests, the fwd_prog_tasks
>>> kthread is created because the default value of fwd_progress is 1.
>>> however, the two RCU flavors not support ->call():
>>> 
>>> 1. tasks-rude: commit b428a9de9bba ("rcutorture: Stop testing RCU Tasks
>>> Rude asynchronous APIs") removed .call and .cb_barrier from tasks-rude,
>>> but left the .cbflood_max = 50000.
>>> 
>>> 2. srcu-atomic: srcu_torture_init_forbidden_apis() sets ->call to NULL
>>> for SRCU_READ_FLAVOR_ATOMIC runs, but leaves ->cbflood_max untouched.
>>> 
>>> In both cases, the non-zero ->cbflood_max fools the check above into
>>> creating the fwd_prog_tasks kthreads, even though those kthreads cannot
>>> possibly carry out any forward-progress test:
>>> 
>>> 1. The rcu_torture_fwd_prog_cr() returns immediately due to cur_ops->call
>>> is NULL:
>>> 
>>> [ 68.022674] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
>>> [ 129.462046] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
>>> [ 190.902123] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
>>> [ 252.343809] rcu_torture_fwd_prog_cr: No ->call(), so no forward-progress test 0
>>> 
>>> 2. The rcu_torture_fwd_prog_nr() is never even invoked, because its caller
>>> requires cur_ops->stall_dur, and neither tasks-rude nor srcu-atomic
>>> provide ->stall_dur (only rcu_ops does).
>>> 
>>> Therefore, creating fwd_prog_tasks kthreads is pointless, this commit adds
>>> ->call and ->cb_barrier to the forward-progress check, rejecting flavors
>>> that lack the cbflood_max set and a positive ->stall_dur.
>>> 
>>> simple verification output:
>>> 
>>> [ 3.062959][ T1] srcu-torture: rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test
>>> [ 2.922323][ T1] tasks-rude-torture: rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test
>>> 
>>> Suggested-by: Joel Fernandes <joelagnelf@nvidia.com>
>>> Signed-off-by: Zqiang <qiang.zhang@linux.dev>
>>> 
>> Reviewed-by: Paul E. McKenney <paulmck@kernel.org>
>> 
>> It would nevertheless be good to run tests demonstrating that
>> forward-progress testing happens and does not happen on the same
>> rcu_torture_ops structures as before. Just in case I lost my
>> way through that boolean expression. ;-)
> 
> Ok, I see. thanks Paul ;-) .

So let me know Zqiang once you are confident on the testing from and I will apply it for 7.5.

thanks,

Joel Fernandes


> 
>> 
>>> 
>>> ---
>>> kernel/rcu/rcutorture.c | 5 ++---
>>> 1 file changed, 2 insertions(+), 3 deletions(-)
>>> 
>>> diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
>>> index 968343be4e0d..92ff197f4789 100644
>>> --- a/kernel/rcu/rcutorture.c
>>> +++ b/kernel/rcu/rcutorture.c
>>> @@ -4007,9 +4007,8 @@ static int __init rcu_torture_fwd_prog_init(void)
>>> } else if (fwd_progress < 0) {
>>> fwd_progress = nr_cpu_ids;
>>> }
>>> - if ((!cur_ops->sync && !cur_ops->call) ||
>>> - (!cur_ops->cbflood_max && (!cur_ops->stall_dur || cur_ops->stall_dur() <= 0)) ||
>>> - cur_ops == &rcu_busted_ops) {
>>> + if (!cur_ops->sync || ((!cur_ops->call || !cur_ops->cb_barrier || !cur_ops->cbflood_max) &&
>>> + (!cur_ops->stall_dur || cur_ops->stall_dur() <= 0))) {
>>> VERBOSE_TOROUT_STRING("rcu_torture_fwd_prog_init: Disabled, unsupported by RCU flavor under test");
>>> fwd_progress = 0;
>>> return 0;
>>> --
>>> 2.17.1
>>> 
>> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-10-30 12:47 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-23  9:37 [PATCH v2] rcutorture: Avoid create fwd_prog_tasks for tasks-rude and srcu-atomic Zqiang
2026-10-23 19:23 ` Paul E. McKenney
2026-10-30 12:14   ` Zqiang
  -- strict thread matches above, loose matches on Subject: below --
2026-10-30 12:46 Joel Fernandes

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.