tools lib traceevent: Add mac80211 plugin
authorJiri Olsa <jolsa@redhat.com>
Tue, 3 Dec 2013 13:09:30 +0000 (14:09 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 4 Dec 2013 18:30:36 +0000 (15:30 -0300)
Backporting mac80211 plugin.

Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git

This plugin adds changed field resolving for
mac80211:drv_bss_info_changed tracepoint event.

The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'mac80211:drv_bss_info_changed' -a')

  --- script.mac80211.old
  +++ script.mac80211.new
  -        ifconfig  3711 [000]  1290.446492: mac80211:drv_bss_info_changed: phy0 vif:wlan0(2) changed:0x309f
  +        ifconfig  3711 [000]  1290.446492: mac80211:drv_bss_info_changed: phy0 vif:wlan0(2)
  +                                                                 assoc:0 aid:2 cts:0 shortpre:0 shortslot:0 dtimper:1
  +                                                                 bcnint:102 assoc_cap:0x431 basic_rates:0xf enable_beacon:0
  +                                                                 ht_operation_mode:0

Omitting the mac80211:drv_config tracepoint handling because the kernel
tracepoint changed its prototype and the plugin handler is no longer
working.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1386076182-14484-17-git-send-email-jolsa@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/traceevent/Makefile
tools/lib/traceevent/plugin_mac80211.c [new file with mode: 0644]

index 226a8f9..d0e0ca1 100644 (file)
@@ -216,6 +216,7 @@ PLUGIN_OBJS  = plugin_jbd2.o
 PLUGIN_OBJS += plugin_hrtimer.o
 PLUGIN_OBJS += plugin_kmem.o
 PLUGIN_OBJS += plugin_kvm.o
+PLUGIN_OBJS += plugin_mac80211.o
 
 PLUGINS := $(PLUGIN_OBJS:.o=.so)
 
diff --git a/tools/lib/traceevent/plugin_mac80211.c b/tools/lib/traceevent/plugin_mac80211.c
new file mode 100644 (file)
index 0000000..558a3b9
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2009 Johannes Berg <johannes@sipsolutions.net>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not,  see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "event-parse.h"
+
+#define INDENT 65
+
+static void print_string(struct trace_seq *s, struct event_format *event,
+                        const char *name, const void *data)
+{
+       struct format_field *f = pevent_find_field(event, name);
+       int offset;
+       int length;
+
+       if (!f) {
+               trace_seq_printf(s, "NOTFOUND:%s", name);
+               return;
+       }
+
+       offset = f->offset;
+       length = f->size;
+
+       if (!strncmp(f->type, "__data_loc", 10)) {
+               unsigned long long v;
+               if (pevent_read_number_field(f, data, &v)) {
+                       trace_seq_printf(s, "invalid_data_loc");
+                       return;
+               }
+               offset = v & 0xffff;
+               length = v >> 16;
+       }
+
+       trace_seq_printf(s, "%.*s", length, (char *)data + offset);
+}
+
+#define SF(fn) pevent_print_num_field(s, fn ":%d", event, fn, record, 0)
+#define SFX(fn)        pevent_print_num_field(s, fn ":%#x", event, fn, record, 0)
+#define SP()   trace_seq_putc(s, ' ')
+
+static int drv_bss_info_changed(struct trace_seq *s,
+                               struct pevent_record *record,
+                               struct event_format *event, void *context)
+{
+       void *data = record->data;
+
+       print_string(s, event, "wiphy_name", data);
+       trace_seq_printf(s, " vif:");
+       print_string(s, event, "vif_name", data);
+       pevent_print_num_field(s, "(%d)", event, "vif_type", record, 1);
+
+       trace_seq_printf(s, "\n%*s", INDENT, "");
+       SF("assoc"); SP();
+       SF("aid"); SP();
+       SF("cts"); SP();
+       SF("shortpre"); SP();
+       SF("shortslot"); SP();
+       SF("dtimper"); SP();
+       trace_seq_printf(s, "\n%*s", INDENT, "");
+       SF("bcnint"); SP();
+       SFX("assoc_cap"); SP();
+       SFX("basic_rates"); SP();
+       SF("enable_beacon");
+       trace_seq_printf(s, "\n%*s", INDENT, "");
+       SF("ht_operation_mode");
+
+       return 0;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+       pevent_register_event_handler(pevent, -1, "mac80211",
+                                     "drv_bss_info_changed",
+                                     drv_bss_info_changed, NULL);
+       return 0;
+}