mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'mm-nonmm-stable-2025-03-30-18-23' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Pull non-MM updates from Andrew Morton: - The series "powerpc/crash: use generic crashkernel reservation" from Sourabh Jain changes powerpc's kexec code to use more of the generic layers. - The series "get_maintainer: report subsystem status separately" from Vlastimil Babka makes some long-requested improvements to the get_maintainer output. - The series "ucount: Simplify refcounting with rcuref_t" from Sebastian Siewior cleans up and optimizing the refcounting in the ucount code. - The series "reboot: support runtime configuration of emergency hw_protection action" from Ahmad Fatoum improves the ability for a driver to perform an emergency system shutdown or reboot. - The series "Converge on using secs_to_jiffies() part two" from Easwar Hariharan performs further migrations from msecs_to_jiffies() to secs_to_jiffies(). - The series "lib/interval_tree: add some test cases and cleanup" from Wei Yang permits more userspace testing of kernel library code, adds some more tests and performs some cleanups. - The series "hung_task: Dump the blocking task stacktrace" from Masami Hiramatsu arranges for the hung_task detector to dump the stack of the blocking task and not just that of the blocked task. - The series "resource: Split and use DEFINE_RES*() macros" from Andy Shevchenko provides some cleanups to the resource definition macros. - Plus the usual shower of singleton patches - please see the individual changelogs for details. * tag 'mm-nonmm-stable-2025-03-30-18-23' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (77 commits) mailmap: consolidate email addresses of Alexander Sverdlin fs/procfs: fix the comment above proc_pid_wchan() relay: use kasprintf() instead of fixed buffer formatting resource: replace open coded variant of DEFINE_RES() resource: replace open coded variants of DEFINE_RES_*_NAMED() resource: replace open coded variant of DEFINE_RES_NAMED_DESC() resource: split DEFINE_RES_NAMED_DESC() out of DEFINE_RES_NAMED() samples: add hung_task detector mutex blocking sample hung_task: show the blocker task if the task is hung on mutex kexec_core: accept unaccepted kexec segments' destination addresses watchdog/perf: optimize bytes copied and remove manual NUL-termination lib/interval_tree: fix the comment of interval_tree_span_iter_next_gap() lib/interval_tree: skip the check before go to the right subtree lib/interval_tree: add test case for span iteration lib/interval_tree: add test case for interval_tree_iter_xxx() helpers lib/rbtree: add random seed lib/rbtree: split tests lib/rbtree: enable userland test suite for rbtree related data structure checkpatch: describe --min-conf-desc-length scripts/gdb/symbols: determine KASLR offset on s390 ...
This commit is contained in:
@@ -31,6 +31,13 @@ Alexander Lobakin <alobakin@pm.me> <alobakin@marvell.com>
|
||||
Alexander Lobakin <alobakin@pm.me> <bloodyreaper@yandex.ru>
|
||||
Alexander Mikhalitsyn <alexander@mihalicyn.com> <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Alexander Mikhalitsyn <alexander@mihalicyn.com> <aleksandr.mikhalitsyn@canonical.com>
|
||||
Alexander Sverdlin <alexander.sverdlin@gmail.com> <alexander.sverdlin.ext@nsn.com>
|
||||
Alexander Sverdlin <alexander.sverdlin@gmail.com> <alexander.sverdlin@gmx.de>
|
||||
Alexander Sverdlin <alexander.sverdlin@gmail.com> <alexander.sverdlin@nokia.com>
|
||||
Alexander Sverdlin <alexander.sverdlin@gmail.com> <alexander.sverdlin@nsn.com>
|
||||
Alexander Sverdlin <alexander.sverdlin@gmail.com> <alexander.sverdlin@siemens.com>
|
||||
Alexander Sverdlin <alexander.sverdlin@gmail.com> <alexander.sverdlin@sysgo.com>
|
||||
Alexander Sverdlin <alexander.sverdlin@gmail.com> <subaparts@yandex.ru>
|
||||
Alexandre Belloni <alexandre.belloni@bootlin.com> <alexandre.belloni@free-electrons.com>
|
||||
Alexandre Ghiti <alex@ghiti.fr> <alexandre.ghiti@canonical.com>
|
||||
Alexei Avshalom Lazar <quic_ailizaro@quicinc.com> <ailizaro@codeaurora.org>
|
||||
@@ -153,7 +160,6 @@ Carlos Bilbao <carlos.bilbao@kernel.org> <carlos.bilbao@amd.com>
|
||||
Carlos Bilbao <carlos.bilbao@kernel.org> <carlos.bilbao.osdev@gmail.com>
|
||||
Carlos Bilbao <carlos.bilbao@kernel.org> <bilbao@vt.edu>
|
||||
Changbin Du <changbin.du@intel.com> <changbin.du@gmail.com>
|
||||
Changbin Du <changbin.du@intel.com> <changbin.du@intel.com>
|
||||
Chao Yu <chao@kernel.org> <chao2.yu@samsung.com>
|
||||
Chao Yu <chao@kernel.org> <yuchao0@huawei.com>
|
||||
Chester Lin <chester62515@gmail.com> <clin@suse.com>
|
||||
@@ -271,6 +277,7 @@ Hamza Mahfooz <hamzamahfooz@linux.microsoft.com> <hamza.mahfooz@amd.com>
|
||||
Hanjun Guo <guohanjun@huawei.com> <hanjun.guo@linaro.org>
|
||||
Hans Verkuil <hverkuil@xs4all.nl> <hansverk@cisco.com>
|
||||
Hans Verkuil <hverkuil@xs4all.nl> <hverkuil-cisco@xs4all.nl>
|
||||
Harry Yoo <harry.yoo@oracle.com> <42.hyeyoo@gmail.com>
|
||||
Heiko Carstens <hca@linux.ibm.com> <h.carstens@de.ibm.com>
|
||||
Heiko Carstens <hca@linux.ibm.com> <heiko.carstens@de.ibm.com>
|
||||
Heiko Stuebner <heiko@sntech.de> <heiko.stuebner@bqreaders.com>
|
||||
@@ -305,7 +312,6 @@ Jan Glauber <jan.glauber@gmail.com> <jglauber@cavium.com>
|
||||
Jan Kuliga <jtkuliga.kdev@gmail.com> <jankul@alatek.krakow.pl>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@linux.intel.com>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko@profian.com>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@parity.io>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@mellanox.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@nvidia.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgunthorpe@obsidianresearch.com>
|
||||
@@ -762,7 +768,6 @@ Vinod Koul <vkoul@kernel.org> <vkoul@infradead.org>
|
||||
Viresh Kumar <vireshk@kernel.org> <viresh.kumar2@arm.com>
|
||||
Viresh Kumar <vireshk@kernel.org> <viresh.kumar@st.com>
|
||||
Viresh Kumar <vireshk@kernel.org> <viresh.linux@gmail.com>
|
||||
Viresh Kumar <viresh.kumar@linaro.org> <viresh.kumar@linaro.org>
|
||||
Viresh Kumar <viresh.kumar@linaro.org> <viresh.kumar@linaro.com>
|
||||
Vishnu Dasa <vishnu.dasa@broadcom.com> <vdasa@vmware.com>
|
||||
Vivek Aknurwar <quic_viveka@quicinc.com> <viveka@codeaurora.org>
|
||||
|
||||
@@ -30,3 +30,11 @@ KernelVersion: 5.11
|
||||
Contact: Matteo Croce <mcroce@microsoft.com>
|
||||
Description: Don't wait for any other CPUs on reboot and
|
||||
avoid anything that could hang.
|
||||
|
||||
What: /sys/kernel/reboot/hw_protection
|
||||
Date: April 2025
|
||||
KernelVersion: 6.15
|
||||
Contact: Ahmad Fatoum <a.fatoum@pengutronix.de>
|
||||
Description: Hardware protection action taken on critical events like
|
||||
overtemperature or imminent voltage loss.
|
||||
Valid values are: reboot shutdown
|
||||
|
||||
@@ -1954,6 +1954,12 @@
|
||||
which allow the hypervisor to 'idle' the guest
|
||||
on lock contention.
|
||||
|
||||
hw_protection= [HW]
|
||||
Format: reboot | shutdown
|
||||
|
||||
Hardware protection action taken on critical events like
|
||||
overtemperature or imminent voltage loss.
|
||||
|
||||
i2c_bus= [HW] Override the default board specific I2C bus speed
|
||||
or register an additional I2C bus that is not
|
||||
registered from board initialization code.
|
||||
|
||||
@@ -82,9 +82,8 @@ patternProperties:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description: |
|
||||
The action the OS should perform after the critical temperature is reached.
|
||||
By default the system will shutdown as a safe action to prevent damage
|
||||
to the hardware, if the property is not set.
|
||||
The shutdown action should be always the default and preferred one.
|
||||
If the property is not set, it is up to the system to select the correct
|
||||
action. The recommended and preferred default is shutdown.
|
||||
Choose 'reboot' with care, as the hardware may be in thermal stress,
|
||||
thus leading to infinite reboots that may cause damage to the hardware.
|
||||
Make sure the firmware/bootloader will act as the last resort and take
|
||||
|
||||
@@ -413,18 +413,21 @@ This function serves as an arbitrator to set the state of a cooling
|
||||
device. It sets the cooling device to the deepest cooling state if
|
||||
possible.
|
||||
|
||||
5. thermal_emergency_poweroff
|
||||
=============================
|
||||
5. Critical Events
|
||||
==================
|
||||
|
||||
On an event of critical trip temperature crossing the thermal framework
|
||||
shuts down the system by calling hw_protection_shutdown(). The
|
||||
hw_protection_shutdown() first attempts to perform an orderly shutdown
|
||||
but accepts a delay after which it proceeds doing a forced power-off
|
||||
or as last resort an emergency_restart.
|
||||
On an event of critical trip temperature crossing, the thermal framework
|
||||
will trigger a hardware protection power-off (shutdown) or reboot,
|
||||
depending on configuration.
|
||||
|
||||
At first, the kernel will attempt an orderly power-off or reboot, but
|
||||
accepts a delay after which it proceeds to do a forced power-off or
|
||||
reboot, respectively. If this fails, ``emergency_restart()`` is invoked
|
||||
as last resort.
|
||||
|
||||
The delay should be carefully profiled so as to give adequate time for
|
||||
orderly poweroff.
|
||||
orderly power-off or reboot.
|
||||
|
||||
If the delay is set to 0 emergency poweroff will not be supported. So a
|
||||
carefully profiled non-zero positive value is a must for emergency
|
||||
poweroff to be triggered.
|
||||
If the delay is set to 0, the emergency action will not be supported. So a
|
||||
carefully profiled non-zero positive value is a must for the emergency
|
||||
action to be triggered.
|
||||
|
||||
@@ -128,6 +128,16 @@ process running on the system, which is named after the process ID (PID).
|
||||
The link 'self' points to the process reading the file system. Each process
|
||||
subdirectory has the entries listed in Table 1-1.
|
||||
|
||||
A process can read its own information from /proc/PID/* with no extra
|
||||
permissions. When reading /proc/PID/* information for other processes, reading
|
||||
process is required to have either CAP_SYS_PTRACE capability with
|
||||
PTRACE_MODE_READ access permissions, or, alternatively, CAP_PERFMON
|
||||
capability. This applies to all read-only information like `maps`, `environ`,
|
||||
`pagemap`, etc. The only exception is `mem` file due to its read-write nature,
|
||||
which requires CAP_SYS_PTRACE capabilities with more elevated
|
||||
PTRACE_MODE_ATTACH permissions; CAP_PERFMON capability does not grant access
|
||||
to /proc/PID/mem for other processes.
|
||||
|
||||
Note that an open file descriptor to /proc/<pid> or to any of its
|
||||
contained files or subdirectories does not prevent <pid> being reused
|
||||
for some other process in the event that <pid> exits. Operations on
|
||||
|
||||
+2
-1
@@ -18802,6 +18802,7 @@ F: mm/percpu*.c
|
||||
|
||||
PER-TASK DELAY ACCOUNTING
|
||||
M: Balbir Singh <bsingharora@gmail.com>
|
||||
M: Yang Yang <yang.yang29@zte.com.cn>
|
||||
S: Maintained
|
||||
F: include/linux/delayacct.h
|
||||
F: kernel/delayacct.c
|
||||
@@ -22153,7 +22154,7 @@ M: Joonsoo Kim <iamjoonsoo.kim@lge.com>
|
||||
M: Andrew Morton <akpm@linux-foundation.org>
|
||||
M: Vlastimil Babka <vbabka@suse.cz>
|
||||
R: Roman Gushchin <roman.gushchin@linux.dev>
|
||||
R: Hyeonggon Yoo <42.hyeyoo@gmail.com>
|
||||
R: Harry Yoo <harry.yoo@oracle.com>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab.git
|
||||
|
||||
@@ -98,21 +98,19 @@ static void __init arch_reserve_crashkernel(void)
|
||||
{
|
||||
unsigned long long low_size = 0;
|
||||
unsigned long long crash_base, crash_size;
|
||||
char *cmdline = boot_command_line;
|
||||
bool high = false;
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_CRASH_RESERVE))
|
||||
return;
|
||||
|
||||
ret = parse_crashkernel(cmdline, memblock_phys_mem_size(),
|
||||
ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
|
||||
&crash_size, &crash_base,
|
||||
&low_size, &high);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
reserve_crashkernel_generic(cmdline, crash_size, crash_base,
|
||||
low_size, high);
|
||||
reserve_crashkernel_generic(crash_size, crash_base, low_size, high);
|
||||
}
|
||||
|
||||
static phys_addr_t __init max_zone_phys(phys_addr_t zone_limit)
|
||||
|
||||
@@ -259,18 +259,17 @@ static void __init arch_reserve_crashkernel(void)
|
||||
int ret;
|
||||
unsigned long long low_size = 0;
|
||||
unsigned long long crash_base, crash_size;
|
||||
char *cmdline = boot_command_line;
|
||||
bool high = false;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_CRASH_RESERVE))
|
||||
return;
|
||||
|
||||
ret = parse_crashkernel(cmdline, memblock_phys_mem_size(),
|
||||
ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
|
||||
&crash_size, &crash_base, &low_size, &high);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
reserve_crashkernel_generic(cmdline, crash_size, crash_base, low_size, high);
|
||||
reserve_crashkernel_generic(crash_size, crash_base, low_size, high);
|
||||
}
|
||||
|
||||
static void __init fdt_setup(void)
|
||||
|
||||
@@ -716,6 +716,9 @@ config ARCH_SUPPORTS_CRASH_HOTPLUG
|
||||
def_bool y
|
||||
depends on PPC64
|
||||
|
||||
config ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION
|
||||
def_bool CRASH_RESERVE
|
||||
|
||||
config FA_DUMP
|
||||
bool "Firmware-assisted dump"
|
||||
depends on CRASH_DUMP && PPC64 && (PPC_RTAS || PPC_POWERNV)
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_POWERPC_CRASH_RESERVE_H
|
||||
#define _ASM_POWERPC_CRASH_RESERVE_H
|
||||
|
||||
/* crash kernel regions are Page size agliged */
|
||||
#define CRASH_ALIGN PAGE_SIZE
|
||||
|
||||
#endif /* _ASM_POWERPC_CRASH_RESERVE_H */
|
||||
@@ -94,8 +94,10 @@ int arch_kexec_kernel_image_probe(struct kimage *image, void *buf, unsigned long
|
||||
int arch_kimage_file_post_load_cleanup(struct kimage *image);
|
||||
#define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup
|
||||
|
||||
int arch_kexec_locate_mem_hole(struct kexec_buf *kbuf);
|
||||
#define arch_kexec_locate_mem_hole arch_kexec_locate_mem_hole
|
||||
int arch_check_excluded_range(struct kimage *image, unsigned long start,
|
||||
unsigned long end);
|
||||
#define arch_check_excluded_range arch_check_excluded_range
|
||||
|
||||
|
||||
int load_crashdump_segments_ppc64(struct kimage *image,
|
||||
struct kexec_buf *kbuf);
|
||||
@@ -112,9 +114,9 @@ int setup_new_fdt_ppc64(const struct kimage *image, void *fdt, struct crash_mem
|
||||
|
||||
#ifdef CONFIG_CRASH_RESERVE
|
||||
int __init overlaps_crashkernel(unsigned long start, unsigned long size);
|
||||
extern void reserve_crashkernel(void);
|
||||
extern void arch_reserve_crashkernel(void);
|
||||
#else
|
||||
static inline void reserve_crashkernel(void) {}
|
||||
static inline void arch_reserve_crashkernel(void) {}
|
||||
static inline int overlaps_crashkernel(unsigned long start, unsigned long size) { return 0; }
|
||||
#endif
|
||||
|
||||
|
||||
@@ -860,7 +860,7 @@ void __init early_init_devtree(void *params)
|
||||
*/
|
||||
if (fadump_reserve_mem() == 0)
|
||||
#endif
|
||||
reserve_crashkernel();
|
||||
arch_reserve_crashkernel();
|
||||
early_reserve_mem();
|
||||
|
||||
if (memory_limit > memblock_phys_mem_size())
|
||||
|
||||
+40
-60
@@ -58,38 +58,20 @@ void machine_kexec(struct kimage *image)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CRASH_RESERVE
|
||||
void __init reserve_crashkernel(void)
|
||||
|
||||
static unsigned long long __init get_crash_base(unsigned long long crash_base)
|
||||
{
|
||||
unsigned long long crash_size, crash_base, total_mem_sz;
|
||||
int ret;
|
||||
|
||||
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, NULL, NULL);
|
||||
if (ret == 0 && crash_size > 0) {
|
||||
crashk_res.start = crash_base;
|
||||
crashk_res.end = crash_base + crash_size - 1;
|
||||
}
|
||||
|
||||
if (crashk_res.end == crashk_res.start) {
|
||||
crashk_res.start = crashk_res.end = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/* We might have got these values via the command line or the
|
||||
* device tree, either way sanitise them now. */
|
||||
|
||||
crash_size = resource_size(&crashk_res);
|
||||
|
||||
#ifndef CONFIG_NONSTATIC_KERNEL
|
||||
if (crashk_res.start != KDUMP_KERNELBASE)
|
||||
if (crash_base != KDUMP_KERNELBASE)
|
||||
printk("Crash kernel location must be 0x%x\n",
|
||||
KDUMP_KERNELBASE);
|
||||
|
||||
crashk_res.start = KDUMP_KERNELBASE;
|
||||
return KDUMP_KERNELBASE;
|
||||
#else
|
||||
if (!crashk_res.start) {
|
||||
unsigned long long crash_base_align;
|
||||
|
||||
if (!crash_base) {
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* On the LPAR platform place the crash kernel to mid of
|
||||
@@ -101,53 +83,51 @@ void __init reserve_crashkernel(void)
|
||||
* kernel starts at 128MB offset on other platforms.
|
||||
*/
|
||||
if (firmware_has_feature(FW_FEATURE_LPAR))
|
||||
crashk_res.start = min_t(u64, ppc64_rma_size / 2, SZ_512M);
|
||||
crash_base = min_t(u64, ppc64_rma_size / 2, SZ_512M);
|
||||
else
|
||||
crashk_res.start = min_t(u64, ppc64_rma_size / 2, SZ_128M);
|
||||
crash_base = min_t(u64, ppc64_rma_size / 2, SZ_128M);
|
||||
#else
|
||||
crashk_res.start = KDUMP_KERNELBASE;
|
||||
crash_base = KDUMP_KERNELBASE;
|
||||
#endif
|
||||
}
|
||||
|
||||
crash_base = PAGE_ALIGN(crashk_res.start);
|
||||
if (crash_base != crashk_res.start) {
|
||||
printk("Crash kernel base must be aligned to 0x%lx\n",
|
||||
PAGE_SIZE);
|
||||
crashk_res.start = crash_base;
|
||||
}
|
||||
crash_base_align = PAGE_ALIGN(crash_base);
|
||||
if (crash_base != crash_base_align)
|
||||
pr_warn("Crash kernel base must be aligned to 0x%lx\n", PAGE_SIZE);
|
||||
|
||||
return crash_base_align;
|
||||
#endif
|
||||
crash_size = PAGE_ALIGN(crash_size);
|
||||
crashk_res.end = crashk_res.start + crash_size - 1;
|
||||
}
|
||||
|
||||
void __init arch_reserve_crashkernel(void)
|
||||
{
|
||||
unsigned long long crash_size, crash_base, crash_end;
|
||||
unsigned long long kernel_start, kernel_size;
|
||||
unsigned long long total_mem_sz;
|
||||
int ret;
|
||||
|
||||
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, NULL, NULL);
|
||||
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
crash_base = get_crash_base(crash_base);
|
||||
crash_end = crash_base + crash_size - 1;
|
||||
|
||||
kernel_start = __pa(_stext);
|
||||
kernel_size = _end - _stext;
|
||||
|
||||
/* The crash region must not overlap the current kernel */
|
||||
if (overlaps_crashkernel(__pa(_stext), _end - _stext)) {
|
||||
printk(KERN_WARNING
|
||||
"Crash kernel can not overlap current kernel\n");
|
||||
crashk_res.start = crashk_res.end = 0;
|
||||
if ((kernel_start + kernel_size > crash_base) && (kernel_start <= crash_end)) {
|
||||
pr_warn("Crash kernel can not overlap current kernel\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Crash kernel trumps memory limit */
|
||||
if (memory_limit && memory_limit <= crashk_res.end) {
|
||||
memory_limit = crashk_res.end + 1;
|
||||
total_mem_sz = memory_limit;
|
||||
printk("Adjusted memory limit for crashkernel, now 0x%llx\n",
|
||||
memory_limit);
|
||||
}
|
||||
|
||||
printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
|
||||
"for crashkernel (System RAM: %ldMB)\n",
|
||||
(unsigned long)(crash_size >> 20),
|
||||
(unsigned long)(crashk_res.start >> 20),
|
||||
(unsigned long)(total_mem_sz >> 20));
|
||||
|
||||
if (!memblock_is_region_memory(crashk_res.start, crash_size) ||
|
||||
memblock_reserve(crashk_res.start, crash_size)) {
|
||||
pr_err("Failed to reserve memory for crashkernel!\n");
|
||||
crashk_res.start = crashk_res.end = 0;
|
||||
return;
|
||||
}
|
||||
reserve_crashkernel_generic(crash_size, crash_base, 0, false);
|
||||
}
|
||||
|
||||
int __init overlaps_crashkernel(unsigned long start, unsigned long size)
|
||||
|
||||
@@ -49,201 +49,18 @@ const struct kexec_file_ops * const kexec_file_loaders[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
/**
|
||||
* __locate_mem_hole_top_down - Looks top down for a large enough memory hole
|
||||
* in the memory regions between buf_min & buf_max
|
||||
* for the buffer. If found, sets kbuf->mem.
|
||||
* @kbuf: Buffer contents and memory parameters.
|
||||
* @buf_min: Minimum address for the buffer.
|
||||
* @buf_max: Maximum address for the buffer.
|
||||
*
|
||||
* Returns 0 on success, negative errno on error.
|
||||
*/
|
||||
static int __locate_mem_hole_top_down(struct kexec_buf *kbuf,
|
||||
u64 buf_min, u64 buf_max)
|
||||
int arch_check_excluded_range(struct kimage *image, unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
int ret = -EADDRNOTAVAIL;
|
||||
phys_addr_t start, end;
|
||||
u64 i;
|
||||
struct crash_mem *emem;
|
||||
int i;
|
||||
|
||||
for_each_mem_range_rev(i, &start, &end) {
|
||||
/*
|
||||
* memblock uses [start, end) convention while it is
|
||||
* [start, end] here. Fix the off-by-one to have the
|
||||
* same convention.
|
||||
*/
|
||||
end -= 1;
|
||||
emem = image->arch.exclude_ranges;
|
||||
for (i = 0; i < emem->nr_ranges; i++)
|
||||
if (start < emem->ranges[i].end && end > emem->ranges[i].start)
|
||||
return 1;
|
||||
|
||||
if (start > buf_max)
|
||||
continue;
|
||||
|
||||
/* Memory hole not found */
|
||||
if (end < buf_min)
|
||||
break;
|
||||
|
||||
/* Adjust memory region based on the given range */
|
||||
if (start < buf_min)
|
||||
start = buf_min;
|
||||
if (end > buf_max)
|
||||
end = buf_max;
|
||||
|
||||
start = ALIGN(start, kbuf->buf_align);
|
||||
if (start < end && (end - start + 1) >= kbuf->memsz) {
|
||||
/* Suitable memory range found. Set kbuf->mem */
|
||||
kbuf->mem = ALIGN_DOWN(end - kbuf->memsz + 1,
|
||||
kbuf->buf_align);
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* locate_mem_hole_top_down_ppc64 - Skip special memory regions to find a
|
||||
* suitable buffer with top down approach.
|
||||
* @kbuf: Buffer contents and memory parameters.
|
||||
* @buf_min: Minimum address for the buffer.
|
||||
* @buf_max: Maximum address for the buffer.
|
||||
* @emem: Exclude memory ranges.
|
||||
*
|
||||
* Returns 0 on success, negative errno on error.
|
||||
*/
|
||||
static int locate_mem_hole_top_down_ppc64(struct kexec_buf *kbuf,
|
||||
u64 buf_min, u64 buf_max,
|
||||
const struct crash_mem *emem)
|
||||
{
|
||||
int i, ret = 0, err = -EADDRNOTAVAIL;
|
||||
u64 start, end, tmin, tmax;
|
||||
|
||||
tmax = buf_max;
|
||||
for (i = (emem->nr_ranges - 1); i >= 0; i--) {
|
||||
start = emem->ranges[i].start;
|
||||
end = emem->ranges[i].end;
|
||||
|
||||
if (start > tmax)
|
||||
continue;
|
||||
|
||||
if (end < tmax) {
|
||||
tmin = (end < buf_min ? buf_min : end + 1);
|
||||
ret = __locate_mem_hole_top_down(kbuf, tmin, tmax);
|
||||
if (!ret)
|
||||
return 0;
|
||||
}
|
||||
|
||||
tmax = start - 1;
|
||||
|
||||
if (tmax < buf_min) {
|
||||
ret = err;
|
||||
break;
|
||||
}
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
tmin = buf_min;
|
||||
ret = __locate_mem_hole_top_down(kbuf, tmin, tmax);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* __locate_mem_hole_bottom_up - Looks bottom up for a large enough memory hole
|
||||
* in the memory regions between buf_min & buf_max
|
||||
* for the buffer. If found, sets kbuf->mem.
|
||||
* @kbuf: Buffer contents and memory parameters.
|
||||
* @buf_min: Minimum address for the buffer.
|
||||
* @buf_max: Maximum address for the buffer.
|
||||
*
|
||||
* Returns 0 on success, negative errno on error.
|
||||
*/
|
||||
static int __locate_mem_hole_bottom_up(struct kexec_buf *kbuf,
|
||||
u64 buf_min, u64 buf_max)
|
||||
{
|
||||
int ret = -EADDRNOTAVAIL;
|
||||
phys_addr_t start, end;
|
||||
u64 i;
|
||||
|
||||
for_each_mem_range(i, &start, &end) {
|
||||
/*
|
||||
* memblock uses [start, end) convention while it is
|
||||
* [start, end] here. Fix the off-by-one to have the
|
||||
* same convention.
|
||||
*/
|
||||
end -= 1;
|
||||
|
||||
if (end < buf_min)
|
||||
continue;
|
||||
|
||||
/* Memory hole not found */
|
||||
if (start > buf_max)
|
||||
break;
|
||||
|
||||
/* Adjust memory region based on the given range */
|
||||
if (start < buf_min)
|
||||
start = buf_min;
|
||||
if (end > buf_max)
|
||||
end = buf_max;
|
||||
|
||||
start = ALIGN(start, kbuf->buf_align);
|
||||
if (start < end && (end - start + 1) >= kbuf->memsz) {
|
||||
/* Suitable memory range found. Set kbuf->mem */
|
||||
kbuf->mem = start;
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* locate_mem_hole_bottom_up_ppc64 - Skip special memory regions to find a
|
||||
* suitable buffer with bottom up approach.
|
||||
* @kbuf: Buffer contents and memory parameters.
|
||||
* @buf_min: Minimum address for the buffer.
|
||||
* @buf_max: Maximum address for the buffer.
|
||||
* @emem: Exclude memory ranges.
|
||||
*
|
||||
* Returns 0 on success, negative errno on error.
|
||||
*/
|
||||
static int locate_mem_hole_bottom_up_ppc64(struct kexec_buf *kbuf,
|
||||
u64 buf_min, u64 buf_max,
|
||||
const struct crash_mem *emem)
|
||||
{
|
||||
int i, ret = 0, err = -EADDRNOTAVAIL;
|
||||
u64 start, end, tmin, tmax;
|
||||
|
||||
tmin = buf_min;
|
||||
for (i = 0; i < emem->nr_ranges; i++) {
|
||||
start = emem->ranges[i].start;
|
||||
end = emem->ranges[i].end;
|
||||
|
||||
if (end < tmin)
|
||||
continue;
|
||||
|
||||
if (start > tmin) {
|
||||
tmax = (start > buf_max ? buf_max : start - 1);
|
||||
ret = __locate_mem_hole_bottom_up(kbuf, tmin, tmax);
|
||||
if (!ret)
|
||||
return 0;
|
||||
}
|
||||
|
||||
tmin = end + 1;
|
||||
|
||||
if (tmin > buf_max) {
|
||||
ret = err;
|
||||
break;
|
||||
}
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
tmax = buf_max;
|
||||
ret = __locate_mem_hole_bottom_up(kbuf, tmin, tmax);
|
||||
}
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
@@ -1004,64 +821,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_kexec_locate_mem_hole - Skip special memory regions like rtas, opal,
|
||||
* tce-table, reserved-ranges & such (exclude
|
||||
* memory ranges) as they can't be used for kexec
|
||||
* segment buffer. Sets kbuf->mem when a suitable
|
||||
* memory hole is found.
|
||||
* @kbuf: Buffer contents and memory parameters.
|
||||
*
|
||||
* Assumes minimum of PAGE_SIZE alignment for kbuf->memsz & kbuf->buf_align.
|
||||
*
|
||||
* Returns 0 on success, negative errno on error.
|
||||
*/
|
||||
int arch_kexec_locate_mem_hole(struct kexec_buf *kbuf)
|
||||
{
|
||||
struct crash_mem **emem;
|
||||
u64 buf_min, buf_max;
|
||||
int ret;
|
||||
|
||||
/* Look up the exclude ranges list while locating the memory hole */
|
||||
emem = &(kbuf->image->arch.exclude_ranges);
|
||||
if (!(*emem) || ((*emem)->nr_ranges == 0)) {
|
||||
pr_warn("No exclude range list. Using the default locate mem hole method\n");
|
||||
return kexec_locate_mem_hole(kbuf);
|
||||
}
|
||||
|
||||
buf_min = kbuf->buf_min;
|
||||
buf_max = kbuf->buf_max;
|
||||
/* Segments for kdump kernel should be within crashkernel region */
|
||||
if (IS_ENABLED(CONFIG_CRASH_DUMP) && kbuf->image->type == KEXEC_TYPE_CRASH) {
|
||||
buf_min = (buf_min < crashk_res.start ?
|
||||
crashk_res.start : buf_min);
|
||||
buf_max = (buf_max > crashk_res.end ?
|
||||
crashk_res.end : buf_max);
|
||||
}
|
||||
|
||||
if (buf_min > buf_max) {
|
||||
pr_err("Invalid buffer min and/or max values\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (kbuf->top_down)
|
||||
ret = locate_mem_hole_top_down_ppc64(kbuf, buf_min, buf_max,
|
||||
*emem);
|
||||
else
|
||||
ret = locate_mem_hole_bottom_up_ppc64(kbuf, buf_min, buf_max,
|
||||
*emem);
|
||||
|
||||
/* Add the buffer allocated to the exclude list for the next lookup */
|
||||
if (!ret) {
|
||||
add_mem_range(emem, kbuf->mem, kbuf->memsz);
|
||||
sort_memory_ranges(*emem, true);
|
||||
} else {
|
||||
pr_err("Failed to locate memory buffer of size %lu\n",
|
||||
kbuf->memsz);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_kexec_kernel_image_probe - Does additional handling needed to setup
|
||||
* kexec segments.
|
||||
|
||||
@@ -338,7 +338,7 @@ static int __init add_system_ram_resources(void)
|
||||
*/
|
||||
res->end = end - 1;
|
||||
res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
|
||||
WARN_ON(request_resource(&iomem_resource, res) < 0);
|
||||
WARN_ON(insert_resource(&iomem_resource, res) < 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1393,21 +1393,19 @@ static void __init arch_reserve_crashkernel(void)
|
||||
{
|
||||
unsigned long long low_size = 0;
|
||||
unsigned long long crash_base, crash_size;
|
||||
char *cmdline = boot_command_line;
|
||||
bool high = false;
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_CRASH_RESERVE))
|
||||
return;
|
||||
|
||||
ret = parse_crashkernel(cmdline, memblock_phys_mem_size(),
|
||||
ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
|
||||
&crash_size, &crash_base,
|
||||
&low_size, &high);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
reserve_crashkernel_generic(cmdline, crash_size, crash_base,
|
||||
low_size, high);
|
||||
reserve_crashkernel_generic(crash_size, crash_base, low_size, high);
|
||||
}
|
||||
|
||||
void __init paging_init(void)
|
||||
|
||||
@@ -578,14 +578,13 @@ static void __init memblock_x86_reserve_range_setup_data(void)
|
||||
static void __init arch_reserve_crashkernel(void)
|
||||
{
|
||||
unsigned long long crash_base, crash_size, low_size = 0;
|
||||
char *cmdline = boot_command_line;
|
||||
bool high = false;
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_CRASH_RESERVE))
|
||||
return;
|
||||
|
||||
ret = parse_crashkernel(cmdline, memblock_phys_mem_size(),
|
||||
ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
|
||||
&crash_size, &crash_base,
|
||||
&low_size, &high);
|
||||
if (ret)
|
||||
@@ -596,8 +595,7 @@ static void __init arch_reserve_crashkernel(void)
|
||||
return;
|
||||
}
|
||||
|
||||
reserve_crashkernel_generic(cmdline, crash_size, crash_base,
|
||||
low_size, high);
|
||||
reserve_crashkernel_generic(crash_size, crash_base, low_size, high);
|
||||
}
|
||||
|
||||
static struct resource standard_io_resources[] = {
|
||||
|
||||
@@ -2586,7 +2586,7 @@ int hl_cs_ioctl(struct drm_device *ddev, void *data, struct drm_file *file_priv)
|
||||
cs_seq = args->in.seq;
|
||||
|
||||
timeout = flags & HL_CS_FLAGS_CUSTOM_TIMEOUT
|
||||
? msecs_to_jiffies(args->in.timeout * 1000)
|
||||
? secs_to_jiffies(args->in.timeout)
|
||||
: hpriv->hdev->timeout_jiffies;
|
||||
|
||||
switch (cs_type) {
|
||||
|
||||
@@ -1403,7 +1403,7 @@ static ssize_t hl_timeout_locked_write(struct file *f, const char __user *buf,
|
||||
return rc;
|
||||
|
||||
if (value)
|
||||
hdev->timeout_jiffies = msecs_to_jiffies(value * 1000);
|
||||
hdev->timeout_jiffies = secs_to_jiffies(value);
|
||||
else
|
||||
hdev->timeout_jiffies = MAX_SCHEDULE_TIMEOUT;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user