Linux 5.15.84
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 83 +SUBLEVEL = 84 EXTRAVERSION = NAME = Trick or Treat
arch/x86/entry/vdso/vdso.lds.S +2 -0
@@ -27,7 +27,9 @@ VERSION { __vdso_time; clock_getres; __vdso_clock_getres; +#ifdef CONFIG_X86_SGX __vdso_sgx_enter_enclave; +#endif local: *; }; }
drivers/net/can/usb/mcba_usb.c +7 -3
@@ -47,6 +47,10 @@#define MCBA_VER_REQ_USB 1#define MCBA_VER_REQ_CAN 2 +/* Drive the CAN_RES signal LOW "0" to activate R24 and R25 */ +#define MCBA_VER_TERMINATION_ON 0 +#define MCBA_VER_TERMINATION_OFF 1 +#define MCBA_SIDL_EXID_MASK 0x8#define MCBA_DLC_MASK 0xf#define MCBA_DLC_RTR_MASK 0x40
@@ -469,7 +473,7 @@ static void mcba_usb_process_ka_usb(struct mcba_priv *priv, priv->usb_ka_first_pass = false; } -if (msg->termination_state) +if (msg->termination_state ==MCBA_VER_TERMINATION_ON ) priv->can.termination =MCBA_TERMINATION_ENABLED ;else priv->can.termination =MCBA_TERMINATION_DISABLED ;
@@ -789,9 +793,9 @@ static int mcba_set_termination(struct net_device *netdev, u16 term) };if (term ==MCBA_TERMINATION_ENABLED ) - usb_msg.termination =1 ; + usb_msg.termination =MCBA_VER_TERMINATION_ON ;else - usb_msg.termination =0 ; + usb_msg.termination =MCBA_VER_TERMINATION_OFF ;mcba_usb_xmit_cmd (priv, (struct mcba_usb_msg *)&usb_msg);
drivers/net/ethernet/freescale/fec_main.c +7 -16
@@ -72,7 +72,7 @@#include "fec.h" static void set_multicast_list (struct net_device *ndev); -static void fec_enet_itr_coal_init (struct net_device *ndev); +static void fec_enet_itr_coal_set (struct net_device *ndev);#define DRIVER_NAME "fec"
@@ -1163,8 +1163,8 @@ fec_restart(struct net_device *ndev)writel (0 , fep->hwp +FEC_IMASK );/* Init the interrupt coalescing */ -fec_enet_itr_coal_init (ndev); - +if (fep->quirks &FEC_QUIRK_HAS_COALESCE ) +fec_enet_itr_coal_set (ndev); }static void fec_enet_stop_mode (struct fec_enet_private *fep,bool enabled)
@@ -2760,19 +2760,6 @@ static int fec_enet_set_coalesce(struct net_device *ndev,return 0 ; } -static void fec_enet_itr_coal_init (struct net_device *ndev) -{ -struct ethtool_coalesce ec; - - ec.rx_coalesce_usecs =FEC_ITR_ICTT_DEFAULT ; - ec.rx_max_coalesced_frames =FEC_ITR_ICFT_DEFAULT ; - - ec.tx_coalesce_usecs =FEC_ITR_ICTT_DEFAULT ; - ec.tx_max_coalesced_frames =FEC_ITR_ICFT_DEFAULT ; - -fec_enet_set_coalesce (ndev, &ec,NULL ,NULL ); -} -static int fec_enet_get_tunable (struct net_device *netdev,const struct ethtool_tunable *tuna,void *data)
@@ -3526,6 +3513,10 @@ static int fec_enet_init(struct net_device *ndev) fep->rx_align =0x3 ; fep->tx_align =0x3 ;#endif + fep->rx_pkts_itr =FEC_ITR_ICFT_DEFAULT ; + fep->tx_pkts_itr =FEC_ITR_ICFT_DEFAULT ; + fep->rx_time_itr =FEC_ITR_ICTT_DEFAULT ; + fep->tx_time_itr =FEC_ITR_ICTT_DEFAULT ;/* Check mask of the streaming and coherent API */ ret =dma_set_mask_and_coherent (&fep->pdev->dev,DMA_BIT_MASK (32 ));
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c +2 -1
@@ -874,7 +874,6 @@ area_cache_get(struct nfp_cpp *cpp, u32 id, }/* Adjust the start address to be cache size aligned */ - cache->id = id; cache->addr = addr & ~(u64)(cache->size -1 );/* Re-init to the new ID and address */
@@ -894,6 +893,8 @@ area_cache_get(struct nfp_cpp *cpp, u32 id,return NULL ; } + cache->id = id; + exit:/* Adjust offset */ *offset = addr - cache->addr;
drivers/nvme/host/pci.c +2 -0
@@ -814,6 +814,8 @@ static blk_status_t nvme_setup_prp_simple(struct nvme_dev *dev, cmnd->dptr.prp1 =cpu_to_le64 (iod->first_dma);if (bv->bv_len > first_prp_len) cmnd->dptr.prp2 =cpu_to_le64 (iod->first_dma + first_prp_len); +else + cmnd->dptr.prp2 =0 ;return BLK_STS_OK ; }
drivers/pinctrl/mediatek/mtk-eint.c +6 -3
@@ -287,12 +287,15 @@ static struct irq_chip mtk_eint_irq_chip = {static unsigned int mtk_eint_hw_init (struct mtk_eint *eint) { -void __iomem *reg = eint->base + eint->regs->dom_en; +void __iomem *dom_en = eint->base + eint->regs->dom_en; +void __iomem *mask_set = eint->base + eint->regs->mask_set;unsigned int i;for (i =0 ; i < eint->hw->ap_num; i +=32 ) { -writel (0xffffffff , reg); - reg +=4 ; +writel (0xffffffff , dom_en); +writel (0xffffffff , mask_set); + dom_en +=4 ; + mask_set +=4 ; }return 0 ;
fs/ksmbd/vfs.c +3 -3
@@ -1788,9 +1788,9 @@ int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work, ret =vfs_copy_file_range (src_fp->filp, src_off, dst_fp->filp, dst_off, len,0 );if (ret == -EOPNOTSUPP || ret == -EXDEV ) - ret =generic_copy_file_range (src_fp->filp, src_off, - dst_fp->filp, dst_off, - len,0 ); + ret =vfs_copy_file_range (src_fp->filp, src_off, + dst_fp->filp, dst_off, len, +COPY_FILE_SPLICE );if (ret <0 )return ret;
fs/nfsd/vfs.c +2 -2
@@ -574,8 +574,8 @@ ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst, ret =vfs_copy_file_range (src, src_pos, dst, dst_pos, count,0 );if (ret == -EOPNOTSUPP || ret == -EXDEV ) - ret =generic_copy_file_range (src, src_pos, dst, dst_pos, - count,0 ); + ret =vfs_copy_file_range (src, src_pos, dst, dst_pos, count, +COPY_FILE_SPLICE );return ret; }
fs/read_write.c +13 -4
@@ -1418,7 +1418,9 @@ static int generic_copy_file_checks(struct file *file_in, loff_t pos_in,* and several different sets of file_operations, but they all end up * using the same ->copy_file_range() function pointer. */ -if (file_out->f_op->copy_file_range) { +if (flags ©_FILE_SPLICE ) { +/* cross sb splice is allowed */ + }else if (file_out->f_op->copy_file_range) {if (file_in->f_op->copy_file_range != file_out->f_op->copy_file_range)return -EXDEV ;
@@ -1468,8 +1470,9 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in, size_t len, unsigned int flags) { ssize_t ret; +bool splice = flags ©_FILE_SPLICE ; -if (flags !=0 ) +if (flags & ~COPY_FILE_SPLICE )return -EINVAL ; ret = generic_copy_file_checks(file_in, pos_in, file_out, pos_out, &len,
@@ -1495,14 +1498,14 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,* same sb using clone, but for filesystems where both clone and copy * are supported (e.g. nfs,cifs), we only call the copy method. */ -if (file_out->f_op->copy_file_range) { +if (!splice && file_out->f_op->copy_file_range) { ret = file_out->f_op->copy_file_range (file_in, pos_in, file_out, pos_out, len, flags); goto done; } -if (file_in->f_op->remap_file_range && +if (!splice && file_in->f_op->remap_file_range &&file_inode (file_in)->i_sb ==file_inode (file_out)->i_sb) { ret = file_in->f_op->remap_file_range(file_in, pos_in, file_out, pos_out,
@@ -1522,6 +1525,8 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,* consistent story about which filesystems support copy_file_range() * and which filesystems do not, that will allow userspace tools to * make consistent desicions w.r.t using copy_file_range(). +* +* We also get here if caller (e.g. nfsd) requested COPY_FILE_SPLICE. */ ret =generic_copy_file_range (file_in, pos_in, file_out, pos_out, len, flags);
@@ -1576,6 +1581,10 @@ SYSCALL_DEFINE6(copy_file_range, int, fd_in, loff_t __user *, off_in, pos_out = f_out.file->f_pos; } + ret = -EINVAL ; +if (flags !=0 ) + goto out; + ret =vfs_copy_file_range (f_in.file, pos_in, f_out.file, pos_out, len, flags);if (ret >0 ) {
include/linux/can/platform/sja1000.h +1 -1
@@ -14,7 +14,7 @@#define OCR_MODE_TEST 0x01#define OCR_MODE_NORMAL 0x02#define OCR_MODE_CLOCK 0x03 -#define OCR_MODE_MASK 0x07 +#define OCR_MODE_MASK 0x03#define OCR_TX0_INVERT 0x04#define OCR_TX0_PULLDOWN 0x08#define OCR_TX0_PULLUP 0x10
include/linux/fs.h +8 -0
@@ -1990,6 +1990,14 @@ struct dir_context {*/ #define REMAP_FILE_ADVISORY (REMAP_FILE_CAN_SHORTEN) +/* +* These flags control the behavior of vfs_copy_file_range(). +* They are not available to the user via syscall. +* +* COPY_FILE_SPLICE: call splice direct instead of fs clone/copy ops +*/ +#define COPY_FILE_SPLICE (1 << 0) +struct iov_iter ;struct file_operations {
kernel/events/core.c +13 -4
@@ -2367,6 +2367,7 @@ event_sched_out(struct perf_event *event, !event->pending_work) { event->pending_work =1 ; dec = false; +WARN_ON_ONCE (!atomic_long_inc_not_zero (&event->refcount));task_work_add (current, &event->pending_task,TWA_RESUME ); }if (dec)
@@ -2412,6 +2413,7 @@ group_sched_out(struct perf_event *group_event,#define DETACH_GROUP 0x01UL#define DETACH_CHILD 0x02UL +#define DETACH_DEAD 0x04UL/* * Cross CPU call to remove a performance event
@@ -2432,12 +2434,20 @@ __perf_remove_from_context(struct perf_event *event,update_cgrp_time_from_cpuctx (cpuctx, false); } +/* +* Ensure event_sched_out() switches to OFF, at the very least +* this avoids raising perf_pending_task() at this time. +*/ +if (flags &DETACH_DEAD ) + event->pending_disable =1 ;event_sched_out (event, cpuctx, ctx);if (flags &DETACH_GROUP )perf_group_detach (event);if (flags &DETACH_CHILD )perf_child_detach (event);list_del_event (event, ctx); +if (flags &DETACH_DEAD ) + event->state =PERF_EVENT_STATE_DEAD ;if (!ctx->nr_events && ctx->is_active) {if (ctx == &cpuctx->ctx)
@@ -5212,9 +5222,7 @@ int perf_event_release_kernel(struct perf_event *event) ctx =perf_event_ctx_lock (event);WARN_ON_ONCE (ctx->parent_ctx); -perf_remove_from_context (event,DETACH_GROUP ); -raw_spin_lock_irq (&ctx->lock);/* * Mark this event as STATE_DEAD, there is no external reference to it * anymore.
@@ -5226,8 +5234,7 @@ int perf_event_release_kernel(struct perf_event *event)* Thus this guarantees that we will in fact observe and kill _ALL_ * child events. */ - event->state =PERF_EVENT_STATE_DEAD ; -raw_spin_unlock_irq (&ctx->lock); +perf_remove_from_context (event,DETACH_GROUP |DETACH_DEAD );perf_event_ctx_unlock (event, ctx);
@@ -6662,6 +6669,8 @@ static void perf_pending_task(struct callback_head *head)if (rctx >=0 )perf_swevent_put_recursion_context (rctx);preempt_enable_notrace (); + +put_event (event); }/*
sound/soc/codecs/cs42l51.c +1 -1
@@ -146,7 +146,7 @@ static const struct snd_kcontrol_new cs42l51_snd_controls[] = { 0, 0xA0, 96, adc_att_tlv),SOC_DOUBLE_R_SX_TLV ("PGA Volume" ,CS42L51_ALC_PGA_CTL ,CS42L51_ALC_PGB_CTL , -0 ,0x19 ,30 , pga_tlv), +0 ,0x1A ,30 , pga_tlv),SOC_SINGLE ("Playback Deemphasis Switch" ,CS42L51_DAC_CTL ,3 ,1 ,0 ),SOC_SINGLE ("Auto-Mute Switch" ,CS42L51_DAC_CTL ,2 ,1 ,0 ), SOC_SINGLE("Soft Ramp Switch", CS42L51_DAC_CTL, 1, 1, 0),
sound/soc/fsl/fsl_micfil.c +19 -0
@@ -191,6 +191,25 @@ static int fsl_micfil_reset(struct device *dev)return ret; } +/* +* SRES is self-cleared bit, but REG_MICFIL_CTRL1 is defined +* as non-volatile register, so SRES still remain in regmap +* cache after set, that every update of REG_MICFIL_CTRL1, +* software reset happens. so clear it explicitly. +*/ + ret =regmap_clear_bits (micfil->regmap,REG_MICFIL_CTRL1 , +MICFIL_CTRL1_SRES ); +if (ret) +return ret; + +/* +* Set SRES should clear CHnF flags, But even add delay here +* the CHnF may not be cleared sometimes, so clear CHnF explicitly. +*/ + ret =regmap_write_bits (micfil->regmap,REG_MICFIL_STAT ,0xFF ,0xFF ); +if (ret) +return ret; +return 0 ; }
sound/soc/soc-ops.c +7 -2
@@ -447,10 +447,15 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, ret = err;if (snd_soc_volsw_is_stereo (mc)) { -unsigned int val2; +unsigned int val2 = ucontrol->value.integer.value[1 ]; + +if (mc->platform_max && val2 > mc->platform_max) +return -EINVAL ; +if (val2 > max) +return -EINVAL ; val_mask = mask << rshift; - val2 = (ucontrol->value.integer.value[1 ] + min) & mask; + val2 = (val2 + min) & mask; val2 = val2 << rshift; err = snd_soc_component_update_bits(component, reg2, val_mask,
tools/lib/bpf/libbpf_probes.c +1 -1
@@ -245,7 +245,7 @@ bool bpf_probe_map_type(enum bpf_map_type map_type, __u32 ifindex)case BPF_MAP_TYPE_RINGBUF : key_size =0 ; value_size =0 ; - max_entries =4096 ; + max_entries =sysconf (_SC_PAGE_SIZE);break ;case BPF_MAP_TYPE_UNSPEC :case BPF_MAP_TYPE_HASH :
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.84 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.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/x86/entry/vdso/vdso.lds.S | 2 + drivers/net/can/usb/mcba_usb.c | 10 ++++-- drivers/net/ethernet/freescale/fec_main.c | 23 ++++----------- drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c | 3 + drivers/nvme/host/pci.c | 2 + drivers/pinctrl/mediatek/mtk-eint.c | 9 +++-- fs/ksmbd/vfs.c | 6 +-- fs/nfsd/vfs.c | 4 +- fs/read_write.c | 17 ++++++++--- include/linux/can/platform/sja1000.h | 2 - include/linux/fs.h | 8 +++++ kernel/events/core.c | 17 ++++++++--- sound/soc/codecs/cs42l51.c | 2 - sound/soc/fsl/fsl_micfil.c | 19 ++++++++++++ sound/soc/soc-ops.c | 9 ++++- tools/lib/bpf/libbpf_probes.c | 2 - 17 files changed, 95 insertions(+), 42 deletions(-)
Amir Goldstein (1):
vfs: fix copy_file_range() averts filesystem freeze protection
Charles Keepax (2):
ASoC: cs42l51: Correct PGA Volume minimum value
ASoC: ops: Correct bounds check for second channel on SX controls
Greg Kroah-Hartman (1):
Linux 5.15.84
Heiko Schocher (1):
can: sja1000: fix size of OCR_MODE_MASK define
Hou Tao (1):
libbpf: Use page size as max_entries when probing ring buffer map
Jialiang Wang (1):
nfp: fix use-after-free in area_cache_get()
Lei Rao (1):
nvme-pci: clear the prp2 field when not used
Mark Brown (1):
ASoC: ops: Check bounds for second channel in snd_soc_put_volsw_sx()
Nathan Chancellor (1):
x86/vdso: Conditionally export __vdso_sgx_enter_enclave()
Peter Zijlstra (1):
perf: Fix perf_pending_task() UaF
Rasmus Villemoes (2):
net: fec: don't reset irq coalesce settings to defaults on "ip link up"
net: fec: properly guard irq coalesce setup
Ricardo Ribalda (1):
pinctrl: meditatek: Startup with the IRQs disabled
Shengjiu Wang (2):
ASoC: fsl_micfil: explicitly clear software reset bit
ASoC: fsl_micfil: explicitly clear CHnF flags
Yasushi SHOJI (1):
can: mcba_usb: Fix termination command argument