Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf callchain: Move cpumode resolve code to add_callchain_ip

Using flag to distinguish between branch_history and normal callchain.

Move the cpumode to add_callchain_ip function.

No change in behavior.

Signed-off-by: Kan Liang <kan.liang@intel.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1417532814-26208-3-git-send-email-kan.liang@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Kan Liang and committed by
Arnaldo Carvalho de Melo
2e77784b f70b4e39

+35 -37
+35 -37
tools/perf/util/machine.c
··· 1385 1385 static int add_callchain_ip(struct thread *thread, 1386 1386 struct symbol **parent, 1387 1387 struct addr_location *root_al, 1388 - int cpumode, 1388 + bool branch_history, 1389 1389 u64 ip) 1390 1390 { 1391 1391 struct addr_location al; 1392 1392 1393 1393 al.filtered = 0; 1394 1394 al.sym = NULL; 1395 - if (cpumode == -1) 1395 + if (branch_history) 1396 1396 thread__find_cpumode_addr_location(thread, MAP__FUNCTION, 1397 1397 ip, &al); 1398 - else 1398 + else { 1399 + u8 cpumode = PERF_RECORD_MISC_USER; 1400 + 1401 + if (ip >= PERF_CONTEXT_MAX) { 1402 + switch (ip) { 1403 + case PERF_CONTEXT_HV: 1404 + cpumode = PERF_RECORD_MISC_HYPERVISOR; 1405 + break; 1406 + case PERF_CONTEXT_KERNEL: 1407 + cpumode = PERF_RECORD_MISC_KERNEL; 1408 + break; 1409 + case PERF_CONTEXT_USER: 1410 + cpumode = PERF_RECORD_MISC_USER; 1411 + break; 1412 + default: 1413 + pr_debug("invalid callchain context: " 1414 + "%"PRId64"\n", (s64) ip); 1415 + /* 1416 + * It seems the callchain is corrupted. 1417 + * Discard all. 1418 + */ 1419 + callchain_cursor_reset(&callchain_cursor); 1420 + return 1; 1421 + } 1422 + return 0; 1423 + } 1399 1424 thread__find_addr_location(thread, cpumode, MAP__FUNCTION, 1400 1425 ip, &al); 1426 + } 1427 + 1401 1428 if (al.sym != NULL) { 1402 1429 if (sort__has_parent && !*parent && 1403 1430 symbol__match_regex(al.sym, &parent_regex)) ··· 1507 1480 struct addr_location *root_al, 1508 1481 int max_stack) 1509 1482 { 1510 - u8 cpumode = PERF_RECORD_MISC_USER; 1511 1483 int chain_nr = min(max_stack, (int)chain->nr); 1512 - int i; 1513 - int j; 1514 - int err; 1484 + int i, j, err; 1515 1485 int skip_idx = -1; 1516 1486 int first_call = 0; 1517 1487 ··· 1566 1542 1567 1543 for (i = 0; i < nr; i++) { 1568 1544 err = add_callchain_ip(thread, parent, root_al, 1569 - -1, be[i].to); 1545 + true, be[i].to); 1570 1546 if (!err) 1571 1547 err = add_callchain_ip(thread, parent, root_al, 1572 - -1, be[i].from); 1548 + true, be[i].from); 1573 1549 if (err == -EINVAL) 1574 1550 break; 1575 1551 if (err) ··· 1598 1574 #endif 1599 1575 ip = chain->ips[j]; 1600 1576 1601 - if (ip >= PERF_CONTEXT_MAX) { 1602 - switch (ip) { 1603 - case PERF_CONTEXT_HV: 1604 - cpumode = PERF_RECORD_MISC_HYPERVISOR; 1605 - break; 1606 - case PERF_CONTEXT_KERNEL: 1607 - cpumode = PERF_RECORD_MISC_KERNEL; 1608 - break; 1609 - case PERF_CONTEXT_USER: 1610 - cpumode = PERF_RECORD_MISC_USER; 1611 - break; 1612 - default: 1613 - pr_debug("invalid callchain context: " 1614 - "%"PRId64"\n", (s64) ip); 1615 - /* 1616 - * It seems the callchain is corrupted. 1617 - * Discard all. 1618 - */ 1619 - callchain_cursor_reset(&callchain_cursor); 1620 - return 0; 1621 - } 1622 - continue; 1623 - } 1577 + err = add_callchain_ip(thread, parent, root_al, false, ip); 1624 1578 1625 - err = add_callchain_ip(thread, parent, root_al, 1626 - cpumode, ip); 1627 - if (err == -EINVAL) 1628 - break; 1629 1579 if (err) 1630 - return err; 1580 + return (err < 0) ? err : 0; 1631 1581 } 1632 1582 1633 1583 return 0;