lkml.org 
[lkml]   [2009]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 2/8] ksym_tracer: Rewrite ksym_trace_filter_read()
    On Tue, Jul 07, 2009 at 01:52:52PM +0800, Li Zefan wrote:
    > Reading ksym_trace_filter gave me some arbitrary characters,
    > when it should show nothing. It's because buf is not initialized
    > when there's no filter.
    >

    I started noticing this behaviour recently.

    A simple
    char buf[KSYM_FILTER_ENTRY_LEN * KSYM_TRACER_MAX] = "\0";
    solves the problem.

    > Also reduce stack usage by about 512 bytes.
    >

    The stack usage would be much lesser on other architectures with fewer
    breakpoint registers (like PPC64), and should really be an issue.

    > Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
    > ---
    > kernel/trace/trace_ksym.c | 29 ++++++++++++++++++-----------
    > 1 files changed, 18 insertions(+), 11 deletions(-)
    >
    > diff --git a/kernel/trace/trace_ksym.c b/kernel/trace/trace_ksym.c
    > index 085ff05..b6710d3 100644
    > --- a/kernel/trace/trace_ksym.c
    > +++ b/kernel/trace/trace_ksym.c
    > @@ -35,7 +35,6 @@
    > #define KSYM_TRACER_MAX HBP_NUM
    >
    > #define KSYM_TRACER_OP_LEN 3 /* rw- */
    > -#define KSYM_FILTER_ENTRY_LEN (KSYM_NAME_LEN + KSYM_TRACER_OP_LEN + 1)
    >
    > struct trace_ksym {
    > struct hw_breakpoint *ksym_hbp;
    > @@ -230,25 +229,33 @@ static ssize_t ksym_trace_filter_read(struct file *filp, char __user *ubuf,
    > {
    > struct trace_ksym *entry;
    > struct hlist_node *node;
    > - char buf[KSYM_FILTER_ENTRY_LEN * KSYM_TRACER_MAX];
    > - ssize_t ret, cnt = 0;
    > + struct trace_seq *s;
    > + ssize_t cnt = 0;
    > + int ret;
    > +
    > + s = kmalloc(sizeof(*s), GFP_KERNEL);
    > + if (!s)
    > + return -ENOMEM;
    > + trace_seq_init(s);
    >
    > mutex_lock(&ksym_tracer_mutex);
    >
    > hlist_for_each_entry(entry, node, &ksym_filter_head, ksym_hlist) {
    > - cnt += snprintf(&buf[cnt], KSYM_FILTER_ENTRY_LEN - cnt, "%s:",
    > - entry->ksym_hbp->info.name);
    > + ret = trace_seq_printf(s, "%s:", entry->ksym_hbp->info.name);
    > if (entry->ksym_hbp->info.type == HW_BREAKPOINT_WRITE)
    > - cnt += snprintf(&buf[cnt], KSYM_FILTER_ENTRY_LEN - cnt,
    > - "-w-\n");
    > + ret = trace_seq_puts(s, "-w-\n");
    > else if (entry->ksym_hbp->info.type == HW_BREAKPOINT_RW)
    > - cnt += snprintf(&buf[cnt], KSYM_FILTER_ENTRY_LEN - cnt,
    > - "rw-\n");
    > + ret = trace_seq_puts(s, "rw-\n");
    > + WARN_ON_ONCE(!ret);

    Given that this change uses the tracer defined functions and a seq-file
    implementation, the patch is welcome.

    Thanks,
    K.Prasad



    \
     
     \ /
      Last update: 2009-07-11 07:57    [W:0.026 / U:0.700 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site