printk: create pr_<level> functions

Using functions instead of macros can reduce overall code size by
eliminating unnecessary "KERN_SOH<digit>" prefixes from format strings.

  defconfig x86-64:

  $ size vmlinux*
     text    data     bss      dec     hex  filename
  10193570 4331464 1105920 15630954  ee826a vmlinux.new
  10192623 4335560 1105920 15634103  ee8eb7 vmlinux.old

As the return value are unimportant and unused in the kernel tree, these
new functions return void.

Miscellanea:

 - change pr_<level> macros to call new __pr_<level> functions
 - change vprintk_nmi and vprintk_default to add LOGLEVEL_<level> argument

[akpm@linux-foundation.org: fix LOGLEVEL_INFO, per Joe]
Link: http://lkml.kernel.org/r/e16cc34479dfefcae37c98b481e6646f0f69efc3.1466718827.git.joe@perches.com
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Joe Perches
2016-08-02 14:03:53 -07:00
committed by Linus Torvalds
parent bebca05281
commit 874f9c7da9
4 changed files with 78 additions and 26 deletions

View File

@@ -16,9 +16,11 @@
*/
#include <linux/percpu.h>
typedef __printf(1, 0) int (*printk_func_t)(const char *fmt, va_list args);
typedef __printf(2, 0) int (*printk_func_t)(int level, const char *fmt,
va_list args);
int __printf(1, 0) vprintk_default(const char *fmt, va_list args);
__printf(2, 0)
int vprintk_default(int level, const char *fmt, va_list args);
#ifdef CONFIG_PRINTK_NMI
@@ -31,9 +33,10 @@ extern raw_spinlock_t logbuf_lock;
* via per-CPU variable.
*/
DECLARE_PER_CPU(printk_func_t, printk_func);
static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args)
__printf(2, 0)
static inline int vprintk_func(int level, const char *fmt, va_list args)
{
return this_cpu_read(printk_func)(fmt, args);
return this_cpu_read(printk_func)(level, fmt, args);
}
extern atomic_t nmi_message_lost;
@@ -44,9 +47,10 @@ static inline int get_nmi_message_lost(void)
#else /* CONFIG_PRINTK_NMI */
static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args)
__printf(2, 0)
static inline int vprintk_func(int level, const char *fmt, va_list args)
{
return vprintk_default(fmt, args);
return vprintk_default(level, fmt, args);
}
static inline int get_nmi_message_lost(void)

View File

@@ -58,7 +58,7 @@ static DEFINE_PER_CPU(struct nmi_seq_buf, nmi_print_seq);
* one writer running. But the buffer might get flushed from another
* CPU, so we need to be careful.
*/
static int vprintk_nmi(const char *fmt, va_list args)
static int vprintk_nmi(int level, const char *fmt, va_list args)
{
struct nmi_seq_buf *s = this_cpu_ptr(&nmi_print_seq);
int add = 0;
@@ -79,7 +79,16 @@ again:
if (!len)
smp_rmb();
add = vsnprintf(s->buffer + len, sizeof(s->buffer) - len, fmt, args);
if (level != LOGLEVEL_DEFAULT) {
add = snprintf(s->buffer + len, sizeof(s->buffer) - len,
KERN_SOH "%c", '0' + level);
add += vsnprintf(s->buffer + len + add,
sizeof(s->buffer) - len - add,
fmt, args);
} else {
add = vsnprintf(s->buffer + len, sizeof(s->buffer) - len,
fmt, args);
}
/*
* Do it once again if the buffer has been flushed in the meantime.

View File

@@ -1801,7 +1801,28 @@ asmlinkage int printk_emit(int facility, int level,
}
EXPORT_SYMBOL(printk_emit);
int vprintk_default(const char *fmt, va_list args)
#ifdef CONFIG_PRINTK
#define define_pr_level(func, loglevel) \
asmlinkage __visible void func(const char *fmt, ...) \
{ \
va_list args; \
\
va_start(args, fmt); \
vprintk_default(loglevel, fmt, args); \
va_end(args); \
} \
EXPORT_SYMBOL(func)
define_pr_level(__pr_emerg, LOGLEVEL_EMERG);
define_pr_level(__pr_alert, LOGLEVEL_ALERT);
define_pr_level(__pr_crit, LOGLEVEL_CRIT);
define_pr_level(__pr_err, LOGLEVEL_ERR);
define_pr_level(__pr_warn, LOGLEVEL_WARNING);
define_pr_level(__pr_notice, LOGLEVEL_NOTICE);
define_pr_level(__pr_info, LOGLEVEL_INFO);
#endif
int vprintk_default(int level, const char *fmt, va_list args)
{
int r;
@@ -1811,7 +1832,7 @@ int vprintk_default(const char *fmt, va_list args)
return r;
}
#endif
r = vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args);
r = vprintk_emit(0, level, NULL, 0, fmt, args);
return r;
}
@@ -1844,7 +1865,7 @@ asmlinkage __visible int printk(const char *fmt, ...)
int r;
va_start(args, fmt);
r = vprintk_func(fmt, args);
r = vprintk_func(LOGLEVEL_DEFAULT, fmt, args);
va_end(args);
return r;