core_pattern: add CPU specifier
authorOleksandr Natalenko <oleksandr@redhat.com>
Sat, 3 Sep 2022 06:43:30 +0000 (08:43 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 18 Nov 2022 21:55:06 +0000 (13:55 -0800)
Statistically, in a large deployment regular segfaults may indicate a CPU
issue.

Currently, it is not possible to find out what CPU the segfault happened
on.  There are at least two attempts to improve segfault logging with this
regard, but they do not help in case the logs rotate.

Hence, lets make sure it is possible to permanently record a CPU the task
ran on using a new core_pattern specifier.

Link: https://lkml.kernel.org/r/20220903064330.20772-1-oleksandr@redhat.com
Signed-off-by: Oleksandr Natalenko <oleksandr@redhat.com>
Suggested-by: Renaud Métrich <rmetrich@redhat.com>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: "Eric W . Biederman" <ebiederm@xmission.com>
Cc: Grzegorz Halat <ghalat@redhat.com>
Cc: "Guilherme G. Piccoli" <gpiccoli@igalia.com>
Cc: "Huang, Ying" <ying.huang@intel.com>
Cc: Jason A. Donenfeld <Jason@zx2c4.com>
Cc: Joel Savitz <jsavitz@redhat.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Kees Cook <keescook@chromium.org>
Cc: Laurent Dufour <ldufour@linux.ibm.com>
Cc: Luis Chamberlain <mcgrof@kernel.org>
Cc: Rob Herring <robh@kernel.org>
Cc: Stephen Kitt <steve@sk2.org>
Cc: Will Deacon <will@kernel.org>
Cc: Xiaoming Ni <nixiaoming@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Documentation/admin-guide/sysctl/kernel.rst
fs/coredump.c
include/linux/coredump.h

index 98d1b198b2b4c1040172761c88c7ee956c1edb12..3b618a40620794063b6df76e55a7408b1042889a 100644 (file)
@@ -174,6 +174,7 @@ core_pattern
        %f              executable filename
        %E              executable path
        %c              maximum size of core file by resource limit RLIMIT_CORE
+       %C              CPU the task ran on
        %<OTHER>        both are dropped
        ========        ==========================================
 
index 7bad7785e8e675ac92d5ba6f55bec90658e4ca51..3e8630c8d6270e77e0cf0ea4acaf2ab849a11b57 100644 (file)
@@ -325,6 +325,10 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm,
                                err = cn_printf(cn, "%lu",
                                              rlimit(RLIMIT_CORE));
                                break;
+                       /* CPU the task ran on */
+                       case 'C':
+                               err = cn_printf(cn, "%d", cprm->cpu);
+                               break;
                        default:
                                break;
                        }
@@ -534,6 +538,7 @@ void do_coredump(const kernel_siginfo_t *siginfo)
                 */
                .mm_flags = mm->flags,
                .vma_meta = NULL,
+               .cpu = raw_smp_processor_id(),
        };
 
        audit_core_dumps(siginfo->si_signo);
index 08a1d3e7e46d0a5c50fbdc73e7c982cca5da1daf..191dcf5af6cb95fb5bc0876631e2c00c436e910c 100644 (file)
@@ -22,6 +22,7 @@ struct coredump_params {
        struct file *file;
        unsigned long limit;
        unsigned long mm_flags;
+       int cpu;
        loff_t written;
        loff_t pos;
        loff_t to_skip;