lkml.org 
[lkml]   [2011]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/3] printk: Add %ptc to safely print a task's comm
    Date
    Accessing task->comm requires proper locking. However in the past
    access to current->comm could be done without locking. This
    is no longer the case, so all comm access needs to be done
    while holding the comm_lock.

    In my attempt to clean up unprotected comm access, I've noticed
    most comm access is done for printk output. To simplify correct
    locking in these cases, I've introduced a new %ptc format,
    which will print the corresponding task's comm.

    Example use:
    printk("%ptc: unaligned epc - sending SIGBUS.\n", current);

    CC: Ted Ts'o <tytso@mit.edu>
    CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    CC: David Rientjes <rientjes@google.com>
    CC: Dave Hansen <dave@linux.vnet.ibm.com>
    CC: Andrew Morton <akpm@linux-foundation.org>
    CC: linux-mm@kvack.org
    Signed-off-by: John Stultz <john.stultz@linaro.org>
    ---
    lib/vsprintf.c | 27 +++++++++++++++++++++++++++
    1 files changed, 27 insertions(+), 0 deletions(-)

    diff --git a/lib/vsprintf.c b/lib/vsprintf.c
    index bc0ac6b..5abbe94 100644
    --- a/lib/vsprintf.c
    +++ b/lib/vsprintf.c
    @@ -797,6 +797,26 @@ char *uuid_string(char *buf, char *end, const u8 *addr,
    return string(buf, end, uuid, spec);
    }

    +static noinline_for_stack
    +char *task_comm_string(char *buf, char *end, void *addr,
    + struct printf_spec spec, const char *fmt)
    +{
    + struct task_struct *tsk = addr;
    + char *ret;
    + unsigned long seq;
    +
    + do {
    + seq = read_seqbegin(&tsk->comm_lock);
    +
    + ret = string(buf, end, tsk->comm, spec);
    +
    + } while (read_seqretry(&tsk->comm_lock, seq));
    +
    + return ret;
    +}
    +
    +
    +
    int kptr_restrict = 1;

    /*
    @@ -864,6 +884,12 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
    }

    switch (*fmt) {
    + case 't':
    + switch (fmt[1]) {
    + case 'c':
    + return task_comm_string(buf, end, ptr, spec, fmt);
    + }
    + break;
    case 'F':
    case 'f':
    ptr = dereference_function_descriptor(ptr);
    @@ -1151,6 +1177,7 @@ qualifier:
    * http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-00
    * %pU[bBlL] print a UUID/GUID in big or little endian using lower or upper
    * case.
    + * %ptc outputs the task's comm name
    * %n is ignored
    *
    * The return value is the number of characters which would
    --
    1.7.3.2.146.gca209


    \
     
     \ /
      Last update: 2011-05-13 01:05    [W:0.039 / U:32.516 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site