summaryrefslogtreecommitdiff
path: root/target/linux/orion/patches/001-latencytop_support.patch
diff options
context:
space:
mode:
authorImre Kaloz <kaloz@openwrt.org>2008-06-04 13:51:17 +0000
committerImre Kaloz <kaloz@openwrt.org>2008-06-04 13:51:17 +0000
commit7bb65fb9d7860faa4b9b1e07790fb5823a0249e2 (patch)
tree701aabf12d94bdeddafbf8d328dee2492eef9ad5 /target/linux/orion/patches/001-latencytop_support.patch
parent0244e57bb9fb9ebd1dd224bd5789ad9cc24b0175 (diff)
downloadmtk-20170518-7bb65fb9d7860faa4b9b1e07790fb5823a0249e2.zip
mtk-20170518-7bb65fb9d7860faa4b9b1e07790fb5823a0249e2.tar.gz
mtk-20170518-7bb65fb9d7860faa4b9b1e07790fb5823a0249e2.tar.bz2
add preliminary Marvell Orion support
SVN-Revision: 11352
Diffstat (limited to 'target/linux/orion/patches/001-latencytop_support.patch')
-rw-r--r--target/linux/orion/patches/001-latencytop_support.patch82
1 files changed, 82 insertions, 0 deletions
diff --git a/target/linux/orion/patches/001-latencytop_support.patch b/target/linux/orion/patches/001-latencytop_support.patch
new file mode 100644
index 0000000..a1fbc17
--- /dev/null
+++ b/target/linux/orion/patches/001-latencytop_support.patch
@@ -0,0 +1,82 @@
+From: Nicolas Pitre <nico@cam.org>
+
+Signed-off-by: Nicolas Pitre <nico@marvell.com>
+Tested-by: Lennert Buytenhek <buytenh@marvell.com>
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/Kconfig | 4 ++++
+ arch/arm/kernel/stacktrace.c | 26 ++++++++++++++++++++++----
+ 2 files changed, 26 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -84,6 +84,10 @@
+ bool
+ default y
+
++config HAVE_LATENCYTOP_SUPPORT
++ bool
++ default y
++
+ config LOCKDEP_SUPPORT
+ bool
+ default y
+--- a/arch/arm/kernel/stacktrace.c
++++ b/arch/arm/kernel/stacktrace.c
+@@ -36,6 +36,7 @@
+ #ifdef CONFIG_STACKTRACE
+ struct stack_trace_data {
+ struct stack_trace *trace;
++ unsigned int no_sched_functions;
+ unsigned int skip;
+ };
+
+@@ -43,27 +44,44 @@
+ {
+ struct stack_trace_data *data = d;
+ struct stack_trace *trace = data->trace;
++ unsigned long addr = frame->lr;
+
++ if (data->no_sched_functions && in_sched_functions(addr))
++ return 0;
+ if (data->skip) {
+ data->skip--;
+ return 0;
+ }
+
+- trace->entries[trace->nr_entries++] = frame->lr;
++ trace->entries[trace->nr_entries++] = addr;
+
+ return trace->nr_entries >= trace->max_entries;
+ }
+
+-void save_stack_trace(struct stack_trace *trace)
++void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
+ {
+ struct stack_trace_data data;
+ unsigned long fp, base;
+
+ data.trace = trace;
+ data.skip = trace->skip;
+- base = (unsigned long)task_stack_page(current);
+- asm("mov %0, fp" : "=r" (fp));
++ base = (unsigned long)task_stack_page(tsk);
++
++ if (tsk != current) {
++ data.no_sched_functions = 1;
++ fp = thread_saved_fp(tsk);
++ } else {
++ data.no_sched_functions = 0;
++ asm("mov %0, fp" : "=r" (fp));
++ }
+
+ walk_stackframe(fp, base, base + THREAD_SIZE, save_trace, &data);
++ if (trace->nr_entries < trace->max_entries)
++ trace->entries[trace->nr_entries++] = ULONG_MAX;
++}
++
++void save_stack_trace(struct stack_trace *trace)
++{
++ save_stack_trace_tsk(current, trace);
+ }
+ #endif