greybus: operation, core: hook tracepoints into message opertions

This patch hooks tracepoints for greybus messages

- trace_gb_message_send
- trace_gb_message_recv_request
- trace_gb_message_recv_response
- trace_gb_message_cancel_outgoing
- trace_gb_message_cancel_incoming

It provides standard tracepoints at

/sys/kernel/debug/tracing/events/greybus/gb_message_send
/sys/kernel/debug/tracing/events/greybus/gb_message_recv_response
/sys/kernel/debug/tracing/events/greybus/gb_message_recv_request
/sys/kernel/debug/tracing/events/greybus/gb_message_cancel_outgoing
/sys/kernel/debug/tracing/events/greybus/gb_message_cancel_incoming

Giving outputs like

gb_message_recv_request: greybus:1-1.1:0 op=0001 if_id=0000 hd_id=0000 l=2
gb_message_send: greybus:1-1.1:0 op=0001 if_id=0000 hd_id=0000 l=2

Similarly perf events can be viewed with standard perf tools e.g.

root@beaglebone:~# perf list 'greybus:*'
  greybus:gb_message_send                            [Tracepoint event]
  greybus:gb_message_recv_request                    [Tracepoint event]
  greybus:gb_message_recv_response                   [Tracepoint event]
  greybus:gb_message_cancel_outgoing                 [Tracepoint event]
  greybus:gb_message_cancel_incoming                 [Tracepoint event]

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
diff --git a/drivers/staging/greybus/Makefile b/drivers/staging/greybus/Makefile
index 31b025d..af28053 100644
--- a/drivers/staging/greybus/Makefile
+++ b/drivers/staging/greybus/Makefile
@@ -82,6 +82,9 @@
 # add -Wall to try to catch everything we can.
 ccflags-y := -Wall
 
+# needed for trace events
+ccflags-y += -I$(src)
+
 all: module
 
 module:
diff --git a/drivers/staging/greybus/core.c b/drivers/staging/greybus/core.c
index 3c89cb3..765e0db8 100644
--- a/drivers/staging/greybus/core.c
+++ b/drivers/staging/greybus/core.c
@@ -9,7 +9,9 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#define CREATE_TRACE_POINTS
 #include "greybus.h"
+#include "greybus_trace.h"
 
 /* Allow greybus to be disabled at boot if needed */
 static bool nogreybus;
@@ -347,6 +349,7 @@
 	gb_operation_exit();
 	bus_unregister(&greybus_bus_type);
 	gb_debugfs_cleanup();
+	tracepoint_synchronize_unregister();
 }
 module_exit(gb_exit);
 MODULE_LICENSE("GPL v2");
diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c
index f9b71e7..d159831 100644
--- a/drivers/staging/greybus/operation.c
+++ b/drivers/staging/greybus/operation.c
@@ -15,6 +15,7 @@
 #include <linux/workqueue.h>
 
 #include "greybus.h"
+#include "greybus_trace.h"
 
 static struct kmem_cache *gb_operation_cache;
 static struct kmem_cache *gb_message_cache;
@@ -197,6 +198,7 @@
 {
 	struct gb_connection *connection = message->operation->connection;
 
+	trace_gb_message_send(message);
 	return connection->hd->driver->message_send(connection->hd,
 					connection->hd_cport_id,
 					message,
@@ -834,6 +836,7 @@
 		gb_operation_put(operation);
 		return;
 	}
+	trace_gb_message_recv_request(operation->request);
 
 	/*
 	 * The initial reference to the operation will be dropped when the
@@ -872,6 +875,7 @@
 			message->header->type, size, message_size);
 		errno = -EMSGSIZE;
 	}
+	trace_gb_message_recv_response(operation->response);
 
 	/* We must ignore the payload if a bad status is returned */
 	if (errno)
@@ -942,6 +946,7 @@
 		gb_message_cancel(operation->request);
 		queue_work(gb_operation_completion_wq, &operation->work);
 	}
+	trace_gb_message_cancel_outgoing(operation->request);
 
 	atomic_inc(&operation->waiters);
 	wait_event(gb_operation_cancellation_queue,
@@ -968,6 +973,7 @@
 		if (!gb_operation_result_set(operation, errno))
 			gb_message_cancel(operation->response);
 	}
+	trace_gb_message_cancel_incoming(operation->response);
 
 	atomic_inc(&operation->waiters);
 	wait_event(gb_operation_cancellation_queue,