Discussion:
[PATCH] arm64: Fix compile error seen in non-SMP builds
Guenter Roeck
2014-10-11 01:15:34 UTC
Permalink
=46ix:

In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
from include/linux/perf_event.h:49,
from include/linux/ftrace_event.h:9,
from include/trace/syscall.h:6,
from include/linux/syscalls.h:81,
from init/main.c:18:
=2E/arch/arm64/include/asm/smp.h:24:3:
error: #error "<asm/smp.h> included in non-SMP build"
# error "<asm/smp.h> included in non-SMP build"
^
=2E/arch/arm64/include/asm/smp.h:27:0: warning: "raw_smp_processor_id" =
redefined
#define raw_smp_processor_id() (current_thread_info()->cpu)
^

and:

In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
from kernel/irq_work.c:11:
=2E/arch/arm64/include/asm/smp_plat.h:56:30:
error: =E2=80=98NR_CPUS=E2=80=99 undeclared here (not in a func=
tion)
extern u64 __cpu_logical_map[NR_CPUS];

by providing a helper function in smp_plat.h, similar to the arm implem=
entation,
and by removing NR_CPUS from smp_plat.h.

=46ixes: 3631073659d0 ("arm64: Tell irq work about self IPI support")
Cc: Frederic Weisbecker <***@gmail.com>
Signed-off-by: Guenter Roeck <***@roeck-us.net>
---
Compile tested and booted in qemu for both SMP and non-SMP builds.

