All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Baron <jbaron@akamai.com>
To: Aaron Conole <aconole@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, Joe Perches <joe@perches.com>
Subject: Re: [PATCH] printk: fix pr_debug and pr_devel to elide function calls
Date: Fri, 4 Dec 2015 11:31:42 -0500	[thread overview]
Message-ID: <5661BFEE.1050103@akamai.com> (raw)
In-Reply-To: <1449182754-19088-1-git-send-email-aconole@redhat.com>

On 12/03/2015 05:45 PM, Aaron Conole wrote:
> 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 <aconole@redhat.com>
> Reported-by: Dmitry Vyukov <dvyukov@google.com>
> Cc: Joe Perches <joe@perches.com>

I think we should just convert no_printk() to not emit anything. This
will avoid us adding unwrapped calls to 'no_printk()' in the future, and
I think makes the code more readable. Based on Joe's previous
'eliminated_printk()' thing. IE:

diff --git a/include/linux/printk.h b/include/linux/printk.h
index 9729565..58632bf 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -108,11 +108,11 @@ struct va_format {
  * Dummy printk for disabled debugging statements to use whilst maintaining
  * gcc's format and side-effect checking.
  */
-static inline __printf(1, 2)
-int no_printk(const char *fmt, ...)
-{
-       return 0;
-}
+#define no_printk(fmt, ...)                    \
+do {                                           \
+       if (0)                                  \
+               printk(fmt, ##__VA_ARGS__);     \
+} while (0)

 #ifdef CONFIG_EARLY_PRINTK
 extern asmlinkage __printf(1, 2)

Thanks,

-Jason

> 
> ---
>  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 <linux/dynamic_debug.h>
> @@ -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;
> 

  parent reply	other threads:[~2015-12-04 16:31 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-03 22:45 [PATCH] printk: fix pr_debug and pr_devel to elide function calls Aaron Conole
2015-12-03 23:13 ` Joe Perches
2015-12-04 16:31 ` Jason Baron [this message]
2015-12-04 16:38   ` Aaron Conole
2015-12-04 16:46     ` Joe Perches
2015-12-04 21:51   ` [PATCH v2] printk: help pr_debug and pr_devel to optimize out arguments Aaron Conole
2015-12-09 11:52     ` Arnd Bergmann
2015-12-09 15:13       ` Aaron Conole
2015-12-09 15:47       ` Joe Perches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5661BFEE.1050103@akamai.com \
    --to=jbaron@akamai.com \
    --cc=aconole@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=joe@perches.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.