Lines Matching +full:setup +full:- +full:duration +full:- +full:ns

1 // SPDX-License-Identifier: GPL-2.0
15 #include "util/lock-contention.h"
19 #include <subcmd/parse-options.h>
20 #include "util/trace-event.h"
78 if (st->tid == tid) in thread_stat_find()
80 else if (tid < st->tid) in thread_stat_find()
81 node = node->rb_left; in thread_stat_find()
83 node = node->rb_right; in thread_stat_find()
99 if (new->tid < p->tid) in thread_stat_insert()
100 rb = &(*rb)->rb_left; in thread_stat_insert()
101 else if (new->tid > p->tid) in thread_stat_insert()
102 rb = &(*rb)->rb_right; in thread_stat_insert()
107 rb_link_node(&new->rb, parent, rb); in thread_stat_insert()
108 rb_insert_color(&new->rb, &thread_stats); in thread_stat_insert()
125 st->tid = tid; in thread_stat_findnew_after_first()
126 INIT_LIST_HEAD(&st->seq_list); in thread_stat_findnew_after_first()
146 st->tid = tid; in thread_stat_findnew_first()
147 INIT_LIST_HEAD(&st->seq_list); in thread_stat_findnew_first()
149 rb_link_node(&st->rb, NULL, &thread_stats.rb_node); in thread_stat_findnew_first()
150 rb_insert_color(&st->rb, &thread_stats); in thread_stat_findnew_first()
161 return one->member > two->member; \
173 u64 s1 = one->wait_time_min; in SINGLE_KEY()
174 u64 s2 = two->wait_time_min; in SINGLE_KEY()
186 * e.g. nr_acquired -> acquired, wait_time_total -> wait_total
225 fprintf(lock_output, "%*.2f %s", len - 3, nsec / table[i].base, table[i].unit); in lock_stat_key_print_time()
229 fprintf(lock_output, "%*llu %s", len - 3, nsec, "ns"); in lock_stat_key_print_time()
236 fprintf(lock_output, "%*llu", key->len, (unsigned long long)ls->member);\
243 lock_stat_key_print_time((unsigned long long)ls->member, key->len); \
255 u64 wait_time = ls->wait_time_min; in PRINT_KEY()
260 lock_stat_key_print_time(wait_time, key->len); in PRINT_KEY()
320 return -1; in select_key()
343 return -1; in add_output_field()
367 return -ENOMEM; in setup_output_field()
390 if (st->name && p->name) in combine_lock_stats()
391 ret = strcmp(st->name, p->name); in combine_lock_stats()
393 ret = !!st->name - !!p->name; in combine_lock_stats()
396 p->nr_acquired += st->nr_acquired; in combine_lock_stats()
397 p->nr_contended += st->nr_contended; in combine_lock_stats()
398 p->wait_time_total += st->wait_time_total; in combine_lock_stats()
400 if (p->nr_contended) in combine_lock_stats()
401 p->avg_wait_time = p->wait_time_total / p->nr_contended; in combine_lock_stats()
403 if (p->wait_time_min > st->wait_time_min) in combine_lock_stats()
404 p->wait_time_min = st->wait_time_min; in combine_lock_stats()
405 if (p->wait_time_max < st->wait_time_max) in combine_lock_stats()
406 p->wait_time_max = st->wait_time_max; in combine_lock_stats()
408 p->broken |= st->broken; in combine_lock_stats()
409 st->combined = 1; in combine_lock_stats()
414 rb = &(*rb)->rb_left; in combine_lock_stats()
416 rb = &(*rb)->rb_right; in combine_lock_stats()
419 rb_link_node(&st->rb, parent, rb); in combine_lock_stats()
420 rb_insert_color(&st->rb, &sorted); in combine_lock_stats()
426 struct rb_node **rb = &rr->rb_node; in insert_to()
435 rb = &(*rb)->rb_left; in insert_to()
437 rb = &(*rb)->rb_right; in insert_to()
440 rb_link_node(&st->rb, parent, rb); in insert_to()
441 rb_insert_color(&st->rb, rr); in insert_to()
448 if (combine_locks && st->combined) in insert_to_result()
455 struct rb_node *node = rr->rb_node; in pop_from()
460 while (node->rb_left) in pop_from()
461 node = node->rb_left; in pop_from()
504 list_for_each_entry(seq, &ts->seq_list, list) { in get_seq()
505 if (seq->addr == addr) in get_seq()
514 seq->state = SEQ_STATE_UNINITIALIZED; in get_seq()
515 seq->addr = addr; in get_seq()
517 list_add(&seq->list, &ts->seq_list); in get_seq()
549 return -EINVAL; in get_key_by_aggr_mode_simple()
563 return get_key_by_aggr_mode_simple(key, addr, sample->tid); in get_key_by_aggr_mode()
578 ret = get_key_by_aggr_mode_simple(&key, addr, sample->tid); in report_lock_acquire_event()
584 return -ENOMEM; in report_lock_acquire_event()
586 ts = thread_stat_findnew(sample->tid); in report_lock_acquire_event()
588 return -ENOMEM; in report_lock_acquire_event()
592 return -ENOMEM; in report_lock_acquire_event()
594 switch (seq->state) { in report_lock_acquire_event()
598 seq->state = SEQ_STATE_ACQUIRING; in report_lock_acquire_event()
601 ls->nr_trylock++; in report_lock_acquire_event()
603 ls->nr_readlock++; in report_lock_acquire_event()
604 seq->state = SEQ_STATE_READ_ACQUIRED; in report_lock_acquire_event()
605 seq->read_count = 1; in report_lock_acquire_event()
606 ls->nr_acquired++; in report_lock_acquire_event()
611 seq->read_count++; in report_lock_acquire_event()
612 ls->nr_acquired++; in report_lock_acquire_event()
623 if (!ls->broken) { in report_lock_acquire_event()
624 ls->broken = 1; in report_lock_acquire_event()
627 list_del_init(&seq->list); in report_lock_acquire_event()
635 ls->nr_acquire++; in report_lock_acquire_event()
636 seq->prev_event_time = sample->time; in report_lock_acquire_event()
653 ret = get_key_by_aggr_mode_simple(&key, addr, sample->tid); in report_lock_acquired_event()
659 return -ENOMEM; in report_lock_acquired_event()
661 ts = thread_stat_findnew(sample->tid); in report_lock_acquired_event()
663 return -ENOMEM; in report_lock_acquired_event()
667 return -ENOMEM; in report_lock_acquired_event()
669 switch (seq->state) { in report_lock_acquired_event()
676 contended_term = sample->time - seq->prev_event_time; in report_lock_acquired_event()
677 ls->wait_time_total += contended_term; in report_lock_acquired_event()
678 if (contended_term < ls->wait_time_min) in report_lock_acquired_event()
679 ls->wait_time_min = contended_term; in report_lock_acquired_event()
680 if (ls->wait_time_max < contended_term) in report_lock_acquired_event()
681 ls->wait_time_max = contended_term; in report_lock_acquired_event()
687 if (!ls->broken) { in report_lock_acquired_event()
688 ls->broken = 1; in report_lock_acquired_event()
691 list_del_init(&seq->list); in report_lock_acquired_event()
699 seq->state = SEQ_STATE_ACQUIRED; in report_lock_acquired_event()
700 ls->nr_acquired++; in report_lock_acquired_event()
701 ls->avg_wait_time = ls->nr_contended ? ls->wait_time_total/ls->nr_contended : 0; in report_lock_acquired_event()
702 seq->prev_event_time = sample->time; in report_lock_acquired_event()
718 ret = get_key_by_aggr_mode_simple(&key, addr, sample->tid); in report_lock_contended_event()
724 return -ENOMEM; in report_lock_contended_event()
726 ts = thread_stat_findnew(sample->tid); in report_lock_contended_event()
728 return -ENOMEM; in report_lock_contended_event()
732 return -ENOMEM; in report_lock_contended_event()
734 switch (seq->state) { in report_lock_contended_event()
745 if (!ls->broken) { in report_lock_contended_event()
746 ls->broken = 1; in report_lock_contended_event()
749 list_del_init(&seq->list); in report_lock_contended_event()
757 seq->state = SEQ_STATE_CONTENDED; in report_lock_contended_event()
758 ls->nr_contended++; in report_lock_contended_event()
759 ls->avg_wait_time = ls->wait_time_total/ls->nr_contended; in report_lock_contended_event()
760 seq->prev_event_time = sample->time; in report_lock_contended_event()
776 ret = get_key_by_aggr_mode_simple(&key, addr, sample->tid); in report_lock_release_event()
782 return -ENOMEM; in report_lock_release_event()
784 ts = thread_stat_findnew(sample->tid); in report_lock_release_event()
786 return -ENOMEM; in report_lock_release_event()
790 return -ENOMEM; in report_lock_release_event()
792 switch (seq->state) { in report_lock_release_event()
798 seq->read_count--; in report_lock_release_event()
799 BUG_ON(seq->read_count < 0); in report_lock_release_event()
800 if (seq->read_count) { in report_lock_release_event()
801 ls->nr_release++; in report_lock_release_event()
809 if (!ls->broken) { in report_lock_release_event()
810 ls->broken = 1; in report_lock_release_event()
819 ls->nr_release++; in report_lock_release_event()
821 list_del_init(&seq->list); in report_lock_release_event()
837 offset = map__map_ip(map, ip) - sym->start; in get_symbol_name_offset()
840 return scnprintf(buf, size, "%s+%#lx", sym->name, offset); in get_symbol_name_offset()
842 return strlcpy(buf, sym->name, size); in get_symbol_name_offset()
849 struct machine *machine = &session->machines.host; in lock_contention_caller()
856 return -1; in lock_contention_caller()
858 thread = machine__findnew_thread(machine, -1, sample->pid); in lock_contention_caller()
860 return -1; in lock_contention_caller()
869 return -1; in lock_contention_caller()
882 /* skip first few entries - for lock functions */ in lock_contention_caller()
886 sym = node->ms.sym; in lock_contention_caller()
887 if (sym && !machine__is_lock_function(machine, node->ip)) { in lock_contention_caller()
888 get_symbol_name_offset(node->ms.map, sym, node->ip, in lock_contention_caller()
896 return -1; in lock_contention_caller()
902 struct machine *machine = &session->machines.host; in callchain_id()
908 thread = machine__findnew_thread(machine, -1, sample->pid); in callchain_id()
910 return -1; in callchain_id()
919 return -1; in callchain_id()
930 /* skip first few entries - for lock functions */ in callchain_id()
934 if (node->ms.sym && machine__is_lock_function(machine, node->ip)) in callchain_id()
937 hash ^= hash_long((unsigned long)node->ip, 64); in callchain_id()
955 for (i = 0, c = 0; i < sample->callchain->nr && c < max_stack; i++) { in get_callstack()
956 u64 ip = sample->callchain->ips[i]; in get_callstack()
977 struct machine *machine = &session->machines.host; in report_lock_contention_begin_event()
1007 return -ENOMEM; in report_lock_contention_begin_event()
1010 addrs[filters.nr_addrs++] = map__unmap_ip(kmap, sym->start); in report_lock_contention_begin_event()
1024 name = sym->name; in report_lock_contention_begin_event()
1039 return -ENOMEM; in report_lock_contention_begin_event()
1073 return -ENOMEM; in report_lock_contention_begin_event()
1080 if (ls->callstack == NULL) in report_lock_contention_begin_event()
1081 ls->callstack = callstack; in report_lock_contention_begin_event()
1086 ts = thread_stat_findnew(sample->tid); in report_lock_contention_begin_event()
1088 return -ENOMEM; in report_lock_contention_begin_event()
1092 return -ENOMEM; in report_lock_contention_begin_event()
1094 switch (seq->state) { in report_lock_contention_begin_event()
1109 if (!ls->broken) { in report_lock_contention_begin_event()
1110 ls->broken = 1; in report_lock_contention_begin_event()
1113 list_del_init(&seq->list); in report_lock_contention_begin_event()
1121 if (seq->state != SEQ_STATE_CONTENDED) { in report_lock_contention_begin_event()
1122 seq->state = SEQ_STATE_CONTENDED; in report_lock_contention_begin_event()
1123 seq->prev_event_time = sample->time; in report_lock_contention_begin_event()
1124 ls->nr_contended++; in report_lock_contention_begin_event()
1149 ts = thread_stat_find(sample->tid); in report_lock_contention_end_event()
1155 return -ENOMEM; in report_lock_contention_end_event()
1157 switch (seq->state) { in report_lock_contention_end_event()
1161 contended_term = sample->time - seq->prev_event_time; in report_lock_contention_end_event()
1162 ls->wait_time_total += contended_term; in report_lock_contention_end_event()
1163 if (contended_term < ls->wait_time_min) in report_lock_contention_end_event()
1164 ls->wait_time_min = contended_term; in report_lock_contention_end_event()
1165 if (ls->wait_time_max < contended_term) in report_lock_contention_end_event()
1166 ls->wait_time_max = contended_term; in report_lock_contention_end_event()
1173 if (!ls->broken) { in report_lock_contention_end_event()
1174 ls->broken = 1; in report_lock_contention_end_event()
1177 list_del_init(&seq->list); in report_lock_contention_end_event()
1185 seq->state = SEQ_STATE_ACQUIRED; in report_lock_contention_end_event()
1186 ls->nr_acquired++; in report_lock_contention_end_event()
1187 ls->avg_wait_time = ls->wait_time_total/ls->nr_acquired; in report_lock_contention_end_event()
1213 if (trace_handler->acquire_event) in evsel__process_lock_acquire()
1214 return trace_handler->acquire_event(evsel, sample); in evsel__process_lock_acquire()
1220 if (trace_handler->acquired_event) in evsel__process_lock_acquired()
1221 return trace_handler->acquired_event(evsel, sample); in evsel__process_lock_acquired()
1227 if (trace_handler->contended_event) in evsel__process_lock_contended()
1228 return trace_handler->contended_event(evsel, sample); in evsel__process_lock_contended()
1234 if (trace_handler->release_event) in evsel__process_lock_release()
1235 return trace_handler->release_event(evsel, sample); in evsel__process_lock_release()
1241 if (trace_handler->contention_begin_event) in evsel__process_contention_begin()
1242 return trace_handler->contention_begin_event(evsel, sample); in evsel__process_contention_begin()
1248 if (trace_handler->contention_end_event) in evsel__process_contention_end()
1249 return trace_handler->contention_end_event(evsel, sample); in evsel__process_contention_end()
1286 fprintf(lock_output, "%*s ", key->len, key->header); in print_result()
1293 if (st->broken) in print_result()
1295 if (!st->nr_acquired) in print_result()
1300 if (strlen(st->name) < 20) { in print_result()
1302 const char *name = st->name; in print_result()
1307 /* st->addr contains tid of thread */ in print_result()
1308 t = perf_session__findnew(session, st->addr); in print_result()
1314 strncpy(cut_name, st->name, 16); in print_result()
1324 key->print(key, st); in print_result()
1349 t = perf_session__findnew(session, st->tid); in dump_threads()
1350 fprintf(lock_output, "%10d: %s\n", st->tid, thread__comm_str(t)); in dump_threads()
1360 if (a->name && b->name) in compare_maps()
1361 ret = strcmp(a->name, b->name); in compare_maps()
1363 ret = !!a->name - !!b->name; in compare_maps()
1366 return a->addr < b->addr; in compare_maps()
1384 fprintf(lock_output, " %#llx: %s\n", (unsigned long long)st->addr, st->name); in dump_map()
1421 /* this can return -EEXIST since we call it for each evsel */ in process_event_update()
1437 struct thread *thread = machine__findnew_thread(machine, sample->pid, in process_sample_event()
1438 sample->tid); in process_sample_event()
1442 event->header.type); in process_sample_event()
1443 return -1; in process_sample_event()
1446 if (evsel->handler != NULL) { in process_sample_event()
1447 tracepoint_handler f = evsel->handler; in process_sample_event()
1499 { LCB_F_RT, "rt-mutex", "rt-mutex" },
1500 { LCB_F_RT | LCB_F_READ, "rwlock-rt:R", "rwlock-rt" },
1501 { LCB_F_RT | LCB_F_WRITE, "rwlock-rt:W", "rwlock-rt" },
1502 { LCB_F_PERCPU | LCB_F_READ, "pcpu-sem:R", "percpu-rwsem" },
1503 { LCB_F_PERCPU | LCB_F_WRITE, "pcpu-sem:W", "percpu-rwsem" },
1507 { LCB_F_MUTEX | LCB_F_SPIN, "mutex:spin", "mutex-spin" },
1566 fprintf(lock_output, "%*s ", key->len, key->header); in print_header_stdio()
1593 fprintf(lock_output, "%s%s ", key->header, sep); in print_header_csv()
1634 key->print(key, st); in print_lock_stat_stdio()
1640 fprintf(lock_output, " %10s %s\n", get_type_flags_name(st->flags), st->name); in print_lock_stat_stdio()
1643 pid = st->addr; in print_lock_stat_stdio()
1646 pid, pid == -1 ? "Unknown" : thread__comm_str(t)); in print_lock_stat_stdio()
1649 fprintf(lock_output, " %016llx %s (%s)\n", (unsigned long long)st->addr, in print_lock_stat_stdio()
1650 st->name, get_type_lock_name(st->flags)); in print_lock_stat_stdio()
1653 fprintf(lock_output, " %s\n", st->name); in print_lock_stat_stdio()
1666 if (!st->callstack || !st->callstack[i]) in print_lock_stat_stdio()
1669 ip = st->callstack[i]; in print_lock_stat_stdio()
1670 sym = machine__find_kernel_symbol(con->machine, ip, &kmap); in print_lock_stat_stdio()
1685 key->print(key, st); in print_lock_stat_csv()
1691 fprintf(lock_output, "%s%s %s", get_type_flags_name(st->flags), sep, st->name); in print_lock_stat_csv()
1696 pid = st->addr; in print_lock_stat_csv()
1699 pid == -1 ? "Unknown" : thread__comm_str(t)); in print_lock_stat_csv()
1702 fprintf(lock_output, "%llx%s %s%s %s\n", (unsigned long long)st->addr, sep, in print_lock_stat_csv()
1703 st->name, sep, get_type_lock_name(st->flags)); in print_lock_stat_csv()
1706 fprintf(lock_output, "%s\n",st->name); in print_lock_stat_csv()
1719 if (!st->callstack || !st->callstack[i]) in print_lock_stat_csv()
1722 ip = st->callstack[i]; in print_lock_stat_csv()
1723 sym = machine__find_kernel_symbol(con->machine, ip, &kmap); in print_lock_stat_csv()
1742 int broken = fails->task + fails->stack + fails->time + fails->data; in print_footer_stdio()
1756 fprintf(lock_output, " %10s: %d\n", "task", fails->task); in print_footer_stdio()
1757 fprintf(lock_output, " %10s: %d\n", "stack", fails->stack); in print_footer_stdio()
1758 fprintf(lock_output, " %10s: %d\n", "time", fails->time); in print_footer_stdio()
1759 fprintf(lock_output, " %10s: %d\n", "data", fails->data); in print_footer_stdio()
1767 bad = fails->task + fails->stack + fails->time + fails->data; in print_footer_csv()
1776 fprintf(lock_output, "%s bad_%s=%d", sep, "task", fails->task); in print_footer_csv()
1777 fprintf(lock_output, "%s bad_%s=%d", sep, "stack", fails->stack); in print_footer_csv()
1778 fprintf(lock_output, "%s bad_%s=%d", sep, "time", fails->time); in print_footer_csv()
1779 fprintf(lock_output, "%s bad_%s=%d", sep, "data", fails->data); in print_footer_csv()
1809 total += use_bpf ? st->nr_contended : 1; in print_contention_result()
1810 if (st->broken) in print_contention_result()
1813 if (!st->wait_time_total) in print_contention_result()
1822 if (con->owner && con->save_callstack && verbose > 0) { in print_contention_result()
1841 total += use_bpf ? st->nr_contended : 1; in print_contention_result()
1842 if (st->broken) in print_contention_result()
1847 total += con->nr_filtered; in print_contention_result()
1849 print_footer(total, bad, &con->fails); in print_contention_result()
1856 int err = -EINVAL; in __cmd_report()
1934 parse_options_usage(NULL, options, "lock-addr", 0); in check_lock_contention_options()
1935 return -1; in check_lock_contention_options()
1940 parse_options_usage(usage, options, "lock-owner", 0); in check_lock_contention_options()
1941 parse_options_usage(NULL, options, "use-bpf", 0); in check_lock_contention_options()
1942 return -1; in check_lock_contention_options()
1947 parse_options_usage(usage, options, "lock-owner", 0); in check_lock_contention_options()
1948 parse_options_usage(NULL, options, "lock-addr", 0); in check_lock_contention_options()
1949 return -1; in check_lock_contention_options()
1954 parse_options_usage(usage, options, "lock-cgroup", 0); in check_lock_contention_options()
1955 parse_options_usage(NULL, options, "use-bpf", 0); in check_lock_contention_options()
1956 return -1; in check_lock_contention_options()
1961 parse_options_usage(usage, options, "lock-cgroup", 0); in check_lock_contention_options()
1962 parse_options_usage(NULL, options, "lock-addr", 0); in check_lock_contention_options()
1963 return -1; in check_lock_contention_options()
1968 parse_options_usage(usage, options, "lock-cgroup", 0); in check_lock_contention_options()
1970 return -1; in check_lock_contention_options()
1979 return -1; in check_lock_contention_options()
1984 pr_warning("Now -o try to show owner's callstack instead of pid and comm.\n"); in check_lock_contention_options()
1985 pr_warning("Please use -t option too to keep the old behavior.\n"); in check_lock_contention_options()
1993 int err = -EINVAL; in __cmd_contention()
2016 return -ENOMEM; in __cmd_contention()
2039 con.machine = &session->machines.host; in __cmd_contention()
2067 err = -ENOMEM; in __cmd_contention()
2084 pr_err("lock contention BPF setup failed\n"); in __cmd_contention()
2091 if (!evlist__find_evsel_by_str(session->evlist, in __cmd_contention()
2106 pr_err("Failed to setup output field\n"); in __cmd_contention()
2158 "record", "-R", "-m", "1024", "-c", "1", "--synth", "task", in __cmd_record()
2161 "--call-graph", "fp," __stringify(CONTENTION_STACK_DEPTH), in __cmd_record()
2193 rec_argc = ARRAY_SIZE(record_args) + nr_callgraph_args + argc - 1; in __cmd_record()
2200 /* factor of 2 is for -e in front of each tracepoint */ in __cmd_record()
2205 return -ENOMEM; in __cmd_record()
2211 rec_argv[i++] = "-e"; in __cmd_record()
2233 unsigned long *len = (unsigned long *)opt->value; in parse_map_entry()
2241 return -1; in parse_map_entry()
2251 unsigned long *len = (unsigned long *)opt->value; in parse_max_stack()
2259 return -1; in parse_max_stack()
2264 return -1; in parse_max_stack()
2291 return -1; in parse_lock_type()
2309 return -1; in parse_lock_type()
2318 * Replace alias `pcpu-sem` with actual name `percpu-rwsem. in parse_lock_type()
2320 if (!strcmp(tok, "pcpu-sem")) in parse_lock_type()
2321 tok = (char *)"percpu-rwsem"; in parse_lock_type()
2328 return -1; in parse_lock_type()
2336 return -1; in parse_lock_type()
2412 return -1; in parse_lock_addr()
2420 ret = -1; in parse_lock_addr()
2428 ret = -1; in parse_lock_addr()
2439 ret = -1; in parse_lock_addr()
2451 const char **name = (const char **)opt->value; in parse_output()
2454 return -1; in parse_output()
2459 return -1; in parse_output()
2489 tmp[filters.nr_cgrps++] = cgrp->id; in add_lock_cgroup()
2503 return -1; in parse_cgroup_filter()
2507 ret = -1; in parse_cgroup_filter()
2520 unsigned long duration; in add_lock_delay() local
2533 duration = strtoul(spec, &pos, 0); in add_lock_delay()
2534 if (!strcmp(pos, "ns")) in add_lock_delay()
2535 duration *= 1; in add_lock_delay()
2537 duration *= 1000; in add_lock_delay()
2539 duration *= 1000 * 1000; in add_lock_delay()
2545 if (duration > 10 * 1000 * 1000) { in add_lock_delay()
2562 delays[nr_delays].time = duration; in add_lock_delay()
2576 return -1; in parse_lock_delay()
2580 ret = -1; in parse_lock_delay()
2595 OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, "dump raw trace in ASCII"), in cmd_lock()
2619 OPT_BOOLEAN('c', "combine-locks", &combine_locks, in cmd_lock()
2622 "show per-thread lock stats"), in cmd_lock()
2633 "show per-thread lock stats"), in cmd_lock()
2634 OPT_BOOLEAN('b', "use-bpf", &use_bpf, "use BPF program to collect lock contention stats"), in cmd_lock()
2635 OPT_BOOLEAN('a', "all-cpus", &target.system_wide, in cmd_lock()
2636 "System-wide collection from all CPUs"), in cmd_lock()
2642 "Trace on existing thread id (exclusive to --pid)"), in cmd_lock()
2643 OPT_CALLBACK('M', "map-nr-entries", &bpf_map_entries, "num", in cmd_lock()
2645 OPT_CALLBACK(0, "max-stack", &max_stack_depth, "num", in cmd_lock()
2648 OPT_INTEGER(0, "stack-skip", &stack_skip, in cmd_lock()
2652 OPT_BOOLEAN('l', "lock-addr", &show_lock_addrs, "show lock stats by address"), in cmd_lock()
2653 OPT_CALLBACK('Y', "type-filter", NULL, "FLAGS", in cmd_lock()
2655 OPT_CALLBACK('L', "lock-filter", NULL, "ADDRS/NAMES", in cmd_lock()
2657 OPT_CALLBACK('S', "callstack-filter", NULL, "NAMES", in cmd_lock()
2659 OPT_BOOLEAN('o', "lock-owner", &show_lock_owner, "show lock owners instead of waiters"), in cmd_lock()
2660 OPT_STRING_NOEMPTY('x', "field-separator", &symbol_conf.field_sep, "separator", in cmd_lock()
2662 OPT_BOOLEAN(0, "lock-cgroup", &show_lock_cgroups, "show lock stats by cgroup"), in cmd_lock()
2663 OPT_CALLBACK('G', "cgroup-filter", NULL, "CGROUPS", in cmd_lock()
2665 OPT_CALLBACK('J', "inject-delay", NULL, "TIME@FUNC", in cmd_lock()
2693 return -ENOMEM; in cmd_lock()
2741 set_option_nobuild(contention_options, 'b', "use-bpf", in cmd_lock()
2751 return -1; in cmd_lock()