• David Ahern's avatar
    perf tool: Fix endianness handling of u32 data in samples · 936be503
    David Ahern authored
    Currently, analyzing PPC data files on x86 the cpu field is always 0 and
    the tid and pid are backwards. For example, analyzing a PPC file on PPC
    the pid/tid fields show:
    
            rsyslogd  1210/1212
    
    and analyzing the same PPC file using an x86 perf binary shows:
    
            rsyslogd  1212/1210
    
    The problem is that the swap_op method for samples is
    perf_event__all64_swap which assumes all elements in the sample_data
    struct are u64s. cpu, tid and pid are u32s and need to be handled
    individually. Given that the swap is done before the sample is parsed,
    the simplest solution is to undo the 64-bit swap of those elements when
    the sample is parsed and do the proper swap.
    
    The RAW data field is generic and perf cannot have programmatic knowledge
    of how to treat that data. Instead a warning is given to the user.
    
    Thanks to Anton Blanchard for providing a data file for a mult-CPU
    PPC system so I could verify the fix for the CPU fields.
    
    v3 -> v4:
    - fixed use of WARN_ONCE
    
    v2 -> v3:
    - used WARN_ONCE for message regarding raw data
    - removed struct wrapper around union
    - fixed whitespace issues
    
    v1 -> v2:
    - added a union for undoing the byte-swap on u64 and redoing swap on
      u32's to address compiler errors (see git commit 65014ab3)
    
    Cc: Anton Blanchard <anton@samba.org>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/1315321946-16993-1-git-send-email-dsahern@gmail.comSigned-off-by: default avatarDavid Ahern <dsahern@gmail.com>
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    936be503
event.h 4.44 KB