From 7f7d267ed1b2db751a58a1e898742f3f59b39146 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Nov 03 2016 06:03:39 +0000 Subject: import crash-trace-command-2.0-10.el7 --- diff --git a/SOURCES/linux_4.2_support.patch b/SOURCES/linux_4.2_support.patch new file mode 100644 index 0000000..487b84e --- /dev/null +++ b/SOURCES/linux_4.2_support.patch @@ -0,0 +1,265 @@ +--- crash-trace-command-2.0/trace.c.orig ++++ crash-trace-command-2.0/trace.c +@@ -34,6 +34,10 @@ static int encapsulated_current_trace; + * trace_buffer is supported + */ + static int trace_buffer_available; ++/* ++ * max_buffer is supported ++ */ ++static int max_buffer_available; + + #define koffset(struct, member) struct##_##member##_offset + +@@ -154,6 +158,7 @@ static int init_offsets(void) + if (koffset(struct, member) < 0) { \ + fprintf(fp, "failed to init the offset, struct:"\ + #struct ", member:" #member); \ ++ fprintf(fp, "\n"); \ + return -1; \ + } \ + } while (0) +@@ -163,8 +168,10 @@ static int init_offsets(void) + + if (trace_buffer_available) { + init_offset(trace_array, trace_buffer); +- init_offset(trace_array, max_buffer); + init_offset(trace_buffer, buffer); ++ ++ if (max_buffer_available) ++ init_offset(trace_array, max_buffer); + } else { + init_offset(trace_array, buffer); + } +@@ -176,6 +183,9 @@ static int init_offsets(void) + fprintf(fp, "per cpu buffer sizes\n"); + } + ++ if (kernel_symbol_exists("ring_buffer_read")) ++ gdb_set_crash_scope(symbol_value("ring_buffer_read"), "ring_buffer_read"); ++ + if (!per_cpu_buffer_sizes) + init_offset(ring_buffer, pages); + init_offset(ring_buffer, flags); +@@ -205,7 +215,12 @@ static int init_offsets(void) + + init_offset(list_head, next); + +- init_offset(ftrace_event_call, list); ++ koffset(ftrace_event_call, list) = MAX(MEMBER_OFFSET("ftrace_event_call", "list"), ++ MEMBER_OFFSET("trace_event_call", "list")); ++ if (koffset(ftrace_event_call, list) < 0) { ++ fprintf(fp, "failed to init the offset, struct:[f]trace_event_call member:list)\n"); ++ return -1; \ ++ } + + init_offset(ftrace_event_field, link); + init_offset(ftrace_event_field, name); +@@ -448,6 +463,9 @@ out_fail: + static int ftrace_int_max_tr_trace(void) + { + if (trace_buffer_available) { ++ if (!max_buffer_available) ++ return 0; ++ + global_max_buffer = global_trace + koffset(trace_array, max_buffer); + read_value(max_tr_ring_buffer, global_max_buffer, trace_buffer, buffer); + } else { +@@ -528,6 +546,9 @@ static int ftrace_init(void) + + if (MEMBER_EXISTS("trace_array", "trace_buffer")) { + trace_buffer_available = 1; ++ ++ if (MEMBER_EXISTS("trace_array", "max_buffer")) ++ max_buffer_available = 1; + } else { + sym_max_tr_trace = symbol_search("max_tr"); + if (sym_max_tr_trace == NULL) +@@ -710,7 +731,8 @@ static int syscall_get_enter_fields(ulon + goto work; + + inited = 1; +- data_offset = MEMBER_OFFSET("ftrace_event_call", "data"); ++ data_offset = MAX(MEMBER_OFFSET("ftrace_event_call", "data"), ++ MEMBER_OFFSET("trace_event_call", "data")); + if (data_offset < 0) + return -1; + +@@ -742,7 +764,8 @@ static int syscall_get_exit_fields_old(u + goto work; + + inited = 1; +- data_offset = MEMBER_OFFSET("ftrace_event_call", "data"); ++ data_offset = MAX(MEMBER_OFFSET("ftrace_event_call", "data"), ++ MEMBER_OFFSET("trace_event_call", "data")); + if (data_offset < 0) + return -1; + +@@ -803,18 +826,22 @@ int ftrace_get_event_type_fields(ulong c + goto work; + + inited = 1; +- fields_offset = MEMBER_OFFSET("ftrace_event_call", "fields"); ++ fields_offset = MAX(MEMBER_OFFSET("ftrace_event_call", "fields"), ++ MEMBER_OFFSET("trace_event_call", "fields")); + +- class_offset = MEMBER_OFFSET("ftrace_event_call", "class"); ++ class_offset = MAX(MEMBER_OFFSET("ftrace_event_call", "class"), ++ MEMBER_OFFSET("trace_event_call", "class")); + if (class_offset < 0) + goto work; + + inited = 2; +- fields_offset = MEMBER_OFFSET("ftrace_event_class", "fields"); ++ fields_offset = MAX(MEMBER_OFFSET("ftrace_event_class", "fields"), ++ MEMBER_OFFSET("trace_event_class", "fields")); + if (fields_offset < 0) + return -1; + +- get_fields_offset = MEMBER_OFFSET("ftrace_event_class", "get_fields"); ++ get_fields_offset = MAX(MEMBER_OFFSET("ftrace_event_class", "get_fields"), ++ MEMBER_OFFSET("trace_event_class", "get_fields")); + if ((sp = symbol_search("syscall_get_enter_fields")) != NULL) + syscall_get_enter_fields_value = sp->value; + if ((sp = symbol_search("syscall_get_exit_fields")) != NULL) +@@ -988,19 +1015,45 @@ static void ftrace_destroy_event_types(v + 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 = MAX(MEMBER_OFFSET("ftrace_event_call", "name"), ++ MEMBER_OFFSET("trace_event_call", "name")); ++ if (name_offset >= 0) ++ goto work; ++ ++ name_offset = MAX(ANON_MEMBER_OFFSET("ftrace_event_call", "name"), ++ ANON_MEMBER_OFFSET("trace_event_call", "name")); ++ if (name_offset < 0) ++ return -1; ++ ++ flags_offset = MAX(MEMBER_OFFSET("ftrace_event_call", "flags"), ++ MEMBER_OFFSET("trace_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 +1061,21 @@ int ftrace_get_event_type_name(ulong cal + "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; + +@@ -1028,16 +1096,19 @@ int ftrace_get_event_type_system(ulong c + goto work; + + inited = 1; +- sys_offset = MEMBER_OFFSET("ftrace_event_call", "system"); ++ sys_offset = MAX(MEMBER_OFFSET("ftrace_event_call", "system"), ++ MEMBER_OFFSET("trace_event_call", "system")); + + if (sys_offset >= 0) + goto work; + +- class_offset = MEMBER_OFFSET("ftrace_event_call", "class"); ++ class_offset = MAX(MEMBER_OFFSET("ftrace_event_call", "class"), ++ MEMBER_OFFSET("trace_event_call", "class")); + if (class_offset < 0) + return -1; + +- sys_offset = MEMBER_OFFSET("ftrace_event_class", "system"); ++ sys_offset = MAX(MEMBER_OFFSET("ftrace_event_class", "system"), ++ MEMBER_OFFSET("trace_event_class", "system")); + inited = 2; + + work: +@@ -1109,7 +1180,8 @@ int ftrace_get_event_type_print_fmt(ulon + + if (!inited) { + inited = 1; +- fmt_offset = MEMBER_OFFSET("ftrace_event_call", "print_fmt"); ++ fmt_offset = MAX(MEMBER_OFFSET("ftrace_event_call", "print_fmt"), ++ MEMBER_OFFSET("trace_event_call", "print_fmt")); + } + + if (fmt_offset < 0) { +@@ -1132,11 +1204,13 @@ int ftrace_get_event_type_id(ulong call, + + if (!inited) { + inited = 1; +- id_offset = MEMBER_OFFSET("ftrace_event_call", "id"); ++ id_offset = MAX(MEMBER_OFFSET("ftrace_event_call", "id"), ++ MEMBER_OFFSET("trace_event_call", "id")); + + if (id_offset < 0) { + /* id = call->event.type */ +- int f1 = MEMBER_OFFSET("ftrace_event_call", "event"); ++ int f1 = MAX(MEMBER_OFFSET("ftrace_event_call", "event"), ++ MEMBER_OFFSET("trace_event_call", "event")); + int f2 = MEMBER_OFFSET("trace_event", "type"); + + if (f1 >= 0 && f2 >= 0) +@@ -1495,7 +1569,6 @@ static void ftrace_show(int argc, char * + FILE *file; + size_t ret; + size_t nitems __attribute__ ((__unused__)); +- char *unused __attribute__ ((__unused__)); + + /* check trace-cmd */ + if (env_trace_cmd) +@@ -1519,8 +1592,9 @@ static void ftrace_show(int argc, char * + } + + /* dump trace.dat to the temp file */ +- unused = mktemp(tmp); +- fd = open(tmp, O_WRONLY | O_CREAT | O_TRUNC, 0644); ++ fd = mkstemp(tmp); ++ if (fd < 0) ++ return; + if (trace_cmd_data_output(fd) < 0) + goto out; + diff --git a/SPECS/crash-trace-command.spec b/SPECS/crash-trace-command.spec index 678435e..fd6899a 100644 --- a/SPECS/crash-trace-command.spec +++ b/SPECS/crash-trace-command.spec @@ -4,7 +4,7 @@ Summary: Trace extension module for the crash utility Name: crash-trace-command Version: 2.0 -Release: 9%{?dist} +Release: 10%{?dist} License: GPLv2 Group: Development/Debuggers Source: %{name}-%{version}.tar.gz @@ -23,6 +23,7 @@ Patch3: initialize_trace_dat.patch Patch4: ARM64.patch Patch5: linux_3.10_support.patch Patch6: ppc64le.patch +Patch7: linux_4.2_support.patch %description Command for reading ftrace data from a dumpfile. @@ -36,6 +37,7 @@ Command for reading ftrace data from a dumpfile. %patch4 -p1 -b ARM64.patch %patch5 -p1 -b linux_3.10_support.patch %patch6 -p1 -b ppc64le.patch +%patch7 -p1 -b linux_4.2_support.patch %build make @@ -53,6 +55,10 @@ rm -rf %{buildroot} %doc COPYING %changelog +* Thu Feb 25 2016 Dave Anderson - 2.0-10 +- Fix for ftrace symbol name changes in Linux 4.2 + Resolves: rhbz#1265553 + * Tue Sep 02 2014 Dave Anderson - 2.0-9 - Add ppc64le support. Resolves: rhbz#1123995