* [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage
@ 2023-09-15 5:27 Linyu Yuan
2023-09-15 5:27 ` [PATCH v6 1/3] usb: gadget: add anonymous definition in some struct for trace purpose Linyu Yuan
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Linyu Yuan @ 2023-09-15 5:27 UTC (permalink / raw)
To: Thinh Nguyen, Alan Stern, Greg Kroah-Hartman; +Cc: linux-usb, Linyu Yuan
some trace event use an interger to to save a bit field info of gadget,
also some trace save endpoint name in string forat, it all can be
chagned to other way at trace event store phase.
bit field can be replace with a union interger member which include
multiple bit fields.
ep name stringe can be replace to a interger which contaion number
and dir info.
in order to avoid big endian issue, save interger data into ring
buffer in __le32 format.
backgroud:
the benefit is when user not increase system trace event buffer space,
or in lower system trace event buffer space, it allow more trace event
entries to be saved.
in normal condition, the usb request is most frequent things after
enumeration with useful operation,
so take below trace event class for explanation,
DECLARE_EVENT_CLASS(udc_log_req,
TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret),
TP_ARGS(ep, req, ret),
TP_STRUCT__entry(
__string(name, ep->name)
__field(unsigned, length)
__field(unsigned, actual)
__field(unsigned, num_sgs)
__field(unsigned, num_mapped_sgs)
__field(unsigned, stream_id)
__field(unsigned, no_interrupt)
__field(unsigned, zero)
__field(unsigned, short_not_ok)
__field(int, status)
__field(int, ret)
__field(struct usb_request *, req)
),
TP_fast_assign(
__assign_str(name, ep->name);
__entry->length = req->length;
__entry->actual = req->actual;
__entry->num_sgs = req->num_sgs;
__entry->num_mapped_sgs = req->num_mapped_sgs;
__entry->stream_id = req->stream_id;
__entry->no_interrupt = req->no_interrupt;
__entry->zero = req->zero;
__entry->short_not_ok = req->short_not_ok;
__entry->status = req->status;
__entry->ret = ret;
__entry->req = req;
),
TP_printk("%s: req %p length %d/%d sgs %d/%d stream %d %s%s%s status %d --> %d",
__get_str(name),__entry->req, __entry->actual, __entry->length,
__entry->num_mapped_sgs, __entry->num_sgs, __entry->stream_id,
__entry->zero ? "Z" : "z",
__entry->short_not_ok ? "S" : "s",
__entry->no_interrupt ? "i" : "I",
__entry->status, __entry->ret
)
);
consider 32 bit ARCH,
without change, one trace entry size is:
4 (ring buffer event header ) + 8 (trace event header ) +
48 (trace class header) + 9 (ep string name) = 69 bytes.
with change,
4 (ring buffer event header ) + 8 (trace event header ) +
36 (trace class header) = 48 bytes.
consider there is 1MB trace buffer space,
without change, it can save 15196 entries,
with change, it can save 21845 entries.
v1: https://lore.kernel.org/linux-usb/20230911042843.2711-1-quic_linyyuan@quicinc.com/
v2: fix two compile issues that COMPILE_TEST not covered
https://lore.kernel.org/linux-usb/20230911112446.1791-1-quic_linyyuan@quicinc.com/
v3: fix reviewer comments, allow bit fields work on both little and big endian
https://lore.kernel.org/linux-usb/20230912104455.7737-1-quic_linyyuan@quicinc.com/
v4: add DECLARE_EVENT_CLASS_PRINT_INIT() new trace class and use it
https://lore.kernel.org/linux-usb/20230914100302.30274-1-quic_linyyuan@quicinc.com/
v5: use cpu_to_le32() at fast assign stage to fix endian issue
https://lore.kernel.org/linux-usb/20230915051123.26486-1-quic_linyyuan@quicinc.com/
v6: missing three cpu_to_le32() usage in dwc3 trace
Linyu Yuan (3):
usb: gadget: add anonymous definition in some struct for trace purpose
usb: udc: trace: reduce buffer usage of trace event
usb: dwc3: trace: reduce buffer usage of trace event
drivers/usb/dwc3/trace.h | 63 +++++------
drivers/usb/gadget/udc/trace.h | 114 +++++--------------
include/linux/usb/gadget.h | 201 ++++++++++++++++++++++++++-------
3 files changed, 219 insertions(+), 159 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v6 1/3] usb: gadget: add anonymous definition in some struct for trace purpose
2023-09-15 5:27 [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage Linyu Yuan
@ 2023-09-15 5:27 ` Linyu Yuan
2023-09-17 8:01 ` Greg Kroah-Hartman
2023-09-15 5:27 ` [PATCH v6 2/3] usb: udc: trace: reduce buffer usage of trace event Linyu Yuan
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Linyu Yuan @ 2023-09-15 5:27 UTC (permalink / raw)
To: Thinh Nguyen, Alan Stern, Greg Kroah-Hartman; +Cc: linux-usb, Linyu Yuan
Some UDC trace event will save usb udc information, but it use one int
size buffer to save one bit information of usb udc, it waste trace buffer.
Add anonymous union which have u32 members can be used by trace event
during fast assign stage to save more entries with same trace ring buffer
size.
Also add some trace event purpose macro in this file for all possiable
use.
Signed-off-by: Linyu Yuan <quic_linyyuan@quicinc.com>
---
include/linux/usb/gadget.h | 201 +++++++++++++++++++++++++++++--------
1 file changed, 160 insertions(+), 41 deletions(-)
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 75bda0783395..2c0f7aafd2d3 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -24,6 +24,10 @@
#include <linux/scatterlist.h>
#include <linux/types.h>
#include <linux/workqueue.h>
+#include <linux/stdarg.h>
+#include <linux/bitops.h>
+#include <linux/sprintf.h>
+#include <linux/bitfield.h>
#include <linux/usb/ch9.h>
#define UDC_TRACE_STR_MAX 512
@@ -41,6 +45,7 @@ struct usb_ep;
* @num_sgs: number of SG entries
* @num_mapped_sgs: number of SG entries mapped to DMA (internal)
* @length: Length of that data
+ * @dw1: trace event purpose
* @stream_id: The stream id, when USB3.0 bulk streams are being used
* @is_last: Indicates if this is the last request of a stream_id before
* switching to a different stream (required for DWC3 controllers).
@@ -105,12 +110,17 @@ struct usb_request {
unsigned num_sgs;
unsigned num_mapped_sgs;
- unsigned stream_id:16;
- unsigned is_last:1;
- unsigned no_interrupt:1;
- unsigned zero:1;
- unsigned short_not_ok:1;
- unsigned dma_mapped:1;
+ union {
+ struct {
+ u32 stream_id:16;
+ u32 is_last:1;
+ u32 no_interrupt:1;
+ u32 zero:1;
+ u32 short_not_ok:1;
+ u32 dma_mapped:1;
+ } __packed;
+ u32 dw1;
+ };
void (*complete)(struct usb_ep *ep,
struct usb_request *req);
@@ -163,13 +173,13 @@ struct usb_ep_ops {
* @dir_out:Endpoint supports OUT direction.
*/
struct usb_ep_caps {
- unsigned type_control:1;
- unsigned type_iso:1;
- unsigned type_bulk:1;
- unsigned type_int:1;
- unsigned dir_in:1;
- unsigned dir_out:1;
-};
+ u8 type_control:1;
+ u8 type_iso:1;
+ u8 type_bulk:1;
+ u8 type_int:1;
+ u8 dir_in:1;
+ u8 dir_out:1;
+} __packed;
#define USB_EP_CAPS_TYPE_CONTROL 0x01
#define USB_EP_CAPS_TYPE_ISO 0x02
@@ -199,6 +209,9 @@ struct usb_ep_caps {
* @caps:The structure describing types and directions supported by endpoint.
* @enabled: The current endpoint enabled/disabled state.
* @claimed: True if this endpoint is claimed by a function.
+ * @dw1: trace event purpose
+ * @dw2: trace event purpose
+ * @dw3: trace event purpose
* @maxpacket:The maximum packet size used on this endpoint. The initial
* value can sometimes be reduced (hardware allowing), according to
* the endpoint descriptor used to configure the endpoint.
@@ -228,15 +241,30 @@ struct usb_ep {
const char *name;
const struct usb_ep_ops *ops;
struct list_head ep_list;
- struct usb_ep_caps caps;
- bool claimed;
- bool enabled;
- unsigned maxpacket:16;
- unsigned maxpacket_limit:16;
- unsigned max_streams:16;
- unsigned mult:2;
- unsigned maxburst:5;
- u8 address;
+ union {
+ struct {
+ u32 maxpacket:16;
+ u32 maxpacket_limit:16;
+ } __packed;
+ u32 dw1;
+ };
+ union {
+ struct {
+ u32 max_streams:16;
+ u32 mult:2;
+ u32 maxburst:5;
+ } __packed;
+ u32 dw2;
+ };
+ union {
+ struct {
+ struct usb_ep_caps caps;
+ u8 claimed:1;
+ u8 enabled:1;
+ u8 address;
+ } __packed;
+ u32 dw3;
+ };
const struct usb_endpoint_descriptor *desc;
const struct usb_ss_ep_comp_descriptor *comp_desc;
};
@@ -357,6 +385,7 @@ struct usb_gadget_ops {
* @in_epnum: last used in ep number
* @mA: last set mA value
* @otg_caps: OTG capabilities of this gadget.
+ * @dw1: trace event purpose
* @sg_supported: true if we can handle scatter-gather
* @is_otg: True if the USB device port uses a Mini-AB jack, so that the
* gadget driver must provide a USB OTG descriptor.
@@ -432,25 +461,31 @@ struct usb_gadget {
unsigned mA;
struct usb_otg_caps *otg_caps;
- unsigned sg_supported:1;
- unsigned is_otg:1;
- unsigned is_a_peripheral:1;
- unsigned b_hnp_enable:1;
- unsigned a_hnp_support:1;
- unsigned a_alt_hnp_support:1;
- unsigned hnp_polling_support:1;
- unsigned host_request_flag:1;
- unsigned quirk_ep_out_aligned_size:1;
- unsigned quirk_altset_not_supp:1;
- unsigned quirk_stall_not_supp:1;
- unsigned quirk_zlp_not_supp:1;
- unsigned quirk_avoids_skb_reserve:1;
- unsigned is_selfpowered:1;
- unsigned deactivated:1;
- unsigned connected:1;
- unsigned lpm_capable:1;
- unsigned wakeup_capable:1;
- unsigned wakeup_armed:1;
+ union {
+ struct {
+ u32 sg_supported:1;
+ u32 is_otg:1;
+ u32 is_a_peripheral:1;
+ u32 b_hnp_enable:1;
+ u32 a_hnp_support:1;
+ u32 a_alt_hnp_support:1;
+ u32 hnp_polling_support:1;
+ u32 host_request_flag:1;
+ u32 quirk_ep_out_aligned_size:1;
+ u32 quirk_altset_not_supp:1;
+ u32 quirk_stall_not_supp:1;
+ u32 quirk_zlp_not_supp:1;
+ u32 quirk_avoids_skb_reserve:1;
+ u32 is_selfpowered:1;
+ u32 deactivated:1;
+ u32 connected:1;
+ u32 lpm_capable:1;
+ u32 wakeup_capable:1;
+ u32 wakeup_armed:1;
+ } __packed;
+
+ u32 dw1;
+ };
int irq;
int id_number;
};
@@ -960,4 +995,88 @@ extern void usb_ep_autoconfig_release(struct usb_ep *);
extern void usb_ep_autoconfig_reset(struct usb_gadget *);
+/*-------------------------------------------------------------------------*/
+/* trace only, data in __le32 format at trace event fast assign stage */
+#define USB_GADGET_SG_SUPPORTED BIT(0)
+#define USB_GADGET_IS_OTG BIT(1)
+#define USB_GADGET_IS_A_PERIPHERAL BIT(2)
+#define USB_GADGET_B_HNP_ENABLE BIT(3)
+#define USB_GADGET_A_HNP_SUPPORT BIT(4)
+#define USB_GADGET_A_ALT_HNP_SUPPORT BIT(5)
+#define USB_GADGET_HNP_POLLING_SUPPORT BIT(6)
+#define USB_GADGET_HOST_REQUEST_FLAG BIT(7)
+#define USB_GADGET_QUIRK_EP_OUT_ALIGNED_SIZE BIT(8)
+#define USB_GADGET_QUIRK_ALTSET_NOT_SUPP BIT(9)
+#define USB_GADGET_QUIRK_STALL_NOT_SUPP BIT(10)
+#define USB_GADGET_QUIRK_ZLP_NOT_SUPP BIT(11)
+#define USB_GADGET_QUIRK_AVOIDS_SKB_RESERVE BIT(12)
+#define USB_GADGET_IS_SELFPOWERED BIT(13)
+#define USB_GADGET_DEACTIVATED BIT(14)
+#define USB_GADGET_CONNECTED BIT(15)
+#define USB_GADGET_LPM_CAPABLE BIT(16)
+#define USB_GADGET_WAKEUP_CAPABLE BIT(17)
+#define USB_GADGET_WAKEUP_ARMED BIT(18)
+
+#define USB_GADGET_FLAGS \
+ {USB_GADGET_SG_SUPPORTED, "sg"},\
+ {USB_GADGET_IS_OTG, "OTG"},\
+ {USB_GADGET_IS_A_PERIPHERAL, "a_peripheral"},\
+ {USB_GADGET_B_HNP_ENABLE, "b_hnp"},\
+ {USB_GADGET_A_HNP_SUPPORT, "a_hnp"},\
+ {USB_GADGET_A_ALT_HNP_SUPPORT, "a_alt_hnp"},\
+ {USB_GADGET_HNP_POLLING_SUPPORT, "hnp_poll"},\
+ {USB_GADGET_HOST_REQUEST_FLAG, "hostreq"},\
+ {USB_GADGET_QUIRK_EP_OUT_ALIGNED_SIZE, "out_aligned"},\
+ {USB_GADGET_QUIRK_ALTSET_NOT_SUPP, "no_altset"},\
+ {USB_GADGET_QUIRK_STALL_NOT_SUPP, "no_stall"},\
+ {USB_GADGET_QUIRK_ZLP_NOT_SUPP, "no_zlp"},\
+ {USB_GADGET_QUIRK_AVOIDS_SKB_RESERVE, "no_skb_reserve"},\
+ {USB_GADGET_IS_SELFPOWERED, "self-powered"},\
+ {USB_GADGET_DEACTIVATED, "deactivated"},\
+ {USB_GADGET_CONNECTED, "connected"},\
+ {USB_GADGET_LPM_CAPABLE, "lpm-capable"},\
+ {USB_GADGET_WAKEUP_CAPABLE, "wakeup-capable"},\
+ {USB_GADGET_WAKEUP_ARMED, "wakeup-armed"}
+
+#define USB_EP_MAXPACKET GENMASK(15, 0)
+#define USB_EP_MAXPACKET_LIMIT GENMASK(31, 16)
+#define USB_EP_MAX_STREAMS GENMASK(15, 0)
+#define USB_EP_MULT GENMASK(17, 16)
+#define USB_EP_MAXBURST GENMASK(22, 18)
+#define USB_EP_DIR_BI GENMASK(5, 4)
+#define USB_EP_DIR_IN BIT(4)
+#define USB_EP_DIR_OUT BIT(5)
+#define USB_EP_CLAIMED BIT(8)
+#define USB_EP_ENABLED BIT(9)
+#define USB_EP_ADDRESS GENMASK(23, 16)
+
+#define USB_EP_FLAGS \
+ {USB_EP_CLAIMED, "claimed"},\
+ {USB_EP_ENABLED, "enabled"}
+
+#define USB_EP_MAX_NAME_LEN 16
+static inline char *usb_gadget_ep_name(char *s, u32 dw)
+{
+ snprintf(s, USB_EP_MAX_NAME_LEN, "ep%d%s", u32_get_bits(dw, USB_EP_ADDRESS),
+ u32_get_bits(dw, USB_EP_DIR_BI) == 3 ? "" :
+ u32_get_bits(dw, USB_EP_DIR_IN) ? "in" : "out");
+
+ return s;
+}
+
+#define USB_REQ_STREAM_ID GENMASK(15, 0)
+#define USB_REQ_IS_LAST BIT(16)
+#define USB_REQ_NO_INTERRUPT BIT(17)
+#define USB_REQ_ZERO BIT(18)
+#define USB_REQ_SHORT_NOT_OK BIT(19)
+#define USB_REQ_DMA_MAPPED BIT(20)
+
+#define USB_REQ_FLAGS \
+ {USB_REQ_IS_LAST, "last"},\
+ {USB_REQ_NO_INTERRUPT, "no-irq"},\
+ {USB_REQ_ZERO, "zero-len"},\
+ {USB_REQ_SHORT_NOT_OK, "short-not-ok"},\
+ {USB_REQ_DMA_MAPPED, "dma-mapped"}
+/*-------------------------------------------------------------------------*/
+
#endif /* __LINUX_USB_GADGET_H */
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v6 2/3] usb: udc: trace: reduce buffer usage of trace event
2023-09-15 5:27 [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage Linyu Yuan
2023-09-15 5:27 ` [PATCH v6 1/3] usb: gadget: add anonymous definition in some struct for trace purpose Linyu Yuan
@ 2023-09-15 5:27 ` Linyu Yuan
2023-09-15 5:27 ` [PATCH v6 /3] usb: dwc3: " Linyu Yuan
2023-09-15 14:13 ` [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage Alan Stern
3 siblings, 0 replies; 7+ messages in thread
From: Linyu Yuan @ 2023-09-15 5:27 UTC (permalink / raw)
To: Thinh Nguyen, Alan Stern, Greg Kroah-Hartman; +Cc: linux-usb, Linyu Yuan
Save u32 members in __le32 format into trace event ring buffer and parse
it for possible bit fields.
Use new common trace event macro in gadget.h for output stage.
Signed-off-by: Linyu Yuan <quic_linyyuan@quicinc.com>
---
drivers/usb/gadget/udc/trace.h | 114 +++++++++------------------------
1 file changed, 30 insertions(+), 84 deletions(-)
diff --git a/drivers/usb/gadget/udc/trace.h b/drivers/usb/gadget/udc/trace.h
index a5ed26fbc2da..d39f0b3c8dac 100644
--- a/drivers/usb/gadget/udc/trace.h
+++ b/drivers/usb/gadget/udc/trace.h
@@ -25,20 +25,7 @@ DECLARE_EVENT_CLASS(udc_log_gadget,
__field(enum usb_device_speed, max_speed)
__field(enum usb_device_state, state)
__field(unsigned, mA)
- __field(unsigned, sg_supported)
- __field(unsigned, is_otg)
- __field(unsigned, is_a_peripheral)
- __field(unsigned, b_hnp_enable)
- __field(unsigned, a_hnp_support)
- __field(unsigned, hnp_polling_support)
- __field(unsigned, host_request_flag)
- __field(unsigned, quirk_ep_out_aligned_size)
- __field(unsigned, quirk_altset_not_supp)
- __field(unsigned, quirk_stall_not_supp)
- __field(unsigned, quirk_zlp_not_supp)
- __field(unsigned, is_selfpowered)
- __field(unsigned, deactivated)
- __field(unsigned, connected)
+ __field(u32, gdw1)
__field(int, ret)
),
TP_fast_assign(
@@ -46,38 +33,12 @@ DECLARE_EVENT_CLASS(udc_log_gadget,
__entry->max_speed = g->max_speed;
__entry->state = g->state;
__entry->mA = g->mA;
- __entry->sg_supported = g->sg_supported;
- __entry->is_otg = g->is_otg;
- __entry->is_a_peripheral = g->is_a_peripheral;
- __entry->b_hnp_enable = g->b_hnp_enable;
- __entry->a_hnp_support = g->a_hnp_support;
- __entry->hnp_polling_support = g->hnp_polling_support;
- __entry->host_request_flag = g->host_request_flag;
- __entry->quirk_ep_out_aligned_size = g->quirk_ep_out_aligned_size;
- __entry->quirk_altset_not_supp = g->quirk_altset_not_supp;
- __entry->quirk_stall_not_supp = g->quirk_stall_not_supp;
- __entry->quirk_zlp_not_supp = g->quirk_zlp_not_supp;
- __entry->is_selfpowered = g->is_selfpowered;
- __entry->deactivated = g->deactivated;
- __entry->connected = g->connected;
+ __entry->gdw1 = cpu_to_le32(g->dw1);
__entry->ret = ret;
),
- TP_printk("speed %d/%d state %d %dmA [%s%s%s%s%s%s%s%s%s%s%s%s%s%s] --> %d",
+ TP_printk("speed %d/%d state %d %dmA [%s] --> %d",
__entry->speed, __entry->max_speed, __entry->state, __entry->mA,
- __entry->sg_supported ? "sg:" : "",
- __entry->is_otg ? "OTG:" : "",
- __entry->is_a_peripheral ? "a_peripheral:" : "",
- __entry->b_hnp_enable ? "b_hnp:" : "",
- __entry->a_hnp_support ? "a_hnp:" : "",
- __entry->hnp_polling_support ? "hnp_poll:" : "",
- __entry->host_request_flag ? "hostreq:" : "",
- __entry->quirk_ep_out_aligned_size ? "out_aligned:" : "",
- __entry->quirk_altset_not_supp ? "no_altset:" : "",
- __entry->quirk_stall_not_supp ? "no_stall:" : "",
- __entry->quirk_zlp_not_supp ? "no_zlp" : "",
- __entry->is_selfpowered ? "self-powered:" : "bus-powered:",
- __entry->deactivated ? "deactivated:" : "activated:",
- __entry->connected ? "connected" : "disconnected",
+ __print_flags(__entry->gdw1, ":", USB_GADGET_FLAGS),
__entry->ret)
);
@@ -145,34 +106,26 @@ DECLARE_EVENT_CLASS(udc_log_ep,
TP_PROTO(struct usb_ep *ep, int ret),
TP_ARGS(ep, ret),
TP_STRUCT__entry(
- __string(name, ep->name)
- __field(unsigned, maxpacket)
- __field(unsigned, maxpacket_limit)
- __field(unsigned, max_streams)
- __field(unsigned, mult)
- __field(unsigned, maxburst)
- __field(u8, address)
- __field(bool, claimed)
- __field(bool, enabled)
+ __field(u32, edw3)
+ __field(u32, edw1)
+ __field(u32, edw2)
__field(int, ret)
),
TP_fast_assign(
- __assign_str(name, ep->name);
- __entry->maxpacket = ep->maxpacket;
- __entry->maxpacket_limit = ep->maxpacket_limit;
- __entry->max_streams = ep->max_streams;
- __entry->mult = ep->mult;
- __entry->maxburst = ep->maxburst;
- __entry->address = ep->address,
- __entry->claimed = ep->claimed;
- __entry->enabled = ep->enabled;
+ __entry->edw3 = cpu_to_le32(ep->dw3);
+ __entry->edw1 = cpu_to_le32(ep->dw1);
+ __entry->edw2 = cpu_to_le32(ep->dw2);
__entry->ret = ret;
),
- TP_printk("%s: mps %d/%d streams %d mult %d burst %d addr %02x %s%s --> %d",
- __get_str(name), __entry->maxpacket, __entry->maxpacket_limit,
- __entry->max_streams, __entry->mult, __entry->maxburst,
- __entry->address, __entry->claimed ? "claimed:" : "released:",
- __entry->enabled ? "enabled" : "disabled", ret)
+ TP_printk("%s: mps %d/%d streams %d mult %d burst %d addr %02x %s --> %d",
+ usb_gadget_ep_name(__get_buf(USB_EP_MAX_NAME_LEN), __entry->edw3),
+ u32_get_bits(__entry->edw1, USB_EP_MAXPACKET),
+ u32_get_bits(__entry->edw1, USB_EP_MAXPACKET_LIMIT),
+ u32_get_bits(__entry->edw2, USB_EP_MAX_STREAMS),
+ u32_get_bits(__entry->edw2, USB_EP_MULT),
+ u32_get_bits(__entry->edw2, USB_EP_MAXBURST),
+ u32_get_bits(__entry->edw3, USB_EP_ADDRESS),
+ __print_flags(__entry->edw3, ":", USB_EP_FLAGS), ret)
);
DEFINE_EVENT(udc_log_ep, usb_ep_set_maxpacket_limit,
@@ -219,41 +172,34 @@ DECLARE_EVENT_CLASS(udc_log_req,
TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret),
TP_ARGS(ep, req, ret),
TP_STRUCT__entry(
- __string(name, ep->name)
+ __field(u32, edw3)
__field(unsigned, length)
__field(unsigned, actual)
__field(unsigned, num_sgs)
__field(unsigned, num_mapped_sgs)
- __field(unsigned, stream_id)
- __field(unsigned, no_interrupt)
- __field(unsigned, zero)
- __field(unsigned, short_not_ok)
+ __field(u32, rdw1)
__field(int, status)
__field(int, ret)
__field(struct usb_request *, req)
),
TP_fast_assign(
- __assign_str(name, ep->name);
+ __entry->edw3 = cpu_to_le32(ep->dw3);
__entry->length = req->length;
__entry->actual = req->actual;
__entry->num_sgs = req->num_sgs;
__entry->num_mapped_sgs = req->num_mapped_sgs;
- __entry->stream_id = req->stream_id;
- __entry->no_interrupt = req->no_interrupt;
- __entry->zero = req->zero;
- __entry->short_not_ok = req->short_not_ok;
+ __entry->rdw1 = cpu_to_le32(req->dw1);
__entry->status = req->status;
__entry->ret = ret;
__entry->req = req;
),
- TP_printk("%s: req %p length %d/%d sgs %d/%d stream %d %s%s%s status %d --> %d",
- __get_str(name),__entry->req, __entry->actual, __entry->length,
- __entry->num_mapped_sgs, __entry->num_sgs, __entry->stream_id,
- __entry->zero ? "Z" : "z",
- __entry->short_not_ok ? "S" : "s",
- __entry->no_interrupt ? "i" : "I",
- __entry->status, __entry->ret
- )
+ TP_printk("%s: req %p length %d/%d sgs %d/%d stream %d %s status %d --> %d",
+ usb_gadget_ep_name(__get_buf(USB_EP_MAX_NAME_LEN), __entry->edw3),
+ __entry->req, __entry->actual, __entry->length,
+ __entry->num_mapped_sgs, __entry->num_sgs,
+ u32_get_bits(__entry->rdw1, USB_REQ_STREAM_ID),
+ __print_flags(__entry->rdw1, ":", USB_REQ_FLAGS),
+ __entry->status, __entry->ret)
);
DEFINE_EVENT(udc_log_req, usb_ep_alloc_request,
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v6 /3] usb: dwc3: trace: reduce buffer usage of trace event
2023-09-15 5:27 [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage Linyu Yuan
2023-09-15 5:27 ` [PATCH v6 1/3] usb: gadget: add anonymous definition in some struct for trace purpose Linyu Yuan
2023-09-15 5:27 ` [PATCH v6 2/3] usb: udc: trace: reduce buffer usage of trace event Linyu Yuan
@ 2023-09-15 5:27 ` Linyu Yuan
2023-09-17 8:00 ` Greg Kroah-Hartman
2023-09-15 14:13 ` [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage Alan Stern
3 siblings, 1 reply; 7+ messages in thread
From: Linyu Yuan @ 2023-09-15 5:27 UTC (permalink / raw)
To: Thinh Nguyen, Alan Stern, Greg Kroah-Hartman; +Cc: linux-usb, Linyu Yuan
Save u32 members in __le32 format into trace event ring buffer and parse
it for possible bit fields.
Use new common trace event macro in gadget.h for output stage.
Signed-off-by: Linyu Yuan <quic_linyyuan@quicinc.com>
---
drivers/usb/dwc3/trace.h | 63 ++++++++++++++++++----------------------
1 file changed, 29 insertions(+), 34 deletions(-)
diff --git a/drivers/usb/dwc3/trace.h b/drivers/usb/dwc3/trace.h
index d2997d17cfbe..8df2d3ec5db6 100644
--- a/drivers/usb/dwc3/trace.h
+++ b/drivers/usb/dwc3/trace.h
@@ -102,30 +102,25 @@ DECLARE_EVENT_CLASS(dwc3_log_request,
TP_PROTO(struct dwc3_request *req),
TP_ARGS(req),
TP_STRUCT__entry(
- __string(name, req->dep->name)
+ __field(u32, edw3)
__field(struct dwc3_request *, req)
__field(unsigned int, actual)
__field(unsigned int, length)
__field(int, status)
- __field(int, zero)
- __field(int, short_not_ok)
- __field(int, no_interrupt)
+ __field(u32, rdw1)
),
TP_fast_assign(
- __assign_str(name, req->dep->name);
+ __entry->edw3 = cpu_to_le32(req->dep->endpoint.dw3);
__entry->req = req;
__entry->actual = req->request.actual;
__entry->length = req->request.length;
__entry->status = req->request.status;
- __entry->zero = req->request.zero;
- __entry->short_not_ok = req->request.short_not_ok;
- __entry->no_interrupt = req->request.no_interrupt;
+ __entry->rdw1 = cpu_to_le32(req->request.dw1);
),
- TP_printk("%s: req %p length %u/%u %s%s%s ==> %d",
- __get_str(name), __entry->req, __entry->actual, __entry->length,
- __entry->zero ? "Z" : "z",
- __entry->short_not_ok ? "S" : "s",
- __entry->no_interrupt ? "i" : "I",
+ TP_printk("%s: req %p length %u/%u %s ==> %d",
+ usb_gadget_ep_name(__get_buf(USB_EP_MAX_NAME_LEN), __entry->edw3),
+ __entry->req, __entry->actual, __entry->length,
+ __print_flags(__entry->rdw1, ":", USB_REQ_FLAGS),
__entry->status
)
);
@@ -185,7 +180,7 @@ DECLARE_EVENT_CLASS(dwc3_log_gadget_ep_cmd,
struct dwc3_gadget_ep_cmd_params *params, int cmd_status),
TP_ARGS(dep, cmd, params, cmd_status),
TP_STRUCT__entry(
- __string(name, dep->name)
+ __field(u32, edw3)
__field(unsigned int, cmd)
__field(u32, param0)
__field(u32, param1)
@@ -193,7 +188,7 @@ DECLARE_EVENT_CLASS(dwc3_log_gadget_ep_cmd,
__field(int, cmd_status)
),
TP_fast_assign(
- __assign_str(name, dep->name);
+ __entry->edw3 = cpu_to_le32(dep->endpoint.dw3);
__entry->cmd = cmd;
__entry->param0 = params->param0;
__entry->param1 = params->param1;
@@ -201,7 +196,8 @@ DECLARE_EVENT_CLASS(dwc3_log_gadget_ep_cmd,
__entry->cmd_status = cmd_status;
),
TP_printk("%s: cmd '%s' [%x] params %08x %08x %08x --> status: %s",
- __get_str(name), dwc3_gadget_ep_cmd_string(__entry->cmd),
+ usb_gadget_ep_name(__get_buf(USB_EP_MAX_NAME_LEN), __entry->edw3),
+ dwc3_gadget_ep_cmd_string(__entry->cmd),
__entry->cmd, __entry->param0,
__entry->param1, __entry->param2,
dwc3_ep_cmd_status_string(__entry->cmd_status)
@@ -218,7 +214,7 @@ DECLARE_EVENT_CLASS(dwc3_log_trb,
TP_PROTO(struct dwc3_ep *dep, struct dwc3_trb *trb),
TP_ARGS(dep, trb),
TP_STRUCT__entry(
- __string(name, dep->name)
+ __field(u32, edw3)
__field(struct dwc3_trb *, trb)
__field(u32, bpl)
__field(u32, bph)
@@ -229,7 +225,7 @@ DECLARE_EVENT_CLASS(dwc3_log_trb,
__field(u32, dequeue)
),
TP_fast_assign(
- __assign_str(name, dep->name);
+ __entry->edw3 = cpu_to_le32(dep->endpoint.dw3);
__entry->trb = trb;
__entry->bpl = trb->bpl;
__entry->bph = trb->bph;
@@ -240,7 +236,8 @@ DECLARE_EVENT_CLASS(dwc3_log_trb,
__entry->dequeue = dep->trb_dequeue;
),
TP_printk("%s: trb %p (E%d:D%d) buf %08x%08x size %s%d ctrl %08x sofn %08x (%c%c%c%c:%c%c:%s)",
- __get_str(name), __entry->trb, __entry->enqueue,
+ usb_gadget_ep_name(__get_buf(USB_EP_MAX_NAME_LEN), __entry->edw3),
+ __entry->trb, __entry->enqueue,
__entry->dequeue, __entry->bph, __entry->bpl,
({char *s;
int pcm = ((__entry->size >> 24) & 3) + 1;
@@ -272,7 +269,7 @@ DECLARE_EVENT_CLASS(dwc3_log_trb,
__entry->ctrl & DWC3_TRB_CTRL_CSP ? 'S' : 's',
__entry->ctrl & DWC3_TRB_CTRL_ISP_IMI ? 'S' : 's',
__entry->ctrl & DWC3_TRB_CTRL_IOC ? 'C' : 'c',
- dwc3_trb_type_string(DWC3_TRBCTL_TYPE(__entry->ctrl))
+ dwc3_trb_type_string(DWC3_TRBCTL_TYPE(__entry->ctrl))
)
);
@@ -290,32 +287,30 @@ DECLARE_EVENT_CLASS(dwc3_log_ep,
TP_PROTO(struct dwc3_ep *dep),
TP_ARGS(dep),
TP_STRUCT__entry(
- __string(name, dep->name)
- __field(unsigned int, maxpacket)
- __field(unsigned int, maxpacket_limit)
- __field(unsigned int, max_streams)
- __field(unsigned int, maxburst)
+ __field(u32, edw3)
+ __field(u32, edw1)
+ __field(u32, edw2)
__field(unsigned int, flags)
__field(unsigned int, direction)
__field(u8, trb_enqueue)
__field(u8, trb_dequeue)
),
TP_fast_assign(
- __assign_str(name, dep->name);
- __entry->maxpacket = dep->endpoint.maxpacket;
- __entry->maxpacket_limit = dep->endpoint.maxpacket_limit;
- __entry->max_streams = dep->endpoint.max_streams;
- __entry->maxburst = dep->endpoint.maxburst;
+ __entry->edw3 = cpu_to_le32(dep->endpoint.dw3);
+ __entry->edw1 = cpu_to_le32(dep->endpoint.dw1);
+ __entry->edw2 = cpu_to_le32(dep->endpoint.dw2);
__entry->flags = dep->flags;
__entry->direction = dep->direction;
__entry->trb_enqueue = dep->trb_enqueue;
__entry->trb_dequeue = dep->trb_dequeue;
),
TP_printk("%s: mps %d/%d streams %d burst %d ring %d/%d flags %c:%c%c%c%c:%c",
- __get_str(name), __entry->maxpacket,
- __entry->maxpacket_limit, __entry->max_streams,
- __entry->maxburst, __entry->trb_enqueue,
- __entry->trb_dequeue,
+ usb_gadget_ep_name(__get_buf(USB_EP_MAX_NAME_LEN), __entry->edw3),
+ u32_get_bits(__entry->edw1, USB_EP_MAXPACKET),
+ u32_get_bits(__entry->edw1, USB_EP_MAXPACKET_LIMIT),
+ u32_get_bits(__entry->edw2, USB_EP_MAX_STREAMS),
+ u32_get_bits(__entry->edw2, USB_EP_MAXBURST),
+ __entry->trb_enqueue, __entry->trb_dequeue,
__entry->flags & DWC3_EP_ENABLED ? 'E' : 'e',
__entry->flags & DWC3_EP_STALL ? 'S' : 's',
__entry->flags & DWC3_EP_WEDGE ? 'W' : 'w',
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage
2023-09-15 5:27 [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage Linyu Yuan
` (2 preceding siblings ...)
2023-09-15 5:27 ` [PATCH v6 /3] usb: dwc3: " Linyu Yuan
@ 2023-09-15 14:13 ` Alan Stern
3 siblings, 0 replies; 7+ messages in thread
From: Alan Stern @ 2023-09-15 14:13 UTC (permalink / raw)
To: Linyu Yuan; +Cc: Thinh Nguyen, Greg Kroah-Hartman, linux-usb
On Fri, Sep 15, 2023 at 01:27:13PM +0800, Linyu Yuan wrote:
> some trace event use an interger to to save a bit field info of gadget,
> also some trace save endpoint name in string forat, it all can be
> chagned to other way at trace event store phase.
>
> bit field can be replace with a union interger member which include
> multiple bit fields.
>
> ep name stringe can be replace to a interger which contaion number
> and dir info.
>
> in order to avoid big endian issue, save interger data into ring
> buffer in __le32 format.
This won't do what you want. cpu_to_le32() puts the _bytes_ in order
from least significant to most significant. But what you want is to put
the _bits_ in order.
For example, suppose sg_supported ends up sitting in BIT(31) and it is
the only flag set. The value of g->dw1 would be 0x80000000. Then
cpu_to_le32(g->dw1) would be 0x00000080, not 0x00000001.
You should do what I wrote earlier:
__entry->dw1 = (g->sg_supported << 0) |
(g->is_otg << 1) |
...
Alan Stern
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v6 /3] usb: dwc3: trace: reduce buffer usage of trace event
2023-09-15 5:27 ` [PATCH v6 /3] usb: dwc3: " Linyu Yuan
@ 2023-09-17 8:00 ` Greg Kroah-Hartman
0 siblings, 0 replies; 7+ messages in thread
From: Greg Kroah-Hartman @ 2023-09-17 8:00 UTC (permalink / raw)
To: Linyu Yuan; +Cc: Thinh Nguyen, Alan Stern, linux-usb
On Fri, Sep 15, 2023 at 01:27:16PM +0800, Linyu Yuan wrote:
> Save u32 members in __le32 format into trace event ring buffer and parse
> it for possible bit fields.
>
> Use new common trace event macro in gadget.h for output stage.
>
> Signed-off-by: Linyu Yuan <quic_linyyuan@quicinc.com>
> ---
> drivers/usb/dwc3/trace.h | 63 ++++++++++++++++++----------------------
> 1 file changed, 29 insertions(+), 34 deletions(-)
Your subject line is broken.
Stop, take some time and rethink this series, and get someone in your
group/company to review it before submitting it again. You seem to be
ignoring our review comments which just makes me want to ignore the
patches entirely, which I do not think you want to have happen :(
greg k-h
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v6 1/3] usb: gadget: add anonymous definition in some struct for trace purpose
2023-09-15 5:27 ` [PATCH v6 1/3] usb: gadget: add anonymous definition in some struct for trace purpose Linyu Yuan
@ 2023-09-17 8:01 ` Greg Kroah-Hartman
0 siblings, 0 replies; 7+ messages in thread
From: Greg Kroah-Hartman @ 2023-09-17 8:01 UTC (permalink / raw)
To: Linyu Yuan; +Cc: Thinh Nguyen, Alan Stern, linux-usb
On Fri, Sep 15, 2023 at 01:27:14PM +0800, Linyu Yuan wrote:
> Some UDC trace event will save usb udc information, but it use one int
> size buffer to save one bit information of usb udc, it waste trace buffer.
How much waste exactly?
> Add anonymous union which have u32 members can be used by trace event
> during fast assign stage to save more entries with same trace ring buffer
> size.
Are you sure?
> Also add some trace event purpose macro in this file for all possiable
> use.
When you say "also" in a changelog, that means the change should be
split up into multiple patches.
> +/*-------------------------------------------------------------------------*/
> +/* trace only, data in __le32 format at trace event fast assign stage */
> +#define USB_GADGET_SG_SUPPORTED BIT(0)
<snip>
This will not work well at all, and is probably broken as-is, sorry,
please rethink all of this.
greg k-h
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-09-17 8:01 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-15 5:27 [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage Linyu Yuan
2023-09-15 5:27 ` [PATCH v6 1/3] usb: gadget: add anonymous definition in some struct for trace purpose Linyu Yuan
2023-09-17 8:01 ` Greg Kroah-Hartman
2023-09-15 5:27 ` [PATCH v6 2/3] usb: udc: trace: reduce buffer usage of trace event Linyu Yuan
2023-09-15 5:27 ` [PATCH v6 /3] usb: dwc3: " Linyu Yuan
2023-09-17 8:00 ` Greg Kroah-Hartman
2023-09-15 14:13 ` [PATCH v6 0/3] usb: gadget: reduce usb gadget trace event buffer usage Alan Stern
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).