summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2019-09-25 19:47:52 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-09-25 20:51:40 -0400
commitee8711336c51708382627ebcaee5f2122b77dfef (patch)
tree601dbb4e26401d56828beffcb9abbd509c90f268
parentda036ae147624b70f7d3784ff3a53bd4fda20d2a (diff)
bug: refactor away warn_slowpath_fmt_taint()
Patch series "Clean up WARN() "cut here" handling", v2. Christophe Leroy noticed that the fix for missing "cut here" in the WARN() case was adding explicit printk() calls instead of teaching the exception handler to add it. This refactors the bug/warn infrastructure to pass this information as a new BUGFLAG. Longer details repeated from the last patch in the series: bug: move WARN_ON() "cut here" into exception handler The original cleanup of "cut here" missed the WARN_ON() case (that does not have a printk message), which was fixed recently by adding an explicit printk of "cut here". This had the downside of adding a printk() to every WARN_ON() caller, which reduces the utility of using an instruction exception to streamline the resulting code. By making this a new BUGFLAG, all of these can be removed and "cut here" can be handled by the exception handler. This was very pronounced on PowerPC, but the effect can be seen on x86 as well. The resulting text size of a defconfig build shows some small savings from this patch: text data bss dec hex filename 19691167 5134320 1646664 26472151 193eed7 vmlinux.before 19676362 5134260 1663048 26473670 193f4c6 vmlinux.after This change also opens the door for creating something like BUG_MSG(), where a custom printk() before issuing BUG(), without confusing the "cut here" line. This patch (of 7): There's no reason to have specialized helpers for passing the warn taint down to __warn(). Consolidate and refactor helper macros, removing __WARN_printf() and warn_slowpath_fmt_taint(). Link: http://lkml.kernel.org/r/20190819234111.9019-2-keescook@chromium.org Signed-off-by: Kees Cook <keescook@chromium.org> Cc: Christophe Leroy <christophe.leroy@c-s.fr> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Christophe Leroy <christophe.leroy@c-s.fr> Cc: Drew Davenport <ddavenport@chromium.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: "Steven Rostedt (VMware)" <rostedt@goodmis.org> Cc: Feng Tang <feng.tang@intel.com> Cc: Petr Mladek <pmladek@suse.com> Cc: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> Cc: Borislav Petkov <bp@suse.de> Cc: YueHaibing <yuehaibing@huawei.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/asm-generic/bug.h13
-rw-r--r--kernel/panic.c18
2 files changed, 7 insertions, 24 deletions
diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h
index 7357a3c942a0..c3a9c16a2b69 100644
--- a/include/asm-generic/bug.h
+++ b/include/asm-generic/bug.h
@@ -90,24 +90,19 @@ struct bug_entry {
90 * Use the versions with printk format strings to provide better diagnostics. 90 * Use the versions with printk format strings to provide better diagnostics.
91 */ 91 */
92#ifndef __WARN_TAINT 92#ifndef __WARN_TAINT
93extern __printf(3, 4)
94void warn_slowpath_fmt(const char *file, const int line,
95 const char *fmt, ...);
96extern __printf(4, 5) 93extern __printf(4, 5)
97void warn_slowpath_fmt_taint(const char *file, const int line, unsigned taint, 94void warn_slowpath_fmt(const char *file, const int line, unsigned taint,
98 const char *fmt, ...); 95 const char *fmt, ...);
99extern void warn_slowpath_null(const char *file, const int line); 96extern void warn_slowpath_null(const char *file, const int line);
100#define WANT_WARN_ON_SLOWPATH 97#define WANT_WARN_ON_SLOWPATH
101#define __WARN() warn_slowpath_null(__FILE__, __LINE__) 98#define __WARN() warn_slowpath_null(__FILE__, __LINE__)
102#define __WARN_printf(arg...) warn_slowpath_fmt(__FILE__, __LINE__, arg)
103#define __WARN_printf_taint(taint, arg...) \ 99#define __WARN_printf_taint(taint, arg...) \
104 warn_slowpath_fmt_taint(__FILE__, __LINE__, taint, arg) 100 warn_slowpath_fmt(__FILE__, __LINE__, taint, arg)
105#else 101#else
106extern __printf(1, 2) void __warn_printk(const char *fmt, ...); 102extern __printf(1, 2) void __warn_printk(const char *fmt, ...);
107#define __WARN() do { \ 103#define __WARN() do { \
108 printk(KERN_WARNING CUT_HERE); __WARN_TAINT(TAINT_WARN); \ 104 printk(KERN_WARNING CUT_HERE); __WARN_TAINT(TAINT_WARN); \
109} while (0) 105} while (0)
110#define __WARN_printf(arg...) __WARN_printf_taint(TAINT_WARN, arg)
111#define __WARN_printf_taint(taint, arg...) \ 106#define __WARN_printf_taint(taint, arg...) \
112 do { __warn_printk(arg); __WARN_TAINT(taint); } while (0) 107 do { __warn_printk(arg); __WARN_TAINT(taint); } while (0)
113#endif 108#endif
@@ -132,7 +127,7 @@ void __warn(const char *file, int line, void *caller, unsigned taint,
132#define WARN(condition, format...) ({ \ 127#define WARN(condition, format...) ({ \
133 int __ret_warn_on = !!(condition); \ 128 int __ret_warn_on = !!(condition); \
134 if (unlikely(__ret_warn_on)) \ 129 if (unlikely(__ret_warn_on)) \
135 __WARN_printf(format); \ 130 __WARN_printf_taint(TAINT_WARN, format); \
136 unlikely(__ret_warn_on); \ 131 unlikely(__ret_warn_on); \
137}) 132})
138#endif 133#endif
diff --git a/kernel/panic.c b/kernel/panic.c
index d1ece4c363b9..1d89f5423426 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -600,20 +600,8 @@ void __warn(const char *file, int line, void *caller, unsigned taint,
600} 600}
601 601
602#ifdef WANT_WARN_ON_SLOWPATH 602#ifdef WANT_WARN_ON_SLOWPATH
603void warn_slowpath_fmt(const char *file, int line, const char *fmt, ...) 603void warn_slowpath_fmt(const char *file, int line, unsigned taint,
604{ 604 const char *fmt, ...)
605 struct warn_args args;
606
607 args.fmt = fmt;
608 va_start(args.args, fmt);
609 __warn(file, line, __builtin_return_address(0), TAINT_WARN, NULL,
610 &args);
611 va_end(args.args);
612}
613EXPORT_SYMBOL(warn_slowpath_fmt);
614
615void warn_slowpath_fmt_taint(const char *file, int line,
616 unsigned taint, const char *fmt, ...)
617{ 605{
618 struct warn_args args; 606 struct warn_args args;
619 607
@@ -622,7 +610,7 @@ void warn_slowpath_fmt_taint(const char *file, int line,
622 __warn(file, line, __builtin_return_address(0), taint, NULL, &args); 610 __warn(file, line, __builtin_return_address(0), taint, NULL, &args);
623 va_end(args.args); 611 va_end(args.args);
624} 612}
625EXPORT_SYMBOL(warn_slowpath_fmt_taint); 613EXPORT_SYMBOL(warn_slowpath_fmt);
626 614
627void warn_slowpath_null(const char *file, int line) 615void warn_slowpath_null(const char *file, int line)
628{ 616{