Linux 6.1.114
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.1.114 kernel.
All users of the 6.1 kernel series must upgrade.
The updated 6.1.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.1.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/arm64/kernel/probes/decode-insn.c | 16 arch/arm64/kernel/probes/simulate-insn.c | 18 arch/s390/kvm/diag.c | 2 arch/s390/kvm/gaccess.c | 4 arch/s390/kvm/gaccess.h | 14 arch/x86/entry/entry.S | 5 arch/x86/entry/entry_32.S | 6 arch/x86/include/asm/cpufeatures.h | 4 arch/x86/kernel/apic/apic.c | 14 arch/x86/kernel/cpu/bugs.c | 32 arch/x86/kernel/cpu/common.c | 3 arch/x86/kernel/cpu/resctrl/core.c | 4 block/blk-rq-qos.c | 2 drivers/bluetooth/btusb.c | 13 drivers/crypto/vmx/Makefile | 12 drivers/crypto/vmx/ppc-xlate.pl | 10 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 6 drivers/gpu/drm/drm_gem_shmem_helper.c | 3 drivers/gpu/drm/radeon/radeon_encoders.c | 2 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 1 drivers/iio/adc/Kconfig | 4 drivers/iio/amplifiers/Kconfig | 1 drivers/iio/common/hid-sensors/hid-sensor-trigger.c | 2 drivers/iio/dac/Kconfig | 7 drivers/iio/light/opt3001.c | 4 drivers/iio/light/veml6030.c | 5 drivers/iio/proximity/Kconfig | 2 drivers/iommu/intel/iommu.c | 4 drivers/irqchip/irq-gic-v3-its.c | 26 drivers/irqchip/irq-sifive-plic.c | 21 drivers/net/ethernet/cadence/macb_main.c | 14 drivers/net/ethernet/freescale/enetc/enetc.c | 2 drivers/parport/procfs.c | 22 drivers/pinctrl/pinctrl-apple-gpio.c | 3 drivers/pinctrl/pinctrl-ocelot.c | 8 drivers/s390/char/sclp.c | 3 drivers/s390/char/sclp_vt220.c | 4 drivers/tty/n_gsm.c | 2 drivers/ufs/core/ufshcd.c | 4 drivers/usb/dwc3/gadget.c | 10 drivers/usb/host/xhci-ring.c | 2 drivers/usb/host/xhci.h | 2 drivers/usb/serial/option.c | 8 fs/btrfs/tree-log.c | 6 fs/fat/namei_vfat.c | 2 fs/nilfs2/dir.c | 50 fs/nilfs2/namei.c | 39 fs/nilfs2/nilfs.h | 2 fs/smb/server/mgmt/user_session.c | 26 fs/smb/server/mgmt/user_session.h | 4 fs/smb/server/server.c | 2 fs/smb/server/smb2pdu.c | 8 fs/udf/dir.c | 148 -- fs/udf/directory.c | 570 ++++++++-- fs/udf/inode.c | 90 - fs/udf/namei.c | 1049 ++++++-------------- fs/udf/udfdecl.h | 45 include/linux/fsl/enetc_mdio.h | 3 include/linux/irqchip/arm-gic-v4.h | 4 io_uring/io_uring.h | 9 kernel/time/posix-clock.c | 3 lib/maple_tree.c | 12 mm/swapfile.c | 2 net/bluetooth/af_bluetooth.c | 3 net/bluetooth/iso.c | 6 net/devlink/leftover.c | 40 net/ipv4/tcp_output.c | 4 net/mptcp/mib.c | 1 net/mptcp/mib.h | 1 net/mptcp/pm_netlink.c | 3 net/mptcp/protocol.h | 1 net/mptcp/subflow.c | 11 sound/pci/hda/patch_conexant.c | 19 75 files changed, 1235 insertions(+), 1263 deletions(-)
Aaron Thompson (3):
Bluetooth: Call iso_exit() on module unload
Bluetooth: Remove debugfs directory on module init failure
Bluetooth: ISO: Fix multiple init when debugfs is disabled
Alex Deucher (1):
drm/amdgpu/swsmu: Only force workload setup on init
Benjamin B. Frost (1):
USB: serial: option: add support for Quectel EG916Q-GL
Christophe JAILLET (1):
iio: hid-sensors: Fix an error handling path in _hid_sensor_set_report_latency()
Daniele Palmas (1):
USB: serial: option: add Telit FN920C04 MBIM compositions
Emil Gedenryd (1):
iio: light: opt3001: add missing full-scale range value
Greg Kroah-Hartman (1):
Linux 6.1.114
Jakub Kicinski (2):
devlink: drop the filter argument from devlinks_xa_find_get
devlink: bump the instance index directly when iterating
Jan Kara (21):
udf: New directory iteration code
udf: Convert udf_expand_dir_adinicb() to new directory iteration
udf: Move udf_expand_dir_adinicb() to its callsite
udf: Implement searching for directory entry using new iteration code
udf: Provide function to mark entry as deleted using new directory iteration code
udf: Convert udf_rename() to new directory iteration code
udf: Convert udf_readdir() to new directory iteration
udf: Convert udf_lookup() to use new directory iteration code
udf: Convert udf_get_parent() to new directory iteration code
udf: Convert empty_dir() to new directory iteration code
udf: Convert udf_rmdir() to new directory iteration code
udf: Convert udf_unlink() to new directory iteration code
udf: Implement adding of dir entries using new iteration code
udf: Convert udf_add_nondir() to new directory iteration
udf: Convert udf_mkdir() to new directory iteration code
udf: Convert udf_link() to new directory iteration code
udf: Remove old directory iteration code
udf: Handle error when expanding directory
udf: Don't return bh from udf_expand_dir_adinicb()
udf: Allocate name buffer in directory iterator on heap
udf: Avoid directory type conversion failure due to ENOMEM
Javier Carrasco (11):
iio: dac: ad5770r: add missing select REGMAP_SPI in Kconfig
iio: dac: ltc1660: add missing select REGMAP_SPI in Kconfig
iio: dac: stm32-dac-core: add missing select REGMAP_MMIO in Kconfig
iio: adc: ti-ads8688: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig
iio: light: veml6030: fix ALS sensor resolution
iio: light: veml6030: fix IIO device retrieval from embedded device
iio: amplifiers: ada4250: add missing select REGMAP_SPI in Kconfig
iio: dac: ad5766: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig
iio: proximity: mb1232: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig
iio: dac: ad3552r: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig
iio: adc: ti-ads124s08: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig
Jens Axboe (1):
io_uring/sqpoll: close race on waiting for sqring entries
Jim Mattson (1):
x86/cpufeatures: Define X86_FEATURE_AMD_IBPB_RET
Jinjie Ruan (1):
posix-clock: Fix missing timespec64 check in pc_clock_settime()
Johannes Wikner (4):
x86/cpufeatures: Add a IBPB_NO_RET BUG flag x86/entry: Have entry_ibpb() invalidate return predictions x86/bugs: Skip RSB fill at VMEXIT
x86/bugs: Do not use UNTRAIN_RET with IBPB on entry
Liu Shixin (1):
mm/swapfile: skip HugeTLB pages for unuse_vma
Longlong Xia (1):
tty: n_gsm: Fix use-after-free in gsm_cleanup_mux
Lorenzo Stoakes (1):
maple_tree: correct tree corruption on spanning store
Lu Baolu (1):
iommu/vt-d: Fix incorrect pci_for_each_dma_alias() for non-PCI devices
Luiz Augusto von Dentz (1):
Bluetooth: btusb: Fix regression with fake CSR controllers 0a12:0001
Ma Ke (1):
pinctrl: apple: check devm_kasprintf() returned value
Marc Zyngier (1):
irqchip/gic-v4: Don't allow a VMOVP on a dying VPE
Mark Rutland (2):
arm64: probes: Remove broken LDR (literal) uprobe support
arm64: probes: Fix simulate_ldr*_literal()
Mathias Nyman (2):
xhci: Fix incorrect stream context type macro
xhci: Mitigate failed set dequeue pointer commands
Matthieu Baerts (NGI0) (1):
mptcp: pm: fix UaF read in mptcp_pm_nl_rm_addr_or_subflow
Michael Mueller (1):
KVM: s390: Change virtual to physical address access in diag 0x258 handler
Mohammed Anees (1):
drm/amdgpu: prevent BO_HANDLES error from being overwritten
Nam Cao (1):
irqchip/sifive-plic: Unmask interrupt in plic_irq_enable()
Namjae Jeon (1):
ksmbd: fix user-after-free from session log off
Nathan Chancellor (1):
x86/resctrl: Annotate get_mem_config() functions as __init
Nianyao Tang (1):
irqchip/gic-v3-its: Fix VSYNC referencing an unmapped VPE on GIC v4.1
Nicholas Piggin (1):
powerpc/64: Add big-endian ELFv2 flavour to crypto VMX asm generation
Nico Boehr (1):
KVM: s390: gaccess: Check if guest address is in memslot
Nikolay Kuratov (1):
drm/vmwgfx: Handle surface check failure correctly
OGAWA Hirofumi (1):
fat: fix uninitialized variable
Oleksij Rempel (1):
net: macb: Avoid 20s boot delay by skipping MDIO bus registration for fixed-link PHY
Omar Sandoval (1):
blk-rq-qos: fix crash on rq_qos_wait vs. rq_qos_wake_function race
Paolo Abeni (2):
tcp: fix mptcp DSS corruption due to large pmtu xmit
mptcp: prevent MPC handshake on port-based signal endpoints
Pawan Gupta (2):
x86/entry_32: Do not clobber user EFLAGS.ZF x86/entry_32: Clear CPU buffers after register restore in NMI return
Prashanth K (1):
usb: dwc3: Wait for EndXfer completion before restoring GUSB2PHYCFG
Roi Martin (2):
btrfs: fix uninitialized pointer free in add_inode_ref()
btrfs: fix uninitialized pointer free on read_alloc_one_name() error
Ryusuke Konishi (1):
nilfs2: propagate directory read errors from nilfs_find_entry()
Sergey Matsievskiy (1):
pinctrl: ocelot: fix system hang on level based interrupts
Seunghwan Baek (1):
scsi: ufs: core: Set SDEV_OFFLINE when UFS is shut down
Takashi Iwai (1):
parport: Proper fix for array out-of-bounds access
Thomas Weißschuh (2):
s390/sclp: Deactivate sclp after all its users s390/sclp_vt220: Convert newlines to CRLF instead of LFCR
Vasiliy Kovalev (2):
ALSA: hda/conexant - Fix audio routing for HP EliteOne 1000 G2
ALSA: hda/conexant - Use cached pin control for Node 0x1d on HP EliteOne 1000 G2
Ville Syrjälä (1):
drm/radeon: Fix encoder->possible_clones
Wachowski, Karol (1):
drm/shmem-helper: Fix BUG_ON() on mmap(PROT_WRITE, MAP_PRIVATE)
Wei Fang (2):
net: enetc: remove xdp_drops statistic from enetc_xdp_drop()
net: enetc: add missing static descriptor and inline keyword
Zhang Rui (1):
x86/apic: Always explicitly disarm TSC-deadline timer
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 1 -SUBLEVEL = 113 +SUBLEVEL = 114 EXTRAVERSION = NAME = Curry Ramen
arch/arm64/kernel/probes/decode-insn.c +11 -5
@@ -99,10 +99,6 @@ arm_probe_decode_insn(probe_opcode_t insn, struct arch_probe_insn *api) aarch64_insn_is_blr(insn) || aarch64_insn_is_ret(insn)) { api->handler = simulate_br_blr_ret; - } else if (aarch64_insn_is_ldr_lit(insn)) { - api->handler = simulate_ldr_literal; - } else if (aarch64_insn_is_ldrsw_lit(insn)) { - api->handler = simulate_ldrsw_literal; } else {/* * Instruction cannot be stepped out-of-line and we don't
@@ -140,6 +136,17 @@ arm_kprobe_decode_insn(kprobe_opcode_t *addr, struct arch_specific_insn *asi)probe_opcode_t insn =le32_to_cpu (*addr);probe_opcode_t *scan_end =NULL ;unsigned long size =0 , offset =0 ; +struct arch_probe_insn *api = &asi->api; + +if (aarch64_insn_is_ldr_lit (insn)) { + api->handler = simulate_ldr_literal; + decoded =INSN_GOOD_NO_SLOT ; + }else if (aarch64_insn_is_ldrsw_lit (insn)) { + api->handler = simulate_ldrsw_literal; + decoded =INSN_GOOD_NO_SLOT ; + }else { + decoded =arm_probe_decode_insn (insn, &asi->api); + }/* * If there's a symbol defined in front of and near enough to
@@ -157,7 +164,6 @@ arm_kprobe_decode_insn(kprobe_opcode_t *addr, struct arch_specific_insn *asi)else scan_end = addr -MAX_ATOMIC_CONTEXT_SIZE ; } - decoded =arm_probe_decode_insn (insn, &asi->api);if (decoded !=INSN_REJECTED && scan_end)if (is_probed_address_atomic (addr -1 , scan_end))
arch/arm64/kernel/probes/simulate-insn.c +7 -11
@@ -171,17 +171,15 @@ simulate_tbz_tbnz(u32 opcode, long addr, struct pt_regs *regs)void __kprobes simulate_ldr_literal (u32 opcode,long addr,struct pt_regs *regs) { -u64 *load_addr; +unsigned long load_addr;int xn = opcode &0x1f ; -int disp; - disp =ldr_displacement (opcode); - load_addr = (u64 *) (addr + disp); + load_addr = addr +ldr_displacement (opcode);if (opcode & (1 <<30 ))/* x0-x30 */ -set_x_reg (regs, xn, *load_addr); +set_x_reg (regs, xn,READ_ONCE (*(u64 *)load_addr));else /* w0-w30 */ -set_w_reg (regs, xn, *load_addr); +set_w_reg (regs, xn,READ_ONCE (*(u32 *)load_addr));instruction_pointer_set (regs,instruction_pointer (regs) +4 ); }
@@ -189,14 +187,12 @@ simulate_ldr_literal(u32 opcode, long addr, struct pt_regs *regs)void __kprobes simulate_ldrsw_literal (u32 opcode,long addr,struct pt_regs *regs) { -s32 *load_addr; +unsigned long load_addr;int xn = opcode &0x1f ; -int disp; - disp =ldr_displacement (opcode); - load_addr = (s32 *) (addr + disp); + load_addr = addr +ldr_displacement (opcode); -set_x_reg (regs, xn, *load_addr); +set_x_reg (regs, xn,READ_ONCE (*(s32 *)load_addr));instruction_pointer_set (regs,instruction_pointer (regs) +4 ); }
arch/s390/kvm/diag.c +1 -1
@@ -77,7 +77,7 @@ static int __diag_page_ref_service(struct kvm_vcpu *vcpu) vcpu->stat.instruction_diagnose_258++;if (vcpu->run->s.regs.gprs[rx] &7 )return kvm_s390_inject_program_int (vcpu,PGM_SPECIFICATION ); - rc =read_guest (vcpu, vcpu->run->s.regs.gprs[rx], rx, &parm,sizeof (parm)); + rc =read_guest_real (vcpu, vcpu->run->s.regs.gprs[rx], &parm,sizeof (parm));if (rc)return kvm_s390_inject_prog_cond (vcpu, rc);if (parm.parm_version !=2 || parm.parm_len <5 || parm.code !=0x258 )
arch/s390/kvm/gaccess.c +4 -0
@@ -1001,6 +1001,8 @@ static int access_guest_page(struct kvm *kvm, enum gacc_mode mode, gpa_t gpa,const gfn_t gfn =gpa_to_gfn (gpa);int rc; +if (!gfn_to_memslot (kvm, gfn)) +return PGM_ADDRESSING ;if (mode ==GACC_STORE ) rc =kvm_write_guest_page (kvm, gfn, data, offset, len);else
@@ -1158,6 +1160,8 @@ int access_guest_real(struct kvm_vcpu *vcpu, unsigned long gra, gra += fragment_len; data += fragment_len; } +if (rc >0 ) + vcpu->arch.pgm.code = rc;return rc; }
arch/s390/kvm/gaccess.h +8 -6
@@ -402,11 +402,12 @@ int read_guest_abs(struct kvm_vcpu *vcpu, unsigned long gpa, void *data,* @len: number of bytes to copy * * Copy @len bytes from @data (kernel space) to @gra (guest real address). -* It is up to the caller to ensure that the entire guest memory range is -* valid memory before calling this function. * Guest low address and key protection are not checked. * -* Returns zero on success or -EFAULT on error. +* Returns zero on success, -EFAULT when copying from @data failed, or +* PGM_ADRESSING in case @gra is outside a memslot. In this case, pgm check info +* is also stored to allow injecting into the guest (if applicable) using +* kvm_s390_inject_prog_cond(). * * If an error occurs data may have been copied partially to guest memory. */
@@ -425,11 +426,12 @@ int write_guest_real(struct kvm_vcpu *vcpu, unsigned long gra, void *data,* @len: number of bytes to copy * * Copy @len bytes from @gra (guest real address) to @data (kernel space). -* It is up to the caller to ensure that the entire guest memory range is -* valid memory before calling this function. * Guest key protection is not checked. * -* Returns zero on success or -EFAULT on error. +* Returns zero on success, -EFAULT when copying to @data failed, or +* PGM_ADRESSING in case @gra is outside a memslot. In this case, pgm check info +* is also stored to allow injecting into the guest (if applicable) using +* kvm_s390_inject_prog_cond(). * * If an error occurs data may have been copied partially to kernel space. */
arch/x86/entry/entry.S +5 -0
@@ -9,6 +9,8 @@ #include <asm/unwind_hints.h> #include <asm/segment.h> #include <asm/cache.h> +#include <asm/cpufeatures.h> +#include <asm/nospec-branch.h> .pushsection .noinstr.text, "ax"
@@ -17,6 +19,9 @@ SYM_FUNC_START(entry_ibpb) movl $PRED_CMD_IBPB, %eax xorl %edx, %edx wrmsr + + /* Make sure IBPB clears return stack preductions too. */ + FILL_RETURN_BUFFER %rax, RSB_CLEAR_LOOPS, X86_BUG_IBPB_NO_RET RET SYM_FUNC_END(entry_ibpb) /* For KVM */
arch/x86/entry/entry_32.S +4 -2
@@ -902,6 +902,8 @@ SYM_FUNC_START(entry_SYSENTER_32) /* Now ready to switch the cr3 */ SWITCH_TO_USER_CR3 scratch_reg=%eax + /* Clobbers ZF */ + CLEAR_CPU_BUFFERS /* * Restore all flags except IF. (We restore IF separately because
@@ -912,7 +914,6 @@ SYM_FUNC_START(entry_SYSENTER_32) BUG_IF_WRONG_CR3 no_user_check=1 popfl popl %eax - CLEAR_CPU_BUFFERS /* * Return back to the vDSO, which will pop ecx and edx.
@@ -1175,7 +1176,6 @@ SYM_CODE_START(asm_exc_nmi) /* Not on SYSENTER stack. */ call exc_nmi - CLEAR_CPU_BUFFERS jmp .Lnmi_return .Lnmi_from_sysenter_stack:
@@ -1196,6 +1196,7 @@ SYM_CODE_START(asm_exc_nmi) CHECK_AND_APPLY_ESPFIX RESTORE_ALL_NMI cr3_reg=%edi pop=4 + CLEAR_CPU_BUFFERS jmp .Lirq_return #ifdef CONFIG_X86_ESPFIX32
@@ -1237,6 +1238,7 @@ SYM_CODE_START(asm_exc_nmi) * 1 - orig_ax */ lss (1+5+6)*4(%esp), %esp # back to espfix stack + CLEAR_CPU_BUFFERS jmp .Lirq_return #endif SYM_CODE_END(asm_exc_nmi)
arch/x86/include/asm/cpufeatures.h +3 -1
@@ -217,7 +217,7 @@#define X86_FEATURE_SPEC_STORE_BYPASS_DISABLE ( 7*32+23)/* "" Disable Speculative Store Bypass. */ #define X86_FEATURE_LS_CFG_SSBD ( 7*32+24)/* "" AMD SSBD implementation via LS_CFG MSR */ #define X86_FEATURE_IBRS ( 7*32+25)/* Indirect Branch Restricted Speculation */ -#define X86_FEATURE_IBPB ( 7*32+26)/* Indirect Branch Prediction Barrier */ +#define X86_FEATURE_IBPB ( 7*32+26)/* "ibpb" Indirect Branch Prediction Barrier without a guaranteed RSB flush */ #define X86_FEATURE_STIBP ( 7*32+27)/* Single Thread Indirect Branch Predictors */ #define X86_FEATURE_ZEN (7*32+28)/* "" CPU based on Zen microarchitecture */ #define X86_FEATURE_L1TF_PTEINV ( 7*32+29)/* "" L1TF workaround PTE inversion */
@@ -332,6 +332,7 @@#define X86_FEATURE_AMD_SSB_NO (13*32+26)/* "" Speculative Store Bypass is fixed in hardware. */ #define X86_FEATURE_CPPC (13*32+27)/* Collaborative Processor Performance Control */ #define X86_FEATURE_BTC_NO (13*32+29)/* "" Not vulnerable to Branch Type Confusion */ +#define X86_FEATURE_AMD_IBPB_RET (13*32+30)/* "" IBPB clears return address predictor */ #define X86_FEATURE_BRS (13*32+31)/* Branch Sampling available */ /* Thermal and Power Management Leaf, CPUID level 0x00000006 (EAX), word 14 */
@@ -492,4 +493,5 @@#define X86_BUG_DIV0 X86_BUG(1*32 + 1)/* AMD DIV0 speculation bug */ #define X86_BUG_RFDS X86_BUG(1*32 + 2)/* CPU is vulnerable to Register File Data Sampling */ #define X86_BUG_BHI X86_BUG(1*32 + 3)/* CPU is affected by Branch History Injection */ +#define X86_BUG_IBPB_NO_RET X86_BUG(1*32 + 4)/* "ibpb_no_ret" IBPB omits return target predictions */ #endif /* _ASM_X86_CPUFEATURES_H */
arch/x86/kernel/apic/apic.c +13 -1
@@ -503,7 +503,19 @@ static int lapic_timer_shutdown(struct clock_event_device *evt) v =apic_read (APIC_LVTT ); v |= (APIC_LVT_MASKED |LOCAL_TIMER_VECTOR );apic_write (APIC_LVTT , v); -apic_write (APIC_TMICT ,0 ); + +/* +* Setting APIC_LVT_MASKED (above) should be enough to tell +* the hardware that this timer will never fire. But AMD +* erratum 411 and some Intel CPU behavior circa 2024 say +* otherwise. Time for belt and suspenders programming: mask +* the timer _and_ zero the counter registers: +*/ +if (v &APIC_LVT_TIMER_TSCDEADLINE ) +wrmsrl (MSR_IA32_TSC_DEADLINE ,0 ); +else +apic_write (APIC_TMICT ,0 ); +return 0 ; }
arch/x86/kernel/cpu/bugs.c +32 -0
@@ -1092,7 +1092,24 @@ static void __init retbleed_select_mitigation(void)case RETBLEED_MITIGATION_IBPB :setup_force_cpu_cap (X86_FEATURE_ENTRY_IBPB ); + +/* +* IBPB on entry already obviates the need for +* software-based untraining so clear those in case some +* other mitigation like SRSO has selected them. +*/ +setup_clear_cpu_cap (X86_FEATURE_UNRET ); +setup_clear_cpu_cap (X86_FEATURE_RETHUNK ); + mitigate_smt = true; + +/* +* There is no need for RSB filling: entry_ibpb() ensures +* all predictions, including the RSB, are invalidated, +* regardless of IBPB implementation. +*/ +setup_clear_cpu_cap (X86_FEATURE_RSB_VMEXIT ); +break ;default :
@@ -2591,6 +2608,14 @@ static void __init srso_select_mitigation(void)if (has_microcode) {setup_force_cpu_cap (X86_FEATURE_ENTRY_IBPB ); srso_mitigation =SRSO_MITIGATION_IBPB ; + +/* +* IBPB on entry already obviates the need for +* software-based untraining so clear those in case some +* other mitigation like Retbleed has selected them. +*/ +setup_clear_cpu_cap (X86_FEATURE_UNRET ); +setup_clear_cpu_cap (X86_FEATURE_RETHUNK ); } }else {pr_err ("WARNING: kernel not compiled with CPU_IBPB_ENTRY.\n" );
@@ -2603,6 +2628,13 @@ static void __init srso_select_mitigation(void)if (!boot_cpu_has (X86_FEATURE_ENTRY_IBPB ) && has_microcode) {setup_force_cpu_cap (X86_FEATURE_IBPB_ON_VMEXIT ); srso_mitigation =SRSO_MITIGATION_IBPB_ON_VMEXIT ; + +/* +* There is no need for RSB filling: entry_ibpb() ensures +* all predictions, including the RSB, are invalidated, +* regardless of IBPB implementation. +*/ +setup_clear_cpu_cap (X86_FEATURE_RSB_VMEXIT ); } }else {pr_err ("WARNING: kernel not compiled with CPU_SRSO.\n" );
arch/x86/kernel/cpu/common.c +3 -0
@@ -1462,6 +1462,9 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c) boot_cpu_has(X86_FEATURE_HYPERVISOR)))setup_force_cpu_bug (X86_BUG_BHI ); +if (cpu_has (c,X86_FEATURE_AMD_IBPB ) && !cpu_has (c,X86_FEATURE_AMD_IBPB_RET )) +setup_force_cpu_bug (X86_BUG_IBPB_NO_RET ); +if (cpu_matches (cpu_vuln_whitelist,NO_MELTDOWN ))return ;
arch/x86/kernel/cpu/resctrl/core.c +2 -2
@@ -174,7 +174,7 @@ static inline bool rdt_get_mb_table(struct rdt_resource *r)return false; } -static bool __get_mem_config_intel (struct rdt_resource *r) +static __init bool __get_mem_config_intel (struct rdt_resource *r) {struct rdt_hw_resource *hw_res =resctrl_to_arch_res (r);union cpuid_0x10_3_eax eax;
@@ -208,7 +208,7 @@ static bool __get_mem_config_intel(struct rdt_resource *r)return true; } -static bool __rdt_get_mem_config_amd (struct rdt_resource *r) +static __init bool __rdt_get_mem_config_amd (struct rdt_resource *r) {struct rdt_hw_resource *hw_res =resctrl_to_arch_res (r);union cpuid_0x10_3_eax eax;
block/blk-rq-qos.c +1 -1
@@ -219,8 +219,8 @@ static int rq_qos_wake_function(struct wait_queue_entry *curr, data->got_token = true;smp_wmb (); -list_del_init (&curr->entry);wake_up_process (data->task); +list_del_init_careful (&curr->entry);return 1 ; }
drivers/bluetooth/btusb.c +9 -4
@@ -1191,10 +1191,15 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)if (!urb)return -ENOMEM ; -/* Use maximum HCI Event size so the USB stack handles -* ZPL/short-transfer automatically. -*/ - size =HCI_MAX_EVENT_SIZE ; +if (le16_to_cpu (data->udev->descriptor.idVendor) ==0x0a12 && +le16_to_cpu (data->udev->descriptor.idProduct) ==0x0001 ) +/* Fake CSR devices don't seem to support sort-transter */ + size =le16_to_cpu (data->intr_ep->wMaxPacketSize); +else +/* Use maximum HCI Event size so the USB stack handles +* ZPL/short-transfer automatically. +*/ + size =HCI_MAX_EVENT_SIZE ; buf =kmalloc (size, mem_flags);if (!buf) {
drivers/crypto/vmx/Makefile +11 -1
@@ -2,8 +2,18 @@ obj-$(CONFIG_CRYPTO_DEV_VMX_ENCRYPT) += vmx-crypto.o vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes_xts.o ghash.o +ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y) +override flavour := linux-ppc64le +else +ifdef CONFIG_PPC64_ELF_ABI_V2 +override flavour := linux-ppc64-elfv2 +else +override flavour := linux-ppc64 +endif +endif + quiet_cmd_perl = PERL $@ - cmd_perl = $(PERL) $< $(if $(CONFIG_CPU_LITTLE_ENDIAN), linux-ppc64le, linux-ppc64) > $@ + cmd_perl = $(PERL) $< $(flavour) > $@ targets += aesp8-ppc.S ghashp8-ppc.S
drivers/crypto/vmx/ppc-xlate.pl +6 -4
@@ -9,6 +9,8 @@ open STDOUT,">$output" || die "can't open $output: $!"; my %GLOBALS; my $dotinlocallabels=($flavour=~/linux/)?1:0; +my $elfv2abi=(($flavour =~ /linux-ppc64le/) or ($flavour =~ /linux-ppc64-elfv2/))?1:0; +my $dotfunctions=($elfv2abi=~1)?0:1; ################################################################ # directives which need special treatment on different platforms
@@ -40,7 +42,7 @@ my $globl = sub { }; my $text = sub { my $ret = ($flavour =~ /aix/) ? ".csect\t.text[PR],7" : ".text"; - $ret = ".abiversion 2\n".$ret if ($flavour =~ /linux.*64le/); + $ret = ".abiversion 2\n".$ret if ($elfv2abi); $ret; }; my $machine = sub {
@@ -56,8 +58,8 @@ my $size = sub { if ($flavour =~ /linux/) { shift; my $name = shift; $name =~ s|^[\.\_]||; - my $ret = ".size $name,.-".($flavour=~/64$/?".":"").$name; - $ret .= "\n.size .$name,.-.$name" if ($flavour=~/64$/); + my $ret = ".size $name,.-".($dotfunctions?".":"").$name; + $ret .= "\n.size .$name,.-.$name" if ($dotfunctions); $ret; } else
@@ -142,7 +144,7 @@ my $vmr = sub { # Some ABIs specify vrsave, special-purpose register #256, as reserved # for system use. -my $no_vrsave = ($flavour =~ /linux-ppc64le/); +my $no_vrsave = ($elfv2abi); my $mtspr = sub { my ($f,$idx,$ra) = @_; if ($idx == 256 && $no_vrsave) {
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +1 -1
@@ -259,7 +259,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,/* Only a single BO list is allowed to simplify handling. */ if (p->bo_list) - ret = -EINVAL ; + goto free_partial_kdata; ret =amdgpu_cs_p1_bo_handles (p, p->chunks[i].kdata);if (ret)
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +3 -3
@@ -1831,7 +1831,7 @@ static int smu_bump_power_profile_mode(struct smu_context *smu,static int smu_adjust_power_state_dynamic (struct smu_context *smu,enum amd_dpm_forced_level level,bool skip_display_settings, -bool force_update) +bool init) {int ret =0 ;int index =0 ;
@@ -1860,7 +1860,7 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu, } } -if (force_update || smu_dpm_ctx->dpm_level != level) { +if (smu_dpm_ctx->dpm_level != level) { ret =smu_asic_set_performance_level (smu, level);if (ret) {dev_err (smu->adev->dev,"Failed to set performance level!" );
@@ -1877,7 +1877,7 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu, index = index >0 && index <=WORKLOAD_POLICY_MAX ? index -1 :0 ; workload[0 ] = smu->workload_setting[index]; -if (force_update || smu->power_profile_mode != workload[0 ]) +if (init || smu->power_profile_mode != workload[0 ])smu_bump_power_profile_mode (smu, workload,0 ); }
drivers/gpu/drm/drm_gem_shmem_helper.c +3 -0
@@ -638,6 +638,9 @@ int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_structreturn ret; } +if (is_cow_mapping (vma->vm_flags)) +return -EINVAL ; + ret =drm_gem_shmem_get_pages (shmem);if (ret)return ret;
drivers/gpu/drm/radeon/radeon_encoders.c +1 -1
@@ -43,7 +43,7 @@ static uint32_t radeon_encoder_clones(struct drm_encoder *encoder)struct radeon_device *rdev = dev->dev_private;struct radeon_encoder *radeon_encoder =to_radeon_encoder (encoder);struct drm_encoder *clone_encoder; -uint32_t index_mask =0 ; +uint32_t index_mask =drm_encoder_mask (encoder);int count;/* DIG routing gets problematic */
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +1 -0
@@ -1591,6 +1591,7 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,DRM_ERROR ("Surface size cannot exceed %dx%d\n" , dev_priv->texture_max_width, dev_priv->texture_max_height); + ret = -EINVAL ; goto err_out; }
drivers/iio/adc/Kconfig +4 -0
@@ -1193,6 +1193,8 @@ config TI_ADS8344 config TI_ADS8688 tristate "Texas Instruments ADS8688" depends on SPI + select IIO_BUFFER + select IIO_TRIGGERED_BUFFER help If you say yes here you get support for Texas Instruments ADS8684 and and ADS8688 ADC chips
@@ -1203,6 +1205,8 @@ config TI_ADS8688 config TI_ADS124S08 tristate "Texas Instruments ADS124S08" depends on SPI + select IIO_BUFFER + select IIO_TRIGGERED_BUFFER help If you say yes here you get support for Texas Instruments ADS124S08 and ADS124S06 ADC chips
drivers/iio/amplifiers/Kconfig +1 -0
@@ -26,6 +26,7 @@ config AD8366 config ADA4250 tristate "Analog Devices ADA4250 Instrumentation Amplifier" depends on SPI + select REGMAP_SPI help Say yes here to build support for Analog Devices ADA4250 SPI Amplifier's support. The driver provides direct access via
drivers/iio/common/hid-sensors/hid-sensor-trigger.c +1 -1
@@ -32,7 +32,7 @@ static ssize_t _hid_sensor_set_report_latency(struct device *dev, latency = integer *1000 + fract /1000 ; ret =hid_sensor_set_report_latency (attrb, latency);if (ret <0 ) -return len; +return ret; attrb->latency_ms =hid_sensor_get_report_latency (attrb);
drivers/iio/dac/Kconfig +7 -0
@@ -9,6 +9,8 @@ menu "Digital to analog converters" config AD3552R tristate "Analog Devices AD3552R DAC driver" depends on SPI_MASTER + select IIO_BUFFER + select IIO_TRIGGERED_BUFFER help Say yes here to build support for Analog Devices AD3552R Digital to Analog Converter.
@@ -214,6 +216,8 @@ config AD5764 config AD5766 tristate "Analog Devices AD5766/AD5767 DAC driver" depends on SPI_MASTER + select IIO_BUFFER + select IIO_TRIGGERED_BUFFER help Say yes here to build support for Analog Devices AD5766, AD5767 Digital to Analog Converter.
@@ -224,6 +228,7 @@ config AD5766 config AD5770R tristate "Analog Devices AD5770R IDAC driver" depends on SPI_MASTER + select REGMAP_SPI help Say yes here to build support for Analog Devices AD5770R Digital to Analog Converter.
@@ -314,6 +319,7 @@ config LPC18XX_DAC config LTC1660 tristate "Linear Technology LTC1660/LTC1665 DAC SPI driver" depends on SPI + select REGMAP_SPI help Say yes here to build support for Linear Technology LTC1660 and LTC1665 Digital to Analog Converters.
@@ -399,6 +405,7 @@ config STM32_DAC config STM32_DAC_CORE tristate + select REGMAP_MMIO config TI_DAC082S085 tristate "Texas Instruments 8/10/12-bit 2/4-channel DAC driver"
drivers/iio/light/opt3001.c +4 -0
@@ -138,6 +138,10 @@ static const struct opt3001_scale opt3001_scales[] = { .val = 20966, .val2 = 400000, }, + { + .val = 41932, + .val2 = 800000, + }, { .val = 83865, .val2 = 600000,
drivers/iio/light/veml6030.c +2 -3
@@ -99,9 +99,8 @@ static const char * const period_values[] = {static ssize_t in_illuminance_period_available_show (struct device *dev,struct device_attribute *attr,char *buf) { +struct veml6030_data *data =iio_priv (dev_to_iio_dev (dev));int ret, reg, x; -struct iio_dev *indio_dev =i2c_get_clientdata (to_i2c_client (dev)); -struct veml6030_data *data =iio_priv (indio_dev); ret =regmap_read (data->regmap,VEML6030_REG_ALS_CONF , ®);if (ret) {
@@ -780,7 +779,7 @@ static int veml6030_hw_init(struct iio_dev *indio_dev)/* Cache currently active measurement parameters */ data->cur_gain =3 ; - data->cur_resolution =4608 ; + data->cur_resolution =5376 ; data->cur_integration_time =3 ;return ret;
drivers/iio/proximity/Kconfig +2 -0
@@ -60,6 +60,8 @@ config LIDAR_LITE_V2 config MB1232 tristate "MaxSonar I2CXL family ultrasonic sensors" depends on I2C + select IIO_BUFFER + select IIO_TRIGGERED_BUFFER help Say Y to build a driver for the ultrasonic sensors I2CXL of MaxBotix which have an i2c interface. It can be used to measure
drivers/iommu/intel/iommu.c +3 -1
@@ -4090,8 +4090,10 @@ static int domain_context_clear_one_cb(struct pci_dev *pdev, u16 alias, void *op*/ static void domain_context_clear (struct device_domain_info *info) { -if (!dev_is_pci (info->dev)) +if (!dev_is_pci (info->dev)) {domain_context_clear_one (info, info->bus, info->devfn); +return ; + }pci_for_each_dma_alias (to_pci_dev (info->dev), &domain_context_clear_one_cb, info);
drivers/irqchip/irq-gic-v3-its.c +19 -7
@@ -783,6 +783,7 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,struct its_cmd_block *cmd, struct its_cmd_desc *desc) { + struct its_vpe *vpe = valid_vpe(its, desc->its_vmapp_cmd.vpe);unsigned long vpt_addr, vconf_addr;u64 target;bool alloc;
@@ -792,9 +793,14 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,its_encode_valid (cmd, desc->its_vmapp_cmd.valid);if (!desc->its_vmapp_cmd.valid) { + alloc = !atomic_dec_return (&desc->its_vmapp_cmd.vpe->vmapp_count);if (is_v4_1 (its)) { - alloc = !atomic_dec_return (&desc->its_vmapp_cmd.vpe->vmapp_count);its_encode_alloc (cmd, alloc); +/* +* Unmapping a VPE is self-synchronizing on GICv4.1, +* no need to issue a VSYNC. +*/ + vpe =NULL ; } goto out;
@@ -807,13 +813,13 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,its_encode_vpt_addr (cmd, vpt_addr);its_encode_vpt_size (cmd,LPI_NRBITS -1 ); + alloc = !atomic_fetch_inc (&desc->its_vmapp_cmd.vpe->vmapp_count); +if (!is_v4_1 (its)) goto out; vconf_addr =virt_to_phys (page_address (desc->its_vmapp_cmd.vpe->its_vm->vprop_page)); - alloc = !atomic_fetch_inc (&desc->its_vmapp_cmd.vpe->vmapp_count); -its_encode_alloc (cmd, alloc);/*
@@ -829,7 +835,7 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its, out:its_fixup_cmd (cmd); -return valid_vpe (its, desc->its_vmapp_cmd.vpe); +return vpe; } static struct its_vpe *its_build_vmapti_cmd(struct its_node *its,
@@ -3789,6 +3795,13 @@ static int its_vpe_set_affinity(struct irq_data *d,unsigned long flags;int from, cpu; +/* +* Check if we're racing against a VPE being destroyed, for +* which we don't want to allow a VMOVP. +*/ +if (!atomic_read (&vpe->vmapp_count)) +return -EINVAL ; +/* * Changing affinity is mega expensive, so let's be as lazy as * we can and only do it if we really have to. Also, if mapped
@@ -4425,9 +4438,8 @@ static int its_vpe_init(struct its_vpe *vpe)raw_spin_lock_init (&vpe->vpe_lock); vpe->vpe_id = vpe_id; vpe->vpt_page = vpt_page; -if (gic_rdists->has_rvpeid) -atomic_set (&vpe->vmapp_count,0 ); -else +atomic_set (&vpe->vmapp_count,0 ); +if (!gic_rdists->has_rvpeid) vpe->vpe_proxy_event =-1 ;return 0 ;
drivers/irqchip/irq-sifive-plic.c +11 -10
@@ -116,16 +116,6 @@ static inline void plic_irq_toggle(const struct cpumask *mask, } } -static void plic_irq_enable (struct irq_data *d) -{ -plic_irq_toggle (irq_data_get_effective_affinity_mask (d), d,1 ); -} - -static void plic_irq_disable (struct irq_data *d) -{ -plic_irq_toggle (irq_data_get_effective_affinity_mask (d), d,0 ); -} -static void plic_irq_unmask (struct irq_data *d) {struct plic_priv *priv =irq_data_get_irq_chip_data (d);
@@ -140,6 +130,17 @@ static void plic_irq_mask(struct irq_data *d)writel (0 , priv->regs +PRIORITY_BASE + d->hwirq *PRIORITY_PER_ID ); } +static void plic_irq_enable (struct irq_data *d) +{ +plic_irq_toggle (irq_data_get_effective_affinity_mask (d), d,1 ); +plic_irq_unmask (d); +} + +static void plic_irq_disable (struct irq_data *d) +{ +plic_irq_toggle (irq_data_get_effective_affinity_mask (d), d,0 ); +} +static void plic_irq_eoi (struct irq_data *d) {struct plic_handler *handler =this_cpu_ptr (&plic_handlers);
drivers/net/ethernet/cadence/macb_main.c +11 -3
@@ -878,9 +878,6 @@ static int macb_mdiobus_register(struct macb *bp)return ret; } -if (of_phy_is_fixed_link (np)) -return mdiobus_register (bp->mii_bus); -/* Only create the PHY from the device tree if at least one PHY is * described. Otherwise scan the entire MDIO bus. We do this to support * old device tree that did not follow the best practices and did not
@@ -901,8 +898,19 @@ static int macb_mdiobus_register(struct macb *bp)static int macb_mii_init (struct macb *bp) { +struct device_node *child, *np = bp->pdev->dev.of_node;int err = -ENXIO ; +/* With fixed-link, we don't need to register the MDIO bus, +* except if we have a child named "mdio" in the device tree. +* In that case, some devices may be attached to the MACB's MDIO bus. +*/ + child =of_get_child_by_name (np,"mdio" ); +if (child) +of_node_put (child); +else if (of_phy_is_fixed_link (np)) +return macb_mii_probe (bp->dev); +/* Enable management port */ macb_writel (bp,NCR ,MACB_BIT (MPE ));
drivers/net/ethernet/freescale/enetc/enetc.c +1 -1
@@ -1492,7 +1492,6 @@ static void enetc_xdp_drop(struct enetc_bdr *rx_ring, int rx_ring_first, &rx_ring->rx_swbd[rx_ring_first]);enetc_bdr_idx_inc (rx_ring, &rx_ring_first); } - rx_ring->stats.xdp_drops++; } static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,
@@ -1557,6 +1556,7 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, fallthrough;case XDP_DROP :enetc_xdp_drop (rx_ring, orig_i, i); + rx_ring->stats.xdp_drops++;break ;case XDP_PASS : rxbd = orig_rxbd;
drivers/parport/procfs.c +11 -11
@@ -51,12 +51,12 @@ static int do_active_device(struct ctl_table *table, int write,for (dev = port->devices; dev ; dev = dev->next) {if (dev == port->cad) { - len +=snprintf (buffer,sizeof (buffer),"%s\n" , dev->name); + len +=scnprintf (buffer,sizeof (buffer),"%s\n" , dev->name); } }if (!len) { - len +=snprintf (buffer,sizeof (buffer),"%s\n" ,"none" ); + len +=scnprintf (buffer,sizeof (buffer),"%s\n" ,"none" ); }if (len > *lenp)
@@ -87,19 +87,19 @@ static int do_autoprobe(struct ctl_table *table, int write, }if ((str = info->class_name) !=NULL ) - len +=snprintf (buffer + len,sizeof (buffer) - len,"CLASS:%s;\n" , str); + len +=scnprintf (buffer + len,sizeof (buffer) - len,"CLASS:%s;\n" , str);if ((str = info->model) !=NULL ) - len +=snprintf (buffer + len,sizeof (buffer) - len,"MODEL:%s;\n" , str); + len +=scnprintf (buffer + len,sizeof (buffer) - len,"MODEL:%s;\n" , str);if ((str = info->mfr) !=NULL ) - len +=snprintf (buffer + len,sizeof (buffer) - len,"MANUFACTURER:%s;\n" , str); + len +=scnprintf (buffer + len,sizeof (buffer) - len,"MANUFACTURER:%s;\n" , str);if ((str = info->description) !=NULL ) - len +=snprintf (buffer + len,sizeof (buffer) - len,"DESCRIPTION:%s;\n" , str); + len +=scnprintf (buffer + len,sizeof (buffer) - len,"DESCRIPTION:%s;\n" , str);if ((str = info->cmdset) !=NULL ) - len +=snprintf (buffer + len,sizeof (buffer) - len,"COMMAND SET:%s;\n" , str); + len +=scnprintf (buffer + len,sizeof (buffer) - len,"COMMAND SET:%s;\n" , str);if (len > *lenp) len = *lenp;
@@ -128,7 +128,7 @@ static int do_hardware_base_addr(struct ctl_table *table, int write,if (write)/* permissions prevent this anyway */ return -EACCES ; - len +=snprintf (buffer,sizeof (buffer),"%lu\t%lu\n" , port->base, port->base_hi); + len +=scnprintf (buffer,sizeof (buffer),"%lu\t%lu\n" , port->base, port->base_hi);if (len > *lenp) len = *lenp;
@@ -155,7 +155,7 @@ static int do_hardware_irq(struct ctl_table *table, int write,if (write)/* permissions prevent this anyway */ return -EACCES ; - len +=snprintf (buffer,sizeof (buffer),"%d\n" , port->irq); + len +=scnprintf (buffer,sizeof (buffer),"%d\n" , port->irq);if (len > *lenp) len = *lenp;
@@ -182,7 +182,7 @@ static int do_hardware_dma(struct ctl_table *table, int write,if (write)/* permissions prevent this anyway */ return -EACCES ; - len +=snprintf (buffer,sizeof (buffer),"%d\n" , port->dma); + len +=scnprintf (buffer,sizeof (buffer),"%d\n" , port->dma);if (len > *lenp) len = *lenp;
@@ -213,7 +213,7 @@ static int do_hardware_modes(struct ctl_table *table, int write,#define printmode (x) \ do { \ if (port->modes & PARPORT_MODE_##x) \ - len += snprintf(buffer + len, sizeof(buffer) - len, "%s%s", f++ ? "," : "", #x); \ + len += scnprintf(buffer + len, sizeof(buffer) - len, "%s%s", f++ ? "," : "", #x); \ } while (0)int f =0 ;printmode (PCSPP );
drivers/pinctrl/pinctrl-apple-gpio.c +3 -0
@@ -471,6 +471,9 @@ static int apple_gpio_pinctrl_probe(struct platform_device *pdev)for (i =0 ; i < npins; i++) { pins[i].number = i; pins[i].name =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"PIN%u" , i); +if (!pins[i].name) +return -ENOMEM ; + pins[i].drv_data = pctl; pin_names[i] = pins[i].name; pin_nums[i] = i;
drivers/pinctrl/pinctrl-ocelot.c +4 -4
@@ -1962,21 +1962,21 @@ static void ocelot_irq_handler(struct irq_desc *desc)unsigned int reg =0 , irq, i;unsigned long irqs; +chained_irq_enter (parent_chip, desc); +for (i =0 ; i < info->stride; i++) {regmap_read (info->map, id_reg +4 * i, ®);if (!reg)continue ; -chained_irq_enter (parent_chip, desc); - irqs = reg;for_each_set_bit (irq, &irqs,min (32U , info->desc->npins -32 * i))generic_handle_domain_irq (chip->irq.domain, irq +32 * i); - -chained_irq_exit (parent_chip, desc); } + +chained_irq_exit (parent_chip, desc); } static int ocelot_gpiochip_register(struct platform_device *pdev,
drivers/s390/char/sclp.c +2 -1
@@ -1200,7 +1200,8 @@ sclp_reboot_event(struct notifier_block *this, unsigned long event, void *ptr) }static struct notifier_block sclp_reboot_notifier = { - .notifier_call = sclp_reboot_event + .notifier_call = sclp_reboot_event, + .priority =INT_MIN , };static ssize_t con_pages_show (struct device_driver *dev,char *buf)
drivers/s390/char/sclp_vt220.c +2 -2
@@ -319,7 +319,7 @@ sclp_vt220_add_msg(struct sclp_vt220_request *request, buffer = (void *) ((addr_t ) sccb + sccb->header.length);if (convertlf) { -/* Perform Linefeed conversion (0x0a -> 0x0a 0x0d)*/ +/* Perform Linefeed conversion (0x0a -> 0x0d 0x0a)*/ for (from=0 , to=0 ; (from < count) && (to <sclp_vt220_space_left (request)); from++) {
@@ -328,8 +328,8 @@ sclp_vt220_add_msg(struct sclp_vt220_request *request,/* Perform conversion */ if (c ==0x0a ) {if (to +1 <sclp_vt220_space_left (request)) { - ((unsigned char *) buffer)[to++] = c; ((unsigned char *) buffer)[to++] =0x0d ; + ((unsigned char *) buffer)[to++] = c; }else break ;
drivers/tty/n_gsm.c +2 -0
@@ -2568,6 +2568,8 @@ static void gsm_cleanup_mux(struct gsm_mux *gsm, bool disc)mutex_unlock (&gsm->mutex);/* Now wipe the queues */ tty_ldisc_flush (gsm->tty); + +guard (spinlock_irqsave)(&gsm->tx_lock);list_for_each_entry_safe (txq, ntxq, &gsm->tx_ctrl_list, list)kfree (txq);INIT_LIST_HEAD (&gsm->tx_ctrl_list);
drivers/ufs/core/ufshcd.c +3 -1
@@ -9396,7 +9396,9 @@ static void ufshcd_wl_shutdown(struct device *dev)shost_for_each_device (sdev, hba->host) {if (sdev == hba->ufs_device_wlun)continue ; -scsi_device_quiesce (sdev); +mutex_lock (&sdev->state_mutex); +scsi_device_set_state (sdev,SDEV_OFFLINE ); +mutex_unlock (&sdev->state_mutex); }__ufshcd_wl_suspend (hba,UFS_SHUTDOWN_PM ); }
drivers/usb/dwc3/gadget.c +6 -4
@@ -445,6 +445,10 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd,dwc3_gadget_ep_get_transfer_index (dep); } +if (DWC3_DEPCMD_CMD (cmd) ==DWC3_DEPCMD_ENDTRANSFER && + !(cmd &DWC3_DEPCMD_CMDIOC )) +mdelay (1 ); +if (saved_config) { reg =dwc3_readl (dwc->regs,DWC3_GUSB2PHYCFG (0 )); reg |= saved_config;
@@ -1731,12 +1735,10 @@ static int __dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool intWARN_ON_ONCE (ret); dep->resource_index =0 ; -if (!interrupt) { -mdelay (1 ); +if (!interrupt) dep->flags &= ~DWC3_EP_TRANSFER_STARTED ; - }else if (!ret) { +else if (!ret) dep->flags |=DWC3_EP_END_TRANSFER_PENDING ; - } dep->flags &= ~DWC3_EP_DELAY_STOP ;return ret;
drivers/usb/host/xhci-ring.c +1 -1
@@ -1006,7 +1006,7 @@ static int xhci_invalidate_cancelled_tds(struct xhci_virt_ep *ep)td_to_noop (xhci, ring, cached_td, false); cached_td->cancel_status =TD_CLEARED ; } - +td_to_noop (xhci, ring, td, false); td->cancel_status =TD_CLEARING_CACHE ; cached_td = td;break ;
drivers/usb/host/xhci.h +1 -1
@@ -1286,7 +1286,7 @@ enum xhci_setup_dev {/* Set TR Dequeue Pointer command TRB fields, 6.4.3.9 */ #define TRB_TO_STREAM_ID (p) ((((p) & (0xffff << 16)) >> 16))#define STREAM_ID_FOR_TRB (p) ((((p)) & 0xffff) << 16) -#define SCT_FOR_TRB (p) (((p) << 1) & 0x7) +#define SCT_FOR_TRB (p) (((p) & 0x7) << 1)/* Link TRB specific fields */ #define TRB_TC (1<<1)
drivers/usb/serial/option.c +8 -0
@@ -279,6 +279,7 @@ static void option_instat_callback(struct urb *urb);#define QUECTEL_PRODUCT_EG912Y 0x6001#define QUECTEL_PRODUCT_EC200S_CN 0x6002#define QUECTEL_PRODUCT_EC200A 0x6005 +#define QUECTEL_PRODUCT_EG916Q 0x6007#define QUECTEL_PRODUCT_EM061K_LWW 0x6008#define QUECTEL_PRODUCT_EM061K_LCN 0x6009#define QUECTEL_PRODUCT_EC200T 0x6026
@@ -1270,6 +1271,7 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG916Q, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
@@ -1380,10 +1382,16 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a0, 0xff), /* Telit FN20C04 (rmnet) */ .driver_info = RSVD(0) | NCTRL(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a2, 0xff), /* Telit FN920C04 (MBIM) */ + .driver_info = NCTRL(4) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a4, 0xff), /* Telit FN20C04 (rmnet) */ .driver_info = RSVD(0) | NCTRL(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a7, 0xff), /* Telit FN920C04 (MBIM) */ + .driver_info = NCTRL(4) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a9, 0xff), /* Telit FN20C04 (rmnet) */ .driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10aa, 0xff), /* Telit FN920C04 (MBIM) */ + .driver_info = NCTRL(3) | RSVD(4) | RSVD(5) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
fs/btrfs/tree-log.c +3 -3
@@ -1372,7 +1372,7 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,struct inode *inode =NULL ;unsigned long ref_ptr;unsigned long ref_end; -struct fscrypt_str name; +struct fscrypt_str name = {0 };int ret;int log_ref_ver =0 ;u64 parent_objectid;
@@ -1844,7 +1844,7 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,struct btrfs_dir_item *di, struct btrfs_key *key) { - struct fscrypt_str name; + struct fscrypt_str name = { 0 };struct btrfs_dir_item *dir_dst_di;struct btrfs_dir_item *index_dst_di;bool dir_dst_matches = false;
@@ -2124,7 +2124,7 @@ static noinline int check_item_in_log(struct btrfs_trans_handle *trans,struct extent_buffer *eb;int slot;struct btrfs_dir_item *di; -struct fscrypt_str name; +struct fscrypt_str name = {0 };struct inode *inode =NULL ;struct btrfs_key location;
fs/fat/namei_vfat.c +1 -1
@@ -1037,7 +1037,7 @@ static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry,if (corrupt <0 ) {fat_fs_error (new_dir->i_sb,"%s: Filesystem corrupted (i_pos %lld)" , - __func__, sinfo.i_pos); + __func__, new_i_pos); } goto out; }
fs/nilfs2/dir.c +27 -23
81 lines not on this page · raw message
fs/nilfs2/namei.c +26 -13
@@ -55,12 +55,20 @@ nilfs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) {struct inode *inode;ino_t ino; +int res;if (dentry->d_name.len >NILFS_NAME_LEN )return ERR_PTR (-ENAMETOOLONG ); - ino =nilfs_inode_by_name (dir, &dentry->d_name); - inode = ino ?nilfs_iget (dir->i_sb,NILFS_I (dir)->i_root, ino) :NULL ; + res =nilfs_inode_by_name (dir, &dentry->d_name, &ino); +if (res) { +if (res != -ENOENT ) +return ERR_PTR (res); + inode =NULL ; + }else { + inode =nilfs_iget (dir->i_sb,NILFS_I (dir)->i_root, ino); + } +return d_splice_alias (inode, dentry); }
@@ -263,10 +271,11 @@ static int nilfs_do_unlink(struct inode *dir, struct dentry *dentry)struct page *page;int err; - err = -ENOENT ; de =nilfs_find_entry (dir, &dentry->d_name, &page); -if (!de) +if (IS_ERR (de)) { + err =PTR_ERR (de); goto out; + } inode =d_inode (dentry); err = -EIO ;
@@ -361,10 +370,11 @@ static int nilfs_rename(struct user_namespace *mnt_userns,if (unlikely (err))return err; - err = -ENOENT ; old_de =nilfs_find_entry (old_dir, &old_dentry->d_name, &old_page); -if (!old_de) +if (IS_ERR (old_de)) { + err =PTR_ERR (old_de); goto out; + }if (S_ISDIR (old_inode->i_mode)) { err = -EIO ;
@@ -381,10 +391,12 @@ static int nilfs_rename(struct user_namespace *mnt_userns,if (dir_de && !nilfs_empty_dir (new_inode)) goto out_dir; - err = -ENOENT ; - new_de =nilfs_find_entry (new_dir, &new_dentry->d_name, &new_page); -if (!new_de) + new_de =nilfs_find_entry (new_dir, &new_dentry->d_name, + &new_page); +if (IS_ERR (new_de)) { + err =PTR_ERR (new_de); goto out_dir; + }nilfs_set_link (new_dir, new_de, new_page, old_inode);nilfs_mark_inode_dirty (new_dir); new_inode->i_ctime =current_time (new_inode);
@@ -438,13 +450,14 @@ static int nilfs_rename(struct user_namespace *mnt_userns,*/ static struct dentry *nilfs_get_parent (struct dentry *child) { -unsigned long ino; +ino_t ino; +int res;struct inode *inode;struct nilfs_root *root; - ino =nilfs_inode_by_name (d_inode (child), &dotdot_name); -if (!ino) -return ERR_PTR (-ENOENT ); + res =nilfs_inode_by_name (d_inode (child), &dotdot_name, &ino); +if (res) +return ERR_PTR (res); root =NILFS_I (d_inode (child))->i_root;
fs/nilfs2/nilfs.h +1 -1
@@ -233,7 +233,7 @@ static inline __u32 nilfs_mask_flags(umode_t mode, __u32 flags)/* dir.c */ extern int nilfs_add_link (struct dentry *,struct inode *); -extern ino_t nilfs_inode_by_name (struct inode *,const struct qstr *); +int nilfs_inode_by_name (struct inode *dir,const struct qstr *qstr,ino_t *ino);extern int nilfs_make_empty (struct inode *,struct inode *);extern struct nilfs_dir_entry *nilfs_find_entry (struct inode *,const struct qstr *,struct page **);
fs/smb/server/mgmt/user_session.c +21 -5
@@ -176,9 +176,10 @@ static void ksmbd_expire_session(struct ksmbd_conn *conn)down_write (&conn->session_lock);xa_for_each (&conn->sessions, id, sess) { -if (sess->state !=SMB2_SESSION_VALID || -time_after (jiffies, - sess->last_active +SMB2_SESSION_TIMEOUT )) { +if (atomic_read (&sess->refcnt) ==0 && + (sess->state !=SMB2_SESSION_VALID || +time_after (jiffies, + sess->last_active +SMB2_SESSION_TIMEOUT ))) {xa_erase (&conn->sessions, sess->id);hash_del (&sess->hlist);ksmbd_session_destroy (sess);
@@ -268,8 +269,6 @@ struct ksmbd_session *ksmbd_session_lookup_slowpath(unsigned long long id)down_read (&sessions_table_lock); sess =__session_lookup (id); -if (sess) - sess->last_active = jiffies;up_read (&sessions_table_lock);return sess;
@@ -288,6 +287,22 @@ struct ksmbd_session *ksmbd_session_lookup_all(struct ksmbd_conn *conn,return sess; } +void ksmbd_user_session_get (struct ksmbd_session *sess) +{ +atomic_inc (&sess->refcnt); +} + +void ksmbd_user_session_put (struct ksmbd_session *sess) +{ +if (!sess) +return ; + +if (atomic_read (&sess->refcnt) <=0 ) +WARN_ON (1 ); +else +atomic_dec (&sess->refcnt); +} +struct preauth_session *ksmbd_preauth_session_alloc (struct ksmbd_conn *conn,u64 sess_id) {
@@ -356,6 +371,7 @@ static struct ksmbd_session *__session_create(int protocol)xa_init (&sess->rpc_handle_list); sess->sequence_number =1 ;rwlock_init (&sess->tree_conns_lock); +atomic_set (&sess->refcnt,1 ); ret =__init_smb2_session (sess);if (ret)
fs/smb/server/mgmt/user_session.h +4 -0
@@ -61,6 +61,8 @@ struct ksmbd_session {struct ksmbd_file_table file_table;unsigned long last_active;rwlock_t tree_conns_lock; + +atomic_t refcnt; };static inline int test_session_flag (struct ksmbd_session *sess,int bit)
@@ -101,4 +103,6 @@ void ksmbd_release_tree_conn_id(struct ksmbd_session *sess, int id);int ksmbd_session_rpc_open (struct ksmbd_session *sess,char *rpc_name);void ksmbd_session_rpc_close (struct ksmbd_session *sess,int id);int ksmbd_session_rpc_method (struct ksmbd_session *sess,int id); +void ksmbd_user_session_get (struct ksmbd_session *sess); +void ksmbd_user_session_put (struct ksmbd_session *sess);#endif /* __USER_SESSION_MANAGEMENT_H__ */
fs/smb/server/server.c +2 -0
@@ -238,6 +238,8 @@ static void __handle_ksmbd_work(struct ksmbd_work *work, }while (is_chained == true); send: +if (work->sess) +ksmbd_user_session_put (work->sess);if (work->tcon)ksmbd_tree_connect_put (work->tcon);smb3_preauth_hash_rsp (work);
fs/smb/server/smb2pdu.c +7 -1
@@ -604,8 +604,10 @@ int smb2_check_user_session(struct ksmbd_work *work)/* Check for validity of user session */ work->sess =ksmbd_session_lookup_all (conn, sess_id); -if (work->sess) +if (work->sess) { +ksmbd_user_session_get (work->sess);return 1 ; + }ksmbd_debug (SMB ,"Invalid user session, Uid %llu\n" , sess_id);return -ENOENT ; }
@@ -1759,6 +1761,7 @@ int smb2_sess_setup(struct ksmbd_work *work) } conn->binding = true; +ksmbd_user_session_get (sess); }else if ((conn->dialect <SMB30_PROT_ID || server_conf.flags &KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL ) && (req->Flags &SMB2_SESSION_REQ_FLAG_BINDING )) {
@@ -1785,6 +1788,7 @@ int smb2_sess_setup(struct ksmbd_work *work) } conn->binding = false; +ksmbd_user_session_get (sess); } work->sess = sess;
@@ -2240,7 +2244,9 @@ int smb2_session_logoff(struct ksmbd_work *work) }ksmbd_destroy_file_table (&sess->file_table); +down_write (&conn->session_lock); sess->state =SMB2_SESSION_EXPIRED ; +up_write (&conn->session_lock);ksmbd_free_user (sess->user); sess->user =NULL ;
fs/udf/dir.c +27 -121
198 lines not on this page · raw message
fs/udf/directory.c +427 -143
610 lines not on this page · raw message
fs/udf/inode.c +0 -90
96 lines not on this page · raw message
fs/udf/namei.c +354 -695
871 lines not on this page · raw message
fs/udf/udfdecl.h +23 -22
45 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.