[PATCH] scsi: ufs: mediatek: Fix page faults in ufs_mtk_clk_scale trace event

Peter Wang (王信友) peter.wang at mediatek.com
Mon Feb 2 00:14:57 PST 2026


On Mon, 2026-02-02 at 11:45 +0900, Keita Morisaki wrote:
> 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 at tier4.jp>
> ---
>  drivers/ufs/host/ufs-mediatek-trace.h | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/ufs/host/ufs-mediatek-trace.h
> b/drivers/ufs/host/ufs-mediatek-trace.h
> index b5f2ec314..0df8ac843 100644
> --- a/drivers/ufs/host/ufs-mediatek-trace.h
> +++ b/drivers/ufs/host/ufs-mediatek-trace.h
> @@ -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)
>  );
> 

Hi Keita Morisaki,

Thank you for fixing this bug.

Reviewed-by: Peter Wang <peter.wang at mediatek.com>



More information about the Linux-mediatek mailing list