lkml.org 
[lkml]   [2022]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v3] x86,mm: print likely CPU at segfault time
    In a large enough fleet of computers, it is common to have a few bad CPUs.
    Those can often be identified by seeing that some commonly run kernel code,
    which runs fine everywhere else, keeps crashing on the same CPU core on one
    particular bad system.

    However, the failure modes in CPUs that have gone bad over the years are
    often oddly specific, and the only bad behavior seen might be segfaults
    in programs like bash, python, or various system daemons that run fine
    everywhere else.

    Add a printk() to show_signal_msg() to print the CPU, core, and socket
    at segfault time. This is not perfect, since the task might get rescheduled
    on another CPU between when the fault hit, and when the message is printed,
    but in practice this has been good enough to help us identify several bad
    CPU cores.

    segfault[1349]: segfault at 0 ip 000000000040113a sp 00007ffc6d32e360 error 4 in segfault[401000+1000] on CPU 0 (core 0, socket 0)

    This printk can be controlled through /proc/sys/debug/exception-trace

    Signed-off-by: Rik van Riel <riel@surriel.com>
    CC: Dave Jones <dsj@fb.com>
    ---
    v3: READ_ONCE around raw_smp_processor_id() does not work, lets just omit that
    instead of making the code harder to read

    arch/x86/mm/fault.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
    index fad8faa29d04..c7a5bbf40367 100644
    --- a/arch/x86/mm/fault.c
    +++ b/arch/x86/mm/fault.c
    @@ -769,6 +769,8 @@ show_signal_msg(struct pt_regs *regs, unsigned long error_code,
    unsigned long address, struct task_struct *tsk)
    {
    const char *loglvl = task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG;
    + /* This is a racy snapshot, but it's better than nothing. */
    + int cpu = raw_smp_processor_id();

    if (!unhandled_signal(tsk, SIGSEGV))
    return;
    @@ -782,6 +784,14 @@ show_signal_msg(struct pt_regs *regs, unsigned long error_code,

    print_vma_addr(KERN_CONT " in ", regs->ip);

    + /*
    + * Dump the likely CPU where the fatal segfault happened.
    + * This can help identify faulty hardware.
    + */
    + printk(KERN_CONT " on CPU %d (core %d, socket %d)", cpu,
    + topology_core_id(cpu), topology_physical_package_id(cpu));
    +
    +
    printk(KERN_CONT "\n");

    show_opcodes(regs, loglvl);
    --
    2.37.1

    \
     
     \ /
      Last update: 2022-08-05 16:17    [W:2.627 / U:0.808 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site