* 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