> > > > -/* > > - * tcp event with arguments sk and skb > > - * > > - * Note: this class requires a valid sk pointer; while skb pointer could > > - * be NULL. > > - */ > > -DECLARE_EVENT_CLASS(tcp_event_sk_skb, > > +#define TCP_RETRANSMIT_QUIT_REASON \ > > + ENUM(TCP_RETRANS_ERR_DEFAULT, "retransmit > > terminate unexpectedly") \ > > + ENUM(TCP_RETRANS_SUCCESS, "retransmit > > successfully") \ > > + ENUM(TCP_RETRANS_IN_HOST_QUEUE, "packet still > > queued in driver") \ > > + ENUM(TCP_RETRANS_END_SEQ_ERROR, "invalid end > > sequence") \ > > + ENUM(TCP_RETRANS_TRIM_HEAD_NOMEM, "trim head no > > memory") \ > > + ENUM(TCP_RETRANS_UNCLONE_NOMEM, "skb unclone > > keeptruesize no memory") \ > > + ENUM(TCP_RETRANS_FRAG_NOMEM, "fragment no > > memory") \ > > Do we really need 3 + 1 different 'NOMEMORY' status ?
Yes, different "NOMEM" status pinpoint exact failure stages in packet retransmission, which helps distinguish which process triggered it. Beneficial for troubleshooting. > > + ENUM(TCP_RETRANS_ROUTE_FAIL, "routing failure") > > \ > > + ENUM(TCP_RETRANS_RCV_ZERO_WINDOW, "closed recevier > > window") \ > > receiver > Thanks, will fix it in V3. > > + ENUMe(TCP_RETRANS_PSKB_COPY_NOBUFS, "no buffer for skb > > copy") \ > > -> another NOMEM... > > > + > > + > > > > + __entry->quit_reason = quit_reason; > > ), > > > > - TP_printk("skbaddr=%p skaddr=%p family=%s sport=%hu dport=%hu > > saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c state=%s", > > + TP_printk("skbaddr=%p skaddr=%p family=%s sport=%hu dport=%hu > > saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c state=%s quit_reason=%s", > > quit_reason is really weird, since most retransmits are a success. > > What about using : status or result ? > > Also, for scripts parsing the output, I would try to keep key=val > format (no space in @val), and concise 'vals' Good idea. Will fix it in V3.