s390 cio: Rewrite trace point in s390_cio_tsch
authorThomas Richter <tmricht@linux.ibm.com>
Mon, 9 Jul 2018 08:30:34 +0000 (10:30 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 23 Jul 2018 11:49:56 +0000 (13:49 +0200)
Tools like 'perf stat' parse the trace point format files defined
in /sys/kernel/debug/tracing/events/s390/.../format to handle
the print fmt: statement. The kernel provides a library in
directory linux/tools/lib/traceevent/* for this reason.

This library can not handle structures or unions defined in
the TRACE_EVENT/TP_STRUCT__entry macros with __field_struct macro.
There is no possibility to extract a structure member
(which might be a bit field) since there is no packing
information nor bit field offset by parsing the printf fmt line.

Therefore rewrite the TRACE_EVENT macro and add the
__field macro for the necessary members.
Keep the __fieldstruct macro to extract the complete
structure when dumps are analysed.

Note that the same information is displayed, this is no
interface change.

Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Acked-by: Sebastian Ott <sebott@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/trace.h

index 4337317f64fdcef54c3e18340e20bdd70c2de95f..137410da1e9f725f281709c6893af1c99f91bf47 100644 (file)
@@ -89,6 +89,13 @@ TRACE_EVENT(s390_cio_tsch,
                __field(u8, ssid)
                __field(u16, schno)
                __field_struct(struct irb, irb)
+               __field(u8, scsw_dcc)
+               __field(u8, scsw_pno)
+               __field(u8, scsw_fctl)
+               __field(u8, scsw_actl)
+               __field(u8, scsw_stctl)
+               __field(u8, scsw_dstat)
+               __field(u8, scsw_cstat)
                __field(int, cc)
        ),
        TP_fast_assign(
@@ -96,15 +103,22 @@ TRACE_EVENT(s390_cio_tsch,
                __entry->ssid = schid.ssid;
                __entry->schno = schid.sch_no;
                __entry->irb = *irb;
+               __entry->scsw_dcc = scsw_cc(&irb->scsw);
+               __entry->scsw_pno = scsw_pno(&irb->scsw);
+               __entry->scsw_fctl = scsw_fctl(&irb->scsw);
+               __entry->scsw_actl = scsw_actl(&irb->scsw);
+               __entry->scsw_stctl = scsw_stctl(&irb->scsw);
+               __entry->scsw_dstat = scsw_dstat(&irb->scsw);
+               __entry->scsw_cstat = scsw_cstat(&irb->scsw);
                __entry->cc = cc;
        ),
        TP_printk("schid=%x.%x.%04x cc=%d dcc=%d pno=%d fctl=0x%x actl=0x%x "
                  "stctl=0x%x dstat=0x%x cstat=0x%x",
                  __entry->cssid, __entry->ssid, __entry->schno, __entry->cc,
-                 scsw_cc(&__entry->irb.scsw), scsw_pno(&__entry->irb.scsw),
-                 scsw_fctl(&__entry->irb.scsw), scsw_actl(&__entry->irb.scsw),
-                 scsw_stctl(&__entry->irb.scsw),
-                 scsw_dstat(&__entry->irb.scsw), scsw_cstat(&__entry->irb.scsw)
+                 __entry->scsw_dcc, __entry->scsw_pno,
+                 __entry->scsw_fctl, __entry->scsw_actl,
+                 __entry->scsw_stctl,
+                 __entry->scsw_dstat, __entry->scsw_cstat
        )
 );