Skip to content

Commit fe6e096

Browse files
svens-s390rostedt
authored andcommitted
tracing: Fix endianness bug in histogram trigger
At least on PA-RISC and s390 synthetic histogram triggers are failing selftests because trace_event_raw_event_synth() always writes a 64 bit values, but the reader expects a field->size sized value. On little endian machines this doesn't hurt, but on big endian this makes the reader always read zero values. Link: http://lore.kernel.org/linux-trace-devel/[email protected] Cc: [email protected] Fixes: 4b14793 ("tracing: Add support for 'synthetic' events") Acked-by: Tom Zanussi <[email protected]> Signed-off-by: Sven Schnelle <[email protected]> Signed-off-by: Steven Rostedt (VMware) <[email protected]>
1 parent 01f36a5 commit fe6e096

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

kernel/trace/trace_events_hist.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,26 @@ static notrace void trace_event_raw_event_synth(void *__data,
911911
strscpy(str_field, str_val, STR_VAR_LEN_MAX);
912912
n_u64 += STR_VAR_LEN_MAX / sizeof(u64);
913913
} else {
914-
entry->fields[n_u64] = var_ref_vals[var_ref_idx + i];
914+
struct synth_field *field = event->fields[i];
915+
u64 val = var_ref_vals[var_ref_idx + i];
916+
917+
switch (field->size) {
918+
case 1:
919+
*(u8 *)&entry->fields[n_u64] = (u8)val;
920+
break;
921+
922+
case 2:
923+
*(u16 *)&entry->fields[n_u64] = (u16)val;
924+
break;
925+
926+
case 4:
927+
*(u32 *)&entry->fields[n_u64] = (u32)val;
928+
break;
929+
930+
default:
931+
entry->fields[n_u64] = val;
932+
break;
933+
}
915934
n_u64++;
916935
}
917936
}

0 commit comments

Comments
 (0)