diff --git a/[refs] b/[refs] index 89be42aa20fe..baae00dd0175 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b14b70a6a4e394c9630bcde17e07d3bcdcbca27e +refs/heads/master: fee039a1d05c6e0f71b0fe270d847742a02d56c4 diff --git a/trunk/arch/x86/kernel/ftrace.c b/trunk/arch/x86/kernel/ftrace.c index 61df77532120..57b33edb7ce3 100644 --- a/trunk/arch/x86/kernel/ftrace.c +++ b/trunk/arch/x86/kernel/ftrace.c @@ -410,6 +410,7 @@ int ftrace_disable_ftrace_graph_caller(void) void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) { unsigned long old; + unsigned long long calltime; int faulted; struct ftrace_graph_ent trace; unsigned long return_hooker = (unsigned long) @@ -452,7 +453,10 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) return; } - if (ftrace_push_return_trace(old, self_addr, &trace.depth) == -EBUSY) { + calltime = trace_clock_local(); + + if (ftrace_push_return_trace(old, calltime, + self_addr, &trace.depth) == -EBUSY) { *parent = old; return; } diff --git a/trunk/arch/x86/kernel/kprobes.c b/trunk/arch/x86/kernel/kprobes.c index 4558dd3918cf..759095d53a06 100644 --- a/trunk/arch/x86/kernel/kprobes.c +++ b/trunk/arch/x86/kernel/kprobes.c @@ -638,13 +638,13 @@ static void __used __kprobes kretprobe_trampoline_holder(void) #else " pushf\n" /* - * Skip cs, ip, orig_ax. + * Skip cs, ip, orig_ax and gs. * trampoline_handler() will plug in these values */ - " subl $12, %esp\n" + " subl $16, %esp\n" " pushl %fs\n" - " pushl %ds\n" " pushl %es\n" + " pushl %ds\n" " pushl %eax\n" " pushl %ebp\n" " pushl %edi\n" @@ -655,10 +655,10 @@ static void __used __kprobes kretprobe_trampoline_holder(void) " movl %esp, %eax\n" " call trampoline_handler\n" /* Move flags to cs */ - " movl 52(%esp), %edx\n" - " movl %edx, 48(%esp)\n" + " movl 56(%esp), %edx\n" + " movl %edx, 52(%esp)\n" /* Replace saved flags with true return address. */ - " movl %eax, 52(%esp)\n" + " movl %eax, 56(%esp)\n" " popl %ebx\n" " popl %ecx\n" " popl %edx\n" @@ -666,8 +666,8 @@ static void __used __kprobes kretprobe_trampoline_holder(void) " popl %edi\n" " popl %ebp\n" " popl %eax\n" - /* Skip ip, orig_ax, es, ds, fs */ - " addl $20, %esp\n" + /* Skip ds, es, fs, gs, orig_ax and ip */ + " addl $24, %esp\n" " popf\n" #endif " ret\n"); @@ -691,6 +691,7 @@ static __used __kprobes void *trampoline_handler(struct pt_regs *regs) regs->cs = __KERNEL_CS; #else regs->cs = __KERNEL_CS | get_kernel_rpl(); + regs->gs = 0; #endif regs->ip = trampoline_address; regs->orig_ax = ~0UL; diff --git a/trunk/fs/debugfs/inode.c b/trunk/fs/debugfs/inode.c index 0662ba6de85a..81ae9ea3c6e1 100644 --- a/trunk/fs/debugfs/inode.c +++ b/trunk/fs/debugfs/inode.c @@ -30,7 +30,6 @@ static struct vfsmount *debugfs_mount; static int debugfs_mount_count; -static bool debugfs_registered; static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t dev) { @@ -497,16 +496,6 @@ struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry, } EXPORT_SYMBOL_GPL(debugfs_rename); -/** - * debugfs_initialized - Tells whether debugfs has been registered - */ -bool debugfs_initialized(void) -{ - return debugfs_registered; -} -EXPORT_SYMBOL_GPL(debugfs_initialized); - - static struct kobject *debug_kobj; static int __init debugfs_init(void) @@ -520,16 +509,11 @@ static int __init debugfs_init(void) retval = register_filesystem(&debug_fs_type); if (retval) kobject_put(debug_kobj); - else - debugfs_registered = true; - return retval; } static void __exit debugfs_exit(void) { - debugfs_registered = false; - simple_release_fs(&debugfs_mount, &debugfs_mount_count); unregister_filesystem(&debug_fs_type); kobject_put(debug_kobj); diff --git a/trunk/include/linux/debugfs.h b/trunk/include/linux/debugfs.h index eb5c2ba2f81a..af0e01d4c663 100644 --- a/trunk/include/linux/debugfs.h +++ b/trunk/include/linux/debugfs.h @@ -71,9 +71,6 @@ struct dentry *debugfs_create_bool(const char *name, mode_t mode, struct dentry *debugfs_create_blob(const char *name, mode_t mode, struct dentry *parent, struct debugfs_blob_wrapper *blob); - -bool debugfs_initialized(void); - #else #include @@ -186,11 +183,6 @@ static inline struct dentry *debugfs_create_blob(const char *name, mode_t mode, return ERR_PTR(-ENODEV); } -static inline bool debugfs_initialized(void) -{ - return false; -} - #endif #endif diff --git a/trunk/include/linux/ftrace.h b/trunk/include/linux/ftrace.h index 015a3d22cf74..db3fed630db3 100644 --- a/trunk/include/linux/ftrace.h +++ b/trunk/include/linux/ftrace.h @@ -145,15 +145,9 @@ enum { }; struct dyn_ftrace { - union { - unsigned long ip; /* address of mcount call-site */ - struct dyn_ftrace *freelist; - }; - union { - unsigned long flags; - struct dyn_ftrace *newlist; - }; - struct dyn_arch_ftrace arch; + unsigned long ip; /* address of mcount call-site */ + unsigned long flags; + struct dyn_arch_ftrace arch; }; int ftrace_force_update(void); @@ -375,7 +369,8 @@ struct ftrace_ret_stack { extern void return_to_handler(void); extern int -ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth); +ftrace_push_return_trace(unsigned long ret, unsigned long long time, + unsigned long func, int *depth); extern void ftrace_pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret); diff --git a/trunk/include/linux/sched.h b/trunk/include/linux/sched.h index 471e36d30123..89cd308cc7a5 100644 --- a/trunk/include/linux/sched.h +++ b/trunk/include/linux/sched.h @@ -1409,8 +1409,6 @@ struct task_struct { int curr_ret_stack; /* Stack of return addresses for return function tracing */ struct ftrace_ret_stack *ret_stack; - /* time stamp for last schedule */ - unsigned long long ftrace_timestamp; /* * Number of functions that haven't been traced * because of depth overrun. diff --git a/trunk/init/main.c b/trunk/init/main.c index b0097d2b63ae..20d784ab5ef8 100644 --- a/trunk/init/main.c +++ b/trunk/init/main.c @@ -772,7 +772,6 @@ static void __init do_basic_setup(void) { rcu_init_sched(); /* needed by module_init stage. */ init_workqueues(); - cpuset_init_smp(); usermodehelper_init(); driver_init(); init_irq_proc(); @@ -866,6 +865,8 @@ static int __init kernel_init(void * unused) smp_init(); sched_init_smp(); + cpuset_init_smp(); + do_basic_setup(); /* diff --git a/trunk/kernel/trace/Kconfig b/trunk/kernel/trace/Kconfig index 8a4d72931042..b0a46f889659 100644 --- a/trunk/kernel/trace/Kconfig +++ b/trunk/kernel/trace/Kconfig @@ -63,11 +63,7 @@ config TRACING # config TRACING_SUPPORT bool - # PPC32 has no irqflags tracing support, but it can use most of the - # tracers anyway, they were tested to build and work. Note that new - # exceptions to this list aren't welcomed, better implement the - # irqflags tracing for your architecture. - depends on TRACE_IRQFLAGS_SUPPORT || PPC32 + depends on TRACE_IRQFLAGS_SUPPORT depends on STACKTRACE_SUPPORT default y diff --git a/trunk/kernel/trace/ftrace.c b/trunk/kernel/trace/ftrace.c index 1752a63f37c0..7847806eefef 100644 --- a/trunk/kernel/trace/ftrace.c +++ b/trunk/kernel/trace/ftrace.c @@ -29,8 +29,6 @@ #include #include -#include - #include #include "trace.h" @@ -341,7 +339,7 @@ static inline int record_frozen(struct dyn_ftrace *rec) static void ftrace_free_rec(struct dyn_ftrace *rec) { - rec->freelist = ftrace_free_records; + rec->ip = (unsigned long)ftrace_free_records; ftrace_free_records = rec; rec->flags |= FTRACE_FL_FREE; } @@ -358,14 +356,9 @@ void ftrace_release(void *start, unsigned long size) mutex_lock(&ftrace_lock); do_for_each_ftrace_rec(pg, rec) { - if ((rec->ip >= s) && (rec->ip < e)) { - /* - * rec->ip is changed in ftrace_free_rec() - * It should not between s and e if record was freed. - */ - FTRACE_WARN_ON(rec->flags & FTRACE_FL_FREE); + if ((rec->ip >= s) && (rec->ip < e) && + !(rec->flags & FTRACE_FL_FREE)) ftrace_free_rec(rec); - } } while_for_each_ftrace_rec(); mutex_unlock(&ftrace_lock); } @@ -384,7 +377,7 @@ static struct dyn_ftrace *ftrace_alloc_dyn_node(unsigned long ip) return NULL; } - ftrace_free_records = rec->freelist; + ftrace_free_records = (void *)rec->ip; memset(rec, 0, sizeof(*rec)); return rec; } @@ -416,7 +409,7 @@ ftrace_record_ip(unsigned long ip) return NULL; rec->ip = ip; - rec->newlist = ftrace_new_addrs; + rec->flags = (unsigned long)ftrace_new_addrs; ftrace_new_addrs = rec; return rec; @@ -736,7 +729,7 @@ static int ftrace_update_code(struct module *mod) return -1; p = ftrace_new_addrs; - ftrace_new_addrs = p->newlist; + ftrace_new_addrs = (struct dyn_ftrace *)p->flags; p->flags = 0L; /* convert record (i.e, patch mcount-call with NOP) */ @@ -2269,7 +2262,7 @@ ftrace_pid_read(struct file *file, char __user *ubuf, if (ftrace_pid_trace == ftrace_swapper_pid) r = sprintf(buf, "swapper tasks\n"); else if (ftrace_pid_trace) - r = sprintf(buf, "%u\n", pid_vnr(ftrace_pid_trace)); + r = sprintf(buf, "%u\n", pid_nr(ftrace_pid_trace)); else r = sprintf(buf, "no pid\n"); @@ -2597,38 +2590,6 @@ static int alloc_retstack_tasklist(struct ftrace_ret_stack **ret_stack_list) return ret; } -static void -ftrace_graph_probe_sched_switch(struct rq *__rq, struct task_struct *prev, - struct task_struct *next) -{ - unsigned long long timestamp; - int index; - - /* - * Does the user want to count the time a function was asleep. - * If so, do not update the time stamps. - */ - if (trace_flags & TRACE_ITER_SLEEP_TIME) - return; - - timestamp = trace_clock_local(); - - prev->ftrace_timestamp = timestamp; - - /* only process tasks that we timestamped */ - if (!next->ftrace_timestamp) - return; - - /* - * Update all the counters in next to make up for the - * time next was sleeping. - */ - timestamp -= next->ftrace_timestamp; - - for (index = next->curr_ret_stack; index >= 0; index--) - next->ret_stack[index].calltime += timestamp; -} - /* Allocate a return stack for each task */ static int start_graph_tracing(void) { @@ -2650,13 +2611,6 @@ static int start_graph_tracing(void) ret = alloc_retstack_tasklist(ret_stack_list); } while (ret == -EAGAIN); - if (!ret) { - ret = register_trace_sched_switch(ftrace_graph_probe_sched_switch); - if (ret) - pr_info("ftrace_graph: Couldn't activate tracepoint" - " probe to kernel_sched_switch\n"); - } - kfree(ret_stack_list); return ret; } @@ -2689,12 +2643,6 @@ int register_ftrace_graph(trace_func_graph_ret_t retfunc, mutex_lock(&ftrace_lock); - /* we currently allow only one tracer registered at a time */ - if (atomic_read(&ftrace_graph_active)) { - ret = -EBUSY; - goto out; - } - ftrace_suspend_notifier.notifier_call = ftrace_suspend_notifier_call; register_pm_notifier(&ftrace_suspend_notifier); @@ -2720,7 +2668,6 @@ void unregister_ftrace_graph(void) mutex_lock(&ftrace_lock); atomic_dec(&ftrace_graph_active); - unregister_trace_sched_switch(ftrace_graph_probe_sched_switch); ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub; ftrace_graph_entry = ftrace_graph_entry_stub; ftrace_shutdown(FTRACE_STOP_FUNC_RET); @@ -2741,7 +2688,6 @@ void ftrace_graph_init_task(struct task_struct *t) t->curr_ret_stack = -1; atomic_set(&t->tracing_graph_pause, 0); atomic_set(&t->trace_overrun, 0); - t->ftrace_timestamp = 0; } else t->ret_stack = NULL; } diff --git a/trunk/kernel/trace/trace.c b/trunk/kernel/trace/trace.c index 67c6a21dd427..e6fac0ffe6f0 100644 --- a/trunk/kernel/trace/trace.c +++ b/trunk/kernel/trace/trace.c @@ -255,7 +255,7 @@ static DECLARE_WAIT_QUEUE_HEAD(trace_wait); /* trace_flags holds trace_options default values */ unsigned long trace_flags = TRACE_ITER_PRINT_PARENT | TRACE_ITER_PRINTK | - TRACE_ITER_ANNOTATE | TRACE_ITER_CONTEXT_INFO | TRACE_ITER_SLEEP_TIME; + TRACE_ITER_ANNOTATE | TRACE_ITER_CONTEXT_INFO; /** * trace_wake_up - wake up tasks waiting for trace input @@ -316,7 +316,6 @@ static const char *trace_options[] = { "context-info", "latency-format", "global-clock", - "sleep-time", NULL }; @@ -383,7 +382,7 @@ ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt) return cnt; } -static ssize_t trace_seq_to_buffer(struct trace_seq *s, void *buf, size_t cnt) +ssize_t trace_seq_to_buffer(struct trace_seq *s, void *buf, size_t cnt) { int len; void *ret; @@ -3514,9 +3513,6 @@ struct dentry *tracing_init_dentry(void) if (d_tracer) return d_tracer; - if (!debugfs_initialized()) - return NULL; - d_tracer = debugfs_create_dir("tracing", NULL); if (!d_tracer && !once) { diff --git a/trunk/kernel/trace/trace.h b/trunk/kernel/trace/trace.h index d7410bbb9a80..7cfb741be200 100644 --- a/trunk/kernel/trace/trace.h +++ b/trunk/kernel/trace/trace.h @@ -683,7 +683,6 @@ enum trace_iterator_flags { TRACE_ITER_CONTEXT_INFO = 0x20000, /* Print pid/cpu/time */ TRACE_ITER_LATENCY_FMT = 0x40000, TRACE_ITER_GLOBAL_CLK = 0x80000, - TRACE_ITER_SLEEP_TIME = 0x100000, }; /* diff --git a/trunk/kernel/trace/trace_clock.c b/trunk/kernel/trace/trace_clock.c index b588fd81f7f9..05b176abfd30 100644 --- a/trunk/kernel/trace/trace_clock.c +++ b/trunk/kernel/trace/trace_clock.c @@ -18,7 +18,6 @@ #include #include #include -#include /* * trace_clock_local(): the simplest and least coherent tracing clock. diff --git a/trunk/kernel/trace/trace_functions_graph.c b/trunk/kernel/trace/trace_functions_graph.c index d28687e7b3a7..e876816fa8e7 100644 --- a/trunk/kernel/trace/trace_functions_graph.c +++ b/trunk/kernel/trace/trace_functions_graph.c @@ -57,9 +57,9 @@ static struct tracer_flags tracer_flags = { /* Add a function return address to the trace stack on thread info.*/ int -ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth) +ftrace_push_return_trace(unsigned long ret, unsigned long long time, + unsigned long func, int *depth) { - unsigned long long calltime; int index; if (!current->ret_stack) @@ -71,13 +71,11 @@ ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth) return -EBUSY; } - calltime = trace_clock_local(); - index = ++current->curr_ret_stack; barrier(); current->ret_stack[index].ret = ret; current->ret_stack[index].func = func; - current->ret_stack[index].calltime = calltime; + current->ret_stack[index].calltime = time; *depth = index; return 0; diff --git a/trunk/kernel/trace/trace_output.c b/trunk/kernel/trace/trace_output.c index d72b9a63b247..19261fdd2455 100644 --- a/trunk/kernel/trace/trace_output.c +++ b/trunk/kernel/trace/trace_output.c @@ -137,7 +137,7 @@ int trace_seq_putc(struct trace_seq *s, unsigned char c) return 1; } -int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len) +int trace_seq_putmem(struct trace_seq *s, void *mem, size_t len) { if (len > ((PAGE_SIZE - 1) - s->len)) return 0; @@ -148,10 +148,10 @@ int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len) return len; } -int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, size_t len) +int trace_seq_putmem_hex(struct trace_seq *s, void *mem, size_t len) { unsigned char hex[HEX_CHARS]; - const unsigned char *data = mem; + unsigned char *data = mem; int i, j; #ifdef __BIG_ENDIAN @@ -167,19 +167,6 @@ int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, size_t len) return trace_seq_putmem(s, hex, j); } -void *trace_seq_reserve(struct trace_seq *s, size_t len) -{ - void *ret; - - if (len > ((PAGE_SIZE - 1) - s->len)) - return NULL; - - ret = s->buffer + s->len; - s->len += len; - - return ret; -} - int trace_seq_path(struct trace_seq *s, struct path *path) { unsigned char *p; diff --git a/trunk/kernel/trace/trace_output.h b/trunk/kernel/trace/trace_output.h index e0bde39c2dd9..35c422fb51a9 100644 --- a/trunk/kernel/trace/trace_output.h +++ b/trunk/kernel/trace/trace_output.h @@ -29,27 +29,24 @@ seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags); extern ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt); -extern int trace_seq_puts(struct trace_seq *s, const char *str); -extern int trace_seq_putc(struct trace_seq *s, unsigned char c); -extern int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len); -extern int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, - size_t len); -extern void *trace_seq_reserve(struct trace_seq *s, size_t len); -extern int trace_seq_path(struct trace_seq *s, struct path *path); -extern int seq_print_userip_objs(const struct userstack_entry *entry, - struct trace_seq *s, unsigned long sym_flags); -extern int seq_print_user_ip(struct trace_seq *s, struct mm_struct *mm, - unsigned long ip, unsigned long sym_flags); +int trace_seq_puts(struct trace_seq *s, const char *str); +int trace_seq_putc(struct trace_seq *s, unsigned char c); +int trace_seq_putmem(struct trace_seq *s, void *mem, size_t len); +int trace_seq_putmem_hex(struct trace_seq *s, void *mem, size_t len); +int trace_seq_path(struct trace_seq *s, struct path *path); +int seq_print_userip_objs(const struct userstack_entry *entry, + struct trace_seq *s, unsigned long sym_flags); +int seq_print_user_ip(struct trace_seq *s, struct mm_struct *mm, + unsigned long ip, unsigned long sym_flags); -extern int trace_print_context(struct trace_iterator *iter); -extern int trace_print_lat_context(struct trace_iterator *iter); +int trace_print_context(struct trace_iterator *iter); +int trace_print_lat_context(struct trace_iterator *iter); -extern struct trace_event *ftrace_find_event(int type); -extern int register_ftrace_event(struct trace_event *event); -extern int unregister_ftrace_event(struct trace_event *event); +struct trace_event *ftrace_find_event(int type); +int register_ftrace_event(struct trace_event *event); +int unregister_ftrace_event(struct trace_event *event); -extern enum print_line_t trace_nop_print(struct trace_iterator *iter, - int flags); +enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags); #define MAX_MEMHEX_BYTES 8 #define HEX_CHARS (MAX_MEMHEX_BYTES*2 + 1) diff --git a/trunk/kernel/trace/trace_stat.c b/trunk/kernel/trace/trace_stat.c index acdebd771a93..39310e3434ee 100644 --- a/trunk/kernel/trace/trace_stat.c +++ b/trunk/kernel/trace/trace_stat.c @@ -75,7 +75,7 @@ static int stat_seq_init(struct tracer_stat_session *session) { struct trace_stat_list *iter_entry, *new_entry; struct tracer_stat *ts = session->ts; - void *stat; + void *prev_stat; int ret = 0; int i; @@ -85,10 +85,6 @@ static int stat_seq_init(struct tracer_stat_session *session) if (!ts->stat_cmp) ts->stat_cmp = dummy_cmp; - stat = ts->stat_start(); - if (!stat) - goto exit; - /* * The first entry. Actually this is the second, but the first * one (the stat_list head) is pointless. @@ -103,19 +99,14 @@ static int stat_seq_init(struct tracer_stat_session *session) list_add(&new_entry->list, &session->stat_list); - new_entry->stat = stat; + new_entry->stat = ts->stat_start(); + prev_stat = new_entry->stat; /* * Iterate over the tracer stat entries and store them in a sorted * list. */ for (i = 1; ; i++) { - stat = ts->stat_next(stat, i); - - /* End of insertion */ - if (!stat) - break; - new_entry = kmalloc(sizeof(struct trace_stat_list), GFP_KERNEL); if (!new_entry) { ret = -ENOMEM; @@ -123,23 +114,31 @@ static int stat_seq_init(struct tracer_stat_session *session) } INIT_LIST_HEAD(&new_entry->list); - new_entry->stat = stat; + new_entry->stat = ts->stat_next(prev_stat, i); - list_for_each_entry_reverse(iter_entry, &session->stat_list, - list) { + /* End of insertion */ + if (!new_entry->stat) + break; + + list_for_each_entry(iter_entry, &session->stat_list, list) { /* Insertion with a descendent sorting */ - if (ts->stat_cmp(iter_entry->stat, - new_entry->stat) >= 0) { + if (ts->stat_cmp(new_entry->stat, + iter_entry->stat) > 0) { + + list_add_tail(&new_entry->list, + &iter_entry->list); + break; + /* The current smaller value */ + } else if (list_is_last(&iter_entry->list, + &session->stat_list)) { list_add(&new_entry->list, &iter_entry->list); break; } } - /* The current larger value */ - if (list_empty(&new_entry->list)) - list_add(&new_entry->list, &session->stat_list); + prev_stat = new_entry->stat; } exit: mutex_unlock(&session->stat_mutex); @@ -161,7 +160,7 @@ static void *stat_seq_start(struct seq_file *s, loff_t *pos) /* If we are in the beginning of the file, print the headers */ if (!*pos && session->ts->stat_headers) - return SEQ_START_TOKEN; + session->ts->stat_headers(s); return seq_list_start(&session->stat_list, *pos); } @@ -170,9 +169,6 @@ static void *stat_seq_next(struct seq_file *s, void *p, loff_t *pos) { struct tracer_stat_session *session = s->private; - if (p == SEQ_START_TOKEN) - return seq_list_start(&session->stat_list, *pos); - return seq_list_next(p, &session->stat_list, pos); } @@ -187,9 +183,6 @@ static int stat_seq_show(struct seq_file *s, void *v) struct tracer_stat_session *session = s->private; struct trace_stat_list *l = list_entry(v, struct trace_stat_list, list); - if (v == SEQ_START_TOKEN) - return session->ts->stat_headers(s); - return session->ts->stat_show(s, l->stat); } diff --git a/trunk/kernel/trace/trace_workqueue.c b/trunk/kernel/trace/trace_workqueue.c index 797201e4a137..9ab035b58cf1 100644 --- a/trunk/kernel/trace/trace_workqueue.c +++ b/trunk/kernel/trace/trace_workqueue.c @@ -196,11 +196,6 @@ static int workqueue_stat_show(struct seq_file *s, void *p) struct pid *pid; struct task_struct *tsk; - spin_lock_irqsave(&workqueue_cpu_stat(cpu)->lock, flags); - if (&cws->list == workqueue_cpu_stat(cpu)->list.next) - seq_printf(s, "\n"); - spin_unlock_irqrestore(&workqueue_cpu_stat(cpu)->lock, flags); - pid = find_get_pid(cws->pid); if (pid) { tsk = get_pid_task(pid, PIDTYPE_PID); @@ -213,13 +208,18 @@ static int workqueue_stat_show(struct seq_file *s, void *p) put_pid(pid); } + spin_lock_irqsave(&workqueue_cpu_stat(cpu)->lock, flags); + if (&cws->list == workqueue_cpu_stat(cpu)->list.next) + seq_printf(s, "\n"); + spin_unlock_irqrestore(&workqueue_cpu_stat(cpu)->lock, flags); + return 0; } static int workqueue_stat_headers(struct seq_file *s) { seq_printf(s, "# CPU INSERTED EXECUTED NAME\n"); - seq_printf(s, "# | | | |\n"); + seq_printf(s, "# | | | |\n\n"); return 0; }