From 5c8ad599b942a9a027045e69fc76c84f23c0acf0 Mon Sep 17 00:00:00 2001 From: Bryan O'Donoghue Date: Fri, 18 Sep 2015 16:38:45 +0100 Subject: [PATCH] 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 Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/Makefile | 3 +++ drivers/staging/greybus/core.c | 3 +++ drivers/staging/greybus/operation.c | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/drivers/staging/greybus/Makefile b/drivers/staging/greybus/Makefile index 31b025da5e98..af280538425e 100644 --- a/drivers/staging/greybus/Makefile +++ b/drivers/staging/greybus/Makefile @@ -82,6 +82,9 @@ endif # 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 3c89cb368f6d..765e0db844f1 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 @@ static void __exit gb_exit(void) 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 f9b71e79b4c4..d159831f1421 100644 --- a/drivers/staging/greybus/operation.c +++ b/drivers/staging/greybus/operation.c @@ -15,6 +15,7 @@ #include #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 @@ static int gb_message_send(struct gb_message *message, gfp_t gfp) { 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 @@ static void gb_connection_recv_request(struct gb_connection *connection, 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 @@ static void gb_connection_recv_response(struct gb_connection *connection, 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 @@ void gb_operation_cancel(struct gb_operation *operation, int errno) 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 @@ void gb_operation_cancel_incoming(struct gb_operation *operation, int errno) 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, -- 2.20.1