Re: [PATCH] debug: fix WARN_ON_ONCE() for modules

From: Masami Hiramatsu
Date: Sun Jul 16 2017 - 05:51:42 EST


On Sat, 15 Jul 2017 00:10:58 -0500
Josh Poimboeuf <jpoimboe@xxxxxxxxxx> wrote:

> Mike Galbraith reported a situation where a WARN_ON_ONCE() call in DRM
> code turned into an oops. As it turns out, WARN_ON_ONCE() seems to be
> completely broken when called from a module.
>
> The bug was introduced with the following commit:
>
> 19d436268dde ("debug: Add _ONCE() logic to report_bug()")
>
> That commit changed WARN_ON_ONCE() to move its 'once' logic into the bug
> trap handler. It requires a writable bug table so that the BUGFLAG_DONE
> bit can be written to the flags to indicate the first warning has
> occurred.
>
> The bug table was made writable for vmlinux, which relies on
> vmlinux.lds.S and vmlinux.lds.h for laying out the sections. However,
> it wasn't made writable for modules, which rely on the ELF section
> header flags.

I've hit this problem on 4.12.1 and 4.12.2 and ensured this fixed
that issue. Please push it to stable tree too.

Tested-by: Masami Hiramatsu <mhiramat@xxxxxxxxxx>

Thank you,

