• Yang Jihong's avatar
    perf kwork: Implement 'report' subcommand · f98919ec
    Yang Jihong authored
    Implements framework of 'perf kwork report', which is used to report
    time properties such as run time and frequency:
    
    Test cases:
    
      # perf kwork
    
       Usage: perf kwork [<options>] {record|report}
    
          -D, --dump-raw-trace  dump raw trace in ASCII
          -f, --force           don't complain, do it
          -k, --kwork <kwork>   list of kwork to profile (irq, softirq, workqueue, etc)
          -v, --verbose         be more verbose (show symbol address, etc)
    
      # perf kwork report -h
    
       Usage: perf kwork report [<options>]
    
          -C, --cpu <cpu>       list of cpus to profile
          -i, --input <file>    input file name
          -n, --name <name>     event name to profile
          -s, --sort <key[,key2...]>
                                sort by key(s): runtime, max, count
          -S, --with-summary    Show summary with statistics
              --time <str>      Time span for analysis (start,stop)
    
      # perf kwork report
    
        Kwork Name                     | Cpu  | Total Runtime | Count     | Max runtime   | Max runtime start   | Max runtime end     |
       --------------------------------------------------------------------------------------------------------------------------------
       --------------------------------------------------------------------------------------------------------------------------------
    
      # perf kwork report -S
    
        Kwork Name                     | Cpu  | Total Runtime | Count     | Max runtime   | Max runtime start   | Max runtime end     |
       --------------------------------------------------------------------------------------------------------------------------------
       --------------------------------------------------------------------------------------------------------------------------------
        Total count            :         0
        Total runtime   (msec) :     0.000 (0.000% load average)
        Total time span (msec) :     0.000
       --------------------------------------------------------------------------------------------------------------------------------
    
      # perf kwork report -C 0,100
      Requested CPU 100 too large. Consider raising MAX_NR_CPUS
      Invalid cpu bitmap
    
      # perf kwork report -s runtime1
        Error: Unknown --sort key: `runtime1'
    
       Usage: perf kwork report [<options>]
    
          -C, --cpu <cpu>       list of cpus to profile
          -i, --input <file>    input file name
          -n, --name <name>     event name to profile
          -s, --sort <key[,key2...]>
                                sort by key(s): runtime, max, count
          -S, --with-summary    Show summary with statistics
              --time <str>      Time span for analysis (start,stop)
    
      # perf kwork report -i perf_no_exist.data
      failed to open perf_no_exist.data: No such file or directory
    
      # perf kwork report --time 00FFF,
      Invalid time span
    
    Since there are no report supported events, the output is empty.
    
    Briefly describe the data structure:
    
    1. "class" indicates event type. For example, irq and softiq correspond
    to different types.
    
    2. "cluster" refers to a specific event corresponding to a type. For
    example, RCU and TIMER in softirq correspond to different clusters,
    which contains three types of events: raise, entry, and exit.
    
    3. "atom" includes time of each sample and sample of the previous phase.
    (For example, exit corresponds to entry, which is used for timehist.)
    
    Committer notes:
    
    - Add {} for multiline if blocks.
    
    - report_print_work() should either return that ret variable that
      accounts how many bytes were printed or stop accounting and be void.
      Do the former for now to avoid this:
    
    builtin-kwork.c:534:6: error: variable 'ret' set but not used [-Werror,-Wunused-but-set-variable]
            int ret = 0;
                ^
    1 error generated.
    
      When building with:
    
      ⬢[acme@toolbox perf]$ clang --version
      clang version 13.0.0 (https://github.com/llvm/llvm-project e8991caea8690ec2d17b0b7e1c29bf0da6609076)
    
    Also:
    
      -       if ((dst_type >= 0) && (dst_type < KWORK_TRACE_MAX)) {
      +       if (dst_type < KWORK_TRACE_MAX) {
    
    Several versions of clang and at least this gcc:
    
       3    51.40 alpine:3.9                    : FAIL gcc version 8.3.0 (Alpine 8.3.0)
        builtin-kwork.c:411:16: error: comparison of unsigned enum expression >= 0 is
              always true [-Werror,-Wtautological-compare]
                if ((dst_type >= 0) && (dst_type < KWORK_TRACE_MAX)) {
    
    As the first entry in a enum is zero.
    Signed-off-by: default avatarYang Jihong <yangjihong1@huawei.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Paul Clarke <pc@us.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20220709015033.38326-7-yangjihong1@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    f98919ec
perf-kwork.txt 1.41 KB