All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86,nmi: Fix section mismatch warnings on 32-bit
@ 2012-06-06 14:05 Don Zickus
  2012-06-06 21:22 ` Witold Baryluk
  2012-06-08 14:57 ` [tip:x86/urgent] x86/nmi: " tip-bot for Don Zickus
  0 siblings, 2 replies; 3+ messages in thread
From: Don Zickus @ 2012-06-06 14:05 UTC (permalink / raw)
  To: x86; +Cc: LKML, baryluk, Don Zickus, Jan Beulich

It was reported that compiling for 32-bit caused a bunch of section
mismatch warnings:

 VDSOSYM arch/x86/vdso/vdso32-syms.lds
  LD      arch/x86/vdso/built-in.o
  LD      arch/x86/built-in.o
WARNING: arch/x86/built-in.o(.data+0x5af0): Section mismatch in reference from the variable
test_nmi_ipi_callback_na.10451 to the function .init.text:test_nmi_ipi_callback()
The variable test_nmi_ipi_callback_na.10451 references
the function __init test_nmi_ipi_callback()
If the reference is valid then annotate the
variable with __init* or __refdata (see linux/init.h) or name the variable:
*_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console

WARNING: arch/x86/built-in.o(.data+0x5b04): Section mismatch in reference from the variable
nmi_unk_cb_na.10399 to the function .init.text:nmi_unk_cb()
The variable nmi_unk_cb_na.10399 references
the function __init nmi_unk_cb()
If the reference is valid then annotate the
variable with __init* or __refdata (see linux/init.h) or name the variable:
*_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console

Both of these are attributed to the internal representation of the nmiaction
struct created during register_nmi_handler.  The reason for this is that those
structs are not defined in the init section whereas the rest of the code in
nmi_selftest.c is.

To resolve this, I created a new #define, register_nmi_handler_initonly, that
tags the struct as __initdata to resolve the mismatch.  This #define should
only be used in rare situations where the register/unregister is called during
init of the kernel.

Big thanks to Jan Beulich for decoding this for me as I didn't have a clue
what was going on.

Reported-by: Witold Baryluk <baryluk@smp.if.uj.edu.pl>
Cc: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Don Zickus <dzickus@redhat.com>
---
 arch/x86/include/asm/nmi.h     |   14 ++++++++++++++
 arch/x86/kernel/nmi_selftest.c |    4 ++--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h
index 0e3793b..dc580c4 100644
--- a/arch/x86/include/asm/nmi.h
+++ b/arch/x86/include/asm/nmi.h
@@ -54,6 +54,20 @@ struct nmiaction {
 	__register_nmi_handler((t), &fn##_na);	\
 })
 
+/*
+ * For special handlers that register/unregister in the
+ * init section only.  This should be considered rare.
+ */
+#define register_nmi_handler_initonly(t, fn, fg, n)		\
+({							\
+	static struct nmiaction fn##_na __initdata = {		\
+		.handler = (fn),			\
+		.name = (n),				\
+		.flags = (fg),				\
+	};						\
+	__register_nmi_handler((t), &fn##_na);	\
+})
+
 int __register_nmi_handler(unsigned int, struct nmiaction *);
 
 void unregister_nmi_handler(unsigned int, const char *);
