On Sat, 15 Jul 2017 00:10:58 -0500
Josh Poimboeuf <[email protected]> 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 <[email protected]>

Thank you,

> 
> Reported-by: Mike Galbraith <[email protected]>
> Fixes: 19d436268dde ("debug: Add _ONCE() logic to report_bug()")
> Signed-off-by: Josh Poimboeuf <[email protected]>
> ---
>  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 <[email protected]>

Reply via email to