#endif
        }
 
-       if (mask == TRACE_ITER_PRINTK)
+       if (mask == TRACE_ITER_PRINTK) {
                trace_printk_start_stop_comm(enabled);
+               trace_printk_control(enabled);
+       }
 
        return 0;
 }
 
 extern const char *__start___tracepoint_str[];
 extern const char *__stop___tracepoint_str[];
 
+void trace_printk_control(bool enabled);
 void trace_printk_init_buffers(void);
 void trace_printk_start_comm(void);
 int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set);
 
 static inline void format_mod_stop(void) { }
 #endif /* CONFIG_MODULES */
 
+static bool __read_mostly trace_printk_enabled = true;
+
+void trace_printk_control(bool enabled)
+{
+       trace_printk_enabled = enabled;
+}
 
 __initdata_or_module static
 struct notifier_block module_trace_bprintk_format_nb = {
        if (unlikely(!fmt))
                return 0;
 
-       if (!(trace_flags & TRACE_ITER_PRINTK))
+       if (!trace_printk_enabled)
                return 0;
 
        va_start(ap, fmt);
        if (unlikely(!fmt))
                return 0;
 
-       if (!(trace_flags & TRACE_ITER_PRINTK))
+       if (!trace_printk_enabled)
                return 0;
 
        return trace_vbprintk(ip, fmt, ap);
        int ret;
        va_list ap;
 
-       if (!(trace_flags & TRACE_ITER_PRINTK))
+       if (!trace_printk_enabled)
                return 0;
 
        va_start(ap, fmt);
 
 int __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap)
 {
-       if (!(trace_flags & TRACE_ITER_PRINTK))
+       if (!trace_printk_enabled)
                return 0;
 
        return trace_vprintk(ip, fmt, ap);