Skip to content

Commit 46aea2c

Browse files
rostedtmartinkpetersen
authored andcommitted
scsi: ufs: core: tracing: Do not dereference pointers in TP_printk()
The trace events in drivers/ufs/core/ufs_trace.h were converted to take a pointer to the hba structure as an argument for the tracepoint and then in TP_printk() the printing of the dev_name from the ring buffer was converted to using the dev dereferenced pointer from the hba saved pointer. This is not allowed as the TP_printk() is executed at the time the trace event is read from /sys/kernel/tracing/trace file. That can happen literally, seconds, minutes, hours, weeks, days, or even months later! There is no guarantee that the hba pointer will still exist by the time it is dereferenced when the "trace" file is read. Instead, save the device name from the hba pointer at the time the tracepoint is called and place it into the ring buffer event. Then the TP_printk() can read the name directly from the ring buffer and remove the possibility that it will read a freed pointer and crash the kernel. This was detected when testing the trace event code that looks for TP_printk() parameters doing illegal derferences[1] [1] https://lore.kernel.org/all/20260630184836.74d477b6@gandalf.local.home/ Cc: stable@vger.kernel.org Fixes: 583e518 ("scsi: ufs: core: Add hba parameter to trace events") Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Reviewed-by: Peter Wang <peter.wang@mediatek.com> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Link: https://patch.msgid.link/20260630185412.283c26c5@gandalf.local.home Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent c41375e commit 46aea2c

1 file changed

Lines changed: 27 additions & 9 deletions

File tree

drivers/ufs/core/ufs_trace.h

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,18 @@ TRACE_EVENT(ufshcd_clk_gating,
8989

9090
TP_STRUCT__entry(
9191
__field(struct ufs_hba *, hba)
92+
__string(dev_name, dev_name(hba->dev))
9293
__field(int, state)
9394
),
9495

9596
TP_fast_assign(
97+
__assign_str(dev_name);
9698
__entry->hba = hba;
9799
__entry->state = state;
98100
),
99101

100102
TP_printk("%s: gating state changed to %s",
101-
dev_name(__entry->hba->dev),
103+
__get_str(dev_name),
102104
__print_symbolic(__entry->state, UFSCHD_CLK_GATING_STATES))
103105
);
104106

