mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
Merge 6.1.51 into android14-6.1-lts
Changes in 6.1.51 ACPI: thermal: Drop nocrt parameter module: Expose module_init_layout_section() arm64: module-plts: inline linux/moduleloader.h arm64: module: Use module_init_layout_section() to spot init sections ARM: module: Use module_init_layout_section() to spot init sections lockdep: fix static memory detection even more parisc: Cleanup mmap implementation regarding color alignment parisc: sys_parisc: parisc_personality() is called from asm code io_uring/parisc: Adjust pgoff in io_uring mmap() for parisc kallsyms: Fix kallsyms_selftest failure thunderbolt: Fix a backport error for display flickering issue Linux 6.1.51 Change-Id: I8bc79fc29ebf10ba654c16b771af1519eea39b38 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -6201,10 +6201,6 @@
|
|||||||
-1: disable all critical trip points in all thermal zones
|
-1: disable all critical trip points in all thermal zones
|
||||||
<degrees C>: override all critical trip points
|
<degrees C>: override all critical trip points
|
||||||
|
|
||||||
thermal.nocrt= [HW,ACPI]
|
|
||||||
Set to disable actions on ACPI thermal zone
|
|
||||||
critical and hot trip points.
|
|
||||||
|
|
||||||
thermal.off= [HW,ACPI]
|
thermal.off= [HW,ACPI]
|
||||||
1: disable ACPI thermal control
|
1: disable ACPI thermal control
|
||||||
|
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 6
|
VERSION = 6
|
||||||
PATCHLEVEL = 1
|
PATCHLEVEL = 1
|
||||||
SUBLEVEL = 50
|
SUBLEVEL = 51
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Curry Ramen
|
NAME = Curry Ramen
|
||||||
|
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
|||||||
/* sort by type and symbol index */
|
/* sort by type and symbol index */
|
||||||
sort(rels, numrels, sizeof(Elf32_Rel), cmp_rel, NULL);
|
sort(rels, numrels, sizeof(Elf32_Rel), cmp_rel, NULL);
|
||||||
|
|
||||||
if (strncmp(secstrings + dstsec->sh_name, ".init", 5) != 0)
|
if (!module_init_layout_section(secstrings + dstsec->sh_name))
|
||||||
core_plts += count_plts(syms, dstsec->sh_addr, rels,
|
core_plts += count_plts(syms, dstsec->sh_addr, rels,
|
||||||
numrels, s->sh_info);
|
numrels, s->sh_info);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <linux/ftrace.h>
|
#include <linux/ftrace.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/moduleloader.h>
|
||||||
#include <linux/sort.h>
|
#include <linux/sort.h>
|
||||||
|
|
||||||
static struct plt_entry __get_adrp_add_pair(u64 dst, u64 pc,
|
static struct plt_entry __get_adrp_add_pair(u64 dst, u64 pc,
|
||||||
@@ -343,7 +344,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
|||||||
if (nents)
|
if (nents)
|
||||||
sort(rels, nents, sizeof(Elf64_Rela), cmp_rela, NULL);
|
sort(rels, nents, sizeof(Elf64_Rela), cmp_rela, NULL);
|
||||||
|
|
||||||
if (!str_has_prefix(secstrings + dstsec->sh_name, ".init"))
|
if (!module_init_layout_section(secstrings + dstsec->sh_name))
|
||||||
core_plts += count_plts(syms, rels, numrels,
|
core_plts += count_plts(syms, rels, numrels,
|
||||||
sechdrs[i].sh_info, dstsec);
|
sechdrs[i].sh_info, dstsec);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -24,32 +24,28 @@
|
|||||||
#include <linux/personality.h>
|
#include <linux/personality.h>
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
|
#include <linux/elf-randomize.h>
|
||||||
|
|
||||||
/* we construct an artificial offset for the mapping based on the physical
|
/*
|
||||||
* address of the kernel mapping variable */
|
* Construct an artificial page offset for the mapping based on the physical
|
||||||
#define GET_LAST_MMAP(filp) \
|
* address of the kernel file mapping variable.
|
||||||
(filp ? ((unsigned long) filp->f_mapping) >> 8 : 0UL)
|
*/
|
||||||
#define SET_LAST_MMAP(filp, val) \
|
#define GET_FILP_PGOFF(filp) \
|
||||||
{ /* nothing */ }
|
(filp ? (((unsigned long) filp->f_mapping) >> 8) \
|
||||||
|
& ((SHM_COLOUR-1) >> PAGE_SHIFT) : 0UL)
|
||||||
|
|
||||||
static int get_offset(unsigned int last_mmap)
|
static unsigned long shared_align_offset(unsigned long filp_pgoff,
|
||||||
{
|
|
||||||
return (last_mmap & (SHM_COLOUR-1)) >> PAGE_SHIFT;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned long shared_align_offset(unsigned int last_mmap,
|
|
||||||
unsigned long pgoff)
|
unsigned long pgoff)
|
||||||
{
|
{
|
||||||
return (get_offset(last_mmap) + pgoff) << PAGE_SHIFT;
|
return (filp_pgoff + pgoff) << PAGE_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long COLOR_ALIGN(unsigned long addr,
|
static inline unsigned long COLOR_ALIGN(unsigned long addr,
|
||||||
unsigned int last_mmap, unsigned long pgoff)
|
unsigned long filp_pgoff, unsigned long pgoff)
|
||||||
{
|
{
|
||||||
unsigned long base = (addr+SHM_COLOUR-1) & ~(SHM_COLOUR-1);
|
unsigned long base = (addr+SHM_COLOUR-1) & ~(SHM_COLOUR-1);
|
||||||
unsigned long off = (SHM_COLOUR-1) &
|
unsigned long off = (SHM_COLOUR-1) &
|
||||||
(shared_align_offset(last_mmap, pgoff) << PAGE_SHIFT);
|
shared_align_offset(filp_pgoff, pgoff);
|
||||||
|
|
||||||
return base + off;
|
return base + off;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,92 +94,41 @@ static unsigned long mmap_upper_limit(struct rlimit *rlim_stack)
|
|||||||
return PAGE_ALIGN(STACK_TOP - stack_base);
|
return PAGE_ALIGN(STACK_TOP - stack_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum mmap_allocation_direction {UP, DOWN};
|
||||||
|
|
||||||
unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
static unsigned long arch_get_unmapped_area_common(struct file *filp,
|
||||||
unsigned long len, unsigned long pgoff, unsigned long flags)
|
unsigned long addr, unsigned long len, unsigned long pgoff,
|
||||||
|
unsigned long flags, enum mmap_allocation_direction dir)
|
||||||
{
|
{
|
||||||
struct mm_struct *mm = current->mm;
|
struct mm_struct *mm = current->mm;
|
||||||
struct vm_area_struct *vma, *prev;
|
struct vm_area_struct *vma, *prev;
|
||||||
unsigned long task_size = TASK_SIZE;
|
unsigned long filp_pgoff;
|
||||||
int do_color_align, last_mmap;
|
int do_color_align;
|
||||||
struct vm_unmapped_area_info info;
|
struct vm_unmapped_area_info info;
|
||||||
|
|
||||||
if (len > task_size)
|
if (unlikely(len > TASK_SIZE))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
do_color_align = 0;
|
do_color_align = 0;
|
||||||
if (filp || (flags & MAP_SHARED))
|
if (filp || (flags & MAP_SHARED))
|
||||||
do_color_align = 1;
|
do_color_align = 1;
|
||||||
last_mmap = GET_LAST_MMAP(filp);
|
filp_pgoff = GET_FILP_PGOFF(filp);
|
||||||
|
|
||||||
if (flags & MAP_FIXED) {
|
if (flags & MAP_FIXED) {
|
||||||
if ((flags & MAP_SHARED) && last_mmap &&
|
/* Even MAP_FIXED mappings must reside within TASK_SIZE */
|
||||||
(addr - shared_align_offset(last_mmap, pgoff))
|
if (TASK_SIZE - len < addr)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if ((flags & MAP_SHARED) && filp &&
|
||||||
|
(addr - shared_align_offset(filp_pgoff, pgoff))
|
||||||
& (SHM_COLOUR - 1))
|
& (SHM_COLOUR - 1))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
goto found_addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addr) {
|
if (addr) {
|
||||||
if (do_color_align && last_mmap)
|
if (do_color_align)
|
||||||
addr = COLOR_ALIGN(addr, last_mmap, pgoff);
|
addr = COLOR_ALIGN(addr, filp_pgoff, pgoff);
|
||||||
else
|
|
||||||
addr = PAGE_ALIGN(addr);
|
|
||||||
|
|
||||||
vma = find_vma_prev(mm, addr, &prev);
|
|
||||||
if (task_size - len >= addr &&
|
|
||||||
(!vma || addr + len <= vm_start_gap(vma)) &&
|
|
||||||
(!prev || addr >= vm_end_gap(prev)))
|
|
||||||
goto found_addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
info.flags = 0;
|
|
||||||
info.length = len;
|
|
||||||
info.low_limit = mm->mmap_legacy_base;
|
|
||||||
info.high_limit = mmap_upper_limit(NULL);
|
|
||||||
info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR - 1)) : 0;
|
|
||||||
info.align_offset = shared_align_offset(last_mmap, pgoff);
|
|
||||||
addr = vm_unmapped_area(&info);
|
|
||||||
|
|
||||||
found_addr:
|
|
||||||
if (do_color_align && !last_mmap && !(addr & ~PAGE_MASK))
|
|
||||||
SET_LAST_MMAP(filp, addr - (pgoff << PAGE_SHIFT));
|
|
||||||
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long
|
|
||||||
arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
|
||||||
const unsigned long len, const unsigned long pgoff,
|
|
||||||
const unsigned long flags)
|
|
||||||
{
|
|
||||||
struct vm_area_struct *vma, *prev;
|
|
||||||
struct mm_struct *mm = current->mm;
|
|
||||||
unsigned long addr = addr0;
|
|
||||||
int do_color_align, last_mmap;
|
|
||||||
struct vm_unmapped_area_info info;
|
|
||||||
|
|
||||||
/* requested length too big for entire address space */
|
|
||||||
if (len > TASK_SIZE)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
do_color_align = 0;
|
|
||||||
if (filp || (flags & MAP_SHARED))
|
|
||||||
do_color_align = 1;
|
|
||||||
last_mmap = GET_LAST_MMAP(filp);
|
|
||||||
|
|
||||||
if (flags & MAP_FIXED) {
|
|
||||||
if ((flags & MAP_SHARED) && last_mmap &&
|
|
||||||
(addr - shared_align_offset(last_mmap, pgoff))
|
|
||||||
& (SHM_COLOUR - 1))
|
|
||||||
return -EINVAL;
|
|
||||||
goto found_addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* requesting a specific address */
|
|
||||||
if (addr) {
|
|
||||||
if (do_color_align && last_mmap)
|
|
||||||
addr = COLOR_ALIGN(addr, last_mmap, pgoff);
|
|
||||||
else
|
else
|
||||||
addr = PAGE_ALIGN(addr);
|
addr = PAGE_ALIGN(addr);
|
||||||
|
|
||||||
@@ -191,33 +136,49 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
|||||||
if (TASK_SIZE - len >= addr &&
|
if (TASK_SIZE - len >= addr &&
|
||||||
(!vma || addr + len <= vm_start_gap(vma)) &&
|
(!vma || addr + len <= vm_start_gap(vma)) &&
|
||||||
(!prev || addr >= vm_end_gap(prev)))
|
(!prev || addr >= vm_end_gap(prev)))
|
||||||
goto found_addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
|
||||||
info.length = len;
|
info.length = len;
|
||||||
info.low_limit = PAGE_SIZE;
|
info.align_mask = do_color_align ? (PAGE_MASK & (SHM_COLOUR - 1)) : 0;
|
||||||
info.high_limit = mm->mmap_base;
|
info.align_offset = shared_align_offset(filp_pgoff, pgoff);
|
||||||
info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR - 1)) : 0;
|
|
||||||
info.align_offset = shared_align_offset(last_mmap, pgoff);
|
|
||||||
addr = vm_unmapped_area(&info);
|
|
||||||
if (!(addr & ~PAGE_MASK))
|
|
||||||
goto found_addr;
|
|
||||||
VM_BUG_ON(addr != -ENOMEM);
|
|
||||||
|
|
||||||
/*
|
if (dir == DOWN) {
|
||||||
* A failed mmap() very likely causes application failure,
|
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
||||||
* so fall back to the bottom-up function here. This scenario
|
info.low_limit = PAGE_SIZE;
|
||||||
* can happen with large stack limits and large mmap()
|
info.high_limit = mm->mmap_base;
|
||||||
* allocations.
|
addr = vm_unmapped_area(&info);
|
||||||
*/
|
if (!(addr & ~PAGE_MASK))
|
||||||
return arch_get_unmapped_area(filp, addr0, len, pgoff, flags);
|
return addr;
|
||||||
|
VM_BUG_ON(addr != -ENOMEM);
|
||||||
|
|
||||||
found_addr:
|
/*
|
||||||
if (do_color_align && !last_mmap && !(addr & ~PAGE_MASK))
|
* A failed mmap() very likely causes application failure,
|
||||||
SET_LAST_MMAP(filp, addr - (pgoff << PAGE_SHIFT));
|
* so fall back to the bottom-up function here. This scenario
|
||||||
|
* can happen with large stack limits and large mmap()
|
||||||
|
* allocations.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
return addr;
|
info.flags = 0;
|
||||||
|
info.low_limit = mm->mmap_legacy_base;
|
||||||
|
info.high_limit = mmap_upper_limit(NULL);
|
||||||
|
return vm_unmapped_area(&info);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
||||||
|
unsigned long len, unsigned long pgoff, unsigned long flags)
|
||||||
|
{
|
||||||
|
return arch_get_unmapped_area_common(filp,
|
||||||
|
addr, len, pgoff, flags, UP);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long arch_get_unmapped_area_topdown(struct file *filp,
|
||||||
|
unsigned long addr, unsigned long len, unsigned long pgoff,
|
||||||
|
unsigned long flags)
|
||||||
|
{
|
||||||
|
return arch_get_unmapped_area_common(filp,
|
||||||
|
addr, len, pgoff, flags, DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmap_is_legacy(void)
|
static int mmap_is_legacy(void)
|
||||||
@@ -379,7 +340,7 @@ asmlinkage long parisc_fallocate(int fd, int mode, u32 offhi, u32 offlo,
|
|||||||
((u64)lenhi << 32) | lenlo);
|
((u64)lenhi << 32) | lenlo);
|
||||||
}
|
}
|
||||||
|
|
||||||
long parisc_personality(unsigned long personality)
|
asmlinkage long parisc_personality(unsigned long personality)
|
||||||
{
|
{
|
||||||
long err;
|
long err;
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
#ifndef _ASM_X86_SECTIONS_H
|
#ifndef _ASM_X86_SECTIONS_H
|
||||||
#define _ASM_X86_SECTIONS_H
|
#define _ASM_X86_SECTIONS_H
|
||||||
|
|
||||||
#define arch_is_kernel_initmem_freed arch_is_kernel_initmem_freed
|
|
||||||
|
|
||||||
#include <asm-generic/sections.h>
|
#include <asm-generic/sections.h>
|
||||||
#include <asm/extable.h>
|
#include <asm/extable.h>
|
||||||
|
|
||||||
@@ -18,20 +16,4 @@ extern char __end_of_kernel_reserve[];
|
|||||||
|
|
||||||
extern unsigned long _brk_start, _brk_end;
|
extern unsigned long _brk_start, _brk_end;
|
||||||
|
|
||||||
static inline bool arch_is_kernel_initmem_freed(unsigned long addr)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If _brk_start has not been cleared, brk allocation is incomplete,
|
|
||||||
* and we can not make assumptions about its use.
|
|
||||||
*/
|
|
||||||
if (_brk_start)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* After brk allocation is complete, space between _brk_end and _end
|
|
||||||
* is available for allocation.
|
|
||||||
*/
|
|
||||||
return addr >= _brk_end && addr < (unsigned long)&_end;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _ASM_X86_SECTIONS_H */
|
#endif /* _ASM_X86_SECTIONS_H */
|
||||||
|
|||||||
@@ -59,10 +59,6 @@ static int tzp;
|
|||||||
module_param(tzp, int, 0444);
|
module_param(tzp, int, 0444);
|
||||||
MODULE_PARM_DESC(tzp, "Thermal zone polling frequency, in 1/10 seconds.");
|
MODULE_PARM_DESC(tzp, "Thermal zone polling frequency, in 1/10 seconds.");
|
||||||
|
|
||||||
static int nocrt;
|
|
||||||
module_param(nocrt, int, 0);
|
|
||||||
MODULE_PARM_DESC(nocrt, "Set to take no action upon ACPI thermal zone critical trips points.");
|
|
||||||
|
|
||||||
static int off;
|
static int off;
|
||||||
module_param(off, int, 0);
|
module_param(off, int, 0);
|
||||||
MODULE_PARM_DESC(off, "Set to disable ACPI thermal support.");
|
MODULE_PARM_DESC(off, "Set to disable ACPI thermal support.");
|
||||||
@@ -1128,7 +1124,7 @@ static int thermal_act(const struct dmi_system_id *d) {
|
|||||||
static int thermal_nocrt(const struct dmi_system_id *d) {
|
static int thermal_nocrt(const struct dmi_system_id *d) {
|
||||||
pr_notice("%s detected: disabling all critical thermal trip point actions.\n",
|
pr_notice("%s detected: disabling all critical thermal trip point actions.\n",
|
||||||
d->ident);
|
d->ident);
|
||||||
nocrt = 1;
|
crt = -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int thermal_tzp(const struct dmi_system_id *d) {
|
static int thermal_tzp(const struct dmi_system_id *d) {
|
||||||
|
|||||||
@@ -416,6 +416,7 @@ int tb_switch_tmu_disable(struct tb_switch *sw)
|
|||||||
* mode.
|
* mode.
|
||||||
*/
|
*/
|
||||||
ret = tb_switch_tmu_rate_write(sw, TB_SWITCH_TMU_RATE_OFF);
|
ret = tb_switch_tmu_rate_write(sw, TB_SWITCH_TMU_RATE_OFF);
|
||||||
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
tb_port_tmu_time_sync_disable(up);
|
tb_port_tmu_time_sync_disable(up);
|
||||||
|
|||||||
@@ -39,6 +39,11 @@ bool module_init_section(const char *name);
|
|||||||
*/
|
*/
|
||||||
bool module_exit_section(const char *name);
|
bool module_exit_section(const char *name);
|
||||||
|
|
||||||
|
/* Describes whether within_module_init() will consider this an init section
|
||||||
|
* or not. This behaviour changes with CONFIG_MODULE_UNLOAD.
|
||||||
|
*/
|
||||||
|
bool module_init_layout_section(const char *sname);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Apply the given relocation to the (simplified) ELF. Return -error
|
* Apply the given relocation to the (simplified) ELF. Return -error
|
||||||
* or 0.
|
* or 0.
|
||||||
|
|||||||
@@ -72,6 +72,7 @@
|
|||||||
#include <linux/io_uring.h>
|
#include <linux/io_uring.h>
|
||||||
#include <linux/audit.h>
|
#include <linux/audit.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <asm/shmparam.h>
|
||||||
|
|
||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include <trace/events/io_uring.h>
|
#include <trace/events/io_uring.h>
|
||||||
@@ -3110,6 +3111,49 @@ static __cold int io_uring_mmap(struct file *file, struct vm_area_struct *vma)
|
|||||||
return remap_pfn_range(vma, vma->vm_start, pfn, sz, vma->vm_page_prot);
|
return remap_pfn_range(vma, vma->vm_start, pfn, sz, vma->vm_page_prot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned long io_uring_mmu_get_unmapped_area(struct file *filp,
|
||||||
|
unsigned long addr, unsigned long len,
|
||||||
|
unsigned long pgoff, unsigned long flags)
|
||||||
|
{
|
||||||
|
void *ptr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do not allow to map to user-provided address to avoid breaking the
|
||||||
|
* aliasing rules. Userspace is not able to guess the offset address of
|
||||||
|
* kernel kmalloc()ed memory area.
|
||||||
|
*/
|
||||||
|
if (addr)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ptr = io_uring_validate_mmap_request(filp, pgoff, len);
|
||||||
|
if (IS_ERR(ptr))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some architectures have strong cache aliasing requirements.
|
||||||
|
* For such architectures we need a coherent mapping which aliases
|
||||||
|
* kernel memory *and* userspace memory. To achieve that:
|
||||||
|
* - use a NULL file pointer to reference physical memory, and
|
||||||
|
* - use the kernel virtual address of the shared io_uring context
|
||||||
|
* (instead of the userspace-provided address, which has to be 0UL
|
||||||
|
* anyway).
|
||||||
|
* - use the same pgoff which the get_unmapped_area() uses to
|
||||||
|
* calculate the page colouring.
|
||||||
|
* For architectures without such aliasing requirements, the
|
||||||
|
* architecture will return any suitable mapping because addr is 0.
|
||||||
|
*/
|
||||||
|
filp = NULL;
|
||||||
|
flags |= MAP_SHARED;
|
||||||
|
pgoff = 0; /* has been translated to ptr above */
|
||||||
|
#ifdef SHM_COLOUR
|
||||||
|
addr = (uintptr_t) ptr;
|
||||||
|
pgoff = addr >> PAGE_SHIFT;
|
||||||
|
#else
|
||||||
|
addr = 0UL;
|
||||||
|
#endif
|
||||||
|
return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags);
|
||||||
|
}
|
||||||
|
|
||||||
#else /* !CONFIG_MMU */
|
#else /* !CONFIG_MMU */
|
||||||
|
|
||||||
static int io_uring_mmap(struct file *file, struct vm_area_struct *vma)
|
static int io_uring_mmap(struct file *file, struct vm_area_struct *vma)
|
||||||
@@ -3324,6 +3368,8 @@ static const struct file_operations io_uring_fops = {
|
|||||||
#ifndef CONFIG_MMU
|
#ifndef CONFIG_MMU
|
||||||
.get_unmapped_area = io_uring_nommu_get_unmapped_area,
|
.get_unmapped_area = io_uring_nommu_get_unmapped_area,
|
||||||
.mmap_capabilities = io_uring_nommu_mmap_capabilities,
|
.mmap_capabilities = io_uring_nommu_mmap_capabilities,
|
||||||
|
#else
|
||||||
|
.get_unmapped_area = io_uring_mmu_get_unmapped_area,
|
||||||
#endif
|
#endif
|
||||||
.poll = io_uring_poll,
|
.poll = io_uring_poll,
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
|
|||||||
@@ -188,16 +188,13 @@ static bool cleanup_symbol_name(char *s)
|
|||||||
|
|
||||||
static int compare_symbol_name(const char *name, char *namebuf)
|
static int compare_symbol_name(const char *name, char *namebuf)
|
||||||
{
|
{
|
||||||
int ret;
|
/* The kallsyms_seqs_of_names is sorted based on names after
|
||||||
|
* cleanup_symbol_name() (see scripts/kallsyms.c) if clang lto is enabled.
|
||||||
ret = strcmp(name, namebuf);
|
* To ensure correct bisection in kallsyms_lookup_names(), do
|
||||||
if (!ret)
|
* cleanup_symbol_name(namebuf) before comparing name and namebuf.
|
||||||
return ret;
|
*/
|
||||||
|
cleanup_symbol_name(namebuf);
|
||||||
if (cleanup_symbol_name(namebuf) && !strcmp(name, namebuf))
|
return strcmp(name, namebuf);
|
||||||
return 0;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kallsyms_lookup_names(const char *name,
|
static int kallsyms_lookup_names(const char *name,
|
||||||
|
|||||||
@@ -817,34 +817,26 @@ static int very_verbose(struct lock_class *class)
|
|||||||
* Is this the address of a static object:
|
* Is this the address of a static object:
|
||||||
*/
|
*/
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
/*
|
|
||||||
* Check if an address is part of freed initmem. After initmem is freed,
|
|
||||||
* memory can be allocated from it, and such allocations would then have
|
|
||||||
* addresses within the range [_stext, _end].
|
|
||||||
*/
|
|
||||||
#ifndef arch_is_kernel_initmem_freed
|
|
||||||
static int arch_is_kernel_initmem_freed(unsigned long addr)
|
|
||||||
{
|
|
||||||
if (system_state < SYSTEM_FREEING_INITMEM)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return init_section_contains((void *)addr, 1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int static_obj(const void *obj)
|
static int static_obj(const void *obj)
|
||||||
{
|
{
|
||||||
unsigned long start = (unsigned long) &_stext,
|
unsigned long addr = (unsigned long) obj;
|
||||||
end = (unsigned long) &_end,
|
|
||||||
addr = (unsigned long) obj;
|
|
||||||
|
|
||||||
if (arch_is_kernel_initmem_freed(addr))
|
if (is_kernel_core_data(addr))
|
||||||
return 0;
|
return 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* static variable?
|
* keys are allowed in the __ro_after_init section.
|
||||||
*/
|
*/
|
||||||
if ((addr >= start) && (addr < end))
|
if (is_kernel_rodata(addr))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* in initdata section and used during bootup only?
|
||||||
|
* NOTE: On some platforms the initdata section is
|
||||||
|
* outside of the _stext ... _end range.
|
||||||
|
*/
|
||||||
|
if (system_state < SYSTEM_FREEING_INITMEM &&
|
||||||
|
init_section_contains((void *)addr, 1))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -1437,7 +1437,7 @@ long module_get_offset(struct module *mod, unsigned int *size,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool module_init_layout_section(const char *sname)
|
bool module_init_layout_section(const char *sname)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_MODULE_UNLOAD
|
#ifndef CONFIG_MODULE_UNLOAD
|
||||||
if (module_exit_section(sname))
|
if (module_exit_section(sname))
|
||||||
|
|||||||
Reference in New Issue
Block a user