lkml.org 
[lkml]   [2013]   [Jul]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 1/5] printk: make printk a macro
    Date
    To allow building up metadata transparently for each printk(), make
    printk() a macro while keeping printk()'s API. Then, printk() calls
    _printk() which implements the original printk() function.

    printk() is used from assembly sources, but they don't include printk.h
    and don't use this new printk() macro. This is addressed by assigning
    the printk symbol to _printk in the linker script.

    Signed-off-by: Hidehiro Kawai <hidehiro.kawai.ez@hitachi.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Kay Sievers <kay@vrfy.org>
    Cc: "David S. Miller" <davem@davemloft.net>
    ---

    include/asm-generic/vmlinux.lds.h | 1 +
    include/linux/printk.h | 4 +++-
    kernel/printk.c | 12 ++++++++----
    3 files changed, 12 insertions(+), 5 deletions(-)

    diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
    index eb58d2d..0380add 100644
    --- a/include/asm-generic/vmlinux.lds.h
    +++ b/include/asm-generic/vmlinux.lds.h
    @@ -416,6 +416,7 @@
    *(.text.hot) \
    *(.text) \
    *(.ref.text) \
    + VMLINUX_SYMBOL(printk) = VMLINUX_SYMBOL(_printk); \
    DEV_KEEP(init.text) \
    DEV_KEEP(exit.text) \
    CPU_KEEP(init.text) \
    diff --git a/include/linux/printk.h b/include/linux/printk.h
    index 22c7052..c7a8c6b 100644
    --- a/include/linux/printk.h
    +++ b/include/linux/printk.h
    @@ -121,7 +121,9 @@ asmlinkage int printk_emit(int facility, int level,
    const char *fmt, ...);

    asmlinkage __printf(1, 2) __cold
    -int printk(const char *fmt, ...);
    +int _printk(const char *fmt, ...);
    +
    +#define printk(fmt, args...) _printk(fmt, ## args)

    /*
    * Special printk facility for scheduler use only, _DO_NOT_USE_ !
    diff --git a/kernel/printk.c b/kernel/printk.c
    index 8212c1a..1ec264e 100644
    --- a/kernel/printk.c
    +++ b/kernel/printk.c
    @@ -1658,10 +1658,14 @@ asmlinkage int printk_emit(int facility, int level,
    EXPORT_SYMBOL(printk_emit);

    /**
    - * printk - print a kernel message
    + * _printk - print a kernel message
    * @fmt: format string
    *
    - * This is printk(). It can be called from any context. We want it to work.
    + * Now, printk() is a macro defined in include/linux/printk.h, and this
    + * function is its body. It can be called from any context, but please
    + * use printk() macro. Directly calling _printk() is not recommended.
    + * In assembly sources, you can call printk as in the past because the
    + * linker program links the printk symbol in assembly sources to _printk.
    *
    * We try to grab the console_lock. If we succeed, it's easy - we log the
    * output and call the console drivers. If we fail to get the semaphore, we
    @@ -1678,7 +1682,7 @@ EXPORT_SYMBOL(printk_emit);
    *
    * See the vsnprintf() documentation for format string extensions over C99.
    */
    -asmlinkage int printk(const char *fmt, ...)
    +asmlinkage int _printk(const char *fmt, ...)
    {
    va_list args;
    int r;
    @@ -1697,7 +1701,7 @@ asmlinkage int printk(const char *fmt, ...)

    return r;
    }
    -EXPORT_SYMBOL(printk);
    +EXPORT_SYMBOL(_printk);

    #else /* CONFIG_PRINTK */




    \
     
     \ /
      Last update: 2013-07-03 05:01    [W:6.823 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site