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