lkml.org 
[lkml]   [2018]   [Jun]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] printk: remove unnecessary kmalloc() from syslog during clear
    Date
    When the request is only for clearing logs, there is no need for
    allocation/deallocation. Only the indexes need to be reset and returned.
    Rest of the patch is mostly made up of changes because of indention.

    Signed-off-by: Namit Gupta <gupta.namit@samsung.com>
    Signed-off-by: Himanshu Maithani <himanshu.m@samsung.com>
    ---
    kernel/printk/printk.c | 111 ++++++++++++++++++++++++++-----------------------
    1 file changed, 60 insertions(+), 51 deletions(-)

    diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
    index 512f7c2..53952ce 100644
    --- a/kernel/printk/printk.c
    +++ b/kernel/printk/printk.c
    @@ -1348,71 +1348,80 @@ static int syslog_print_all(char __user *buf, int size, bool clear)
    {
    char *text;
    int len = 0;
    + u64 next_seq;
    + u64 seq;
    + u32 idx;
    +
    + if (!buf) {
    + if (clear) {
    + logbuf_lock_irq();
    + clear_seq = log_next_seq;
    + clear_idx = log_next_idx;
    + logbuf_unlock_irq();
    + }
    + return 0;
    + }
    +

    text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
    if (!text)
    return -ENOMEM;

    logbuf_lock_irq();
    - if (buf) {
    - u64 next_seq;
    - u64 seq;
    - u32 idx;

    - /*
    - * Find first record that fits, including all following records,
    - * into the user-provided buffer for this dump.
    - */
    - seq = clear_seq;
    - idx = clear_idx;
    - while (seq < log_next_seq) {
    - struct printk_log *msg = log_from_idx(idx);
    -
    - len += msg_print_text(msg, true, NULL, 0);
    - idx = log_next(idx);
    - seq++;
    - }
    + /*
    + * Find first record that fits, including all following records,
    + * into the user-provided buffer for this dump.
    + */
    + seq = clear_seq;
    + idx = clear_idx;
    + while (seq < log_next_seq) {
    + struct printk_log *msg = log_from_idx(idx);

    - /* move first record forward until length fits into the buffer */
    - seq = clear_seq;
    - idx = clear_idx;
    - while (len > size && seq < log_next_seq) {
    - struct printk_log *msg = log_from_idx(idx);
    + len += msg_print_text(msg, true, NULL, 0);
    + idx = log_next(idx);
    + seq++;
    + }

    - len -= msg_print_text(msg, true, NULL, 0);
    - idx = log_next(idx);
    - seq++;
    - }
    + /* move first record forward until length fits into the buffer */
    + seq = clear_seq;
    + idx = clear_idx;
    + while (len > size && seq < log_next_seq) {
    + struct printk_log *msg = log_from_idx(idx);

    - /* last message fitting into this dump */
    - next_seq = log_next_seq;
    + len -= msg_print_text(msg, true, NULL, 0);
    + idx = log_next(idx);
    + seq++;
    + }

    - len = 0;
    - while (len >= 0 && seq < next_seq) {
    - struct printk_log *msg = log_from_idx(idx);
    - int textlen;
    + /* last message fitting into this dump */
    + next_seq = log_next_seq;

    - textlen = msg_print_text(msg, true, text,
    - LOG_LINE_MAX + PREFIX_MAX);
    - if (textlen < 0) {
    - len = textlen;
    - break;
    - }
    - idx = log_next(idx);
    - seq++;
    + len = 0;
    + while (len >= 0 && seq < next_seq) {
    + struct printk_log *msg = log_from_idx(idx);
    + int textlen;

    - logbuf_unlock_irq();
    - if (copy_to_user(buf + len, text, textlen))
    - len = -EFAULT;
    - else
    - len += textlen;
    - logbuf_lock_irq();
    + textlen = msg_print_text(msg, true, text,
    + LOG_LINE_MAX + PREFIX_MAX);
    + if (textlen < 0) {
    + len = textlen;
    + break;
    + }
    + idx = log_next(idx);
    + seq++;

    - if (seq < log_first_seq) {
    - /* messages are gone, move to next one */
    - seq = log_first_seq;
    - idx = log_first_idx;
    - }
    + logbuf_unlock_irq();
    + if (copy_to_user(buf + len, text, textlen))
    + len = -EFAULT;
    + else
    + len += textlen;
    + logbuf_lock_irq();
    +
    + if (seq < log_first_seq) {
    + /* messages are gone, move to next one */
    + seq = log_first_seq;
    + idx = log_first_idx;
    }
    }

    --
    1.9.1
    \
     
     \ /
      Last update: 2018-06-20 16:00    [W:3.667 / U:0.740 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site