Merge branch 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: branch tracer, intel-iommu: fix build with CONFIG_BRANCH_TRACER=y branch tracer: Fix for enabling branch profiling makes sparse unusable ftrace: Correct a text align for event format output Update /debug/tracing/README tracing/ftrace: alloc the started cpumask for the trace file tracing, x86: remove duplicated #include ftrace: Add check of sched_stopped for probe_sched_wakeup function-graph: add proper initialization for init task tracing/ftrace: fix missing include string.h tracing: fix incorrect return type of ns2usecs() tracing: remove CALLER_ADDR2 from wakeup tracer blktrace: fix pdu_len when tracing packet command requests blktrace: small cleanup in blk_msg_write() blktrace: NUL-terminate user space messages tracing: move scripts/trace/power.pl to scripts/tracing/power.pl
This commit is contained in:
Коммит
c93f216b5b
|
@ -20,7 +20,6 @@
|
|||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/ftrace.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <asm/nops.h>
|
||||
#include <asm/nmi.h>
|
||||
|
||||
|
|
|
@ -131,6 +131,7 @@ void blk_rq_init(struct request_queue *q, struct request *rq)
|
|||
INIT_HLIST_NODE(&rq->hash);
|
||||
RB_CLEAR_NODE(&rq->rb_node);
|
||||
rq->cmd = rq->__cmd;
|
||||
rq->cmd_len = BLK_MAX_CDB;
|
||||
rq->tag = -1;
|
||||
rq->ref_count = 1;
|
||||
}
|
||||
|
|
|
@ -76,7 +76,8 @@ struct ftrace_branch_data {
|
|||
* Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
|
||||
* to disable branch tracing on a per file basis.
|
||||
*/
|
||||
#if defined(CONFIG_TRACE_BRANCH_PROFILING) && !defined(DISABLE_BRANCH_PROFILING)
|
||||
#if defined(CONFIG_TRACE_BRANCH_PROFILING) \
|
||||
&& !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__)
|
||||
void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||
|
||||
#define likely_notrace(x) __builtin_expect(!!(x), 1)
|
||||
|
|
|
@ -356,6 +356,9 @@ struct ftrace_graph_ret {
|
|||
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
|
||||
/* for init task */
|
||||
#define INIT_FTRACE_GRAPH .ret_stack = NULL
|
||||
|
||||
/*
|
||||
* Stack of return addresses for functions
|
||||
* of a thread.
|
||||
|
@ -430,10 +433,11 @@ static inline void unpause_graph_tracing(void)
|
|||
{
|
||||
atomic_dec(¤t->tracing_graph_pause);
|
||||
}
|
||||
#else
|
||||
#else /* !CONFIG_FUNCTION_GRAPH_TRACER */
|
||||
|
||||
#define __notrace_funcgraph
|
||||
#define __irq_entry
|
||||
#define INIT_FTRACE_GRAPH
|
||||
|
||||
static inline void ftrace_graph_init_task(struct task_struct *t) { }
|
||||
static inline void ftrace_graph_exit_task(struct task_struct *t) { }
|
||||
|
@ -445,7 +449,7 @@ static inline int task_curr_ret_stack(struct task_struct *tsk)
|
|||
|
||||
static inline void pause_graph_tracing(void) { }
|
||||
static inline void unpause_graph_tracing(void) { }
|
||||
#endif
|
||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||
|
||||
#ifdef CONFIG_TRACING
|
||||
#include <linux/sched.h>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <linux/irqflags.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/ipc.h>
|
||||
#include <linux/pid_namespace.h>
|
||||
#include <linux/user_namespace.h>
|
||||
|
@ -185,6 +186,7 @@ extern struct cred init_cred;
|
|||
INIT_IDS \
|
||||
INIT_TRACE_IRQFLAGS \
|
||||
INIT_LOCKDEP \
|
||||
INIT_FTRACE_GRAPH \
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -327,10 +327,10 @@ static ssize_t blk_msg_write(struct file *filp, const char __user *buffer,
|
|||
char *msg;
|
||||
struct blk_trace *bt;
|
||||
|
||||
if (count > BLK_TN_MAX_MSG)
|
||||
if (count >= BLK_TN_MAX_MSG)
|
||||
return -EINVAL;
|
||||
|
||||
msg = kmalloc(count, GFP_KERNEL);
|
||||
msg = kmalloc(count + 1, GFP_KERNEL);
|
||||
if (msg == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -339,6 +339,7 @@ static ssize_t blk_msg_write(struct file *filp, const char __user *buffer,
|
|||
return -EFAULT;
|
||||
}
|
||||
|
||||
msg[count] = '\0';
|
||||
bt = filp->private_data;
|
||||
__trace_note_message(bt, "%s", msg);
|
||||
kfree(msg);
|
||||
|
@ -642,7 +643,7 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq,
|
|||
if (blk_pc_request(rq)) {
|
||||
what |= BLK_TC_ACT(BLK_TC_PC);
|
||||
__blk_add_trace(bt, 0, rq->data_len, rw, what, rq->errors,
|
||||
sizeof(rq->cmd), rq->cmd);
|
||||
rq->cmd_len, rq->cmd);
|
||||
} else {
|
||||
what |= BLK_TC_ACT(BLK_TC_FS);
|
||||
__blk_add_trace(bt, rq->hard_sector, rq->hard_nr_sectors << 9,
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/percpu.h>
|
||||
#include <linux/splice.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/poll.h>
|
||||
|
@ -147,8 +148,7 @@ static int __init set_ftrace_dump_on_oops(char *str)
|
|||
}
|
||||
__setup("ftrace_dump_on_oops", set_ftrace_dump_on_oops);
|
||||
|
||||
long
|
||||
ns2usecs(cycle_t nsec)
|
||||
unsigned long long ns2usecs(cycle_t nsec)
|
||||
{
|
||||
nsec += 500;
|
||||
do_div(nsec, 1000);
|
||||
|
@ -1632,7 +1632,11 @@ static void test_cpu_buff_start(struct trace_iterator *iter)
|
|||
return;
|
||||
|
||||
cpumask_set_cpu(iter->cpu, iter->started);
|
||||
trace_seq_printf(s, "##### CPU %u buffer started ####\n", iter->cpu);
|
||||
|
||||
/* Don't print started cpu buffer for the first entry of the trace */
|
||||
if (iter->idx > 1)
|
||||
trace_seq_printf(s, "##### CPU %u buffer started ####\n",
|
||||
iter->cpu);
|
||||
}
|
||||
|
||||
static enum print_line_t print_trace_fmt(struct trace_iterator *iter)
|
||||
|
@ -1867,6 +1871,11 @@ __tracing_open(struct inode *inode, struct file *file)
|
|||
if (current_trace)
|
||||
*iter->trace = *current_trace;
|
||||
|
||||
if (!alloc_cpumask_var(&iter->started, GFP_KERNEL))
|
||||
goto fail;
|
||||
|
||||
cpumask_clear(iter->started);
|
||||
|
||||
if (current_trace && current_trace->print_max)
|
||||
iter->tr = &max_tr;
|
||||
else
|
||||
|
@ -1917,6 +1926,7 @@ __tracing_open(struct inode *inode, struct file *file)
|
|||
if (iter->buffer_iter[cpu])
|
||||
ring_buffer_read_finish(iter->buffer_iter[cpu]);
|
||||
}
|
||||
free_cpumask_var(iter->started);
|
||||
fail:
|
||||
mutex_unlock(&trace_types_lock);
|
||||
kfree(iter->trace);
|
||||
|
@ -1960,6 +1970,7 @@ static int tracing_release(struct inode *inode, struct file *file)
|
|||
|
||||
seq_release(inode, file);
|
||||
mutex_destroy(&iter->mutex);
|
||||
free_cpumask_var(iter->started);
|
||||
kfree(iter->trace);
|
||||
kfree(iter);
|
||||
return 0;
|
||||
|
@ -2358,9 +2369,9 @@ static const char readme_msg[] =
|
|||
"# mkdir /debug\n"
|
||||
"# mount -t debugfs nodev /debug\n\n"
|
||||
"# cat /debug/tracing/available_tracers\n"
|
||||
"wakeup preemptirqsoff preemptoff irqsoff ftrace sched_switch none\n\n"
|
||||
"wakeup preemptirqsoff preemptoff irqsoff function sched_switch nop\n\n"
|
||||
"# cat /debug/tracing/current_tracer\n"
|
||||
"none\n"
|
||||
"nop\n"
|
||||
"# echo sched_switch > /debug/tracing/current_tracer\n"
|
||||
"# cat /debug/tracing/current_tracer\n"
|
||||
"sched_switch\n"
|
||||
|
|
|
@ -602,7 +602,7 @@ extern int trace_selftest_startup_branch(struct tracer *trace,
|
|||
#endif /* CONFIG_FTRACE_STARTUP_TEST */
|
||||
|
||||
extern void *head_page(struct trace_array_cpu *data);
|
||||
extern long ns2usecs(cycle_t nsec);
|
||||
extern unsigned long long ns2usecs(cycle_t nsec);
|
||||
extern int
|
||||
trace_vbprintk(unsigned long ip, const char *fmt, va_list args);
|
||||
extern int
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
#undef TRACE_FIELD_ZERO_CHAR
|
||||
#define TRACE_FIELD_ZERO_CHAR(item) \
|
||||
ret = trace_seq_printf(s, "\tfield: char " #item ";\t" \
|
||||
ret = trace_seq_printf(s, "\tfield:char " #item ";\t" \
|
||||
"offset:%u;\tsize:0;\n", \
|
||||
(unsigned int)offsetof(typeof(field), item)); \
|
||||
if (!ret) \
|
||||
|
|
|
@ -423,7 +423,7 @@ int trace_print_lat_context(struct trace_iterator *iter)
|
|||
|
||||
trace_find_cmdline(entry->pid, comm);
|
||||
|
||||
ret = trace_seq_printf(s, "%16s %5d %3d %d %08x %08lx [%08lx]"
|
||||
ret = trace_seq_printf(s, "%16s %5d %3d %d %08x %08lx [%08llx]"
|
||||
" %ld.%03ldms (+%ld.%03ldms): ", comm,
|
||||
entry->pid, iter->cpu, entry->flags,
|
||||
entry->preempt_count, iter->idx,
|
||||
|
|
|
@ -62,6 +62,9 @@ probe_sched_wakeup(struct rq *__rq, struct task_struct *wakee, int success)
|
|||
pc = preempt_count();
|
||||
tracing_record_cmdline(current);
|
||||
|
||||
if (sched_stopped)
|
||||
return;
|
||||
|
||||
local_irq_save(flags);
|
||||
cpu = raw_smp_processor_id();
|
||||
data = ctx_trace->data[cpu];
|
||||
|
|
|
@ -154,7 +154,7 @@ probe_wakeup_sched_switch(struct rq *rq, struct task_struct *prev,
|
|||
if (unlikely(!tracer_enabled || next != wakeup_task))
|
||||
goto out_unlock;
|
||||
|
||||
trace_function(wakeup_trace, CALLER_ADDR1, CALLER_ADDR2, flags, pc);
|
||||
trace_function(wakeup_trace, CALLER_ADDR0, CALLER_ADDR1, flags, pc);
|
||||
tracing_sched_switch_trace(wakeup_trace, prev, next, flags, pc);
|
||||
|
||||
/*
|
||||
|
@ -257,6 +257,12 @@ probe_wakeup(struct rq *rq, struct task_struct *p, int success)
|
|||
data = wakeup_trace->data[wakeup_cpu];
|
||||
data->preempt_timestamp = ftrace_now(cpu);
|
||||
tracing_sched_wakeup_trace(wakeup_trace, p, current, flags, pc);
|
||||
|
||||
/*
|
||||
* We must be careful in using CALLER_ADDR2. But since wake_up
|
||||
* is not called by an assembly function (where as schedule is)
|
||||
* it should be safe to use it here.
|
||||
*/
|
||||
trace_function(wakeup_trace, CALLER_ADDR1, CALLER_ADDR2, flags, pc);
|
||||
|
||||
out_locked:
|
||||
|
|
Загрузка…
Ссылка в новой задаче