aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/kernel/perf_event.c
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2010-06-29 13:34:05 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2010-08-18 19:30:11 -0400
commit70791ce9ba68a5921c9905ef05d23f62a90bc10c (patch)
tree9711ff02cb910e1d8709c09512dbe7e94224bdd8 /arch/sparc/kernel/perf_event.c
parentc1a65932fd7216fdc9a0db8bbffe1d47842f862c (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.c26
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
1286static 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
1292static void perf_callchain_kernel(struct pt_regs *regs, 1286static 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