usb: cdns3: change trace event cdns3_ring() operation
authorLinyu Yuan <quic_linyyuan@quicinc.com>
Mon, 27 Feb 2023 02:44:07 +0000 (10:44 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Mar 2023 14:35:03 +0000 (15:35 +0100)
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: Linyu Yuan <quic_linyyuan@quicinc.com>
Link: https://lore.kernel.org/r/1677465850-1396-2-git-send-email-quic_linyyuan@quicinc.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/cdns3/cdns3-debug.h
drivers/usb/cdns3/cdns3-trace.h

index a5c6a29..4618cfe 100644 (file)
@@ -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),
index 7574b4a..9905718 100644 (file)
@@ -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,