From 267c68fa3baeed8255ee6f3c358f6b356ef30077 Mon Sep 17 00:00:00 2001 From: CentOS Buildsys Date: Jan 28 2014 09:51:28 +0000 Subject: import crash-7.0.2-6.el7.src.rpm --- diff --git a/SOURCES/S390X_NR_CPUS.patch b/SOURCES/S390X_NR_CPUS.patch new file mode 100644 index 0000000..22ee2dd --- /dev/null +++ b/SOURCES/S390X_NR_CPUS.patch @@ -0,0 +1,15 @@ +--- crash-7.0.2/defs.h.orig ++++ crash-7.0.2/defs.h +@@ -125,10 +125,10 @@ + #define NR_CPUS (2048) + #endif + #ifdef S390 +-#define NR_CPUS (64) ++#define NR_CPUS (512) + #endif + #ifdef S390X +-#define NR_CPUS (64) ++#define NR_CPUS (512) + #endif + #ifdef ARM + #define NR_CPUS (4) diff --git a/SOURCES/backtrace_fixes.patch b/SOURCES/backtrace_fixes.patch new file mode 100644 index 0000000..4083a6e --- /dev/null +++ b/SOURCES/backtrace_fixes.patch @@ -0,0 +1,508 @@ +--- crash-7.0.2/kernel.c.orig ++++ crash-7.0.2/kernel.c +@@ -1,8 +1,8 @@ + /* kernel.c - core analysis suite + * + * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc. +- * Copyright (C) 2002-2013 David Anderson +- * Copyright (C) 2002-2013 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2002-2014 David Anderson ++ * Copyright (C) 2002-2014 Red Hat, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -1994,7 +1994,10 @@ cmd_bt(void) + break; + + case 'F': +- bt->flags |= (BT_FULL|BT_FULL_SYM_SLAB); ++ if (bt->flags & BT_FULL_SYM_SLAB) ++ bt->flags |= BT_FULL_SYM_SLAB2; ++ else ++ bt->flags |= (BT_FULL|BT_FULL_SYM_SLAB); + break; + + case 'o': +--- crash-7.0.2/task.c.orig ++++ crash-7.0.2/task.c +@@ -5304,7 +5304,10 @@ cmd_foreach(void) + break; + + case 'F': +- fd->flags |= FOREACH_F_FLAG; ++ if (fd->flags & FOREACH_F_FLAG) ++ fd->flags |= FOREACH_F_FLAG2; ++ else ++ fd->flags |= FOREACH_F_FLAG; + break; + + case 'a': +@@ -5859,6 +5862,8 @@ foreach(struct foreach_data *fd) + bt->flags |= BT_FULL; + if (fd->flags & FOREACH_F_FLAG) + bt->flags |= (BT_FULL|BT_FULL_SYM_SLAB); ++ if (fd->flags & FOREACH_F_FLAG2) ++ bt->flags |= BT_FULL_SYM_SLAB2; + if (fd->flags & FOREACH_x_FLAG) + bt->radix = 16; + if (fd->flags & FOREACH_d_FLAG) +--- crash-7.0.2/help.c.orig ++++ crash-7.0.2/help.c +@@ -1,8 +1,8 @@ + /* help.c - core analysis suite + * + * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc. +- * Copyright (C) 2002-2013 David Anderson +- * Copyright (C) 2002-2013 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2002-2014 David Anderson ++ * Copyright (C) 2002-2014 Red Hat, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -1553,9 +1553,12 @@ char *help_rd[] = { + " -d display output in signed decimal format (default is hexadecimal).", + " -D display output in unsigned decimal format (default is hexadecimal).", + " -s displays output symbolically when appropriate.", +-" -S displays output symbolically when appropriate; if the address", +-" references a slab cache object, the name of the slab cache will", +-" be displayed in brackets.", ++" -S[S] displays output symbolically when appropriate; if the memory", ++" contents reference a slab cache object, the name of the slab cache", ++" will be displayed in brackets. If -S is entered twice, and the", ++" memory contents reference a slab cache object, both the memory", ++" contents and the name of the slab cache will be displayed in", ++" brackets.", + " -x do not display ASCII translation at end of each line.", + #ifdef NOTDEF + " -o Shows offset value from the starting address.", +@@ -1593,36 +1596,39 @@ char *help_rd[] = { + "", + " Display the same block of memory, first without symbols, again", + " with symbols, and then with symbols and slab cache references:\n", +-" %s> rd dff12e80 36", +-" dff12e80: dff12e94 00000000 c05a363a dff12ed0 ........:6Z.....", +-" dff12e90: 00000001 dff12e98 0041fe3f ffffffff ........?.A.....", +-" dff12ea0: 00000001 d5147800 00000000 def8abc0 .....x..........", +-" dff12eb0: dff12ebc c05a4aa0 00000000 dff12ed0 .....JZ.........", +-" dff12ec0: 00000001 00000000 00000000 00000000 ................", +-" dff12ed0: 0808b353 00000000 dff12efc c0698220 S........... .i.", +-" dff12ee0: dff12efc df7c6480 00000001 c046f99b .....d|.......F.", +-" dff12ef0: 00000000 00000000 0808b352 dff12f68 ........R...h/..", +-" dff12f00: c155a128 00000000 00000001 ffffffff (.U.............", +-" %s> rd -s dff12e80 36", +-" dff12e80: dff12e94 00000000 sock_aio_write+83 dff12ed0 ", +-" dff12e90: 00000001 dff12e98 0041fe3f ffffffff ", +-" dff12ea0: 00000001 d5147800 00000000 def8abc0 ", +-" dff12eb0: dff12ebc sys_recvfrom+207 00000000 dff12ed0 ", +-" dff12ec0: 00000001 00000000 00000000 00000000 ", +-" dff12ed0: 0808b353 00000000 dff12efc socket_file_ops ", +-" dff12ee0: dff12efc df7c6480 00000001 do_sync_write+182 ", +-" dff12ef0: 00000000 00000000 0808b352 dff12f68 ", +-" dff12f00: c155a128 00000000 00000001 ffffffff ", +-" %s> rd -S dff12e80 36", +-" dff12e80: [size-4096] 00000000 sock_aio_write+83 [size-4096] ", +-" dff12e90: 00000001 [size-4096] 0041fe3f ffffffff ", +-" dff12ea0: 00000001 [sock_inode_cache] 00000000 [filp] ", +-" dff12eb0: [size-4096] sys_recvfrom+207 00000000 [size-4096] ", +-" dff12ec0: 00000001 00000000 00000000 00000000 ", +-" dff12ed0: 0808b353 00000000 [size-4096] socket_file_ops ", +-" dff12ee0: [size-4096] [filp] 00000001 do_sync_write+182 ", +-" dff12ef0: 00000000 00000000 0808b352 [size-4096] ", +-" dff12f00: [vm_area_struct] 00000000 00000001 ffffffff\n", ++" %s> rd f6e31f70 28", ++" f6e31f70: f6e31f6c f779c180 c04a4032 00a9dd40 l.....y.2@J.@...", ++" f6e31f80: 00000fff c0472da0 f6e31fa4 f779c180 .....-G.......y.", ++" f6e31f90: fffffff7 00a9b70f f6e31000 c04731ee .............1G.", ++" f6e31fa0: f6e31fa4 00000000 00000000 00000000 ................", ++" f6e31fb0: 00000000 00a9dd40 c0404f17 00000000 ....@....O@.....", ++" f6e31fc0: 00a9dd40 00000fff 00a9dd40 00a9b70f @.......@.......", ++" f6e31fd0: bf9e2718 ffffffda c040007b 0000007b .'......{.@.{...", ++" %s> rd -s f6e31f70 28", ++" f6e31f70: f6e31f6c f779c180 kmsg_read 00a9dd40 ", ++" f6e31f80: 00000fff vfs_read+159 f6e31fa4 f779c180 ", ++" f6e31f90: fffffff7 00a9b70f f6e31000 sys_read+60 ", ++" f6e31fa0: f6e31fa4 00000000 00000000 00000000 ", ++" f6e31fb0: 00000000 00a9dd40 syscall_call+7 00000000 ", ++" f6e31fc0: 00a9dd40 00000fff 00a9dd40 00a9b70f ", ++" f6e31fd0: bf9e2718 ffffffda startup_32+123 0000007b ", ++" %s> rd -S f6e31f70 28", ++" f6e31f70: [size-4096] [filp] kmsg_read 00a9dd40 ", ++" f6e31f80: 00000fff vfs_read+159 [size-4096] [filp] ", ++" f6e31f90: fffffff7 00a9b70f [size-4096] sys_read+60 ", ++" f6e31fa0: [size-4096] 00000000 00000000 00000000 ", ++" f6e31fb0: 00000000 00a9dd40 syscall_call+7 00000000 ", ++" f6e31fc0: 00a9dd40 00000fff 00a9dd40 00a9b70f ", ++" f6e31fd0: bf9e2718 ffffffda startup_32+123 0000007b ", ++" %s> rd -SS f6e31f70 28", ++" f6e31f70: [f6e31f6c:size-4096] [f779c180:filp] kmsg_read 00a9dd40 ", ++" f6e31f80: 00000fff vfs_read+159 [f6e31fa4:size-4096] [f779c180:filp] ", ++" f6e31f90: fffffff7 00a9b70f [f6e31000:size-4096] sys_read+60 ", ++" f6e31fa0: [f6e31fa4:size-4096] 00000000 00000000 00000000 ", ++" f6e31fb0: 00000000 00a9dd40 syscall_call+7 00000000 ", ++" f6e31fc0: 00a9dd40 00000fff 00a9dd40 00a9b70f ", ++" f6e31fd0: bf9e2718 ffffffda startup_32+123 0000007b ", ++"", + " Read jiffies in hexadecimal and decimal format:\n", + " %s> rd jiffies", + " c0213ae0: 0008cc3a :...\n", +@@ -1706,10 +1712,13 @@ char *help_bt[] = { + " -f display all stack data contained in a frame; this option can be", + " used to determine the arguments passed to each function; on ia64,", + " the argument register contents are dumped.", +-" -F similar to -f, except that the stack data is displayed symbolically", ++" -F[F] similar to -f, except that the stack data is displayed symbolically", + " when appropriate; if the stack data references a slab cache object,", + " the name of the slab cache will be displayed in brackets; on ia64,", +-" the substitution is done to the argument register contents.", ++" the substitution is done to the argument register contents. If -F", ++" is entered twice, and the stack data references a slab cache object,", ++" both the address and the name of the slab cache will be displayed", ++" in brackets.", + " -o x86: use old backtrace method, permissible only on kernels that were", + " compiled without the -fomit-frame_pointer.", + " x86_64: use old backtrace method, which dumps potentially stale", +@@ -1937,6 +1946,34 @@ char *help_bt[] = { + " R10: 0000000000000000 R11: 0000000000000202 R12: ffff88007ac97300", + " R13: 0000000000000000 R14: 00007f571e104a80 R15: 00007f571e305048", + " ORIG_RAX: 0000000000000029 CS: 0033 SS: 002b", ++"", ++" The following three examples show the difference in the display of", ++" the same stack frame's contents using -f, -F, and -FF:", ++" ", ++" %s> bf -f", ++" ...", ++" #4 [ffff810072b47f10] vfs_write at ffffffff800789d8", ++" ffff810072b47f18: ffff81007e020380 ffff81007e2c2880 ", ++" ffff810072b47f28: 0000000000000002 fffffffffffffff7 ", ++" ffff810072b47f38: 00002b141825d000 ffffffff80078f75 ", ++" #5 [ffff810072b47f40] sys_write at ffffffff80078f75", ++" ...", ++" %s> bt -F", ++" ...", ++" #4 [ffff810072b47f10] vfs_write at ffffffff800789d8", ++" ffff810072b47f18: [files_cache] [filp] ", ++" ffff810072b47f28: 0000000000000002 fffffffffffffff7 ", ++" ffff810072b47f38: 00002b141825d000 sys_write+69 ", ++" #5 [ffff810072b47f40] sys_write at ffffffff80078f75", ++" ...", ++" %s> bf -FF", ++" ...", ++" #4 [ffff810072b47f10] vfs_write at ffffffff800789d8", ++" ffff810072b47f18: [ffff81007e020380:files_cache] [ffff81007e2c2880:filp]", ++" ffff810072b47f28: 0000000000000002 fffffffffffffff7 ", ++" ffff810072b47f38: 00002b141825d000 sys_write+69 ", ++" #5 [ffff810072b47f40] sys_write at ffffffff80078f75", ++" ...", + NULL + }; + +--- crash-7.0.2/cmdline.c.orig ++++ crash-7.0.2/cmdline.c +@@ -1,8 +1,8 @@ + /* cmdline.c - core analysis suite + * + * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc. +- * Copyright (C) 2002-2013 David Anderson +- * Copyright (C) 2002-2013 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2002-2014 David Anderson ++ * Copyright (C) 2002-2014 Red Hat, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -1405,6 +1405,9 @@ exec_input_file(void) + } + + exec_command(); ++ ++ if (received_SIGINT()) ++ goto done_input; + } + + done_input: +@@ -2501,6 +2504,9 @@ exec_args_input_file(struct command_tabl + pc->cmd_cleanup(pc->cmd_cleanup_arg); + + free_all_bufs(); ++ ++ if (received_SIGINT()) ++ break; + } + + fclose(pc->args_ifile); +--- crash-7.0.2/defs.h.orig ++++ crash-7.0.2/defs.h +@@ -1,8 +1,8 @@ + /* defs.h - core analysis suite + * + * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc. +- * Copyright (C) 2002-2013 David Anderson +- * Copyright (C) 2002-2013 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2002-2014 David Anderson ++ * Copyright (C) 2002-2014 Red Hat, Inc. All rights reserved. + * Copyright (C) 2002 Silicon Graphics, Inc. + * + * This program is free software; you can redistribute it and/or modify +@@ -1043,34 +1043,35 @@ extern struct machdep_table *machdep; + #define MAX_FOREACH_ARGS (50) + #define MAX_REGEX_ARGS (10) + +-#define FOREACH_CMD (0x1) +-#define FOREACH_r_FLAG (0x2) +-#define FOREACH_s_FLAG (0x4) +-#define FOREACH_S_FLAG (0x8) +-#define FOREACH_i_FLAG (0x10) +-#define FOREACH_e_FLAG (0x20) +-#define FOREACH_g_FLAG (0x40) +-#define FOREACH_l_FLAG (0x80) +-#define FOREACH_p_FLAG (0x100) +-#define FOREACH_t_FLAG (0x200) +-#define FOREACH_u_FLAG (0x400) +-#define FOREACH_m_FLAG (0x800) +-#define FOREACH_v_FLAG (0x1000) +-#define FOREACH_KERNEL (0x2000) +-#define FOREACH_USER (0x4000) +-#define FOREACH_SPECIFIED (0x8000) +-#define FOREACH_ACTIVE (0x10000) +-#define FOREACH_k_FLAG (0x20000) +-#define FOREACH_c_FLAG (0x40000) +-#define FOREACH_f_FLAG (0x80000) +-#define FOREACH_o_FLAG (0x100000) +-#define FOREACH_T_FLAG (0x200000) +-#define FOREACH_F_FLAG (0x400000) +-#define FOREACH_x_FLAG (0x800000) +-#define FOREACH_d_FLAG (0x1000000) +-#define FOREACH_STATE (0x2000000) +-#define FOREACH_a_FLAG (0x4000000) +-#define FOREACH_G_FLAG (0x8000000) ++#define FOREACH_CMD (0x1) ++#define FOREACH_r_FLAG (0x2) ++#define FOREACH_s_FLAG (0x4) ++#define FOREACH_S_FLAG (0x8) ++#define FOREACH_i_FLAG (0x10) ++#define FOREACH_e_FLAG (0x20) ++#define FOREACH_g_FLAG (0x40) ++#define FOREACH_l_FLAG (0x80) ++#define FOREACH_p_FLAG (0x100) ++#define FOREACH_t_FLAG (0x200) ++#define FOREACH_u_FLAG (0x400) ++#define FOREACH_m_FLAG (0x800) ++#define FOREACH_v_FLAG (0x1000) ++#define FOREACH_KERNEL (0x2000) ++#define FOREACH_USER (0x4000) ++#define FOREACH_SPECIFIED (0x8000) ++#define FOREACH_ACTIVE (0x10000) ++#define FOREACH_k_FLAG (0x20000) ++#define FOREACH_c_FLAG (0x40000) ++#define FOREACH_f_FLAG (0x80000) ++#define FOREACH_o_FLAG (0x100000) ++#define FOREACH_T_FLAG (0x200000) ++#define FOREACH_F_FLAG (0x400000) ++#define FOREACH_x_FLAG (0x800000) ++#define FOREACH_d_FLAG (0x1000000) ++#define FOREACH_STATE (0x2000000) ++#define FOREACH_a_FLAG (0x4000000) ++#define FOREACH_G_FLAG (0x8000000) ++#define FOREACH_F_FLAG2 (0x10000000) + + #define FOREACH_PS_EXCLUSIVE \ + (FOREACH_g_FLAG|FOREACH_a_FLAG|FOREACH_t_FLAG|FOREACH_c_FLAG|FOREACH_p_FLAG|FOREACH_l_FLAG|FOREACH_r_FLAG) +@@ -4817,6 +4818,8 @@ ulong cpu_map_addr(const char *type); + #define BT_KDUMP_ELF_REGS (0x80000000000ULL) + #define BT_USER_SPACE (0x100000000000ULL) + #define BT_KERNEL_SPACE (0x200000000000ULL) ++#define BT_FULL_SYM_SLAB2 (0x400000000000ULL) ++#define BT_EFRAME_TARGET (0x800000000000ULL) + #define BT_SYMBOL_OFFSET (BT_SYMBOLIC_ARGS) + + #define BT_REF_HEXVAL (0x1) +--- crash-7.0.2/x86_64.c.orig ++++ crash-7.0.2/x86_64.c +@@ -1,7 +1,7 @@ + /* x86_64.c -- core analysis suite + * +- * Copyright (C) 2004-2013 David Anderson +- * Copyright (C) 2004-2013 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2004-2014 David Anderson ++ * Copyright (C) 2004-2014 Red Hat, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -107,6 +107,7 @@ static ulong x86_64_get_stacktop_hyper(u + static int x86_64_framesize_cache_resize(void); + static int x86_64_framesize_cache_func(int, ulong, int *, int); + static ulong x86_64_get_framepointer(struct bt_info *, ulong); ++int search_for_eframe_target_caller(struct bt_info *, ulong, int *); + static int x86_64_get_framesize(struct bt_info *, ulong, ulong); + static void x86_64_framesize_debug(struct bt_info *); + static void x86_64_get_active_set(void); +@@ -3279,9 +3280,11 @@ in_exception_stack: + level++; + rsp += SIZE(pt_regs); + irq_eframe = 0; ++ bt->flags |= BT_EFRAME_TARGET; + if (bt->eframe_ip && ((framesize = x86_64_get_framesize(bt, + bt->eframe_ip, rsp)) >= 0)) + rsp += framesize; ++ bt->flags &= ~BT_EFRAME_TARGET; + } + level++; + } +@@ -4111,6 +4114,8 @@ x86_64_eframe_verify(struct bt_info *bt, + long rip, long rsp, long rflags) + { + int estack; ++ struct syment *sp; ++ ulong offset, exception; + + if ((rflags & RAZ_MASK) || !(rflags & 0x2)) + return FALSE; +@@ -4144,7 +4149,18 @@ x86_64_eframe_verify(struct bt_info *bt, + */ + if (STREQ(closest_symbol(rip), "ia32_sysenter_target")) + return TRUE; +- } ++ ++ if ((rip == 0) && INSTACK(rsp, bt) && ++ STREQ(bt->call_target, "ret_from_fork")) ++ return TRUE; ++ ++ if (readmem(kvaddr - 8, KVADDR, &exception, sizeof(ulong), ++ "exception type", RETURN_ON_ERROR|QUIET) && ++ (sp = value_search(exception, &offset)) && ++ STREQ(sp->name, "page_fault")) ++ return TRUE; ++ ++ } + + if ((cs == 0x10) && kvaddr) { + if (is_kernel_text(rip) && IS_KVADDR(rsp) && +@@ -7157,6 +7173,57 @@ x86_64_get_framepointer(struct bt_info * + return framepointer; + } + ++int ++search_for_eframe_target_caller(struct bt_info *bt, ulong stkptr, int *framesize) ++{ ++ int i; ++ ulong *up, offset, rsp; ++ struct syment *sp1, *sp2; ++ char *called_function; ++ ++ if ((sp1 = value_search(bt->eframe_ip, &offset))) ++ called_function = sp1->name; ++ else ++ return FALSE; ++ ++ rsp = stkptr; ++ ++ for (i = (rsp - bt->stackbase)/sizeof(ulong); ++ rsp < bt->stacktop; i++, rsp += sizeof(ulong)) { ++ ++ up = (ulong *)(&bt->stackbuf[i*sizeof(ulong)]); ++ ++ if (!is_kernel_text(*up)) ++ continue; ++ ++ if (!(sp1 = value_search(*up, &offset))) ++ continue; ++ ++ if (!offset && !(bt->flags & BT_FRAMESIZE_DISABLE)) ++ continue; ++ ++ /* ++ * Get the syment of the function that the text ++ * routine above called before leaving its return ++ * address on the stack -- if it can be determined. ++ */ ++ if ((sp2 = x86_64_function_called_by((*up)-5))) { ++ if (STREQ(sp2->name, called_function)) { ++ if (CRASHDEBUG(1)) { ++ fprintf(fp, ++ "< %lx/%s rsp: %lx caller: %s >\n", ++ bt->eframe_ip, called_function, ++ stkptr, sp1->name); ++ } ++ *framesize = rsp - stkptr; ++ return TRUE; ++ } ++ } ++ } ++ ++ return FALSE; ++} ++ + #define BT_FRAMESIZE_IGNORE_MASK \ + (BT_OLD_BACK_TRACE|BT_TEXT_SYMBOLS|BT_TEXT_SYMBOLS_ALL|BT_FRAMESIZE_DISABLE) + +@@ -7190,6 +7257,10 @@ x86_64_get_framesize(struct bt_info *bt, + + exception = bt->eframe_ip == textaddr ? TRUE : FALSE; + ++ if ((bt->flags & BT_EFRAME_TARGET) && ++ search_for_eframe_target_caller(bt, rsp, &framesize)) ++ return framesize; ++ + if (!(bt->flags & BT_FRAMESIZE_DEBUG) && + x86_64_framesize_cache_func(FRAMESIZE_QUERY, textaddr, &framesize, + exception)) { +--- crash-7.0.2/memory.c.orig ++++ crash-7.0.2/memory.c +@@ -288,6 +288,7 @@ static ulong kmem_cache_nodelists(ulong) + #define NET_ENDIAN (0x4000) + #define DISPLAY_RAW (0x8000) + #define NO_ERROR (0x10000) ++#define SLAB_CACHE2 (0x20000) + #define DISPLAY_TYPES (DISPLAY_RAW|DISPLAY_ASCII|DISPLAY_8|\ + DISPLAY_16|DISPLAY_32|DISPLAY_64) + +@@ -1147,8 +1148,12 @@ cmd_rd(void) + case 'S': + if (flag & DISPLAY_DEFAULT) { + flag |= SYMBOLIC; +- if (c == 'S') +- flag |= SLAB_CACHE; ++ if (c == 'S') { ++ if (flag & SLAB_CACHE) ++ flag |= SLAB_CACHE2; ++ else ++ flag |= SLAB_CACHE; ++ } + } else { + error(INFO, "-%c option" + " is only allowed with %d-bit display\n", +@@ -1475,7 +1480,7 @@ display_memory(ulonglong addr, long coun + if ((flag & SLAB_CACHE) && + vaddr_to_kmem_cache(mem.u64, slab, + !VERBOSE)) { +- if (CRASHDEBUG(1)) ++ if ((flag & SLAB_CACHE2) || CRASHDEBUG(1)) + sprintf(buf, "[%llx:%s]", + (ulonglong)mem.u64, + slab); +@@ -1512,7 +1517,7 @@ display_memory(ulonglong addr, long coun + if ((flag & SLAB_CACHE) && + vaddr_to_kmem_cache(mem.u32, slab, + !VERBOSE)) { +- if (CRASHDEBUG(1)) ++ if ((flag & SLAB_CACHE2) || CRASHDEBUG(1)) + sprintf(buf, "[%x:%s]", + mem.u32, slab); + else +@@ -1854,7 +1859,7 @@ format_stack_entry(struct bt_info *bt, c + sprintf(retbuf, INT_PRLEN == 16 ? + "%-16s" : "%-8s", buf); + else if (vaddr_to_kmem_cache(value, slab, !VERBOSE)) { +- if (CRASHDEBUG(1)) ++ if ((bt->flags & BT_FULL_SYM_SLAB2) || CRASHDEBUG(1)) + sprintf(buf, "[%lx:%s]", value, slab); + else + sprintf(buf, "[%s]", slab); +@@ -1871,7 +1876,7 @@ format_stack_entry(struct bt_info *bt, c + strlen(value_to_symstr(value, buf, 0))) + sprintf(retbuf, "%-16s", buf); + else if (vaddr_to_kmem_cache(value, slab, !VERBOSE)) { +- if (CRASHDEBUG(1)) ++ if ((bt->flags & BT_FULL_SYM_SLAB2) || CRASHDEBUG(1)) + sprintf(buf, "[%lx:%s]", value, slab); + else + sprintf(buf, "[%s]", slab); diff --git a/SOURCES/kmem-S-CONFIG_SLUB.patch b/SOURCES/kmem-S-CONFIG_SLUB.patch new file mode 100644 index 0000000..52542eb --- /dev/null +++ b/SOURCES/kmem-S-CONFIG_SLUB.patch @@ -0,0 +1,84 @@ +--- crash-7.0.2/memory.c.orig ++++ crash-7.0.2/memory.c +@@ -1,8 +1,8 @@ + /* memory.c - core analysis suite + * + * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc. +- * Copyright (C) 2002-2013 David Anderson +- * Copyright (C) 2002-2013 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2002-2014 David Anderson ++ * Copyright (C) 2002-2014 Red Hat, Inc. All rights reserved. + * Copyright (C) 2002 Silicon Graphics, Inc. + * + * This program is free software; you can redistribute it and/or modify +@@ -4162,6 +4162,8 @@ get_task_mem_usage(ulong task, struct ta + #define SLAB_FIRST_NODE (ADDRESS_SPECIFIED << 22) + #define CACHE_SET (ADDRESS_SPECIFIED << 23) + ++#define SLAB_BITFIELD (ADDRESS_SPECIFIED << 25) ++ + #define GET_ALL \ + (GET_SHARED_PAGES|GET_TOTALRAM_PAGES|GET_BUFFERS_PAGES|GET_SLAB_PAGES) + +@@ -16312,6 +16314,10 @@ dump_kmem_cache_slub(struct meminfo *si) + si->cache_count = get_kmem_cache_list(&si->cache_list); + si->cache_buf = GETBUF(SIZE(kmem_cache)); + ++ if (VALID_MEMBER(page_objects) && ++ OFFSET(page_objects) == OFFSET(page_inuse)) ++ si->flags |= SLAB_BITFIELD; ++ + if (!si->reqname && + !(si->flags & (ADDRESS_SPECIFIED|GET_SLAB_PAGES))) + fprintf(fp, "%s", kmem_cache_hdr); +@@ -16613,7 +16619,7 @@ static void + do_slab_slub(struct meminfo *si, int verbose) + { + physaddr_t paddr; +- ulong vaddr; ++ ulong vaddr, objects_vaddr; + ushort inuse, objects; + ulong freelist, cpu_freelist, cpu_slab_ptr; + int i, cpu_slab, is_free, node; +@@ -16652,9 +16658,23 @@ do_slab_slub(struct meminfo *si, int ver + * is kept in the slab. + */ + if (VALID_MEMBER(page_objects)) { +- if (!readmem(si->slab + OFFSET(page_objects), KVADDR, &objects, ++ objects_vaddr = si->slab + OFFSET(page_objects); ++ if (si->flags & SLAB_BITFIELD) ++ objects_vaddr += sizeof(ushort); ++ if (!readmem(objects_vaddr, KVADDR, &objects, + sizeof(ushort), "page.objects", RETURN_ON_ERROR)) + return; ++ /* ++ * Strip page.frozen bit. ++ */ ++ if (si->flags & SLAB_BITFIELD) { ++ if (__BYTE_ORDER == __LITTLE_ENDIAN) { ++ objects <<= 1; ++ objects >>= 1; ++ } ++ if (__BYTE_ORDER == __BIG_ENDIAN) ++ objects >>= 1; ++ } + + if (CRASHDEBUG(1) && (objects != si->objects)) + error(NOTE, "%s: slab: %lx oo objects: %ld " +@@ -16678,14 +16698,11 @@ do_slab_slub(struct meminfo *si, int ver + cpu_slab = i; + /* + * Later slub scheme uses the per-cpu freelist +- * and keeps page->inuse maxed out, so count +- * the free objects by hand. ++ * so count the free objects by hand. + */ + if (cpu_freelist) + freelist = cpu_freelist; +- if ((si->objects - inuse) == 0) +- inuse = si->objects - +- count_free_objects(si, freelist); ++ inuse = si->objects - count_free_objects(si, freelist); + break; + } + } diff --git a/SPECS/crash.spec b/SPECS/crash.spec index 223f899..45218c0 100644 --- a/SPECS/crash.spec +++ b/SPECS/crash.spec @@ -4,7 +4,7 @@ Summary: Kernel analysis utility for live systems, netdump, diskdump, kdump, LKCD or mcore dumpfiles Name: crash Version: 7.0.2 -Release: 2%{?dist} +Release: 6%{?dist} License: GPLv3 Group: Development/Debuggers Source: http://people.redhat.com/anderson/crash-%{version}.tar.gz @@ -16,6 +16,9 @@ BuildRequires: ncurses-devel zlib-devel lzo-devel bison snappy-devel Requires: binutils Patch0: lzo_snappy.patch Patch1: rhel7.0_beta.patch +Patch2: kmem-S-CONFIG_SLUB.patch +Patch3: S390X_NR_CPUS.patch +Patch4: backtrace_fixes.patch %description The core analysis suite is a self-contained tool that can be used to @@ -38,6 +41,9 @@ offered by Mission Critical Linux, or the LKCD kernel patch. %setup -n %{name}-%{version} -q %patch0 -p1 -b lzo_snappy.patch %patch1 -p1 -b rhel7.0_beta.patch +%patch2 -p1 -b kmem-S-CONFIG_SLUB.patch +%patch3 -p1 -b S390X_NR_CPUS.patch +%patch4 -p1 -b backtrace_fixes.patch %build make RPMPKG="%{version}-%{release}" CFLAGS="%{optflags}" @@ -66,6 +72,28 @@ rm -rf %{buildroot} %{_includedir}/* %changelog +* Tue Jan 28 2014 Daniel Mach - 7.0.2-6 +- Mass rebuild 2014-01-24 + +* Fri Jan 24 2014 Dave Anderson - 7.0.2-5 +- Fix for a missing kernel-mode exception frame dump by the x86_64 + "bt" command if a page fault was generated by a bogus RIP. +- Resolves: rhbz#1057353 +- Fix for the x86_64 "bt" command to prevent an unwarranted message + indicating "WARNING: possibly bogus exception frame" generated + from a blocked kernel thread that was in the process of exec'ing + a user process via the call_usermodehelper() facility. +- Resolves: rhbz#1057357 + +* Fri Jan 10 2014 Dave Anderson - 7.0.2-4 +- Fixes for "kmem -S" command for CONFIG_SLUB. +- Resolves: rhbz#1045591 +- Increase S390X NR_CPUS +- Resolves: rhbz#1051156 + +* Fri Dec 27 2013 Daniel Mach - 7.0.2-3 +- Mass rebuild 2013-12-27 + * Tue Oct 29 2013 Dave Anderson - 7.0.2-2 - Compressed kdump 46-bit physical memory support Resolves: rhbz#1015250