* Note that this function is special in that it is invoked directly
  * from the incoming CPU rather than from the cpuhp_step mechanism.
  * This is because this function must be invoked at a precise location.
+ * This incoming CPU must not have enabled interrupts yet.
  */
 void rcu_cpu_starting(unsigned int cpu)
 {
-       unsigned long flags;
        unsigned long mask;
        struct rcu_data *rdp;
        struct rcu_node *rnp;
        bool newcpu;
 
+       lockdep_assert_irqs_disabled();
        rdp = per_cpu_ptr(&rcu_data, cpu);
        if (rdp->cpu_started)
                return;
 
        rnp = rdp->mynode;
        mask = rdp->grpmask;
-       local_irq_save(flags);
        arch_spin_lock(&rcu_state.ofl_lock);
        rcu_dynticks_eqs_online();
        raw_spin_lock(&rcu_state.barrier_lock);
        /* An incoming CPU should never be blocking a grace period. */
        if (WARN_ON_ONCE(rnp->qsmask & mask)) { /* RCU waiting on incoming CPU? */
                /* rcu_report_qs_rnp() *really* wants some flags to restore */
-               unsigned long flags2;
+               unsigned long flags;
 
-               local_irq_save(flags2);
+               local_irq_save(flags);
                rcu_disable_urgency_upon_qs(rdp);
                /* Report QS -after- changing ->qsmaskinitnext! */
-               rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags2);
+               rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
        } else {
                raw_spin_unlock_rcu_node(rnp);
        }
        arch_spin_unlock(&rcu_state.ofl_lock);
-       local_irq_restore(flags);
        smp_mb(); /* Ensure RCU read-side usage follows above initialization. */
 }