mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'mm-nonmm-stable-2023-11-02-14-08' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Pull non-MM updates from Andrew Morton:
"As usual, lots of singleton and doubleton patches all over the tree
and there's little I can say which isn't in the individual changelogs.
The lengthier patch series are
- 'kdump: use generic functions to simplify crashkernel reservation
in arch', from Baoquan He. This is mainly cleanups and
consolidation of the 'crashkernel=' kernel parameter handling
- After much discussion, David Laight's 'minmax: Relax type checks in
min() and max()' is here. Hopefully reduces some typecasting and
the use of min_t() and max_t()
- A group of patches from Oleg Nesterov which clean up and slightly
fix our handling of reads from /proc/PID/task/... and which remove
task_struct.thread_group"
* tag 'mm-nonmm-stable-2023-11-02-14-08' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (64 commits)
scripts/gdb/vmalloc: disable on no-MMU
scripts/gdb: fix usage of MOD_TEXT not defined when CONFIG_MODULES=n
.mailmap: add address mapping for Tomeu Vizoso
mailmap: update email address for Claudiu Beznea
tools/testing/selftests/mm/run_vmtests.sh: lower the ptrace permissions
.mailmap: map Benjamin Poirier's address
scripts/gdb: add lx_current support for riscv
ocfs2: fix a spelling typo in comment
proc: test ProtectionKey in proc-empty-vm test
proc: fix proc-empty-vm test with vsyscall
fs/proc/base.c: remove unneeded semicolon
do_io_accounting: use sig->stats_lock
do_io_accounting: use __for_each_thread()
ocfs2: replace BUG_ON() at ocfs2_num_free_extents() with ocfs2_error()
ocfs2: fix a typo in a comment
scripts/show_delta: add __main__ judgement before main code
treewide: mark stuff as __ro_after_init
fs: ocfs2: check status values
proc: test /proc/${pid}/statm
compiler.h: move __is_constexpr() to compiler.h
...
This commit is contained in:
@@ -95,6 +95,7 @@ Ben M Cahill <ben.m.cahill@intel.com>
|
||||
Ben Widawsky <bwidawsk@kernel.org> <ben@bwidawsk.net>
|
||||
Ben Widawsky <bwidawsk@kernel.org> <ben.widawsky@intel.com>
|
||||
Ben Widawsky <bwidawsk@kernel.org> <benjamin.widawsky@intel.com>
|
||||
Benjamin Poirier <benjamin.poirier@gmail.com> <bpoirier@suse.de>
|
||||
Bjorn Andersson <andersson@kernel.org> <bjorn@kryo.se>
|
||||
Bjorn Andersson <andersson@kernel.org> <bjorn.andersson@linaro.org>
|
||||
Bjorn Andersson <andersson@kernel.org> <bjorn.andersson@sonymobile.com>
|
||||
@@ -128,6 +129,7 @@ Christian Brauner <brauner@kernel.org> <christian.brauner@ubuntu.com>
|
||||
Christian Marangi <ansuelsmth@gmail.com>
|
||||
Christophe Ricard <christophe.ricard@gmail.com>
|
||||
Christoph Hellwig <hch@lst.de>
|
||||
Claudiu Beznea <claudiu.beznea@tuxon.dev> <claudiu.beznea@microchip.com>
|
||||
Colin Ian King <colin.i.king@gmail.com> <colin.king@canonical.com>
|
||||
Corey Minyard <minyard@acm.org>
|
||||
Damian Hobson-Garcia <dhobsong@igel.co.jp>
|
||||
@@ -568,6 +570,7 @@ Takashi YOSHII <takashi.yoshii.zj@renesas.com>
|
||||
Tamizh Chelvam Raja <quic_tamizhr@quicinc.com> <tamizhr@codeaurora.org>
|
||||
Taniya Das <quic_tdas@quicinc.com> <tdas@codeaurora.org>
|
||||
Tejun Heo <htejun@gmail.com>
|
||||
Tomeu Vizoso <tomeu@tomeuvizoso.net> <tomeu.vizoso@collabora.com>
|
||||
Thomas Graf <tgraf@suug.ch>
|
||||
Thomas Körper <socketcan@esd.eu> <thomas.koerper@esd.eu>
|
||||
Thomas Pedersen <twp@codeaurora.org>
|
||||
|
||||
@@ -1010,7 +1010,8 @@ static void __init reserve_crashkernel(void)
|
||||
|
||||
total_mem = get_total_mem();
|
||||
ret = parse_crashkernel(boot_command_line, total_mem,
|
||||
&crash_size, &crash_base);
|
||||
&crash_size, &crash_base,
|
||||
NULL, NULL);
|
||||
/* invalid value specified or crashkernel=0 */
|
||||
if (ret || !crash_size)
|
||||
return;
|
||||
|
||||
@@ -1498,6 +1498,9 @@ config ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG
|
||||
config ARCH_SUPPORTS_CRASH_DUMP
|
||||
def_bool y
|
||||
|
||||
config ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION
|
||||
def_bool CRASH_CORE
|
||||
|
||||
config TRANS_TABLE
|
||||
def_bool y
|
||||
depends on HIBERNATION || KEXEC_CORE
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef _ARM64_CRASH_CORE_H
|
||||
#define _ARM64_CRASH_CORE_H
|
||||
|
||||
/* Current arm64 boot protocol requires 2MB alignment */
|
||||
#define CRASH_ALIGN SZ_2M
|
||||
|
||||
#define CRASH_ADDR_LOW_MAX arm64_dma_phys_limit
|
||||
#define CRASH_ADDR_HIGH_MAX (PHYS_MASK + 1)
|
||||
#endif
|
||||
+8
-132
@@ -65,15 +65,6 @@ EXPORT_SYMBOL(memstart_addr);
|
||||
*/
|
||||
phys_addr_t __ro_after_init arm64_dma_phys_limit;
|
||||
|
||||
/* Current arm64 boot protocol requires 2MB alignment */
|
||||
#define CRASH_ALIGN SZ_2M
|
||||
|
||||
#define CRASH_ADDR_LOW_MAX arm64_dma_phys_limit
|
||||
#define CRASH_ADDR_HIGH_MAX (PHYS_MASK + 1)
|
||||
#define CRASH_HIGH_SEARCH_BASE SZ_4G
|
||||
|
||||
#define DEFAULT_CRASH_KERNEL_LOW_SIZE (128UL << 20)
|
||||
|
||||
/*
|
||||
* To make optimal use of block mappings when laying out the linear
|
||||
* mapping, round down the base of physical memory to a size that can
|
||||
@@ -101,140 +92,25 @@ phys_addr_t __ro_after_init arm64_dma_phys_limit;
|
||||
#define ARM64_MEMSTART_ALIGN (1UL << ARM64_MEMSTART_SHIFT)
|
||||
#endif
|
||||
|
||||
static int __init reserve_crashkernel_low(unsigned long long low_size)
|
||||
static void __init arch_reserve_crashkernel(void)
|
||||
{
|
||||
unsigned long long low_base;
|
||||
|
||||
low_base = memblock_phys_alloc_range(low_size, CRASH_ALIGN, 0, CRASH_ADDR_LOW_MAX);
|
||||
if (!low_base) {
|
||||
pr_err("cannot allocate crashkernel low memory (size:0x%llx).\n", low_size);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pr_info("crashkernel low memory reserved: 0x%08llx - 0x%08llx (%lld MB)\n",
|
||||
low_base, low_base + low_size, low_size >> 20);
|
||||
|
||||
crashk_low_res.start = low_base;
|
||||
crashk_low_res.end = low_base + low_size - 1;
|
||||
insert_resource(&iomem_resource, &crashk_low_res);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* reserve_crashkernel() - reserves memory for crash kernel
|
||||
*
|
||||
* This function reserves memory area given in "crashkernel=" kernel command
|
||||
* line parameter. The memory reserved is used by dump capture kernel when
|
||||
* primary kernel is crashing.
|
||||
*/
|
||||
static void __init reserve_crashkernel(void)
|
||||
{
|
||||
unsigned long long crash_low_size = 0, search_base = 0;
|
||||
unsigned long long crash_max = CRASH_ADDR_LOW_MAX;
|
||||
unsigned long long low_size = 0;
|
||||
unsigned long long crash_base, crash_size;
|
||||
char *cmdline = boot_command_line;
|
||||
bool fixed_base = false;
|
||||
bool high = false;
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_KEXEC_CORE))
|
||||
return;
|
||||
|
||||
/* crashkernel=X[@offset] */
|
||||
ret = parse_crashkernel(cmdline, memblock_phys_mem_size(),
|
||||
&crash_size, &crash_base);
|
||||
if (ret == -ENOENT) {
|
||||
ret = parse_crashkernel_high(cmdline, 0, &crash_size, &crash_base);
|
||||
if (ret || !crash_size)
|
||||
return;
|
||||
|
||||
/*
|
||||
* crashkernel=Y,low can be specified or not, but invalid value
|
||||
* is not allowed.
|
||||
*/
|
||||
ret = parse_crashkernel_low(cmdline, 0, &crash_low_size, &crash_base);
|
||||
if (ret == -ENOENT)
|
||||
crash_low_size = DEFAULT_CRASH_KERNEL_LOW_SIZE;
|
||||
else if (ret)
|
||||
return;
|
||||
|
||||
search_base = CRASH_HIGH_SEARCH_BASE;
|
||||
crash_max = CRASH_ADDR_HIGH_MAX;
|
||||
high = true;
|
||||
} else if (ret || !crash_size) {
|
||||
/* The specified value is invalid */
|
||||
&crash_size, &crash_base,
|
||||
&low_size, &high);
|
||||
if (ret)
|
||||
return;
|
||||
}
|
||||
|
||||
crash_size = PAGE_ALIGN(crash_size);
|
||||
|
||||
/* User specifies base address explicitly. */
|
||||
if (crash_base) {
|
||||
fixed_base = true;
|
||||
search_base = crash_base;
|
||||
crash_max = crash_base + crash_size;
|
||||
}
|
||||
|
||||
retry:
|
||||
crash_base = memblock_phys_alloc_range(crash_size, CRASH_ALIGN,
|
||||
search_base, crash_max);
|
||||
if (!crash_base) {
|
||||
/*
|
||||
* For crashkernel=size[KMG]@offset[KMG], print out failure
|
||||
* message if can't reserve the specified region.
|
||||
*/
|
||||
if (fixed_base) {
|
||||
pr_warn("crashkernel reservation failed - memory is in use.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* For crashkernel=size[KMG], if the first attempt was for
|
||||
* low memory, fall back to high memory, the minimum required
|
||||
* low memory will be reserved later.
|
||||
*/
|
||||
if (!high && crash_max == CRASH_ADDR_LOW_MAX) {
|
||||
crash_max = CRASH_ADDR_HIGH_MAX;
|
||||
search_base = CRASH_ADDR_LOW_MAX;
|
||||
crash_low_size = DEFAULT_CRASH_KERNEL_LOW_SIZE;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
/*
|
||||
* For crashkernel=size[KMG],high, if the first attempt was
|
||||
* for high memory, fall back to low memory.
|
||||
*/
|
||||
if (high && crash_max == CRASH_ADDR_HIGH_MAX) {
|
||||
crash_max = CRASH_ADDR_LOW_MAX;
|
||||
search_base = 0;
|
||||
goto retry;
|
||||
}
|
||||
pr_warn("cannot allocate crashkernel (size:0x%llx)\n",
|
||||
crash_size);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((crash_base >= CRASH_ADDR_LOW_MAX) && crash_low_size &&
|
||||
reserve_crashkernel_low(crash_low_size)) {
|
||||
memblock_phys_free(crash_base, crash_size);
|
||||
return;
|
||||
}
|
||||
|
||||
pr_info("crashkernel reserved: 0x%016llx - 0x%016llx (%lld MB)\n",
|
||||
crash_base, crash_base + crash_size, crash_size >> 20);
|
||||
|
||||
/*
|
||||
* The crashkernel memory will be removed from the kernel linear
|
||||
* map. Inform kmemleak so that it won't try to access it.
|
||||
*/
|
||||
kmemleak_ignore_phys(crash_base);
|
||||
if (crashk_low_res.end)
|
||||
kmemleak_ignore_phys(crashk_low_res.start);
|
||||
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
insert_resource(&iomem_resource, &crashk_res);
|
||||
reserve_crashkernel_generic(cmdline, crash_size, crash_base,
|
||||
low_size, high);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -480,7 +356,7 @@ void __init bootmem_init(void)
|
||||
* request_standard_resources() depends on crashkernel's memory being
|
||||
* reserved, so do it here.
|
||||
*/
|
||||
reserve_crashkernel();
|
||||
arch_reserve_crashkernel();
|
||||
|
||||
memblock_dump_all();
|
||||
}
|
||||
|
||||
@@ -267,7 +267,9 @@ static void __init arch_parse_crashkernel(void)
|
||||
unsigned long long crash_base, crash_size;
|
||||
|
||||
total_mem = memblock_phys_mem_size();
|
||||
ret = parse_crashkernel(boot_command_line, total_mem, &crash_size, &crash_base);
|
||||
ret = parse_crashkernel(boot_command_line, total_mem,
|
||||
&crash_size, &crash_base,
|
||||
NULL, NULL);
|
||||
if (ret < 0 || crash_size <= 0)
|
||||
return;
|
||||
|
||||
|
||||
@@ -460,7 +460,8 @@ static void __init mips_parse_crashkernel(void)
|
||||
|
||||
total_mem = memblock_phys_mem_size();
|
||||
ret = parse_crashkernel(boot_command_line, total_mem,
|
||||
&crash_size, &crash_base);
|
||||
&crash_size, &crash_base,
|
||||
NULL, NULL);
|
||||
if (ret != 0 || crash_size <= 0)
|
||||
return;
|
||||
|
||||
|
||||
@@ -313,7 +313,7 @@ static __init u64 fadump_calculate_reserve_size(void)
|
||||
* memory at a predefined offset.
|
||||
*/
|
||||
ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
|
||||
&size, &base);
|
||||
&size, &base, NULL, NULL);
|
||||
if (ret == 0 && size > 0) {
|
||||
unsigned long max_size;
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ void __init reserve_crashkernel(void)
|
||||
total_mem_sz = memory_limit ? memory_limit : memblock_phys_mem_size();
|
||||
/* use common parsing */
|
||||
ret = parse_crashkernel(boot_command_line, total_mem_sz,
|
||||
&crash_size, &crash_base);
|
||||
&crash_size, &crash_base, NULL, NULL);
|
||||
if (ret == 0 && crash_size > 0) {
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
|
||||
@@ -178,7 +178,7 @@ static void __init get_crash_kernel(void *fdt, unsigned long size)
|
||||
int ret;
|
||||
|
||||
ret = parse_crashkernel(boot_command_line, size, &crash_size,
|
||||
&crash_base);
|
||||
&crash_base, NULL, NULL);
|
||||
if (ret != 0 || crash_size == 0)
|
||||
return;
|
||||
if (crash_base == 0)
|
||||
|
||||
@@ -693,6 +693,9 @@ config ARCH_SUPPORTS_KEXEC_PURGATORY
|
||||
config ARCH_SUPPORTS_CRASH_DUMP
|
||||
def_bool y
|
||||
|
||||
config ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION
|
||||
def_bool CRASH_CORE
|
||||
|
||||
config COMPAT
|
||||
bool "Kernel support for 32-bit U-mode"
|
||||
default 64BIT
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef _RISCV_CRASH_CORE_H
|
||||
#define _RISCV_CRASH_CORE_H
|
||||
|
||||
#define CRASH_ALIGN PMD_SIZE
|
||||
|
||||
#define CRASH_ADDR_LOW_MAX dma32_phys_limit
|
||||
#define CRASH_ADDR_HIGH_MAX memblock_end_of_DRAM()
|
||||
|
||||
extern phys_addr_t memblock_end_of_DRAM(void);
|
||||
#endif
|
||||
@@ -116,6 +116,8 @@ static inline void wait_for_interrupt(void)
|
||||
__asm__ __volatile__ ("wfi");
|
||||
}
|
||||
|
||||
extern phys_addr_t dma32_phys_limit;
|
||||
|
||||
struct device_node;
|
||||
int riscv_of_processor_hartid(struct device_node *node, unsigned long *hartid);
|
||||
int riscv_early_of_processor_hartid(struct device_node *node, unsigned long *hartid);
|
||||
|
||||
+11
-130
@@ -65,7 +65,7 @@ extern char _start[];
|
||||
void *_dtb_early_va __initdata;
|
||||
uintptr_t _dtb_early_pa __initdata;
|
||||
|
||||
static phys_addr_t dma32_phys_limit __initdata;
|
||||
phys_addr_t dma32_phys_limit __initdata;
|
||||
|
||||
static void __init zone_sizes_init(void)
|
||||
{
|
||||
@@ -1333,28 +1333,6 @@ static inline void setup_vm_final(void)
|
||||
}
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
/* Reserve 128M low memory by default for swiotlb buffer */
|
||||
#define DEFAULT_CRASH_KERNEL_LOW_SIZE (128UL << 20)
|
||||
|
||||
static int __init reserve_crashkernel_low(unsigned long long low_size)
|
||||
{
|
||||
unsigned long long low_base;
|
||||
|
||||
low_base = memblock_phys_alloc_range(low_size, PMD_SIZE, 0, dma32_phys_limit);
|
||||
if (!low_base) {
|
||||
pr_err("cannot allocate crashkernel low memory (size:0x%llx).\n", low_size);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pr_info("crashkernel low memory reserved: 0x%016llx - 0x%016llx (%lld MB)\n",
|
||||
low_base, low_base + low_size, low_size >> 20);
|
||||
|
||||
crashk_low_res.start = low_base;
|
||||
crashk_low_res.end = low_base + low_size - 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* reserve_crashkernel() - reserves memory for crash kernel
|
||||
*
|
||||
@@ -1362,122 +1340,25 @@ static int __init reserve_crashkernel_low(unsigned long long low_size)
|
||||
* line parameter. The memory reserved is used by dump capture kernel when
|
||||
* primary kernel is crashing.
|
||||
*/
|
||||
static void __init reserve_crashkernel(void)
|
||||
static void __init arch_reserve_crashkernel(void)
|
||||
{
|
||||
unsigned long long crash_base = 0;
|
||||
unsigned long long crash_size = 0;
|
||||
unsigned long long crash_low_size = 0;
|
||||
unsigned long search_start = memblock_start_of_DRAM();
|
||||
unsigned long search_end = (unsigned long)dma32_phys_limit;
|
||||
unsigned long long low_size = 0;
|
||||
unsigned long long crash_base, crash_size;
|
||||
char *cmdline = boot_command_line;
|
||||
bool fixed_base = false;
|
||||
bool high = false;
|
||||
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_KEXEC_CORE))
|
||||
return;
|
||||
/*
|
||||
* Don't reserve a region for a crash kernel on a crash kernel
|
||||
* since it doesn't make much sense and we have limited memory
|
||||
* resources.
|
||||
*/
|
||||
if (is_kdump_kernel()) {
|
||||
pr_info("crashkernel: ignoring reservation request\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = parse_crashkernel(cmdline, memblock_phys_mem_size(),
|
||||
&crash_size, &crash_base);
|
||||
if (ret == -ENOENT) {
|
||||
/* Fallback to crashkernel=X,[high,low] */
|
||||
ret = parse_crashkernel_high(cmdline, 0, &crash_size, &crash_base);
|
||||
if (ret || !crash_size)
|
||||
return;
|
||||
|
||||
/*
|
||||
* crashkernel=Y,low is valid only when crashkernel=X,high
|
||||
* is passed.
|
||||
*/
|
||||
ret = parse_crashkernel_low(cmdline, 0, &crash_low_size, &crash_base);
|
||||
if (ret == -ENOENT)
|
||||
crash_low_size = DEFAULT_CRASH_KERNEL_LOW_SIZE;
|
||||
else if (ret)
|
||||
return;
|
||||
|
||||
search_start = (unsigned long)dma32_phys_limit;
|
||||
search_end = memblock_end_of_DRAM();
|
||||
high = true;
|
||||
} else if (ret || !crash_size) {
|
||||
/* Invalid argument value specified */
|
||||
&crash_size, &crash_base,
|
||||
&low_size, &high);
|
||||
if (ret)
|
||||
return;
|
||||
}
|
||||
|
||||
crash_size = PAGE_ALIGN(crash_size);
|
||||
|
||||
if (crash_base) {
|
||||
fixed_base = true;
|
||||
search_start = crash_base;
|
||||
search_end = crash_base + crash_size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Current riscv boot protocol requires 2MB alignment for
|
||||
* RV64 and 4MB alignment for RV32 (hugepage size)
|
||||
*
|
||||
* Try to alloc from 32bit addressible physical memory so that
|
||||
* swiotlb can work on the crash kernel.
|
||||
*/
|
||||
crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
|
||||
search_start, search_end);
|
||||
if (crash_base == 0) {
|
||||
/*
|
||||
* For crashkernel=size[KMG]@offset[KMG], print out failure
|
||||
* message if can't reserve the specified region.
|
||||
*/
|
||||
if (fixed_base) {
|
||||
pr_warn("crashkernel: allocating failed with given size@offset\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (high) {
|
||||
/*
|
||||
* For crashkernel=size[KMG],high, if the first attempt was
|
||||
* for high memory, fall back to low memory.
|
||||
*/
|
||||
search_start = memblock_start_of_DRAM();
|
||||
search_end = (unsigned long)dma32_phys_limit;
|
||||
} else {
|
||||
/*
|
||||
* For crashkernel=size[KMG], if the first attempt was for
|
||||
* low memory, fall back to high memory, the minimum required
|
||||
* low memory will be reserved later.
|
||||
*/
|
||||
search_start = (unsigned long)dma32_phys_limit;
|
||||
search_end = memblock_end_of_DRAM();
|
||||
crash_low_size = DEFAULT_CRASH_KERNEL_LOW_SIZE;
|
||||
}
|
||||
|
||||
crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
|
||||
search_start, search_end);
|
||||
if (crash_base == 0) {
|
||||
pr_warn("crashkernel: couldn't allocate %lldKB\n",
|
||||
crash_size >> 10);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ((crash_base >= dma32_phys_limit) && crash_low_size &&
|
||||
reserve_crashkernel_low(crash_low_size)) {
|
||||
memblock_phys_free(crash_base, crash_size);
|
||||
return;
|
||||
}
|
||||
|
||||
pr_info("crashkernel: reserved 0x%016llx - 0x%016llx (%lld MB)\n",
|
||||
crash_base, crash_base + crash_size, crash_size >> 20);
|
||||
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
reserve_crashkernel_generic(cmdline, crash_size, crash_base,
|
||||
low_size, high);
|
||||
}
|
||||
|
||||
void __init paging_init(void)
|
||||
@@ -1495,7 +1376,7 @@ void __init misc_mem_init(void)
|
||||
arch_numa_init();
|
||||
sparse_init();
|
||||
zone_sizes_init();
|
||||
reserve_crashkernel();
|
||||
arch_reserve_crashkernel();
|
||||
memblock_dump_all();
|
||||
}
|
||||
|
||||
|
||||
@@ -625,8 +625,8 @@ static void __init reserve_crashkernel(void)
|
||||
phys_addr_t low, high;
|
||||
int rc;
|
||||
|
||||
rc = parse_crashkernel(boot_command_line, ident_map_size, &crash_size,
|
||||
&crash_base);
|
||||
rc = parse_crashkernel(boot_command_line, ident_map_size,
|
||||
&crash_size, &crash_base, NULL, NULL);
|
||||
|
||||
crash_base = ALIGN(crash_base, KEXEC_CRASH_MEM_ALIGN);
|
||||
crash_size = ALIGN(crash_size, KEXEC_CRASH_MEM_ALIGN);
|
||||
|
||||
@@ -154,7 +154,7 @@ void __init reserve_crashkernel(void)
|
||||
int ret;
|
||||
|
||||
ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
|
||||
&crash_size, &crash_base);
|
||||
&crash_size, &crash_base, NULL, NULL);
|
||||
if (ret == 0 && crash_size > 0) {
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
|
||||
@@ -2075,6 +2075,9 @@ config ARCH_SUPPORTS_CRASH_DUMP
|
||||
config ARCH_SUPPORTS_CRASH_HOTPLUG
|
||||
def_bool y
|
||||
|
||||
config ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION
|
||||
def_bool CRASH_CORE
|
||||
|
||||
config PHYSICAL_START
|
||||
hex "Physical address where the kernel is loaded" if (EXPERT || CRASH_DUMP)
|
||||
default "0x1000000"
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _X86_CRASH_CORE_H
|
||||
#define _X86_CRASH_CORE_H
|
||||
|
||||
/* 16M alignment for crash kernel regions */
|
||||
#define CRASH_ALIGN SZ_16M
|
||||
|
||||
/*
|
||||
* Keep the crash kernel below this limit.
|
||||
*
|
||||
* Earlier 32-bits kernels would limit the kernel to the low 512 MB range
|
||||
* due to mapping restrictions.
|
||||
*
|
||||
* 64-bit kdump kernels need to be restricted to be under 64 TB, which is
|
||||
* the upper limit of system RAM in 4-level paging mode. Since the kdump
|
||||
* jump could be from 5-level paging to 4-level paging, the jump will fail if
|
||||
* the kernel is put above 64 TB, and during the 1st kernel bootup there's
|
||||
* no good way to detect the paging mode of the target kernel which will be
|
||||
* loaded for dumping.
|
||||
*/
|
||||
extern unsigned long swiotlb_size_or_default(void);
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# define CRASH_ADDR_LOW_MAX SZ_512M
|
||||
# define CRASH_ADDR_HIGH_MAX SZ_512M
|
||||
#else
|
||||
# define CRASH_ADDR_LOW_MAX SZ_4G
|
||||
# define CRASH_ADDR_HIGH_MAX SZ_64T
|
||||
#endif
|
||||
|
||||
# define DEFAULT_CRASH_KERNEL_LOW_SIZE crash_low_size_default()
|
||||
|
||||
static inline unsigned long crash_low_size_default(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
return max(swiotlb_size_or_default() + (8UL << 20), 256UL << 20);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* _X86_CRASH_CORE_H */
|
||||
+11
-136
@@ -466,154 +466,29 @@ static void __init memblock_x86_reserve_range_setup_data(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* --------- Crashkernel reservation ------------------------------
|
||||
*/
|
||||
|
||||
/* 16M alignment for crash kernel regions */
|
||||
#define CRASH_ALIGN SZ_16M
|
||||
|
||||
/*
|
||||
* Keep the crash kernel below this limit.
|
||||
*
|
||||
* Earlier 32-bits kernels would limit the kernel to the low 512 MB range
|
||||
* due to mapping restrictions.
|
||||
*
|
||||
* 64-bit kdump kernels need to be restricted to be under 64 TB, which is
|
||||
* the upper limit of system RAM in 4-level paging mode. Since the kdump
|
||||
* jump could be from 5-level paging to 4-level paging, the jump will fail if
|
||||
* the kernel is put above 64 TB, and during the 1st kernel bootup there's
|
||||
* no good way to detect the paging mode of the target kernel which will be
|
||||
* loaded for dumping.
|
||||
*/
|
||||
#ifdef CONFIG_X86_32
|
||||
# define CRASH_ADDR_LOW_MAX SZ_512M
|
||||
# define CRASH_ADDR_HIGH_MAX SZ_512M
|
||||
#else
|
||||
# define CRASH_ADDR_LOW_MAX SZ_4G
|
||||
# define CRASH_ADDR_HIGH_MAX SZ_64T
|
||||
#endif
|
||||
|
||||
static int __init reserve_crashkernel_low(void)
|
||||
static void __init arch_reserve_crashkernel(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
unsigned long long base, low_base = 0, low_size = 0;
|
||||
unsigned long low_mem_limit;
|
||||
int ret;
|
||||
|
||||
low_mem_limit = min(memblock_phys_mem_size(), CRASH_ADDR_LOW_MAX);
|
||||
|
||||
/* crashkernel=Y,low */
|
||||
ret = parse_crashkernel_low(boot_command_line, low_mem_limit, &low_size, &base);
|
||||
if (ret) {
|
||||
/*
|
||||
* two parts from kernel/dma/swiotlb.c:
|
||||
* -swiotlb size: user-specified with swiotlb= or default.
|
||||
*
|
||||
* -swiotlb overflow buffer: now hardcoded to 32k. We round it
|
||||
* to 8M for other buffers that may need to stay low too. Also
|
||||
* make sure we allocate enough extra low memory so that we
|
||||
* don't run out of DMA buffers for 32-bit devices.
|
||||
*/
|
||||
low_size = max(swiotlb_size_or_default() + (8UL << 20), 256UL << 20);
|
||||
} else {
|
||||
/* passed with crashkernel=0,low ? */
|
||||
if (!low_size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
low_base = memblock_phys_alloc_range(low_size, CRASH_ALIGN, 0, CRASH_ADDR_LOW_MAX);
|
||||
if (!low_base) {
|
||||
pr_err("Cannot reserve %ldMB crashkernel low memory, please try smaller size.\n",
|
||||
(unsigned long)(low_size >> 20));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pr_info("Reserving %ldMB of low memory at %ldMB for crashkernel (low RAM limit: %ldMB)\n",
|
||||
(unsigned long)(low_size >> 20),
|
||||
(unsigned long)(low_base >> 20),
|
||||
(unsigned long)(low_mem_limit >> 20));
|
||||
|
||||
crashk_low_res.start = low_base;
|
||||
crashk_low_res.end = low_base + low_size - 1;
|
||||
insert_resource(&iomem_resource, &crashk_low_res);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init reserve_crashkernel(void)
|
||||
{
|
||||
unsigned long long crash_size, crash_base, total_mem;
|
||||
unsigned long long crash_base, crash_size, low_size = 0;
|
||||
char *cmdline = boot_command_line;
|
||||
bool high = false;
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_KEXEC_CORE))
|
||||
return;
|
||||
|
||||
total_mem = memblock_phys_mem_size();
|
||||
|
||||
/* crashkernel=XM */
|
||||
ret = parse_crashkernel(boot_command_line, total_mem, &crash_size, &crash_base);
|
||||
if (ret != 0 || crash_size <= 0) {
|
||||
/* crashkernel=X,high */
|
||||
ret = parse_crashkernel_high(boot_command_line, total_mem,
|
||||
&crash_size, &crash_base);
|
||||
if (ret != 0 || crash_size <= 0)
|
||||
return;
|
||||
high = true;
|
||||
}
|
||||
ret = parse_crashkernel(cmdline, memblock_phys_mem_size(),
|
||||
&crash_size, &crash_base,
|
||||
&low_size, &high);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
if (xen_pv_domain()) {
|
||||
pr_info("Ignoring crashkernel for a Xen PV domain\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* 0 means: find the address automatically */
|
||||
if (!crash_base) {
|
||||
/*
|
||||
* Set CRASH_ADDR_LOW_MAX upper bound for crash memory,
|
||||
* crashkernel=x,high reserves memory over 4G, also allocates
|
||||
* 256M extra low memory for DMA buffers and swiotlb.
|
||||
* But the extra memory is not required for all machines.
|
||||
* So try low memory first and fall back to high memory
|
||||
* unless "crashkernel=size[KMG],high" is specified.
|
||||
*/
|
||||
if (!high)
|
||||
crash_base = memblock_phys_alloc_range(crash_size,
|
||||
CRASH_ALIGN, CRASH_ALIGN,
|
||||
CRASH_ADDR_LOW_MAX);
|
||||
if (!crash_base)
|
||||
crash_base = memblock_phys_alloc_range(crash_size,
|
||||
CRASH_ALIGN, CRASH_ALIGN,
|
||||
CRASH_ADDR_HIGH_MAX);
|
||||
if (!crash_base) {
|
||||
pr_info("crashkernel reservation failed - No suitable area found.\n");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
unsigned long long start;
|
||||
|
||||
start = memblock_phys_alloc_range(crash_size, SZ_1M, crash_base,
|
||||
crash_base + crash_size);
|
||||
if (start != crash_base) {
|
||||
pr_info("crashkernel reservation failed - memory is in use.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (crash_base >= (1ULL << 32) && reserve_crashkernel_low()) {
|
||||
memblock_phys_free(crash_base, crash_size);
|
||||
return;
|
||||
}
|
||||
|
||||
pr_info("Reserving %ldMB of memory at %ldMB for crashkernel (System RAM: %ldMB)\n",
|
||||
(unsigned long)(crash_size >> 20),
|
||||
(unsigned long)(crash_base >> 20),
|
||||
(unsigned long)(total_mem >> 20));
|
||||
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
insert_resource(&iomem_resource, &crashk_res);
|
||||
reserve_crashkernel_generic(cmdline, crash_size, crash_base,
|
||||
low_size, high);
|
||||
}
|
||||
|
||||
static struct resource standard_io_resources[] = {
|
||||
@@ -1229,7 +1104,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
* Reserve memory for crash kernel after SRAT is parsed so that it
|
||||
* won't consume hotpluggable memory.
|
||||
*/
|
||||
reserve_crashkernel();
|
||||
arch_reserve_crashkernel();
|
||||
|
||||
memblock_find_dma_reserve();
|
||||
|
||||
|
||||
+3
-3
@@ -292,7 +292,7 @@ EXPORT_SYMBOL(thaw_bdev);
|
||||
*/
|
||||
|
||||
static __cacheline_aligned_in_smp DEFINE_MUTEX(bdev_lock);
|
||||
static struct kmem_cache * bdev_cachep __read_mostly;
|
||||
static struct kmem_cache *bdev_cachep __ro_after_init;
|
||||
|
||||
static struct inode *bdev_alloc_inode(struct super_block *sb)
|
||||
{
|
||||
@@ -361,13 +361,13 @@ static struct file_system_type bd_type = {
|
||||
.kill_sb = kill_anon_super,
|
||||
};
|
||||
|
||||
struct super_block *blockdev_superblock __read_mostly;
|
||||
struct super_block *blockdev_superblock __ro_after_init;
|
||||
EXPORT_SYMBOL_GPL(blockdev_superblock);
|
||||
|
||||
void __init bdev_cache_init(void)
|
||||
{
|
||||
int err;
|
||||
static struct vfsmount *bd_mnt;
|
||||
static struct vfsmount *bd_mnt __ro_after_init;
|
||||
|
||||
bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode),
|
||||
0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user