On Thu, Mar 17, 2022 at 07:00:00AM -0700, Paul E. McKenney wrote: > 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. They are already not selected. > This means making sure that both BPF and > the various RCU torture tests are all deselected. I wanted to say call_rcu_tasks() can be referenced even when IRQ_WORK is not selected, making it fail to build. > > 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 Isn't it better to fix this build failure? It fails to build when both TASKS_TRACE_RCU and IRQ_WORK are not selected and PREEMPT is selected. │ Symbol: TASKS_TRACE_RCU [=n] │ │ Type : bool │ │ Defined at kernel/rcu/Kconfig:96 │ │ Selects: IRQ_WORK [=n] │ │ Selected by [n]: │ │ - BPF_SYSCALL [=n] │ │ - RCU_SCALE_TEST [=n] && DEBUG_KERNEL [=y] │ │ - RCU_TORTURE_TEST [=n] && DEBUG_KERNEL [=y] │ │ - RCU_REF_SCALE_TEST [=n] && DEBUG_KERNEL [=y] Thanks! > > Or turn on IRQ_WORK, for example, if you need to use BPF. > > Thanx, Paul -- Thank you, You are awesome! Hyeonggon :-)