diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-05-12 15:21:02 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2008-05-23 16:01:13 -0400 |
| commit | a4feb8348b62fe76a63cdb5569f5c920f5283c06 (patch) | |
| tree | 029d0a5f2f581e823399df42d1bdb64bcbe64c0e /kernel/trace | |
| parent | 9fe068e92f6290e89e19adc521441661a1229f00 (diff) | |
ftrace: special stacktrace
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/trace.c | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index ca0d6ff74c11..c232d8248a09 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -808,29 +808,6 @@ ftrace(struct trace_array *tr, struct trace_array_cpu *data, | |||
| 808 | trace_function(tr, data, ip, parent_ip, flags); | 808 | trace_function(tr, data, ip, parent_ip, flags); |
| 809 | } | 809 | } |
| 810 | 810 | ||
| 811 | void | ||
| 812 | __trace_special(void *__tr, void *__data, | ||
| 813 | unsigned long arg1, unsigned long arg2, unsigned long arg3) | ||
| 814 | { | ||
| 815 | struct trace_array_cpu *data = __data; | ||
| 816 | struct trace_array *tr = __tr; | ||
| 817 | struct trace_entry *entry; | ||
| 818 | unsigned long irq_flags; | ||
| 819 | |||
| 820 | raw_local_irq_save(irq_flags); | ||
| 821 | __raw_spin_lock(&data->lock); | ||
| 822 | entry = tracing_get_trace_entry(tr, data); | ||
| 823 | tracing_generic_entry_update(entry, 0); | ||
| 824 | entry->type = TRACE_SPECIAL; | ||
| 825 | entry->special.arg1 = arg1; | ||
| 826 | entry->special.arg2 = arg2; | ||
| 827 | entry->special.arg3 = arg3; | ||
| 828 | __raw_spin_unlock(&data->lock); | ||
| 829 | raw_local_irq_restore(irq_flags); | ||
| 830 | |||
| 831 | trace_wake_up(); | ||
| 832 | } | ||
| 833 | |||
| 834 | void __trace_stack(struct trace_array *tr, | 811 | void __trace_stack(struct trace_array *tr, |
| 835 | struct trace_array_cpu *data, | 812 | struct trace_array_cpu *data, |
| 836 | unsigned long flags, | 813 | unsigned long flags, |
| @@ -857,6 +834,30 @@ void __trace_stack(struct trace_array *tr, | |||
| 857 | } | 834 | } |
| 858 | 835 | ||
| 859 | void | 836 | void |
| 837 | __trace_special(void *__tr, void *__data, | ||
| 838 | unsigned long arg1, unsigned long arg2, unsigned long arg3) | ||
| 839 | { | ||
| 840 | struct trace_array_cpu *data = __data; | ||
| 841 | struct trace_array *tr = __tr; | ||
| 842 | struct trace_entry *entry; | ||
| 843 | unsigned long irq_flags; | ||
| 844 | |||
| 845 | raw_local_irq_save(irq_flags); | ||
| 846 | __raw_spin_lock(&data->lock); | ||
| 847 | entry = tracing_get_trace_entry(tr, data); | ||
| 848 | tracing_generic_entry_update(entry, 0); | ||
| 849 | entry->type = TRACE_SPECIAL; | ||
| 850 | entry->special.arg1 = arg1; | ||
| 851 | entry->special.arg2 = arg2; | ||
| 852 | entry->special.arg3 = arg3; | ||
| 853 | __trace_stack(tr, data, irq_flags, 4); | ||
| 854 | __raw_spin_unlock(&data->lock); | ||
| 855 | raw_local_irq_restore(irq_flags); | ||
| 856 | |||
| 857 | trace_wake_up(); | ||
| 858 | } | ||
| 859 | |||
| 860 | void | ||
| 860 | tracing_sched_switch_trace(struct trace_array *tr, | 861 | tracing_sched_switch_trace(struct trace_array *tr, |
| 861 | struct trace_array_cpu *data, | 862 | struct trace_array_cpu *data, |
| 862 | struct task_struct *prev, | 863 | struct task_struct *prev, |
