mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v2] rcuscale: add srcua scale type
@ 2026-10-03 16:17 Kunwu Chan
  2026-10-03 17:52 ` Bradley Morgan
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Kunwu Chan @ 2026-10-03 16:17 UTC (permalink / raw)
  To: dave, paulmck, josh, frederic, neeraj.upadhyay, joelagnelf,
	boqun, urezki
  Cc: rostedt, mathieu.desnoyers, jiangshanlai, qiang.zhang,
	linux-kernel, rcu, Kunwu Chan

Add support for scaling atomic SRCU grace periods using
srcu_read_lock_atomic()/srcu_read_unlock_atomic() and
synchronize_srcu_atomic().

Suggested-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>
---
Changes since v1:
- Rename srcu_atomic_ctlp to srcua and reuse srcu_ctlp for
  SRCU operations, as suggested by Paul.
- Reuse the existing SRCU cleanup and completed helpers by
  initializing srcu_ctlp in srcu_atomic_scale_init().
- Add .stats using srcu_scale_stats().
- Use "srcua" to match the existing "srcu" and "srcud" scale
  type names.
- Use synchronize_srcu_atomic() for both normal and expedited
  scale tests.

v1: https://lore.kernel.org/all/20260927100359.3903688-1-kunwu.chan@gmail.com/
Tested with kvm.sh --torture rcuscale scale_type=srcua on x86_64 and
arm64, alongside gp_exp=1 and PROVE_LOCKING=y: no warnings or lockdep
splats.
---
 kernel/rcu/rcuscale.c | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
index 1097ec15879c..b172882824ac 100644
--- a/kernel/rcu/rcuscale.c
+++ b/kernel/rcu/rcuscale.c
@@ -293,6 +293,44 @@ static struct rcu_scale_ops srcud_ops = {
 	.name		= "srcud"
 };
 
+static struct srcu_struct srcua;
+
+static int srcu_scale_atomic_read_lock(void)
+{
+	return srcu_read_lock_atomic(srcu_ctlp);
+}
+
+static void srcu_scale_atomic_read_unlock(int idx)
+{
+	srcu_read_unlock_atomic(srcu_ctlp, idx);
+}
+
+static void srcu_scale_atomic_synchronize(void)
+{
+	synchronize_srcu_atomic(srcu_ctlp);
+}
+
+static void srcu_atomic_scale_init(void)
+{
+	srcu_ctlp = &srcua;
+	init_srcu_struct_atomic(srcu_ctlp);
+}
+
+static struct rcu_scale_ops srcua_ops = {
+	.ptype		= SRCU_FLAVOR,
+	.init		= srcu_atomic_scale_init,
+	.cleanup	= srcu_sync_scale_cleanup,
+	.readlock	= srcu_scale_atomic_read_lock,
+	.readunlock	= srcu_scale_atomic_read_unlock,
+	.get_gp_seq	= srcu_scale_completed,
+	.gp_diff	= rcu_seq_diff,
+	.exp_completed	= srcu_scale_completed,
+	.sync		= srcu_scale_atomic_synchronize,
+	.exp_sync	= srcu_scale_atomic_synchronize,
+	.stats		= srcu_scale_stats,
+	.name		= "srcua"
+};
+
 #ifdef CONFIG_TASKS_RCU
 
 /*
@@ -1110,7 +1148,8 @@ rcu_scale_init(void)
 	long i;
 	long j;
 	static struct rcu_scale_ops *scale_ops[] = {
-		&rcu_ops, &srcu_ops, &srcud_ops, TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
+		&rcu_ops, &srcu_ops, &srcua_ops, &srcud_ops,
+		TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
 	};
 
 	if (!torture_init_begin(scale_type, verbose))

base-commit: d21906b0aa1e9573cdb5e7acaca44966b9d1dcd2
-- 
2.43.0


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

* Re: [PATCH v2] rcuscale: add srcua scale type
  2026-10-03 16:17 [PATCH v2] rcuscale: add srcua scale type Kunwu Chan
@ 2026-10-03 17:52 ` Bradley Morgan
  2026-10-03 23:43   ` Paul E. McKenney
  2026-10-04  0:17 ` Paul E. McKenney
  2026-10-04  0:33 ` Joel Fernandes
  2 siblings, 1 reply; 7+ messages in thread
From: Bradley Morgan @ 2026-10-03 17:52 UTC (permalink / raw)
  To: kunwu.chan
  Cc: boqun, dave, frederic, jiangshanlai, joelagnelf, josh,
	linux-kernel, mathieu.desnoyers, neeraj.upadhyay, paulmck,
	qiang.zhang, rcu, rostedt, urezki

On 3 October 2026 17:17:19 BST, Kunwu Chan <kunwu.chan@gmail.com> wrote:
>Add support for scaling atomic SRCU grace periods using
>srcu_read_lock_atomic()/srcu_read_unlock_atomic() and
>synchronize_srcu_atomic().
>
>Suggested-by: Paul E. McKenney <paulmck@kernel.org>
>Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>

1: why didn't u cc me
2: why did you ommit my tag? I tend to review based on correctness, cuz idk pauls preferences, once I do I'll be a better rcu reviewer.

>---
>Changes since v1:
>- Rename srcu_atomic_ctlp to srcua and reuse srcu_ctlp for
>  SRCU operations, as suggested by Paul.
>- Reuse the existing SRCU cleanup and completed helpers by
>  initializing srcu_ctlp in srcu_atomic_scale_init().
>- Add .stats using srcu_scale_stats().
>- Use "srcua" to match the existing "srcu" and "srcud" scale
>  type names.
>- Use synchronize_srcu_atomic() for both normal and expedited
>  scale tests.
>
>v1: https://lore.kernel.org/all/20260927100359.3903688-1-kunwu.chan@gmail.com/
>Tested with kvm.sh --torture rcuscale scale_type=srcua on x86_64 and
>arm64, alongside gp_exp=1 and PROVE_LOCKING=y: no warnings or lockdep
>splats.
>---
> kernel/rcu/rcuscale.c | 41 ++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 40 insertions(+), 1 deletion(-)
>
>diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
>index 1097ec15879c..b172882824ac 100644
>--- a/kernel/rcu/rcuscale.c
>+++ b/kernel/rcu/rcuscale.c
>@@ -293,6 +293,44 @@ static struct rcu_scale_ops srcud_ops = {
> 	.name		= "srcud"
> };
> 
>+static struct srcu_struct srcua;
>+
>+static int srcu_scale_atomic_read_lock(void)
>+{
>+	return srcu_read_lock_atomic(srcu_ctlp);
>+}
>+
>+static void srcu_scale_atomic_read_unlock(int idx)
>+{
>+	srcu_read_unlock_atomic(srcu_ctlp, idx);
>+}
>+
>+static void srcu_scale_atomic_synchronize(void)
>+{
>+	synchronize_srcu_atomic(srcu_ctlp);
>+}
>+
>+static void srcu_atomic_scale_init(void)
>+{
>+	srcu_ctlp = &srcua;
>+	init_srcu_struct_atomic(srcu_ctlp);
>+}
>+
>+static struct rcu_scale_ops srcua_ops = {
>+	.ptype		= SRCU_FLAVOR,
>+	.init		= srcu_atomic_scale_init,
>+	.cleanup	= srcu_sync_scale_cleanup,
>+	.readlock	= srcu_scale_atomic_read_lock,
>+	.readunlock	= srcu_scale_atomic_read_unlock,
>+	.get_gp_seq	= srcu_scale_completed,
>+	.gp_diff	= rcu_seq_diff,
>+	.exp_completed	= srcu_scale_completed,
>+	.sync		= srcu_scale_atomic_synchronize,
>+	.exp_sync	= srcu_scale_atomic_synchronize,
>+	.stats		= srcu_scale_stats,
>+	.name		= "srcua"
>+};
>+
> #ifdef CONFIG_TASKS_RCU
> 
> /*
>@@ -1110,7 +1148,8 @@ rcu_scale_init(void)
> 	long i;
> 	long j;
> 	static struct rcu_scale_ops *scale_ops[] = {
>-		&rcu_ops, &srcu_ops, &srcud_ops, TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
>+		&rcu_ops, &srcu_ops, &srcua_ops, &srcud_ops,
>+		TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
> 	};
> 
> 	if (!torture_init_begin(scale_type, verbose))
>
>base-commit: d21906b0aa1e9573cdb5e7acaca44966b9d1dcd2
>

--- Thanks!
"I'm not a very positive person" - Linus torvalds

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

* Re: [PATCH v2] rcuscale: add srcua scale type
  2026-10-03 17:52 ` Bradley Morgan
