Search Linux Wireless

[PATCH 6/6] mac80211: trace debug messages

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Johannes Berg <johannes.berg@xxxxxxxxx>

It can be very useful to have all debug messages
available when debugging, but hard to correlate
between different sources, so add a trace event
for all mac80211 debug messages.

Signed-off-by: Johannes Berg <johannes.berg@xxxxxxxxx>
---
 net/mac80211/Kconfig |   13 +++++++++++++
 net/mac80211/debug.h |   11 +++++++++++
 net/mac80211/trace.c |   36 ++++++++++++++++++++++++++++++++++++
 net/mac80211/trace.h |   26 ++++++++++++++++++++++++++
 4 files changed, 86 insertions(+)

diff --git a/net/mac80211/Kconfig b/net/mac80211/Kconfig
index 7475e26..63af254 100644
--- a/net/mac80211/Kconfig
+++ b/net/mac80211/Kconfig
@@ -107,6 +107,19 @@ config MAC80211_DEBUGFS
 
 	  Say N unless you know you need this.
 
+config MAC80211_MESSAGE_TRACING
+	bool "Trace all mac80211 debug messages"
+	depends on MAC80211
+	---help---
+	  Select this option to have mac80211 register the
+	  mac80211_msg trace subsystem with tracepoints to
+	  collect all debugging messages, independent of
+	  printing them into the kernel log.
+
+	  The overhead in this option is that all the messages
+	  need to be present in the binary and formatted at
+	  runtime for tracing.
+
 menuconfig MAC80211_DEBUG_MENU
 	bool "Select mac80211 debugging features"
 	depends on MAC80211
diff --git a/net/mac80211/debug.h b/net/mac80211/debug.h
index b2f4d2d..1bed034 100644
--- a/net/mac80211/debug.h
+++ b/net/mac80211/debug.h
@@ -1,5 +1,6 @@
 #ifndef __MAC80211_DEBUG_H
 #define __MAC80211_DEBUG_H
+#include <net/cfg80211.h>
 
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
 #define MAC80211_IBSS_DEBUG 1
@@ -56,6 +57,15 @@
 #endif
 
 
+#ifdef CONFIG_MAC80211_MESSAGE_TRACING
+void __sdata_info(bool print, const char *fmt, ...);
+void __wiphy_info(struct wiphy *wiphy, bool print, const char *fmt, ...);
+
+#define _sdata_info(print, sdata, fmt, ...)				\
+	__sdata_info(print, "%s: " fmt, (sdata)->name, ##__VA_ARGS__)
+#define _wiphy_info(print, wiphy, fmt, ...)				\
+	__wiphy_info(wiphy, print, fmt, ##__VA_ARGS__)
+#else
 #define _sdata_info(print, sdata, fmt, ...)				\
 do {									\
 	if (print)							\
@@ -67,6 +77,7 @@ do {									\
 	if (print)							\
 		wiphy_info((wiphy), fmt "\n", ##__VA_ARGS__);		\
 } while (0)
+#endif
 
 #define sdata_info(sdata, fmt, ...)					\
 	_sdata_info(1, sdata, fmt, ##__VA_ARGS__)
diff --git a/net/mac80211/trace.c b/net/mac80211/trace.c
index 943da6e..e61383b 100644
--- a/net/mac80211/trace.c
+++ b/net/mac80211/trace.c
@@ -3,7 +3,43 @@
 
 /* sparse isn't too happy with all macros... */
 #ifndef __CHECKER__
+#include <net/cfg80211.h>
 #include "driver-ops.h"
+#include "debug.h"
 #define CREATE_TRACE_POINTS
 #include "trace.h"
+
+#ifdef CONFIG_MAC80211_MESSAGE_TRACING
+void __sdata_info(bool print, const char *fmt, ...)
+{
+	struct va_format vaf = {
+		.fmt = fmt,
+	};
+	va_list args;
+
+	va_start(args, fmt);
+	vaf.va = &args;
+
+	if (print)
+		pr_info("%pV\n", &vaf);
+	trace_mac80211_msg(&vaf);
+	va_end(args);
+}
+
+void __wiphy_info(struct wiphy *wiphy, bool print, const char *fmt, ...)
+{
+	struct va_format vaf = {
+		.fmt = fmt,
+	};
+	va_list args;
+
+	va_start(args, fmt);
+	vaf.va = &args;
+
+	if (print)
+		wiphy_info(wiphy, "%pV\n", &vaf);
+	trace_mac80211_msg(&vaf);
+	va_end(args);
+}
+#endif
 #endif
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index 392bcc9..b205aad 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -1632,6 +1632,32 @@ TRACE_EVENT(stop_queue,
 		LOCAL_PR_ARG, __entry->queue, __entry->reason
 	)
 );
+
+#ifdef CONFIG_MAC80211_MESSAGE_TRACING
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM mac80211_msg
+
+#define MAX_MSG_LEN	100
+
+TRACE_EVENT(mac80211_msg,
+	TP_PROTO(struct va_format *vaf),
+
+	TP_ARGS(vaf),
+
+        TP_STRUCT__entry(
+		__dynamic_array(char, msg, MAX_MSG_LEN)
+        ),
+
+	TP_fast_assign(
+		WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
+				       MAX_MSG_LEN, vaf->fmt,
+				       *vaf->va) >= MAX_MSG_LEN);
+	),
+
+	TP_printk("%s", (char *)__get_dynamic_array(msg))
+);
+#endif
+
 #endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */
 
 #undef TRACE_INCLUDE_PATH
-- 
1.7.10

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux