mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@kernel.org>
To: Zhouyi Zhou <zhouzhouyi@gmail.com>
Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com>, rcu <rcu@vger.kernel.org>,
	Josh Triplett <josh@joshtriplett.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	Joel Fernandes <joel@joelfernandes.org>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: RCU: undefined reference to irq_work_queue
Date: Thu, 17 Mar 2022 13:53:39 -0700	[thread overview]
Message-ID: <20220317205339.GT4285@paulmck-ThinkPad-P17-Gen-1> (raw)
In-Reply-To: <CAABZP2zu3Qiqtnw=DRnFUig8xO3WtvKuVkf=gqQ6kRihOmDTLQ@mail.gmail.com>

On Fri, Mar 18, 2022 at 04:41:59AM +0800, Zhouyi Zhou wrote:
> hi
> 
> On Fri, Mar 18, 2022 at 4:20 AM Paul E. McKenney <paulmck@kernel.org> wrote:
> >
> > On Thu, Mar 17, 2022 at 04:45:11PM +0000, Hyeonggon Yoo wrote:
> > > On Thu, Mar 17, 2022 at 09:20:33AM -0700, Paul E. McKenney wrote:
> > > > On Thu, Mar 17, 2022 at 03:24:42PM +0000, Hyeonggon Yoo wrote:
> > > > > 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.
> > > >
> > > > Good, thank you.
> > > >
> > > > How about TASKS_RUDE_RCU, TASKS_TRACE_RCU, and TASKS_RCU_GENERIC?
> > >
> > > TASKS_RUDE_RCU=n
> > > TASKS_TRACE_RCU=n
> > > TASKS_RCU_GENERIC=y
> > > TASKS_RCU=y
> > >
> > > > > > 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.
> > > >
> > > > I am guessing because TASKS_RCU_GENERIC is selected?
> > > >
> > >
> > > Right.
> > >
> > > > If so, does the patch at the end of this email help?
> > > >
> > >
> > > No. did not help.
> > >
> > > I think I found reason...
> > > with PREEMPTION=y,
> > >
> > > in kernel/rcu/Kconfig:
> > > config TASKS_RCU
> > >         def_bool PREEMPTION
> > >         help
> > >           This option enables a task-based RCU implementation that uses
> > >           only voluntary context switch (not preemption!), idle, and
> > >           user-mode execution as quiescent states.  Not for manual selection.
> > >
> > > in kernel/rcu/Kconfig:
> > > config TASKS_RCU_GENERIC
> > >         def_bool TASKS_RCU || TASKS_RUDE_RCU || TASKS_TRACE_RCU
> > >         select SRCU
> > >         help
> > >           This option enables generic infrastructure code supporting
> > >           task-based RCU implementations.  Not for manual selection.
> >
> > Ah, this is because some of the tracing code uses TASKS_RCU only
> > when PREEMPTION=y.  That would be KPROBES and TRACING.  Maybe also
> > TRACE_CLOCK and TRACEPOINTS, but I would hope that TRACING would
> > cover those.  Adding the tracing guys for their thoughts.
> >
> > > > > > > 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?
> > > >
> > > > But of course!  However, first I need to know exactly what is causing your
> > > > build failure.  I cannot see your .config file, so I am having to guess.
> > > >
> > > > Don't get me wrong, I do have a lot of practice guessing, but it is still
> > > > just guessing.  ;-)
> > >
> > > Sorry to make you guess. Maybe too late, but added config as attachment ;)
> >
> > Perhaps I needed the practice.  ;-)
> >
> > > > > 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.
> > > >
> > > > Or do you already have TASKS_RCU_GENERIC deselected?
> > > >
> > >
> > > No, this is selected. TASKS_RCU_GENERIC=y. because of PREEMPTION=y.
> >
> > OK, the patch shown below allows me to get TASKS_RCU_GENERIC=n even
> > with PREEMPTION=y.  This might somehow subtly break tracing, but in
> > that case further adjustments can be made.  Untested other than
> > generating a few .config combinations.
> >
> > Thoughts?
> >
> >                                                         Thanx, Paul
> >
> > ------------------------------------------------------------------------
> >
> > diff --git a/arch/Kconfig b/arch/Kconfig
> > index 678a80713b21..66c5b5543511 100644
> > --- a/arch/Kconfig
> > +++ b/arch/Kconfig
> > @@ -38,6 +38,7 @@ config KPROBES
> >         depends on MODULES
> >         depends on HAVE_KPROBES
> >         select KALLSYMS
> > +       select TASKS_RCU if PREEMPTION
> >         help
> >           Kprobes allows you to trap at almost any kernel address and
> >           execute a callback function.  register_kprobe() establishes
> > diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig
> > index f559870fbf8b..4f665ae0cf55 100644
> > --- a/kernel/rcu/Kconfig
> > +++ b/kernel/rcu/Kconfig
> > @@ -78,7 +78,8 @@ config TASKS_RCU_GENERIC
> >           task-based RCU implementations.  Not for manual selection.
> >
> >  config TASKS_RCU
> > -       def_bool PREEMPTION
> > +       def_bool 0
> > +       select IRQ_WORK
> >         help
> >           This option enables a task-based RCU implementation that uses
> >           only voluntary context switch (not preemption!), idle, and
> > diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
> > index 752ed89a293b..a7aaf150b704 100644
> > --- a/kernel/trace/Kconfig
> > +++ b/kernel/trace/Kconfig
> > @@ -127,6 +127,7 @@ config TRACING
> >         select BINARY_PRINTF
> >         select EVENT_TRACING
> >         select TRACE_CLOCK
> > +       select TASKS_RCU if PREEMPTION
> >
> >  config GENERIC_TRACER
> >         bool
> I apply above patch, and invoke
> $make  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
> CC=aarch64-linux-gnu-gcc-10 tinyconfig
> $make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
> CC=aarch64-linux-gnu-gcc-10 -j 16
> kernel build successful this time (without above patch, kernel build
> will quit with undefined reference to `irq_work_queue'
> Tested-by: Zhouyi Zhou<zhouzhouyi@gmail.com>

I will apply on my next rebase, thank you!

							Thanx, Paul

  reply	other threads:[~2022-03-17 20:53 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-17 11:32 Hyeonggon Yoo
2022-03-17 14:00 ` Paul E. McKenney
2022-03-17 15:24   ` Hyeonggon Yoo
2022-03-17 16:20     ` Paul E. McKenney
2022-03-17 16:45       ` Hyeonggon Yoo
2022-03-17 17:36         ` Paul E. McKenney
2022-03-17 20:26           ` Randy Dunlap
2022-03-17 20:29             ` Paul E. McKenney
2022-03-17 20:31               ` Randy Dunlap
2022-03-17 20:41           ` Zhouyi Zhou
2022-03-17 20:53             ` Paul E. McKenney [this message]
2022-03-18 14:42               ` Hyeonggon Yoo
2022-03-17 15:22 ` Zhouyi Zhou
2022-03-17 15:54   ` Hyeonggon Yoo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220317205339.GT4285@paulmck-ThinkPad-P17-Gen-1 \
    --to=paulmck@kernel.org \
    --cc=42.hyeyoo@gmail.com \
    --cc=joel@joelfernandes.org \
    --cc=josh@joshtriplett.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=rcu@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=zhouzhouyi@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®