mirror of
https://github.com/torvalds/linux.git
synced 2024-12-01 16:41:39 +00:00
65090f30ab
Merge misc updates from Andrew Morton: "191 patches. Subsystems affected by this patch series: kthread, ia64, scripts, ntfs, squashfs, ocfs2, kernel/watchdog, and mm (gup, pagealloc, slab, slub, kmemleak, dax, debug, pagecache, gup, swap, memcg, pagemap, mprotect, bootmem, dma, tracing, vmalloc, kasan, initialization, pagealloc, and memory-failure)" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (191 commits) mm,hwpoison: make get_hwpoison_page() call get_any_page() mm,hwpoison: send SIGBUS with error virutal address mm/page_alloc: split pcp->high across all online CPUs for cpuless nodes mm/page_alloc: allow high-order pages to be stored on the per-cpu lists mm: replace CONFIG_FLAT_NODE_MEM_MAP with CONFIG_FLATMEM mm: replace CONFIG_NEED_MULTIPLE_NODES with CONFIG_NUMA docs: remove description of DISCONTIGMEM arch, mm: remove stale mentions of DISCONIGMEM mm: remove CONFIG_DISCONTIGMEM m68k: remove support for DISCONTIGMEM arc: remove support for DISCONTIGMEM arc: update comment about HIGHMEM implementation alpha: remove DISCONTIGMEM and NUMA mm/page_alloc: move free_the_page mm/page_alloc: fix counting of managed_pages mm/page_alloc: improve memmap_pages dbg msg mm: drop SECTION_SHIFT in code comments mm/page_alloc: introduce vm.percpu_pagelist_high_fraction mm/page_alloc: limit the number of pages on PCP lists when reclaim is active mm/page_alloc: scale the number of pages that are batch freed ...
106 lines
2.8 KiB
C
106 lines
2.8 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Provide a default dump_stack() function for architectures
|
|
* which don't implement their own.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/export.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/sched/debug.h>
|
|
#include <linux/smp.h>
|
|
#include <linux/atomic.h>
|
|
#include <linux/kexec.h>
|
|
#include <linux/utsname.h>
|
|
#include <linux/stop_machine.h>
|
|
|
|
static char dump_stack_arch_desc_str[128];
|
|
|
|
/**
|
|
* dump_stack_set_arch_desc - set arch-specific str to show with task dumps
|
|
* @fmt: printf-style format string
|
|
* @...: arguments for the format string
|
|
*
|
|
* The configured string will be printed right after utsname during task
|
|
* dumps. Usually used to add arch-specific system identifiers. If an
|
|
* arch wants to make use of such an ID string, it should initialize this
|
|
* as soon as possible during boot.
|
|
*/
|
|
void __init dump_stack_set_arch_desc(const char *fmt, ...)
|
|
{
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
vsnprintf(dump_stack_arch_desc_str, sizeof(dump_stack_arch_desc_str),
|
|
fmt, args);
|
|
va_end(args);
|
|
}
|
|
|
|
/**
|
|
* dump_stack_print_info - print generic debug info for dump_stack()
|
|
* @log_lvl: log level
|
|
*
|
|
* Arch-specific dump_stack() implementations can use this function to
|
|
* print out the same debug information as the generic dump_stack().
|
|
*/
|
|
void dump_stack_print_info(const char *log_lvl)
|
|
{
|
|
printk("%sCPU: %d PID: %d Comm: %.20s %s%s %s %.*s\n",
|
|
log_lvl, raw_smp_processor_id(), current->pid, current->comm,
|
|
kexec_crash_loaded() ? "Kdump: loaded " : "",
|
|
print_tainted(),
|
|
init_utsname()->release,
|
|
(int)strcspn(init_utsname()->version, " "),
|
|
init_utsname()->version);
|
|
|
|
if (dump_stack_arch_desc_str[0] != '\0')
|
|
printk("%sHardware name: %s\n",
|
|
log_lvl, dump_stack_arch_desc_str);
|
|
|
|
print_worker_info(log_lvl, current);
|
|
print_stop_info(log_lvl, current);
|
|
}
|
|
|
|
/**
|
|
* show_regs_print_info - print generic debug info for show_regs()
|
|
* @log_lvl: log level
|
|
*
|
|
* show_regs() implementations can use this function to print out generic
|
|
* debug information.
|
|
*/
|
|
void show_regs_print_info(const char *log_lvl)
|
|
{
|
|
dump_stack_print_info(log_lvl);
|
|
}
|
|
|
|
static void __dump_stack(const char *log_lvl)
|
|
{
|
|
dump_stack_print_info(log_lvl);
|
|
show_stack(NULL, NULL, log_lvl);
|
|
}
|
|
|
|
/**
|
|
* dump_stack - dump the current task information and its stack trace
|
|
*
|
|
* Architectures can override this implementation by implementing its own.
|
|
*/
|
|
asmlinkage __visible void dump_stack_lvl(const char *log_lvl)
|
|
{
|
|
unsigned long flags;
|
|
|
|
/*
|
|
* Permit this cpu to perform nested stack dumps while serialising
|
|
* against other CPUs
|
|
*/
|
|
printk_cpu_lock_irqsave(flags);
|
|
__dump_stack(log_lvl);
|
|
printk_cpu_unlock_irqrestore(flags);
|
|
}
|
|
EXPORT_SYMBOL(dump_stack_lvl);
|
|
|
|
asmlinkage __visible void dump_stack(void)
|
|
{
|
|
dump_stack_lvl(KERN_DEFAULT);
|
|
}
|
|
EXPORT_SYMBOL(dump_stack);
|