• Wang Nan's avatar
    perf data: Explicitly set byte order for integer types · f8dd2d5f
    Wang Nan authored
    After babeltrace commit 5cec03e402aa ("ir: copy variants and sequences
    when setting a field path"), 'perf data convert' gets incorrect result
    if there's bpf output data. For example:
    
     # perf data convert --to-ctf ./out.ctf
     # babeltrace ./out.ctf
     [10:44:31.186045346] (+?.?????????) evt: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF810E7DD1, perf_tid = 23819, perf_pid = 23819, perf_id = 518, raw_len = 3, raw_data = [ [0] = 0xC028E32F, [1] = 0x815D0100, [2] = 0x1000000 ] }
     [10:44:31.286101003] (+0.100055657) evt: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF8105B609, perf_tid = 23819, perf_pid = 23819, perf_id = 518, raw_len = 3, raw_data = [ [0] = 0x35D9F1EB, [1] = 0x15D81, [2] = 0x2 ] }
    
    The expected result of the first sample should be:
    
     raw_data = [ [0] = 0x2FE328C0, [1] = 0x15D81, [2] = 0x1 ] }
    
    however, 'perf data convert' output big endian value to resuling CTF
    file.
    
    The reason is a internal change (or a bug?) of babeltrace.
    
    Before this patch, at the first add_bpf_output_values(), byte order of
    all integer type is uncertain (is 0, neither 1234 (le) nor 4321 (be)).
    It would be fixed by:
    
    perf_evlist__deliver_sample
     -> process_sample_event
       -> ctf_stream
          ...
          ->bt_ctf_trace_add_stream_class
            ->bt_ctf_field_type_structure_set_byte_order
              ->bt_ctf_field_type_integer_set_byte_order
    
    during creating the stream.
    
    However, the babeltrace commit mentioned above duplicates types in
    sequence to prevent potential conflict in following call stack and link
    the newly allocated type into the 'raw_data' sequence:
    
    perf_evlist__deliver_sample
     -> process_sample_event
       -> ctf_stream
          ...
          -> bt_ctf_trace_add_stream_class
            -> bt_ctf_stream_class_resolve_types
               ...
               -> bt_ctf_field_type_sequence_copy
                 ->bt_ctf_field_type_integer_copy
    
    This happens before byte order setting, so only the newly allocated
    type is initialized, the byte order of original type perf choose to
    create the first raw_data is still uncertain.
    
    Byte order in CTF output is not related to byte order in perf.data.
    Setting it to anything other than BT_CTF_BYTE_ORDER_NATIVE solves this
    problem (only BT_CTF_BYTE_ORDER_NATIVE needs to be fixed). To reduce
    behavior changing, set byte order according to compiling options.
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Cc: Jeremie Galarneau <jeremie.galarneau@efficios.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Jérémie Galarneau <jeremie.galarneau@efficios.com>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1456479154-136027-10-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    f8dd2d5f
data-convert-bt.c 30 KB