arch/arm64/include/asm/irq_work.h | 4 ++--
arch/arm64/include/asm/smp.h | 2 --
arch/arm64/include/asm/smp_plat.h | 17 ++++++++++++++++-
3 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/arch/arm64/include/asm/irq_work.h b/arch/arm64/include/asm=
/irq_work.h
index 8e24ef3..33199a9 100644
--- a/arch/arm64/include/asm/irq_work.h
+++ b/arch/arm64/include/asm/irq_work.h
@@ -1,11 +1,11 @@
#ifndef __ASM_IRQ_WORK_H
#define __ASM_IRQ_WORK_H
=20
-#include <asm/smp.h>
+#include <asm/smp_plat.h>
=20
static inline bool arch_irq_work_has_interrupt(void)
{
- return !!__smp_cross_call;
+ return have_smp_crosscall();
}
=20
#endif /* __ASM_IRQ_WORK_H */
diff --git a/arch/arm64/include/asm/smp.h b/arch/arm64/include/asm/smp.=
h
index 780f82c..a498f2c 100644
--- a/arch/arm64/include/asm/smp.h
+++ b/arch/arm64/include/asm/smp.h
@@ -48,8 +48,6 @@ extern void smp_init_cpus(void);
*/
extern void set_smp_cross_call(void (*)(const struct cpumask *, unsign=
ed int));
=20
-extern void (*__smp_cross_call)(const struct cpumask *, unsigned int);
-
/*
* Called from the secondary holding pen, this is the secondary CPU en=
try point.
*/
diff --git a/arch/arm64/include/asm/smp_plat.h b/arch/arm64/include/asm=
/smp_plat.h
index 59e2823..9ae4fde 100644
--- a/arch/arm64/include/asm/smp_plat.h
+++ b/arch/arm64/include/asm/smp_plat.h
@@ -21,6 +21,21 @@
=20
#include <asm/types.h>
=20
+/*
+ * Return true if we are running on a SMP platform
+ * and __smp_cross_call is installed.
+ */
+static inline bool have_smp_crosscall(void)
+{
+#ifndef CONFIG_SMP
+ return false;
+#else
+ extern void (*__smp_cross_call)(const struct cpumask *, unsigned int)=
;
+
+ return !!__smp_cross_call;
+#endif
+}
+
struct mpidr_hash {
u64 mask;
u32 shift_aff[4];
@@ -37,7 +52,7 @@ static inline u32 mpidr_hash_size(void)
/*
* Logical CPU mapping.
*/
-extern u64 __cpu_logical_map[NR_CPUS];
+extern u64 __cpu_logical_map[];
#define cpu_logical_map(cpu) __cpu_logical_map[cpu]
=20
#endif /* __ASM_SMP_PLAT_H */
--=20
1.9.1
Frederic Weisbecker
2014-10-11 13:16:21 UTC
Permalink
Post by Guenter Roeck
=20
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
from include/linux/perf_event.h:49,
from include/linux/ftrace_event.h:9,
from include/trace/syscall.h:6,
from include/linux/syscalls.h:81,
error: #error "<asm/smp.h> included in non-SMP build"
# error "<asm/smp.h> included in non-SMP build"
^
./arch/arm64/include/asm/smp.h:27:0: warning: "raw_smp_processor_id" =
redefined
Post by Guenter Roeck
#define raw_smp_processor_id() (current_thread_info()->cpu)
^
=20
=20
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
error: =E2=80=98NR_CPUS=E2=80=99 undeclared here (not in a fu=
nction)
Post by Guenter Roeck
extern u64 __cpu_logical_map[NR_CPUS];
=20
by providing a helper function in smp_plat.h, similar to the arm impl=
ementation,
Post by Guenter Roeck
and by removing NR_CPUS from smp_plat.h.
=20
Fixes: 3631073659d0 ("arm64: Tell irq work about self IPI support")
That looks good to me.

Note, ARM64 is one of the archs I couldn't test due to the lack of a
nolibc cross compiler in https://www.kernel.org/pub/tools/crosstool/

Thanks!
Guenter Roeck
2014-10-11 14:49:46 UTC
Permalink
Post by Frederic Weisbecker
Post by Guenter Roeck
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
from include/linux/perf_event.h:49,
from include/linux/ftrace_event.h:9,
from include/trace/syscall.h:6,
from include/linux/syscalls.h:81,
error: #error "<asm/smp.h> included in non-SMP build"
# error "<asm/smp.h> included in non-SMP build"
^
./arch/arm64/include/asm/smp.h:27:0: warning: "raw_smp_processor_id"=
redefined
Post by Frederic Weisbecker
Post by Guenter Roeck
#define raw_smp_processor_id() (current_thread_info()->cpu)
^
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
error: =E2=80=98NR_CPUS=E2=80=99 undeclared here (not in a =
function)
Post by Frederic Weisbecker
Post by Guenter Roeck
extern u64 __cpu_logical_map[NR_CPUS];
by providing a helper function in smp_plat.h, similar to the arm imp=
lementation,
Post by Frederic Weisbecker
Post by Guenter Roeck
and by removing NR_CPUS from smp_plat.h.
Fixes: 3631073659d0 ("arm64: Tell irq work about self IPI support")
That looks good to me.
Note, ARM64 is one of the archs I couldn't test due to the lack of a
nolibc cross compiler in https://www.kernel.org/pub/tools/crosstool/
No worries. Even if you had, you might not have caught the non-SMP case=
=2E
I only recently added a non-SMP build myself.

Is the toolchain issue out of principle (not wanting to use a cross
compiler that includes glibc) or because you did not find a cross
compiler ? Linaro provides toolchains for aarch64, though they are
only 32 bit. I built one myself using buildroot (select binutils 2.24
and gcc 4.9.1).

In general I have been quite successful using buildroot to create
toolchains, including ones for oddball architectures like score
(after patching buildroot to support it, of course).

Guenter
Alexei Starovoitov
2014-10-11 16:45:21 UTC
Permalink
Post by Frederic Weisbecker
Note, ARM64 is one of the archs I couldn't test due to the lack of a
nolibc cross compiler in https://www.kernel.org/pub/tools/crosstool/
that table is not up to date. There is one there for aarch64:
https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.9.0/
Guenter Roeck
2014-10-19 15:22:10 UTC
Permalink
Post by Guenter Roeck
=20
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
from include/linux/perf_event.h:49,
from include/linux/ftrace_event.h:9,
from include/trace/syscall.h:6,
from include/linux/syscalls.h:81,
error: #error "<asm/smp.h> included in non-SMP build"
# error "<asm/smp.h> included in non-SMP build"
^
./arch/arm64/include/asm/smp.h:27:0: warning: "raw_smp_processor_id" =
redefined
Post by Guenter Roeck
#define raw_smp_processor_id() (current_thread_info()->cpu)
^
=20
=20
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
error: =E2=80=98NR_CPUS=E2=80=99 undeclared here (not in a fu=
nction)
Post by Guenter Roeck
extern u64 __cpu_logical_map[NR_CPUS];
=20
by providing a helper function in smp_plat.h, similar to the arm impl=
ementation,
Post by Guenter Roeck
and by removing NR_CPUS from smp_plat.h.
=20
Fixes: 3631073659d0 ("arm64: Tell irq work about self IPI support")
ping ...

The commit causing the problem has been applied to 3.17, meaning
this patch, once in mainline, will have to be applied to 3.17 as well.

Guenter
Post by Guenter Roeck
---
Compile tested and booted in qemu for both SMP and non-SMP builds.
=20
arch/arm64/include/asm/irq_work.h | 4 ++--
arch/arm64/include/asm/smp.h | 2 --
arch/arm64/include/asm/smp_plat.h | 17 ++++++++++++++++-
3 files changed, 18 insertions(+), 5 deletions(-)
=20
diff --git a/arch/arm64/include/asm/irq_work.h b/arch/arm64/include/a=
sm/irq_work.h
Post by Guenter Roeck
index 8e24ef3..33199a9 100644
--- a/arch/arm64/include/asm/irq_work.h
+++ b/arch/arm64/include/asm/irq_work.h
@@ -1,11 +1,11 @@
#ifndef __ASM_IRQ_WORK_H
#define __ASM_IRQ_WORK_H
=20
-#include <asm/smp.h>
+#include <asm/smp_plat.h>
=20
static inline bool arch_irq_work_has_interrupt(void)
{
- return !!__smp_cross_call;
+ return have_smp_crosscall();
}
=20
#endif /* __ASM_IRQ_WORK_H */
diff --git a/arch/arm64/include/asm/smp.h b/arch/arm64/include/asm/sm=
p.h
Post by Guenter Roeck
index 780f82c..a498f2c 100644
--- a/arch/arm64/include/asm/smp.h
+++ b/arch/arm64/include/asm/smp.h
@@ -48,8 +48,6 @@ extern void smp_init_cpus(void);
*/
extern void set_smp_cross_call(void (*)(const struct cpumask *, unsi=
gned int));
Post by Guenter Roeck
=20
-extern void (*__smp_cross_call)(const struct cpumask *, unsigned int=
);
Post by Guenter Roeck
-
/*
* Called from the secondary holding pen, this is the secondary CPU =
entry point.
Post by Guenter Roeck
*/
diff --git a/arch/arm64/include/asm/smp_plat.h b/arch/arm64/include/a=
sm/smp_plat.h
Post by Guenter Roeck
index 59e2823..9ae4fde 100644
--- a/arch/arm64/include/asm/smp_plat.h
+++ b/arch/arm64/include/asm/smp_plat.h
@@ -21,6 +21,21 @@
=20
#include <asm/types.h>
=20
+/*
+ * Return true if we are running on a SMP platform
+ * and __smp_cross_call is installed.
+ */
+static inline bool have_smp_crosscall(void)
+{
+#ifndef CONFIG_SMP
+ return false;
+#else
+ extern void (*__smp_cross_call)(const struct cpumask *, unsigned in=
t);
Post by Guenter Roeck
+
+ return !!__smp_cross_call;
+#endif
+}
+
struct mpidr_hash {
u64 mask;
u32 shift_aff[4];
@@ -37,7 +52,7 @@ static inline u32 mpidr_hash_size(void)
/*
* Logical CPU mapping.
*/
-extern u64 __cpu_logical_map[NR_CPUS];
+extern u64 __cpu_logical_map[];
#define cpu_logical_map(cpu) __cpu_logical_map[cpu]
=20
#endif /* __ASM_SMP_PLAT_H */
--=20
1.9.1
=20
--
To unsubscribe from this list: send the line "unsubscribe linux-kerne=
l" in
Post by Guenter Roeck
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
=20
=20
Catalin Marinas
2014-10-20 17:22:09 UTC
Permalink
Post by Guenter Roeck
=20
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
from include/linux/perf_event.h:49,
from include/linux/ftrace_event.h:9,
from include/trace/syscall.h:6,
from include/linux/syscalls.h:81,
error: #error "<asm/smp.h> included in non-SMP build"
# error "<asm/smp.h> included in non-SMP build"
^
./arch/arm64/include/asm/smp.h:27:0: warning: "raw_smp_processor_id" =
redefined
Post by Guenter Roeck
#define raw_smp_processor_id() (current_thread_info()->cpu)
^
=20
=20
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
error: =E2=80=98NR_CPUS=E2=80=99 undeclared here (not in a fu=
nction)
Post by Guenter Roeck
extern u64 __cpu_logical_map[NR_CPUS];
=20
by providing a helper function in smp_plat.h, similar to the arm impl=
ementation,
Post by Guenter Roeck
and by removing NR_CPUS from smp_plat.h.
=20
Fixes: 3631073659d0 ("arm64: Tell irq work about self IPI support")
Isn't something like this simpler:

diff --git a/arch/arm64/include/asm/irq_work.h b/arch/arm64/include/asm=
/irq_work.h
index 8e24ef3f7c82..b4f6b19a8a68 100644
--- a/arch/arm64/include/asm/irq_work.h
+++ b/arch/arm64/include/asm/irq_work.h
@@ -1,6 +1,8 @@
#ifndef __ASM_IRQ_WORK_H
#define __ASM_IRQ_WORK_H
=20
+#ifdef CONFIG_SMP
+
#include <asm/smp.h>
=20
static inline bool arch_irq_work_has_interrupt(void)
@@ -8,4 +10,13 @@ static inline bool arch_irq_work_has_interrupt(void)
return !!__smp_cross_call;
}
=20
+#else
+
+static inline bool arch_irq_work_has_interrupt(void)
+{
+ return false;
+}
+
+#endif
+
#endif /* __ASM_IRQ_WORK_H */
Guenter Roeck
2014-10-20 18:13:55 UTC
Permalink
Post by Guenter Roeck
Post by Guenter Roeck
=20
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
from include/linux/perf_event.h:49,
from include/linux/ftrace_event.h:9,
from include/trace/syscall.h:6,
from include/linux/syscalls.h:81,
error: #error "<asm/smp.h> included in non-SMP build"
# error "<asm/smp.h> included in non-SMP build"
^
./arch/arm64/include/asm/smp.h:27:0: warning: "raw_smp_processor_id=
" redefined
Post by Guenter Roeck
Post by Guenter Roeck
#define raw_smp_processor_id() (current_thread_info()->cpu)
^
=20
=20
In file included from ./arch/arm64/include/asm/irq_work.h:4:0,
from include/linux/irq_work.h:46,
error: =E2=80=98NR_CPUS=E2=80=99 undeclared here (not in a =
function)
Post by Guenter Roeck
Post by Guenter Roeck
extern u64 __cpu_logical_map[NR_CPUS];
=20
by providing a helper function in smp_plat.h, similar to the arm im=
plementation,
Post by Guenter Roeck
Post by Guenter Roeck
and by removing NR_CPUS from smp_plat.h.
=20
Fixes: 3631073659d0 ("arm64: Tell irq work about self IPI support")
=20
=20
Yes, that works as well.

=46eel free to add my Tested-by: if you want to take that patch.

Thanks,
Guenter
Post by Guenter Roeck
diff --git a/arch/arm64/include/asm/irq_work.h b/arch/arm64/include/a=
sm/irq_work.h
Post by Guenter Roeck
index 8e24ef3f7c82..b4f6b19a8a68 100644
--- a/arch/arm64/include/asm/irq_work.h
+++ b/arch/arm64/include/asm/irq_work.h
@@ -1,6 +1,8 @@
#ifndef __ASM_IRQ_WORK_H
#define __ASM_IRQ_WORK_H
=20
+#ifdef CONFIG_SMP
+
#include <asm/smp.h>
=20
static inline bool arch_irq_work_has_interrupt(void)
@@ -8,4 +10,13 @@ static inline bool arch_irq_work_has_interrupt(void=
)
Post by Guenter Roeck
return !!__smp_cross_call;
}
=20
+#else
+
+static inline bool arch_irq_work_has_interrupt(void)
+{
+ return false;
+}
+
+#endif
+
#endif /* __ASM_IRQ_WORK_H */
Loading...