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

Configure Feed

Select the types of activity you want to include in your feed.

perf lock: Add lock aggregation enum

Introduce the aggr_mode variable to prepare a later code change.

The default is LOCK_AGGR_ADDR which aggregates the result for the lock
instances.

When -t/--threads option is given, it'd be set to LOCK_AGGR_TASK. The
LOCK_AGGR_CALLER is for the contention analysis and it'd aggregate the
stat by comparing the callstacks.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Waiman Long <longman@redhat.com>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20220725183124.368304-3-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Namhyung Kim and committed by
Arnaldo Carvalho de Melo
f9c695a2 fb87158b

+94 -20
+94 -20
tools/perf/builtin-lock.c
··· 126 126 static bool combine_locks; 127 127 static bool show_thread_stats; 128 128 129 + static enum { 130 + LOCK_AGGR_ADDR, 131 + LOCK_AGGR_TASK, 132 + LOCK_AGGR_CALLER, 133 + } aggr_mode = LOCK_AGGR_ADDR; 134 + 129 135 /* 130 136 * CONTENTION_STACK_DEPTH 131 137 * Number of stack trace entries to find callers ··· 628 622 const char *name = evsel__strval(evsel, sample, "name"); 629 623 u64 addr = evsel__intval(evsel, sample, "lockdep_addr"); 630 624 int flag = evsel__intval(evsel, sample, "flags"); 625 + u64 key; 631 626 632 - /* abuse ls->addr for tid */ 633 - if (show_thread_stats) 634 - addr = sample->tid; 627 + switch (aggr_mode) { 628 + case LOCK_AGGR_ADDR: 629 + key = addr; 630 + break; 631 + case LOCK_AGGR_TASK: 632 + key = sample->tid; 633 + break; 634 + case LOCK_AGGR_CALLER: 635 + default: 636 + pr_err("Invalid aggregation mode: %d\n", aggr_mode); 637 + return -EINVAL; 638 + } 635 639 636 - ls = lock_stat_findnew(addr, name, 0); 640 + ls = lock_stat_findnew(key, name, 0); 637 641 if (!ls) 638 642 return -ENOMEM; 639 643 ··· 711 695 u64 contended_term; 712 696 const char *name = evsel__strval(evsel, sample, "name"); 713 697 u64 addr = evsel__intval(evsel, sample, "lockdep_addr"); 698 + u64 key; 714 699 715 - if (show_thread_stats) 716 - addr = sample->tid; 700 + switch (aggr_mode) { 701 + case LOCK_AGGR_ADDR: 702 + key = addr; 703 + break; 704 + case LOCK_AGGR_TASK: 705 + key = sample->tid; 706 + break; 707 + case LOCK_AGGR_CALLER: 708 + default: 709 + pr_err("Invalid aggregation mode: %d\n", aggr_mode); 710 + return -EINVAL; 711 + } 717 712 718 - ls = lock_stat_findnew(addr, name, 0); 713 + ls = lock_stat_findnew(key, name, 0); 719 714 if (!ls) 720 715 return -ENOMEM; 721 716 ··· 784 757 struct lock_seq_stat *seq; 785 758 const char *name = evsel__strval(evsel, sample, "name"); 786 759 u64 addr = evsel__intval(evsel, sample, "lockdep_addr"); 760 + u64 key; 787 761 788 - if (show_thread_stats) 789 - addr = sample->tid; 762 + switch (aggr_mode) { 763 + case LOCK_AGGR_ADDR: 764 + key = addr; 765 + break; 766 + case LOCK_AGGR_TASK: 767 + key = sample->tid; 768 + break; 769 + case LOCK_AGGR_CALLER: 770 + default: 771 + pr_err("Invalid aggregation mode: %d\n", aggr_mode); 772 + return -EINVAL; 773 + } 790 774 791 - ls = lock_stat_findnew(addr, name, 0); 775 + ls = lock_stat_findnew(key, name, 0); 792 776 if (!ls) 793 777 return -ENOMEM; 794 778 ··· 850 812 struct lock_seq_stat *seq; 851 813 const char *name = evsel__strval(evsel, sample, "name"); 852 814 u64 addr = evsel__intval(evsel, sample, "lockdep_addr"); 815 + u64 key; 853 816 854 - if (show_thread_stats) 855 - addr = sample->tid; 817 + switch (aggr_mode) { 818 + case LOCK_AGGR_ADDR: 819 + key = addr; 820 + break; 821 + case LOCK_AGGR_TASK: 822 + key = sample->tid; 823 + break; 824 + case LOCK_AGGR_CALLER: 825 + default: 826 + pr_err("Invalid aggregation mode: %d\n", aggr_mode); 827 + return -EINVAL; 828 + } 856 829 857 - ls = lock_stat_findnew(addr, name, 0); 830 + ls = lock_stat_findnew(key, name, 0); 858 831 if (!ls) 859 832 return -ENOMEM; 860 833 ··· 1029 980 struct thread_stat *ts; 1030 981 struct lock_seq_stat *seq; 1031 982 u64 addr = evsel__intval(evsel, sample, "lock_addr"); 983 + u64 key; 1032 984 1033 - if (show_thread_stats) 1034 - addr = sample->tid; 985 + switch (aggr_mode) { 986 + case LOCK_AGGR_ADDR: 987 + key = addr; 988 + break; 989 + case LOCK_AGGR_TASK: 990 + key = sample->tid; 991 + break; 992 + case LOCK_AGGR_CALLER: 993 + default: 994 + pr_err("Invalid aggregation mode: %d\n", aggr_mode); 995 + return -EINVAL; 996 + } 1035 997 1036 - ls = lock_stat_find(addr); 998 + ls = lock_stat_find(key); 1037 999 if (!ls) { 1038 1000 char buf[128]; 1039 1001 const char *caller = buf; ··· 1053 993 if (lock_contention_caller(evsel, sample, buf, sizeof(buf)) < 0) 1054 994 caller = "Unknown"; 1055 995 1056 - ls = lock_stat_findnew(addr, caller, flags); 996 + ls = lock_stat_findnew(key, caller, flags); 1057 997 if (!ls) 1058 998 return -ENOMEM; 1059 999 } ··· 1110 1050 struct lock_seq_stat *seq; 1111 1051 u64 contended_term; 1112 1052 u64 addr = evsel__intval(evsel, sample, "lock_addr"); 1053 + u64 key; 1113 1054 1114 - if (show_thread_stats) 1115 - addr = sample->tid; 1055 + switch (aggr_mode) { 1056 + case LOCK_AGGR_ADDR: 1057 + key = addr; 1058 + break; 1059 + case LOCK_AGGR_TASK: 1060 + key = sample->tid; 1061 + break; 1062 + case LOCK_AGGR_CALLER: 1063 + default: 1064 + pr_err("Invalid aggregation mode: %d\n", aggr_mode); 1065 + return -EINVAL; 1066 + } 1116 1067 1117 - ls = lock_stat_find(addr); 1068 + ls = lock_stat_find(key); 1118 1069 if (!ls) 1119 1070 return 0; 1120 1071 ··· 1486 1415 1487 1416 if (select_key()) 1488 1417 goto out_delete; 1418 + 1419 + if (show_thread_stats) 1420 + aggr_mode = LOCK_AGGR_TASK; 1489 1421 1490 1422 err = perf_session__process_events(session); 1491 1423 if (err)