]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: ufs: mediatek: Fix page faults in ufs_mtk_clk_scale() trace event
authorKeita Morisaki <keita.morisaki@tier4.jp>
Mon, 2 Feb 2026 02:45:26 +0000 (11:45 +0900)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 4 Feb 2026 03:25:49 +0000 (22:25 -0500)
The ufs_mtk_clk_scale() trace event currently stores the address of the
name string directly via __field(const char *, name). This pointer may
become invalid after the module is unloaded, causing page faults when the
trace buffer is subsequently accessed.

This can occur because the MediaTek UFS driver can be configured as a
loadable module (tristate in Kconfig), meaning the name string passed to
the trace event may reside in module memory that becomes invalid after
module unload.

Fix this by using __string() and __assign_str() to copy the string contents
into the ring buffer instead of storing the pointer. This ensures the trace
data remains valid regardless of module state.

This change increases the memory usage for each ftrace entry by a few bytes
(clock names are typically 7-15 characters like "ufs_sel" or
"ufs_sel_max_src") compared to storing an 8-byte pointer.

Note that this change does not affect anything unless all of the following
conditions are met:

 - CONFIG_SCSI_UFS_MEDIATEK is enabled

 - ftrace tracing is enabled

 - The ufs_mtk_clk_scale event is enabled in ftrace

Signed-off-by: Keita Morisaki <keita.morisaki@tier4.jp>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Link: https://patch.msgid.link/20260202024526.122515-1-keita.morisaki@tier4.jp
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/host/ufs-mediatek-trace.h

index b5f2ec3140748f0c4ba1f14156299f47f2584987..0df8ac843379a88c9f978aadf2e59105c4492f3e 100644 (file)
@@ -33,19 +33,19 @@ TRACE_EVENT(ufs_mtk_clk_scale,
        TP_ARGS(name, scale_up, clk_rate),
 
        TP_STRUCT__entry(
-               __field(const char*, name)
+               __string(name, name)
                __field(bool, scale_up)
                __field(unsigned long, clk_rate)
        ),
 
        TP_fast_assign(
-               __entry->name = name;
+               __assign_str(name);
                __entry->scale_up = scale_up;
                __entry->clk_rate = clk_rate;
        ),
 
        TP_printk("ufs: clk (%s) scaled %s @ %lu",
-                 __entry->name,
+                 __get_str(name),
                  __entry->scale_up ? "up" : "down",
                  __entry->clk_rate)
 );