Re: 2.6.18-rc1-mm1 fails on amd64 (smp_call_function_single)

Andrew Morton
2006-07-09T22:45:03Z

On Mon, 10 Jul 2006 00:37:14 +0200
"Rafael J. Wysocki" <rjw@sisk.pl> wrote:

> On Sunday 09 July 2006 23:03, Andrew Morton wrote:
> > On Sun, 9 Jul 2006 22:39:48 +0200
> > "Rafael J. Wysocki" <rjw@sisk.pl> wrote:
> >
> > > On Sunday 09 July 2006 13:49, Gregoire Favre wrote:
> > > > Hello,
> > > >
> > > > can't compil it :
> > > >
> > > > CHK include/linux/compile.h
> > > > UPD include/linux/compile.h
> > > > CC init/version.o
> > > > LD init/built-in.o
> > > > LD .tmp_vmlinux1
> > > > arch/x86_64/kernel/built-in.o: In function `vsyscall_set_cpu':
> > > > (.init.text+0x1e87): undefined reference to `smp_call_function_single'
> > > > make: *** [.tmp_vmlinux1] Error 1
> > >
> > > This is because of x86_64-mm-getcpu-vsyscall.patch which breaks
> > > compilation without SMP and is not obviously fixable.
> >
> > Is it not as simple as adding a !SMP implementation of
> > smp_call_function_single(), which just calls the thing?
>
> Like this:
>
> arch/x86_64/kernel/vsyscall.c | 6 ++++++
> 1 files changed, 6 insertions(+)
>
> Index: linux-2.6.18-rc1-mm1/arch/x86_64/kernel/vsyscall.c
> ===================================================================
> --- linux-2.6.18-rc1-mm1.orig/arch/x86_64/kernel/vsyscall.c
> +++ linux-2.6.18-rc1-mm1/arch/x86_64/kernel/vsyscall.c
> @@ -241,10 +241,12 @@ static ctl_table kernel_root_table2[] =
>
> #endif
>
> +#ifdef CONFIG_SMP
> static void __cpuinit write_rdtscp_cb(void *info)
> {
> write_rdtscp_aux((unsigned long)info);
> }
> +#endif
>
> void __cpuinit vsyscall_set_cpu(int cpu)
> {
> @@ -254,10 +256,14 @@ void __cpuinit vsyscall_set_cpu(int cpu)
> node = cpu_to_node[cpu];
> #endif
> if (cpu_has(&cpu_data[cpu], X86_FEATURE_RDTSCP)) {
> +#ifdef CONFIG_SMP
> /* the notifier is unfortunately not executed on the
> target CPU */
> void *info = (void *)((node << 12) | cpu);
> smp_call_function_single(cpu, write_rdtscp_cb, info, 0, 1);
> +#else
> + write_rdtscp_aux(0);
> +#endif
> }
>
> /* Store cpu number in limit so that it can be loaded quickly

I meant, in smp.h:

#else /* CONFIG_SMP */
#define smp_call_function_single(cpu, fn, arg, x, y) fn(arg)
#endif /* CONFIG_SMP */