Re: [PATCH] Fix trace extension for v3.15+

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

 



Hello Rabin,

This patch looks good to me.

Reviewed-by: Qiao Nuohan <qiaonuohan@xxxxxxxxxxxxxx>

On 02/05/2015 05:40 AM, Rabin Vincent wrote:
Since Linux v3.15 (specifically, the following commit), the event name is
optionally moved to another structure.

commit de7b2973903c6cc50b31ee5682a69b2219b9919d
Author: Mathieu Desnoyers<mathieu.desnoyers@xxxxxxxxxxxx>
Date:   Tue Apr 8 17:26:21 2014 -0400

     tracepoint: Use struct pointer instead of name hash for reg/unreg tracepoints

-       char                    *name;
+       union {
+               char                    *name;
+               /* Set TRACE_EVENT_FL_TRACEPOINT flag when using "tp" */
+               struct tracepoint       *tp;
+       };

This patch handles this in the trace extension so that both kernels with and
without that commit work.
---
  extensions/trace.c | 46 ++++++++++++++++++++++++++++++++++++++++++----
  1 file changed, 42 insertions(+), 4 deletions(-)

diff --git a/extensions/trace.c b/extensions/trace.c
index a09f6a1..8639fb2 100644
--- a/extensions/trace.c
+++ b/extensions/trace.c
@@ -988,19 +988,42 @@ static void ftrace_destroy_event_types(void)
  	free(ftrace_common_fields);
  }

+#define TRACE_EVENT_FL_TRACEPOINT 0x40
+
  static
  int ftrace_get_event_type_name(ulong call, char *name, int len)
  {
  	static int inited;
  	static int name_offset;
+	static int flags_offset;
+	static int tp_name_offset;
+	uint flags;

  	ulong name_addr;

-	if (!inited) {
-		inited = 1;
-		name_offset = MEMBER_OFFSET("ftrace_event_call", "name");
-	}
+	if (inited)
+		goto work;
+
+	inited = 1;
+	name_offset = MEMBER_OFFSET("ftrace_event_call", "name");
+	if (name_offset>= 0)
+		goto work;

+	name_offset = ANON_MEMBER_OFFSET("ftrace_event_call", "name");
+	if (name_offset<  0)
+		return -1;
+
+	flags_offset = MEMBER_OFFSET("ftrace_event_call", "flags");
+	if (flags_offset<  0)
+		return -1;
+
+	tp_name_offset = MEMBER_OFFSET("tracepoint", "name");
+	if (tp_name_offset<  0)
+		return -1;
+
+	inited = 2;
+
+work:
  	if (name_offset<  0)
  		return -1;

@@ -1008,6 +1031,21 @@ int ftrace_get_event_type_name(ulong call, char *name, int len)
  			"read ftrace_event_call name_addr", RETURN_ON_ERROR))
  		return -1;

+	if (inited == 2) {
+		if (!readmem(call + flags_offset, KVADDR,&flags,
+			     sizeof(flags), "read ftrace_event_call flags",
+			     RETURN_ON_ERROR))
+			return -1;
+
+		if (flags&  TRACE_EVENT_FL_TRACEPOINT) {
+			if (!readmem(name_addr + tp_name_offset, KVADDR,
+				&name_addr, sizeof(name_addr),
+				     "read tracepoint name", RETURN_ON_ERROR))
+				return -1;
+		}
+
+	}
+
  	if (!read_string(name_addr, name, len))
  		return -1;



--
Regards
Qiao Nuohan

--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux