Merge tag 'v5.19-rc1' into android-mainline
Linux 5.19-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I6e605b4d992b9fad67a80f15f4532b0b28bd5733
This commit is contained in:
@@ -201,6 +201,8 @@ Jordan Crouse <jordan@cosmicpenguin.net> <jcrouse@codeaurora.org>
|
||||
<josh@joshtriplett.org> <josht@linux.vnet.ibm.com>
|
||||
<josh@joshtriplett.org> <josht@us.ibm.com>
|
||||
<josh@joshtriplett.org> <josht@vnet.ibm.com>
|
||||
Josh Poimboeuf <jpoimboe@kernel.org> <jpoimboe@redhat.com>
|
||||
Josh Poimboeuf <jpoimboe@kernel.org> <jpoimboe@us.ibm.com>
|
||||
Juha Yrjola <at solidboot.com>
|
||||
Juha Yrjola <juha.yrjola@nokia.com>
|
||||
Juha Yrjola <juha.yrjola@solidboot.com>
|
||||
|
||||
@@ -15,6 +15,7 @@ c) swapping in pages
|
||||
d) memory reclaim
|
||||
e) thrashing page cache
|
||||
f) direct compact
|
||||
g) write-protect copy
|
||||
|
||||
and makes these statistics available to userspace through
|
||||
the taskstats interface.
|
||||
@@ -48,7 +49,7 @@ this structure. See
|
||||
for a description of the fields pertaining to delay accounting.
|
||||
It will generally be in the form of counters returning the cumulative
|
||||
delay seen for cpu, sync block I/O, swapin, memory reclaim, thrash page
|
||||
cache, direct compact etc.
|
||||
cache, direct compact, write-protect copy etc.
|
||||
|
||||
Taking the difference of two successive readings of a given
|
||||
counter (say cpu_delay_total) for a task will give the delay
|
||||
@@ -117,6 +118,8 @@ Get sum of delays, since system boot, for all pids with tgid 5::
|
||||
0 0 0ms
|
||||
COMPACT count delay total delay average
|
||||
0 0 0ms
|
||||
WPCOPY count delay total delay average
|
||||
0 0 0ms
|
||||
|
||||
Get IO accounting for pid 1, it works only with -p::
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ Required properties:
|
||||
|
||||
For those SoCs that use SYST
|
||||
* "mediatek,mt8183-timer" for MT8183 compatible timers (SYST)
|
||||
* "mediatek,mt8186-timer" for MT8186 compatible timers (SYST)
|
||||
* "mediatek,mt8192-timer" for MT8192 compatible timers (SYST)
|
||||
* "mediatek,mt8195-timer" for MT8195 compatible timers (SYST)
|
||||
* "mediatek,mt7629-timer" for MT7629 compatible timers (SYST)
|
||||
|
||||
@@ -22009,6 +22009,13 @@ L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
F: mm/zbud.c
|
||||
|
||||
Z3FOLD COMPRESSED PAGE ALLOCATOR
|
||||
M: Vitaly Wool <vitaly.wool@konsulko.com>
|
||||
R: Miaohe Lin <linmiaohe@huawei.com>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
F: mm/z3fold.c
|
||||
|
||||
ZD1211RW WIRELESS DRIVER
|
||||
M: Ulrich Kunitz <kune@deine-taler.de>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 18
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION =
|
||||
EXTRAVERSION = -rc1
|
||||
NAME = Superb Owl
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -1048,6 +1048,10 @@ config HAVE_NOINSTR_HACK
|
||||
config HAVE_NOINSTR_VALIDATION
|
||||
bool
|
||||
|
||||
config HAVE_UACCESS_VALIDATION
|
||||
bool
|
||||
select OBJTOOL
|
||||
|
||||
config HAVE_STACK_VALIDATION
|
||||
bool
|
||||
help
|
||||
|
||||
+57
-61
@@ -41,11 +41,11 @@ config FORCE_DYNAMIC_FTRACE
|
||||
depends on FUNCTION_TRACER
|
||||
select DYNAMIC_FTRACE
|
||||
help
|
||||
We keep the static function tracing (!DYNAMIC_FTRACE) around
|
||||
in order to test the non static function tracing in the
|
||||
generic code, as other architectures still use it. But we
|
||||
only need to keep it around for x86_64. No need to keep it
|
||||
for x86_32. For x86_32, force DYNAMIC_FTRACE.
|
||||
We keep the static function tracing (!DYNAMIC_FTRACE) around
|
||||
in order to test the non static function tracing in the
|
||||
generic code, as other architectures still use it. But we
|
||||
only need to keep it around for x86_64. No need to keep it
|
||||
for x86_32. For x86_32, force DYNAMIC_FTRACE.
|
||||
#
|
||||
# Arch settings
|
||||
#
|
||||
@@ -258,6 +258,7 @@ config X86
|
||||
select HAVE_PREEMPT_DYNAMIC_CALL
|
||||
select HAVE_RSEQ
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_UACCESS_VALIDATION if HAVE_OBJTOOL
|
||||
select HAVE_UNSTABLE_SCHED_CLOCK
|
||||
select HAVE_USER_RETURN_NOTIFIER
|
||||
select HAVE_GENERIC_VDSO
|
||||
@@ -393,9 +394,9 @@ config CC_HAS_SANE_STACKPROTECTOR
|
||||
default $(success,$(srctree)/scripts/gcc-x86_64-has-stack-protector.sh $(CC)) if 64BIT
|
||||
default $(success,$(srctree)/scripts/gcc-x86_32-has-stack-protector.sh $(CC))
|
||||
help
|
||||
We have to make sure stack protector is unconditionally disabled if
|
||||
the compiler produces broken code or if it does not let us control
|
||||
the segment on 32-bit kernels.
|
||||
We have to make sure stack protector is unconditionally disabled if
|
||||
the compiler produces broken code or if it does not let us control
|
||||
the segment on 32-bit kernels.
|
||||
|
||||
menu "Processor type and features"
|
||||
|
||||
@@ -531,7 +532,7 @@ config X86_EXTENDED_PLATFORM
|
||||
|
||||
If you have one of these systems, or if you want to build a
|
||||
generic distribution kernel, say Y here - otherwise say N.
|
||||
endif
|
||||
endif # X86_32
|
||||
|
||||
if X86_64
|
||||
config X86_EXTENDED_PLATFORM
|
||||
@@ -550,7 +551,7 @@ config X86_EXTENDED_PLATFORM
|
||||
|
||||
If you have one of these systems, or if you want to build a
|
||||
generic distribution kernel, say Y here - otherwise say N.
|
||||
endif
|
||||
endif # X86_64
|
||||
# This is an alphabetically sorted list of 64 bit extended platforms
|
||||
# Please maintain the alphabetic order if and when there are additions
|
||||
config X86_NUMACHIP
|
||||
@@ -598,9 +599,9 @@ config X86_GOLDFISH
|
||||
bool "Goldfish (Virtual Platform)"
|
||||
depends on X86_EXTENDED_PLATFORM
|
||||
help
|
||||
Enable support for the Goldfish virtual platform used primarily
|
||||
for Android development. Unless you are building for the Android
|
||||
Goldfish emulator say N here.
|
||||
Enable support for the Goldfish virtual platform used primarily
|
||||
for Android development. Unless you are building for the Android
|
||||
Goldfish emulator say N here.
|
||||
|
||||
config X86_INTEL_CE
|
||||
bool "CE4100 TV platform"
|
||||
@@ -899,7 +900,7 @@ config INTEL_TDX_GUEST
|
||||
memory contents and CPU state. TDX guests are protected from
|
||||
some attacks from the VMM.
|
||||
|
||||
endif #HYPERVISOR_GUEST
|
||||
endif # HYPERVISOR_GUEST
|
||||
|
||||
source "arch/x86/Kconfig.cpu"
|
||||
|
||||
@@ -1166,16 +1167,16 @@ config X86_MCE_INTEL
|
||||
prompt "Intel MCE features"
|
||||
depends on X86_MCE && X86_LOCAL_APIC
|
||||
help
|
||||
Additional support for intel specific MCE features such as
|
||||
the thermal monitor.
|
||||
Additional support for intel specific MCE features such as
|
||||
the thermal monitor.
|
||||
|
||||
config X86_MCE_AMD
|
||||
def_bool y
|
||||
prompt "AMD MCE features"
|
||||
depends on X86_MCE && X86_LOCAL_APIC && AMD_NB
|
||||
help
|
||||
Additional support for AMD specific MCE features such as
|
||||
the DRAM Error Threshold.
|
||||
Additional support for AMD specific MCE features such as
|
||||
the DRAM Error Threshold.
|
||||
|
||||
config X86_ANCIENT_MCE
|
||||
bool "Support for old Pentium 5 / WinChip machine checks"
|
||||
@@ -1253,18 +1254,18 @@ config X86_VSYSCALL_EMULATION
|
||||
default y
|
||||
depends on X86_64
|
||||
help
|
||||
This enables emulation of the legacy vsyscall page. Disabling
|
||||
it is roughly equivalent to booting with vsyscall=none, except
|
||||
that it will also disable the helpful warning if a program
|
||||
tries to use a vsyscall. With this option set to N, offending
|
||||
programs will just segfault, citing addresses of the form
|
||||
0xffffffffff600?00.
|
||||
This enables emulation of the legacy vsyscall page. Disabling
|
||||
it is roughly equivalent to booting with vsyscall=none, except
|
||||
that it will also disable the helpful warning if a program
|
||||
tries to use a vsyscall. With this option set to N, offending
|
||||
programs will just segfault, citing addresses of the form
|
||||
0xffffffffff600?00.
|
||||
|
||||
This option is required by many programs built before 2013, and
|
||||
care should be used even with newer programs if set to N.
|
||||
This option is required by many programs built before 2013, and
|
||||
care should be used even with newer programs if set to N.
|
||||
|
||||
Disabling this option saves about 7K of kernel size and
|
||||
possibly 4K of additional runtime pagetable memory.
|
||||
Disabling this option saves about 7K of kernel size and
|
||||
possibly 4K of additional runtime pagetable memory.
|
||||
|
||||
config X86_IOPL_IOPERM
|
||||
bool "IOPERM and IOPL Emulation"
|
||||
@@ -1357,17 +1358,16 @@ config MICROCODE_AMD
|
||||
If you select this option, microcode patch loading support for AMD
|
||||
processors will be enabled.
|
||||
|
||||
config MICROCODE_OLD_INTERFACE
|
||||
bool "Ancient loading interface (DEPRECATED)"
|
||||
config MICROCODE_LATE_LOADING
|
||||
bool "Late microcode loading (DANGEROUS)"
|
||||
default n
|
||||
depends on MICROCODE
|
||||
help
|
||||
DO NOT USE THIS! This is the ancient /dev/cpu/microcode interface
|
||||
which was used by userspace tools like iucode_tool and microcode.ctl.
|
||||
It is inadequate because it runs too late to be able to properly
|
||||
load microcode on a machine and it needs special tools. Instead, you
|
||||
should've switched to the early loading method with the initrd or
|
||||
builtin microcode by now: Documentation/x86/microcode.rst
|
||||
Loading microcode late, when the system is up and executing instructions
|
||||
is a tricky business and should be avoided if possible. Just the sequence
|
||||
of synchronizing all cores and SMT threads is one fragile dance which does
|
||||
not guarantee that cores might not softlock after the loading. Therefore,
|
||||
use this at your own risk. Late loading taints the kernel too.
|
||||
|
||||
config X86_MSR
|
||||
tristate "/dev/cpu/*/msr - Model-specific register support"
|
||||
@@ -2001,15 +2001,15 @@ config EFI_MIXED
|
||||
bool "EFI mixed-mode support"
|
||||
depends on EFI_STUB && X86_64
|
||||
help
|
||||
Enabling this feature allows a 64-bit kernel to be booted
|
||||
on a 32-bit firmware, provided that your CPU supports 64-bit
|
||||
mode.
|
||||
Enabling this feature allows a 64-bit kernel to be booted
|
||||
on a 32-bit firmware, provided that your CPU supports 64-bit
|
||||
mode.
|
||||
|
||||
Note that it is not possible to boot a mixed-mode enabled
|
||||
kernel via the EFI boot stub - a bootloader that supports
|
||||
the EFI handover protocol must be used.
|
||||
Note that it is not possible to boot a mixed-mode enabled
|
||||
kernel via the EFI boot stub - a bootloader that supports
|
||||
the EFI handover protocol must be used.
|
||||
|
||||
If unsure, say N.
|
||||
If unsure, say N.
|
||||
|
||||
source "kernel/Kconfig.hz"
|
||||
|
||||
@@ -2234,16 +2234,16 @@ config RANDOMIZE_MEMORY
|
||||
select DYNAMIC_MEMORY_LAYOUT
|
||||
default RANDOMIZE_BASE
|
||||
help
|
||||
Randomizes the base virtual address of kernel memory sections
|
||||
(physical memory mapping, vmalloc & vmemmap). This security feature
|
||||
makes exploits relying on predictable memory locations less reliable.
|
||||
Randomizes the base virtual address of kernel memory sections
|
||||
(physical memory mapping, vmalloc & vmemmap). This security feature
|
||||
makes exploits relying on predictable memory locations less reliable.
|
||||
|
||||
The order of allocations remains unchanged. Entropy is generated in
|
||||
the same way as RANDOMIZE_BASE. Current implementation in the optimal
|
||||
configuration have in average 30,000 different possible virtual
|
||||
addresses for each memory section.
|
||||
The order of allocations remains unchanged. Entropy is generated in
|
||||
the same way as RANDOMIZE_BASE. Current implementation in the optimal
|
||||
configuration have in average 30,000 different possible virtual
|
||||
addresses for each memory section.
|
||||
|
||||
If unsure, say Y.
|
||||
If unsure, say Y.
|
||||
|
||||
config RANDOMIZE_MEMORY_PHYSICAL_PADDING
|
||||
hex "Physical memory mapping padding" if EXPERT
|
||||
@@ -2253,12 +2253,12 @@ config RANDOMIZE_MEMORY_PHYSICAL_PADDING
|
||||
range 0x1 0x40 if MEMORY_HOTPLUG
|
||||
range 0x0 0x40
|
||||
help
|
||||
Define the padding in terabytes added to the existing physical
|
||||
memory size during kernel memory randomization. It is useful
|
||||
for memory hotplug support but reduces the entropy available for
|
||||
address randomization.
|
||||
Define the padding in terabytes added to the existing physical
|
||||
memory size during kernel memory randomization. It is useful
|
||||
for memory hotplug support but reduces the entropy available for
|
||||
address randomization.
|
||||
|
||||
If unsure, leave at the default value.
|
||||
If unsure, leave at the default value.
|
||||
|
||||
config HOTPLUG_CPU
|
||||
def_bool y
|
||||
@@ -2605,7 +2605,6 @@ source "drivers/idle/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
menu "Bus options (PCI etc.)"
|
||||
|
||||
choice
|
||||
@@ -2829,7 +2828,6 @@ config AMD_NB
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
menu "Binary Emulations"
|
||||
|
||||
config IA32_EMULATION
|
||||
@@ -2867,14 +2865,12 @@ config COMPAT
|
||||
def_bool y
|
||||
depends on IA32_EMULATION || X86_X32_ABI
|
||||
|
||||
if COMPAT
|
||||
config COMPAT_FOR_U64_ALIGNMENT
|
||||
def_bool y
|
||||
endif
|
||||
depends on COMPAT
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
config HAVE_ATOMIC_IOMAP
|
||||
def_bool y
|
||||
depends on X86_32
|
||||
|
||||
+14
-15
@@ -73,20 +73,19 @@ config DEBUG_TLBFLUSH
|
||||
bool "Set upper limit of TLB entries to flush one-by-one"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
X86-only for now.
|
||||
|
||||
X86-only for now.
|
||||
This option allows the user to tune the amount of TLB entries the
|
||||
kernel flushes one-by-one instead of doing a full TLB flush. In
|
||||
certain situations, the former is cheaper. This is controlled by the
|
||||
tlb_flushall_shift knob under /sys/kernel/debug/x86. If you set it
|
||||
to -1, the code flushes the whole TLB unconditionally. Otherwise,
|
||||
for positive values of it, the kernel will use single TLB entry
|
||||
invalidating instructions according to the following formula:
|
||||
|
||||
This option allows the user to tune the amount of TLB entries the
|
||||
kernel flushes one-by-one instead of doing a full TLB flush. In
|
||||
certain situations, the former is cheaper. This is controlled by the
|
||||
tlb_flushall_shift knob under /sys/kernel/debug/x86. If you set it
|
||||
to -1, the code flushes the whole TLB unconditionally. Otherwise,
|
||||
for positive values of it, the kernel will use single TLB entry
|
||||
invalidating instructions according to the following formula:
|
||||
flush_entries <= active_tlb_entries / 2^tlb_flushall_shift
|
||||
|
||||
flush_entries <= active_tlb_entries / 2^tlb_flushall_shift
|
||||
|
||||
If in doubt, say "N".
|
||||
If in doubt, say "N".
|
||||
|
||||
config IOMMU_DEBUG
|
||||
bool "Enable IOMMU debugging"
|
||||
@@ -119,10 +118,10 @@ config X86_DECODER_SELFTEST
|
||||
depends on DEBUG_KERNEL && INSTRUCTION_DECODER
|
||||
depends on !COMPILE_TEST
|
||||
help
|
||||
Perform x86 instruction decoder selftests at build time.
|
||||
This option is useful for checking the sanity of x86 instruction
|
||||
decoder code.
|
||||
If unsure, say "N".
|
||||
Perform x86 instruction decoder selftests at build time.
|
||||
This option is useful for checking the sanity of x86 instruction
|
||||
decoder code.
|
||||
If unsure, say "N".
|
||||
|
||||
choice
|
||||
prompt "IO delay type"
|
||||
|
||||
@@ -6,24 +6,24 @@ config PERF_EVENTS_INTEL_UNCORE
|
||||
depends on PERF_EVENTS && CPU_SUP_INTEL && PCI
|
||||
default y
|
||||
help
|
||||
Include support for Intel uncore performance events. These are
|
||||
available on NehalemEX and more modern processors.
|
||||
Include support for Intel uncore performance events. These are
|
||||
available on NehalemEX and more modern processors.
|
||||
|
||||
config PERF_EVENTS_INTEL_RAPL
|
||||
tristate "Intel/AMD rapl performance events"
|
||||
depends on PERF_EVENTS && (CPU_SUP_INTEL || CPU_SUP_AMD) && PCI
|
||||
default y
|
||||
help
|
||||
Include support for Intel and AMD rapl performance events for power
|
||||
monitoring on modern processors.
|
||||
Include support for Intel and AMD rapl performance events for power
|
||||
monitoring on modern processors.
|
||||
|
||||
config PERF_EVENTS_INTEL_CSTATE
|
||||
tristate "Intel cstate performance events"
|
||||
depends on PERF_EVENTS && CPU_SUP_INTEL && PCI
|
||||
default y
|
||||
help
|
||||
Include support for Intel cstate performance events for power
|
||||
monitoring on modern processors.
|
||||
Include support for Intel cstate performance events for power
|
||||
monitoring on modern processors.
|
||||
|
||||
config PERF_EVENTS_AMD_POWER
|
||||
depends on PERF_EVENTS && CPU_SUP_AMD
|
||||
|
||||
@@ -276,7 +276,7 @@ static struct event_constraint intel_icl_event_constraints[] = {
|
||||
INTEL_EVENT_CONSTRAINT_RANGE(0x03, 0x0a, 0xf),
|
||||
INTEL_EVENT_CONSTRAINT_RANGE(0x1f, 0x28, 0xf),
|
||||
INTEL_EVENT_CONSTRAINT(0x32, 0xf), /* SW_PREFETCH_ACCESS.* */
|
||||
INTEL_EVENT_CONSTRAINT_RANGE(0x48, 0x54, 0xf),
|
||||
INTEL_EVENT_CONSTRAINT_RANGE(0x48, 0x56, 0xf),
|
||||
INTEL_EVENT_CONSTRAINT_RANGE(0x60, 0x8b, 0xf),
|
||||
INTEL_UEVENT_CONSTRAINT(0x04a3, 0xff), /* CYCLE_ACTIVITY.STALLS_TOTAL */
|
||||
INTEL_UEVENT_CONSTRAINT(0x10a3, 0xff), /* CYCLE_ACTIVITY.CYCLES_MEM_ANY */
|
||||
|
||||
@@ -54,7 +54,7 @@ extern const char * const x86_power_flags[32];
|
||||
extern const char * const x86_bug_flags[NBUGINTS*32];
|
||||
|
||||
#define test_cpu_cap(c, bit) \
|
||||
test_bit(bit, (unsigned long *)((c)->x86_capability))
|
||||
arch_test_bit(bit, (unsigned long *)((c)->x86_capability))
|
||||
|
||||
/*
|
||||
* There are 32 bits/features in each mask word. The high bits
|
||||
|
||||
@@ -42,9 +42,13 @@ extern int ex_get_fixup_type(unsigned long ip);
|
||||
extern void early_fixup_exception(struct pt_regs *regs, int trapnr);
|
||||
|
||||
#ifdef CONFIG_X86_MCE
|
||||
extern void ex_handler_msr_mce(struct pt_regs *regs, bool wrmsr);
|
||||
extern void __noreturn ex_handler_msr_mce(struct pt_regs *regs, bool wrmsr);
|
||||
#else
|
||||
static inline void ex_handler_msr_mce(struct pt_regs *regs, bool wrmsr) { }
|
||||
static inline void __noreturn ex_handler_msr_mce(struct pt_regs *regs, bool wrmsr)
|
||||
{
|
||||
for (;;)
|
||||
cpu_relax();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BPF_JIT) && defined(CONFIG_X86_64)
|
||||
|
||||
@@ -559,7 +559,7 @@ static __always_inline void native_swapgs(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline unsigned long current_top_of_stack(void)
|
||||
static __always_inline unsigned long current_top_of_stack(void)
|
||||
{
|
||||
/*
|
||||
* We can't read directly from tss.sp0: sp0 on x86_32 is special in
|
||||
@@ -569,7 +569,7 @@ static inline unsigned long current_top_of_stack(void)
|
||||
return this_cpu_read_stable(cpu_current_top_of_stack);
|
||||
}
|
||||
|
||||
static inline bool on_thread_stack(void)
|
||||
static __always_inline bool on_thread_stack(void)
|
||||
{
|
||||
return (unsigned long)(current_top_of_stack() -
|
||||
current_stack_pointer) < THREAD_SIZE;
|
||||
|
||||
@@ -2222,6 +2222,7 @@ void cpu_init_secondary(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MICROCODE_LATE_LOADING
|
||||
/*
|
||||
* The microcode loader calls this upon late microcode load to recheck features,
|
||||
* only when microcode has been updated. Caller holds microcode_mutex and CPU
|
||||
@@ -2251,6 +2252,7 @@ void microcode_check(void)
|
||||
pr_warn("x86/CPU: CPU features have changed after loading microcode, but might not take effect.\n");
|
||||
pr_warn("x86/CPU: Please consider either early loading through initrd/built-in or a potential BIOS update.\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Invoked from core CPU hotplug code after hotplug operations
|
||||
|
||||
@@ -373,101 +373,10 @@ static int apply_microcode_on_target(int cpu)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MICROCODE_OLD_INTERFACE
|
||||
static int do_microcode_update(const void __user *buf, size_t size)
|
||||
{
|
||||
int error = 0;
|
||||
int cpu;
|
||||
|
||||
for_each_online_cpu(cpu) {
|
||||
struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
|
||||
enum ucode_state ustate;
|
||||
|
||||
if (!uci->valid)
|
||||
continue;
|
||||
|
||||
ustate = microcode_ops->request_microcode_user(cpu, buf, size);
|
||||
if (ustate == UCODE_ERROR) {
|
||||
error = -1;
|
||||
break;
|
||||
} else if (ustate == UCODE_NEW) {
|
||||
apply_microcode_on_target(cpu);
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int microcode_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return capable(CAP_SYS_RAWIO) ? stream_open(inode, file) : -EPERM;
|
||||
}
|
||||
|
||||
static ssize_t microcode_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
ssize_t ret = -EINVAL;
|
||||
unsigned long nr_pages = totalram_pages();
|
||||
|
||||
if ((len >> PAGE_SHIFT) > nr_pages) {
|
||||
pr_err("too much data (max %ld pages)\n", nr_pages);
|
||||
return ret;
|
||||
}
|
||||
|
||||
cpus_read_lock();
|
||||
mutex_lock(µcode_mutex);
|
||||
|
||||
if (do_microcode_update(buf, len) == 0)
|
||||
ret = (ssize_t)len;
|
||||
|
||||
if (ret > 0)
|
||||
perf_check_microcode();
|
||||
|
||||
mutex_unlock(µcode_mutex);
|
||||
cpus_read_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct file_operations microcode_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.write = microcode_write,
|
||||
.open = microcode_open,
|
||||
.llseek = no_llseek,
|
||||
};
|
||||
|
||||
static struct miscdevice microcode_dev = {
|
||||
.minor = MICROCODE_MINOR,
|
||||
.name = "microcode",
|
||||
.nodename = "cpu/microcode",
|
||||
.fops = µcode_fops,
|
||||
};
|
||||
|
||||
static int __init microcode_dev_init(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = misc_register(µcode_dev);
|
||||
if (error) {
|
||||
pr_err("can't misc_register on minor=%d\n", MICROCODE_MINOR);
|
||||
return error;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit microcode_dev_exit(void)
|
||||
{
|
||||
misc_deregister(µcode_dev);
|
||||
}
|
||||
#else
|
||||
#define microcode_dev_init() 0
|
||||
#define microcode_dev_exit() do { } while (0)
|
||||
#endif
|
||||
|
||||
/* fake device for request_firmware */
|
||||
static struct platform_device *microcode_pdev;
|
||||
|
||||
#ifdef CONFIG_MICROCODE_LATE_LOADING
|
||||
/*
|
||||
* Late loading dance. Why the heavy-handed stomp_machine effort?
|
||||
*
|
||||
@@ -584,6 +493,9 @@ static int microcode_reload_late(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
pr_err("Attempting late microcode loading - it is dangerous and taints the kernel.\n");
|
||||
pr_err("You should switch to early loading, if possible.\n");
|
||||
|
||||
atomic_set(&late_cpus_in, 0);
|
||||
atomic_set(&late_cpus_out, 0);
|
||||
|
||||
@@ -632,9 +544,14 @@ put:
|
||||
if (ret == 0)
|
||||
ret = size;
|
||||
|
||||
add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_WO(reload);
|
||||
#endif
|
||||
|
||||
static ssize_t version_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
@@ -651,7 +568,6 @@ static ssize_t pf_show(struct device *dev,
|
||||
return sprintf(buf, "0x%x\n", uci->cpu_sig.pf);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_WO(reload);
|
||||
static DEVICE_ATTR(version, 0444, version_show, NULL);
|
||||
static DEVICE_ATTR(processor_flags, 0444, pf_show, NULL);
|
||||
|
||||
@@ -804,7 +720,9 @@ static int mc_cpu_down_prep(unsigned int cpu)
|
||||
}
|
||||
|
||||
static struct attribute *cpu_root_microcode_attrs[] = {
|
||||
#ifdef CONFIG_MICROCODE_LATE_LOADING
|
||||
&dev_attr_reload.attr,
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -838,10 +756,7 @@ static int __init microcode_init(void)
|
||||
|
||||
cpus_read_lock();
|
||||
mutex_lock(µcode_mutex);
|
||||
|
||||
error = subsys_interface_register(&mc_cpu_interface);
|
||||
if (!error)
|
||||
perf_check_microcode();
|
||||
mutex_unlock(µcode_mutex);
|
||||
cpus_read_unlock();
|
||||
|
||||
@@ -856,10 +771,6 @@ static int __init microcode_init(void)
|
||||
goto out_driver;
|
||||
}
|
||||
|
||||
error = microcode_dev_init();
|
||||
if (error)
|
||||
goto out_ucode_group;
|
||||
|
||||
register_syscore_ops(&mc_syscore_ops);
|
||||
cpuhp_setup_state_nocalls(CPUHP_AP_MICROCODE_LOADER, "x86/microcode:starting",
|
||||
mc_cpu_starting, NULL);
|
||||
@@ -870,10 +781,6 @@ static int __init microcode_init(void)
|
||||
|
||||
return 0;
|
||||
|
||||
out_ucode_group:
|
||||
sysfs_remove_group(&cpu_subsys.dev_root->kobj,
|
||||
&cpu_root_microcode_group);
|
||||
|
||||
out_driver:
|
||||
cpus_read_lock();
|
||||
mutex_lock(µcode_mutex);
|
||||
|
||||
@@ -152,7 +152,7 @@ static int __sgx_encl_eldu(struct sgx_encl_page *encl_page,
|
||||
|
||||
page_pcmd_off = sgx_encl_get_backing_page_pcmd_offset(encl, page_index);
|
||||
|
||||
ret = sgx_encl_get_backing(encl, page_index, &b);
|
||||
ret = sgx_encl_lookup_backing(encl, page_index, &b);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -718,7 +718,7 @@ static struct page *sgx_encl_get_backing_page(struct sgx_encl *encl,
|
||||
* 0 on success,
|
||||
* -errno otherwise.
|
||||
*/
|
||||
int sgx_encl_get_backing(struct sgx_encl *encl, unsigned long page_index,
|
||||
static int sgx_encl_get_backing(struct sgx_encl *encl, unsigned long page_index,
|
||||
struct sgx_backing *backing)
|
||||
{
|
||||
pgoff_t page_pcmd_off = sgx_encl_get_backing_page_pcmd_offset(encl, page_index);
|
||||
@@ -743,6 +743,107 @@ int sgx_encl_get_backing(struct sgx_encl *encl, unsigned long page_index,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* When called from ksgxd, returns the mem_cgroup of a struct mm stored
|
||||
* in the enclave's mm_list. When not called from ksgxd, just returns
|
||||
* the mem_cgroup of the current task.
|
||||
*/
|
||||
static struct mem_cgroup *sgx_encl_get_mem_cgroup(struct sgx_encl *encl)
|
||||
{
|
||||
struct mem_cgroup *memcg = NULL;
|
||||
struct sgx_encl_mm *encl_mm;
|
||||
int idx;
|
||||
|
||||
/*
|
||||
* If called from normal task context, return the mem_cgroup
|
||||
* of the current task's mm. The remainder of the handling is for
|
||||
* ksgxd.
|
||||
*/
|
||||
if (!current_is_ksgxd())
|
||||
return get_mem_cgroup_from_mm(current->mm);
|
||||
|
||||
/*
|
||||
* Search the enclave's mm_list to find an mm associated with
|
||||
* this enclave to charge the allocation to.
|
||||
*/
|
||||
idx = srcu_read_lock(&encl->srcu);
|
||||
|
||||
list_for_each_entry_rcu(encl_mm, &encl->mm_list, list) {
|
||||
if (!mmget_not_zero(encl_mm->mm))
|
||||
continue;
|
||||
|
||||
memcg = get_mem_cgroup_from_mm(encl_mm->mm);
|
||||
|
||||
mmput_async(encl_mm->mm);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
srcu_read_unlock(&encl->srcu, idx);
|
||||
|
||||
/*
|
||||
* In the rare case that there isn't an mm associated with
|
||||
* the enclave, set memcg to the current active mem_cgroup.
|
||||
* This will be the root mem_cgroup if there is no active
|
||||
* mem_cgroup.
|
||||
*/
|
||||
if (!memcg)
|
||||
return get_mem_cgroup_from_mm(NULL);
|
||||
|
||||
return memcg;
|
||||
}
|
||||
|
||||
/**
|
||||
* sgx_encl_alloc_backing() - allocate a new backing storage page
|
||||
* @encl: an enclave pointer
|
||||
* @page_index: enclave page index
|
||||
* @backing: data for accessing backing storage for the page
|
||||
*
|
||||
* When called from ksgxd, sets the active memcg from one of the
|
||||
* mms in the enclave's mm_list prior to any backing page allocation,
|
||||
* in order to ensure that shmem page allocations are charged to the
|
||||
* enclave.
|
||||
*
|
||||
* Return:
|
||||
* 0 on success,
|
||||
* -errno otherwise.
|
||||
*/
|
||||
int sgx_encl_alloc_backing(struct sgx_encl *encl, unsigned long page_index,
|
||||
struct sgx_backing *backing)
|
||||
{
|
||||
struct mem_cgroup *encl_memcg = sgx_encl_get_mem_cgroup(encl);
|
||||
struct mem_cgroup *memcg = set_active_memcg(encl_memcg);
|
||||
int ret;
|
||||
|
||||
ret = sgx_encl_get_backing(encl, page_index, backing);
|
||||
|
||||
set_active_memcg(memcg);
|
||||
mem_cgroup_put(encl_memcg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* sgx_encl_lookup_backing() - retrieve an existing backing storage page
|
||||
* @encl: an enclave pointer
|
||||
* @page_index: enclave page index
|
||||
* @backing: data for accessing backing storage for the page
|
||||
*
|
||||
* Retrieve a backing page for loading data back into an EPC page with ELDU.
|
||||
* It is the caller's responsibility to ensure that it is appropriate to use
|
||||
* sgx_encl_lookup_backing() rather than sgx_encl_alloc_backing(). If lookup is
|
||||
* not used correctly, this will cause an allocation which is not accounted for.
|
||||
*
|
||||
* Return:
|
||||
* 0 on success,
|
||||
* -errno otherwise.
|
||||
*/
|
||||
int sgx_encl_lookup_backing(struct sgx_encl *encl, unsigned long page_index,
|
||||
struct sgx_backing *backing)
|
||||
{
|
||||
return sgx_encl_get_backing(encl, page_index, backing);
|
||||
}
|
||||
|
||||
/**
|
||||
* sgx_encl_put_backing() - Unpin the backing storage
|
||||
* @backing: data for accessing backing storage for the page
|
||||
|
||||
@@ -103,10 +103,13 @@ static inline int sgx_encl_find(struct mm_struct *mm, unsigned long addr,
|
||||
int sgx_encl_may_map(struct sgx_encl *encl, unsigned long start,
|
||||
unsigned long end, unsigned long vm_flags);
|
||||
|
||||
bool current_is_ksgxd(void);
|
||||
void sgx_encl_release(struct kref *ref);
|
||||
int sgx_encl_mm_add(struct sgx_encl *encl, struct mm_struct *mm);
|
||||
int sgx_encl_get_backing(struct sgx_encl *encl, unsigned long page_index,
|
||||
struct sgx_backing *backing);
|
||||
int sgx_encl_lookup_backing(struct sgx_encl *encl, unsigned long page_index,
|
||||
struct sgx_backing *backing);
|
||||
int sgx_encl_alloc_backing(struct sgx_encl *encl, unsigned long page_index,
|
||||
struct sgx_backing *backing);
|
||||
void sgx_encl_put_backing(struct sgx_backing *backing);
|
||||
int sgx_encl_test_and_clear_young(struct mm_struct *mm,
|
||||
struct sgx_encl_page *page);
|
||||
|
||||
@@ -313,7 +313,7 @@ static void sgx_reclaimer_write(struct sgx_epc_page *epc_page,
|
||||
sgx_encl_put_backing(backing);
|
||||
|
||||
if (!encl->secs_child_cnt && test_bit(SGX_ENCL_INITIALIZED, &encl->flags)) {
|
||||
ret = sgx_encl_get_backing(encl, PFN_DOWN(encl->size),
|
||||
ret = sgx_encl_alloc_backing(encl, PFN_DOWN(encl->size),
|
||||
&secs_backing);
|
||||
if (ret)
|
||||
goto out;
|
||||
@@ -384,7 +384,7 @@ static void sgx_reclaim_pages(void)
|
||||
page_index = PFN_DOWN(encl_page->desc - encl_page->encl->base);
|
||||
|
||||
mutex_lock(&encl_page->encl->lock);
|
||||
ret = sgx_encl_get_backing(encl_page->encl, page_index, &backing[i]);
|
||||
ret = sgx_encl_alloc_backing(encl_page->encl, page_index, &backing[i]);
|
||||
if (ret) {
|
||||
mutex_unlock(&encl_page->encl->lock);
|
||||
goto skip;
|
||||
@@ -475,6 +475,11 @@ static bool __init sgx_page_reclaimer_init(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool current_is_ksgxd(void)
|
||||
{
|
||||
return current == ksgxd_tsk;
|
||||
}
|
||||
|
||||
static struct sgx_epc_page *__sgx_alloc_epc_page_from_node(int nid)
|
||||
{
|
||||
struct sgx_numa_node *node = &sgx_numa_nodes[nid];
|
||||
|
||||
@@ -376,9 +376,6 @@ void machine_kexec(struct kimage *image)
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
void *arch_kexec_kernel_image_load(struct kimage *image)
|
||||
{
|
||||
vfree(image->elf_headers);
|
||||
image->elf_headers = NULL;
|
||||
|
||||
if (!image->fops || !image->fops->load)
|
||||
return ERR_PTR(-ENOEXEC);
|
||||
|
||||
@@ -514,6 +511,15 @@ overflow:
|
||||
(int)ELF64_R_TYPE(rel[i].r_info), value);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
int arch_kimage_file_post_load_cleanup(struct kimage *image)
|
||||
{
|
||||
vfree(image->elf_headers);
|
||||
image->elf_headers = NULL;
|
||||
image->elf_headers_sz = 0;
|
||||
|
||||
return kexec_image_post_load_cleanup_default(image);
|
||||
}
|
||||
#endif /* CONFIG_KEXEC_FILE */
|
||||
|
||||
static int
|
||||
|
||||
@@ -903,18 +903,18 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
#ifdef CONFIG_CMDLINE_BOOL
|
||||
#ifdef CONFIG_CMDLINE_OVERRIDE
|
||||
strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
|
||||
strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
|
||||
#else
|
||||
if (builtin_cmdline[0]) {
|
||||
/* append boot loader cmdline to builtin */
|
||||
strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
|
||||
strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
|
||||
strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
|
||||
strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
|
||||
strscpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
|
||||
*cmdline_p = command_line;
|
||||
|
||||
/*
|
||||
|
||||
@@ -6219,7 +6219,7 @@ static noinstr void vmx_l1d_flush(struct kvm_vcpu *vcpu)
|
||||
int size = PAGE_SIZE << L1D_CACHE_ORDER;
|
||||
|
||||
/*
|
||||
* This code is only executed when the the flush mode is 'cond' or
|
||||
* This code is only executed when the flush mode is 'cond' or
|
||||
* 'always'
|
||||
*/
|
||||
if (static_branch_likely(&vmx_l1d_flush_cond)) {
|
||||
|
||||
+1
-1
@@ -11937,7 +11937,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
|
||||
if (current->mm == kvm->mm) {
|
||||
/*
|
||||
* Free memory regions allocated on behalf of userspace,
|
||||
* unless the the memory map has changed due to process exit
|
||||
* unless the memory map has changed due to process exit
|
||||
* or fd copying.
|
||||
*/
|
||||
mutex_lock(&kvm->slots_lock);
|
||||
|
||||
@@ -1240,8 +1240,8 @@ remove_pagetable(unsigned long start, unsigned long end, bool direct,
|
||||
void __ref vmemmap_free(unsigned long start, unsigned long end,
|
||||
struct vmem_altmap *altmap)
|
||||
{
|
||||
VM_BUG_ON(!IS_ALIGNED(start, PAGE_SIZE));
|
||||
VM_BUG_ON(!IS_ALIGNED(end, PAGE_SIZE));
|
||||
VM_BUG_ON(!PAGE_ALIGNED(start));
|
||||
VM_BUG_ON(!PAGE_ALIGNED(end));
|
||||
|
||||
remove_pagetable(start, end, false, altmap);
|
||||
}
|
||||
@@ -1605,8 +1605,8 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
|
||||
{
|
||||
int err;
|
||||
|
||||
VM_BUG_ON(!IS_ALIGNED(start, PAGE_SIZE));
|
||||
VM_BUG_ON(!IS_ALIGNED(end, PAGE_SIZE));
|
||||
VM_BUG_ON(!PAGE_ALIGNED(start));
|
||||
VM_BUG_ON(!PAGE_ALIGNED(end));
|
||||
|
||||
if (end - start < PAGES_PER_SECTION * sizeof(struct page))
|
||||
err = vmemmap_populate_basepages(start, end, node, NULL);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* The below thunking functions are only used after ExitBootServices()
|
||||
* has been called. This simplifies things considerably as compared with
|
||||
* the early EFI thunking because we can leave all the kernel state
|
||||
* intact (GDT, IDT, etc) and simply invoke the the 32-bit EFI runtime
|
||||
* intact (GDT, IDT, etc) and simply invoke the 32-bit EFI runtime
|
||||
* services from __KERNEL32_CS. This means we can continue to service
|
||||
* interrupts across an EFI mixed mode call.
|
||||
*
|
||||
|
||||
@@ -80,7 +80,7 @@ config IXP4XX_TIMER
|
||||
bool "Intel XScale IXP4xx timer driver" if COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
select CLKSRC_MMIO
|
||||
select TIMER_OF if OF
|
||||
select TIMER_OF
|
||||
help
|
||||
Enables support for the Intel XScale IXP4xx SoC timer.
|
||||
|
||||
|
||||
@@ -1,15 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Broadcom Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation version 2.
|
||||
*
|
||||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
||||
* kind, whether express or implied; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Copyright (C) 2012 Broadcom Corporation
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* J-Core SoC PIT/clocksource driver
|
||||
*
|
||||
* Copyright (C) 2015-2016 Smart Energy Instruments, Inc.
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
|
||||
|
||||
#define pr_fmt(fmt) "mips-gic-timer: " fmt
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Marvell Armada 370/XP SoC timer handling.
|
||||
*
|
||||
@@ -7,10 +8,6 @@
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*
|
||||
* Timer 0 is used as free-running clocksource, while timer 1 is
|
||||
* used as clock_event_device.
|
||||
*
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Conexant Digicolor timer driver
|
||||
*
|
||||
@@ -11,10 +12,6 @@
|
||||
* Copyright (C) 2013 Maxime Ripard
|
||||
*
|
||||
* Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
@@ -19,8 +19,6 @@
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
/* Goes away with OF conversion */
|
||||
#include <linux/platform_data/timer-ixp4xx.h>
|
||||
|
||||
/*
|
||||
* Constants to make it easy to access Timer Control/Status registers
|
||||
@@ -263,28 +261,6 @@ static struct platform_driver ixp4xx_timer_driver = {
|
||||
};
|
||||
builtin_platform_driver(ixp4xx_timer_driver);
|
||||
|
||||
/**
|
||||
* ixp4xx_timer_setup() - Timer setup function to be called from boardfiles
|
||||
* @timerbase: physical base of timer block
|
||||
* @timer_irq: Linux IRQ number for the timer
|
||||
* @timer_freq: Fixed frequency of the timer
|
||||
*/
|
||||
void __init ixp4xx_timer_setup(resource_size_t timerbase,
|
||||
int timer_irq,
|
||||
unsigned int timer_freq)
|
||||
{
|
||||
void __iomem *base;
|
||||
|
||||
base = ioremap(timerbase, 0x100);
|
||||
if (!base) {
|
||||
pr_crit("IXP4xx: can't remap timer\n");
|
||||
return;
|
||||
}
|
||||
ixp4xx_timer_register(base, timer_irq, timer_freq);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ixp4xx_timer_setup);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static __init int ixp4xx_of_timer_init(struct device_node *np)
|
||||
{
|
||||
void __iomem *base;
|
||||
@@ -315,4 +291,3 @@ out_unmap:
|
||||
return ret;
|
||||
}
|
||||
TIMER_OF_DECLARE(ixp4xx, "intel,ixp4xx-timer", ixp4xx_of_timer_init);
|
||||
#endif
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Clocksource driver for NXP LPC32xx/18xx/43xx timer
|
||||
*
|
||||
@@ -6,11 +7,6 @@
|
||||
* Based on:
|
||||
* time-efm32 Copyright (C) 2013 Pengutronix
|
||||
* mach-lpc32xx/timer.c Copyright (C) 2009 - 2010 NXP Semiconductors
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "%s: " fmt, __func__
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Marvell Orion SoC timer handling.
|
||||
*
|
||||
* Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*
|
||||
* Timer 0 is used as free-running clocksource, while timer 1 is
|
||||
* used as clock_event_device.
|
||||
*/
|
||||
|
||||
@@ -236,7 +236,7 @@ static int __init oxnas_rps_timer_init(struct device_node *np)
|
||||
}
|
||||
|
||||
rps->irq = irq_of_parse_and_map(np, 0);
|
||||
if (rps->irq < 0) {
|
||||
if (!rps->irq) {
|
||||
ret = -EINVAL;
|
||||
goto err_iomap;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Pistachio clocksource based on general-purpose timers
|
||||
*
|
||||
* Copyright (C) 2015 Imagination Technologies
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "%s: " fmt, __func__
|
||||
|
||||
@@ -34,7 +34,7 @@ static int riscv_clock_next_event(unsigned long delta,
|
||||
static unsigned int riscv_clock_event_irq;
|
||||
static DEFINE_PER_CPU(struct clock_event_device, riscv_clock_event) = {
|
||||
.name = "riscv_timer_clockevent",
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_C3STOP,
|
||||
.rating = 100,
|
||||
.set_next_event = riscv_clock_next_event,
|
||||
};
|
||||
|
||||
@@ -259,6 +259,11 @@ static int __init sp804_of_init(struct device_node *np, struct sp804_timer *time
|
||||
struct clk *clk1, *clk2;
|
||||
const char *name = of_get_property(np, "compatible", NULL);
|
||||
|
||||
if (initialized) {
|
||||
pr_debug("%pOF: skipping further SP804 timer device\n", np);
|
||||
return 0;
|
||||
}
|
||||
|
||||
base = of_iomap(np, 0);
|
||||
if (!base)
|
||||
return -ENXIO;
|
||||
@@ -270,11 +275,6 @@ static int __init sp804_of_init(struct device_node *np, struct sp804_timer *time
|
||||
writel(0, timer1_base + timer->ctrl);
|
||||
writel(0, timer2_base + timer->ctrl);
|
||||
|
||||
if (initialized || !of_device_is_available(np)) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
clk1 = of_clk_get(np, 0);
|
||||
if (IS_ERR(clk1))
|
||||
clk1 = NULL;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Allwinner A1X SoCs timer handling.
|
||||
*
|
||||
@@ -8,10 +9,6 @@
|
||||
* Based on code from
|
||||
* Allwinner Technology Co., Ltd. <www.allwinnertech.com>
|
||||
* Benn Huang <benn@allwinnertech.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Allwinner SoCs hstimer driver.
|
||||
*
|
||||
* Copyright (C) 2013 Maxime Ripard
|
||||
*
|
||||
* Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
|
||||
@@ -828,8 +828,7 @@ static int omap_dm_timer_probe(struct platform_device *pdev)
|
||||
cpu_pm_register_notifier(&timer->nb);
|
||||
}
|
||||
|
||||
if (pdata)
|
||||
timer->errata = pdata->timer_errata;
|
||||
timer->errata = pdata->timer_errata;
|
||||
|
||||
timer->pdev = pdev;
|
||||
|
||||
|
||||
@@ -46,10 +46,10 @@ static __always_inline bool context_tracking_in_user(void)
|
||||
return __this_cpu_read(context_tracking.state) == CONTEXT_USER;
|
||||
}
|
||||
#else
|
||||
static inline bool context_tracking_in_user(void) { return false; }
|
||||
static inline bool context_tracking_enabled(void) { return false; }
|
||||
static inline bool context_tracking_enabled_cpu(int cpu) { return false; }
|
||||
static inline bool context_tracking_enabled_this_cpu(void) { return false; }
|
||||
static __always_inline bool context_tracking_in_user(void) { return false; }
|
||||
static __always_inline bool context_tracking_enabled(void) { return false; }
|
||||
static __always_inline bool context_tracking_enabled_cpu(int cpu) { return false; }
|
||||
static __always_inline bool context_tracking_enabled_this_cpu(void) { return false; }
|
||||
#endif /* CONFIG_CONTEXT_TRACKING */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -45,9 +45,13 @@ struct task_delay_info {
|
||||
u64 compact_start;
|
||||
u64 compact_delay; /* wait for memory compact */
|
||||
|
||||
u64 wpcopy_start;
|
||||
u64 wpcopy_delay; /* wait for write-protect copy */
|
||||
|
||||
u32 freepages_count; /* total count of memory reclaim */
|
||||
u32 thrashing_count; /* total count of thrash waits */
|
||||
u32 compact_count; /* total count of memory compact */
|
||||
u32 wpcopy_count; /* total count of write-protect copy */
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -75,6 +79,8 @@ extern void __delayacct_swapin_start(void);
|
||||
extern void __delayacct_swapin_end(void);
|
||||
extern void __delayacct_compact_start(void);
|
||||
extern void __delayacct_compact_end(void);
|
||||
extern void __delayacct_wpcopy_start(void);
|
||||
extern void __delayacct_wpcopy_end(void);
|
||||
|
||||
static inline void delayacct_tsk_init(struct task_struct *tsk)
|
||||
{
|
||||
@@ -191,6 +197,24 @@ static inline void delayacct_compact_end(void)
|
||||
__delayacct_compact_end();
|
||||
}
|
||||
|
||||
static inline void delayacct_wpcopy_start(void)
|
||||
{
|
||||
if (!static_branch_unlikely(&delayacct_key))
|
||||
return;
|
||||
|
||||
if (current->delays)
|
||||
__delayacct_wpcopy_start();
|
||||
}
|
||||
|
||||
static inline void delayacct_wpcopy_end(void)
|
||||
{
|
||||
if (!static_branch_unlikely(&delayacct_key))
|
||||
return;
|
||||
|
||||
if (current->delays)
|
||||
__delayacct_wpcopy_end();
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void delayacct_init(void)
|
||||
{}
|
||||
@@ -225,6 +249,10 @@ static inline void delayacct_compact_start(void)
|
||||
{}
|
||||
static inline void delayacct_compact_end(void)
|
||||
{}
|
||||
static inline void delayacct_wpcopy_start(void)
|
||||
{}
|
||||
static inline void delayacct_wpcopy_end(void)
|
||||
{}
|
||||
|
||||
#endif /* CONFIG_TASK_DELAY_ACCT */
|
||||
|
||||
|
||||
@@ -256,9 +256,9 @@ extern void static_key_disable_cpuslocked(struct static_key *key);
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
static inline int static_key_count(struct static_key *key)
|
||||
static __always_inline int static_key_count(struct static_key *key)
|
||||
{
|
||||
return atomic_read(&key->enabled);
|
||||
return arch_atomic_read(&key->enabled);
|
||||
}
|
||||
|
||||
static __always_inline void jump_label_init(void)
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __TIMER_IXP4XX_H
|
||||
#define __TIMER_IXP4XX_H
|
||||
|
||||
#include <linux/ioport.h>
|
||||
|
||||
void __init ixp4xx_timer_setup(resource_size_t timerbase,
|
||||
int timer_irq,
|
||||
unsigned int timer_freq);
|
||||
|
||||
#endif
|
||||
@@ -155,21 +155,18 @@ struct bdaddr_list_with_irk {
|
||||
u8 local_irk[16];
|
||||
};
|
||||
|
||||
/* Bitmask of connection flags */
|
||||
enum hci_conn_flags {
|
||||
HCI_CONN_FLAG_REMOTE_WAKEUP,
|
||||
HCI_CONN_FLAG_DEVICE_PRIVACY,
|
||||
|
||||
__HCI_CONN_NUM_FLAGS,
|
||||
HCI_CONN_FLAG_REMOTE_WAKEUP = 1,
|
||||
HCI_CONN_FLAG_DEVICE_PRIVACY = 2,
|
||||
};
|
||||
|
||||
/* Make sure number of flags doesn't exceed sizeof(current_flags) */
|
||||
static_assert(__HCI_CONN_NUM_FLAGS < 32);
|
||||
typedef u8 hci_conn_flags_t;
|
||||
|
||||
struct bdaddr_list_with_flags {
|
||||
struct list_head list;
|
||||
bdaddr_t bdaddr;
|
||||
u8 bdaddr_type;
|
||||
DECLARE_BITMAP(flags, __HCI_CONN_NUM_FLAGS);
|
||||
hci_conn_flags_t flags;
|
||||
};
|
||||
|
||||
struct bt_uuid {
|
||||
@@ -576,7 +573,7 @@ struct hci_dev {
|
||||
struct rfkill *rfkill;
|
||||
|
||||
DECLARE_BITMAP(dev_flags, __HCI_NUM_FLAGS);
|
||||
DECLARE_BITMAP(conn_flags, __HCI_CONN_NUM_FLAGS);
|
||||
hci_conn_flags_t conn_flags;
|
||||
|
||||
__s8 adv_tx_power;
|
||||
__u8 adv_data[HCI_MAX_EXT_AD_LENGTH];
|
||||
@@ -775,7 +772,7 @@ struct hci_conn_params {
|
||||
|
||||
struct hci_conn *conn;
|
||||
bool explicit_connect;
|
||||
DECLARE_BITMAP(flags, __HCI_CONN_NUM_FLAGS);
|
||||
hci_conn_flags_t flags;
|
||||
u8 privacy_mode;
|
||||
};
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#define TASKSTATS_VERSION 12
|
||||
#define TASKSTATS_VERSION 13
|
||||
#define TS_COMM_LEN 32 /* should be >= TASK_COMM_LEN
|
||||
* in linux/sched.h */
|
||||
|
||||
@@ -194,6 +194,10 @@ struct taskstats {
|
||||
__u64 ac_exe_dev; /* program binary device ID */
|
||||
__u64 ac_exe_inode; /* program binary inode number */
|
||||
/* v12 end */
|
||||
|
||||
/* v13: Delay waiting for write-protect copy */
|
||||
__u64 wpcopy_count;
|
||||
__u64 wpcopy_delay_total;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -177,11 +177,14 @@ int delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)
|
||||
d->thrashing_delay_total = (tmp < d->thrashing_delay_total) ? 0 : tmp;
|
||||
tmp = d->compact_delay_total + tsk->delays->compact_delay;
|
||||
d->compact_delay_total = (tmp < d->compact_delay_total) ? 0 : tmp;
|
||||
tmp = d->wpcopy_delay_total + tsk->delays->wpcopy_delay;
|
||||
d->wpcopy_delay_total = (tmp < d->wpcopy_delay_total) ? 0 : tmp;
|
||||
d->blkio_count += tsk->delays->blkio_count;
|
||||
d->swapin_count += tsk->delays->swapin_count;
|
||||
d->freepages_count += tsk->delays->freepages_count;
|
||||
d->thrashing_count += tsk->delays->thrashing_count;
|
||||
d->compact_count += tsk->delays->compact_count;
|
||||
d->wpcopy_count += tsk->delays->wpcopy_count;
|
||||
raw_spin_unlock_irqrestore(&tsk->delays->lock, flags);
|
||||
|
||||
return 0;
|
||||
@@ -249,3 +252,16 @@ void __delayacct_compact_end(void)
|
||||
¤t->delays->compact_delay,
|
||||
¤t->delays->compact_count);
|
||||
}
|
||||
|
||||
void __delayacct_wpcopy_start(void)
|
||||
{
|
||||
current->delays->wpcopy_start = local_clock();
|
||||
}
|
||||
|
||||
void __delayacct_wpcopy_end(void)
|
||||
{
|
||||
delayacct_end(¤t->delays->lock,
|
||||
¤t->delays->wpcopy_start,
|
||||
¤t->delays->wpcopy_delay,
|
||||
¤t->delays->wpcopy_count);
|
||||
}
|
||||
|
||||
@@ -4257,7 +4257,6 @@ static void perf_event_remove_on_exec(int ctxn)
|
||||
{
|
||||
struct perf_event_context *ctx, *clone_ctx = NULL;
|
||||
struct perf_event *event, *next;
|
||||
LIST_HEAD(free_list);
|
||||
unsigned long flags;
|
||||
bool modified = false;
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ void __init autogroup_init(struct task_struct *init_task)
|
||||
kref_init(&autogroup_default.kref);
|
||||
init_rwsem(&autogroup_default.lock);
|
||||
init_task->signal->autogroup = &autogroup_default;
|
||||
sched_autogroup_sysctl_init();
|
||||
}
|
||||
|
||||
void autogroup_free(struct task_group *tg)
|
||||
@@ -219,7 +220,6 @@ void sched_autogroup_exit(struct signal_struct *sig)
|
||||
static int __init setup_autogroup(char *str)
|
||||
{
|
||||
sysctl_sched_autogroup_enabled = 0;
|
||||
sched_autogroup_sysctl_init();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <linux/cma.h>
|
||||
#include <linux/migrate.h>
|
||||
#include <linux/nospec.h>
|
||||
#include <linux/delayacct.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgalloc.h>
|
||||
@@ -5230,6 +5231,8 @@ static vm_fault_t hugetlb_wp(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
pte = huge_ptep_get(ptep);
|
||||
old_page = pte_page(pte);
|
||||
|
||||
delayacct_wpcopy_start();
|
||||
|
||||
retry_avoidcopy:
|
||||
/*
|
||||
* If no-one else is actually using this page, we're the exclusive
|
||||
@@ -5240,6 +5243,8 @@ retry_avoidcopy:
|
||||
page_move_anon_rmap(old_page, vma);
|
||||
if (likely(!unshare))
|
||||
set_huge_ptep_writable(vma, haddr, ptep);
|
||||
|
||||
delayacct_wpcopy_end();
|
||||
return 0;
|
||||
}
|
||||
VM_BUG_ON_PAGE(PageAnon(old_page) && PageAnonExclusive(old_page),
|
||||
@@ -5309,6 +5314,7 @@ retry_avoidcopy:
|
||||
* race occurs while re-acquiring page table
|
||||
* lock, and our job is done.
|
||||
*/
|
||||
delayacct_wpcopy_end();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5367,6 +5373,8 @@ out_release_old:
|
||||
put_page(old_page);
|
||||
|
||||
spin_lock(ptl); /* Caller expects lock to be held */
|
||||
|
||||
delayacct_wpcopy_end();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ DEFINE_STATIC_KEY_MAYBE(CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON,
|
||||
EXPORT_SYMBOL(hugetlb_optimize_vmemmap_key);
|
||||
|
||||
static enum vmemmap_optimize_mode vmemmap_optimize_mode =
|
||||
IS_ENABLED(CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON);
|
||||
IS_ENABLED(CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON);
|
||||
|
||||
static void vmemmap_optimize_mode_switch(enum vmemmap_optimize_mode to)
|
||||
{
|
||||
|
||||
@@ -3091,6 +3091,8 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
|
||||
int page_copied = 0;
|
||||
struct mmu_notifier_range range;
|
||||
|
||||
delayacct_wpcopy_start();
|
||||
|
||||
if (unlikely(anon_vma_prepare(vma)))
|
||||
goto oom;
|
||||
|
||||
@@ -3115,6 +3117,8 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
|
||||
put_page(new_page);
|
||||
if (old_page)
|
||||
put_page(old_page);
|
||||
|
||||
delayacct_wpcopy_end();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -3221,12 +3225,16 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
|
||||
free_swap_cache(old_page);
|
||||
put_page(old_page);
|
||||
}
|
||||
|
||||
delayacct_wpcopy_end();
|
||||
return (page_copied && !unshare) ? VM_FAULT_WRITE : 0;
|
||||
oom_free_new:
|
||||
put_page(new_page);
|
||||
oom:
|
||||
if (old_page)
|
||||
put_page(old_page);
|
||||
|
||||
delayacct_wpcopy_end();
|
||||
return VM_FAULT_OOM;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -214,7 +214,7 @@ static int pagemap_range(struct dev_pagemap *pgmap, struct mhp_params *params,
|
||||
|
||||
if (!mhp_range_allowed(range->start, range_len(range), !is_private)) {
|
||||
error = -EINVAL;
|
||||
goto err_pfn_remap;
|
||||
goto err_kasan;
|
||||
}
|
||||
|
||||
mem_hotplug_begin();
|
||||
|
||||
+29
-29
@@ -56,35 +56,6 @@ static int sysctl_panic_on_oom;
|
||||
static int sysctl_oom_kill_allocating_task;
|
||||
static int sysctl_oom_dump_tasks = 1;
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
static struct ctl_table vm_oom_kill_table[] = {
|
||||
{
|
||||
.procname = "panic_on_oom",
|
||||
.data = &sysctl_panic_on_oom,
|
||||
.maxlen = sizeof(sysctl_panic_on_oom),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec_minmax,
|
||||
.extra1 = SYSCTL_ZERO,
|
||||
.extra2 = SYSCTL_TWO,
|
||||
},
|
||||
{
|
||||
.procname = "oom_kill_allocating_task",
|
||||
.data = &sysctl_oom_kill_allocating_task,
|
||||
.maxlen = sizeof(sysctl_oom_kill_allocating_task),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{
|
||||
.procname = "oom_dump_tasks",
|
||||
.data = &sysctl_oom_dump_tasks,
|
||||
.maxlen = sizeof(sysctl_oom_dump_tasks),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{}
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Serializes oom killer invocations (out_of_memory()) from all contexts to
|
||||
* prevent from over eager oom killing (e.g. when the oom killer is invoked
|
||||
@@ -729,6 +700,35 @@ static void queue_oom_reaper(struct task_struct *tsk)
|
||||
add_timer(&tsk->oom_reaper_timer);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
static struct ctl_table vm_oom_kill_table[] = {
|
||||
{
|
||||
.procname = "panic_on_oom",
|
||||
.data = &sysctl_panic_on_oom,
|
||||
.maxlen = sizeof(sysctl_panic_on_oom),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec_minmax,
|
||||
.extra1 = SYSCTL_ZERO,
|
||||
.extra2 = SYSCTL_TWO,
|
||||
},
|
||||
{
|
||||
.procname = "oom_kill_allocating_task",
|
||||
.data = &sysctl_oom_kill_allocating_task,
|
||||
.maxlen = sizeof(sysctl_oom_kill_allocating_task),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{
|
||||
.procname = "oom_dump_tasks",
|
||||
.data = &sysctl_oom_dump_tasks,
|
||||
.maxlen = sizeof(sysctl_oom_dump_tasks),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{}
|
||||
};
|
||||
#endif
|
||||
|
||||
static int __init oom_init(void)
|
||||
{
|
||||
oom_reaper_th = kthread_run(oom_reaper, NULL, "oom_reaper");
|
||||
|
||||
+1
-1
@@ -385,9 +385,9 @@ static int isolate_single_pageblock(unsigned long boundary_pfn, int flags,
|
||||
* above do the rest. If migration is not possible, just fail.
|
||||
*/
|
||||
if (PageCompound(page)) {
|
||||
unsigned long nr_pages = compound_nr(page);
|
||||
struct page *head = compound_head(page);
|
||||
unsigned long head_pfn = page_to_pfn(head);
|
||||
unsigned long nr_pages = compound_nr(head);
|
||||
|
||||
if (head_pfn + nr_pages <= boundary_pfn) {
|
||||
pfn = head_pfn + nr_pages;
|
||||
|
||||
@@ -2153,7 +2153,7 @@ int hci_bdaddr_list_add_with_flags(struct list_head *list, bdaddr_t *bdaddr,
|
||||
|
||||
bacpy(&entry->bdaddr, bdaddr);
|
||||
entry->bdaddr_type = type;
|
||||
bitmap_from_u64(entry->flags, flags);
|
||||
entry->flags = flags;
|
||||
|
||||
list_add(&entry->list, list);
|
||||
|
||||
@@ -2634,7 +2634,7 @@ int hci_register_dev(struct hci_dev *hdev)
|
||||
* callback.
|
||||
*/
|
||||
if (hdev->wakeup)
|
||||
set_bit(HCI_CONN_FLAG_REMOTE_WAKEUP, hdev->conn_flags);
|
||||
hdev->conn_flags |= HCI_CONN_FLAG_REMOTE_WAKEUP;
|
||||
|
||||
hci_sock_dev_event(hdev, HCI_DEV_REG);
|
||||
hci_dev_hold(hdev);
|
||||
|
||||
@@ -482,7 +482,7 @@ static int add_to_accept_list(struct hci_request *req,
|
||||
|
||||
/* During suspend, only wakeable devices can be in accept list */
|
||||
if (hdev->suspended &&
|
||||
!test_bit(HCI_CONN_FLAG_REMOTE_WAKEUP, params->flags))
|
||||
!(params->flags & HCI_CONN_FLAG_REMOTE_WAKEUP))
|
||||
return 0;
|
||||
|
||||
*num_entries += 1;
|
||||
|
||||
@@ -1637,7 +1637,7 @@ static int hci_le_set_privacy_mode_sync(struct hci_dev *hdev,
|
||||
* indicates that LL Privacy has been enabled and
|
||||
* HCI_OP_LE_SET_PRIVACY_MODE is supported.
|
||||
*/
|
||||
if (!test_bit(HCI_CONN_FLAG_DEVICE_PRIVACY, params->flags))
|
||||
if (!(params->flags & HCI_CONN_FLAG_DEVICE_PRIVACY))
|
||||
return 0;
|
||||
|
||||
irk = hci_find_irk_by_addr(hdev, ¶ms->addr, params->addr_type);
|
||||
@@ -1666,7 +1666,7 @@ static int hci_le_add_accept_list_sync(struct hci_dev *hdev,
|
||||
|
||||
/* During suspend, only wakeable devices can be in acceptlist */
|
||||
if (hdev->suspended &&
|
||||
!test_bit(HCI_CONN_FLAG_REMOTE_WAKEUP, params->flags))
|
||||
!(params->flags & HCI_CONN_FLAG_REMOTE_WAKEUP))
|
||||
return 0;
|
||||
|
||||
/* Select filter policy to accept all advertising */
|
||||
@@ -4888,7 +4888,7 @@ static int hci_update_event_filter_sync(struct hci_dev *hdev)
|
||||
hci_clear_event_filter_sync(hdev);
|
||||
|
||||
list_for_each_entry(b, &hdev->accept_list, list) {
|
||||
if (!test_bit(HCI_CONN_FLAG_REMOTE_WAKEUP, b->flags))
|
||||
if (!(b->flags & HCI_CONN_FLAG_REMOTE_WAKEUP))
|
||||
continue;
|
||||
|
||||
bt_dev_dbg(hdev, "Adding event filters for %pMR", &b->bdaddr);
|
||||
|
||||
+14
-23
@@ -4013,10 +4013,11 @@ static int exp_ll_privacy_feature_changed(bool enabled, struct hci_dev *hdev,
|
||||
memcpy(ev.uuid, rpa_resolution_uuid, 16);
|
||||
ev.flags = cpu_to_le32((enabled ? BIT(0) : 0) | BIT(1));
|
||||
|
||||
// Do we need to be atomic with the conn_flags?
|
||||
if (enabled && privacy_mode_capable(hdev))
|
||||
set_bit(HCI_CONN_FLAG_DEVICE_PRIVACY, hdev->conn_flags);
|
||||
hdev->conn_flags |= HCI_CONN_FLAG_DEVICE_PRIVACY;
|
||||
else
|
||||
clear_bit(HCI_CONN_FLAG_DEVICE_PRIVACY, hdev->conn_flags);
|
||||
hdev->conn_flags &= ~HCI_CONN_FLAG_DEVICE_PRIVACY;
|
||||
|
||||
return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, hdev,
|
||||
&ev, sizeof(ev),
|
||||
@@ -4435,8 +4436,7 @@ static int get_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
|
||||
bitmap_to_arr32(&supported_flags, hdev->conn_flags,
|
||||
__HCI_CONN_NUM_FLAGS);
|
||||
supported_flags = hdev->conn_flags;
|
||||
|
||||
memset(&rp, 0, sizeof(rp));
|
||||
|
||||
@@ -4447,8 +4447,7 @@ static int get_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
if (!br_params)
|
||||
goto done;
|
||||
|
||||
bitmap_to_arr32(¤t_flags, br_params->flags,
|
||||
__HCI_CONN_NUM_FLAGS);
|
||||
current_flags = br_params->flags;
|
||||
} else {
|
||||
params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
|
||||
le_addr_type(cp->addr.type));
|
||||
@@ -4456,8 +4455,7 @@ static int get_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
if (!params)
|
||||
goto done;
|
||||
|
||||
bitmap_to_arr32(¤t_flags, params->flags,
|
||||
__HCI_CONN_NUM_FLAGS);
|
||||
current_flags = params->flags;
|
||||
}
|
||||
|
||||
bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
|
||||
@@ -4502,8 +4500,8 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
&cp->addr.bdaddr, cp->addr.type,
|
||||
__le32_to_cpu(current_flags));
|
||||
|
||||
bitmap_to_arr32(&supported_flags, hdev->conn_flags,
|
||||
__HCI_CONN_NUM_FLAGS);
|
||||
// We should take hci_dev_lock() early, I think.. conn_flags can change
|
||||
supported_flags = hdev->conn_flags;
|
||||
|
||||
if ((supported_flags | current_flags) != supported_flags) {
|
||||
bt_dev_warn(hdev, "Bad flag given (0x%x) vs supported (0x%0x)",
|
||||
@@ -4519,7 +4517,7 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
cp->addr.type);
|
||||
|
||||
if (br_params) {
|
||||
bitmap_from_u64(br_params->flags, current_flags);
|
||||
br_params->flags = current_flags;
|
||||
status = MGMT_STATUS_SUCCESS;
|
||||
} else {
|
||||
bt_dev_warn(hdev, "No such BR/EDR device %pMR (0x%x)",
|
||||
@@ -4529,15 +4527,11 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
|
||||
le_addr_type(cp->addr.type));
|
||||
if (params) {
|
||||
DECLARE_BITMAP(flags, __HCI_CONN_NUM_FLAGS);
|
||||
|
||||
bitmap_from_u64(flags, current_flags);
|
||||
|
||||
/* Devices using RPAs can only be programmed in the
|
||||
* acceptlist LL Privacy has been enable otherwise they
|
||||
* cannot mark HCI_CONN_FLAG_REMOTE_WAKEUP.
|
||||
*/
|
||||
if (test_bit(HCI_CONN_FLAG_REMOTE_WAKEUP, flags) &&
|
||||
if ((current_flags & HCI_CONN_FLAG_REMOTE_WAKEUP) &&
|
||||
!use_ll_privacy(hdev) &&
|
||||
hci_find_irk_by_addr(hdev, ¶ms->addr,
|
||||
params->addr_type)) {
|
||||
@@ -4546,14 +4540,13 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
bitmap_from_u64(params->flags, current_flags);
|
||||
params->flags = current_flags;
|
||||
status = MGMT_STATUS_SUCCESS;
|
||||
|
||||
/* Update passive scan if HCI_CONN_FLAG_DEVICE_PRIVACY
|
||||
* has been set.
|
||||
*/
|
||||
if (test_bit(HCI_CONN_FLAG_DEVICE_PRIVACY,
|
||||
params->flags))
|
||||
if (params->flags & HCI_CONN_FLAG_DEVICE_PRIVACY)
|
||||
hci_update_passive_scan(hdev);
|
||||
} else {
|
||||
bt_dev_warn(hdev, "No such LE device %pMR (0x%x)",
|
||||
@@ -7154,8 +7147,7 @@ static int add_device(struct sock *sk, struct hci_dev *hdev,
|
||||
params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
|
||||
addr_type);
|
||||
if (params)
|
||||
bitmap_to_arr32(¤t_flags, params->flags,
|
||||
__HCI_CONN_NUM_FLAGS);
|
||||
current_flags = params->flags;
|
||||
}
|
||||
|
||||
err = hci_cmd_sync_queue(hdev, add_device_sync, NULL, NULL);
|
||||
@@ -7164,8 +7156,7 @@ static int add_device(struct sock *sk, struct hci_dev *hdev,
|
||||
|
||||
added:
|
||||
device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action);
|
||||
bitmap_to_arr32(&supported_flags, hdev->conn_flags,
|
||||
__HCI_CONN_NUM_FLAGS);
|
||||
supported_flags = hdev->conn_flags;
|
||||
device_flags_changed(NULL, hdev, &cp->addr.bdaddr, cp->addr.type,
|
||||
supported_flags, current_flags);
|
||||
|
||||
|
||||
@@ -241,7 +241,7 @@ objtool_args = \
|
||||
$(if $(CONFIG_SLS), --sls) \
|
||||
$(if $(CONFIG_STACK_VALIDATION), --stackval) \
|
||||
$(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call) \
|
||||
--uaccess \
|
||||
$(if $(CONFIG_HAVE_UACCESS_VALIDATION), --uaccess) \
|
||||
$(if $(delay-objtool), --link) \
|
||||
$(if $(part-of-module), --module) \
|
||||
$(if $(CONFIG_GCOV_KERNEL), --no-unreachable)
|
||||
|
||||
@@ -207,6 +207,8 @@ static void print_delayacct(struct taskstats *t)
|
||||
"THRASHING%12s%15s%15s\n"
|
||||
" %15llu%15llu%15llums\n"
|
||||
"COMPACT %12s%15s%15s\n"
|
||||
" %15llu%15llu%15llums\n"
|
||||
"WPCOPY %12s%15s%15s\n"
|
||||
" %15llu%15llu%15llums\n",
|
||||
"count", "real total", "virtual total",
|
||||
"delay total", "delay average",
|
||||
@@ -234,7 +236,11 @@ static void print_delayacct(struct taskstats *t)
|
||||
"count", "delay total", "delay average",
|
||||
(unsigned long long)t->compact_count,
|
||||
(unsigned long long)t->compact_delay_total,
|
||||
average_ms(t->compact_delay_total, t->compact_count));
|
||||
average_ms(t->compact_delay_total, t->compact_count),
|
||||
"count", "delay total", "delay average",
|
||||
(unsigned long long)t->wpcopy_count,
|
||||
(unsigned long long)t->wpcopy_delay_total,
|
||||
average_ms(t->wpcopy_delay_total, t->wpcopy_count));
|
||||
}
|
||||
|
||||
static void task_context_switch_counts(struct taskstats *t)
|
||||
|
||||
@@ -185,7 +185,9 @@ static bool __dead_end_function(struct objtool_file *file, struct symbol *func,
|
||||
"do_group_exit",
|
||||
"stop_this_cpu",
|
||||
"__invalid_creds",
|
||||
"cpu_startup_entry",
|
||||
"cpu_startup_entry",
|
||||
"__ubsan_handle_builtin_unreachable",
|
||||
"ex_handler_msr_mce",
|
||||
};
|
||||
|
||||
if (!func)
|
||||
|
||||
Reference in New Issue
Block a user