Re: RCU: undefined reference to irq_work_queue

From: Paul E. McKenney
Date: Thu Mar 17 2022 - 10:00:14 EST


On Thu, Mar 17, 2022 at 11:32:53AM +0000, Hyeonggon Yoo wrote:
> Hello RCU folks,
>
> I like to use minimal configuration for kernel development.
> when building with tinyconfig + CONFIG_PREEMPT=y on arm64:
>
> ld: kernel/rcu/update.o: in function `call_rcu_tasks':
> update.c:(.text+0xb2c): undefined reference to `irq_work_queue'
> update.c:(.text+0xb2c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `irq_work_queue'
> make: *** [Makefile:1155: vmlinux] Error 1
>
> It seems RCU calls irq_work_queue() without checking if CONFIG_IRQ_WORK is enabled.

Indeed it does!

And kernel/rcu/Kconfig shows why:

config TASKS_TRACE_RCU
def_bool 0
select IRQ_WORK
help
This option enables a task-based RCU implementation that uses
explicit rcu_read_lock_trace() read-side markers, and allows
these readers to appear in the idle loop as well as on the CPU
hotplug code paths. It can force IPIs on online CPUs, including
idle ones, so use with caution.

So the solution is to further minimize your configuration so as to
deselect TASKS_TRACE_RCU. This means making sure that both BPF and
the various RCU torture tests are all deselected.

Or turn on IRQ_WORK, for example, if you need to use BPF.

Thanx, Paul