mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2025-04-21 12:27:27 +03:00
add preliminary Marvell Orion support
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@11352 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
82
target/linux/orion/patches/001-latencytop_support.patch
Normal file
82
target/linux/orion/patches/001-latencytop_support.patch
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user