[RFC PATCH 6/8] rcuscale: Allow rcu_scale_ops::get_gp_seq to be NULL

Boqun Feng posted 8 patches 8 months, 1 week ago
There is a newer version of this series
[RFC PATCH 6/8] rcuscale: Allow rcu_scale_ops::get_gp_seq to be NULL
Posted by Boqun Feng 8 months, 1 week ago
For synchronization mechanisms similar to RCU, there could be no "grace
period" concept (e.g. hazard pointers), therefore allow
rcu_scale_ops::get_gp_seq to be a NULL pointer for these cases, and
simply treat started and finished grace period as 0.

Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
 kernel/rcu/rcuscale.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
index 0f3059b1b80d..d9bff4b1928b 100644
--- a/kernel/rcu/rcuscale.c
+++ b/kernel/rcu/rcuscale.c
@@ -568,8 +568,10 @@ rcu_scale_writer(void *arg)
 		if (gp_exp) {
 			b_rcu_gp_test_started =
 				cur_ops->exp_completed() / 2;
-		} else {
+		} else if (cur_ops->get_gp_seq) {
 			b_rcu_gp_test_started = cur_ops->get_gp_seq();
+		} else {
+			b_rcu_gp_test_started = 0;
 		}
 	}
 
@@ -625,9 +627,11 @@ rcu_scale_writer(void *arg)
 				if (gp_exp) {
 					b_rcu_gp_test_finished =
 						cur_ops->exp_completed() / 2;
-				} else {
+				} else if (cur_ops->get_gp_seq) {
 					b_rcu_gp_test_finished =
 						cur_ops->get_gp_seq();
+				} else {
+					b_rcu_gp_test_finished = 0;
 				}
 				if (shutdown) {
 					smp_mb(); /* Assign before wake. */
-- 
2.47.1
Re: [RFC PATCH 6/8] rcuscale: Allow rcu_scale_ops::get_gp_seq to be NULL
Posted by Paul E. McKenney 5 months, 1 week ago
On Sun, Apr 13, 2025 at 11:00:53PM -0700, Boqun Feng wrote:
> For synchronization mechanisms similar to RCU, there could be no "grace
> period" concept (e.g. hazard pointers), therefore allow
> rcu_scale_ops::get_gp_seq to be a NULL pointer for these cases, and
> simply treat started and finished grace period as 0.
> 
> Signed-off-by: Boqun Feng <boqun.feng@gmail.com>

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

> ---
>  kernel/rcu/rcuscale.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c
> index 0f3059b1b80d..d9bff4b1928b 100644
> --- a/kernel/rcu/rcuscale.c
> +++ b/kernel/rcu/rcuscale.c
> @@ -568,8 +568,10 @@ rcu_scale_writer(void *arg)
>  		if (gp_exp) {
>  			b_rcu_gp_test_started =
>  				cur_ops->exp_completed() / 2;
> -		} else {
> +		} else if (cur_ops->get_gp_seq) {
>  			b_rcu_gp_test_started = cur_ops->get_gp_seq();
> +		} else {
> +			b_rcu_gp_test_started = 0;
>  		}
>  	}
>  
> @@ -625,9 +627,11 @@ rcu_scale_writer(void *arg)
>  				if (gp_exp) {
>  					b_rcu_gp_test_finished =
>  						cur_ops->exp_completed() / 2;
> -				} else {
> +				} else if (cur_ops->get_gp_seq) {
>  					b_rcu_gp_test_finished =
>  						cur_ops->get_gp_seq();
> +				} else {
> +					b_rcu_gp_test_finished = 0;
>  				}
>  				if (shutdown) {
>  					smp_mb(); /* Assign before wake. */
> -- 
> 2.47.1
>