5.15.128-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 5.15.128-rc1 review
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.15.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.15.128-rc1
Borislav Petkov (AMD) <[email protected]>
x86/srso: Correct the mitigation status when SMT is disabled
Peter Zijlstra <[email protected]>
objtool/x86: Fixup frame-pointer vs rethunk
Petr Pavlu <[email protected]>
x86/retpoline,kprobes: Fix position of thunk sections with CONFIG_LTO_CLANG
Borislav Petkov (AMD) <[email protected]>
x86/srso: Disable the mitigation on unaffected configurations
Borislav Petkov (AMD) <[email protected]>
x86/CPU/AMD: Fix the DIV(0) initial fix attempt
Sean Christopherson <[email protected]>
x86/retpoline: Don't clobber RFLAGS during srso_safe_ret()
Peter Zijlstra <[email protected]>
x86/static_call: Fix __static_call_fixup()
Borislav Petkov (AMD) <[email protected]>
x86/srso: Explain the untraining sequences a bit more
Peter Zijlstra <[email protected]>
x86/cpu: Cleanup the untrain mess
Peter Zijlstra <[email protected]>
x86/cpu: Rename srso_(.*)_alias to srso_alias_\1
Peter Zijlstra <[email protected]>
x86/cpu: Rename original retbleed methods
Peter Zijlstra <[email protected]>
x86/cpu: Clean up SRSO return thunk mess
Peter Zijlstra <[email protected]>
x86/ibt: Add ANNOTATE_NOENDBR
Josh Poimboeuf <[email protected]>
objtool: Add frame-pointer-specific function ignore
Peter Zijlstra <[email protected]>
x86/alternative: Make custom return thunk unconditional
Peter Zijlstra <[email protected]>
x86/cpu: Fix up srso_safe_ret() and __x86_return_thunk()
Peter Zijlstra <[email protected]>
x86/cpu: Fix __x86_return_thunk symbol type
Yangtao Li <[email protected]>
mmc: f-sdh30: fix order of function calls in sdhci_f_sdh30_remove
Jason Xing <[email protected]>
net: fix the RTO timer retransmitting skb every 1ms if linear option is enabled
Jason Wang <[email protected]>
virtio-net: set queues after driver_ok
Kuniyuki Iwashima <[email protected]>
af_unix: Fix null-ptr-deref in unix_stream_sendpage().
Christopher Obbard <[email protected]>
arm64: dts: rockchip: Disable HS400 for eMMC on ROCK Pi 4
Namjae Jeon <[email protected]>
exfat: check if filename entries exceeds max filename length
Xin Long <[email protected]>
netfilter: set default timeout to 3 secs for sctp shutdown send and recv state
Mario Limonciello <[email protected]>
drm/amd: flush any delayed gfxoff on suspend entry
Wander Lairson Costa <[email protected]>
drm/qxl: fix UAF on handle creation
Yibin Ding <[email protected]>
mmc: block: Fix in_flight[issue_type] value error
Yang Yingliang <[email protected]>
mmc: wbsd: fix double mmc_free_host() in wbsd_init()
Russell Harmon via samba-technical <[email protected]>
cifs: Release folio lock on fscache read hit.
dengxiang <[email protected]>
ALSA: usb-audio: Add support for Mythware XA001AU capture and playback interfaces.
Tony Lindgren <[email protected]>
serial: 8250: Fix oops for port->pm on uart_change_pm()
Alexandre Ghiti <[email protected]>
riscv: uaccess: Return the number of bytes effectively not copied
Kailang Yang <[email protected]>
ALSA: hda/realtek - Remodified 3k pull low procedure
Jiasheng Jiang <[email protected]>
soc: aspeed: socinfo: Add kfree for kstrdup
Jerome Brunet <[email protected]>
ASoC: meson: axg-tdm-formatter: fix channel slot allocation
Zhang Shurong <[email protected]>
ASoC: rt5665: add missed regulator_bulk_disable
Xiaolei Wang <[email protected]>
ARM: dts: imx: Set default tuning step for imx6sx usdhc
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: qrb5165-rb5: fix thermal zone conflict
Tony Lindgren <[email protected]>
bus: ti-sysc: Flush posted write on enable before reset
Eric Dumazet <[email protected]>
net: do not allow gso_size to be set to GSO_BY_FRAGS
Abel Wu <[email protected]>
sock: Fix misuse of sk_under_memory_pressure()
Alfred Lee <[email protected]>
net: dsa: mv88e6xxx: Wait for EEPROM done before HW reset
Andrii Staikov <[email protected]>
i40e: fix misleading debug logs
Piotr Gardocki <[email protected]>
iavf: fix FDIR rule fields masks validation
Ziyang Xuan <[email protected]>
team: Fix incorrect deletion of ETH_P_8021AD protocol vid from slaves
Justin Chen <[email protected]>
net: phy: broadcom: stub c45 read/write for 54810
Pablo Neira Ayuso <[email protected]>
netfilter: nft_dynset: disallow object maps
Sishuai Gong <[email protected]>
ipvs: fix racy memcpy in proc_do_sync_threshold
Florian Westphal <[email protected]>
netfilter: nf_tables: deactivate catchall elements in next generation
Florian Westphal <[email protected]>
netfilter: nf_tables: fix false-positive lockdep splat
Luca Ceresoli <[email protected]>
drm/panel: simple: Fix AUO G121EAN01 panel timings according to the docs
Petr Machata <[email protected]>
selftests: mirror_gre_changes: Tighten up the TTL test match
Russell King (Oracle) <[email protected]>
net: phy: fix IRQ-based wake-on-lan over hibernate / power off
Lin Ma <[email protected]>
xfrm: add forgotten nla_policy for XFRMA_MTIMER_THRESH
Lin Ma <[email protected]>
xfrm: add NULL check in xfrm_update_ae_params
Zhengchao Shao <[email protected]>
ip_vti: fix potential slab-use-after-free in decode_session6
Zhengchao Shao <[email protected]>
ip6_vti: fix slab-use-after-free in decode_session6
Zhengchao Shao <[email protected]>
xfrm: fix slab-use-after-free in decode_session6
Lin Ma <[email protected]>
net: xfrm: Amend XFRMA_SEC_CTX nla_policy structure
Lin Ma <[email protected]>
net: af_key: fix sadb_x_filter validation
Lin Ma <[email protected]>
net: xfrm: Fix xfrm_address_filter OOB read
Tam Nguyen <[email protected]>
i2c: designware: Handle invalid SMBus block data response length value
Quan Nguyen <[email protected]>
i2c: designware: Correct length byte validation logic
xiaoshoukui <[email protected]>
btrfs: fix BUG_ON condition in btrfs_cancel_balance
Sherry Sun <[email protected]>
tty: serial: fsl_lpuart: Clear the error flags by writing 1 for lpuart32 platforms
Yi Yang <[email protected]>
tty: n_gsm: fix the UAF caused by race condition in gsm_cleanup_mux
Nathan Lynch <[email protected]>
powerpc/rtas_flash: allow user copy to flash block cache objects
Yuanjun Gong <[email protected]>
fbdev: mmp: fix value check in mmphw_probe()
Yicong Yang <[email protected]>
i2c: hisi: Only handle the interrupt of the driver's transfer
Chengfeng Ye <[email protected]>
i2c: bcm-iproc: Fix bcm_iproc_i2c_isr deadlock issue
Steve French <[email protected]>
cifs: fix potential oops in cifs_oplock_break
Maxime Coquelin <[email protected]>
vduse: Use proper spinlock for IRQ injection
Wolfram Sang <[email protected]>
virtio-mmio: don't break lifecycle of vm_dev
Naohiro Aota <[email protected]>
btrfs: move out now unused BG from the reclaim list
Xu Yang <[email protected]>
ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node
Andreas Kemnade <[email protected]>
ARM: dts: imx6sll: fixup of operating points
Ivan Mikhaylov <[email protected]>
net/ncsi: change from ndo_set_mac_address to dev_set_mac_address
Sergey Shtylyov <[email protected]>
mmc: sunxi: fix deferred probing
Sergey Shtylyov <[email protected]>
mmc: bcm2835: fix deferred probing
Johan Hovold <[email protected]>
USB: dwc3: fix use-after-free on core driver unbind
Johan Hovold <[email protected]>
USB: dwc3: qcom: fix NULL-deref on suspend
Robert Hodaszi <[email protected]>
tty: serial: fsl_lpuart: reduce RX watermark to 0 on LS1028A
Sherry Sun <[email protected]>
tty: serial: fsl_lpuart: make rx_watermark configurable for different platforms
Jesse Taube <[email protected]>
tty: serial: fsl_lpuart: Add i.MXRT1050 support
Roger Quadros <[email protected]>
usb: dwc3: gadget: Improve dwc3_gadget_suspend() and dwc3_gadget_resume()
Johan Hovold <[email protected]>
USB: dwc3: gadget: drop dead hibernation code
Kushagra Verma <[email protected]>
usb: dwc3: Fix typos in gadget.c
Wesley Cheng <[email protected]>
usb: dwc3: Remove DWC3 locking during gadget suspend/resume
Wesley Cheng <[email protected]>
usb: dwc3: gadget: Synchronize IRQ between soft connect/disconnect
Hersen Wu <[email protected]>
drm/amd/display: fix access hdcp_workqueue assert
hersen wu <[email protected]>
drm/amd/display: phase3 mst hdcp for multiple displays
hersen wu <[email protected]>
drm/amd/display: save restore hdcp state when display is unplugged from mst hub
Zev Weiss <[email protected]>
ARM: dts: aspeed: asrock: Correct firmware flash SPI clocks
Song Yoong Siang <[email protected]>
igc: read before write to SRRCTL register
William Breathitt Gray <[email protected]>
iio: addac: stx104: Fix race condition when converting analog-to-digital
William Breathitt Gray <[email protected]>
iio: addac: stx104: Fix race condition for stx104_write_raw()
William Breathitt Gray <[email protected]>
iio: stx104: Move to addac subdirectory
William Breathitt Gray <[email protected]>
iio: adc: stx104: Implement and utilize register structures
William Breathitt Gray <[email protected]>
iio: adc: stx104: Utilize iomap interface
Cosmin Tanislav <[email protected]>
iio: add addac subdirectory
Chen Lin <[email protected]>
ring-buffer: Do not swap cpu_buffer during resize process
Benjamin Gray <[email protected]>
powerpc/kasan: Disable KCOV in KASAN code
Tuo Li <[email protected]>
ALSA: hda: fix a possible null-pointer dereference due to data race in snd_hdac_regmap_sync()
dengxiang <[email protected]>
ALSA: hda/realtek: Add quirks for Unis H3C Desktop B760 & Q760
Konstantin Komarov <[email protected]>
fs/ntfs3: Mark ntfs dirty when on-disk struct is corrupted
Jia-Ju Bai <[email protected]>
fs: ntfs3: Fix possible null-pointer dereferences in mi_read()
Edward Lo <[email protected]>
fs/ntfs3: Enhance sanity check while generating attr_list
shanzhulig <[email protected]>
drm/amdgpu: Fix potential fence use-after-free v2
Matthew Anderson <[email protected]>
Bluetooth: btusb: Add MT7922 bluetooth ID for the Asus Ally
Zhengping Jiang <[email protected]>
Bluetooth: L2CAP: Fix use-after-free
Yuechao Zhao <[email protected]>
watchdog: sp5100_tco: support Hygon FCH/SCH (Server Controller Hub)
Zhang Shurong <[email protected]>
firewire: net: fix use after free in fwnet_finish_incoming_packet()
Armin Wolf <[email protected]>
pcmcia: rsrc_nonstatic: Fix memory leak in nonstatic_release_resource_db()
Tuo Li <[email protected]>
gfs2: Fix possible data races in gfs2_show_options()
Xu Yang <[email protected]>
usb: chipidea: imx: add missing USB PHY DPDM wakeup setting
Xu Yang <[email protected]>
usb: chipidea: imx: don't request QoS for imx8ulp
Mika Westerberg <[email protected]>
thunderbolt: Read retimer NVM authentication status prior tb_retimer_set_inbound_sbtx()
Hans Verkuil <[email protected]>
media: platform: mediatek: vpu: fix NULL ptr dereference
Prashanth K <[email protected]>
usb: gadget: u_serial: Avoid spinlock recursion in __gs_console_push
Yunfei Dong <[email protected]>
media: v4l2-mem2mem: add lock to protect parameter num_rdy
Paulo Alcantara <[email protected]>
smb: client: fix warning in cifs_smb3_do_mount()
Christian Brauner <[email protected]>
ovl: check type and offset of struct vfsmount in ovl_entry
Patrisious Haddad <[email protected]>
RDMA/mlx5: Return the firmware result upon destroying QP/RQ
Marco Morandini <[email protected]>
HID: add quirk for 03f0:464a HP Elite Presenter Mouse
Lang Yu <[email protected]>
drm/amdgpu: install stub fence into potential unused fence pointers
stuarthayhurst <[email protected]>
HID: logitech-hidpp: Add USB and Bluetooth IDs for the Logitech G915 TKL Keyboard
gaoxu <[email protected]>
dma-remap: use kvmalloc_array/kvfree for larger dma memory remap
Pierre-Louis Bossart <[email protected]>
ASoC: SOF: Intel: fix SoundWire/HDaudio mutual exclusion
Geert Uytterhoeven <[email protected]>
iopoll: Call cpu_relax() in busy loops
Oleksij Rempel <[email protected]>
ARM: dts: imx6dl: prtrvt, prtvt7, prti6q, prtwd2: fix USB related warnings
Sumit Gupta <[email protected]>
PCI: tegra194: Fix possible array out of bounds access
Jakub Kicinski <[email protected]>
net: tls: avoid discarding data on record close
Tariq Toukan <[email protected]>
net/tls: Multi-threaded calls to TX tls_dev_del
Tariq Toukan <[email protected]>
net/tls: Perform immediate device ctx cleanup when possible
Eric Dumazet <[email protected]>
macsec: use DEV_STATS_INC()
Clayton Yager <[email protected]>
macsec: Fix traffic counters/statistics
Ido Schimmel <[email protected]>
selftests: forwarding: tc_actions: Use ncat instead of nc
Davide Caratti <[email protected]>
selftests: forwarding: tc_actions: cleanup temporary files when test is aborted
Kunihiko Hayashi <[email protected]>
mmc: sdhci-f-sdh30: Replace with sdhci_pltfm
-------------
Diffstat:
Documentation/admin-guide/hw-vuln/srso.rst | 4 +-
MAINTAINERS | 2 +-
Makefile | 4 +-
arch/arm/boot/dts/aspeed-bmc-asrock-e3c246d4i.dts | 2 +-
arch/arm/boot/dts/imx6dl-prtrvt.dts | 4 +
arch/arm/boot/dts/imx6qdl-prti6q.dtsi | 11 +-
arch/arm/boot/dts/imx6sll.dtsi | 24 ++-
arch/arm/boot/dts/imx6sx.dtsi | 6 +
arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 2 +-
arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi | 4 +-
arch/powerpc/kernel/rtas_flash.c | 6 +-
arch/powerpc/mm/kasan/Makefile | 1 +
arch/riscv/lib/uaccess.S | 11 +-
arch/x86/include/asm/entry-common.h | 1 +
arch/x86/include/asm/nospec-branch.h | 28 +--
arch/x86/kernel/cpu/amd.c | 1 +
arch/x86/kernel/cpu/bugs.c | 28 ++-
arch/x86/kernel/static_call.c | 13 ++
arch/x86/kernel/traps.c | 2 -
arch/x86/kernel/vmlinux.lds.S | 20 +-
arch/x86/kvm/svm/svm.c | 2 +
arch/x86/lib/retpoline.S | 141 +++++++++-----
drivers/bluetooth/btusb.c | 3 +
drivers/bus/ti-sysc.c | 2 +
drivers/firewire/net.c | 6 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 6 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 9 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 6 +-
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 211 +++++++++++++++++----
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h | 14 ++
.../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 30 +++
drivers/gpu/drm/panel/panel-simple.c | 24 +--
drivers/gpu/drm/qxl/qxl_drv.h | 2 +-
drivers/gpu/drm/qxl/qxl_dumb.c | 5 +-
drivers/gpu/drm/qxl/qxl_gem.c | 25 ++-
drivers/gpu/drm/qxl/qxl_ioctl.c | 6 +-
drivers/hid/hid-ids.h | 1 +
drivers/hid/hid-logitech-hidpp.c | 4 +
drivers/hid/hid-quirks.c | 1 +
drivers/i2c/busses/i2c-bcm-iproc.c | 11 +-
drivers/i2c/busses/i2c-designware-master.c | 16 +-
drivers/i2c/busses/i2c-hisi.c | 8 +
drivers/iio/Kconfig | 1 +
drivers/iio/Makefile | 1 +
drivers/iio/adc/Kconfig | 16 --
drivers/iio/adc/Makefile | 1 -
drivers/iio/addac/Kconfig | 24 +++
drivers/iio/addac/Makefile | 7 +
drivers/iio/{adc => addac}/stx104.c | 98 +++++++---
drivers/infiniband/hw/mlx5/qpc.c | 10 +-
drivers/media/platform/mtk-vpu/mtk_vpu.c | 6 +-
drivers/mmc/core/block.c | 7 +-
drivers/mmc/host/bcm2835.c | 4 +-
drivers/mmc/host/sdhci_f_sdh30.c | 66 +++----
drivers/mmc/host/sunxi-mmc.c | 4 +-
drivers/mmc/host/wbsd.c | 2 -
drivers/net/dsa/mv88e6xxx/chip.c | 8 +
drivers/net/ethernet/intel/i40e/i40e_nvm.c | 16 +-
drivers/net/ethernet/intel/iavf/iavf_ethtool.c | 10 +
drivers/net/ethernet/intel/iavf/iavf_fdir.c | 77 +++++++-
drivers/net/ethernet/intel/iavf/iavf_fdir.h | 2 +
drivers/net/ethernet/intel/igc/igc_base.h | 11 +-
drivers/net/ethernet/intel/igc/igc_main.c | 7 +-
drivers/net/macsec.c | 70 +++++--
drivers/net/phy/broadcom.c | 13 ++
drivers/net/phy/phy_device.c | 13 +-
drivers/net/team/team.c | 4 +-
drivers/net/virtio_net.c | 4 +-
drivers/pci/controller/dwc/pcie-tegra194.c | 13 +-
drivers/pcmcia/rsrc_nonstatic.c | 2 +
drivers/soc/aspeed/aspeed-socinfo.c | 1 +
drivers/thunderbolt/retimer.c | 29 ++-
drivers/tty/n_gsm.c | 3 +-
drivers/tty/serial/8250/8250_port.c | 1 +
drivers/tty/serial/fsl_lpuart.c | 26 ++-
drivers/usb/chipidea/ci_hdrc_imx.c | 5 +
drivers/usb/chipidea/usbmisc_imx.c | 2 +-
drivers/usb/dwc3/core.c | 9 +-
drivers/usb/dwc3/dwc3-qcom.c | 11 +-
drivers/usb/dwc3/gadget.c | 116 +++++------
drivers/usb/gadget/function/u_serial.c | 3 +
drivers/vdpa/vdpa_user/vduse_dev.c | 8 +-
drivers/video/fbdev/mmp/hw/mmp_ctrl.c | 4 +-
drivers/virtio/virtio_mmio.c | 5 +-
drivers/watchdog/sp5100_tco.c | 4 +-
fs/btrfs/block-group.c | 5 +-
fs/btrfs/volumes.c | 3 +-
fs/cifs/cifsfs.c | 28 +--
fs/cifs/file.c | 25 ++-
fs/exfat/dir.c | 9 +-
fs/gfs2/super.c | 26 +--
fs/ntfs3/frecord.c | 16 +-
fs/ntfs3/fsntfs.c | 2 +-
fs/ntfs3/index.c | 6 +
fs/ntfs3/ntfs_fs.h | 2 +
fs/ntfs3/record.c | 10 +-
fs/overlayfs/ovl_entry.h | 9 +
include/linux/iopoll.h | 2 +
include/linux/objtool.h | 28 +++
include/linux/virtio_net.h | 4 +
include/media/v4l2-mem2mem.h | 18 +-
include/net/sock.h | 6 +
include/net/tls.h | 2 +
kernel/dma/remap.c | 4 +-
kernel/trace/ring_buffer.c | 14 +-
kernel/trace/trace.c | 3 +-
net/bluetooth/l2cap_core.c | 5 +
net/core/sock.c | 2 +-
net/ipv4/ip_vti.c | 4 +-
net/ipv4/tcp_timer.c | 4 +-
net/ipv6/ip6_vti.c | 4 +-
net/key/af_key.c | 4 +-
net/ncsi/ncsi-rsp.c | 5 +-
net/netfilter/ipvs/ip_vs_ctl.c | 4 +
net/netfilter/nf_conntrack_proto_sctp.c | 6 +-
net/netfilter/nf_tables_api.c | 1 +
net/netfilter/nft_dynset.c | 3 +
net/netfilter/nft_set_pipapo.c | 13 +-
net/tls/tls_device.c | 137 +++++++------
net/unix/af_unix.c | 9 +-
net/xfrm/xfrm_compat.c | 2 +-
net/xfrm/xfrm_interface_core.c | 4 +-
net/xfrm/xfrm_user.c | 14 +-
sound/hda/hdac_regmap.c | 7 +-
sound/pci/hda/patch_realtek.c | 16 +-
sound/soc/codecs/rt5665.c | 2 +
sound/soc/meson/axg-tdm-formatter.c | 42 ++--
sound/soc/sof/intel/hda.c | 12 +-
sound/usb/quirks-table.h | 29 +++
tools/include/linux/objtool.h | 28 +++
tools/objtool/arch/x86/decode.c | 2 +-
tools/objtool/check.c | 21 +-
.../selftests/net/forwarding/mirror_gre_changes.sh | 3 +-
.../testing/selftests/net/forwarding/tc_actions.sh | 18 +-
135 files changed, 1437 insertions(+), 618 deletions(-)Greg Kroah-Hartman
maintainerPATCH 1/139 mmc: sdhci-f-sdh30: Replace with sdhci_pltfm
From: Kunihiko Hayashi <[email protected]>
[ Upstream commit 5def5c1c15bf22934ee227af85c1716762f3829f ]
Even if sdhci_pltfm_pmops is specified for PM, this driver doesn't apply sdhci_pltfm, so the structure is not correctly referenced in PM functions. This applies sdhci_pltfm to this driver to fix this issue.
- Call sdhci_pltfm_init() instead of sdhci_alloc_host() and other functions that covered by sdhci_pltfm.
- Move ops and quirks to sdhci_pltfm_data
- Replace sdhci_priv() with own private function sdhci_f_sdh30_priv().
--- drivers/mmc/host/sdhci_f_sdh30.c | 60 ++++++++++++++------------------ 1 file changed, 27 insertions(+), 33 deletions(-)
drivers/mmc/host/sdhci_f_sdh30.c +27 -33
@@ -26,9 +26,16 @@ struct f_sdhost_priv {bool enable_cmd_dat_delay; }; +static void *sdhci_f_sdhost_priv (struct sdhci_host *host) +{ +struct sdhci_pltfm_host *pltfm_host =sdhci_priv (host); + +return sdhci_pltfm_priv (pltfm_host); +} +static void sdhci_f_sdh30_soft_voltage_switch (struct sdhci_host *host) { -struct f_sdhost_priv *priv =sdhci_priv (host); +struct f_sdhost_priv *priv =sdhci_f_sdhost_priv (host);u32 ctrl =0 ;usleep_range (2500 ,3000 );
@@ -61,7 +68,7 @@ static unsigned int sdhci_f_sdh30_get_min_clock(struct sdhci_host *host)static void sdhci_f_sdh30_reset (struct sdhci_host *host,u8 mask) { -struct f_sdhost_priv *priv =sdhci_priv (host); +struct f_sdhost_priv *priv =sdhci_f_sdhost_priv (host);u32 ctl;if (sdhci_readw (host,SDHCI_CLOCK_CONTROL ) ==0 )
@@ -85,30 +92,32 @@ static const struct sdhci_ops sdhci_f_sdh30_ops = { .set_uhs_signaling = sdhci_set_uhs_signaling, }; +static const struct sdhci_pltfm_data sdhci_f_sdh30_pltfm_data = { + .ops = &sdhci_f_sdh30_ops, + .quirks =SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC + |SDHCI_QUIRK_INVERTED_WRITE_PROTECT , + .quirks2 =SDHCI_QUIRK2_SUPPORT_SINGLE + |SDHCI_QUIRK2_TUNING_WORK_AROUND , +}; +static int sdhci_f_sdh30_probe (struct platform_device *pdev) {struct sdhci_host *host;struct device *dev = &pdev->dev; -int irq, ctrl =0 , ret =0 ; +int ctrl =0 , ret =0 ;struct f_sdhost_priv *priv; +struct sdhci_pltfm_host *pltfm_host;u32 reg =0 ; - irq =platform_get_irq (pdev,0 ); -if (irq <0 ) -return irq; - - host =sdhci_alloc_host (dev,sizeof (struct f_sdhost_priv )); + host =sdhci_pltfm_init (pdev, &sdhci_f_sdh30_pltfm_data, +sizeof (struct f_sdhost_priv ));if (IS_ERR (host))return PTR_ERR (host); - priv =sdhci_priv (host); + pltfm_host =sdhci_priv (host); + priv =sdhci_pltfm_priv (pltfm_host); priv->dev = dev; - host->quirks =SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC | -SDHCI_QUIRK_INVERTED_WRITE_PROTECT ; - host->quirks2 =SDHCI_QUIRK2_SUPPORT_SINGLE | -SDHCI_QUIRK2_TUNING_WORK_AROUND ; - priv->enable_cmd_dat_delay =device_property_read_bool (dev,"fujitsu,cmd-dat-delay-select" );
@@ -116,18 +125,6 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev)if (ret) goto err; -platform_set_drvdata (pdev, host); - - host->hw_name ="f_sdh30" ; - host->ops = &sdhci_f_sdh30_ops; - host->irq = irq; - - host->ioaddr =devm_platform_ioremap_resource (pdev,0 ); -if (IS_ERR (host->ioaddr)) { - ret =PTR_ERR (host->ioaddr); - goto err; - } -if (dev_of_node (dev)) {sdhci_get_of_property (pdev);
@@ -182,23 +179,20 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev) err_clk:clk_disable_unprepare (priv->clk_iface); err: -sdhci_free_host (host); +sdhci_pltfm_free (pdev); +return ret; }static int sdhci_f_sdh30_remove (struct platform_device *pdev) {struct sdhci_host *host =platform_get_drvdata (pdev); -struct f_sdhost_priv *priv =sdhci_priv (host); - -sdhci_remove_host (host,readl (host->ioaddr +SDHCI_INT_STATUS ) == -0xffffffff ); +struct f_sdhost_priv *priv =sdhci_f_sdhost_priv (host);clk_disable_unprepare (priv->clk_iface);clk_disable_unprepare (priv->clk); -sdhci_free_host (host); -platform_set_drvdata (pdev,NULL ); +sdhci_pltfm_unregister (pdev);return 0 ; }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 2/139 selftests: forwarding: tc_actions: cleanup temporary files when test is aborted
In reply to Greg Kroah-HartmanFrom: Davide Caratti <[email protected]>
[ Upstream commit f58531716ced8975a4ade108ef4af35f98722af7 ]
remove temporary files created by 'mirred_egress_to_ingress_tcp' test in the cleanup() handler. Also, change variable names to avoid clashing with globals from lib.sh.
Stable-dep-of: 5e8670610b93 ("selftests: forwarding: tc_actions: Use ncat instead of nc")
--- .../selftests/net/forwarding/tc_actions.sh | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
tools/testing/selftests/net/forwarding/tc_actions.sh +10 -6
@@ -155,10 +155,10 @@ gact_trap_test() mirred_egress_to_ingress_tcp_test() { - local tmpfile=$(mktemp) tmpfile1=$(mktemp) + mirred_e2i_tf1=$(mktemp) mirred_e2i_tf2=$(mktemp) RET=0 - dd conv=sparse status=none if=/dev/zero bs=1M count=2 of=$tmpfile + dd conv=sparse status=none if=/dev/zero bs=1M count=2 of=$mirred_e2i_tf1 tc filter add dev $h1 protocol ip pref 100 handle 100 egress flower \ $tcflags ip_proto tcp src_ip 192.0.2.1 dst_ip 192.0.2.2 \ action ct commit nat src addr 192.0.2.2 pipe \
@@ -174,11 +174,11 @@ mirred_egress_to_ingress_tcp_test() ip_proto icmp \ action drop - ip vrf exec v$h1 nc --recv-only -w10 -l -p 12345 -o $tmpfile1 & + ip vrf exec v$h1 nc --recv-only -w10 -l -p 12345 -o $mirred_e2i_tf2 & local rpid=$! - ip vrf exec v$h1 nc -w1 --send-only 192.0.2.2 12345 <$tmpfile + ip vrf exec v$h1 nc -w1 --send-only 192.0.2.2 12345 <$mirred_e2i_tf1 wait -n $rpid - cmp -s $tmpfile $tmpfile1 + cmp -s $mirred_e2i_tf1 $mirred_e2i_tf2 check_err $? "server output check failed" $MZ $h1 -c 10 -p 64 -a $h1mac -b $h1mac -A 192.0.2.1 -B 192.0.2.1 \
@@ -195,7 +195,7 @@ mirred_egress_to_ingress_tcp_test() tc filter del dev $h1 egress protocol ip pref 101 handle 101 flower tc filter del dev $h1 ingress protocol ip pref 102 handle 102 flower - rm -f $tmpfile $tmpfile1 + rm -f $mirred_e2i_tf1 $mirred_e2i_tf2 log_test "mirred_egress_to_ingress_tcp ($tcflags)" }
@@ -224,6 +224,8 @@ setup_prepare() cleanup() { + local tf + pre_cleanup switch_destroy
@@ -234,6 +236,8 @@ cleanup() ip link set $swp2 address $swp2origmac ip link set $swp1 address $swp1origmac + + for tf in $mirred_e2i_tf1 $mirred_e2i_tf2; do rm -f $tf; done } mirred_egress_redirect_test()
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 3/139 selftests: forwarding: tc_actions: Use ncat instead of nc
In reply to Greg Kroah-HartmanFrom: Ido Schimmel <[email protected]>
[ Upstream commit 5e8670610b93158ffacc3241f835454ff26a3469 ]
The test relies on 'nc' being the netcat version from the nmap project. While this seems to be the case on Fedora, it is not the case on Ubuntu, resulting in failures such as [1].
Fix by explicitly using the 'ncat' utility from the nmap project and the skip the test in case it is not installed.
[1]
# timeout set to 0 # selftests: net/forwarding: tc_actions.sh # TEST: gact drop and ok (skip_hw) [ OK ] # TEST: mirred egress flower redirect (skip_hw) [ OK ] # TEST: mirred egress flower mirror (skip_hw) [ OK ] # TEST: mirred egress matchall mirror (skip_hw) [ OK ] # TEST: mirred_egress_to_ingress (skip_hw) [ OK ] # nc: invalid option -- '-' # usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl] # [-m minttl] [-O length] [-P proxy_username] [-p source_port] # [-q seconds] [-s sourceaddr] [-T keyword] [-V rtable] [-W recvlimit] # [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] # [destination] [port] # nc: invalid option -- '-' # usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl] # [-m minttl] [-O length] [-P proxy_username] [-p source_port] # [-q seconds] [-s sourceaddr] [-T keyword] [-V rtable] [-W recvlimit] # [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] # [destination] [port] # TEST: mirred_egress_to_ingress_tcp (skip_hw) [FAIL] # server output check failed # INFO: Could not test offloaded functionality not ok 80 selftests: net/forwarding: tc_actions.sh # exit=1
--- tools/testing/selftests/net/forwarding/tc_actions.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
tools/testing/selftests/net/forwarding/tc_actions.sh +4 -2
@@ -8,6 +8,8 @@ NUM_NETIFS=4 source tc_common.sh source lib.sh +require_command ncat + tcflags="skip_hw" h1_create()
@@ -174,9 +176,9 @@ mirred_egress_to_ingress_tcp_test() ip_proto icmp \ action drop - ip vrf exec v$h1 nc --recv-only -w10 -l -p 12345 -o $mirred_e2i_tf2 & + ip vrf exec v$h1 ncat --recv-only -w10 -l -p 12345 -o $mirred_e2i_tf2 & local rpid=$! - ip vrf exec v$h1 nc -w1 --send-only 192.0.2.2 12345 <$mirred_e2i_tf1 + ip vrf exec v$h1 ncat -w1 --send-only 192.0.2.2 12345 <$mirred_e2i_tf1 wait -n $rpid cmp -s $mirred_e2i_tf1 $mirred_e2i_tf2 check_err $? "server output check failed"
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 4/139 macsec: Fix traffic counters/statistics
In reply to Greg Kroah-HartmanFrom: Clayton Yager <[email protected]>
[ Upstream commit 91ec9bd57f3524ff3d86bfb7c9ee5a315019733c ]
OutOctetsProtected, OutOctetsEncrypted, InOctetsValidated, and InOctetsDecrypted were incrementing by the total number of octets in frames instead of by the number of octets of User Data in frames.
The Controlled Port statistics ifOutOctets and ifInOctets were incrementing by the total number of octets instead of the number of octets of the MSDUs plus octets of the destination and source MAC addresses.
The Controlled Port statistics ifInDiscards and ifInErrors were not incrementing each time the counters they aggregate were.
The Controlled Port statistic ifInErrors was not included in the output of macsec_get_stats64 so the value was not present in ip commands output.
The ReceiveSA counters InPktsNotValid, InPktsNotUsingSA, and InPktsUnusedSA were not incrementing.
Stable-dep-of: 32d0a49d36a2 ("macsec: use DEV_STATS_INC()")
--- drivers/net/macsec.c | 58 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 9 deletions(-)
drivers/net/macsec.c +49 -9
@@ -160,6 +160,19 @@ static struct macsec_rx_sa *macsec_rxsa_get(struct macsec_rx_sa __rcu *ptr)return sa; } +static struct macsec_rx_sa *macsec_active_rxsa_get (struct macsec_rx_sc *rx_sc) +{ +struct macsec_rx_sa *sa =NULL ; +int an; + +for (an =0 ; an <MACSEC_NUM_AN ; an++) { + sa =macsec_rxsa_get (rx_sc->sa[an]); +if (sa) +break ; + } +return sa; +} +static void free_rx_sc_rcu (struct rcu_head *head) { struct macsec_rx_sc *rx_sc = container_of(head, struct macsec_rx_sc, rcu_head);
@@ -493,18 +506,28 @@ static void macsec_encrypt_finish(struct sk_buff *skb, struct net_device *dev) skb->protocol =eth_hdr (skb)->h_proto; } +static unsigned int macsec_msdu_len (struct sk_buff *skb) +{ +struct macsec_dev *macsec =macsec_priv (skb->dev); +struct macsec_secy *secy = &macsec->secy; +bool sci_present =macsec_skb_cb (skb)->has_sci; + +return skb->len -macsec_hdr_len (sci_present) - secy->icv_len; +} +static void macsec_count_tx (struct sk_buff *skb,struct macsec_tx_sc *tx_sc,struct macsec_tx_sa *tx_sa) { +unsigned int msdu_len =macsec_msdu_len (skb);struct pcpu_tx_sc_stats *txsc_stats =this_cpu_ptr (tx_sc->stats);u64_stats_update_begin (&txsc_stats->syncp);if (tx_sc->encrypt) { - txsc_stats->stats.OutOctetsEncrypted += skb->len; + txsc_stats->stats.OutOctetsEncrypted += msdu_len; txsc_stats->stats.OutPktsEncrypted++;this_cpu_inc (tx_sa->stats->OutPktsEncrypted); }else { - txsc_stats->stats.OutOctetsProtected += skb->len; + txsc_stats->stats.OutOctetsProtected += msdu_len; txsc_stats->stats.OutPktsProtected++;this_cpu_inc (tx_sa->stats->OutPktsProtected); }
@@ -534,9 +557,10 @@ static void macsec_encrypt_done(struct crypto_async_request *base, int err)aead_request_free (macsec_skb_cb (skb)->req);rcu_read_lock_bh (); -macsec_encrypt_finish (skb, dev);macsec_count_tx (skb, &macsec->secy.tx_sc,macsec_skb_cb (skb)->tx_sa); - len = skb->len; +/* packet is encrypted/protected so tx_bytes must be calculated */ + len =macsec_msdu_len (skb) +2 *ETH_ALEN ; +macsec_encrypt_finish (skb, dev); ret =dev_queue_xmit (skb);count_tx (dev, ret, len);rcu_read_unlock_bh ();
@@ -695,6 +719,7 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb,macsec_skb_cb (skb)->req = req;macsec_skb_cb (skb)->tx_sa = tx_sa; +macsec_skb_cb (skb)->has_sci = sci_present;aead_request_set_callback (req,0 , macsec_encrypt_done, skb);dev_hold (skb->dev);
@@ -736,15 +761,17 @@ static bool macsec_post_decrypt(struct sk_buff *skb, struct macsec_secy *secy, uu64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsLate++;u64_stats_update_end (&rxsc_stats->syncp); + secy->netdev->stats.rx_dropped++;return false; }if (secy->validate_frames !=MACSEC_VALIDATE_DISABLED ) { +unsigned int msdu_len =macsec_msdu_len (skb);u64_stats_update_begin (&rxsc_stats->syncp);if (hdr->tci_an &MACSEC_TCI_E ) - rxsc_stats->stats.InOctetsDecrypted += skb->len; + rxsc_stats->stats.InOctetsDecrypted += msdu_len;else - rxsc_stats->stats.InOctetsValidated += skb->len; + rxsc_stats->stats.InOctetsValidated += msdu_len;u64_stats_update_end (&rxsc_stats->syncp); }
@@ -757,6 +784,8 @@ static bool macsec_post_decrypt(struct sk_buff *skb, struct macsec_secy *secy, uu64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsNotValid++;u64_stats_update_end (&rxsc_stats->syncp); +this_cpu_inc (rx_sa->stats->InPktsNotValid); + secy->netdev->stats.rx_errors++;return false; }
@@ -849,9 +878,9 @@ static void macsec_decrypt_done(struct crypto_async_request *base, int err)macsec_finalize_skb (skb, macsec->secy.icv_len,macsec_extra_len (macsec_skb_cb (skb)->has_sci)); + len = skb->len;macsec_reset_skb (skb, macsec->secy.netdev); - len = skb->len;if (gro_cells_receive (&macsec->gro_cells, skb) ==NET_RX_SUCCESS )count_rx (dev, len);
@@ -1042,6 +1071,7 @@ static enum rx_handler_result handle_not_macsec(struct sk_buff *skb)u64_stats_update_begin (&secy_stats->syncp); secy_stats->stats.InPktsNoTag++;u64_stats_update_end (&secy_stats->syncp); + macsec->secy.netdev->stats.rx_dropped++;continue ; }
@@ -1151,6 +1181,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)u64_stats_update_begin (&secy_stats->syncp); secy_stats->stats.InPktsBadTag++;u64_stats_update_end (&secy_stats->syncp); + secy->netdev->stats.rx_errors++; goto drop_nosa; }
@@ -1161,11 +1192,15 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)/* If validateFrames is Strict or the C bit in the * SecTAG is set, discard */ +struct macsec_rx_sa *active_rx_sa =macsec_active_rxsa_get (rx_sc);if (hdr->tci_an &MACSEC_TCI_C || secy->validate_frames ==MACSEC_VALIDATE_STRICT ) {u64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsNotUsingSA++;u64_stats_update_end (&rxsc_stats->syncp); + secy->netdev->stats.rx_errors++; +if (active_rx_sa) +this_cpu_inc (active_rx_sa->stats->InPktsNotUsingSA); goto drop_nosa; }
@@ -1175,6 +1210,8 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)u64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsUnusedSA++;u64_stats_update_end (&rxsc_stats->syncp); +if (active_rx_sa) +this_cpu_inc (active_rx_sa->stats->InPktsUnusedSA); goto deliver; }
@@ -1195,6 +1232,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)u64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsLate++;u64_stats_update_end (&rxsc_stats->syncp); + macsec->secy.netdev->stats.rx_dropped++; goto drop; } }
@@ -1223,6 +1261,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) deliver:macsec_finalize_skb (skb, secy->icv_len,macsec_extra_len (macsec_skb_cb (skb)->has_sci)); + len = skb->len;macsec_reset_skb (skb, secy->netdev);if (rx_sa)
@@ -1230,7 +1269,6 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)macsec_rxsc_put (rx_sc);skb_orphan (skb); - len = skb->len; ret =gro_cells_receive (&macsec->gro_cells, skb);if (ret ==NET_RX_SUCCESS )count_rx (dev, len);
@@ -1272,6 +1310,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)u64_stats_update_begin (&secy_stats->syncp); secy_stats->stats.InPktsNoSCI++;u64_stats_update_end (&secy_stats->syncp); + macsec->secy.netdev->stats.rx_errors++;continue ; }
@@ -3403,6 +3442,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,return NETDEV_TX_OK ; } + len = skb->len; skb =macsec_encrypt (skb, dev);if (IS_ERR (skb)) {if (PTR_ERR (skb) != -EINPROGRESS )
@@ -3413,7 +3453,6 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,macsec_count_tx (skb, &macsec->secy.tx_sc,macsec_skb_cb (skb)->tx_sa);macsec_encrypt_finish (skb, dev); - len = skb->len; ret =dev_queue_xmit (skb);count_tx (dev, ret, len);return ret;
@@ -3643,6 +3682,7 @@ static void macsec_get_stats64(struct net_device *dev, s->rx_dropped = dev->stats.rx_dropped; s->tx_dropped = dev->stats.tx_dropped; + s->rx_errors = dev->stats.rx_errors; }static int macsec_get_iflink (const struct net_device *dev)
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 5/139 macsec: use DEV_STATS_INC()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 32d0a49d36a2a306c2e47fe5659361e424f0ed3f ]
syzbot/KCSAN reported data-races in macsec whenever dev->stats fields are updated.
It appears all of these updates can happen from multiple cpus.
Adopt SMP safe DEV_STATS_INC() to update dev->stats fields.
--- drivers/net/macsec.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-)
drivers/net/macsec.c +14 -14
@@ -761,7 +761,7 @@ static bool macsec_post_decrypt(struct sk_buff *skb, struct macsec_secy *secy, uu64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsLate++;u64_stats_update_end (&rxsc_stats->syncp); - secy->netdev->stats.rx_dropped++; +DEV_STATS_INC (secy->netdev, rx_dropped);return false; }
@@ -785,7 +785,7 @@ static bool macsec_post_decrypt(struct sk_buff *skb, struct macsec_secy *secy, u rxsc_stats->stats.InPktsNotValid++;u64_stats_update_end (&rxsc_stats->syncp);this_cpu_inc (rx_sa->stats->InPktsNotValid); - secy->netdev->stats.rx_errors++; +DEV_STATS_INC (secy->netdev, rx_errors);return false; }
@@ -1071,7 +1071,7 @@ static enum rx_handler_result handle_not_macsec(struct sk_buff *skb)u64_stats_update_begin (&secy_stats->syncp); secy_stats->stats.InPktsNoTag++;u64_stats_update_end (&secy_stats->syncp); - macsec->secy.netdev->stats.rx_dropped++; +DEV_STATS_INC (macsec->secy.netdev, rx_dropped);continue ; }
@@ -1181,7 +1181,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)u64_stats_update_begin (&secy_stats->syncp); secy_stats->stats.InPktsBadTag++;u64_stats_update_end (&secy_stats->syncp); - secy->netdev->stats.rx_errors++; +DEV_STATS_INC (secy->netdev, rx_errors); goto drop_nosa; }
@@ -1198,7 +1198,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)u64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsNotUsingSA++;u64_stats_update_end (&rxsc_stats->syncp); - secy->netdev->stats.rx_errors++; +DEV_STATS_INC (secy->netdev, rx_errors);if (active_rx_sa)this_cpu_inc (active_rx_sa->stats->InPktsNotUsingSA); goto drop_nosa;
@@ -1232,7 +1232,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)u64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsLate++;u64_stats_update_end (&rxsc_stats->syncp); - macsec->secy.netdev->stats.rx_dropped++; +DEV_STATS_INC (macsec->secy.netdev, rx_dropped); goto drop; } }
@@ -1273,7 +1273,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)if (ret ==NET_RX_SUCCESS )count_rx (dev, len);else - macsec->secy.netdev->stats.rx_dropped++; +DEV_STATS_INC (macsec->secy.netdev, rx_dropped);rcu_read_unlock ();
@@ -1310,7 +1310,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)u64_stats_update_begin (&secy_stats->syncp); secy_stats->stats.InPktsNoSCI++;u64_stats_update_end (&secy_stats->syncp); - macsec->secy.netdev->stats.rx_errors++; +DEV_STATS_INC (macsec->secy.netdev, rx_errors);continue ; }
@@ -1329,7 +1329,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) secy_stats->stats.InPktsUnknownSCI++;u64_stats_update_end (&secy_stats->syncp); }else { - macsec->secy.netdev->stats.rx_dropped++; +DEV_STATS_INC (macsec->secy.netdev, rx_dropped); } }
@@ -3438,7 +3438,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,if (!secy->operational) {kfree_skb (skb); - dev->stats.tx_dropped++; +DEV_STATS_INC (dev, tx_dropped);return NETDEV_TX_OK ; }
@@ -3446,7 +3446,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb, skb =macsec_encrypt (skb, dev);if (IS_ERR (skb)) {if (PTR_ERR (skb) != -EINPROGRESS ) - dev->stats.tx_dropped++; +DEV_STATS_INC (dev, tx_dropped);return NETDEV_TX_OK ; }
@@ -3680,9 +3680,9 @@ static void macsec_get_stats64(struct net_device *dev,dev_fetch_sw_netstats (s, dev->tstats); - s->rx_dropped = dev->stats.rx_dropped; - s->tx_dropped = dev->stats.tx_dropped; - s->rx_errors = dev->stats.rx_errors; + s->rx_dropped =atomic_long_read (&dev->stats.__rx_dropped); + s->tx_dropped =atomic_long_read (&dev->stats.__tx_dropped); + s->rx_errors =atomic_long_read (&dev->stats.__rx_errors); }static int macsec_get_iflink (const struct net_device *dev)
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 6/139 net/tls: Perform immediate device ctx cleanup when possible
In reply to Greg Kroah-HartmanFrom: Tariq Toukan <[email protected]>
[ Upstream commit 113671b255ee3b9f5585a6d496ef0e675e698698 ]
TLS context destructor can be run in atomic context. Cleanup operations for device-offloaded contexts could require access and interaction with the device callbacks, which might sleep. Hence, the cleanup of such contexts must be deferred and completed inside an async work.
For all others, this is not necessary, as cleanup is atomic. Invoke cleanup immediately for them, avoiding queueing redundant gc work.
Stable-dep-of: 6b47808f223c ("net: tls: avoid discarding data on record close")
--- net/tls/tls_device.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)
net/tls/tls_device.c +18 -8
@@ -95,19 +95,29 @@ static void tls_device_gc_task(struct work_struct *work)static void tls_device_queue_ctx_destruction (struct tls_context *ctx) {unsigned long flags; +bool async_cleanup;spin_lock_irqsave (&tls_device_lock, flags); -if (unlikely (!refcount_dec_and_test (&ctx->refcount))) - goto unlock; +if (unlikely (!refcount_dec_and_test (&ctx->refcount))) { +spin_unlock_irqrestore (&tls_device_lock, flags); +return ; + } -list_move_tail (&ctx->list, &tls_device_gc_list); + async_cleanup = ctx->netdev && ctx->tx_conf ==TLS_HW ; +if (async_cleanup) { +list_move_tail (&ctx->list, &tls_device_gc_list); -/* schedule_work inside the spinlock -* to make sure tls_device_down waits for that work. -*/ -schedule_work (&tls_device_gc_work); -unlock: +/* schedule_work inside the spinlock +* to make sure tls_device_down waits for that work. +*/ +schedule_work (&tls_device_gc_work); + }else { +list_del (&ctx->list); + }spin_unlock_irqrestore (&tls_device_lock, flags); + +if (!async_cleanup) +tls_device_free_ctx (ctx); }/* We assume that the socket is already connected */
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 7/139 net/tls: Multi-threaded calls to TX tls_dev_del
In reply to Greg Kroah-HartmanFrom: Tariq Toukan <[email protected]>
[ Upstream commit 7adc91e0c93901a0eeeea10665d0feb48ffde2d4 ]
Multiple TLS device-offloaded contexts can be added in parallel via concurrent calls to .tls_dev_add, while calls to .tls_dev_del are sequential in tls_device_gc_task.
This is not a sustainable behavior. This creates a rate gap between add and del operations (addition rate outperforms the deletion rate). When running for enough time, the TLS device resources could get exhausted, failing to offload new connections.
Replace the single-threaded garbage collector work with a per-context alternative, so they can be handled on several cores in parallel. Use a new dedicated destruct workqueue for this.
Tested with mlx5 device:
Before: 22141 add/sec, 103 del/sec After: 11684 add/sec, 11684 del/sec
Stable-dep-of: 6b47808f223c ("net: tls: avoid discarding data on record close")
--- include/net/tls.h | 2 ++ net/tls/tls_device.c | 63 ++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 32 deletions(-)
include/net/tls.h +2 -0
@@ -179,6 +179,8 @@ struct tls_offload_context_tx {struct scatterlist sg_tx_data[MAX_SKB_FRAGS ];void (*sk_destruct)(struct sock *sk); +struct work_struct destruct_work; +struct tls_context *ctx;u8 driver_state[]__aligned(8) ;/* The TLS layer reserves room for driver specific state * Currently the belief is that there is not enough
net/tls/tls_device.c +31 -32
111 lines not on this page · raw message
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 8/139 net: tls: avoid discarding data on record close
In reply to Greg Kroah-HartmanFrom: Jakub Kicinski <[email protected]>
[ Upstream commit 6b47808f223c70ff564f9b363446d2a5fa1e05b2 ]
TLS records end with a 16B tag. For TLS device offload we only need to make space for this tag in the stream, the device will generate and replace it with the actual calculated tag.
Long time ago the code would just re-reference the head frag which mostly worked but was suboptimal because it prevented TCP from combining the record into a single skb frag. I'm not sure if it was correct as the first frag may be shorter than the tag.
The commit under fixes tried to replace that with using the page frag and if the allocation failed rolling back the data, if record was long enough. It achieves better fragment coalescing but is also buggy.
We don't roll back the iterator, so unless we're at the end of send we'll skip the data we designated as tag and start the next record as if the rollback never happened. There's also the possibility that the record was constructed with MSG_MORE and the data came from a different syscall and we already told the user space that we "got it".
Allocate a single dummy page and use it as fallback.
Found by code inspection, and proven by forcing allocation failures.
--- net/tls/tls_device.c | 64 +++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 31 deletions(-)
net/tls/tls_device.c +33 -31
@@ -51,6 +51,8 @@ static LIST_HEAD(tls_device_list);static LIST_HEAD (tls_device_down_list);static DEFINE_SPINLOCK (tls_device_lock); +static struct page *dummy_page; +static void tls_device_free_ctx (struct tls_context *ctx) {if (ctx->tx_conf ==TLS_HW ) {
@@ -297,36 +299,33 @@ static int tls_push_record(struct sock *sk,return tls_push_sg (sk, ctx, offload_ctx->sg_tx_data,0 , flags); } -static int tls_device_record_close (struct sock *sk, -struct tls_context *ctx, -struct tls_record_info *record, -struct page_frag *pfrag, -unsigned char record_type) +static void tls_device_record_close (struct sock *sk, +struct tls_context *ctx, +struct tls_record_info *record, +struct page_frag *pfrag, +unsigned char record_type) {struct tls_prot_info *prot = &ctx->prot_info; -int ret; +struct page_frag dummy_tag_frag;/* append tag * device will fill in the tag, we just need to append a placeholder * use socket memory to improve coalescing (re-using a single buffer * increases frag count) -* if we can't allocate memory now, steal some back from data +* if we can't allocate memory now use the dummy page */ -if (likely (skb_page_frag_refill (prot->tag_size, pfrag, - sk->sk_allocation))) { - ret =0 ; -tls_append_frag (record, pfrag, prot->tag_size); - }else { - ret = prot->tag_size; -if (record->len <= prot->overhead_size) -return -ENOMEM ; +if (unlikely (pfrag->size - pfrag->offset < prot->tag_size) && + !skb_page_frag_refill (prot->tag_size, pfrag, sk->sk_allocation)) { + dummy_tag_frag.page = dummy_page; + dummy_tag_frag.offset =0 ; + pfrag = &dummy_tag_frag; } +tls_append_frag (record, pfrag, prot->tag_size);/* fill prepend */ tls_fill_prepend (ctx,skb_frag_address (&record->frags[0 ]), record->len - prot->overhead_size, record_type); -return ret; } static int tls_create_new_record(struct tls_offload_context_tx *offload_ctx,
@@ -502,18 +501,8 @@ static int tls_push_data(struct sock *sk,if (done || record->len >= max_open_record_len || (record->num_frags >=MAX_SKB_FRAGS -1 )) { - rc =tls_device_record_close (sk, tls_ctx, record, - pfrag, record_type); -if (rc) { -if (rc >0 ) { - size += rc; - }else { - size = orig_size; -destroy_record (record); - ctx->open_record =NULL ; -break ; - } - } +tls_device_record_close (sk, tls_ctx, record, + pfrag, record_type); rc = tls_push_record(sk, tls_ctx,
@@ -1403,14 +1392,26 @@ int __init tls_device_init(void) {int err; - destruct_wq =alloc_workqueue ("ktls_device_destruct" ,0 ,0 ); -if (!destruct_wq) + dummy_page =alloc_page (GFP_KERNEL ); +if (!dummy_page)return -ENOMEM ; + destruct_wq =alloc_workqueue ("ktls_device_destruct" ,0 ,0 ); +if (!destruct_wq) { + err = -ENOMEM ; + goto err_free_dummy; + } + err =register_netdevice_notifier (&tls_dev_notifier);if (err) -destroy_workqueue (destruct_wq); + goto err_destroy_wq; +return 0 ; + +err_destroy_wq: +destroy_workqueue (destruct_wq); +err_free_dummy: +put_page (dummy_page);return err; }
@@ -1420,4 +1421,5 @@ void __exit tls_device_cleanup(void)flush_workqueue (destruct_wq);destroy_workqueue (destruct_wq);clean_acked_data_flush (); +put_page (dummy_page); }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 9/139 PCI: tegra194: Fix possible array out of bounds access
In reply to Greg Kroah-HartmanFrom: Sumit Gupta <[email protected]>
[ Upstream commit 205b3d02d57ce6dce96f6d2b9c230f56a9bf9817 ]
Add check to fix the possible array out of bounds violation by making speed equal to GEN1_CORE_CLK_FREQ when its value is more than the size of "pcie_gen_freq" array. This array has size of four but possible speed (CLS) values are from "0 to 0xF". So, "speed - 1" values are "-1 to 0xE".
--- drivers/pci/controller/dwc/pcie-tegra194.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +11 -2
@@ -239,6 +239,7 @@#define EP_STATE_ENABLED 1static const unsigned int pcie_gen_freq[] = { +GEN1_CORE_CLK_FREQ ,/* PCI_EXP_LNKSTA_CLS == 0; undefined */ GEN1_CORE_CLK_FREQ ,GEN2_CORE_CLK_FREQ ,GEN3_CORE_CLK_FREQ ,
@@ -452,7 +453,11 @@ static irqreturn_t tegra_pcie_ep_irq_thread(int irq, void *arg) speed =dw_pcie_readw_dbi (pci, pcie->pcie_cap_base +PCI_EXP_LNKSTA ) &PCI_EXP_LNKSTA_CLS ; -clk_set_rate (pcie->core_clk, pcie_gen_freq[speed -1 ]); + +if (speed >=ARRAY_SIZE (pcie_gen_freq)) + speed =0 ; + +clk_set_rate (pcie->core_clk, pcie_gen_freq[speed]);/* If EP doesn't advertise L1SS, just return */ val =dw_pcie_readl_dbi (pci, pcie->cfg_link_cap_l1sub);
@@ -989,7 +994,11 @@ static int tegra_pcie_dw_start_link(struct dw_pcie *pci) speed =dw_pcie_readw_dbi (pci, pcie->pcie_cap_base +PCI_EXP_LNKSTA ) &PCI_EXP_LNKSTA_CLS ; -clk_set_rate (pcie->core_clk, pcie_gen_freq[speed -1 ]); + +if (speed >=ARRAY_SIZE (pcie_gen_freq)) + speed =0 ; + +clk_set_rate (pcie->core_clk, pcie_gen_freq[speed]);tegra_pcie_enable_interrupts (pp);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 10/139 ARM: dts: imx6dl: prtrvt, prtvt7, prti6q, prtwd2: fix USB related warnings
In reply to Greg Kroah-HartmanFrom: Oleksij Rempel <[email protected]>
[ Upstream commit 1d14bd943fa2bbdfda1efbcc080b298fed5f1803 ]
Fix USB-related warnings in prtrvt, prtvt7, prti6q and prtwd2 device trees by disabling unused usbphynop1 and usbphynop2 USB PHYs and providing proper configuration for the over-current detection. This fixes the following warnings with the current kernel:
usb_phy_generic usbphynop1: dummy supplies not allowed for exclusive requests usb_phy_generic usbphynop2: dummy supplies not allowed for exclusive requests imx_usb 2184200.usb: No over current polarity defined
By the way, fix over-current detection on usbotg port for prtvt7, prti6q and prtwd2 boards. Only prtrvt do not have OC on USB OTG port.
--- arch/arm/boot/dts/imx6dl-prtrvt.dts | 4 ++++ arch/arm/boot/dts/imx6qdl-prti6q.dtsi | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-)
arch/arm/boot/dts/imx6dl-prtrvt.dts +4 -0
@@ -126,6 +126,10 @@ &usbh1 { status = "disabled"; }; +&usbotg { + disable-over-current; +}; + &vpu { status = "disabled"; };
arch/arm/boot/dts/imx6qdl-prti6q.dtsi +10 -1
@@ -69,6 +69,7 @@ &usbh1 { vbus-supply = <®_usb_h1_vbus>; phy_type = "utmi"; dr_mode = "host"; + disable-over-current; status = "okay"; };
@@ -78,10 +79,18 @@ &usbotg { pinctrl-0 = <&pinctrl_usbotg>; phy_type = "utmi"; dr_mode = "host"; - disable-over-current; + over-current-active-low; status = "okay"; }; +&usbphynop1 { + status = "disabled"; +}; + +&usbphynop2 { + status = "disabled"; +}; + &usdhc1 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_usdhc1>;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 11/139 iopoll: Call cpu_relax() in busy loops
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit b407460ee99033503993ac7437d593451fcdfe44 ]
It is considered good practice to call cpu_relax() in busy loops, see Documentation/process/volatile-considered-harmful.rst. This can not only lower CPU power consumption or yield to a hyperthreaded twin processor, but also allows an architecture to mitigate hardware issues (e.g. ARM Erratum 754327 for Cortex-A9 prior to r2p0) in the architecture-specific cpu_relax() implementation.
In addition, cpu_relax() is also a compiler barrier. It is not immediately obvious that the @op argument "function" will result in an actual function call (e.g. in case of inlining).
Where a function call is a C sequence point, this is lost on inlining. Therefore, with agressive enough optimization it might be possible for the compiler to hoist the:
(val) = op(args);
"load" out of the loop because it doesn't see the value changing. The addition of cpu_relax() would inhibit this.
As the iopoll helpers lack calls to cpu_relax(), people are sometimes reluctant to use them, and may fall back to open-coded polling loops (including cpu_relax() calls) instead.
Fix this by adding calls to cpu_relax() to the iopoll helpers:
- For the non-atomic case, it is sufficient to call cpu_relax() in case of a zero sleep-between-reads value, as a call to usleep_range() is a safe barrier otherwise. However, it doesn't hurt to add the call regardless, for simplicity, and for similarity with the atomic case below.
- For the atomic case, cpu_relax() must be called regardless of the sleep-between-reads value, as there is no guarantee all architecture-specific implementations of udelay() handle this.
--- include/linux/iopoll.h | 2 ++ 1 file changed, 2 insertions(+)
include/linux/iopoll.h +2 -0
@@ -53,6 +53,7 @@ } \if (__sleep_us) \usleep_range ((__sleep_us >>2 ) +1 , __sleep_us); \ +cpu_relax (); \ } \ (cond) ?0 : -ETIMEDOUT ; \ })
@@ -95,6 +96,7 @@ } \if (__delay_us) \udelay (__delay_us); \ +cpu_relax (); \ } \ (cond) ?0 : -ETIMEDOUT ; \ })
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 12/139 ASoC: SOF: Intel: fix SoundWire/HDaudio mutual exclusion
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit f751b99255cacd9ffe8c4bbf99767ad670cee1f7 ]
The functionality described in Commit 61bef9e68dca ("ASoC: SOF: Intel: hda: enforce exclusion between HDaudio and SoundWire") does not seem to be properly implemented with two issues that need to
be corrected.
a) The test used is incorrect when DisplayAudio codecs are not supported.
b) Conversely when only Display Audio codecs can be found, we do want to start the SoundWire links, if any. That will help add the relevant topologies and machine descriptors, and identify cases where the SoundWire information in ACPI needs to be modified with a quirk.
--- sound/soc/sof/intel/hda.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
sound/soc/sof/intel/hda.c +11 -1
@@ -1040,12 +1040,22 @@ static int hda_generic_machine_select(struct snd_sof_dev *sdev) pdata->machine = hda_mach; pdata->tplg_filename = tplg_filename; -if (codec_num ==2 ) { +if (codec_num ==2 || + (codec_num ==1 && !HDA_IDISP_CODEC (bus->codec_mask))) {/* * Prevent SoundWire links from starting when an external * HDaudio codec is used */ hda_mach->mach_params.link_mask =0 ; + }else { +/* +* Allow SoundWire links to start when no external HDaudio codec +* was detected. This will not create a SoundWire card but +* will help detect if any SoundWire codec reports as ATTACHED. +*/ +struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata; + + hda_mach->mach_params.link_mask = hdev->info.link_mask; } } }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 13/139 dma-remap: use kvmalloc_array/kvfree for larger dma memory remap
In reply to Greg Kroah-HartmanFrom: gaoxu <[email protected]>
[ Upstream commit 51ff97d54f02b4444dfc42e380ac4c058e12d5dd ]
If dma_direct_alloc() alloc memory in size of 64MB, the inner function dma_common_contiguous_remap() will allocate 128KB memory by invoking the function kmalloc_array(). and the kmalloc_array seems to fail to try to allocate 128KB mem.
Call trace: [14977.928623] qcrosvm: page allocation failure: order:5, mode:0x40cc0 [14977.928638] dump_backtrace.cfi_jt+0x0/0x8 [14977.928647] dump_stack_lvl+0x80/0xb8 [14977.928652] warn_alloc+0x164/0x200 [14977.928657] __alloc_pages_slowpath+0x9f0/0xb4c [14977.928660] __alloc_pages+0x21c/0x39c [14977.928662] kmalloc_order+0x48/0x108 [14977.928666] kmalloc_order_trace+0x34/0x154 [14977.928668] __kmalloc+0x548/0x7e4 [14977.928673] dma_direct_alloc+0x11c/0x4f8 [14977.928678] dma_alloc_attrs+0xf4/0x138 [14977.928680] gh_vm_ioctl_set_fw_name+0x3c4/0x610 [gunyah] [14977.928698] gh_vm_ioctl+0x90/0x14c [gunyah] [14977.928705] __arm64_sys_ioctl+0x184/0x210
work around by doing kvmalloc_array instead.
--- kernel/dma/remap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/dma/remap.c +2 -2
@@ -43,13 +43,13 @@ void *dma_common_contiguous_remap(struct page *page, size_t size,void *vaddr;int i; - pages =kmalloc_array (count,sizeof (struct page *),GFP_KERNEL ); + pages =kvmalloc_array (count,sizeof (struct page *),GFP_KERNEL );if (!pages)return NULL ;for (i =0 ; i < count; i++) pages[i] =nth_page (page, i); vaddr =vmap (pages, count,VM_DMA_COHERENT , prot); -kfree (pages); +kvfree (pages);return vaddr; }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 14/139 HID: logitech-hidpp: Add USB and Bluetooth IDs for the Logitech G915 TKL Keyboard
In reply to Greg Kroah-HartmanFrom: stuarthayhurst <[email protected]>
[ Upstream commit 48aea8b445c422a372cf15915101035a47105421 ]
Adds the USB and Bluetooth IDs for the Logitech G915 TKL keyboard, for device detection For this device, this provides battery reporting on top of hid-generic
--- drivers/hid/hid-logitech-hidpp.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/hid/hid-logitech-hidpp.c +4 -0
@@ -4377,6 +4377,8 @@ static const struct hid_device_id hidpp_devices[] = { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC086) }, {/* Logitech G903 Hero Gaming Mouse over USB */ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC091) }, + { /* Logitech G915 TKL Keyboard over USB */ + HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xC343) }, { /* Logitech G920 Wheel over USB */HID_USB_DEVICE (USB_VENDOR_ID_LOGITECH ,USB_DEVICE_ID_LOGITECH_G920_WHEEL ), .driver_data = HIDPP_QUIRK_CLASS_G920 | HIDPP_QUIRK_FORCE_OUTPUT_REPORTS},
@@ -4392,6 +4394,8 @@ static const struct hid_device_id hidpp_devices[] = { {/* MX5500 keyboard over Bluetooth */ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb30b), .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS }, + { /* Logitech G915 TKL keyboard over Bluetooth */ + HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb35f) }, { /* M-RCQ142 V470 Cordless Laser Mouse over Bluetooth */ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb008) }, { /* MX Master mouse over Bluetooth */
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 15/139 drm/amdgpu: install stub fence into potential unused fence pointers
In reply to Greg Kroah-HartmanFrom: Lang Yu <[email protected]>
[ Upstream commit 187916e6ed9d0c3b3abc27429f7a5f8c936bd1f0 ]
When using cpu to update page tables, vm update fences are unused. Install stub fence into these fence pointers instead of NULL to avoid NULL dereference when calling dma_fence_wait() on them.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +4 -2
@@ -2260,6 +2260,7 @@ struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,amdgpu_vm_bo_base_init (&bo_va->base, vm, bo); bo_va->ref_count =1 ; + bo_va->last_pt_update =dma_fence_get_stub ();INIT_LIST_HEAD (&bo_va->valids);INIT_LIST_HEAD (&bo_va->invalids);
@@ -2974,7 +2975,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) vm->update_funcs = &amdgpu_vm_cpu_funcs; else vm->update_funcs = &amdgpu_vm_sdma_funcs; - vm->last_update =NULL ; + + vm->last_update =dma_fence_get_stub (); vm->last_unlocked =dma_fence_get_stub ();mutex_init (&vm->eviction_lock);
@@ -3117,7 +3119,7 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm) vm->update_funcs = &amdgpu_vm_sdma_funcs; }dma_fence_put (vm->last_update); - vm->last_update =NULL ; + vm->last_update =dma_fence_get_stub (); vm->is_compute_context = true;/* Free the shadow bo for compute VM */
Signature · 1 line
2.40.1
RE: [PATCH 5.15 015/139] drm/amdgpu: install stub fence into potential unused fence pointers
[Public]
Quoted 19 lines
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: Thursday, August 24, 2023 10:49 AM
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Koenig, Christian <[email protected]>; Yu, Lang <[email protected]>; Deucher, Alexander <[email protected]>; Sasha Levin <[email protected]>
Subject: [PATCH 5.15 015/139] drm/amdgpu: install stub fence into potential unused fence pointersFrom: Lang Yu <[email protected]>
[ Upstream commit
187916e6ed9d0c3b3abc27429f7a5f8c936bd1f0]When using cpu to update page tables, vm update fences are unused. Install stub fence into these fence pointers instead of NULL to avoid NULL dereference when calling
dma_fence_wait()on them.
Quoted 5 lines
Suggested-by Christian König <[email protected]>Signed-off-by Lang Yu <[email protected]>Reviewed-by Christian König <[email protected]>Signed-off-by Alex Deucher <[email protected]>Signed-off-by Sasha Levin <[email protected]>
Please revert this from 5.15. This was autoselected for 5.15, but is not applicable to this branch. This is causing log spam on 5.15. It was included in 5.15.128 as commit 4921792e04f2125b5eadef9dbe9417a8354c7eff. See https://gitlab.freedesktop.org/drm/amd/-/issues/2820
Thanks,
Alex
Quoted 43 lines
--- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +3
-1@@ -2260,6 +2260,7 @@ struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev, amdgpu_vm_bo_base_init(&bo_va->base, vm, bo); bo_va->ref_count =1 ; + bo_va->last_pt_update =dma_fence_get_stub ();INIT_LIST_HEAD (&bo_va->valids);INIT_LIST_HEAD (&bo_va->invalids);@@ -2974,7 +2975,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) vm->update_funcs = &amdgpu_vm_cpu_funcs; else vm->update_funcs = &amdgpu_vm_sdma_funcs; - vm->last_update =NULL ; + + vm->last_update =dma_fence_get_stub (); vm->last_unlocked =dma_fence_get_stub ();mutex_init(&vm->eviction_lock);drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +1
-1@@ -3117,7 +3119,7 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm) vm->update_funcs = &amdgpu_vm_sdma_funcs; }dma_fence_put (vm->last_update); - vm->last_update =NULL ; + vm->last_update =dma_fence_get_stub (); vm->is_compute_context = true;/* Free the shadow bo for compute VM */--
2.40.1
Greg Kroah-Hartman
maintainerRe: [PATCH 5.15 015/139] drm/amdgpu: install stub fence into potential unused fence pointers
Quoted 21 lines · Alexander
[Public]
Quoted 19 lines
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: Thursday, August 24, 2023 10:49 AM
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Koenig, Christian <[email protected]>; Yu, Lang <[email protected]>; Deucher, Alexander <[email protected]>; Sasha Levin <[email protected]>
Subject: [PATCH 5.15 015/139] drm/amdgpu: install stub fence into potential unused fence pointersFrom: Lang Yu <[email protected]>
[ Upstream commit
187916e6ed9d0c3b3abc27429f7a5f8c936bd1f0]When using cpu to update page tables, vm update fences are unused. Install stub fence into these fence pointers instead of NULL to avoid NULL dereference when calling
dma_fence_wait()on them.
Quoted 7 lines
Quoted 5 lines
Suggested-by Christian König <[email protected]>Signed-off-by Lang Yu <[email protected]>Reviewed-by Christian König <[email protected]>Signed-off-by Alex Deucher <[email protected]>Signed-off-by Sasha Levin <[email protected]>Please revert this from 5.15. This was autoselected for 5.15, but is not applicable to this branch. This is causing log spam on 5.15. It was included in 5.15.128 as commit
4921792e04f2125b5eadef9dbe9417a8354c7eff. See https://gitlab.freedesktop.org/drm/amd/-/issues/2820
Now reverted, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 16/139 HID: add quirk for 03f0:464a HP Elite Presenter Mouse
In reply to Greg Kroah-HartmanFrom: Marco Morandini <[email protected]>
[ Upstream commit 0db117359e47750d8bd310d19f13e1c4ef7fc26a ]
HP Elite Presenter Mouse HID Record Descriptor shows two mouses (Repord ID 0x1 and 0x2), one keypad (Report ID 0x5), two Consumer Controls (Report IDs 0x6 and 0x3). Previous to this commit it registers one mouse, one keypad and one Consumer Control, and it was usable only as a digitl laser pointer (one of the two mouses). This patch defines the 464a USB device ID and enables the HID_QUIRK_MULTI_INPUT quirk for it, allowing to use the device both as a mouse and a digital laser pointer.
--- drivers/hid/hid-ids.h | 1 + drivers/hid/hid-quirks.c | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -593,6 +593,7 @@#define USB_DEVICE_ID_UGCI_FIGHTING 0x0030#define USB_VENDOR_ID_HP 0x03f0 +#define USB_PRODUCT_ID_HP_ELITE_PRESENTER_MOUSE_464A 0x464a#define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A 0x0a4a#define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A 0x0b4a#define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE 0x134a
drivers/hid/hid-quirks.c +1 -0
@@ -96,6 +96,7 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096), HID_QUIRK_NO_INIT_REPORTS }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A293), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A), HID_QUIRK_ALWAYS_POLL }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_ELITE_PRESENTER_MOUSE_464A), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A), HID_QUIRK_ALWAYS_POLL },
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 17/139 RDMA/mlx5: Return the firmware result upon destroying QP/RQ
In reply to Greg Kroah-HartmanFrom: Patrisious Haddad <[email protected]>
[ Upstream commit 22664c06e997087fe37f9ba208008c948571214a ]
Previously when destroying a QP/RQ, the result of the firmware destruction function was ignored and upper layers weren't informed about the failure.
Which in turn could lead to various problems since when upper layer isn't aware of the failure it continues its operation thinking that the related QP/RQ was successfully destroyed while it actually wasn't, which could lead to the below kernel WARN.
Currently, we return the correct firmware destruction status to upper layers which in case of the RQ would be mlx5_ib_destroy_wq() which was already capable of handling RQ destruction failure or in case of a QP to destroy_qp_common(), which now would actually warn upon qp destruction failure.
WARNING: CPU: 3 PID: 995 at drivers/infiniband/core/rdma_core.c:940 uverbs_destroy_ufile_hw+0xcb/0xe0 [ib_uverbs] Modules linked in: xt_conntrack xt_MASQUERADE nf_conntrack_netlink nfnetlink xt_addrtype iptable_nat nf_nat br_netfilter rpcrdma rdma_ucm ib_iser libiscsi scsi_transport_iscsi rdma_cm ib_umad ib_ipoib iw_cm ib_cm mlx5_ib ib_uverbs ib_core overlay mlx5_core fuse CPU: 3 PID: 995 Comm: python3 Not tainted 5.16.0-rc5+ #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:uverbs_destroy_ufile_hw+0xcb/0xe0 [ib_uverbs] Code: 41 5c 41 5d 41 5e e9 44 34 f0 e0 48 89 df e8 4c 77 ff ff 49 8b 86 10 01 00 00 48 85 c0 74 a1 4c 89 e7 ff d0 eb 9a 0f 0b eb c1 <0f> 0b be 04 00 00 00 48 89 df e8 b6 f6 ff ff e9 75 ff ff ff 90 0f RSP: 0018:ffff8881533e3e78 EFLAGS: 00010287 RAX: ffff88811b2cf3e0 RBX: ffff888106209700 RCX: 0000000000000000 RDX: ffff888106209780 RSI: ffff8881533e3d30 RDI: ffff888109b101a0 RBP: 0000000000000001 R08: ffff888127cb381c R09: 0de9890000000009 R10: ffff888127cb3800 R11: 0000000000000000 R12: ffff888106209780 R13: ffff888106209750 R14: ffff888100f20660 R15: 0000000000000000 FS: 00007f8be353b740(0000) GS:ffff88852c980000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f8bd5b117c0 CR3: 000000012cd8a004 CR4: 0000000000370ea0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> ib_uverbs_close+0x1a/0x90 [ib_uverbs] __fput+0x82/0x230 task_work_run+0x59/0x90 exit_to_user_mode_prepare+0x138/0x140 syscall_exit_to_user_mode+0x1d/0x50 ? __x64_sys_close+0xe/0x40 do_syscall_64+0x4a/0x90 entry_SYSCALL_64_after_hwframe+0x44/0xae RIP: 0033:0x7f8be3ae0abb Code: 03 00 00 00 0f 05 48 3d 00 f0 ff ff 77 41 c3 48 83 ec 18 89 7c 24 0c e8 83 43 f9 ff 8b 7c 24 0c 41 89 c0 b8 03 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 35 44 89 c7 89 44 24 0c e8 c1 43 f9 ff 8b 44 RSP: 002b:00007ffdb51909c0 EFLAGS: 00000293 ORIG_RAX: 0000000000000003 RAX: 0000000000000000 RBX: 0000557bb7f7c020 RCX: 00007f8be3ae0abb RDX: 0000557bb7c74010 RSI: 0000557bb7f14ca0 RDI: 0000000000000005 RBP: 0000557bb7fbd598 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000293 R12: 0000557bb7fbd5b8 R13: 0000557bb7fbd5a8 R14: 0000000000001000 R15: 0000557bb7f7c020 </TASK>
--- drivers/infiniband/hw/mlx5/qpc.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/infiniband/hw/mlx5/qpc.c +4 -6
@@ -297,8 +297,7 @@ int mlx5_core_destroy_qp(struct mlx5_ib_dev *dev, struct mlx5_core_qp *qp)MLX5_SET (destroy_qp_in, in, opcode,MLX5_CMD_OP_DESTROY_QP );MLX5_SET (destroy_qp_in, in, qpn, qp->qpn);MLX5_SET (destroy_qp_in, in, uid, qp->uid); -mlx5_cmd_exec_in (dev->mdev, destroy_qp, in); -return 0 ; +return mlx5_cmd_exec_in (dev->mdev, destroy_qp, in); } int mlx5_core_set_delay_drop(struct mlx5_ib_dev *dev,
@@ -548,14 +547,14 @@ int mlx5_core_xrcd_dealloc(struct mlx5_ib_dev *dev, u32 xrcdn)return mlx5_cmd_exec_in (dev->mdev, dealloc_xrcd, in); } -static void destroy_rq_tracked (struct mlx5_ib_dev *dev,u32 rqn,u16 uid) +static int destroy_rq_tracked (struct mlx5_ib_dev *dev,u32 rqn,u16 uid) {u32 in[MLX5_ST_SZ_DW (destroy_rq_in)] = {};MLX5_SET (destroy_rq_in, in, opcode,MLX5_CMD_OP_DESTROY_RQ );MLX5_SET (destroy_rq_in, in, rqn, rqn);MLX5_SET (destroy_rq_in, in, uid, uid); -mlx5_cmd_exec_in (dev->mdev, destroy_rq, in); +return mlx5_cmd_exec_in (dev->mdev, destroy_rq, in); } int mlx5_core_create_rq_tracked(struct mlx5_ib_dev *dev, u32 *in, int inlen,
@@ -586,8 +585,7 @@ int mlx5_core_destroy_rq_tracked(struct mlx5_ib_dev *dev, struct mlx5_core_qp *rq) {destroy_resource_common (dev, rq); -destroy_rq_tracked (dev, rq->qpn, rq->uid); -return 0 ; +return destroy_rq_tracked (dev, rq->qpn, rq->uid); }static void destroy_sq_tracked (struct mlx5_ib_dev *dev,u32 sqn,u16 uid)
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 18/139 ovl: check type and offset of struct vfsmount in ovl_entry
In reply to Greg Kroah-HartmanFrom: Christian Brauner <[email protected]>
[ Upstream commit f723edb8a532cd26e1ff0a2b271d73762d48f762 ]
Porting overlayfs to the new amount api I started experiencing random crashes that couldn't be explained easily. So after much debugging and reasoning it became clear that struct ovl_entry requires the point to struct vfsmount to be the first member and of type struct vfsmount.
During the port I added a new member at the beginning of struct ovl_entry which broke all over the place in the form of random crashes and cache corruptions. While there's a comment in ovl_free_fs() to the effect of "Hack! Reuse ofs->layers as a vfsmount array before freeing it" there's no such comment on struct ovl_entry which makes this easy to trip over.
Add a comment and two static asserts for both the offset and the type of pointer in struct ovl_entry.
--- fs/overlayfs/ovl_entry.h | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/overlayfs/ovl_entry.h +9 -0
@@ -32,6 +32,7 @@ struct ovl_sb { };struct ovl_layer { +/* ovl_free_fs() relies on @mnt being the first member! */ struct vfsmount *mnt;/* Trap in ovl inode cache */ struct inode *trap;
@@ -42,6 +43,14 @@ struct ovl_layer {int fsid; }; +/* +* ovl_free_fs() relies on @mnt being the first member when unmounting +* the private mounts created for each layer. Let's check both the +* offset and type. +*/ +static_assert (offsetof(struct ovl_layer , mnt) ==0 ); +static_assert (__same_type(typeof_member (struct ovl_layer ,mnt ),struct vfsmount *)); +struct ovl_path {const struct ovl_layer *layer;struct dentry *dentry;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 19/139 smb: client: fix warning in cifs_smb3_do_mount()
In reply to Greg Kroah-HartmanFrom: Paulo Alcantara <[email protected]>
[ Upstream commit 12c30f33cc6769bf411088a2872843c4f9ea32f9 ]
This fixes the following warning reported by kernel test robot
fs/smb/client/cifsfs.c:982 cifs_smb3_do_mount() warn: possible memory leak of 'cifs_sb'
--- fs/cifs/cifsfs.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-)
fs/cifs/cifsfs.c +10 -18
@@ -848,11 +848,11 @@ struct dentry * cifs_smb3_do_mount(struct file_system_type *fs_type, int flags, struct smb3_fs_context *old_ctx) { - int rc; -struct super_block *sb =NULL ; -struct cifs_sb_info *cifs_sb =NULL ; struct cifs_mnt_data mnt_data; +struct cifs_sb_info *cifs_sb; +struct super_block *sb;struct dentry *root; +int rc;/* * Prints in Kernel / CIFS log the attempted mount operation
@@ -863,11 +863,9 @@ cifs_smb3_do_mount(struct file_system_type *fs_type,else cifs_info ("Attempting to mount %s\n" , old_ctx->UNC); - cifs_sb =kzalloc (sizeof (struct cifs_sb_info ),GFP_KERNEL ); -if (cifs_sb ==NULL ) { - root =ERR_PTR (-ENOMEM ); - goto out; - } + cifs_sb =kzalloc (sizeof (*cifs_sb),GFP_KERNEL ); +if (!cifs_sb) +return ERR_PTR (-ENOMEM ); cifs_sb->ctx =kzalloc (sizeof (struct smb3_fs_context ),GFP_KERNEL );if (!cifs_sb->ctx) {
@@ -910,10 +908,8 @@ cifs_smb3_do_mount(struct file_system_type *fs_type, sb =sget (fs_type, cifs_match_super, cifs_set_super, flags, &mnt_data);if (IS_ERR (sb)) { - root =ERR_CAST (sb);cifs_umount (cifs_sb); - cifs_sb =NULL ; - goto out; +return ERR_CAST (sb); }if (sb->s_root) {
@@ -944,13 +940,9 @@ cifs_smb3_do_mount(struct file_system_type *fs_type,deactivate_locked_super (sb);return root; out: -if (cifs_sb) { -if (!sb ||IS_ERR (sb)) {/* otherwise kill_sb will handle */ -kfree (cifs_sb->prepath); -smb3_cleanup_fs_context (cifs_sb->ctx); -kfree (cifs_sb); - } - } +kfree (cifs_sb->prepath); +smb3_cleanup_fs_context (cifs_sb->ctx); +kfree (cifs_sb);return root; }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 20/139 media: v4l2-mem2mem: add lock to protect parameter num_rdy
In reply to Greg Kroah-HartmanFrom: Yunfei Dong <[email protected]>
[ Upstream commit 56b5c3e67b0f9af3f45cf393be048ee8d8a92694 ]
Getting below error when using KCSAN to check the driver. Adding lock to protect parameter num_rdy when getting the value with function:
v4l2_m2m_num_src_bufs_ready/v4l2_m2m_num_dst_bufs_ready.
kworker/u16:3: [name:report&]BUG: KCSAN: data-race in v4l2_m2m_buf_queue kworker/u16:3: [name:report&]
kworker/u16:3: [name:report&]read-write to 0xffffff8105f35b94 of 1 bytes by task 20865 on cpu 7:
kworker/u16:3: v4l2_m2m_buf_queue+0xd8/0x10c
--- include/media/v4l2-mem2mem.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
include/media/v4l2-mem2mem.h +16 -2
@@ -588,7 +588,14 @@ void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx,static inline unsigned int v4l2_m2m_num_src_bufs_ready (struct v4l2_m2m_ctx *m2m_ctx) { -return m2m_ctx->out_q_ctx.num_rdy; +unsigned int num_buf_rdy; +unsigned long flags; + +spin_lock_irqsave (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); + num_buf_rdy = m2m_ctx->out_q_ctx.num_rdy; +spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); + +return num_buf_rdy; }/**
@@ -600,7 +607,14 @@ unsigned int v4l2_m2m_num_src_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)static inline unsigned int v4l2_m2m_num_dst_bufs_ready (struct v4l2_m2m_ctx *m2m_ctx) { -return m2m_ctx->cap_q_ctx.num_rdy; +unsigned int num_buf_rdy; +unsigned long flags; + +spin_lock_irqsave (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); + num_buf_rdy = m2m_ctx->cap_q_ctx.num_rdy; +spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); + +return num_buf_rdy; }/**
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 21/139 usb: gadget: u_serial: Avoid spinlock recursion in __gs_console_push
In reply to Greg Kroah-HartmanFrom: Prashanth K <[email protected]>
[ Upstream commit e5990469943c711cb00bfde6338d2add6c6d0bfe ]
When serial console over USB is enabled, gs_console_connect queues gs_console_work, where it acquires the spinlock and queues the usb request, and this request goes to gadget layer. Now consider a situation where gadget layer prints something to dmesg, this will eventually call gs_console_write() which requires cons->lock. And this causes spinlock recursion. Avoid this by excluding usb_ep_queue from the spinlock.
spin_lock_irqsave //needs cons->lock
gs_console_write
. . _printk __warn_printk dev_warn/pr_err . . [USB Gadget Layer] . .
usb_ep_queue
gs_console_work
__gs_console_push // acquires cons->lock
process_one_work
--- drivers/usb/gadget/function/u_serial.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/gadget/function/u_serial.c +3 -0
@@ -915,8 +915,11 @@ static void __gs_console_push(struct gs_console *cons) } req->length = size; + +spin_unlock_irq (&cons->lock);if (usb_ep_queue (ep, req,GFP_ATOMIC )) req->length =0 ; +spin_lock_irq (&cons->lock); }static void gs_console_work (struct work_struct *work)
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 22/139 media: platform: mediatek: vpu: fix NULL ptr dereference
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
[ Upstream commit 3df55cd773e8603b623425cc97b05e542854ad27 ]
If pdev is NULL, then it is still dereferenced.
This fixes this smatch warning:
drivers/media/platform/mediatek/vpu/mtk_vpu.c:570 vpu_load_firmware() warn: address of NULL pointer 'pdev'
--- drivers/media/platform/mtk-vpu/mtk_vpu.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/media/platform/mtk-vpu/mtk_vpu.c +4 -2
@@ -562,15 +562,17 @@ static int load_requested_vpu(struct mtk_vpu *vpu,int vpu_load_firmware (struct platform_device *pdev) {struct mtk_vpu *vpu; -struct device *dev = &pdev->dev; +struct device *dev;struct vpu_run *run;int ret;if (!pdev) { -dev_err (dev,"VPU platform device is invalid\n" ); +pr_err ("VPU platform device is invalid\n" );return -EINVAL ; } + dev = &pdev->dev; + vpu =platform_get_drvdata (pdev); run = &vpu->run;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 23/139 thunderbolt: Read retimer NVM authentication status prior tb_retimer_set_inbound_sbtx()
In reply to Greg Kroah-HartmanFrom: Mika Westerberg <[email protected]>
[ Upstream commit 1402ba08abae5cfa583ff1a40b99c098a0532d41 ]
According to the USB4 retimer guide the correct order is immediately after sending ENUMERATE_RETIMERS so update the code to follow this.
--- drivers/thunderbolt/retimer.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-)
drivers/thunderbolt/retimer.c +21 -8
@@ -208,6 +208,21 @@ static ssize_t nvm_authenticate_show(struct device *dev,return ret; } +static void tb_retimer_nvm_authenticate_status (struct tb_port *port,u32 *status) +{ +int i; + +tb_port_dbg (port,"reading NVM authentication status of retimers\n" ); + +/* +* Before doing anything else, read the authentication status. +* If the retimer has it set, store it for the new retimer +* device instance. +*/ +for (i =1 ; i <=TB_MAX_RETIMER_INDEX ; i++) +usb4_port_retimer_nvm_authenticate_status (port, i, &status[i]); +} +static void tb_retimer_set_inbound_sbtx (struct tb_port *port) {int i;
@@ -481,18 +496,16 @@ int tb_retimer_scan(struct tb_port *port, bool add)return ret;/* -* Enable sideband channel for each retimer. We can do this -* regardless whether there is device connected or not. +* Immediately after sending enumerate retimers read the +* authentication status of each retimer. */ -tb_retimer_set_inbound_sbtx (port); +tb_retimer_nvm_authenticate_status (port, status);/* -* Before doing anything else, read the authentication status. -* If the retimer has it set, store it for the new retimer -* device instance. +* Enable sideband channel for each retimer. We can do this +* regardless whether there is device connected or not. */ -for (i =1 ; i <=TB_MAX_RETIMER_INDEX ; i++) -usb4_port_retimer_nvm_authenticate_status (port, i, &status[i]); +tb_retimer_set_inbound_sbtx (port);for (i =1 ; i <=TB_MAX_RETIMER_INDEX ; i++) {/*
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 24/139 usb: chipidea: imx: dont request QoS for imx8ulp
In reply to Greg Kroah-HartmanFrom: Xu Yang <[email protected]>
[ Upstream commit 9a070e8e208995a9d638b538ed7abf28bd6ea6f0 ]
Use dedicated imx8ulp usb compatible to remove QoS request since imx8ulp has no such limitation of imx7ulp: DMA will not work if system enters idle.
Message-ID: <[email protected]>
--- drivers/usb/chipidea/ci_hdrc_imx.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/chipidea/ci_hdrc_imx.c +5 -0
@@ -70,6 +70,10 @@ static const struct ci_hdrc_imx_platform_flag imx7ulp_usb_data = { CI_HDRC_PMQOS, }; +static const struct ci_hdrc_imx_platform_flag imx8ulp_usb_data = { + .flags =CI_HDRC_SUPPORTS_RUNTIME_PM , +}; +static const struct of_device_id ci_hdrc_imx_dt_ids[] = { { .compatible ="fsl,imx23-usb" , .data = &imx23_usb_data}, { .compatible ="fsl,imx28-usb" , .data = &imx28_usb_data},
@@ -80,6 +84,7 @@ static const struct of_device_id ci_hdrc_imx_dt_ids[] = { { .compatible = "fsl,imx6ul-usb", .data = &imx6ul_usb_data}, { .compatible = "fsl,imx7d-usb", .data = &imx7d_usb_data}, { .compatible = "fsl,imx7ulp-usb", .data = &imx7ulp_usb_data}, + { .compatible = "fsl,imx8ulp-usb", .data = &imx8ulp_usb_data}, {/* sentinel */ } };MODULE_DEVICE_TABLE (of, ci_hdrc_imx_dt_ids);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 25/139 usb: chipidea: imx: add missing USB PHY DPDM wakeup setting
In reply to Greg Kroah-HartmanFrom: Xu Yang <[email protected]>
[ Upstream commit 53d061c19dc4cb68409df6dc11c40389c8c42a75 ]
USB PHY DPDM wakeup bit is enabled by default, when USB wakeup is not required(/sys/.../wakeup is disabled), this bit should be disabled, otherwise we will have unexpected wakeup if do USB device connect/disconnect while system sleep.
This bit can be enabled for both host and device mode.
Message-ID: <[email protected]>
--- drivers/usb/chipidea/usbmisc_imx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/chipidea/usbmisc_imx.c +1 -1
@@ -135,7 +135,7 @@#define TXVREFTUNE0_MASK (0xf << 20)#define MX6_USB_OTG_WAKEUP_BITS (MX6_BM_WAKEUP_ENABLE | MX6_BM_VBUS_WAKEUP | \ - MX6_BM_ID_WAKEUP) + MX6_BM_ID_WAKEUP | MX6SX_BM_DPDM_WAKEUP_EN)struct usbmisc_ops {/* It's called once when probe a usb device */
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 26/139 gfs2: Fix possible data races in gfs2_show_options()
In reply to Greg Kroah-HartmanFrom: Tuo Li <[email protected]>
[ Upstream commit 6fa0a72cbbe45db4ed967a51f9e6f4e3afe61d20 ]
Some fields such as gt_logd_secs of the struct gfs2_tune are accessed without holding the lock gt_spin in gfs2_show_options():
val = sdp->sd_tune.gt_logd_secs;
if (val != 30)
seq_printf(s, ",commit=%d", val);And thus can cause data races when gfs2_show_options() and other functions such as gfs2_reconfigure() are concurrently executed:
spin_lock(>->gt_spin); gt->gt_logd_secs = newargs->ar_commit;
To fix these possible data races, the lock sdp->sd_tune.gt_spin is acquired before accessing the fields of gfs2_tune and released after these accesses.
Further changes by Andreas:
- Don't hold the spin lock over the seq_printf operations.
--- fs/gfs2/super.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-)
fs/gfs2/super.c +15 -11
@@ -980,7 +980,14 @@ static int gfs2_show_options(struct seq_file *s, struct dentry *root) {struct gfs2_sbd *sdp = root->d_sb->s_fs_info;struct gfs2_args *args = &sdp->sd_args; -int val; +unsigned int logd_secs, statfs_slow, statfs_quantum, quota_quantum; + +spin_lock (&sdp->sd_tune.gt_spin); + logd_secs = sdp->sd_tune.gt_logd_secs; + quota_quantum = sdp->sd_tune.gt_quota_quantum; + statfs_quantum = sdp->sd_tune.gt_statfs_quantum; + statfs_slow = sdp->sd_tune.gt_statfs_slow; +spin_unlock (&sdp->sd_tune.gt_spin);if (is_ancestor (root, sdp->sd_master_dir))seq_puts (s,",meta" );
@@ -1035,17 +1042,14 @@ static int gfs2_show_options(struct seq_file *s, struct dentry *root) }if (args->ar_discard)seq_puts (s,",discard" ); - val = sdp->sd_tune.gt_logd_secs; -if (val !=30 ) -seq_printf (s,",commit=%d" , val); - val = sdp->sd_tune.gt_statfs_quantum; -if (val !=30 ) -seq_printf (s,",statfs_quantum=%d" , val); -else if (sdp->sd_tune.gt_statfs_slow) +if (logd_secs !=30 ) +seq_printf (s,",commit=%d" , logd_secs); +if (statfs_quantum !=30 ) +seq_printf (s,",statfs_quantum=%d" , statfs_quantum); +else if (statfs_slow)seq_puts (s,",statfs_quantum=0" ); - val = sdp->sd_tune.gt_quota_quantum; -if (val !=60 ) -seq_printf (s,",quota_quantum=%d" , val); +if (quota_quantum !=60 ) +seq_printf (s,",quota_quantum=%d" , quota_quantum);if (args->ar_statfs_percent)seq_printf (s,",statfs_percent=%d" , args->ar_statfs_percent);if (args->ar_errors !=GFS2_ERRORS_DEFAULT ) {
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 27/139 pcmcia: rsrc_nonstatic: Fix memory leak in nonstatic_release_resource_db()
In reply to Greg Kroah-HartmanFrom: Armin Wolf <[email protected]>
[ Upstream commit c85fd9422fe0f5d667305efb27f56d09eab120b0 ]
When nonstatic_release_resource_db() frees all resources associated with an PCMCIA socket, it forgets to free socket_data too, causing a memory leak observable with kmemleak:
unreferenced object 0xc28d1000 (size 64):
comm "systemd-udevd", pid 297, jiffies 4294898478 (age 194.484s) hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 f0 85 0e c3 00 00 00 00 ................
00 00 00 00 0c 10 8d c2 00 00 00 00 00 00 00 00 ................
backtrace:
[<ffda4245>] __kmem_cache_alloc_node+0x2d7/0x4a0
[<7e51f0c8>] kmalloc_trace+0x31/0xa4
[<d52b4ca0>] nonstatic_init+0x24/0x1a4 [pcmcia_rsrc]
[<a2f13e08>] pcmcia_register_socket+0x200/0x35c [pcmcia_core]
[<a728be1b>] yenta_probe+0x4d8/0xa70 [yenta_socket]
[<c48fac39>] pci_device_probe+0x99/0x194
[<84b7c690>] really_probe+0x181/0x45c
[<8060fe6e>] __driver_probe_device+0x75/0x1f4
[<b9b76f43>] driver_probe_device+0x28/0xac
[<648b766f>] __driver_attach+0xeb/0x1e4
[<6e9659eb>] bus_for_each_dev+0x61/0xb4
[<25a669f3>] driver_attach+0x1e/0x28
[<d8671d6b>] bus_add_driver+0x102/0x20c
[<df0d323c>] driver_register+0x5b/0x120
[<942cd8a4>] __pci_register_driver+0x44/0x4c
[<e536027e>] __UNIQUE_ID___addressable_cleanup_module188+0x1c/0xfffff000 [iTCO_vendor_support]Fix this by freeing socket_data too.
Tested on a Acer Travelmate 4002WLMi by manually binding/unbinding the yenta_cardbus driver (yenta_socket).
Message-ID: <[email protected]>
--- drivers/pcmcia/rsrc_nonstatic.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pcmcia/rsrc_nonstatic.c +2 -0
@@ -1053,6 +1053,8 @@ static void nonstatic_release_resource_db(struct pcmcia_socket *s) q = p->next;kfree (p); } + +kfree (data); }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 28/139 firewire: net: fix use after free in fwnet_finish_incoming_packet()
In reply to Greg Kroah-HartmanFrom: Zhang Shurong <[email protected]>
[ Upstream commit 3ff256751a2853e1ffaa36958ff933ccc98c6cb5 ]
The netif_rx() function frees the skb so we can't dereference it to save the skb->len.
--- drivers/firewire/net.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/firewire/net.c +4 -2
@@ -488,7 +488,7 @@ static int fwnet_finish_incoming_packet(struct net_device *net, struct sk_buff *skb, u16 source_node_id, bool is_broadcast, u16 ether_type) { - int status; + int status, len;switch (ether_type) {case ETH_P_ARP :
@@ -542,13 +542,15 @@ static int fwnet_finish_incoming_packet(struct net_device *net, } skb->protocol = protocol; } + + len = skb->len; status =netif_rx (skb);if (status ==NET_RX_DROP ) { net->stats.rx_errors++; net->stats.rx_dropped++; }else { net->stats.rx_packets++; - net->stats.rx_bytes += skb->len; + net->stats.rx_bytes += len; }return 0 ;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 29/139 watchdog: sp5100_tco: support Hygon FCH/SCH (Server Controller Hub)
In reply to Greg Kroah-HartmanFrom: Yuechao Zhao <[email protected]>
[ Upstream commit 009637de1f65cff452ad49554d1e8ef9fda99e43 ]
Add PCI_VENDOR_ID_HYGON(Hygon vendor id [0x1d94]) in this driver
--- drivers/watchdog/sp5100_tco.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/watchdog/sp5100_tco.c +3 -1
@@ -89,7 +89,7 @@ static enum tco_reg_layout tco_reg_layout(struct pci_dev *dev) sp5100_tco_pci->device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS && sp5100_tco_pci->revision >= AMD_ZEN_SMBUS_PCI_REV) {return efch_mmio; - } else if (dev->vendor == PCI_VENDOR_ID_AMD && + } else if ((dev->vendor == PCI_VENDOR_ID_AMD || dev->vendor == PCI_VENDOR_ID_HYGON) && ((dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS && dev->revision >= 0x41) || (dev->device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS &&
@@ -561,6 +561,8 @@ static const struct pci_device_id sp5100_tco_pci_tbl[] = { PCI_ANY_ID, }, {PCI_VENDOR_ID_AMD ,PCI_DEVICE_ID_AMD_KERNCZ_SMBUS ,PCI_ANY_ID , PCI_ANY_ID, }, + { PCI_VENDOR_ID_HYGON, PCI_DEVICE_ID_AMD_KERNCZ_SMBUS, PCI_ANY_ID, + PCI_ANY_ID, }, { 0, }, /* End of list */ };MODULE_DEVICE_TABLE (pci, sp5100_tco_pci_tbl);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 30/139 Bluetooth: L2CAP: Fix use-after-free
In reply to Greg Kroah-HartmanFrom: Zhengping Jiang <[email protected]>
[ Upstream commit f752a0b334bb95fe9b42ecb511e0864e2768046f ]
Fix potential use-after-free in l2cap_le_command_rej.
--- net/bluetooth/l2cap_core.c | 5 +++++ 1 file changed, 5 insertions(+)
net/bluetooth/l2cap_core.c +5 -0
@@ -6375,9 +6375,14 @@ static inline int l2cap_le_command_rej(struct l2cap_conn *conn,if (!chan) goto done; + chan =l2cap_chan_hold_unless_zero (chan); +if (!chan) + goto done; +l2cap_chan_lock (chan);l2cap_chan_del (chan,ECONNREFUSED );l2cap_chan_unlock (chan); +l2cap_chan_put (chan); done:mutex_unlock (&conn->chan_lock);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 31/139 Bluetooth: btusb: Add MT7922 bluetooth ID for the Asus Ally
In reply to Greg Kroah-HartmanFrom: Matthew Anderson <[email protected]>
[ Upstream commit fa01eba11f0e57c767a5eab5291c7a01407a00be ]
Adding the device ID from the Asus Ally gets the bluetooth working on the device.
--- drivers/bluetooth/btusb.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/bluetooth/btusb.c +3 -0
@@ -475,6 +475,9 @@ static const struct usb_device_id blacklist_table[] = { { USB_DEVICE(0x0489, 0xe0d9), .driver_info = BTUSB_MEDIATEK |BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES }, + { USB_DEVICE(0x0489, 0xe0f5), .driver_info = BTUSB_MEDIATEK | +BTUSB_WIDEBAND_SPEECH | + BTUSB_VALID_LE_STATES }, { USB_DEVICE(0x13d3, 0x3568), .driver_info = BTUSB_MEDIATEK |BTUSB_WIDEBAND_SPEECH | BTUSB_VALID_LE_STATES },
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 32/139 drm/amdgpu: Fix potential fence use-after-free v2
In reply to Greg Kroah-HartmanFrom: shanzhulig <[email protected]>
[ Upstream commit 2e54154b9f27262efd0cb4f903cc7d5ad1fe9628 ]
fence Decrements the reference count before exiting. Avoid Race Vulnerabilities for fence use-after-free.
v2 (chk): actually fix the use after free and not just move it.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +3 -3
@@ -1541,15 +1541,15 @@ static int amdgpu_cs_wait_all_fences(struct amdgpu_device *adev,continue ; r =dma_fence_wait_timeout (fence, true, timeout); +if (r >0 && fence->error) + r = fence->error; +dma_fence_put (fence);if (r <0 )return r;if (r ==0 )break ; - -if (fence->error) -return fence->error; }memset (wait,0 ,sizeof (*wait));
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 33/139 fs/ntfs3: Enhance sanity check while generating attr_list
In reply to Greg Kroah-HartmanFrom: Edward Lo <[email protected]>
[ Upstream commit fdec309c7672cbee4dc0229ee4cbb33c948a1bdd ]
ni_create_attr_list uses WARN_ON to catch error cases while generating attribute list, which only prints out stack trace and may not be enough. This repalces them with more proper error handling flow.
[ 59.666332] BUG: kernel NULL pointer dereference, address: 000000000000000e [ 59.673268] #PF: supervisor read access in kernel mode [ 59.678354] #PF: error_code(0x0000) - not-present page [ 59.682831] PGD 8000000005ff1067 P4D 8000000005ff1067 PUD 7dee067 PMD 0 [ 59.688556] Oops: 0000 [#1] PREEMPT SMP KASAN PTI [ 59.692642] CPU: 0 PID: 198 Comm: poc Tainted: G B W 6.2.0-rc1+ #4 [ 59.698868] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014 [ 59.708795] RIP: 0010:ni_create_attr_list+0x505/0x860 [ 59.713657] Code: 7e 10 e8 5e d0 d0 ff 45 0f b7 76 10 48 8d 7b 16 e8 00 d1 d0 ff 66 44 89 73 16 4d 8d 75 0e 4c 89 f7 e8 3f d0 d0 ff 4c 8d8 [ 59.731559] RSP: 0018:ffff88800a56f1e0 EFLAGS: 00010282 [ 59.735691] RAX: 0000000000000001 RBX: ffff88800b7b5088 RCX: ffffffffb83079fe [ 59.741792] RDX: 0000000000000001 RSI: 0000000000000008 RDI: ffffffffbb7f9fc0 [ 59.748423] RBP: ffff88800a56f3a8 R08: ffff88800b7b50a0 R09: fffffbfff76ff3f9 [ 59.754654] R10: ffffffffbb7f9fc7 R11: fffffbfff76ff3f8 R12: ffff88800b756180 [ 59.761552] R13: 0000000000000000 R14: 000000000000000e R15: 0000000000000050 [ 59.768323] FS: 00007feaa8c96440(0000) GS:ffff88806d400000(0000) knlGS:0000000000000000 [ 59.776027] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 59.781395] CR2: 00007f3a2e0b1000 CR3: 000000000a5bc000 CR4: 00000000000006f0 [ 59.787607] Call Trace: [ 59.790271] <TASK> [ 59.792488] ? __pfx_ni_create_attr_list+0x10/0x10 [ 59.797235] ? kernel_text_address+0xd3/0xe0 [ 59.800856] ? unwind_get_return_address+0x3e/0x60 [ 59.805101] ? __kasan_check_write+0x18/0x20 [ 59.809296] ? preempt_count_sub+0x1c/0xd0 [ 59.813421] ni_ins_attr_ext+0x52c/0x5c0 [ 59.817034] ? __pfx_ni_ins_attr_ext+0x10/0x10 [ 59.821926] ? __vfs_setxattr+0x121/0x170 [ 59.825718] ? __vfs_setxattr_noperm+0x97/0x300 [ 59.829562] ? __vfs_setxattr_locked+0x145/0x170 [ 59.833987] ? vfs_setxattr+0x137/0x2a0 [ 59.836732] ? do_setxattr+0xce/0x150 [ 59.839807] ? setxattr+0x126/0x140 [ 59.842353] ? path_setxattr+0x164/0x180 [ 59.845275] ? __x64_sys_setxattr+0x71/0x90 [ 59.848838] ? do_syscall_64+0x3f/0x90 [ 59.851898] ? entry_SYSCALL_64_after_hwframe+0x72/0xdc [ 59.857046] ? stack_depot_save+0x17/0x20 [ 59.860299] ni_insert_attr+0x1ba/0x420 [ 59.863104] ? __pfx_ni_insert_attr+0x10/0x10 [ 59.867069] ? preempt_count_sub+0x1c/0xd0 [ 59.869897] ? _raw_spin_unlock_irqrestore+0x2b/0x50 [ 59.874088] ? __create_object+0x3ae/0x5d0 [ 59.877865] ni_insert_resident+0xc4/0x1c0 [ 59.881430] ? __pfx_ni_insert_resident+0x10/0x10 [ 59.886355] ? kasan_save_alloc_info+0x1f/0x30 [ 59.891117] ? __kasan_kmalloc+0x8b/0xa0 [ 59.894383] ntfs_set_ea+0x90d/0xbf0 [ 59.897703] ? __pfx_ntfs_set_ea+0x10/0x10 [ 59.901011] ? kernel_text_address+0xd3/0xe0 [ 59.905308] ? __kernel_text_address+0x16/0x50 [ 59.909811] ? unwind_get_return_address+0x3e/0x60 [ 59.914898] ? __pfx_stack_trace_consume_entry+0x10/0x10 [ 59.920250] ? arch_stack_walk+0xa2/0x100 [ 59.924560] ? filter_irq_stacks+0x27/0x80 [ 59.928722] ntfs_setxattr+0x405/0x440 [ 59.932512] ? __pfx_ntfs_setxattr+0x10/0x10 [ 59.936634] ? kvmalloc_node+0x2d/0x120 [ 59.940378] ? kasan_save_stack+0x41/0x60 [ 59.943870] ? kasan_save_stack+0x2a/0x60 [ 59.947719] ? kasan_set_track+0x29/0x40 [ 59.951417] ? kasan_save_alloc_info+0x1f/0x30 [ 59.955733] ? __kasan_kmalloc+0x8b/0xa0 [ 59.959598] ? __kmalloc_node+0x68/0x150 [ 59.963163] ? kvmalloc_node+0x2d/0x120 [ 59.966490] ? vmemdup_user+0x2b/0xa0 [ 59.969060] __vfs_setxattr+0x121/0x170 [ 59.972456] ? __pfx___vfs_setxattr+0x10/0x10 [ 59.976008] __vfs_setxattr_noperm+0x97/0x300 [ 59.981562] __vfs_setxattr_locked+0x145/0x170 [ 59.986100] vfs_setxattr+0x137/0x2a0 [ 59.989964] ? __pfx_vfs_setxattr+0x10/0x10 [ 59.993616] ? __kasan_check_write+0x18/0x20 [ 59.997425] do_setxattr+0xce/0x150 [ 60.000304] setxattr+0x126/0x140 [ 60.002967] ? __pfx_setxattr+0x10/0x10 [ 60.006471] ? __virt_addr_valid+0xcb/0x140 [ 60.010461] ? __call_rcu_common.constprop.0+0x1c7/0x330 [ 60.016037] ? debug_smp_processor_id+0x1b/0x30 [ 60.021008] ? kasan_quarantine_put+0x5b/0x190 [ 60.025545] ? putname+0x84/0xa0 [ 60.027910] ? __kasan_slab_free+0x11e/0x1b0 [ 60.031483] ? putname+0x84/0xa0 [ 60.033986] ? preempt_count_sub+0x1c/0xd0 [ 60.036876] ? __mnt_want_write+0xae/0x100 [ 60.040738] ? mnt_want_write+0x8f/0x150 [ 60.044317] path_setxattr+0x164/0x180 [ 60.048096] ? __pfx_path_setxattr+0x10/0x10 [ 60.052096] ? strncpy_from_user+0x175/0x1c0 [ 60.056482] ? debug_smp_processor_id+0x1b/0x30 [ 60.059848] ? fpregs_assert_state_consistent+0x6b/0x80 [ 60.064557] __x64_sys_setxattr+0x71/0x90 [ 60.068892] do_syscall_64+0x3f/0x90 [ 60.072868] entry_SYSCALL_64_after_hwframe+0x72/0xdc [ 60.077523] RIP: 0033:0x7feaa86e4469 [ 60.080915] Code: 00 f3 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 088 [ 60.097353] RSP: 002b:00007ffdbd8311e8 EFLAGS: 00000286 ORIG_RAX: 00000000000000bc [ 60.103386] RAX: ffffffffffffffda RBX: 9461c5e290baac00 RCX: 00007feaa86e4469 [ 60.110322] RDX: 00007ffdbd831fe0 RSI: 00007ffdbd831305 RDI: 00007ffdbd831263 [ 60.116808] RBP: 00007ffdbd836180 R08: 0000000000000001 R09: 00007ffdbd836268 [ 60.123879] R10: 000000000000007d R11: 0000000000000286 R12: 0000000000400500 [ 60.130540] R13: 00007ffdbd836260 R14: 0000000000000000 R15: 0000000000000000 [ 60.136553] </TASK> [ 60.138818] Modules linked in: [ 60.141839] CR2: 000000000000000e [ 60.144831] ---[ end trace 0000000000000000 ]--- [ 60.149058] RIP: 0010:ni_create_attr_list+0x505/0x860 [ 60.153975] Code: 7e 10 e8 5e d0 d0 ff 45 0f b7 76 10 48 8d 7b 16 e8 00 d1 d0 ff 66 44 89 73 16 4d 8d 75 0e 4c 89 f7 e8 3f d0 d0 ff 4c 8d8 [ 60.172443] RSP: 0018:ffff88800a56f1e0 EFLAGS: 00010282 [ 60.176246] RAX: 0000000000000001 RBX: ffff88800b7b5088 RCX: ffffffffb83079fe [ 60.182752] RDX: 0000000000000001 RSI: 0000000000000008 RDI: ffffffffbb7f9fc0 [ 60.189949] RBP: ffff88800a56f3a8 R08: ffff88800b7b50a0 R09: fffffbfff76ff3f9 [ 60.196950] R10: ffffffffbb7f9fc7 R11: fffffbfff76ff3f8 R12: ffff88800b756180 [ 60.203671] R13: 0000000000000000 R14: 000000000000000e R15: 0000000000000050 [ 60.209595] FS: 00007feaa8c96440(0000) GS:ffff88806d400000(0000) knlGS:0000000000000000 [ 60.216299] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 60.222276] CR2: 00007f3a2e0b1000 CR3: 000000000a5bc000 CR4: 00000000000006f0
--- fs/ntfs3/frecord.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
fs/ntfs3/frecord.c +11 -5
@@ -849,6 +849,7 @@ int ni_create_attr_list(struct ntfs_inode *ni)if (err) goto out1; + err = -EINVAL ;/* Call mi_remove_attr() in reverse order to keep pointers 'arr_move' valid. */ while (to_free >0 ) {struct ATTRIB *b = arr_move[--nb];
@@ -857,7 +858,8 @@ int ni_create_attr_list(struct ntfs_inode *ni) attr =mi_insert_attr (mi, b->type,Add2Ptr (b, name_off), b->name_len, asize, name_off); -WARN_ON (!attr); +if (!attr) + goto out1;mi_get_ref (mi, &le_b[nb]->ref); le_b[nb]->id = attr->id;
@@ -867,17 +869,20 @@ int ni_create_attr_list(struct ntfs_inode *ni) attr->id = le_b[nb]->id;/* Remove from primary record. */ -WARN_ON (!mi_remove_attr (NULL , &ni->mi, b)); +if (!mi_remove_attr (NULL , &ni->mi, b)) + goto out1;if (to_free <= asize)break ; to_free -= asize; -WARN_ON (!nb); +if (!nb) + goto out1; } attr =mi_insert_attr (&ni->mi,ATTR_LIST ,NULL ,0 , lsize +SIZEOF_RESIDENT ,SIZEOF_RESIDENT ); -WARN_ON (!attr); +if (!attr) + goto out1; attr->non_res =0 ; attr->flags =0 ;
@@ -897,9 +902,10 @@ int ni_create_attr_list(struct ntfs_inode *ni)kfree (ni->attr_list.le); ni->attr_list.le =NULL ; ni->attr_list.size =0 ; +return err; out: -return err; +return 0 ; }/*
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 34/139 fs: ntfs3: Fix possible null-pointer dereferences in mi_read()
In reply to Greg Kroah-HartmanFrom: Jia-Ju Bai <[email protected]>
[ Upstream commit 97498cd610c0d030a7bd49a7efad974790661162 ]
In a previous commit 2681631c2973 ("fs/ntfs3: Add null pointer check to attr_load_runs_vcn"), ni can be NULL in attr_load_runs_vcn(), and thus it should be checked before being used.
However, in the call stack of this commit, mft_ni in mi_read() is aliased with ni in attr_load_runs_vcn(), and it is also used in mi_read() at two places:
mi_read()
rw_lock = &mft_ni->file.run_lock -> No check attr_load_runs_vcn(mft_ni, ...)
ni (namely mft_ni) is checked in the previous commit
attr_load_runs_vcn(..., &mft_ni->file.run) -> No check
Thus, to avoid possible null-pointer dereferences, the related checks should be added.
These bugs are reported by a static analysis tool implemented by myself, and they are found by extending a known bug fixed in the previous commit. Thus, they could be theoretical bugs.
--- fs/ntfs3/record.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/ntfs3/record.c +2 -2
@@ -124,7 +124,7 @@ int mi_read(struct mft_inode *mi, bool is_mft)struct rw_semaphore *rw_lock =NULL ;if (is_mounted (sbi)) { -if (!is_mft) { +if (!is_mft && mft_ni) { rw_lock = &mft_ni->file.run_lock;down_read (rw_lock); }
@@ -148,7 +148,7 @@ int mi_read(struct mft_inode *mi, bool is_mft)ni_lock (mft_ni);down_write (rw_lock); } - err =attr_load_runs_vcn (mft_ni,ATTR_DATA ,NULL ,0 , &mft_ni->file.run, + err =attr_load_runs_vcn (mft_ni,ATTR_DATA ,NULL ,0 , run, vbo >> sbi->cluster_bits);if (rw_lock) {up_write (rw_lock);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 35/139 fs/ntfs3: Mark ntfs dirty when on-disk struct is corrupted
In reply to Greg Kroah-HartmanFrom: Konstantin Komarov <[email protected]>
[ Upstream commit e0f363a98830e8d7d70fbaf91c07ae0b7c57aafe ]
--- fs/ntfs3/fsntfs.c | 2 +- fs/ntfs3/index.c | 6 ++++++ fs/ntfs3/ntfs_fs.h | 2 ++ fs/ntfs3/record.c | 6 ++++++ 4 files changed, 15 insertions(+), 1 deletion(-)
fs/ntfs3/fsntfs.c +1 -1
@@ -154,7 +154,7 @@ int ntfs_fix_post_read(struct NTFS_RECORD_HEADER *rhdr, size_t bytes,/* Check errors. */ if ((fo &1 ) || fo + fn *sizeof (short ) >SECTOR_SIZE || !fn-- || fn *SECTOR_SIZE > bytes) { -return -EINVAL ;/* Native chkntfs returns ok! */ +return -E_NTFS_CORRUPT ; }/* Get fixup pointer. */
fs/ntfs3/index.c +6 -0
@@ -1112,6 +1112,12 @@ int indx_read(struct ntfs_index *indx, struct ntfs_inode *ni, CLST vbn, *node = in; out: +if (err == -E_NTFS_CORRUPT ) { +ntfs_inode_err (&ni->vfs_inode,"directory corrupted" ); +ntfs_set_state (ni->mi.sbi,NTFS_DIRTY_ERROR ); + err = -EINVAL ; + } +if (ib != in->index)kfree (ib);
fs/ntfs3/ntfs_fs.h +2 -0
@@ -54,6 +54,8 @@ enum utf16_endian;#define E_NTFS_NONRESIDENT 556/* NTFS specific error code about punch hole. */ #define E_NTFS_NOTALIGNED 557 +/* NTFS specific error code when on-disk struct is corrupted. */ +#define E_NTFS_CORRUPT 558/* sbi->flags */
fs/ntfs3/record.c +6 -0
@@ -180,6 +180,12 @@ int mi_read(struct mft_inode *mi, bool is_mft)return 0 ; out: +if (err == -E_NTFS_CORRUPT ) { +ntfs_err (sbi->sb,"mft corrupted" ); +ntfs_set_state (sbi,NTFS_DIRTY_ERROR ); + err = -EINVAL ; + } +return err; }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 36/139 ALSA: hda/realtek: Add quirks for Unis H3C Desktop B760 & Q760
In reply to Greg Kroah-HartmanFrom: dengxiang <[email protected]>
[ Upstream commit 73f1c75d5e6bd8ce2a887ef493a66ad1b16ed704 ]
These models use NSIWAY amplifiers for internal speaker, but cannot put sound outside from these amplifiers. So eapd verbs are needed to initialize the amplifiers. They can be added during boot to get working sound out of internal speaker.
--- sound/pci/hda/patch_realtek.c | 9 +++++++++ 1 file changed, 9 insertions(+)
sound/pci/hda/patch_realtek.c +9 -0
@@ -10809,6 +10809,7 @@ enum {ALC897_FIXUP_HP_HSMIC_VERB ,ALC897_FIXUP_LENOVO_HEADSET_MODE ,ALC897_FIXUP_HEADSET_MIC_PIN2 , + ALC897_FIXUP_UNIS_H3C_X500S, }; static const struct hda_fixup alc662_fixups[] = {
@@ -11248,6 +11249,13 @@ static const struct hda_fixup alc662_fixups[] = { .chained = true, .chain_id =ALC897_FIXUP_LENOVO_HEADSET_MODE }, + [ALC897_FIXUP_UNIS_H3C_X500S] = { + .type = HDA_FIXUP_VERBS, + .v.verbs = (const struct hda_verb []) { + {0x14 ,AC_VERB_SET_EAPD_BTLENABLE ,0 }, + {} + }, + }, };static const struct snd_pci_quirk alc662_fixup_tbl[] = {
@@ -11409,6 +11417,7 @@ static const struct hda_model_fixup alc662_fixup_models[] = { {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"}, {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"}, {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"}, + {.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"}, {} };
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 37/139 ALSA: hda: fix a possible null-pointer dereference due to data race in snd_hdac_regmap_sync()
In reply to Greg Kroah-HartmanFrom: Tuo Li <[email protected]>
[ Upstream commit 1f4a08fed450db87fbb5ff5105354158bdbe1a22 ]
The variable codec->regmap is often protected by the lock codec->regmap_lock when is accessed. However, it is accessed without holding the lock when is accessed in snd_hdac_regmap_sync():
if (codec->regmap)
In my opinion, this may be a harmful race, because if codec->regmap is set to NULL right after the condition is checked, a null-pointer dereference can occur in the called function regcache_sync():
map->lock(map->lock_arg); --> Line 360 in drivers/base/regmap/regcache.c
To fix this possible null-pointer dereference caused by data race, the mutex_lock coverage is extended to protect the if statement as well as the function call to regcache_sync().
[ Note: the lack of the regmap_lock itself is harmless for the current
codec driver implementations, as snd_hdac_regmap_sync() is only for PM runtime resume that is prohibited during the codec probe. But the change makes the whole code more consistent, so it's merged as is -- tiwai ]
--- sound/hda/hdac_regmap.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
sound/hda/hdac_regmap.c +3 -4
@@ -597,10 +597,9 @@ EXPORT_SYMBOL_GPL(snd_hdac_regmap_update_raw_once);*/ void snd_hdac_regmap_sync (struct hdac_device *codec) { -if (codec->regmap) { -mutex_lock (&codec->regmap_lock); +mutex_lock (&codec->regmap_lock); +if (codec->regmap)regcache_sync (codec->regmap); -mutex_unlock (&codec->regmap_lock); - } +mutex_unlock (&codec->regmap_lock); }EXPORT_SYMBOL_GPL (snd_hdac_regmap_sync);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 38/139 powerpc/kasan: Disable KCOV in KASAN code
In reply to Greg Kroah-HartmanFrom: Benjamin Gray <[email protected]>
[ Upstream commit ccb381e1af1ace292153c88eb1fffa5683d16a20 ]
As per the generic KASAN code in mm/kasan, disable KCOV with KCOV_INSTRUMENT := n in the makefile.
This fixes a ppc64 boot hang when KCOV and KASAN are enabled. kasan_early_init() gets called before a PACA is initialised, but the KCOV hook expects a valid PACA.
--- arch/powerpc/mm/kasan/Makefile | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/mm/kasan/Makefile +1 -0
@@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 KASAN_SANITIZE := n +KCOV_INSTRUMENT := n obj-$(CONFIG_PPC32) += kasan_init_32.o obj-$(CONFIG_PPC_8xx) += 8xx.o
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 39/139 ring-buffer: Do not swap cpu_buffer during resize process
In reply to Greg Kroah-HartmanFrom: Chen Lin <[email protected]>
[ Upstream commit 8a96c0288d0737ad77882024974c075345c72011 ]
When ring_buffer_swap_cpu was called during resize process, the cpu buffer was swapped in the middle, resulting in incorrect state. Continuing to run in the wrong state will result in oops.
This issue can be easily reproduced using the following two scripts:
/tmp # cat test1.sh
//#! /bin/sh
for i in seq 0 100000
do
echo 2000 > /sys/kernel/debug/tracing/buffer_size_kb sleep 0.5
echo 5000 > /sys/kernel/debug/tracing/buffer_size_kb sleep 0.5
done
/tmp # cat test2.sh
//#! /bin/sh
for i in seq 0 100000
do
echo irqsoff > /sys/kernel/debug/tracing/current_tracer sleep 1
echo nop > /sys/kernel/debug/tracing/current_tracer sleep 1
done
/tmp # ./test1.sh &
/tmp # ./test2.sh &
A typical oops log is as follows, sometimes with other different oops logs.
[ 231.711293] WARNING: CPU: 0 PID: 9 at kernel/trace/ring_buffer.c:2026 rb_update_pages+0x378/0x3f8 [ 231.713375] Modules linked in: [ 231.714735] CPU: 0 PID: 9 Comm: kworker/0:1 Tainted: G W 6.5.0-rc1-00276-g20edcec23f92 #15 [ 231.716750] Hardware name: linux,dummy-virt (DT) [ 231.718152] Workqueue: events update_pages_handler [ 231.719714] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 231.721171] pc : rb_update_pages+0x378/0x3f8 [ 231.722212] lr : rb_update_pages+0x25c/0x3f8 [ 231.723248] sp : ffff800082b9bd50 [ 231.724169] x29: ffff800082b9bd50 x28: ffff8000825f7000 x27: 0000000000000000 [ 231.726102] x26: 0000000000000001 x25: fffffffffffff010 x24: 0000000000000ff0 [ 231.728122] x23: ffff0000c3a0b600 x22: ffff0000c3a0b5c0 x21: fffffffffffffe0a [ 231.730203] x20: ffff0000c3a0b600 x19: ffff0000c0102400 x18: 0000000000000000 [ 231.732329] x17: 0000000000000000 x16: 0000000000000000 x15: 0000ffffe7aa8510 [ 231.734212] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000002 [ 231.736291] x11: ffff8000826998a8 x10: ffff800082b9baf0 x9 : ffff800081137558 [ 231.738195] x8 : fffffc00030e82c8 x7 : 0000000000000000 x6 : 0000000000000001 [ 231.740192] x5 : ffff0000ffbafe00 x4 : 0000000000000000 x3 : 0000000000000000 [ 231.742118] x2 : 00000000000006aa x1 : 0000000000000001 x0 : ffff0000c0007208 [ 231.744196] Call trace: [ 231.744892] rb_update_pages+0x378/0x3f8 [ 231.745893] update_pages_handler+0x1c/0x38 [ 231.746893] process_one_work+0x1f0/0x468 [ 231.747852] worker_thread+0x54/0x410 [ 231.748737] kthread+0x124/0x138 [ 231.749549] ret_from_fork+0x10/0x20 [ 231.750434] ---[ end trace 0000000000000000 ]--- [ 233.720486] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 [ 233.721696] Mem abort info: [ 233.721935] ESR = 0x0000000096000004 [ 233.722283] EC = 0x25: DABT (current EL), IL = 32 bits [ 233.722596] SET = 0, FnV = 0 [ 233.722805] EA = 0, S1PTW = 0 [ 233.723026] FSC = 0x04: level 0 translation fault [ 233.723458] Data abort info: [ 233.723734] ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000 [ 233.724176] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 233.724589] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 233.725075] user pgtable: 4k pages, 48-bit VAs, pgdp=0000000104943000 [ 233.725592] [0000000000000000] pgd=0000000000000000, p4d=0000000000000000 [ 233.726231] Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP [ 233.726720] Modules linked in: [ 233.727007] CPU: 0 PID: 9 Comm: kworker/0:1 Tainted: G W 6.5.0-rc1-00276-g20edcec23f92 #15 [ 233.727777] Hardware name: linux,dummy-virt (DT) [ 233.728225] Workqueue: events update_pages_handler [ 233.728655] pstate: 200000c5 (nzCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 233.729054] pc : rb_update_pages+0x1a8/0x3f8 [ 233.729334] lr : rb_update_pages+0x154/0x3f8 [ 233.729592] sp : ffff800082b9bd50 [ 233.729792] x29: ffff800082b9bd50 x28: ffff8000825f7000 x27: 0000000000000000 [ 233.730220] x26: 0000000000000000 x25: ffff800082a8b840 x24: ffff0000c0102418 [ 233.730653] x23: 0000000000000000 x22: fffffc000304c880 x21: 0000000000000003 [ 233.731105] x20: 00000000000001f4 x19: ffff0000c0102400 x18: ffff800082fcbc58 [ 233.731727] x17: 0000000000000000 x16: 0000000000000001 x15: 0000000000000001 [ 233.732282] x14: ffff8000825fe0c8 x13: 0000000000000001 x12: 0000000000000000 [ 233.732709] x11: ffff8000826998a8 x10: 0000000000000ae0 x9 : ffff8000801b760c [ 233.733148] x8 : fefefefefefefeff x7 : 0000000000000018 x6 : ffff0000c03298c0 [ 233.733553] x5 : 0000000000000002 x4 : 0000000000000000 x3 : 0000000000000000 [ 233.733972] x2 : ffff0000c3a0b600 x1 : 0000000000000000 x0 : 0000000000000000 [ 233.734418] Call trace: [ 233.734593] rb_update_pages+0x1a8/0x3f8 [ 233.734853] update_pages_handler+0x1c/0x38 [ 233.735148] process_one_work+0x1f0/0x468 [ 233.735525] worker_thread+0x54/0x410 [ 233.735852] kthread+0x124/0x138 [ 233.736064] ret_from_fork+0x10/0x20 [ 233.736387] Code: 92400000 910006b5 aa000021 aa0303f7 (f9400060) [ 233.736959] ---[ end trace 0000000000000000 ]---
After analysis, the seq of the error is as follows [1-5]:
int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
int cpu_id)
{
for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu];
//1. get cpu_buffer, aka cpu_buffer(A)
...
...
schedule_work_on(cpu,
&cpu_buffer->update_pages_work);
//2. 'update_pages_work' is queue on 'cpu', cpu_buffer(A) is passed to
// update_pages_handler, do the update process, set 'update_done' in
// complete(&cpu_buffer->update_done) and to wakeup resize process.
//---->
//3. Just at this moment, ring_buffer_swap_cpu is triggered,
//cpu_buffer(A) be swaped to cpu_buffer(B), the max_buffer.
//ring_buffer_swap_cpu is called as the 'Call trace' below.
Call trace:
dump_backtrace+0x0/0x2f8
show_stack+0x18/0x28
dump_stack+0x12c/0x188
ring_buffer_swap_cpu+0x2f8/0x328
update_max_tr_single+0x180/0x210
check_critical_timing+0x2b4/0x2c8
tracer_hardirqs_on+0x1c0/0x200
trace_hardirqs_on+0xec/0x378
el0_svc_common+0x64/0x260
do_el0_svc+0x90/0xf8
el0_svc+0x20/0x30
el0_sync_handler+0xb0/0xb8
el0_sync+0x180/0x1c0
//<----
/* wait for all the updates to complete */
for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu];
//4. get cpu_buffer, cpu_buffer(B) is used in the following process,
//the state of cpu_buffer(A) and cpu_buffer(B) is totally wrong.
//for example, cpu_buffer(A)->update_done will leave be set 1, and will
//not 'wait_for_completion' at the next resize round.
if (!cpu_buffer->nr_pages_to_update)
continue;
if (cpu_online(cpu))
wait_for_completion(&cpu_buffer->update_done);
cpu_buffer->nr_pages_to_update = 0;
}
...
}
//5. the state of cpu_buffer(A) and cpu_buffer(B) is totally wrong,
//Continuing to run in the wrong state, then oops occurs.--- kernel/trace/ring_buffer.c | 14 +++++++++++++- kernel/trace/trace.c | 3 ++- 2 files changed, 15 insertions(+), 2 deletions(-)
kernel/trace/ring_buffer.c +13 -1
@@ -535,6 +535,7 @@ struct trace_buffer {unsigned flags;int cpus;atomic_t record_disabled; +atomic_t resizing;cpumask_var_t cpumask;struct lock_class_key *reader_lock_key;
@@ -2137,7 +2138,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,/* prevent another thread from changing buffer sizes */ mutex_lock (&buffer->mutex); - +atomic_inc (&buffer->resizing);if (cpu_id ==RING_BUFFER_ALL_CPUS ) {/*
@@ -2276,6 +2277,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,atomic_dec (&buffer->record_disabled); } +atomic_dec (&buffer->resizing);mutex_unlock (&buffer->mutex);return 0 ;
@@ -2296,6 +2298,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, } } out_err_unlock: +atomic_dec (&buffer->resizing);mutex_unlock (&buffer->mutex);return err; }
@@ -5497,6 +5500,15 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_a,if (local_read (&cpu_buffer_b->committing)) goto out_dec; +/* +* When resize is in progress, we cannot swap it because +* it will mess the state of the cpu buffer. +*/ +if (atomic_read (&buffer_a->resizing)) + goto out_dec; +if (atomic_read (&buffer_b->resizing)) + goto out_dec; + buffer_a->buffers[cpu] = cpu_buffer_b; buffer_b->buffers[cpu] = cpu_buffer_a;
kernel/trace/trace.c +2 -1
@@ -1872,9 +1872,10 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu)* place on this CPU. We fail to record, but we reset * the max trace buffer (no one writes directly to it) * and flag that it failed. +* Another reason is resize is in progress. */ trace_array_printk_buf (tr->max_buffer.buffer, _THIS_IP_, -"Failed to swap buffers due to commit in progress\n" ); +"Failed to swap buffers due to commit or resize in progress\n" ); }WARN_ON_ONCE (ret && ret != -EAGAIN && ret != -EBUSY );
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 40/139 iio: add addac subdirectory
In reply to Greg Kroah-HartmanFrom: Cosmin Tanislav <[email protected]>
[ Upstream commit b62e2e1763cda3a6c494ed754317f19be1249297 ]
For IIO devices that expose both ADC and DAC functionality.
Stable-dep-of: 4f9b80aefb9e ("iio: addac: stx104: Fix race condition when converting analog-to-digital")
--- drivers/iio/Kconfig | 1 + drivers/iio/Makefile | 1 + drivers/iio/addac/Kconfig | 8 ++++++++ drivers/iio/addac/Makefile | 6 ++++++ 4 files changed, 16 insertions(+) create mode 100644 drivers/iio/addac/Kconfig create mode 100644 drivers/iio/addac/Makefile
drivers/iio/Kconfig +1 -0
@@ -70,6 +70,7 @@ config IIO_TRIGGERED_EVENT source "drivers/iio/accel/Kconfig" source "drivers/iio/adc/Kconfig" +source "drivers/iio/addac/Kconfig" source "drivers/iio/afe/Kconfig" source "drivers/iio/amplifiers/Kconfig" source "drivers/iio/cdc/Kconfig"
drivers/iio/Makefile +1 -0
@@ -15,6 +15,7 @@ obj-$(CONFIG_IIO_TRIGGERED_EVENT) += industrialio-triggered-event.o obj-y += accel/ obj-y += adc/ +obj-y += addac/ obj-y += afe/ obj-y += amplifiers/ obj-y += buffer/
drivers/iio/addac/Kconfig new file +8 -0
@@ -0,0 +1,8 @@ +# +# ADC DAC drivers +# +# When adding new entries keep the list in alphabetical order + +menu "Analog to digital and digital to analog converters" + +endmenu
drivers/iio/addac/Makefile new file +6 -0
@@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for industrial I/O ADDAC drivers +# + +# When adding new entries keep the list in alphabetical order
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 41/139 iio: adc: stx104: Utilize iomap interface
In reply to Greg Kroah-HartmanFrom: William Breathitt Gray <[email protected]>
[ Upstream commit 73b8390cc27e096ab157be261ccc4eaaa6db87af ]
This driver doesn't need to access I/O ports directly via inb()/outb() and friends. This patch abstracts such access by calling ioport_map() to enable the use of more typical ioread8()/iowrite8() I/O memory accessor calls.
Stable-dep-of: 4f9b80aefb9e ("iio: addac: stx104: Fix race condition when converting analog-to-digital")
--- drivers/iio/adc/stx104.c | 56 +++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 27 deletions(-)
drivers/iio/adc/stx104.c +29 -27
@@ -51,7 +51,7 @@ MODULE_PARM_DESC(base, "Apex Embedded Systems STX104 base addresses");*/ struct stx104_iio {unsigned int chan_out_states[STX104_NUM_OUT_CHAN ]; -unsigned int base; +void __iomem *base; };/**
@@ -64,7 +64,7 @@ struct stx104_iio {struct stx104_gpio {struct gpio_chip chip;spinlock_t lock; -unsigned int base; +void __iomem *base;unsigned int out_state; };
@@ -79,7 +79,7 @@ static int stx104_read_raw(struct iio_dev *indio_dev,switch (mask) {case IIO_CHAN_INFO_HARDWAREGAIN :/* get gain configuration */ - adc_config =inb (priv->base +11 ); + adc_config =ioread8 (priv->base +11 ); gain = adc_config &0x3 ; *val =1 << gain;
@@ -91,24 +91,24 @@ static int stx104_read_raw(struct iio_dev *indio_dev, }/* select ADC channel */ -outb (chan->channel | (chan->channel <<4 ), priv->base +2 ); +iowrite8 (chan->channel | (chan->channel <<4 ), priv->base +2 );/* trigger ADC sample capture and wait for completion */ -outb (0 , priv->base); -while (inb (priv->base +8 ) &BIT (7 )); +iowrite8 (0 , priv->base); +while (ioread8 (priv->base +8 ) &BIT (7 )); - *val =inw (priv->base); + *val =ioread16 (priv->base);return IIO_VAL_INT ;case IIO_CHAN_INFO_OFFSET :/* get ADC bipolar/unipolar configuration */ - adc_config =inb (priv->base +11 ); + adc_config =ioread8 (priv->base +11 ); adbu = !(adc_config &BIT (2 )); *val =-32768 * adbu;return IIO_VAL_INT ;case IIO_CHAN_INFO_SCALE :/* get ADC bipolar/unipolar and gain configuration */ - adc_config =inb (priv->base +11 ); + adc_config =ioread8 (priv->base +11 ); adbu = !(adc_config &BIT (2 )); gain = adc_config &0x3 ;
@@ -130,16 +130,16 @@ static int stx104_write_raw(struct iio_dev *indio_dev,/* Only four gain states (x1, x2, x4, x8) */ switch (val) {case 1 : -outb (0 , priv->base +11 ); +iowrite8 (0 , priv->base +11 );break ;case 2 : -outb (1 , priv->base +11 ); +iowrite8 (1 , priv->base +11 );break ;case 4 : -outb (2 , priv->base +11 ); +iowrite8 (2 , priv->base +11 );break ;case 8 : -outb (3 , priv->base +11 ); +iowrite8 (3 , priv->base +11 );break ;default :return -EINVAL ;
@@ -153,7 +153,7 @@ static int stx104_write_raw(struct iio_dev *indio_dev,return -EINVAL ; priv->chan_out_states[chan->channel] = val; -outw (val, priv->base +4 +2 * chan->channel); +iowrite16 (val, priv->base +4 +2 * chan->channel);return 0 ; }
@@ -222,7 +222,7 @@ static int stx104_gpio_get(struct gpio_chip *chip, unsigned int offset)if (offset >=4 )return -EINVAL ; -return !!(inb (stx104gpio->base) &BIT (offset)); +return !!(ioread8 (stx104gpio->base) &BIT (offset)); } static int stx104_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
@@ -230,7 +230,7 @@ static int stx104_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, {struct stx104_gpio *const stx104gpio =gpiochip_get_data (chip); - *bits =inb (stx104gpio->base); + *bits =ioread8 (stx104gpio->base);return 0 ; }
@@ -252,7 +252,7 @@ static void stx104_gpio_set(struct gpio_chip *chip, unsigned int offset,else stx104gpio->out_state &= ~mask; -outb (stx104gpio->out_state, stx104gpio->base); +iowrite8 (stx104gpio->out_state, stx104gpio->base);spin_unlock_irqrestore (&stx104gpio->lock, flags); }
@@ -279,7 +279,7 @@ static void stx104_gpio_set_multiple(struct gpio_chip *chip, stx104gpio->out_state &= ~*mask; stx104gpio->out_state |= *mask & *bits; -outb (stx104gpio->out_state, stx104gpio->base); +iowrite8 (stx104gpio->out_state, stx104gpio->base);spin_unlock_irqrestore (&stx104gpio->lock, flags); }
@@ -306,11 +306,16 @@ static int stx104_probe(struct device *dev, unsigned int id)return -EBUSY ; } + priv =iio_priv (indio_dev); + priv->base =devm_ioport_map (dev, base[id],STX104_EXTENT ); +if (!priv->base) +return -ENOMEM ; + indio_dev->info = &stx104_info; indio_dev->modes =INDIO_DIRECT_MODE ;/* determine if differential inputs */ -if (inb (base[id] +8 ) &BIT (5 )) { +if (ioread8 (priv->base +8 ) &BIT (5 )) { indio_dev->num_channels =ARRAY_SIZE (stx104_channels_diff); indio_dev->channels = stx104_channels_diff; }else {
@@ -320,18 +325,15 @@ static int stx104_probe(struct device *dev, unsigned int id) indio_dev->name =dev_name (dev); - priv =iio_priv (indio_dev); - priv->base = base[id]; -/* configure device for software trigger operation */ -outb (0 , base[id] +9 ); +iowrite8 (0 , priv->base +9 );/* initialize gain setting to x1 */ -outb (0 , base[id] +11 ); +iowrite8 (0 , priv->base +11 );/* initialize DAC output to 0V */ -outw (0 , base[id] +4 ); -outw (0 , base[id] +6 ); +iowrite16 (0 , priv->base +4 ); +iowrite16 (0 , priv->base +6 ); stx104gpio->chip.label =dev_name (dev); stx104gpio->chip.parent = dev;
@@ -346,7 +348,7 @@ static int stx104_probe(struct device *dev, unsigned int id) stx104gpio->chip.get_multiple = stx104_gpio_get_multiple; stx104gpio->chip.set = stx104_gpio_set; stx104gpio->chip.set_multiple = stx104_gpio_set_multiple; - stx104gpio->base = base[id] +3 ; + stx104gpio->base = priv->base +3 ; stx104gpio->out_state =0x0 ;spin_lock_init (&stx104gpio->lock);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 42/139 iio: adc: stx104: Implement and utilize register structures
In reply to Greg Kroah-HartmanFrom: William Breathitt Gray <[email protected]>
[ Upstream commit 6cfd14c54b1f42f29097244c1b6208f8268d7d5b ]
Reduce magic numbers and improve code readability by implementing and utilizing named register data structures.
Stable-dep-of: 4f9b80aefb9e ("iio: addac: stx104: Fix race condition when converting analog-to-digital")
--- drivers/iio/adc/stx104.c | 74 +++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 24 deletions(-)
drivers/iio/adc/stx104.c +50 -24
@@ -16,6 +16,7 @@#include <linux/module.h> #include <linux/moduleparam.h> #include <linux/spinlock.h> +#include <linux/types.h> #define STX104_OUT_CHAN (chan) { \ .type = IIO_VOLTAGE, \
@@ -44,14 +45,36 @@ static unsigned int num_stx104;module_param_hw_array (base, uint, ioport, &num_stx104,0 );MODULE_PARM_DESC (base,"Apex Embedded Systems STX104 base addresses" ); +/** +* struct stx104_reg - device register structure +* @ssr_ad: Software Strobe Register and ADC Data +* @achan: ADC Channel +* @dio: Digital I/O +* @dac: DAC Channels +* @cir_asr: Clear Interrupts and ADC Status +* @acr: ADC Control +* @pccr_fsh: Pacer Clock Control and FIFO Status MSB +* @acfg: ADC Configuration +*/ +struct stx104_reg { +u16 ssr_ad; +u8 achan; +u8 dio; +u16 dac[2 ]; +u8 cir_asr; +u8 acr; +u8 pccr_fsh; +u8 acfg; +}; +/** * struct stx104_iio - IIO device private data structure * @chan_out_states: channels' output states -* @base: base port address of the IIO device +* @reg: I/O address offset for the device registers */ struct stx104_iio {unsigned int chan_out_states[STX104_NUM_OUT_CHAN ]; -void __iomem *base; +struct stx104_reg __iomem *reg; };/**
@@ -64,7 +87,7 @@ struct stx104_iio {struct stx104_gpio {struct gpio_chip chip;spinlock_t lock; -void __iomem *base; +u8 __iomem *base;unsigned int out_state; };
@@ -72,6 +95,7 @@ static int stx104_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) { struct stx104_iio *const priv = iio_priv(indio_dev); +struct stx104_reg __iomem *const reg = priv->reg;unsigned int adc_config;int adbu;int gain;
@@ -79,7 +103,7 @@ static int stx104_read_raw(struct iio_dev *indio_dev,switch (mask) {case IIO_CHAN_INFO_HARDWAREGAIN :/* get gain configuration */ - adc_config =ioread8 (priv->base +11 ); + adc_config =ioread8 (®->acfg); gain = adc_config &0x3 ; *val =1 << gain;
@@ -91,24 +115,26 @@ static int stx104_read_raw(struct iio_dev *indio_dev, }/* select ADC channel */ -iowrite8 (chan->channel | (chan->channel <<4 ), priv->base +2 ); +iowrite8 (chan->channel | (chan->channel <<4 ), ®->achan); -/* trigger ADC sample capture and wait for completion */ -iowrite8 (0 , priv->base); -while (ioread8 (priv->base +8 ) &BIT (7 )); +/* trigger ADC sample capture by writing to the 8-bit +* Software Strobe Register and wait for completion +*/ +iowrite8 (0 , ®->ssr_ad); +while (ioread8 (®->cir_asr) &BIT (7 )); - *val =ioread16 (priv->base); + *val =ioread16 (®->ssr_ad);return IIO_VAL_INT ;case IIO_CHAN_INFO_OFFSET :/* get ADC bipolar/unipolar configuration */ - adc_config =ioread8 (priv->base +11 ); + adc_config =ioread8 (®->acfg); adbu = !(adc_config &BIT (2 )); *val =-32768 * adbu;return IIO_VAL_INT ;case IIO_CHAN_INFO_SCALE :/* get ADC bipolar/unipolar and gain configuration */ - adc_config =ioread8 (priv->base +11 ); + adc_config =ioread8 (®->acfg); adbu = !(adc_config &BIT (2 )); gain = adc_config &0x3 ;
@@ -130,16 +156,16 @@ static int stx104_write_raw(struct iio_dev *indio_dev,/* Only four gain states (x1, x2, x4, x8) */ switch (val) {case 1 : -iowrite8 (0 , priv->base +11 ); +iowrite8 (0 , &priv->reg->acfg);break ;case 2 : -iowrite8 (1 , priv->base +11 ); +iowrite8 (1 , &priv->reg->acfg);break ;case 4 : -iowrite8 (2 , priv->base +11 ); +iowrite8 (2 , &priv->reg->acfg);break ;case 8 : -iowrite8 (3 , priv->base +11 ); +iowrite8 (3 , &priv->reg->acfg);break ;default :return -EINVAL ;
@@ -153,7 +179,7 @@ static int stx104_write_raw(struct iio_dev *indio_dev,return -EINVAL ; priv->chan_out_states[chan->channel] = val; -iowrite16 (val, priv->base +4 +2 * chan->channel); +iowrite16 (val, &priv->reg->dac[chan->channel]);return 0 ; }
@@ -307,15 +333,15 @@ static int stx104_probe(struct device *dev, unsigned int id) } priv =iio_priv (indio_dev); - priv->base =devm_ioport_map (dev, base[id],STX104_EXTENT ); -if (!priv->base) + priv->reg =devm_ioport_map (dev, base[id],STX104_EXTENT ); +if (!priv->reg)return -ENOMEM ; indio_dev->info = &stx104_info; indio_dev->modes =INDIO_DIRECT_MODE ;/* determine if differential inputs */ -if (ioread8 (priv->base +8 ) &BIT (5 )) { +if (ioread8 (&priv->reg->cir_asr) &BIT (5 )) { indio_dev->num_channels =ARRAY_SIZE (stx104_channels_diff); indio_dev->channels = stx104_channels_diff; }else {
@@ -326,14 +352,14 @@ static int stx104_probe(struct device *dev, unsigned int id) indio_dev->name =dev_name (dev);/* configure device for software trigger operation */ -iowrite8 (0 , priv->base +9 ); +iowrite8 (0 , &priv->reg->acr);/* initialize gain setting to x1 */ -iowrite8 (0 , priv->base +11 ); +iowrite8 (0 , &priv->reg->acfg);/* initialize DAC output to 0V */ -iowrite16 (0 , priv->base +4 ); -iowrite16 (0 , priv->base +6 ); +iowrite16 (0 , &priv->reg->dac[0 ]); +iowrite16 (0 , &priv->reg->dac[1 ]); stx104gpio->chip.label =dev_name (dev); stx104gpio->chip.parent = dev;
@@ -348,7 +374,7 @@ static int stx104_probe(struct device *dev, unsigned int id) stx104gpio->chip.get_multiple = stx104_gpio_get_multiple; stx104gpio->chip.set = stx104_gpio_set; stx104gpio->chip.set_multiple = stx104_gpio_set_multiple; - stx104gpio->base = priv->base +3 ; + stx104gpio->base = &priv->reg->dio; stx104gpio->out_state =0x0 ;spin_lock_init (&stx104gpio->lock);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 43/139 iio: stx104: Move to addac subdirectory
In reply to Greg Kroah-HartmanFrom: William Breathitt Gray <[email protected]>
[ Upstream commit 955c2aa9cff2dd07ff798ca8c883398731687972 ]
The stx104 driver supports both ADC and DAC functionality.
Stable-dep-of: 4f9b80aefb9e ("iio: addac: stx104: Fix race condition when converting analog-to-digital")
---
MAINTAINERS | 2 +-
drivers/iio/adc/Kconfig | 16 ----------------
drivers/iio/adc/Makefile | 1 -
drivers/iio/addac/Kconfig | 16 ++++++++++++++++
drivers/iio/addac/Makefile | 1 +
drivers/iio/{adc => addac}/stx104.c | 0
6 files changed, 18 insertions(+), 18 deletions(-)
rename drivers/iio/{adc => addac}/stx104.c (100%)MAINTAINERS +1 -1
@@ -1250,7 +1250,7 @@ APEX EMBEDDED SYSTEMS STX104 IIO DRIVER M: William Breathitt Gray <[email protected]> L: [email protected] S: Maintained -F: drivers/iio/adc/stx104.c +F: drivers/iio/addac/stx104.c APM DRIVER M: Jiri Kosina <[email protected]>
drivers/iio/adc/Kconfig +0 -16
@@ -991,22 +991,6 @@ config STMPE_ADC Say yes here to build support for ST Microelectronics STMPE built-in ADC block (stmpe811). -config STX104 - tristate "Apex Embedded Systems STX104 driver" - depends on PC104 && X86 - select ISA_BUS_API - select GPIOLIB - help - Say yes here to build support for the Apex Embedded Systems STX104 - integrated analog PC/104 card. - - This driver supports the 16 channels of single-ended (8 channels of - differential) analog inputs, 2 channels of analog output, 4 digital - inputs, and 4 digital outputs provided by the STX104. - - The base port addresses for the devices may be configured via the base - array module parameter. - config SUN4I_GPADC tristate "Support for the Allwinner SoCs GPADC" depends on IIO
drivers/iio/adc/Makefile +0 -1
@@ -85,7 +85,6 @@ obj-$(CONFIG_ROCKCHIP_SARADC) += rockchip_saradc.o obj-$(CONFIG_RZG2L_ADC) += rzg2l_adc.o obj-$(CONFIG_SC27XX_ADC) += sc27xx_adc.o obj-$(CONFIG_SPEAR_ADC) += spear_adc.o -obj-$(CONFIG_STX104) += stx104.o obj-$(CONFIG_SUN4I_GPADC) += sun4i-gpadc-iio.o obj-$(CONFIG_STM32_ADC_CORE) += stm32-adc-core.o obj-$(CONFIG_STM32_ADC) += stm32-adc.o
drivers/iio/addac/Kconfig +16 -0
@@ -5,4 +5,20 @@ menu "Analog to digital and digital to analog converters" +config STX104 + tristate "Apex Embedded Systems STX104 driver" + depends on PC104 && X86 + select ISA_BUS_API + select GPIOLIB + help + Say yes here to build support for the Apex Embedded Systems STX104 + integrated analog PC/104 card. + + This driver supports the 16 channels of single-ended (8 channels of + differential) analog inputs, 2 channels of analog output, 4 digital + inputs, and 4 digital outputs provided by the STX104. + + The base port addresses for the devices may be configured via the base + array module parameter. + endmenu
drivers/iio/addac/Makefile +1 -0
@@ -4,3 +4,4 @@ # # When adding new entries keep the list in alphabetical order +obj-$(CONFIG_STX104) += stx104.o
drivers/iio/addac/stx104.c renamed from drivers/iio/adc/stx104.c +0 -0
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 44/139 iio: addac: stx104: Fix race condition for stx104_write_raw()
In reply to Greg Kroah-HartmanFrom: William Breathitt Gray <[email protected]>
[ Upstream commit 9740827468cea80c42db29e7171a50e99acf7328 ]
The priv->chan_out_states array and actual DAC value can become mismatched if stx104_write_raw() is called concurrently. Prevent such a race condition by utilizing a mutex.
Stable-dep-of: 4f9b80aefb9e ("iio: addac: stx104: Fix race condition when converting analog-to-digital")
--- drivers/iio/addac/stx104.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/iio/addac/stx104.c +8 -0
@@ -15,6 +15,7 @@#include <linux/kernel.h> #include <linux/module.h> #include <linux/moduleparam.h> +#include <linux/mutex.h> #include <linux/spinlock.h> #include <linux/types.h>
@@ -69,10 +70,12 @@ struct stx104_reg {/** * struct stx104_iio - IIO device private data structure +* @lock: synchronization lock to prevent I/O race conditions * @chan_out_states: channels' output states * @reg: I/O address offset for the device registers */ struct stx104_iio { +struct mutex lock;unsigned int chan_out_states[STX104_NUM_OUT_CHAN ];struct stx104_reg __iomem *reg; };
@@ -178,9 +181,12 @@ static int stx104_write_raw(struct iio_dev *indio_dev,if ((unsigned int )val >65535 )return -EINVAL ; +mutex_lock (&priv->lock); + priv->chan_out_states[chan->channel] = val;iowrite16 (val, &priv->reg->dac[chan->channel]); +mutex_unlock (&priv->lock);return 0 ; }return -EINVAL ;
@@ -351,6 +357,8 @@ static int stx104_probe(struct device *dev, unsigned int id) indio_dev->name =dev_name (dev); +mutex_init (&priv->lock); +/* configure device for software trigger operation */ iowrite8 (0 , &priv->reg->acr);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 45/139 iio: addac: stx104: Fix race condition when converting analog-to-digital
In reply to Greg Kroah-HartmanFrom: William Breathitt Gray <[email protected]>
[ Upstream commit 4f9b80aefb9e2f542a49d9ec087cf5919730e1dd ]
The ADC conversion procedure requires several device I/O operations performed in a particular sequence. If stx104_read_raw() is called concurrently, the ADC conversion procedure could be clobbered. Prevent such a race condition by utilizing a mutex.
--- drivers/iio/addac/stx104.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/iio/addac/stx104.c +4 -0
@@ -117,6 +117,8 @@ static int stx104_read_raw(struct iio_dev *indio_dev,return IIO_VAL_INT ; } +mutex_lock (&priv->lock); +/* select ADC channel */ iowrite8 (chan->channel | (chan->channel <<4 ), ®->achan);
@@ -127,6 +129,8 @@ static int stx104_read_raw(struct iio_dev *indio_dev,while (ioread8 (®->cir_asr) &BIT (7 )); *val =ioread16 (®->ssr_ad); + +mutex_unlock (&priv->lock);return IIO_VAL_INT ;case IIO_CHAN_INFO_OFFSET :/* get ADC bipolar/unipolar configuration */
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 46/139 igc: read before write to SRRCTL register
In reply to Greg Kroah-HartmanFrom: Song Yoong Siang <[email protected]>
[ Upstream commit 3ce29c17dc847bf4245e16aad78a7617afa96297 ]
igc_configure_rx_ring() function will be called as part of XDP program setup. If Rx hardware timestamp is enabled prio to XDP program setup, this timestamp enablement will be overwritten when buffer size is written into SRRCTL register.
Thus, this commit read the register value before write to SRRCTL register. This commit is tested by using xdp_hw_metadata bpf selftest tool. The tool enables Rx hardware timestamp and then attach XDP program to igc driver. It will display hardware timestamp of UDP packet with port number 9092. Below are detail of test steps and results.
Command on DUT:
sudo ./xdp_hw_metadata <interface name>
Command on Link Partner:
echo -n skb | nc -u -q1 <destination IPv4 addr> 9092
Result before this patch:
skb hwtstamp is not found!
Result after this patch:
found skb hwtstamp = 1677800973.642836757
Optionally, read PHC to confirm the values obtained are almost the same:
Command:
sudo ./testptp -d /dev/ptp0 -g
Result:
clock time: 1677800973.913598978 or Fri Mar 3 07:49:33 2023
--- drivers/net/ethernet/intel/igc/igc_base.h | 11 ++++++++--- drivers/net/ethernet/intel/igc/igc_main.c | 7 +++++-- 2 files changed, 13 insertions(+), 5 deletions(-)
drivers/net/ethernet/intel/igc/igc_base.h +8 -3
@@ -85,8 +85,13 @@ union igc_adv_rx_desc {#define IGC_RXDCTL_SWFLUSH 0x04000000/* Receive Software Flush */ /* SRRCTL bit definitions */ -#define IGC_SRRCTL_BSIZEPKT_SHIFT 10/* Shift _right_ */ -#define IGC_SRRCTL_BSIZEHDRSIZE_SHIFT 2/* Shift _left_ */ -#define IGC_SRRCTL_DESCTYPE_ADV_ONEBUF 0x02000000 +#define IGC_SRRCTL_BSIZEPKT_MASK GENMASK(6, 0) +#define IGC_SRRCTL_BSIZEPKT (x) FIELD_PREP(IGC_SRRCTL_BSIZEPKT_MASK, \ + (x) / 1024)/* in 1 KB resolution */ +#define IGC_SRRCTL_BSIZEHDR_MASK GENMASK(13, 8) +#define IGC_SRRCTL_BSIZEHDR (x) FIELD_PREP(IGC_SRRCTL_BSIZEHDR_MASK, \ + (x) / 64)/* in 64 bytes resolution */ +#define IGC_SRRCTL_DESCTYPE_MASK GENMASK(27, 25) +#define IGC_SRRCTL_DESCTYPE_ADV_ONEBUF FIELD_PREP(IGC_SRRCTL_DESCTYPE_MASK, 1)#endif /* _IGC_BASE_H */
drivers/net/ethernet/intel/igc/igc_main.c +5 -2
@@ -674,8 +674,11 @@ static void igc_configure_rx_ring(struct igc_adapter *adapter,else buf_size =IGC_RXBUFFER_2048 ; - srrctl =IGC_RX_HDR_LEN <<IGC_SRRCTL_BSIZEHDRSIZE_SHIFT ; - srrctl |= buf_size >>IGC_SRRCTL_BSIZEPKT_SHIFT ; + srrctl =rd32 (IGC_SRRCTL (reg_idx)); + srrctl &= ~(IGC_SRRCTL_BSIZEPKT_MASK |IGC_SRRCTL_BSIZEHDR_MASK | +IGC_SRRCTL_DESCTYPE_MASK ); + srrctl |=IGC_SRRCTL_BSIZEHDR (IGC_RX_HDR_LEN ); + srrctl |=IGC_SRRCTL_BSIZEPKT (buf_size); srrctl |=IGC_SRRCTL_DESCTYPE_ADV_ONEBUF ;wr32 (IGC_SRRCTL (reg_idx), srrctl);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 47/139 ARM: dts: aspeed: asrock: Correct firmware flash SPI clocks
In reply to Greg Kroah-HartmanFrom: Zev Weiss <[email protected]>
[ Upstream commit 9dedb724446913ea7b1591b4b3d2e3e909090980 ]
While I'm not aware of any problems that have occurred running these at 100 MHz, the official word from ASRock is that 50 MHz is the correct speed to use, so let's be safe and use that instead.
--- arch/arm/boot/dts/aspeed-bmc-asrock-e3c246d4i.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/aspeed-bmc-asrock-e3c246d4i.dts +1 -1
@@ -63,7 +63,7 @@ flash@0 { status = "okay"; m25p,fast-read; label = "bmc"; - spi-max-frequency = <100000000>; /* 100 MHz */ + spi-max-frequency = <50000000>; /* 50 MHz */ #include "openbmc-flash-layout.dtsi" }; };
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 48/139 drm/amd/display: save restore hdcp state when display is unplugged from mst hub
In reply to Greg Kroah-HartmanFrom: hersen wu <[email protected]>
[ Upstream commit 82986fd631fa04bcedaefe11a6b3767601cbe84f ]
[Why]
connector hdcp properties are lost after display is unplgged from mst hub. connector is destroyed with dm_dp_mst_connector_destroy. when display is plugged back, hdcp is not desired and it wouldnt be enabled.
[How]
save hdcp properties into hdcp_work within amdgpu_dm_atomic_commit_tail. If the same display is plugged back with same display index, its hdcp properties will be retrieved from hdcp_work within dm_dp_mst_get_modes.
Stable-dep-of: cdff36a0217a ("drm/amd/display: fix access hdcp_workqueue assert")
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 24 ++++++++++++++++- .../amd/display/amdgpu_dm/amdgpu_dm_hdcp.h | 14 ++++++++++ .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 26 +++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +23 -1
@@ -9612,11 +9612,33 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) continue; } -if (is_content_protection_different (new_con_state, old_con_state, connector, adev->dm.hdcp_workqueue)) +if (is_content_protection_different (new_con_state, old_con_state, connector, adev->dm.hdcp_workqueue)) { +/* when display is unplugged from mst hub, connctor will +* be destroyed within dm_dp_mst_connector_destroy. connector +* hdcp perperties, like type, undesired, desired, enabled, +* will be lost. So, save hdcp properties into hdcp_work within +* amdgpu_dm_atomic_commit_tail. if the same display is +* plugged back with same display index, its hdcp properties +* will be retrieved from hdcp_work within dm_dp_mst_get_modes +*/ + +if (aconnector->dc_link && aconnector->dc_sink && + aconnector->dc_link->type == dc_connection_mst_branch) { +struct hdcp_workqueue *hdcp_work = adev->dm.hdcp_workqueue; +struct hdcp_workqueue *hdcp_w = + &hdcp_work[aconnector->dc_link->link_index]; + + hdcp_w->hdcp_content_type[connector->index] = + new_con_state->hdcp_content_type; + hdcp_w->content_protection[connector->index] = + new_con_state->content_protection; + } +hdcp_update_display ( adev->dm.hdcp_workqueue, aconnector->dc_link->link_index, aconnector, new_con_state->hdcp_content_type, new_con_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_DESIRED ); + } }#endif
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h +14 -0
@@ -52,6 +52,20 @@ struct hdcp_workqueue {struct mod_hdcp_link link;enum mod_hdcp_encryption_status encryption_status; + +/* when display is unplugged from mst hub, connctor will be +* destroyed within dm_dp_mst_connector_destroy. connector +* hdcp perperties, like type, undesired, desired, enabled, +* will be lost. So, save hdcp properties into hdcp_work within +* amdgpu_dm_atomic_commit_tail. if the same display is +* plugged back with same display index, its hdcp properties +* will be retrieved from hdcp_work within dm_dp_mst_get_modes +*/ +/* un-desired, desired, enabled */ +unsigned int content_protection[AMDGPU_DM_MAX_DISPLAY_INDEX ]; +/* hdcp1.x, hdcp2.x */ +unsigned int hdcp_content_type[AMDGPU_DM_MAX_DISPLAY_INDEX ]; +uint8_t max_link;uint8_t *srm;
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +26 -0
@@ -32,6 +32,10 @@#include "amdgpu_dm.h" #include "amdgpu_dm_mst_types.h" +#ifdef CONFIG_DRM_AMD_DC_HDCP +#include "amdgpu_dm_hdcp.h" +#endif +#include "dc.h" #include "dm_helpers.h"
@@ -315,6 +319,28 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)/* dc_link_add_remote_sink returns a new reference */ aconnector->dc_sink = dc_sink; +/* when display is unplugged from mst hub, connctor will be +* destroyed within dm_dp_mst_connector_destroy. connector +* hdcp perperties, like type, undesired, desired, enabled, +* will be lost. So, save hdcp properties into hdcp_work within +* amdgpu_dm_atomic_commit_tail. if the same display is +* plugged back with same display index, its hdcp properties +* will be retrieved from hdcp_work within dm_dp_mst_get_modes +*/ +#ifdef CONFIG_DRM_AMD_DC_HDCP +if (aconnector->dc_sink && connector->state) { +struct drm_device *dev = connector->dev; +struct amdgpu_device *adev =drm_to_adev (dev); +struct hdcp_workqueue *hdcp_work = adev->dm.hdcp_workqueue; +struct hdcp_workqueue *hdcp_w = &hdcp_work[aconnector->dc_link->link_index]; + + connector->state->hdcp_content_type = + hdcp_w->hdcp_content_type[connector->index]; + connector->state->content_protection = + hdcp_w->content_protection[connector->index]; + } +#endif +if (aconnector->dc_sink) {amdgpu_dm_update_freesync_caps ( connector, aconnector->edid);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 49/139 drm/amd/display: phase3 mst hdcp for multiple displays
In reply to Greg Kroah-HartmanFrom: hersen wu <[email protected]>
[ Upstream commit e8fd3eeb5e8711af39b00642da06474e52f4780c ]
[Why]
multiple display hdcp are enabled within event_property_validate, event_property_update by looping all displays on mst hub. when one of display on mst hub in unplugged or disabled, hdcp are disabled for all displays on mst hub within hdcp_reset_display by looping all displays of mst link. for displays still active, their encryption status are off. kernel driver will not run hdcp authentication again. therefore, hdcp are not enabled automatically.
[How]
within is_content_protection_different, check drm_crtc_state changes of all displays on mst hub, if need, triger hdcp_update_display to re-run hdcp authentication.
Stable-dep-of: cdff36a0217a ("drm/amd/display: fix access hdcp_workqueue assert")
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 183 ++++++++++++++---- 1 file changed, 141 insertions(+), 42 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +141 -42
@@ -8566,27 +8566,55 @@ is_scaling_state_different(const struct dm_connector_state *dm_state, }#ifdef CONFIG_DRM_AMD_DC_HDCP -static bool is_content_protection_different (struct drm_connector_state *state, -const struct drm_connector_state *old_state, -const struct drm_connector *connector,struct hdcp_workqueue *hdcp_w) +static bool is_content_protection_different (struct drm_crtc_state *new_crtc_state, +struct drm_crtc_state *old_crtc_state, +struct drm_connector_state *new_conn_state, +struct drm_connector_state *old_conn_state, +const struct drm_connector *connector, +struct hdcp_workqueue *hdcp_w) {struct amdgpu_dm_connector *aconnector =to_amdgpu_dm_connector (connector);struct dm_connector_state *dm_con_state =to_dm_connector_state (connector->state); -/* Handle: Type0/1 change */ -if (old_state->hdcp_content_type != state->hdcp_content_type && - state->content_protection !=DRM_MODE_CONTENT_PROTECTION_UNDESIRED ) { - state->content_protection =DRM_MODE_CONTENT_PROTECTION_DESIRED ; +pr_debug ("[HDCP_DM] connector->index: %x connect_status: %x dpms: %x\n" , + connector->index, connector->status, connector->dpms); +pr_debug ("[HDCP_DM] state protection old: %x new: %x\n" , + old_conn_state->content_protection, new_conn_state->content_protection); + +if (old_crtc_state) +pr_debug ("[HDCP_DM] old crtc en: %x a: %x m: %x a-chg: %x c-chg: %x\n" , + old_crtc_state->enable, + old_crtc_state->active, + old_crtc_state->mode_changed, + old_crtc_state->active_changed, + old_crtc_state->connectors_changed); + +if (new_crtc_state) +pr_debug ("[HDCP_DM] NEW crtc en: %x a: %x m: %x a-chg: %x c-chg: %x\n" , + new_crtc_state->enable, + new_crtc_state->active, + new_crtc_state->mode_changed, + new_crtc_state->active_changed, + new_crtc_state->connectors_changed); + +/* hdcp content type change */ +if (old_conn_state->hdcp_content_type != new_conn_state->hdcp_content_type && + new_conn_state->content_protection !=DRM_MODE_CONTENT_PROTECTION_UNDESIRED ) { + new_conn_state->content_protection =DRM_MODE_CONTENT_PROTECTION_DESIRED ; +pr_debug ("[HDCP_DM] Type0/1 change %s :true\n" , __func__);return true; } -/* CP is being re enabled, ignore this -* -* Handles: ENABLED -> DESIRED -*/ -if (old_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_ENABLED && - state->content_protection ==DRM_MODE_CONTENT_PROTECTION_DESIRED ) { - state->content_protection =DRM_MODE_CONTENT_PROTECTION_ENABLED ; +/* CP is being re enabled, ignore this */ +if (old_conn_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_ENABLED && + new_conn_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_DESIRED ) { +if (new_crtc_state && new_crtc_state->mode_changed) { + new_conn_state->content_protection =DRM_MODE_CONTENT_PROTECTION_DESIRED ; +pr_debug ("[HDCP_DM] ENABLED->DESIRED & mode_changed %s :true\n" , __func__); +return true; + }; + new_conn_state->content_protection =DRM_MODE_CONTENT_PROTECTION_ENABLED ; +pr_debug ("[HDCP_DM] ENABLED -> DESIRED %s :false\n" , __func__);return false; }
@@ -8594,9 +8622,9 @@ static bool is_content_protection_different(struct drm_connector_state *state,* * Handles: UNDESIRED -> ENABLED */ -if (old_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_UNDESIRED && - state->content_protection ==DRM_MODE_CONTENT_PROTECTION_ENABLED ) - state->content_protection =DRM_MODE_CONTENT_PROTECTION_DESIRED ; +if (old_conn_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_UNDESIRED && + new_conn_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_ENABLED ) + new_conn_state->content_protection =DRM_MODE_CONTENT_PROTECTION_DESIRED ;/* Stream removed and re-enabled *
@@ -8606,10 +8634,12 @@ static bool is_content_protection_different(struct drm_connector_state *state,* * Handles: DESIRED -> DESIRED (Special case) */ -if (!(old_state->crtc && old_state->crtc->enabled) && - state->crtc && state->crtc->enabled && +if (!(old_conn_state->crtc && old_conn_state->crtc->enabled) && + new_conn_state->crtc && new_conn_state->crtc->enabled && connector->state->content_protection ==DRM_MODE_CONTENT_PROTECTION_DESIRED ) { dm_con_state->update_hdcp = false; +pr_debug ("[HDCP_DM] DESIRED->DESIRED (Stream removed and re-enabled) %s :true\n" , + __func__);return true; }
@@ -8621,35 +8651,42 @@ static bool is_content_protection_different(struct drm_connector_state *state,* * Handles: DESIRED -> DESIRED (Special case) */ -if (dm_con_state->update_hdcp && state->content_protection ==DRM_MODE_CONTENT_PROTECTION_DESIRED && - connector->dpms ==DRM_MODE_DPMS_ON && aconnector->dc_sink !=NULL ) { +if (dm_con_state->update_hdcp && + new_conn_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_DESIRED && + connector->dpms ==DRM_MODE_DPMS_ON && aconnector->dc_sink !=NULL ) { dm_con_state->update_hdcp = false; +pr_debug ("[HDCP_DM] DESIRED->DESIRED (Hot-plug, headless s3, dpms) %s :true\n" , + __func__);return true; } -/* -* Handles: UNDESIRED -> UNDESIRED -* DESIRED -> DESIRED -* ENABLED -> ENABLED -*/ -if (old_state->content_protection == state->content_protection) +if (old_conn_state->content_protection == new_conn_state->content_protection) { +if (new_conn_state->content_protection >=DRM_MODE_CONTENT_PROTECTION_DESIRED ) { +if (new_crtc_state && new_crtc_state->mode_changed) { +pr_debug ("[HDCP_DM] DESIRED->DESIRED or ENABLE->ENABLE mode_change %s :true\n" , + __func__); +return true; + }; +pr_debug ("[HDCP_DM] DESIRED->DESIRED & ENABLE->ENABLE %s :false\n" , + __func__); +return false; + }; + +pr_debug ("[HDCP_DM] UNDESIRED->UNDESIRED %s :false\n" , __func__);return false; + } -/* -* Handles: UNDESIRED -> DESIRED -* DESIRED -> UNDESIRED -* ENABLED -> UNDESIRED -*/ -if (state->content_protection !=DRM_MODE_CONTENT_PROTECTION_ENABLED ) +if (new_conn_state->content_protection !=DRM_MODE_CONTENT_PROTECTION_ENABLED ) { +pr_debug ("[HDCP_DM] UNDESIRED->DESIRED or DESIRED->UNDESIRED or ENABLED->UNDESIRED %s :true\n" , + __func__);return true; + } -/* -* Handles: DESIRED -> ENABLED -*/ +pr_debug ("[HDCP_DM] DESIRED->ENABLED %s :false\n" , __func__); return false; } -#endif +static void remove_stream (struct amdgpu_device *adev,struct amdgpu_crtc *acrtc,struct dc_stream_state *stream)
@@ -9592,15 +9629,66 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) } }#ifdef CONFIG_DRM_AMD_DC_HDCP +for_each_oldnew_connector_in_state (state, connector, old_con_state, new_con_state, i) { +struct dm_connector_state *dm_new_con_state =to_dm_connector_state (new_con_state); +struct amdgpu_crtc *acrtc =to_amdgpu_crtc (dm_new_con_state->base.crtc); +struct amdgpu_dm_connector *aconnector =to_amdgpu_dm_connector (connector); + +pr_debug ("[HDCP_DM] -------------- i : %x ----------\n" , i); + +if (!connector) +continue ; + +pr_debug ("[HDCP_DM] connector->index: %x connect_status: %x dpms: %x\n" , + connector->index, connector->status, connector->dpms); +pr_debug ("[HDCP_DM] state protection old: %x new: %x\n" , + old_con_state->content_protection, new_con_state->content_protection); + +if (aconnector->dc_sink) { +if (aconnector->dc_sink->sink_signal !=SIGNAL_TYPE_VIRTUAL && + aconnector->dc_sink->sink_signal !=SIGNAL_TYPE_NONE ) { +pr_debug ("[HDCP_DM] pipe_ctx dispname=%s\n" , + aconnector->dc_sink->edid_caps.display_name); + } + } + + new_crtc_state =NULL ; + old_crtc_state =NULL ; + +if (acrtc) { + new_crtc_state =drm_atomic_get_new_crtc_state (state, &acrtc->base); + old_crtc_state =drm_atomic_get_old_crtc_state (state, &acrtc->base); + } + +if (old_crtc_state) +pr_debug ("old crtc en: %x a: %x m: %x a-chg: %x c-chg: %x\n" , + old_crtc_state->enable, + old_crtc_state->active, + old_crtc_state->mode_changed, + old_crtc_state->active_changed, + old_crtc_state->connectors_changed); + +if (new_crtc_state) +pr_debug ("NEW crtc en: %x a: %x m: %x a-chg: %x c-chg: %x\n" , + new_crtc_state->enable, + new_crtc_state->active, + new_crtc_state->mode_changed, + new_crtc_state->active_changed, + new_crtc_state->connectors_changed); + } +for_each_oldnew_connector_in_state (state, connector, old_con_state, new_con_state, i) {struct dm_connector_state *dm_new_con_state =to_dm_connector_state (new_con_state);struct amdgpu_crtc *acrtc =to_amdgpu_crtc (dm_new_con_state->base.crtc);struct amdgpu_dm_connector *aconnector =to_amdgpu_dm_connector (connector); new_crtc_state =NULL ; + old_crtc_state =NULL ; -if (acrtc) +if (acrtc) { new_crtc_state =drm_atomic_get_new_crtc_state (state, &acrtc->base); + old_crtc_state =drm_atomic_get_old_crtc_state (state, &acrtc->base); + } dm_new_crtc_state =to_dm_crtc_state (new_crtc_state);
@@ -9612,7 +9700,8 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)continue ; } -if (is_content_protection_different (new_con_state, old_con_state, connector, adev->dm.hdcp_workqueue)) { +if (is_content_protection_different (new_crtc_state, old_crtc_state, new_con_state, + old_con_state, connector, adev->dm.hdcp_workqueue)) {/* when display is unplugged from mst hub, connctor will * be destroyed within dm_dp_mst_connector_destroy. connector * hdcp perperties, like type, undesired, desired, enabled,
@@ -9622,6 +9711,11 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)* will be retrieved from hdcp_work within dm_dp_mst_get_modes */ +bool enable_encryption = false; + +if (new_con_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_DESIRED ) + enable_encryption = true; +if (aconnector->dc_link && aconnector->dc_sink && aconnector->dc_link->type == dc_connection_mst_branch) {struct hdcp_workqueue *hdcp_work = adev->dm.hdcp_workqueue;
@@ -9634,11 +9728,16 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) new_con_state->content_protection; } +if (new_crtc_state && new_crtc_state->mode_changed && + new_con_state->content_protection >=DRM_MODE_CONTENT_PROTECTION_DESIRED ) + enable_encryption = true; + +DRM_INFO ("[HDCP_DM] hdcp_update_display enable_encryption = %x\n" , enable_encryption); +hdcp_update_display ( adev->dm.hdcp_workqueue, aconnector->dc_link->link_index, aconnector, - new_con_state->hdcp_content_type, - new_con_state->content_protection ==DRM_MODE_CONTENT_PROTECTION_DESIRED ); - } + new_con_state->hdcp_content_type, enable_encryption); + } }#endif
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 50/139 drm/amd/display: fix access hdcp_workqueue assert
In reply to Greg Kroah-HartmanFrom: Hersen Wu <[email protected]>
[ Upstream commit cdff36a0217aadf5cbc167893ad1c0da869619cb ]
[Why] hdcp are enabled for asics from raven. for old asics which hdcp are not enabled, hdcp_workqueue are null. some access to hdcp work queue are not guarded with pointer check.
[How] add hdcp_workqueue pointer check before access workqueue.
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 ++++++ .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 16 ++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +6 -0
@@ -9634,6 +9634,9 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)struct amdgpu_crtc *acrtc =to_amdgpu_crtc (dm_new_con_state->base.crtc);struct amdgpu_dm_connector *aconnector =to_amdgpu_dm_connector (connector); +if (!adev->dm.hdcp_workqueue) +continue ; +pr_debug ("[HDCP_DM] -------------- i : %x ----------\n" , i);if (!connector)
@@ -9682,6 +9685,9 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)struct amdgpu_crtc *acrtc =to_amdgpu_crtc (dm_new_con_state->base.crtc);struct amdgpu_dm_connector *aconnector =to_amdgpu_dm_connector (connector); +if (!adev->dm.hdcp_workqueue) +continue ; + new_crtc_state =NULL ; old_crtc_state =NULL ;
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +10 -6
@@ -331,13 +331,17 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)if (aconnector->dc_sink && connector->state) {struct drm_device *dev = connector->dev;struct amdgpu_device *adev =drm_to_adev (dev); -struct hdcp_workqueue *hdcp_work = adev->dm.hdcp_workqueue; -struct hdcp_workqueue *hdcp_w = &hdcp_work[aconnector->dc_link->link_index]; - connector->state->hdcp_content_type = - hdcp_w->hdcp_content_type[connector->index]; - connector->state->content_protection = - hdcp_w->content_protection[connector->index]; +if (adev->dm.hdcp_workqueue) { +struct hdcp_workqueue *hdcp_work = adev->dm.hdcp_workqueue; +struct hdcp_workqueue *hdcp_w = + &hdcp_work[aconnector->dc_link->link_index]; + + connector->state->hdcp_content_type = + hdcp_w->hdcp_content_type[connector->index]; + connector->state->content_protection = + hdcp_w->content_protection[connector->index]; + } }#endif
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 51/139 usb: dwc3: gadget: Synchronize IRQ between soft connect/disconnect
In reply to Greg Kroah-HartmanFrom: Wesley Cheng <[email protected]>
[ Upstream commit 9711c67de7482c81e1daca3548fbc5c9603600e3 ]
Ensure that there are no pending events being handled in between soft connect/disconnect transitions. As we are keeping interrupts enabled, and EP0 events are still being serviced, this avoids any stale events from being serviced.
Stable-dep-of: c8540870af4c ("usb: dwc3: gadget: Improve dwc3_gadget_suspend() and dwc3_gadget_resume()")
--- drivers/usb/dwc3/gadget.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/dwc3/gadget.c +2 -0
@@ -2540,6 +2540,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)return 0 ; } +synchronize_irq (dwc->irq_gadget); +if (!is_on) { ret =dwc3_gadget_soft_disconnect (dwc); }else {
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 52/139 usb: dwc3: Remove DWC3 locking during gadget suspend/resume
In reply to Greg Kroah-HartmanFrom: Wesley Cheng <[email protected]>
[ Upstream commit 5265397f94424eaea596026fd34dc7acf474dcec ]
Remove the need for making dwc3_gadget_suspend() and dwc3_gadget_resume() to be called in a spinlock, as dwc3_gadget_run_stop() could potentially take some time to complete.
Stable-dep-of: c8540870af4c ("usb: dwc3: gadget: Improve dwc3_gadget_suspend() and dwc3_gadget_resume()")
--- drivers/usb/dwc3/core.c | 4 ---- drivers/usb/dwc3/gadget.c | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/usb/dwc3/core.c +0 -4
@@ -1766,9 +1766,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)case DWC3_GCTL_PRTCAP_DEVICE :if (pm_runtime_suspended (dwc->dev))break ; -spin_lock_irqsave (&dwc->lock, flags);dwc3_gadget_suspend (dwc); -spin_unlock_irqrestore (&dwc->lock, flags);synchronize_irq (dwc->irq_gadget);dwc3_core_exit (dwc);break ;
@@ -1829,9 +1827,7 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)return ret;dwc3_set_prtcap (dwc,DWC3_GCTL_PRTCAP_DEVICE ); -spin_lock_irqsave (&dwc->lock, flags);dwc3_gadget_resume (dwc); -spin_unlock_irqrestore (&dwc->lock, flags);break ;case DWC3_GCTL_PRTCAP_HOST :if (!PMSG_IS_AUTO (msg)) {
drivers/usb/dwc3/gadget.c +5 -0
@@ -4439,12 +4439,17 @@ void dwc3_gadget_exit(struct dwc3 *dwc)int dwc3_gadget_suspend (struct dwc3 *dwc) { +unsigned long flags; +if (!dwc->gadget_driver)return 0 ;dwc3_gadget_run_stop (dwc, false, false); + +spin_lock_irqsave (&dwc->lock, flags);dwc3_disconnect_gadget (dwc);__dwc3_gadget_stop (dwc); +spin_unlock_irqrestore (&dwc->lock, flags);return 0 ; }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 53/139 usb: dwc3: Fix typos in gadget.c
In reply to Greg Kroah-HartmanFrom: Kushagra Verma <[email protected]>
[ Upstream commit af870d93c706c302a8742d7c751a60a832f7bc64 ]
Fixes the following two typos:
1. reinitate -> reinitiate
2. revison -> revision
Stable-dep-of: c8540870af4c ("usb: dwc3: gadget: Improve dwc3_gadget_suspend() and dwc3_gadget_resume()")
--- drivers/usb/dwc3/gadget.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/dwc3/gadget.c +2 -2
@@ -3531,7 +3531,7 @@ static void dwc3_gadget_endpoint_stream_event(struct dwc3_ep *dep,* streams are updated, and the device controller will not be * triggered to generate ERDY to move the next stream data. To * workaround this and maintain compatibility with various -* hosts, force to reinitate the stream until the host is ready +* hosts, force to reinitiate the stream until the host is ready * instead of waiting for the host to prime the endpoint. */ if (DWC3_VER_IS_WITHIN(DWC32, 100A, ANY)) {
@@ -4059,7 +4059,7 @@ static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc,unsigned int is_ss = evtinfo &BIT (4 );/* -* WORKAROUND: DWC3 revison 2.20a with hibernation support +* WORKAROUND: DWC3 revision 2.20a with hibernation support * have a known issue which can cause USB CV TD.9.23 to fail * randomly. *
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 54/139 USB: dwc3: gadget: drop dead hibernation code
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit bdb19d01026a5cccfa437be8adcf2df472c5889e ]
The hibernation code is broken and has never been enabled in mainline and should thus be dropped.
Remove the hibernation bits from the gadget code, which effectively reverts commits e1dadd3b0f27 ("usb: dwc3: workaround: bogus hibernation events") and 7b2a0368bbc9 ("usb: dwc3: gadget: set KEEP_CONNECT in case of hibernation") except for the spurious interrupt warning.
Stable-dep-of: c8540870af4c ("usb: dwc3: gadget: Improve dwc3_gadget_suspend() and dwc3_gadget_resume()")
--- drivers/usb/dwc3/gadget.c | 46 +++++---------------------------------- 1 file changed, 6 insertions(+), 40 deletions(-)
drivers/usb/dwc3/gadget.c +6 -40
@@ -2412,7 +2412,7 @@ static void __dwc3_gadget_set_speed(struct dwc3 *dwc)dwc3_writel (dwc->regs,DWC3_DCFG , reg); } -static int dwc3_gadget_run_stop (struct dwc3 *dwc,int is_on,int suspend) +static int dwc3_gadget_run_stop (struct dwc3 *dwc,int is_on) {u32 reg;u32 timeout =500 ;
@@ -2431,17 +2431,11 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) reg &= ~DWC3_DCTL_KEEP_CONNECT ; reg |=DWC3_DCTL_RUN_STOP ; -if (dwc->has_hibernation) - reg |=DWC3_DCTL_KEEP_CONNECT ; -__dwc3_gadget_set_speed (dwc); dwc->pullups_connected = true; }else { reg &= ~DWC3_DCTL_RUN_STOP ; -if (dwc->has_hibernation && !suspend) - reg &= ~DWC3_DCTL_KEEP_CONNECT ; - dwc->pullups_connected = false; }
@@ -2487,7 +2481,7 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc)* remaining event generated by the controller while polling for * DSTS.DEVCTLHLT. */ -return dwc3_gadget_run_stop (dwc, false, false); +return dwc3_gadget_run_stop (dwc, false); }static int dwc3_gadget_pullup (struct usb_gadget *g,int is_on)
@@ -2555,7 +2549,7 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)dwc3_event_buffers_setup (dwc);__dwc3_gadget_start (dwc); - ret =dwc3_gadget_run_stop (dwc, true, false); + ret =dwc3_gadget_run_stop (dwc, true); }pm_runtime_put (dwc->dev);
@@ -4053,30 +4047,6 @@ static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc, dwc->link_state = next; } -static void dwc3_gadget_hibernation_interrupt (struct dwc3 *dwc, -unsigned int evtinfo) -{ -unsigned int is_ss = evtinfo &BIT (4 ); - -/* -* WORKAROUND: DWC3 revision 2.20a with hibernation support -* have a known issue which can cause USB CV TD.9.23 to fail -* randomly. -* -* Because of this issue, core could generate bogus hibernation -* events which SW needs to ignore. -* -* Refers to: -* -* STAR#9000546576: Device Mode Hibernation: Issue in USB 2.0 -* Device Fallback from SuperSpeed -*/ -if (is_ss ^ (dwc->speed ==USB_SPEED_SUPER )) -return ; - -/* enter hibernation here */ -} -static void dwc3_gadget_interrupt (struct dwc3 *dwc,const struct dwc3_event_devt *event) {
@@ -4094,11 +4064,7 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc,dwc3_gadget_wakeup_interrupt (dwc);break ;case DWC3_DEVICE_EVENT_HIBER_REQ : -if (dev_WARN_ONCE (dwc->dev, !dwc->has_hibernation, -"unexpected hibernation event\n" )) -break ; - -dwc3_gadget_hibernation_interrupt (dwc, event->event_info); +dev_WARN_ONCE (dwc->dev, true,"unexpected hibernation event\n" );break ;case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE :dwc3_gadget_linksts_change_interrupt (dwc, event->event_info);
@@ -4444,7 +4410,7 @@ int dwc3_gadget_suspend(struct dwc3 *dwc)if (!dwc->gadget_driver)return 0 ; -dwc3_gadget_run_stop (dwc, false, false); +dwc3_gadget_run_stop (dwc, false);spin_lock_irqsave (&dwc->lock, flags);dwc3_disconnect_gadget (dwc);
@@ -4465,7 +4431,7 @@ int dwc3_gadget_resume(struct dwc3 *dwc)if (ret <0 ) goto err0; - ret =dwc3_gadget_run_stop (dwc, true, false); + ret =dwc3_gadget_run_stop (dwc, true);if (ret <0 ) goto err1;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 55/139 usb: dwc3: gadget: Improve dwc3_gadget_suspend() and dwc3_gadget_resume()
In reply to Greg Kroah-HartmanFrom: Roger Quadros <[email protected]>
[ Upstream commit c8540870af4ce6ddeb27a7bb5498b75fb29b643c ]
Prevent -ETIMEDOUT error on .suspend().
e.g. If gadget driver is loaded and we are connected to a USB host, all transfers must be stopped before stopping the controller else we will not get a clean stop i.e. dwc3_gadget_run_stop() will take several seconds to complete and will return -ETIMEDOUT.
Handle error cases properly in dwc3_gadget_suspend(). Simplify dwc3_gadget_resume() by using the introduced helper function.
--- drivers/usb/dwc3/gadget.c | 67 ++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 33 deletions(-)
drivers/usb/dwc3/gadget.c +34 -33
@@ -2484,6 +2484,21 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc)return dwc3_gadget_run_stop (dwc, false); } +static int dwc3_gadget_soft_connect (struct dwc3 *dwc) +{ +/* +* In the Synopsys DWC_usb31 1.90a programming guide section +* 4.1.9, it specifies that for a reconnect after a +* device-initiated disconnect requires a core soft reset +* (DCTL.CSftRst) before enabling the run/stop bit. +*/ +dwc3_core_soft_reset (dwc); + +dwc3_event_buffers_setup (dwc); +__dwc3_gadget_start (dwc); +return dwc3_gadget_run_stop (dwc, true); +} +static int dwc3_gadget_pullup (struct usb_gadget *g,int is_on) {struct dwc3 *dwc =gadget_to_dwc (g);
@@ -2536,21 +2551,10 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)synchronize_irq (dwc->irq_gadget); -if (!is_on) { +if (!is_on) ret =dwc3_gadget_soft_disconnect (dwc); - }else { -/* -* In the Synopsys DWC_usb31 1.90a programming guide section -* 4.1.9, it specifies that for a reconnect after a -* device-initiated disconnect requires a core soft reset -* (DCTL.CSftRst) before enabling the run/stop bit. -*/ -dwc3_core_soft_reset (dwc); - -dwc3_event_buffers_setup (dwc); -__dwc3_gadget_start (dwc); - ret =dwc3_gadget_run_stop (dwc, true); - } +else + ret =dwc3_gadget_soft_connect (dwc);pm_runtime_put (dwc->dev);
@@ -4406,42 +4410,39 @@ void dwc3_gadget_exit(struct dwc3 *dwc)int dwc3_gadget_suspend (struct dwc3 *dwc) {unsigned long flags; +int ret;if (!dwc->gadget_driver)return 0 ; -dwc3_gadget_run_stop (dwc, false); + ret =dwc3_gadget_soft_disconnect (dwc); +if (ret) + goto err;spin_lock_irqsave (&dwc->lock, flags);dwc3_disconnect_gadget (dwc); -__dwc3_gadget_stop (dwc);spin_unlock_irqrestore (&dwc->lock, flags);return 0 ; + +err: +/* +* Attempt to reset the controller's state. Likely no +* communication can be established until the host +* performs a port reset. +*/ +if (dwc->softconnect) +dwc3_gadget_soft_connect (dwc); + +return ret; }int dwc3_gadget_resume (struct dwc3 *dwc) { -int ret; -if (!dwc->gadget_driver || !dwc->softconnect)return 0 ; - ret =__dwc3_gadget_start (dwc); -if (ret <0 ) - goto err0; - - ret =dwc3_gadget_run_stop (dwc, true); -if (ret <0 ) - goto err1; - -return 0 ; - -err1: -__dwc3_gadget_stop (dwc); - -err0: -return ret; +return dwc3_gadget_soft_connect (dwc); }void dwc3_gadget_process_pending_events (struct dwc3 *dwc)
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 56/139 tty: serial: fsl_lpuart: Add i.MXRT1050 support
In reply to Greg Kroah-HartmanFrom: Jesse Taube <[email protected]>
[ Upstream commit 443df57b31d14a920f23eaa265f4cb0dc3f94823 ]
Add support for i.MXRT1050's uart.
Stable-dep-of: a82c3df955f8 ("tty: serial: fsl_lpuart: reduce RX watermark to 0 on LS1028A")
--- drivers/tty/serial/fsl_lpuart.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/tty/serial/fsl_lpuart.c +8 -0
@@ -246,6 +246,7 @@ enum lpuart_type {LS1028A_LPUART ,IMX7ULP_LPUART ,IMX8QXP_LPUART , + IMXRT1050_LPUART, }; struct lpuart_port {
@@ -308,6 +309,11 @@ static struct lpuart_soc_data imx8qxp_data = { .iotype = UPIO_MEM32, .reg_off = IMX_REG_OFF, }; +static struct lpuart_soc_data imxrt1050_data = { + .devtype =IMXRT1050_LPUART , + .iotype =UPIO_MEM32 , + .reg_off =IMX_REG_OFF , +};static const struct of_device_id lpuart_dt_ids[] = { { .compatible ="fsl,vf610-lpuart" , .data = &vf_data, },
@@ -315,6 +321,7 @@ static const struct of_device_id lpuart_dt_ids[] = { { .compatible = "fsl,ls1028a-lpuart", .data = &ls1028a_data, }, { .compatible = "fsl,imx7ulp-lpuart", .data = &imx7ulp_data, }, { .compatible = "fsl,imx8qxp-lpuart", .data = &imx8qxp_data, }, + { .compatible = "fsl,imxrt1050-lpuart", .data = &imxrt1050_data}, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, lpuart_dt_ids);
@@ -2634,6 +2641,7 @@ OF_EARLYCON_DECLARE(lpuart32, "fsl,ls1028a-lpuart", ls1028a_early_console_setup)OF_EARLYCON_DECLARE (lpuart32,"fsl,imx7ulp-lpuart" , lpuart32_imx_early_console_setup);OF_EARLYCON_DECLARE (lpuart32,"fsl,imx8ulp-lpuart" , lpuart32_imx_early_console_setup);OF_EARLYCON_DECLARE (lpuart32,"fsl,imx8qxp-lpuart" , lpuart32_imx_early_console_setup); +OF_EARLYCON_DECLARE (lpuart32,"fsl,imxrt1050-lpuart" , lpuart32_imx_early_console_setup);EARLYCON_DECLARE (lpuart, lpuart_early_console_setup);EARLYCON_DECLARE (lpuart32, lpuart32_early_console_setup);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 57/139 tty: serial: fsl_lpuart: make rx_watermark configurable for different platforms
In reply to Greg Kroah-HartmanFrom: Sherry Sun <[email protected]>
[ Upstream commit 34ebb26f12a84b744f43c5c4869516f122a2dfaa ]
Add rx_watermark parameter for struct lpuart_port to make the receive watermark configurable for different platforms.
No function changed.
Stable-dep-of: a82c3df955f8 ("tty: serial: fsl_lpuart: reduce RX watermark to 0 on LS1028A")
--- drivers/tty/serial/fsl_lpuart.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/tty/serial/fsl_lpuart.c +12 -2
@@ -257,6 +257,7 @@ struct lpuart_port {unsigned int txfifo_size;unsigned int rxfifo_size; +u8 rx_watermark;bool lpuart_dma_tx_use;bool lpuart_dma_rx_use;struct dma_chan *dma_tx_chan;
@@ -281,38 +282,45 @@ struct lpuart_soc_data {enum lpuart_type devtype;char iotype;u8 reg_off; +u8 rx_watermark; };static const struct lpuart_soc_data vf_data = { .devtype =VF610_LPUART , .iotype =UPIO_MEM , + .rx_watermark =1 , };static const struct lpuart_soc_data ls1021a_data = { .devtype =LS1021A_LPUART , .iotype =UPIO_MEM32BE , + .rx_watermark =1 , };static const struct lpuart_soc_data ls1028a_data = { .devtype =LS1028A_LPUART , .iotype =UPIO_MEM32 , + .rx_watermark =1 , };static struct lpuart_soc_data imx7ulp_data = { .devtype =IMX7ULP_LPUART , .iotype =UPIO_MEM32 , .reg_off =IMX_REG_OFF , + .rx_watermark =1 , };static struct lpuart_soc_data imx8qxp_data = { .devtype =IMX8QXP_LPUART , .iotype =UPIO_MEM32 , .reg_off =IMX_REG_OFF , + .rx_watermark =1 , };static struct lpuart_soc_data imxrt1050_data = { .devtype =IMXRT1050_LPUART , .iotype =UPIO_MEM32 , .reg_off =IMX_REG_OFF , + .rx_watermark =1 , };static const struct of_device_id lpuart_dt_ids[] = {
@@ -1556,7 +1564,7 @@ static void lpuart_setup_watermark(struct lpuart_port *sport) }writeb (0 , sport->port.membase +UARTTWFIFO ); -writeb (1 , sport->port.membase +UARTRWFIFO ); +writeb (sport->rx_watermark, sport->port.membase +UARTRWFIFO );/* Restore cr2 */ writeb (cr2_saved, sport->port.membase +UARTCR2 );
@@ -1591,7 +1599,8 @@ static void lpuart32_setup_watermark(struct lpuart_port *sport)lpuart32_write (&sport->port, val,UARTFIFO );/* set the watermark */ - val = (0x1 <<UARTWATER_RXWATER_OFF ) | (0x0 <<UARTWATER_TXWATER_OFF ); + val = (sport->rx_watermark <<UARTWATER_RXWATER_OFF ) | + (0x0 <<UARTWATER_TXWATER_OFF );lpuart32_write (&sport->port, val,UARTWATER );/* Restore cr2 */
@@ -2736,6 +2745,7 @@ static int lpuart_probe(struct platform_device *pdev) sport->port.dev = &pdev->dev; sport->port.type =PORT_LPUART ; sport->devtype = sdata->devtype; + sport->rx_watermark = sdata->rx_watermark; ret =platform_get_irq (pdev,0 );if (ret <0 )return ret;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 58/139 tty: serial: fsl_lpuart: reduce RX watermark to 0 on LS1028A
In reply to Greg Kroah-HartmanFrom: Robert Hodaszi <[email protected]>
[ Upstream commit a82c3df955f8c1c726e4976527aa6ae924a67dd9 ]
LS1028A is using DMA with LPUART. Having RX watermark set to 1, means DMA transactions are started only after receiving the second character.
On other platforms with newer LPUART IP, Receiver Idle Empty function initiates the DMA request after the receiver is idling for 4 characters. But this feature is missing on LS1028A, which is causing a 1-character delay in the RX direction on this platform.
Set RX watermark to 0 to initiate RX DMA after each character.
Message-ID: <[email protected]>
--- drivers/tty/serial/fsl_lpuart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/fsl_lpuart.c +1 -1
@@ -300,7 +300,7 @@ static const struct lpuart_soc_data ls1021a_data = {static const struct lpuart_soc_data ls1028a_data = { .devtype =LS1028A_LPUART , .iotype =UPIO_MEM32 , - .rx_watermark =1 , + .rx_watermark =0 , };static struct lpuart_soc_data imx7ulp_data = {
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 59/139 USB: dwc3: qcom: fix NULL-deref on suspend
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit d2d69354226de0b333d4405981f3d9c41ba8430a ]
The Qualcomm dwc3 glue driver is currently accessing the driver data of the child core device during suspend and on wakeup interrupts. This is clearly a bad idea as the child may not have probed yet or could have been unbound from its driver.
The first such layering violation was part of the initial version of the driver, but this was later made worse when the hack that accesses the driver data of the grand child xhci device to configure the wakeup interrupts was added.
Fixing this properly is not that easily done, so add a sanity check to make sure that the child driver data is non-NULL before dereferencing it for now.
Note that this relies on subtleties like the fact that driver core is making sure that the parent is not suspended while the child is probing.
Message-ID: <[email protected]>
--- drivers/usb/dwc3/dwc3-qcom.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/usb/dwc3/dwc3-qcom.c +10 -1
@@ -306,7 +306,16 @@ static void dwc3_qcom_interconnect_exit(struct dwc3_qcom *qcom)/* Only usable in contexts where the role can not change. */ static bool dwc3_qcom_is_host (struct dwc3_qcom *qcom) { -struct dwc3 *dwc =platform_get_drvdata (qcom->dwc3); +struct dwc3 *dwc; + +/* +* FIXME: Fix this layering violation. +*/ + dwc =platform_get_drvdata (qcom->dwc3); + +/* Core driver may not have probed yet. */ +if (!dwc) +return false;return dwc->xhci; }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 60/139 USB: dwc3: fix use-after-free on core driver unbind
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit e3dbb657571509044be15184a13134fa7c1fdca1 ]
Some dwc3 glue drivers are currently accessing the driver data of the child core device directly, which is clearly a bad idea as the child may not have probed yet or may have been unbound from its driver.
As a workaround until the glue drivers have been fixed, clear the driver data pointer before allowing the glue parent device to runtime suspend to prevent its driver from accessing data that has been freed during unbind.
Message-ID: <[email protected]>
--- drivers/usb/dwc3/core.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/dwc3/core.c +5 -0
@@ -1719,6 +1719,11 @@ static int dwc3_remove(struct platform_device *pdev)pm_runtime_allow (&pdev->dev);pm_runtime_disable (&pdev->dev);pm_runtime_put_noidle (&pdev->dev); +/* +* HACK: Clear the driver data, which is currently accessed by parent +* glue drivers, before allowing the parent to suspend. +*/ +platform_set_drvdata (pdev,NULL );pm_runtime_set_suspended (&pdev->dev);dwc3_free_event_buffers (dwc);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 61/139 mmc: bcm2835: fix deferred probing
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 71150ac12558bcd9d75e6e24cf7c872c2efd80f3 ]
The driver overrides the error codes and IRQ0 returned by platform_get_irq() to -EINVAL, so if it returns -EPROBE_DEFER, the driver will fail the probe permanently instead of the deferred probing. Switch to propagating the error codes upstream. Since commit ce753ad1549c ("platform: finally disallow IRQ0 in platform_get_irq() and its ilk") IRQ0 is no longer returned by those APIs, so we now can safely ignore it...
--- drivers/mmc/host/bcm2835.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mmc/host/bcm2835.c +2 -2
@@ -1413,8 +1413,8 @@ static int bcm2835_probe(struct platform_device *pdev) host->max_clk =clk_get_rate (clk); host->irq =platform_get_irq (pdev,0 ); -if (host->irq <=0 ) { - ret = -EINVAL ; +if (host->irq <0 ) { + ret = host->irq; goto err; }
Signature · 1 line
2.40.1
Re: [PATCH 5.15 061/139] mmc: bcm2835: fix deferred probing
Quoted 11 lines · Greg Kroah-Hartman
From: Sergey Shtylyov <[email protected]>
[ Upstream commit
71150ac12558bcd9d75e6e24cf7c872c2efd80f3]The driver overrides the error codes and IRQ0 returned by
platform_get_irq()to-EINVAL, so if it returns -EPROBE_DEFER, the driver will fail the probe permanently instead of the deferred probing. Switch to propagating the error codes upstream. Since commitce753ad1549c("platform: finally disallow IRQ0 inplatform_get_irq()and its ilk") IRQ0 is no longer returned by those APIs, so we now can safely ignore it...
Quoted 2 lines
Fixes 660fc733bd74 ("mmc: bcm2835: Add new driver for the sdhost controller.")Cc [email protected] # v5.19+
After a glance at the driver, the patch seems safe to be applied to 5.15.y,
despite I tried to limit it to 5.19.y and newer...
Quoted 4 lines
Signed-off-by Sergey Shtylyov <[email protected]>Signed-off-by Ulf Hansson <[email protected]>Signed-off-by Sasha Levin <[email protected]>
[...]
MBR, Sergey
Greg Kroah-Hartman
maintainerPATCH 62/139 mmc: sunxi: fix deferred probing
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit c2df53c5806cfd746dae08e07bc8c4ad247c3b70 ]
The driver overrides the error codes and IRQ0 returned by platform_get_irq() to -EINVAL, so if it returns -EPROBE_DEFER, the driver will fail the probe permanently instead of the deferred probing. Switch to propagating the error codes upstream. Since commit ce753ad1549c ("platform: finally disallow IRQ0 in platform_get_irq() and its ilk") IRQ0 is no longer returned by those APIs, so we now can safely ignore it...
--- drivers/mmc/host/sunxi-mmc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mmc/host/sunxi-mmc.c +2 -2
@@ -1341,8 +1341,8 @@ static int sunxi_mmc_resource_request(struct sunxi_mmc_host *host,return ret; host->irq =platform_get_irq (pdev,0 ); -if (host->irq <=0 ) { - ret = -EINVAL ; +if (host->irq <0 ) { + ret = host->irq; goto error_disable_mmc; }
Signature · 1 line
2.40.1
Re: [PATCH 5.15 062/139] mmc: sunxi: fix deferred probing
Quoted 11 lines · Greg Kroah-Hartman
From: Sergey Shtylyov <[email protected]>
[ Upstream commit
c2df53c5806cfd746dae08e07bc8c4ad247c3b70]The driver overrides the error codes and IRQ0 returned by
platform_get_irq()to-EINVAL, so if it returns -EPROBE_DEFER, the driver will fail the probe permanently instead of the deferred probing. Switch to propagating the error codes upstream. Since commitce753ad1549c("platform: finally disallow IRQ0 inplatform_get_irq()and its ilk") IRQ0 is no longer returned by those APIs, so we now can safely ignore it...
Quoted 2 lines
Fixes 2408a08583d2 ("mmc: sunxi-mmc: Handle return value of platform_get_irq")Cc [email protected] # v5.19+
After a glance at the driver, the patch seems safe to be applied to 5.15.y,
despite I tried to limit it to 5.19.y and newer...
Quoted 5 lines
Signed-off-by Sergey Shtylyov <[email protected]>Reviewed-by Jernej Skrabec <[email protected]>Signed-off-by Ulf Hansson <[email protected]>Signed-off-by Sasha Levin <[email protected]>
[...]
MBR, Sergey
Greg Kroah-Hartman
maintainerPATCH 63/139 net/ncsi: change from ndo_set_mac_address to dev_set_mac_address
In reply to Greg Kroah-HartmanFrom: Ivan Mikhaylov <[email protected]>
[ Upstream commit 790071347a0a1a89e618eedcd51c687ea783aeb3 ]
Change ndo_set_mac_address to dev_set_mac_address because dev_set_mac_address provides a way to notify network layer about MAC change. In other case, services may not aware about MAC change and keep using old one which set from network adapter driver.
As example, DHCP client from systemd do not update MAC address without notification from net subsystem which leads to the problem with acquiring the right address from DHCP server.
--- net/ncsi/ncsi-rsp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/ncsi/ncsi-rsp.c +3 -2
@@ -616,7 +616,6 @@ static int ncsi_rsp_handler_oem_mlx_gma(struct ncsi_request *nr) {struct ncsi_dev_priv *ndp = nr->ndp;struct net_device *ndev = ndp->ndev.dev; -const struct net_device_ops *ops = ndev->netdev_ops;struct ncsi_rsp_oem_pkt *rsp;struct sockaddr saddr;int ret =0 ;
@@ -630,7 +629,9 @@ static int ncsi_rsp_handler_oem_mlx_gma(struct ncsi_request *nr)/* Set the flag for GMA command which should only be called once */ ndp->gma_flag =1 ; - ret = ops->ndo_set_mac_address (ndev, &saddr); +rtnl_lock (); + ret =dev_set_mac_address (ndev, &saddr,NULL ); +rtnl_unlock ();if (ret <0 )netdev_warn (ndev,"NCSI: 'Writing mac address to device failed\n" );
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 64/139 ARM: dts: imx6sll: fixup of operating points
In reply to Greg Kroah-HartmanFrom: Andreas Kemnade <[email protected]>
[ Upstream commit 1875903019ea6e32e6e544c1631b119e4fd60b20 ]
Make operating point definitions comply with binding specifications.
Stable-dep-of: ee70b908f77a ("ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node")
--- arch/arm/boot/dts/imx6sll.dtsi | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-)
arch/arm/boot/dts/imx6sll.dtsi +10 -12
@@ -51,20 +51,18 @@ cpu0: cpu@0 { device_type = "cpu"; reg = <0>; next-level-cache = <&L2>; - operating-points = < + operating-points = /* kHz uV */ - 996000 1275000 - 792000 1175000 - 396000 1075000 - 198000 975000 - >; - fsl,soc-operating-points = < + <996000 1275000>, + <792000 1175000>, + <396000 1075000>, + <198000 975000>; + fsl,soc-operating-points = /* ARM kHz SOC-PU uV */ - 996000 1175000 - 792000 1175000 - 396000 1175000 - 198000 1175000 - >; + <996000 1175000>, + <792000 1175000>, + <396000 1175000>, + <198000 1175000>; clock-latency = <61036>; /* two CLK32 periods */ #cooling-cells = <2>; clocks = <&clks IMX6SLL_CLK_ARM>,
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 65/139 ARM: dts: nxp/imx6sll: fix wrong property name in usbphy node
In reply to Greg Kroah-HartmanFrom: Xu Yang <[email protected]>
[ Upstream commit ee70b908f77a9d8f689dea986f09e6d7dc481934 ]
Property name "phy-3p0-supply" is used instead of "phy-reg_3p0-supply".
--- arch/arm/boot/dts/imx6sll.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/imx6sll.dtsi +1 -1
@@ -552,7 +552,7 @@ usbphy2: usb-phy@20ca000 { reg = <0x020ca000 0x1000>; interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clks IMX6SLL_CLK_USBPHY2>; - phy-reg_3p0-supply = <®_3p0>; + phy-3p0-supply = <®_3p0>; fsl,anatop = <&anatop>; };
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 66/139 btrfs: move out now unused BG from the reclaim list
In reply to Greg Kroah-HartmanFrom: Naohiro Aota <[email protected]>
[ Upstream commit a9f189716cf15913c453299d72f69c51a9b0f86b ]
An unused block group is easy to remove to free up space and should be reclaimed fast. Such block group can often already be a target of the reclaim process. As we check list_empty(&bg->bg_list), we keep it in the reclaim list. That block group is never reclaimed until the file system is filled e.g. up to 75%.
Instead, we can move unused block group to the unused list and delete it fast.
--- fs/btrfs/block-group.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/btrfs/block-group.c +4 -1
@@ -1475,11 +1475,14 @@ void btrfs_mark_bg_unused(struct btrfs_block_group *bg) {struct btrfs_fs_info *fs_info = bg->fs_info; +trace_btrfs_add_unused_block_group (bg);spin_lock (&fs_info->unused_bgs_lock);if (list_empty (&bg->bg_list)) {btrfs_get_block_group (bg); -trace_btrfs_add_unused_block_group (bg);list_add_tail (&bg->bg_list, &fs_info->unused_bgs); + }else { +/* Pull out the block group from the reclaim_bgs list. */ +list_move_tail (&bg->bg_list, &fs_info->unused_bgs); }spin_unlock (&fs_info->unused_bgs_lock); }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 67/139 virtio-mmio: dont break lifecycle of vm_dev
In reply to Greg Kroah-HartmanFrom: Wolfram Sang <[email protected]>
[ Upstream commit 55c91fedd03d7b9cf0c5199b2eb12b9b8e95281a ]
vm_dev has a separate lifecycle because it has a 'struct device' embedded. Thus, having a release callback for it is correct.
Allocating the vm_dev struct with devres totally breaks this protection, though. Instead of waiting for the vm_dev release callback, the memory is freed when the platform_device is removed. Resulting in a use-after-free when finally the callback is to be called.
To easily see the problem, compile the kernel with CONFIG_DEBUG_KOBJECT_RELEASE and unbind with sysfs.
The fix is easy, don't use devres in this case.
Found during my research about object lifetime problems.
Message-Id: <[email protected]>
--- drivers/virtio/virtio_mmio.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/virtio/virtio_mmio.c +2 -3
@@ -572,9 +572,8 @@ static void virtio_mmio_release_dev(struct device *_d)struct virtio_device *vdev = container_of(_d, struct virtio_device, dev);struct virtio_mmio_device *vm_dev =to_virtio_mmio_device (vdev); -struct platform_device *pdev = vm_dev->pdev; -devm_kfree (&pdev->dev, vm_dev); +kfree (vm_dev); }/* Platform device */
@@ -585,7 +584,7 @@ static int virtio_mmio_probe(struct platform_device *pdev)unsigned long magic;int rc; - vm_dev =devm_kzalloc (&pdev->dev,sizeof (*vm_dev),GFP_KERNEL ); + vm_dev =kzalloc (sizeof (*vm_dev),GFP_KERNEL );if (!vm_dev)return -ENOMEM ;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 68/139 vduse: Use proper spinlock for IRQ injection
In reply to Greg Kroah-HartmanFrom: Maxime Coquelin <[email protected]>
[ Upstream commit 7ca26efb09a1543fddb29308ea3b63b66cb5d3ee ]
The IRQ injection work used spin_lock_irq() to protect the scheduling of the softirq, but spin_lock_bh() should be used.
With spin_lock_irq(), we noticed delay of more than 6 seconds between the time a NAPI polling work is scheduled and the time it is executed.
Message-Id: <[email protected]>
--- drivers/vdpa/vdpa_user/vduse_dev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/vdpa/vdpa_user/vduse_dev.c +4 -4
@@ -879,10 +879,10 @@ static void vduse_dev_irq_inject(struct work_struct *work) { struct vduse_dev *dev = container_of(work, struct vduse_dev, inject); -spin_lock_irq (&dev->irq_lock); +spin_lock_bh (&dev->irq_lock);if (dev->config_cb.callback) dev->config_cb.callback (dev->config_cb.private); -spin_unlock_irq (&dev->irq_lock); +spin_unlock_bh (&dev->irq_lock); }static void vduse_vq_irq_inject (struct work_struct *work)
@@ -890,10 +890,10 @@ static void vduse_vq_irq_inject(struct work_struct *work)struct vduse_virtqueue *vq =container_of (work, struct vduse_virtqueue, inject); -spin_lock_irq (&vq->irq_lock); +spin_lock_bh (&vq->irq_lock);if (vq->ready && vq->cb.callback) vq->cb.callback (vq->cb.private); -spin_unlock_irq (&vq->irq_lock); +spin_unlock_bh (&vq->irq_lock); } static int vduse_dev_queue_irq_work(struct vduse_dev *dev,
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 69/139 cifs: fix potential oops in cifs_oplock_break
In reply to Greg Kroah-HartmanFrom: Steve French <[email protected]>
[ Upstream commit e8f5f849ffce24490eb9449e98312b66c0dba76f ]
With deferred close we can have closes that race with lease breaks, and so with the current checks for whether to send the lease response, oplock_response(), this can mean that an unmount (kill_sb) can occur just before we were checking if the tcon->ses is valid. See below:
[Fri Aug 4 04:12:50 2023] RIP: 0010:cifs_oplock_break+0x1f7/0x5b0 [cifs] [Fri Aug 4 04:12:50 2023] Code: 7d a8 48 8b 7d c0 c0 e9 02 48 89 45 b8 41 89 cf e8 3e f5 ff ff 4c 89 f7 41 83 e7 01 e8 82 b3 03 f2 49 8b 45 50 48 85 c0 74 5e <48> 83 78 60 00 74 57 45 84 ff 75 52 48 8b 43 98 48 83 eb 68 48 39 [Fri Aug 4 04:12:50 2023] RSP: 0018:ffffb30607ddbdf8 EFLAGS: 00010206 [Fri Aug 4 04:12:50 2023] RAX: 632d223d32612022 RBX: ffff97136944b1e0 RCX: 0000000080100009 [Fri Aug 4 04:12:50 2023] RDX: 0000000000000001 RSI: 0000000080100009 RDI: ffff97136944b188 [Fri Aug 4 04:12:50 2023] RBP: ffffb30607ddbe58 R08: 0000000000000001 R09: ffffffffc08e0900 [Fri Aug 4 04:12:50 2023] R10: 0000000000000001 R11: 000000000000000f R12: ffff97136944b138 [Fri Aug 4 04:12:50 2023] R13: ffff97149147c000 R14: ffff97136944b188 R15: 0000000000000000 [Fri Aug 4 04:12:50 2023] FS: 0000000000000000(0000) GS:ffff9714f7c00000(0000) knlGS:0000000000000000 [Fri Aug 4 04:12:50 2023] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [Fri Aug 4 04:12:50 2023] CR2: 00007fd8de9c7590 CR3: 000000011228e000 CR4: 0000000000350ef0 [Fri Aug 4 04:12:50 2023] Call Trace: [Fri Aug 4 04:12:50 2023] <TASK> [Fri Aug 4 04:12:50 2023] process_one_work+0x225/0x3d0 [Fri Aug 4 04:12:50 2023] worker_thread+0x4d/0x3e0 [Fri Aug 4 04:12:50 2023] ? process_one_work+0x3d0/0x3d0 [Fri Aug 4 04:12:50 2023] kthread+0x12a/0x150 [Fri Aug 4 04:12:50 2023] ? set_kthread_struct+0x50/0x50 [Fri Aug 4 04:12:50 2023] ret_from_fork+0x22/0x30 [Fri Aug 4 04:12:50 2023] </TASK>
To fix this change the ordering of the checks before sending the oplock_response to first check if the openFileList is empty.
--- fs/cifs/file.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
fs/cifs/file.c +16 -7
@@ -4865,9 +4865,11 @@ void cifs_oplock_break(struct work_struct *work) struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo, oplock_break);struct inode *inode =d_inode (cfile->dentry); +struct cifs_sb_info *cifs_sb =CIFS_SB (inode->i_sb);struct cifsInodeInfo *cinode =CIFS_I (inode); -struct cifs_tcon *tcon =tlink_tcon (cfile->tlink); -struct TCP_Server_Info *server = tcon->ses->server; +struct cifs_tcon *tcon; +struct TCP_Server_Info *server; +struct tcon_link *tlink;int rc =0 ;bool purge_cache = false, oplock_break_cancelled;__u64 persistent_fid, volatile_fid;
@@ -4876,6 +4878,12 @@ void cifs_oplock_break(struct work_struct *work)wait_on_bit (&cinode->flags,CIFS_INODE_PENDING_WRITERS ,TASK_UNINTERRUPTIBLE ); + tlink =cifs_sb_tlink (cifs_sb); +if (IS_ERR (tlink)) + goto out; + tcon =tlink_tcon (tlink); + server = tcon->ses->server; + server->ops->downgrade_oplock (server, cinode, cfile->oplock_level, cfile->oplock_epoch, &purge_cache);
@@ -4925,18 +4933,19 @@ void cifs_oplock_break(struct work_struct *work)/* * MS-SMB2 3.2.5.19.1 and 3.2.5.19.2 (and MS-CIFS 3.2.5.42) do not require * an acknowledgment to be sent when the file has already been closed. -* check for server null, since can race with kill_sb calling tree disconnect. */ spin_lock (&cinode->open_file_lock); -if (tcon->ses && tcon->ses->server && !oplock_break_cancelled && - !list_empty (&cinode->openFileList)) { +/* check list empty since can race with kill_sb calling tree disconnect */ +if (!oplock_break_cancelled && !list_empty (&cinode->openFileList)) {spin_unlock (&cinode->open_file_lock); - rc = tcon->ses->server->ops->oplock_response (tcon, persistent_fid, - volatile_fid, net_fid, cinode); + rc = server->ops->oplock_response (tcon, persistent_fid, + volatile_fid, net_fid, cinode);cifs_dbg (FYI ,"Oplock release rc = %d\n" , rc); }else spin_unlock (&cinode->open_file_lock); +cifs_put_tlink (tlink); +out:cifs_done_oplock_break (cinode); }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 70/139 i2c: bcm-iproc: Fix bcm_iproc_i2c_isr deadlock issue
In reply to Greg Kroah-HartmanFrom: Chengfeng Ye <[email protected]>
commit 4caf4cb1eaed469742ef719f2cc024b1ec3fa9e6 upstream.
iproc_i2c_rd_reg() and iproc_i2c_wr_reg() are called from both interrupt context (e.g. bcm_iproc_i2c_isr) and process context (e.g. bcm_iproc_i2c_suspend). Therefore, interrupts should be disabled to avoid potential deadlock. To prevent this scenario, use spin_lock_irqsave().
--- drivers/i2c/busses/i2c-bcm-iproc.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/i2c/busses/i2c-bcm-iproc.c +7 -4
@@ -243,13 +243,14 @@ static inline u32 iproc_i2c_rd_reg(struc u32 offset) {u32 val; +unsigned long flags;if (iproc_i2c->idm_base) { -spin_lock (&iproc_i2c->idm_lock); +spin_lock_irqsave (&iproc_i2c->idm_lock, flags);writel (iproc_i2c->ape_addr_mask, iproc_i2c->idm_base +IDM_CTRL_DIRECT_OFFSET ); val =readl (iproc_i2c->base + offset); -spin_unlock (&iproc_i2c->idm_lock); +spin_unlock_irqrestore (&iproc_i2c->idm_lock, flags); }else { val =readl (iproc_i2c->base + offset); }
@@ -260,12 +261,14 @@ static inline u32 iproc_i2c_rd_reg(strucstatic inline void iproc_i2c_wr_reg (struct bcm_iproc_i2c_dev *iproc_i2c,u32 offset,u32 val) { +unsigned long flags; +if (iproc_i2c->idm_base) { -spin_lock (&iproc_i2c->idm_lock); +spin_lock_irqsave (&iproc_i2c->idm_lock, flags);writel (iproc_i2c->ape_addr_mask, iproc_i2c->idm_base +IDM_CTRL_DIRECT_OFFSET );writel (val, iproc_i2c->base + offset); -spin_unlock (&iproc_i2c->idm_lock); +spin_unlock_irqrestore (&iproc_i2c->idm_lock, flags); }else {writel (val, iproc_i2c->base + offset); }
Greg Kroah-Hartman
maintainerPATCH 71/139 i2c: hisi: Only handle the interrupt of the drivers transfer
In reply to Greg Kroah-HartmanFrom: Yicong Yang <[email protected]>
commit fff67c1b17ee093947bdcbac6f64d072e644159a upstream.
The controller may be shared with other port, for example the firmware. Handle the interrupt from other sources will cause crash since some data are not initialized. So only handle the interrupt of the driver's transfer and discard others.
--- drivers/i2c/busses/i2c-hisi.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/i2c/busses/i2c-hisi.c +8 -0
@@ -329,6 +329,14 @@ static irqreturn_t hisi_i2c_irq(int irq,struct hisi_i2c_controller *ctlr = context;u32 int_stat; +/* +* Don't handle the interrupt if cltr->completion is NULL. We may +* reach here because the interrupt is spurious or the transfer is +* started by another port (e.g. firmware) rather than us. +*/ +if (!ctlr->completion) +return IRQ_NONE ; + int_stat =readl (ctlr->iobase +HISI_I2C_INT_MSTAT );hisi_i2c_clear_int (ctlr, int_stat);if (!(int_stat &HISI_I2C_INT_ALL ))
Greg Kroah-Hartman
maintainerPATCH 72/139 fbdev: mmp: fix value check in mmphw_probe()
In reply to Greg Kroah-HartmanFrom: Yuanjun Gong <[email protected]>
commit 0872b2c0abc0e84ac82472959c8e14e35277549c upstream.
in mmphw_probe(), check the return value of clk_prepare_enable() and return the error code if clk_prepare_enable() returns an unexpected value.
--- drivers/video/fbdev/mmp/hw/mmp_ctrl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/video/fbdev/mmp/hw/mmp_ctrl.c +3 -1
@@ -518,7 +518,9 @@ static int mmphw_probe(struct platform_d ret = -ENOENT ; goto failed; } -clk_prepare_enable (ctrl->clk); + ret =clk_prepare_enable (ctrl->clk); +if (ret) + goto failed;/* init global regs */ ctrl_set_default (ctrl);
Greg Kroah-Hartman
maintainerPATCH 73/139 powerpc/rtas_flash: allow user copy to flash block cache objects
In reply to Greg Kroah-HartmanFrom: Nathan Lynch <[email protected]>
commit 4f3175979e62de3b929bfa54a0db4b87d36257a7 upstream.
With hardened usercopy enabled (CONFIG_HARDENED_USERCOPY=y), using the /proc/powerpc/rtas/firmware_update interface to prepare a system firmware update yields a BUG():
kernel BUG at mm/usercopy.c:102!
Oops: Exception in kernel mode, sig: 5 [#1]
LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries
Modules linked in:
CPU: 0 PID: 2232 Comm: dd Not tainted 6.5.0-rc3+ #2
Hardware name: IBM,8408-E8E POWER8E (raw) 0x4b0201 0xf000004 of:IBM,FW860.50 (SV860_146) hv:phyp pSeries
NIP: c0000000005991d0 LR: c0000000005991cc CTR: 0000000000000000
REGS: c0000000148c76a0 TRAP: 0700 Not tainted (6.5.0-rc3+)
MSR: 8000000000029033 <SF,EE,ME,IR,DR,RI,LE> CR: 24002242 XER: 0000000c
CFAR: c0000000001fbd34 IRQMASK: 0
[ ... GPRs omitted ... ]
NIP usercopy_abort+0xa0/0xb0
LR usercopy_abort+0x9c/0xb0
Call Trace:
usercopy_abort+0x9c/0xb0 (unreliable)
__check_heap_object+0x1b4/0x1d0
__check_object_size+0x2d0/0x380
rtas_flash_write+0xe4/0x250
proc_reg_write+0xfc/0x160
vfs_write+0xfc/0x4e0
ksys_write+0x90/0x160
system_call_exception+0x178/0x320
system_call_common+0x160/0x2c4The blocks of the firmware image are copied directly from user memory to objects allocated from flash_block_cache, so flash_block_cache must be created using kmem_cache_create_usercopy() to mark it safe for user access.
--- arch/powerpc/kernel/rtas_flash.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/kernel/rtas_flash.c +3 -3
@@ -710,9 +710,9 @@ static int __init rtas_flash_init(void)if (!rtas_validate_flash_data.buf)return -ENOMEM ; - flash_block_cache =kmem_cache_create ("rtas_flash_cache" , -RTAS_BLK_SIZE ,RTAS_BLK_SIZE ,0 , -NULL ); + flash_block_cache =kmem_cache_create_usercopy ("rtas_flash_cache" , +RTAS_BLK_SIZE ,RTAS_BLK_SIZE , +0 ,0 ,RTAS_BLK_SIZE ,NULL );if (!flash_block_cache) {printk (KERN_ERR "%s: failed to create block cache\n" , __func__);
Greg Kroah-Hartman
maintainerPATCH 74/139 tty: n_gsm: fix the UAF caused by race condition in gsm_cleanup_mux
In reply to Greg Kroah-HartmanFrom: Yi Yang <[email protected]>
commit 3c4f8333b582487a2d1e02171f1465531cde53e3 upstream.
In commit 9b9c8195f3f0 ("tty: n_gsm: fix UAF in gsm_cleanup_mux"), the UAF problem is not completely fixed. There is a race condition in gsm_cleanup_mux(), which caused this UAF.
The UAF problem is triggered by the following race:
task[5046] task[5054]
----------------------- -----------------------gsm_cleanup_mux();
dlci = gsm->dlci[0];
mutex_lock(&gsm->mutex);
gsm_cleanup_mux();
dlci = gsm->dlci[0]; //Didn't take the lock
gsm_dlci_release(gsm->dlci[i]);
gsm->dlci[i] = NULL;
mutex_unlock(&gsm->mutex);
mutex_lock(&gsm->mutex);
dlci->dead = true; //UAFFix it by assigning values after mutex_lock().
--- drivers/tty/n_gsm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/tty/n_gsm.c +2 -1
@@ -2387,12 +2387,13 @@ static void gsm_error(struct gsm_mux *gsstatic void gsm_cleanup_mux (struct gsm_mux *gsm,bool disc) {int i; -struct gsm_dlci *dlci = gsm->dlci[0 ]; +struct gsm_dlci *dlci;struct gsm_msg *txq, *ntxq; gsm->dead = true;mutex_lock (&gsm->mutex); + dlci = gsm->dlci[0 ];if (dlci) {if (disc && dlci->state !=DLCI_CLOSED ) {gsm_dlci_begin_close (dlci);
Greg Kroah-Hartman
maintainerPATCH 75/139 tty: serial: fsl_lpuart: Clear the error flags by writing 1 for lpuart32 platforms
In reply to Greg Kroah-HartmanFrom: Sherry Sun <[email protected]>
commit 282069845af388b08d622ad192b831dcd0549c62 upstream.
Do not read the data register to clear the error flags for lpuart32 platforms, the additional read may cause the receive FIFO underflow since the DMA has already read the data register. Actually all lpuart32 platforms support write 1 to clear those error bits, let's use this method to better clear the error flags.
--- drivers/tty/serial/fsl_lpuart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/tty/serial/fsl_lpuart.c +2 -2
@@ -1107,8 +1107,8 @@ static void lpuart_copy_rx_to_tty(structunsigned long sr =lpuart32_read (&sport->port,UARTSTAT );if (sr & (UARTSTAT_PE |UARTSTAT_FE )) { -/* Read DR to clear the error flags */ -lpuart32_read (&sport->port,UARTDATA ); +/* Clear the error flags */ +lpuart32_write (&sport->port, sr,UARTSTAT );if (sr &UARTSTAT_PE ) sport->port.icount.parity++;
Greg Kroah-Hartman
maintainerPATCH 76/139 btrfs: fix BUG_ON condition in btrfs_cancel_balance
In reply to Greg Kroah-HartmanFrom: xiaoshoukui <[email protected]>
commit 29eefa6d0d07e185f7bfe9576f91e6dba98189c2 upstream.
Pausing and canceling balance can race to interrupt balance lead to BUG_ON panic in btrfs_cancel_balance. The BUG_ON condition in btrfs_cancel_balance does not take this race scenario into account.
However, the race condition has no other side effects. We can fix that.
Reproducing it with panic trace like this:
kernel BUG at fs/btrfs/volumes.c:4618!
RIP: 0010:btrfs_cancel_balance+0x5cf/0x6a0 Call Trace: <TASK> ? do_nanosleep+0x60/0x120 ? hrtimer_nanosleep+0xb7/0x1a0 ? sched_core_clone_cookie+0x70/0x70 btrfs_ioctl_balance_ctl+0x55/0x70 btrfs_ioctl+0xa46/0xd20 __x64_sys_ioctl+0x7d/0xa0 do_syscall_64+0x38/0x80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
Race scenario as follows:
> mutex_unlock(&fs_info->balance_mutex);
> --------------------
> .......issue pause and cancel req in another thread
> --------------------
> ret = __btrfs_balance(fs_info);
>
> mutex_lock(&fs_info->balance_mutex);
> if (ret == -ECANCELED && atomic_read(&fs_info->balance_pause_req)) {
> btrfs_info(fs_info, "balance: paused");
> btrfs_exclop_balance(fs_info, BTRFS_EXCLOP_BALANCE_PAUSED);
> }--- fs/btrfs/volumes.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/btrfs/volumes.c +1 -2
@@ -4636,8 +4636,7 @@ int btrfs_cancel_balance(struct btrfs_fs } } -BUG_ON (fs_info->balance_ctl || -test_bit (BTRFS_FS_BALANCE_RUNNING , &fs_info->flags)); +ASSERT (!test_bit (BTRFS_FS_BALANCE_RUNNING , &fs_info->flags));atomic_dec (&fs_info->balance_cancel_req);mutex_unlock (&fs_info->balance_mutex);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 77/139 i2c: designware: Correct length byte validation logic
In reply to Greg Kroah-HartmanFrom: Quan Nguyen <[email protected]>
commit 49d4db3953cb9004ff94efc0c176e026c820af5a upstream.
Commit 0daede80f870 ("i2c: designware: Convert driver to using regmap API") changes the logic to validate the whole 32-bit return value of DW_IC_DATA_CMD register instead of 8-bit LSB without reason.
Later, commit f53f15ba5a85 ("i2c: designware: Get right data length"), introduced partial fix but not enough because the "tmp > 0" still test tmp as 32-bit value and is wrong in case the IC_DATA_CMD[11] is set.
Revert the logic to just before commit 0daede80f870 ("i2c: designware: Convert driver to using regmap API").
--- drivers/i2c/busses/i2c-designware-master.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-designware-master.c +2 -1
@@ -525,9 +525,10 @@ i2c_dw_read(struct dw_i2c_dev *dev)u32 flags = msgs[dev->msg_read_idx].flags;regmap_read (dev->map,DW_IC_DATA_CMD , &tmp); + tmp &=DW_IC_DATA_CMD_DAT ;/* Ensure length byte is a valid value */ if (flags &I2C_M_RECV_LEN && - (tmp &DW_IC_DATA_CMD_DAT ) <=I2C_SMBUS_BLOCK_MAX && tmp >0 ) { + tmp <=I2C_SMBUS_BLOCK_MAX && tmp >0 ) { len =i2c_dw_recv_len (dev, tmp); } *buf++ = tmp;
Greg Kroah-Hartman
maintainerPATCH 78/139 i2c: designware: Handle invalid SMBus block data response length value
In reply to Greg Kroah-HartmanFrom: Tam Nguyen <[email protected]>
commit 69f035c480d76f12bf061148ccfd578e1099e5fc upstream.
In the I2C_FUNC_SMBUS_BLOCK_DATA case, the invalid length byte value (outside of 1-32) of the SMBus block data response from the Slave device is not correctly handled by the I2C Designware driver.
In case IC_EMPTYFIFO_HOLD_MASTER_EN==1, which cannot be detected from the registers, the Master can be disabled only if the STOP bit is set. Without STOP bit set, the Master remains active, holding the bus until receiving a block data response length. This hangs the bus and is unrecoverable.
Avoid this by issuing another dump read to reach the stop condition when an invalid length byte is received.
--- drivers/i2c/busses/i2c-designware-master.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-designware-master.c +13 -2
@@ -527,8 +527,19 @@ i2c_dw_read(struct dw_i2c_dev *dev)regmap_read (dev->map,DW_IC_DATA_CMD , &tmp); tmp &=DW_IC_DATA_CMD_DAT ;/* Ensure length byte is a valid value */ -if (flags &I2C_M_RECV_LEN && - tmp <=I2C_SMBUS_BLOCK_MAX && tmp >0 ) { +if (flags &I2C_M_RECV_LEN ) { +/* +* if IC_EMPTYFIFO_HOLD_MASTER_EN is set, which cannot be +* detected from the registers, the controller can be +* disabled if the STOP bit is set. But it is only set +* after receiving block data response length in +* I2C_FUNC_SMBUS_BLOCK_DATA case. That needs to read +* another byte with STOP bit set when the block data +* response length is invalid to complete the transaction. +*/ +if (!tmp || tmp >I2C_SMBUS_BLOCK_MAX ) + tmp =1 ; + len =i2c_dw_recv_len (dev, tmp); } *buf++ = tmp;
Greg Kroah-Hartman
maintainerPATCH 79/139 net: xfrm: Fix xfrm_address_filter OOB read
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit dfa73c17d55b921e1d4e154976de35317e43a93a ]
We found below OOB crash:
[ 44.211730] ================================================================== [ 44.212045] BUG: KASAN: slab-out-of-bounds in memcmp+0x8b/0xb0 [ 44.212045] Read of size 8 at addr ffff88800870f320 by task poc.xfrm/97 [ 44.212045] [ 44.212045] CPU: 0 PID: 97 Comm: poc.xfrm Not tainted 6.4.0-rc7-00072-gdad9774deaf1-dirty #4 [ 44.212045] Call Trace: [ 44.212045] <TASK> [ 44.212045] dump_stack_lvl+0x37/0x50 [ 44.212045] print_report+0xcc/0x620 [ 44.212045] ? __virt_addr_valid+0xf3/0x170 [ 44.212045] ? memcmp+0x8b/0xb0 [ 44.212045] kasan_report+0xb2/0xe0 [ 44.212045] ? memcmp+0x8b/0xb0 [ 44.212045] kasan_check_range+0x39/0x1c0 [ 44.212045] memcmp+0x8b/0xb0 [ 44.212045] xfrm_state_walk+0x21c/0x420 [ 44.212045] ? __pfx_dump_one_state+0x10/0x10 [ 44.212045] xfrm_dump_sa+0x1e2/0x290 [ 44.212045] ? __pfx_xfrm_dump_sa+0x10/0x10 [ 44.212045] ? __kernel_text_address+0xd/0x40 [ 44.212045] ? kasan_unpoison+0x27/0x60 [ 44.212045] ? mutex_lock+0x60/0xe0 [ 44.212045] ? __pfx_mutex_lock+0x10/0x10 [ 44.212045] ? kasan_save_stack+0x22/0x50 [ 44.212045] netlink_dump+0x322/0x6c0 [ 44.212045] ? __pfx_netlink_dump+0x10/0x10 [ 44.212045] ? mutex_unlock+0x7f/0xd0 [ 44.212045] ? __pfx_mutex_unlock+0x10/0x10 [ 44.212045] __netlink_dump_start+0x353/0x430 [ 44.212045] xfrm_user_rcv_msg+0x3a4/0x410 [ 44.212045] ? __pfx__raw_spin_lock_irqsave+0x10/0x10 [ 44.212045] ? __pfx_xfrm_user_rcv_msg+0x10/0x10 [ 44.212045] ? __pfx_xfrm_dump_sa+0x10/0x10 [ 44.212045] ? __pfx_xfrm_dump_sa_done+0x10/0x10 [ 44.212045] ? __stack_depot_save+0x382/0x4e0 [ 44.212045] ? filter_irq_stacks+0x1c/0x70 [ 44.212045] ? kasan_save_stack+0x32/0x50 [ 44.212045] ? kasan_save_stack+0x22/0x50 [ 44.212045] ? kasan_set_track+0x25/0x30 [ 44.212045] ? __kasan_slab_alloc+0x59/0x70 [ 44.212045] ? kmem_cache_alloc_node+0xf7/0x260 [ 44.212045] ? kmalloc_reserve+0xab/0x120 [ 44.212045] ? __alloc_skb+0xcf/0x210 [ 44.212045] ? netlink_sendmsg+0x509/0x700 [ 44.212045] ? sock_sendmsg+0xde/0xe0 [ 44.212045] ? __sys_sendto+0x18d/0x230 [ 44.212045] ? __x64_sys_sendto+0x71/0x90 [ 44.212045] ? do_syscall_64+0x3f/0x90 [ 44.212045] ? entry_SYSCALL_64_after_hwframe+0x72/0xdc [ 44.212045] ? netlink_sendmsg+0x509/0x700 [ 44.212045] ? sock_sendmsg+0xde/0xe0 [ 44.212045] ? __sys_sendto+0x18d/0x230 [ 44.212045] ? __x64_sys_sendto+0x71/0x90 [ 44.212045] ? do_syscall_64+0x3f/0x90 [ 44.212045] ? entry_SYSCALL_64_after_hwframe+0x72/0xdc [ 44.212045] ? kasan_save_stack+0x22/0x50 [ 44.212045] ? kasan_set_track+0x25/0x30 [ 44.212045] ? kasan_save_free_info+0x2e/0x50 [ 44.212045] ? __kasan_slab_free+0x10a/0x190 [ 44.212045] ? kmem_cache_free+0x9c/0x340 [ 44.212045] ? netlink_recvmsg+0x23c/0x660 [ 44.212045] ? sock_recvmsg+0xeb/0xf0 [ 44.212045] ? __sys_recvfrom+0x13c/0x1f0 [ 44.212045] ? __x64_sys_recvfrom+0x71/0x90 [ 44.212045] ? do_syscall_64+0x3f/0x90 [ 44.212045] ? entry_SYSCALL_64_after_hwframe+0x72/0xdc [ 44.212045] ? copyout+0x3e/0x50 [ 44.212045] netlink_rcv_skb+0xd6/0x210 [ 44.212045] ? __pfx_xfrm_user_rcv_msg+0x10/0x10 [ 44.212045] ? __pfx_netlink_rcv_skb+0x10/0x10 [ 44.212045] ? __pfx_sock_has_perm+0x10/0x10 [ 44.212045] ? mutex_lock+0x8d/0xe0 [ 44.212045] ? __pfx_mutex_lock+0x10/0x10 [ 44.212045] xfrm_netlink_rcv+0x44/0x50 [ 44.212045] netlink_unicast+0x36f/0x4c0 [ 44.212045] ? __pfx_netlink_unicast+0x10/0x10 [ 44.212045] ? netlink_recvmsg+0x500/0x660 [ 44.212045] netlink_sendmsg+0x3b7/0x700 [ 44.212045] ? __pfx_netlink_sendmsg+0x10/0x10 [ 44.212045] ? __pfx_netlink_sendmsg+0x10/0x10 [ 44.212045] sock_sendmsg+0xde/0xe0 [ 44.212045] __sys_sendto+0x18d/0x230 [ 44.212045] ? __pfx___sys_sendto+0x10/0x10 [ 44.212045] ? rcu_core+0x44a/0xe10 [ 44.212045] ? __rseq_handle_notify_resume+0x45b/0x740 [ 44.212045] ? _raw_spin_lock_irq+0x81/0xe0 [ 44.212045] ? __pfx___rseq_handle_notify_resume+0x10/0x10 [ 44.212045] ? __pfx_restore_fpregs_from_fpstate+0x10/0x10 [ 44.212045] ? __pfx_blkcg_maybe_throttle_current+0x10/0x10 [ 44.212045] ? __pfx_task_work_run+0x10/0x10 [ 44.212045] __x64_sys_sendto+0x71/0x90 [ 44.212045] do_syscall_64+0x3f/0x90 [ 44.212045] entry_SYSCALL_64_after_hwframe+0x72/0xdc [ 44.212045] RIP: 0033:0x44b7da [ 44.212045] RSP: 002b:00007ffdc8838548 EFLAGS: 00000246 ORIG_RAX: 000000000000002c [ 44.212045] RAX: ffffffffffffffda RBX: 00007ffdc8839978 RCX: 000000000044b7da [ 44.212045] RDX: 0000000000000038 RSI: 00007ffdc8838770 RDI: 0000000000000003 [ 44.212045] RBP: 00007ffdc88385b0 R08: 00007ffdc883858c R09: 000000000000000c [ 44.212045] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000001 [ 44.212045] R13: 00007ffdc8839968 R14: 00000000004c37d0 R15: 0000000000000001 [ 44.212045] </TASK> [ 44.212045] [ 44.212045] Allocated by task 97: [ 44.212045] kasan_save_stack+0x22/0x50 [ 44.212045] kasan_set_track+0x25/0x30 [ 44.212045] __kasan_kmalloc+0x7f/0x90 [ 44.212045] __kmalloc_node_track_caller+0x5b/0x140 [ 44.212045] kmemdup+0x21/0x50 [ 44.212045] xfrm_dump_sa+0x17d/0x290 [ 44.212045] netlink_dump+0x322/0x6c0 [ 44.212045] __netlink_dump_start+0x353/0x430 [ 44.212045] xfrm_user_rcv_msg+0x3a4/0x410 [ 44.212045] netlink_rcv_skb+0xd6/0x210 [ 44.212045] xfrm_netlink_rcv+0x44/0x50 [ 44.212045] netlink_unicast+0x36f/0x4c0 [ 44.212045] netlink_sendmsg+0x3b7/0x700 [ 44.212045] sock_sendmsg+0xde/0xe0 [ 44.212045] __sys_sendto+0x18d/0x230 [ 44.212045] __x64_sys_sendto+0x71/0x90 [ 44.212045] do_syscall_64+0x3f/0x90 [ 44.212045] entry_SYSCALL_64_after_hwframe+0x72/0xdc [ 44.212045] [ 44.212045] The buggy address belongs to the object at ffff88800870f300 [ 44.212045] which belongs to the cache kmalloc-64 of size 64 [ 44.212045] The buggy address is located 32 bytes inside of [ 44.212045] allocated 36-byte region [ffff88800870f300, ffff88800870f324) [ 44.212045] [ 44.212045] The buggy address belongs to the physical page: [ 44.212045] page:00000000e4de16ee refcount:1 mapcount:0 mapping:000000000 ... [ 44.212045] flags: 0x100000000000200(slab|node=0|zone=1) [ 44.212045] page_type: 0xffffffff() [ 44.212045] raw: 0100000000000200 ffff888004c41640 dead000000000122 0000000000000000 [ 44.212045] raw: 0000000000000000 0000000080200020 00000001ffffffff 0000000000000000 [ 44.212045] page dumped because: kasan: bad access detected [ 44.212045] [ 44.212045] Memory state around the buggy address: [ 44.212045] ffff88800870f200: fa fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc [ 44.212045] ffff88800870f280: 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc fc [ 44.212045] >ffff88800870f300: 00 00 00 00 04 fc fc fc fc fc fc fc fc fc fc fc [ 44.212045] ^ [ 44.212045] ffff88800870f380: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 44.212045] ffff88800870f400: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 44.212045] ==================================================================
By investigating the code, we find the root cause of this OOB is the lack of checks in xfrm_dump_sa(). The buggy code allows a malicious user to pass arbitrary value of filter->splen/dplen. Hence, with crafted xfrm states, the attacker can achieve 8 bytes heap OOB read, which causes info leak.
if (attrs[XFRMA_ADDRESS_FILTER]) {
filter = kmemdup(nla_data(attrs[XFRMA_ADDRESS_FILTER]),
sizeof(*filter), GFP_KERNEL);
if (filter == NULL)
return -ENOMEM;
// NO MORE CHECKS HERE !!!
}This patch fixes the OOB by adding necessary boundary checks, just like the code in pfkey_dump() function.
--- net/xfrm/xfrm_user.c | 9 +++++++++ 1 file changed, 9 insertions(+)
net/xfrm/xfrm_user.c +9 -0
@@ -1159,6 +1159,15 @@ static int xfrm_dump_sa(struct sk_buff *skb, struct netlink_callback *cb) sizeof(*filter), GFP_KERNEL);if (filter ==NULL )return -ENOMEM ; + +/* see addr_match(), (prefix length >> 5) << 2 +* will be used to compare xfrm_address_t +*/ +if (filter->splen > (sizeof (xfrm_address_t) <<3 ) || + filter->dplen > (sizeof (xfrm_address_t) <<3 )) { +kfree (filter); +return -EINVAL ; + } }if (attrs[XFRMA_PROTO ])
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 80/139 net: af_key: fix sadb_x_filter validation
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit 75065a8929069bc93181848818e23f147a73f83a ]
When running xfrm_state_walk_init(), the xfrm_address_filter being used is okay to have a splen/dplen that equals to sizeof(xfrm_address_t)<<3. This commit replaces >= to > to make sure the boundary checking is correct.
--- net/key/af_key.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/key/af_key.c +2 -2
@@ -1848,9 +1848,9 @@ static int pfkey_dump(struct sock *sk, struct sk_buff *skb, const struct sadb_msif (ext_hdrs[SADB_X_EXT_FILTER -1 ]) {struct sadb_x_filter *xfilter = ext_hdrs[SADB_X_EXT_FILTER -1 ]; -if ((xfilter->sadb_x_filter_splen >= +if ((xfilter->sadb_x_filter_splen > (sizeof (xfrm_address_t) <<3 )) || - (xfilter->sadb_x_filter_dplen >= + (xfilter->sadb_x_filter_dplen > (sizeof (xfrm_address_t) <<3 ))) {mutex_unlock (&pfk->dump_lock);return -EINVAL ;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 81/139 net: xfrm: Amend XFRMA_SEC_CTX nla_policy structure
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit d1e0e61d617ba17aa516db707aa871387566bbf7 ]
According to all consumers code of attrs[XFRMA_SEC_CTX], like
* verify_sec_ctx_len(), convert to xfrm_user_sec_ctx*
* xfrm_state_construct(), call security_xfrm_state_alloc whose prototype is int security_xfrm_state_alloc(.., struct xfrm_user_sec_ctx *sec_ctx);
* copy_from_user_sec_ctx(), convert to xfrm_user_sec_ctx *
...
It seems that the expected parsing result for XFRMA_SEC_CTX should be structure xfrm_user_sec_ctx, and the current xfrm_sec_ctx is confusing and misleading (Luckily, they happen to have same size 8 bytes).
This commit amend the policy structure to xfrm_user_sec_ctx to avoid ambiguity.
--- net/xfrm/xfrm_compat.c | 2 +- net/xfrm/xfrm_user.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/xfrm/xfrm_compat.c +1 -1
@@ -108,7 +108,7 @@ static const struct nla_policy compat_policy[XFRMA_MAX+1] = { [XFRMA_ALG_COMP] = { .len = sizeof(struct xfrm_algo) }, [XFRMA_ENCAP] = { .len = sizeof(struct xfrm_encap_tmpl) }, [XFRMA_TMPL] = { .len = sizeof(struct xfrm_user_tmpl) }, - [XFRMA_SEC_CTX] = { .len = sizeof(struct xfrm_sec_ctx) }, + [XFRMA_SEC_CTX] = { .len = sizeof(struct xfrm_user_sec_ctx) }, [XFRMA_LTIME_VAL] = { .len = sizeof(struct xfrm_lifetime_cur) }, [XFRMA_REPLAY_VAL] = { .len = sizeof(struct xfrm_replay_state) }, [XFRMA_REPLAY_THRESH] = { .type = NLA_U32 },
net/xfrm/xfrm_user.c +1 -1
@@ -2834,7 +2834,7 @@ const struct nla_policy xfrma_policy[XFRMA_MAX+1] = { [XFRMA_ALG_COMP] = { .len = sizeof(struct xfrm_algo) }, [XFRMA_ENCAP] = { .len = sizeof(struct xfrm_encap_tmpl) }, [XFRMA_TMPL] = { .len = sizeof(struct xfrm_user_tmpl) }, - [XFRMA_SEC_CTX] = { .len = sizeof(struct xfrm_sec_ctx) }, + [XFRMA_SEC_CTX] = { .len = sizeof(struct xfrm_user_sec_ctx) }, [XFRMA_LTIME_VAL] = { .len = sizeof(struct xfrm_lifetime_cur) }, [XFRMA_REPLAY_VAL] = { .len = sizeof(struct xfrm_replay_state) }, [XFRMA_REPLAY_THRESH] = { .type = NLA_U32 },
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 82/139 xfrm: fix slab-use-after-free in decode_session6
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 53223f2ed1ef5c90dad814daaaefea4e68a933c8 ]
When the xfrm device is set to the qdisc of the sfb type, the cb field of the sent skb may be modified during enqueuing. Then, slab-use-after-free may occur when the xfrm device sends IPv6 packets.
The stack information is as follows:
BUG: KASAN: slab-use-after-free in decode_session6+0x103f/0x1890 Read of size 1 at addr ffff8881111458ef by task swapper/3/0 CPU: 3 PID: 0 Comm: swapper/3 Not tainted 6.4.0-next-20230707 #409 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1.fc33 04/01/2014 Call Trace: <IRQ> dump_stack_lvl+0xd9/0x150 print_address_description.constprop.0+0x2c/0x3c0 kasan_report+0x11d/0x130 decode_session6+0x103f/0x1890 __xfrm_decode_session+0x54/0xb0 xfrmi_xmit+0x173/0x1ca0 dev_hard_start_xmit+0x187/0x700 sch_direct_xmit+0x1a3/0xc30 __qdisc_run+0x510/0x17a0 __dev_queue_xmit+0x2215/0x3b10 neigh_connected_output+0x3c2/0x550 ip6_finish_output2+0x55a/0x1550 ip6_finish_output+0x6b9/0x1270 ip6_output+0x1f1/0x540 ndisc_send_skb+0xa63/0x1890 ndisc_send_rs+0x132/0x6f0 addrconf_rs_timer+0x3f1/0x870 call_timer_fn+0x1a0/0x580 expire_timers+0x29b/0x4b0 run_timer_softirq+0x326/0x910 __do_softirq+0x1d4/0x905 irq_exit_rcu+0xb7/0x120 sysvec_apic_timer_interrupt+0x97/0xc0 </IRQ> <TASK> asm_sysvec_apic_timer_interrupt+0x1a/0x20 RIP: 0010:intel_idle_hlt+0x23/0x30 Code: 1f 84 00 00 00 00 00 f3 0f 1e fa 41 54 41 89 d4 0f 1f 44 00 00 66 90 0f 1f 44 00 00 0f 00 2d c4 9f ab 00 0f 1f 44 00 00 fb f4 <fa> 44 89 e0 41 5c c3 66 0f 1f 44 00 00 f3 0f 1e fa 41 54 41 89 d4 RSP: 0018:ffffc90000197d78 EFLAGS: 00000246 RAX: 00000000000a83c3 RBX: ffffe8ffffd09c50 RCX: ffffffff8a22d8e5 RDX: 0000000000000001 RSI: ffffffff8d3f8080 RDI: ffffe8ffffd09c50 RBP: ffffffff8d3f8080 R08: 0000000000000001 R09: ffffed1026ba6d9d R10: ffff888135d36ceb R11: 0000000000000001 R12: 0000000000000001 R13: ffffffff8d3f8100 R14: 0000000000000001 R15: 0000000000000000 cpuidle_enter_state+0xd3/0x6f0 cpuidle_enter+0x4e/0xa0 do_idle+0x2fe/0x3c0 cpu_startup_entry+0x18/0x20 start_secondary+0x200/0x290 secondary_startup_64_no_verify+0x167/0x16b </TASK> Allocated by task 939: kasan_save_stack+0x22/0x40 kasan_set_track+0x25/0x30 __kasan_slab_alloc+0x7f/0x90 kmem_cache_alloc_node+0x1cd/0x410 kmalloc_reserve+0x165/0x270 __alloc_skb+0x129/0x330 inet6_ifa_notify+0x118/0x230 __ipv6_ifa_notify+0x177/0xbe0 addrconf_dad_completed+0x133/0xe00 addrconf_dad_work+0x764/0x1390 process_one_work+0xa32/0x16f0 worker_thread+0x67d/0x10c0 kthread+0x344/0x440 ret_from_fork+0x1f/0x30 The buggy address belongs to the object at ffff888111145800
which belongs to the cache skbuff_small_head of size 640 The buggy address is located 239 bytes inside of freed 640-byte region [ffff888111145800, ffff888111145a80)
As commit f855691975bb ("xfrm6: Fix the nexthdr offset in _decode_session6.") showed, xfrm_decode_session was originally intended only for the receive path. IP6CB(skb)->nhoff is not set during transmission. Therefore, set the cb field in the skb to 0 before sending packets.
--- net/xfrm/xfrm_interface_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/xfrm/xfrm_interface_core.c +2 -2
@@ -399,8 +399,8 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev)switch (skb->protocol) {case htons (ETH_P_IPV6 ): -xfrm_decode_session (skb, &fl,AF_INET6 );memset (IP6CB (skb),0 ,sizeof (*IP6CB (skb))); +xfrm_decode_session (skb, &fl,AF_INET6 );if (!dst) { fl.u.ip6.flowi6_oif = dev->ifindex; fl.u.ip6.flowi6_flags |=FLOWI_FLAG_ANYSRC ;
@@ -414,8 +414,8 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev) }break ;case htons (ETH_P_IP ): -xfrm_decode_session (skb, &fl,AF_INET );memset (IPCB (skb),0 ,sizeof (*IPCB (skb))); +xfrm_decode_session (skb, &fl,AF_INET );if (!dst) {struct rtable *rt;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 83/139 ip6_vti: fix slab-use-after-free in decode_session6
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 9fd41f1ba638938c9a1195d09bc6fa3be2712f25 ]
When ipv6_vti device is set to the qdisc of the sfb type, the cb field of the sent skb may be modified during enqueuing. Then, slab-use-after-free may occur when ipv6_vti device sends IPv6 packets.
The stack information is as follows:
BUG: KASAN: slab-use-after-free in decode_session6+0x103f/0x1890 Read of size 1 at addr ffff88802e08edc2 by task swapper/0/0 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 6.4.0-next-20230707-00001-g84e2cad7f979 #410 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1.fc33 04/01/2014 Call Trace: <IRQ> dump_stack_lvl+0xd9/0x150 print_address_description.constprop.0+0x2c/0x3c0 kasan_report+0x11d/0x130 decode_session6+0x103f/0x1890 __xfrm_decode_session+0x54/0xb0 vti6_tnl_xmit+0x3e6/0x1ee0 dev_hard_start_xmit+0x187/0x700 sch_direct_xmit+0x1a3/0xc30 __qdisc_run+0x510/0x17a0 __dev_queue_xmit+0x2215/0x3b10 neigh_connected_output+0x3c2/0x550 ip6_finish_output2+0x55a/0x1550 ip6_finish_output+0x6b9/0x1270 ip6_output+0x1f1/0x540 ndisc_send_skb+0xa63/0x1890 ndisc_send_rs+0x132/0x6f0 addrconf_rs_timer+0x3f1/0x870 call_timer_fn+0x1a0/0x580 expire_timers+0x29b/0x4b0 run_timer_softirq+0x326/0x910 __do_softirq+0x1d4/0x905 irq_exit_rcu+0xb7/0x120 sysvec_apic_timer_interrupt+0x97/0xc0 </IRQ> Allocated by task 9176: kasan_save_stack+0x22/0x40 kasan_set_track+0x25/0x30 __kasan_slab_alloc+0x7f/0x90 kmem_cache_alloc_node+0x1cd/0x410 kmalloc_reserve+0x165/0x270 __alloc_skb+0x129/0x330 netlink_sendmsg+0x9b1/0xe30 sock_sendmsg+0xde/0x190 ____sys_sendmsg+0x739/0x920 ___sys_sendmsg+0x110/0x1b0 __sys_sendmsg+0xf7/0x1c0 do_syscall_64+0x39/0xb0 entry_SYSCALL_64_after_hwframe+0x63/0xcd Freed by task 9176: kasan_save_stack+0x22/0x40 kasan_set_track+0x25/0x30 kasan_save_free_info+0x2b/0x40 ____kasan_slab_free+0x160/0x1c0 slab_free_freelist_hook+0x11b/0x220 kmem_cache_free+0xf0/0x490 skb_free_head+0x17f/0x1b0 skb_release_data+0x59c/0x850 consume_skb+0xd2/0x170 netlink_unicast+0x54f/0x7f0 netlink_sendmsg+0x926/0xe30 sock_sendmsg+0xde/0x190 ____sys_sendmsg+0x739/0x920 ___sys_sendmsg+0x110/0x1b0 __sys_sendmsg+0xf7/0x1c0 do_syscall_64+0x39/0xb0 entry_SYSCALL_64_after_hwframe+0x63/0xcd The buggy address belongs to the object at ffff88802e08ed00
which belongs to the cache skbuff_small_head of size 640 The buggy address is located 194 bytes inside of freed 640-byte region [ffff88802e08ed00, ffff88802e08ef80)
As commit f855691975bb ("xfrm6: Fix the nexthdr offset in _decode_session6.") showed, xfrm_decode_session was originally intended only for the receive path. IP6CB(skb)->nhoff is not set during transmission. Therefore, set the cb field in the skb to 0 before sending packets.
--- net/ipv6/ip6_vti.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv6/ip6_vti.c +2 -2
@@ -570,12 +570,12 @@ vti6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) vti6_addr_conflict(t, ipv6_hdr(skb))) goto tx_err; -xfrm_decode_session (skb, &fl,AF_INET6 );memset (IP6CB (skb),0 ,sizeof (*IP6CB (skb))); +xfrm_decode_session (skb, &fl,AF_INET6 );break ;case htons (ETH_P_IP ): -xfrm_decode_session (skb, &fl,AF_INET );memset (IPCB (skb),0 ,sizeof (*IPCB (skb))); +xfrm_decode_session (skb, &fl,AF_INET );break ;default : goto tx_err;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 84/139 ip_vti: fix potential slab-use-after-free in decode_session6
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 6018a266279b1a75143c7c0804dd08a5fc4c3e0b ]
When ip_vti device is set to the qdisc of the sfb type, the cb field of the sent skb may be modified during enqueuing. Then, slab-use-after-free may occur when ip_vti device sends IPv6 packets. As commit f855691975bb ("xfrm6: Fix the nexthdr offset in _decode_session6.") showed, xfrm_decode_session was originally intended only for the receive path. IP6CB(skb)->nhoff is not set during transmission. Therefore, set the cb field in the skb to 0 before sending packets.
--- net/ipv4/ip_vti.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/ip_vti.c +2 -2
@@ -287,12 +287,12 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)switch (skb->protocol) {case htons (ETH_P_IP ): -xfrm_decode_session (skb, &fl,AF_INET );memset (IPCB (skb),0 ,sizeof (*IPCB (skb))); +xfrm_decode_session (skb, &fl,AF_INET );break ;case htons (ETH_P_IPV6 ): -xfrm_decode_session (skb, &fl,AF_INET6 );memset (IP6CB (skb),0 ,sizeof (*IP6CB (skb))); +xfrm_decode_session (skb, &fl,AF_INET6 );break ;default : goto tx_err;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 85/139 xfrm: add NULL check in xfrm_update_ae_params
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit 00374d9b6d9f932802b55181be9831aa948e5b7c ]
Normally, x->replay_esn and x->preplay_esn should be allocated at xfrm_alloc_replay_state_esn(...) in xfrm_state_construct(...), hence the xfrm_update_ae_params(...) is okay to update them. However, the current implementation of xfrm_new_ae(...) allows a malicious user to directly dereference a NULL pointer and crash the kernel like below.
BUG: kernel NULL pointer dereference, address: 0000000000000000 PGD 8253067 P4D 8253067 PUD 8e0e067 PMD 0 Oops: 0002 [#1] PREEMPT SMP KASAN NOPTI CPU: 0 PID: 98 Comm: poc.npd Not tainted 6.4.0-rc7-00072-gdad9774deaf1 #8 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.o4 RIP: 0010:memcpy_orig+0xad/0x140 Code: e8 4c 89 5f e0 48 8d 7f e0 73 d2 83 c2 20 48 29 d6 48 29 d7 83 fa 10 72 34 4c 8b 06 4c 8b 4e 08 c RSP: 0018:ffff888008f57658 EFLAGS: 00000202 RAX: 0000000000000000 RBX: ffff888008bd0000 RCX: ffffffff8238e571 RDX: 0000000000000018 RSI: ffff888007f64844 RDI: 0000000000000000 RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: ffff888008f57818 R13: ffff888007f64aa4 R14: 0000000000000000 R15: 0000000000000000 FS: 00000000014013c0(0000) GS:ffff88806d600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000000 CR3: 00000000054d8000 CR4: 00000000000006f0 Call Trace: <TASK> ? __die+0x1f/0x70 ? page_fault_oops+0x1e8/0x500 ? __pfx_is_prefetch.constprop.0+0x10/0x10 ? __pfx_page_fault_oops+0x10/0x10 ? _raw_spin_unlock_irqrestore+0x11/0x40 ? fixup_exception+0x36/0x460 ? _raw_spin_unlock_irqrestore+0x11/0x40 ? exc_page_fault+0x5e/0xc0 ? asm_exc_page_fault+0x26/0x30 ? xfrm_update_ae_params+0xd1/0x260 ? memcpy_orig+0xad/0x140 ? __pfx__raw_spin_lock_bh+0x10/0x10 xfrm_update_ae_params+0xe7/0x260 xfrm_new_ae+0x298/0x4e0 ? __pfx_xfrm_new_ae+0x10/0x10 ? __pfx_xfrm_new_ae+0x10/0x10 xfrm_user_rcv_msg+0x25a/0x410 ? __pfx_xfrm_user_rcv_msg+0x10/0x10 ? __alloc_skb+0xcf/0x210 ? stack_trace_save+0x90/0xd0 ? filter_irq_stacks+0x1c/0x70 ? __stack_depot_save+0x39/0x4e0 ? __kasan_slab_free+0x10a/0x190 ? kmem_cache_free+0x9c/0x340 ? netlink_recvmsg+0x23c/0x660 ? sock_recvmsg+0xeb/0xf0 ? __sys_recvfrom+0x13c/0x1f0 ? __x64_sys_recvfrom+0x71/0x90 ? do_syscall_64+0x3f/0x90 ? entry_SYSCALL_64_after_hwframe+0x72/0xdc ? copyout+0x3e/0x50 netlink_rcv_skb+0xd6/0x210 ? __pfx_xfrm_user_rcv_msg+0x10/0x10 ? __pfx_netlink_rcv_skb+0x10/0x10 ? __pfx_sock_has_perm+0x10/0x10 ? mutex_lock+0x8d/0xe0 ? __pfx_mutex_lock+0x10/0x10 xfrm_netlink_rcv+0x44/0x50 netlink_unicast+0x36f/0x4c0 ? __pfx_netlink_unicast+0x10/0x10 ? netlink_recvmsg+0x500/0x660 netlink_sendmsg+0x3b7/0x700
This Null-ptr-deref bug is assigned CVE-2023-3772. And this commit adds additional NULL check in xfrm_update_ae_params to fix the NPD.
--- net/xfrm/xfrm_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/xfrm/xfrm_user.c +1 -1
@@ -527,7 +527,7 @@ static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs,struct nlattr *rt = attrs[XFRMA_REPLAY_THRESH ];struct nlattr *mt = attrs[XFRMA_MTIMER_THRESH ]; -if (re) { +if (re && x->replay_esn && x->preplay_esn) {struct xfrm_replay_state_esn *replay_esn; replay_esn =nla_data (re); memcpy(x->replay_esn, replay_esn,
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 86/139 xfrm: add forgotten nla_policy for XFRMA_MTIMER_THRESH
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit 5e2424708da7207087934c5c75211e8584d553a0 ]
The previous commit 4e484b3e969b ("xfrm: rate limit SA mapping change message to user space") added one additional attribute named XFRMA_MTIMER_THRESH and described its type at compat_policy (net/xfrm/xfrm_compat.c).
However, the author forgot to also describe the nla_policy at xfrma_policy (net/xfrm/xfrm_user.c). Hence, this suppose NLA_U32 (4 bytes) value can be faked as empty (0 bytes) by a malicious user, which leads to 4 bytes overflow read and heap information leak when parsing nlattrs.
To exploit this, one malicious user can spray the SLUB objects and then leverage this 4 bytes OOB read to leak the heap data into x->mapping_maxage (see xfrm_update_ae_params(...)), and leak it to userspace via copy_to_user_state_extra(...).
The above bug is assigned CVE-2023-3773. To fix it, this commit just completes the nla_policy description for XFRMA_MTIMER_THRESH, which enforces the length check and avoids such OOB read.
--- net/xfrm/xfrm_user.c | 1 + 1 file changed, 1 insertion(+)
net/xfrm/xfrm_user.c +1 -0
@@ -2854,6 +2854,7 @@ const struct nla_policy xfrma_policy[XFRMA_MAX+1] = { [XFRMA_SET_MARK] = { .type = NLA_U32 }, [XFRMA_SET_MARK_MASK] = { .type = NLA_U32 }, [XFRMA_IF_ID] = { .type = NLA_U32 }, + [XFRMA_MTIMER_THRESH ] = { .type =NLA_U32 }, };EXPORT_SYMBOL_GPL (xfrma_policy );
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 87/139 net: phy: fix IRQ-based wake-on-lan over hibernate / power off
In reply to Greg Kroah-HartmanFrom: Russell King (Oracle) <[email protected]>
[ Upstream commit cc941e548bffc01b5816b4edc5cb432a137a58b3 ]
Uwe reports:
"Most PHYs signal WoL using an interrupt. So disabling interrupts [at shutdown] breaks WoL at least on PHYs covered by the marvell driver."
Discussing with Ioana, the problem which was trying to be solved was:
"The board in question is a LS1021ATSN which has two AR8031 PHYs that share an interrupt line. In case only one of the PHYs is probed and there are pending interrupts on the PHY#2 an IRQ storm will happen since there is no entity to clear the interrupt from PHY#2's registers. PHY#1's driver will get stuck in .handle_interrupt() indefinitely."
Further confirmation that "the two AR8031 PHYs are on the same MDIO bus."
With WoL using interrupts to wake the system, in such a case, the system will begin booting with an asserted interrupt. Thus, we need to cope with an interrupt asserted during boot.
Solve this instead by disabling interrupts during PHY probe. This will ensure in Ioana's situation that both PHYs of the same type sharing an interrupt line on a common MDIO bus will have their interrupt outputs disabled when the driver probes the device, but before we hook in any interrupt handlers - thus avoiding the interrupt storm.
A better fix would be for platform firmware to disable the interrupting devices at source during boot, before control is handed to the kernel.
--- drivers/net/phy/phy_device.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-)
drivers/net/phy/phy_device.c +2 -11
@@ -3061,6 +3061,8 @@ static int phy_probe(struct device *dev) goto out; } +phy_disable_interrupts (phydev); +/* Start out supporting everything. Eventually, * a controller will attach, and may modify one * or both of these values
@@ -3148,16 +3150,6 @@ static int phy_remove(struct device *dev)return 0 ; } -static void phy_shutdown (struct device *dev) -{ -struct phy_device *phydev =to_phy_device (dev); - -if (phydev->state ==PHY_READY || !phydev->attached_dev) -return ; - -phy_disable_interrupts (phydev); -} -/** * phy_driver_register - register a phy_driver with the PHY layer * @new_driver: new phy_driver to register
@@ -3181,7 +3173,6 @@ int phy_driver_register(struct phy_driver *new_driver, struct module *owner) new_driver->mdiodrv.driver.bus = &mdio_bus_type; new_driver->mdiodrv.driver.probe = phy_probe; new_driver->mdiodrv.driver.remove = phy_remove; - new_driver->mdiodrv.driver.shutdown = phy_shutdown; new_driver->mdiodrv.driver.owner = owner; new_driver->mdiodrv.driver.probe_type =PROBE_FORCE_SYNCHRONOUS ;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 88/139 selftests: mirror_gre_changes: Tighten up the TTL test match
In reply to Greg Kroah-HartmanFrom: Petr Machata <[email protected]>
[ Upstream commit 855067defa36b1f9effad8c219d9a85b655cf500 ]
This test verifies whether the encapsulated packets have the correct configured TTL. It does so by sending ICMP packets through the test topology and mirroring them to a gretap netdevice. On a busy host however, more than just the test ICMP packets may end up flowing through the topology, get mirrored, and counted. This leads to potential spurious failures as the test observes much more mirrored packets than the sent test packets, and assumes a bug.
Fix this by tightening up the mirror action match. Change it from matchall to a flower classifier matching on ICMP packets specifically.
--- tools/testing/selftests/net/forwarding/mirror_gre_changes.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/testing/selftests/net/forwarding/mirror_gre_changes.sh +2 -1
@@ -72,7 +72,8 @@ test_span_gre_ttl() RET=0 - mirror_install $swp1 ingress $tundev "matchall $tcflags" + mirror_install $swp1 ingress $tundev \ + "prot ip flower $tcflags ip_prot icmp" tc filter add dev $h3 ingress pref 77 prot $prot \ flower ip_ttl 50 action pass
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 89/139 drm/panel: simple: Fix AUO G121EAN01 panel timings according to the docs
In reply to Greg Kroah-HartmanFrom: Luca Ceresoli <[email protected]>
[ Upstream commit e8470c0a7bcaa82f78ad34282d662dd7bd9630c2 ]
Commit 03e909acd95a ("drm/panel: simple: Add support for AUO G121EAN01.4 panel") added support for this panel model, but the timings it implements are very different from what the datasheet describes. I checked both the G121EAN01.0 datasheet from [0] and the G121EAN01.4 one from [1] and they all have the same timings: for example the LVDS clock typical value is 74.4 MHz, not 66.7 MHz as implemented.
Replace the timings with the ones from the documentation. These timings have been tested and the clock frequencies verified with an oscilloscope to ensure they are correct.
Also use struct display_timing instead of struct drm_display_mode in order to also specify the minimum and maximum values.
[0] https://embedded.avnet.com/product/g121ean01-0/
[1] https://embedded.avnet.com/product/g121ean01-4/
--- drivers/gpu/drm/panel/panel-simple.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/gpu/drm/panel/panel-simple.c +12 -12
@@ -1258,21 +1258,21 @@ static const struct panel_desc auo_g104sn02 = { .connector_type = DRM_MODE_CONNECTOR_LVDS, }; -static const struct drm_display_mode auo_g121ean01_mode = { - .clock =66700 , - .hdisplay =1280 , - .hsync_start =1280 +58 , - .hsync_end =1280 +58 +8 , - .htotal =1280 +58 +8 +70 , - .vdisplay =800 , - .vsync_start =800 +6 , - .vsync_end =800 +6 +4 , - .vtotal =800 +6 +4 +10 , +static const struct display_timing auo_g121ean01_timing = { + .pixelclock = {60000000 ,74400000 ,90000000 }, + .hactive = {1280 ,1280 ,1280 }, + .hfront_porch = {20 ,50 ,100 }, + .hback_porch = {20 ,50 ,100 }, + .hsync_len = {30 ,100 ,200 }, + .vactive = {800 ,800 ,800 }, + .vfront_porch = {2 ,10 ,25 }, + .vback_porch = {2 ,10 ,25 }, + .vsync_len = {4 ,18 ,50 }, };static const struct panel_desc auo_g121ean01 = { - .modes = &auo_g121ean01_mode, - .num_modes =1 , + .timings = &auo_g121ean01_timing, + .num_timings =1 , .bpc =8 , .size = { .width =261 ,
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 90/139 netfilter: nf_tables: fix false-positive lockdep splat
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit b9f052dc68f69dac89fe1e24693354c033daa091 ]
->abort invocation may cause splat on debug kernels:
WARNING: suspicious RCU usagenet/netfilter/nft_set_pipapo.c:1697 suspicious rcu_dereference_check() usage! [..]rcu_scheduler_active = 2, debug_locks = 1
1 lock held by nft/133554: [..] (nft_net->commit_mutex){+.+.}-{3:3}, at: nf_tables_valid_genid [..]
lockdep_rcu_suspicious+0x1ad/0x260 nft_pipapo_abort+0x145/0x180 __nf_tables_abort+0x5359/0x63d0 nf_tables_abort+0x24/0x40 nfnetlink_rcv+0x1a0a/0x22c0 netlink_unicast+0x73c/0x900 netlink_sendmsg+0x7f0/0xc20 ____sys_sendmsg+0x48d/0x760
Transaction mutex is held, so parallel updates are not possible. Switch to _protected and check mutex is held for lockdep enabled builds.
--- net/netfilter/nft_set_pipapo.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
net/netfilter/nft_set_pipapo.c +12 -1
@@ -1665,6 +1665,17 @@ static void nft_pipapo_commit(const struct nft_set *set) priv->clone = new_clone; } +static bool nft_pipapo_transaction_mutex_held (const struct nft_set *set) +{ +#ifdef CONFIG_PROVE_LOCKING +const struct net *net =read_pnet (&set->net); + +return lockdep_is_held (&nft_pernet (net)->commit_mutex); +#else +return true; +#endif +} +static void nft_pipapo_abort (const struct nft_set *set) {struct nft_pipapo *priv =nft_set_priv (set);
@@ -1673,7 +1684,7 @@ static void nft_pipapo_abort(const struct nft_set *set)if (!priv->dirty)return ; - m =rcu_dereference (priv->match); + m =rcu_dereference_protected (priv->match,nft_pipapo_transaction_mutex_held (set)); new_clone =pipapo_clone (m);if (IS_ERR (new_clone))
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 91/139 netfilter: nf_tables: deactivate catchall elements in next generation
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit 90e5b3462efa37b8bba82d7c4e63683856e188af ]
When flushing, individual set elements are disabled in the next generation via the ->flush callback.
Catchall elements are not disabled. This is incorrect and may lead to double-deactivations of catchall elements which then results in memory leaks:
WARNING: CPU: 1 PID: 3300 at include/net/netfilter/nf_tables.h:1172 nft_map_deactivate+0x549/0x730 CPU: 1 PID: 3300 Comm: nft Not tainted 6.5.0-rc5+ #60 RIP: 0010:nft_map_deactivate+0x549/0x730 [..] ? nft_map_deactivate+0x549/0x730 nf_tables_delset+0xb66/0xeb0
(the warn is due to nft_use_dec() detecting underflow).
--- net/netfilter/nf_tables_api.c | 1 + 1 file changed, 1 insertion(+)
net/netfilter/nf_tables_api.c +1 -0
@@ -6719,6 +6719,7 @@ static int nft_set_catchall_flush(const struct nft_ctx *ctx, ret =__nft_set_catchall_flush (ctx, set, &elem);if (ret <0 )break ; +nft_set_elem_change_active (ctx->net, set, ext); }return ret;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 92/139 ipvs: fix racy memcpy in proc_do_sync_threshold
In reply to Greg Kroah-HartmanFrom: Sishuai Gong <[email protected]>
[ Upstream commit 5310760af1d4fbea1452bfc77db5f9a680f7ae47 ]
When two threads run proc_do_sync_threshold() in parallel, data races could happen between the two memcpy():
Thread-1 Thread-2
memcpy(val, valp, sizeof(val)); memcpy(valp, val, sizeof(val));
This race might mess up the (struct ctl_table *) table->data, so we add a mutex lock to serialize them.
--- net/netfilter/ipvs/ip_vs_ctl.c | 4 ++++ 1 file changed, 4 insertions(+)
net/netfilter/ipvs/ip_vs_ctl.c +4 -0
@@ -1802,6 +1802,7 @@ static int proc_do_sync_threshold(struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos) { + struct netns_ipvs *ipvs = table->extra2;int *valp = table->data;int val[2 ];int rc;
@@ -1811,6 +1812,7 @@ proc_do_sync_threshold(struct ctl_table *table, int write, .mode = table->mode, }; +mutex_lock (&ipvs->sync_mutex);memcpy (val, valp,sizeof (val)); rc =proc_dointvec (&tmp, write, buffer, lenp, ppos);if (write) {
@@ -1820,6 +1822,7 @@ proc_do_sync_threshold(struct ctl_table *table, int write,else memcpy (valp, val,sizeof (val)); } +mutex_unlock (&ipvs->sync_mutex);return rc; }
@@ -4077,6 +4080,7 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs) ipvs->sysctl_sync_threshold[0 ] =DEFAULT_SYNC_THRESHOLD ; ipvs->sysctl_sync_threshold[1 ] =DEFAULT_SYNC_PERIOD ; tbl[idx].data = &ipvs->sysctl_sync_threshold; + tbl[idx].extra2 = ipvs; tbl[idx++].maxlen =sizeof (ipvs->sysctl_sync_threshold); ipvs->sysctl_sync_refresh_period =DEFAULT_SYNC_REFRESH_PERIOD ; tbl[idx++].data = &ipvs->sysctl_sync_refresh_period;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 93/139 netfilter: nft_dynset: disallow object maps
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 23185c6aed1ffb8fc44087880ba2767aba493779 ]
Do not allow to insert elements from datapath to objects maps.
--- net/netfilter/nft_dynset.c | 3 +++ 1 file changed, 3 insertions(+)
net/netfilter/nft_dynset.c +3 -0
@@ -191,6 +191,9 @@ static int nft_dynset_init(const struct nft_ctx *ctx,if (IS_ERR (set))return PTR_ERR (set); +if (set->flags &NFT_SET_OBJECT ) +return -EOPNOTSUPP ; +if (set->ops->update ==NULL )return -EOPNOTSUPP ;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 94/139 net: phy: broadcom: stub c45 read/write for 54810
In reply to Greg Kroah-HartmanFrom: Justin Chen <[email protected]>
[ Upstream commit 096516d092d54604d590827d05b1022c8f326639 ]
The 54810 does not support c45. The mmd_phy_indirect accesses return arbirtary values leading to odd behavior like saying it supports EEE when it doesn't. We also see that reading/writing these non-existent MMD registers leads to phy instability in some cases.
--- drivers/net/phy/broadcom.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/net/phy/broadcom.c +13 -0
@@ -412,6 +412,17 @@ static int bcm54xx_resume(struct phy_device *phydev)return bcm54xx_config_init (phydev); } +static int bcm54810_read_mmd (struct phy_device *phydev,int devnum,u16 regnum) +{ +return -EOPNOTSUPP ; +} + +static int bcm54810_write_mmd (struct phy_device *phydev,int devnum,u16 regnum, +u16 val) +{ +return -EOPNOTSUPP ; +} +static int bcm54811_config_init (struct phy_device *phydev) {int err, reg;
@@ -832,6 +843,8 @@ static struct phy_driver broadcom_drivers[] = { .get_strings = bcm_phy_get_strings, .get_stats = bcm54xx_get_stats, .probe = bcm54xx_phy_probe, + .read_mmd = bcm54810_read_mmd, + .write_mmd = bcm54810_write_mmd, .config_init = bcm54xx_config_init, .config_aneg = bcm5481_config_aneg, .config_intr = bcm_phy_config_intr,
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 95/139 team: Fix incorrect deletion of ETH_P_8021AD protocol vid from slaves
In reply to Greg Kroah-HartmanFrom: Ziyang Xuan <[email protected]>
[ Upstream commit dafcbce07136d799edc4c67f04f9fd69ff1eac1f ]
Similar to commit 01f4fd270870 ("bonding: Fix incorrect deletion of ETH_P_8021AD protocol vid from slaves"), we can trigger BUG_ON(!vlan_info) in unregister_vlan_dev() with the following testcase:
# ip netns add ns1 # ip netns exec ns1 ip link add team1 type team # ip netns exec ns1 ip link add team_slave type veth peer veth2 # ip netns exec ns1 ip link set team_slave master team1 # ip netns exec ns1 ip link add link team_slave name team_slave.10 type vlan id 10 protocol 802.1ad # ip netns exec ns1 ip link add link team1 name team1.10 type vlan id 10 protocol 802.1ad # ip netns exec ns1 ip link set team_slave nomaster # ip netns del ns1
Add S-VLAN tag related features support to team driver. So the team driver will always propagate the VLAN info to its slaves.
--- drivers/net/team/team.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/team/team.c +3 -1
@@ -2195,7 +2195,9 @@ static void team_setup(struct net_device *dev) dev->hw_features =TEAM_VLAN_FEATURES |NETIF_F_HW_VLAN_CTAG_RX | -NETIF_F_HW_VLAN_CTAG_FILTER ; +NETIF_F_HW_VLAN_CTAG_FILTER | +NETIF_F_HW_VLAN_STAG_RX | +NETIF_F_HW_VLAN_STAG_FILTER ; dev->hw_features |=NETIF_F_GSO_ENCAP_ALL ; dev->features |= dev->hw_features;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 96/139 iavf: fix FDIR rule fields masks validation
In reply to Greg Kroah-HartmanFrom: Piotr Gardocki <[email protected]>
[ Upstream commit 751969e5b1196821ef78f0aa664a8a97c92c9057 ]
Return an error if a field's mask is neither full nor empty. When a mask is only partial the field is not being used for rule programming but it gives a wrong impression it is used. Fix by returning an error on any partial mask to make it clear they are not supported.
The ip_ver assignment is moved earlier in code to allow using it in iavf_validate_fdir_fltr_masks.
--- .../net/ethernet/intel/iavf/iavf_ethtool.c | 10 +++ drivers/net/ethernet/intel/iavf/iavf_fdir.c | 77 ++++++++++++++++++- drivers/net/ethernet/intel/iavf/iavf_fdir.h | 2 + 3 files changed, 85 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/iavf/iavf_ethtool.c +10 -0
@@ -1275,6 +1275,7 @@ iavf_add_fdir_fltr_info(struct iavf_adapter *adapter, struct ethtool_rx_flow_spe fltr->ip_mask.src_port = fsp->m_u.tcp_ip4_spec.psrc; fltr->ip_mask.dst_port = fsp->m_u.tcp_ip4_spec.pdst; fltr->ip_mask.tos = fsp->m_u.tcp_ip4_spec.tos; + fltr->ip_ver =4 ;break ;case AH_V4_FLOW :case ESP_V4_FLOW :
@@ -1286,6 +1287,7 @@ iavf_add_fdir_fltr_info(struct iavf_adapter *adapter, struct ethtool_rx_flow_spe fltr->ip_mask.v4_addrs.dst_ip = fsp->m_u.ah_ip4_spec.ip4dst; fltr->ip_mask.spi = fsp->m_u.ah_ip4_spec.spi; fltr->ip_mask.tos = fsp->m_u.ah_ip4_spec.tos; + fltr->ip_ver =4 ;break ;case IPV4_USER_FLOW : fltr->ip_data.v4_addrs.src_ip = fsp->h_u.usr_ip4_spec.ip4src;
@@ -1298,6 +1300,7 @@ iavf_add_fdir_fltr_info(struct iavf_adapter *adapter, struct ethtool_rx_flow_spe fltr->ip_mask.l4_header = fsp->m_u.usr_ip4_spec.l4_4_bytes; fltr->ip_mask.tos = fsp->m_u.usr_ip4_spec.tos; fltr->ip_mask.proto = fsp->m_u.usr_ip4_spec.proto; + fltr->ip_ver =4 ;break ;case TCP_V6_FLOW :case UDP_V6_FLOW :
@@ -1316,6 +1319,7 @@ iavf_add_fdir_fltr_info(struct iavf_adapter *adapter, struct ethtool_rx_flow_spe fltr->ip_mask.src_port = fsp->m_u.tcp_ip6_spec.psrc; fltr->ip_mask.dst_port = fsp->m_u.tcp_ip6_spec.pdst; fltr->ip_mask.tclass = fsp->m_u.tcp_ip6_spec.tclass; + fltr->ip_ver =6 ;break ;case AH_V6_FLOW :case ESP_V6_FLOW :
@@ -1331,6 +1335,7 @@ iavf_add_fdir_fltr_info(struct iavf_adapter *adapter, struct ethtool_rx_flow_spe sizeof(struct in6_addr)); fltr->ip_mask.spi = fsp->m_u.ah_ip6_spec.spi; fltr->ip_mask.tclass = fsp->m_u.ah_ip6_spec.tclass; + fltr->ip_ver =6 ;break ;case IPV6_USER_FLOW : memcpy(&fltr->ip_data.v6_addrs.src_ip, fsp->h_u.usr_ip6_spec.ip6src,
@@ -1347,6 +1352,7 @@ iavf_add_fdir_fltr_info(struct iavf_adapter *adapter, struct ethtool_rx_flow_spe fltr->ip_mask.l4_header = fsp->m_u.usr_ip6_spec.l4_4_bytes; fltr->ip_mask.tclass = fsp->m_u.usr_ip6_spec.tclass; fltr->ip_mask.proto = fsp->m_u.usr_ip6_spec.l4_proto; + fltr->ip_ver =6 ;break ;case ETHER_FLOW : fltr->eth_data.etype = fsp->h_u.ether_spec.h_proto;
@@ -1357,6 +1363,10 @@ iavf_add_fdir_fltr_info(struct iavf_adapter *adapter, struct ethtool_rx_flow_spereturn -EINVAL ; } + err =iavf_validate_fdir_fltr_masks (adapter, fltr); +if (err) +return err; +if (iavf_fdir_is_dup_fltr (adapter, fltr))return -EEXIST ;
drivers/net/ethernet/intel/iavf/iavf_fdir.c +73 -4
95 lines not on this page · raw message
drivers/net/ethernet/intel/iavf/iavf_fdir.h +2 -0
@@ -110,6 +110,8 @@ struct iavf_fdir_fltr {struct virtchnl_fdir_add vc_add_msg; }; +int iavf_validate_fdir_fltr_masks (struct iavf_adapter *adapter, +struct iavf_fdir_fltr *fltr);int iavf_fill_fdir_add_msg (struct iavf_adapter *adapter,struct iavf_fdir_fltr *fltr);void iavf_print_fdir_fltr (struct iavf_adapter *adapter,struct iavf_fdir_fltr *fltr);bool iavf_fdir_is_dup_fltr (struct iavf_adapter *adapter,struct iavf_fdir_fltr *fltr);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 97/139 i40e: fix misleading debug logs
In reply to Greg Kroah-HartmanFrom: Andrii Staikov <[email protected]>
[ Upstream commit 2f2beb8874cb0844e84ad26e990f05f4f13ff63f ]
Change "write" into the actual "read" word.
Change parameters description.
--- drivers/net/ethernet/intel/i40e/i40e_nvm.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_nvm.c +8 -8
@@ -210,11 +210,11 @@ static int i40e_read_nvm_word_srctl(struct i40e_hw *hw, u16 offset,* @hw: pointer to the HW structure. * @module_pointer: module pointer location in words from the NVM beginning * @offset: offset in words from module start -* @words: number of words to write -* @data: buffer with words to write to the Shadow RAM +* @words: number of words to read +* @data: buffer with words to read to the Shadow RAM * @last_command: tells the AdminQ that this is the last command * -* Writes a 16 bit words buffer to the Shadow RAM using the admin command. +* Reads a 16 bit words buffer to the Shadow RAM using the admin command. **/ static int i40e_read_nvm_aq(struct i40e_hw *hw, u8 module_pointer, u32 offset,
@@ -234,18 +234,18 @@ static int i40e_read_nvm_aq(struct i40e_hw *hw,*/ if ((offset + words) > hw->nvm.sr_size)i40e_debug (hw,I40E_DEBUG_NVM , -"NVM write error: offset %d beyond Shadow RAM limit %d\n" , +"NVM read error: offset %d beyond Shadow RAM limit %d\n" , (offset + words), hw->nvm.sr_size);else if (words >I40E_SR_SECTOR_SIZE_IN_WORDS ) -/* We can write only up to 4KB (one sector), in one AQ write */ +/* We can read only up to 4KB (one sector), in one AQ write */ i40e_debug (hw,I40E_DEBUG_NVM , -"NVM write fail error: tried to write %d words, limit is %d.\n" , +"NVM read fail error: tried to read %d words, limit is %d.\n" , words,I40E_SR_SECTOR_SIZE_IN_WORDS );else if (((offset + (words -1 )) /I40E_SR_SECTOR_SIZE_IN_WORDS ) != (offset /I40E_SR_SECTOR_SIZE_IN_WORDS )) -/* A single write cannot spread over two sectors */ +/* A single read cannot spread over two sectors */ i40e_debug (hw,I40E_DEBUG_NVM , -"NVM write error: cannot spread over two sectors in a single write offset=%d words=%d\n" , +"NVM read error: cannot spread over two sectors in a single read offset=%d words=%d\n" , offset, words);else ret_code = i40e_aq_read_nvm(hw, module_pointer,
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 98/139 net: dsa: mv88e6xxx: Wait for EEPROM done before HW reset
In reply to Greg Kroah-HartmanFrom: Alfred Lee <[email protected]>
[ Upstream commit 23d775f12dcd23d052a4927195f15e970e27ab26 ]
If the switch is reset during active EEPROM transactions, as in just after an SoC reset after power up, the I2C bus transaction may be cut short leaving the EEPROM internal I2C state machine in the wrong state. When the switch is reset again, the bad state machine state may result in data being read from the wrong memory location causing the switch to enter unexpected mode rendering it inoperational.
--- drivers/net/dsa/mv88e6xxx/chip.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/dsa/mv88e6xxx/chip.c +8 -0
@@ -2588,6 +2588,14 @@ static void mv88e6xxx_hardware_reset(struct mv88e6xxx_chip *chip)/* If there is a GPIO connected to the reset pin, toggle it */ if (gpiod) { +/* If the switch has just been reset and not yet completed +* loading EEPROM, the reset may interrupt the I2C transaction +* mid-byte, causing the first EEPROM read after the reset +* from the wrong location resulting in the switch booting +* to wrong mode and inoperable. +*/ +mv88e6xxx_g1_wait_eeprom_done (chip); +gpiod_set_value_cansleep (gpiod,1 );usleep_range (10000 ,20000 );gpiod_set_value_cansleep (gpiod,0 );
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 99/139 sock: Fix misuse of sk_under_memory_pressure()
In reply to Greg Kroah-HartmanFrom: Abel Wu <[email protected]>
[ Upstream commit 2d0c88e84e483982067a82073f6125490ddf3614 ]
The status of global socket memory pressure is updated when:
a) __sk_mem_raise_allocated():
enter: sk_memory_allocated(sk) > sysctl_mem[1]
leave: sk_memory_allocated(sk) <= sysctl_mem[0]
b) __sk_mem_reduce_allocated():
leave: sk_under_memory_pressure(sk) && sk_memory_allocated(sk) < sysctl_mem[0]
So the conditions of leaving global pressure are inconstant, which may lead to the situation that one pressured net-memcg prevents the global pressure from being cleared when there is indeed no global pressure, thus the global constrains are still in effect unexpectedly on the other sockets.
This patch fixes this by ignoring the net-memcg's pressure when deciding whether should leave global memory pressure.
--- include/net/sock.h | 6 ++++++ net/core/sock.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-)
include/net/sock.h +6 -0
@@ -1381,6 +1381,12 @@ static inline bool sk_has_memory_pressure(const struct sock *sk)return sk->sk_prot->memory_pressure !=NULL ; } +static inline bool sk_under_global_memory_pressure (const struct sock *sk) +{ +return sk->sk_prot->memory_pressure && + !!*sk->sk_prot->memory_pressure; +} +static inline bool sk_under_memory_pressure (const struct sock *sk) {if (!sk->sk_prot->memory_pressure)
net/core/sock.c +1 -1
@@ -2880,7 +2880,7 @@ void __sk_mem_reduce_allocated(struct sock *sk, int amount)if (mem_cgroup_sockets_enabled && sk->sk_memcg)mem_cgroup_uncharge_skmem (sk->sk_memcg, amount); -if (sk_under_memory_pressure (sk) && +if (sk_under_global_memory_pressure (sk) && (sk_memory_allocated (sk) <sk_prot_mem_limits (sk,0 )))sk_leave_memory_pressure (sk); }
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 100/139 net: do not allow gso_size to be set to GSO_BY_FRAGS
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit b616be6b97688f2f2bd7c4a47ab32f27f94fb2a9 ]
One missing check in virtio_net_hdr_to_skb() allowed syzbot to crash kernels again [1]
Do not allow gso_size to be set to GSO_BY_FRAGS (0xffff), because this magic value is used by the kernel.
[1]
general protection fault, probably for non-canonical address 0xdffffc000000000e: 0000 [#1] PREEMPT SMP KASAN KASAN: null-ptr-deref in range [0x0000000000000070-0x0000000000000077] CPU: 0 PID: 5039 Comm: syz-executor401 Not tainted 6.5.0-rc5-next-20230809-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 07/26/2023 RIP: 0010:skb_segment+0x1a52/0x3ef0 net/core/skbuff.c:4500 Code: 00 00 00 e9 ab eb ff ff e8 6b 96 5d f9 48 8b 84 24 00 01 00 00 48 8d 78 70 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <0f> b6 04 02 84 c0 74 08 3c 03 0f 8e ea 21 00 00 48 8b 84 24 00 01 RSP: 0018:ffffc90003d3f1c8 EFLAGS: 00010202 RAX: dffffc0000000000 RBX: 000000000001fffe RCX: 0000000000000000 RDX: 000000000000000e RSI: ffffffff882a3115 RDI: 0000000000000070 RBP: ffffc90003d3f378 R08: 0000000000000005 R09: 000000000000ffff R10: 000000000000ffff R11: 5ee4a93e456187d6 R12: 000000000001ffc6 R13: dffffc0000000000 R14: 0000000000000008 R15: 000000000000ffff FS: 00005555563f2380(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000020020000 CR3: 000000001626d000 CR4: 00000000003506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> udp6_ufo_fragment+0x9d2/0xd50 net/ipv6/udp_offload.c:109 ipv6_gso_segment+0x5c4/0x17b0 net/ipv6/ip6_offload.c:120 skb_mac_gso_segment+0x292/0x610 net/core/gso.c:53 __skb_gso_segment+0x339/0x710 net/core/gso.c:124 skb_gso_segment include/net/gso.h:83 [inline] validate_xmit_skb+0x3a5/0xf10 net/core/dev.c:3625 __dev_queue_xmit+0x8f0/0x3d60 net/core/dev.c:4329 dev_queue_xmit include/linux/netdevice.h:3082 [inline] packet_xmit+0x257/0x380 net/packet/af_packet.c:276 packet_snd net/packet/af_packet.c:3087 [inline] packet_sendmsg+0x24c7/0x5570 net/packet/af_packet.c:3119 sock_sendmsg_nosec net/socket.c:727 [inline] sock_sendmsg+0xd9/0x180 net/socket.c:750 ____sys_sendmsg+0x6ac/0x940 net/socket.c:2496 ___sys_sendmsg+0x135/0x1d0 net/socket.c:2550 __sys_sendmsg+0x117/0x1e0 net/socket.c:2579 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x38/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7ff27cdb34d9
--- include/linux/virtio_net.h | 4 ++++ 1 file changed, 4 insertions(+)
include/linux/virtio_net.h +4 -0
@@ -148,6 +148,10 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,if (gso_type &SKB_GSO_UDP ) nh_off -= thlen; +/* Kernel has a special handling for GSO_BY_FRAGS. */ +if (gso_size ==GSO_BY_FRAGS ) +return -EINVAL ; +/* Too small packets are not really GSO ones. */ if (skb->len - nh_off > gso_size) { shinfo->gso_size = gso_size;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 101/139 bus: ti-sysc: Flush posted write on enable before reset
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 34539b442b3bc7d5bf10164750302b60b91f18a7 ]
The am335x devices started producing boot errors for resetting musb module in because of subtle timing changes:
Unhandled fault: external abort on non-linefetch (0x1008)
...sysc_poll_reset_sysconfig from sysc_reset+0x109/0x12 sysc_reset from sysc_probe+0xa99/0xeb0
...
The fix is to flush posted write after enable before reset during probe. Note that some devices also need to specify the delay after enable with ti,sysc-delay-us, but this is not needed for musb on am335x based on my tests.
--- drivers/bus/ti-sysc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bus/ti-sysc.c +2 -0
@@ -2089,6 +2089,8 @@ static int sysc_reset(struct sysc *ddata) sysc_val =sysc_read_sysconfig (ddata); sysc_val |= sysc_mask;sysc_write (ddata, sysc_offset, sysc_val); +/* Flush posted write */ + sysc_val =sysc_read_sysconfig (ddata); }if (ddata->cfg.srst_udelay)
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 102/139 arm64: dts: qcom: qrb5165-rb5: fix thermal zone conflict
In reply to Greg Kroah-HartmanFrom: Dmitry Baryshkov <[email protected]>
[ Upstream commit 798f1df86e5709b7b6aedf493cc04c7fedbf544a ]
The commit 3a786086c6f8 ("arm64: dts: qcom: Add missing "-thermal" suffix for thermal zones") renamed the thermal zone in the pm8150l.dtsi file to comply with the schema. However this resulted in a clash with the RB5 board file, which already contained the pm8150l-thermal zone for the on-board sensor. This resulted in the board file definition overriding the thermal zone defined in the PMIC include file (and thus the on-die PMIC temp alarm was not probing at all).
Rename the thermal zone in qcom/qrb5165-rb5.dts to remove this override.
--- arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/qrb5165-rb5.dts +1 -1
@@ -113,7 +113,7 @@ }; }; - pm8150l-thermal { + pm8150l-pcb-thermal { polling-delay-passive = <0>; polling-delay = <0>; thermal-sensors = <&pm8150l_adc_tm 1>;
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 103/139 ARM: dts: imx: Set default tuning step for imx6sx usdhc
In reply to Greg Kroah-HartmanFrom: Xiaolei Wang <[email protected]>
[ Upstream commit 0a2b96e42a0284c4fc03022236f656a085ca714a ]
If the tuning step is not set, the tuning step is set to 1. For some sd cards, the following Tuning timeout will occur.
Tuning failed, falling back to fixed sampling clock
So set the default tuning step. This refers to the NXP vendor's commit below:
https://github.com/nxp-imx/linux-imx/blob/lf-6.1.y/
arch/arm/boot/dts/imx6sx.dtsi#L1108-L1109
--- arch/arm/boot/dts/imx6sx.dtsi | 6 ++++++ 1 file changed, 6 insertions(+)
arch/arm/boot/dts/imx6sx.dtsi +6 -0
@@ -981,6 +981,8 @@ <&clks IMX6SX_CLK_USDHC1>; clock-names = "ipg", "ahb", "per"; bus-width = <4>; + fsl,tuning-start-tap = <20>; + fsl,tuning-step= <2>; status = "disabled"; };
@@ -993,6 +995,8 @@ <&clks IMX6SX_CLK_USDHC2>; clock-names = "ipg", "ahb", "per"; bus-width = <4>; + fsl,tuning-start-tap = <20>; + fsl,tuning-step= <2>; status = "disabled"; };
@@ -1005,6 +1009,8 @@ <&clks IMX6SX_CLK_USDHC3>; clock-names = "ipg", "ahb", "per"; bus-width = <4>; + fsl,tuning-start-tap = <20>; + fsl,tuning-step= <2>; status = "disabled"; };
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 104/139 ASoC: rt5665: add missed regulator_bulk_disable
In reply to Greg Kroah-HartmanFrom: Zhang Shurong <[email protected]>
[ Upstream commit c163108e706909570f8aa9aa5bcf6806e2b4c98c ]
The driver forgets to call regulator_bulk_disable()
Add the missed call to fix it.
--- sound/soc/codecs/rt5665.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/codecs/rt5665.c +2 -0
@@ -4472,6 +4472,8 @@ static void rt5665_remove(struct snd_soc_component *component)struct rt5665_priv *rt5665 =snd_soc_component_get_drvdata (component);regmap_write (rt5665->regmap,RT5665_RESET ,0 ); + +regulator_bulk_disable (ARRAY_SIZE (rt5665->supplies), rt5665->supplies); }#ifdef CONFIG_PM
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 105/139 ASoC: meson: axg-tdm-formatter: fix channel slot allocation
In reply to Greg Kroah-HartmanFrom: Jerome Brunet <[email protected]>
[ Upstream commit c1f848f12103920ca165758aedb1c10904e193e1 ]
When the tdm lane mask is computed, the driver currently fills the 1st lane before moving on to the next. If the stream has less channels than the lanes can accommodate, slots will be disabled on the last lanes.
Unfortunately, the HW distribute channels in a different way. It distribute channels in pair on each lanes before moving on the next slots.
This difference leads to problems if a device has an interface with more than 1 lane and with more than 2 slots per lane.
For example: a playback interface with 2 lanes and 4 slots each (total 8 slots - zero based numbering)
- Playing a 8ch stream:
- All slots activated by the driver
- channel #2 will be played on lane #1 - slot #0 following HW placement
- Playing a 4ch stream:
- Lane #1 disabled by the driver
- channel #2 will be played on lane #0 - slot #2
This behaviour is obviously not desirable.
Change the way slots are activated on the TDM lanes to follow what the HW does and make sure each channel always get mapped to the same slot/lane.
--- sound/soc/meson/axg-tdm-formatter.c | 42 ++++++++++++++++++----------- 1 file changed, 26 insertions(+), 16 deletions(-)
sound/soc/meson/axg-tdm-formatter.c +26 -16
@@ -30,27 +30,32 @@ int axg_tdm_formatter_set_channel_masks(struct regmap *map, struct axg_tdm_stream *ts, unsigned int offset) { -unsigned int val, ch = ts->channels; -unsigned long mask; -int i, j; +unsigned int ch = ts->channels; +u32 val[AXG_TDM_NUM_LANES ]; +int i, j, k; + +/* +* We need to mimick the slot distribution used by the HW to keep the +* channel placement consistent regardless of the number of channel +* in the stream. This is why the odd algorithm below is used. +*/ +memset (val,0 ,sizeof (*val) *AXG_TDM_NUM_LANES );/* * Distribute the channels of the stream over the available slots -* of each TDM lane +* of each TDM lane. We need to go over the 32 slots ... */ -for (i =0 ; i <AXG_TDM_NUM_LANES ; i++) { - val =0 ; - mask = ts->mask[i]; - -for (j =find_first_bit (&mask,32 ); - (j <32 ) && ch; - j =find_next_bit (&mask,32 , j +1 )) { - val |=1 << j; - ch -=1 ; +for (i =0 ; (i <32 ) && ch; i +=2 ) { +/* ... of all the lanes ... */ +for (j =0 ; j <AXG_TDM_NUM_LANES ; j++) { +/* ... then distribute the channels in pairs */ +for (k =0 ; k <2 ; k++) { +if ((BIT (i + k) & ts->mask[j]) && ch) { + val[j] |=BIT (i + k); + ch -=1 ; + } + } } - -regmap_write (map, offset, val); - offset +=regmap_get_reg_stride (map); }/*
@@ -63,6 +68,11 @@ int axg_tdm_formatter_set_channel_masks(struct regmap *map,return -EINVAL ; } +for (i =0 ; i <AXG_TDM_NUM_LANES ; i++) { +regmap_write (map, offset, val[i]); + offset +=regmap_get_reg_stride (map); + } +return 0 ; }EXPORT_SYMBOL_GPL (axg_tdm_formatter_set_channel_masks);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 106/139 soc: aspeed: socinfo: Add kfree for kstrdup
In reply to Greg Kroah-HartmanFrom: Jiasheng Jiang <[email protected]>
[ Upstream commit 6e6d847a8ce18ab2fbec4f579f682486a82d2c6b ]
Add kfree() in the later error handling in order to avoid memory leak.
--- drivers/soc/aspeed/aspeed-socinfo.c | 1 + 1 file changed, 1 insertion(+)
drivers/soc/aspeed/aspeed-socinfo.c +1 -0
@@ -137,6 +137,7 @@ static int __init aspeed_socinfo_init(void) soc_dev =soc_device_register (attrs);if (IS_ERR (soc_dev)) { +kfree (attrs->machine);kfree (attrs->soc_id);kfree (attrs->serial_number);kfree (attrs);
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 107/139 ALSA: hda/realtek - Remodified 3k pull low procedure
In reply to Greg Kroah-HartmanFrom: Kailang Yang <[email protected]>
[ Upstream commit 46cdff2369cbdf8d78081a22526e77bd1323f563 ]
Set spec->en_3kpull_low default to true.
Then fillback ALC236 and ALC257 to false.
Additional note: this addresses a regression caused by the previous fix 69ea4c9d02b7 ("ALSA: hda/realtek - remove 3k pull low procedure"). The previous workaround was applied too widely without necessity, which resulted in the pop noise at PM again. This patch corrects the condition and restores the old behavior for the devices that don't suffer from the original problem.
--- sound/pci/hda/patch_realtek.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +5 -2
@@ -10088,6 +10088,7 @@ static int patch_alc269(struct hda_codec *codec) spec = codec->spec; spec->gen.shared_mic_vref_pin =0x18 ; codec->power_save_node =0 ; + spec->en_3kpull_low = true;#ifdef CONFIG_PM codec->patch_ops.suspend = alc269_suspend;
@@ -10170,14 +10171,16 @@ static int patch_alc269(struct hda_codec *codec) spec->shutup = alc256_shutup; spec->init_hook = alc256_init; spec->gen.mixer_nid =0 ;/* ALC256 does not have any loopback mixer path */ -if (codec->bus->pci->vendor ==PCI_VENDOR_ID_AMD ) - spec->en_3kpull_low = true; +if (codec->core.vendor_id ==0x10ec0236 && + codec->bus->pci->vendor !=PCI_VENDOR_ID_AMD ) + spec->en_3kpull_low = false;break ;case 0x10ec0257 : spec->codec_variant =ALC269_TYPE_ALC257 ; spec->shutup = alc256_shutup; spec->init_hook = alc256_init; spec->gen.mixer_nid =0 ; + spec->en_3kpull_low = false;break ;case 0x10ec0215 :case 0x10ec0245 :
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 108/139 riscv: uaccess: Return the number of bytes effectively not copied
In reply to Greg Kroah-HartmanFrom: Alexandre Ghiti <[email protected]>
[ Upstream commit 4b05b993900dd3eba0fc83ef5c5ddc7d65d786c6 ]
It was reported that the riscv kernel hangs while executing the test in [1].
Indeed, the test hangs when trying to write a buffer to a file. The problem is that the riscv implementation of raw_copy_from_user() does not return the correct number of bytes not written when an exception happens and is fixed up, instead it always returns the initial size to copy, even if some bytes were actually copied.
generic_perform_write() pre-faults the user pages and bails out if nothing can be written, otherwise it will access the userspace buffer: here the riscv implementation keeps returning it was not able to copy any byte though the pre-faulting indicates otherwise. So generic_perform_write() keeps retrying to access the user memory and ends up in an infinite loop.
Note that before the commit mentioned in [1] that introduced this regression, it worked because generic_perform_write() would bail out if only one byte could not be written.
So fix this by returning the number of bytes effectively not written in __asm_copy_[to|from]_user() and __clear_user(), as it is expected.
--- arch/riscv/lib/uaccess.S | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
arch/riscv/lib/uaccess.S +7 -4
@@ -19,8 +19,11 @@ ENTRY(__asm_copy_from_user) li t6, SR_SUM csrs CSR_STATUS, t6 - /* Save for return value */ - mv t5, a2 + /* + * Save the terminal address which will be used to compute the number + * of bytes copied in case of a fixup exception. + */ + add t5, a0, a2 /* * Register allocation for code below:
@@ -178,7 +181,7 @@ ENTRY(__asm_copy_from_user) 10: /* Disable access to user memory */ csrc CSR_STATUS, t6 - mv a0, t5 + sub a0, t5, a0 ret ENDPROC(__asm_copy_to_user) ENDPROC(__asm_copy_from_user)
@@ -230,7 +233,7 @@ ENTRY(__clear_user) 11: /* Disable access to user memory */ csrc CSR_STATUS, t6 - mv a0, a1 + sub a0, a3, a0 ret ENDPROC(__clear_user) EXPORT_SYMBOL(__clear_user)
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 109/139 serial: 8250: Fix oops for port->pm on uart_change_pm()
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit dfe2aeb226fd5e19b0ee795f4f6ed8bc494c1534 ]
Unloading a hardware specific 8250 driver can produce error "Unable to handle kernel paging request at virtual address" about ten seconds after unloading the driver. This happens on uart_hangup() calling uart_change_pm().
Turns out commit 04e82793f068 ("serial: 8250: Reinit port->pm on port specific driver unbind") was only a partial fix. If the hardware specific driver has initialized port->pm function, we need to clear port->pm too. Just reinitializing port->ops does not do this. Otherwise serial8250_pm() will call port->pm() instead of serial8250_do_pm().
--- drivers/tty/serial/8250/8250_port.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/8250/8250_port.c +1 -0
@@ -3274,6 +3274,7 @@ void serial8250_init_port(struct uart_8250_port *up)struct uart_port *port = &up->port;spin_lock_init (&port->lock); + port->pm =NULL ; port->ops = &serial8250_pops; port->has_sysrq =IS_ENABLED (CONFIG_SERIAL_8250_CONSOLE );
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 110/139 ALSA: usb-audio: Add support for Mythware XA001AU capture and playback interfaces.
In reply to Greg Kroah-HartmanFrom: dengxiang <[email protected]>
commit 788449ae57f4273111b779bbcaad552b67f517d5 upstream.
This patch adds a USB quirk for Mythware XA001AU USB interface.
--- sound/usb/quirks-table.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
sound/usb/quirks-table.h +29 -0
@@ -4431,6 +4431,35 @@ YAMAHA_DEVICE(0x7010, "UB99"), } } }, +{ +/* Advanced modes of the Mythware XA001AU. +* For the standard mode, Mythware XA001AU has ID ffad:a001 +*/ + USB_DEVICE_VENDOR_SPEC(0xffad, 0xa001), + .driver_info = (unsigned long ) &(const struct snd_usb_audio_quirk ) { + .vendor_name ="Mythware" , + .product_name ="XA001AU" , + .ifnum =QUIRK_ANY_INTERFACE , + .type =QUIRK_COMPOSITE , + .data = (const struct snd_usb_audio_quirk []) { + { + .ifnum =0 , + .type =QUIRK_IGNORE_INTERFACE , + }, + { + .ifnum =1 , + .type =QUIRK_AUDIO_STANDARD_INTERFACE , + }, + { + .ifnum =2 , + .type =QUIRK_AUDIO_STANDARD_INTERFACE , + }, + { + .ifnum =-1 + } + } + } +}, #undef USB_DEVICE_VENDOR_SPEC #undef USB_AUDIO_DEVICE
Greg Kroah-Hartman
maintainerPATCH 111/139 cifs: Release folio lock on fscache read hit.
In reply to Greg Kroah-HartmanFrom: Russell Harmon via samba-technical <[email protected]>
commit 69513dd669e243928f7450893190915a88f84a2b upstream.
Under the current code, when cifs_readpage_worker is called, the call contract is that the callee should unlock the page. This is documented in the read_folio section of Documentation/filesystems/vfs.rst as:
Quoted 2 lines
The filesystem should unlock the folio once the read has completed, whether it was successful or not.
Without this change, when fscache is in use and cache hit occurs during a read, the page lock is leaked, producing the following stack on subsequent reads (via mmap) to the page:
$ cat /proc/3890/task/12864/stack [<0>] folio_wait_bit_common+0x124/0x350 [<0>] filemap_read_folio+0xad/0xf0 [<0>] filemap_fault+0x8b1/0xab0 [<0>] __do_fault+0x39/0x150 [<0>] do_fault+0x25c/0x3e0 [<0>] __handle_mm_fault+0x6ca/0xc70 [<0>] handle_mm_fault+0xe9/0x350 [<0>] do_user_addr_fault+0x225/0x6c0 [<0>] exc_page_fault+0x84/0x1b0 [<0>] asm_exc_page_fault+0x27/0x30
This requires a reboot to resolve; it is a deadlock.
Note however that the call to cifs_readpage_from_fscache does mark the page clean, but does not free the folio lock. This happens in __cifs_readpage_from_fscache on success. Releasing the lock at that point however is not appropriate as cifs_readahead also calls cifs_readpage_from_fscache and *does* unconditionally release the lock after its return. This change therefore effectively makes cifs_readpage_worker work like cifs_readahead.
--- fs/cifs/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/cifs/file.c +1 -1
@@ -4671,9 +4671,9 @@ static int cifs_readpage_worker(struct f io_error:kunmap (page); -unlock_page (page); read_complete: +unlock_page (page);return rc; }
Greg Kroah-Hartman
maintainerPATCH 112/139 mmc: wbsd: fix double mmc_free_host() in wbsd_init()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
commit d83035433701919ac6db15f7737cbf554c36c1a6 upstream.
mmc_free_host() has already be called in wbsd_free_mmc(), remove the mmc_free_host() in error path in wbsd_init().
--- drivers/mmc/host/wbsd.c | 2 -- 1 file changed, 2 deletions(-)
drivers/mmc/host/wbsd.c +0 -2
@@ -1705,8 +1705,6 @@ static int wbsd_init(struct device *dev,wbsd_release_resources (host);wbsd_free_mmc (dev); - -mmc_free_host (mmc);return ret; }
Greg Kroah-Hartman
maintainerPATCH 113/139 mmc: block: Fix in_flight[issue_type] value error
In reply to Greg Kroah-HartmanFrom: Yibin Ding <[email protected]>
commit 4b430d4ac99750ee2ae2f893f1055c7af1ec3dc5 upstream.
For a completed request, after the mmc_blk_mq_complete_rq(mq, req) function is executed, the bitmap_tags corresponding to the request will be cleared, that is, the request will be regarded as idle. If the request is acquired by a different type of process at this time, the issue_type of the request may change. It further caused the value of mq->in_flight[issue_type] to be abnormal, and a large number of requests could not be sent.
p1: p2:mmc_blk_mq_complete_rq
blk_mq_free_request
blk_mq_get_request
blk_mq_rq_ctx_initmmc_blk_mq_dec_in_flight
mmc_issue_type(mq, req)
This strategy can ensure the consistency of issue_type before and after executing mmc_blk_mq_complete_rq.
--- drivers/mmc/core/block.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/mmc/core/block.c +4 -3
@@ -2081,14 +2081,14 @@ static void mmc_blk_mq_poll_completion(smmc_blk_urgent_bkops (mq, mqrq); } -static void mmc_blk_mq_dec_in_flight (struct mmc_queue *mq,struct request *req) +static void mmc_blk_mq_dec_in_flight (struct mmc_queue *mq,enum mmc_issue_type issue_type) {unsigned long flags;bool put_card;spin_lock_irqsave (&mq->lock, flags); - mq->in_flight[mmc_issue_type (mq, req)] -=1 ; + mq->in_flight[issue_type] -=1 ; put_card = (mmc_tot_in_flight (mq) ==0 );
@@ -2100,6 +2100,7 @@ static void mmc_blk_mq_dec_in_flight(strstatic void mmc_blk_mq_post_req (struct mmc_queue *mq,struct request *req) { +enum mmc_issue_type issue_type =mmc_issue_type (mq, req);struct mmc_queue_req *mqrq =req_to_mmc_queue_req (req);struct mmc_request *mrq = &mqrq->brq.mrq;struct mmc_host *host = mq->card->host;
@@ -2115,7 +2116,7 @@ static void mmc_blk_mq_post_req(struct melse if (likely (!blk_should_fake_timeout (req->q)))blk_mq_complete_request (req); -mmc_blk_mq_dec_in_flight (mq, req); +mmc_blk_mq_dec_in_flight (mq, issue_type); }void mmc_blk_mq_recovery (struct mmc_queue *mq)
Greg Kroah-Hartman
maintainerPATCH 114/139 drm/qxl: fix UAF on handle creation
In reply to Greg Kroah-HartmanFrom: Wander Lairson Costa <[email protected]>
commit c611589b4259ed63b9b77be6872b1ce07ec0ac16 upstream.
qxl_mode_dumb_create() dereferences the qobj returned by qxl_gem_object_create_with_handle(), but the handle is the only one holding a reference to it.
A potential attacker could guess the returned handle value and closes it between the return of qxl_gem_object_create_with_handle() and the qobj usage, triggering a use-after-free scenario.
Reproducer:
int dri_fd =-1;
struct drm_mode_create_dumb arg = {0};
void gem_close(int handle);
void* trigger(void* ptr)
{
int ret;
arg.width = arg.height = 0x20;
arg.bpp = 32;
ret = ioctl(dri_fd, DRM_IOCTL_MODE_CREATE_DUMB, &arg);
if(ret)
{
perror("[*] DRM_IOCTL_MODE_CREATE_DUMB Failed");
exit(-1);
}
gem_close(arg.handle);
while(1) {
struct drm_mode_create_dumb args = {0};
args.width = args.height = 0x20;
args.bpp = 32;
ret = ioctl(dri_fd, DRM_IOCTL_MODE_CREATE_DUMB, &args);
if (ret) {
perror("[*] DRM_IOCTL_MODE_CREATE_DUMB Failed");
exit(-1);
}
printf("[*] DRM_IOCTL_MODE_CREATE_DUMB created, %d\n", args.handle);
gem_close(args.handle);
}
return NULL;
}void gem_close(int handle)
{
struct drm_gem_close args;
args.handle = handle;
int ret = ioctl(dri_fd, DRM_IOCTL_GEM_CLOSE, &args); // gem close handle
if (!ret)
printf("gem close handle %d\n", args.handle);
}int main(void)
{
dri_fd= open("/dev/dri/card0", O_RDWR);
printf("fd:%d\n", dri_fd);
if(dri_fd == -1)
return -1;
pthread_t tid1;
if(pthread_create(&tid1,NULL,trigger,NULL)){
perror("[*] thread_create tid1\n");
return -1;
}
while (1)
{
gem_close(arg.handle);
}
return 0;
}This is a KASAN report:
==================================================================
BUG: KASAN: slab-use-after-free in qxl_mode_dumb_create+0x3c2/0x400 linux/drivers/gpu/drm/qxl/qxl_dumb.c:69 Write of size 1 at addr ffff88801136c240 by task poc/515 CPU: 1 PID: 515 Comm: poc Not tainted 6.3.0 #3 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.0-debian-1.16.0-4 04/01/2014 Call Trace: <TASK> __dump_stack linux/lib/dump_stack.c:88 dump_stack_lvl+0x48/0x70 linux/lib/dump_stack.c:106 print_address_description linux/mm/kasan/report.c:319 print_report+0xd2/0x660 linux/mm/kasan/report.c:430 kasan_report+0xd2/0x110 linux/mm/kasan/report.c:536 __asan_report_store1_noabort+0x17/0x30 linux/mm/kasan/report_generic.c:383 qxl_mode_dumb_create+0x3c2/0x400 linux/drivers/gpu/drm/qxl/qxl_dumb.c:69 drm_mode_create_dumb linux/drivers/gpu/drm/drm_dumb_buffers.c:96 drm_mode_create_dumb_ioctl+0x1f5/0x2d0 linux/drivers/gpu/drm/drm_dumb_buffers.c:102 drm_ioctl_kernel+0x21d/0x430 linux/drivers/gpu/drm/drm_ioctl.c:788 drm_ioctl+0x56f/0xcc0 linux/drivers/gpu/drm/drm_ioctl.c:891 vfs_ioctl linux/fs/ioctl.c:51 __do_sys_ioctl linux/fs/ioctl.c:870 __se_sys_ioctl linux/fs/ioctl.c:856 __x64_sys_ioctl+0x13d/0x1c0 linux/fs/ioctl.c:856 do_syscall_x64 linux/arch/x86/entry/common.c:50 do_syscall_64+0x5b/0x90 linux/arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x72/0xdc linux/arch/x86/entry/entry_64.S:120 RIP: 0033:0x7ff5004ff5f7 Code: 00 00 00 48 8b 05 99 c8 0d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 69 c8 0d 00 f7 d8 64 89 01 48
RSP: 002b:00007ff500408ea8 EFLAGS: 00000286 ORIG_RAX: 0000000000000010
RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007ff5004ff5f7
RDX: 00007ff500408ec0 RSI: 00000000c02064b2 RDI: 0000000000000003
RBP: 00007ff500408ef0 R08: 0000000000000000 R09: 000000000000002a
R10: 0000000000000000 R11: 0000000000000286 R12: 00007fff1c6cdafe
R13: 00007fff1c6cdaff R14: 00007ff500408fc0 R15: 0000000000802000
</TASK> Allocated by task 515: kasan_save_stack+0x38/0x70 linux/mm/kasan/common.c:45 kasan_set_track+0x25/0x40 linux/mm/kasan/common.c:52 kasan_save_alloc_info+0x1e/0x40 linux/mm/kasan/generic.c:510 ____kasan_kmalloc linux/mm/kasan/common.c:374 __kasan_kmalloc+0xc3/0xd0 linux/mm/kasan/common.c:383 kasan_kmalloc linux/./include/linux/kasan.h:196 kmalloc_trace+0x48/0xc0 linux/mm/slab_common.c:1066 kmalloc linux/./include/linux/slab.h:580 kzalloc linux/./include/linux/slab.h:720 qxl_bo_create+0x11a/0x610 linux/drivers/gpu/drm/qxl/qxl_object.c:124 qxl_gem_object_create+0xd9/0x360 linux/drivers/gpu/drm/qxl/qxl_gem.c:58 qxl_gem_object_create_with_handle+0xa1/0x180 linux/drivers/gpu/drm/qxl/qxl_gem.c:89 qxl_mode_dumb_create+0x1cd/0x400 linux/drivers/gpu/drm/qxl/qxl_dumb.c:63 drm_mode_create_dumb linux/drivers/gpu/drm/drm_dumb_buffers.c:96 drm_mode_create_dumb_ioctl+0x1f5/0x2d0 linux/drivers/gpu/drm/drm_dumb_buffers.c:102 drm_ioctl_kernel+0x21d/0x430 linux/drivers/gpu/drm/drm_ioctl.c:788 drm_ioctl+0x56f/0xcc0 linux/drivers/gpu/drm/drm_ioctl.c:891 vfs_ioctl linux/fs/ioctl.c:51 __do_sys_ioctl linux/fs/ioctl.c:870 __se_sys_ioctl linux/fs/ioctl.c:856 __x64_sys_ioctl+0x13d/0x1c0 linux/fs/ioctl.c:856 do_syscall_x64 linux/arch/x86/entry/common.c:50 do_syscall_64+0x5b/0x90 linux/arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x72/0xdc linux/arch/x86/entry/entry_64.S:120 Freed by task 515: kasan_save_stack+0x38/0x70 linux/mm/kasan/common.c:45 kasan_set_track+0x25/0x40 linux/mm/kasan/common.c:52 kasan_save_free_info+0x2e/0x60 linux/mm/kasan/generic.c:521 ____kasan_slab_free linux/mm/kasan/common.c:236 ____kasan_slab_free+0x180/0x1f0 linux/mm/kasan/common.c:200 __kasan_slab_free+0x12/0x30 linux/mm/kasan/common.c:244 kasan_slab_free linux/./include/linux/kasan.h:162 slab_free_hook linux/mm/slub.c:1781 slab_free_freelist_hook+0xd2/0x1a0 linux/mm/slub.c:1807 slab_free linux/mm/slub.c:3787 __kmem_cache_free+0x196/0x2d0 linux/mm/slub.c:3800 kfree+0x78/0x120 linux/mm/slab_common.c:1019 qxl_ttm_bo_destroy+0x140/0x1a0 linux/drivers/gpu/drm/qxl/qxl_object.c:49 ttm_bo_release+0x678/0xa30 linux/drivers/gpu/drm/ttm/ttm_bo.c:381 kref_put linux/./include/linux/kref.h:65 ttm_bo_put+0x50/0x80 linux/drivers/gpu/drm/ttm/ttm_bo.c:393 qxl_gem_object_free+0x3e/0x60 linux/drivers/gpu/drm/qxl/qxl_gem.c:42 drm_gem_object_free+0x5c/0x90 linux/drivers/gpu/drm/drm_gem.c:974 kref_put linux/./include/linux/kref.h:65 __drm_gem_object_put linux/./include/drm/drm_gem.h:431 drm_gem_object_put linux/./include/drm/drm_gem.h:444 qxl_gem_object_create_with_handle+0x151/0x180 linux/drivers/gpu/drm/qxl/qxl_gem.c:100 qxl_mode_dumb_create+0x1cd/0x400 linux/drivers/gpu/drm/qxl/qxl_dumb.c:63 drm_mode_create_dumb linux/drivers/gpu/drm/drm_dumb_buffers.c:96 drm_mode_create_dumb_ioctl+0x1f5/0x2d0 linux/drivers/gpu/drm/drm_dumb_buffers.c:102 drm_ioctl_kernel+0x21d/0x430 linux/drivers/gpu/drm/drm_ioctl.c:788 drm_ioctl+0x56f/0xcc0 linux/drivers/gpu/drm/drm_ioctl.c:891 vfs_ioctl linux/fs/ioctl.c:51 __do_sys_ioctl linux/fs/ioctl.c:870 __se_sys_ioctl linux/fs/ioctl.c:856 __x64_sys_ioctl+0x13d/0x1c0 linux/fs/ioctl.c:856 do_syscall_x64 linux/arch/x86/entry/common.c:50 do_syscall_64+0x5b/0x90 linux/arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x72/0xdc linux/arch/x86/entry/entry_64.S:120 The buggy address belongs to the object at ffff88801136c000
which belongs to the cache kmalloc-1k of size 1024 The buggy address is located 576 bytes inside of freed 1024-byte region [ffff88801136c000, ffff88801136c400)
The buggy address belongs to the physical page: page:0000000089fc329b refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x11368 head:0000000089fc329b order:3 entire_mapcount:0 nr_pages_mapped:0 pincount:0 flags: 0xfffffc0010200(slab|head|node=0|zone=1|lastcpupid=0x1fffff) raw: 000fffffc0010200 ffff888007841dc0 dead000000000122 0000000000000000 raw: 0000000000000000 0000000080100010 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected Memory state around the buggy address: ffff88801136c100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff88801136c180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb >ffff88801136c200: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^ffff88801136c280: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fbffff88801136c300: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================
Disabling lock debugging due to kernel taint
Instead of returning a weak reference to the qxl_bo object, return the created drm_gem_object and let the caller decrement the reference count when it no longer needs it. As a convenience, if the caller is not interested in the gobj object, it can pass NULL to the parameter and the reference counting is descremented internally.
The bug and the reproducer were originally found by the Zero Day Initiative project (ZDI-CAN-20940).
--- drivers/gpu/drm/qxl/qxl_drv.h | 2 +- drivers/gpu/drm/qxl/qxl_dumb.c | 5 ++++- drivers/gpu/drm/qxl/qxl_gem.c | 25 +++++++++++++++++-------- drivers/gpu/drm/qxl/qxl_ioctl.c | 6 ++---- 4 files changed, 24 insertions(+), 14 deletions(-)
drivers/gpu/drm/qxl/qxl_drv.h +1 -1
@@ -318,7 +318,7 @@ int qxl_gem_object_create_with_handle(stu32 domain, size_t size, struct qxl_surface *surf, - struct qxl_bo **qobj, + struct drm_gem_object **gobj, uint32_t *handle);void qxl_gem_object_free (struct drm_gem_object *gobj);int qxl_gem_object_open (struct drm_gem_object *obj,struct drm_file *file_priv);
drivers/gpu/drm/qxl/qxl_dumb.c +4 -1
@@ -34,6 +34,7 @@ int qxl_mode_dumb_create(struct drm_file {struct qxl_device *qdev =to_qxl (dev);struct qxl_bo *qobj; +struct drm_gem_object *gobj;uint32_t handle;int r;struct qxl_surface surf;
@@ -62,11 +63,13 @@ int qxl_mode_dumb_create(struct drm_file r =qxl_gem_object_create_with_handle (qdev, file_priv,QXL_GEM_DOMAIN_CPU , - args->size, &surf, &qobj, + args->size, &surf, &gobj, &handle);if (r)return r; + qobj =gem_to_qxl_bo (gobj); qobj->is_dumb = true; +drm_gem_object_put (gobj); args->pitch = pitch; args->handle = handle;return 0 ;
drivers/gpu/drm/qxl/qxl_gem.c +17 -8
@@ -72,32 +72,41 @@ int qxl_gem_object_create(struct qxl_devreturn 0 ; } +/* +* If the caller passed a valid gobj pointer, it is responsible to call +* drm_gem_object_put() when it no longer needs to acess the object. +* +* If gobj is NULL, it is handled internally. +*/ int qxl_gem_object_create_with_handle (struct qxl_device *qdev,struct drm_file *file_priv,u32 domain,size_t size,struct qxl_surface *surf, -struct qxl_bo **qobj, +struct drm_gem_object **gobj,uint32_t *handle) { -struct drm_gem_object *gobj;int r; +struct drm_gem_object *local_gobj; -BUG_ON (!qobj);BUG_ON (!handle); r =qxl_gem_object_create (qdev, size,0 , domain, false, false, surf, - &gobj); + &local_gobj);if (r)return -ENOMEM ; - r =drm_gem_handle_create (file_priv, gobj, handle); + r =drm_gem_handle_create (file_priv, local_gobj, handle);if (r)return r; -/* drop reference from allocate - handle holds it now */ - *qobj =gem_to_qxl_bo (gobj); -drm_gem_object_put (gobj); + +if (gobj) + *gobj = local_gobj; +else +/* drop reference from allocate - handle holds it now */ +drm_gem_object_put (local_gobj); +return 0 ; }
drivers/gpu/drm/qxl/qxl_ioctl.c +2 -4
@@ -39,7 +39,6 @@ static int qxl_alloc_ioctl(struct drm_destruct qxl_device *qdev =to_qxl (dev);struct drm_qxl_alloc *qxl_alloc = data;int ret; -struct qxl_bo *qobj;uint32_t handle;u32 domain =QXL_GEM_DOMAIN_VRAM ;
@@ -51,7 +50,7 @@ static int qxl_alloc_ioctl(struct drm_de domain, qxl_alloc->size,NULL , - &qobj, &handle); + NULL, &handle);if (ret) {DRM_ERROR ("%s: failed to create gem ret=%d\n" , __func__, ret);
@@ -393,7 +392,6 @@ static int qxl_alloc_surf_ioctl(struct d {struct qxl_device *qdev =to_qxl (dev);struct drm_qxl_alloc_surf *param = data; -struct qxl_bo *qobj;int handle;int ret;int size, actual_stride;
@@ -413,7 +411,7 @@ static int qxl_alloc_surf_ioctl(struct dQXL_GEM_DOMAIN_SURFACE , size, &surf, - &qobj, &handle); + NULL, &handle);if (ret) {DRM_ERROR ("%s: failed to create gem ret=%d\n" , __func__, ret);
Greg Kroah-Hartman
maintainerPATCH 115/139 drm/amd: flush any delayed gfxoff on suspend entry
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
commit a7b7d9e8aee4f71b4c7151702fd74237b8cef989 upstream.
DCN 3.1.4 is reported to hang on s2idle entry if graphics activity is happening during entry. This is because GFXOFF was scheduled as delayed but RLC gets disabled in s2idle entry sequence which will hang GFX IP if not already in GFXOFF.
To help this problem, flush any delayed work for GFXOFF early in s2idle entry sequence to ensure that it's off when RLC is changed.
commit 4b31b92b143f ("drm/amdgpu: complete gfxoff allow signal during suspend without delay") modified power gating flow so that if called in s0ix that it ensured that GFXOFF wasn't put in work queue but instead processed immediately.
This is dead code due to commit 10cb67eb8a1b ("drm/amdgpu: skip CG/PG for gfx during S0ix") because GFXOFF will now not be explicitly called as part of the suspend entry code. Remove that dead code.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 9 +-------- 2 files changed, 2 insertions(+), 8 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +1 -0
@@ -4066,6 +4066,7 @@ int amdgpu_device_suspend(struct drm_devamdgpu_fbdev_set_suspend (adev,1 );cancel_delayed_work_sync (&adev->delayed_init_work); +flush_delayed_work (&adev->gfx.gfx_off_delay_work);amdgpu_ras_suspend (adev);
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +1 -8
@@ -579,15 +579,8 @@ void amdgpu_gfx_off_ctrl(struct amdgpu_dif (adev->gfx.gfx_off_req_count ==0 && !adev->gfx.gfx_off_state) { -/* If going to s2idle, no need to wait */ -if (adev->in_s0ix) { -if (!amdgpu_dpm_set_powergating_by_smu (adev, -AMD_IP_BLOCK_TYPE_GFX , true)) - adev->gfx.gfx_off_state = true; - }else { -schedule_delayed_work (&adev->gfx.gfx_off_delay_work, +schedule_delayed_work (&adev->gfx.gfx_off_delay_work, delay); - } } }else {if (adev->gfx.gfx_off_req_count ==0 ) {
Greg Kroah-Hartman
maintainerPATCH 116/139 netfilter: set default timeout to 3 secs for sctp shutdown send and recv state
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
commit 9bfab6d23a2865966a4f89a96536fbf23f83bc8c upstream.
In SCTP protocol, it is using the same timer (T2 timer) for SHUTDOWN and SHUTDOWN_ACK retransmission. However in sctp conntrack the default timeout value for SCTP_CONNTRACK_SHUTDOWN_ACK_SENT state is 3 secs while it's 300 msecs for SCTP_CONNTRACK_SHUTDOWN_SEND/RECV state.
As Paolo Valerio noticed, this might cause unwanted expiration of the ct entry. In my test, with 1s tc netem delay set on the NAT path, after the SHUTDOWN is sent, the sctp ct entry enters SCTP_CONNTRACK_SHUTDOWN_SEND state. However, due to 300ms (too short) delay, when the SHUTDOWN_ACK is sent back from the peer, the sctp ct entry has expired and been deleted, and then the SHUTDOWN_ACK has to be dropped.
Also, it is confusing these two sysctl options always show 0 due to all timeout values using sec as unit:
net.netfilter.nf_conntrack_sctp_timeout_shutdown_recd = 0 net.netfilter.nf_conntrack_sctp_timeout_shutdown_sent = 0
This patch fixes it by also using 3 secs for sctp shutdown send and recv state in sctp conntrack, which is also RTO.initial value in SCTP protocol.
Note that the very short time value for SCTP_CONNTRACK_SHUTDOWN_SEND/RECV was probably used for a rare scenario where SHUTDOWN is sent on 1st path but SHUTDOWN_ACK is replied on 2nd path, then a new connection started immediately on 1st path. So this patch also moves from SHUTDOWN_SEND/RECV to CLOSE when receiving INIT in the ORIGINAL direction.
--- net/netfilter/nf_conntrack_proto_sctp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/netfilter/nf_conntrack_proto_sctp.c +3 -3
@@ -49,8 +49,8 @@ static const unsigned int sctp_timeouts[ [SCTP_CONNTRACK_COOKIE_WAIT] = 3 SECS, [SCTP_CONNTRACK_COOKIE_ECHOED] = 3 SECS, [SCTP_CONNTRACK_ESTABLISHED] = 210 SECS, - [SCTP_CONNTRACK_SHUTDOWN_SENT] = 300 SECS / 1000, - [SCTP_CONNTRACK_SHUTDOWN_RECD] = 300 SECS / 1000, + [SCTP_CONNTRACK_SHUTDOWN_SENT] = 3 SECS, + [SCTP_CONNTRACK_SHUTDOWN_RECD] = 3 SECS, [SCTP_CONNTRACK_SHUTDOWN_ACK_SENT] = 3 SECS, [SCTP_CONNTRACK_HEARTBEAT_SENT] = 30 SECS, };
@@ -105,7 +105,7 @@ static const u8 sctp_conntracks[2][11][S {/* ORIGINAL */ /* sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS */ -/* init */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCW}, +/* init */ {sCL, sCL, sCW, sCE, sES, sCL, sCL, sSA, sCW}, /* init_ack */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCL}, /* abort */ {sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL}, /* shutdown */ {sCL, sCL, sCW, sCE, sSS, sSS, sSR, sSA, sCL},
Greg Kroah-Hartman
maintainerPATCH 117/139 exfat: check if filename entries exceeds max filename length
In reply to Greg Kroah-HartmanFrom: Namjae Jeon <[email protected]>
commit d42334578eba1390859012ebb91e1e556d51db49 upstream.
exfat_extract_uni_name copies characters from a given file name entry into the 'uniname' variable. This variable is actually defined on the stack of the exfat_readdir() function. According to the definition of the 'exfat_uni_name' type, the file name should be limited 255 characters (+ null teminator space), but the exfat_get_uniname_from_ext_entry() function can write more characters because there is no check if filename entries exceeds max filename length. This patch add the check not to copy filename characters when exceeding max filename length.
--- fs/exfat/dir.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
fs/exfat/dir.c +7 -2
@@ -34,6 +34,7 @@ static void exfat_get_uniname_from_ext_e {int i;struct exfat_entry_set_cache *es; +unsigned int uni_len =0 , len; es =exfat_get_dentry_set (sb, p_dir, entry,ES_ALL_ENTRIES );if (!es)
@@ -52,7 +53,10 @@ static void exfat_get_uniname_from_ext_eif (exfat_get_entry_type (ep) !=TYPE_EXTEND )break ; -exfat_extract_uni_name (ep, uniname); + len =exfat_extract_uni_name (ep, uniname); + uni_len += len; +if (len !=EXFAT_FILE_NAME_LEN || uni_len >=MAX_NAME_LENGTH ) +break ; uniname +=EXFAT_FILE_NAME_LEN ; }
@@ -1032,7 +1036,8 @@ rewind:if (entry_type ==TYPE_EXTEND ) {unsigned short entry_uniname[16 ], unichar; -if (step !=DIRENT_STEP_NAME ) { +if (step !=DIRENT_STEP_NAME || + name_len >=MAX_NAME_LENGTH ) { step =DIRENT_STEP_FILE ;continue ; }
Greg Kroah-Hartman
maintainerPATCH 118/139 arm64: dts: rockchip: Disable HS400 for eMMC on ROCK Pi 4
In reply to Greg Kroah-HartmanFrom: Christopher Obbard <[email protected]>
commit cee572756aa2cb46e959e9797ad4b730b78a050b upstream.
There is some instablity with some eMMC modules on ROCK Pi 4 SBCs running in HS400 mode. This ends up resulting in some block errors after a while or after a "heavy" operation utilising the eMMC (e.g. resizing a filesystem). An example of these errors is as follows:
[ 289.171014] mmc1: running CQE recovery
[ 290.048972] mmc1: running CQE recovery
[ 290.054834] mmc1: running CQE recovery
[ 290.060817] mmc1: running CQE recovery
[ 290.061337] blk_update_request: I/O error, dev mmcblk1, sector 1411072 op 0x1:(WRITE) flags 0x800 phys_seg 36 prio class 0
[ 290.061370] EXT4-fs warning (device mmcblk1p1): ext4_end_bio:348: I/O error 10 writing to inode 29547 starting block 176466)
[ 290.061484] Buffer I/O error on device mmcblk1p1, logical block 172288
[ 290.061531] Buffer I/O error on device mmcblk1p1, logical block 172289
[ 290.061551] Buffer I/O error on device mmcblk1p1, logical block 172290
[ 290.061574] Buffer I/O error on device mmcblk1p1, logical block 172291
[ 290.061592] Buffer I/O error on device mmcblk1p1, logical block 172292
[ 290.061615] Buffer I/O error on device mmcblk1p1, logical block 172293
[ 290.061632] Buffer I/O error on device mmcblk1p1, logical block 172294
[ 290.061654] Buffer I/O error on device mmcblk1p1, logical block 172295
[ 290.061673] Buffer I/O error on device mmcblk1p1, logical block 172296
[ 290.061695] Buffer I/O error on device mmcblk1p1, logical block 172297Disabling the Command Queue seems to stop the CQE recovery from running, but doesn't seem to improve the I/O errors. Until this can be investigated further, disable HS400 mode on the ROCK Pi 4 SBCs to at least stop I/O errors from occurring.
While we are here, set the eMMC maximum clock frequency to 1.5MHz to follow the ROCK 4C+.
--- arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi +2 -2
@@ -595,9 +595,9 @@ }; &sdhci { + max-frequency = <150000000>; bus-width = <8>; - mmc-hs400-1_8v; - mmc-hs400-enhanced-strobe; + mmc-hs200-1_8v; non-removable; status = "okay"; };
Greg Kroah-Hartman
maintainerPATCH 119/139 af_unix: Fix null-ptr-deref in unix_stream_sendpage().
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
Bing-Jhong Billy Jheng reported null-ptr-deref in unix_stream_sendpage() with detailed analysis and a nice repro.
unix_stream_sendpage() tries to add data to the last skb in the peer's recv queue without locking the queue.
If the peer's FD is passed to another socket and the socket's FD is passed to the peer, there is a loop between them. If we close both sockets without receiving FD, the sockets will be cleaned up by garbage collection.
The garbage collection iterates such sockets and unlinks skb with FD from the socket's receive queue under the queue's lock.
So, there is a race where unix_stream_sendpage() could access an skb locklessly that is being released by garbage collection, resulting in use-after-free.
To avoid the issue, unix_stream_sendpage() must lock the peer's recv queue.
Note the issue does not exist in 6.5+ thanks to the recent sendpage() refactoring.
This patch is originally written by Linus Torvalds.
BUG: unable to handle page fault for address: ffff988004dd6870
PF: supervisor read access in kernel mode
PF: error_code(0x0000) - not-present page
PGD 0 P4D 0
PREEMPT SMP PTI
CPU: 4 PID: 297 Comm: garbage_uaf Not tainted 6.1.46 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014 RIP: 0010:kmem_cache_alloc_node+0xa2/0x1e0 Code: c0 0f 84 32 01 00 00 41 83 fd ff 74 10 48 8b 00 48 c1 e8 3a 41 39 c5 0f 85 1c 01 00 00 41 8b 44 24 28 49 8b 3c 24 48 8d 4a 40 <49> 8b 1c 06 4c 89 f0 65 48 0f c7 0f 0f 94 c0 84 c0 74 a1 41 8b 44 RSP: 0018:ffffc9000079fac0 EFLAGS: 00000246 RAX: 0000000000000070 RBX: 0000000000000005 RCX: 000000000001a284 RDX: 000000000001a244 RSI: 0000000000400cc0 RDI: 000000000002eee0 RBP: 0000000000400cc0 R08: 0000000000400cc0 R09: 0000000000000003 R10: 0000000000000001 R11: 0000000000000000 R12: ffff888003970f00 R13: 00000000ffffffff R14: ffff988004dd6800 R15: 00000000000000e8 FS: 00007f174d6f3600(0000) GS:ffff88807db00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffff988004dd6870 CR3: 00000000092be000 CR4: 00000000007506e0 PKRU: 55555554 Call Trace: <TASK> ? __die_body.cold+0x1a/0x1f ? page_fault_oops+0xa9/0x1e0 ? fixup_exception+0x1d/0x310 ? exc_page_fault+0xa8/0x150 ? asm_exc_page_fault+0x22/0x30 ? kmem_cache_alloc_node+0xa2/0x1e0 ? __alloc_skb+0x16c/0x1e0 __alloc_skb+0x16c/0x1e0 alloc_skb_with_frags+0x48/0x1e0 sock_alloc_send_pskb+0x234/0x270 unix_stream_sendmsg+0x1f5/0x690 sock_sendmsg+0x5d/0x60 ____sys_sendmsg+0x210/0x260 ___sys_sendmsg+0x83/0xd0 ? kmem_cache_alloc+0xc6/0x1c0 ? avc_disable+0x20/0x20 ? percpu_counter_add_batch+0x53/0xc0 ? alloc_empty_file+0x5d/0xb0 ? alloc_file+0x91/0x170 ? alloc_file_pseudo+0x94/0x100 ? __fget_light+0x9f/0x120 __sys_sendmsg+0x54/0xa0 do_syscall_64+0x3b/0x90 entry_SYSCALL_64_after_hwframe+0x69/0xd3 RIP: 0033:0x7f174d639a7d Code: 28 89 54 24 1c 48 89 74 24 10 89 7c 24 08 e8 8a c1 f4 ff 8b 54 24 1c 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 33 44 89 c7 48 89 44 24 08 e8 de c1 f4 ff 48 RSP: 002b:00007ffcb563ea50 EFLAGS: 00000293 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f174d639a7d RDX: 0000000000000000 RSI: 00007ffcb563eab0 RDI: 0000000000000007 RBP: 00007ffcb563eb10 R08: 0000000000000000 R09: 00000000ffffffff R10: 00000000004040a0 R11: 0000000000000293 R12: 00007ffcb563ec28 R13: 0000000000401398 R14: 0000000000403e00 R15: 00007f174d72c000 </TASK>
--- net/unix/af_unix.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
net/unix/af_unix.c +4 -5
@@ -2156,6 +2156,7 @@ static ssize_t unix_stream_sendpage(struif (false) { alloc_skb: +spin_unlock (&other->sk_receive_queue.lock);unix_state_unlock (other);mutex_unlock (&unix_sk (other)->iolock); newskb = sock_alloc_send_pskb(sk, 0, 0, flags & MSG_DONTWAIT,
@@ -2195,6 +2196,7 @@ alloc_skb: init_scm = false; } +spin_lock (&other->sk_receive_queue.lock); skb =skb_peek_tail (&other->sk_receive_queue);if (tail && tail == skb) { skb = newskb;
@@ -2225,14 +2227,11 @@ alloc_skb:refcount_add (size, &sk->sk_wmem_alloc);if (newskb) { - err =unix_scm_to_skb (&scm, skb, false); -if (err) - goto err_state_unlock; -spin_lock (&other->sk_receive_queue.lock); +unix_scm_to_skb (&scm, skb, false);__skb_queue_tail (&other->sk_receive_queue, newskb); -spin_unlock (&other->sk_receive_queue.lock); } +spin_unlock (&other->sk_receive_queue.lock);unix_state_unlock (other);mutex_unlock (&unix_sk (other)->iolock);
Greg Kroah-Hartman
maintainerPATCH 120/139 virtio-net: set queues after driver_ok
In reply to Greg Kroah-HartmanFrom: Jason Wang <[email protected]>
commit 51b813176f098ff61bd2833f627f5319ead098a5 upstream.
Commit 25266128fe16 ("virtio-net: fix race between set queues and probe") tries to fix the race between set queues and probe by calling _virtnet_set_queues() before DRIVER_OK is set. This violates virtio spec. Fixing this by setting queues after virtio_device_ready().
Note that rtnl needs to be held for userspace requests to change the number of queues. So we are serialized in this way.
--- drivers/net/virtio_net.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/virtio_net.c +2 -2
@@ -3319,8 +3319,6 @@ static int virtnet_probe(struct virtio_d } } -_virtnet_set_queues (vi, vi->curr_queue_pairs); -/* serialize netdev register + virtio_device_ready() with ndo_open() */ rtnl_lock ();
@@ -3333,6 +3331,8 @@ static int virtnet_probe(struct virtio_dvirtio_device_ready (vdev); +_virtnet_set_queues (vi, vi->curr_queue_pairs); +rtnl_unlock (); err =virtnet_cpu_notif_add (vi);
Greg Kroah-Hartman
maintainerPATCH 121/139 net: fix the RTO timer retransmitting skb every 1ms if linear option is enabled
In reply to Greg Kroah-HartmanFrom: Jason Xing <[email protected]>
commit e4dd0d3a2f64b8bd8029ec70f52bdbebd0644408 upstream.
In the real workload, I encountered an issue which could cause the RTO timer to retransmit the skb per 1ms with linear option enabled. The amount of lost-retransmitted skbs can go up to 1000+ instantly.
The root cause is that if the icsk_rto happens to be zero in the 6th round (which is the TCP_THIN_LINEAR_RETRIES value), then it will always be zero due to the changed calculation method in tcp_retransmit_timer() as follows:
icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX);
Above line could be converted toicsk->icsk_rto = min(0 << 1, TCP_RTO_MAX) = 0
Therefore, the timer expires so quickly without any doubt.
I read through the RFC 6298 and found that the RTO value can be rounded up to a certain value, in Linux, say TCP_RTO_MIN as default, which is regarded as the lower bound in this patch as suggested by Eric.
--- net/ipv4/tcp_timer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/ipv4/tcp_timer.c +3 -1
@@ -582,7 +582,9 @@ out_reset_timer: tcp_stream_is_thin(tp) && icsk->icsk_retransmits <= TCP_THIN_LINEAR_RETRIES) { icsk->icsk_backoff = 0; - icsk->icsk_rto = min(__tcp_set_rto(tp), TCP_RTO_MAX); + icsk->icsk_rto = clamp(__tcp_set_rto(tp), + tcp_rto_min(sk), + TCP_RTO_MAX); } else {/* Use normal (exponential) backoff */ icsk->icsk_rto =min (icsk->icsk_rto <<1 ,TCP_RTO_MAX );
Greg Kroah-Hartman
maintainerPATCH 122/139 mmc: f-sdh30: fix order of function calls in sdhci_f_sdh30_remove
In reply to Greg Kroah-HartmanFrom: Yangtao Li <[email protected]>
commit 58abdd80b93b09023ca03007b608685c41e3a289 upstream.
The order of function calls in sdhci_f_sdh30_remove is wrong, let's call sdhci_pltfm_unregister first.
--- drivers/mmc/host/sdhci_f_sdh30.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/mmc/host/sdhci_f_sdh30.c +5 -3
@@ -188,12 +188,14 @@ static int sdhci_f_sdh30_remove(struct p {struct sdhci_host *host =platform_get_drvdata (pdev);struct f_sdhost_priv *priv =sdhci_f_sdhost_priv (host); - -clk_disable_unprepare (priv->clk_iface); -clk_disable_unprepare (priv->clk); +struct clk *clk_iface = priv->clk_iface; +struct clk *clk = priv->clk;sdhci_pltfm_unregister (pdev); +clk_disable_unprepare (clk_iface); +clk_disable_unprepare (clk); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 123/139 x86/cpu: Fix __x86_return_thunk symbol type
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit 77f67119004296a9b2503b377d610e08b08afc2a upstream.
Commit
fb3bd914b3ec ("x86/srso: Add a Speculative RAS Overflow mitigation")
reimplemented __x86_return_thunk with a mix of SYM_FUNC_START and SYM_CODE_END, this is not a sane combination.
Since nothing should ever actually 'CALL' this, make it consistently CODE.
--- arch/x86/lib/retpoline.S | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/x86/lib/retpoline.S +3 -1
@@ -204,7 +204,9 @@ SYM_CODE_END(srso_safe_ret) SYM_FUNC_END(srso_untrain_ret) __EXPORT_THUNK(srso_untrain_ret) -SYM_FUNC_START(__x86_return_thunk) +SYM_CODE_START(__x86_return_thunk) + UNWIND_HINT_FUNC + ANNOTATE_NOENDBR ALTERNATIVE_2 "jmp __ret", "call srso_safe_ret", X86_FEATURE_SRSO, \ "call srso_safe_ret_alias", X86_FEATURE_SRSO_ALIAS int3
Greg Kroah-Hartman
maintainerPATCH 124/139 x86/cpu: Fix up srso_safe_ret() and __x86_return_thunk()
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit af023ef335f13c8b579298fc432daeef609a9e60 upstream.
vmlinux.o: warning: objtool: srso_untrain_ret() falls through to next function __x86_return_skl() vmlinux.o: warning: objtool: __x86_return_thunk() falls through to next function __x86_return_skl()
This is because these functions (can) end with CALL, which objtool does not consider a terminating instruction. Therefore, replace the INT3 instruction (which is a non-fatal trap) with UD2 (which is a fatal-trap).
This indicates execution will not continue past this point.
--- arch/x86/lib/retpoline.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/lib/retpoline.S +2 -2
@@ -199,7 +199,7 @@ SYM_INNER_LABEL(srso_safe_ret, SYM_L_GLO int3 lfence call srso_safe_ret - int3 + ud2 SYM_CODE_END(srso_safe_ret) SYM_FUNC_END(srso_untrain_ret) __EXPORT_THUNK(srso_untrain_ret)
@@ -209,7 +209,7 @@ SYM_CODE_START(__x86_return_thunk) ANNOTATE_NOENDBR ALTERNATIVE_2 "jmp __ret", "call srso_safe_ret", X86_FEATURE_SRSO, \ "call srso_safe_ret_alias", X86_FEATURE_SRSO_ALIAS - int3 + ud2 SYM_CODE_END(__x86_return_thunk) EXPORT_SYMBOL(__x86_return_thunk)
Greg Kroah-Hartman
maintainerPATCH 125/139 x86/alternative: Make custom return thunk unconditional
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit 095b8303f3835c68ac4a8b6d754ca1c3b6230711 upstream.
There is infrastructure to rewrite return thunks to point to any random thunk one desires, unwrap that from CALL_THUNKS, which up to now was the sole user of that.
[ bp: Make the thunks visible on 32-bit and add ifdeffery for the
32-bit builds. ]
--- arch/x86/include/asm/nospec-branch.h | 5 +++++ arch/x86/kernel/cpu/bugs.c | 2 ++ 2 files changed, 7 insertions(+)
arch/x86/include/asm/nospec-branch.h +5 -0
@@ -195,7 +195,12 @@ _ASM_PTR" 999b\n\t" \".popsection\n\t" +#ifdef CONFIG_RETHUNK extern void __x86_return_thunk(void); +#else +static inline void __x86_return_thunk (void ) {} +#endif +extern void zen_untrain_ret (void );extern void srso_untrain_ret (void );extern void srso_untrain_ret_alias (void );
arch/x86/kernel/cpu/bugs.c +2 -0
@@ -62,6 +62,8 @@ EXPORT_SYMBOL_GPL(x86_pred_cmd);static DEFINE_MUTEX (spec_ctrl_mutex); +void (*x86_return_thunk)(void )__ro_after_init = &__x86_return_thunk; +/* Update SPEC_CTRL MSR and its cached copy unconditionally */ static void update_spec_ctrl (u64 val) {
Greg Kroah-Hartman
maintainerPATCH 126/139 objtool: Add frame-pointer-specific function ignore
In reply to Greg Kroah-HartmanFrom: Josh Poimboeuf <[email protected]>
[ Upstream commit e028c4f7ac7ca8c96126fe46c54ab3d56ffe6a66 ]
Add a CONFIG_FRAME_POINTER-specific version of STACK_FRAME_NON_STANDARD() for the case where a function is intentionally missing frame pointer setup, but otherwise needs objtool/ORC coverage when frame pointers are disabled.
Stable-dep-of: c8c301abeae5 ("x86/ibt: Add ANNOTATE_NOENDBR")
--- include/linux/objtool.h | 12 ++++++++++++ tools/include/linux/objtool.h | 12 ++++++++++++ 2 files changed, 24 insertions(+)
include/linux/objtool.h +12 -0
@@ -71,6 +71,17 @@ struct unwind_hint { static void __used __section(".discard.func_stack_frame_non_standard") \ *__func_stack_frame_non_standard_##func = func +/* +* STACK_FRAME_NON_STANDARD_FP() is a frame-pointer-specific function ignore +* for the case where a function is intentionally missing frame pointer setup, +* but otherwise needs objtool/ORC coverage when frame pointers are disabled. +*/ +#ifdef CONFIG_FRAME_POINTER +#define STACK_FRAME_NON_STANDARD_FP (func) STACK_FRAME_NON_STANDARD(func) +#else +#define STACK_FRAME_NON_STANDARD_FP (func) +#endif +#else /* __ASSEMBLY__ */ /*
@@ -132,6 +143,7 @@ struct unwind_hint {#define UNWIND_HINT (sp_reg, sp_offset, type, end) \ "\n\t"#define STACK_FRAME_NON_STANDARD (func) +#define STACK_FRAME_NON_STANDARD_FP (func)#else #define ANNOTATE_INTRA_FUNCTION_CALL .macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 end=0
tools/include/linux/objtool.h +12 -0
@@ -71,6 +71,17 @@ struct unwind_hint { static void __used __section(".discard.func_stack_frame_non_standard") \ *__func_stack_frame_non_standard_##func = func +/* +* STACK_FRAME_NON_STANDARD_FP() is a frame-pointer-specific function ignore +* for the case where a function is intentionally missing frame pointer setup, +* but otherwise needs objtool/ORC coverage when frame pointers are disabled. +*/ +#ifdef CONFIG_FRAME_POINTER +#define STACK_FRAME_NON_STANDARD_FP (func) STACK_FRAME_NON_STANDARD(func) +#else +#define STACK_FRAME_NON_STANDARD_FP (func) +#endif +#else /* __ASSEMBLY__ */ /*
@@ -132,6 +143,7 @@ struct unwind_hint {#define UNWIND_HINT (sp_reg, sp_offset, type, end) \ "\n\t"#define STACK_FRAME_NON_STANDARD (func) +#define STACK_FRAME_NON_STANDARD_FP (func)#else #define ANNOTATE_INTRA_FUNCTION_CALL .macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 end=0
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 127/139 x86/ibt: Add ANNOTATE_NOENDBR
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
[ Upstream commit c8c301abeae58ec756b8fcb2178a632bd3c9e284 ]
In order to have objtool warn about code references to !ENDBR instruction, we need an annotation to allow this for non-control-flow instances -- consider text range checks, text patching, or return trampolines etc.
--- include/linux/objtool.h | 16 ++++++++++++++++ tools/include/linux/objtool.h | 16 ++++++++++++++++ 2 files changed, 32 insertions(+)
include/linux/objtool.h +16 -0
@@ -82,6 +82,12 @@ struct unwind_hint {#define STACK_FRAME_NON_STANDARD_FP (func)#endif +#define ANNOTATE_NOENDBR \ + "986: \n\t" \ + ".pushsection .discard.noendbr\n\t" \ + _ASM_PTR " 986b\n\t" \ + ".popsection\n\t" +#else /* __ASSEMBLY__ */ /*
@@ -134,6 +140,13 @@ struct unwind_hint { .popsection .endm +.macro ANNOTATE_NOENDBR +.Lhere_\@: + .pushsection .discard.noendbr + .quad .Lhere_\@ + .popsection +.endm +#endif /* __ASSEMBLY__ */ #else /* !CONFIG_STACK_VALIDATION */
@@ -144,12 +157,15 @@ struct unwind_hint { "\n\t"#define STACK_FRAME_NON_STANDARD (func)#define STACK_FRAME_NON_STANDARD_FP (func) +#define ANNOTATE_NOENDBR #else #define ANNOTATE_INTRA_FUNCTION_CALL .macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 end=0 .endm .macro STACK_FRAME_NON_STANDARD func:req .endm +.macro ANNOTATE_NOENDBR +.endm#endif #endif /* CONFIG_STACK_VALIDATION */
tools/include/linux/objtool.h +16 -0
@@ -82,6 +82,12 @@ struct unwind_hint {#define STACK_FRAME_NON_STANDARD_FP (func)#endif +#define ANNOTATE_NOENDBR \ + "986: \n\t" \ + ".pushsection .discard.noendbr\n\t" \ + _ASM_PTR " 986b\n\t" \ + ".popsection\n\t" +#else /* __ASSEMBLY__ */ /*
@@ -134,6 +140,13 @@ struct unwind_hint { .popsection .endm +.macro ANNOTATE_NOENDBR +.Lhere_\@: + .pushsection .discard.noendbr + .quad .Lhere_\@ + .popsection +.endm +#endif /* __ASSEMBLY__ */ #else /* !CONFIG_STACK_VALIDATION */
@@ -144,12 +157,15 @@ struct unwind_hint { "\n\t"#define STACK_FRAME_NON_STANDARD (func)#define STACK_FRAME_NON_STANDARD_FP (func) +#define ANNOTATE_NOENDBR #else #define ANNOTATE_INTRA_FUNCTION_CALL .macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 end=0 .endm .macro STACK_FRAME_NON_STANDARD func:req .endm +.macro ANNOTATE_NOENDBR +.endm#endif #endif /* CONFIG_STACK_VALIDATION */
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 128/139 x86/cpu: Clean up SRSO return thunk mess
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit d43490d0ab824023e11d0b57d0aeec17a6e0ca13 upstream.
Use the existing configurable return thunk. There is absolute no justification for having created this __x86_return_thunk alternative.
To clarify, the whole thing looks like:
Zen3/4 does:
srso_alias_untrain_ret:
nop2
lfence
jmp srso_alias_return_thunk
int3
srso_alias_safe_ret: // aliasses srso_alias_untrain_ret just so
add $8, %rsp ret int3
srso_alias_return_thunk:
call srso_alias_safe_ret ud2
While Zen1/2 does:
srso_untrain_ret:
movabs $foo, %rax
lfence
call srso_safe_ret (jmp srso_return_thunk ?)
int3
srso_safe_ret: // embedded in movabs instruction
add $8,%rsp
ret
int3 srso_return_thunk:
call srso_safe_ret ud2
While retbleed does:
zen_untrain_ret:
test $0xcc, %bl
lfence
jmp zen_return_thunk
int3 zen_return_thunk: // embedded in the test instruction
ret
int3
Where Zen1/2 flush the BTB entry using the instruction decoder trick (test,movabs) Zen3/4 use BTB aliasing. SRSO adds a return sequence (srso_safe_ret()) which forces the function return instruction to speculate into a trap (UD2). This RET will then mispredict and execution will continue at the return site read from the top of the stack.
Pick one of three options at boot (evey function can only ever return once).
[ bp: Fixup commit message uarch details and add them in a comment in
the code too. Add a comment about the srso_select_mitigation() dependency on retbleed_select_mitigation(). Add moar ifdeffery for 32-bit builds. Add a dummy srso_untrain_ret_alias() definition for 32-bit alternatives needing the symbol. ]
--- arch/x86/include/asm/nospec-branch.h | 5 +++ arch/x86/kernel/cpu/bugs.c | 17 ++++++++-- arch/x86/kernel/vmlinux.lds.S | 4 +- arch/x86/lib/retpoline.S | 58 +++++++++++++++++++++++++---------- tools/objtool/arch/x86/decode.c | 2 - 5 files changed, 64 insertions(+), 22 deletions(-)
arch/x86/include/asm/nospec-branch.h +5 -0
@@ -201,9 +201,14 @@ extern void __x86_return_thunk(void);static inline void __x86_return_thunk (void ) {}#endif +extern void zen_return_thunk (void ); +extern void srso_return_thunk (void ); +extern void srso_alias_return_thunk (void ); +extern void zen_untrain_ret (void );extern void srso_untrain_ret (void );extern void srso_untrain_ret_alias (void ); +extern void entry_ibpb (void );#ifdef CONFIG_RETPOLINE
arch/x86/kernel/cpu/bugs.c +14 -3
@@ -166,8 +166,13 @@ void __init cpu_select_mitigations(void)md_clear_select_mitigation ();srbds_select_mitigation ();l1d_flush_select_mitigation (); -gds_select_mitigation (); + +/* +* srso_select_mitigation() depends and must run after +* retbleed_select_mitigation(). +*/ srso_select_mitigation (); +gds_select_mitigation (); }/*
@@ -1015,6 +1020,9 @@ do_cmd_auto:setup_force_cpu_cap (X86_FEATURE_RETHUNK );setup_force_cpu_cap (X86_FEATURE_UNRET ); +if (IS_ENABLED (CONFIG_RETHUNK )) + x86_return_thunk = zen_return_thunk; +if (boot_cpu_data.x86_vendor !=X86_VENDOR_AMD && boot_cpu_data.x86_vendor !=X86_VENDOR_HYGON )pr_err (RETBLEED_UNTRAIN_MSG );
@@ -2422,10 +2430,13 @@ static void __init srso_select_mitigatio*/ setup_force_cpu_cap (X86_FEATURE_RETHUNK ); -if (boot_cpu_data.x86 ==0x19 ) +if (boot_cpu_data.x86 ==0x19 ) {setup_force_cpu_cap (X86_FEATURE_SRSO_ALIAS ); -else + x86_return_thunk = srso_alias_return_thunk; + }else {setup_force_cpu_cap (X86_FEATURE_SRSO ); + x86_return_thunk = srso_return_thunk; + } srso_mitigation =SRSO_MITIGATION_SAFE_RET ; }else {pr_err ("WARNING: kernel not compiled with CPU_SRSO.\n" );
arch/x86/kernel/vmlinux.lds.S +2 -2
@@ -511,8 +511,8 @@ INIT_PER_CPU(irq_stack_backing_store); "fixed_percpu_data is not at start of per-cpu area"); #endif - #ifdef CONFIG_RETHUNK -. = ASSERT((__ret & 0x3f) == 0, "__ret not cacheline-aligned"); +#ifdef CONFIG_RETHUNK +. = ASSERT((zen_return_thunk & 0x3f) == 0, "zen_return_thunk not cacheline-aligned"); . = ASSERT((srso_safe_ret & 0x3f) == 0, "srso_safe_ret not cacheline-aligned"); #endif
arch/x86/lib/retpoline.S +42 -16
139 lines not on this page · raw message
tools/objtool/arch/x86/decode.c +1 -1
@@ -728,5 +728,5 @@ bool arch_is_rethunk(struct symbol *sym)return !strcmp (sym->name,"__x86_return_thunk" ) || !strcmp (sym->name,"srso_untrain_ret" ) || !strcmp (sym->name,"srso_safe_ret" ) || - !strcmp (sym->name,"__ret" ); + !strcmp (sym->name,"zen_return_thunk" ); }
Greg Kroah-Hartman
maintainerPATCH 129/139 x86/cpu: Rename original retbleed methods
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit d025b7bac07a6e90b6b98b487f88854ad9247c39 upstream.
Rename the original retbleed return thunk and untrain_ret to retbleed_return_thunk() and retbleed_untrain_ret().
No functional changes.
--- arch/x86/include/asm/nospec-branch.h | 8 ++++---- arch/x86/kernel/cpu/bugs.c | 2 +- arch/x86/kernel/vmlinux.lds.S | 2 +- arch/x86/lib/retpoline.S | 30 +++++++++++++++--------------- tools/objtool/arch/x86/decode.c | 2 +- tools/objtool/check.c | 2 +- 6 files changed, 23 insertions(+), 23 deletions(-)
arch/x86/include/asm/nospec-branch.h +4 -4
@@ -156,7 +156,7 @@ .endm#ifdef CONFIG_CPU_UNRET_ENTRY -#define CALL_ZEN_UNTRAIN_RET "call zen_untrain_ret" +#define CALL_ZEN_UNTRAIN_RET "call retbleed_untrain_ret"#else #define CALL_ZEN_UNTRAIN_RET ""#endif
@@ -166,7 +166,7 @@* return thunk isn't mapped into the userspace tables (then again, AMD * typically has NO_MELTDOWN). * -* While zen_untrain_ret() doesn't clobber anything but requires stack, +* While retbleed_untrain_ret() doesn't clobber anything but requires stack, * entry_ibpb() will clobber AX, CX, DX. * * As such, this must be placed after every *SWITCH_TO_KERNEL_CR3 at a point
@@ -201,11 +201,11 @@ extern void __x86_return_thunk(void);static inline void __x86_return_thunk (void ) {}#endif -extern void zen_return_thunk (void ); +extern void retbleed_return_thunk (void );extern void srso_return_thunk (void );extern void srso_alias_return_thunk (void ); -extern void zen_untrain_ret (void ); +extern void retbleed_untrain_ret (void );extern void srso_untrain_ret (void );extern void srso_untrain_ret_alias (void );
arch/x86/kernel/cpu/bugs.c +1 -1
@@ -1021,7 +1021,7 @@ do_cmd_auto:setup_force_cpu_cap (X86_FEATURE_UNRET );if (IS_ENABLED (CONFIG_RETHUNK )) - x86_return_thunk = zen_return_thunk; + x86_return_thunk = retbleed_return_thunk;if (boot_cpu_data.x86_vendor !=X86_VENDOR_AMD && boot_cpu_data.x86_vendor !=X86_VENDOR_HYGON )
arch/x86/kernel/vmlinux.lds.S +1 -1
@@ -512,7 +512,7 @@ INIT_PER_CPU(irq_stack_backing_store); #endif #ifdef CONFIG_RETHUNK -. = ASSERT((zen_return_thunk & 0x3f) == 0, "zen_return_thunk not cacheline-aligned"); +. = ASSERT((retbleed_return_thunk & 0x3f) == 0, "retbleed_return_thunk not cacheline-aligned"); . = ASSERT((srso_safe_ret & 0x3f) == 0, "srso_safe_ret not cacheline-aligned"); #endif
arch/x86/lib/retpoline.S +15 -15
@@ -129,32 +129,32 @@ SYM_CODE_END(srso_alias_return_thunk) /* * Safety details here pertain to the AMD Zen{1,2} microarchitecture: - * 1) The RET at zen_return_thunk must be on a 64 byte boundary, for + * 1) The RET at retbleed_return_thunk must be on a 64 byte boundary, for * alignment within the BTB. - * 2) The instruction at zen_untrain_ret must contain, and not + * 2) The instruction at retbleed_untrain_ret must contain, and not * end with, the 0xc3 byte of the RET. * 3) STIBP must be enabled, or SMT disabled, to prevent the sibling thread * from re-poisioning the BTB prediction. */ .align 64 - .skip 64 - (zen_return_thunk - zen_untrain_ret), 0xcc -SYM_FUNC_START_NOALIGN(zen_untrain_ret); + .skip 64 - (retbleed_return_thunk - retbleed_untrain_ret), 0xcc +SYM_FUNC_START_NOALIGN(retbleed_untrain_ret); /* - * As executed from zen_untrain_ret, this is: + * As executed from retbleed_untrain_ret, this is: * * TEST $0xcc, %bl * LFENCE - * JMP zen_return_thunk + * JMP retbleed_return_thunk * * Executing the TEST instruction has a side effect of evicting any BTB * prediction (potentially attacker controlled) attached to the RET, as - * zen_return_thunk + 1 isn't an instruction boundary at the moment. + * retbleed_return_thunk + 1 isn't an instruction boundary at the moment. */ .byte 0xf6 /* - * As executed from zen_return_thunk, this is a plain RET. + * As executed from retbleed_return_thunk, this is a plain RET. * * As part of the TEST above, RET is the ModRM byte, and INT3 the imm8. *
@@ -166,13 +166,13 @@ SYM_FUNC_START_NOALIGN(zen_untrain_ret); * With SMT enabled and STIBP active, a sibling thread cannot poison * RET's prediction to a type of its choice, but can evict the * prediction due to competitive sharing. If the prediction is - * evicted, zen_return_thunk will suffer Straight Line Speculation + * evicted, retbleed_return_thunk will suffer Straight Line Speculation * which will be contained safely by the INT3. */ -SYM_INNER_LABEL(zen_return_thunk, SYM_L_GLOBAL) +SYM_INNER_LABEL(retbleed_return_thunk, SYM_L_GLOBAL) ret int3 -SYM_CODE_END(zen_return_thunk) +SYM_CODE_END(retbleed_return_thunk) /* * Ensure the TEST decoding / BTB invalidation is complete.
@@ -183,13 +183,13 @@ SYM_CODE_END(zen_return_thunk) * Jump back and execute the RET in the middle of the TEST instruction. * INT3 is for SLS protection. */ - jmp zen_return_thunk + jmp retbleed_return_thunk int3 -SYM_FUNC_END(zen_untrain_ret) -__EXPORT_THUNK(zen_untrain_ret) +SYM_FUNC_END(retbleed_untrain_ret) +__EXPORT_THUNK(retbleed_untrain_ret) /* - * SRSO untraining sequence for Zen1/2, similar to zen_untrain_ret() + * SRSO untraining sequence for Zen1/2, similar to retbleed_untrain_ret() * above. On kernel entry, srso_untrain_ret() is executed which is a * * movabs $0xccccccc308c48348,%rax
tools/objtool/arch/x86/decode.c +1 -1
@@ -728,5 +728,5 @@ bool arch_is_rethunk(struct symbol *sym)return !strcmp (sym->name,"__x86_return_thunk" ) || !strcmp (sym->name,"srso_untrain_ret" ) || !strcmp (sym->name,"srso_safe_ret" ) || - !strcmp (sym->name,"zen_return_thunk" ); + !strcmp (sym->name,"retbleed_return_thunk" ); }
tools/objtool/check.c +1 -1
@@ -1228,7 +1228,7 @@ static int add_jump_destinations(structcontinue ;/* -* This is a special case for zen_untrain_ret(). +* This is a special case for retbleed_untrain_ret(). * It jumps to __x86_return_thunk(), but objtool * can't find the thunk's starting RET * instruction, because the RET is also in the
Greg Kroah-Hartman
maintainerPATCH 130/139 x86/cpu: Rename srso_(.*)_alias to srso_alias_\1
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit 42be649dd1f2eee6b1fb185f1a231b9494cf095f upstream.
For a more consistent namespace.
[ bp: Fixup names in the doc too. ]
--- Documentation/admin-guide/hw-vuln/srso.rst | 4 ++-- arch/x86/include/asm/nospec-branch.h | 4 ++-- arch/x86/kernel/vmlinux.lds.S | 8 ++++---- arch/x86/lib/retpoline.S | 26 +++++++++++++------------- 4 files changed, 21 insertions(+), 21 deletions(-)
Documentation/admin-guide/hw-vuln/srso.rst +2 -2
@@ -124,8 +124,8 @@ sequence. To ensure the safety of this mitigation, the kernel must ensure that the safe return sequence is itself free from attacker interference. In Zen3 and Zen4, this is accomplished by creating a BTB alias between the -untraining function srso_untrain_ret_alias() and the safe return -function srso_safe_ret_alias() which results in evicting a potentially +untraining function srso_alias_untrain_ret() and the safe return +function srso_alias_safe_ret() which results in evicting a potentially poisoned BTB entry and using that safe one for all function returns. In older Zen1 and Zen2, this is accomplished using a reinterpretation
arch/x86/include/asm/nospec-branch.h +2 -2
@@ -183,7 +183,7 @@#ifdef CONFIG_CPU_SRSO ALTERNATIVE_2 "" ,"call srso_untrain_ret" ,X86_FEATURE_SRSO , \ -"call srso_untrain_ret_alias" ,X86_FEATURE_SRSO_ALIAS +"call srso_alias_untrain_ret" ,X86_FEATURE_SRSO_ALIAS #endif .endm
@@ -207,7 +207,7 @@ extern void srso_alias_return_thunk(voidextern void retbleed_untrain_ret (void );extern void srso_untrain_ret (void ); -extern void srso_untrain_ret_alias (void ); +extern void srso_alias_untrain_ret (void );extern void entry_ibpb (void );
arch/x86/kernel/vmlinux.lds.S +4 -4
@@ -141,10 +141,10 @@ SECTIONS #ifdef CONFIG_CPU_SRSO /* - * See the comment above srso_untrain_ret_alias()'s + * See the comment above srso_alias_untrain_ret()'s * definition. */ - . = srso_untrain_ret_alias | (1 << 2) | (1 << 8) | (1 << 14) | (1 << 20); + . = srso_alias_untrain_ret | (1 << 2) | (1 << 8) | (1 << 14) | (1 << 20); *(.text.__x86.rethunk_safe) #endif ALIGN_ENTRY_TEXT_END
@@ -527,8 +527,8 @@ INIT_PER_CPU(irq_stack_backing_store); * Instead do: (A | B) - (A & B) in order to compute the XOR * of the two function addresses: */ -. = ASSERT(((ABSOLUTE(srso_untrain_ret_alias) | srso_safe_ret_alias) - - (ABSOLUTE(srso_untrain_ret_alias) & srso_safe_ret_alias)) == ((1 << 2) | (1 << 8) | (1 << 14) | (1 << 20)), +. = ASSERT(((ABSOLUTE(srso_alias_untrain_ret) | srso_alias_safe_ret) - + (ABSOLUTE(srso_alias_untrain_ret) & srso_alias_safe_ret)) == ((1 << 2) | (1 << 8) | (1 << 14) | (1 << 20)), "SRSO function pair won't alias"); #endif
arch/x86/lib/retpoline.S +13 -13
@@ -75,55 +75,55 @@ SYM_CODE_END(__x86_indirect_thunk_array) #ifdef CONFIG_RETHUNK /* - * srso_untrain_ret_alias() and srso_safe_ret_alias() are placed at + * srso_alias_untrain_ret() and srso_alias_safe_ret() are placed at * special addresses: * - * - srso_untrain_ret_alias() is 2M aligned - * - srso_safe_ret_alias() is also in the same 2M page but bits 2, 8, 14 + * - srso_alias_untrain_ret() is 2M aligned + * - srso_alias_safe_ret() is also in the same 2M page but bits 2, 8, 14 * and 20 in its virtual address are set (while those bits in the - * srso_untrain_ret_alias() function are cleared). + * srso_alias_untrain_ret() function are cleared). * * This guarantees that those two addresses will alias in the branch * target buffer of Zen3/4 generations, leading to any potential * poisoned entries at that BTB slot to get evicted. * - * As a result, srso_safe_ret_alias() becomes a safe return. + * As a result, srso_alias_safe_ret() becomes a safe return. */ #ifdef CONFIG_CPU_SRSO .section .text.__x86.rethunk_untrain -SYM_START(srso_untrain_ret_alias, SYM_L_GLOBAL, SYM_A_NONE) +SYM_START(srso_alias_untrain_ret, SYM_L_GLOBAL, SYM_A_NONE) UNWIND_HINT_FUNC ASM_NOP2 lfence jmp srso_alias_return_thunk -SYM_FUNC_END(srso_untrain_ret_alias) -__EXPORT_THUNK(srso_untrain_ret_alias) +SYM_FUNC_END(srso_alias_untrain_ret) +__EXPORT_THUNK(srso_alias_untrain_ret) .section .text.__x86.rethunk_safe #else /* dummy definition for alternatives */ -SYM_START(srso_untrain_ret_alias, SYM_L_GLOBAL, SYM_A_NONE) +SYM_START(srso_alias_untrain_ret, SYM_L_GLOBAL, SYM_A_NONE) ANNOTATE_UNRET_SAFE ret int3 -SYM_FUNC_END(srso_untrain_ret_alias) +SYM_FUNC_END(srso_alias_untrain_ret) #endif -SYM_START(srso_safe_ret_alias, SYM_L_GLOBAL, SYM_A_NONE) +SYM_START(srso_alias_safe_ret, SYM_L_GLOBAL, SYM_A_NONE) add $8, %_ASM_SP UNWIND_HINT_FUNC ANNOTATE_UNRET_SAFE ret int3 -SYM_FUNC_END(srso_safe_ret_alias) +SYM_FUNC_END(srso_alias_safe_ret) .section .text.__x86.return_thunk SYM_CODE_START(srso_alias_return_thunk) UNWIND_HINT_FUNC ANNOTATE_NOENDBR - call srso_safe_ret_alias + call srso_alias_safe_ret ud2 SYM_CODE_END(srso_alias_return_thunk)
Greg Kroah-Hartman
maintainerPATCH 131/139 x86/cpu: Cleanup the untrain mess
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit e7c25c441e9e0fa75b4c83e0b26306b702cfe90d upstream.
Since there can only be one active return_thunk, there only needs be one (matching) untrain_ret. It fundamentally doesn't make sense to allow multiple untrain_ret at the same time.
Fold all the 3 different untrain methods into a single (temporary) helper stub.
--- arch/x86/include/asm/nospec-branch.h | 12 ++++-------- arch/x86/kernel/cpu/bugs.c | 1 + arch/x86/lib/retpoline.S | 7 +++++++ 3 files changed, 12 insertions(+), 8 deletions(-)
arch/x86/include/asm/nospec-branch.h +4 -8
@@ -156,9 +156,9 @@ .endm#ifdef CONFIG_CPU_UNRET_ENTRY -#define CALL_ZEN_UNTRAIN_RET "call retbleed_untrain_ret" +#define CALL_UNTRAIN_RET "call entry_untrain_ret"#else -#define CALL_ZEN_UNTRAIN_RET "" +#define CALL_UNTRAIN_RET ""#endif /*
@@ -177,14 +177,9 @@defined (CONFIG_CPU_SRSO) ANNOTATE_UNRET_ENDALTERNATIVE_2 "" , \ -CALL_ZEN_UNTRAIN_RET ,X86_FEATURE_UNRET , \ +CALL_UNTRAIN_RET ,X86_FEATURE_UNRET , \"call entry_ibpb" ,X86_FEATURE_ENTRY_IBPB #endif - -#ifdef CONFIG_CPU_SRSO -ALTERNATIVE_2 "" ,"call srso_untrain_ret" ,X86_FEATURE_SRSO , \ -"call srso_alias_untrain_ret" ,X86_FEATURE_SRSO_ALIAS -#endif .endm#else /* __ASSEMBLY__ */
@@ -209,6 +204,7 @@ extern void retbleed_untrain_ret(void);extern void srso_untrain_ret (void );extern void srso_alias_untrain_ret (void ); +extern void entry_untrain_ret (void );extern void entry_ibpb (void );#ifdef CONFIG_RETPOLINE
arch/x86/kernel/cpu/bugs.c +1 -0
@@ -2429,6 +2429,7 @@ static void __init srso_select_mitigatio* like ftrace, static_call, etc. */ setup_force_cpu_cap (X86_FEATURE_RETHUNK ); +setup_force_cpu_cap (X86_FEATURE_UNRET );if (boot_cpu_data.x86 ==0x19 ) {setup_force_cpu_cap (X86_FEATURE_SRSO_ALIAS );
arch/x86/lib/retpoline.S +7 -0
@@ -230,6 +230,13 @@ SYM_CODE_START(srso_return_thunk) ud2 SYM_CODE_END(srso_return_thunk) +SYM_FUNC_START(entry_untrain_ret) + ALTERNATIVE_2 "jmp retbleed_untrain_ret", \ + "jmp srso_untrain_ret", X86_FEATURE_SRSO, \ + "jmp srso_alias_untrain_ret", X86_FEATURE_SRSO_ALIAS +SYM_FUNC_END(entry_untrain_ret) +__EXPORT_THUNK(entry_untrain_ret) + SYM_CODE_START(__x86_return_thunk) UNWIND_HINT_FUNC ANNOTATE_NOENDBR
Greg Kroah-Hartman
maintainerPATCH 132/139 x86/srso: Explain the untraining sequences a bit more
In reply to Greg Kroah-HartmanFrom: Borislav Petkov (AMD) <[email protected]>
commit 9dbd23e42ff0b10c9b02c9e649c76e5228241a8e upstream.
The goal is to eventually have a proper documentation about all this.
--- arch/x86/lib/retpoline.S | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
arch/x86/lib/retpoline.S +19 -0
@@ -128,6 +128,25 @@ SYM_CODE_START(srso_alias_return_thunk) SYM_CODE_END(srso_alias_return_thunk) /* + * Some generic notes on the untraining sequences: + * + * They are interchangeable when it comes to flushing potentially wrong + * RET predictions from the BTB. + * + * The SRSO Zen1/2 (MOVABS) untraining sequence is longer than the + * Retbleed sequence because the return sequence done there + * (srso_safe_ret()) is longer and the return sequence must fully nest + * (end before) the untraining sequence. Therefore, the untraining + * sequence must fully overlap the return sequence. + * + * Regarding alignment - the instructions which need to be untrained, + * must all start at a cacheline boundary for Zen1/2 generations. That + * is, instruction sequences starting at srso_safe_ret() and + * the respective instruction sequences at retbleed_return_thunk() + * must start at a cacheline boundary. + */ + +/* * Safety details here pertain to the AMD Zen{1,2} microarchitecture: * 1) The RET at retbleed_return_thunk must be on a 64 byte boundary, for * alignment within the BTB.
Greg Kroah-Hartman
maintainerPATCH 133/139 x86/static_call: Fix __static_call_fixup()
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit 54097309620ef0dc2d7083783dc521c6a5fef957 upstream.
Christian reported spurious module load crashes after some of Song's module memory layout patches.
Turns out that if the very last instruction on the very last page of the module is a 'JMP __x86_return_thunk' then __static_call_fixup() will trip a fault and die.
And while the module rework made this slightly more likely to happen, it's always been possible.
--- arch/x86/kernel/static_call.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
arch/x86/kernel/static_call.c +13 -0
@@ -135,6 +135,19 @@ EXPORT_SYMBOL_GPL(arch_static_call_trans*/ bool __static_call_fixup (void *tramp,u8 op,void *dest) { +unsigned long addr = (unsigned long )tramp; +/* +* Not all .return_sites are a static_call trampoline (most are not). +* Check if the 3 bytes after the return are still kernel text, if not, +* then this definitely is not a trampoline and we need not worry +* further. +* +* This avoids the memcmp() below tripping over pagefaults etc.. +*/ +if (((addr >>PAGE_SHIFT ) != ((addr +7 ) >>PAGE_SHIFT )) && + !kernel_text_address (addr +7 )) +return false; +if (memcmp (tramp+5 , tramp_ud,3 )) {/* Not a trampoline site, not our problem. */ return false;
Greg Kroah-Hartman
maintainerPATCH 134/139 x86/retpoline: Dont clobber RFLAGS during srso_safe_ret()
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit ba5ca5e5e6a1d55923e88b4a83da452166f5560e upstream.
Use LEA instead of ADD when adjusting %rsp in srso_safe_ret{,_alias}() so as to avoid clobbering flags. Drop one of the INT3 instructions to account for the LEA consuming one more byte than the ADD.
KVM's emulator makes indirect calls into a jump table of sorts, where the destination of each call is a small blob of code that performs fast emulation by executing the target instruction with fixed operands.
E.g. to emulate ADC, fastop() invokes adcb_al_dl():
adcb_al_dl:
<+0>: adc %dl,%al
<+2>: jmp <__x86_return_thunk>A major motivation for doing fast emulation is to leverage the CPU to handle consumption and manipulation of arithmetic flags, i.e. RFLAGS is both an input and output to the target of the call. fastop() collects the RFLAGS result by pushing RFLAGS onto the stack and popping them back into a variable (held in %rdi in this case):
asm("push %[flags]; popf; " CALL_NOSPEC " ; pushf; pop %[flags]\n"
<+71>: mov 0xc0(%r8),%rdx <+78>: mov 0x100(%r8),%rcx <+85>: push %rdi
<+86>: popf
<+87>: call *%rsi
<+89>: nop
<+90>: nop
<+91>: nop
<+92>: pushf
<+93>: pop %rdi
and then propagating the arithmetic flags into the vCPU's emulator state:
ctxt->eflags = (ctxt->eflags & ~EFLAGS_MASK) | (flags & EFLAGS_MASK);
<+64>: and $0xfffffffffffff72a,%r9 <+94>: and $0x8d5,%edi <+109>: or %rdi,%r9 <+122>: mov %r9,0x10(%r8)
The failures can be most easily reproduced by running the "emulator" test in KVM-Unit-Tests.
If you're feeling a bit of deja vu, see commit b63f20a778c8 ("x86/retpoline: Don't clobber RFLAGS during CALL_NOSPEC on i386").
In addition, this breaks booting of clang-compiled guest on a gcc-compiled host where the host contains the %rsp-modifying SRSO mitigations.
[ bp: Massage commit message, extend, remove addresses. ]
--- arch/x86/lib/retpoline.S | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
arch/x86/lib/retpoline.S +3 -4
@@ -111,7 +111,7 @@ SYM_FUNC_END(srso_alias_untrain_ret) #endif SYM_START(srso_alias_safe_ret, SYM_L_GLOBAL, SYM_A_NONE) - add $8, %_ASM_SP + lea 8(%_ASM_SP), %_ASM_SP UNWIND_HINT_FUNC ANNOTATE_UNRET_SAFE ret
@@ -211,7 +211,7 @@ __EXPORT_THUNK(retbleed_untrain_ret) * SRSO untraining sequence for Zen1/2, similar to retbleed_untrain_ret() * above. On kernel entry, srso_untrain_ret() is executed which is a * - * movabs $0xccccccc308c48348,%rax + * movabs $0xccccc30824648d48,%rax * * and when the return thunk executes the inner label srso_safe_ret() * later, it is a stack manipulation and a RET which is mispredicted and
@@ -229,11 +229,10 @@ SYM_START(srso_untrain_ret, SYM_L_GLOBAL * the stack. */ SYM_INNER_LABEL(srso_safe_ret, SYM_L_GLOBAL) - add $8, %_ASM_SP + lea 8(%_ASM_SP), %_ASM_SP ret int3 int3 - int3 /* end of movabs */ lfence call srso_safe_ret
Greg Kroah-Hartman
maintainerPATCH 135/139 x86/CPU/AMD: Fix the DIV(0) initial fix attempt
In reply to Greg Kroah-HartmanFrom: Borislav Petkov (AMD) <[email protected]>
commit f58d6fbcb7c848b7f2469be339bc571f2e9d245b upstream.
Initially, it was thought that doing an innocuous division in the #DE handler would take care to prevent any leaking of old data from the divider but by the time the fault is raised, the speculation has already advanced too far and such data could already have been used by younger operations.
Therefore, do the innocuous division on every exit to userspace so that userspace doesn't see any potentially old data from integer divisions in kernel space.
Do the same before VMRUN too, to protect host data from leaking into the guest too.
--- arch/x86/include/asm/entry-common.h | 1 + arch/x86/kernel/cpu/amd.c | 1 + arch/x86/kernel/traps.c | 2 -- arch/x86/kvm/svm/svm.c | 2 ++ 4 files changed, 4 insertions(+), 2 deletions(-)
arch/x86/include/asm/entry-common.h +1 -0
@@ -92,6 +92,7 @@ static inline void arch_exit_to_user_mod static __always_inline void arch_exit_to_user_mode(void) {mds_user_clear_cpu_buffers (); +amd_clear_divider (); }#define arch_exit_to_user_mode arch_exit_to_user_mode
arch/x86/kernel/cpu/amd.c +1 -0
@@ -1320,3 +1320,4 @@ void noinstr amd_clear_divider(void) asm volatile(ALTERNATIVE("", "div %2\n\t", X86_BUG_DIV0) :: "a" (0), "d" (0), "r" (1)); } +EXPORT_SYMBOL_GPL (amd_clear_divider);
arch/x86/kernel/traps.c +0 -2
@@ -202,8 +202,6 @@ DEFINE_IDTENTRY(exc_divide_error) {do_error_trap (regs,0 ,"divide error" ,X86_TRAP_DE ,SIGFPE ,FPE_INTDIV ,error_get_trap_addr (regs)); - -amd_clear_divider (); }DEFINE_IDTENTRY (exc_overflow)
arch/x86/kvm/svm/svm.c +2 -0
@@ -1452,6 +1452,8 @@ static void svm_prepare_guest_switch(strstruct vcpu_svm *svm =to_svm (vcpu);struct svm_cpu_data *sd =per_cpu (svm_data, vcpu->cpu); +amd_clear_divider (); +if (sev_es_guest (vcpu->kvm))sev_es_unmap_ghcb (svm);
Greg Kroah-Hartman
maintainerPATCH 136/139 x86/srso: Disable the mitigation on unaffected configurations
In reply to Greg Kroah-HartmanFrom: Borislav Petkov (AMD) <[email protected]>
commit e9fbc47b818b964ddff5df5b2d5c0f5f32f4a147 upstream.
Skip the srso cmd line parsing which is not needed on Zen1/2 with SMT disabled and with the proper microcode applied (latter should be the case anyway) as those are not affected.
--- arch/x86/kernel/cpu/bugs.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/x86/kernel/cpu/bugs.c +6 -1
@@ -2399,8 +2399,10 @@ static void __init srso_select_mitigatio* IBPB microcode has been applied. */ if ((boot_cpu_data.x86 <0x19 ) && - (!cpu_smt_possible () || (cpu_smt_control ==CPU_SMT_DISABLED ))) + (!cpu_smt_possible () || (cpu_smt_control ==CPU_SMT_DISABLED ))) {setup_force_cpu_cap (X86_FEATURE_SRSO_NO ); +return ; + } }if (retbleed_mitigation ==RETBLEED_MITIGATION_IBPB ) {
@@ -2686,6 +2688,9 @@ static ssize_t gds_show_state(char *buf)static ssize_t srso_show_state (char *buf) { +if (boot_cpu_has (X86_FEATURE_SRSO_NO )) +return sysfs_emit (buf,"Not affected\n" ); +return sysfs_emit (buf,"%s%s\n" , srso_strings[srso_mitigation], (cpu_has_ibpb_brtype_microcode () ?"" :", no microcode" ));
Greg Kroah-Hartman
maintainerPATCH 137/139 x86/retpoline,kprobes: Fix position of thunk sections with CONFIG_LTO_CLANG
In reply to Greg Kroah-HartmanFrom: Petr Pavlu <[email protected]>
commit 79cd2a11224eab86d6673fe8a11d2046ae9d2757 upstream.
The linker script arch/x86/kernel/vmlinux.lds.S matches the thunk sections ".text.__x86.*" from arch/x86/lib/retpoline.S as follows:
.text {
[...]
TEXT_TEXT
[...]
__indirect_thunk_start = .;
*(.text.__x86.*)
__indirect_thunk_end = .;
[...]
}Macro TEXT_TEXT references TEXT_MAIN which normally expands to only ".text". However, with CONFIG_LTO_CLANG, TEXT_MAIN becomes ".text .text.[0-9a-zA-Z_]*" which wrongly matches also the thunk sections. The output layout is then different than expected. For instance, the currently defined range [__indirect_thunk_start, __indirect_thunk_end] becomes empty.
Prevent the problem by using ".." as the first separator, for example, ".text..__x86.indirect_thunk". This pattern is utilized by other explicit section names which start with one of the standard prefixes, such as ".text" or ".data", and that need to be individually selected in the linker script.
[ nathan: Fix conflicts with SRSO and fold in fix issue brought up by
Andrew Cooper in post-review:
https://lore.kernel.org/[email protected] ]
--- arch/x86/kernel/vmlinux.lds.S | 8 ++++---- arch/x86/lib/retpoline.S | 8 ++++---- tools/objtool/check.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-)
arch/x86/kernel/vmlinux.lds.S +4 -4
@@ -134,7 +134,7 @@ SECTIONS KPROBES_TEXT ALIGN_ENTRY_TEXT_BEGIN #ifdef CONFIG_CPU_SRSO - *(.text.__x86.rethunk_untrain) + *(.text..__x86.rethunk_untrain) #endif ENTRY_TEXT
@@ -145,7 +145,7 @@ SECTIONS * definition. */ . = srso_alias_untrain_ret | (1 << 2) | (1 << 8) | (1 << 14) | (1 << 20); - *(.text.__x86.rethunk_safe) + *(.text..__x86.rethunk_safe) #endif ALIGN_ENTRY_TEXT_END SOFTIRQENTRY_TEXT
@@ -155,8 +155,8 @@ SECTIONS #ifdef CONFIG_RETPOLINE __indirect_thunk_start = .; - *(.text.__x86.indirect_thunk) - *(.text.__x86.return_thunk) + *(.text..__x86.indirect_thunk) + *(.text..__x86.return_thunk) __indirect_thunk_end = .; #endif } :text =0xcccc
arch/x86/lib/retpoline.S +4 -4
@@ -11,7 +11,7 @@ #include <asm/frame.h> #include <asm/nops.h> - .section .text.__x86.indirect_thunk + .section .text..__x86.indirect_thunk .macro RETPOLINE reg ANNOTATE_INTRA_FUNCTION_CALL
@@ -90,7 +90,7 @@ SYM_CODE_END(__x86_indirect_thunk_array) * As a result, srso_alias_safe_ret() becomes a safe return. */ #ifdef CONFIG_CPU_SRSO - .section .text.__x86.rethunk_untrain + .section .text..__x86.rethunk_untrain SYM_START(srso_alias_untrain_ret, SYM_L_GLOBAL, SYM_A_NONE) UNWIND_HINT_FUNC
@@ -100,7 +100,7 @@ SYM_START(srso_alias_untrain_ret, SYM_L_ SYM_FUNC_END(srso_alias_untrain_ret) __EXPORT_THUNK(srso_alias_untrain_ret) - .section .text.__x86.rethunk_safe + .section .text..__x86.rethunk_safe #else /* dummy definition for alternatives */ SYM_START(srso_alias_untrain_ret, SYM_L_GLOBAL, SYM_A_NONE)
@@ -118,7 +118,7 @@ SYM_START(srso_alias_safe_ret, SYM_L_GLO int3 SYM_FUNC_END(srso_alias_safe_ret) - .section .text.__x86.return_thunk + .section .text..__x86.return_thunk SYM_CODE_START(srso_alias_return_thunk) UNWIND_HINT_FUNC
tools/objtool/check.c +1 -1
@@ -370,7 +370,7 @@ static int decode_instructions(struct obif (!strcmp (sec->name,".noinstr.text" ) || !strcmp (sec->name,".entry.text" ) || - !strncmp (sec->name,".text.__x86." ,12 )) + !strncmp (sec->name,".text..__x86." ,13 )) sec->noinstr = true;for (offset =0 ; offset < sec->sh.sh_size; offset += insn->len) {
Greg Kroah-Hartman
maintainerPATCH 138/139 objtool/x86: Fixup frame-pointer vs rethunk
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
commit dbf46008775516f7f25c95b7760041c286299783 upstream.
For stack-validation of a frame-pointer build, objtool validates that every CALL instruction is preceded by a frame-setup. The new SRSO return thunks violate this with their RSB stuffing trickery.
Extend the __fentry__ exception to also cover the embedded_insn case used for this. This cures:
vmlinux.o: warning: objtool: srso_untrain_ret+0xd: call without frame pointer save/setup
--- tools/objtool/check.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
tools/objtool/check.c +11 -6
@@ -2174,12 +2174,17 @@ static int decode_sections(struct objtooreturn 0 ; } -static bool is_fentry_call (struct instruction *insn) +static bool is_special_call (struct instruction *insn) { -if (insn->type ==INSN_CALL && - insn->call_dest && - insn->call_dest->fentry) -return true; +if (insn->type ==INSN_CALL ) { +struct symbol *dest = insn->call_dest; + +if (!dest) +return false; + +if (dest->fentry) +return true; + }return false; }
@@ -3125,7 +3130,7 @@ static int validate_branch(struct objtooif (ret)return ret; -if (!no_fp && func && !is_fentry_call (insn) && +if (!no_fp && func && !is_special_call (insn) && !has_valid_stack_frame (&state)) {WARN_FUNC ("call without frame pointer save/setup" , sec, insn->offset);
Greg Kroah-Hartman
maintainerPATCH 139/139 x86/srso: Correct the mitigation status when SMT is disabled
In reply to Greg Kroah-HartmanFrom: Borislav Petkov (AMD) <[email protected]>
commit 6405b72e8d17bd1875a56ae52d23ec3cd51b9d66 upstream.
Specify how is SRSO mitigated when SMT is disabled. Also, correct the SMT check for that.
--- arch/x86/kernel/cpu/bugs.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/x86/kernel/cpu/bugs.c +2 -3
@@ -2398,8 +2398,7 @@ static void __init srso_select_mitigatio* Zen1/2 with SMT off aren't vulnerable after the right * IBPB microcode has been applied. */ -if ((boot_cpu_data.x86 <0x19 ) && - (!cpu_smt_possible () || (cpu_smt_control ==CPU_SMT_DISABLED ))) { +if (boot_cpu_data.x86 <0x19 && !cpu_smt_possible ()) {setup_force_cpu_cap (X86_FEATURE_SRSO_NO );return ; }
@@ -2689,7 +2688,7 @@ static ssize_t gds_show_state(char *buf)static ssize_t srso_show_state (char *buf) {if (boot_cpu_has (X86_FEATURE_SRSO_NO )) -return sysfs_emit (buf,"Not affected\n" ); +return sysfs_emit (buf,"Mitigation: SMT disabled\n" ); return sysfs_emit(buf, "%s%s\n", srso_strings[srso_mitigation],
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Allen Pais
Tested-byQuoted 14 lines
Quoted 14 lines
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.
Quoted 3 lines
Quoted 3 lines
thanks,
greg k-h
Compiled and booted on my x86_64 and ARM64 test systems. No errors or regressions.
Thanks.
Hello,
Quoted 5 lines · On Thu, 24 Aug 2023 16:48:43 +0200 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 8 lines
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/awslabs/damon-tests/tree/next/corr
[2] 00e5f0b76767 ("Linux 5.15.128-rc1")
Thanks,
SJ
[...]
---
ok 13 selftests: damon-tests: build_i386_idle_flag.sh # selftests: damon-tests: build_i386_highpte.sh
# .config:1341:warning: override: reassigning to symbol DAMON ok 14 selftests: damon-tests: build_i386_highpte.sh
# selftests: damon-tests: build_nomemcg.sh
# .config:1342:warning: override: reassigning to symbol DAMON # .config:1352:warning: override: reassigning to symbol CGROUPS ok 15 selftests: damon-tests: build_nomemcg.sh
# kselftest dir '/home/sjpark/damon-tests-cont/linux/tools/testing/selftests/damon-tests' is in dirty state. # the log is at '/home/sjpark/log'. [32m ok 1 selftests: damon: debugfs_attrs.sh ok 1 selftests: damon-tests: kunit.sh ok 2 selftests: damon-tests: huge_count_read_write.sh ok 3 selftests: damon-tests: buffer_overflow.sh ok 4 selftests: damon-tests: rm_contexts.sh ok 5 selftests: damon-tests: record_null_deref.sh ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh ok 8 selftests: damon-tests: damo_tests.sh ok 9 selftests: damon-tests: masim-record.sh ok 10 selftests: damon-tests: build_i386.sh ok 11 selftests: damon-tests: build_m68k.sh ok 12 selftests: damon-tests: build_arm64.sh ok 13 selftests: damon-tests: build_i386_idle_flag.sh ok 14 selftests: damon-tests: build_i386_highpte.sh ok 15 selftests: damon-tests: build_nomemcg.sh [33m [92mPASS [39m _remote_run_corr.sh SUCCESS
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 8 lines
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.
For RCU,
thanks,
- Joel
Quoted 571 lines
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:Greg Kroah-Hartman <[email protected]>
Linux 5.15.128-rc1Borislav Petkov (AMD) <[email protected]>
x86/srso: Correct the mitigation status when SMT is disabledPeter Zijlstra <[email protected]>
objtool/x86: Fixup frame-pointer vs rethunkPetr Pavlu <[email protected]>
x86/retpoline,kprobes: Fix position of thunk sections withCONFIG_LTO_CLANGBorislav Petkov (AMD) <[email protected]>
x86/srso: Disable the mitigation on unaffected configurationsBorislav Petkov (AMD) <[email protected]>
x86/CPU/AMD: Fix the DIV(0) initial fix attemptSean Christopherson <[email protected]>
x86/retpoline: Don't clobber RFLAGS duringsrso_safe_ret()Peter Zijlstra <[email protected]>
x86/static_call: Fix __static_call_fixup()Borislav Petkov (AMD) <[email protected]>
x86/srso: Explain the untraining sequences a bit morePeter Zijlstra <[email protected]>
x86/cpu: Cleanup the untrain messPeter Zijlstra <[email protected]>
x86/cpu: Rename srso_(.*)_alias to srso_alias_\1Peter Zijlstra <[email protected]>
x86/cpu: Rename original retbleed methodsPeter Zijlstra <[email protected]>
x86/cpu: Clean up SRSO return thunk messPeter Zijlstra <[email protected]>
x86/ibt: AddANNOTATE_NOENDBRJosh Poimboeuf <[email protected]>
objtool: Add frame-pointer-specific function ignorePeter Zijlstra <[email protected]>
x86/alternative: Make custom return thunk unconditionalPeter Zijlstra <[email protected]>
x86/cpu: Fix up srso_safe_ret() and __x86_return_thunk()Peter Zijlstra <[email protected]>
x86/cpu: Fix__x86_return_thunksymbol typeYangtao Li <[email protected]>
mmc: f-sdh30: fix order of function calls insdhci_f_sdh30_removeJason Xing <[email protected]>
net: fix the RTO timer retransmitting skb every 1ms if linear option is enabledJason Wang <[email protected]>
virtio-net: set queues afterdriver_okKuniyuki Iwashima <[email protected]>
af_unix: Fix null-ptr-deref inunix_stream_sendpage().Christopher Obbard <[email protected]>
arm64: dts: rockchip: Disable HS400 for eMMC on ROCK Pi 4Namjae Jeon <[email protected]>
exfat: check if filename entries exceeds max filename lengthXin Long <[email protected]>
netfilter: set default timeout to 3 secs for sctp shutdown send and recv stateMario Limonciello <[email protected]>
drm/amd: flush any delayed gfxoff on suspend entryWander Lairson Costa <[email protected]>
drm/qxl: fix UAF on handle creationYibin Ding <[email protected]>
mmc: block: Fix in_flight[issue_type] value errorYang Yingliang <[email protected]>
mmc: wbsd: fix doublemmc_free_host()inwbsd_init()Russell Harmon via samba-technical <[email protected]>
cifs: Release folio lock on fscache read hit.dengxiang <[email protected]>
ALSA: usb-audio: Add support for Mythware XA001AU capture and playback interfaces.Tony Lindgren <[email protected]>
serial: 8250: Fix oops for port->pm on uart_change_pm()Alexandre Ghiti <[email protected]>
riscv: uaccess: Return the number of bytes effectively not copiedKailang Yang <[email protected]>
ALSA: hda/realtek - Remodified 3k pull low procedureJiasheng Jiang <[email protected]>
soc: aspeed: socinfo: Add kfree for kstrdupJerome Brunet <[email protected]>
ASoC: meson: axg-tdm-formatter: fix channel slot allocationZhang Shurong <[email protected]>
ASoC: rt5665: add missedregulator_bulk_disableXiaolei Wang <[email protected]>
ARM: dts: imx: Set default tuning step for imx6sx usdhcDmitry Baryshkov <[email protected]>
arm64: dts: qcom: qrb5165-rb5: fix thermal zone conflictTony Lindgren <[email protected]>
bus: ti-sysc: Flush posted write on enable before resetEric Dumazet <[email protected]>
net: do not allowgso_sizeto be set toGSO_BY_FRAGSAbel Wu <[email protected]>
sock: Fix misuse ofsk_under_memory_pressure()Alfred Lee <[email protected]>
net: dsa: mv88e6xxx: Wait for EEPROM done before HW resetAndrii Staikov <[email protected]>
i40e: fix misleading debug logsPiotr Gardocki <[email protected]>
iavf: fix FDIR rule fields masks validationZiyang Xuan <[email protected]>
team: Fix incorrect deletion ofETH_P_8021ADprotocol vid from slavesJustin Chen <[email protected]>
net: phy: broadcom: stub c45 read/write for 54810Pablo Neira Ayuso <[email protected]>
netfilter:nft_dynset: disallow object mapsSishuai Gong <[email protected]>
ipvs: fix racy memcpy inproc_do_sync_thresholdFlorian Westphal <[email protected]>
netfilter:nf_tables: deactivate catchall elements in next generationFlorian Westphal <[email protected]>
netfilter:nf_tables: fix false-positive lockdep splatLuca Ceresoli <[email protected]>
drm/panel: simple: Fix AUO G121EAN01 panel timings according to the docsPetr Machata <[email protected]>
selftests:mirror_gre_changes: Tighten up the TTL test matchRussell King (Oracle) <[email protected]>
net: phy: fix IRQ-based wake-on-lan over hibernate / power offLin Ma <[email protected]>
xfrm: add forgottennla_policyforXFRMA_MTIMER_THRESHLin Ma <[email protected]>
xfrm: add NULL check inxfrm_update_ae_paramsZhengchao Shao <[email protected]>
ip_vti: fix potential slab-use-after-free indecode_session6Zhengchao Shao <[email protected]>
ip6_vti: fix slab-use-after-free indecode_session6Zhengchao Shao <[email protected]>
xfrm: fix slab-use-after-free indecode_session6Lin Ma <[email protected]>
net: xfrm: AmendXFRMA_SEC_CTXnla_policystructureLin Ma <[email protected]>
net:af_key: fixsadb_x_filtervalidationLin Ma <[email protected]>
net: xfrm: Fixxfrm_address_filterOOB readTam Nguyen <[email protected]>
i2c: designware: Handle invalid SMBus block data response length valueQuan Nguyen <[email protected]>
i2c: designware: Correct length byte validation logicxiaoshoukui <[email protected]>
btrfs: fixBUG_ONcondition inbtrfs_cancel_balanceSherry Sun <[email protected]>
tty: serial:fsl_lpuart: Clear the error flags by writing 1 for lpuart32 platformsYi Yang <[email protected]>
tty:n_gsm: fix the UAF caused by race condition ingsm_cleanup_muxNathan Lynch <[email protected]>
powerpc/rtas_flash: allow user copy to flash block cache objectsYuanjun Gong <[email protected]>
fbdev: mmp: fix value check inmmphw_probe()Yicong Yang <[email protected]>
i2c: hisi: Only handle the interrupt of the driver's transferChengfeng Ye <[email protected]>
i2c: bcm-iproc: Fixbcm_iproc_i2c_isrdeadlock issueSteve French <[email protected]>
cifs: fix potential oops incifs_oplock_breakMaxime Coquelin <[email protected]>
vduse: Use proper spinlock for IRQ injectionWolfram Sang <[email protected]>
virtio-mmio: don't break lifecycle ofvm_devNaohiro Aota <[email protected]>
btrfs: move out now unused BG from the reclaim listXu Yang <[email protected]>
ARM: dts: nxp/imx6sll: fix wrong property name in usbphy nodeAndreas Kemnade <[email protected]>
ARM: dts: imx6sll: fixup of operating pointsIvan Mikhaylov <[email protected]>
net/ncsi: change fromndo_set_mac_addresstodev_set_mac_addressSergey Shtylyov <[email protected]>
mmc: sunxi: fix deferred probingSergey Shtylyov <[email protected]>
mmc: bcm2835: fix deferred probingJohan Hovold <[email protected]>
USB: dwc3: fix use-after-free on core driver unbindJohan Hovold <[email protected]>
USB: dwc3: qcom: fix NULL-deref on suspendRobert Hodaszi <[email protected]>
tty: serial:fsl_lpuart: reduce RX watermark to 0 on LS1028ASherry Sun <[email protected]>
tty: serial:fsl_lpuart: makerx_watermarkconfigurable for different platformsJesse Taube <[email protected]>
tty: serial:fsl_lpuart: Add i.MXRT1050 supportRoger Quadros <[email protected]>
usb: dwc3: gadget: Improvedwc3_gadget_suspend()anddwc3_gadget_resume()Johan Hovold <[email protected]>
USB: dwc3: gadget: drop dead hibernation codeKushagra Verma <[email protected]>
usb: dwc3: Fix typos ingadget.cWesley Cheng <[email protected]>
usb: dwc3: Remove DWC3 locking during gadget suspend/resumeWesley Cheng <[email protected]>
usb: dwc3: gadget: Synchronize IRQ between soft connect/disconnectHersen Wu <[email protected]>
drm/amd/display: fix accesshdcp_workqueueasserthersen wu <[email protected]>
drm/amd/display: phase3 mst hdcp for multiple displayshersen wu <[email protected]>
drm/amd/display: save restore hdcp state when display is unplugged from mst hubZev Weiss <[email protected]>
ARM: dts: aspeed: asrock: Correct firmware flash SPI clocksSong Yoong Siang <[email protected]>
igc: read before write to SRRCTL registerWilliam Breathitt Gray <[email protected]>
iio: addac: stx104: Fix race condition when converting analog-to-digitalWilliam Breathitt Gray <[email protected]>
iio: addac: stx104: Fix race condition forstx104_write_raw()William Breathitt Gray <[email protected]>
iio: stx104: Move to addac subdirectoryWilliam Breathitt Gray <[email protected]>
iio: adc: stx104: Implement and utilize register structuresWilliam Breathitt Gray <[email protected]>
iio: adc: stx104: Utilize iomap interfaceCosmin Tanislav <[email protected]>
iio: add addac subdirectoryChen Lin <[email protected]>
ring-buffer: Do not swapcpu_bufferduring resize processBenjamin Gray <[email protected]>
powerpc/kasan: Disable KCOV in KASAN codeTuo Li <[email protected]>
ALSA: hda: fix a possible null-pointer dereference due to data race insnd_hdac_regmap_sync()dengxiang <[email protected]>
ALSA: hda/realtek: Add quirks for Unis H3C Desktop B760 & Q760Konstantin Komarov <[email protected]>
fs/ntfs3: Mark ntfs dirty when on-disk struct is corruptedJia-Ju Bai <[email protected]>
fs: ntfs3: Fix possible null-pointer dereferences inmi_read()Edward Lo <[email protected]>
fs/ntfs3: Enhance sanity check while generatingattr_listshanzhulig <[email protected]>
drm/amdgpu: Fix potential fence use-after-free v2Matthew Anderson <[email protected]>
Bluetooth: btusb: Add MT7922 bluetooth ID for the Asus AllyZhengping Jiang <[email protected]>
Bluetooth: L2CAP: Fix use-after-freeYuechao Zhao <[email protected]>
watchdog:sp5100_tco: support Hygon FCH/SCH (Server Controller Hub)Zhang Shurong <[email protected]>
firewire: net: fix use after free infwnet_finish_incoming_packet()Armin Wolf <[email protected]>
pcmcia:rsrc_nonstatic: Fix memory leak innonstatic_release_resource_db()Tuo Li <[email protected]>
gfs2: Fix possible data races ingfs2_show_options()Xu Yang <[email protected]>
usb: chipidea: imx: add missing USB PHY DPDM wakeup settingXu Yang <[email protected]>
usb: chipidea: imx: don't request QoS for imx8ulpMika Westerberg <[email protected]>
thunderbolt: Read retimer NVM authentication status priortb_retimer_set_inbound_sbtx()Hans Verkuil <[email protected]>
media: platform: mediatek: vpu: fix NULL ptr dereferencePrashanth K <[email protected]>
usb: gadget:u_serial: Avoid spinlock recursion in__gs_console_pushYunfei Dong <[email protected]>
media: v4l2-mem2mem: add lock to protect parameternum_rdyPaulo Alcantara <[email protected]>
smb: client: fix warning incifs_smb3_do_mount()Christian Brauner <[email protected]>
ovl: check type and offset of struct vfsmount inovl_entryPatrisious Haddad <[email protected]>
RDMA/mlx5: Return the firmware result upon destroying QP/RQMarco Morandini <[email protected]>
HID: add quirk for 03f0:464a HP Elite Presenter MouseLang Yu <[email protected]>
drm/amdgpu: install stub fence into potential unused fence pointersstuarthayhurst <[email protected]>
HID: logitech-hidpp: Add USB and Bluetooth IDs for the Logitech G915 TKL Keyboardgaoxu <[email protected]>
dma-remap: use kvmalloc_array/kvfree for larger dma memory remapPierre-Louis Bossart <[email protected]>
ASoC: SOF: Intel: fix SoundWire/HDaudio mutual exclusionGeert Uytterhoeven <[email protected]>
iopoll: Callcpu_relax()in busy loopsOleksij Rempel <[email protected]>
ARM: dts: imx6dl: prtrvt, prtvt7, prti6q, prtwd2: fix USB related warningsSumit Gupta <[email protected]>
PCI: tegra194: Fix possible array out of bounds accessJakub Kicinski <[email protected]>
net: tls: avoid discarding data on record closeTariq Toukan <[email protected]>
net/tls: Multi-threaded calls to TXtls_dev_delTariq Toukan <[email protected]>
net/tls: Perform immediate device ctx cleanup when possibleEric Dumazet <[email protected]>
macsec: useDEV_STATS_INC()Clayton Yager <[email protected]>
macsec: Fix traffic counters/statisticsIdo Schimmel <[email protected]>
selftests: forwarding:tc_actions: Use ncat instead of ncDavide Caratti <[email protected]>
selftests: forwarding:tc_actions: cleanup temporary files when test is abortedKunihiko Hayashi <[email protected]>
mmc: sdhci-f-sdh30: Replace withsdhci_pltfm-------------
Diffstat:
Documentation/admin-guide/hw-vuln/srso.rst | 4 +- MAINTAINERS | 2 +- Makefile | 4 +- arch/arm/boot/dts/aspeed-bmc-asrock-e3c246d4i.dts | 2 +- arch/arm/boot/dts/imx6dl-prtrvt.dts | 4 + arch/arm/boot/dts/imx6qdl-prti6q.dtsi | 11 +- arch/arm/boot/dts/imx6sll.dtsi | 24 ++- arch/arm/boot/dts/imx6sx.dtsi | 6 + arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi | 4 +- arch/powerpc/kernel/rtas_flash.c | 6 +- arch/powerpc/mm/kasan/Makefile | 1 + arch/riscv/lib/uaccess.S | 11 +- arch/x86/include/asm/entry-common.h | 1 + arch/x86/include/asm/nospec-branch.h | 28 +-- arch/x86/kernel/cpu/amd.c | 1 + arch/x86/kernel/cpu/bugs.c | 28 ++- arch/x86/kernel/static_call.c | 13 ++ arch/x86/kernel/traps.c | 2 - arch/x86/kernel/vmlinux.lds.S | 20 +- arch/x86/kvm/svm/svm.c | 2 + arch/x86/lib/retpoline.S | 141 +++++++++----- drivers/bluetooth/btusb.c | 3 + drivers/bus/ti-sysc.c | 2 + drivers/firewire/net.c | 6 +- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 6 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 9 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 6 +- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 211 +++++++++++++++++---- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h | 14 ++ .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 30 +++ drivers/gpu/drm/panel/panel-simple.c | 24 +-- drivers/gpu/drm/qxl/qxl_drv.h | 2 +- drivers/gpu/drm/qxl/qxl_dumb.c | 5 +- drivers/gpu/drm/qxl/qxl_gem.c | 25 ++- drivers/gpu/drm/qxl/qxl_ioctl.c | 6 +- drivers/hid/hid-ids.h | 1 + drivers/hid/hid-logitech-hidpp.c | 4 + drivers/hid/hid-quirks.c | 1 + drivers/i2c/busses/i2c-bcm-iproc.c | 11 +- drivers/i2c/busses/i2c-designware-master.c | 16 +- drivers/i2c/busses/i2c-hisi.c | 8 + drivers/iio/Kconfig | 1 + drivers/iio/Makefile | 1 + drivers/iio/adc/Kconfig | 16 -- drivers/iio/adc/Makefile | 1 - drivers/iio/addac/Kconfig | 24 +++ drivers/iio/addac/Makefile | 7 + drivers/iio/{adc => addac}/stx104.c | 98 +++++++--- drivers/infiniband/hw/mlx5/qpc.c | 10 +- drivers/media/platform/mtk-vpu/mtk_vpu.c | 6 +- drivers/mmc/core/block.c | 7 +- drivers/mmc/host/bcm2835.c | 4 +- drivers/mmc/host/sdhci_f_sdh30.c | 66 +++---- drivers/mmc/host/sunxi-mmc.c | 4 +- drivers/mmc/host/wbsd.c | 2 - drivers/net/dsa/mv88e6xxx/chip.c | 8 + drivers/net/ethernet/intel/i40e/i40e_nvm.c | 16 +- drivers/net/ethernet/intel/iavf/iavf_ethtool.c | 10 + drivers/net/ethernet/intel/iavf/iavf_fdir.c | 77 +++++++- drivers/net/ethernet/intel/iavf/iavf_fdir.h | 2 + drivers/net/ethernet/intel/igc/igc_base.h | 11 +- drivers/net/ethernet/intel/igc/igc_main.c | 7 +- drivers/net/macsec.c | 70 +++++-- drivers/net/phy/broadcom.c | 13 ++ drivers/net/phy/phy_device.c | 13 +- drivers/net/team/team.c | 4 +- drivers/net/virtio_net.c | 4 +- drivers/pci/controller/dwc/pcie-tegra194.c | 13 +- drivers/pcmcia/rsrc_nonstatic.c | 2 + drivers/soc/aspeed/aspeed-socinfo.c | 1 + drivers/thunderbolt/retimer.c | 29 ++- drivers/tty/n_gsm.c | 3 +- drivers/tty/serial/8250/8250_port.c | 1 + drivers/tty/serial/fsl_lpuart.c | 26 ++- drivers/usb/chipidea/ci_hdrc_imx.c | 5 + drivers/usb/chipidea/usbmisc_imx.c | 2 +- drivers/usb/dwc3/core.c | 9 +- drivers/usb/dwc3/dwc3-qcom.c | 11 +- drivers/usb/dwc3/gadget.c | 116 +++++------ drivers/usb/gadget/function/u_serial.c | 3 + drivers/vdpa/vdpa_user/vduse_dev.c | 8 +- drivers/video/fbdev/mmp/hw/mmp_ctrl.c | 4 +- drivers/virtio/virtio_mmio.c | 5 +- drivers/watchdog/sp5100_tco.c | 4 +- fs/btrfs/block-group.c | 5 +- fs/btrfs/volumes.c | 3 +- fs/cifs/cifsfs.c | 28 +-- fs/cifs/file.c | 25 ++- fs/exfat/dir.c | 9 +- fs/gfs2/super.c | 26 +-- fs/ntfs3/frecord.c | 16 +- fs/ntfs3/fsntfs.c | 2 +- fs/ntfs3/index.c | 6 + fs/ntfs3/ntfs_fs.h | 2 + fs/ntfs3/record.c | 10 +- fs/overlayfs/ovl_entry.h | 9 + include/linux/iopoll.h | 2 + include/linux/objtool.h | 28 +++ include/linux/virtio_net.h | 4 + include/media/v4l2-mem2mem.h | 18 +- include/net/sock.h | 6 + include/net/tls.h | 2 + kernel/dma/remap.c | 4 +- kernel/trace/ring_buffer.c | 14 +- kernel/trace/trace.c | 3 +- net/bluetooth/l2cap_core.c | 5 + net/core/sock.c | 2 +- net/ipv4/ip_vti.c | 4 +- net/ipv4/tcp_timer.c | 4 +- net/ipv6/ip6_vti.c | 4 +- net/key/af_key.c | 4 +- net/ncsi/ncsi-rsp.c | 5 +- net/netfilter/ipvs/ip_vs_ctl.c | 4 + net/netfilter/nf_conntrack_proto_sctp.c | 6 +- net/netfilter/nf_tables_api.c | 1 + net/netfilter/nft_dynset.c | 3 + net/netfilter/nft_set_pipapo.c | 13 +- net/tls/tls_device.c | 137 +++++++------ net/unix/af_unix.c | 9 +- net/xfrm/xfrm_compat.c | 2 +- net/xfrm/xfrm_interface_core.c | 4 +- net/xfrm/xfrm_user.c | 14 +- sound/hda/hdac_regmap.c | 7 +- sound/pci/hda/patch_realtek.c | 16 +- sound/soc/codecs/rt5665.c | 2 + sound/soc/meson/axg-tdm-formatter.c | 42 ++-- sound/soc/sof/intel/hda.c | 12 +- sound/usb/quirks-table.h | 29 +++ tools/include/linux/objtool.h | 28 +++ tools/objtool/arch/x86/decode.c | 2 +- tools/objtool/check.c | 21 +- .../selftests/net/forwarding/mirror_gre_changes.sh | 3 +- .../testing/selftests/net/forwarding/tc_actions.sh | 18 +- 135 files changed, 1437 insertions(+), 618 deletions(-)
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
The same test regressions found on stable-rc linux.5.15.y as reported on stable-rc linux.6.1.y branch. LTP syscalls chown02 and fchown02 fails on arm64 Rpi4 device with the NFS rootfile system.
Test log:
--------
chown02.c:46: TPASS: chown(testfile1, 0, 0) passed
chown02.c:46: TPASS: chown(testfile2, 0, 0) passed
chown02.c:58: TFAIL: testfile2: wrong mode permissions 0100700, expected 0102700
fchown02.c:57: TPASS: fchown(3, 0, 0) passed fchown02.c:57: TPASS: fchown(4, 0, 0) passed fchown02.c:67: TFAIL: testfile2: wrong mode permissions 0100700, expected 0102700
NOTE:
Do we need a backport patch ?
nfsd: use vfs setgid helper
commit 2d8ae8c417db284f598dffb178cc01e7db0f1821 upstream.
## Build
* kernel: 5.15.128-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-5.15.y
* git commit: 00e5f0b76767cab779762a1d27fc17c1cf2a3606
* git describe: v5.15.127-140-g00e5f0b76767
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.15.y/build/v5.15.127-140-g00e5f0b76767
## Test Regressions (compared to v5.15.127)
* bcm2711-rpi-4-b, ltp-syscalls
- chown02
- fchown02
* bcm2711-rpi-4-b-clang, ltp-syscalls
- chown02
- fchown02
--
Linaro LKFT
https://lkft.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
Build test (gcc version 12.3.1 20230625):
mips: 62 configs -> no failure
arm: 99 configs -> no failure
arm64: 3 configs -> no failurex86_64: 4 configs -> no failure
alpha allmodconfig -> no failure
csky allmodconfig -> no failure
powerpc allmodconfig -> no failure
riscv allmodconfig -> no failure
s390 allmodconfig -> no failure
xtensa allmodconfig -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
arm64: Booted on rpi4b (4GB model). No regression. [2]
mips: Booted on ci20 board. No regression. [3]
[1]. https://openqa.qa.codethink.co.uk/tests/4793
[2]. https://openqa.qa.codethink.co.uk/tests/4794
[3]. https://openqa.qa.codethink.co.uk/tests/4784
Signature · 2 lines
Regards Sudip
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.15:
11 builds: 11 pass, 0 fail
28 boots: 28 pass, 0 fail
114 tests: 114 pass, 0 failLinux version: 5.15.128-rc1-g00e5f0b76767
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
NOTE:
1)
LTP syscalls chown02 and fchown02 test failures on NFS mounted filesytem on arm64 Rpi4 will be investigated further.
## Build
* kernel: 5.15.128-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-5.15.y
* git commit: 00e5f0b76767cab779762a1d27fc17c1cf2a3606
* git describe: v5.15.127-140-g00e5f0b76767
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.15.y/build/v5.15.127-140-g00e5f0b76767
## Test Regressions (compared to v5.15.127)
## Metric Regressions (compared to v5.15.127)
## Test Fixes (compared to v5.15.127)
## Metric Fixes (compared to v5.15.127)
## Test result summary
total: 122966, pass: 99727, fail: 2827, skip: 20301, xfail: 111
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 115 total, 114 passed, 1 failed
* arm64: 44 total, 43 passed, 1 failed
* i386: 35 total, 34 passed, 1 failed
* mips: 27 total, 26 passed, 1 failed
* parisc: 4 total, 4 passed, 0 failed
* powerpc: 26 total, 25 passed, 1 failed
* riscv: 11 total, 10 passed, 1 failed
* s390: 12 total, 11 passed, 1 failed
* sh: 14 total, 12 passed, 2 failed
* sparc: 8 total, 8 passed, 0 failed
* x86_64: 38 total, 37 passed, 1 failed
## Test suites summary
* boot
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers-dma-buf
* kselftest-efivarfs
* kselftest-exec
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-filesystems-epoll
* kselftest-firmware
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-net-forwarding
* kselftest-net-mptcp
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-user_events
* kselftest-vDSO
* kselftest-vm
* kselftest-watchdog
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libgpiod
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* perf
* rcutorture
* v4l2-compliance
--
Linaro LKFT
https://lkft.linaro.org
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
Build results:
total: 160 pass: 160 fail: 0 Qemu test results: total: 501 pass: 501 fail: 0
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.128 release. There are 139 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 26 Aug 2023 14:49:55 +0000. Anything received after that time might be too late.
No new problems seen on x86_64 and aarch64.
Thanks,
Harshit
Quoted 10 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.128-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h