From 4775f4dc129d5116892c7738a3e1e9918e6c2e02 Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Thu, 2 Dec 2021 20:56:48 +0100 Subject: 49629: new Linux perf completion --- ChangeLog | 4 + Completion/Linux/Command/_perf | 809 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 813 insertions(+) create mode 100644 Completion/Linux/Command/_perf diff --git a/ChangeLog b/ChangeLog index a45e9e1aa..c67911681 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2021-12-02 Oliver Kiddle + + * 49629: Completion/Linux/Command/_perf: new Linux perf completion + 2021-12-01 Daniel Shahaf * 49628: Test/D01prompt.ztst: Add an xfail test for RPS1/RPROMPT diff --git a/Completion/Linux/Command/_perf b/Completion/Linux/Command/_perf new file mode 100644 index 000000000..dd9621606 --- /dev/null +++ b/Completion/Linux/Command/_perf @@ -0,0 +1,809 @@ +#compdef perf + +local curcontext="$curcontext" curstate state line expl nm="$compstate[nmatches]" +local -a args opts cmd fields sortkeys +local -A exclude full short +local -i i skip + +exclude=( + --add \* --cgroup \* --definition \* --del \* + --detailed \* --dlarg \* --dsos \* --event \* --events \* + --fields \* --funcs \* --node-info \* --symbols \* --vars \* + --gtk '(--stdio --stdio2 --tui)' + --tui '(--gtk --stdio --stdio2)' + --stdio '(--gtk --tui --stdio2)' + --stdio2 '(--gtk --tui --stdio)' + --log-fd '(--output)' + --output '(--log-fd)' + --tracer '(-G --graph-funcs -g --nograph-funcs -F --funcs)' + --graph-funcs '(-g --nograph-funcs -N --notrace-funcs -T --trace-funcs -t --tracer)*' + --nograph-funcs '(-G --graph-funcs -N --notrace-funcs -T --trace-funcs -t --tracer)*' + --trace-funcs '(-N --notrace-funcs -G --graph-funcs -g --nograph-funcs -t --tracer)*' + --notrace-funcs '(-T --trace-funcs -G --graph-funcs -g --nograph-funcs -t --tracer)*' + --source '!(--no-source)' +) + +full=( + --addr-range '=[list traced records within address range]:range' + --affinity '=[set affinity mask of trace reading thread]:affinity:(node cpu)' + --aio '=[specify number of control blocks in asynchronous trace writing mode]:control blocks (1-4) [1]' + --all-cgroups '[record cgroup events]' + --all-cpus '[system-wide collection from all CPUs]' + --asm-raw '[show raw instruction encoding of assembly instructions]' + --aux-sample '=[sample AUX area]::options' + --baseline-only '[show only items with match in baseline]' + --branch-any '[sample any taken branches]' + --branch-filter '=[enable taken branch stack sampling]:mask' + --branch-stack '[use branch records for per branch histogram filling]' + --buffer-size '=[size of per-cpu buffer]: :_numbers size B K M G' + --build-ids '[inject build-ids into the output stream]' + --buildid-all '[handle build-id of all DSOs]' + --call-graph '=[enable call-graph (stacktrace) recording]:(fp dwarf)' + --cgroup '=[monitor event in named cgroup only]:cgroup' + --children '[accumulate callchains of children and show total overhead]' + --clang-opt '=:clang option' + --clang-path '=:clang binary:_command_names -e' + --clockid '=[specify clockid to use for events]:clock id' + --coalesce '=:coalesce field:_sequence compadd - pid tid iaddr dso' + --color-cpus '=[highlight given CPUs in map]:cpus' + --color-pids '=[highlight given pids in map]: :_sequence _pids' + --column-widths '=[use fixed column widths]:widths (comma-separated)' + --comms '=[restrict to specified comms]:comms' + --compression-level '=[produce compressed trace using specified level]:level (1-22) [1]' + --compute '=[set comparison method]:comparison method [delta-abs]:(delta delta-abs ratio wdiff)' + --control '=[listen on ctl-fd descriptor for command to control measurement]:descriptor' + --count '=[specify event period]:period' + --count-filter '=[only display functions with more than given number of events]:minimum number of events' + --cpu '=[restrict to specified CPUs]:cpus' + --cpus '=[restrict to specified CPUs]:cpus' + --cycles-hist '[show cycles histogram and standard deviation]' + --data '[record the sample addresses]' + --data-page-size '[record the sampled data address data page size]' + --definition '=[show trace-event definition converted from given probe-event]:event' + --delay '=[specify delay before starting measurement after program start]:delay (ms)' + --demangle '[demangle symbols]' + --demangle-kernel '[demangle kernel symbols]' + --detailed '[detailed run - start a lot of events]' + --disassembler-style '=[specify disassembler style]:style' + --dlarg '=:dlfilter argument' + --dlfilter '=[filter sample events using the given shared object]:file:_files -g "*.so(-.)"' + --dry-run '[parse options then exit]' + --dsos '=[only consider symbols in these dsos]:dso' + --dump-raw-trace '[dump raw trace in ASCII]' + --dump-symtab '[dump the symbol table used for profiling]' + --duration '=[show only events with duration over threshold]:minimum duration (ms)' + --entries '=[specify how many functions to display]:number of functions' + --event '=[select the PMU event]:event:->events' + --exclude-other '[only display entries with parent-match]' + --exclude-perf "[don't record events from perf itself]" + --exec '=[specify path to executable or shared library]:file:_files' + --expr '=[specify syscalls/events to trace]:syscall or event' + --field-separator '=[specify field separator]:separator' + --fields '=[specify output field]:field:->fields' + --filter '=[event filter]:filter' + --filter-pids '=[specify pids to filter]: :_sequence _pids' + --for-each-cgroup '=[expand events for each cgroup]:cgroup' + --force "[don't complain, do it]" + --format '=[specify output formatting style]:style:(default simple)' + --formula '[show formula]' + --freq '=[specify profile frequency]:frequency (Hz)' + --func-opts '=[specify function tracer options]:option:_sequence compadd - call-graph irq-info' + --funcs '=[show available functions]::filter' + --graph-funcs '=[select function_graph tracer and trace given functions]:function' + --graph-function '=[only print symbols and callees with --call-trace/--call-ret-trace]:symbol list' + --graph-opts '=[specify graph tracer options]: : _values -s , option nosleep-time noirqs verbose thresh\:duration depth\:depth' + --group '=[show event group information together]' + --group-sort-idx '=[sort output by specified event in group]:event index' + --gtk '[use the graphical interface]' + --guestkallsyms '=[provide copy of guest os /proc/kallsyms]:file:_files' + --guestmodules '=[provide copy of guest os /proc/modules]:file:_files' + --guestmount '=[specify guest os root file system mount directory]:path:_directories' + --guestvmlinux '=[provide guest os kernel]:kernel file:_files' + --hide_kernel_symbols '[hide kernel symbols]' + --hide_user_symbols '[hide user symbols]' + --hide-unresolved '[only display entries resolved to a symbol]' + --hierarchy '[show entries in a hierarchy]' + --ignore-callees '=[ignore callees of specified functions in call graphs]:functions (regex)' + --ignore-vmlinux '[ignore vmlinux files]' + --inherit '[trace child processes]' + --input '=[specify input file]:file:_files' + --interval-count '=[print counts for fixed number of times]:times' + --interval-print '=[print counts at regular interval]:interval (ms)' + --intr-regs '=[sample selected machine registers on interrupt]:register' + --inverted '[alias for inverted call graph]' + --iostat '=::default' + --itrace '=[specify instruction tracing options]:option:->itrace-opts' + --jit '[merge jitdump files into perf.data file]' + --kallsyms '=[specify kallsyms pathname]:path:_files' + --kcore '=[add specified kcore file to the cache]:file:_files' + --kernel '[show running kernel build id]' + --Latency '[show latency attributes (irqs/preemption disabled, etc)]' + --list '[list all cached files]' + --list-opts '[list available options]' + --log-fd '=[log output to file descriptor instead of stderr]:file descriptor:_file_descriptors' + --map-dump '=[specify BPF map to periodically dump]:BPF map' + --max-blocks '=[set maximum number of code blocks to dump with brstackinsn]:blocks' + --max-events '=[set maximum number of events to print]:events' + --max-size '=[limit the maximum size of the output file]: :_numbers size B K M G' + --max-stack '=[set maximum stack depth when parsing the callchain]:depth [kernel.perf_event_max_stack or 127]' + --metrics '=[monitor specified metrics or metric groups]:metric' + --min-stack '=[set minimum stack depth when parsing the callchain]:depth' + --mmap-flush '=[specify minimum size that is extracted from mmap data pages]: :_numbers -d 1 -u bytes size B K M G' + --mmap-pages '=[specify number of mmap data pages]:number of pages' + --modules '[load module symbols]' + --namespaces '[record namespaces events]' + --no-bpf-event "[don't record bpf events]" + --no-buildid "[don't collect buildids in perf.data]" + --no-buildid-cache "[don't update the buildid cache]" + --no-inherit "[child tasks don't inherit counters]" + --no-samples "[don't sample]" + --node-info '[show extra node info in report]' + --nograph-funcs "=[select function_graph tracer and don't trace given functions]:function" + --notrace-funcs "=[select function tracer and don't trace given functions]:function filter" + --null "[null run - don't start any counters]" + --num-thread-synthesize '=[specify number of threads to run for event synthesis]:threads' + --objdump '=[specify objdump binary to use for disassembly and annotations]:path:_command_names -e' + --order '=[specify compute sorting]:ordering [1]:(( + 0\:baseline\ overhead + 1\:computed\ value\ of\ column\ 1))' + --output '=[specify output file]:file:_files' + --parent '=[filter by parent caller]:parent (regex)' + --percent-limit "=[don't show entries under specified percentage]:percent" + --percent-type '=[set annotation percent type]:compadd {local,global}{period,hits}' + --percentage '=[set display of filtered entries percentages]:display:(relative absolute)' + --phys-data '[record/report sample physical addresses]' + --pid '=[restrict to specified process id]:process: _sequence _pids' + --post '=[specify command to run after to the measured command]: :_cmdstring' + --pre '=[specify command to run prior to the measured command]: :_cmdstring' + --prefix '=[add prefix to source file path names]:prefix:_directories' + --prefix-strip '=[strip elements from source file path names]:elements' + --pretty '=[specify pretty printing style]:key:(normal raw)' + --proc-map-timeout '=[specify per-thread proc mmap processing timeout]:timeout (ms)' + --quiet "[don't print any messages]" + --raw-samples '[collect raw sample records from all opened counters]' + --raw-trace '[show raw trace event output]' + --realtime '=[profile --addevents with specified priority]:RT SCHED_FIFO priority' + --repeat '=[specify amount of times to repeat the run]:repetitions' + --samples '=[specify number of samples to save per histogram entry for individual browsing]:samples' + --sched-stat '[get details of how long tasks slept]' + --show-cpu-utilization '[show sample percentage for different cpu modes]' + --show-info '[display extended perf.data information]' + --show-nr-samples '[show a column with the number of samples]' + --show-on-off-events '[show the --switch-on/off events too]' + --show-round-events '[display finished round events]' + --show-switch-events '[display context switch events]' + --show-total-period '[show a column with the sum of periods]' + --skip-missing '--skip-missing[skip symbols that cannot be annotated]' + --snapshot '=[select AUX area tracing snapshot mode]::snapshot capturing parameter' + --socket-filter '=[only show processor socket that match specified filter]:filter' + --sort '=[sort by specified keys]:key:->sort-keys' + --stat '[per-thread counts]' + --stdio '[use the stdio interface]' + --stdio-color '=[specify when to use colors in output]:mode [always]:(always never auto)' + --stdio2 '[use the stdio2 interface, non-interactive, TUI formatting]' + --stitch-lbr '[enable LBR callgraph stitching approach]' + --stop-bt '=[stop display of callgraph at these symbols]:symbol list' + --stream '[enable hot streams comparison]' + --strip '[strip non-synthesized events]' + --summary '[show only syscall summary with statistics]' + --switch-max-files '=[limit number of generated files to keep]:limit' + --switch-off '=[stop considering events after occurrence of specified event]:event' + --switch-on '=[consider events after occurrence of specified event]:event' + --switch-output '=[specify when to rotate output file]::signal or size [USR2]:_signals' + --switch-output-event '=[switch output event selector]:event:->events' + --sym-annotate '=[specify symbol to annotate]:symbol' + --symbol '=[specify symbol]:symbol' + --symbol-filter '=[only show symbols that match filter]:filter' + --symbols '=[only consider specified symbols]:symbol' + --symfs '=[look symbol files relative to specified directory]:directory:_directories' + --sync '[call sync() before starting a run]' + --system '[read and write system config file]' + --target-ns '=[obtain mount namespace information form the target pid]:pid:_processes' + --td-level '=[set the metrics level for the top-down statistics]:level' + --tid '=[restrict to specified threads]:tids' + --time '=[specify time span of interest]:time span (start,stop)' + --time-quantum '=[set time quantum for time sort key]: :_numbers -d 100ms "time quantum" ms us ns s' + --timeout '=[stop workload and print counts after a timeout period]:timeout (ms)' + --timestamp-filename '[append timestamp to output file name]' + --trace-fields '[show tracepoint fields]' + --trace-funcs '=[select function tracer and set function filter]:function filter' + --tracer '=[specify tracer to use]:tracer:(function_graph function)' + --tui '[use the curses interface]' + --uid '=[profile events in threads owned by uid]:uid:_users' + --user '[read and write user config file]' + --user-regs '=[sample selected machine registers on interrupt]:registers' + --vars '=[show available local variables at given probe point]:probe' + --vcpu '=[specify vcpu id to report]:vcpu' + --verbose '[be more verbose]' + --vm-time-correlation '=[correlate time between VM guests and the host]::options' + --vmlinux '=[specify vmlinux path]:vmlinux pathname:_files' + --weight '[sample by weight (on special events only)]' + --with-hits '[show only DSOs with hits]' + --with-summary '[show all syscalls and summary with statistics]' + --zero '[zero history across updates]' +) +short=( + --add -a + --all-cpus -a + --baseline-only -b + --branch-any -b + --build-ids -b + --cpu -C + --coalesce -c + --compute -c + --count -c + --delay -D + --dump-raw-trace -D + --data -d + --dsos -d + --event -e + --fields -F + --formula -F + --freq -F + --funcs -F + --force -f + --cgroup -G + --graph-funcs -G + --with-hits -H + --intr-regs -I + --show-info -I + --input -i + --no-inherit -i + --branch-filter -j + --jit -j + --clockid -k + --key -k + --vmlinux -k + --list -l + --disassembler-style -M + --buffer-size -m + --mmap-pages -m + --modules -m + --node-info -N + --no-buildid-cache -N + --no-samples -n + --show-nr-samples -n + --order -o + --output -o + --pid -p + --quiet -q + --raw-samples -R + --realtime -r + --repeat -r + --snapshot -S + --symbols -S + --with-summary -S + --sched-stat -s + --script -s + --sort -s + --summary -s + --timestamp -T + --tid -t + --tracer -t + --uid -u + --verbose -v + --weight -W + --column-widths -w + --field-separator -x + --compression-level -z + --zero -z +) + +cmd=( $words[1] ) +(( $#words > 2 )) && ign='!' + +_arguments -C -A "-*" \ + "${ign}(- *)"{-v,--version}'[display version information]' \ + "${ign}(- *)"{-h,--help}'[display usage information]' \ + "${ign}(- *)-vv[print the compiled-in status of libraries]" \ + '(- *)--exec-path[display or set exec path]' \ + '(- *)--html-path[display html documentation path]' \ + "${ign}(- *)--list-opts[list available options]" \ + "${ign}(- *)--list-cmds[list available subcommands]" \ + '!(-p --paginate --no-pager)'{-p,--paginate} \ + --no-pager \ + '--buildid-dir=[setup buildid cache directory]: :_directories' \ + '--debugfs-dir=[set debugfs directory]: :_directories' \ + '--debug=[setup debug variable]: : _values -s, "debug option" + verbose\:level ordered-events data-convert stderr perf-event-open' \ + '1: :->subcmds' \ + '*:: :->args' + +while (( $#state )); do + curstate=$state + shift state + case $curstate in + subcmds) + subcmds=( + ${${${(f)"$(_call_program subcmds $cmd)"}[3,-2]## ##}/ ##(#m)?/:$MATCH[-1]:l} + 'help:display help information about perf' + ) + _describe 'subcommand' subcmds + ;; + subsubcmds) + _description commands expl command + compadd "$expl[@]" -a subcmds + ;; + args) + (( $#words < 3 )) && ign='' + cmd+=( $words[1] ) + curcontext="${curcontext%:*:*}:${(j.-.)cmd}:" + args=() + skip=0 + case ${(j.-.)cmd[2,-1]} in + kvm-*|top|stat) + full[--group]='[put the counters into a counter group]' + ;| + bench-[^-]##(|-all)) skip=1 opts=() subcmds=() ;| + + annotate) + full+=( + --full-paths "[don't shorten the displayed pathnames]" + --print-line "[print matching source lines (may be slow)]" + ) + short+=( + --print-line -l + --full-paths -P + --symbol -s + ) + args+=( + "--no-source[don't interleave source code with assembly code]" + '1:: :_guard "^-*" "symbol name"' + ) + ;; + + archive) + _arguments --help '1:file:_files' + break + ;; + + bench) + short+=( + --edge -E + --format -f + --nfds -f + --group -g + --iterations -i + --loop -l + --nr_loops -l + --nr-mmaps -m + --multiq -m + --nested -N + --noaffinity -n + --nonblocking -B + --nr-samples -n + --pipe -p + --randomize -R + -fruntime -r + --size -s + --thread -t + --threaded -T + ) + args=( + '1:subsystem:(sched syscall mem numa futex epoll internals all)' + '*:: :->args' + ) + full+=( + --group '=[specify number of groups]:groups' + --nr_loops '=[specify number of loops to run]:loops [100]' + --pipe '[use pipe() instead of socketpair()]' + --runtime '=[specify runtime]:runtime (seconds)' + --thread '[be multi thread instead of multi process]' + --threads '=[specify number of threads]:threads' + --loop '=[specify number of loops]:loops' + --iterations '=[number of iterations used to compute average]:iterarions' + --threaded '[specify threads/process based task setup]' + --size '=[specify size of memory buffers]: :_numbers -d 1MB size B KB MB GB TB' + ) + ;; + bench-sched) args=( '1:suite:(all messaging pipe)' '*:: :->args' ) ;; + bench-numa) args=( '1:suite:(all mem)' '*:: :->args' ) ;; + bench-mem) args=( '1:suite:(all memcpy memset find_bit)' '*:: :->args' ) ;; + bench-futex) + args=( '1:suite:(all hash wake wake-parallel requeue lock-pi)' '*:: :->args' ) + ;; + bench-epoll) args=( '1:suite:(all wait ctl)' '*:: :->args' ) ;; + bench-internals) args=( '1:suite:(all synthesize kallsyms-parse inject-build-id)' '*:: :->args' ) ;; + bench-syscall) args=( '1:suite:(all basic)' '*:: :->args' ) ;; + + buildid-cache) + full+=( + --add '=[add specified file to the cache]:file:_files' + --debuginfod '=[specify debuginfod URL to be used when retrieving perf.data binaries]:url:_urls' + --missing '=[list missing build ids in the cache for the specified]:file:_files' + --purge '=[purge all cached binaries including older caches which have specified path from the cache]:path:_files' + --purge-all '[purge all cached binaries - flush out entire cache]' + --remove '=[remove a cached binary which has same build-id of specified file from the cache]:file:_files' + --update '=[update specified file of the cache]:file:_files' + ) + short+=( + --kcore -k + --missing -M + --purge -p + --purge-all -P + --remove -r + --update -u + ) + ;; + c2c) + args+=( '1:commands:(record report)' '*:: :->args' ) + ;; + daemon) + full+=( + --base '=[specify base directory]:base directory:_directories' + --config '=[specify config file path]:config file:_files' + --foreground "[don't put process in background]" + --session '=[apply to specific session]:session' + ) + short[--foreground]=-f + args=( '1:action:(start stop signal ping)' '*:: :->args' ) + ;; + (kvm-|)buildid-list) + short[--kernel]=-k + ;; + config) + full[--list]='[show current config variables]' + ;; + data) + full+=( + --all '[convert all events]' + --to-json '=[convert to JSON format]:output file:_files' + --to-ctf '=[convert to CTF format]:output file:_files' + --tod '[convert time to wall clock time]' + ) + exclude+=( + --to-ctf '(--to-json)' + --to-json '(--to-ctf)' + ) + ;; + (kvm-|)diff) + short+=( + --baseline-only -b + --compute -c + --comms -C + --field-separator -t + --formula -F + --order -o + --period -p + ) + full+=( + --period '[show period values]' + ) + unset 'short[--pid]' + unset 'short[--tid]' + sortkeys=( pid comm dso symbol cpu parent srcline ) + ;; + evlist) + short+=( --group -g ) + ;; + ftrace) + short+=( + --nograph-funcs -g + --graph-funcs -G + --buffer-size -m + --notrace-funcs -N + --trace-funcs -T + --tracer -t + ) + unset 'short[--tid]' + ;; + help*) + short+=( -a --all -i --info -m --man -w --web ) + ;; + inject) + short+=( --jit -j --build-ids -b --sched-stat -s ) + ;; + kmem) + full+=( + --alloc '[show per-allocation statistics]' + --caller '[show per-callsite statistics]' + --raw-ip '[show raw ip instead of symbol]' + --line '=[show specified number of lines]:lines' + --live '[show live page stat]' + --slab '[analyze SLAB allocator events]' + --page '[analyze page allocator events]' + ) + short[--line]=-l + sortkeys=( + ptr callsite bytes hit pingpong frag + page order migtype gfp + ) + ;; + list) + short+=( --desc -d --long-desc -v ) + full+=( + --desc '[print extra event descriptions]' + --details '[print information on the perf event names and expressions used internally by events]' + --long-desc '[print longer event descriptions]' + ) + args=( '*::events:->event-types' ) + ;; + lock-info) + short[--map]=-m + short[--threads]=-t + full+=( + --map '[dump map of lock instances (address:name table)]' + --threads '[dump thread list in perf.data]' + ) + ;; + lock-report) + full[--key]='=[specify sort key]:key [acquired]:(acquired contended avg_wait wait_total wait_max wait_min)' + ;; + mem) + short[--phys-data]=-p + short[--type]=-t + short[--dump-raw-samples]=-D + full[--type]='=[select the memory operation type]:type:(load store)' + full[--dump-raw-samples]='[dump raw samples in ASCII]' + ;; + probe) + full+=( + --add '=[probe point definition]:probe' + --del '=[delete a probe event]:probe event' + --filter '=[set a filter]:filter' + --line '[show source code lines which can be probed]' + --max-probes '=[set how many probe points can be found for a probe]:probes' + --module '=[specify target module name or path]:module name or path:_directories' + --range '[show variables location range in scope]' + --source '=[specify path to kernel source]:path:_directories' + ) + short+=( + --definition -D + --del -d + --exec -x + --line -L + --module -m + --dry-run -n + --source -s + --vars -V + ) + unset 'exclude[--source]' + unset 'short[--list]' + ;; + timechart-record) + short+=( --io-only -I --callchain -g ) + full+=( + --callchain '[record callchain]' + --io-only '[record only IO data]' + ) + ;; + *record) + short+=( + --data -d + --clockid -k + --no-samples -n + --no-buildid -B + --no-buildid-cache -N + --period -P + --stat -s + ) + full+=( + --overwrite '[use overwrite mode]' + --period '[record the sample period]' + --timestamp '[record the sample timestamps]' + --transaction '[sample transaction flags (special events only)]' + ) + ;; + (c2c-|kvm-|)report) + short+=( + --branch-stack -b + --comms -c + --inverted -G + --call-graph -g + --parent -p + --threads -T + --field-separator -t + --exclude-other -x + ) + full+=( + --threads '[show per-thread event counters]' + ) + unset 'short[--pid]' + unset 'short[--tid]' + sortkeys=( + pid comm dso symbol parent cpu socket srcline weight local_weight cgroup_id + ) + fields=( + overhead period sample overhead overhead_sys overhead_us + overhead_guest_sys overhead_guest_us overhead_children + sample period pid comm dso symbol parent cpu socket + srcline srcfile local_weight weight transaction trace + symbol_size dso_size cgroup cgroup_id ipc_null time + code_page_size local_ins_lat ins_lat p_stage_cyc dso_from + dso_to symbol_from symbol_to mispredict abort in_tx + cycles srcline_from srcline_to ipc_lbr symbol_daddr + dso_daddr locked tlb mem snoop dcacheline symbol_iaddr + phys_daddr data_page_size blocked + ) + ;; + sched-latency) + short+=( + --CPU -C + --pids -p + ) + full+=( + --pids '[latency stats per pid instead of per comm]' + --CPU '=[specify CPU to profile on]:cpu' + ) + ;; + sched-timehist) + short+=( + --idle-hist -I + --migrations -M + --next -n + --cpu-visual -V + --wakeups -w + ) + full+=( + --cpu-visual '[add CPU visual]' + --idle-hist '[show idle events only]' + --migrations '[show migration events]' + --next '[show next task]' + --state '[show task state when sched-out]' + --wakeups '[show wakeup events]' + ) + ;; + (*-|)script) + short+=( --comms -c --gen-script -g --Latency -L --debug-mode -d ) + full+=( + --debug-mode '[do various checks like samples ordering and lost events]' + --gen-script '=[generate perf-script.xx script in specified language]:language' + --script '=[specify script file name]:script file name:_files' + ) + unset 'short[--pid]' + unset 'short[--dsos]' + unset 'short[--tid]' + fields=( + comm tid pid time cpu event trace ip sym dso addr symoff + srcline period iregs uregs brstack brstacksym flags + bpf-output brstackinsn brstackoff callindent insn insnlen + synth phys_addr metric misc ipc tod data_page_size + code_page_size + ) + ;; + *stat*) + full+=( + --big-num "[print large numbers with thousands' separators]" + --delay '=[wait after starting program]:delay (msecs)' + --key '=[specify key for sorting]:key:(sample time)' + --no-aggr '[disable CPU count aggregation]' + --transaction '[hardware transaction statistics]' + ) + short+=( + --no-aggr -A + --big-num -B + --detailed -d + --group -g + --interval-print -I + --metrics -M + --null -n + --sync -S + --transaction -T + ) + exclude+=( + --log-fd '(-o --output)' + --output '(--log-fd)' + ) + unset 'short[--quiet]' + ;; + test*) + short+=( --dont-fork -F --skip -s ) + full+=( + --dont-fork "[don't fork for testcase]" + --skip '=[specify tests to skip]:test' + ) + ;; + timechart) + short+=( --width -w --topology -t --proc-num -n --process -p ) + full+=( + --highlight '=[highlight tasks that outlast duration or with given name]:duration or name' + --io-skip-eagain "[don't draw EAGAIN IO events]" + --io-min-time '=[all IO faster than minimum time will visually appear longer]: :_numbers -u ns -d 1ms time ms us' + --io-merge-dist '=[merge events that are within specified time]: :_numbers -u ns -d 1us time ms us' + --process '=[select process]:process:_pids' + --proc-num '=[specify minimum number of tasks to print]:tasks' + --topology '[sort CPUs according to topology]' + --width '=[specify page width]:page width' + ) + ;; + (kvm-|)top) + full+=( + --delay '=[specify delay between refreshes]:delay (seconds)' + --comms '=[only consider symbols in specified comms]:comm' + --dsos '=[only consider symbols in these dsos]:dso' + --overwrite '[use a backward ring buffer]' + ) + short+=( + --count-filter -f + --delay -d + --dump-symtab -D + --entries -E + ) + unset 'short[--dsos]' + unset 'short[--fields]' + unset 'short[--force]' + unset 'short[--symbols]' + sortkeys=( + pid comm dso symbol parent srcline weight local_weight + abort in_tx transaction overhead sample period + ) + fields=( overhead period sample $sortkeys ) + ;; + trace) + short+=( + --pf -F + --summary -s + --time -T + ) + full+=( + --pf '=[trace pagefaults]::type [maj]:(all min maj)' + --time '[show full timestamp, not relative]' + ) + unset 'short[--no-inherit]' + ;; + esac + if (( !skip )); then + subcmds=( $(_call_program commands "$cmd --list-cmds|grep -v -e '^#' -e Unknown") ) + opts=( $(_call_program options "$cmd --list-opts|grep -v -e '^#' -e Unknown") ) + fi + + for (( i = $#opts; i; i-- )); do + opts[i]=( + ${exclude[$opts[i]]}${opts[i]}${full[$opts[i]]} + ${short[$opts[i]]:+${exclude[$opts[i]]}${short[$opts[i]]}${full[$opts[i]]/(#s)=/+}} + ) + done + (( $#subcmds)) && opts+=( + "${ign}(- *)--list-cmds[list available subcommands]" \ + '1: :->subsubcmds' + '*:: :->args' + ) + (( $#opts )) && opts+=( + "${ign}(- *)--help[display help information]" + "${ign}(- *)--list-opts[list available options]" + ) + _arguments -C $opts $args \ + "${ign}(- *)-h[display brief usage summary]" + ;; + event-types) + _wanted event-types expl 'event type' compadd - hw sw cache pmu tracepoint event_glob + ;& + events) + _wanted events expl event compadd - \ + ${${=${${(f)"$(_call_program events perf list hw sw cache pmu tracepoint event_glob)"}[2,-5]# }%% [ \[]*}:#OR} + ;; + itrace-opts) + _values -s '' "itrace option [ibxwpe]" \ + 'i[synthesize instructions events]' \ + 'b[synthesize branches events (branch misses for Arm SPE)]' \ + 'c[synthesize branches events (calls only)]' \ + 'r[synthesize branches events (returns only)]' \ + 'x[synthesize transactions events]' \ + 'w[synthesize ptwrite events]' \ + 'p[synthesize power events (incl. PSB events for Intel PT)]' \ + 'o[synthesize other events recorded due to the use of aux-output]' \ + 'e[synthesize error events]' \ + 'd[create a debug log]' \ + 'f[synthesize first level cache events]' \ + 'm[synthesize last level cache events]' \ + 'M[synthesize memory events]' \ + 't[synthesize TLB events]' \ + 'a[synthesize remote access events]' \ + 'g[synthesize a call chain (use with i or x)]' \ + 'G[synthesize a call chain on existing event records]' \ + 'l[synthesize last branch entries (use with i or x)]' \ + 'L[synthesize last branch entries on existing event records]' \ + 's[skip initial number of events]' \ + 'q[quicker (less detailed) decoding]' \ + 'Z[prefer to ignore timestamps (so-called "timeless" decoding)]' + ;; + fields) + _sequence _wanted fields expl 'field' compadd - -a fields + ;; + sort-keys) + _sequence _wanted sort-keys expl 'sort key' compadd - -a sortkeys + ;; + esac +done + +[[ nm -ne compstate[nmatches] ]] -- cgit 1.4.1