A single argument can be invoked only from a sleepable context. There is already a might_sleep() check to mitigate such cases. The problem is that it requires a kernel to be built with a CONFIG_DEBUG_ATOMIC_SLEEP option. In order to improve an extra runtime_assert_can_sleep() function is introduced by this patch. It is a run-time checking. Please note it only covers PREEMPT kernels. Signed-off-by: Uladzislau Rezki (Sony) <urezki@xxxxxxxxx> --- kernel/rcu/tree.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index d155f2594317..bb798f07e768 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -3232,6 +3232,19 @@ add_ptr_to_bulk_krc_lock(struct kfree_rcu_cpu **krcp, return true; } +static void +runtime_assert_can_sleep(void) +{ + if (!IS_ENABLED(CONFIG_PREEMPT_COUNT)) + return; + + if (preemptible()) + return; + + WARN_ONCE(1, "in_atomic(): %d, irqs_disabled(): %d, pid: %d, name: %s\n", + in_atomic(), irqs_disabled(), current->pid, current->comm); +} + /* * Queue a request for lazy invocation of the appropriate free routine * after a grace period. Please note that three paths are maintained, @@ -3257,8 +3270,10 @@ void kvfree_call_rcu(struct rcu_head *head, void *ptr) * only. For other places please embed an rcu_head to * your data. */ - if (!head) + if (!head) { + runtime_assert_can_sleep(); might_sleep(); + } // Queue the object but don't yet schedule the batch. if (debug_rcu_head_queue(ptr)) { -- 2.30.2