* [PATCH v2 0/2] usb: core: Improve device lifecycle debuggability
@ 2025-10-14 19:50 Kuen-Han Tsai
2025-10-14 19:50 ` [PATCH v2 1/2] usb: core: Centralize device state update logic Kuen-Han Tsai
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Kuen-Han Tsai @ 2025-10-14 19:50 UTC (permalink / raw)
To: Greg Kroah-Hartman, Mathias Nyman, Alan Stern
Cc: linux-usb, linux-kernel, Kuen-Han Tsai
This series enhances USB core debuggability. The first patch refactors
device state updates into a new update_usb_device_state() helper
function, centralizing logic and preparing for tracing.
The second patch adds tracepoints for USB device allocation and state
changes, providing better visibility into the device lifecycle.
Signed-off-by: Kuen-Han Tsai <khtsai@google.com>
---
Changes in v2:
- hub.c: Changed the inline function to a standard one.
- Makefile: Moved trace.o to the preceding line.
- trace.h: Changed the speed and state into strings.
- Link to v1: https://lore.kernel.org/r/20251013-usbcore-tracing-v1-0-b885a3121b09@google.com
---
Kuen-Han Tsai (2):
usb: core: Centralize device state update logic
usb: core: Add tracepoints for device allocation and state changes
drivers/usb/core/Makefile | 5 +++-
drivers/usb/core/hub.c | 30 +++++++++++++----------
drivers/usb/core/trace.c | 6 +++++
drivers/usb/core/trace.h | 61 +++++++++++++++++++++++++++++++++++++++++++++++
drivers/usb/core/usb.c | 2 ++
5 files changed, 91 insertions(+), 13 deletions(-)
---
base-commit: 5472d60c129f75282d94ae5ad072ee6dfb7c7246
change-id: 20251012-usbcore-tracing-76f00c9b2b3e
Best regards,
--
Kuen-Han Tsai <khtsai@google.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 1/2] usb: core: Centralize device state update logic
2025-10-14 19:50 [PATCH v2 0/2] usb: core: Improve device lifecycle debuggability Kuen-Han Tsai
@ 2025-10-14 19:50 ` Kuen-Han Tsai
2025-10-14 19:50 ` [PATCH v2 2/2] usb: core: Add tracepoints for device allocation and state changes Kuen-Han Tsai
2025-10-14 20:53 ` [PATCH v2 0/2] usb: core: Improve device lifecycle debuggability Alan Stern
2 siblings, 0 replies; 4+ messages in thread
From: Kuen-Han Tsai @ 2025-10-14 19:50 UTC (permalink / raw)
To: Greg Kroah-Hartman, Mathias Nyman, Alan Stern
Cc: linux-usb, linux-kernel, Kuen-Han Tsai
Introduce a new static function, update_usb_device_state(), to
centralize the process of changing a device's state, including the
management of active_duration during suspend/resume transitions.
This change prepares for adding tracepoints, allowing tracing logic to
be added in a single, central location within the new helper function.
Signed-off-by: Kuen-Han Tsai <khtsai@google.com>
---
drivers/usb/core/hub.c | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 256fe8c86828d51c33442345acdb7f3fe80a98ce..d0f5342976a9196e8c92e7bdb0a909207f69ebb5 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2147,6 +2147,20 @@ static void update_port_device_state(struct usb_device *udev)
}
}
+static void update_usb_device_state(struct usb_device *udev,
+ enum usb_device_state new_state)
+{
+ if (udev->state == USB_STATE_SUSPENDED &&
+ new_state != USB_STATE_SUSPENDED)
+ udev->active_duration -= jiffies;
+ else if (new_state == USB_STATE_SUSPENDED &&
+ udev->state != USB_STATE_SUSPENDED)
+ udev->active_duration += jiffies;
+
+ udev->state = new_state;
+ update_port_device_state(udev);
+}
+
static void recursively_mark_NOTATTACHED(struct usb_device *udev)
{
struct usb_hub *hub = usb_hub_to_struct_hub(udev);
@@ -2156,10 +2170,7 @@ static void recursively_mark_NOTATTACHED(struct usb_device *udev)
if (hub->ports[i]->child)
recursively_mark_NOTATTACHED(hub->ports[i]->child);
}
- if (udev->state == USB_STATE_SUSPENDED)
- udev->active_duration -= jiffies;
- udev->state = USB_STATE_NOTATTACHED;
- update_port_device_state(udev);
+ update_usb_device_state(udev, USB_STATE_NOTATTACHED);
}
/**
@@ -2209,14 +2220,7 @@ void usb_set_device_state(struct usb_device *udev,
else
wakeup = 0;
}
- if (udev->state == USB_STATE_SUSPENDED &&
- new_state != USB_STATE_SUSPENDED)
- udev->active_duration -= jiffies;
- else if (new_state == USB_STATE_SUSPENDED &&
- udev->state != USB_STATE_SUSPENDED)
- udev->active_duration += jiffies;
- udev->state = new_state;
- update_port_device_state(udev);
+ update_usb_device_state(udev, new_state);
} else
recursively_mark_NOTATTACHED(udev);
spin_unlock_irqrestore(&device_state_lock, flags);
--
2.51.0.788.g6d19910ace-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] usb: core: Add tracepoints for device allocation and state changes
2025-10-14 19:50 [PATCH v2 0/2] usb: core: Improve device lifecycle debuggability Kuen-Han Tsai
2025-10-14 19:50 ` [PATCH v2 1/2] usb: core: Centralize device state update logic Kuen-Han Tsai
@ 2025-10-14 19:50 ` Kuen-Han Tsai
2025-10-14 20:53 ` [PATCH v2 0/2] usb: core: Improve device lifecycle debuggability Alan Stern
2 siblings, 0 replies; 4+ messages in thread
From: Kuen-Han Tsai @ 2025-10-14 19:50 UTC (permalink / raw)
To: Greg Kroah-Hartman, Mathias Nyman, Alan Stern
Cc: linux-usb, linux-kernel, Kuen-Han Tsai
Introduce new tracepoints to the USB core to improve debuggability of
USB device lifecycle events.
The following tracepoints are added:
- usb_alloc_dev: Triggered when a new USB device structure is allocated,
providing insights into early device setup.
- usb_set_device_state: Triggered when the USB device state changes,
allowing observation of the device's state transitions.
These tracepoints capture detailed information about the USB device,
including its name, speed, state, bus current value, and authorized
flag. This will aid developers in diagnosing issues related to device
enumeration within the USB subsystem.
Examples:
usb_alloc_dev: usb 1-1 speed UNKNOWN state attached 0mA [authorized]
usb_set_device_state: usb 1-1 speed UNKNOWN state powered 0mA [authorized]
usb_set_device_state: usb 1-1 speed full-speed state default 500mA [authorized]
usb_set_device_state: usb 1-1 speed full-speed state default 500mA [authorized]
usb_set_device_state: usb 1-1 speed full-speed state addressed 500mA [authorized]
usb_set_device_state: usb 1-1 speed full-speed state configured 500mA [authorized]
usb_set_device_state: usb 1-1 speed full-speed state suspended 500mA [authorized]
usb_set_device_state: usb 1-1 speed full-speed state not attached 500mA [authorized]
Signed-off-by: Kuen-Han Tsai <khtsai@google.com>
---
drivers/usb/core/Makefile | 5 +++-
drivers/usb/core/hub.c | 2 ++
drivers/usb/core/trace.c | 6 +++++
drivers/usb/core/trace.h | 61 +++++++++++++++++++++++++++++++++++++++++++++++
drivers/usb/core/usb.c | 2 ++
5 files changed, 75 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
index 766000b4939ef937a04848aa9cc45d8bb8860fe5..60ea76160122b98e604ac416bf0ec8f398341411 100644
--- a/drivers/usb/core/Makefile
+++ b/drivers/usb/core/Makefile
@@ -3,10 +3,13 @@
# Makefile for USB Core files and filesystem
#
+# define_trace.h needs to know how to find our header
+CFLAGS_trace.o := -I$(src)
+
usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
usbcore-y += devio.o notify.o generic.o quirks.o devices.o
-usbcore-y += phy.o port.o
+usbcore-y += phy.o port.o trace.o
usbcore-$(CONFIG_OF) += of.o
usbcore-$(CONFIG_USB_XHCI_SIDEBAND) += offload.o
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index d0f5342976a9196e8c92e7bdb0a909207f69ebb5..7c23baeb68aa864f74ee4dff56e39f70ee713bf7 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -40,6 +40,7 @@
#include "hub.h"
#include "phy.h"
#include "otg_productlist.h"
+#include "trace.h"
#define USB_VENDOR_GENESYS_LOGIC 0x05e3
#define USB_VENDOR_SMSC 0x0424
@@ -2159,6 +2160,7 @@ static void update_usb_device_state(struct usb_device *udev,
udev->state = new_state;
update_port_device_state(udev);
+ trace_usb_set_device_state(udev);
}
static void recursively_mark_NOTATTACHED(struct usb_device *udev)
diff --git a/drivers/usb/core/trace.c b/drivers/usb/core/trace.c
new file mode 100644
index 0000000000000000000000000000000000000000..607bcf639d27f15a628537a86155fa92df33fa14
--- /dev/null
+++ b/drivers/usb/core/trace.c
@@ -0,0 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2025 Google LLC
+ */
+#define CREATE_TRACE_POINTS
+#include "trace.h"
diff --git a/drivers/usb/core/trace.h b/drivers/usb/core/trace.h
new file mode 100644
index 0000000000000000000000000000000000000000..903e57dc273af58781ab3fb2f341690d4289bdf8
--- /dev/null
+++ b/drivers/usb/core/trace.h
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025 Google LLC
+ */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM usbcore
+
+#if !defined(_USB_CORE_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _USB_CORE_TRACE_H
+
+#include <linux/types.h>
+#include <linux/tracepoint.h>
+#include <linux/usb.h>
+
+DECLARE_EVENT_CLASS(usb_core_log_usb_device,
+ TP_PROTO(struct usb_device *udev),
+ TP_ARGS(udev),
+ TP_STRUCT__entry(
+ __string(name, dev_name(&udev->dev))
+ __field(enum usb_device_speed, speed)
+ __field(enum usb_device_state, state)
+ __field(unsigned short, bus_mA)
+ __field(unsigned, authorized)
+ ),
+ TP_fast_assign(
+ __assign_str(name);
+ __entry->speed = udev->speed;
+ __entry->state = udev->state;
+ __entry->bus_mA = udev->bus_mA;
+ __entry->authorized = udev->authorized;
+ ),
+ TP_printk("usb %s speed %s state %s %dmA [%s]",
+ __get_str(name),
+ usb_speed_string(__entry->speed),
+ usb_state_string(__entry->state),
+ __entry->bus_mA,
+ __entry->authorized ? "authorized" : "unauthorized")
+);
+
+DEFINE_EVENT(usb_core_log_usb_device, usb_set_device_state,
+ TP_PROTO(struct usb_device *udev),
+ TP_ARGS(udev)
+);
+
+DEFINE_EVENT(usb_core_log_usb_device, usb_alloc_dev,
+ TP_PROTO(struct usb_device *udev),
+ TP_ARGS(udev)
+);
+
+
+#endif /* _USB_CORE_TRACE_H */
+
+/* this part has to be here */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH .
+
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE trace
+
+#include <trace/define_trace.h>
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index b6b0b84895237e2c49b5e8015627ad2c24ee31c2..e740f7852bcdebdbcc30025dcddb16c062265d47 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -46,6 +46,7 @@
#include <linux/dma-mapping.h>
#include "hub.h"
+#include "trace.h"
const char *usbcore_name = "usbcore";
@@ -746,6 +747,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent,
#endif
dev->authorized = usb_dev_authorized(dev, usb_hcd);
+ trace_usb_alloc_dev(dev);
return dev;
}
EXPORT_SYMBOL_GPL(usb_alloc_dev);
--
2.51.0.788.g6d19910ace-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 0/2] usb: core: Improve device lifecycle debuggability
2025-10-14 19:50 [PATCH v2 0/2] usb: core: Improve device lifecycle debuggability Kuen-Han Tsai
2025-10-14 19:50 ` [PATCH v2 1/2] usb: core: Centralize device state update logic Kuen-Han Tsai
2025-10-14 19:50 ` [PATCH v2 2/2] usb: core: Add tracepoints for device allocation and state changes Kuen-Han Tsai
@ 2025-10-14 20:53 ` Alan Stern
2 siblings, 0 replies; 4+ messages in thread
From: Alan Stern @ 2025-10-14 20:53 UTC (permalink / raw)
To: Kuen-Han Tsai; +Cc: Greg Kroah-Hartman, Mathias Nyman, linux-usb, linux-kernel
On Wed, Oct 15, 2025 at 03:50:50AM +0800, Kuen-Han Tsai wrote:
> This series enhances USB core debuggability. The first patch refactors
> device state updates into a new update_usb_device_state() helper
> function, centralizing logic and preparing for tracing.
>
> The second patch adds tracepoints for USB device allocation and state
> changes, providing better visibility into the device lifecycle.
>
> Signed-off-by: Kuen-Han Tsai <khtsai@google.com>
> ---
For both patches:
Reviewed-by: Alan Stern <stern@rowland.harvard.edu>
> Changes in v2:
> - hub.c: Changed the inline function to a standard one.
> - Makefile: Moved trace.o to the preceding line.
> - trace.h: Changed the speed and state into strings.
> - Link to v1: https://lore.kernel.org/r/20251013-usbcore-tracing-v1-0-b885a3121b09@google.com
>
> ---
> Kuen-Han Tsai (2):
> usb: core: Centralize device state update logic
> usb: core: Add tracepoints for device allocation and state changes
>
> drivers/usb/core/Makefile | 5 +++-
> drivers/usb/core/hub.c | 30 +++++++++++++----------
> drivers/usb/core/trace.c | 6 +++++
> drivers/usb/core/trace.h | 61 +++++++++++++++++++++++++++++++++++++++++++++++
> drivers/usb/core/usb.c | 2 ++
> 5 files changed, 91 insertions(+), 13 deletions(-)
> ---
> base-commit: 5472d60c129f75282d94ae5ad072ee6dfb7c7246
> change-id: 20251012-usbcore-tracing-76f00c9b2b3e
>
> Best regards,
> --
> Kuen-Han Tsai <khtsai@google.com>
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-10-14 20:53 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-14 19:50 [PATCH v2 0/2] usb: core: Improve device lifecycle debuggability Kuen-Han Tsai
2025-10-14 19:50 ` [PATCH v2 1/2] usb: core: Centralize device state update logic Kuen-Han Tsai
2025-10-14 19:50 ` [PATCH v2 2/2] usb: core: Add tracepoints for device allocation and state changes Kuen-Han Tsai
2025-10-14 20:53 ` [PATCH v2 0/2] usb: core: Improve device lifecycle debuggability 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).