lkml.org 
[lkml]   [2012]   [Jun]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] printk: Shrink printk_sched buffer size, eliminate it when !CONFIG_PRINTK

    * Joe Perches <joe@perches.com> wrote:

    > The size of the per-cpu printk_sched buf is much larger
    > than necessary. The maximum sched message emitted is
    > ~80 bytes. Shrink the allocation for this printk_sched
    > buffer from 512 bytes to 128.
    >
    > printk_sched creates an unnecessary per-cpu buffer when
    > CONFIG_PRINTK is not enabled. Remove it when appropriate
    > so embedded uses save a bit of space too.
    >
    > Signed-off-by: Joe Perches <joe@perches.com>
    > ---
    > kernel/printk.c | 14 ++++++++++----
    > 1 files changed, 10 insertions(+), 4 deletions(-)
    >
    > diff --git a/kernel/printk.c b/kernel/printk.c
    > index 32462d2..61cff0b 100644
    > --- a/kernel/printk.c
    > +++ b/kernel/printk.c
    > @@ -1726,24 +1726,30 @@ int is_console_locked(void)
    > }
    >
    > /*
    > - * Delayed printk version, for scheduler-internal messages:
    > + * Delayed printk version, for scheduler-internal messages.
    > + * Not the normal 512 as it's a bit wasteful, sched messages are short,
    > + * and 128 is more than sufficient for all current messages.
    > */
    > -#define PRINTK_BUF_SIZE 512
    > +#define PRINTK_SCHED_BUF_SIZE 128
    >
    > #define PRINTK_PENDING_WAKEUP 0x01
    > #define PRINTK_PENDING_SCHED 0x02
    >
    > static DEFINE_PER_CPU(int, printk_pending);
    > -static DEFINE_PER_CPU(char [PRINTK_BUF_SIZE], printk_sched_buf);
    > +#ifdef CONFIG_PRINTK
    > +static DEFINE_PER_CPU(char [PRINTK_SCHED_BUF_SIZE], printk_sched_buf);
    > +#endif
    >
    > void printk_tick(void)
    > {
    > if (__this_cpu_read(printk_pending)) {
    > int pending = __this_cpu_xchg(printk_pending, 0);
    > +#ifdef CONFIG_PRINTK
    > if (pending & PRINTK_PENDING_SCHED) {
    > char *buf = __get_cpu_var(printk_sched_buf);
    > printk(KERN_WARNING "[sched_delayed] %s", buf);
    > }
    > +#endif
    > if (pending & PRINTK_PENDING_WAKEUP)
    > wake_up_interruptible(&log_wait);
    > }
    > @@ -2189,7 +2195,7 @@ int printk_sched(const char *fmt, ...)
    > buf = __get_cpu_var(printk_sched_buf);
    >
    > va_start(args, fmt);
    > - r = vsnprintf(buf, PRINTK_BUF_SIZE, fmt, args);
    > + r = vsnprintf(buf, PRINTK_SCHED_BUF_SIZE, fmt, args);
    > va_end(args);
    >
    > __this_cpu_or(printk_pending, PRINTK_PENDING_SCHED);

    The change makes sense but the further proliferation of #ifdefs
    is rather ugly and shows confusion: fundamentally, if we are
    going to cut out more printk functionality in the !CONFIG_PRINTK
    we might as well disable the whole thing, not just the
    printk_sched bits.

    Thanks,

    Ingo


    \
     
     \ /
      Last update: 2012-06-06 10:01    [W:4.251 / U:0.164 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site