Re: RCU: undefined reference to irq_work_queue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 :-)



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux