[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <YjNSuprCqjAgGgqB@ip-172-31-19-208.ap-northeast-1.compute.internal>
Date: Thu, 17 Mar 2022 15:24:42 +0000
From: Hyeonggon Yoo <42.hyeyoo@...il.com>
To: "Paul E. McKenney" <paulmck@...nel.org>
Cc: rcu@...r.kernel.org, Josh Triplett <josh@...htriplett.org>,
Steven Rostedt <rostedt@...dmis.org>,
Mathieu Desnoyers <mathieu.desnoyers@...icios.com>,
Joel Fernandes <joel@...lfernandes.org>,
linux-kernel@...r.kernel.org
Subject: Re: RCU: undefined reference to irq_work_queue
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 :-)
Powered by blists - more mailing lists