• Linyu Yuan's avatar
    tracing: Acquire buffer from temparary trace sequence · a9c4bdd5
    Linyu Yuan authored
    there is one dwc3 trace event declare as below,
    DECLARE_EVENT_CLASS(dwc3_log_event,
    	TP_PROTO(u32 event, struct dwc3 *dwc),
    	TP_ARGS(event, dwc),
    	TP_STRUCT__entry(
    		__field(u32, event)
    		__field(u32, ep0state)
    		__dynamic_array(char, str, DWC3_MSG_MAX)
    	),
    	TP_fast_assign(
    		__entry->event = event;
    		__entry->ep0state = dwc->ep0state;
    	),
    	TP_printk("event (%08x): %s", __entry->event,
    			dwc3_decode_event(__get_str(str), DWC3_MSG_MAX,
    				__entry->event, __entry->ep0state))
    );
    the problem is when trace function called, it will allocate up to
    DWC3_MSG_MAX bytes from trace event buffer, but never fill the buffer
    during fast assignment, it only fill the buffer when output function are
    called, so this means if output function are not called, the buffer will
    never used.
    
    add __get_buf(len) which acquiree buffer from iter->tmp_seq when trace
    output function called, it allow user write string to acquired buffer.
    
    the mentioned dwc3 trace event will changed as below,
    DECLARE_EVENT_CLASS(dwc3_log_event,
    	TP_PROTO(u32 event, struct dwc3 *dwc),
    	TP_ARGS(event, dwc),
    	TP_STRUCT__entry(
    		__field(u32, event)
    		__field(u32, ep0state)
    	),
    	TP_fast_assign(
    		__entry->event = event;
    		__entry->ep0state = dwc->ep0state;
    	),
    	TP_printk("event (%08x): %s", __entry->event,
    		dwc3_decode_event(__get_buf(DWC3_MSG_MAX), DWC3_MSG_MAX,
    				__entry->event, __entry->ep0state))
    );.
    
    Link: https://lore.kernel.org/linux-trace-kernel/1675065249-23368-1-git-send-email-quic_linyyuan@quicinc.com
    
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: default avatarLinyu Yuan <quic_linyyuan@quicinc.com>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    a9c4bdd5
trace_seq.c 11 KB