debug: Fix WARN_ON_ONCE() for modules
authorJosh Poimboeuf <jpoimboe@redhat.com>
Sat, 15 Jul 2017 05:10:58 +0000 (00:10 -0500)
committerIngo Molnar <mingo@kernel.org>
Thu, 20 Jul 2017 10:31:04 +0000 (12:31 +0200)
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.

Reported-by: Mike Galbraith <efault@gmx.de>
Tested-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Fixes: 19d436268dde ("debug: Add _ONCE() logic to report_bug()")
Link: http://lkml.kernel.org/r/a53b04235a65478dd9afc51f5b329fdc65c84364.1500095401.git.jpoimboe@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/arm/include/asm/bug.h
arch/arm64/include/asm/bug.h
arch/blackfin/include/asm/bug.h
arch/mn10300/include/asm/bug.h
arch/parisc/include/asm/bug.h
arch/powerpc/include/asm/bug.h
arch/s390/include/asm/bug.h
arch/sh/include/asm/bug.h
arch/x86/include/asm/bug.h

index 4e6e88a6b2f4ba36bcc3a0167b684a24cc58b7e9..2244a94ed9c9d30af84c2ac220c8f3c2abeb7e2b 100644 (file)
@@ -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"                     \
index 366448eb0fb7ad093d1e85eec0e84126cb32aa3d..a02a57186f5689b7a3d99869d6770f7705332957 100644 (file)
@@ -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__)               \
index 8d9b1eba89c48ad57a1437c0e19716082266cc69..76b2e82ee73095e049cb7b305e32ba659cb8b831 100644 (file)
@@ -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"                              \
index aa6a3888639144a758e88e9e157943ebd7282569..811414fb002dec95e2e2fb17251fb67934d31f50 100644 (file)
@@ -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"     \
                :                                               \
index d2742273a685df2d243a14fd19a7b47b5a1b94a7..07ea467f22fcd50f5e6721db491e9165d417666f 100644 (file)
@@ -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"                          \
index 0151af6c2a505a77c512110271e73f0c9c3fcd6e..87fcc19488177e6e15b79e1a7e5487edabe4b408 100644 (file)
@@ -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
    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"                          \
index 1bbd9dbfe4e0a2baac12f5a83ac4538bc8a6ca8f..ce9cc123988b975b3bf6766926b2f4f7b158e1a8 100644 (file)
@@ -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"                \
index 1b77f068be2b1d027ae460ce0e6919a84223a1f1..986c8781d89f3c2feb3951ac2b3fc0ee6ae63510 100644 (file)
  */
 #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"                       \
index 39e702d90cdbdda8df0b42349d9f8d262b08bf4d..aa6b2023d8f8bc104e0b30a086a4c981ed47abb1 100644 (file)
@@ -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"                                  \