@ 2026-10-03 23:43   ` Paul E. McKenney
  2026-10-03 23:52     ` Bradley Morgan
  0 siblings, 1 reply; 7+ messages in thread
From: Paul E. McKenney @ 2026-10-03 23:43 UTC (permalink / raw)
  To: Bradley Morgan
  Cc: kunwu.chan, boqun, dave, frederic, jiangshanlai, joelagnelf,
	josh, linux-kernel, mathieu.desnoyers, neeraj.upadhyay,
	qiang.zhang, rcu, rostedt, urezki

On Sat, Oct 03, 2026 at 06:52:44PM +0100, Bradley Morgan wrote:
> On 3 October 2026 17:17:19 BST, Kunwu Chan <kunwu.chan@gmail.com> wrote:
> >Add support for scaling atomic SRCU grace periods using
> >srcu_read_lock_atomic()/srcu_read_unlock_atomic() and
> >synchronize_srcu_atomic().
> >
> >Suggested-by: Paul E. McKenney <paulmck@kernel.org>
> >Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>
> 
> 1: why didn't u cc me
> 2: why did you ommit my tag? I tend to review based on correctness, cuz idk pauls preferences, once I do I'll be a better rcu reviewer.

Take it easy, Bradley.

Many in the Linux kernel community consider it polite to drop a tag
from (or, as in this case, avoid adding a tag to) a patch that changed
significantly.  On the CC issue, you did find the patch the first time
without him CCing you.  ;-)