diff --git a/arch/x86/kernel/nmi_selftest.c b/arch/x86/kernel/nmi_selftest.c
index e31bf8d..149b8d9 100644
--- a/arch/x86/kernel/nmi_selftest.c
+++ b/arch/x86/kernel/nmi_selftest.c
@@ -42,7 +42,7 @@ static int __init nmi_unk_cb(unsigned int val, struct pt_regs *regs)
 static void __init init_nmi_testsuite(void)
 {
 	/* trap all the unknown NMIs we may generate */
-	register_nmi_handler(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk");
+	register_nmi_handler_initonly(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk");
 }
 
 static void __init cleanup_nmi_testsuite(void)
@@ -64,7 +64,7 @@ static void __init test_nmi_ipi(struct cpumask *mask)
 {
 	unsigned long timeout;
 
-	if (register_nmi_handler(NMI_LOCAL, test_nmi_ipi_callback,
+	if (register_nmi_handler_initonly(NMI_LOCAL, test_nmi_ipi_callback,
 				 NMI_FLAG_FIRST, "nmi_selftest")) {
 		nmi_fail = FAILURE;
 		return;
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] x86,nmi: Fix section mismatch warnings on 32-bit
  2012-06-06 14:05 [PATCH] x86,nmi: Fix section mismatch warnings on 32-bit Don Zickus
@ 2012-06-06 21:22 ` Witold Baryluk
  2012-06-08 14:57 ` [tip:x86/urgent] x86/nmi: " tip-bot for Don Zickus
  1 sibling, 0 replies; 3+ messages in thread
From: Witold Baryluk @ 2012-06-06 21:22 UTC (permalink / raw)
  To: Don Zickus; +Cc: x86, LKML, Jan Beulich

On 06-06 10:05, Don Zickus wrote:
> It was reported that compiling for 32-bit caused a bunch of section
> mismatch warnings:
> 
>  VDSOSYM arch/x86/vdso/vdso32-syms.lds
>   LD      arch/x86/vdso/built-in.o
>   LD      arch/x86/built-in.o
> WARNING: arch/x86/built-in.o(.data+0x5af0): Section mismatch in reference from the variable
> test_nmi_ipi_callback_na.10451 to the function .init.text:test_nmi_ipi_callback()
> The variable test_nmi_ipi_callback_na.10451 references
> the function __init test_nmi_ipi_callback()
> If the reference is valid then annotate the
> variable with __init* or __refdata (see linux/init.h) or name the variable:
> *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console
> 
> WARNING: arch/x86/built-in.o(.data+0x5b04): Section mismatch in reference from the variable
> nmi_unk_cb_na.10399 to the function .init.text:nmi_unk_cb()
> The variable nmi_unk_cb_na.10399 references
> the function __init nmi_unk_cb()
> If the reference is valid then annotate the
> variable with __init* or __refdata (see linux/init.h) or name the variable:
> *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console
> 
> Both of these are attributed to the internal representation of the nmiaction
> struct created during register_nmi_handler.  The reason for this is that those
> structs are not defined in the init section whereas the rest of the code in
> nmi_selftest.c is.
> 
> To resolve this, I created a new #define, register_nmi_handler_initonly, that
> tags the struct as __initdata to resolve the mismatch.  This #define should
> only be used in rare situations where the register/unregister is called during
> init of the kernel.
> 
> Big thanks to Jan Beulich for decoding this for me as I didn't have a clue
> what was going on.
> 
> Reported-by: Witold Baryluk <baryluk@smp.if.uj.edu.pl>
> Cc: Jan Beulich <JBeulich@suse.com>
> Signed-off-by: Don Zickus <dzickus@redhat.com>
> ---
>  arch/x86/include/asm/nmi.h     |   14 ++++++++++++++
>  arch/x86/kernel/nmi_selftest.c |    4 ++--
>  2 files changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h
> index 0e3793b..dc580c4 100644
> --- a/arch/x86/include/asm/nmi.h
> +++ b/arch/x86/include/asm/nmi.h
> @@ -54,6 +54,20 @@ struct nmiaction {
>  	__register_nmi_handler((t), &fn##_na);	\
>  })
>  
> +/*
> + * For special handlers that register/unregister in the
> + * init section only.  This should be considered rare.
> + */
> +#define register_nmi_handler_initonly(t, fn, fg, n)		\
> +({							\
> +	static struct nmiaction fn##_na __initdata = {		\
> +		.handler = (fn),			\
> +		.name = (n),				\
> +		.flags = (fg),				\
> +	};						\
> +	__register_nmi_handler((t), &fn##_na);	\
> +})
> +
>  int __register_nmi_handler(unsigned int, struct nmiaction *);
>  
>  void unregister_nmi_handler(unsigned int, const char *);
> diff --git a/arch/x86/kernel/nmi_selftest.c b/arch/x86/kernel/nmi_selftest.c
> index e31bf8d..149b8d9 100644
> --- a/arch/x86/kernel/nmi_selftest.c
> +++ b/arch/x86/kernel/nmi_selftest.c
> @@ -42,7 +42,7 @@ static int __init nmi_unk_cb(unsigned int val, struct pt_regs *regs)
>  static void __init init_nmi_testsuite(void)
>  {
>  	/* trap all the unknown NMIs we may generate */
> -	register_nmi_handler(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk");
> +	register_nmi_handler_initonly(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk");
>  }
>  
>  static void __init cleanup_nmi_testsuite(void)
> @@ -64,7 +64,7 @@ static void __init test_nmi_ipi(struct cpumask *mask)
>  {
>  	unsigned long timeout;
>  
> -	if (register_nmi_handler(NMI_LOCAL, test_nmi_ipi_callback,
> +	if (register_nmi_handler_initonly(NMI_LOCAL, test_nmi_ipi_callback,
>  				 NMI_FLAG_FIRST, "nmi_selftest")) {
>  		nmi_fail = FAILURE;
>  		return;
> -- 
> 1.7.7.6
> 

Works for me.

Tested-by: Witold Baryluk <baryluk@smp.if.uj.edu.pl>


-- 
Witold Baryluk

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [tip:x86/urgent] x86/nmi: Fix section mismatch warnings on 32-bit
  2012-06-06 14:05 [PATCH] x86,nmi: Fix section mismatch warnings on 32-bit Don Zickus
  2012-06-06 21:22 ` Witold Baryluk
@ 2012-06-08 14:57 ` tip-bot for Don Zickus
  1 sibling, 0 replies; 3+ messages in thread
From: tip-bot for Don Zickus @ 2012-06-08 14:57 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, JBeulich, baryluk, tglx, dzickus

Commit-ID:  eeaaa96a3a2134a174100afd129bb0891d05f4b2
Gitweb:     http://git.kernel.org/tip/eeaaa96a3a2134a174100afd129bb0891d05f4b2
Author:     Don Zickus <dzickus@redhat.com>
AuthorDate: Wed, 6 Jun 2012 10:05:42 -0400
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Fri, 8 Jun 2012 12:19:27 +0200

x86/nmi: Fix section mismatch warnings on 32-bit

It was reported that compiling for 32-bit caused a bunch of
section mismatch warnings:

 VDSOSYM arch/x86/vdso/vdso32-syms.lds
  LD      arch/x86/vdso/built-in.o
  LD      arch/x86/built-in.o

 WARNING: arch/x86/built-in.o(.data+0x5af0): Section mismatch in
 reference from the variable test_nmi_ipi_callback_na.10451 to
 the function .init.text:test_nmi_ipi_callback() [...]

 WARNING: arch/x86/built-in.o(.data+0x5b04): Section mismatch in
 reference from the variable nmi_unk_cb_na.10399 to the function
 .init.text:nmi_unk_cb() The variable nmi_unk_cb_na.10399
 references the function __init nmi_unk_cb() [...]

Both of these are attributed to the internal representation of
the nmiaction struct created during register_nmi_handler.  The
reason for this is that those structs are not defined in the
init section whereas the rest of the code in nmi_selftest.c is.

To resolve this, I created a new #define,
register_nmi_handler_initonly, that tags the struct as
__initdata to resolve the mismatch.  This #define should only be
used in rare situations where the register/unregister is called
during init of the kernel.

Big thanks to Jan Beulich for decoding this for me as I didn't
have a clue what was going on.

Reported-by: Witold Baryluk <baryluk@smp.if.uj.edu.pl>
Tested-by: Witold Baryluk <baryluk@smp.if.uj.edu.pl>
Cc: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Don Zickus <dzickus@redhat.com>
Link: http://lkml.kernel.org/r/1338991542-23000-1-git-send-email-dzickus@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/include/asm/nmi.h     |   14 ++++++++++++++
 arch/x86/kernel/nmi_selftest.c |    4 ++--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h
index 0e3793b..dc580c4 100644
--- a/arch/x86/include/asm/nmi.h
+++ b/arch/x86/include/asm/nmi.h
@@ -54,6 +54,20 @@ struct nmiaction {
 	__register_nmi_handler((t), &fn##_na);	\
 })
 
+/*
+ * For special handlers that register/unregister in the
+ * init section only.  This should be considered rare.
+ */
+#define register_nmi_handler_initonly(t, fn, fg, n)		\
+({							\
+	static struct nmiaction fn##_na __initdata = {		\
+		.handler = (fn),			\
+		.name = (n),				\
+		.flags = (fg),				\
+	};						\
+	__register_nmi_handler((t), &fn##_na);	\
+})
+
 int __register_nmi_handler(unsigned int, struct nmiaction *);
 
 void unregister_nmi_handler(unsigned int, const char *);
diff --git a/arch/x86/kernel/nmi_selftest.c b/arch/x86/kernel/nmi_selftest.c
index e31bf8d..149b8d9 100644
--- a/arch/x86/kernel/nmi_selftest.c
+++ b/arch/x86/kernel/nmi_selftest.c
@@ -42,7 +42,7 @@ static int __init nmi_unk_cb(unsigned int val, struct pt_regs *regs)
 static void __init init_nmi_testsuite(void)
 {
 	/* trap all the unknown NMIs we may generate */
-	register_nmi_handler(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk");
+	register_nmi_handler_initonly(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk");
 }
 
 static void __init cleanup_nmi_testsuite(void)
@@ -64,7 +64,7 @@ static void __init test_nmi_ipi(struct cpumask *mask)
 {
 	unsigned long timeout;
 
-	if (register_nmi_handler(NMI_LOCAL, test_nmi_ipi_callback,
+	if (register_nmi_handler_initonly(NMI_LOCAL, test_nmi_ipi_callback,
 				 NMI_FLAG_FIRST, "nmi_selftest")) {
 		nmi_fail = FAILURE;
 		return;

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2012-06-08 14:57 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-06 14:05 [PATCH] x86,nmi: Fix section mismatch warnings on 32-bit Don Zickus
2012-06-06 21:22 ` Witold Baryluk
2012-06-08 14:57 ` [tip:x86/urgent] x86/nmi: " tip-bot for Don Zickus

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.