> On Nov 9, 2017, at 4:57 PM, Steven Rostedt <rost...@goodmis.org> wrote: > > > From: "Steven Rostedt (VMware)" <rost...@goodmis.org> > > The TCP trace events (specifically tcp_set_state), maps emums to symbol > names via __print_symbolic(). But this only works for reading trace events > from the tracefs trace files. If perf or trace-cmd were to record these > events, the event format file does not convert the enum names into numbers, > and you get something like: > > __print_symbolic(REC->oldstate, > { TCP_ESTABLISHED, "TCP_ESTABLISHED" }, > { TCP_SYN_SENT, "TCP_SYN_SENT" }, > { TCP_SYN_RECV, "TCP_SYN_RECV" }, > { TCP_FIN_WAIT1, "TCP_FIN_WAIT1" }, > { TCP_FIN_WAIT2, "TCP_FIN_WAIT2" }, > { TCP_TIME_WAIT, "TCP_TIME_WAIT" }, > { TCP_CLOSE, "TCP_CLOSE" }, > { TCP_CLOSE_WAIT, "TCP_CLOSE_WAIT" }, > { TCP_LAST_ACK, "TCP_LAST_ACK" }, > { TCP_LISTEN, "TCP_LISTEN" }, > { TCP_CLOSING, "TCP_CLOSING" }, > { TCP_NEW_SYN_RECV, "TCP_NEW_SYN_RECV" }) > > Where trace-cmd and perf do not know the values of those enums. > > Use the TRACE_DEFINE_ENUM() macros that will have the trace events convert > the enum strings into their values at system boot. This will allow perf and > trace-cmd to see actual numbers and not enums: > > __print_symbolic(REC->oldstate, > { 1, "TCP_ESTABLISHED" }, > { 2, "TCP_SYN_SENT" }, > { 3, "TCP_SYN_RECV" }, > { 4, "TCP_FIN_WAIT1" }, > { 5, "TCP_FIN_WAIT2" }, > { 6, "TCP_TIME_WAIT" }, > { 7, "TCP_CLOSE" }, > { 8, "TCP_CLOSE_WAIT" }, > { 9, "TCP_LAST_ACK" }, > { 10, "TCP_LISTEN" }, > { 11, "TCP_CLOSING" }, > { 12, "TCP_NEW_SYN_RECV" }) > > Signed-off-by: Steven Rostedt (VMware) <rost...@goodmis.org> > --- > include/trace/events/tcp.h | 41 ++++++++++++++++++++++++++++------------- > 1 file changed, 28 insertions(+), 13 deletions(-) > > diff --git a/include/trace/events/tcp.h b/include/trace/events/tcp.h > index 07cccca6cbf1..62e5bad7901f 100644 > --- a/include/trace/events/tcp.h > +++ b/include/trace/events/tcp.h > @@ -9,21 +9,36 @@ > #include <linux/tracepoint.h> > #include <net/ipv6.h> > > +#define tcp_state_names \ > + EM(TCP_ESTABLISHED) \ > + EM(TCP_SYN_SENT) \ > + EM(TCP_SYN_RECV) \ > + EM(TCP_FIN_WAIT1) \ > + EM(TCP_FIN_WAIT2) \ > + EM(TCP_TIME_WAIT) \ > + EM(TCP_CLOSE) \ > + EM(TCP_CLOSE_WAIT) \ > + EM(TCP_LAST_ACK) \ > + EM(TCP_LISTEN) \ > + EM(TCP_CLOSING) \ > + EMe(TCP_NEW_SYN_RECV) > + > +/* enums need to be exported to user space */ > +#undef EM > +#undef EMe > +#define EM(a) TRACE_DEFINE_ENUM(a); > +#define EMe(a) TRACE_DEFINE_ENUM(a); > + > +tcp_state_names > + > +#undef EM > +#undef EMe > +#define EM(a) tcp_state_name(a), > +#define EMe(a) tcp_state_name(a) > + > #define tcp_state_name(state) { state, #state } > #define show_tcp_state_name(val) \ > - __print_symbolic(val, \ > - tcp_state_name(TCP_ESTABLISHED), \ > - tcp_state_name(TCP_SYN_SENT), \ > - tcp_state_name(TCP_SYN_RECV), \ > - tcp_state_name(TCP_FIN_WAIT1), \ > - tcp_state_name(TCP_FIN_WAIT2), \ > - tcp_state_name(TCP_TIME_WAIT), \ > - tcp_state_name(TCP_CLOSE), \ > - tcp_state_name(TCP_CLOSE_WAIT), \ > - tcp_state_name(TCP_LAST_ACK), \ > - tcp_state_name(TCP_LISTEN), \ > - tcp_state_name(TCP_CLOSING), \ > - tcp_state_name(TCP_NEW_SYN_RECV)) > + __print_symbolic(val, tcp_state_names) > > /* > * tcp event with arguments sk and skb > -- > 2.13.6 >
Reviewed-and-tested-by: Song Liu <songliubrav...@fb.com>