Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753376AbbLCWp6 (ORCPT ); Thu, 3 Dec 2015 17:45:58 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40315 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753247AbbLCWp5 (ORCPT ); Thu, 3 Dec 2015 17:45:57 -0500 From: Aaron Conole To: Andrew Morton Cc: linux-kernel@vger.kernel.org, Joe Perches Subject: [PATCH] printk: fix pr_debug and pr_devel to elide function calls Date: Thu, 3 Dec 2015 17:45:54 -0500 Message-Id: <1449182754-19088-1-git-send-email-aconole@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3779 Lines: 119 Currently, pr_debug and pr_devel will not elide function call arguments appearing in calls to no_printk for these macros. This is because all side effects must be honored before proceeding to the 0-value assignment in no_printk. The behavior is contrary to documentation found in the CodingStyle and header file where these functions are declared. This patch corrects that behavior by shunting out the call to no_printk completely. The format string is still checked by gcc for correctness, but no code seems to be emitted in common cases. fixes commit 5264f2f75d86 ("include/linux/printk.h: use and neaten no_printk") Signed-off-by: Aaron Conole Reported-by: Dmitry Vyukov Cc: Joe Perches --- include/linux/printk.h | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/include/linux/printk.h b/include/linux/printk.h index 9729565..87dfdd2 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -270,8 +270,12 @@ extern asmlinkage void dump_stack(void) __cold; #define pr_devel(fmt, ...) \ printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) #else -#define pr_devel(fmt, ...) \ - no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +#define pr_devel(fmt, ...) \ +do { \ + if (0) { \ + no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__);\ + } \ +} while (0) #endif #include @@ -286,7 +290,11 @@ extern asmlinkage void dump_stack(void) __cold; printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) #else #define pr_debug(fmt, ...) \ - no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +do { \ + if (0) { \ + no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__);\ + } \ +} while (0) #endif /* @@ -341,7 +349,11 @@ extern asmlinkage void dump_stack(void) __cold; printk_once(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) #else #define pr_devel_once(fmt, ...) \ - no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +do { \ + if (0) { \ + no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__);\ + } \ +} while (0) #endif /* If you are writing a driver, please use dev_dbg instead */ @@ -350,7 +362,11 @@ extern asmlinkage void dump_stack(void) __cold; printk_once(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) #else #define pr_debug_once(fmt, ...) \ - no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +do { \ + if (0) { \ + no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__);\ + } \ +} while (0) #endif /* @@ -392,8 +408,12 @@ extern asmlinkage void dump_stack(void) __cold; #define pr_devel_ratelimited(fmt, ...) \ printk_ratelimited(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) #else -#define pr_devel_ratelimited(fmt, ...) \ - no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +#define pr_devel_ratelimited(fmt, ...) \ +do { \ + if (0) { \ + no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__);\ + } \ +} while (0) #endif /* If you are writing a driver, please use dev_dbg instead */ @@ -413,8 +433,12 @@ do { \ #define pr_debug_ratelimited(fmt, ...) \ printk_ratelimited(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) #else -#define pr_debug_ratelimited(fmt, ...) \ - no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) +#define pr_debug_ratelimited(fmt, ...) \ +do { \ + if (0) { \ + no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__);\ + } \ +} while (0) #endif extern const struct file_operations kmsg_fops; -- 2.6.1.133.gf5b6079 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/