Kunwu did nothing wrong here.

							Thanx, Paul

> >---
> >Changes since v1:
> >- Rename srcu_atomic_ctlp to srcua and reuse srcu_ctlp for
> >  SRCU operations, as suggested by Paul.
> >- Reuse the existing SRCU cleanup and completed helpers by
> >  initializing srcu_ctlp in srcu_atomic_scale_init().
> >- Add .stats using srcu_scale_stats().
> >- Use "srcua" to match the existing "srcu" and "srcud" scale
> >  type names.
> >- Use synchronize_srcu_atomic() for both normal and expedited
> >  scale tests.
> >
> >v1: https://lore.kernel.org/all/20260927100359.3903688-1-kunwu.chan@gmail.com/
> >Tested with kvm.sh --torture rcuscale scale_type=srcua on x86_64 and
> >arm64, alongside gp_exp=1 and PROVE_LOCKING=y: no warnings or lockdep
> >splats.
> >---
> > kernel/rcu/rcuscale.c | 41 ++++++++++++++++++++++++++++++++++++++++-
> > 1 file changed, 40 insertions(+), 1 deletion(-)
> >
> >diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
> >index 1097ec15879c..b172882824ac 100644
> >--- a/kernel/rcu/rcuscale.c
> >+++ b/kernel/rcu/rcuscale.c
> >@@ -293,6 +293,44 @@ static struct rcu_scale_ops srcud_ops = {
> > 	.name		= "srcud"
> > };
> > 
> >+static struct srcu_struct srcua;
> >+
> >+static int srcu_scale_atomic_read_lock(void)
> >+{
> >+	return srcu_read_lock_atomic(srcu_ctlp);
> >+}
> >+
> >+static void srcu_scale_atomic_read_unlock(int idx)
> >+{
> >+	srcu_read_unlock_atomic(srcu_ctlp, idx);
> >+}
> >+
> >+static void srcu_scale_atomic_synchronize(void)
> >+{
> >+	synchronize_srcu_atomic(srcu_ctlp);
> >+}
> >+
> >+static void srcu_atomic_scale_init(void)
> >+{
> >+	srcu_ctlp = &srcua;
> >+	init_srcu_struct_atomic(srcu_ctlp);
> >+}
> >+
> >+static struct rcu_scale_ops srcua_ops = {
> >+	.ptype		= SRCU_FLAVOR,
> >+	.init		= srcu_atomic_scale_init,
> >+	.cleanup	= srcu_sync_scale_cleanup,
> >+	.readlock	= srcu_scale_atomic_read_lock,
> >+	.readunlock	= srcu_scale_atomic_read_unlock,
> >+	.get_gp_seq	= srcu_scale_completed,
> >+	.gp_diff	= rcu_seq_diff,
> >+	.exp_completed	= srcu_scale_completed,
> >+	.sync		= srcu_scale_atomic_synchronize,
> >+	.exp_sync	= srcu_scale_atomic_synchronize,
> >+	.stats		= srcu_scale_stats,
> >+	.name		= "srcua"
> >+};
> >+
> > #ifdef CONFIG_TASKS_RCU
> > 
> > /*
> >@@ -1110,7 +1148,8 @@ rcu_scale_init(void)
> > 	long i;
> > 	long j;
> > 	static struct rcu_scale_ops *scale_ops[] = {
> >-		&rcu_ops, &srcu_ops, &srcud_ops, TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
> >+		&rcu_ops, &srcu_ops, &srcua_ops, &srcud_ops,
> >+		TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
> > 	};
> > 
> > 	if (!torture_init_begin(scale_type, verbose))
> >
> >base-commit: d21906b0aa1e9573cdb5e7acaca44966b9d1dcd2
> >
> 
> --- Thanks!
> "I'm not a very positive person" - Linus torvalds

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

* Re: [PATCH v2] rcuscale: add srcua scale type
  2026-10-03 23:43   ` Paul E. McKenney
@ 2026-10-03 23:52     ` Bradley Morgan
  0 siblings, 0 replies; 7+ messages in thread
From: Bradley Morgan @ 2026-10-03 23:52 UTC (permalink / raw)
  To: paulmck, Paul E. McKenney
  Cc: kunwu.chan, boqun, dave, frederic, jiangshanlai, joelagnelf,
	josh, linux-kernel, mathieu.desnoyers, neeraj.upadhyay,
	qiang.zhang, rcu, rostedt, urezki

On 4 October 2026 00:43:48 BST, "Paul E. McKenney" <paulmck@kernel.org>
wrote:
>On Sat, Oct 03, 2026 at 06:52:44PM +0100, Bradley Morgan wrote:
>> On 3 October 2026 17:17:19 BST, Kunwu Chan <kunwu.chan@gmail.com> wrote:
>> >Add support for scaling atomic SRCU grace periods using
>> >srcu_read_lock_atomic()/srcu_read_unlock_atomic() and
>> >synchronize_srcu_atomic().
>> >
>> >Suggested-by: Paul E. McKenney <paulmck@kernel.org>
>> >Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>
>> 
>> 1: why didn't u cc me
>> 2: why did you ommit my tag? I tend to review based on correctness, cuz
>idk pauls preferences, once I do I'll be a better rcu reviewer.
>
>Take it easy, Bradley.
>
>Many in the Linux kernel community consider it polite to drop a tag
>from (or, as in this case, avoid adding a tag to) a patch that changed
>significantly.  On the CC issue, you did find the patch the first time
>without him CCing you.  ;-)
>
>Kunwu did nothing wrong here.

I'm annoyed but not mad, no grudges taken..

>
>							Thanx, Paul
>
>> >---
>> >Changes since v1:
>> >- Rename srcu_atomic_ctlp to srcua and reuse srcu_ctlp for
>> >  SRCU operations, as suggested by Paul.
>> >- Reuse the existing SRCU cleanup and completed helpers by
>> >  initializing srcu_ctlp in srcu_atomic_scale_init().
>> >- Add .stats using srcu_scale_stats().
>> >- Use "srcua" to match the existing "srcu" and "srcud" scale
>> >  type names.
>> >- Use synchronize_srcu_atomic() for both normal and expedited
>> >  scale tests.
>> >
>> >v1:
>https://lore.kernel.org/all/20260927100359.3903688-1-kunwu.chan@gmail.com/
>> >Tested with kvm.sh --torture rcuscale scale_type=srcua on x86_64 and
>> >arm64, alongside gp_exp=1 and PROVE_LOCKING=y: no warnings or lockdep
>> >splats.
>> >---
>> > kernel/rcu/rcuscale.c | 41 ++++++++++++++++++++++++++++++++++++++++-
>> > 1 file changed, 40 insertions(+), 1 deletion(-)
>> >
>> >diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
>> >index 1097ec15879c..b172882824ac 100644
>> >--- a/kernel/rcu/rcuscale.c
>> >+++ b/kernel/rcu/rcuscale.c
>> >@@ -293,6 +293,44 @@ static struct rcu_scale_ops srcud_ops = {
>> > 	.name		= "srcud"
>> > };
>> > 
>> >+static struct srcu_struct srcua;
>> >+
>> >+static int srcu_scale_atomic_read_lock(void)
>> >+{
>> >+	return srcu_read_lock_atomic(srcu_ctlp);
>> >+}
>> >+
>> >+static void srcu_scale_atomic_read_unlock(int idx)
>> >+{
>> >+	srcu_read_unlock_atomic(srcu_ctlp, idx);
>> >+}
>> >+
>> >+static void srcu_scale_atomic_synchronize(void)
>> >+{
>> >+	synchronize_srcu_atomic(srcu_ctlp);
>> >+}
>> >+
>> >+static void srcu_atomic_scale_init(void)
>> >+{
>> >+	srcu_ctlp = &srcua;
>> >+	init_srcu_struct_atomic(srcu_ctlp);
>> >+}
>> >+
>> >+static struct rcu_scale_ops srcua_ops = {
>> >+	.ptype		= SRCU_FLAVOR,
>> >+	.init		= srcu_atomic_scale_init,
>> >+	.cleanup	= srcu_sync_scale_cleanup,
>> >+	.readlock	= srcu_scale_atomic_read_lock,
>> >+	.readunlock	= srcu_scale_atomic_read_unlock,
>> >+	.get_gp_seq	= srcu_scale_completed,
>> >+	.gp_diff	= rcu_seq_diff,
>> >+	.exp_completed	= srcu_scale_completed,
>> >+	.sync		= srcu_scale_atomic_synchronize,
>> >+	.exp_sync	= srcu_scale_atomic_synchronize,
>> >+	.stats		= srcu_scale_stats,
>> >+	.name		= "srcua"
>> >+};
>> >+
>> > #ifdef CONFIG_TASKS_RCU
>> > 
>> > /*
>> >@@ -1110,7 +1148,8 @@ rcu_scale_init(void)
>> > 	long i;
>> > 	long j;
>> > 	static struct rcu_scale_ops *scale_ops[] = {
>> >-		&rcu_ops, &srcu_ops, &srcud_ops, TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
>> >+		&rcu_ops, &srcu_ops, &srcua_ops, &srcud_ops,
>> >+		TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
>> > 	};
>> > 
>> > 	if (!torture_init_begin(scale_type, verbose))
>> >
>> >base-commit: d21906b0aa1e9573cdb5e7acaca44966b9d1dcd2
>> >
>> 
>> --- Thanks!
>> "I'm not a very positive person" - Linus torvalds

--- Thanks!
"I'm not a very positive person" - Linus torvalds

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

* Re: [PATCH v2] rcuscale: add srcua scale type
  2026-10-03 16:17 [PATCH v2] rcuscale: add srcua scale type Kunwu Chan
  2026-10-03 17:52 ` Bradley Morgan
@ 2026-10-04  0:17 ` Paul E. McKenney
  2026-10-04  0:33 ` Joel Fernandes
  2 siblings, 0 replies; 7+ messages in thread
From: Paul E. McKenney @ 2026-10-04  0:17 UTC (permalink / raw)
  To: Kunwu Chan
  Cc: dave, josh, frederic, neeraj.upadhyay, joelagnelf, boqun, urezki,
	rostedt, mathieu.desnoyers, jiangshanlai, qiang.zhang,
	linux-kernel, rcu

On Sun, Oct 04, 2026 at 12:17:19AM +0800, Kunwu Chan wrote:
> Add support for scaling atomic SRCU grace periods using
> srcu_read_lock_atomic()/srcu_read_unlock_atomic() and
> synchronize_srcu_atomic().
> 
> Suggested-by: Paul E. McKenney <paulmck@kernel.org>
> Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>

Queued for testing and further review, thank you!!!

							Thanx, Paul

> ---
> Changes since v1:
> - Rename srcu_atomic_ctlp to srcua and reuse srcu_ctlp for
>   SRCU operations, as suggested by Paul.
> - Reuse the existing SRCU cleanup and completed helpers by
>   initializing srcu_ctlp in srcu_atomic_scale_init().
> - Add .stats using srcu_scale_stats().
> - Use "srcua" to match the existing "srcu" and "srcud" scale
>   type names.
> - Use synchronize_srcu_atomic() for both normal and expedited
>   scale tests.
> 
> v1: https://lore.kernel.org/all/20260927100359.3903688-1-kunwu.chan@gmail.com/
> Tested with kvm.sh --torture rcuscale scale_type=srcua on x86_64 and
> arm64, alongside gp_exp=1 and PROVE_LOCKING=y: no warnings or lockdep
> splats.
> ---
>  kernel/rcu/rcuscale.c | 41 ++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 40 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
> index 1097ec15879c..b172882824ac 100644
> --- a/kernel/rcu/rcuscale.c
> +++ b/kernel/rcu/rcuscale.c
> @@ -293,6 +293,44 @@ static struct rcu_scale_ops srcud_ops = {
>  	.name		= "srcud"
>  };
>  
> +static struct srcu_struct srcua;
> +
> +static int srcu_scale_atomic_read_lock(void)
> +{
> +	return srcu_read_lock_atomic(srcu_ctlp);
> +}
> +
> +static void srcu_scale_atomic_read_unlock(int idx)
> +{
> +	srcu_read_unlock_atomic(srcu_ctlp, idx);
> +}
> +
> +static void srcu_scale_atomic_synchronize(void)
> +{
> +	synchronize_srcu_atomic(srcu_ctlp);
> +}
> +
> +static void srcu_atomic_scale_init(void)
> +{
> +	srcu_ctlp = &srcua;
> +	init_srcu_struct_atomic(srcu_ctlp);
> +}
> +
> +static struct rcu_scale_ops srcua_ops = {
> +	.ptype		= SRCU_FLAVOR,
> +	.init		= srcu_atomic_scale_init,
> +	.cleanup	= srcu_sync_scale_cleanup,
> +	.readlock	= srcu_scale_atomic_read_lock,
> +	.readunlock	= srcu_scale_atomic_read_unlock,
> +	.get_gp_seq	= srcu_scale_completed,
> +	.gp_diff	= rcu_seq_diff,
> +	.exp_completed	= srcu_scale_completed,
> +	.sync		= srcu_scale_atomic_synchronize,
> +	.exp_sync	= srcu_scale_atomic_synchronize,
> +	.stats		= srcu_scale_stats,
> +	.name		= "srcua"
> +};
> +
>  #ifdef CONFIG_TASKS_RCU
>  
>  /*
> @@ -1110,7 +1148,8 @@ rcu_scale_init(void)
>  	long i;
>  	long j;
>  	static struct rcu_scale_ops *scale_ops[] = {
> -		&rcu_ops, &srcu_ops, &srcud_ops, TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
> +		&rcu_ops, &srcu_ops, &srcua_ops, &srcud_ops,
> +		TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
>  	};
>  
>  	if (!torture_init_begin(scale_type, verbose))
> 
> base-commit: d21906b0aa1e9573cdb5e7acaca44966b9d1dcd2
> -- 
> 2.43.0
> 

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

* Re: [PATCH v2] rcuscale: add srcua scale type
  2026-10-03 16:17 [PATCH v2] rcuscale: add srcua scale type Kunwu Chan
  2026-10-03 17:52 ` Bradley Morgan
  2026-10-04  0:17 ` Paul E. McKenney
@ 2026-10-04  0:33 ` Joel Fernandes
  2026-10-04  3:14   ` KunWu Chan
  2 siblings, 1 reply; 7+ messages in thread
From: Joel Fernandes @ 2026-10-04  0:33 UTC (permalink / raw)
  To: Kunwu Chan, dave, paulmck, josh, frederic, neeraj.upadhyay,
	boqun, urezki
  Cc: rostedt, mathieu.desnoyers, jiangshanlai, qiang.zhang, linux-kernel, rcu

On 10/3/2026 12:17 PM, Kunwu Chan wrote:
> Add support for scaling atomic SRCU grace periods using
> srcu_read_lock_atomic()/srcu_read_unlock_atomic() and
> synchronize_srcu_atomic().
> 
> Suggested-by: Paul E. McKenney <paulmck@kernel.org>
> Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>
> ---
> Changes since v1:
> - Rename srcu_atomic_ctlp to srcua and reuse srcu_ctlp for
>   SRCU operations, as suggested by Paul.
> - Reuse the existing SRCU cleanup and completed helpers by
>   initializing srcu_ctlp in srcu_atomic_scale_init().
> - Add .stats using srcu_scale_stats().
> - Use "srcua" to match the existing "srcu" and "srcud" scale
>   type names.
> - Use synchronize_srcu_atomic() for both normal and expedited
>   scale tests.
> 
> v1: https://lore.kernel.org/all/20260927100359.3903688-1-kunwu.chan@gmail.com/
> Tested with kvm.sh --torture rcuscale scale_type=srcua on x86_64 and
> arm64, alongside gp_exp=1 and PROVE_LOCKING=y: no warnings or lockdep
> splats.
> ---

Maybe some performance numbers too for an rcuscale patch? ;-) But either way:

Reviewed-by: Joel Fernandes <joelagnelf@nvidia.com>





>  kernel/rcu/rcuscale.c | 41 ++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 40 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
> index 1097ec15879c..b172882824ac 100644
> --- a/kernel/rcu/rcuscale.c
> +++ b/kernel/rcu/rcuscale.c
> @@ -293,6 +293,44 @@ static struct rcu_scale_ops srcud_ops = {
>  	.name		= "srcud"
>  };
>  
> +static struct srcu_struct srcua;
> +
> +static int srcu_scale_atomic_read_lock(void)
> +{
> +	return srcu_read_lock_atomic(srcu_ctlp);
> +}
> +
> +static void srcu_scale_atomic_read_unlock(int idx)
> +{
> +	srcu_read_unlock_atomic(srcu_ctlp, idx);
> +}
> +
> +static void srcu_scale_atomic_synchronize(void)
> +{
> +	synchronize_srcu_atomic(srcu_ctlp);
> +}
> +
> +static void srcu_atomic_scale_init(void)
> +{
> +	srcu_ctlp = &srcua;
> +	init_srcu_struct_atomic(srcu_ctlp);
> +}
> +
> +static struct rcu_scale_ops srcua_ops = {
> +	.ptype		= SRCU_FLAVOR,
> +	.init		= srcu_atomic_scale_init,
> +	.cleanup	= srcu_sync_scale_cleanup,
> +	.readlock	= srcu_scale_atomic_read_lock,
> +	.readunlock	= srcu_scale_atomic_read_unlock,
> +	.get_gp_seq	= srcu_scale_completed,
> +	.gp_diff	= rcu_seq_diff,
> +	.exp_completed	= srcu_scale_completed,
> +	.sync		= srcu_scale_atomic_synchronize,
> +	.exp_sync	= srcu_scale_atomic_synchronize,
> +	.stats		= srcu_scale_stats,
> +	.name		= "srcua"
> +};
> +
>  #ifdef CONFIG_TASKS_RCU
>  
>  /*
> @@ -1110,7 +1148,8 @@ rcu_scale_init(void)
>  	long i;
>  	long j;
>  	static struct rcu_scale_ops *scale_ops[] = {
> -		&rcu_ops, &srcu_ops, &srcud_ops, TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
> +		&rcu_ops, &srcu_ops, &srcua_ops, &srcud_ops,
> +		TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
>  	};
>  
>  	if (!torture_init_begin(scale_type, verbose))
> 
> base-commit: d21906b0aa1e9573cdb5e7acaca44966b9d1dcd2

-- 
Joel Fernandes


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

* Re: [PATCH v2] rcuscale: add srcua scale type
  2026-10-04  0:33 ` Joel Fernandes
@ 2026-10-04  3:14   ` KunWu Chan
  0 siblings, 0 replies; 7+ messages in thread
From: KunWu Chan @ 2026-10-04  3:14 UTC (permalink / raw)
  To: Joel Fernandes
  Cc: dave, paulmck, josh, frederic, neeraj.upadhyay, boqun, urezki,
	rostedt, mathieu.desnoyers, jiangshanlai, qiang.zhang,
	linux-kernel, rcu

On Sun, Oct 4, 2026 at 8:33 AM Joel Fernandes <joelagnelf@nvidia.com> wrote:
>
> On 10/3/2026 12:17 PM, Kunwu Chan wrote:
> > Add support for scaling atomic SRCU grace periods using
> > srcu_read_lock_atomic()/srcu_read_unlock_atomic() and
> > synchronize_srcu_atomic().
> >
> > Suggested-by: Paul E. McKenney <paulmck@kernel.org>
> > Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>
> > ---
> > Changes since v1:
> > - Rename srcu_atomic_ctlp to srcua and reuse srcu_ctlp for
> >   SRCU operations, as suggested by Paul.
> > - Reuse the existing SRCU cleanup and completed helpers by
> >   initializing srcu_ctlp in srcu_atomic_scale_init().
> > - Add .stats using srcu_scale_stats().
> > - Use "srcua" to match the existing "srcu" and "srcud" scale
> >   type names.
> > - Use synchronize_srcu_atomic() for both normal and expedited
> >   scale tests.
> >
> > v1: https://lore.kernel.org/all/20260927100359.3903688-1-kunwu.chan@gmail.com/
> > Tested with kvm.sh --torture rcuscale scale_type=srcua on x86_64 and
> > arm64, alongside gp_exp=1 and PROVE_LOCKING=y: no warnings or lockdep
> > splats.
> > ---
>
> Maybe some performance numbers too for an rcuscale patch? ;-) But either way:
>
> Reviewed-by: Joel Fernandes <joelagnelf@nvidia.com>

Thanks Joel for the review!

Here are the rcuscale numbers. All tests were run with
kvm.sh --torture rcuscale using scale_type=srcua on 12-CPU
x86_64 and 256-CPU arm64 KVM guests, with and without
PROVE_LOCKING.

All values below are synchronize_srcu_atomic() durations:

  Arch    CPUs  lockdep  gp_exp  median   P99      max
  x86_64   12      n        0    0.82us   1.57us    864us
  x86_64   12      n        1    0.87us   1.54us    857us
  x86_64   12      y        0    0.72us   0.93us     11us
  x86_64   12      y        1    0.66us   0.85us    160us
  arm64   256      n        0   26.2us   71.2us   3389us
  arm64   256      n        1   24.3us   60.6us  10513us
  arm64   256      y        0   13.4us   43.6us   4066us
  arm64   256      y        1    8.86us  22.6us   8004us

gp_exp=1 does not significantly change the distribution for
srcua, since there is no separate expedited primitive for
atomic SRCU.

For comparison, synchronize_srcu() on the same arm64 guest
takes about 8ms under the same workload.

All runs completed without warnings, lockdep splats, or shutdown
issues.

Thanks,
Kunwu

>
>
>
>
>
> >  kernel/rcu/rcuscale.c | 41 ++++++++++++++++++++++++++++++++++++++++-
> >  1 file changed, 40 insertions(+), 1 deletion(-)
> >
> > diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
> > index 1097ec15879c..b172882824ac 100644
> > --- a/kernel/rcu/rcuscale.c
> > +++ b/kernel/rcu/rcuscale.c
> > @@ -293,6 +293,44 @@ static struct rcu_scale_ops srcud_ops = {
> >       .name           = "srcud"
> >  };
> >
> > +static struct srcu_struct srcua;
> > +
> > +static int srcu_scale_atomic_read_lock(void)
> > +{
> > +     return srcu_read_lock_atomic(srcu_ctlp);
> > +}
> > +
> > +static void srcu_scale_atomic_read_unlock(int idx)
> > +{
> > +     srcu_read_unlock_atomic(srcu_ctlp, idx);
> > +}
> > +
> > +static void srcu_scale_atomic_synchronize(void)
> > +{
> > +     synchronize_srcu_atomic(srcu_ctlp);
> > +}
> > +
> > +static void srcu_atomic_scale_init(void)
> > +{
> > +     srcu_ctlp = &srcua;
> > +     init_srcu_struct_atomic(srcu_ctlp);
> > +}
> > +
> > +static struct rcu_scale_ops srcua_ops = {
> > +     .ptype          = SRCU_FLAVOR,
> > +     .init           = srcu_atomic_scale_init,
> > +     .cleanup        = srcu_sync_scale_cleanup,
> > +     .readlock       = srcu_scale_atomic_read_lock,
> > +     .readunlock     = srcu_scale_atomic_read_unlock,
> > +     .get_gp_seq     = srcu_scale_completed,
> > +     .gp_diff        = rcu_seq_diff,
> > +     .exp_completed  = srcu_scale_completed,
> > +     .sync           = srcu_scale_atomic_synchronize,
> > +     .exp_sync       = srcu_scale_atomic_synchronize,
> > +     .stats          = srcu_scale_stats,
> > +     .name           = "srcua"
> > +};
> > +
> >  #ifdef CONFIG_TASKS_RCU
> >
> >  /*
> > @@ -1110,7 +1148,8 @@ rcu_scale_init(void)
> >       long i;
> >       long j;
> >       static struct rcu_scale_ops *scale_ops[] = {
> > -             &rcu_ops, &srcu_ops, &srcud_ops, TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
> > +             &rcu_ops, &srcu_ops, &srcua_ops, &srcud_ops,
> > +             TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
> >       };
> >
> >       if (!torture_init_begin(scale_type, verbose))
> >
> > base-commit: d21906b0aa1e9573cdb5e7acaca44966b9d1dcd2
>
> --
> Joel Fernandes
>

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

end of thread, other threads:[~2026-10-04  3:14 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-03 16:17 [PATCH v2] rcuscale: add srcua scale type Kunwu Chan
2026-10-03 17:52 ` Bradley Morgan
2026-10-03 23:43   ` Paul E. McKenney
2026-10-03 23:52     ` Bradley Morgan
2026-10-04  0:17 ` Paul E. McKenney
2026-10-04  0:33 ` Joel Fernandes
2026-10-04  3:14   ` KunWu Chan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®