[V2,1/4] scsi: ufs: Add exception event tracepoint
diff mbox series

Message ID 20210209062437.6954-2-adrian.hunter@intel.com
State In Next
Commit 26b01633fac865efd0b142dab19dcadf9812041e
Headers show
Series
  • scsi: ufs-debugfs: Add UFS Exception Event reporting
Related show

Commit Message

Adrian Hunter Feb. 9, 2021, 6:24 a.m. UTC
Currently, exception event status can be read from wExceptionEventStatus
attribute (sysfs file attributes/exception_event_status under the UFS host
controller device directory). Polling that attribute to track UFS exception
events is impractical, so add a tracepoint to track exception events for
testing and debugging purposes.

Note, by the time the exception event status is read, the exception event
may have cleared, so the value can be zero - see example below.

Note also, only enabled exception events can be reported. A subsequent
patch adds the ability for users to enable selected exception events via
debugfs.

Example with driver instrumented to enable all exception events:

  # echo 1 > /sys/kernel/debug/tracing/events/ufs/ufshcd_exception_event/enable

  ... do some I/O ...

  # cat /sys/kernel/debug/tracing/trace
  # tracer: nop
  #
  # entries-in-buffer/entries-written: 3/3   #P:5
  #
  #                                _-----=> irqs-off
  #                               / _----=> need-resched
  #                              | / _---=> hardirq/softirq
  #                              || / _--=> preempt-depth
  #                              ||| /     delay
  #           TASK-PID     CPU#  ||||   TIMESTAMP  FUNCTION
  #              | |         |   ||||      |         |
       kworker/2:2-173     [002] ....   731.486419: ufshcd_exception_event: 0000:00:12.5: status 0x0
       kworker/2:2-173     [002] ....   732.608918: ufshcd_exception_event: 0000:00:12.5: status 0x4
       kworker/2:2-173     [002] ....   732.609312: ufshcd_exception_event: 0000:00:12.5: status 0x4

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
 drivers/scsi/ufs/ufshcd.c  |  2 ++
 include/trace/events/ufs.h | 21 +++++++++++++++++++++
 2 files changed, 23 insertions(+)

Comments

Avri Altman Feb. 10, 2021, 6:09 p.m. UTC | #1
> 
> Currently, exception event status can be read from wExceptionEventStatus
> attribute (sysfs file attributes/exception_event_status under the UFS host
> controller device directory). Polling that attribute to track UFS exception
> events is impractical, so add a tracepoint to track exception events for
> testing and debugging purposes.
> 
> Note, by the time the exception event status is read, the exception event
> may have cleared, so the value can be zero - see example below.
> 
> Note also, only enabled exception events can be reported. A subsequent
> patch adds the ability for users to enable selected exception events via
> debugfs.
> 
> Example with driver instrumented to enable all exception events:
> 
>   # echo 1 >
> /sys/kernel/debug/tracing/events/ufs/ufshcd_exception_event/enable
> 
>   ... do some I/O ...
> 
>   # cat /sys/kernel/debug/tracing/trace
>   # tracer: nop
>   #
>   # entries-in-buffer/entries-written: 3/3   #P:5
>   #
>   #                                _-----=> irqs-off
>   #                               / _----=> need-resched
>   #                              | / _---=> hardirq/softirq
>   #                              || / _--=> preempt-depth
>   #                              ||| /     delay
>   #           TASK-PID     CPU#  ||||   TIMESTAMP  FUNCTION
>   #              | |         |   ||||      |         |
>        kworker/2:2-173     [002] ....   731.486419: ufshcd_exception_event:
> 0000:00:12.5: status 0x0
>        kworker/2:2-173     [002] ....   732.608918: ufshcd_exception_event:
> 0000:00:12.5: status 0x4
>        kworker/2:2-173     [002] ....   732.609312: ufshcd_exception_event:
> 0000:00:12.5: status 0x4
> 
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Bean Huo Feb. 14, 2021, 10:47 a.m. UTC | #2
On Tue, 2021-02-09 at 08:24 +0200, Adrian Hunter wrote:
>   # cat /sys/kernel/debug/tracing/trace
>   # tracer: nop
>   #
>   # entries-in-buffer/entries-written: 3/3   #P:5
>   #
>   #                                _-----=> irqs-off
>   #                               / _----=> need-resched
>   #                              | / _---=> hardirq/softirq
>   #                              || / _--=> preempt-depth
>   #                              ||| /     delay
>   #           TASK-PID     CPU#  ||||   TIMESTAMP  FUNCTION
>   #              | |         |   ||||      |         |
>        kworker/2:2-173     [002] ....   731.486419:
> ufshcd_exception_event: 0000:00:12.5: status 0x0
>        kworker/2:2-173     [002] ....   732.608918:
> ufshcd_exception_event: 0000:00:12.5: status 0x4
>        kworker/2:2-173     [002] ....   732.609312:
> ufshcd_exception_event: 0000:00:12.5: status 0x4
> 
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Bean Huo <beanhuo@micron.com>

Patch
diff mbox series

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 721f55db181f..d6fdce655388 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -5616,6 +5616,8 @@  static void ufshcd_exception_event_handler(struct work_struct *work)
 		goto out;
 	}
 
+	trace_ufshcd_exception_event(dev_name(hba->dev), status);
+
 	status &= hba->ee_ctrl_mask;
 
 	if (status & MASK_EE_URGENT_BKOPS)
diff --git a/include/trace/events/ufs.h b/include/trace/events/ufs.h
index e151477d645c..1cb6f1afba0e 100644
--- a/include/trace/events/ufs.h
+++ b/include/trace/events/ufs.h
@@ -349,6 +349,27 @@  TRACE_EVENT(ufshcd_upiu,
 	)
 );
 
+TRACE_EVENT(ufshcd_exception_event,
+
+	TP_PROTO(const char *dev_name, u16 status),
+
+	TP_ARGS(dev_name, status),
+
+	TP_STRUCT__entry(
+		__string(dev_name, dev_name)
+		__field(u16, status)
+	),
+
+	TP_fast_assign(
+		__assign_str(dev_name, dev_name);
+		__entry->status = status;
+	),
+
+	TP_printk("%s: status 0x%x",
+		__get_str(dev_name), __entry->status
+	)
+);
+
 #endif /* if !defined(_TRACE_UFS_H) || defined(TRACE_HEADER_MULTI_READ) */
 
 /* This part must be outside protection */