2021-02-13 14:44:08

by Chris Down

[permalink] [raw]
Subject: [PATCH] ia64: Depend on non-static printk for cmpxchg debug

With !CONFIG_PRINTK, printk() is static in the header, but ia64's
cmpxchg.h with CONFIG_IA64_DEBUG_CMPXCHG doesn't take this into account
before trying to use it as extern, resulting in a compiler error:

./include/linux/printk.h:219:5: error: static declaration of 'printk' follows non-static declaration
219 | int printk(const char *s, ...)
| ^~~~~~
./arch/ia64/include/uapi/asm/cmpxchg.h:142:14: note: previous declaration of 'printk' was here
142 | extern int printk(const char *fmt, ...); \
| ^~~~~~

Make CONFIG_IA64_DEBUG_CMPXCHG dependent on CONFIG_PRINTK to avoid this.

Signed-off-by: Chris Down <[email protected]>
Reported-by: kernel test robot <[email protected]>
Cc: Tony Luck <[email protected]>
Cc: Fenghua Yu <[email protected]>
Cc: [email protected]
---
arch/ia64/Kconfig.debug | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/ia64/Kconfig.debug b/arch/ia64/Kconfig.debug
index 40ca23bd228d..2ce008e2d164 100644
--- a/arch/ia64/Kconfig.debug
+++ b/arch/ia64/Kconfig.debug
@@ -39,7 +39,7 @@ config DISABLE_VHPT

config IA64_DEBUG_CMPXCHG
bool "Turn on compare-and-exchange bug checking (slow!)"
- depends on DEBUG_KERNEL
+ depends on DEBUG_KERNEL && PRINTK
help
Selecting this option turns on bug checking for the IA-64
compare-and-exchange instructions. This is slow! Itaniums
--
2.30.1


2021-02-26 12:51:59

by Chris Down

[permalink] [raw]
Subject: Re: [PATCH] ia64: Depend on non-static printk for cmpxchg debug

+ akpm, linux-mm

Hey folks,

Chris Down writes:
>With !CONFIG_PRINTK, printk() is static in the header, but ia64's
>cmpxchg.h with CONFIG_IA64_DEBUG_CMPXCHG doesn't take this into account
>before trying to use it as extern, resulting in a compiler error:
>
> ./include/linux/printk.h:219:5: error: static declaration of 'printk' follows non-static declaration
> 219 | int printk(const char *s, ...)
> | ^~~~~~
> ./arch/ia64/include/uapi/asm/cmpxchg.h:142:14: note: previous declaration of 'printk' was here
> 142 | extern int printk(const char *fmt, ...); \
> | ^~~~~~
>
>Make CONFIG_IA64_DEBUG_CMPXCHG dependent on CONFIG_PRINTK to avoid this.
>
>Signed-off-by: Chris Down <[email protected]>
>Reported-by: kernel test robot <[email protected]>
>Cc: Tony Luck <[email protected]>
>Cc: Fenghua Yu <[email protected]>
>Cc: [email protected]

I now see that last month ia64 was marked as orphaned, so I'm going to send
this over to Andrew/-mm.

Andrew, any chance you can take this in your tree? It's causing spurious LKP
noise for some recent work on printk and would be great to have in -next.

Thanks,

Chris

>---
> arch/ia64/Kconfig.debug | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
>diff --git a/arch/ia64/Kconfig.debug b/arch/ia64/Kconfig.debug
>index 40ca23bd228d..2ce008e2d164 100644
>--- a/arch/ia64/Kconfig.debug
>+++ b/arch/ia64/Kconfig.debug
>@@ -39,7 +39,7 @@ config DISABLE_VHPT
>
> config IA64_DEBUG_CMPXCHG
> bool "Turn on compare-and-exchange bug checking (slow!)"
>- depends on DEBUG_KERNEL
>+ depends on DEBUG_KERNEL && PRINTK
> help
> Selecting this option turns on bug checking for the IA-64
> compare-and-exchange instructions. This is slow! Itaniums
>--
>2.30.1
>

2021-02-26 13:06:35

by Matthew Wilcox

[permalink] [raw]
Subject: Re: [PATCH] ia64: Depend on non-static printk for cmpxchg debug

