Patch "tracing: Use a struct alignof to determine trace event field alignment" has been added to the 5.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    tracing: Use a struct alignof to determine trace event field alignment

to the 5.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     tracing-use-a-struct-alignof-to-determine-trace-even.patch
and it can be found in the queue-5.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 017769f9a2fa4c4aa149d6b921b07fd804b701fa
Author: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx>
Date:   Sun Jul 31 01:59:28 2022 -0400

    tracing: Use a struct alignof to determine trace event field alignment
    
    [ Upstream commit 4c3d2f9388d36eb28640a220a6f908328442d873 ]
    
    alignof() gives an alignment of types as they would be as standalone
    variables. But alignment in structures might be different, and when
    building the fields of events, the alignment must be the actual
    alignment otherwise the field offsets may not match what they actually
    are.
    
    This caused trace-cmd to crash, as libtraceevent did not check if the
    field offset was bigger than the event. The write_msr and read_msr
    events on 32 bit had their fields incorrect, because it had a u64 field
    between two ints. alignof(u64) would give 8, but the u64 field was at a
    4 byte alignment.
    
    Define a macro as:
    
       ALIGN_STRUCTFIELD(type) ((int)(offsetof(struct {char a; type b;}, b)))
    
    which gives the actual alignment of types in a structure.
    
    Link: https://lkml.kernel.org/r/20220731015928.7ab3a154@xxxxxxxxxxxxxxxxxxxx
    
    Cc: Ingo Molnar <mingo@xxxxxxxxxx>
    Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
    Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
    Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Cc: Masami Hiramatsu <mhiramat@xxxxxxxxxx>
    Cc: stable@xxxxxxxxxxxxxxx
    Fixes: 04ae87a52074e ("ftrace: Rework event_create_dir()")
    Signed-off-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/trace/stages/stage4_event_fields.h b/include/trace/stages/stage4_event_fields.h
index c3790ec7a453..80d34f396555 100644
--- a/include/trace/stages/stage4_event_fields.h
+++ b/include/trace/stages/stage4_event_fields.h
@@ -2,16 +2,18 @@
 
 /* Stage 4 definitions for creating trace events */
 
+#define ALIGN_STRUCTFIELD(type) ((int)(offsetof(struct {char a; type b;}, b)))
+
 #undef __field_ext
 #define __field_ext(_type, _item, _filter_type) {			\
 	.type = #_type, .name = #_item,					\
-	.size = sizeof(_type), .align = __alignof__(_type),		\
+	.size = sizeof(_type), .align = ALIGN_STRUCTFIELD(_type),	\
 	.is_signed = is_signed_type(_type), .filter_type = _filter_type },
 
 #undef __field_struct_ext
 #define __field_struct_ext(_type, _item, _filter_type) {		\
 	.type = #_type, .name = #_item,					\
-	.size = sizeof(_type), .align = __alignof__(_type),		\
+	.size = sizeof(_type), .align = ALIGN_STRUCTFIELD(_type),	\
 	0, .filter_type = _filter_type },
 
 #undef __field
@@ -23,7 +25,7 @@
 #undef __array
 #define __array(_type, _item, _len) {					\
 	.type = #_type"["__stringify(_len)"]", .name = #_item,		\
-	.size = sizeof(_type[_len]), .align = __alignof__(_type),	\
+	.size = sizeof(_type[_len]), .align = ALIGN_STRUCTFIELD(_type),	\
 	.is_signed = is_signed_type(_type), .filter_type = FILTER_OTHER },
 
 #undef __dynamic_array



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux