• F
    perf sched: Fix bad event alignment · 46538818
    Frederic Weisbecker 提交于
    perf sched raises the following error when it meets a sched
    switch event:
    
    perf: builtin-sched.c:286: register_pid: Assertion `!(pid >= 65536)' failed.
    Abandon
    
    Currently in x86-64, the sched switch events have a hole in the
    middle of the structure:
    
    	u16 common_type;
    	u8 common_flags;
    	u8 common_preempt_count;
    	u32 common_pid;
    	u32 common_tgid;
    
    	char prev_comm[16];
    	u32 prev_pid;
    	u32 prev_prio;
    			<--- there
    	u64 prev_state;
    	char next_comm[16];
    	u32 next_pid;
    	u32 next_prio;
    
    Gcc inserts a 4 bytes hole there for prev_state to be u64
    aligned. And the events are exported to userspace with this
    hole.
    
    But in userspace, from perf sched, we fetch it using a
    structure that has a new field in the beginning: u32 size. This
    is because our trace is exported with its size as a field. But
    now that we have this new field, the hole in the middle
    disappears because it makes prev_state becoming well aligned.
    
    And since we are using a pointer to the raw trace using this
    struct, instead of reading prev_state, we are reading the hole.
    
    We could fix it by keeping the size seperate from the struct
    but actually there a lot of other potential problems: some
    fields may be saved as long in a 64 bits system and later read
    as long in a 32 bits system. Also this direct cast doesn't care
    about the endianness differences between the host traced
    machine and the machine in which we do the post processing.
    
    So instead of using such dangerous direct casts, fetch the
    values using the trace parsing API that already takes care of
    all these problems.
    Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    46538818
trace-event-parse.c 58.5 KB