// whether spinlocks may be acquired safely.
 static bool rcu_init_invoked(void)
 {
-       return !!rcu_state.n_online_cpus;
+       return !!READ_ONCE(rcu_state.n_online_cpus);
 }
 
 /*
        raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
        rcu_spawn_rnp_kthreads(rnp);
        rcu_spawn_cpu_nocb_kthread(cpu);
+       ASSERT_EXCLUSIVE_WRITER(rcu_state.n_online_cpus);
        WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus + 1);
 
        return 0;
  */
 int rcutree_dead_cpu(unsigned int cpu)
 {
+       ASSERT_EXCLUSIVE_WRITER(rcu_state.n_online_cpus);
        WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus - 1);
        // Stop-machine done, so allow nohz_full to disable tick.
        tick_dep_clear(TICK_DEP_BIT_RCU);
 
                totqlen += rcu_get_n_cbs_cpu(cpu);
        pr_err("\t(detected by %d, t=%ld jiffies, g=%ld, q=%lu ncpus=%d)\n",
               smp_processor_id(), (long)(jiffies - gps),
-              (long)rcu_seq_current(&rcu_state.gp_seq), totqlen, rcu_state.n_online_cpus);
+              (long)rcu_seq_current(&rcu_state.gp_seq), totqlen,
+              data_race(rcu_state.n_online_cpus)); // Diagnostic read
        if (ndetected) {
                rcu_dump_cpu_stacks();
 
                totqlen += rcu_get_n_cbs_cpu(cpu);
        pr_err("\t(t=%lu jiffies g=%ld q=%lu ncpus=%d)\n",
                jiffies - gps,
-               (long)rcu_seq_current(&rcu_state.gp_seq), totqlen, rcu_state.n_online_cpus);
+               (long)rcu_seq_current(&rcu_state.gp_seq), totqlen,
+               data_race(rcu_state.n_online_cpus)); // Diagnostic read
 
        rcu_check_gp_kthread_expired_fqs_timer();
        rcu_check_gp_kthread_starvation();