trace_printk is only meant as a debugging tool, and should never be
compiled into production code without source code changes, as
indicated by the warning that shows up on boot if any trace_printk
is called:
 **   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **
 **                                                      **
 ** trace_printk() being used. Allocating extra memory.  **
 **                                                      **
 ** This means that this is a DEBUG kernel and it is     **
 ** unsafe for production use.                           **

If this option is set to n, the kernel will generate a build-time
error if trace_printk is used.

Signed-off-by: Nicolas Boichat <drink...@chromium.org>
---
 include/linux/kernel.h | 17 ++++++++++++++++-
 kernel/trace/Kconfig   |  9 +++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 196607aaf653082..b6addc6ba669e85 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -721,10 +721,15 @@ do {                                                      
                \
 #define trace_printk(fmt, ...)                         \
 do {                                                   \
        char _______STR[] = __stringify((__VA_ARGS__)); \
+                                                       \
+       __static_assert(                                \
+               IS_ENABLED(CONFIG_TRACING_ALLOW_PRINTK),\
+               "trace_printk called, please enable 
CONFIG_TRACING_ALLOW_PRINTK."); \
+                                                       \
        if (sizeof(_______STR) > 3)                     \
                do_trace_printk(fmt, ##__VA_ARGS__);    \
        else                                            \
-               trace_puts(fmt);                        \
+               do_trace_puts(fmt);                     \
 } while (0)
 
 #define do_trace_printk(fmt, args...)                                  \
@@ -773,6 +778,13 @@ int __trace_printk(unsigned long ip, const char *fmt, ...);
  */
 
 #define trace_puts(str) ({                                             \
+       __static_assert(                                                \
+               IS_ENABLED(CONFIG_TRACING_ALLOW_PRINTK),                \
+               "trace_puts called, please enable 
CONFIG_TRACING_ALLOW_PRINTK."); \
+       do_trace_puts(str);                                             \
+})
+
+#define do_trace_puts(str) ({                                          \
        static const char *trace_printk_fmt __used                      \
                __attribute__((section("__trace_printk_fmt"))) =        \
                __builtin_constant_p(str) ? str : NULL;                 \
@@ -794,6 +806,9 @@ extern void trace_dump_stack(int skip);
  */
 #define ftrace_vprintk(fmt, vargs)                                     \
 do {                                                                   \
+       __static_assert(                                                \
+               IS_ENABLED(CONFIG_TRACING_ALLOW_PRINTK),                \
+               "ftrace_vprintk called, please enable 
CONFIG_TRACING_ALLOW_PRINTK."); \
        if (__builtin_constant_p(fmt)) {                                \
                static const char *trace_printk_fmt __used              \
                  __attribute__((section("__trace_printk_fmt"))) =      \
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
index a4020c0b4508c99..89ffddebe1864aa 100644
--- a/kernel/trace/Kconfig
+++ b/kernel/trace/Kconfig
@@ -111,6 +111,15 @@ config GENERIC_TRACER
        bool
        select TRACING
 
+config TRACING_ALLOW_PRINTK
+       bool "Allow trace_printk"
+       default y if DEBUG_KERNEL
+       depends on TRACING
+       help
+         trace_printk is only meant as a debugging tool. If this option is
+         set to n, the kernel will generate a build-time error if trace_printk
+         is used.
+
 #
 # Minimum requirements an architecture has to meet for us to
 # be able to offer generic tracing facilities:
-- 
2.27.0.111.gc72c7da667-goog

Reply via email to