Linux 4.19.236
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.19.236 kernel.
All users of the 4.19 kernel series must upgrade.
The updated 4.19.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.19.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm/boot/dts/rk3288.dtsi | 2 arch/arm/include/asm/kvm_host.h | 7 arch/arm64/Kconfig | 9 arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 6 arch/arm64/boot/dts/rockchip/rk3399.dtsi | 6 arch/arm64/include/asm/assembler.h | 34 ++ arch/arm64/include/asm/cpu.h | 1 arch/arm64/include/asm/cpucaps.h | 3 arch/arm64/include/asm/cpufeature.h | 39 ++ arch/arm64/include/asm/cputype.h | 16 + arch/arm64/include/asm/fixmap.h | 6 arch/arm64/include/asm/kvm_host.h | 5 arch/arm64/include/asm/kvm_mmu.h | 6 arch/arm64/include/asm/mmu.h | 8 arch/arm64/include/asm/sections.h | 5 arch/arm64/include/asm/sysreg.h | 5 arch/arm64/include/asm/vectors.h | 74 +++++ arch/arm64/kernel/cpu_errata.c | 381 +++++++++++++++++++++++++- arch/arm64/kernel/cpufeature.c | 21 + arch/arm64/kernel/cpuinfo.c | 1 arch/arm64/kernel/entry.S | 213 ++++++++++---- arch/arm64/kernel/vmlinux.lds.S | 2 arch/arm64/kvm/hyp/hyp-entry.S | 64 ++++ arch/arm64/kvm/hyp/switch.c | 8 arch/arm64/kvm/sys_regs.c | 2 arch/arm64/mm/mmu.c | 12 arch/ia64/kernel/acpi.c | 7 arch/mips/kernel/smp.c | 6 drivers/atm/eni.c | 2 drivers/atm/firestream.c | 2 drivers/crypto/qcom-rng.c | 17 - drivers/firmware/efi/apple-properties.c | 2 drivers/firmware/efi/efi.c | 2 drivers/gpu/drm/panel/panel-simple.c | 2 drivers/input/tablet/aiptek.c | 10 drivers/net/can/rcar/rcar_canfd.c | 6 drivers/net/ethernet/sfc/mcdi.c | 2 drivers/net/hyperv/netvsc_drv.c | 3 drivers/usb/gadget/function/rndis.c | 1 drivers/usb/gadget/udc/core.c | 3 fs/ocfs2/super.c | 22 - fs/sysfs/file.c | 3 include/linux/arm-smccc.h | 7 include/linux/if_arp.h | 1 include/linux/topology.h | 1 include/net/xfrm.h | 5 kernel/cgroup/cpuset.c | 8 kernel/sched/topology.c | 99 +++--- lib/Kconfig | 1 mm/migrate.c | 8 net/dsa/dsa2.c | 1 net/ipv4/tcp.c | 10 net/key/af_key.c | 2 net/packet/af_packet.c | 11 net/sctp/sm_statefuns.c | 108 ++++--- net/wireless/nl80211.c | 3 net/xfrm/xfrm_policy.c | 14 net/xfrm/xfrm_state.c | 15 - net/xfrm/xfrm_user.c | 27 - tools/perf/util/symbol.c | 2 tools/testing/selftests/vm/userfaultfd.c | 1 virt/kvm/arm/psci.c | 12 63 files changed, 1111 insertions(+), 253 deletions(-)
Alan Stern (1):
usb: gadget: Fix use-after-free bug by not setting udc->dev.driver
Alexander Lobakin (1):
MIPS: smp: fill in sibling and core maps earlier
Anshuman Khandual (1):
arm64: Add Cortex-X2 CPU part definition
Brian Masney (1):
crypto: qcom-rng - ensure buffer for generate is completely filled
Chengming Zhou (1):
kselftest/vm: fix tests build with old libc
Corentin Labbe (1):
ARM: dts: rockchip: fix a typo on rk3288 crypto-controller
Dan Carpenter (1):
usb: gadget: rndis: prevent integer overflow in rndis_set_response()
Dietmar Eggemann (1):
sched/topology: Fix sched_domain_topology_level alloc in sched_init_numa()
Eric Dumazet (2):
tcp: make tcp_read_sock() more robust
net/packet: fix slab-out-of-bounds access in packet_recvmsg()
Greg Kroah-Hartman (1):
Linux 4.19.236
Jakob Unterwurzacher (1):
arm64: dts: rockchip: fix rk3399-puma eMMC HS400 signal integrity
James Morse (18):
arm64: entry.S: Add ventry overflow sanity checks
arm64: entry: Make the trampoline cleanup optional
arm64: entry: Free up another register on kpti's tramp_exit path
arm64: entry: Move the trampoline data page before the text page
arm64: entry: Allow tramp_alias to access symbols after the 4K boundary
arm64: entry: Don't assume tramp_vectors is the start of the vectors
arm64: entry: Move trampoline macros out of ifdef'd section
arm64: entry: Make the kpti trampoline's kpti sequence optional
arm64: entry: Allow the trampoline text to occupy multiple pages
arm64: entry: Add non-kpti __bp_harden_el1_vectors for mitigations
arm64: entry: Add vectors that have the bhb mitigation sequences
arm64: entry: Add macro for reading symbol addresses from the trampoline
arm64: Add percpu vectors for EL1
arm64: proton-pack: Report Spectre-BHB vulnerabilities as part of Spectre-v2
KVM: arm64: Add templates for BHB mitigation sequences
arm64: Mitigate spectre style branch history side channels
KVM: arm64: Allow SMCCC_ARCH_WORKAROUND_3 to be discovered and migrated
arm64: Use the clearbhb instruction in mitigations
Jia-Ju Bai (1):
atm: firestream: check the return value of ioremap() in fs_init()
Jiasheng Jiang (2):
atm: eni: Add check for dma_map_single
hv_netvsc: Add check for kvmalloc_array
Joey Gouly (1):
arm64: add ID_AA64ISAR2_EL1 sys register
Joseph Qi (1):
ocfs2: fix crash when initialize filecheck kobj fails
Julian Braha (1):
ARM: 9178/1: fix unmet dependency on BITREVERSE for HAVE_ARCH_BITREVERSE
Kai Lueke (1):
Revert "xfrm: state and policy should fail if XFRMA_IF_ID 0"
Lad Prabhakar (1):
can: rcar_canfd: rcar_canfd_channel_probe(): register the CAN device when fully ready
Lucas Wei (1):
fs: sysfs_emit: Remove PAGE_SIZE alignment check
Marek Vasut (1):
drm/panel: simple: Fix Innolux G070Y2-L01 BPP settings
Miaoqian Lin (1):
net: dsa: Add missing of_node_put() in dsa_port_parse_of
Michael Petlan (1):
perf symbols: Fix symbol size calculation condition
Nicolas Dichtel (1):
net: handle ARPHRD_PIMREG in dev_is_mac_header_xmit()
Niels Dossche (1):
sfc: extend the locking on mcdi->seqno
Pavel Skripkin (1):
Input: aiptek - properly check endpoint type
Randy Dunlap (1):
efi: fix return value of __setup handlers
Rob Herring (1):
arm64: Add part number for Arm Cortex-A77
Sascha Hauer (1):
arm64: dts: rockchip: reorder rk3399 hdmi clocks
Sreeramya Soratkal (1):
nl80211: Update bss channel on channel switch for P2P_CLIENT
Suzuki K Poulose (1):
arm64: Add Neoverse-N2, Cortex-A710 CPU part definition
Valentin Schneider (2):
sched/topology: Make sched_init_numa() use a set for the deduplicating sort
ia64: ensure proper NUMA distance and possible map initialization
Xin Long (2):
sctp: fix the processing for INIT chunk
sctp: fix the processing for INIT_ACK chunk
Yan Yan (2):
xfrm: Check if_id in xfrm_migrate
xfrm: Fix xfrm migrate issues when address family changes
Zhang Qiao (1):
cpuset: Fix unsafe lock order between cpuset lock and cpuslock
liqiong (1):
mm: fix dereference a null pointer in migrate[_huge]_page_move_mapping()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 235 +SUBLEVEL = 236 EXTRAVERSION = NAME = "People's Front"
arch/arm/boot/dts/rk3288.dtsi +1 -1
@@ -957,7 +957,7 @@ status = "disabled"; }; - crypto: cypto-controller@ff8a0000 { + crypto: crypto@ff8a0000 { compatible = "rockchip,rk3288-crypto"; reg = <0x0 0xff8a0000 0x0 0x4000>; interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
arch/arm/include/asm/kvm_host.h +7 -0
@@ -26,6 +26,7 @@#include <asm/kvm_asm.h> #include <asm/kvm_mmio.h> #include <asm/fpstate.h> +#include <asm/spectre.h> #include <kvm/arm_arch_timer.h> #define __KVM_HAVE_ARCH_INTC_INITIALIZED
@@ -367,4 +368,10 @@ void kvm_arch_free_vm(struct kvm *kvm);#define kvm_arm_vcpu_loaded (vcpu) (false) +static inline int kvm_arm_get_spectre_bhb_state (void ) +{ +/* 32bit guests don't need firmware for this */ +return SPECTRE_VULNERABLE ;/* aka SMCCC_RET_NOT_SUPPORTED */ +} +#endif /* __ARM_KVM_HOST_H__ */
arch/arm64/Kconfig +9 -0
@@ -979,6 +979,15 @@ config ARM64_SSBD If unsure, say Y. +config MITIGATE_SPECTRE_BRANCH_HISTORY + bool "Mitigate Spectre style attacks against branch history" if EXPERT + default y + help + Speculation attacks against some high-performance processors can + make use of branch history to influence future speculation. + When taking an exception from user-space, a sequence of branches + or a firmware call overwrites the branch history. + menuconfig ARMV8_DEPRECATED bool "Emulate deprecated/obsolete ARMv8 instructions" depends on COMPAT
arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi +6 -0
@@ -468,6 +468,12 @@ }; &sdhci { + /* + * Signal integrity isn't great at 200MHz but 100MHz has proven stable + * enough. + */ + max-frequency = <100000000>; + bus-width = <8>; mmc-hs400-1_8v; mmc-hs400-enhanced-strobe;
arch/arm64/boot/dts/rockchip/rk3399.dtsi +3 -3
@@ -1686,10 +1686,10 @@ interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>; clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_SFR>, - <&cru PLL_VPLL>, + <&cru SCLK_HDMI_CEC>, <&cru PCLK_VIO_GRF>, - <&cru SCLK_HDMI_CEC>; - clock-names = "iahb", "isfr", "vpll", "grf", "cec"; + <&cru PLL_VPLL>; + clock-names = "iahb", "isfr", "cec", "grf", "vpll"; power-domains = <&power RK3399_PD_HDCP>; reg-io-width = <4>; rockchip,grf = <&grf>;
arch/arm64/include/asm/assembler.h +34 -0
@@ -126,6 +126,13 @@ hint #20 .endm +/* +* Clear Branch History instruction +*/ + .macro clearbhb + hint #22 + .endm +/* * Sanitise a 64-bit bounded index wrt speculation, returning zero if out * of bounds.
@@ -711,4 +718,31 @@ USER(\label, ic ivau, \tmp2) // invalidate I line PoU .Lyield_out_\@ : .endm + .macro __mitigate_spectre_bhb_loop tmp +#ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY +alternative_cb spectre_bhb_patch_loop_iter + mov \tmp, #32 // Patched to correct the immediate +alternative_cb_end +.Lspectre_bhb_loop\@: + b . + 4 + subs \tmp, \tmp, #1 + b.ne .Lspectre_bhb_loop\@ + dsb nsh + isb +#endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ + .endm + + /* Save/restores x0-x3 to the stack */ + .macro __mitigate_spectre_bhb_fw +#ifdef CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY + stp x0, x1, [sp, #-16]! + stp x2, x3, [sp, #-16]! + mov w0, #ARM_SMCCC_ARCH_WORKAROUND_3 +alternative_cb arm64_update_smccc_conduit + nop // Patched to SMC/HVC #0 +alternative_cb_end + ldp x2, x3, [sp], #16 + ldp x0, x1, [sp], #16 +#endif /* CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY */ + .endm #endif /* __ASM_ASSEMBLER_H */
arch/arm64/include/asm/cpu.h +1 -0
@@ -36,6 +36,7 @@ struct cpuinfo_arm64 {u64 reg_id_aa64dfr1;u64 reg_id_aa64isar0;u64 reg_id_aa64isar1; +u64 reg_id_aa64isar2;u64 reg_id_aa64mmfr0;u64 reg_id_aa64mmfr1;u64 reg_id_aa64mmfr2;
arch/arm64/include/asm/cpucaps.h +2 -1
@@ -54,7 +54,8 @@#define ARM64_WORKAROUND_1463225 33#define ARM64_SSBS 34#define ARM64_WORKAROUND_1542419 35 +#define ARM64_SPECTRE_BHB 36 -#define ARM64_NCAPS 36 +#define ARM64_NCAPS 37#endif /* __ASM_CPUCAPS_H */
arch/arm64/include/asm/cpufeature.h +39 -0
@@ -482,6 +482,34 @@ static inline bool cpu_supports_mixed_endian_el0(void)return id_aa64mmfr0_mixed_endian_el0 (read_cpuid (ID_AA64MMFR0_EL1 )); } +static inline bool supports_csv2p3 (int scope) +{ +u64 pfr0; +u8 csv2_val; + +if (scope ==SCOPE_LOCAL_CPU ) + pfr0 =read_sysreg_s (SYS_ID_AA64PFR0_EL1 ); +else + pfr0 =read_sanitised_ftr_reg (SYS_ID_AA64PFR0_EL1 ); + + csv2_val =cpuid_feature_extract_unsigned_field (pfr0, +ID_AA64PFR0_CSV2_SHIFT ); +return csv2_val ==3 ; +} + +static inline bool supports_clearbhb (int scope) +{ +u64 isar2; + +if (scope ==SCOPE_LOCAL_CPU ) + isar2 =read_sysreg_s (SYS_ID_AA64ISAR2_EL1 ); +else + isar2 =read_sanitised_ftr_reg (SYS_ID_AA64ISAR2_EL1 ); + +return cpuid_feature_extract_unsigned_field (isar2, +ID_AA64ISAR2_CLEARBHB_SHIFT ); +} +static inline bool system_supports_32bit_el0 (void ) {return cpus_have_const_cap (ARM64_HAS_32BIT_EL0 );
@@ -527,6 +555,17 @@ static inline int arm64_get_ssbd_state(void)void arm64_set_ssbd_mitigation (bool state); +/* Watch out, ordering is important here. */ +enum mitigation_state { +SPECTRE_UNAFFECTED , +SPECTRE_MITIGATED , +SPECTRE_VULNERABLE , +}; + +enum mitigation_state arm64_get_spectre_bhb_state (void ); +bool is_spectre_bhb_affected (const struct arm64_cpu_capabilities *entry,int scope); +u8 spectre_bhb_loop_affected (int scope); +void spectre_bhb_enable_mitigation (const struct arm64_cpu_capabilities *__unused);#endif /* __ASSEMBLY__ */ #endif
arch/arm64/include/asm/cputype.h +16 -0
@@ -81,6 +81,14 @@#define ARM_CPU_PART_CORTEX_A55 0xD05#define ARM_CPU_PART_CORTEX_A76 0xD0B#define ARM_CPU_PART_NEOVERSE_N1 0xD0C +#define ARM_CPU_PART_CORTEX_A77 0xD0D +#define ARM_CPU_PART_NEOVERSE_V1 0xD40 +#define ARM_CPU_PART_CORTEX_A78 0xD41 +#define ARM_CPU_PART_CORTEX_X1 0xD44 +#define ARM_CPU_PART_CORTEX_A710 0xD47 +#define ARM_CPU_PART_CORTEX_X2 0xD48 +#define ARM_CPU_PART_NEOVERSE_N2 0xD49 +#define ARM_CPU_PART_CORTEX_A78C 0xD4B#define APM_CPU_PART_POTENZA 0x000
@@ -109,6 +117,14 @@#define MIDR_CORTEX_A55 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A55)#define MIDR_CORTEX_A76 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A76)#define MIDR_NEOVERSE_N1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N1) +#define MIDR_CORTEX_A77 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A77) +#define MIDR_NEOVERSE_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V1) +#define MIDR_CORTEX_A78 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78) +#define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1) +#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710) +#define MIDR_CORTEX_X2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X2) +#define MIDR_NEOVERSE_N2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N2) +#define MIDR_CORTEX_A78C MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78C)#define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)#define MIDR_THUNDERX_83XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_83XX)
arch/arm64/include/asm/fixmap.h +4 -2
@@ -59,9 +59,11 @@ enum fixed_addresses {#endif /* CONFIG_ACPI_APEI_GHES */ #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 +FIX_ENTRY_TRAMP_TEXT3 , +FIX_ENTRY_TRAMP_TEXT2 , +FIX_ENTRY_TRAMP_TEXT1 ,FIX_ENTRY_TRAMP_DATA , -FIX_ENTRY_TRAMP_TEXT , -#define TRAMP_VALIAS (__fix_to_virt(FIX_ENTRY_TRAMP_TEXT)) +#define TRAMP_VALIAS (__fix_to_virt(FIX_ENTRY_TRAMP_TEXT1))#endif /* CONFIG_UNMAP_KERNEL_AT_EL0 */ __end_of_permanent_fixed_addresses,
arch/arm64/include/asm/kvm_host.h +5 -0
@@ -542,4 +542,9 @@ void kvm_arch_free_vm(struct kvm *kvm);#define kvm_arm_vcpu_loaded (vcpu) ((vcpu)->arch.sysregs_loaded_on_cpu) +static inline enum mitigation_state kvm_arm_get_spectre_bhb_state (void ) +{ +return arm64_get_spectre_bhb_state (); +} +#endif /* __ARM64_KVM_HOST_H__ */
arch/arm64/include/asm/kvm_mmu.h +4 -2
@@ -438,7 +438,8 @@ static inline void *kvm_get_hyp_vector(void)void *vect =kern_hyp_va (kvm_ksym_ref (__kvm_hyp_vector));int slot =-1 ; -if (cpus_have_const_cap (ARM64_HARDEN_BRANCH_PREDICTOR ) && data->fn) { +if ((cpus_have_const_cap (ARM64_HARDEN_BRANCH_PREDICTOR ) || +cpus_have_const_cap (ARM64_SPECTRE_BHB )) && data->template_start) { vect =kern_hyp_va (kvm_ksym_ref (__bp_harden_hyp_vecs_start)); slot = data->hyp_vectors_slot; }
@@ -467,7 +468,8 @@ static inline int kvm_map_vectors(void)* !HBP + HEL2 -> allocate one vector slot and use exec mapping * HBP + HEL2 -> use hardened vertors and use exec mapping */ -if (cpus_have_const_cap (ARM64_HARDEN_BRANCH_PREDICTOR )) { +if (cpus_have_const_cap (ARM64_HARDEN_BRANCH_PREDICTOR ) || +cpus_have_const_cap (ARM64_SPECTRE_BHB )) { __kvm_bp_vect_base =kvm_ksym_ref (__bp_harden_hyp_vecs_start); __kvm_bp_vect_base =kern_hyp_va (__kvm_bp_vect_base); }
arch/arm64/include/asm/mmu.h +7 -1
@@ -38,7 +38,7 @@ typedef struct {*/ #define ASID (mm) ((mm)->context.id.counter & 0xffff) -static inline bool arm64_kernel_unmapped_at_el0 (void ) +static __always_inline bool arm64_kernel_unmapped_at_el0(void) {return IS_ENABLED (CONFIG_UNMAP_KERNEL_AT_EL0 ) &&cpus_have_const_cap (ARM64_UNMAP_KERNEL_AT_EL0 );
@@ -49,6 +49,12 @@ typedef void (*bp_hardening_cb_t)(void);struct bp_hardening_data {int hyp_vectors_slot;bp_hardening_cb_t fn; + +/* +* template_start is only used by the BHB mitigation to identify the +* hyp_vectors_slot sequence. +*/ +const char *template_start; }; #if (defined(CONFIG_HARDEN_BRANCH_PREDICTOR) || \
arch/arm64/include/asm/sections.h +5 -0
@@ -30,4 +30,9 @@ extern char __irqentry_text_start[], __irqentry_text_end[];extern char __mmuoff_data_start[], __mmuoff_data_end[];extern char __entry_tramp_text_start[], __entry_tramp_text_end[]; +static inline size_t entry_tramp_text_size (void ) +{ +return __entry_tramp_text_end - __entry_tramp_text_start; +} +#endif /* __ASM_SECTIONS_H */
arch/arm64/include/asm/sysreg.h +5 -0
@@ -161,6 +161,7 @@#define SYS_ID_AA64ISAR0_EL1 sys_reg(3, 0, 0, 6, 0)#define SYS_ID_AA64ISAR1_EL1 sys_reg(3, 0, 0, 6, 1) +#define SYS_ID_AA64ISAR2_EL1 sys_reg(3, 0, 0, 6, 2)#define SYS_ID_AA64MMFR0_EL1 sys_reg(3, 0, 0, 7, 0)#define SYS_ID_AA64MMFR1_EL1 sys_reg(3, 0, 0, 7, 1)
@@ -526,6 +527,9 @@#define ID_AA64ISAR1_JSCVT_SHIFT 12#define ID_AA64ISAR1_DPB_SHIFT 0 +/* id_aa64isar2 */ +#define ID_AA64ISAR2_CLEARBHB_SHIFT 28 +/* id_aa64pfr0 */ #define ID_AA64PFR0_CSV3_SHIFT 60#define ID_AA64PFR0_CSV2_SHIFT 56
@@ -583,6 +587,7 @@#endif /* id_aa64mmfr1 */ +#define ID_AA64MMFR1_ECBHB_SHIFT 60#define ID_AA64MMFR1_PAN_SHIFT 20#define ID_AA64MMFR1_LOR_SHIFT 16#define ID_AA64MMFR1_HPD_SHIFT 12
arch/arm64/include/asm/vectors.h new file +74 -0
74 lines not on this page · raw message
arch/arm64/kernel/cpu_errata.c +377 -4
429 lines not on this page · raw message
arch/arm64/kernel/cpufeature.c +21 -0
@@ -20,11 +20,13 @@#include <linux/bsearch.h> #include <linux/cpumask.h> +#include <linux/percpu.h> #include <linux/sort.h> #include <linux/stop_machine.h> #include <linux/types.h> #include <linux/mm.h> #include <linux/cpu.h> +#include <asm/cpu.h> #include <asm/cpufeature.h> #include <asm/cpu_ops.h>
@@ -33,6 +35,7 @@#include <asm/processor.h> #include <asm/sysreg.h> #include <asm/traps.h> +#include <asm/vectors.h> #include <asm/virt.h> unsigned long elf_hwcap__read_mostly ;
@@ -51,6 +54,8 @@ unsigned int compat_elf_hwcap2 __read_mostly;DECLARE_BITMAP (cpu_hwcaps,ARM64_NCAPS );EXPORT_SYMBOL (cpu_hwcaps); +DEFINE_PER_CPU_READ_MOSTLY(const char *, this_cpu_vector) = vectors; +/* * Flag to indicate if we have computed the system wide * capabilities based on the boot time active CPUs. This
@@ -145,6 +150,11 @@ static const struct arm64_ftr_bits ftr_id_aa64isar1[] = { ARM64_FTR_END, }; +static const struct arm64_ftr_bits ftr_id_aa64isar2[] = { +ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_HIGHER_SAFE ,ID_AA64ISAR2_CLEARBHB_SHIFT ,4 ,0 ), +ARM64_FTR_END , +}; +static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {ARM64_FTR_BITS (FTR_HIDDEN ,FTR_NONSTRICT ,FTR_LOWER_SAFE ,ID_AA64PFR0_CSV3_SHIFT ,4 ,0 ),ARM64_FTR_BITS (FTR_HIDDEN ,FTR_NONSTRICT ,FTR_LOWER_SAFE ,ID_AA64PFR0_CSV2_SHIFT ,4 ,0 ),
@@ -391,6 +401,7 @@ static const struct __ftr_reg_entry {/* Op1 = 0, CRn = 0, CRm = 6 */ ARM64_FTR_REG (SYS_ID_AA64ISAR0_EL1 , ftr_id_aa64isar0),ARM64_FTR_REG (SYS_ID_AA64ISAR1_EL1 , ftr_id_aa64isar1), +ARM64_FTR_REG (SYS_ID_AA64ISAR2_EL1 , ftr_id_aa64isar2),/* Op1 = 0, CRn = 0, CRm = 7 */ ARM64_FTR_REG(SYS_ID_AA64MMFR0_EL1, ftr_id_aa64mmfr0),
@@ -539,6 +550,7 @@ void __init init_cpu_features(struct cpuinfo_arm64 *info)init_cpu_ftr_reg (SYS_ID_AA64DFR1_EL1 , info->reg_id_aa64dfr1);init_cpu_ftr_reg (SYS_ID_AA64ISAR0_EL1 , info->reg_id_aa64isar0);init_cpu_ftr_reg (SYS_ID_AA64ISAR1_EL1 , info->reg_id_aa64isar1); +init_cpu_ftr_reg (SYS_ID_AA64ISAR2_EL1 , info->reg_id_aa64isar2);init_cpu_ftr_reg (SYS_ID_AA64MMFR0_EL1 , info->reg_id_aa64mmfr0);init_cpu_ftr_reg (SYS_ID_AA64MMFR1_EL1 , info->reg_id_aa64mmfr1);init_cpu_ftr_reg (SYS_ID_AA64MMFR2_EL1 , info->reg_id_aa64mmfr2);
@@ -656,6 +668,8 @@ void update_cpu_features(int cpu, info->reg_id_aa64isar0, boot->reg_id_aa64isar0); taint |=check_update_ftr_reg (SYS_ID_AA64ISAR1_EL1 , cpu, info->reg_id_aa64isar1, boot->reg_id_aa64isar1); + taint |=check_update_ftr_reg (SYS_ID_AA64ISAR2_EL1 , cpu, + info->reg_id_aa64isar2, boot->reg_id_aa64isar2);/* * Differing PARange support is fine as long as all peripherals and
@@ -789,6 +803,7 @@ static u64 __read_sysreg_by_encoding(u32 sys_id)read_sysreg_case (SYS_ID_AA64MMFR2_EL1 );read_sysreg_case (SYS_ID_AA64ISAR0_EL1 );read_sysreg_case (SYS_ID_AA64ISAR1_EL1 ); +read_sysreg_case (SYS_ID_AA64ISAR2_EL1 );read_sysreg_case (SYS_CNTFRQ_EL0 );read_sysreg_case (SYS_CTR_EL0 );
@@ -963,6 +978,12 @@ kpti_install_ng_mappings(const struct arm64_cpu_capabilities *__unused)static bool kpti_applied = false;int cpu =smp_processor_id (); +if (__this_cpu_read (this_cpu_vector) == vectors) { +const char *v =arm64_get_bp_hardening_vector (EL1_VECTOR_KPTI ); + +__this_cpu_write (this_cpu_vector, v); + } +if (kpti_applied)return ;
arch/arm64/kernel/cpuinfo.c +1 -0
@@ -334,6 +334,7 @@ static void __cpuinfo_store_cpu(struct cpuinfo_arm64 *info) info->reg_id_aa64dfr1 =read_cpuid (ID_AA64DFR1_EL1 ); info->reg_id_aa64isar0 =read_cpuid (ID_AA64ISAR0_EL1 ); info->reg_id_aa64isar1 =read_cpuid (ID_AA64ISAR1_EL1 ); + info->reg_id_aa64isar2 =read_cpuid (ID_AA64ISAR2_EL1 ); info->reg_id_aa64mmfr0 =read_cpuid (ID_AA64MMFR0_EL1 ); info->reg_id_aa64mmfr1 =read_cpuid (ID_AA64MMFR1_EL1 ); info->reg_id_aa64mmfr2 =read_cpuid (ID_AA64MMFR2_EL1 );
arch/arm64/kernel/entry.S +159 -54
323 lines not on this page · raw message
arch/arm64/kernel/vmlinux.lds.S +1 -1
@@ -259,7 +259,7 @@ ASSERT(__hibernate_exit_text_end - (__hibernate_exit_text_start & ~(SZ_4K - 1)) <= SZ_4K, "Hibernate exit text too big or misaligned") #endif #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 -ASSERT((__entry_tramp_text_end - __entry_tramp_text_start) == PAGE_SIZE, +ASSERT((__entry_tramp_text_end - __entry_tramp_text_start) <= 3*PAGE_SIZE, "Entry trampoline text too big") #endif /*
arch/arm64/kvm/hyp/hyp-entry.S +64 -0
74 lines not on this page · raw message
arch/arm64/kvm/hyp/switch.c +6 -2
@@ -34,6 +34,7 @@#include <asm/debug-monitors.h> #include <asm/processor.h> #include <asm/thread_info.h> +#include <asm/vectors.h> extern struct exception_table_entry __start___kvm_ex_table;extern struct exception_table_entry __stop___kvm_ex_table;
@@ -155,10 +156,13 @@ static void __hyp_text __activate_traps(struct kvm_vcpu *vcpu)static void deactivate_traps_vhe (void ) { -extern char vectors[];/* kernel exception vectors */ +const char *host_vectors = vectors;write_sysreg (HCR_HOST_VHE_FLAGS , hcr_el2);write_sysreg (CPACR_EL1_DEFAULT , cpacr_el1); -write_sysreg (vectors, vbar_el1); + +if (!arm64_kernel_unmapped_at_el0 ()) + host_vectors =__this_cpu_read (this_cpu_vector); +write_sysreg (host_vectors, vbar_el1); }NOKPROBE_SYMBOL (deactivate_traps_vhe);
arch/arm64/kvm/sys_regs.c +1 -1
@@ -1289,7 +1289,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {/* CRm=6 */ ID_SANITISED (ID_AA64ISAR0_EL1 ),ID_SANITISED (ID_AA64ISAR1_EL1 ), -ID_UNALLOCATED (6 ,2 ), +ID_SANITISED (ID_AA64ISAR2_EL1 ),ID_UNALLOCATED (6 ,3 ),ID_UNALLOCATED (6 ,4 ), ID_UNALLOCATED(6,5),
arch/arm64/mm/mmu.c +9 -3
@@ -541,6 +541,8 @@ early_param("rodata", parse_rodata);#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 static int __init map_entry_trampoline (void ) { +int i; +pgprot_t prot = rodata_enabled ?PAGE_KERNEL_ROX :PAGE_KERNEL_EXEC ;phys_addr_t pa_start =__pa_symbol (__entry_tramp_text_start);
@@ -549,11 +551,15 @@ static int __init map_entry_trampoline(void)/* Map only the text into the trampoline page table */ memset (tramp_pg_dir,0 ,PGD_SIZE ); -__create_pgd_mapping (tramp_pg_dir, pa_start,TRAMP_VALIAS ,PAGE_SIZE , - prot, pgd_pgtable_alloc,0 ); +__create_pgd_mapping (tramp_pg_dir, pa_start,TRAMP_VALIAS , +entry_tramp_text_size (), prot, pgd_pgtable_alloc, +0 );/* Map both the text and data into the kernel page table */ -__set_fixmap (FIX_ENTRY_TRAMP_TEXT , pa_start, prot); +for (i =0 ; i <DIV_ROUND_UP (entry_tramp_text_size (),PAGE_SIZE ); i++) +__set_fixmap (FIX_ENTRY_TRAMP_TEXT1 - i, + pa_start + i *PAGE_SIZE , prot); +if (IS_ENABLED (CONFIG_RANDOMIZE_BASE )) {extern char __entry_tramp_data_start[];
arch/ia64/kernel/acpi.c +5 -2
@@ -537,7 +537,8 @@ void __init acpi_numa_fixup(void)if (srat_num_cpus ==0 ) {node_set_online (0 ); node_cpuid[0 ].phys_id =hard_smp_processor_id (); -return ; +node_distance (0 ,0 ) =LOCAL_DISTANCE ; + goto out; }/*
@@ -580,7 +581,7 @@ void __init acpi_numa_fixup(void)for (j =0 ; j <MAX_NUMNODES ; j++)node_distance (i, j) = i == j ?LOCAL_DISTANCE :REMOTE_DISTANCE ; -return ; + goto out; }memset (numa_slit,-1 ,sizeof (numa_slit));
@@ -605,6 +606,8 @@ void __init acpi_numa_fixup(void)printk ("\n" ); }#endif +out: + node_possible_map = node_online_map; }#endif /* CONFIG_ACPI_NUMA */
arch/mips/kernel/smp.c +3 -3
@@ -372,6 +372,9 @@ asmlinkage void start_secondary(void) cpu =smp_processor_id (); cpu_data[cpu].udelay_val = loops_per_jiffy; +set_cpu_sibling_map (cpu); +set_cpu_core_map (cpu); +cpumask_set_cpu (cpu, &cpu_coherent_mask);notify_cpu_starting (cpu);
@@ -383,9 +386,6 @@ asmlinkage void start_secondary(void)/* The CPU is running and counters synchronised, now mark it online */ set_cpu_online (cpu, true); -set_cpu_sibling_map (cpu); -set_cpu_core_map (cpu); -calculate_cpu_foreign_map ();/*
drivers/atm/eni.c +2 -0
@@ -1114,6 +1114,8 @@ DPRINTK("iovcnt = %d\n",skb_shinfo(skb)->nr_frags); } paddr =dma_map_single (&eni_dev->pci_dev->dev,skb->data,skb->len,DMA_TO_DEVICE ); +if (dma_mapping_error (&eni_dev->pci_dev->dev, paddr)) +return enq_next;ENI_PRV_PADDR (skb) = paddr;/* prepare DMA queue entries */ j =0 ;
drivers/atm/firestream.c +2 -0
@@ -1692,6 +1692,8 @@ static int fs_init(struct fs_dev *dev) dev->hw_base =pci_resource_start (pci_dev,0 ); dev->base =ioremap (dev->hw_base,0x1000 ); +if (!dev->base) +return 1 ;reset_chip (dev);
drivers/crypto/qcom-rng.c +10 -7
@@ -7,6 +7,7 @@#include <linux/acpi.h> #include <linux/clk.h> #include <linux/crypto.h> +#include <linux/iopoll.h> #include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h>
@@ -42,16 +43,19 @@ static int qcom_rng_read(struct qcom_rng *rng, u8 *data, unsigned int max) {unsigned int currsize =0 ;u32 val; +int ret;/* read random data from hardware */ do { - val = readl_relaxed(rng->base + PRNG_STATUS); - if (!(val & PRNG_STATUS_DATA_AVAIL)) - break; + ret = readl_poll_timeout(rng->base + PRNG_STATUS, val, + val & PRNG_STATUS_DATA_AVAIL, + 200, 10000); + if (ret) + return ret; val = readl_relaxed(rng->base + PRNG_DATA_OUT); if (!val) - break; + return -EINVAL; if ((max - currsize) >= WORD_SZ) { memcpy(data, &val, WORD_SZ);
@@ -60,11 +64,10 @@ static int qcom_rng_read(struct qcom_rng *rng, u8 *data, unsigned int max) }else {/* copy only remaining bytes */ memcpy (data, &val, max - currsize); -break ; } }while (currsize < max); -return currsize; +return 0 ; } static int qcom_rng_generate(struct crypto_rng *tfm,
@@ -86,7 +89,7 @@ static int qcom_rng_generate(struct crypto_rng *tfm,mutex_unlock (&rng->lock);clk_disable_unprepare (rng->clk); -return 0 ; +return ret; } static int qcom_rng_seed(struct crypto_rng *tfm, const u8 *seed,
drivers/firmware/efi/apple-properties.c +1 -1
@@ -34,7 +34,7 @@ static bool dump_properties __initdata;static int __init dump_properties_enable (char *arg) { dump_properties = true; -return 0 ; +return 1 ; }__setup ("dump_apple_properties" , dump_properties_enable);
drivers/firmware/efi/efi.c +1 -1
@@ -245,7 +245,7 @@ static int __init efivar_ssdt_setup(char *str)memcpy (efivar_ssdt, str,strlen (str)); else pr_warn("efivar_ssdt: name too long: %s\n", str); -return 0 ; +return 1 ; }__setup ("efivar_ssdt=" , efivar_ssdt_setup);
drivers/gpu/drm/panel/panel-simple.c +1 -1
@@ -1244,7 +1244,7 @@ static const struct display_timing innolux_g070y2_l01_timing = {static const struct panel_desc innolux_g070y2_l01 = { .timings = &innolux_g070y2_l01_timing, .num_timings =1 , - .bpc =6 , + .bpc =8 , .size = { .width =152 , .height =91 ,
drivers/input/tablet/aiptek.c +4 -6
@@ -1814,15 +1814,13 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)input_set_abs_params (inputdev,ABS_TILT_Y ,AIPTEK_TILT_MIN ,AIPTEK_TILT_MAX ,0 ,0 );input_set_abs_params (inputdev,ABS_WHEEL ,AIPTEK_WHEEL_MIN ,AIPTEK_WHEEL_MAX -1 ,0 ,0 ); -/* Verify that a device really has an endpoint */ -if (intf->cur_altsetting->desc.bNumEndpoints <1 ) { + err =usb_find_common_endpoints (intf->cur_altsetting, +NULL ,NULL , &endpoint,NULL ); +if (err) {dev_err (&intf->dev, -"interface has %d endpoints, but must have minimum 1\n" , - intf->cur_altsetting->desc.bNumEndpoints); - err = -EINVAL ; +"interface has no int in endpoints, but must have minimum 1\n" ); goto fail3; } - endpoint = &intf->cur_altsetting->endpoint[0 ].desc;/* Go set up our URB, which is called when the tablet receives * input.
drivers/net/can/rcar/rcar_canfd.c +3 -3
@@ -1602,15 +1602,15 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,netif_napi_add (ndev, &priv->napi, rcar_canfd_rx_poll,RCANFD_NAPI_WEIGHT ); +spin_lock_init (&priv->tx_lock); +devm_can_led_init (ndev); + gpriv->ch[priv->channel] = priv; err =register_candev (ndev);if (err) {dev_err (&pdev->dev,"register_candev() failed, error %d\n" , err); goto fail_candev; } -spin_lock_init (&priv->tx_lock); -devm_can_led_init (ndev); - gpriv->ch[priv->channel] = priv;dev_info (&pdev->dev,"device registered (channel %u)\n" , priv->channel);return 0 ;
drivers/net/ethernet/sfc/mcdi.c +1 -1
@@ -166,9 +166,9 @@ static void efx_mcdi_send_request(struct efx_nic *efx, unsigned cmd,/* Serialise with efx_mcdi_ev_cpl() and efx_mcdi_ev_death() */ spin_lock_bh (&mcdi->iface_lock); ++mcdi->seqno; + seqno = mcdi->seqno &SEQ_MASK ;spin_unlock_bh (&mcdi->iface_lock); - seqno = mcdi->seqno &SEQ_MASK ; xflags =0 ;if (mcdi->mode ==MCDI_MODE_EVENTS ) xflags |=MCDI_HEADER_XFLAGS_EVREQ ;
drivers/net/hyperv/netvsc_drv.c +3 -0
@@ -1454,6 +1454,9 @@ static void netvsc_get_ethtool_stats(struct net_device *dev, pcpu_sum =kvmalloc_array (num_possible_cpus (),sizeof (struct netvsc_ethtool_pcpu_stats ),GFP_KERNEL ); +if (!pcpu_sum) +return ; +netvsc_get_pcpu_stats (dev, pcpu_sum);for_each_present_cpu (cpu) {struct netvsc_ethtool_pcpu_stats *this_sum = &pcpu_sum[cpu];
drivers/usb/gadget/function/rndis.c +1 -0
@@ -640,6 +640,7 @@ static int rndis_set_response(struct rndis_params *params, BufLength =le32_to_cpu (buf->InformationBufferLength); BufOffset =le32_to_cpu (buf->InformationBufferOffset);if ((BufLength >RNDIS_MAX_TOTAL_SIZE ) || + (BufOffset >RNDIS_MAX_TOTAL_SIZE ) || (BufOffset +8 >=RNDIS_MAX_TOTAL_SIZE ))return -EINVAL ;
drivers/usb/gadget/udc/core.c +0 -3
@@ -1297,7 +1297,6 @@ static void usb_gadget_remove_driver(struct usb_udc *udc)usb_gadget_udc_stop (udc); udc->driver =NULL ; - udc->dev.driver =NULL ; udc->gadget->dev.driver =NULL ; }
@@ -1346,7 +1345,6 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri driver->function); udc->driver = driver; - udc->dev.driver = &driver->driver; udc->gadget->dev.driver = &driver->driver;usb_gadget_udc_set_speed (udc, driver->max_speed);
@@ -1368,7 +1366,6 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dridev_err (&udc->dev,"failed to start %s: %d\n" , udc->driver->function, ret); udc->driver =NULL ; - udc->dev.driver =NULL ; udc->gadget->dev.driver =NULL ;return ret; }
fs/ocfs2/super.c +11 -11
@@ -1150,17 +1150,6 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) goto read_super_error; } - root =d_make_root (inode); -if (!root) { - status = -ENOMEM ; -mlog_errno (status); - goto read_super_error; - } - - sb->s_root = root; - -ocfs2_complete_mount_recovery (osb); - osb->osb_dev_kset =kset_create_and_add (sb->s_id,NULL , &ocfs2_kset->kobj);if (!osb->osb_dev_kset) {
@@ -1178,6 +1167,17 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) goto read_super_error; } + root =d_make_root (inode); +if (!root) { + status = -ENOMEM ; +mlog_errno (status); + goto read_super_error; + } + + sb->s_root = root; + +ocfs2_complete_mount_recovery (osb); +if (ocfs2_mount_local (osb))snprintf (nodestr,sizeof (nodestr),"local" );else
fs/sysfs/file.c +1 -2
@@ -572,8 +572,7 @@ int sysfs_emit(char *buf, const char *fmt, ...)va_list args;int len; -if (WARN (!buf ||offset_in_page (buf), -"invalid sysfs_emit: buf:%p\n" , buf)) +if (WARN (!buf,"invalid sysfs_emit: buf:%p\n" , buf))return 0 ;va_start (args, fmt);
include/linux/arm-smccc.h +7 -0
@@ -85,6 +85,13 @@ ARM_SMCCC_SMC_32, \ 0, 0x7fff) +#define ARM_SMCCC_ARCH_WORKAROUND_3 \ + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ + ARM_SMCCC_SMC_32, \ + 0, 0x3fff) + +#define SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED 1 +#ifndef __ASSEMBLY__#include <linux/linkage.h>
include/linux/if_arp.h +1 -0
@@ -55,6 +55,7 @@ static inline bool dev_is_mac_header_xmit(const struct net_device *dev)case ARPHRD_VOID :case ARPHRD_NONE :case ARPHRD_RAWIP : +case ARPHRD_PIMREG :return false;default :return true;
include/linux/topology.h +1 -0
@@ -47,6 +47,7 @@ int arch_update_cpu_topology(void);/* Conform to ACPI 2.0 SLIT distance definitions */ #define LOCAL_DISTANCE 10#define REMOTE_DISTANCE 20 +#define DISTANCE_BITS 8#ifndef node_distance#define node_distance (from,to) ((from) == (to) ? LOCAL_DISTANCE : REMOTE_DISTANCE)#endif
include/net/xfrm.h +3 -2
@@ -1763,14 +1763,15 @@ int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, const struct xfrm_migrate *m, int num_bundles, const struct xfrm_kmaddress *k, const struct xfrm_encap_tmpl *encap); -struct xfrm_state *xfrm_migrate_state_find (struct xfrm_migrate *m,struct net *net); +struct xfrm_state *xfrm_migrate_state_find (struct xfrm_migrate *m,struct net *net, +u32 if_id);struct xfrm_state *xfrm_state_migrate (struct xfrm_state *x,struct xfrm_migrate *m,struct xfrm_encap_tmpl *encap);int xfrm_migrate (const struct xfrm_selector *sel,u8 dir,u8 type,struct xfrm_migrate *m,int num_bundles,struct xfrm_kmaddress *k,struct net *net, -struct xfrm_encap_tmpl *encap); +struct xfrm_encap_tmpl *encap,u32 if_id);#endif int km_new_mapping (struct xfrm_state *x,xfrm_address_t *ipaddr,__be16 sport);
kernel/cgroup/cpuset.c +6 -2
@@ -1528,9 +1528,13 @@ static void cpuset_attach(struct cgroup_taskset *tset)cgroup_taskset_first (tset, &css); cs =css_cs (css); -cpus_read_lock ();mutex_lock (&cpuset_mutex); +/* +* It should hold cpus lock because a cpu offline event can +* cause set_cpus_allowed_ptr() failed. +*/ +get_online_cpus ();/* prepare for attach */ if (cs == &top_cpuset)cpumask_copy (cpus_attach, cpu_possible_mask);
@@ -1549,6 +1553,7 @@ static void cpuset_attach(struct cgroup_taskset *tset)cpuset_change_task_nodemask (task, &cpuset_attach_nodemask_to);cpuset_update_task_spread_flag (cs, task); } +put_online_cpus ();/* * Change mm for all threadgroup leaders. This is expensive and may
@@ -1584,7 +1589,6 @@ static void cpuset_attach(struct cgroup_taskset *tset)wake_up (&cpuset_attach_wq);mutex_unlock (&cpuset_mutex); -cpus_read_unlock (); }/* The various types of files and directories in a cpuset file system */
kernel/sched/topology.c +48 -51
170 lines not on this page · raw message
lib/Kconfig +0 -1
@@ -16,7 +16,6 @@ config BITREVERSE config HAVE_ARCH_BITREVERSE bool default n - depends on BITREVERSE help This option enables the use of hardware bit-reversal instructions on architectures which support such operations.
mm/migrate.c +8 -0
@@ -472,6 +472,10 @@ int migrate_page_move_mapping(struct address_space *mapping, pslot =radix_tree_lookup_slot (&mapping->i_pages,page_index (page)); +if (pslot ==NULL ) { +xa_unlock_irq (&mapping->i_pages); +return -EAGAIN ; + } expected_count +=hpage_nr_pages (page) +page_has_private (page); if (page_count(page) != expected_count ||
@@ -590,6 +594,10 @@ int migrate_huge_page_move_mapping(struct address_space *mapping,xa_lock_irq (&mapping->i_pages); pslot =radix_tree_lookup_slot (&mapping->i_pages,page_index (page)); +if (pslot ==NULL ) { +xa_unlock_irq (&mapping->i_pages); +return -EAGAIN ; + } expected_count =2 +page_has_private (page); if (page_count(page) != expected_count ||
net/dsa/dsa2.c +1 -0
@@ -596,6 +596,7 @@ static int dsa_port_parse_of(struct dsa_port *dp, struct device_node *dn)struct net_device *master; master =of_find_net_device_by_node (ethernet); +of_node_put (ethernet);if (!master)return -EPROBE_DEFER ;
net/ipv4/tcp.c +6 -4
@@ -1669,11 +1669,13 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,if (!copied) copied = used;break ; - }else if (used <= len) { - seq += used; - copied += used; - offset += used; } +if (WARN_ON_ONCE (used > len)) + used = len; + seq += used; + copied += used; + offset += used; +/* If recv_actor drops the lock (e.g. TCP splice * receive) the skb pointer might be invalid when * getting here: tcp_collapse might have deleted it
net/key/af_key.c +1 -1
@@ -2633,7 +2633,7 @@ static int pfkey_migrate(struct sock *sk, struct sk_buff *skb, }return xfrm_migrate (&sel, dir,XFRM_POLICY_TYPE_MAIN , m, i, - kma ? &k :NULL , net,NULL ); + kma ? &k :NULL , net,NULL ,0 ); out:return err;
net/packet/af_packet.c +10 -1
@@ -2246,8 +2246,11 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, copy_skb =skb_get (skb); skb_head = skb->data; } -if (copy_skb) +if (copy_skb) { +memset (&PACKET_SKB_CB (copy_skb)->sa.ll,0 , +sizeof (PACKET_SKB_CB (copy_skb)->sa.ll));skb_set_owner_r (copy_skb, sk); + } } snaplen = po->rx_ring.frame_size - macoff;if ((int )snaplen <0 ) {
@@ -3406,6 +3409,8 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,sock_recv_ts_and_drops (msg, sk, skb);if (msg->msg_name) { +const size_t max_len =min (sizeof (skb->cb), +sizeof (struct sockaddr_storage ));int copy_len;/* If the address length field is there to be filled
@@ -3428,6 +3433,10 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, msg->msg_namelen =sizeof (struct sockaddr_ll ); } } +if (WARN_ON_ONCE (copy_len > max_len)) { + copy_len = max_len; + msg->msg_namelen = copy_len; + }memcpy (msg->msg_name, &PACKET_SKB_CB (skb)->sa, copy_len); }
net/sctp/sm_statefuns.c +65 -43
204 lines not on this page · raw message
net/wireless/nl80211.c +2 -1
@@ -15518,7 +15518,8 @@ void cfg80211_ch_switch_notify(struct net_device *dev, wdev->chandef = *chandef; wdev->preset_chandef = *chandef; -if (wdev->iftype ==NL80211_IFTYPE_STATION && +if ((wdev->iftype ==NL80211_IFTYPE_STATION || + wdev->iftype ==NL80211_IFTYPE_P2P_CLIENT ) && !WARN_ON (!wdev->current_bss)) wdev->current_bss->pub.channel = chandef->chan;
net/xfrm/xfrm_policy.c +8 -6
@@ -3050,7 +3050,7 @@ static bool xfrm_migrate_selector_match(const struct xfrm_selector *sel_cmp, }static struct xfrm_policy *xfrm_migrate_policy_find (const struct xfrm_selector *sel, -u8 dir,u8 type,struct net *net) +u8 dir,u8 type,struct net *net,u32 if_id) {struct xfrm_policy *pol, *ret =NULL ;struct hlist_head *chain;
@@ -3059,7 +3059,8 @@ static struct xfrm_policy *xfrm_migrate_policy_find(const struct xfrm_selector *spin_lock_bh (&net->xfrm.xfrm_policy_lock); chain =policy_hash_direct (net, &sel->daddr, &sel->saddr, sel->family, dir);hlist_for_each_entry (pol, chain, bydst) { -if (xfrm_migrate_selector_match (sel, &pol->selector) && +if ((if_id ==0 || pol->if_id == if_id) && +xfrm_migrate_selector_match (sel, &pol->selector) && pol->type == type) { ret = pol; priority = ret->priority;
@@ -3071,7 +3072,8 @@ static struct xfrm_policy *xfrm_migrate_policy_find(const struct xfrm_selector *if ((pol->priority >= priority) && ret)break ; -if (xfrm_migrate_selector_match (sel, &pol->selector) && +if ((if_id ==0 || pol->if_id == if_id) && +xfrm_migrate_selector_match (sel, &pol->selector) && pol->type == type) { ret = pol;break ;
@@ -3187,7 +3189,7 @@ static int xfrm_migrate_check(const struct xfrm_migrate *m, int num_migrate)int xfrm_migrate (const struct xfrm_selector *sel,u8 dir,u8 type,struct xfrm_migrate *m,int num_migrate,struct xfrm_kmaddress *k,struct net *net, -struct xfrm_encap_tmpl *encap) +struct xfrm_encap_tmpl *encap,u32 if_id) {int i, err, nx_cur =0 , nx_new =0 ;struct xfrm_policy *pol =NULL ;
@@ -3206,14 +3208,14 @@ int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, }/* Stage 1 - find policy */ -if ((pol =xfrm_migrate_policy_find (sel, dir, type, net)) ==NULL ) { +if ((pol =xfrm_migrate_policy_find (sel, dir, type, net, if_id)) ==NULL ) { err = -ENOENT ; goto out; }/* Stage 2 - find and update state(s) */ for (i =0 , mp = m; i < num_migrate; i++, mp++) { -if ((x =xfrm_migrate_state_find (mp, net))) { +if ((x =xfrm_migrate_state_find (mp, net, if_id))) { x_cur[nx_cur] = x; nx_cur++; xc =xfrm_state_migrate (x, mp, encap);
net/xfrm/xfrm_state.c +11 -4
@@ -1442,9 +1442,6 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig,memcpy (&x->mark, &orig->mark,sizeof (x->mark));memcpy (&x->props.smark, &orig->props.smark,sizeof (x->props.smark)); -if (xfrm_init_state (x) <0 ) - goto error; - x->props.flags = orig->props.flags; x->props.extra_flags = orig->props.extra_flags;
@@ -1466,7 +1463,8 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig,return NULL ; } -struct xfrm_state *xfrm_migrate_state_find (struct xfrm_migrate *m,struct net *net) +struct xfrm_state *xfrm_migrate_state_find (struct xfrm_migrate *m,struct net *net, +u32 if_id) {unsigned int h;struct xfrm_state *x =NULL ;
@@ -1482,6 +1480,8 @@ struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *ncontinue ;if (m->reqid && x->props.reqid != m->reqid)continue ; +if (if_id !=0 && x->if_id != if_id) +continue ;if (!xfrm_addr_equal (&x->id.daddr, &m->old_daddr, m->old_family) || !xfrm_addr_equal(&x->props.saddr, &m->old_saddr,
@@ -1497,6 +1497,8 @@ struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *nif (x->props.mode != m->mode || x->id.proto != m->proto)continue ; +if (if_id !=0 && x->if_id != if_id) +continue ;if (!xfrm_addr_equal (&x->id.daddr, &m->old_daddr, m->old_family) || !xfrm_addr_equal(&x->props.saddr, &m->old_saddr,
@@ -1523,6 +1525,11 @@ struct xfrm_state *xfrm_state_migrate(struct xfrm_state *x,if (!xc)return NULL ; + xc->props.family = m->new_family; + +if (xfrm_init_state (xc) <0 ) + goto error; +memcpy (&xc->id.daddr, &m->new_daddr,sizeof (xc->id.daddr));memcpy (&xc->props.saddr, &m->new_saddr,sizeof (xc->props.saddr));
net/xfrm/xfrm_user.c +8 -19
@@ -620,13 +620,8 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,xfrm_smark_init (attrs, &x->props.smark); -if (attrs[XFRMA_IF_ID ]) { +if (attrs[XFRMA_IF_ID ]) x->if_id =nla_get_u32 (attrs[XFRMA_IF_ID ]); -if (!x->if_id) { - err = -EINVAL ; - goto error; - } - } err =__xfrm_init_state (x, false, attrs[XFRMA_OFFLOAD_DEV ]);if (err)
@@ -1332,13 +1327,8 @@ static int xfrm_alloc_userspi(struct sk_buff *skb, struct nlmsghdr *nlh, mark =xfrm_mark_get (attrs, &m); -if (attrs[XFRMA_IF_ID ]) { +if (attrs[XFRMA_IF_ID ]) if_id =nla_get_u32 (attrs[XFRMA_IF_ID ]); -if (!if_id) { - err = -EINVAL ; - goto out_noput; - } - }if (p->info.seq) { x =xfrm_find_acq_byseq (net, mark, p->info.seq);
@@ -1640,13 +1630,8 @@ static struct xfrm_policy *xfrm_policy_construct(struct net *net, struct xfrm_usxfrm_mark_get (attrs, &xp->mark); -if (attrs[XFRMA_IF_ID ]) { +if (attrs[XFRMA_IF_ID ]) xp->if_id =nla_get_u32 (attrs[XFRMA_IF_ID ]); -if (!xp->if_id) { - err = -EINVAL ; - goto error; - } - }return xp; error:
@@ -2384,6 +2369,7 @@ static int xfrm_do_migrate(struct sk_buff *skb, struct nlmsghdr *nlh,int n =0 ;struct net *net =sock_net (skb->sk);struct xfrm_encap_tmpl *encap =NULL ; +u32 if_id =0 ;if (attrs[XFRMA_MIGRATE ] ==NULL )return -EINVAL ;
@@ -2408,7 +2394,10 @@ static int xfrm_do_migrate(struct sk_buff *skb, struct nlmsghdr *nlh,return 0 ; } - err =xfrm_migrate (&pi->sel, pi->dir, type, m, n, kmp, net, encap); +if (attrs[XFRMA_IF_ID ]) + if_id =nla_get_u32 (attrs[XFRMA_IF_ID ]); + + err =xfrm_migrate (&pi->sel, pi->dir, type, m, n, kmp, net, encap, if_id);kfree (encap);
tools/perf/util/symbol.c +1 -1
@@ -217,7 +217,7 @@ void symbols__fixup_end(struct rb_root *symbols) prev = curr; curr = rb_entry(nd, struct symbol, rb_node); -if (prev->end == prev->start && prev->end != curr->start) +if (prev->end == prev->start || prev->end != curr->start)arch__symbols__fixup_end (prev, curr); }
tools/testing/selftests/vm/userfaultfd.c +1 -0
@@ -60,6 +60,7 @@#include <signal.h> #include <poll.h> #include <string.h> +#include <linux/mman.h> #include <sys/mman.h> #include <sys/syscall.h> #include <sys/ioctl.h>
virt/kvm/arm/psci.c +12 -0
@@ -429,6 +429,18 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)break ; }break ; +case ARM_SMCCC_ARCH_WORKAROUND_3 : +switch (kvm_arm_get_spectre_bhb_state ()) { +case SPECTRE_VULNERABLE : +break ; +case SPECTRE_MITIGATED : + val =SMCCC_RET_SUCCESS ; +break ; +case SPECTRE_UNAFFECTED : + val =SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED ; +break ; + } +break ; }break ;default :