diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2010-06-29 13:34:05 -0400 |
---|---|---|
committer | Frederic Weisbecker <fweisbec@gmail.com> | 2010-08-18 19:30:11 -0400 |
commit | 70791ce9ba68a5921c9905ef05d23f62a90bc10c (patch) | |
tree | 9711ff02cb910e1d8709c09512dbe7e94224bdd8 /arch/sparc/kernel/perf_event.c | |
parent | c1a65932fd7216fdc9a0db8bbffe1d47842f862c (diff) |
perf: Generalize callchain_store()
callchain_store() is the same on every archs, inline it in
perf_event.h and rename it to perf_callchain_store() to avoid
any collision.
This removes repetitive code.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Acked-by: Paul Mackerras <paulus@samba.org>
Tested-by: Will Deacon <will.deacon@arm.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: David Miller <davem@davemloft.net>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Borislav Petkov <bp@amd64.org>
Diffstat (limited to 'arch/sparc/kernel/perf_event.c')
-rw-r--r-- | arch/sparc/kernel/perf_event.c | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c index 357ced3c33ff..2a95a9079862 100644 --- a/arch/sparc/kernel/perf_event.c +++ b/arch/sparc/kernel/perf_event.c | |||
@@ -1283,12 +1283,6 @@ void __init init_hw_perf_events(void) | |||
1283 | register_die_notifier(&perf_event_nmi_notifier); | 1283 | register_die_notifier(&perf_event_nmi_notifier); |
1284 | } | 1284 | } |
1285 | 1285 | ||
1286 | static inline void callchain_store(struct perf_callchain_entry *entry, u64 ip) | ||
1287 | { | ||
1288 | if (entry->nr < PERF_MAX_STACK_DEPTH) | ||
1289 | entry->ip[entry->nr++] = ip; | ||
1290 | } | ||
1291 | |||
1292 | static void perf_callchain_kernel(struct pt_regs *regs, | 1286 | static void perf_callchain_kernel(struct pt_regs *regs, |
1293 | struct perf_callchain_entry *entry) | 1287 | struct perf_callchain_entry *entry) |
1294 | { | 1288 | { |
@@ -1297,8 +1291,8 @@ static void perf_callchain_kernel(struct pt_regs *regs, | |||
1297 | int graph = 0; | 1291 | int graph = 0; |
1298 | #endif | 1292 | #endif |
1299 | 1293 | ||
1300 | callchain_store(entry, PERF_CONTEXT_KERNEL); | 1294 | perf_callchain_store(entry, PERF_CONTEXT_KERNEL); |
1301 | callchain_store(entry, regs->tpc); | 1295 | perf_callchain_store(entry, regs->tpc); |
1302 | 1296 | ||
1303 | ksp = regs->u_regs[UREG_I6]; | 1297 | ksp = regs->u_regs[UREG_I6]; |
1304 | fp = ksp + STACK_BIAS; | 1298 | fp = ksp + STACK_BIAS; |
@@ -1322,13 +1316,13 @@ static void perf_callchain_kernel(struct pt_regs *regs, | |||
1322 | pc = sf->callers_pc; | 1316 | pc = sf->callers_pc; |
1323 | fp = (unsigned long)sf->fp + STACK_BIAS; | 1317 | fp = (unsigned long)sf->fp + STACK_BIAS; |
1324 | } | 1318 | } |
1325 | callchain_store(entry, pc); | 1319 | perf_callchain_store(entry, pc); |
1326 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 1320 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
1327 | if ((pc + 8UL) == (unsigned long) &return_to_handler) { | 1321 | if ((pc + 8UL) == (unsigned long) &return_to_handler) { |
1328 | int index = current->curr_ret_stack; | 1322 | int index = current->curr_ret_stack; |
1329 | if (current->ret_stack && index >= graph) { | 1323 | if (current->ret_stack && index >= graph) { |
1330 | pc = current->ret_stack[index - graph].ret; | 1324 | pc = current->ret_stack[index - graph].ret; |
1331 | callchain_store(entry, pc); | 1325 | perf_callchain_store(entry, pc); |
1332 | graph++; | 1326 | graph++; |
1333 | } | 1327 | } |
1334 | } | 1328 | } |
@@ -1341,8 +1335,8 @@ static void perf_callchain_user_64(struct pt_regs *regs, | |||
1341 | { | 1335 | { |
1342 | unsigned long ufp; | 1336 | unsigned long ufp; |
1343 | 1337 | ||
1344 | callchain_store(entry, PERF_CONTEXT_USER); | 1338 | perf_callchain_store(entry, PERF_CONTEXT_USER); |
1345 | callchain_store(entry, regs->tpc); | 1339 | perf_callchain_store(entry, regs->tpc); |
1346 | 1340 | ||
1347 | ufp = regs->u_regs[UREG_I6] + STACK_BIAS; | 1341 | ufp = regs->u_regs[UREG_I6] + STACK_BIAS; |
1348 | do { | 1342 | do { |
@@ -1355,7 +1349,7 @@ static void perf_callchain_user_64(struct pt_regs *regs, | |||
1355 | 1349 | ||
1356 | pc = sf.callers_pc; | 1350 | pc = sf.callers_pc; |
1357 | ufp = (unsigned long)sf.fp + STACK_BIAS; | 1351 | ufp = (unsigned long)sf.fp + STACK_BIAS; |
1358 | callchain_store(entry, pc); | 1352 | perf_callchain_store(entry, pc); |
1359 | } while (entry->nr < PERF_MAX_STACK_DEPTH); | 1353 | } while (entry->nr < PERF_MAX_STACK_DEPTH); |
1360 | } | 1354 | } |
1361 | 1355 | ||
@@ -1364,8 +1358,8 @@ static void perf_callchain_user_32(struct pt_regs *regs, | |||
1364 | { | 1358 | { |
1365 | unsigned long ufp; | 1359 | unsigned long ufp; |
1366 | 1360 | ||
1367 | callchain_store(entry, PERF_CONTEXT_USER); | 1361 | perf_callchain_store(entry, PERF_CONTEXT_USER); |
1368 | callchain_store(entry, regs->tpc); | 1362 | perf_callchain_store(entry, regs->tpc); |
1369 | 1363 | ||
1370 | ufp = regs->u_regs[UREG_I6] & 0xffffffffUL; | 1364 | ufp = regs->u_regs[UREG_I6] & 0xffffffffUL; |
1371 | do { | 1365 | do { |
@@ -1378,7 +1372,7 @@ static void perf_callchain_user_32(struct pt_regs *regs, | |||
1378 | 1372 | ||
1379 | pc = sf.callers_pc; | 1373 | pc = sf.callers_pc; |
1380 | ufp = (unsigned long)sf.fp; | 1374 | ufp = (unsigned long)sf.fp; |
1381 | callchain_store(entry, pc); | 1375 | perf_callchain_store(entry, pc); |
1382 | } while (entry->nr < PERF_MAX_STACK_DEPTH); | 1376 | } while (entry->nr < PERF_MAX_STACK_DEPTH); |
1383 | } | 1377 | } |
1384 | 1378 | ||