#define BUGFLAG_WARNING                (1 << 0)
 #define BUGFLAG_ONCE           (1 << 1)
 #define BUGFLAG_DONE           (1 << 2)
+#define BUGFLAG_NO_CUT_HERE    (1 << 3)        /* CUT_HERE already sent */
 #define BUGFLAG_TAINT(taint)   ((taint) << 8)
 #define BUG_GET_TAINT(bug)     ((bug)->flags >> 8)
 #endif
        warn_slowpath_fmt(__FILE__, __LINE__, taint, arg)
 #else
 extern __printf(1, 2) void __warn_printk(const char *fmt, ...);
-#define __WARN() do {                                                  \
-               printk(KERN_WARNING CUT_HERE);                          \
-               __WARN_FLAGS(BUGFLAG_TAINT(TAINT_WARN));                \
-       } while (0)
+#define __WARN()               __WARN_FLAGS(BUGFLAG_TAINT(TAINT_WARN))
 #define __WARN_printf(taint, arg...) do {                              \
                __warn_printk(arg);                                     \
-               __WARN_FLAGS(BUGFLAG_TAINT(taint));                     \
+               __WARN_FLAGS(BUGFLAG_NO_CUT_HERE | BUGFLAG_TAINT(taint));\
        } while (0)
 #define WARN_ON_ONCE(condition) ({                             \
        int __ret_warn_on = !!(condition);                      \
 
                }
        }
 
+       /*
+        * BUG() and WARN_ON() families don't print a custom debug message
+        * before triggering the exception handler, so we must add the
+        * "cut here" line now. WARN() issues its own "cut here" before the
+        * extra debugging message it writes before triggering the handler.
+        */
+       if ((bug->flags & BUGFLAG_NO_CUT_HERE) == 0)
+               printk(KERN_DEFAULT CUT_HERE);
+
        if (warning) {
                /* this is a WARN_ON rather than BUG/BUG_ON */
                __warn(file, line, (void *)bugaddr, BUG_GET_TAINT(bug), regs,
                return BUG_TRAP_TYPE_WARN;
        }
 
-       printk(KERN_DEFAULT CUT_HERE);
-
        if (file)
                pr_crit("kernel BUG at %s:%u!\n", file, line);
        else