rcu: Report callbacks enqueued on offline CPU blind spot
authorFrederic Weisbecker <frederic@kernel.org>
Wed, 2 Oct 2024 14:57:38 +0000 (16:57 +0200)
committerUladzislau Rezki (Sony) <urezki@gmail.com>
Sat, 14 Dec 2024 16:09:45 +0000 (17:09 +0100)
Callbacks enqueued after rcutree_report_cpu_dead() fall into RCU barrier
blind spot. Report any potential misuse.

Reported-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
kernel/rcu/tree.c

index ff98233d4aa59f6ad4488ee96c1ea07ce56e9935..24f1cb292a92d6aad9128e9b4ee5d3d4e71953a7 100644 (file)
@@ -3084,8 +3084,11 @@ __call_rcu_common(struct rcu_head *head, rcu_callback_t func, bool lazy_in)
        head->func = func;
        head->next = NULL;
        kasan_record_aux_stack_noalloc(head);
+
        local_irq_save(flags);
        rdp = this_cpu_ptr(&rcu_data);
+       RCU_LOCKDEP_WARN(!rcu_rdp_cpu_online(rdp), "Callback enqueued on offline CPU!");
+
        lazy = lazy_in && !rcu_async_should_hurry();
 
        /* Add the callback to our list. */