@@ -111,6 +113,7 @@ TRACE_EVENT(ufshcd_clk_scaling,
111113

112114
TP_STRUCT__entry(
113115
__field(struct ufs_hba *, hba)
116+
__string(dev_name, dev_name(hba->dev))
114117
__string(state, state)
115118
__string(clk, clk)
116119
__field(u32, prev_state)
@@ -119,14 +122,15 @@ TRACE_EVENT(ufshcd_clk_scaling,
119122

120123
TP_fast_assign(
121124
__entry->hba = hba;
125+
__assign_str(dev_name);
122126
__assign_str(state);
123127
__assign_str(clk);
124128
__entry->prev_state = prev_state;
125129
__entry->curr_state = curr_state;
126130
),
127131

128132
TP_printk("%s: %s %s from %u to %u Hz",
129-
dev_name(__entry->hba->dev), __get_str(state), __get_str(clk),
133+
__get_str(dev_name), __get_str(state), __get_str(clk),
130134
__entry->prev_state, __entry->curr_state)
131135
);
132136

@@ -138,16 +142,18 @@ TRACE_EVENT(ufshcd_auto_bkops_state,
138142

139143
TP_STRUCT__entry(
140144
__field(struct ufs_hba *, hba)
145+
__string(dev_name, dev_name(hba->dev))
141146
__string(state, state)
142147
),
143148

144149
TP_fast_assign(
145150
__entry->hba = hba;
151+
__assign_str(dev_name);
146152
__assign_str(state);
147153
),
148154

149155
TP_printk("%s: auto bkops - %s",
150-
dev_name(__entry->hba->dev), __get_str(state))
156+
__get_str(dev_name), __get_str(state))
151157
);
152158

153159
DECLARE_EVENT_CLASS(ufshcd_profiling_template,
@@ -158,20 +164,22 @@ DECLARE_EVENT_CLASS(ufshcd_profiling_template,
158164

159165
TP_STRUCT__entry(
160166
__field(struct ufs_hba *, hba)
167+
__string(dev_name, dev_name(hba->dev))
161168
__string(profile_info, profile_info)
162169
__field(s64, time_us)
163170
__field(int, err)
164171
),
165172

166173
TP_fast_assign(
167174
__entry->hba = hba;
175+
__assign_str(dev_name);
168176
__assign_str(profile_info);
169177
__entry->time_us = time_us;
170178
__entry->err = err;
171179
),
172180

173181
TP_printk("%s: %s: took %lld usecs, err %d",
174-
dev_name(__entry->hba->dev), __get_str(profile_info),
182+
__get_str(dev_name), __get_str(profile_info),
175183
__entry->time_us, __entry->err)
176184
);
177185

@@ -200,6 +208,7 @@ DECLARE_EVENT_CLASS(ufshcd_template,
200208
__field(s64, usecs)
201209
__field(int, err)
202210
__field(struct ufs_hba *, hba)
211+
__string(dev_name, dev_name(hba->dev))
203212
__field(int, dev_state)
204213
__field(int, link_state)
205214
),
@@ -208,13 +217,14 @@ DECLARE_EVENT_CLASS(ufshcd_template,
208217
__entry->usecs = usecs;
209218
__entry->err = err;
210219
__entry->hba = hba;
220+
__assign_str(dev_name);
211221
__entry->dev_state = dev_state;
212222
__entry->link_state = link_state;
213223
),
214224

215225
TP_printk(
216226
"%s: took %lld usecs, dev_state: %s, link_state: %s, err %d",
217-
dev_name(__entry->hba->dev),
227+
__get_str(dev_name),
218228
__entry->usecs,
219229
__print_symbolic(__entry->dev_state, UFS_PWR_MODES),
220230
__print_symbolic(__entry->link_state, UFS_LINK_STATES),
@@ -279,6 +289,7 @@ TRACE_EVENT(ufshcd_command,
279289
TP_STRUCT__entry(
280290
__field(struct scsi_device *, sdev)
281291
__field(struct ufs_hba *, hba)
292+
__string(dev_name, dev_name(&sdev->sdev_dev))
282293
__field(enum ufs_trace_str_t, str_t)
283294
__field(unsigned int, tag)
284295
__field(u32, doorbell)
@@ -291,6 +302,7 @@ TRACE_EVENT(ufshcd_command,
291302
),
292303

293304
TP_fast_assign(
305+
__assign_str(dev_name);
294306
__entry->sdev = sdev;
295307
__entry->hba = hba;
296308
__entry->str_t = str_t;
@@ -307,7 +319,7 @@ TRACE_EVENT(ufshcd_command,
307319
TP_printk(
308320
"%s: %s: tag: %u, DB: 0x%x, size: %d, IS: %u, LBA: %llu, opcode: 0x%x (%s), group_id: 0x%x, hwq_id: %d",
309321
show_ufs_cmd_trace_str(__entry->str_t),
310-
dev_name(&__entry->sdev->sdev_dev), __entry->tag,
322+
__get_str(dev_name), __entry->tag,
311323
__entry->doorbell, __entry->transfer_len, __entry->intr,
312324
__entry->lba, (u32)__entry->opcode, str_opcode(__entry->opcode),
313325
(u32)__entry->group_id, __entry->hwq_id
@@ -322,6 +334,7 @@ TRACE_EVENT(ufshcd_uic_command,
322334

323335
TP_STRUCT__entry(
324336
__field(struct ufs_hba *, hba)
337+
__string(dev_name, dev_name(hba->dev))
325338
__field(enum ufs_trace_str_t, str_t)
326339
__field(u32, cmd)
327340
__field(u32, arg1)
@@ -331,6 +344,7 @@ TRACE_EVENT(ufshcd_uic_command,
331344

332345
TP_fast_assign(
333346
__entry->hba = hba;
347+
__assign_str(dev_name);
334348
__entry->str_t = str_t;
335349
__entry->cmd = cmd;
336350
__entry->arg1 = arg1;
@@ -340,7 +354,7 @@ TRACE_EVENT(ufshcd_uic_command,
340354

341355
TP_printk(
342356
"%s: %s: cmd: 0x%x, arg1: 0x%x, arg2: 0x%x, arg3: 0x%x",
343-
show_ufs_cmd_trace_str(__entry->str_t), dev_name(__entry->hba->dev),
357+
show_ufs_cmd_trace_str(__entry->str_t), __get_str(dev_name),
344358
__entry->cmd, __entry->arg1, __entry->arg2, __entry->arg3
345359
)
346360
);
@@ -353,6 +367,7 @@ TRACE_EVENT(ufshcd_upiu,
353367

354368
TP_STRUCT__entry(
355369
__field(struct ufs_hba *, hba)
370+
__string(dev_name, dev_name(hba->dev))
356371
__field(enum ufs_trace_str_t, str_t)
357372
__array(unsigned char, hdr, 12)
358373
__array(unsigned char, tsf, 16)
@@ -361,6 +376,7 @@ TRACE_EVENT(ufshcd_upiu,
361376

362377
TP_fast_assign(
363378
__entry->hba = hba;
379+
__assign_str(dev_name);
364380
__entry->str_t = str_t;
365381
memcpy(__entry->hdr, hdr, sizeof(__entry->hdr));
366382
memcpy(__entry->tsf, tsf, sizeof(__entry->tsf));
@@ -369,7 +385,7 @@ TRACE_EVENT(ufshcd_upiu,
369385

370386
TP_printk(
371387
"%s: %s: HDR:%s, %s:%s",
372-
show_ufs_cmd_trace_str(__entry->str_t), dev_name(__entry->hba->dev),
388+
show_ufs_cmd_trace_str(__entry->str_t), __get_str(dev_name),
373389
__print_hex(__entry->hdr, sizeof(__entry->hdr)),
374390
show_ufs_cmd_trace_tsf(__entry->tsf_t),
375391
__print_hex(__entry->tsf, sizeof(__entry->tsf))
@@ -384,16 +400,18 @@ TRACE_EVENT(ufshcd_exception_event,
384400

385401
TP_STRUCT__entry(
386402
__field(struct ufs_hba *, hba)
403+
__string(dev_name, dev_name(hba->dev))
387404
__field(u16, status)
388405
),
389406

390407
TP_fast_assign(
391408
__entry->hba = hba;
409+
__assign_str(dev_name);
392410
__entry->status = status;
393411
),
394412

395413
TP_printk("%s: status 0x%x",
396-
dev_name(__entry->hba->dev), __entry->status
414+
__get_str(dev_name), __entry->status
397415
)
398416
);
399417

0 commit comments

Comments
 (0)