>
> Reported-by: Mike Galbraith <efault@xxxxxx>
> Fixes: 19d436268dde ("debug: Add _ONCE() logic to report_bug()")
> Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
> ---
> arch/arm/include/asm/bug.h | 2 +-
> arch/arm64/include/asm/bug.h | 2 +-
> arch/blackfin/include/asm/bug.h | 4 ++--
> arch/mn10300/include/asm/bug.h | 2 +-
> arch/parisc/include/asm/bug.h | 6 +++---
> arch/powerpc/include/asm/bug.h | 8 ++++----
> arch/s390/include/asm/bug.h | 4 ++--
> arch/sh/include/asm/bug.h | 4 ++--
> arch/x86/include/asm/bug.h | 4 ++--
> 9 files changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/arch/arm/include/asm/bug.h b/arch/arm/include/asm/bug.h
> index 4e6e88a..2244a94e 100644
> --- a/arch/arm/include/asm/bug.h
> +++ b/arch/arm/include/asm/bug.h
> @@ -37,7 +37,7 @@ do { \
> ".pushsection .rodata.str, \"aMS\", %progbits, 1\n" \
> "2:\t.asciz " #__file "\n" \
> ".popsection\n" \
> - ".pushsection __bug_table,\"a\"\n" \
> + ".pushsection __bug_table,\"aw\"\n" \
> ".align 2\n" \
> "3:\t.word 1b, 2b\n" \
> "\t.hword " #__line ", 0\n" \
> diff --git a/arch/arm64/include/asm/bug.h b/arch/arm64/include/asm/bug.h
> index 366448e..a02a571 100644
> --- a/arch/arm64/include/asm/bug.h
> +++ b/arch/arm64/include/asm/bug.h
> @@ -36,7 +36,7 @@
> #ifdef CONFIG_GENERIC_BUG
>
> #define __BUG_ENTRY(flags) \
> - ".pushsection __bug_table,\"a\"\n\t" \
> + ".pushsection __bug_table,\"aw\"\n\t" \
> ".align 2\n\t" \
> "0: .long 1f - 0b\n\t" \
> _BUGVERBOSE_LOCATION(__FILE__, __LINE__) \
> diff --git a/arch/blackfin/include/asm/bug.h b/arch/blackfin/include/asm/bug.h
> index 8d9b1eb..76b2e82 100644
> --- a/arch/blackfin/include/asm/bug.h
> +++ b/arch/blackfin/include/asm/bug.h
> @@ -21,7 +21,7 @@
> #define _BUG_OR_WARN(flags) \
> asm volatile( \
> "1: .hword %0\n" \
> - " .section __bug_table,\"a\",@progbits\n" \
> + " .section __bug_table,\"aw\",@progbits\n" \
> "2: .long 1b\n" \
> " .long %1\n" \
> " .short %2\n" \
> @@ -38,7 +38,7 @@
> #define _BUG_OR_WARN(flags) \
> asm volatile( \
> "1: .hword %0\n" \
> - " .section __bug_table,\"a\",@progbits\n" \
> + " .section __bug_table,\"aw\",@progbits\n" \
> "2: .long 1b\n" \
> " .short %1\n" \
> " .org 2b + %2\n" \
> diff --git a/arch/mn10300/include/asm/bug.h b/arch/mn10300/include/asm/bug.h
> index aa6a388..811414f 100644
> --- a/arch/mn10300/include/asm/bug.h
> +++ b/arch/mn10300/include/asm/bug.h
> @@ -21,7 +21,7 @@ do { \
> asm volatile( \
> " syscall 15 \n" \
> "0: \n" \
> - " .section __bug_table,\"a\" \n" \
> + " .section __bug_table,\"aw\" \n" \
> " .long 0b,%0,%1 \n" \
> " .previous \n" \
> : \
> diff --git a/arch/parisc/include/asm/bug.h b/arch/parisc/include/asm/bug.h
> index d274227..07ea467 100644
> --- a/arch/parisc/include/asm/bug.h
> +++ b/arch/parisc/include/asm/bug.h
> @@ -27,7 +27,7 @@
> do { \
> asm volatile("\n" \
> "1:\t" PARISC_BUG_BREAK_ASM "\n" \
> - "\t.pushsection __bug_table,\"a\"\n" \
> + "\t.pushsection __bug_table,\"aw\"\n" \
> "2:\t" ASM_WORD_INSN "1b, %c0\n" \
> "\t.short %c1, %c2\n" \
> "\t.org 2b+%c3\n" \
> @@ -50,7 +50,7 @@
> do { \
> asm volatile("\n" \
> "1:\t" PARISC_BUG_BREAK_ASM "\n" \
> - "\t.pushsection __bug_table,\"a\"\n" \
> + "\t.pushsection __bug_table,\"aw\"\n" \
> "2:\t" ASM_WORD_INSN "1b, %c0\n" \
> "\t.short %c1, %c2\n" \
> "\t.org 2b+%c3\n" \
> @@ -64,7 +64,7 @@
> do { \
> asm volatile("\n" \
> "1:\t" PARISC_BUG_BREAK_ASM "\n" \
> - "\t.pushsection __bug_table,\"a\"\n" \
> + "\t.pushsection __bug_table,\"aw\"\n" \
> "2:\t" ASM_WORD_INSN "1b\n" \
> "\t.short %c0\n" \
> "\t.org 2b+%c1\n" \
> diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h
> index 0151af6..87fcc19 100644
> --- a/arch/powerpc/include/asm/bug.h
> +++ b/arch/powerpc/include/asm/bug.h
> @@ -18,7 +18,7 @@
> #include <asm/asm-offsets.h>
> #ifdef CONFIG_DEBUG_BUGVERBOSE
> .macro EMIT_BUG_ENTRY addr,file,line,flags
> - .section __bug_table,"a"
> + .section __bug_table,"aw"
> 5001: PPC_LONG \addr, 5002f
> .short \line, \flags
> .org 5001b+BUG_ENTRY_SIZE
> @@ -29,7 +29,7 @@
> .endm
> #else
> .macro EMIT_BUG_ENTRY addr,file,line,flags
> - .section __bug_table,"a"
> + .section __bug_table,"aw"
> 5001: PPC_LONG \addr
> .short \flags
> .org 5001b+BUG_ENTRY_SIZE
> @@ -42,14 +42,14 @@
> sizeof(struct bug_entry), respectively */
> #ifdef CONFIG_DEBUG_BUGVERBOSE
> #define _EMIT_BUG_ENTRY \
> - ".section __bug_table,\"a\"\n" \
> + ".section __bug_table,\"aw\"\n" \
> "2:\t" PPC_LONG "1b, %0\n" \
> "\t.short %1, %2\n" \
> ".org 2b+%3\n" \
> ".previous\n"
> #else
> #define _EMIT_BUG_ENTRY \
> - ".section __bug_table,\"a\"\n" \
> + ".section __bug_table,\"aw\"\n" \
> "2:\t" PPC_LONG "1b\n" \
> "\t.short %2\n" \
> ".org 2b+%3\n" \
> diff --git a/arch/s390/include/asm/bug.h b/arch/s390/include/asm/bug.h
> index 1bbd9db..ce9cc12 100644
> --- a/arch/s390/include/asm/bug.h
> +++ b/arch/s390/include/asm/bug.h
> @@ -14,7 +14,7 @@
> ".section .rodata.str,\"aMS\",@progbits,1\n" \
> "2: .asciz \""__FILE__"\"\n" \
> ".previous\n" \
> - ".section __bug_table,\"a\"\n" \
> + ".section __bug_table,\"aw\"\n" \
> "3: .long 1b-3b,2b-3b\n" \
> " .short %0,%1\n" \
> " .org 3b+%2\n" \
> @@ -30,7 +30,7 @@
> asm volatile( \
> "0: j 0b+2\n" \
> "1:\n" \
> - ".section __bug_table,\"a\"\n" \
> + ".section __bug_table,\"aw\"\n" \
> "2: .long 1b-2b\n" \
> " .short %0\n" \
> " .org 2b+%1\n" \
> diff --git a/arch/sh/include/asm/bug.h b/arch/sh/include/asm/bug.h
> index 1b77f06..986c878 100644
> --- a/arch/sh/include/asm/bug.h
> +++ b/arch/sh/include/asm/bug.h
> @@ -24,14 +24,14 @@
> */
> #ifdef CONFIG_DEBUG_BUGVERBOSE
> #define _EMIT_BUG_ENTRY \
> - "\t.pushsection __bug_table,\"a\"\n" \
> + "\t.pushsection __bug_table,\"aw\"\n" \
> "2:\t.long 1b, %O1\n" \
> "\t.short %O2, %O3\n" \
> "\t.org 2b+%O4\n" \
> "\t.popsection\n"
> #else
> #define _EMIT_BUG_ENTRY \
> - "\t.pushsection __bug_table,\"a\"\n" \
> + "\t.pushsection __bug_table,\"aw\"\n" \
> "2:\t.long 1b\n" \
> "\t.short %O3\n" \
> "\t.org 2b+%O4\n" \
> diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
> index 39e702d..aa6b202 100644
> --- a/arch/x86/include/asm/bug.h
> +++ b/arch/x86/include/asm/bug.h
> @@ -35,7 +35,7 @@
> #define _BUG_FLAGS(ins, flags) \
> do { \
> asm volatile("1:\t" ins "\n" \
> - ".pushsection __bug_table,\"a\"\n" \
> + ".pushsection __bug_table,\"aw\"\n" \
> "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \
> "\t" __BUG_REL(%c0) "\t# bug_entry::file\n" \
> "\t.word %c1" "\t# bug_entry::line\n" \
> @@ -52,7 +52,7 @@ do { \
> #define _BUG_FLAGS(ins, flags) \
> do { \
> asm volatile("1:\t" ins "\n" \
> - ".pushsection __bug_table,\"a\"\n" \
> + ".pushsection __bug_table,\"aw\"\n" \
> "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \
> "\t.word %c0" "\t# bug_entry::flags\n" \
> "\t.org 2b+%c1\n" \
> --
> 2.7.5
>


--
Masami Hiramatsu <mhiramat@xxxxxxxxxx>