244
248
struct lock_key keys[] = {
245
249
DEF_KEY_LOCK(acquired, nr_acquired),
246
250
DEF_KEY_LOCK(contended, nr_contended),
251
DEF_KEY_LOCK(avg_wait, avg_wait_time),
247
252
DEF_KEY_LOCK(wait_total, wait_time_total),
248
253
DEF_KEY_LOCK(wait_min, wait_time_min),
249
254
DEF_KEY_LOCK(wait_max, wait_time_max),
592
597
ls = lock_stat_findnew(addr, name);
598
603
ts = thread_stat_findnew(sample->tid);
602
607
seq = get_seq(ts, addr);
606
611
switch (seq->state) {
607
612
case SEQ_STATE_UNINITIALIZED:
610
614
case SEQ_STATE_ACQUIRED:
612
616
case SEQ_STATE_READ_ACQUIRED:
691
694
pr_info("\n=== output for debug===\n\n");
692
695
pr_info("bad: %d, total: %d\n", bad, total);
693
pr_info("bad rate: %f %%\n", (double)bad / (double)total * 100);
696
pr_info("bad rate: %.2f %%\n", (double)bad / (double)total * 100);
694
697
pr_info("histogram of events caused bad sequence\n");
695
698
for (i = 0; i < BROKEN_MAX; i++)
696
699
pr_info(" %10s: %d\n", name[i], bad_hist[i]);
707
710
pr_info("%10s ", "acquired");
708
711
pr_info("%10s ", "contended");
713
pr_info("%15s ", "avg wait (ns)");
710
714
pr_info("%15s ", "total wait (ns)");
711
715
pr_info("%15s ", "max wait (ns)");
712
716
pr_info("%15s ", "min wait (ns)");
738
742
pr_info("%10u ", st->nr_acquired);
739
743
pr_info("%10u ", st->nr_contended);
745
pr_info("%15" PRIu64 " ", st->avg_wait_time);
741
746
pr_info("%15" PRIu64 " ", st->wait_time_total);
742
747
pr_info("%15" PRIu64 " ", st->wait_time_max);
743
748
pr_info("%15" PRIu64 " ", st->wait_time_min == ULLONG_MAX ?
763
768
st = container_of(node, struct thread_stat, rb);
764
769
t = perf_session__findnew(session, st->tid);
765
pr_info("%10d: %s\n", st->tid, t->comm);
770
pr_info("%10d: %s\n", st->tid, thread__comm_str(t));
766
771
node = rb_next(node);
817
if (evsel->handler.func != NULL) {
818
tracepoint_handler f = evsel->handler.func;
822
if (evsel->handler != NULL) {
823
tracepoint_handler f = evsel->handler;
819
824
return f(evsel, sample);
830
static void sort_result(void)
833
struct lock_stat *st;
835
for (i = 0; i < LOCKHASH_SIZE; i++) {
836
list_for_each_entry(st, &lockhash_table[i], hash_entry) {
837
insert_to_result(st, compare);
825
842
static const struct perf_evsel_str_handler lock_tracepoints[] = {
826
843
{ "lock:lock_acquire", perf_evsel__process_lock_acquire, }, /* CONFIG_LOCKDEP */
827
844
{ "lock:lock_acquired", perf_evsel__process_lock_acquired, }, /* CONFIG_LOCKDEP, CONFIG_LOCK_STAT */
829
846
{ "lock:lock_release", perf_evsel__process_lock_release, }, /* CONFIG_LOCKDEP */
832
static int read_events(void)
849
static int __cmd_report(bool display_info)
834
852
struct perf_tool eops = {
835
853
.sample = process_sample_event,
836
854
.comm = perf_event__process_comm,
837
855
.ordered_samples = true,
839
session = perf_session__new(input_name, O_RDONLY, 0, false, &eops);
857
struct perf_data_file file = {
859
.mode = PERF_DATA_MODE_READ,
862
session = perf_session__new(&file, false, &eops);
841
864
pr_err("Initializing perf session failed\n");
868
if (!perf_session__has_traces(session, "lock record"))
845
871
if (perf_session__set_tracepoints_handlers(session, lock_tracepoints)) {
846
872
pr_err("Initializing perf session tracepoint handlers failed\n");
850
return perf_session__process_events(session, &eops);
853
static void sort_result(void)
856
struct lock_stat *st;
858
for (i = 0; i < LOCKHASH_SIZE; i++) {
859
list_for_each_entry(st, &lockhash_table[i], hash_entry) {
860
insert_to_result(st, compare);
865
static int __cmd_report(void)
879
err = perf_session__process_events(session, &eops);
869
if ((select_key() != 0) ||
870
(read_events() != 0))
884
if (display_info) /* used for info subcommand */
892
perf_session__delete(session);
879
896
static int __cmd_record(int argc, const char **argv)
881
898
const char *record_args[] = {
882
899
"record", "-R", "-m", "1024", "-c", "1",
884
unsigned int rec_argc, i, j;
901
unsigned int rec_argc, i, j, ret;
885
902
const char **rec_argv;
887
904
for (i = 0; i < ARRAY_SIZE(lock_tracepoints); i++) {
915
932
BUG_ON(i != rec_argc);
917
return cmd_record(i, rec_argv, NULL);
934
ret = cmd_record(i, rec_argv, NULL);
920
939
int cmd_lock(int argc, const char **argv, const char *prefix __maybe_unused)
935
954
const struct option report_options[] = {
936
955
OPT_STRING('k', "key", &sort_key, "acquired",
937
"key for sorting (acquired / contended / wait_total / wait_max / wait_min)"),
956
"key for sorting (acquired / contended / avg_wait / wait_total / wait_max / wait_min)"),
973
992
usage_with_options(report_usage, report_options);
994
rc = __cmd_report(false);
976
995
} else if (!strcmp(argv[0], "script")) {
977
996
/* Aliased to 'perf script' */
978
997
return cmd_script(argc, argv, prefix);