lkml.org 
[lkml]   [2012]   [May]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH RESEND 1/3] printk: convert byte-buffer to variable-length record buffer
    From
    Date
    On Wed, 2012-05-09 at 15:29 +0200, Kay Sievers wrote:

    > Can we somehow store the PID of the printk() thread that has left the
    > un-terminated line behind in the buffer, and flush it out when the
    > next printk() is from a differnt PID? That could prevent the mangling
    > of "atomic" printk()s by continuation users, and merging unrelated
    > continuation users together.

    How about this? It relaxes the need for KERN_CONT, but it limits
    continuation lines to repeated calls of the same thread.

    If things race against each other, the lines are separated and not
    wrongly mixed with the data from other users.

    I would be happy with that, as it protects the "atomic" users of
    printk() from getting mixed up with continuation users.

    Thanks,
    Kay


    From: Kay Sievers <kay@vrfy.org>
    Subject: printk() - do not merge continuation lines of different threads

    Signed-off-by: Kay Sievers <kay@vrfy.org>---
    ---

    kernel/printk.c | 18 ++++++++++--------
    1 file changed, 10 insertions(+), 8 deletions(-)

    --- a/kernel/printk.c
    +++ b/kernel/printk.c
    @@ -1230,12 +1230,13 @@ asmlinkage int vprintk_emit(int facility
    static size_t buflen;
    static int buflevel;
    static char textbuf[LOG_LINE_MAX];
    + static struct task_struct *cont;
    char *text = textbuf;
    size_t textlen;
    unsigned long flags;
    int this_cpu;
    bool newline = false;
    - bool cont = false;
    + bool prefix = false;
    int printed_len = 0;

    boot_delay_msec();
    @@ -1295,20 +1296,17 @@ asmlinkage int vprintk_emit(int facility
    case '0' ... '7':
    if (level == -1)
    level = text[1] - '0';
    - text += 3;
    - textlen -= 3;
    - break;
    case 'c': /* KERN_CONT */
    - cont = true;
    case 'd': /* KERN_DEFAULT */
    + if (text[1] != 'c')
    + prefix = true;
    text += 3;
    textlen -= 3;
    - break;
    }
    }

    - if (buflen && (!cont || dict)) {
    - /* no continuation; flush existing buffer */
    + if (buflen && (prefix || dict || cont != current)) {
    + /* flush existing buffer */
    log_store(facility, buflevel, NULL, 0, buf, buflen);
    printed_len += buflen;
    buflen = 0;
    @@ -1342,6 +1340,10 @@ asmlinkage int vprintk_emit(int facility
    dict, dictlen, text, textlen);
    printed_len += textlen;
    }
    + cont = NULL;
    + } else {
    + /* remember thread which filled the buffer */
    + cont = current;
    }

    /*



    \
     
     \ /
      Last update: 2012-05-10 03:21    [W:0.028 / U:31.804 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site