Commit 195a58cb authored by Linyu Yuan's avatar Linyu Yuan Committed by Greg Kroah-Hartman
Browse files

usb: cdns3: change trace event cdns3_ring() operation



the original design seem have several problems, first during trace event
output stage, cdns3_dbg_ring() still refer to priv_ep->trb_pool which
data content may changed during runtime, second when ring number is
greater than TRBS_PER_SEGMENT, it has no change to show "too big" message,
third in cdns3_log_ring event class definition, it allocate too much trace
event buffer.

change cdns3_dbg_ring() to be called at trace event fast assign time, and
change trace buffer real dynamic according ring numbers.

Signed-off-by: default avatarLinyu Yuan <quic_linyyuan@quicinc.com>
Link: https://lore.kernel.org/r/1677465850-1396-2-git-send-email-quic_linyyuan@quicinc.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 180bb831
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -107,8 +107,7 @@ static inline char *cdns3_decode_ep0_irq(char *str,
 * Prints out all TRBs in the endpoint ring, even those after the Link TRB.
 *.
 */
static inline char *cdns3_dbg_ring(struct cdns3_endpoint *priv_ep,
				   struct cdns3_trb *ring, char *str)
static inline char *cdns3_dbg_ring(struct cdns3_endpoint *priv_ep, char *str)
{
	dma_addr_t addr = priv_ep->trb_pool_dma;
	struct cdns3_trb *trb;
@@ -136,9 +135,6 @@ static inline char *cdns3_dbg_ring(struct cdns3_endpoint *priv_ep,
		       "\t\tfree trbs: %d, CCS=%d, PCS=%d\n",
		       priv_ep->free_trbs, priv_ep->ccs, priv_ep->pcs);

	if (trb_per_sector > TRBS_PER_SEGMENT)
		trb_per_sector = TRBS_PER_SEGMENT;

	if (trb_per_sector > TRBS_PER_SEGMENT) {
		sprintf(str + ret, "\t\tTransfer ring %d too big\n",
			trb_per_sector);
@@ -146,7 +142,7 @@ static inline char *cdns3_dbg_ring(struct cdns3_endpoint *priv_ep,
	}

	for (i = 0; i < trb_per_sector; ++i) {
		trb = &ring[i];
		trb = &priv_ep->trb_pool[i];
		ret += sprintf(str + ret,
			"\t\t@%pad %08x %08x %08x\n", &addr,
			le32_to_cpu(trb->buffer),
+5 −11
Original line number Diff line number Diff line
@@ -438,22 +438,16 @@ DECLARE_EVENT_CLASS(cdns3_log_ring,
	TP_PROTO(struct cdns3_endpoint *priv_ep),
	TP_ARGS(priv_ep),
	TP_STRUCT__entry(
		__dynamic_array(u8, ring, TRB_RING_SIZE)
		__dynamic_array(u8, priv_ep, sizeof(struct cdns3_endpoint))
		__dynamic_array(char, buffer,
				(TRBS_PER_SEGMENT * 65) + CDNS3_MSG_MAX)
				GET_TRBS_PER_SEGMENT(priv_ep->type) > TRBS_PER_SEGMENT ?
				CDNS3_MSG_MAX :
				(GET_TRBS_PER_SEGMENT(priv_ep->type) * 65) + CDNS3_MSG_MAX)
	),
	TP_fast_assign(
		memcpy(__get_dynamic_array(priv_ep), priv_ep,
		       sizeof(struct cdns3_endpoint));
		memcpy(__get_dynamic_array(ring), priv_ep->trb_pool,
		       TRB_RING_SIZE);
		cdns3_dbg_ring(priv_ep, __get_str(buffer));
	),

	TP_printk("%s",
		  cdns3_dbg_ring((struct cdns3_endpoint *)__get_str(priv_ep),
				 (struct cdns3_trb *)__get_str(ring),
				 __get_str(buffer)))
	TP_printk("%s", __get_str(buffer))
);

DEFINE_EVENT(cdns3_log_ring, cdns3_ring,