In newer kernel, the "system name" of a event call is stored in struct ftrace_event_class, so we have to change ftrace_get_event_type_system() for it. Signed-off-by: Lai Jiangshan <laijs@xxxxxxxxxxxxxx> --- diff --git a/extensions/trace.c b/extensions/trace.c index 1ad53c1..a54e4fa 100755 --- a/extensions/trace.c +++ b/extensions/trace.c @@ -822,18 +822,37 @@ int ftrace_get_event_type_system(ulong call, char *system, int len) { static int inited; static int sys_offset; + static int class_offset; + ulong ptr = call; ulong sys_addr; - if (!inited) { - inited = 1; - sys_offset = MEMBER_OFFSET("ftrace_event_call", "system"); - } + if (inited) + goto work; + inited = 1; + sys_offset = MEMBER_OFFSET("ftrace_event_call", "system"); + + if (sys_offset >= 0) + goto work; + + class_offset = MEMBER_OFFSET("ftrace_event_call", "class"); + if (class_offset < 0) + return -1; + + sys_offset = MEMBER_OFFSET("ftrace_event_class", "system"); + inited = 2; + +work: if (sys_offset < 0) return -1; - if (!readmem(call + sys_offset, KVADDR, &sys_addr, sizeof(sys_addr), + if (inited == 2 && !readmem(call + class_offset, KVADDR, &ptr, + sizeof(ptr), "read ftrace_event_call class_addr", + RETURN_ON_ERROR)) + return -1; + + if (!readmem(ptr + sys_offset, KVADDR, &sys_addr, sizeof(sys_addr), "read ftrace_event_call sys_addr", RETURN_ON_ERROR)) return -1; -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility