mac80211: trace debug messages
authorJohannes Berg <johannes.berg@intel.com>
Fri, 22 Jun 2012 11:36:25 +0000 (13:36 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Sun, 24 Jun 2012 09:33:18 +0000 (11:33 +0200)
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@intel.com>
net/mac80211/Kconfig
net/mac80211/debug.h
net/mac80211/trace.c
net/mac80211/trace.h

index 7475e266eb4e605fe07df189530558637eb1047e..63af25458fdad7afd6ec253ac365a35d26772dbd 100644 (file)
@@ -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
index 6e6bbb9a9d41119392ff7158e6651c2cb7900ce3..8f383a5760165a363019e7d31d1981b5aa995225 100644 (file)
@@ -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
 #define MAC80211_MLME_DEBUG 0
 #endif
 
+#ifdef CONFIG_MAC80211_MESSAGE_TRACING
+void __sdata_info(const char *fmt, ...) __printf(1, 2);
+void __sdata_dbg(bool print, const char *fmt, ...) __printf(2, 3);
+void __sdata_err(const char *fmt, ...) __printf(1, 2);
+void __wiphy_dbg(struct wiphy *wiphy, bool print, const char *fmt, ...)
+       __printf(3, 4);
+
+#define _sdata_info(sdata, fmt, ...)                                   \
+       __sdata_info("%s: " fmt, (sdata)->name, ##__VA_ARGS__)
+#define _sdata_dbg(print, sdata, fmt, ...)                             \
+       __sdata_dbg(print, "%s: " fmt, (sdata)->name, ##__VA_ARGS__)
+#define _sdata_err(sdata, fmt, ...)                                    \
+       __sdata_err("%s: " fmt, (sdata)->name, ##__VA_ARGS__)
+#define _wiphy_dbg(print, wiphy, fmt, ...)                             \
+       __wiphy_dbg(wiphy, print, fmt, ##__VA_ARGS__)
+#else
 #define _sdata_info(sdata, fmt, ...)                                   \
 do {                                                                   \
        pr_info("%s: " fmt,                                             \
@@ -85,6 +102,7 @@ do {                                                                 \
        if (print)                                                      \
                wiphy_dbg((wiphy), fmt, ##__VA_ARGS__);                 \
 } while (0)
+#endif
 
 #define sdata_info(sdata, fmt, ...)                                    \
        _sdata_info(sdata, fmt, ##__VA_ARGS__)
index 943da6e7076cb95b8947a1ade04032439d2f82d7..386e45d8a95818ba4a447b764288d935b9476638 100644 (file)
@@ -3,7 +3,73 @@
 
 /* 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(const char *fmt, ...)
+{
+       struct va_format vaf = {
+               .fmt = fmt,
+       };
+       va_list args;
+
+       va_start(args, fmt);
+       vaf.va = &args;
+
+       pr_info("%pV", &vaf);
+       trace_mac80211_info(&vaf);
+       va_end(args);
+}
+
+void __sdata_dbg(bool print, const char *fmt, ...)
+{
+       struct va_format vaf = {
+               .fmt = fmt,
+       };
+       va_list args;
+
+       va_start(args, fmt);
+       vaf.va = &args;
+
+       if (print)
+               pr_debug("%pV", &vaf);
+       trace_mac80211_dbg(&vaf);
+       va_end(args);
+}
+
+void __sdata_err(const char *fmt, ...)
+{
+       struct va_format vaf = {
+               .fmt = fmt,
+       };
+       va_list args;
+
+       va_start(args, fmt);
+       vaf.va = &args;
+
+       pr_err("%pV", &vaf);
+       trace_mac80211_err(&vaf);
+       va_end(args);
+}
+
+void __wiphy_dbg(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_dbg(wiphy, "%pV", &vaf);
+       trace_mac80211_dbg(&vaf);
+       va_end(args);
+}
+#endif
 #endif
index 392bcc9f6a12ba9789510eb39b6e4bfc22390d4a..2e60f4acd027e46e52e218e538efa995b1ed1b7b 100644 (file)
@@ -1632,6 +1632,45 @@ 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
+
+DECLARE_EVENT_CLASS(mac80211_msg_event,
+       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", __get_str(msg))
+);
+
+DEFINE_EVENT(mac80211_msg_event, mac80211_info,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf)
+);
+DEFINE_EVENT(mac80211_msg_event, mac80211_dbg,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf)
+);
+DEFINE_EVENT(mac80211_msg_event, mac80211_err,
+       TP_PROTO(struct va_format *vaf),
+       TP_ARGS(vaf)
+);
+#endif
+
 #endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */
 
 #undef TRACE_INCLUDE_PATH