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

Rafael J. Wysocki
2006-07-09T22:36:35Z

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