#endif /* #ifndef CONFIG_TINY_RCU */
 
 // Initialize per-CPU callback lists for the specified flavor of
-// Tasks RCU.
+// Tasks RCU.  Do not enqueue callbacks before this function is invoked.
 static void cblist_init_generic(struct rcu_tasks *rtp)
 {
        int cpu;
        int lim;
        int shift;
 
-       raw_spin_lock_irqsave(&rtp->cbs_gbl_lock, flags);
        if (rcu_task_enqueue_lim < 0) {
                rcu_task_enqueue_lim = 1;
                rcu_task_cb_adjust = true;
                WARN_ON_ONCE(!rtpcp);
                if (cpu)
                        raw_spin_lock_init(&ACCESS_PRIVATE(rtpcp, lock));
-               raw_spin_lock_rcu_node(rtpcp); // irqs already disabled.
+               local_irq_save(flags);  // serialize initialization
                if (rcu_segcblist_empty(&rtpcp->cblist))
                        rcu_segcblist_init(&rtpcp->cblist);
+               local_irq_restore(flags);
                INIT_WORK(&rtpcp->rtp_work, rcu_tasks_invoke_cbs_wq);
                rtpcp->cpu = cpu;
                rtpcp->rtpp = rtp;
                if (!rtpcp->rtp_blkd_tasks.next)
                        INIT_LIST_HEAD(&rtpcp->rtp_blkd_tasks);
-               raw_spin_unlock_rcu_node(rtpcp); // irqs remain disabled.
        }
-       raw_spin_unlock_irqrestore(&rtp->cbs_gbl_lock, flags);
 
        pr_info("%s: Setting shift to %d and lim to %d rcu_task_cb_adjust=%d.\n", rtp->name,
                        data_race(rtp->percpu_enqueue_shift), data_race(rtp->percpu_enqueue_lim), rcu_task_cb_adjust);
                    READ_ONCE(rtp->percpu_enqueue_lim) != nr_cpu_ids)
                        needadjust = true;  // Defer adjustment to avoid deadlock.
        }
-       if (!rcu_segcblist_is_enabled(&rtpcp->cblist)) {
-               raw_spin_unlock_rcu_node(rtpcp); // irqs remain disabled.
-               cblist_init_generic(rtp);
-               raw_spin_lock_rcu_node(rtpcp); // irqs already disabled.
-       }
+       // Queuing callbacks before initialization not yet supported.
+       if (WARN_ON_ONCE(!rcu_segcblist_is_enabled(&rtpcp->cblist)))
+               rcu_segcblist_init(&rtpcp->cblist);
        needwake = (func == wakeme_after_rcu) ||
                   (rcu_segcblist_n_cbs(&rtpcp->cblist) == rcu_task_lazy_lim);
        if (havekthread && !needwake && !timer_pending(&rtpcp->lazy_timer)) {