@@ -418,6 +418,16 @@ static void check_init_srcu_struct(struct srcu_struct *ssp)
418
418
spin_unlock_irqrestore_rcu_node (ssp -> srcu_sup , flags );
419
419
}
420
420
421
+ /*
422
+ * Is the current or any upcoming grace period to be expedited?
423
+ */
424
+ static bool srcu_gp_is_expedited (struct srcu_struct * ssp )
425
+ {
426
+ struct srcu_usage * sup = ssp -> srcu_sup ;
427
+
428
+ return ULONG_CMP_LT (READ_ONCE (sup -> srcu_gp_seq ), READ_ONCE (sup -> srcu_gp_seq_needed_exp ));
429
+ }
430
+
421
431
/*
422
432
* Returns approximate total of the readers' ->srcu_lock_count[] values
423
433
* for the rank of per-CPU counters specified by idx.
@@ -622,7 +632,7 @@ static unsigned long srcu_get_delay(struct srcu_struct *ssp)
622
632
unsigned long jbase = SRCU_INTERVAL ;
623
633
struct srcu_usage * sup = ssp -> srcu_sup ;
624
634
625
- if (ULONG_CMP_LT ( READ_ONCE ( sup -> srcu_gp_seq ), READ_ONCE ( sup -> srcu_gp_seq_needed_exp ) ))
635
+ if (srcu_gp_is_expedited ( ssp ))
626
636
jbase = 0 ;
627
637
if (rcu_seq_state (READ_ONCE (sup -> srcu_gp_seq ))) {
628
638
j = jiffies - 1 ;
@@ -867,7 +877,7 @@ static void srcu_gp_end(struct srcu_struct *ssp)
867
877
spin_lock_irq_rcu_node (sup );
868
878
idx = rcu_seq_state (sup -> srcu_gp_seq );
869
879
WARN_ON_ONCE (idx != SRCU_STATE_SCAN2 );
870
- if (ULONG_CMP_LT ( READ_ONCE ( sup -> srcu_gp_seq ), READ_ONCE ( sup -> srcu_gp_seq_needed_exp ) ))
880
+ if (srcu_gp_is_expedited ( ssp ))
871
881
cbdelay = 0 ;
872
882
873
883
WRITE_ONCE (sup -> srcu_last_gp_end , ktime_get_mono_fast_ns ());
0 commit comments