On Fri, Feb 26, 2021 at 12:47:58PM +0000, Chris Down wrote:
> > ./include/linux/printk.h:219:5: error: static declaration of 'printk' follows non-static declaration
> > 219 | int printk(const char *s, ...)
> > | ^~~~~~
> > ./arch/ia64/include/uapi/asm/cmpxchg.h:142:14: note: previous declaration of 'printk' was here
> > 142 | extern int printk(const char *fmt, ...); \
> > | ^~~~~~
> >
> > Make CONFIG_IA64_DEBUG_CMPXCHG dependent on CONFIG_PRINTK to avoid this.

Why not just fix it?

diff --git a/arch/ia64/include/uapi/asm/cmpxchg.h b/arch/ia64/include/uapi/asm/cmpxchg.h
index 5d90307fd6e0..d955a8e3ebde 100644
--- a/arch/ia64/include/uapi/asm/cmpxchg.h
+++ b/arch/ia64/include/uapi/asm/cmpxchg.h
@@ -139,7 +139,7 @@ extern long ia64_cmpxchg_called_with_bad_pointer(void);
do { \
if (_cmpxchg_bugcheck_count-- <= 0) { \
void *ip; \
- extern int printk(const char *fmt, ...); \
+ int printk(const char *fmt, ...); \
ip = (void *) ia64_getreg(_IA64_REG_IP); \
printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));\
break; \

2021-02-26 13:16:57

by Chris Down

[permalink] [raw]
Subject: Re: [PATCH] ia64: Depend on non-static printk for cmpxchg debug

Matthew Wilcox writes:
>Why not just fix it?
>
>diff --git a/arch/ia64/include/uapi/asm/cmpxchg.h b/arch/ia64/include/uapi/asm/cmpxchg.h
>index 5d90307fd6e0..d955a8e3ebde 100644
>--- a/arch/ia64/include/uapi/asm/cmpxchg.h
>+++ b/arch/ia64/include/uapi/asm/cmpxchg.h
>@@ -139,7 +139,7 @@ extern long ia64_cmpxchg_called_with_bad_pointer(void);
> do { \
> if (_cmpxchg_bugcheck_count-- <= 0) { \
> void *ip; \
>- extern int printk(const char *fmt, ...); \
>+ int printk(const char *fmt, ...); \
> ip = (void *) ia64_getreg(_IA64_REG_IP); \
> printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));\
> break; \

I must confess I have no idea of the history of why it was `extern int` in the
first place -- my fear was somehow we use cmpxchg.h from a different context.
Do you have any idea? :-)

2021-02-26 13:52:16

by Chris Down

[permalink] [raw]
Subject: Re: [PATCH] ia64: Depend on non-static printk for cmpxchg debug

Chris Down writes:
>I must confess I have no idea of the history of why it was `extern
>int` in the first place -- my fear was somehow we use cmpxchg.h from a
>different context. Do you have any idea? :-)

Ok, found where it's introduced in the pre-git archives: "New file
asm-ia64/intrinsics.h." from David Mosberger <[email protected]>, Dec 9
2002. No indication why it's extern, but it's been there since the dawn of
ia64.

2021-02-26 13:52:41

by Matthew Wilcox

[permalink] [raw]
Subject: Re: [PATCH] ia64: Depend on non-static printk for cmpxchg debug

On Fri, Feb 26, 2021 at 01:47:20PM +0000, Chris Down wrote:
> Chris Down writes:
> > I must confess I have no idea of the history of why it was `extern int`
> > in the first place -- my fear was somehow we use cmpxchg.h from a
> > different context. Do you have any idea? :-)
>
> Ok, found where it's introduced in the pre-git archives: "New file
> asm-ia64/intrinsics.h." from David Mosberger <[email protected]>, Dec
> 9 2002. No indication why it's extern, but it's been there since the dawn of
> ia64.

It's just a quirk of C. 'extern' is only meaningful when applied to
variables. In the context of functions,

extern int printk(char *fmt);
int printk(char *fmt);

are completely equivalent. Unless (as you've seen) there's then a
static definition following the extern declaration.