2020-02-14 16:57:34

by Steven Rostedt

[permalink] [raw]
Subject: [PATCH] xhci: Do not open code __print_symbolic() in xhci trace events

From: Steven Rostedt (VMware) <[email protected]>

libtraceevent (used by perf and trace-cmd) failed to parse the
xhci_urb_dequeue trace event. This is because the user space trace
event format parsing is not a full C compiler. It can handle some basic
logic, but is not meant to be able to handle everything C can do.

In cases where a trace event field needs to be converted from a number
to a string, there's the __print_symbolic() macro that should be used:

See samples/trace_events/trace-events-sample.h

Some xhci trace events open coded the __print_symbolic() causing the
user spaces tools to fail to parse it. This has to be replaced with
__print_symbolic() instead.

CC: [email protected]
Reported-by: Tzvetomir Stoyanov <[email protected]>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=206531
Fixes: 5abdc2e6e12ff ("usb: host: xhci: add urb_enqueue/dequeue/giveback tracers")
Signed-off-by: Steven Rostedt (VMware) <[email protected]>
---
diff --git a/drivers/usb/host/xhci-trace.h b/drivers/usb/host/xhci-trace.h
index 56eb867803a6..b19582b2a72c 100644
--- a/drivers/usb/host/xhci-trace.h
+++ b/drivers/usb/host/xhci-trace.h
@@ -289,23 +289,12 @@ DECLARE_EVENT_CLASS(xhci_log_urb,
),
TP_printk("ep%d%s-%s: urb %p pipe %u slot %d length %d/%d sgs %d/%d stream %d flags %08x",
__entry->epnum, __entry->dir_in ? "in" : "out",
- ({ char *s;
- switch (__entry->type) {
- case USB_ENDPOINT_XFER_INT:
- s = "intr";
- break;
- case USB_ENDPOINT_XFER_CONTROL:
- s = "control";
- break;
- case USB_ENDPOINT_XFER_BULK:
- s = "bulk";
- break;
- case USB_ENDPOINT_XFER_ISOC:
- s = "isoc";
- break;
- default:
- s = "UNKNOWN";
- } s; }), __entry->urb, __entry->pipe, __entry->slot_id,
+ __print_symbolic(__entry->type,
+ { USB_ENDPOINT_XFER_INT, "intr" },
+ { USB_ENDPOINT_XFER_CONTROL, "control" },
+ { USB_ENDPOINT_XFER_BULK, "bulk" },
+ { USB_ENDPOINT_XFER_ISOC, "isoc" }),
+ __entry->urb, __entry->pipe, __entry->slot_id,
__entry->actual, __entry->length, __entry->num_mapped_sgs,
__entry->num_sgs, __entry->stream, __entry->flags
)


2020-02-19 09:18:14

by Mathias Nyman

[permalink] [raw]
Subject: Re: [PATCH] xhci: Do not open code __print_symbolic() in xhci trace events

On 14.2.2020 18.56, Steven Rostedt wrote:
> From: Steven Rostedt (VMware) <[email protected]>
>
> libtraceevent (used by perf and trace-cmd) failed to parse the
> xhci_urb_dequeue trace event. This is because the user space trace
> event format parsing is not a full C compiler. It can handle some basic
> logic, but is not meant to be able to handle everything C can do.
>
> In cases where a trace event field needs to be converted from a number
> to a string, there's the __print_symbolic() macro that should be used:
>
> See samples/trace_events/trace-events-sample.h
>
> Some xhci trace events open coded the __print_symbolic() causing the
> user spaces tools to fail to parse it. This has to be replaced with
> __print_symbolic() instead.
>
> CC: [email protected]
> Reported-by: Tzvetomir Stoyanov <[email protected]>
> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=206531
> Fixes: 5abdc2e6e12ff ("usb: host: xhci: add urb_enqueue/dequeue/giveback tracers")
> Signed-off-by: Steven Rostedt (VMware) <[email protected]>
> ---

Thanks
Added to queue

-Mathias