static void rcu_lockdep_assert_cblist_protected(struct rcu_data *rdp);
 #ifdef CONFIG_RCU_NOCB_CPU
 static void __init rcu_organize_nocb_kthreads(void);
-#define rcu_nocb_lock_irqsave(rdp, flags)                              \
-do {                                                                   \
-       if (!rcu_segcblist_is_offloaded(&(rdp)->cblist))                \
-               local_irq_save(flags);                                  \
-       else                                                            \
-               raw_spin_lock_irqsave(&(rdp)->nocb_lock, (flags));      \
+
+/*
+ * Disable IRQs before checking offloaded state so that local
+ * locking is safe against concurrent de-offloading.
+ */
+#define rcu_nocb_lock_irqsave(rdp, flags)                      \
+do {                                                           \
+       local_irq_save(flags);                                  \
+       if (rcu_segcblist_is_offloaded(&(rdp)->cblist)) \
+               raw_spin_lock(&(rdp)->nocb_lock);               \
 } while (0)
 #else /* #ifdef CONFIG_RCU_NOCB_CPU */
 #define rcu_nocb_lock_irqsave(rdp, flags) local_irq_save(flags)