[Cc: [email protected]]
Dear Yutan,
Thank you for your patch.
Am 08.12.25 um 13:32 schrieb [email protected]:
From: Qiu Yutan <[email protected]>
Add tracepoints for tracking hci_conn_hold, hci_conn_drop, and hci_conn_del
to facilitate debugging and viewing call stacks.
I’d add a blank line between paragraphs.
The existing Bluetooth debugging method, BT_DBG, cannot trace call stacks.
It’d be great if you added an example output, how to use hte new trace
points.
Signed-off-by: Qiu Yutan <[email protected]>
Signed-off-by: Wang Yaxin <[email protected]>
Signed-off-by: xu xin <[email protected]>
Please start each name with a capital letter.
Signed-off-by: Chen Junlin <[email protected]>
---
include/net/bluetooth/hci_core.h | 3 ++
include/trace/events/bluetooth.h | 80 ++++++++++++++++++++++++++++++++
net/bluetooth/hci_conn.c | 4 ++
3 files changed, 87 insertions(+)
create mode 100644 include/trace/events/bluetooth.h
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 2b261e74e2c4..5e01e6c501c1 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -29,6 +29,7 @@
#include <linux/idr.h>
#include <linux/leds.h>
#include <linux/rculist.h>
+#include <trace/events/bluetooth.h>
#include <net/bluetooth/hci.h>
#include <net/bluetooth/hci_drv.h>
@@ -1620,6 +1621,7 @@ static inline void hci_conn_put(struct hci_conn *conn)
static inline struct hci_conn *hci_conn_hold(struct hci_conn *conn)
{
+ trace_hci_conn_hold(conn);
BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
atomic_inc(&conn->refcnt);
@@ -1630,6 +1632,7 @@ static inline struct hci_conn *hci_conn_hold(struct
hci_conn *conn)
static inline void hci_conn_drop(struct hci_conn *conn)
{
+ trace_hci_conn_drop(conn);
BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
if (atomic_dec_and_test(&conn->refcnt)) {
diff --git a/include/trace/events/bluetooth.h b/include/trace/events/bluetooth.h
new file mode 100644
index 000000000000..dd6446263e83
--- /dev/null
+++ b/include/trace/events/bluetooth.h
@@ -0,0 +1,80 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM bluetooth
+
+#if !defined(_TRACE_BLUETOOTH_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_BLUETOOTH_H
+
+#include <linux/tracepoint.h>
+#include <net/bluetooth/hci_core.h>
+
+TRACE_EVENT(hci_conn_hold,
+
+ TP_PROTO(void *conn_ptr),
+
+ TP_ARGS(conn_ptr),
+
+ TP_STRUCT__entry(
+ __field(void *, conn_addr)
+ __field(int, refcnt)
+ ),
+
+ TP_fast_assign(
+ struct hci_conn *conn = (struct hci_conn *)conn_ptr;
+
+ __entry->conn_addr = conn;
+ __entry->refcnt = atomic_read(&conn->refcnt);
+ ),
+
+ TP_printk("conn_addr=%p, orig refcnt=%d",
+ __entry->conn_addr, __entry->refcnt)
+)
+
+TRACE_EVENT(hci_conn_drop,
+
+ TP_PROTO(void *conn_ptr),
+
+ TP_ARGS(conn_ptr),
+
+ TP_STRUCT__entry(
+ __field(void *, conn_addr)
+ __field(int, refcnt)
+ ),
+
+ TP_fast_assign(
+ struct hci_conn *conn = (struct hci_conn *)conn_ptr;
+
+ __entry->conn_addr = conn;
+ __entry->refcnt = atomic_read(&conn->refcnt);
+ ),
+
+ TP_printk("conn_addr=%p, orig refcnt=%d",
+ __entry->conn_addr, __entry->refcnt)
+)
+
+TRACE_EVENT(hci_conn_del,
+
+ TP_PROTO(void *conn_ptr),
+
+ TP_ARGS(conn_ptr),
+
+ TP_STRUCT__entry(
+ __field(void *, conn_addr)
+ __field(int, refcnt)
+ ),
+
+ TP_fast_assign(
+ struct hci_conn *conn = (struct hci_conn *)conn_ptr;
+
+ __entry->conn_addr = conn;
+ __entry->refcnt = atomic_read(&conn->refcnt);
+ ),
+
+ TP_printk("conn_addr=%p, orig refcnt=%d",
+ __entry->conn_addr, __entry->refcnt)
+)
All definitions look the same besides the name. Any idea, how the
duplication can be avoided?
+
+#endif /* _TRACE_BLUETOOTH_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 99efeed6a766..74a02cf7ba14 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -35,6 +35,9 @@
#include <net/bluetooth/iso.h>
#include <net/bluetooth/mgmt.h>
+#define CREATE_TRACE_POINTS
+#include <trace/events/bluetooth.h>
+
#include "smp.h"
#include "eir.h"
@@ -1129,6 +1132,7 @@ static void hci_conn_unlink(struct hci_conn *conn)
void hci_conn_del(struct hci_conn *conn)
{
+ trace_hci_conn_del(conn);
struct hci_dev *hdev = conn->hdev;
BT_DBG("%s hcon %p handle %d", hdev->name, conn, conn->handle);
Thank you for working on that. I’t great to see.
Kind regards,
Paul