7.1.6-rc1 review
Subsystems (4)
Greg Kroah-Hartman
maintainercover 7.1.6-rc1 review
This is the start of the stable review cycle for the 7.1.6 release. There are 744 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, 01 Aug 2026 14:13:38 +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/v7.x/stable-review/patch-7.1.6-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-7.1.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 7.1.6-rc1
Nikunj A Dadhania <[email protected]>
KVM: SVM: Bump asid_generation on CPU online to avoid ASID collision after hotplug
Willem de Bruijn <[email protected]>
selftests: drv-net: so_txtime: relax variance bounds
Willem de Bruijn <[email protected]>
selftests: drv-net: cope with slow env in so_txtime.py test
Andrea Righi <[email protected]>
sched_ext: Preserve rq tracking across local DSQ dispatch
Tejun Heo <[email protected]>
sched_ext: Move shared helpers from ext.c into internal.h and cid.h
Breno Leitao <[email protected]>
bootconfig: fix NULL-pointer arithmetic in xbc_snprint_cmdline()
Breno Leitao <[email protected]>
bootconfig: move xbc_snprint_cmdline() to lib/bootconfig.c
Shradha Gupta <[email protected]>
net: mana: Optimize irq affinity for low vcpu configs
Michael Bommarito <[email protected]>
thunderbolt: Prevent XDomain delayed work use-after-free on disconnect
Mika Westerberg <[email protected]>
thunderbolt: Remove XDomain from the bus without holding tb->lock
Mika Westerberg <[email protected]>
thunderbolt: Remove service debugfs entries during unregister
Mika Westerberg <[email protected]>
thunderbolt: Keep XDomain reference during the lifetime of a service
Muchun Song <[email protected]>
mm/sparse-vmemmap: fix DAX vmemmap accounting with optimization
Muchun Song <[email protected]>
mm/sparse-vmemmap: pass @pgmap argument to memory deactivation paths
Chuck Lever <[email protected]>
SUNRPC: Return an error from xdr_buf_to_bvec() on overflow
Chuck Lever <[email protected]>
SUNRPC: Add helpers to convert xdr_buf byte ranges to scatterlists
Darrick J. Wong <[email protected]>
xfs: don't replace the wrong part of the cow fork
Joanne Koong <[email protected]>
fuse-uring: fix race between registration and connection abortion
Ricardo Robaina <[email protected]>
audit: fix recursive locking deadlock in audit_dupe_exe()
Ricardo Robaina <[email protected]>
audit: use 'unsigned int' instead of 'unsigned'
Harry Wentland <[email protected]>
drm/amd/display: Fix DTB DTO updates breaking live pixel rate sources
Namjae Jeon <[email protected]>
ksmbd: validate ACE size against SID sub-authorities
Namjae Jeon <[email protected]>
ksmbd: bound DACL dedup walk to copied ACEs
Wentao Guan <[email protected]>
ksmbd: restore DACL size on check_add_overflow() to avoid malformed ACL
Haofeng Li <[email protected]>
ksmbd: validate num_subauth when copying ACE in set_ntacl_dacl
Matthieu Baerts (NGI0) <[email protected]>
selftests: drv-net: add missing kconfig for psp.py
Christian König <[email protected]>
drm/amdgpu: fix check in amdgpu_hmm_invalidate_gfx
Yang Wang <[email protected]>
drm/amd/pm: fix smu13 power limit range calculation
Asad Kamal <[email protected]>
drm/amdgpu: fix aperture mapping leak
Zhu Lingshan <[email protected]>
drm/amdgpu: reject mapping a reserved doorbell to a new queue
Ce Sun <[email protected]>
drm/amdgpu: invoke pm_genpd_remove() before freeing genpd
Ce Sun <[email protected]>
drm/amdgpu: fix resource leak on ACP reset timeout
Harish Kasiviswanathan <[email protected]>
drm/amdgpu: Fix kernel panic during driver load failure
Boyuan Zhang <[email protected]>
drm/amdgpu: fix division by zero with invalid uvd dimensions
Luca Coelho <[email protected]>
drm/dp_mst: Handle torn-down topology gracefully in drm_dp_mst_topology_queue_probe()
Boyuan Zhang <[email protected]>
drm/amdgpu/vcn4: avoid rereading IB param length
Boyuan Zhang <[email protected]>
drm/amdgpu/vce: fix integer overflow in image size
Alex Deucher <[email protected]>
drm/amdgpu/sdma7.1: replace BUG_ON() with WARN_ON()
Alex Deucher <[email protected]>
drm/amdgpu/sdma4.4.2: replace BUG_ON() with WARN_ON()
Prike Liang <[email protected]>
drm/amdgpu/mes11: set doorbell offset for suspending userq
Boyuan Zhang <[email protected]>
drm/amdgpu/jpeg: fix jpeg_v5_0_1_is_idle detection
Boyuan Zhang <[email protected]>
drm/amdgpu/jpeg: fix jpeg_v4_0_3_is_idle detection
Alex Deucher <[email protected]>
drm/amdgpu/gfx9: replace BUG_ON() with WARN_ON()
Alex Deucher <[email protected]>
drm/amdgpu/gfx9.4.3: replace BUG_ON() with WARN_ON()
Alex Deucher <[email protected]>
drm/amdgpu/gfx8: drop unecessary BUG_ON()
Alex Deucher <[email protected]>
drm/amdgpu/gfx12: replace BUG_ON() with WARN_ON()
Jesse Zhang <[email protected]>
drm/amdgpu/gfx12: fix EOP interrupt routing for KQ and userq
Jesse Zhang <[email protected]>
drm/amdgpu/gfx11: fix EOP interrupt routing for KQ and userq
Alex Deucher <[email protected]>
drm/amdgpu/gfx12.1: replace BUG_ON() with WARN_ON()
Alex Deucher <[email protected]>
drm/amdgpu/gfx10: replace BUG_ON() with WARN_ON()
Yang Wang <[email protected]>
drm/amd/pm: make pp_features read-only when scpm is enabled
Yang Wang <[email protected]>
drm/amd/pm: fix amdgpu_pm_info power display units
Ethan Nelson-Moore <[email protected]>
watchdog: s32g_wdt: remove incorrect options in watchdog_info struct
James Raphael Tiovalen <[email protected]>
vxlan: mdb: Fix source list corruption on a failed replace
Stefano Garzarella <[email protected]>
vsock/virtio: collapse receive queue under memory pressure
Daehyeon Ko <[email protected]>
tipc: clear sock->sk on the failed-insert path in tipc_sk_create()
Yuxiang Yang <[email protected]>
tcp: challenge ACK for non-exact RST in SYN-RECEIVED
Yizhou Zhao <[email protected]>
tcp: initialize standalone TCP-AO response padding
Justin Lai <[email protected]>
rtase: Workaround for TX hang caused by hardware packet parsing
Asim Viladi Oglu Manizada <[email protected]>
pppoe: reload header pointer after dev_hard_header()
Shuvam Pandey <[email protected]>
ovpn: hold peer before scheduling keepalive work
Pavitra Jha <[email protected]>
ovpn: fix peer refcount leak in TCP error paths
Kyle Zeng <[email protected]>
openvswitch: fix GSO userspace truncation underflow
Doruk Tan Ozturk <[email protected]>
mctp: serial: handle zero-length frames to prevent rx buffer overflow
Doruk Tan Ozturk <[email protected]>
mac802154: llsec: reject frames shorter than the authentication tag
Ibrahim Hashimov <[email protected]>
mac802154: hold an interface reference across the scan worker
Michael Bommarito <[email protected]>
ila: reload IPv6 header after pskb_may_pull in checksum adjust
Sergey Temerkhanov <[email protected]>
ice: use READ_ONCE() to access cached PHC time
Aleksandr Loktionov <[email protected]>
ice: reject out-of-range ptype in ice_parser_profile_init
Eddie Phillips <[email protected]>
gve: fix Rx queue stall on alloc failure
Namjae Jeon <[email protected]>
ksmbd: validate minimum PDU size for transform requests
James Montgomery <[email protected]>
ksmbd: defer destroy_previous_session() until after NTLM authentication
Carl Johnson <[email protected]>
smb: client: handle STATUS_STOPPED_ON_SYMLINK responses without a symlink target
Raphael Zimmer <[email protected]>
rbd: Reset positive result codes to zero in object map update path
Christian Brauner <[email protected]>
super: fix emergency thaw deadlock on frozen block devices
Masami Hiramatsu (Google) <[email protected]>
selftests/ftrace: Reset triggers at top level before instance loop
Paul Greenwalt <[email protected]>
ice: fix PTP Call Trace during PTP release
Sven Schnelle <[email protected]>
ptp: ptp_s390: Add missing facility check
Jann Horn <[email protected]>
proc: Fix broken error paths for namespace links
Youssef Samir <[email protected]>
net: qrtr: ns: Raise node count limit to 512
Coia Prant <[email protected]>
net: pcs: xpcs: fix SGMII state reading
Fan Wu <[email protected]>
net: hip04: fix RX buffer leak on build_skb failure
Shiming Cheng <[email protected]>
net: gro: fix double aggregation of flush-marked skbs
David Lee <[email protected]>
net/x25: fix use-after-free in x25_kill_by_neigh()
Aldo Ariel Panzardo <[email protected]>
net/sched: serialize qdisc_rtab_list against concurrent get/put
Manjunath Patil <[email protected]>
net/mlx5e: Use sender devcom for MPV master-up
Bryam Vargas <[email protected]>
net/iucv: fix use-after-free of a severed iucv_path
Hidayath Khan <[email protected]>
net/af_iucv: fix NULL deref in afiucv_hs_callback_syn()
Doruk Tan Ozturk <[email protected]>
geneve: require CAP_NET_ADMIN in the device netns for changelink
Sungmin Kang <[email protected]>
net: slip: serialize receive against buffer reallocation
Doruk Tan Ozturk <[email protected]>
vxlan: require CAP_NET_ADMIN in the device netns for changelink
Breno Leitao <[email protected]>
phonet: pep: fix use-after-free in pep_get_sb()
Markus Breitenberger <[email protected]>
net: stmmac: intel: skip SerDes reconfig when rate is unchanged
Harry Yoo (Oracle) <[email protected]>
mm/slab: fix a memory leak due to bootstrapping sheaves twice
Shengming Hu <[email protected]>
mm/slub: fix lost local objects when bulk remote free batch fills
Lu Baolu <[email protected]>
iommu/vt-d: Disallow SVA if page walk is not coherent
Zhang Yi <[email protected]>
iomap: fix out-of-bounds bitmap_set() with zero-length range
Yitang Yang <[email protected]>
io_uring/rw: fix missing ERESTARTSYS conversion in read paths
Tengda Wu <[email protected]>
ftrace: Add global mutex to serialize trace_parser access
Eric Biggers <[email protected]>
fscrypt: Avoid dynamic allocation in fscrypt_get_devices()
Eric Biggers <[email protected]>
fscrypt: Add missing superblock check in find_or_insert_direct_key()
Amir Goldstein <[email protected]>
fs: preserve ACL_DONT_CACHE state in forget_cached_acl()
Chen Changcheng <[email protected]>
fs/super: fix emergency thaw double-unlock of s_umount
Christian Brauner <[email protected]>
binfmt_elf_fdpic: only honour the first PT_INTERP
Chancel Liu <[email protected]>
ASoC: fsl_sai: Fix spurious BCLK on resume by clearing BYP
Chancel Liu <[email protected]>
ASoC: fsl: imx-card: Skip sysclk reset for active DAIs in shutdown
Shihuang Liu <[email protected]>
amt: fix use-after-free in AMT delayed works
Douya Le <[email protected]>
libceph: remove debugfs files before client teardown
Douya Le <[email protected]>
libceph: reject zero bucket types in crush_decode
Raphael Zimmer <[email protected]>
libceph: Reject monmaps advertising zero monitors
Shuangpeng Bai <[email protected]>
libceph: refresh auth->authorizer_buf{,_len} after authorizer updateZhao Zhang <[email protected]>
libceph: guard missing CRUSH type name lookup
Pavitra Jha <[email protected]>
libceph: fix two unsafe bare decodes in decode_lockers()
Raphael Zimmer <[email protected]>
libceph: Fix multiplication overflow in decode_new_up_state_weight()
Xiang Mei <[email protected]>
libceph: bound pg_{temp,upmap,upmap_items} length to CEPH_PG_MAX_SIZE
Douya Le <[email protected]>
libceph: bound get_version reply decode to front len
Wentao Liang <[email protected]>
ceph: fix writeback_count leak in write_folio_nounlock()
WenTao Liang <[email protected]>
ceph: fix refcount leak in ceph_readdir()
Bryam Vargas <[email protected]>
ceph: fix pre-auth out-of-bounds read on snaptrace in ceph_handle_caps()
Max Kellermann <[email protected]>
ceph: add owner/capability checks for CEPH_IOC_SET_LAYOUT*
Zhiling Zou <[email protected]>
sctp: close UDP tunnel sockets during netns teardown
Zhiling Zou <[email protected]>
sctp: avoid auth_enable sysctl UAF during netns teardown
Jun Yang <[email protected]>
sctp: don't free the ASCONF's own transport in DEL-IP processing
Rik van Riel <[email protected]>
mm/huge_memory: set PG_has_hwpoisoned only after new folio head is established
Wei Yang <[email protected]>
mm/page_vma_mapped: fix device-private PMD handling
Xie Yuanbin <[email protected]>
mm/memory-failure: trace: change memory_failure_event to ras subsystem
Breno Leitao <[email protected]>
mm/kmemleak: fix checksum computation for per-cpu objects
SJ Park <[email protected]>
mm/damon/core: disallow overlapping input ranges for damon_set_regions()
Thomas Weißschuh <[email protected]>
m68k: avoid -Wunused-but-set-parameter in clear_user_page()
SJ Park <[email protected]>
mm/damon/core: validate ranges in damon_set_regions()
Mike Rapoport (Microsoft) <[email protected]>
userfaultfd: prevent registration of special VMAs
Qu Wenruo <[email protected]>
btrfs: do not try compression for data reloc inodes
David Howells <[email protected]>
afs: Fix afs_edit_dir_remove() to get, not find, block 0
Geliang Tang <[email protected]>
selftests: mptcp: userspace_pm: fix undefined variable port
Geliang Tang <[email protected]>
mptcp: pm: userspace: fix use-after-free in get_local_id
Michael Bommarito <[email protected]>
mptcp: only set DATA_FIN when a mapping is present
Kalpan Jani <[email protected]>
mptcp: fix stale skb->sk reference on subflow close
Matthieu Baerts (NGI0) <[email protected]>
mptcp: fix BUILD_BUG_ON on legacy ARM config
Chenguang Zhao <[email protected]>
mptcp: decrement subflows counter on failed passive join
Will Deacon <[email protected]>
Revert "arm64: syscall: Ensure saved x0 is kept in-sync with tracer updates"
Will Deacon <[email protected]>
arm64: syscall: Ensure saved x0 is kept in-sync with tracer updates
Dev Jain <[email protected]>
arm64: make huge_ptep_get handled unaligned addresses
Fuad Tabba <[email protected]>
tracing/remotes: Fix page_va[] access before counter update in trace_remote_alloc_buffer()
Masami Hiramatsu (Google) <[email protected]>
tracing/probes: Prevent out-of-bounds write in __trace_probe_log_err()
Masami Hiramatsu (Google) <[email protected]>
tracing/probes: Fix potential underflow in LEN_OR_ZERO macro
Masami Hiramatsu (Google) <[email protected]>
tracing/probes: Avoid temporary buffer truncation in trace_probe_match_command_args()
Masami Hiramatsu (Google) <[email protected]>
tracing/eprobe: Fix exact system name matching in eprobe_dyn_event_match()
Ming Lei <[email protected]>
ublk: wait on ublk_dev_ready() instead of ub->completion
Jackie Liu <[email protected]>
tracing: Propagate errors from remote event bulk updates
Steven Rostedt <[email protected]>
tracing: perf: Fix stale head for perf syscall tracing
Masami Hiramatsu (Google) <[email protected]>
tracing: Fix union collision of module and refcnt for dynamic events
deepakraog <[email protected]>
tracing: Fix resource leak on mmiotrace trace_pipe close
Steven Rostedt <[email protected]>
tracing: Fix mmiotrace possible NULL dereferencing of hiter->dev
Usama Arif <[email protected]>
tracing: Fix context switch counter truncation
Steven Rostedt <[email protected]>
tracing: Delay module ref count for "enable_event" trigger
Xu Rao <[email protected]>
misc: nsm: pin the module while the device is open
Runyu Xiao <[email protected]>
misc: nsm: only unlock nsm_dev on post-lock error paths
Guangshuo Li <[email protected]>
intel_th: fix MSC output device reference leak
Alexander Usyskin <[email protected]>
mei: bus: access mei_device under device_lock on cleanup
Ethan Nelson-Moore <[email protected]>
selftests: ntsync: correct CONFIG_NTSYNC name
Jiangshan Yi <[email protected]>
serial: 8250_mid: Fix NULL function pointer dereference on DNV/ICX-D/SNR platforms
Hugo Villeneuve <[email protected]>
serial: sc16is7xx: implement gpio get_direction() callback
Ben Hutchings <[email protected]>
uio_hv_generic: Bind to FCopy device by default
Ian Abbott <[email protected]>
comedi: comedi_parport: deal with premature interrupt
Nathan Chancellor <[email protected]>
x86/boot/compressed: Disable jump tables
Adrian Ng Ho Yin <[email protected]>
firmware: stratix10-svc: handle NO_RESPONSE in async poll
Adrian Ng Ho Yin <[email protected]>
firmware: stratix10-svc: fix teardown order in remove to prevent race
Tze Yee Ng <[email protected]>
firmware: stratix10-svc: fix memory leaks and list corruption bugs
Cen Zhang (Microsoft) <[email protected]>
rhashtable: clear stale iter->p on table restart
Xu Rao <[email protected]>
cdrom: fix stack out-of-bounds read in CDROMVOLCTRL
Rong Bao <[email protected]>
LoongArch: Retrieve CPU package ID from PPTT when available
Kanglong Wang <[email protected]>
LoongArch: Move jump_label_init() before parse_early_param()
Huacai Chen <[email protected]>
LoongArch: Increase TASK_STRUCT_OFFSET up to 2040 for 32BIT
Haoran Jiang <[email protected]>
LoongArch: Fix oops during single-step debugging
Huacai Chen <[email protected]>
LoongArch: Fix build errors due to wrong instructions for 32BIT
George Guo <[email protected]>
LoongArch: Fix address space mismatch in kexec command line lookup
Miguel Ojeda <[email protected]>
objtool/rust: add one more noreturn Rust function for Rust 1.99.0
Alexandre Courbot <[email protected]>
rust: allow clippy::unwrap_or_default globally
Miguel Ojeda <[email protected]>
rust: allow suspicious_runtime_symbol_definitions lint for Rust >= 1.98
Alice Ryhl <[email protected]>
rust: device: avoid trailing ; in printing macros
FUJITA Tomonori <[email protected]>
rust: time: fix as_micros_ceil() to round correctly for negative Delta
Alice Ryhl <[email protected]>
rust_binder: only print failure if error has source
Zixing Liu <[email protected]>
platform/loongarch: laptop: Explicitly reset bl_powered state when suspend
Christian Brauner <[email protected]>
binfmt_misc: set have_execfd only once the interpreter is opened
Christian Brauner <[email protected]>
exec: fix unsigned loop counter wrap in transfer_args_to_stack()
Chengfeng Ye <[email protected]>
Bluetooth: RFCOMM: Fix session UAF in set_termios
Chengfeng Ye <[email protected]>
Bluetooth: hci_sync: Protect UUID list traversal
MinJea Kim <[email protected]>
staging: rtl8723bs: fix inverted HT40 secondary channel offset
Moksh Panicker <[email protected]>
staging: rtl8723bs: fix OOB reads in rtw_get_wps_ie()
Jose Ignacio Tornos Martinez <[email protected]>
wifi: ath12k: fix NULL pointer dereference in rhash table destroy
Wentao Liang <[email protected]>
wifi: ath11k: fix refcount leak in ath11k_ahb_fw_resources_init()
LiangCheng Wang <[email protected]>
wifi: brcmfmac: set F2 blocksize to 256 for BCM43752
Fan Wu <[email protected]>
wifi: brcmfmac: make release_scratchbuffers idempotent
Fan Wu <[email protected]>
wifi: brcmfmac: drain bus_reset work on device removal
Devin Wittmayer <[email protected]>
wifi: mt76: restrict NPU/PPE active checks to MMIO devices
Devin Wittmayer <[email protected]>
wifi: mt76: mt7925: drop TXRX_NOTIFY on non-mmio buses
Devin Wittmayer <[email protected]>
wifi: mt76: mt7921: drop TXRX_NOTIFY on non-mmio buses
Devin Wittmayer <[email protected]>
wifi: mt76: mt7615: drop TXRX_NOTIFY on non-mmio buses
Huihui Huang <[email protected]>
wifi: wilc1000: validate assoc response length before subtracting header
Doruk Tan Ozturk <[email protected]>
wifi: mwifiex: fix NULL dereference when the AP has HT-cap but no HT-oper
Daniel Hodges <[email protected]>
wifi: ath6kl: fix use-after-free in aggr_reset_state()
Tristan Madani <[email protected]>
wifi: ath6kl: fix OOB access from firmware ADDBA window size
Norbert Szetei <[email protected]>
ALSA: timer: don't re-enter an instance callback that is still running
Norbert Szetei <[email protected]>
ALSA: timer: drain a slave's callback before its master detaches it
Kai Vehmanen <[email protected]>
ALSA: hda: codecs: hdmi: disable keep-alive before audio format change
Norbert Szetei <[email protected]>
ALSA: seq: close a re-opened queue timer in the destructor
Nikita Maksimov <[email protected]>
ALSA: hda/realtek: Fix speakers on Lunnen Ground 14
Johan Hovold <[email protected]>
media: vpif_capture: fix OF node reference imbalance
Guangshuo Li <[email protected]>
media: vivid: fix cleanup bugs in vivid_init()
Hans Verkuil <[email protected]>
media: vivid: check for vb2_is_busy() when toggling caps
Hans Verkuil <[email protected]>
media: vivid: add vivid_update_reduced_fps()
Guangshuo Li <[email protected]>
media: vimc: fix reference leak on failed device registration
Guangshuo Li <[email protected]>
media: vidtv: fix reference leak on failed device registration
Benjamin Gaignard <[email protected]>
media: verisilicon: Export only needed pixels formats
Zile Xiong <[email protected]>
media: vb2: use ssize_t for vb2_read/vb2_write
Sakari Ailus <[email protected]>
media: v4l2-subdev: Fail {enable,disable}_streams and s_streaming nicely
Mirela Rabulea <[email protected]>
media: v4l2-fwnode: Fix subdev owner overwritten in v4l2_async_register_subdev_sensor()
Pengpeng Hou <[email protected]>
media: v4l2-ctrls: validate HEVC active reference counts
Sergey Shtylyov <[email protected]>
media: v4l2-ctrls-request: add NULL check in v4l2_ctrl_request_complete()
Niklas Söderlund <[email protected]>
media: uapi: rkisp: Correct name version enum
Myeonghun Pak <[email protected]>
media: ti: vpe: unwind v4l2 device registration on probe error
Felix Gu <[email protected]>
media: ti: vpe: Fix the error code of devm_request_irq()
Felix Gu <[email protected]>
media: ti: vpe: Fix the error code of devm_kzalloc() in vip_probe_slice()
Felix Gu <[email protected]>
media: ti: vpe: Fix fwnode_handle leak in vip_probe_complete()
Hungyu Lin <[email protected]>
media: tegra-video: vi: fix invalid u32 return value in format lookup
Dmitry Osipenko <[email protected]>
media: synopsys: hdmirx: Fix HPD lane hold time
Valery Borovsky <[email protected]>
media: sun4i-csi: Return queued buffers on start_streaming() failure
Myeonghun Pak <[email protected]>
media: stm32: dcmi: unregister notifier on probe failure
Valery Borovsky <[email protected]>
media: stm32-dcmipp: Return queued buffers on start_streaming() failure
Ma Ke <[email protected]>
media: saa7134: Fix a possible memory leak in saa7134_video_init1
Jacopo Mondi <[email protected]>
media: rzv2h-ivc: Wait for frame end in stop_streaming
Tommaso Merciai <[email protected]>
media: rzg2l-cru: Skip ICnMC configuration when ICnSVC is used
Valery Borovsky <[email protected]>
media: rtl2832_sdr: Return queued buffers on start_streaming() failure
Deepanshu Kartikey <[email protected]>
media: rtl2832: fix use-after-free in rtl2832_remove()
Myeonghun Pak <[email protected]>
media: radio-si476x: Unregister v4l2_device on probe failure
Bryan O'Donoghue <[email protected]>
media: qcom: camss: Fix RDI streaming for CSID 340
Bryan O'Donoghue <[email protected]>
media: qcom: camss: Fix RDI streaming for CSID GEN3
Bryan O'Donoghue <[email protected]>
media: qcom: camss: Fix RDI streaming for CSID GEN2
Bryan O'Donoghue <[email protected]>
media: qcom: camss: Fix RDI streaming for CSID 680
Valery Borovsky <[email protected]>
media: pwc: Return queued buffers on start_streaming() failure
Valery Borovsky <[email protected]>
media: pwc: Drain fill_buf on start_streaming() failure
Krzysztof Kozlowski <[email protected]>
media: pci: dm1105: Free allocated workqueue
Guoniu Zhou <[email protected]>
media: nxp: imx8-isi: Fix scale factor calculation for hardware rounding
Guoniu Zhou <[email protected]>
media: nxp: imx8-isi: Fix potential out-of-bounds issues
Xiaolei Wang <[email protected]>
media: nxp: imx8-isi: Fix missing v4l2_subdev_cleanup() in pipe init error path
Xiaolei Wang <[email protected]>
media: nxp: imx8-isi: Clean up already-initialized pipes on probe failure
Xiaolei Wang <[email protected]>
media: nxp: imx8-isi: Add missing v4l2_subdev_cleanup() in crossbar and pipe
David Carlier <[email protected]>
media: nuvoton: npcm-video: fix memory leaks in probe and remove
David Carlier <[email protected]>
media: nuvoton: npcm-video: fix error handling in npcm_video_init()
Valery Borovsky <[email protected]>
media: msi2500: Return queued buffers on start_streaming() failure
Anand Moon <[email protected]>
media: meson: vdec: Fix memory leak in error path of vdec_open
Guangshuo Li <[email protected]>
media: marvell-cam: fix missing pci_disable_device() on remove
David Carlier <[email protected]>
media: mali-c55: Power-off the peripheral in remove()
Alper Ak <[email protected]>
media: mali-c55: Fix possible ERR_PTR in enable_streams
David Carlier <[email protected]>
media: mali-c55: Disable pm_runtime on probe error
David Carlier <[email protected]>
media: mali-c55: Add missing of_reserved_mem_device_release()
Dmitry Baryshkov <[email protected]>
media: iris: Fix use IRQF_NO_AUTOEN when requesting the IRQ
Marco Nenciarini <[email protected]>
media: intel/ipu6: Improve DWC PHY HSFREQRANGE band selection for overlapping ranges
Sakari Ailus <[email protected]>
media: imx219: Fix maximum frame length in lines
Martin Hecht <[email protected]>
media: i2c: alvium: fix critical pointer access in alvium_ctrl_init
Sakari Ailus <[email protected]>
media: dw9719: Add back the I²C device id table
Wang Jun <[email protected]>
media: cx23885: add ioremap return check and cleanup
Johan Hovold <[email protected]>
media: cx231xx: fix devres lifetime
Brandon Brnich <[email protected]>
media: chips-media: wave5: Move src_buf Removal to finish_encode
Pengpeng Hou <[email protected]>
media: cedrus: skip invalid H.264 reference list entries
Samuel Holland <[email protected]>
media: cedrus: Fix missing cleanup in error path
Myeonghun Pak <[email protected]>
media: cedrus: clean up media device on probe failure
Myeonghun Pak <[email protected]>
media: cec: seco: unregister adapter on IR probe failure
David Carlier <[email protected]>
media: aspeed: fix missing of_reserved_mem_device_release() on probe failure
Ricardo Ribalda <[email protected]>
media: amlogic-c3: Add validations for ae and awb config
Valery Borovsky <[email protected]>
media: airspy: Return queued buffers on start_streaming() failure
Maíra Canal <[email protected]>
drm/v3d: Reach the GMP through the hub registers on V3D 7.x
Matthew Brost <[email protected]>
drm/gpusvm: Fix MM reference leak in drm_gpusvm_range_evict
Stanislav Kinsburskii <[email protected]>
drm/gpusvm: Zero HMM PFNs before scanning ranges
Matthew Brost <[email protected]>
drm/ttm/pool: back up at native page order
Matthew Brost <[email protected]>
drm/pagemap: Guard HPAGE_PMD_ORDER use with CONFIG_ARCH_ENABLE_THP_MIGRATION
Linmao Li <[email protected]>
drm/vc4: Prevent shader BO mappings from becoming writable
Ian Forbes <[email protected]>
drm/vmwgfx: Validate vmw_surface_metadata::array_size
Matthew Brost <[email protected]>
drm/pagemap: Clear driver-provided PFNs from migration PFN array
Leo Li <[email protected]>
drm/amd/display: Fix missing DCE check in dm_gpureset_toggle_interrupts()
Linmao Li <[email protected]>
drm/vc4: Shut down BO cache timer before teardown
Leo Li <[email protected]>
drm/amd/display: Fix flip-done timeouts on mode1 reset
Alex Deucher <[email protected]>
drm/amdgpu: always emit the job vm fence
Timur Kristóf <[email protected]>
drm/amdgpu: Print vmid, pasid and more task info in devcoredump
Zhu Lingshan <[email protected]>
drm/amdgpu: fix bo->pin leaking in amdgpu_bo_create_reserved
Mario Limonciello <[email protected]>
drm/amdgpu: Disable PCIe dynamic speed switching on Ryzen Pinnacle Ridge
Mario Limonciello <[email protected]>
drm/amd/display: Fix backlight max_brightness to match exported range
Alessandro Rinaldi <[email protected]>
drm/amd/display: Force PWM backlight on Lenovo Legion 5 15ARH05
Andriy Korud <[email protected]>
drm/amd/display: dce100: skip non-DP stream encoders for DP MST
Leo Li <[email protected]>
drm/amd/display: consolidate DCN vblank/flip handling onto vupdate_no_lock
WenTao Liang <[email protected]>
drm/amd/display: set new_stream to NULL after release
Timur Kristóf <[email protected]>
drm/amd/pm/ci: Don't disable MCLK DPM on Bonaire 0x6658 (R7 260X)
Mario Limonciello <[email protected]>
drm/amd: Create a device link between APU display and XHCI devices
Jesse Zhang <[email protected]>
drm/amdgpu/userq: fix indefinite fence wait during GPU reset
Mario Limonciello <[email protected]>
drm/amdgpu: Fix VFCT bus number matching with soft filter
Mario Limonciello <[email protected]>
drm/amdgpu: Release VFCT ACPI table reference
Osama Abdelkader <[email protected]>
drm/panthor: return error on truncated firmware
Matthew Brost <[email protected]>
drm/ttm: Account for NULL and handle pages in ttm_pool_backup
Honglei Huang <[email protected]>
drm/gpusvm: publish dpagemap early to avoid device mapping leak on error
Jason Macnak <[email protected]>
drm/virtio: Don't detach GEM from a non-created context
Alex Deucher <[email protected]>
drm/gfx10: Program DB_RING_CONTROL
Yang Wang <[email protected]>
drm/amd/pm: fix smu14 power limit range calculation
Jani Nikula <[email protected]>
drm/i915/mst: limit DP MST ESI service loop
Joonas Lahtinen <[email protected]>
drm/i915/gt: Fix NULL deref on sched_engine alloc failure
Joonas Lahtinen <[email protected]>
drm/i915/gem: Fix NULL deref in I915_CONTEXT_PARAM_SSEU
Joonas Lahtinen <[email protected]>
drm/i915/gem: Do not leak siblings[] on proto context error
Jesse Zhang <[email protected]>
drm/amdgpu: trigger GPU recovery when userq destroy fails to unmap a hung queue
Shahyan Soltani <[email protected]>
drm/amdgpu: fix lifetime issue of amdgpu_vm_get_task_info_pasid()
Kenneth Feng <[email protected]>
drm/amd/amdgpu: disable ASPM on VI if pcie dpm is disabled
Alex Deucher <[email protected]>
drm/amdgpu/gfx11: replace BUG_ON() with WARN_ON()
Jakob Linke <[email protected]>
drm/amdgpu/soc24: reset dGPU if suspend got aborted
Jani Nikula <[email protected]>
drm/i915/bios: range check LFP Data Block panel_type2
Joonas Lahtinen <[email protected]>
drm/i915: Return NULL on error in active_instance
Alex Deucher <[email protected]>
drm/amdgpu/sdma5.0: replace BUG_ON() with WARN_ON()
Alex Deucher <[email protected]>
drm/amdgpu/sdma5.2: replace BUG_ON() with WARN_ON()
Alex Deucher <[email protected]>
drm/amdgpu/sdma6.0: replace BUG_ON() with WARN_ON()
Alex Deucher <[email protected]>
drm/amdgpu/sdma7.0: replace BUG_ON() with WARN_ON()
Prike Liang <[email protected]>
drm/amdgpu: add the doorbell index input for suspending userq
Jani Nikula <[email protected]>
drm/i915/hdcp: check streams[] bounds before overflow
Jani Nikula <[email protected]>
drm/i915/hdcp: require monotonically increasing seq_num_v
Jani Nikula <[email protected]>
drm/i915/vrr: require valid min/max vfreq for VRR
Bryam Vargas <[email protected]>
drm/virtio: bound EDID block reads to the response buffer
Leo Li <[email protected]>
Revert "drm/amd/display: Restore 5s vbl offdelay for NV3x+ DGPUs"
WenTao Liang <[email protected]>
drm/amd/display: detect_link_and_local_sink: DP alt mode timeout path leaks prev_sink reference
Honglei Huang <[email protected]>
drm/amd/display: use kvzalloc to allocate struct dc
Thomas Zimmermann <[email protected]>
drm/amd/display: Handle struct drm_plane_state.ignore_damage_clips
Leorize <[email protected]>
drm/amd/display: set MSA MISC1 bit 6 when using VSC SDP for DCE 11.x
Guangshuo Li <[email protected]>
drm/amdkfd: free MQD managers on DQM init failures
Yongqiang Sun <[email protected]>
drm/amdkfd: fix 32-bit overflow in CWSR total size calculation
David Francis <[email protected]>
drm/amdkfd: Check bounds on CRIU restore queue type and mqd size
David Francis <[email protected]>
drm/amdkfd: Check bounds in allocate_event_notification_slot
David Francis <[email protected]>
drm/amdkfd: Use kvcalloc to allocate arrays
Xiaogang Chen <[email protected]>
drm/amdkfd: Guard m->cp_hqd_eop_control setting by q->eop_ring_buffer_size
Yongqiang Sun <[email protected]>
drm/amdkfd: clamp v9 CRIU control stack checkpoint copy to BO size
Icenowy Zheng <[email protected]>
drm/imagination: acquire vm_ctx->lock before mapping memory to GPU VM
Luigi Santivetti <[email protected]>
drm/imagination: fix error checking of pvr_vm_context_lookup()
Shuvam Pandey <[email protected]>
drm/imagination: Fix user array stride in pvr_set_uobj_array()
Brajesh Gupta <[email protected]>
drm/imagination: Fix double call to drm_sched_entity_fini()
Arvind Yadav <[email protected]>
drm/xe/madvise: Skip invalidation for purgeable state updates
Alexander Usyskin <[email protected]>
drm/xe/nvm: fix writable override for CRI
Zongyao Bai <[email protected]>
drm/xe/pt: Reset current_op in xe_pt_update_ops_init()
Himal Prasad Ghimiray <[email protected]>
drm/xe/vm: Fix BO prefetch with CONSULT_MEM_ADVISE_PREF_LOC
Nitin Gote <[email protected]>
drm/xe: Hold a dma-buf reference for imported BOs
Matthew Brost <[email protected]>
drm/xe: Fix PTE index in xe_vm_populate_pgtable() for chunked binds
Ashutosh Dixit <[email protected]>
drm/xe/rtp: Add RING_FORCE_TO_NONPRIV_DENY to OA whitelists
Ashutosh Dixit <[email protected]>
drm/xe/oa: Fix offset alignment for MERT WHITELIST_OA_MERT_MMIO_TRG
Matthew Brost <[email protected]>
drm/xe: Return error on non-migratable faults requiring devmem
Matthew Auld <[email protected]>
drm/xe/display: skip FORCE_WC and vm_bound check for external dma-bufs
Pavel Ondračka <[email protected]>
drm/radeon: fix r100_copy_blit for large BOs
Wentao Liang <[email protected]>
drm/nouveau/acr: fix missing nvkm_done() in error path of nvkm_acr_oneinit()
Imre Deak <[email protected]>
drm/i915/mtl+: Enable PPS before PLL
Joonas Lahtinen <[email protected]>
drm/i915/gem: Add missing nospec on parallel submit slot
Jani Nikula <[email protected]>
drm/displayid: fix Tiled Display Topology ID size
Gerhard Schwanzer <[email protected]>
drm/amdkfd: Use exclusive bounds for SVM split alignment checks
Timur Kristóf <[email protected]>
drm/amdgpu: Respect placement requirements in amdgpu_gtt_mgr functions
Thomas Zimmermann <[email protected]>
drm/sysfb: Return errno code from drm_sysfb_get_visible_size()
Thomas Zimmermann <[email protected]>
drm/sysfb: Avoid possible truncation with calculating visible size
Junrui Luo <[email protected]>
drm/nouveau: fix reversed error cleanup order in ucopy functions
Mario Limonciello <[email protected]>
drm/amdgpu: validate CP_GFX_SHADOW chunk size in CS pass1
Tvrtko Ursulin <[email protected]>
drm/amdgpu: Fix context pstate override handling
Timur Kristóf <[email protected]>
drm/amdgpu: Fix amdgpu_bo_move() when old_mem and new_mem are both GTT
Jiqian Chen <[email protected]>
drm/amdgpu/gfx9: Fix Ring and IB test fail after mode2
Ivan Lipski <[email protected]>
drm/amd/display: Restore periodic detection for DCN35
Brian Nguyen <[email protected]>
drm/xe: Add compact-PT and addr mask handling for page reclaim
Tejas Upadhyay <[email protected]>
drm/xe/guc: Fix buffer overflow in steered register list allocation
Thomas Zimmermann <[email protected]>
drm/sysfb: Avoid truncating maximum stride
Thomas Zimmermann <[email protected]>
drm/sysfb: Do not page-align visible size of the framebuffer
Mario Limonciello <[email protected]>
drm/amdgpu: check amdgpu_vm_bo_find() result in GET_MAPPING_INFO
Timur Kristóf <[email protected]>
drm/amdgpu/uvd: Place VCPU BO only in VRAM for UVD 4.x and older
Timur Kristóf <[email protected]>
drm/amdgpu/uvd: Fix forcing MSG, FB BOs into VCPU segment when it isn't at 0 (v2)
Asad Kamal <[email protected]>
drm/amdgpu/gfx: fix cleaner shader IB buffer overflow
Shubhankar Milind Sardeshpande <[email protected]>
drm/amd/pm: re-enable MC access after PrepareMp1ForUnload on SMU V15 APUs
Ville Syrjälä <[email protected]>
drm/i915/cdclk: Fix up CDCLK_FREQ_DECIMAL without a full PLL re-enable
Ashutosh Desai <[email protected]>
drm/dp/mst: fix OOB reads on 2-byte fields in sideband reply parsers
Alessio Belle <[email protected]>
drm/imagination: Fit paired fragment job in the correct CCCB
Thomas Zimmermann <[email protected]>
drm/tegra: fbdev: Remove offset into framebuffer memory
Ashutosh Desai <[email protected]>
drm/dp/mst: fix buffer overflows in sideband chunk accumulation
Ashutosh Desai <[email protected]>
drm/dp/mst: fix OOB reads in remote DPCD/I2C sideband reply parsers
Thomas Zimmermann <[email protected]>
drm/exynos: fbdev: Remove offset into screen_buffer
Vitor Soares <[email protected]>
drm/bridge: cdns-dsi: Replace deprecated UNIVERSAL_DEV_PM_OPS()
Alessio Belle <[email protected]>
drm/imagination: Count paired job fence as dependency in prepare_job()
Chen Ni <[email protected]>
drm/rockchip: analogix_dp: Add missing error check for platform_get_resource()
Sergey Shtylyov <[email protected]>
drm/rockchip: cdn-dp: add missing check in cdn_dp_config_video()
Tomi Valkeinen <[email protected]>
drm/tidss: Fix missing drm_bridge_add() call
Biju Das <[email protected]>
drm: renesas: rzg2l_mipi_dsi: Move rzg2l_mipi_dsi_set_display_timing()
Biju Das <[email protected]>
drm: renesas: rzg2l_mipi_dsi: Increase reset deassertion delay
David Carlier <[email protected]>
tracing: Fix use-after-free freeing trigger private data
Chengfeng Ye <[email protected]>
bpf, sockmap: Fix cork use-after-free in tcp_bpf_sendmsg()
Pu Lehui <[email protected]>
LoongArch: BPF: Fix memory leak in bpf_jit_free()
Mateusz Guzik <[email protected]>
pidfs: make pidfs_ino_lock static
Eric Dumazet <[email protected]>
drop_monitor: perform u64_stats updates under IRQ-disabled section
Eric Dumazet <[email protected]>
drop_monitor: fix size calculations for 64-bit attributes
Yehyeong Lee <[email protected]>
net: drop_monitor: fix info leak in NET_DM_ATTR_PAYLOAD
Vikas Gupta <[email protected]>
bnge/bng_re: fix ring ID widths
Cen Zhang (Microsoft) <[email protected]>
tipc: fix integer overflow in tipc_recvmsg() and tipc_recvstream()
Lorenzo Bianconi <[email protected]>
net: airoha: fix ETS channel derivation in airoha_tc_setup_qdisc_ets()
Minhong He <[email protected]>
mctp: check register_netdevice_notifier() error in mctp_device_init()
Clark Wang <[email protected]>
ptp: netc: explicitly clear TMR_OFF during initialization
Cen Zhang (Microsoft) <[email protected]>
rds: tcp: unregister sysctl before tearing down listen socket
Nikola Z. Ivanov <[email protected]>
ipv6: Change allocation flags to match rcu_read_lock section requirements
Emil Tantilov <[email protected]>
idpf: fix max_vport related crash on allocation error during init
Paul Greenwalt <[email protected]>
ice: prevent tstamp ring allocation for non-PF VSI types
Marcin Szycik <[email protected]>
ice: fix LAG recipe to profile association
Vincent Chen <[email protected]>
ice: allow creating VFs when !CONFIG_ICE_SWITCHDEV
Li RongQing <[email protected]>
net: ipv6: fix dif and sdif mismatch in raw6_icmp_error
Hariprasad Kelam <[email protected]>
octeontx2-pf: tc: fix egress ratelimiting
Alexei Lazar <[email protected]>
net/mlx5e: Reject unsupported CB Shaper TSA in ETS validation
Alexei Lazar <[email protected]>
net/mlx5e: Report zero bandwidth for non-ETS traffic classes
Yael Chemla <[email protected]>
net/mlx5: E-Switch, fix zero num_dest in prio_tag egress vlan rule
Gal Pressman <[email protected]>
net/mlx5: Fix MCIA register buffer overflow on 32 dword reads
Runyu Xiao <[email protected]>
raw: annotate lockless match fields in raw_v4_match()
Aldo Ariel Panzardo <[email protected]>
net: qrtr: restrict socket creation to the initial network namespace
Nicholas Dudar <[email protected]>
LoongArch: BPF: Zero-extend signed ALU32 div/mod results
Chenguang Zhao <[email protected]>
hinic: remove unused ethtool RSS user configuration buffers
Eric Dumazet <[email protected]>
ppp: annotate data races in ppp_generic
Eric Dumazet <[email protected]>
ipv4: icmp: fill flow parameters in icmp_route_lookup decoy lookup
Suman Ghosh <[email protected]>
octeontx2-vf: set TC flower flag on MCAM entry allocation
Kuniyuki Iwashima <[email protected]>
mpls: Set rt->rt_nhn just before returning from mpls_nh_build_multi().
Yun Zhou <[email protected]>
net: gre: fix lltx regression for GRE tunnels with SEQ/CSUM
vadik likholetov <[email protected]>
net: stmmac: enable the MAC on link up for all supported speeds
Nazim Amirul <[email protected]>
net: stmmac: reset residual action in L3L4 filters on delete
Nazim Amirul <[email protected]>
net: stmmac: fix l3l4 filter rejecting unsupported offload requests
Nazim Amirul <[email protected]>
net: stmmac: xgmac: fix l4 filter port overwrite on register update
Xiang Mei (Microsoft) <[email protected]>
bpf: tcp: fix double sock release on batch realloc
José Expósito <[email protected]>
drm/tests: shmem: Set DMA mask to 64-bit in drm_gem_shmem
Cen Zhang (Microsoft) <[email protected]>
tipc: fix u16 MTU truncation in media and bearer MTU validation
Zhang Yi <[email protected]>
iomap: fix incorrect did_zero setting in iomap_zero_iter()
Zhang Yi <[email protected]>
iomap: correct the range of a partial dirty clear
Shuicheng Lin <[email protected]>
drm/xe/vm: Fix SVM leak on resv obj alloc failure in xe_vm_create()
Raag Jadav <[email protected]>
drm/xe/i2c: Allow per domain unique id
Harshaka Narayana <[email protected]>
vmxnet3: fix BUG_ON in vmxnet3_get_hdr_len() for Geneve packets
Qing Luo <[email protected]>
sctp: auth: verify auth requirement when auth_chunk is NULL
Luis Lang <[email protected]>
net: stmmac: dwmac4: mask interrupts when stopping DMA in suspend
Michael Walle <[email protected]>
net: dpaa: fix mode setting
Chuyi Zhou <[email protected]>
smp: Make CSD lock acquisition atomic for debug mode
Chuyi Zhou <[email protected]>
smp: Avoid invalid per-CPU CSD lookup with CSD lock debug
Eric Dumazet <[email protected]>
net: hsr: fix memory leak on slave unregistration by removing synced VLANs
Nikolay Aleksandrov <[email protected]>
net: bridge: vlan: fix vlan range dumps starting with pvid
Michael Bommarito <[email protected]>
amt: make the head writable before rewriting the L2 header
Michael Bommarito <[email protected]>
amt: re-read skb header pointers after every pull
Amir Goldstein <[email protected]>
ovl: check access to copy_file_range source with src mounter creds
Gregor Herburger <[email protected]>
drm/vc4: hvs/v3d: Fix null dereference in unbind
Julian Braha <[email protected]>
drm/panel: fix unmet dependency bug for DRM_PANEL_HIMAX_HX83121A
Julian Braha <[email protected]>
drm/panel: s6e3ha8: fix unmet dependency on DRM_DISPLAY_HELPER
Julian Braha <[email protected]>
drm/panel: ilitek-ili9882t: fix unmet dependency for DRM_PANEL_ILITEK_ILI9882T
Yichong Chen <[email protected]>
ovl: fix trusted xattr escape prefix matching
Shelley Yang <[email protected]>
wifi: brcmfmac: fix 802.1X-SHA256 call trace warning
Satyanarayana K V P <[email protected]>
drm/xe/vf: Add drm_dev guards when detaching CCS read/write buffers
Lorenzo Bianconi <[email protected]>
wifi: mt76: mt7996: fix possible NULL-pointer deref in mt7996_mcu_sta_bfer_eht()
Sean Wang <[email protected]>
wifi: mt76: mt7925: fix crash in reset link replay
Arnd Bergmann <[email protected]>
wifi: mt76: fix airoha_npu dependency tracking
Lorenzo Bianconi <[email protected]>
wifi: mt76: mt7996: check pointer returned by mt76_connac_get_he_phy_cap()
Lorenzo Bianconi <[email protected]>
wifi: mt76: mt7925: fix possible NULL-pointer deref in mt7925_mcu_bss_he_tlv()
Lorenzo Bianconi <[email protected]>
wifi: mt76: connac: fix possible NULL-pointer deref in mt76_connac_mcu_uni_bss_he_tlv()
Ruoyu Wang <[email protected]>
wifi: mt76: mt7915: guard HE capability lookups
Guangshuo Li <[email protected]>
wifi: mt76: mt7925: guard link STA in decap offload
Eric Dumazet <[email protected]>
ppp: annotate concurrent dev->stats accesses
Frank Sorenson <[email protected]>
cifs: fix cifsFileInfo leak on kmalloc failure in deferred close drain paths
Frank Sorenson <[email protected]>
cifs: prevent readdir from changing file size due to stale directory metadata
Helen Koike <[email protected]>
tipc: fix infinite loop in __tipc_nl_compat_dumpit
Xiang Mei (Microsoft) <[email protected]>
nexthop: initialize extack in nh_res_bucket_migrate()
Xiang Mei (Microsoft) <[email protected]>
gtp: check skb_pull_data() return in gtp1u_send_echo_resp()
Willem de Bruijn <[email protected]>
selftests: drv-net: convert so_txtime to drv-net
Matthieu Baerts (NGI0) <[email protected]>
selftests: drv-net: increase timeout
Matthieu Baerts (NGI0) <[email protected]>
selftests: ovpn: increase timeout
Matthieu Baerts (NGI0) <[email protected]>
selftests: ovpn: add IPV6 and VETH configs
Matthieu Baerts (NGI0) <[email protected]>
selftests: openvswitch: add config file
Matthieu Baerts (NGI0) <[email protected]>
selftests: af_unix: add USER_NS config
Rishikesh Jethwani <[email protected]>
tls: device: push pending open record on splice EOF
Myeonghun Pak <[email protected]>
net: mctp i3c: clean up notifier and buses if driver register fails
Cen Zhang (Microsoft) <[email protected]>
sctp: validate stream count in sctp_process_strreset_inreq()
Rob Herring (Arm) <[email protected]>
accel: ethosu: Handle U85 internal chaining buffer
Rob Herring (Arm) <[email protected]>
accel: ethosu: Fix element size accounting for cmd stream validation
Nikhil P. Rao <[email protected]>
pds_core: check for workqueue allocation failure
Nikhil P. Rao <[email protected]>
pds_core: fix auxiliary device add/del races
Nikhil P. Rao <[email protected]>
pds_core: order completion reads after the ownership check
Nikhil P. Rao <[email protected]>
pds_core: yield the CPU while waiting for the adminq to drain
Nikhil P. Rao <[email protected]>
pds_core: fix use-after-free on workqueue during remove
Nikhil P. Rao <[email protected]>
pds_core: fix deadlock between reset thread and remove
HanQuan <[email protected]>
sctp: fix auth_chunk_list capacity check in sctp_auth_ep_add_chunkid
Chenguang Zhao <[email protected]>
net: txgbe: fix FDIR filter leak on remove
Ilia Gavrilov <[email protected]>
rds: Fix inet6_addr_lst NULL dereference when IPv6 is disabled
Chenguang Zhao <[email protected]>
net: txgbe: fix heap overflow when reading module EEPROM
Weiming Shi <[email protected]>
tipc: serialize udp bearer replicast list updates
Antoine Tenart <[email protected]>
geneve: ensure the skb is writable before fixing its headers
Antoine Tenart <[email protected]>
geneve: fix hint header definition wrt endianness
Kuniyuki Iwashima <[email protected]>
net: Call net_enable_timestamp() before failure in sk_clone().
Kuniyuki Iwashima <[email protected]>
soreuseport: Clear sk_reuseport_cb before failure in sk_clone().
Prashanth Kumar KR <[email protected]>
amd-xgbe: fix MAC_AUTO_SW handling in CL37 AN
Richard Cheng <[email protected]>
arm64/mm: Check the requested PFN range during memory removal
Steven Price <[email protected]>
arm64: Correct value returned by ESR_ELx_FSC_ADDRSZ_nL()
Nikhil P. Rao <[email protected]>
pds_core: reject component parameter in legacy firmware update
Andrew Pope <[email protected]>
wifi: mac80211: recalculate TIM when a station enters power save
Li RongQing <[email protected]>
iommu/intel: Fix out-of-bounds memset in dmar_latency_disable()
Pengpeng Hou <[email protected]>
iommu/amd: Bound the early ACPI HID map
HE WEI (ギカク) <[email protected]>
wifi: mwifiex: bound uAP association event IEs to the event buffer
Benjamin Berg <[email protected]>
wifi: mac80211: copy aggregation information
Enrico Zanda <[email protected]>
vhost-net: fix TX stall when vhost owns virtio-net header
Ruoyu Wang <[email protected]>
wan: wanxl: Only reset hardware after BAR mapping
Ruoyu Wang <[email protected]>
nfp: Check resource mutex allocation
Xiang Mei <[email protected]>
wifi: mac80211: tear down new links on vif update error path
Guanghui Feng <[email protected]>
iommu/amd: Wait for completion instead of returning early in iommu_completion_wait()
Wayen Yan <[email protected]>
net: airoha: Fix DMA direction for NPU mailbox buffer
Guangshuo Li <[email protected]>
dpaa2-eth: put MAC endpoint device on disconnect
Wayen Yan <[email protected]>
net: airoha: Fix potential use-after-free in airoha_ppe_deinit()
Guangshuo Li <[email protected]>
dpaa2-switch: put MAC endpoint device on disconnect
Xuanqiang Luo <[email protected]>
rxrpc: fix io_thread race in rxrpc_wake_up_io_thread()
Zhixing Chen <[email protected]>
gtp: parse extension headers before reading inner protocol
Aldo Ariel Panzardo <[email protected]>
rds: drop incoming messages that cross network namespace boundaries
Zhaolong Zhang <[email protected]>
bonding: fix devconf_all NULL dereference when IPv6 is disabled
Jamal Hadi Salim <[email protected]>
net/sched: Handle TC_ACT_REDIRECT from qdisc filter chains
Daniel Borkmann <[email protected]>
bpf: Reject redirect helpers without a bpf_net_context
David Lee <[email protected]>
net/packet: avoid fanout hook re-registration after unregister
Danielle Ratson <[email protected]>
netlink: specs: rt-link: convert bridge port flag attributes to u8
Ricardo B. Marlière <[email protected]>
selftests/net: Fix tun IPv6 test addresses to avoid 6to4 range
Michael Walle <[email protected]>
net: phy: marvell: fix return code
Pengpeng Hou <[email protected]>
Bluetooth: btusb: validate Realtek vendor event length
Daniel Golle <[email protected]>
regulator: mt6358: use regmap helper to read fixed LDO calibration
Pengpeng Hou <[email protected]>
hwmon: occ: validate poll response sensor blocks
Marco Baffo <[email protected]>
ovpn: use monotonic clock for peer keepalive timeouts
Marco Baffo <[email protected]>
ovpn: fix use after free in unlock_ovpn()
longlong yan <[email protected]>
selftests/net: ovpn: fix getaddrinfo memory leak in ovpn_parse_remote()
Qing Ming <[email protected]>
ovpn: avoid putting unrelated P2P peer on socket release
Suraj Kandpal <[email protected]>
drm/i915/backlight: Remove DP_EDP_BACKLIGHT_AUX_ENABLE_CAP check for DPCD backlight
Yichong Chen <[email protected]>
smb: client: validate DFS referral PathConsumed
Eugene Shalygin <[email protected]>
hwmon: (asus-ec-sensors) add missed handle for ENOMEM
Eugene Shalygin <[email protected]>
hwmon: (asus-ec-sensors) fix EC read intervals
Eugene Shalygin <[email protected]>
hwmon: (asus-ec-sensors) fix looping over banks while reading from EC
Alexis Czezar Torreno <[email protected]>
hwmon: (pmbus/max34440) block unsupported VIN and IIN limit registers
Alexis Czezar Torreno <[email protected]>
hwmon: (pmbus/max34440): add support adpm12250
Uwe Kleine-König (The Capable Hub) <[email protected]>
hwmon: Use named initializers for arrays of i2c_device_data
Uwe Kleine-König (The Capable Hub) <[email protected]>
hwmon: Drop unused i2c driver_data
Mostafa Saleh <[email protected]>
drivers/virt: pkvm: Fix end calculation in mmio_guard_ioremap_hook()
Diego Fernando Mancera Gomez <[email protected]>
usb: atm: ueagle-atm: reject descriptors that confuse probe and disconnect
Shahar Tzarfati <[email protected]>
wifi: iwlwifi: mvm: fix read in wake packet notification handler
Emmanuel Grumbach <[email protected]>
wifi: iwlwifi: validate payload length in iwl_pnvm_complete_fn
Emmanuel Grumbach <[email protected]>
wifi: iwlwifi: fix pointer arithmetic in iwl_add_mcc_to_tas_block_list
Pagadala Yesu Anjaneyulu <[email protected]>
wifi: iwlwifi: mvm: validate SAR GEO response payload size
Richard Fitzgerald <[email protected]>
ASoC: cs35l56: Use complete_all() to signal init_completion
Richard Fitzgerald <[email protected]>
ASoC: cs35l56: Fix potential probe() deadlock
Guangshuo Li <[email protected]>
arm_mpam: guard MBWU state before adding it to garbage
Fenghua Yu <[email protected]>
arm_mpam: Fix MPAMCFG_MBW_PBM register setting
Ben Horgan <[email protected]>
arm_mpam: Fix software reset values of MPAMCFG_PRI
Shengjiu Wang <[email protected]>
ASoC: bt-sco: fix duplicate DAPM widget names for wideband DAI
Guangshuo Li <[email protected]>
ALSA: hda: cs35l41: validate and free ACPI mute object
Tycho Andersen (AMD) <[email protected]>
iommu/amd: Fix nested domain leak
Tycho Andersen (AMD) <[email protected]>
iommu/amd: Fix IRQ unsafe locking in gdom allocation
Chen-Yu Tsai <[email protected]>
ASoC: sun4i-codec: Set quirks.playback_only for H616 codec
Pengpeng Hou <[email protected]>
ASoC: tas2781: bound firmware description string parsing
Guanghui Yang <[email protected]>
btrfs: free mapping node on duplicate reloc root insert
Leo Martins <[email protected]>
btrfs: don't propagate EXTENT_FLAG_LOGGING to split extent maps
Dave Chen <[email protected]>
btrfs: fix u32 to s64 type conversion in dirty_metadata_bytes accounting
You-Kai Zheng <[email protected]>
btrfs: declare btrfs_ioctl_search_args_v2::buf as __u8
Tristan Madani <[email protected]>
wifi: carl9170: fix buffer overflow in rx_stream failover path
Tristan Madani <[email protected]>
wifi: carl9170: fix OOB read from off-by-two in TX status handler
Tristan Madani <[email protected]>
wifi: carl9170: bound memcpy length in cmd callback to prevent OOB read
Tristan Madani <[email protected]>
wifi: ath6kl: fix OOB read from firmware IE lengths in connect event
Tristan Madani <[email protected]>
wifi: ath6kl: fix OOB read from firmware num_msg in TX complete handler
Yingying Tang <[email protected]>
wifi: ath12k: Fix low MLO RX throughput on WCN7850
Ruoyu Wang <[email protected]>
firewire: net: Fix fragmented datagram reassembly
Denis Benato <[email protected]>
platform/x86: asus-wmi: temporarily revert to setting a charge limit
Yousef Alhouseen <[email protected]>
platform/x86/intel/vsec: free ACPI discovery data on early errors
Rosen Penev <[email protected]>
platform/x86/intel/vsec: allocate res with intel_vsec_dev
Manivannan Sadhasivam <[email protected]>
wifi: ath12k: Flush the posted write after writing to PCIE_SOC_GLOBAL_RESET
Manivannan Sadhasivam <[email protected]>
wifi: ath11k: Flush the posted write after writing to PCIE_SOC_GLOBAL_RESET
Dmitry Morgun <[email protected]>
wifi: ath11k: fix potential buffer underflow in ath11k_hal_rx_msdu_list_get()
Manikanta Pubbisetty <[email protected]>
wifi: ath10k: fix skb leak on incomplete msdu during rx pop
Wayen Yan <[email protected]>
watchdog: airoha: Prevent division by zero when clock frequency is zero
Tzung-Bi Shih <[email protected]>
watchdog: pretimeout: Fix UAF in watchdog_unregister_governor()
Guenter Roeck <[email protected]>
hwmon: (nzxt-kraken3) Stop device IO before calling hid_hw_stop
Guenter Roeck <[email protected]>
hwmon: (nzxt-smart2) Stop device IO before calling hid_hw_stop
Guenter Roeck <[email protected]>
hwmon: (gigabyte_waterforce) Stop device IO before calling hid_hw_stop
Guenter Roeck <[email protected]>
hwmon: (corsair-cpro) Stop device IO before calling hid_hw_stop
Edward Adam Davis <[email protected]>
hwmon: (corsair-psu) Stop device IO before calling hid_hw_stop
Gaole Zhang <[email protected]>
wifi: ath11k: fix NULL pointer dereference in ath11k_hal_srng_access_begin
Cheng Yongkang <[email protected]>
wifi: ath9k: hif_usb: don't dereference hif_dev after re-arming firmware request
Rafael J. Wysocki <[email protected]>
watchdog: ni903x_wdt: Check ACPI_COMPANION() against NULL
Daniel Borkmann <[email protected]>
selftests/bpf: Keep verifier_map_ptr exercising ops pointer access
KP Singh <[email protected]>
selftests/bpf: Adjust verifier_map_ptr for the map's excl field
Xincheng Zhang <[email protected]>
usb: xhci-pci: Limit VIA VL805 DMA addressing to 36 bits
Sasha Levin <[email protected]>
Revert "drm/amd/display: Add missing kdoc for ALLM parameters"
Xie Bo <[email protected]>
RISC-V: KVM: Serialize virtual interrupt pending state updates
Georgi Valkov <[email protected]>
wifi: mwifiex: fix freeze for 60 seconds caused by request_firmware
Timur Kristóf <[email protected]>
drm/amd/display: Add dp_skip_rbr flag for NUTMEG
Timur Kristóf <[email protected]>
drm/amd/display: Fix preferred link rate for NUTMEG
Ray Wu <[email protected]>
drm/amd/display: Fix ISM dc_lock deadlock during suspend
Chia-Lin Kao (AceLan) <[email protected]>
usb: typec: ucsi: Add duplicate detection to nvidia registration path
Chia-Lin Kao (AceLan) <[email protected]>
usb: typec: ucsi: Detect and skip duplicate altmodes from buggy firmware
Chukun Pan <[email protected]>
USB: serial: option: add TDTECH MT5710-CN
Johan Hovold <[email protected]>
USB: serial: keyspan_pda: fix data loss on receive throttling
Sunho Park <[email protected]>
USB: serial: io_edgeport: cap received transmit credits
Tim Pambor <[email protected]>
USB: serial: ftdi_sio: add support for E+H FXA291
Muhammad Bilal <[email protected]>
usb: gadget: uvc: clamp SEND_RESPONSE length to the response buffer
Fan Wu <[email protected]>
usb: gadget: udc: bdc: free IRQ and drain func_wake_notify before teardown
Cen Zhang <[email protected]>
usb: gadget: f_tcm: synchronize delayed set_alt with teardown
Sonali Pradhan <[email protected]>
usb: gadget: f_ncm: validate datagram bounds in ncm_unwrap_ntb()
Johan Hovold <[email protected]>
USB: gadget: fsl-udc: fix dev_printk() device
Johan Hovold <[email protected]>
USB: gadget: fsl-udc: fix device name leak on probe failure
Johan Hovold <[email protected]>
USB: gadget: snps-udc: fix device name leak on probe failure
Melbin K Mathew <[email protected]>
usb: gadget: printer: fix infinite loop in printer_read()
Fan Wu <[email protected]>
usb: gadget: f_midi: cancel pending IN work before freeing the midi object
Jinchao Wang <[email protected]>
usb: gadget: dummy_hcd: prevent fifo_req reuse during giveback
Xu Yang <[email protected]>
usb: chipidea: fix usage_count leak when autosuspend_delay is negative
Huang Wei <[email protected]>
USB: storage: add NO_ATA_1X quirk for Longmai USB Key
Guangshuo Li <[email protected]>
usb: musb: omap2430: Do not put borrowed of_node in probe
Chia-Lin Kao (AceLan) <[email protected]>
usb: core: port: Deattach Type-C connector on component unbind
Huihui Huang <[email protected]>
wifi: at76c50x-usb: avoid length underflow in at76_guess_freq()
Griffin Kroah-Hartman <[email protected]>
usb: core: sysfs: add lock to bos_descriptors_read()
Weiming Shi <[email protected]>
mpls: fix NULL deref in mpls_valid_fib_dump_req() on CONFIG_INET=n
Andre Carvalho <[email protected]>
selftests: netconsole: only restore MAC when it changed on resume
Ruoyu Wang <[email protected]>
bnxt_en: Handle partially initialized auxiliary devices
Xin Long <[email protected]>
sctp: fix auth_hmacs array size in struct sctp_cookie
Jamal Hadi Salim <[email protected]>
net/sched: act_tunnel_key: Defer dst_release to RCU callback
Ivan Vecera <[email protected]>
dpll: fix NULL pointer dereference in dpll_msg_add_pin_ref_sync()
Eric Dumazet <[email protected]>
tcp: fix TIME_WAIT socket reference leak on PSP policy failure
Lizhi Hou <[email protected]>
accel/amdxdna: Fix use-after-free of mm_struct in job scheduler
Emre Cecanpunar <[email protected]>
drm/i915/selftests: Fix GT PM sort comparators
Vinod Govindapillai <[email protected]>
drm/i915/wm: clear the plane ddb_y entries on plane disable
Xiang Mei (Microsoft) <[email protected]>
ksmbd: validate compound request size before reading StructureSize2
Qihang <[email protected]>
ksmbd: pin conn during async oplock break notification
Arvind Yadav <[email protected]>
drm/xe/guc: Hold device ref until queue teardown completes
Arvind Yadav <[email protected]>
drm/xe/guc: Keep scheduler timeline name alive
Tvrtko Ursulin <[email protected]>
drm/xe: Assign queue name in time for drm_sched_init
Daniele Ceraolo Spurio <[email protected]>
drm/xe/wopcm: fix WOPCM size for LNL+
Matthew Brost <[email protected]>
drm/xe/vf: Fix VF CCS attach/detach race with in-flight BO moves
Shuhao Fu <[email protected]>
can: j1939: fix lockless local-destination check
Mark Harris <[email protected]>
riscv: hwprobe: Avoid uninitialized read in hwprobe_get_cpus()
Vasily Gorbik <[email protected]>
s390/checksum: Fix csum_partial() without vector facility
Linmao Li <[email protected]>
drm/panthor: Check debugfs GEM lock initialization
Michal Luczaj <[email protected]>
bpf, sockmap: Reject unhashed UDP sockets on sockmap update
Shrikanth Hegde <[email protected]>
powerpc/vtime: Initialize starttime at boot for native accounting
Frederic Weisbecker <[email protected]>
powerpc/time: Prepare to stop elapsing in dynticks-idle
Rosen Penev <[email protected]>
powerpc/85xx: Add fsl,ifc to common device ids
Srikanth Boyapally <[email protected]>
spi: cadence-quadspi: Fix indirect write timeout when DMA read mode is enabled
Oliver Hartkopp <[email protected]>
can: raw: add locking for raw flags bitfield
Pengpeng Hou <[email protected]>
drm/i915/gt: use correct selftest config symbol
Rui Qi <[email protected]>
riscv: Gate FUNCTION_ALIGNMENT_4B on DYNAMIC_FTRACE
Huiwen He <[email protected]>
smb/client: handle overlapping allocated ranges in fallocate
Mikhail Gavrilov <[email protected]>
Bluetooth: mgmt: Translate HCI reason in Device Disconnected event
Ruoyu Wang <[email protected]>
Bluetooth: hci_qca: Clear memdump state on invalid dump size
Pauli Virtanen <[email protected]>
Bluetooth: hci_sync: hold hdev->lock for hci_conn_params lookups
Pauli Virtanen <[email protected]>
Bluetooth: mgmt: hold reference for hci_conn in mgmt_pending_cmds
Pauli Virtanen <[email protected]>
Bluetooth: mgmt: fix locking in unpair_device/disconnect_sync
Pauli Virtanen <[email protected]>
Bluetooth: hci_sync: extend conn_hash lookup critical sections
Cen Zhang <[email protected]>
Bluetooth: MGMT: revalidate LOAD_CONN_PARAM queued update
Xiang Mei <[email protected]>
Bluetooth: qca: fix NVM tag length underflow in TLV parser
Takashi Iwai <[email protected]>
ALSA: usb-audio: Skip DSD quirk for Musical Fidelity M6s DAC
Karol Wachowski <[email protected]>
accel/ivpu: Fix wrong register read in LNL failure diagnostics
Rosen Penev <[email protected]>
ata: sata_dwc_460ex: fix infinite loop in NCQ tag completion bit-scanning
Rosen Penev <[email protected]>
ata: sata_dwc_460ex: fix clear_interrupt_bit() clearing all pending interrupts
Rosen Penev <[email protected]>
ata: sata_dwc_460ex: use platform_get_irq()
Rosen Penev <[email protected]>
ata: sata_dwc_460ex: enable SATA interrupts only after IRQ handler is registered
David Jeffery <[email protected]>
scsi: core: wake eh reliably when using scsi_schedule_eh
Robert Mader <[email protected]>
udmabuf: Ensure to perform cache synchronisation in begin_cpu_udmabuf()
Bryam Vargas <[email protected]>
net/iucv: take a reference on the socket found in afiucv_hs_rcv()
Weiming Shi <[email protected]>
ipv4: fib: free fib_alias with kfree_rcu() on insert error path
Norbert Szetei <[email protected]>
ppp: defer channel free to an RCU grace period to fix pppol2tp RX UAF
Tejun Heo <[email protected]>
sched_ext: Record an error on errno-only sub-enable failure
Rafael J. Wysocki <[email protected]>
cpufreq: Make cpufreq_update_pressure() fall back to cpuinfo.max_freq
Matt Bobrowski <[email protected]>
bpf: Fix UAF in sock clone early bailouts
Pushpendra Singh <[email protected]>
firmware: arm_scmi: Rate-limit queue-full warnings in IRQ context
Uday Khare <[email protected]>
ASoC: tas2562: fix deprecated 'shut-down' GPIO always cleared after lookup
Andrea Righi <[email protected]>
sched_ext: Enable tick for finite slices on nohz_full
Charles Keepax <[email protected]>
ASoC: cs42l43: Correct report for forced microphone jack
Gao Xiang <[email protected]>
erofs: relax sanity check for tail pclusters due to ztailpacking
Vijendar Mukunda <[email protected]>
ASoC: amd: ps: replace bitwise OR with logical OR in IRQ return check
Vijendar Mukunda <[email protected]>
ASoC: amd: ps: fix wrong ACP version string in pci_request_regions()
Vijendar Mukunda <[email protected]>
ASoC: amd: ps: disable MSI on resume in ACP PCI driver
Christian Hewitt <[email protected]>
ASoC: meson: aiu: fifo-spdif: soft reset the S/PDIF datapath on start/stop
Sebastian Ene <[email protected]>
firmware: arm_ffa: Fix Endpoint Memory Access Descriptor offset calculation
Mostafa Saleh <[email protected]>
firmware: arm_ffa: Fix out-of-bound writes in ffa_setup_and_transmit()
HE WEI (ギカク) <[email protected]>
wifi: cfg80211: bound element ID read when checking non-inheritance
Runyu Xiao <[email protected]>
wifi: brcmfmac: initialize SDIO data work before cleanup
Cen Zhang <[email protected]>
wifi: cfg80211: use wiphy work for socket owner autodisconnect
Cen Zhang <[email protected]>
wifi: mac80211: free AP_VLAN bc_buf SKBs outside IRQ lock
Syed Saba Kareem <[email protected]>
ASoC: amd: acp: Fix linker error with SDCA quirks
Zhao Li <[email protected]>
wifi: mac80211: avoid non-S1G AID fallback for S1G assoc
Zhao Li <[email protected]>
wifi: cfg80211: reject empty PMSR peer lists
Zhao Li <[email protected]>
wifi: cfg80211: reject unsupported PMSR FTM location requests
Zhao Li <[email protected]>
wifi: cfg80211: validate PMSR FTM preamble range
Zhao Li <[email protected]>
wifi: cfg80211: validate PMSR measurement type data
Zhao Li <[email protected]>
wifi: nl80211: constrain MBSSID TX link ID range
Zhao Li <[email protected]>
wifi: nl80211: validate nested MBSSID IE blobs
Zhao Li <[email protected]>
wifi: cfg80211: derive S1G beacon TSF from S1G fields
Zhao Li <[email protected]>
wifi: nl80211: free RNR data on MBSSID mismatch
Peddolla Harshavardhan Reddy <[email protected]>
wifi: cfg80211: convert pmsr_free_wk to wiphy_work to fix deadlock
Xiang Mei <[email protected]>
wifi: p54: validate RX frame length in p54_rx_eeprom_readback()
Maoyi Xie <[email protected]>
wifi: mac80211: defer link RX stats percpu free to RCU
Dawei Feng <[email protected]>
wifi: libertas: fix memory leak in helper_firmware_cb()
Xiang Mei <[email protected]>
wifi: mac80211: fix fils_discovery double free on alloc failure
Xiang Mei <[email protected]>
wifi: mac80211: fix unsol_bcast_probe_resp double free on alloc failure
Bryam Vargas <[email protected]>
wifi: mac80211_hwsim: clamp virtio RX length before skb_put
Christophe JAILLET <[email protected]>
wifi: cfg80211: Fix an error handling path in cfg80211_wext_siwscan()
Abdun Nihaal <[email protected]>
wifi: ipw2100: fix potential memory leak in ipw2100_pci_init_one()
Cen Zhang <[email protected]>
wifi: cfg80211: cancel sched scan results work on unregister
Rong Zhang <[email protected]>
ALSA: usb-audio: Fix imbalance per-channel volume of sticky mixers
Arnd Bergmann <[email protected]>
wifi: mac80211: allocate backup ieee80211_nan_sched_cfg off stack
Xiang Mei (Microsoft) <[email protected]>
xfrm: policy: preallocate inexact bins before xfrm_hash_rebuild reinsert
Xiang Mei (Microsoft) <[email protected]>
xfrm6: clear dst.dev on error to avoid double netdev_put in xfrm6_fill_dst()
Chen YanJun <[email protected]>
xfrm: iptfs: propagate SKBFL_SHARED_FRAG in iptfs_skb_add_frags()
Cen Zhang <[email protected]>
xfrm: clear mode callbacks after failed mode setup
Aleksandrova Alyona <[email protected]>
RDMA/irdma: Prevent overflows in memory contiguity checks
Malaya Kumar Rout <[email protected]>
selftests/alsa: Fix memory leak in find_controls error path
Xue Lei <[email protected]>
mtd: fix double free and WARN_ON in add_mtd_device() error paths
Ruoyu Wang <[email protected]>
RDMA/siw: publish QP after initialization
Danila Chernetsov <[email protected]>
RDMA/hns: Fix potential integer overflow in mhop hem cleanup
Chenguang Zhao <[email protected]>
RDMA/core: Fix memory leak in __ib_create_cq() on invalid cqe
Ruoyu Wang <[email protected]>
RDMA/mana_ib: initialize err for empty send WR lists
Ruoyu Wang <[email protected]>
RDMA/erdma: initialize ret for empty receive WR lists
Jacob Moroni <[email protected]>
RDMA/irdma: Prevent user-triggered null deref on QP create
Jacob Moroni <[email protected]>
RDMA/irdma: Remove redundant legacy_mode checks
Jacob Moroni <[email protected]>
RDMA/irdma: Prevent rereg_mr for non-mem regions
Or Gerlitz <[email protected]>
RDMA/cma: Fix hardware address comparison length in netevent callback
Antony Antony <[email protected]>
xfrm: reject optional IPTFS templates in outbound policies
Xiang Mei (Microsoft) <[email protected]>
xfrm: fix sk_dst_cache double-free in xfrm_user_policy()
Yixun Lan <[email protected]>
reset: spacemit: k3: fix USB2 ahb reset
Tejun Heo <[email protected]>
sched_ext: Don't warn on core-sched forced idle in put_prev_task_scx()
Unnathi Chalicheemala <[email protected]>
firmware: arm_ffa: Fix NULL dereference in ffa_partition_info_get()
Boris Burkov <[email protected]>
btrfs: fallback to transaction csum tree on a commit root csum miss
Filipe Manana <[email protected]>
btrfs: fix root leak if its reloc root is unexpected in merge_reloc_roots()
Xiang Mei <[email protected]>
btrfs: reject free space cache with more entries than pages
Pengpeng Hou <[email protected]>
mtd: nand: mtk-ecc: stop on ECC idle timeouts
Pengpeng Hou <[email protected]>
mtd: mtdswap: remove debugfs stats file on teardown
Harshit Mogalapalli <[email protected]>
mtd: virt_concat: fix use-after-free in mtd_virt_concat_destroy()
Harshit Mogalapalli <[email protected]>
mtd: virt_concat: fix use-after-free in mtd_virt_concat_destroy_joins()
Michael Bommarito <[email protected]>
IB/mad: Drop unmatched RMPP responses before reassembly
Seth Forshee <[email protected]>
firmware: arm_ffa: Respect firmware advertised RX/TX buffer size limits
Petr Wozniak <[email protected]>
xfrm: fix stale skb->prev after async crypto steals a GSO segment
Petr Wozniak <[email protected]>
xfrm: propagate -EINPROGRESS from validate_xmit_xfrm()
Sumit Gupta <[email protected]>
arm64: tegra: Fix CPU compatible string to cortex-a78ae on Tegra234
Tejun Heo <[email protected]>
sched_ext: Annotate ksyncs with __rcu in alloc/free_kick_syncs()
Doehyun Baek <[email protected]>
Docs/admin-guide/cgroup-v2: fix memory.stat doc details
Akhil R <[email protected]>
arm64: tegra: Remove fallback compatible for GPCDMA
Chuck Lever <[email protected]>
xprtrdma: Clear receive-side ownership pointers on release
Mikko Perttunen <[email protected]>
crypto: tegra - Don't touch bo refcount in host1x bo pin/unpin
Mikko Perttunen <[email protected]>
gpu: host1x: Fix use-after-free in host1x_bo_clear_cached_mappings
Phil Rosenthal <[email protected]>
KVM: x86/mmu: Fix use-after-free on vendor module reload
Hyunwoo Kim <[email protected]>
KVM: nVMX: Hide shadow VMCS right after VMCLEAR
Venkatesh Srinivas <[email protected]>
KVM: x86: Only reset TSC Deadline Timer in apic_timer_expired on KVM_RUN
Sean Christopherson <[email protected]>
KVM: x86: Check for invalid/obsolete root *after* making MMU pages available
Heiko Carstens <[email protected]>
seqlock: Allow UBSAN_ALIGNMENT to fail optimizing
Ryosuke Yasuoka <[email protected]>
drm/virtio: fix deadlock in display_info_cb by removing hotplug from dequeue worker
Kuba Piecuch <[email protected]>
sched_ext: Skip ops.set_weight() for disabled tasks
Guixiong Wei <[email protected]>
platform/x86/intel-uncore-freq: Fix current_freq_khz after CPU hotplug
-------------
Diffstat:
Documentation/admin-guide/cgroup-v2.rst | 4 +-
Documentation/hwmon/max34440.rst | 27 +-
Documentation/netlink/specs/rt-link.yaml | 40 +-
Makefile | 9 +-
arch/arm64/boot/dts/nvidia/tegra234.dtsi | 24 +-
arch/arm64/boot/dts/nvidia/tegra264.dtsi | 2 +-
arch/arm64/include/asm/esr.h | 2 +-
arch/arm64/mm/hugetlbpage.c | 2 +-
arch/arm64/mm/mmu.c | 7 +-
arch/loongarch/include/asm/asmmacro.h | 2 +-
arch/loongarch/kernel/acpi.c | 27 +-
arch/loongarch/kernel/kgdb.c | 3 +-
arch/loongarch/kernel/machine_kexec.c | 5 +-
arch/loongarch/kernel/rethook_trampoline.S | 18 +-
arch/loongarch/kernel/setup.c | 3 +-
arch/loongarch/kernel/smp.c | 4 +-
arch/loongarch/mm/init.c | 5 +-
arch/loongarch/net/bpf_jit.c | 9 +-
arch/m68k/include/asm/page_mm.h | 2 +
arch/powerpc/kernel/time.c | 43 +++
arch/powerpc/mm/mem.c | 5 +-
arch/powerpc/platforms/85xx/common.c | 2 +
arch/riscv/Kconfig | 2 +-
arch/riscv/include/asm/kvm_host.h | 10 +-
arch/riscv/kernel/sys_hwprobe.c | 1 +
arch/riscv/kvm/aia.c | 35 +-
arch/riscv/kvm/vcpu.c | 68 +++-
arch/riscv/kvm/vcpu_onereg.c | 8 +-
arch/riscv/mm/init.c | 5 +-
arch/s390/lib/csum-partial.c | 2 +-
arch/s390/mm/init.c | 5 +-
arch/x86/boot/compressed/Makefile | 1 +
arch/x86/kvm/lapic.c | 2 +-
arch/x86/kvm/mmu/mmu.c | 11 +-
arch/x86/kvm/mmu/paging_tmpl.h | 10 +-
arch/x86/kvm/svm/svm.c | 7 +-
arch/x86/kvm/vmx/nested.c | 11 +-
arch/x86/mm/init_64.c | 5 +-
drivers/accel/amdxdna/amdxdna_ctx.c | 4 +
drivers/accel/ethosu/ethosu_gem.c | 54 ++-
drivers/accel/ivpu/ivpu_hw_btrs.c | 2 +-
drivers/android/binder/thread.rs | 14 +-
drivers/ata/sata_dwc_460ex.c | 38 +-
drivers/block/rbd.c | 7 +-
drivers/block/ublk_drv.c | 47 ++-
drivers/bluetooth/btqca.c | 2 +-
drivers/bluetooth/btusb.c | 4 +-
drivers/bluetooth/hci_qca.c | 4 +
drivers/cdrom/cdrom.c | 1 +
drivers/comedi/drivers/comedi_parport.c | 13 +-
drivers/cpufreq/cpufreq.c | 3 +
drivers/crypto/tegra/tegra-se-main.c | 3 +-
drivers/dma-buf/udmabuf.c | 9 +-
drivers/dpll/dpll_netlink.c | 3 +
drivers/firewire/net.c | 37 +-
drivers/firmware/arm_ffa/driver.c | 54 ++-
drivers/firmware/arm_scmi/notify.c | 6 +-
drivers/firmware/stratix10-svc.c | 19 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c | 13 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 62 ++-
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 6 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 73 ++--
drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c | 7 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.h | 1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 14 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 6 +
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 10 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 30 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.c | 3 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h | 2 +
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 13 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 54 ++-
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 34 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 58 ++-
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 17 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 35 +-
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 22 +-
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 56 +--
drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c | 69 ++--
drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c | 24 +-
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 3 -
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 49 ++-
drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c | 11 +-
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c | 2 +-
drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c | 2 +-
drivers/gpu/drm/amd/amdgpu/mes_v11_0.c | 2 +
drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 4 +-
drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 4 +-
drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 4 +-
drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c | 4 +-
drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c | 4 +-
drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c | 4 +-
drivers/gpu/drm/amd/amdgpu/soc24.c | 28 ++
drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 15 +-
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 12 +-
.../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 10 +
.../gpu/drm/amd/amdkfd/kfd_device_queue_manager.h | 2 +
drivers/gpu/drm/amd/amdkfd/kfd_events.c | 3 +
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h | 1 +
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c | 4 +-
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c | 4 +-
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v12.c | 4 +-
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v12_1.c | 4 +-
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c | 25 +-
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c | 4 +-
drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 3 +-
.../gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | 24 +-
drivers/gpu/drm/amd/amdkfd/kfd_queue.c | 23 +-
drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 8 +-
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 417 +++++++++++----------
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 81 ++--
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_ism.c | 56 ++-
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_ism.h | 1 +
.../amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c | 2 -
.../amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c | 2 -
.../amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c | 9 +-
.../amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c | 11 +-
drivers/gpu/drm/amd/display/dc/core/dc.c | 6 +-
drivers/gpu/drm/amd/display/dc/dc.h | 2 +
.../drm/amd/display/dc/dce/dce_stream_encoder.c | 15 +-
.../drm/amd/display/dc/dce/dce_stream_encoder.h | 3 +-
.../gpu/drm/amd/display/dc/link/link_detection.c | 7 +-
.../display/dc/link/protocols/link_dp_capability.c | 6 +-
.../display/dc/resource/dce100/dce100_resource.c | 7 +-
.../amd/display/modules/info_packet/info_packet.c | 2 -
drivers/gpu/drm/amd/include/mes_v11_api_def.h | 2 +
drivers/gpu/drm/amd/pm/amdgpu_pm.c | 26 +-
drivers/gpu/drm/amd/pm/powerplay/hwmgr/hwmgr.c | 7 +-
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 12 +
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h | 12 +-
.../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 11 +-
.../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 15 +-
.../gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.c | 45 +++
.../gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c | 28 +-
.../gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c | 7 +-
drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 11 +-
drivers/gpu/drm/display/drm_dp_mst_topology.c | 36 +-
drivers/gpu/drm/drm_connector.c | 12 +-
drivers/gpu/drm/drm_displayid_internal.h | 2 +-
drivers/gpu/drm/drm_gpusvm.c | 22 +-
drivers/gpu/drm/drm_pagemap.c | 24 +-
drivers/gpu/drm/drm_panel_backlight_quirks.c | 9 +
drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 6 +-
drivers/gpu/drm/i915/display/intel_bios.c | 36 +-
drivers/gpu/drm/i915/display/intel_cdclk.c | 41 +-
drivers/gpu/drm/i915/display/intel_ddi.c | 11 +-
drivers/gpu/drm/i915/display/intel_dp.c | 8 +-
.../gpu/drm/i915/display/intel_dp_aux_backlight.c | 7 +-
drivers/gpu/drm/i915/display/intel_hdcp.c | 12 +-
drivers/gpu/drm/i915/display/intel_vrr.c | 4 +
drivers/gpu/drm/i915/display/skl_watermark.c | 2 +-
drivers/gpu/drm/i915/gem/i915_gem_context.c | 25 +-
drivers/gpu/drm/i915/gt/intel_engine_user.c | 2 +-
.../gpu/drm/i915/gt/intel_execlists_submission.c | 19 +-
drivers/gpu/drm/i915/gt/selftest_gt_pm.c | 8 +-
drivers/gpu/drm/i915/i915_active.c | 7 +-
drivers/gpu/drm/imagination/pvr_context.c | 22 +-
drivers/gpu/drm/imagination/pvr_drv.c | 13 +-
drivers/gpu/drm/imagination/pvr_queue.c | 65 ++--
drivers/gpu/drm/imagination/pvr_queue.h | 2 +-
drivers/gpu/drm/imagination/pvr_vm.c | 2 +
drivers/gpu/drm/nouveau/nouveau_exec.c | 4 +-
drivers/gpu/drm/nouveau/nouveau_uvmm.c | 4 +-
drivers/gpu/drm/nouveau/nvkm/subdev/acr/base.c | 1 +
drivers/gpu/drm/panel/Kconfig | 3 +
drivers/gpu/drm/panthor/panthor_device.c | 5 +-
drivers/gpu/drm/panthor/panthor_fw.c | 1 +
drivers/gpu/drm/radeon/r100.c | 13 +-
drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c | 18 +-
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 2 +
drivers/gpu/drm/rockchip/cdn-dp-reg.c | 2 +
drivers/gpu/drm/sysfb/drm_sysfb_helper.h | 2 +-
drivers/gpu/drm/sysfb/drm_sysfb_screen_info.c | 13 +-
drivers/gpu/drm/sysfb/efidrm.c | 7 +-
drivers/gpu/drm/sysfb/vesadrm.c | 6 +-
drivers/gpu/drm/tegra/fbdev.c | 8 +-
drivers/gpu/drm/tests/drm_gem_shmem_test.c | 16 +-
drivers/gpu/drm/tidss/tidss_encoder.c | 2 +
drivers/gpu/drm/ttm/ttm_backup.c | 123 ++++--
drivers/gpu/drm/ttm/ttm_pool.c | 123 +++++-
drivers/gpu/drm/ttm/ttm_pool_internal.h | 8 +
drivers/gpu/drm/v3d/v3d_gem.c | 12 +
drivers/gpu/drm/vc4/vc4_bo.c | 12 +-
drivers/gpu/drm/vc4/vc4_hvs.c | 2 +-
drivers/gpu/drm/vc4/vc4_v3d.c | 2 +-
drivers/gpu/drm/virtio/virtgpu_gem.c | 14 +-
drivers/gpu/drm/virtio/virtgpu_kms.c | 5 +-
drivers/gpu/drm/virtio/virtgpu_vq.c | 6 +-
drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 22 +-
drivers/gpu/drm/xe/display/xe_display_bo.c | 3 +-
drivers/gpu/drm/xe/display/xe_fb_pin.c | 3 +-
drivers/gpu/drm/xe/regs/xe_gtt_defs.h | 6 +-
drivers/gpu/drm/xe/xe_bo.c | 58 ++-
drivers/gpu/drm/xe/xe_bo.h | 3 +-
drivers/gpu/drm/xe/xe_bo_types.h | 2 +
drivers/gpu/drm/xe/xe_device.c | 2 +-
drivers/gpu/drm/xe/xe_device_types.h | 2 +-
drivers/gpu/drm/xe/xe_dma_buf.c | 2 +-
drivers/gpu/drm/xe/xe_guc_capture.c | 10 +-
drivers/gpu/drm/xe/xe_guc_exec_queue_types.h | 5 +
drivers/gpu/drm/xe/xe_guc_submit.c | 140 ++++---
drivers/gpu/drm/xe/xe_guc_types.h | 2 -
drivers/gpu/drm/xe/xe_i2c.c | 5 +-
drivers/gpu/drm/xe/xe_migrate.c | 21 +-
drivers/gpu/drm/xe/xe_migrate.h | 4 +-
drivers/gpu/drm/xe/xe_module.c | 49 +++
drivers/gpu/drm/xe/xe_module.h | 5 +
drivers/gpu/drm/xe/xe_nvm.c | 9 +-
drivers/gpu/drm/xe/xe_pci.c | 6 +
drivers/gpu/drm/xe/xe_pt.c | 148 +++++---
drivers/gpu/drm/xe/xe_reg_whitelist.c | 10 +-
drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 32 +-
drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 3 +-
drivers/gpu/drm/xe/xe_svm.c | 6 +-
drivers/gpu/drm/xe/xe_vm.c | 33 +-
drivers/gpu/drm/xe/xe_vm_madvise.c | 19 +-
drivers/gpu/drm/xe/xe_wopcm.c | 15 +-
drivers/gpu/host1x/bus.c | 4 +-
drivers/hwmon/ad7414.c | 4 +-
drivers/hwmon/ad7418.c | 6 +-
drivers/hwmon/adc128d818.c | 2 +-
drivers/hwmon/adm1025.c | 4 +-
drivers/hwmon/adm1026.c | 2 +-
drivers/hwmon/adm1029.c | 2 +-
drivers/hwmon/adm1031.c | 4 +-
drivers/hwmon/adm1177.c | 4 +-
drivers/hwmon/adm9240.c | 6 +-
drivers/hwmon/ads7828.c | 4 +-
drivers/hwmon/adt7410.c | 8 +-
drivers/hwmon/adt7411.c | 2 +-
drivers/hwmon/adt7462.c | 2 +-
drivers/hwmon/adt7470.c | 2 +-
drivers/hwmon/adt7475.c | 8 +-
drivers/hwmon/aht10.c | 8 +-
drivers/hwmon/amc6821.c | 2 +-
drivers/hwmon/asb100.c | 2 +-
drivers/hwmon/asc7621.c | 6 +-
drivers/hwmon/asus-ec-sensors.c | 18 +-
drivers/hwmon/atxp1.c | 2 +-
drivers/hwmon/chipcap2.c | 16 +-
drivers/hwmon/corsair-cpro.c | 1 +
drivers/hwmon/corsair-psu.c | 1 +
drivers/hwmon/dme1737.c | 4 +-
drivers/hwmon/ds1621.c | 10 +-
drivers/hwmon/ds620.c | 4 +-
drivers/hwmon/emc1403.c | 24 +-
drivers/hwmon/emc2103.c | 2 +-
drivers/hwmon/emc2305.c | 8 +-
drivers/hwmon/emc6w201.c | 2 +-
drivers/hwmon/f75375s.c | 6 +-
drivers/hwmon/fschmd.c | 14 +-
drivers/hwmon/ftsteutates.c | 2 +-
drivers/hwmon/g760a.c | 2 +-
drivers/hwmon/g762.c | 6 +-
drivers/hwmon/gigabyte_waterforce.c | 4 +-
drivers/hwmon/gl518sm.c | 2 +-
drivers/hwmon/gl520sm.c | 2 +-
drivers/hwmon/hih6130.c | 2 +-
drivers/hwmon/hs3001.c | 4 +-
drivers/hwmon/htu31.c | 2 +-
drivers/hwmon/ina209.c | 2 +-
drivers/hwmon/ina238.c | 12 +-
drivers/hwmon/ina2xx.c | 16 +-
drivers/hwmon/ina3221.c | 2 +-
drivers/hwmon/isl28022.c | 2 +-
drivers/hwmon/jc42.c | 2 +-
drivers/hwmon/lineage-pem.c | 4 +-
drivers/hwmon/lm63.c | 6 +-
drivers/hwmon/lm73.c | 2 +-
drivers/hwmon/lm75.c | 62 +--
drivers/hwmon/lm77.c | 2 +-
drivers/hwmon/lm78.c | 4 +-
drivers/hwmon/lm80.c | 4 +-
drivers/hwmon/lm83.c | 4 +-
drivers/hwmon/lm85.c | 24 +-
drivers/hwmon/lm87.c | 4 +-
drivers/hwmon/lm90.c | 96 ++---
drivers/hwmon/lm92.c | 6 +-
drivers/hwmon/lm93.c | 4 +-
drivers/hwmon/lm95234.c | 4 +-
drivers/hwmon/lm95241.c | 4 +-
drivers/hwmon/lm95245.c | 4 +-
drivers/hwmon/ltc2945.c | 2 +-
drivers/hwmon/ltc2947-i2c.c | 4 +-
drivers/hwmon/ltc2990.c | 4 +-
drivers/hwmon/ltc2991.c | 4 +-
drivers/hwmon/ltc2992.c | 4 +-
drivers/hwmon/ltc4151.c | 2 +-
drivers/hwmon/ltc4215.c | 2 +-
drivers/hwmon/ltc4222.c | 2 +-
drivers/hwmon/ltc4245.c | 2 +-
drivers/hwmon/ltc4260.c | 2 +-
drivers/hwmon/ltc4261.c | 4 +-
drivers/hwmon/max127.c | 2 +-
drivers/hwmon/max16065.c | 12 +-
drivers/hwmon/max1619.c | 2 +-
drivers/hwmon/max1668.c | 6 +-
drivers/hwmon/max31730.c | 2 +-
drivers/hwmon/max31760.c | 2 +-
drivers/hwmon/max31790.c | 2 +-
drivers/hwmon/max31827.c | 6 +-
drivers/hwmon/max6620.c | 2 +-
drivers/hwmon/max6621.c | 2 +-
drivers/hwmon/max6639.c | 2 +-
drivers/hwmon/max6650.c | 4 +-
drivers/hwmon/max6697.c | 20 +-
drivers/hwmon/mc34vr500.c | 4 +-
drivers/hwmon/mcp3021.c | 4 +-
drivers/hwmon/nct6775-i2c.c | 26 +-
drivers/hwmon/nct7802.c | 2 +-
drivers/hwmon/nct7904.c | 4 +-
drivers/hwmon/nzxt-kraken3.c | 6 +-
drivers/hwmon/nzxt-smart2.c | 2 +-
drivers/hwmon/occ/common.c | 38 +-
drivers/hwmon/pcf8591.c | 2 +-
drivers/hwmon/pmbus/acbel-fsg032.c | 4 +-
drivers/hwmon/pmbus/adm1266.c | 2 +-
drivers/hwmon/pmbus/adm1275.c | 20 +-
drivers/hwmon/pmbus/aps-379.c | 4 +-
drivers/hwmon/pmbus/bel-pfe.c | 6 +-
drivers/hwmon/pmbus/bpa-rs600.c | 6 +-
drivers/hwmon/pmbus/crps.c | 4 +-
drivers/hwmon/pmbus/delta-ahe50dc-fan.c | 2 +-
drivers/hwmon/pmbus/dps920ab.c | 4 +-
drivers/hwmon/pmbus/fsp-3y.c | 4 +-
drivers/hwmon/pmbus/hac300s.c | 4 +-
drivers/hwmon/pmbus/ibm-cffps.c | 8 +-
drivers/hwmon/pmbus/ina233.c | 4 +-
drivers/hwmon/pmbus/inspur-ipsps.c | 4 +-
drivers/hwmon/pmbus/ir35221.c | 4 +-
drivers/hwmon/pmbus/ir36021.c | 4 +-
drivers/hwmon/pmbus/ir38064.c | 10 +-
drivers/hwmon/pmbus/irps5401.c | 4 +-
drivers/hwmon/pmbus/isl68137.c | 92 ++---
drivers/hwmon/pmbus/lm25066.c | 10 +-
drivers/hwmon/pmbus/lt3074.c | 4 +-
drivers/hwmon/pmbus/lt7182s.c | 4 +-
drivers/hwmon/pmbus/ltc2978.c | 60 +--
drivers/hwmon/pmbus/ltc3815.c | 2 +-
drivers/hwmon/pmbus/max15301.c | 8 +-
drivers/hwmon/pmbus/max16064.c | 4 +-
drivers/hwmon/pmbus/max16601.c | 10 +-
drivers/hwmon/pmbus/max17616.c | 2 +-
drivers/hwmon/pmbus/max20730.c | 10 +-
drivers/hwmon/pmbus/max20751.c | 4 +-
drivers/hwmon/pmbus/max31785.c | 8 +-
drivers/hwmon/pmbus/max34440.c | 143 ++++++-
drivers/hwmon/pmbus/max8688.c | 2 +-
drivers/hwmon/pmbus/mp2856.c | 6 +-
drivers/hwmon/pmbus/mp2888.c | 4 +-
drivers/hwmon/pmbus/mp2891.c | 2 +-
drivers/hwmon/pmbus/mp2925.c | 6 +-
drivers/hwmon/pmbus/mp29502.c | 4 +-
drivers/hwmon/pmbus/mp2975.c | 8 +-
drivers/hwmon/pmbus/mp2993.c | 2 +-
drivers/hwmon/pmbus/mp5920.c | 2 +-
drivers/hwmon/pmbus/mp5926.c | 4 +-
drivers/hwmon/pmbus/mp5990.c | 4 +-
drivers/hwmon/pmbus/mp9941.c | 2 +-
drivers/hwmon/pmbus/mp9945.c | 4 +-
drivers/hwmon/pmbus/mpq7932.c | 6 +-
drivers/hwmon/pmbus/mpq8785.c | 10 +-
drivers/hwmon/pmbus/pim4328.c | 18 +-
drivers/hwmon/pmbus/pli1209bc.c | 4 +-
drivers/hwmon/pmbus/pm6764tr.c | 4 +-
drivers/hwmon/pmbus/pmbus.c | 60 +--
drivers/hwmon/pmbus/pxe1610.c | 8 +-
drivers/hwmon/pmbus/q54sj108a2.c | 8 +-
drivers/hwmon/pmbus/stef48h28.c | 4 +-
drivers/hwmon/pmbus/stpddc60.c | 6 +-
drivers/hwmon/pmbus/tda38640.c | 4 +-
drivers/hwmon/pmbus/tps25990.c | 4 +-
drivers/hwmon/pmbus/tps40422.c | 4 +-
drivers/hwmon/pmbus/tps53679.c | 18 +-
drivers/hwmon/pmbus/tps546d24.c | 4 +-
drivers/hwmon/pmbus/ucd9000.c | 16 +-
drivers/hwmon/pmbus/ucd9200.c | 18 +-
drivers/hwmon/pmbus/xdp710.c | 2 +-
drivers/hwmon/pmbus/xdp720.c | 4 +-
drivers/hwmon/pmbus/xdpe12284.c | 8 +-
drivers/hwmon/pmbus/xdpe152c4.c | 6 +-
drivers/hwmon/pmbus/xdpe1a2g7b.c | 6 +-
drivers/hwmon/pmbus/zl6100.c | 44 +--
drivers/hwmon/powr1220.c | 4 +-
drivers/hwmon/pt5161l.c | 4 +-
drivers/hwmon/sbtsi_temp.c | 4 +-
drivers/hwmon/sg2042-mcu.c | 2 +-
drivers/hwmon/sht21.c | 6 +-
drivers/hwmon/sht3x.c | 8 +-
drivers/hwmon/sht4x.c | 4 +-
drivers/hwmon/shtc1.c | 6 +-
drivers/hwmon/smsc47m192.c | 2 +-
drivers/hwmon/spd5118.c | 2 +-
drivers/hwmon/stts751.c | 2 +-
drivers/hwmon/tc654.c | 6 +-
drivers/hwmon/tc74.c | 4 +-
drivers/hwmon/thmc50.c | 4 +-
drivers/hwmon/tmp102.c | 2 +-
drivers/hwmon/tmp103.c | 2 +-
drivers/hwmon/tmp108.c | 8 +-
drivers/hwmon/tmp401.c | 10 +-
drivers/hwmon/tmp421.c | 10 +-
drivers/hwmon/tmp464.c | 4 +-
drivers/hwmon/tmp513.c | 4 +-
drivers/hwmon/tsc1641.c | 2 +-
drivers/hwmon/w83773g.c | 2 +-
drivers/hwmon/w83781d.c | 8 +-
drivers/hwmon/w83791d.c | 2 +-
drivers/hwmon/w83792d.c | 2 +-
drivers/hwmon/w83793.c | 2 +-
drivers/hwmon/w83795.c | 4 +-
drivers/hwmon/w83l785ts.c | 2 +-
drivers/hwmon/w83l786ng.c | 2 +-
drivers/hwtracing/intel_th/core.c | 10 -
drivers/hwtracing/intel_th/msu.c | 2 +
drivers/infiniband/core/cma.c | 2 +-
drivers/infiniband/core/mad.c | 30 ++
drivers/infiniband/core/verbs.c | 6 +-
drivers/infiniband/hw/bng_re/bng_dev.c | 6 +-
drivers/infiniband/hw/erdma/erdma_qp.c | 2 +-
drivers/infiniband/hw/hns/hns_roce_hem.c | 2 +-
drivers/infiniband/hw/irdma/uk.c | 9 +-
drivers/infiniband/hw/irdma/user.h | 1 -
drivers/infiniband/hw/irdma/verbs.c | 33 +-
drivers/infiniband/hw/mana/wr.c | 2 +-
drivers/infiniband/sw/siw/siw_verbs.c | 44 ++-
drivers/iommu/amd/init.c | 6 +
drivers/iommu/amd/iommu.c | 22 +-
drivers/iommu/amd/nested.c | 34 +-
drivers/iommu/intel/perf.c | 2 +-
drivers/iommu/intel/svm.c | 2 +-
drivers/media/cec/platform/seco/seco-cec.c | 6 +-
drivers/media/common/videobuf2/videobuf2-core.c | 12 +-
drivers/media/dvb-frontends/rtl2832.c | 4 +-
drivers/media/dvb-frontends/rtl2832_sdr.c | 19 +-
drivers/media/i2c/alvium-csi2.c | 21 +-
drivers/media/i2c/dw9719.c | 10 +
drivers/media/i2c/imx219.c | 2 +-
drivers/media/pci/cx23885/cx23885-core.c | 14 +-
drivers/media/pci/dm1105/dm1105.c | 1 +
drivers/media/pci/intel/ipu6/ipu6-isys-dwc-phy.c | 24 +-
drivers/media/pci/saa7134/saa7134-video.c | 25 +-
.../media/platform/amlogic/c3/isp/c3-isp-params.c | 4 +
.../media/platform/arm/mali-c55/mali-c55-core.c | 21 +-
drivers/media/platform/arm/mali-c55/mali-c55-isp.c | 7 +
drivers/media/platform/aspeed/aspeed-video.c | 1 +
.../platform/chips-media/wave5/wave5-vpu-enc.c | 29 +-
drivers/media/platform/marvell/cafe-driver.c | 1 +
drivers/media/platform/nuvoton/npcm-video.c | 34 +-
.../media/platform/nxp/imx8-isi/imx8-isi-core.c | 2 +
.../media/platform/nxp/imx8-isi/imx8-isi-core.h | 16 +
.../platform/nxp/imx8-isi/imx8-isi-crossbar.c | 1 +
drivers/media/platform/nxp/imx8-isi/imx8-isi-hw.c | 9 +-
drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c | 11 +-
.../media/platform/nxp/imx8-isi/imx8-isi-pipe.c | 20 +-
drivers/media/platform/qcom/camss/camss-csid-340.c | 18 +-
drivers/media/platform/qcom/camss/camss-csid-680.c | 30 +-
.../media/platform/qcom/camss/camss-csid-gen2.c | 47 +--
.../media/platform/qcom/camss/camss-csid-gen3.c | 28 +-
drivers/media/platform/qcom/iris/iris_probe.c | 6 +-
.../platform/renesas/rzg2l-cru/rzg2l-cru-regs.h | 1 +
.../media/platform/renesas/rzg2l-cru/rzg2l-video.c | 17 +-
.../platform/renesas/rzv2h-ivc/rzv2h-ivc-video.c | 31 +-
drivers/media/platform/st/stm32/stm32-dcmi.c | 1 +
.../st/stm32/stm32-dcmipp/dcmipp-bytecap.c | 6 +-
drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c | 6 +-
.../media/platform/synopsys/hdmirx/snps_hdmirx.c | 4 +-
drivers/media/platform/ti/davinci/vpif_capture.c | 2 +-
drivers/media/platform/ti/vpe/vip.c | 16 +-
drivers/media/platform/ti/vpe/vpe.c | 3 +-
drivers/media/platform/verisilicon/hantro_v4l2.c | 6 +-
drivers/media/radio/radio-si476x.c | 1 +
drivers/media/test-drivers/vidtv/vidtv_bridge.c | 4 +-
drivers/media/test-drivers/vimc/vimc-core.c | 1 +
drivers/media/test-drivers/vivid/vivid-core.c | 6 +-
drivers/media/test-drivers/vivid/vivid-ctrls.c | 15 +-
drivers/media/test-drivers/vivid/vivid-vid-cap.c | 38 +-
drivers/media/test-drivers/vivid/vivid-vid-cap.h | 1 +
drivers/media/test-drivers/vivid/vivid-vid-out.c | 6 +
drivers/media/usb/airspy/airspy.c | 8 +-
drivers/media/usb/cx231xx/cx231xx-cards.c | 16 +-
drivers/media/usb/msi2500/msi2500.c | 32 +-
drivers/media/usb/pwc/pwc-if.c | 13 +-
drivers/media/v4l2-core/v4l2-ctrls-core.c | 13 +
drivers/media/v4l2-core/v4l2-ctrls-request.c | 14 +-
drivers/media/v4l2-core/v4l2-fwnode.c | 6 +-
drivers/media/v4l2-core/v4l2-subdev.c | 4 +
drivers/misc/mei/bus.c | 16 +-
drivers/misc/nsm.c | 3 +-
drivers/mtd/mtd_virt_concat.c | 4 +-
drivers/mtd/mtdcore.c | 23 +-
drivers/mtd/mtdswap.c | 5 +-
drivers/mtd/nand/ecc-mtk.c | 16 +-
drivers/net/amt.c | 101 +++--
drivers/net/bonding/bond_main.c | 3 +-
drivers/net/ethernet/airoha/airoha_eth.c | 3 +-
drivers/net/ethernet/airoha/airoha_npu.c | 4 +-
drivers/net/ethernet/airoha/airoha_ppe.c | 1 +
drivers/net/ethernet/amd/pds_core/adminq.c | 12 +-
drivers/net/ethernet/amd/pds_core/auxbus.c | 17 +-
drivers/net/ethernet/amd/pds_core/core.c | 22 +-
drivers/net/ethernet/amd/pds_core/devlink.c | 6 +
drivers/net/ethernet/amd/pds_core/main.c | 14 +-
drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 11 +-
drivers/net/ethernet/broadcom/bnge/bnge.h | 1 +
drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c | 8 +-
drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h | 2 +-
drivers/net/ethernet/broadcom/bnge/bnge_netdev.c | 50 ++-
drivers/net/ethernet/broadcom/bnge/bnge_netdev.h | 4 +-
drivers/net/ethernet/broadcom/bnge/bnge_rmem.h | 2 +-
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 39 +-
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 1 +
.../net/ethernet/freescale/dpaa2/dpaa2-switch.c | 1 +
drivers/net/ethernet/freescale/fman/fman_dtsec.c | 17 +-
drivers/net/ethernet/google/gve/gve.h | 3 +
drivers/net/ethernet/google/gve/gve_rx_dqo.c | 34 ++
drivers/net/ethernet/hisilicon/hip04_eth.c | 11 +-
drivers/net/ethernet/huawei/hinic/hinic_dev.h | 2 -
drivers/net/ethernet/huawei/hinic/hinic_ethtool.c | 21 --
drivers/net/ethernet/intel/ice/ice.h | 3 +
drivers/net/ethernet/intel/ice/ice_eswitch.c | 3 -
drivers/net/ethernet/intel/ice/ice_lag.c | 2 +-
drivers/net/ethernet/intel/ice/ice_parser.c | 3 +
drivers/net/ethernet/intel/ice/ice_ptp.c | 7 +-
drivers/net/ethernet/intel/ice/ice_sriov.c | 14 +-
drivers/net/ethernet/intel/ice/ice_vf_lib.c | 3 +-
drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 7 +-
.../ethernet/marvell/octeontx2/nic/otx2_flows.c | 1 +
.../net/ethernet/marvell/octeontx2/nic/otx2_tc.c | 29 +-
drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 15 +
drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 4 +-
.../ethernet/mellanox/mlx5/core/esw/acl/helper.c | 2 +-
drivers/net/ethernet/mellanox/mlx5/core/port.c | 4 +-
drivers/net/ethernet/microsoft/mana/gdma_main.c | 78 +++-
.../ethernet/netronome/nfp/nfpcore/nfp_resource.c | 3 +
drivers/net/ethernet/realtek/rtase/rtase.h | 8 +
drivers/net/ethernet/realtek/rtase/rtase_main.c | 197 ++++++++++
drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c | 31 ++
drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | 24 ++
.../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 28 +-
drivers/net/ethernet/stmicro/stmmac/hwif.h | 4 +
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 96 ++---
drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c | 35 ++
drivers/net/ethernet/wangxun/txgbe/txgbe_aml.c | 6 +-
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c | 1 +
drivers/net/geneve.c | 27 +-
drivers/net/gtp.c | 17 +-
drivers/net/mctp/mctp-i3c.c | 11 +-
drivers/net/mctp/mctp-serial.c | 2 +-
drivers/net/ovpn/io.c | 4 +-
drivers/net/ovpn/peer.c | 16 +-
drivers/net/ovpn/tcp.c | 6 +-
drivers/net/pcs/pcs-xpcs.c | 34 +-
drivers/net/phy/marvell.c | 2 +-
drivers/net/ppp/ppp_generic.c | 100 +++--
drivers/net/ppp/pppoe.c | 1 +
drivers/net/slip/slip.c | 4 +
drivers/net/vmxnet3/vmxnet3_drv.c | 22 +-
drivers/net/vxlan/vxlan_core.c | 3 +
drivers/net/vxlan/vxlan_mdb.c | 30 +-
drivers/net/wan/wanxl.c | 3 +-
drivers/net/wireless/ath/ath10k/htt_rx.c | 2 +
drivers/net/wireless/ath/ath11k/ahb.c | 1 +
drivers/net/wireless/ath/ath11k/dp_rx.c | 3 +
drivers/net/wireless/ath/ath11k/pci.c | 4 +
drivers/net/wireless/ath/ath11k/qmi.c | 11 +-
drivers/net/wireless/ath/ath12k/dp_peer.c | 11 +-
drivers/net/wireless/ath/ath12k/dp_peer.h | 1 +
drivers/net/wireless/ath/ath12k/dp_rx.c | 7 +-
drivers/net/wireless/ath/ath12k/hw.h | 16 +
drivers/net/wireless/ath/ath12k/mac.c | 10 +-
drivers/net/wireless/ath/ath12k/pci.c | 4 +
drivers/net/wireless/ath/ath12k/peer.c | 3 +
drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c | 33 ++
drivers/net/wireless/ath/ath12k/wifi7/dp_rx.h | 6 +
drivers/net/wireless/ath/ath12k/wifi7/hw.c | 3 +
drivers/net/wireless/ath/ath6kl/txrx.c | 12 +-
drivers/net/wireless/ath/ath6kl/wmi.c | 20 +
drivers/net/wireless/ath/ath9k/hif_usb.c | 7 +-
drivers/net/wireless/ath/carl9170/rx.c | 7 +-
drivers/net/wireless/ath/carl9170/tx.c | 2 +-
drivers/net/wireless/atmel/at76c50x-usb.c | 7 +-
.../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 14 +
.../net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 6 +
.../broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +-
.../wireless/broadcom/brcm80211/brcmfmac/core.c | 46 ++-
.../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 14 +-
.../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 8 +-
.../wireless/broadcom/brcm80211/brcmfmac/sdio.h | 1 +
.../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 3 +
drivers/net/wireless/intel/ipw2x00/ipw2100.c | 8 +-
drivers/net/wireless/intel/iwlwifi/fw/pnvm.c | 9 +-
drivers/net/wireless/intel/iwlwifi/fw/regulatory.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 3 +-
drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 10 +
drivers/net/wireless/intersil/p54/txrx.c | 8 +
drivers/net/wireless/marvell/libertas/firmware.c | 1 +
drivers/net/wireless/marvell/mwifiex/sta_ioctl.c | 14 +-
drivers/net/wireless/marvell/mwifiex/tdls.c | 2 +-
drivers/net/wireless/marvell/mwifiex/uap_event.c | 24 +-
drivers/net/wireless/mediatek/mt76/Kconfig | 4 +-
drivers/net/wireless/mediatek/mt76/Makefile | 6 +-
drivers/net/wireless/mediatek/mt76/mt76.h | 6 +-
drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 6 +
.../net/wireless/mediatek/mt76/mt76_connac_mcu.c | 2 +
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 18 +-
drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 10 +-
drivers/net/wireless/mediatek/mt76/mt7925/mac.c | 13 +-
drivers/net/wireless/mediatek/mt76/mt7925/main.c | 3 +
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 2 +
drivers/net/wireless/mediatek/mt76/mt7996/Kconfig | 2 +-
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 19 +-
drivers/net/wireless/microchip/wilc1000/hif.c | 5 +
drivers/net/wireless/virtual/mac80211_hwsim.c | 1 +
drivers/platform/loongarch/loongson-laptop.c | 1 +
drivers/platform/x86/asus-wmi.c | 26 +-
.../uncore-frequency/uncore-frequency-common.c | 7 +-
drivers/platform/x86/intel/vsec.c | 31 +-
drivers/platform/x86/intel/vsec_tpmi.c | 13 +-
drivers/ptp/ptp_netc.c | 1 +
drivers/ptp/ptp_s390.c | 6 +-
drivers/regulator/mt6358-regulator.c | 2 +-
drivers/resctrl/mpam_devices.c | 36 +-
drivers/reset/spacemit/reset-spacemit-k3.c | 2 +-
drivers/scsi/hosts.c | 2 +
drivers/scsi/scsi_error.c | 22 +-
drivers/scsi/scsi_priv.h | 1 +
drivers/spi/spi-cadence-quadspi.c | 12 +-
drivers/staging/media/meson/vdec/vdec.c | 4 +-
drivers/staging/media/sunxi/cedrus/cedrus.c | 6 +-
drivers/staging/media/sunxi/cedrus/cedrus_h264.c | 3 +
drivers/staging/media/tegra-video/vi.c | 4 +-
drivers/staging/rtl8723bs/core/rtw_ieee80211.c | 9 +-
drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c | 2 +-
drivers/thunderbolt/debugfs.c | 2 +
drivers/thunderbolt/domain.c | 30 ++
drivers/thunderbolt/icm.c | 5 +
drivers/thunderbolt/switch.c | 14 +
drivers/thunderbolt/tb.c | 59 ++-
drivers/thunderbolt/tb.h | 2 +
drivers/thunderbolt/xdomain.c | 100 +++--
drivers/tty/serial/8250/8250_mid.c | 14 +-
drivers/tty/serial/sc16is7xx.c | 12 +
drivers/uio/uio_hv_generic.c | 8 +-
drivers/usb/atm/ueagle-atm.c | 17 +
drivers/usb/chipidea/core.c | 1 +
drivers/usb/core/port.c | 2 +
drivers/usb/core/sysfs.c | 8 +-
drivers/usb/gadget/function/f_midi.c | 1 +
drivers/usb/gadget/function/f_ncm.c | 17 +-
drivers/usb/gadget/function/f_printer.c | 23 +-
drivers/usb/gadget/function/f_tcm.c | 192 ++++++++--
drivers/usb/gadget/function/tcm.h | 13 +
drivers/usb/gadget/function/uvc_v4l2.c | 2 +
drivers/usb/gadget/udc/bdc/bdc_core.c | 20 +
drivers/usb/gadget/udc/bdc/bdc_udc.c | 7 +-
drivers/usb/gadget/udc/dummy_hcd.c | 40 +-
drivers/usb/gadget/udc/fsl_udc_core.c | 93 +++--
drivers/usb/gadget/udc/fsl_usb2_udc.h | 1 +
drivers/usb/gadget/udc/snps_udc_core.c | 1 -
drivers/usb/host/xhci-pci.c | 1 +
drivers/usb/host/xhci.c | 15 +-
drivers/usb/host/xhci.h | 1 +
drivers/usb/musb/omap2430.c | 2 -
drivers/usb/serial/ftdi_sio.c | 2 +
drivers/usb/serial/ftdi_sio_ids.h | 5 +
drivers/usb/serial/io_edgeport.c | 3 +-
drivers/usb/serial/keyspan_pda.c | 44 ++-
drivers/usb/serial/option.c | 1 +
drivers/usb/storage/unusual_devs.h | 7 +
drivers/usb/typec/ucsi/ucsi.c | 158 +++++++-
drivers/vhost/net.c | 8 +-
drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c | 2 +-
drivers/watchdog/airoha_wdt.c | 3 +
drivers/watchdog/ni903x_wdt.c | 7 +-
drivers/watchdog/s32g_wdt.c | 3 +-
drivers/watchdog/watchdog_pretimeout.c | 2 +
fs/afs/dir_edit.c | 2 +-
fs/binfmt_elf_fdpic.c | 4 +
fs/binfmt_misc.c | 5 +-
fs/btrfs/btrfs_inode.h | 2 +
fs/btrfs/extent_io.c | 4 +-
fs/btrfs/extent_map.c | 4 +-
fs/btrfs/file-item.c | 26 +-
fs/btrfs/free-space-cache.c | 3 +
fs/btrfs/relocation.c | 2 +
fs/ceph/addr.c | 9 +
fs/ceph/caps.c | 1 +
fs/ceph/dir.c | 7 +-
fs/ceph/ioctl.c | 6 +
fs/crypto/inline_crypt.c | 57 +--
fs/crypto/keysetup_v1.c | 8 +-
fs/erofs/zmap.c | 3 +-
fs/exec.c | 2 +-
fs/f2fs/super.c | 25 +-
fs/fuse/dev_uring.c | 22 +-
fs/iomap/buffered-io.c | 42 ++-
fs/nfsd/vfs.c | 6 +-
fs/overlayfs/file.c | 16 +-
fs/overlayfs/xattrs.c | 2 +-
fs/pidfs.c | 2 +-
fs/posix_acl.c | 7 +
fs/proc/namespaces.c | 4 +-
fs/smb/client/cifsfs.c | 1 +
fs/smb/client/cifsglob.h | 1 +
fs/smb/client/file.c | 69 +++-
fs/smb/client/inode.c | 6 +
fs/smb/client/misc.c | 106 +++++-
fs/smb/client/smb2file.c | 21 ++
fs/smb/client/smb2inode.c | 23 +-
fs/smb/client/smb2ops.c | 25 +-
fs/smb/server/connection.c | 16 +-
fs/smb/server/oplock.c | 6 +-
fs/smb/server/smb2misc.c | 5 +
fs/smb/server/smb2pdu.c | 9 +-
fs/smb/server/smbacl.c | 42 ++-
fs/super.c | 34 +-
fs/xfs/scrub/cow_repair.c | 203 ++++++----
fs/xfs/scrub/trace.h | 28 +-
include/drm/drm_connector.h | 6 +-
include/drm/drm_utils.h | 1 +
include/drm/ttm/ttm_backup.h | 12 +-
include/linux/arm_ffa.h | 2 +-
include/linux/audit.h | 4 +-
include/linux/audit_arch.h | 12 +-
include/linux/bnge/hsi.h | 7 +-
include/linux/bootconfig.h | 3 +
include/linux/firmware/intel/stratix10-smc.h | 4 +
include/linux/fscrypt.h | 18 +-
include/linux/intel_vsec.h | 6 +-
include/linux/memory_hotplug.h | 8 +-
include/linux/mlx5/mlx5_ifc.h | 13 +-
include/linux/seqlock.h | 7 +-
include/linux/sunrpc/xdr.h | 19 +-
include/linux/vtime.h | 6 +
include/media/v4l2-async.h | 4 +-
include/media/videobuf2-core.h | 8 +-
include/net/bluetooth/hci_core.h | 1 +
include/net/bluetooth/rfcomm.h | 3 +
include/net/cfg80211.h | 4 +-
include/net/pkt_cls.h | 14 +-
include/net/sctp/structs.h | 3 +-
include/net/tcp.h | 2 +
include/scsi/scsi_host.h | 3 +
include/trace/events/memory-failure.h | 6 +-
include/uapi/linux/btrfs.h | 2 +-
include/uapi/linux/rkisp1-config.h | 6 +-
init/Kconfig | 3 +
init/main.c | 45 ---
io_uring/rw.c | 42 ++-
kernel/audit.c | 2 +-
kernel/audit.h | 19 +-
kernel/audit_fsnotify.c | 32 +-
kernel/audit_tree.c | 2 +-
kernel/audit_watch.c | 25 +-
kernel/auditfilter.c | 17 +-
kernel/auditsc.c | 2 +-
kernel/sched/ext.c | 134 ++++---
kernel/sched/ext_internal.h | 30 ++
kernel/smp.c | 30 +-
kernel/trace/ftrace.c | 13 +
kernel/trace/trace.c | 2 +-
kernel/trace/trace.h | 1 +
kernel/trace/trace_eprobe.c | 3 +-
kernel/trace/trace_events.c | 4 +-
kernel/trace/trace_events_hist.c | 2 +
kernel/trace/trace_events_trigger.c | 22 +-
kernel/trace/trace_mmiotrace.c | 4 +-
kernel/trace/trace_probe.c | 13 +-
kernel/trace/trace_remote.c | 16 +-
kernel/trace/trace_syscalls.c | 5 +
lib/bootconfig.c | 65 ++++
lib/compat_audit.c | 12 +-
lib/rhashtable.c | 1 +
mm/damon/core.c | 13 +
mm/huge_memory.c | 12 +-
mm/kmemleak.c | 7 +-
mm/memory_hotplug.c | 13 +-
mm/memremap.c | 4 +-
mm/page_vma_mapped.c | 33 +-
mm/slub.c | 21 +-
mm/sparse-vmemmap.c | 46 ++-
mm/userfaultfd.c | 5 +-
net/bluetooth/hci_event.c | 18 +-
net/bluetooth/hci_sync.c | 79 +++-
net/bluetooth/mgmt.c | 105 +++++-
net/bluetooth/rfcomm/core.c | 17 +
net/bluetooth/rfcomm/tty.c | 7 +-
net/bridge/br_netlink_tunnel.c | 3 +-
net/bridge/br_private.h | 6 +-
net/bridge/br_vlan.c | 10 +-
net/bridge/br_vlan_options.c | 3 +-
net/can/j1939/transport.c | 18 +-
net/can/raw.c | 66 ++--
net/ceph/auth_x.c | 9 +-
net/ceph/ceph_common.c | 4 +-
net/ceph/cls_lock_client.c | 8 +-
net/ceph/mon_client.c | 4 +-
net/ceph/osdmap.c | 16 +-
net/core/bpf_sk_storage.c | 2 -
net/core/dev.c | 10 +-
net/core/drop_monitor.c | 18 +-
net/core/filter.c | 17 +-
net/core/gro.c | 4 +-
net/core/sock.c | 13 +-
net/core/sock_map.c | 2 +
net/hsr/hsr_slave.c | 2 +
net/ipv4/datagram.c | 4 +-
net/ipv4/fib_trie.c | 2 +-
net/ipv4/icmp.c | 18 +-
net/ipv4/ip_gre.c | 4 +-
net/ipv4/nexthop.c | 2 +-
net/ipv4/raw.c | 23 +-
net/ipv4/tcp_bpf.c | 2 +-
net/ipv4/tcp_input.c | 56 ++-
net/ipv4/tcp_ipv4.c | 14 +-
net/ipv4/tcp_minisocks.c | 12 +-
net/ipv6/ila/ila_common.c | 12 +
net/ipv6/ip6_gre.c | 4 +-
net/ipv6/raw.c | 2 +-
net/ipv6/route.c | 4 +-
net/ipv6/tcp_ipv6.c | 8 +-
net/ipv6/xfrm6_policy.c | 1 +
net/iucv/af_iucv.c | 21 +-
net/mac80211/cfg.c | 14 +-
net/mac80211/iface.c | 8 +-
net/mac80211/link.c | 4 +
net/mac80211/mlme.c | 6 +-
net/mac80211/nan.c | 35 +-
net/mac80211/rx.c | 2 +
net/mac80211/sta_info.c | 15 +-
net/mac802154/llsec.c | 5 +
net/mac802154/scan.c | 11 +
net/mctp/device.c | 4 +-
net/mpls/af_mpls.c | 11 +-
net/mptcp/options.c | 17 +-
net/mptcp/pm_userspace.c | 7 +-
net/mptcp/protocol.c | 34 +-
net/openvswitch/actions.c | 19 +-
net/openvswitch/datapath.c | 25 +-
net/openvswitch/datapath.h | 2 +-
net/openvswitch/vport.c | 2 +-
net/packet/af_packet.c | 6 +-
net/phonet/pep.c | 2 +
net/qrtr/af_qrtr.c | 8 +
net/qrtr/ns.c | 4 +-
net/rds/ib.c | 4 +
net/rds/ib_cm.c | 4 +
net/rds/recv.c | 15 +
net/rds/tcp.c | 12 +-
net/rxrpc/ar-internal.h | 6 +-
net/sched/act_tunnel_key.c | 14 +-
net/sched/cls_api.c | 6 +-
net/sched/sch_api.c | 24 +-
net/sched/sch_cake.c | 2 +-
net/sched/sch_drr.c | 2 +-
net/sched/sch_dualpi2.c | 2 +-
net/sched/sch_ets.c | 2 +-
net/sched/sch_fq_codel.c | 2 +-
net/sched/sch_fq_pie.c | 2 +-
net/sched/sch_hfsc.c | 2 +-
net/sched/sch_htb.c | 2 +-
net/sched/sch_multiq.c | 2 +-
net/sched/sch_prio.c | 2 +-
net/sched/sch_qfq.c | 2 +-
net/sched/sch_sfb.c | 2 +-
net/sched/sch_sfq.c | 2 +-
net/sctp/auth.c | 2 +-
net/sctp/protocol.c | 21 +-
net/sctp/sm_make_chunk.c | 6 +
net/sctp/sm_statefuns.c | 2 +-
net/sctp/stream.c | 6 +-
net/sctp/sysctl.c | 9 +-
net/sunrpc/svcsock.c | 14 +-
net/sunrpc/xdr.c | 210 ++++++++++-
net/sunrpc/xprtrdma/rpc_rdma.c | 4 +
net/sunrpc/xprtrdma/verbs.c | 12 +-
net/tipc/netlink.c | 6 +-
net/tipc/netlink_compat.c | 4 +
net/tipc/socket.c | 5 +-
net/tipc/udp_media.c | 56 ++-
net/tls/tls_device.c | 6 +-
net/vmw_vsock/virtio_transport_common.c | 165 +++++++-
net/wireless/core.c | 14 +-
net/wireless/core.h | 4 +-
net/wireless/nl80211.c | 25 +-
net/wireless/pmsr.c | 34 +-
net/wireless/scan.c | 13 +-
net/wireless/sme.c | 6 +-
net/x25/af_x25.c | 8 +-
net/xfrm/xfrm_device.c | 12 +-
net/xfrm/xfrm_iptfs.c | 1 +
net/xfrm/xfrm_policy.c | 4 +-
net/xfrm/xfrm_state.c | 11 +-
net/xfrm/xfrm_user.c | 3 +-
rust/bindings/lib.rs | 4 +
rust/kernel/device.rs | 20 +-
rust/kernel/time.rs | 11 +-
rust/uapi/lib.rs | 4 +
sound/core/seq/seq_timer.c | 13 +-
sound/core/timer.c | 21 +-
sound/hda/codecs/hdmi/hdmi.c | 3 +
sound/hda/codecs/hdmi/hdmi_local.h | 9 +
sound/hda/codecs/hdmi/intelhdmi.c | 36 +-
sound/hda/codecs/realtek/alc269.c | 9 +
sound/hda/codecs/side-codecs/cs35l41_hda.c | 11 +-
sound/soc/amd/acp/Kconfig | 10 +-
sound/soc/amd/acp/Makefile | 3 +-
sound/soc/amd/acp/amd-acp70-acpi-match.c | 2 +-
sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.c | 4 -
sound/soc/amd/ps/pci-ps.c | 33 +-
sound/soc/codecs/bt-sco.c | 10 +-
sound/soc/codecs/cs35l56-i2c.c | 4 +-
sound/soc/codecs/cs35l56-spi.c | 4 +-
sound/soc/codecs/cs35l56.c | 17 +-
sound/soc/codecs/cs42l43-jack.c | 3 +-
sound/soc/codecs/tas2562.c | 5 +-
sound/soc/codecs/tas2781-fmwlib.c | 63 +++-
sound/soc/fsl/fsl_sai.c | 29 +-
sound/soc/fsl/imx-card.c | 12 +-
sound/soc/meson/aiu-fifo-spdif.c | 5 +
sound/soc/sunxi/sun4i-codec.c | 1 +
sound/usb/mixer.c | 2 +-
sound/usb/quirks.c | 2 +
tools/objtool/check.c | 1 +
tools/testing/selftests/alsa/mixer-test.c | 1 +
.../testing/selftests/bpf/progs/verifier_map_ptr.c | 36 +-
tools/testing/selftests/drivers/net/.gitignore | 1 +
tools/testing/selftests/drivers/net/Makefile | 2 +
tools/testing/selftests/drivers/net/config | 5 +
.../drivers/net/netconsole/netcons_resume.sh | 3 +-
tools/testing/selftests/drivers/net/settings | 1 +
.../selftests/{ => drivers}/net/so_txtime.c | 35 +-
tools/testing/selftests/drivers/net/so_txtime.py | 103 +++++
tools/testing/selftests/drivers/ntsync/config | 2 +-
tools/testing/selftests/ftrace/ftracetest | 1 +
tools/testing/selftests/net/.gitignore | 1 -
tools/testing/selftests/net/Makefile | 2 -
tools/testing/selftests/net/af_unix/config | 1 +
tools/testing/selftests/net/mptcp/userspace_pm.sh | 2 +-
tools/testing/selftests/net/openvswitch/config | 16 +
tools/testing/selftests/net/ovpn/config | 2 +
tools/testing/selftests/net/ovpn/ovpn-cli.c | 4 +-
tools/testing/selftests/net/ovpn/settings | 1 +
tools/testing/selftests/net/so_txtime.sh | 110 ------
tools/testing/selftests/net/tun.c | 8 +-
946 files changed, 9236 insertions(+), 4123 deletions(-)Greg Kroah-Hartman
maintainerPATCH 1/744 platform/x86/intel-uncore-freq: Fix current_freq_khz after CPU hotplug
7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guixiong Wei <[email protected]>
commit 6b63520ed14b17bbe9c2103debbd2152dde1fba3 upstream.
When the last CPU of a legacy uncore die goes offline, uncore_freq_remove_die_entry() clears control_cpu. During CPU hotplug re-add, uncore_freq_add_entry() still populates sysfs attributes before assigning the new control CPU. As a result, the current frequency read returns -ENXIO and current_freq_khz is omitted from the recreated sysfs group.
Assign control_cpu before the initial read paths and before create_attr_group() so sysfs recreation uses the new online CPU. If sysfs creation fails, restore control_cpu to -1 to keep the error path state consistent.
--- .../x86/intel/uncore-frequency/uncore-frequency-common.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c +6 -1
@@ -275,15 +275,20 @@ int uncore_freq_add_entry(struct uncore_data *data, int cpu) data->package_id, data->die_id); } +/* +* Set the control CPU before any read path so entry recreation after CPU +* hotplug can populate read-only attributes from the new online CPU. +*/ + data->control_cpu = cpu;uncore_read (data, &data->initial_min_freq_khz,UNCORE_INDEX_MIN_FREQ );uncore_read (data, &data->initial_max_freq_khz,UNCORE_INDEX_MAX_FREQ ); ret =create_attr_group (data, data->name);if (ret) { + data->control_cpu =-1 ;if (data->domain_id !=UNCORE_DOMAIN_ID_INVALID )ida_free (&intel_uncore_ida, data->instance_id); }else { - data->control_cpu = cpu; data->valid = true; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 2/744 sched_ext: Skip ops.set_weight() for disabled tasks
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuba Piecuch <[email protected]>
commit 0e2f4ab68a89fad42e0f5a9ff4b740738e7aa1d6 upstream.
When switching a task's sched_class away from sched_ext, we get the following sequence of events in __sched_setscheduler():
sched_change_begin()
switched_from_scx()
scx_disable_task(p)
ops.disable(p)__setscheduler_params()
set_load_weight()
reweight_task_scx(p)
ops.set_weight(p)p->sched_class = next_class;sched_change_end()
...
Notably, ops.set_weight() is called _after_ ops.disable(). This violates the expected semantics of the callbacks, the expectation being that ops.disable() can only be followed by ops.exit_task() or ops.enable().
Skipping the weight adjustment for disabled tasks should be harmless since the weight will be recalculated in scx_enable_task() if the task ever rejoins SCX.
--- kernel/sched/ext.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
kernel/sched/ext.c +11 -0
@@ -3904,6 +3904,17 @@ static void reweight_task_scx(struct rq *rq, struct task_struct *p,if (task_dead_and_done (p))return ; +/* +* When switching sched_class away from SCX, reweight_task_scx() +* is called _after_ scx_disable_task(). Skip calling ops.set_weight() +* since the BPF scheduler may have already forgotten the task in +* ops.disable(). +* p->scx.weight will be recalculated in scx_enable_task() if the task +* ever returns to SCX class. +*/ +if (scx_get_task_state (p) !=SCX_TASK_ENABLED ) +return ; + p->scx.weight =sched_weight_to_cgroup (scale_load_down (lw->weight));if (SCX_HAS_OP (sch, set_weight))SCX_CALL_OP_TASK (sch, set_weight, rq, p, p->scx.weight);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 3/744 drm/virtio: fix deadlock in display_info_cb by removing hotplug from dequeue worker
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryosuke Yasuoka <[email protected]>
[ Upstream commit d1b894c5bbb3fee0012bd14356286dc2384e8213 ]
A probe-time deadlock can occur between the dequeue worker and drm_client_register(). During probe, drm_client_register() holds clientlist_mutex and calls the fbdev hotplug callback, which triggers an atomic commit that ends up sleeping in virtio_gpu_queue_ctrl_sgs() waiting for virtqueue space. The dequeue worker that would free that space calls virtio_gpu_cmd_get_display_info_cb(), which invokes drm_kms_helper_hotplug_event() -> drm_client_dev_hotplug(), attempting to acquire the same clientlist_mutex. Since wake_up() is only called after the resp_cb loop, the probe thread is never woken and both threads deadlock.
Fix this by removing the hotplug notification from virtio_gpu_cmd_get_display_info_cb(). The display data (outputs[i].info) is still updated synchronously in the callback.
For the init path, drm_client_register() already fires an initial hotplug when the client is registered, which picks up the connector state updated by display_info_cb.
For the runtime config_changed path, add a wait_event_timeout() in config_changed_work_func() so that display_info_cb updates the connector data before the hotplug notification is sent. Also replace drm_helper_hpd_irq_event() with drm_kms_helper_hotplug_event() since virtio-gpu never calls drm_kms_helper_poll_init() and thus drm_helper_hpd_irq_event() always returns false without doing anything.
--- drivers/gpu/drm/virtio/virtgpu_kms.c | 5 ++++- drivers/gpu/drm/virtio/virtgpu_vq.c | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/virtio/virtgpu_kms.c +4 -1
@@ -49,7 +49,10 @@ static void virtio_gpu_config_changed_work_func(struct work_struct *work)virtio_gpu_cmd_get_edids (vgdev);virtio_gpu_cmd_get_display_info (vgdev);virtio_gpu_notify (vgdev); -drm_helper_hpd_irq_event (vgdev->ddev); +wait_event_timeout (vgdev->resp_wq, + !vgdev->display_info_pending, +5 *HZ ); +drm_kms_helper_hotplug_event (vgdev->ddev); } events_clear |=VIRTIO_GPU_EVENT_DISPLAY ; }
drivers/gpu/drm/virtio/virtgpu_vq.c +0 -3
@@ -840,9 +840,6 @@ static void virtio_gpu_cmd_get_display_info_cb(struct virtio_gpu_device *vgdev, vgdev->display_info_pending = false;spin_unlock (&vgdev->display_info_lock);wake_up (&vgdev->resp_wq); - -if (!drm_helper_hpd_irq_event (vgdev->ddev)) -drm_kms_helper_hotplug_event (vgdev->ddev); } static void virtio_gpu_cmd_get_capset_info_cb(struct virtio_gpu_device *vgdev,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 4/744 seqlock: Allow UBSAN_ALIGNMENT to fail optimizing
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
commit 88331c4ec23a28c1006ec532fa64763d4c695e90 upstream.
With gcc-15 and gcc-16 with UBSAN_ALIGNMENT enabled the compiler fails to inline and optimize __scoped_seqlock_bug() away on s390:
s390x-16.1.0-ld: kernel/sched/build_policy.o: in function `__scoped_seqlock_next':
/.../seqlock.h:1286:(.text+0x22030): undefined reference to `__scoped_seqlock_bug'
Fix this by adding UBSAN_ALIGNMENT to the list of config options where a not inlined empty __scoped_seqlock_bug() is allowed.
--- include/linux/seqlock.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
include/linux/seqlock.h +4 -3
@@ -1259,14 +1259,15 @@ static __always_inline void __scoped_seqextern void __scoped_seqlock_invalid_target (void ); -#if (defined(CONFIG_CC_IS_GCC ) &&CONFIG_GCC_VERSION <90000 ) || defined(CONFIG_KASAN ) +#if (defined(CONFIG_CC_IS_GCC ) &&CONFIG_GCC_VERSION <90000 ) || \ + defined(CONFIG_KASAN ) || defined(CONFIG_UBSAN_ALIGNMENT )/* * For some reason some GCC-8 architectures (nios2, alpha) have trouble * determining that the ss_done state is impossible in __scoped_seqlock_next() * below. * -* Similarly KASAN is known to confuse compilers enough to break this. But we -* don't care about code quality for KASAN builds anyway. +* Similarly KASAN and UBSAN_ALIGNMENT are known to confuse compilers enough +* to break this. But we don't care about code quality for such builds anyway. */ static inline void __scoped_seqlock_bug (void ) { }#else
Greg Kroah-Hartman
maintainerPATCH 5/744 KVM: x86: Check for invalid/obsolete root *after* making MMU pages available
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit 2abd5287f08319fa35764566b15c6e22cb1068db upstream.
Check for a "stale" page fault, i.e. for an invalid and/or obsolete root, after making MMU pages available for the shadow MMU. If reclaiming shadow pages zaps an in-use root, i.e. marks it invalid, then KVM will attempt to map memory into an invalid root. On its own, populating an invalid root is "fine", but because child shadow pages inherit their parent's role, any children created during the map/fetch will be created as invalid pages, thus violating KVM's invariant that invalid pages are never on the list of active MMU pages.
Note, the underlying flaw has existed since KVM first started tracking invalid roots in 2008 (commit 2e53d63acba7, "KVM: MMU: ignore zapped root pagetables"), but the true badness only came along in 2020 (Linux 5.9) with the invariant that invalid shadow pages can't be on the list of active pages.
Note #2, inheriting role.invalid when creating child shadow pages is also far from ideal; that flaw will be addressed separately.
--- arch/x86/kvm/mmu/mmu.c | 9 +++++---- arch/x86/kvm/mmu/paging_tmpl.h | 10 ++++++---- 2 files changed, 11 insertions(+), 8 deletions(-)
arch/x86/kvm/mmu/mmu.c +5 -4
@@ -4837,16 +4837,17 @@ static int direct_page_fault(struct kvm_if (r !=RET_PF_CONTINUE )return r; - r =RET_PF_RETRY ;write_lock (&vcpu->kvm->mmu_lock); -if (is_page_fault_stale (vcpu, fault)) - goto out_unlock; - r =make_mmu_pages_available (vcpu);if (r) goto out_unlock; +if (is_page_fault_stale (vcpu, fault)) { + r =RET_PF_RETRY ; + goto out_unlock; + } + r =direct_map (vcpu, fault); out_unlock:
arch/x86/kvm/mmu/paging_tmpl.h +6 -4
@@ -827,15 +827,17 @@ static int FNAME(page_fault)(struct kvm_ }#endif - r =RET_PF_RETRY ;write_lock (&vcpu->kvm->mmu_lock); -if (is_page_fault_stale (vcpu, fault)) - goto out_unlock; - r =make_mmu_pages_available (vcpu);if (r) goto out_unlock; + +if (is_page_fault_stale (vcpu, fault)) { + r =RET_PF_RETRY ; + goto out_unlock; + } + r =FNAME (fetch)(vcpu, fault, &walker); out_unlock:
Greg Kroah-Hartman
maintainerPATCH 6/744 KVM: x86: Only reset TSC Deadline Timer in apic_timer_expired on KVM_RUN
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Venkatesh Srinivas <[email protected]>
commit e800decd9c0ac4349bcd8f8f9b29fd21fe93165e upstream.
On Intel platforms with a VMX preemption timer and APICv, if a VMM calls KVM_GET_LAPIC before KVM_GET_MSRS to save the vCPU state, it is possible to lose a pending timer interrupt.
If the thread running these ioctls is migrated to another core after calling KVM_GET_LAPIC but before KVM_GET_MSRS and the guest is using their LAPIC timer in TSC-deadline mode, not only does the save LAPIC state not carry the pending interrupt, the TSCDEADLINE MSR will be zeroed.
After migration across CPUs, KVM_GET_MSRS calls vcpu_load, posting the interrupt and clearing the MSR:vcpu_load() ->
kvm_arch_vcpu_load() ->
kvm_lapic_restart_hv_timer() ->
start_hv_timer() ->
apic_timer_expired() ->
kvm_apic_inject_pending_timer_irqs()
. post interrupt into the LAPIC state
. clear IA32_TSCDEADLINEThe saved LAPIC state will be missing the pending interrupt and the saved MSR will be zero. Oops.
Fix by only posting an interrupt when we're attempting to enter the guest (vcpu->wants_to_run == true), not for vcpu_load from other paths.
Message-ID: <[email protected]>
--- arch/x86/kvm/lapic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/lapic.c +1 -1
@@ -2052,7 +2052,7 @@ static void apic_timer_expired(struct kvif (apic_lvtt_tscdeadline (apic) || ktimer->hv_timer_in_use) ktimer->expired_tscdeadline = ktimer->tscdeadline; -if (!from_timer_fn && apic->apicv_active) { +if (!from_timer_fn && apic->apicv_active && vcpu->wants_to_run) {WARN_ON (kvm_get_running_vcpu () != vcpu);kvm_apic_inject_pending_timer_irqs (apic);return ;
Greg Kroah-Hartman
maintainerPATCH 7/744 KVM: nVMX: Hide shadow VMCS right after VMCLEAR
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hyunwoo Kim <[email protected]>
commit 622ebfac01ba4f9c0060cebd41257fe46fc4a0b3 upstream.
free_nested() frees the shadow VMCS while vmcs01 still points to it. But because it is asynchronous with respect to loaded_vmcs_clear(), the vCPU might migrate before the pointer is cleared and __loaded_vmcs_clear() may then execute VMCLEAR.
The VMCS needs to stay attached until its explicit VMCLEAR completes, but then it can be hidden and the page safely freed.
--- arch/x86/kvm/vmx/nested.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
arch/x86/kvm/vmx/nested.c +9 -2
@@ -336,6 +336,7 @@ static void nested_put_vmcs12_pages(strustatic void free_nested (struct kvm_vcpu *vcpu) {struct vcpu_vmx *vmx =to_vmx (vcpu); +struct vmcs *shadow_vmcs;if (WARN_ON_ONCE (vmx->loaded_vmcs != &vmx->vmcs01))vmx_switch_vmcs (vcpu, &vmx->vmcs01);
@@ -353,9 +354,15 @@ static void free_nested(struct kvm_vcpu vmx->nested.current_vmptr =INVALID_GPA ;if (enable_shadow_vmcs) {vmx_disable_shadow_vmcs (vmx); -vmcs_clear (vmx->vmcs01.shadow_vmcs); -free_vmcs (vmx->vmcs01.shadow_vmcs); + +/* +* Keep the pointer visible until after VMCLEAR, so migration +* can clear an active shadow VMCS on the old CPU. +*/ + shadow_vmcs = vmx->vmcs01.shadow_vmcs; +vmcs_clear (shadow_vmcs); vmx->vmcs01.shadow_vmcs =NULL ; +free_vmcs (shadow_vmcs); }kfree (vmx->nested.cached_vmcs12); vmx->nested.cached_vmcs12 =NULL ;
Greg Kroah-Hartman
maintainerPATCH 8/744 KVM: x86/mmu: Fix use-after-free on vendor module reload
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Rosenthal <[email protected]>
commit 52f2f7c30126037975389aa04d24c506a5177c35 upstream.
mmu_destroy_caches() destroys pte_list_desc_cache and mmu_page_header_cache, but leaves both pointers unchanged. The pointers live in kvm.ko, and therefore survive when a vendor module is unloaded while kvm.ko remains loaded.
If creation of pte_list_desc_cache fails during a subsequent vendor module load, its assignment sets pte_list_desc_cache to NULL and the error path calls mmu_destroy_caches(). mmu_page_header_cache still points to the cache destroyed during the preceding vendor module unload. Passing that stale pointer to kmem_cache_destroy() causes a slab use-after-free.
Reproduce the issue on a v7.1.3 kernel with CONFIG_KASAN=y, CONFIG_KASAN_GENERIC=y, CONFIG_KVM=m, and CONFIG_KVM_INTEL=m. A one-shot test hook forces pte_list_desc_cache to NULL on the second invocation of kvm_mmu_vendor_module_init():
1. Load kvm.ko and kvm-intel.ko, creating both caches.
2. Unload only kvm_intel, leaving kvm.ko loaded.
3. Reload kvm_intel and force initialization through the -ENOMEM path.
KASAN reports:
BUG: KASAN: slab-use-after-free in kvm_mmu_vendor_module_init+0x5b/0x170 [kvm] ... kmem_cache_destroy+0x21/0x1d0 kvm_mmu_vendor_module_init+0x5b/0x170 [kvm] ... Allocated by task 16817: __kmem_cache_create_args+0x12c/0x3b0 __kmem_cache_create.constprop.0+0xb6/0xf0 [kvm] kvm_mmu_vendor_module_init+0x13b/0x170 [kvm] ... Freed by task 16820: kmem_cache_destroy+0x117/0x1d0 kvm_mmu_vendor_module_exit+0x21/0x30 [kvm]
Clear both pointers immediately after destroying their caches so that the stored state reflects the caches' lifetime and repeated cleanup is safe.
With the fix applied, the same injected vendor module reload fails with -ENOMEM as expected and produces no KASAN report.
Message-ID: <[email protected]>
--- arch/x86/kvm/mmu/mmu.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/kvm/mmu/mmu.c +2 -0
@@ -7502,7 +7502,9 @@ void kvm_mmu_invalidate_mmio_sptes(strucstatic void mmu_destroy_caches (void ) {kmem_cache_destroy (pte_list_desc_cache); + pte_list_desc_cache =NULL ;kmem_cache_destroy (mmu_page_header_cache); + mmu_page_header_cache =NULL ; }static void kvm_wake_nx_recovery_thread (struct kvm *kvm)
Greg Kroah-Hartman
maintainerPATCH 9/744 gpu: host1x: Fix use-after-free in host1x_bo_clear_cached_mappings
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikko Perttunen <[email protected]>
[ Upstream commit 266cddf7bd0f6c79b6c0633aef742a22bf70265b ]
__host1x_bo_unpin() drops the last reference to the mapping and frees it, so we can't dereference mapping afterwards. The cache itself outlives the mapping, so use the cache local variable instead.
--- drivers/gpu/host1x/bus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/host1x/bus.c +2 -2
@@ -1012,10 +1012,10 @@ void host1x_bo_clear_cached_mappings(struct host1x_bo *bo)if (WARN_ON (!cache))continue ; -mutex_lock (&mapping->cache->lock); +mutex_lock (&cache->lock);WARN_ON (kref_read (&mapping->ref) !=1 );__host1x_bo_unpin (&mapping->ref); -mutex_unlock (&mapping->cache->lock); +mutex_unlock (&cache->lock); } }EXPORT_SYMBOL (host1x_bo_clear_cached_mappings);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 10/744 crypto: tegra - Dont touch bo refcount in host1x bo pin/unpin
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikko Perttunen <[email protected]>
[ Upstream commit f8c9c57d750346abd213ffed2ae3cacb0268e9f1 ]
Since commit "gpu: host1x: Allow entries in BO caches to be freed", host1x_bo_pin() and host1x_bo_unpin() handle the bo's refcount themselves. .pin/.unpin callbacks should not adjust it.
--- drivers/crypto/tegra/tegra-se-main.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/crypto/tegra/tegra-se-main.c +1 -2
@@ -52,7 +52,7 @@ tegra_se_cmdbuf_pin(struct device *dev, struct host1x_bo *bo, enum dma_data_direreturn ERR_PTR (-ENOMEM );kref_init (&map->ref); - map->bo =host1x_bo_get (bo); + map->bo = bo; map->direction = direction; map->dev = dev;
@@ -93,7 +93,6 @@ static void tegra_se_cmdbuf_unpin(struct host1x_bo_mapping *map)dma_unmap_sgtable (map->dev, map->sgt, map->direction,0 );sg_free_table (map->sgt);kfree (map->sgt); -host1x_bo_put (map->bo);kfree (map); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 11/744 xprtrdma: Clear receive-side ownership pointers on release
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 2ae8e7afbc63bf84243367f89eb43571f0345a74 ]
Three small ownership-state cleanups land the transport in a state that lets future reviewers reason about each pointer locally rather than tracing the whole reply path:
rpcrdma_rep_put() clears rep->rr_rqst before the rep enters rb_free_reps so that no rep on the free list still carries a stale rqst pointer. rpcrdma_reply_handler() and rpcrdma_unpin_rqst() are the only sites that set rr_rqst; rpcrdma_reply_handler() hands the rep through rpcrdma_rep_put(), and rpcrdma_unpin_rqst() NULLs rr_rqst directly because its error path abandons the rep for teardown cleanup rather than returning it to rb_free_reps.
rpcrdma_reply_put() NULLs req->rl_reply before calling rpcrdma_rep_put(). The previous order placed the rep on rb_free_reps while req->rl_reply still pointed at it; the window was harmless because xprt_rdma_free_slot() holds the req exclusively across the pair, but closing it makes the invariant 'rep on rb_free_reps implies no req references it' strictly checkable.
rpcrdma_sendctx_unmap() and rpcrdma_sendctx_cancel() clear req->rl_sendctx after dropping the sendctx pointer in the sendctx ring. Without this, req->rl_sendctx survives across Send completion and points at a sendctx that may already have been reassigned by rpcrdma_sendctx_get_locked() to a different req. No caller dereferences the stale pointer today -- rpcrdma_prepare_send_sges() overwrites it before the next Send -- but a NULL is a more honest representation of 'the Send is no longer outstanding' and lets the assertion patch that follows trip on any future regression.
--- net/sunrpc/xprtrdma/rpc_rdma.c | 4 ++++ net/sunrpc/xprtrdma/verbs.c | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-)
net/sunrpc/xprtrdma/rpc_rdma.c +4 -0
@@ -493,6 +493,7 @@ void rpcrdma_sendctx_unmap(struct rpcrdma_sendctx *sc)rpcrdma_sendctx_dma_unmap (sc); sc->sc_req =NULL ; + req->rl_sendctx =NULL ;rpcrdma_req_put (req); }
@@ -501,8 +502,11 @@ void rpcrdma_sendctx_unmap(struct rpcrdma_sendctx *sc)*/ static void rpcrdma_sendctx_cancel (struct rpcrdma_sendctx *sc) { +struct rpcrdma_req *req = sc->sc_req; +rpcrdma_sendctx_dma_unmap (sc); sc->sc_req =NULL ; + req->rl_sendctx =NULL ; }/* Prepare an SGE for the RPC-over-RDMA transport header.
net/sunrpc/xprtrdma/verbs.c +10 -2
@@ -1095,9 +1095,15 @@ static struct rpcrdma_rep *rpcrdma_rep_get_locked(struct rpcrdma_buffer *buf)* @buf: buffer pool * @rep: rep to release * +* The rep's transient association with an rpc_rqst, established +* by rpcrdma_reply_handler() and torn down here, must not survive +* onto rb_free_reps: rpcrdma_post_recvs() pulls reps from the free +* list to re-post them, and a non-NULL rr_rqst on a free-listed rep +* would imply the rep is still referenced by a req. */ void rpcrdma_rep_put (struct rpcrdma_buffer *buf,struct rpcrdma_rep *rep) { + rep->rr_rqst =NULL ;llist_add (&rep->rr_node, &buf->rb_free_reps); }
@@ -1280,9 +1286,11 @@ rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt)*/ void rpcrdma_reply_put (struct rpcrdma_buffer *buffers,struct rpcrdma_req *req) { -if (req->rl_reply) { -rpcrdma_rep_put (buffers, req->rl_reply); +struct rpcrdma_rep *rep = req->rl_reply; + +if (rep) { req->rl_reply =NULL ; +rpcrdma_rep_put (buffers, rep); }/* I2: rl_reply NULL after the put closes the * 'rep on rb_free_reps still referenced by req' window.
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 12/744 arm64: tegra: Remove fallback compatible for GPCDMA
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil R <[email protected]>
[ Upstream commit ee7863e43228a3143398dc5bbb943c9a735a8fca ]
Remove the fallback compatible string "nvidia,tegra186-gpcdma" for GPCDMA in Tegra264. Tegra186 compatible cannot work on Tegra264 because of the register offset changes and absence of the reset property.
--- arch/arm64/boot/dts/nvidia/tegra264.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/nvidia/tegra264.dtsi +1 -1
@@ -3208,7 +3208,7 @@ agic_page5: interrupt-controller@99b0000 { }; gpcdma: dma-controller@8400000 { - compatible = "nvidia,tegra264-gpcdma", "nvidia,tegra186-gpcdma"; + compatible = "nvidia,tegra264-gpcdma"; reg = <0x0 0x08400000 0x0 0x210000>; interrupts = <GIC_SPI 584 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 585 IRQ_TYPE_LEVEL_HIGH>,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 13/744 Docs/admin-guide/cgroup-v2: fix memory.stat doc details
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Doehyun Baek <[email protected]>
[ Upstream commit 46d65096ce8d278abf4528e254878c14ddd0b459 ]
Fix minor cgroup v2 memory.stat documentation issues. Correct the vmalloc per-node marker now that vmalloc uses the native NR_VMALLOC node stat, and document zswap_incomp as a byte-valued memory amount instead of as a page counter.
--- Documentation/admin-guide/cgroup-v2.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Documentation/admin-guide/cgroup-v2.rst +2 -2
@@ -1570,7 +1570,7 @@ The following nested keys are defined. sock (npn) Amount of memory used in network transmission buffers - vmalloc (npn) + vmalloc Amount of memory used for vmap backed memory. shmem
@@ -1735,7 +1735,7 @@ The following nested keys are defined. Number of pages written from zswap to swap. zswap_incomp - Number of incompressible pages currently stored in zswap + Amount of memory used by incompressible pages currently stored in zswap without compression. These pages could not be compressed to a size smaller than PAGE_SIZE, so they are stored as-is.
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 14/744 sched_ext: Annotate ksyncs with __rcu in alloc/free_kick_syncs()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
[ Upstream commit 115d1ce989747045bd7745c7ab020982660c7e42 ]
scx_kick_syncs is a per-CPU __rcu pointer, so per_cpu_ptr() returns struct scx_kick_syncs __rcu **. alloc_kick_syncs() and free_kick_syncs() stored it in a plain struct scx_kick_syncs **ksyncs, which sparse flags as an __rcu address-space mismatch. Annotate ksyncs to match. Its accesses already go through rcu_*_pointer().
--- kernel/sched/ext.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/sched/ext.c +2 -2
@@ -5615,7 +5615,7 @@ static void free_kick_syncs(void)int cpu;for_each_possible_cpu (cpu) { -struct scx_kick_syncs **ksyncs =per_cpu_ptr (&scx_kick_syncs, cpu); +struct scx_kick_syncs __rcu **ksyncs =per_cpu_ptr (&scx_kick_syncs, cpu);struct scx_kick_syncs *to_free; to_free =rcu_replace_pointer (*ksyncs,NULL , true);
@@ -6538,7 +6538,7 @@ static int alloc_kick_syncs(void)* can exceed percpu allocator limits on large machines. */ for_each_possible_cpu (cpu) { -struct scx_kick_syncs **ksyncs =per_cpu_ptr (&scx_kick_syncs, cpu); +struct scx_kick_syncs __rcu **ksyncs =per_cpu_ptr (&scx_kick_syncs, cpu);struct scx_kick_syncs *new_ksyncs;WARN_ON_ONCE (rcu_access_pointer (*ksyncs));
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 15/744 arm64: tegra: Fix CPU compatible string to cortex-a78ae on Tegra234
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sumit Gupta <[email protected]>
[ Upstream commit 0dfa1e960f86e032007882b032c5cc7d14ebe73e ]
The Tegra234 SoC uses Cortex-A78AE cores, not Cortex-A78. Update the compatible string for all CPU nodes to match the actual hardware.
Tegra234 hardware reports:
# head /proc/cpuinfo | egrep 'implementer|part' CPU implementer : 0x41 CPU part : 0xd42
Which maps to (from arch/arm64/include/asm/cputype.h):
#define ARM_CPU_IMP_ARM 0x41
#define ARM_CPU_PART_CORTEX_A78AE 0xD42
--- arch/arm64/boot/dts/nvidia/tegra234.dtsi | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
arch/arm64/boot/dts/nvidia/tegra234.dtsi +12 -12
@@ -5339,7 +5339,7 @@ cpus { #size-cells = <0>; cpu0_0: cpu@0 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x00000>;
@@ -5358,7 +5358,7 @@ cpu0_0: cpu@0 { }; cpu0_1: cpu@100 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x00100>;
@@ -5377,7 +5377,7 @@ cpu0_1: cpu@100 { }; cpu0_2: cpu@200 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x00200>;
@@ -5396,7 +5396,7 @@ cpu0_2: cpu@200 { }; cpu0_3: cpu@300 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x00300>;
@@ -5415,7 +5415,7 @@ cpu0_3: cpu@300 { }; cpu1_0: cpu@10000 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x10000>;
@@ -5434,7 +5434,7 @@ cpu1_0: cpu@10000 { }; cpu1_1: cpu@10100 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x10100>;
@@ -5453,7 +5453,7 @@ cpu1_1: cpu@10100 { }; cpu1_2: cpu@10200 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x10200>;
@@ -5472,7 +5472,7 @@ cpu1_2: cpu@10200 { }; cpu1_3: cpu@10300 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x10300>;
@@ -5491,7 +5491,7 @@ cpu1_3: cpu@10300 { }; cpu2_0: cpu@20000 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x20000>;
@@ -5510,7 +5510,7 @@ cpu2_0: cpu@20000 { }; cpu2_1: cpu@20100 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x20100>;
@@ -5529,7 +5529,7 @@ cpu2_1: cpu@20100 { }; cpu2_2: cpu@20200 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x20200>;
@@ -5548,7 +5548,7 @@ cpu2_2: cpu@20200 { }; cpu2_3: cpu@20300 { - compatible = "arm,cortex-a78"; + compatible = "arm,cortex-a78ae"; device_type = "cpu"; reg = <0x20300>;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 16/744 xfrm: propagate -EINPROGRESS from validate_xmit_xfrm()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Wozniak <[email protected]>
[ Upstream commit 6860b467f569f732b11cbc588ae7e195e90e7e23 ]
validate_xmit_xfrm() returns NULL both when a packet is dropped and when it is stolen by async crypto (-EINPROGRESS from ->xmit()). Callers cannot distinguish the two cases.
f53c723902d1 ("net: Add asynchronous callbacks for xfrm on layer 2.") changed the semantics of a NULL return from "dropped" to "stolen or dropped", but __dev_queue_xmit() was not updated. On virtual/bridge interfaces (noqueue qdisc) __dev_queue_xmit() initialises rc=-ENOMEM and jumps to out: when skb is NULL, returning -ENOMEM to the caller even though the packet will be delivered correctly via xfrm_dev_resume().
Return ERR_PTR(-EINPROGRESS) from validate_xmit_xfrm() for the async case so callers can tell it apart from a real drop. Update __dev_queue_xmit() to handle ERR_PTR(-EINPROGRESS) from validate_xmit_skb() correctly. Update validate_xmit_skb_list() to use IS_ERR_OR_NULL() so that ERR_PTR(-EINPROGRESS) is not mistakenly added to the transmitted list.
--- net/core/dev.c | 10 ++++++++-- net/xfrm/xfrm_device.c | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-)
net/core/dev.c +8 -2
@@ -4016,6 +4016,9 @@ static struct sk_buff *validate_xmit_unreadable_skb(struct sk_buff *skb,return NULL ; } +/* Returns the skb on success, NULL if dropped, or ERR_PTR(-EINPROGRESS) +* if stolen by async xfrm crypto (delivered via xfrm_dev_resume()). +*/ static struct sk_buff *validate_xmit_skb (struct sk_buff *skb,struct net_device *dev,bool *again) {netdev_features_t features;
@@ -4087,7 +4090,7 @@ struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *d skb->prev = skb; skb =validate_xmit_skb (skb, dev, again); -if (!skb) +if (IS_ERR_OR_NULL (skb))continue ;if (!head)
@@ -4858,8 +4861,11 @@ int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) goto recursion_alert; skb =validate_xmit_skb (skb, dev, &again); -if (!skb) +if (IS_ERR_OR_NULL (skb)) { +if (PTR_ERR (skb) == -EINPROGRESS ) + rc =NET_XMIT_SUCCESS ; goto out; + }HARD_TX_LOCK (dev, txq, cpu);
net/xfrm/xfrm_device.c +2 -2
@@ -182,7 +182,7 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur err = x->type_offload->xmit (x, skb, esp_features);if (err) {if (err == -EINPROGRESS ) -return NULL ; +return ERR_PTR (-EINPROGRESS );XFRM_INC_STATS (xs_net (x),LINUX_MIB_XFRMOUTSTATEPROTOERROR );kfree_skb (skb);
@@ -224,7 +224,7 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur pskb = skb2; } -return skb; +return skb ? skb :ERR_PTR (-EINPROGRESS ); }EXPORT_SYMBOL_GPL (validate_xmit_xfrm);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 17/744 xfrm: fix stale skb->prev after async crypto steals a GSO segment
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Wozniak <[email protected]>
[ Upstream commit 3f4c3919baf0944ad96580467c302bc6c7758b00 ]
skb_gso_segment() leaves the segment list head with ->prev pointing at the last segment, an invariant validate_xmit_skb_list() relies on when it sets its tail pointer (tail = skb->prev).
When validate_xmit_xfrm() walks a GSO list and some segments are stolen by async crypto (->xmit() returns -EINPROGRESS), those segments are unlinked from the list but the head ->prev is never updated. If the last segment is the one stolen, the returned head still has ->prev pointing at it, even though it is now owned by the crypto engine and may be freed. validate_xmit_skb_list() later does tail->next = skb, writing through that stale pointer -- a use-after-free.
Repoint skb->prev at the last retained segment before returning.
--- net/xfrm/xfrm_device.c | 8 ++++++++ 1 file changed, 8 insertions(+)
net/xfrm/xfrm_device.c +8 -0
@@ -224,6 +224,14 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur pskb = skb2; } +/* skb_gso_segment() set skb->prev to the last segment, but async +* crypto may have stolen it above without updating ->prev. Repoint +* it at the last retained segment so validate_xmit_skb_list() does +* not chain onto a segment now owned by the crypto engine. +*/ +if (skb) + skb->prev = pskb; +return skb ? skb :ERR_PTR (-EINPROGRESS ); }EXPORT_SYMBOL_GPL (validate_xmit_xfrm);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 18/744 firmware: arm_ffa: Respect firmware advertised RX/TX buffer size limits
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Seth Forshee <[email protected]>
[ Upstream commit 53716a4d745f1dac7aff33f3d1494b701eb2f888 ]
FFA_FEATURES reports the minimum size and alignment boundary required for RXTX_MAP. In FF-A v1.2 and later it can also report a maximum buffer size, with zero meaning that no maximum is enforced.
The driver only used the minimum value and then rounded it up to PAGE_SIZE before invoking RXTX_MAP after commit 83210251fd70 ("firmware: arm_ffa:
Use the correct buffer size during RXTX_MAP"). On systems where PAGE_SIZE is larger than the advertised minimum, this can exceed a non-zero maximum reported by firmware. Older implementations do not advertise a maximum and may also reject the rounded-up size.
Decode the maximum size and clamp the page-aligned minimum to it when it is present. If no maximum is advertised and RXTX_MAP rejects the rounded size with INVALID_PARAMETERS, retry with the advertised minimum size. Record drv_info->rxtx_bufsz only after RXTX_MAP succeeds so it reflects the size registered with firmware.
While there, also update RXTX_MAP_MIN_BUFSZ() to use FIELD_GET() for consistency.
(sudeep.holla: Minor rewording subject and commit message)
--- drivers/firmware/arm_ffa/driver.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-)
drivers/firmware/arm_ffa/driver.c +20 -7
@@ -32,6 +32,7 @@#include <linux/interrupt.h> #include <linux/io.h> #include <linux/kernel.h> +#include <linux/minmax.h> #include <linux/module.h> #include <linux/mm.h> #include <linux/mutex.h>
@@ -55,7 +56,9 @@ (FIELD_PREP(SENDER_ID_MASK, (s)) | FIELD_PREP(RECEIVER_ID_MASK, (r)))#define RXTX_MAP_MIN_BUFSZ_MASK GENMASK(1, 0) -#define RXTX_MAP_MIN_BUFSZ (x) ((x) & RXTX_MAP_MIN_BUFSZ_MASK) +#define RXTX_MAP_MAX_BUFSZ_MASK GENMASK(31, 16) +#define RXTX_MAP_MIN_BUFSZ (x) (FIELD_GET(RXTX_MAP_MIN_BUFSZ_MASK, (x))) +#define RXTX_MAP_MAX_BUFSZ (x) (FIELD_GET(RXTX_MAP_MAX_BUFSZ_MASK, (x)))#define FFA_MAX_NOTIFICATIONS 64
@@ -2095,7 +2098,7 @@ static int __init ffa_init(void) {int ret;u32 buf_sz; -size_t rxtx_bufsz =SZ_4K ; +size_t rxtx_min_bufsz =SZ_4K , rxtx_max_bufsz =0 , rxtx_bufsz; ret =ffa_transport_init (&invoke_ffa_fn);if (ret)
@@ -2118,15 +2121,18 @@ static int __init ffa_init(void) ret =ffa_features (FFA_FN_NATIVE (RXTX_MAP ),0 , &buf_sz,NULL );if (!ret) {if (RXTX_MAP_MIN_BUFSZ (buf_sz) ==1 ) - rxtx_bufsz =SZ_64K ; + rxtx_min_bufsz =SZ_64K ;else if (RXTX_MAP_MIN_BUFSZ (buf_sz) ==2 ) - rxtx_bufsz =SZ_16K ; + rxtx_min_bufsz =SZ_16K ;else - rxtx_bufsz =SZ_4K ; + rxtx_min_bufsz =SZ_4K ; + + rxtx_max_bufsz =RXTX_MAP_MAX_BUFSZ (buf_sz) *SZ_4K ; +if (rxtx_max_bufsz !=0 && rxtx_max_bufsz < rxtx_min_bufsz) + rxtx_max_bufsz = rxtx_min_bufsz; } - rxtx_bufsz =PAGE_ALIGN (rxtx_bufsz); - drv_info->rxtx_bufsz = rxtx_bufsz; + rxtx_bufsz =min_not_zero (PAGE_ALIGN (rxtx_min_bufsz), rxtx_max_bufsz); drv_info->rx_buffer =alloc_pages_exact (rxtx_bufsz,GFP_KERNEL );if (!drv_info->rx_buffer) { ret = -ENOMEM ;
@@ -2142,10 +2148,17 @@ static int __init ffa_init(void) ret =ffa_rxtx_map (virt_to_phys (drv_info->tx_buffer),virt_to_phys (drv_info->rx_buffer), rxtx_bufsz /FFA_PAGE_SIZE ); +if (ret == -EINVAL && !rxtx_max_bufsz && rxtx_min_bufsz < rxtx_bufsz) { + rxtx_bufsz = rxtx_min_bufsz; + ret =ffa_rxtx_map (virt_to_phys (drv_info->tx_buffer), +virt_to_phys (drv_info->rx_buffer), + rxtx_bufsz /FFA_PAGE_SIZE ); + }if (ret) {pr_err ("failed to register FFA RxTx buffers\n" ); goto free_pages; } + drv_info->rxtx_bufsz = rxtx_bufsz;mutex_init (&drv_info->rx_lock);mutex_init (&drv_info->tx_lock);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 19/744 IB/mad: Drop unmatched RMPP responses before reassembly
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Bommarito <[email protected]>
[ Upstream commit d2e52d610b9b09694261632340b801a421e0b0c5 ]
Kernel-handled RMPP receive processing starts reassembly for active DATA responses before the response is matched to an outstanding send. The normal match happens later, after ib_process_rmpp_recv_wc() has either assembled a complete message or consumed the segment.
That ordering lets an unsolicited response that routes to a kernel RMPP agent by the high TID bits allocate or extend RMPP receive state before the full TID and source address are checked against a real request. A reordered burst can therefore reach the receive-side insertion path even though the response would not match any send.
For kernel-handled RMPP DATA responses, require the existing ib_find_send_mad() match before entering RMPP reassembly. The matcher already checks the full TID, management class and source address/GID against the agent wait, backlog and in-flight send lists. If there is no match, drop the response without creating RMPP state.
This leaves the RMPP window behavior unchanged and only rejects responses that have no corresponding request.
--- drivers/infiniband/core/mad.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
drivers/infiniband/core/mad.c +30 -0
@@ -2031,6 +2031,24 @@ void ib_mark_mad_done(struct ib_mad_send_wr_private *mad_send_wr)change_mad_state (mad_send_wr,IB_MAD_STATE_EARLY_RESP ); } +static bool is_kernel_rmpp_data_response (struct ib_mad_agent_private *agent, +struct ib_mad_recv_wc *mad_recv_wc) +{ +const struct ib_mad_hdr *mad_hdr = &mad_recv_wc->recv_buf.mad->mad_hdr; +struct ib_rmpp_mad *rmpp_mad; + +if (!ib_mad_kernel_rmpp_agent (&agent->agent) || + !ib_response_mad (mad_hdr) || + !ib_is_mad_class_rmpp (mad_hdr->mgmt_class)) +return false; + + rmpp_mad = (struct ib_rmpp_mad *)mad_recv_wc->recv_buf.mad; + +return (ib_get_rmpp_flags (&rmpp_mad->rmpp_hdr) & +IB_MGMT_RMPP_FLAG_ACTIVE ) && + rmpp_mad->rmpp_hdr.rmpp_type ==IB_MGMT_RMPP_TYPE_DATA ; +} +static void ib_mad_complete_recv (struct ib_mad_agent_private *mad_agent_priv,struct ib_mad_recv_wc *mad_recv_wc) {
@@ -2050,6 +2068,18 @@ static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv, }list_add (&mad_recv_wc->recv_buf.list, &mad_recv_wc->rmpp_list); +if (is_kernel_rmpp_data_response (mad_agent_priv, mad_recv_wc)) { +spin_lock_irqsave (&mad_agent_priv->lock, flags); + mad_send_wr =ib_find_send_mad (mad_agent_priv, mad_recv_wc); +spin_unlock_irqrestore (&mad_agent_priv->lock, flags); + +if (!mad_send_wr) { +ib_free_recv_mad (mad_recv_wc); +deref_mad_agent (mad_agent_priv); +return ; + } + } +if (ib_mad_kernel_rmpp_agent (&mad_agent_priv->agent)) { mad_recv_wc =ib_process_rmpp_recv_wc (mad_agent_priv, mad_recv_wc);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 20/744 mtd: virt_concat: fix use-after-free in mtd_virt_concat_destroy_joins()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harshit Mogalapalli <[email protected]>
[ Upstream commit 75c0c09541b49daa08fddbc2c18c2232f4eab7d8 ]
mtd_concat_destroy() frees item->concat so calling mtd_virt_concat_put_mtd_devices(item->concat) leads to a use after free.
Fix this by moving mtd_virt_concat_put_mtd_devices() before mtd_concat_destroy()
--- drivers/mtd/mtd_virt_concat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/mtd_virt_concat.c +1 -1
@@ -75,8 +75,8 @@ void mtd_virt_concat_destroy_joins(void)if (item->concat) {mtd_device_unregister (mtd);kfree (mtd->name); -mtd_concat_destroy (mtd);mtd_virt_concat_put_mtd_devices (item->concat); +mtd_concat_destroy (mtd); } } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 21/744 mtd: virt_concat: fix use-after-free in mtd_virt_concat_destroy()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harshit Mogalapalli <[email protected]>
[ Upstream commit 4b45d7836b9526b8776af5f29219615be9417230 ]
mtd_concat_destroy() frees item->concat so calling mtd_virt_concat_put_mtd_devices(item->concat) after that leads to a use-after-free.
Fix it by moving mtd_virt_concat_put_mtd_devices() before mtd_concat_destroy().
--- drivers/mtd/mtd_virt_concat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/mtd_virt_concat.c +1 -1
@@ -126,8 +126,8 @@ int mtd_virt_concat_destroy(struct mtd_info *mtd)if (concat->mtd.name) {del_mtd_device (&concat->mtd);kfree (concat->mtd.name); -mtd_concat_destroy (&concat->mtd);mtd_virt_concat_put_mtd_devices (item->concat); +mtd_concat_destroy (&concat->mtd); }for (idx =0 ; idx < item->count; idx++)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 22/744 mtd: mtdswap: remove debugfs stats file on teardown
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengpeng Hou <[email protected]>
[ Upstream commit 66fb31358108d10245b9e4ef0eef3e7d9747055e ]
mtdswap_add_debugfs() creates an mtdswap_stats debugfs file under the per-MTD debugfs directory, but mtdswap_remove_dev() never removes it before freeing the mtdswap_dev.
Store the returned dentry and remove it during device teardown before the driver-private state is freed.
--- drivers/mtd/mtdswap.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/mtd/mtdswap.c +4 -1
@@ -125,6 +125,7 @@ struct mtdswap_dev {char *page_buf;char *oob_buf; +struct dentry *debugfs_stats; };struct mtdswap_oobdata {
@@ -1262,7 +1263,8 @@ static int mtdswap_add_debugfs(struct mtdswap_dev *d)if (IS_ERR_OR_NULL (root))return -1 ; -debugfs_create_file ("mtdswap_stats" ,S_IRUSR , root, d, &mtdswap_fops); + d->debugfs_stats =debugfs_create_file ("mtdswap_stats" ,0400 , root, + d, &mtdswap_fops);return 0 ; }
@@ -1463,6 +1465,7 @@ static void mtdswap_remove_dev(struct mtd_blktrans_dev *dev) {struct mtdswap_dev *d =MTDSWAP_MBD_TO_MTDSWAP (dev); +debugfs_remove (d->debugfs_stats);del_mtd_blktrans_dev (dev);mtdswap_cleanup (d);kfree (d);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 23/744 mtd: nand: mtk-ecc: stop on ECC idle timeouts
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengpeng Hou <[email protected]>
[ Upstream commit 16f7ec8d5dc100eafd2c8e06cd30340a30b104a1 ]
mtk_ecc_wait_idle() logs when the encoder or decoder does not become idle, but returns void. Callers can therefore configure a non-idle ECC engine or read parity bytes after an unconfirmed encoder idle state.
Return the idle poll result and propagate it from the enable and encode paths that require the engine to be idle before continuing.
--- drivers/mtd/nand/ecc-mtk.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/mtd/nand/ecc-mtk.c +12 -4
@@ -123,8 +123,8 @@ static int mt7622_ecc_regs[] = { [ECC_DECIRQ_STA] = 0x144, }; -static inline void mtk_ecc_wait_idle (struct mtk_ecc *ecc, -enum mtk_ecc_operation op) +static inline int mtk_ecc_wait_idle (struct mtk_ecc *ecc, +enum mtk_ecc_operation op) {struct device *dev = ecc->dev;u32 val;
@@ -136,6 +136,8 @@ static inline void mtk_ecc_wait_idle(struct mtk_ecc *ecc,if (ret)dev_warn (dev,"%s NOT idle\n" , op ==ECC_ENCODE ?"encoder" :"decoder" ); + +return ret; }static irqreturn_t mtk_ecc_irq (int irq,void *id)
@@ -312,7 +314,11 @@ int mtk_ecc_enable(struct mtk_ecc *ecc, struct mtk_ecc_config *config)return ret; } -mtk_ecc_wait_idle (ecc, op); + ret =mtk_ecc_wait_idle (ecc, op); +if (ret) { +mutex_unlock (&ecc->lock); +return ret; + } ret =mtk_ecc_config (ecc, config);if (ret) {
@@ -412,7 +418,9 @@ int mtk_ecc_encode(struct mtk_ecc *ecc, struct mtk_ecc_config *config,if (ret) goto timeout; -mtk_ecc_wait_idle (ecc,ECC_ENCODE ); + ret =mtk_ecc_wait_idle (ecc,ECC_ENCODE ); +if (ret) + goto timeout;/* Program ECC bytes to OOB: per sector oob = FDM + ECC + SPARE */ len = (config->strength * ecc->caps->parity_bits +7 ) >>3 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 24/744 btrfs: reject free space cache with more entries than pages
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit a2d8d5647ed854e38f941741aea45b9eb15a6350 ]
When loading a v1 free space cache, __load_free_space_cache() takes num_entries and num_bitmaps straight from the on-disk btrfs_free_space_header. That header is stored in the tree_root under a key with type 0, which the tree-checker has no case for, so neither count is validated before the load trusts it.
The load loops num_entries times and maps the next page whenever the current one runs out, going through io_ctl_check_crc() -> io_ctl_map_page(), which does io_ctl->pages[io_ctl->index++]. But pages[] is allocated in io_ctl_init() from the cache inode's i_size, not from num_entries:
num_pages = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); io_ctl->pages = kcalloc(num_pages, sizeof(struct page *), GFP_NOFS);
So if num_entries claims more records than the pages can hold, io_ctl->index runs off the end of pages[]. The write side never hits this because io_ctl_add_entry() and io_ctl_add_bitmap() both stop once io_ctl->index >= io_ctl->num_pages; the read side just never had the same check.
To trigger it, take a clean cache (num_entries = <N> here), set num_entries in the header to 0x10000, and fix up the leaf checksum so it still passes the tree-checker. The cache inode has i_size = 65536, so num_pages is 16 and pages[] is a 16-pointer (kmalloc-128) array. The load now tries to read 65536 entries, io_ctl->index walks up to 16, and pages[16] is read past the array:
BUG: KASAN: slab-out-of-bounds in io_ctl_check_crc (fs/btrfs/free-space-cache.c:420 fs/btrfs/free-space-cache.c:565) Read of size 8 at addr ffff88800c833a80 by task kworker/u8:3/58 io_ctl_check_crc (fs/btrfs/free-space-cache.c:420 fs/btrfs/free-space-cache.c:565) __load_free_space_cache (fs/btrfs/free-space-cache.c:655 fs/btrfs/free-space-cache.c:820) load_free_space_cache (fs/btrfs/free-space-cache.c:1017) caching_thread (fs/btrfs/block-group.c:880) btrfs_work_helper (fs/btrfs/async-thread.c:312) process_one_work worker_thread kthread ret_from_fork
free-space-cache.c:420 is io_ctl_map_page(), inlined into io_ctl_check_crc() at line 565, which is why that is the frame KASAN names. The out-of-bounds slot is then treated as a struct page and handed to crc32c(), so the bad read turns into a GP fault.
Add the missing check to io_ctl_check_crc(), which is where both the entry loop and the bitmap loop end up. When num_entries is too large the load now fails like any corrupt cache: __load_free_space_cache() drops it and rebuilds the free space from the extent tree, so a valid cache is never rejected.
--- fs/btrfs/free-space-cache.c | 3 +++ 1 file changed, 3 insertions(+)
fs/btrfs/free-space-cache.c +3 -0
@@ -555,6 +555,9 @@ static int io_ctl_check_crc(struct btrfs_io_ctl *io_ctl, int index)u32 crc = ~(u32 )0 ;unsigned offset =0 ; +if (index >= io_ctl->num_pages) +return -EIO ; +if (index ==0 ) offset =sizeof (u32) * io_ctl->num_pages;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 25/744 btrfs: fix root leak if its reloc root is unexpected in merge_reloc_roots()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
[ Upstream commit ce6050bafb4e33377dc17fcc357736bfc351180c ]
If we have an unexpected reloc_root for our root, we jump to the out label but never drop the reference we obtained for root, resulting in a leak. Add a missing btrfs_put_root() call.
--- fs/btrfs/relocation.c | 1 + 1 file changed, 1 insertion(+)
fs/btrfs/relocation.c +1 -0
@@ -1850,6 +1850,7 @@ void merge_reloc_roots(struct reloc_control *rc)* corruption, e.g. bad reloc tree key offset. */ ret = -EINVAL ; +btrfs_put_root (root); goto out; } ret =merge_reloc_root (rc, root);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 26/744 btrfs: fallback to transaction csum tree on a commit root csum miss
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Burkov <[email protected]>
[ Upstream commit 3dcd50730814e5220072d2b26d0587af6bfb6dbe ]
We have been running with commit root csums enabled for some time and have noticed a slight uptick in zero csum errors. Investigating those revealed that they were same transaction reads of extents that were just relocated, but the extent map generation was long ago.
It turns out that relocation intentionally does not update the extent generation (replace_file_extents()), but must write a new csum since the data has moved, so we must account for this with commit root csum reading.
Luckily this is a short lived condition: after the relocation transaction the commit root will once again have the csum. So we can add a generic fallback to the lookup to try again with the transaction csum root.
--- fs/btrfs/file-item.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
fs/btrfs/file-item.c +25 -1
@@ -356,6 +356,7 @@ int btrfs_lookup_bio_sums(struct btrfs_bio *bbio)const unsigned int nblocks = orig_len >> fs_info->sectorsize_bits;int ret =0 ;u32 bio_offset =0 ; +bool using_commit_root = false;if ((inode->flags &BTRFS_INODE_NODATASUM ) ||test_bit (BTRFS_FS_STATE_NO_DATA_CSUMS , &fs_info->fs_state))
@@ -429,6 +430,7 @@ int btrfs_lookup_bio_sums(struct btrfs_bio *bbio)* from across transactions. */ if (bbio->csum_search_commit_root) { + using_commit_root = true; path->search_commit_root = true; path->skip_locking = true;down_read (&fs_info->commit_root_sem);
@@ -461,6 +463,28 @@ int btrfs_lookup_bio_sums(struct btrfs_bio *bbio)* assume this is the case. */ if (count ==0 ) { +/* +* If an extent is relocated in the current transaction +* then relocation writes a new csum without updating +* the extent map generation. Until the next commit, we +* will see a hole in that case, so we need to fallback +* to searching the transaction csum root. +* +* Note that a commit root lookup of a referenced extent can +* only miss, not return a stale csum. A freed extent's csum +* is deleted in the same transaction and its bytenr is not +* reusable until that transaction has committed and the +* extent is unpinned. +*/ +if (using_commit_root) { +up_read (&fs_info->commit_root_sem); + using_commit_root = false; + path->search_commit_root = false; + path->skip_locking = false; +btrfs_release_path (path); +continue ; + } +memset (csum_dst,0 , csum_size); count =1 ;
@@ -479,7 +503,7 @@ int btrfs_lookup_bio_sums(struct btrfs_bio *bbio) bio_offset += count * sectorsize; } -if (bbio->csum_search_commit_root) +if (using_commit_root)up_read (&fs_info->commit_root_sem);return ret; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 27/744 firmware: arm_ffa: Fix NULL dereference in ffa_partition_info_get()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Unnathi Chalicheemala <[email protected]>
[ Upstream commit 8ae5f8e4836667fcaffdf2e3c6068b0a8b364dd8 ]
ffa_partition_info_get() passes uuid_str directly to uuid_parse() without a NULL check. When a caller passes NULL, uuid_parse() -> __uuid_parse() -> uuid_is_valid() dereferences the pointer, causing a kernel panic:
| Unable to handle kernel NULL pointer dereference at virtual address | 0000000000000040 | pc : uuid_parse+0x40/0xac | lr : ffa_partition_info_get+0x1c/0x94 [arm_ffa]
Add a NULL guard before uuid_parse() so a NULL argument returns -ENODEV instead of crashing. Callers are expected to always supply a valid partition UUID, so NULL is not a supported input.
--- drivers/firmware/arm_ffa/driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/firmware/arm_ffa/driver.c +1 -1
@@ -1137,7 +1137,7 @@ static int ffa_partition_info_get(const char *uuid_str,uuid_t uuid;struct ffa_partition_info *pbuf; -if (uuid_parse (uuid_str, &uuid)) { +if (!uuid_str ||uuid_parse (uuid_str, &uuid)) {pr_err ("invalid uuid (%s)\n" , uuid_str);return -ENODEV ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 28/744 sched_ext: Dont warn on core-sched forced idle in put_prev_task_scx()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
[ Upstream commit b7d9c359e5cf867f7eb23df3bb1c6b9e58af24da ]
put_prev_task_scx() warns when a runnable task drops to a lower sched_class without SCX_OPS_ENQ_LAST, on the assumption that balance_one() would have kept it running. Core scheduling breaks that: a forced-idle SMT sibling reschedules through the core_pick fast path in pick_next_task(), which skips pick_task_scx() and thus balance_one(), so a runnable task can drop to idle with ENQ_LAST unset.
Gate the warning on sched_cpu_cookie_match(): a cookie mismatch means core scheduling forced the idle, while a match (or core scheduling off) still catches a genuine missing-ENQ_LAST drop.
--- kernel/sched/ext.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
kernel/sched/ext.c +6 -1
@@ -3097,9 +3097,14 @@ static void put_prev_task_scx(struct rq *rq, struct task_struct *p,* sched_class, %SCX_OPS_ENQ_LAST must be set. Tell * ops.enqueue() that @p is the only one available for this cpu, * which should trigger an explicit follow-up scheduling event. +* +* Core scheduling can force this CPU idle while @p stays +* runnable. @p's cookie then won't match the core's, so skip +* the warning in that case. */ if (next &&sched_class_above (&ext_sched_class, next->sched_class)) { -WARN_ON_ONCE (!(sch->ops.flags &SCX_OPS_ENQ_LAST )); +WARN_ON_ONCE (sched_cpu_cookie_match (rq, p) && + !(sch->ops.flags &SCX_OPS_ENQ_LAST ));do_enqueue_task (rq, p,SCX_ENQ_LAST ,-1 ); }else {do_enqueue_task (rq, p,0 ,-1 );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 29/744 reset: spacemit: k3: fix USB2 ahb reset
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yixun Lan <[email protected]>
[ Upstream commit 1ca22c6aa006b05143367268066fb74e32cfe66b ]
According to SpacemiT K3's updated docs, the USB2 ahb reset and USB2 bus clock enable bit was wrongly swapped, the correct one should be:
Register : APMU_USB_CLK_RES_CTRL
bit[1] : usb2_port_bus_clk_en
bit[0] : usb2_port_ahb_rstn
--- drivers/reset/spacemit/reset-spacemit-k3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/reset/spacemit/reset-spacemit-k3.c +1 -1
@@ -112,7 +112,7 @@ static const struct ccu_reset_data k3_apmu_resets[] = { [RESET_APMU_SDH0] = RESET_DATA(APMU_SDH0_CLK_RES_CTRL, 0, BIT(1)), [RESET_APMU_SDH1] = RESET_DATA(APMU_SDH1_CLK_RES_CTRL, 0, BIT(1)), [RESET_APMU_SDH2] = RESET_DATA(APMU_SDH2_CLK_RES_CTRL, 0, BIT(1)), - [RESET_APMU_USB2_AHB] = RESET_DATA(APMU_USB_CLK_RES_CTRL, 0, BIT(1)), + [RESET_APMU_USB2_AHB] = RESET_DATA(APMU_USB_CLK_RES_CTRL, 0, BIT(0)), [RESET_APMU_USB2_VCC] = RESET_DATA(APMU_USB_CLK_RES_CTRL, 0, BIT(2)), [RESET_APMU_USB2_PHY] = RESET_DATA(APMU_USB_CLK_RES_CTRL, 0, BIT(3)), [RESET_APMU_USB3_A_AHB] = RESET_DATA(APMU_USB_CLK_RES_CTRL, 0, BIT(5)),
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 30/744 xfrm: fix sk_dst_cache double-free in xfrm_user_policy()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei (Microsoft) <[email protected]>
[ Upstream commit c283e9ada7fcb7dd4b10592623086b2e6d2f9925 ]
xfrm_user_policy() clears the socket dst cache with __sk_dst_reset(), i.e. the non-atomic __sk_dst_set(sk, NULL): it reads sk_dst_cache with rcu_dereference_protected(), stores NULL and dst_release()s the old dst. That is only safe if no other thread modifies sk_dst_cache concurrently.
For a connected UDP socket that does not hold: the transmit fast path (udp_sendmsg -> sk_dst_check -> sk_dst_reset) resets the cache locklessly with an atomic xchg(). A per-socket policy change racing a send can make both sides observe the same old dst and each dst_release() it, dropping the socket's single reference twice and freeing the xfrm_dst bundle while it is still referenced:
BUG: KASAN: slab-use-after-free in dst_release Write of size 4 at addr ffff88801897b6c0 by task exploit/155 Call Trace: ... dst_release (... ./include/linux/rcuref.h:109) xfrm_user_policy (./include/net/sock.h:2239 ./include/net/sock.h:2256 net/xfrm/xfrm_state.c:3053) do_ip_setsockopt (net/ipv4/ip_sockglue.c:1347) ip_setsockopt (net/ipv4/ip_sockglue.c:1417) do_sock_setsockopt (net/socket.c:2368) __sys_setsockopt (net/socket.c:2393) __x64_sys_setsockopt (net/socket.c:2396) do_syscall_64 (arch/x86/entry/syscall_64.c:94) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
Reachable by an unprivileged user via a user+network namespace.
Use the atomic sk_dst_reset() so the cache is cleared and released with a single xchg(): whichever side wins releases the dst once, the other sees NULL and does nothing. Behaviour is otherwise unchanged.
--- net/xfrm/xfrm_state.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/xfrm/xfrm_state.c +2 -2
@@ -2973,7 +2973,7 @@ int xfrm_user_policy(struct sock *sk, int optname, sockptr_t optval, int optlen)if (sockptr_is_null (optval) && !optlen) {xfrm_sk_policy_insert (sk,XFRM_POLICY_IN ,NULL );xfrm_sk_policy_insert (sk,XFRM_POLICY_OUT ,NULL ); -__sk_dst_reset (sk); +sk_dst_reset (sk);return 0 ; }
@@ -3013,7 +3013,7 @@ int xfrm_user_policy(struct sock *sk, int optname, sockptr_t optval, int optlen)if (err >=0 ) {xfrm_sk_policy_insert (sk, err, pol);xfrm_pol_put (pol); -__sk_dst_reset (sk); +sk_dst_reset (sk); err =0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 31/744 xfrm: reject optional IPTFS templates in outbound policies
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antony Antony <[email protected]>
[ Upstream commit ea528f18231ec0f33317be57f8866913b19aba6e ]
syzbot reported a stack-out-of-bounds read in xfrm_state_find() which flows from xfrm_tmpl_resolve_one().
Commit 3d776e31c841 ("xfrm: Reject optional tunnel/BEET mode templates in outbound policies") disallowed optional tunnel and BEET in outbound policies to prevent this. Later when IPTFS added, it was not covered by that fix and can still trigger the out-of-bounds read;
Extend the check to disallow optional IPTFS in outbound policies as well. IPTFS should be identical to tunnel mode.
IN and FWD policies are not affected: xfrm_tmpl_resolve_one() is only reachable via the outbound path.
Reproducer, before:
ip link add dummy0 type dummy
ip link set dummy0 up
ip addr add 10.1.1.1/24 dev dummy0
ip xfrm policy add src 10.1.1.1/32 dst 10.1.1.2/32 dir out tmpl
src fc00::dead:1 dst fc00::dead:2 proto esp reqid 1 mode iptfs level use tmpl src fc00::dead:1 dst fc00::dead:2 proto esp reqid 2 mode transport
ping -W 1 -c 1 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
[ 64.168420] ================================================================== [ 64.169977] BUG: KASAN: stack-out-of-bounds in __xfrm6_addr_hash+0x11e/0x170 [ 64.169977] Read of size 4 at addr ffff88800e1ffd20 by task ping/2844
[ 64.169977] CPU: 2 UID: 0 PID: 2844 Comm: ping Not tainted 7.1.0-rc7-00180-geb23b588430a #98 PREEMPT(full) [ 64.169977] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 64.169977] Call Trace: [ 64.169977] <TASK> [ 64.169977] dump_stack_lvl+0x47/0x70 [ 64.169977] ? __xfrm6_addr_hash+0x11e/0x170 [ 64.169977] print_report+0x152/0x4b0 [ 64.169977] ? ksys_mmap_pgoff+0x6d/0xa0 [ 64.169977] ? entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 64.169977] ? rcu_read_unlock_sched+0xa/0x20 [ 64.169977] ? __virt_addr_valid+0x21b/0x230 [ 64.169977] ? __xfrm6_addr_hash+0x11e/0x170 [ 64.169977] kasan_report+0xa8/0xd0 [ 64.169977] ? __xfrm6_addr_hash+0x11e/0x170 [ 64.169977] __xfrm6_addr_hash+0x11e/0x170 [ 64.169977] __xfrm_dst_hash+0x24/0xc0 [ 64.169977] xfrm_state_find+0xa2d/0x2f90 [ 64.169977] ? __pfx_xfrm_state_find+0x10/0x10 [ 64.169977] ? __pfx_ftrace_graph_ret_addr+0x10/0x10 [ 64.169977] ? __pfx_ftrace_graph_ret_addr+0x10/0x10 [ 64.169977] xfrm_tmpl_resolve_one+0x210/0x570 [ 64.169977] ? __pfx_xfrm_tmpl_resolve_one+0x10/0x10 [ 64.169977] ? __pfx_stack_trace_consume_entry+0x10/0x10 [ 64.169977] ? kernel_text_address+0x5b/0x80 [ 64.169977] ? __kernel_text_address+0xe/0x30 [ 64.169977] ? unwind_get_return_address+0x5e/0x90 [ 64.169977] ? arch_stack_walk+0x8c/0xe0 [ 64.169977] xfrm_tmpl_resolve+0x130/0x200 [ 64.169977] ? __pfx_xfrm_tmpl_resolve+0x10/0x10 [ 64.169977] ? __pfx_xfrm_policy_inexact_lookup_rcu+0x10/0x10 [ 64.169977] ? __refcount_add_not_zero.constprop.0+0xb2/0x110 [ 64.169977] ? __pfx___refcount_add_not_zero.constprop.0+0x10/0x10 [ 64.169977] xfrm_resolve_and_create_bundle+0xd5/0x310 [ 64.169977] ? __pfx_xfrm_resolve_and_create_bundle+0x10/0x10 [ 64.169977] ? __pfx_xfrm_policy_lookup_bytype+0x10/0x10 [ 64.169977] ? __pfx_xfrm_policy_lookup_bytype+0x10/0x10 [ 64.169977] xfrm_lookup_with_ifid+0x3d8/0xb80 [ 64.169977] ? __pfx_xfrm_lookup_with_ifid+0x10/0x10 [ 64.169977] ? ip_route_output_key_hash+0xc6/0x110 [ 64.169977] ? kasan_save_track+0x10/0x30 [ 64.169977] xfrm_lookup_route+0x18/0xe0 [ 64.169977] ip4_datagram_release_cb+0x4c9/0x530 [ 64.169977] ? __pfx_ip4_datagram_release_cb+0x10/0x10 [ 64.169977] ? do_raw_spin_lock+0x71/0xc0 [ 64.169977] ? __pfx_do_raw_spin_lock+0x10/0x10 [ 64.169977] release_sock+0xb0/0x170 [ 64.169977] udp_connect+0x43/0x50 [ 64.169977] __sys_connect+0xa6/0x100 [ 64.169977] ? alloc_fd+0x2e9/0x300 [ 64.169977] ? __pfx___sys_connect+0x10/0x10 [ 64.169977] ? preempt_latency_start+0x1f/0x70 [ 64.169977] ? fd_install+0x7e/0x150 [ 64.169977] ? rcu_read_unlock_sched+0xa/0x20 [ 64.169977] ? __sys_socket+0xdf/0x130 [ 64.169977] ? __pfx___sys_socket+0x10/0x10 [ 64.169977] ? vma_refcount_put+0x43/0xa0 [ 64.169977] __x64_sys_connect+0x7e/0x90 [ 64.169977] do_syscall_64+0x11b/0x2b0 [ 64.169977] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 64.169977] RIP: 0033:0x7f4851ecb570 [ 64.169977] Code: 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 80 3d f9 ca 0d 00 00 74 17 b8 2a 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 58 c3 0f 1f 80 00 00 00 00 48 83 ec 18 89 54 [ 64.169977] RSP: 002b:00007ffc830e3498 EFLAGS: 00000202 ORIG_RAX: 000000000000002a [ 64.169977] RAX: ffffffffffffffda RBX: 00007ffc830e34d0 RCX: 00007f4851ecb570 [ 64.169977] RDX: 0000000000000010 RSI: 00007ffc830e34d0 RDI: 0000000000000005 [ 64.169977] RBP: 0000000000000000 R08: 0000000000000003 R09: 0000000000000000 [ 64.169977] R10: 0000000000000006 R11: 0000000000000202 R12: 0000000000000005 [ 64.169977] R13: 0000000000000000 R14: 00005619a863f340 R15: 0000000000000000 [ 64.169977] </TASK>
[ 64.169977] The buggy address belongs to stack of task ping/2844 [ 64.169977] and is located at offset 88 in frame: [ 64.169977] ip4_datagram_release_cb+0x0/0x530
[ 64.169977] This frame has 1 object: [ 64.169977] [32, 88) 'fl4'
[ 64.169977] The buggy address belongs to the physical page: [ 64.169977] page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0xe1ff [ 64.169977] flags: 0x4000000000000000(zone=1) [ 64.169977] raw: 4000000000000000 0000000000000000 ffffea0000387fc8 0000000000000000 [ 64.169977] raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000 [ 64.169977] page dumped because: kasan: bad access detected
[ 64.169977] Memory state around the buggy address: [ 64.169977] ffff88800e1ffc00: f2 f2 00 00 f3 f3 00 00 00 00 00 00 00 00 00 00 [ 64.169977] ffff88800e1ffc80: 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1 00 00 00 [ 64.169977] >ffff88800e1ffd00: 00 00 00 00 f3 f3 f3 f3 f3 00 00 00 00 00 00 00 [ 64.169977] ^ [ 64.169977] ffff88800e1ffd80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1 [ 64.169977] ffff88800e1ffe00: f1 f1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 64.169977] ================================================================== [ 64.245153] Disabling lock debugging due to kernel taint
After the fix:
ip xfrm policy add src 10.1.1.1/32 dst 10.1.1.2/32 dir out tmpl \
src fc00::dead:1 dst fc00::dead:2 proto esp reqid 1 mode iptfs \
level use tmpl src fc00::dead:1 dst fc00::dead:2 proto esp reqid 2 \
mode transport
Error: Mode in optional template not allowed in outbound policy.
--- net/xfrm/xfrm_user.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/xfrm/xfrm_user.c +1 -2
@@ -2077,13 +2077,12 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family,switch (ut[i].mode) {case XFRM_MODE_TUNNEL :case XFRM_MODE_BEET : +case XFRM_MODE_IPTFS :if (ut[i].optional && dir ==XFRM_POLICY_OUT ) {NL_SET_ERR_MSG (extack,"Mode in optional template not allowed in outbound policy" );return -EINVAL ; }break ; -case XFRM_MODE_IPTFS : -break ;default :if (ut[i].family != prev_family) {NL_SET_ERR_MSG (extack,"Mode in template doesn't support a family change" );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 32/744 RDMA/cma: Fix hardware address comparison length in netevent callback
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Or Gerlitz <[email protected]>
[ Upstream commit 18313833e2c6de222a4f6c072da759d0d5888528 ]
The cited commit hardcoded the hardware address comparison len to ETH_ALEN.
This breaks IPoIB, which uses 20-byte addresses. By truncating the memcmp, the CMA may incorrectly assume the target address is unchanged and fails to abort the stalled connection.
Fix this by replacing ETH_ALEN with the dynamic neigh->dev->addr_len to correctly evaluate the full address regardless of the link layer.
--- drivers/infiniband/core/cma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/core/cma.c +1 -1
@@ -5270,7 +5270,7 @@ static int cma_netevent_callback(struct notifier_block *self,list_for_each_entry (current_id, &ips_node->id_list, id_list_entry) {if (!memcmp (current_id->id.route.addr.dev_addr.dst_dev_addr, - neigh->ha,ETH_ALEN )) + neigh->ha, neigh->dev->addr_len))continue ;cma_id_get (current_id);if (!queue_work (cma_wq, ¤t_id->id.net_work))
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 33/744 RDMA/irdma: Prevent rereg_mr for non-mem regions
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Moroni <[email protected]>
[ Upstream commit a846aecb931b4d65d5eafa92a0623545af46d4f2 ]
When a QP/CQ/SRQ is created, a two step process is used where the buffer is allocated in userspace and explicitly registered with the normal reg_mr mechanism prior to creating the actual QP/CQ/SRQ object.
These special registrations are indicated via an ABI field so the driver knows that they do not have a valid mkey and to skip the actual CQP command submission.
Since these are real MR objects from the core's perspective, it is possible for a user application to invoke rereg_mr on them and cause a real CQP op to be emitted with the zero-initialized mkey value of 0.
Fix this by preventing rereg_mr on these special regions.
--- drivers/infiniband/hw/irdma/verbs.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/hw/irdma/verbs.c +3 -0
@@ -3810,6 +3810,9 @@ static struct ib_mr *irdma_rereg_user_mr(struct ib_mr *ib_mr, int flags,if (flags & ~(IB_MR_REREG_TRANS |IB_MR_REREG_PD |IB_MR_REREG_ACCESS ))return ERR_PTR (-EOPNOTSUPP ); +if (iwmr->type !=IRDMA_MEMREG_TYPE_MEM ) +return ERR_PTR (-EINVAL ); + ret =ib_umem_check_rereg (iwmr->region, flags, new_access);if (ret)return ERR_PTR (ret);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 34/744 RDMA/irdma: Remove redundant legacy_mode checks
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Moroni <[email protected]>
[ Upstream commit ed8621be482bf18dcd217aa024e95758bf9d28f2 ]
The driver has the following invariants:
1. legacy_mode is only allowed on GEN_1 hardware (enforced in irdma_alloc_ucontext).
2. GEN_1 hardware does not set IRDMA_FEATURE_CQ_RESIZE or IRDMA_FEATURE_RTS_AE. These feature flags are only set for GEN_2 and GEN_3 hardware.
Therefore, legacy_mode is always false if IRDMA_FEATURE_CQ_RESIZE or IRDMA_FEATURE_RTS_AE is set, so remove the redundant checks.
Stable-dep-of: b9b088907156 ("RDMA/irdma: Prevent user-triggered null deref on QP create")
--- drivers/infiniband/hw/irdma/uk.c | 9 +++------ drivers/infiniband/hw/irdma/user.h | 1 - drivers/infiniband/hw/irdma/verbs.c | 7 +------ 3 files changed, 4 insertions(+), 13 deletions(-)
drivers/infiniband/hw/irdma/uk.c +3 -6
@@ -1568,15 +1568,12 @@ static const struct irdma_wqe_uk_ops iw_wqe_uk_ops_gen_1 = {* irdma_setup_connection_wqes - setup WQEs necessary to complete * connection. * @qp: hw qp (user and kernel) -* @info: qp initialization info */ -static void irdma_setup_connection_wqes (struct irdma_qp_uk *qp, -struct irdma_qp_uk_init_info *info) +static void irdma_setup_connection_wqes (struct irdma_qp_uk *qp) {u16 move_cnt =1 ; -if (!info->legacy_mode && - (qp->uk_attrs->feature_flags &IRDMA_FEATURE_RTS_AE )) +if (qp->uk_attrs->feature_flags &IRDMA_FEATURE_RTS_AE ) move_cnt =3 ; qp->conn_wqes = move_cnt;
@@ -1727,7 +1724,7 @@ int irdma_uk_qp_init(struct irdma_qp_uk *qp, struct irdma_qp_uk_init_info *info) sq_ring_size = qp->sq_size << info->sq_shift;IRDMA_RING_INIT (qp->sq_ring, sq_ring_size);if (info->first_sq_wq) { -irdma_setup_connection_wqes (qp, info); +irdma_setup_connection_wqes (qp); qp->swqe_polarity =1 ; qp->first_sq_wq = true; }else {
drivers/infiniband/hw/irdma/user.h +0 -1
@@ -563,7 +563,6 @@ struct irdma_qp_uk_init_info {u8 sq_shift;u8 rq_shift;int abi_ver; -bool legacy_mode;struct irdma_srq_uk *srq_uk; };
drivers/infiniband/hw/irdma/verbs.c +1 -6
@@ -634,7 +634,6 @@ static int irdma_setup_umode_qp(struct ib_udata *udata, iwqp->ctx_info.qp_compl_ctx = req.user_compl_ctx; iwqp->user_mode =1 ;if (req.user_wqe_bufs) { - info->qp_uk_init_info.legacy_mode = ucontext->legacy_mode;spin_lock_irqsave (&ucontext->qp_reg_mem_list_lock, flags); iwqp->iwpbl =irdma_get_pbl ((unsigned long )req.user_wqe_bufs, &ucontext->qp_reg_mem_list);
@@ -2074,10 +2073,6 @@ static int irdma_resize_cq(struct ib_cq *ibcq, unsigned int entries, rdma_udata_to_drv_context(udata, struct irdma_ucontext, ibucontext); -/* CQ resize not supported with legacy GEN_1 libi40iw */ -if (ucontext->legacy_mode) -return -EOPNOTSUPP ; -if (ib_copy_from_udata (&req, udata,min (sizeof (req), udata->inlen)))return -EINVAL ;
@@ -2559,7 +2554,7 @@ static int irdma_create_cq(struct ib_cq *ibcq, cqmr = &iwpbl->cq_mr;if (rf->sc_dev.hw_attrs.uk_attrs.feature_flags & -IRDMA_FEATURE_CQ_RESIZE && !ucontext->legacy_mode) { +IRDMA_FEATURE_CQ_RESIZE ) {spin_lock_irqsave (&ucontext->cq_reg_mem_list_lock, flags); iwpbl_shadow = irdma_get_pbl( (unsigned long)req.user_shadow_area,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 35/744 RDMA/irdma: Prevent user-triggered null deref on QP create
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Moroni <[email protected]>
[ Upstream commit b9b0889071569d43623c260074e159cd8f26adb1 ]
Previously, the user QP creation path would only attempt to populate iwqp->iwpbl if the user-provided req.user_wqe_bufs field was non-zero. The problem is that iwqp->iwpbl is unconditionally dereferenced later on in irdma_setup_virt_qp.
While there was a check for iwqp->iwpbl != NULL, this check would only occur if req.user_wqe_bufs was non-zero. The end result is that a user could send a zero user_wqe_bufs value and trigger a null ptr deref.
Fix this by unconditionally calling irdma_get_pbl and bailing if it fails, similar to the CQ and SRQ paths.
--- drivers/infiniband/hw/irdma/verbs.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
drivers/infiniband/hw/irdma/verbs.c +9 -10
@@ -633,17 +633,16 @@ static int irdma_setup_umode_qp(struct ib_udata *udata, iwqp->ctx_info.qp_compl_ctx = req.user_compl_ctx; iwqp->user_mode =1 ; -if (req.user_wqe_bufs) { -spin_lock_irqsave (&ucontext->qp_reg_mem_list_lock, flags); - iwqp->iwpbl =irdma_get_pbl ((unsigned long )req.user_wqe_bufs, - &ucontext->qp_reg_mem_list); -spin_unlock_irqrestore (&ucontext->qp_reg_mem_list_lock, flags); -if (!iwqp->iwpbl) { - ret = -ENODATA ; -ibdev_dbg (&iwdev->ibdev,"VERBS: no pbl info\n" ); -return ret; - } +spin_lock_irqsave (&ucontext->qp_reg_mem_list_lock, flags); + iwqp->iwpbl =irdma_get_pbl ((unsigned long )req.user_wqe_bufs, + &ucontext->qp_reg_mem_list); +spin_unlock_irqrestore (&ucontext->qp_reg_mem_list_lock, flags); + +if (!iwqp->iwpbl) { + ret = -ENODATA ; +ibdev_dbg (&iwdev->ibdev,"VERBS: no pbl info\n" ); +return ret; }if (!ucontext->use_raw_attrs) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 36/744 RDMA/erdma: initialize ret for empty receive WR lists
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ruoyu Wang <[email protected]>
[ Upstream commit 2815a277c53e9a84784d6410cd55a9da5b33068d ]
erdma_post_recv() returns ret after walking the receive work request list. If the caller passes an empty list, the loop is skipped and ret is not assigned.
Initialize ret to 0 so an empty receive work request list returns success instead of stack data.
--- drivers/infiniband/hw/erdma/erdma_qp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/erdma/erdma_qp.c +1 -1
@@ -734,7 +734,7 @@ int erdma_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *recv_wr,const struct ib_recv_wr *wr = recv_wr;struct erdma_qp *qp =to_eqp (ibqp);unsigned long flags; -int ret; +int ret =0 ;spin_lock_irqsave (&qp->lock, flags);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 37/744 RDMA/mana_ib: initialize err for empty send WR lists
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ruoyu Wang <[email protected]>
[ Upstream commit 155fd5ce2382b0ffbec0d7ee7b3a6818a27a5aed ]
mana_ib_post_send() returns err after walking the send work request list. If the caller passes an empty list, the loop is skipped and err is not assigned.
Initialize err to 0 so an empty send work request list returns success instead of stack data.
--- drivers/infiniband/hw/mana/wr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/mana/wr.c +1 -1
@@ -144,7 +144,7 @@ static int mana_ib_post_send_ud(struct mana_ib_qp *qp, const struct ib_ud_wr *wrint mana_ib_post_send (struct ib_qp *ibqp,const struct ib_send_wr *wr,const struct ib_send_wr **bad_wr) { -int err; +int err =0 ; struct mana_ib_qp *qp = container_of(ibqp, struct mana_ib_qp, ibqp);for (; wr; wr = wr->next) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 38/744 RDMA/core: Fix memory leak in __ib_create_cq() on invalid cqe
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chenguang Zhao <[email protected]>
[ Upstream commit e939334ea7dd219f100f963dbb1cb43df520c20a ]
Move the zero CQE validation before rdma_zalloc_drv_obj() to avoid leaking the CQ object when returning -EINVAL.
--- drivers/infiniband/core/verbs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/infiniband/core/verbs.c +3 -3
@@ -2199,13 +2199,13 @@ struct ib_cq *__ib_create_cq(struct ib_device *device,struct ib_cq *cq;int ret; +if (WARN_ON_ONCE (!cq_attr->cqe)) +return ERR_PTR (-EINVAL ); + cq =rdma_zalloc_drv_obj (device, ib_cq);if (!cq)return ERR_PTR (-ENOMEM ); -if (WARN_ON_ONCE (!cq_attr->cqe)) -return ERR_PTR (-EINVAL ); - cq->device = device; cq->comp_handler = comp_handler; cq->event_handler = event_handler;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 39/744 RDMA/hns: Fix potential integer overflow in mhop hem cleanup
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danila Chernetsov <[email protected]>
[ Upstream commit 9f0f2d2121f16d420199a82ac5bbc242269133b3 ]
In hns_roce_cleanup_mhop_hem_table(), the expression:
obj = i * buf_chunk_size / table->obj_size;
is evaluated using 32-bit unsigned arithmetic because 'buf_chunk_size' is u32 and the usual arithmetic conversions convert 'i' to unsigned int. The result is assigned to a u64 variable, but the multiplication may overflow before the assignment.
For sufficiently large HEM tables, this produces an incorrect object index passed to hns_roce_table_mhop_put().
Cast 'i' to u64 before the multiplication so that the intermediate calculation is performed with 64-bit arithmetic.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/infiniband/hw/hns/hns_roce_hem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/hns/hns_roce_hem.c +1 -1
@@ -836,7 +836,7 @@ static void hns_roce_cleanup_mhop_hem_table(struct hns_roce_dev *hr_dev, mhop.bt_chunk_size;for (i =0 ; i < table->num_hem; ++i) { - obj = i * buf_chunk_size / table->obj_size; + obj = (u64 )i * buf_chunk_size / table->obj_size;if (table->hem[i])hns_roce_table_mhop_put (hr_dev, table, obj,0 ); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 40/744 RDMA/siw: publish QP after initialization
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ruoyu Wang <[email protected]>
[ Upstream commit bb27fcc67c429d97f785c92c35a6c5adebb05d7f ]
siw_create_qp() currently calls siw_qp_add() before the queues, CQ pointers, state, completion, and device list entry are ready. A QPN lookup can therefore reach a QP that is still being constructed.
Move siw_qp_add() to the end of siw_create_qp(), after QP initialization and before adding the QP to the siw device list.
--- drivers/infiniband/sw/siw/siw_verbs.c | 44 +++++++++++++++------------ 1 file changed, 24 insertions(+), 20 deletions(-)
drivers/infiniband/sw/siw/siw_verbs.c +24 -20
@@ -316,6 +316,7 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs,struct siw_ucontext *uctx = rdma_udata_to_drv_context(udata, struct siw_ucontext, base_ucontext); +struct siw_uresp_create_qp uresp = {};unsigned long flags;int num_sqe, num_rqe, rv =0 ;size_t length;
@@ -369,11 +370,6 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs,spin_lock_init (&qp->rq_lock);spin_lock_init (&qp->orq_lock); - rv =siw_qp_add (sdev, qp); -if (rv) - goto err_atomic; - -/* All queue indices are derived from modulo operations * on a free running 'get' (consumer) and 'put' (producer) * unsigned counter. Having queue sizes at power of two
@@ -391,14 +387,14 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs,if (qp->sendq ==NULL ) { rv = -ENOMEM ; - goto err_out_xa; + goto err_out; }if (attrs->sq_sig_type !=IB_SIGNAL_REQ_WR ) {if (attrs->sq_sig_type ==IB_SIGNAL_ALL_WR ) qp->attrs.flags |=SIW_SIGNAL_ALL_WR ;else { rv = -EINVAL ; - goto err_out_xa; + goto err_out; } } qp->pd = pd;
@@ -424,7 +420,7 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs,if (qp->recvq ==NULL ) { rv = -ENOMEM ; - goto err_out_xa; + goto err_out; } qp->attrs.rq_size = num_rqe; }
@@ -439,11 +435,8 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs, qp->attrs.state =SIW_QP_STATE_IDLE ;if (udata) { -struct siw_uresp_create_qp uresp = {}; - uresp.num_sqe = num_sqe; uresp.num_rqe = num_rqe; - uresp.qp_id =qp_id (qp);if (qp->sendq) { length = num_sqe *sizeof (struct siw_sqe );
@@ -452,7 +445,7 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs, length, &uresp.sq_key);if (!qp->sq_entry) { rv = -ENOMEM ; - goto err_out_xa; + goto err_out; } }
@@ -464,9 +457,23 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs,if (!qp->rq_entry) { uresp.sq_key =SIW_INVAL_UOBJ_KEY ; rv = -ENOMEM ; - goto err_out_xa; + goto err_out; } } + } + qp->tx_cpu =siw_get_tx_cpu (sdev); +if (qp->tx_cpu <0 ) { + rv = -EINVAL ; + goto err_out; + } +init_completion (&qp->qp_free); + + rv =siw_qp_add (sdev, qp); +if (rv) + goto err_out_tx; + +if (udata) { + uresp.qp_id =qp_id (qp);if (udata->outlen <sizeof (uresp)) { rv = -EINVAL ;
@@ -476,22 +483,19 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs,if (rv) goto err_out_xa; } - qp->tx_cpu =siw_get_tx_cpu (sdev); -if (qp->tx_cpu <0 ) { - rv = -EINVAL ; - goto err_out_xa; - } +INIT_LIST_HEAD (&qp->devq);spin_lock_irqsave (&sdev->lock, flags);list_add_tail (&qp->devq, &sdev->qp_list);spin_unlock_irqrestore (&sdev->lock, flags); -init_completion (&qp->qp_free); -return 0 ; err_out_xa:xa_erase (&sdev->qp_xa,qp_id (qp)); +err_out_tx: +siw_put_tx_cpu (qp->tx_cpu); +err_out:if (uctx) {rdma_user_mmap_entry_remove (qp->sq_entry);rdma_user_mmap_entry_remove (qp->rq_entry);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 41/744 mtd: fix double free and WARN_ON in add_mtd_device() error paths
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xue Lei <[email protected]>
[ Upstream commit 9d4af746af8ce27eefc2338b2feaa1e01f28b6c3 ]
When device_register() or mtd_nvmem_add() fails inside add_mtd_device() for a partition, the error handling triggers mtd_release() via put_device() or device_unregister(). mtd_release() calls release_mtd_partition() which frees the mtd_info structure. However, callers such as mtd_add_partition() and add_mtd_partitions() also call free_partition() in their error paths, resulting in a double free.
Additionally, release_mtd_partition() hits WARN_ON(!list_empty( &mtd->part.node)) because the partition node is still linked in the parent's partitions list when the release callback fires from the add_mtd_device() error path.
Fix this by overriding dev->type and dev->release before put_device() in the error paths, so that device_release() invokes a no-op function instead of mtd_release(). For the mtd_nvmem_add() failure case, device_unregister() is replaced with device_del() to separate the device removal from the final kobject reference drop, allowing the override to take effect before put_device() is called.
The callers' error paths (list_del + free_partition) remain the sole owners of mtd_info lifetime on add_mtd_device() failure, which is the expected contract.
The normal partition teardown path is not affected: del_mtd_device() goes through kref_put() -> mtd_device_release() -> device_unregister() with dev->type still set to &mtd_devtype, so mtd_release() -> release_mtd_partition() continues to work correctly for the regular removal case.
--- drivers/mtd/mtdcore.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
drivers/mtd/mtdcore.c +19 -4
@@ -105,6 +105,15 @@ static void mtd_release(struct device *dev)device_destroy (&mtd_class, index +1 ); } +/* +* No-op device release used in add_mtd_device() error paths. +* Prevents mtd_release() from being called via device_release(), +* which would free the mtd_info that the caller still manages. +*/ +static void mtd_dev_release_nop (struct device *dev) +{ +} +static void mtd_device_release (struct kref *kref) { struct mtd_info *mtd = container_of(kref, struct mtd_info, refcnt);
@@ -799,10 +808,8 @@ int add_mtd_device(struct mtd_info *mtd)mtd_check_of_node (mtd);of_node_get (mtd_get_of_node (mtd)); error =device_register (&mtd->dev); -if (error) { -put_device (&mtd->dev); +if (error) goto fail_added; - }/* Add the nvmem provider */ error =mtd_nvmem_add (mtd);
@@ -840,8 +847,16 @@ int add_mtd_device(struct mtd_info *mtd)return 0 ; fail_nvmem_add: -device_unregister (&mtd->dev); +device_del (&mtd->dev); fail_added: +/* +* Clear type and set nop release to prevent mtd_release() -> +* release_mtd_partition() -> free_partition() from freeing mtd. +* The caller handles cleanup on failure. +*/ + mtd->dev.type =NULL ; + mtd->dev.release = mtd_dev_release_nop; +put_device (&mtd->dev);of_node_put (mtd_get_of_node (mtd)); fail_devname:idr_remove (&mtd_idr, i);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 42/744 selftests/alsa: Fix memory leak in find_controls error path
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Malaya Kumar Rout <[email protected]>
[ Upstream commit cb89f0c1aed02eb233c4271f76f830b37e222ff6 ]
In find_controls(), card_data is allocated with malloc() but when snd_ctl_open_lconf() fails, the code jumps to next_card without freeing the allocated memory. This results in a memory leak for each card where snd_ctl_open_lconf() fails.
Add free(card_data) before goto next_card to ensure proper cleanup of the allocated memory in the error path.
--- tools/testing/selftests/alsa/mixer-test.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/alsa/mixer-test.c +1 -0
@@ -84,6 +84,7 @@ static void find_controls(void)if (err <0 ) {ksft_print_msg ("Failed to get hctl for card %d: %s\n" , card,snd_strerror (err)); +free (card_data); goto next_card; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 43/744 RDMA/irdma: Prevent overflows in memory contiguity checks
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksandrova Alyona <[email protected]>
[ Upstream commit 3cda0dfe8c651dcbb9e38977905d3d3b1750c4ab ]
irdma_check_mem_contiguous() and irdma_check_mr_contiguous() verify that PBL entries describe physically contiguous memory ranges.
Both functions calculate byte offsets using 32-bit operands. For example, with 4 KiB pages, pg_size * pg_idx overflows 32-bit arithmetic when pg_idx reaches 1048576. In the level-2 check, PBLE_PER_PAGE is 512, so i * pg_size * PBLE_PER_PAGE overflows when i reaches 2048.
These values are reachable in the driver. For MRs, palloc->total_cnt comes from iwmr->page_cnt, which is calculated by ib_umem_num_dma_blocks(). The MR size is limited by IRDMA_MAX_MR_SIZE, so a 4 GiB MR with 4 KiB pages can reach page_cnt of 1048576. PBLE resources do not exclude this value either: for gen3, the limit is based on avail_sds * MAX_PBLE_PER_SD, and MAX_PBLE_PER_SD is 0x40000, so 4 SDs are enough for 1048576 PBLEs.
Cast one operand to u64 before the multiplications so that the offset calculations are performed in 64-bit arithmetic.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/infiniband/hw/irdma/verbs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/hw/irdma/verbs.c +2 -2
@@ -2815,7 +2815,7 @@ static bool irdma_check_mem_contiguous(u64 *arr, u32 npages, u32 pg_size)u32 pg_idx;for (pg_idx =0 ; pg_idx < npages; pg_idx++) { -if ((*arr + (pg_size * pg_idx)) != arr[pg_idx]) +if ((*arr + ((u64 )pg_size * pg_idx)) != arr[pg_idx])return false; }
@@ -2848,7 +2848,7 @@ static bool irdma_check_mr_contiguous(struct irdma_pble_alloc *palloc,for (i =0 ; i < lvl2->leaf_cnt; i++, leaf++) { arr = leaf->addr; -if ((*start_addr + (i * pg_size *PBLE_PER_PAGE )) != *arr) +if ((*start_addr + ((u64 )i * pg_size *PBLE_PER_PAGE )) != *arr)return false; ret =irdma_check_mem_contiguous (arr, leaf->cnt, pg_size);if (!ret)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 44/744 xfrm: clear mode callbacks after failed mode setup
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cen Zhang <[email protected]>
[ Upstream commit 2538bd3cd1ff5af655908469544ac7b7ae259386 ]
xfrm_state_gc_task can run long after a failed IPTFS state setup. In the reproduced case, __xfrm_init_state() cached x->mode_cbs, IPTFS setup returned -ENOMEM before publishing mode_data, and the temporary module reference from xfrm_get_mode_cbs() was dropped immediately. The dead state then kept x->mode_cbs until deferred GC ran after xfrm_iptfs had been unloaded.
Clear x->mode_cbs when mode init or clone fails before publishing mode_data. Those states never installed mode-specific state or the long-term IPTFS module pin, so deferred GC has nothing mode-specific to destroy and must not retain a callback table pointer past the temporary lookup reference.
The buggy scenario involves two paths, with each column showing the order within that path:
failed setup path:
1. cache x->mode_cbs
2. mode setup fails before mode_data
3. drop the temporary module ref
4. dead state keeps x->mode_cbs cached
GC/unload path:
1. xfrm_state_put() queues GC work
2. xfrm_iptfs unloads later
3. xfrm_state_gc_task runs
4. GC dereferences stale x->mode_cbs
This also covers the failed clone path where clone_state() returns before publishing mode_data.
Validation reproduced this kernel report:
Kernel panic - not syncing: Fatal exception
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y failslab_stacktrace_filter matched xfrm_iptfs frames ack_error=-12FAULT_INJECTION: forcing a failure
BUG: unable to handle page fault Workqueue: events xfrm_state_gc_task RIP: xfrm_state_gc_task+0x142/0x650 Modules linked in: esp4_offload xfrm_user [last unloaded: xfrm_iptfs] Kernel panic - not syncing: Fatal exception
--- net/xfrm/xfrm_state.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
net/xfrm/xfrm_state.c +6 -1
@@ -2070,8 +2070,11 @@ static struct xfrm_state *xfrm_state_clone_and_setup(struct xfrm_state *orig, x->mode_cbs = orig->mode_cbs;if (x->mode_cbs && x->mode_cbs->clone_state) { -if (x->mode_cbs->clone_state (x, orig)) +if (x->mode_cbs->clone_state (x, orig)) { +if (!x->mode_data) + x->mode_cbs =NULL ; goto error; + } }
@@ -3254,6 +3257,8 @@ int __xfrm_init_state(struct xfrm_state *x, struct netlink_ext_ack *extack)if (x->mode_cbs->init_state) err = x->mode_cbs->init_state (x);module_put (x->mode_cbs->owner); +if (err && !x->mode_data) + x->mode_cbs =NULL ; } error:return err;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 45/744 xfrm: iptfs: propagate SKBFL_SHARED_FRAG in iptfs_skb_add_frags()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen YanJun <[email protected]>
[ Upstream commit 430ea57d6daf765e88f90046afbfd1e071cb7200 ]
When iptfs_skb_add_frags() copies frag references from the source frag walk into a new SKB, it increments the page reference count via __skb_frag_ref() but does not propagate SKBFL_SHARED_FRAG to the destination SKB's skb_shinfo->flags.
If the source SKB carries shared frags (e.g. from a page-pool backed receive path), the new inner SKB will appear to ESP as having privately owned frags. A subsequent esp_input() call for a nested transport-mode SA then takes the no-COW fast path and decrypts in place, writing over pages that are still referenced by the outer IPTFS SKB. This causes kernel-visible memory corruption and can trigger a panic.
All other frag-transfer helpers in the kernel (skb_try_coalesce, skb_gro_receive, __pskb_copy_fclone, skb_shift, skb_segment) correctly propagate SKBFL_SHARED_FRAG; align iptfs_skb_add_frags() with this convention by setting the flag inside the loop immediately after __skb_frag_ref() and nr_frags++, so every exit path that attaches a frag unconditionally propagates SKBFL_SHARED_FRAG.
--- net/xfrm/xfrm_iptfs.c | 1 + 1 file changed, 1 insertion(+)
net/xfrm/xfrm_iptfs.c +1 -0
@@ -480,6 +480,7 @@ static int iptfs_skb_add_frags(struct sk_buff *skb, }__skb_frag_ref (tofrag); shinfo->nr_frags++; + shinfo->flags |=SKBFL_SHARED_FRAG ;/* see if we are done */ fraglen = tofrag->len;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 46/744 xfrm6: clear dst.dev on error to avoid double netdev_put in xfrm6_fill_dst()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei (Microsoft) <[email protected]>
[ Upstream commit 136992de9bb91871084ae52d172610541c76e4d2 ]
On the error path where in6_dev_get(dev) returns NULL, xfrm6_fill_dst() releases the device reference with netdev_put() but leaves xdst->u.dst.dev set. dst_destroy() later calls netdev_put(dst->dev) again, so the same net_device reference is released twice, underflowing its refcount (ref_tracker WARNING + "unregister_netdevice: waiting for <dev> to become free").
Clear xdst->u.dst.dev after the netdev_put(), the same way the XFRM device-offload paths xfrm_dev_state_add() and xfrm_dev_policy_add() in net/xfrm/xfrm_device.c NULL ->dev when releasing the reference on error.
ref_tracker: reference already released.
ref_tracker: allocated in:
xfrm6_fill_dst (net/ipv6/xfrm6_policy.c:86)
...
udpv6_sendmsg (net/ipv6/udp.c:1696)
...
ref_tracker: freed in:
xfrm6_fill_dst (net/ipv6/xfrm6_policy.c:90)
...
WARNING: lib/ref_tracker.c:322 at ref_tracker_free+0x58b/0x780 dst_destroy (net/core/dst.c:115) rcu_core handle_softirqs ...
--- net/ipv6/xfrm6_policy.c | 1 + 1 file changed, 1 insertion(+)
net/ipv6/xfrm6_policy.c +1 -0
@@ -88,6 +88,7 @@ static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, xdst->u.rt6.rt6i_idev =in6_dev_get (dev);if (!xdst->u.rt6.rt6i_idev) {netdev_put (dev, &xdst->u.dst.dev_tracker); + xdst->u.dst.dev =NULL ;return -ENODEV ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 47/744 xfrm: policy: preallocate inexact bins before xfrm_hash_rebuild reinsert
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei (Microsoft) <[email protected]>
[ Upstream commit f38f8cce2f7e79775b3db7e8a5eacda04ac908e4 ]
xfrm_hash_rebuild()'s first loop preallocates the bins/chains the reinsert loop needs, so the reinsert (after hlist_del_rcu()) cannot allocate or fail. But its guard is inverted: it skips policies with prefixlen < threshold and preallocates for the rest.
prefixlen < threshold is exactly when policy_hash_bysel() returns NULL and the reinsert takes the allocating xfrm_policy_inexact_insert() path. So the loop preallocates for the exact policies (which never allocate) and skips the inexact ones, whose bin/node is then allocated GFP_ATOMIC during reinsert. On failure the error path only WARN_ONCE()s and continues, leaving a poisoned bydst node; the next rebuild's hlist_del_rcu() dereferences LIST_POISON2 and takes a GPF. Reachable under memory pressure, deterministic via failslab.
Invert the guard so preallocation covers exactly the reinserted policies; the reinsert then allocates nothing and cannot fail.
Crash:
Oops: general protection fault, probably for non-canonical address 0xfbd59c0000000024: 0000 [#1] SMP KASAN NOPTI KASAN: maybe wild-memory-access in range [0xdead...] ... Workqueue: events xfrm_hash_rebuild RIP: 0010:xfrm_hash_rebuild+0x5b3/0x1190 RAX: dead000000000122 (LIST_POISON2 + offset) ... Call Trace: hlist_del_rcu (include/linux/rculist.h:599) xfrm_hash_rebuild (net/xfrm/xfrm_policy.c:1365) process_one_work (kernel/workqueue.c:3322) worker_thread (kernel/workqueue.c:3486) kthread (kernel/kthread.c:436) ret_from_fork (arch/x86/kernel/process.c:158) ret_from_fork_asm (arch/x86/entry/entry_64.S:245) ... Kernel panic - not syncing: Fatal exception in interrupt
--- net/xfrm/xfrm_policy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/xfrm/xfrm_policy.c +2 -2
@@ -1329,8 +1329,8 @@ static void xfrm_hash_rebuild(struct work_struct *work) } } -if (policy->selector.prefixlen_d < dbits || - policy->selector.prefixlen_s < sbits) +if (policy->selector.prefixlen_d >= dbits && + policy->selector.prefixlen_s >= sbits)continue ; bin =xfrm_policy_inexact_alloc_bin (policy, dir);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 48/744 wifi: mac80211: allocate backup ieee80211_nan_sched_cfg off stack
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 44494b0d1d16e76ae805817579eacc801b10ed37 ]
The ieee80211_nan_sched_cfg structure is too large to keep on the per thread stack:
net/mac80211/nan.c:251:5: error: stack frame size (1560) exceeds limit (1536) in 'ieee80211_nan_set_local_sched' [-Werror,-Wframe-larger-than]
251 | int ieee80211_nan_set_local_sched(struct ieee80211_sub_if_data *sdata,
Allocate this dynamically using kmalloc_obj() to reduce the stack usage of this function to a manageable 344 bytes for the same configuration.
--- net/mac80211/nan.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-)
net/mac80211/nan.c +19 -16
@@ -253,9 +253,12 @@ int ieee80211_nan_set_local_sched(struct ieee80211_sub_if_data *sdata, {struct ieee80211_nan_channel *sched_idx_to_chan[IEEE80211_NAN_MAX_CHANNELS ] = {};struct ieee80211_nan_sched_cfg *sched_cfg = &sdata->vif.cfg.nan_sched; -struct ieee80211_nan_sched_cfg backup_sched; + struct ieee80211_nan_sched_cfg *backup_sched __free(kfree) = kmalloc_obj(*backup_sched);int ret; +if (!backup_sched) +return -ENOMEM ; +if (sched->n_channels >IEEE80211_NAN_MAX_CHANNELS )return -EOPNOTSUPP ;
@@ -275,13 +278,13 @@ int ieee80211_nan_set_local_sched(struct ieee80211_sub_if_data *sdata,bitmap_zero (sdata->u.nan.removed_channels,IEEE80211_NAN_MAX_CHANNELS ); -memcpy (backup_sched.schedule, sched_cfg->schedule, -sizeof (backup_sched.schedule)); -memcpy (backup_sched.channels, sched_cfg->channels, -sizeof (backup_sched.channels)); -memcpy (backup_sched.avail_blob, sched_cfg->avail_blob, -sizeof (backup_sched.avail_blob)); - backup_sched.avail_blob_len = sched_cfg->avail_blob_len; +memcpy (backup_sched->schedule, sched_cfg->schedule, +sizeof (backup_sched->schedule)); +memcpy (backup_sched->channels, sched_cfg->channels, +sizeof (backup_sched->channels)); +memcpy (backup_sched->avail_blob, sched_cfg->avail_blob, +sizeof (backup_sched->avail_blob)); + backup_sched->avail_blob_len = sched_cfg->avail_blob_len;memcpy (sched_cfg->avail_blob, sched->nan_avail_blob, sched->nan_avail_blob_len);
@@ -377,17 +380,17 @@ int ieee80211_nan_set_local_sched(struct ieee80211_sub_if_data *sdata,if (!chan_def->chan)continue ; -if (!cfg80211_chandef_identical (&backup_sched.channels[i].chanreq.oper, +if (!cfg80211_chandef_identical (&backup_sched->channels[i].chanreq.oper, chan_def))ieee80211_nan_remove_channel (sdata, &sched_cfg->channels[i]); }/* Re-add all backed up channels */ -for (int i =0 ; i <ARRAY_SIZE (backup_sched.channels); i++) { +for (int i =0 ; i <ARRAY_SIZE (backup_sched->channels); i++) {struct ieee80211_nan_channel *chan = &sched_cfg->channels[i]; - *chan = backup_sched.channels[i]; + *chan = backup_sched->channels[i];/* * For deferred update, no channels were removed and the channel
@@ -418,11 +421,11 @@ int ieee80211_nan_set_local_sched(struct ieee80211_sub_if_data *sdata, } } -memcpy (sched_cfg->schedule, backup_sched.schedule, -sizeof (backup_sched.schedule)); -memcpy (sched_cfg->avail_blob, backup_sched.avail_blob, -sizeof (backup_sched.avail_blob)); - sched_cfg->avail_blob_len = backup_sched.avail_blob_len; +memcpy (sched_cfg->schedule, backup_sched->schedule, +sizeof (backup_sched->schedule)); +memcpy (sched_cfg->avail_blob, backup_sched->avail_blob, +sizeof (backup_sched->avail_blob)); + sched_cfg->avail_blob_len = backup_sched->avail_blob_len; sched_cfg->deferred = false;bitmap_zero (sdata->u.nan.removed_channels,IEEE80211_NAN_MAX_CHANNELS );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 49/744 ALSA: usb-audio: Fix imbalance per-channel volume of sticky mixers
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rong Zhang <[email protected]>
[ Upstream commit ea588e4c7484ea883d3dab308f1f2c2f0f51f7d6 ]
I accidentally made an off-by-a-line mistake when mimicking other code paths that set all channels. The mistake breaks sticky mixers with multiple channels.
I didn't realize this mistake at that time, as my device's mixer is single-channel.
Fix it, so that per-channel volume of sticky mixers is balanced.
--- sound/usb/mixer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/mixer.c +1 -1
@@ -1447,8 +1447,8 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval,if (!cval->cmask) {snd_usb_set_cur_mix_value (cval,0 ,0 , cval->max); }else { + idx =0 ;for (i =0 ; i <MAX_CHANNELS ; i++) { - idx =0 ;if (cval->cmask &BIT (i)) {snd_usb_set_cur_mix_value (cval, i +1 , idx, cval->max); idx++;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 50/744 wifi: cfg80211: cancel sched scan results work on unregister
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cen Zhang <[email protected]>
[ Upstream commit edf0730be33696a1bd142792830d392129e495cc ]
cfg80211_sched_scan_results() can queue rdev->sched_scan_res_wk from a driver result notification while a scheduled scan request is present. The work callback recovers the containing cfg80211_registered_device and then locks the wiphy and walks the scheduled-scan request list.
wiphy_unregister() already makes the wiphy unreachable and drains rdev work items before cfg80211_dev_free() can release the object, but it does not drain sched_scan_res_wk. A queued or running result work item can therefore cross the unregister/free boundary and access freed rdev state.
The buggy scenario involves two paths, with each column showing the order within that path:
scheduled-scan result path: unregister/free path:
1. cfg80211_sched_scan_results() 1. interface teardown stops and
queues rdev->sched_scan_res_wk. removes the scheduled scan request.
2. cfg80211_wq starts the work 2. wiphy_unregister() drains other
item and recovers rdev. rdev work items.
3. The worker locks rdev->wiphy 3. cfg80211_dev_free() destroys and
and walks rdev state. frees rdev.
Cancel sched_scan_res_wk in wiphy_unregister() alongside the other rdev work items. cancel_work_sync() removes a pending result notification and waits for an already running callback, so cfg80211_dev_free() cannot free rdev while this work item is still active.
Validation reproduced this kernel report:
BUG: KASAN: use-after-free in cfg80211_sched_scan_results_wk+0x4a6/0x530 Workqueue: cfg80211 cfg80211_sched_scan_results_wk [cfg80211] Read of size 8 Call trace: dump_stack_lvl+0x66/0xa0 print_report+0xce/0x630 cfg80211_sched_scan_results_wk+0x4a6/0x530 srso_alias_return_thunk+0x5/0xfbef5 __virt_addr_valid+0x224/0x430 kasan_report+0xac/0xe0 lockdep_hardirqs_on_prepare+0xea/0x1a0 process_one_work+0x8d0/0x18f0 (kernel/workqueue.c:3212) lock_is_held_type+0x8f/0x100 worker_thread+0x5ad/0xfd0 __kthread_parkme+0xc6/0x200 kthread+0x31e/0x410 trace_hardirqs_on+0x1a/0x170 ret_from_fork+0x576/0x810 __switch_to+0x57e/0xe20 __switch_to_asm+0x33/0x70 ret_from_fork_asm+0x1a/0x30
--- net/wireless/core.c | 1 + 1 file changed, 1 insertion(+)
net/wireless/core.c +1 -0
@@ -1288,6 +1288,7 @@ void wiphy_unregister(struct wiphy *wiphy)/* this has nothing to do now but make sure it's gone */ cancel_work_sync (&rdev->wiphy_work); +cancel_work_sync (&rdev->sched_scan_res_wk);cancel_work_sync (&rdev->rfkill_block);cancel_work_sync (&rdev->conn_work);flush_work (&rdev->event_work);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 51/744 wifi: ipw2100: fix potential memory leak in ipw2100_pci_init_one()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abdun Nihaal <[email protected]>
[ Upstream commit 0d388f62031dbabcba0f44bb91b59f10e88cac17 ]
The memory allocated in the ipw2100_alloc_device() function is not freed in some of the error paths in ipw2100_pci_init_one(). Fix that by converting the direct return into a goto to the error path return.
The error path when pci_enable_device() fails cannot jump to fail, since at this point priv is not set, so perform error handling inline.
--- drivers/net/wireless/intel/ipw2x00/ipw2100.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/wireless/intel/ipw2x00/ipw2100.c +4 -4
@@ -6157,6 +6157,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,if (err) { printk(KERN_WARNING DRV_NAME "Error calling pci_enable_device.\n"); +free_libipw (dev,0 ); +pci_iounmap (pci_dev, ioaddr);return err; }
@@ -6169,16 +6171,14 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,if (err) { printk(KERN_WARNING DRV_NAME "Error calling pci_set_dma_mask.\n"); -pci_disable_device (pci_dev); -return err; + goto fail; } err =pci_request_regions (pci_dev,DRV_NAME );if (err) { printk(KERN_WARNING DRV_NAME "Error calling pci_request_regions.\n"); -pci_disable_device (pci_dev); -return err; + goto fail; }/* We disable the RETRY_TIMEOUT register (0x41) to keep
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 52/744 wifi: cfg80211: Fix an error handling path in cfg80211_wext_siwscan()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit c6659f66d4ee4841aafae5659d2ef5e4c5c63cb6 ]
If the test against IEEE80211_MAX_SSID_LEN fails, then 'creq' leaks. Use the existing error handling path to fix it.
--- net/wireless/scan.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/wireless/scan.c +4 -2
@@ -3613,8 +3613,10 @@ int cfg80211_wext_siwscan(struct net_device *dev,/* translate "Scan for SSID" request */ if (wreq) {if (wrqu->data.flags &IW_SCAN_THIS_ESSID ) { -if (wreq->essid_len >IEEE80211_MAX_SSID_LEN ) -return -EINVAL ; +if (wreq->essid_len >IEEE80211_MAX_SSID_LEN ) { + err = -EINVAL ; + goto out; + }memcpy (creq->req.ssids[0 ].ssid, wreq->essid, wreq->essid_len); creq->req.ssids[0 ].ssid_len = wreq->essid_len;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 53/744 wifi: mac80211_hwsim: clamp virtio RX length before skb_put
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryam Vargas <[email protected]>
[ Upstream commit 10a2b430f8f06ae14b9590b6f6faa6b588ef0654 ]
hwsim_virtio_rx_work() passes the virtqueue used-ring length reported by the device straight to skb_put() on a fixed-size receive skb. A backend reporting a length larger than the skb tailroom drives skb_put() past the buffer end and hits skb_over_panic() -- a host-triggerable guest panic (denial of service).
Clamp the length to the skb's available room before skb_put(). A conforming device never reports more than the posted buffer size, so valid frames are unaffected; a truncated over-report then fails the length/header checks in hwsim_virtio_handle_cmd() and is dropped, so truncating rather than dropping here cannot be turned into a parsing problem.
--- drivers/net/wireless/virtual/mac80211_hwsim.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/virtual/mac80211_hwsim.c +1 -0
@@ -7122,6 +7122,7 @@ static void hwsim_virtio_rx_work(struct work_struct *work) skb->data = skb->head;skb_reset_tail_pointer (skb); + len =min (len,skb_end_offset (skb));skb_put (skb, len);hwsim_virtio_handle_cmd (skb);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 54/744 wifi: mac80211: fix unsol_bcast_probe_resp double free on alloc failure
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit 1d067abcd37062426c59ec73dbc4e87a63f33fea ]
ieee80211_set_unsol_bcast_probe_resp() calls kfree_rcu() on the old template before allocating the replacement. If the kzalloc() then fails, it returns -ENOMEM while link->u.ap.unsol_bcast_probe_resp still points at the object already queued for freeing. A later update or AP teardown re-queues that same rcu_head; the second free is caught by KASAN when the RCU sheaf is processed in softirq:
BUG: KASAN: double-free in rcu_free_sheaf (mm/slub.c:5850) Free of addr ffff88800d06f300 by task exploit/145 ... __rcu_free_sheaf_prepare (mm/slub.c:2634 mm/slub.c:2940) rcu_free_sheaf (mm/slub.c:5850) rcu_core (kernel/rcu/tree.c:2617 kernel/rcu/tree.c:2869) handle_softirqs (kernel/softirq.c:622) The buggy address belongs to the cache kmalloc-128 of size 128
Queue the old object for kfree_rcu() only after the new one is published, matching ieee80211_set_probe_resp() and ieee80211_set_s1g_short_beacon().
--- net/mac80211/cfg.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/mac80211/cfg.c +3 -2
@@ -1178,8 +1178,6 @@ ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata, link_conf->unsol_bcast_probe_resp_interval = params->interval; old =sdata_dereference (link->u.ap.unsol_bcast_probe_resp, sdata); -if (old) -kfree_rcu (old, rcu_head);if (params->tmpl && params->tmpl_len) { new =kzalloc (sizeof (*new) + params->tmpl_len,GFP_KERNEL );
@@ -1192,6 +1190,9 @@ ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata,RCU_INIT_POINTER (link->u.ap.unsol_bcast_probe_resp,NULL ); } +if (old) +kfree_rcu (old, rcu_head); + *changed |=BSS_CHANGED_UNSOL_BCAST_PROBE_RESP ;return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 55/744 wifi: mac80211: fix fils_discovery double free on alloc failure
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit 286e52a799fa158bdbd77da1426c4d93f9a6e7ad ]
ieee80211_set_fils_discovery() calls kfree_rcu() on the old template before allocating the replacement. If the kzalloc() then fails, it returns -ENOMEM while link->u.ap.fils_discovery still points at the object already queued for freeing. A later update or AP teardown (ieee80211_stop_ap()) re-queues that same rcu_head; the second free is caught by KASAN when the RCU sheaf is processed in softirq:
BUG: KASAN: double-free in rcu_free_sheaf (mm/slub.c:5850) Free of addr ffff88800c065280 by task swapper/0/0 ... __rcu_free_sheaf_prepare (mm/slub.c:2634 mm/slub.c:2940) rcu_free_sheaf (mm/slub.c:5850) rcu_core (kernel/rcu/tree.c:2617 kernel/rcu/tree.c:2869) handle_softirqs (kernel/softirq.c:622) The buggy address belongs to the cache kmalloc-96 of size 96
Queue the old object for kfree_rcu() only after the new one is published, matching ieee80211_set_probe_resp() and ieee80211_set_s1g_short_beacon().
--- net/mac80211/cfg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/mac80211/cfg.c +3 -3
@@ -1145,9 +1145,6 @@ static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata, fd->max_interval = params->max_interval; old =sdata_dereference (link->u.ap.fils_discovery, sdata); -if (old) -kfree_rcu (old, rcu_head); -if (params->tmpl && params->tmpl_len) { new =kzalloc (sizeof (*new) + params->tmpl_len,GFP_KERNEL );if (!new)
@@ -1159,6 +1156,9 @@ static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata,RCU_INIT_POINTER (link->u.ap.fils_discovery,NULL ); } +if (old) +kfree_rcu (old, rcu_head); + *changed |=BSS_CHANGED_FILS_DISCOVERY ;return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 56/744 wifi: libertas: fix memory leak in helper_firmware_cb()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dawei Feng <[email protected]>
[ Upstream commit 63c2391deefb31e1b801b7f32bd502ca4808639b ]
helper_firmware_cb() neglects to free the single-stage firmware image after a successful async load, leading to a memory leak in the USB firmware-download path.
Fix this memory leak by calling release_firmware() immediately after lbs_fw_loaded() returns.
The bug was first flagged by an experimental analysis tool we are developing for kernel memory-management bugs while analyzing v6.13-rc1. The tool is still under development and is not yet publicly available. Manual inspection confirms that the bug is still present in the current wireless tree.
An x86_64 allyesconfig build showed no new warnings. As we do not have compatible Libertas USB hardware for exercising this firmware-download path, no runtime testing was able to be performed.
--- drivers/net/wireless/marvell/libertas/firmware.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/marvell/libertas/firmware.c +1 -0
@@ -78,6 +78,7 @@ static void helper_firmware_cb(const struct firmware *firmware, void *context) }else {/* No main firmware needed for this helper --> success! */ lbs_fw_loaded (priv,0 , firmware,NULL ); +release_firmware (firmware); } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 57/744 wifi: mac80211: defer link RX stats percpu free to RCU
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maoyi Xie <[email protected]>
[ Upstream commit aa2eb62525188269cdd402a583b9a8ed94657ff0 ]
sta_remove_link() frees a removed MLO link's RX stats percpu buffer right away, but defers only the link container to RCU:
sta_info_free_link(&alloc->info); kfree_rcu(alloc, rcu_head);
The RX fast path reads link_sta under rcu_read_lock and writes the percpu stats. A reader that resolved link_sta before the removal keeps the pointer. The container stays alive from the kfree_rcu, so the read still works. But the percpu block it points to is already freed. This needs uses_rss. That is when pcpu_rx_stats exists.
The full STA teardown frees the deflink stats only after synchronize_net(). The link removal path had no such barrier. The race is hard to win in practice, but the free should still wait for RCU.
Free the link together with its data from a single RCU callback, so the percpu block is reclaimed only after readers drain.
--- net/mac80211/sta_info.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
net/mac80211/sta_info.c +11 -4
@@ -355,6 +355,15 @@ static void sta_info_free_link(struct link_sta_info *link_sta)free_percpu (link_sta->pcpu_rx_stats); } +static void sta_link_free_rcu (struct rcu_head *head) +{ +struct sta_link_alloc *alloc = + container_of(head, struct sta_link_alloc, rcu_head); + +sta_info_free_link (&alloc->info); +kfree (alloc); +} +static void sta_accumulate_removed_link_stats (struct sta_info *sta,int link_id) { struct link_sta_info *link_sta = wiphy_dereference(sta->local->hw.wiphy,
@@ -439,10 +448,8 @@ static void sta_remove_link(struct sta_info *sta, unsigned int link_id,RCU_INIT_POINTER (sta->link[link_id],NULL );RCU_INIT_POINTER (sta->sta.link[link_id],NULL ); -if (alloc) { -sta_info_free_link (&alloc->info); -kfree_rcu (alloc, rcu_head); - } +if (alloc) +call_rcu (&alloc->rcu_head, sta_link_free_rcu);ieee80211_sta_recalc_aggregates (&sta->sta); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 58/744 wifi: p54: validate RX frame length in p54_rx_eeprom_readback()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit ebd6d37fa94bee929e0b4c9ca19fdf9b1dcf6cea ]
p54_rx_eeprom_readback() copies the requested EEPROM slice out of a device-supplied readback frame without checking that the skb actually holds that many bytes. Commit da1b9a55ff11 ("wifi: p54: prevent buffer-overflow in p54_rx_eeprom_readback()") closed the destination overflow by copying a fixed priv->eeprom_slice_size (and rejecting a mismatched advertised len), but the source side is still unbounded: nothing verifies the frame is long enough to supply that many bytes.
A malicious USB device can send a short frame whose advertised len matches priv->eeprom_slice_size while the payload is truncated. The equality check passes and memcpy() reads past the end of the skb, leaking adjacent heap:
BUG: KASAN: slab-out-of-bounds in p54_rx (drivers/net/wireless/intersil/p54/txrx.c:507) Read of size 1016 at addr ffff88800f077114 by task swapper/0/0 Call Trace: <IRQ> ... __asan_memcpy (mm/kasan/shadow.c:105) p54_rx (drivers/net/wireless/intersil/p54/txrx.c:507) p54u_rx_cb (drivers/net/wireless/intersil/p54/p54usb.c:163) __usb_hcd_giveback_urb (drivers/usb/core/hcd.c:1657) dummy_timer (drivers/usb/gadget/udc/dummy_hcd.c:2005) ... </IRQ> The buggy address belongs to the object at ffff88800f0770c0 which belongs to the cache skbuff_small_head of size 704 The buggy address is located 84 bytes inside of allocated 704-byte region [ffff88800f0770c0, ffff88800f077380)
Check that the slice fits in the skb before copying.
--- drivers/net/wireless/intersil/p54/txrx.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/wireless/intersil/p54/txrx.c +8 -0
@@ -499,11 +499,19 @@ static void p54_rx_eeprom_readback(struct p54_common *priv,if (le16_to_cpu (eeprom->v2.len) != priv->eeprom_slice_size)return ; +if (eeprom->v2.data + priv->eeprom_slice_size > +skb_tail_pointer (skb)) +return ; +memcpy (priv->eeprom, eeprom->v2.data, priv->eeprom_slice_size); }else {if (le16_to_cpu (eeprom->v1.len) != priv->eeprom_slice_size)return ; +if (eeprom->v1.data + priv->eeprom_slice_size > +skb_tail_pointer (skb)) +return ; +memcpy (priv->eeprom, eeprom->v1.data, priv->eeprom_slice_size); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 59/744 wifi: cfg80211: convert pmsr_free_wk to wiphy_work to fix deadlock
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peddolla Harshavardhan Reddy <[email protected]>
[ Upstream commit 2b0eab425e1f658d8fe1df7590e3b9af5959505e ]
When a netlink socket that owns a PMSR session is closed, cfg80211_release_pmsr() clears the request's nl_portid and queues pmsr_free_wk to call cfg80211_pmsr_process_abort() asynchronously.
If the interface tears down concurrently, cfg80211_pmsr_wdev_down() is called under wiphy_lock and calls cancel_work_sync(&pmsr_free_wk) to wait for any running work. The work function acquires wiphy_lock via guard(wiphy) before calling process_abort.
This is a deadlock: wdev_down holds wiphy_lock and blocks inside cancel_work_sync(); pmsr_free_wk blocks trying to acquire that same wiphy_lock. Neither thread can proceed.
The same deadlock is reachable from cfg80211_leave_locked(), which calls cfg80211_pmsr_wdev_down() for all interface types under wiphy_lock.
Fix this by converting pmsr_free_wk from a plain work_struct to a wiphy_work. The wiphy_work dispatcher holds wiphy_lock when running work items, so the explicit guard(wiphy) in the work function is no longer needed. wiphy_work_cancel() can be called safely while holding wiphy_lock - since wiphy_lock prevents the work from running concurrently, wiphy_work_cancel() never blocks, eliminating the deadlock.
Remove the cancel_work_sync() for pmsr_free_wk from the NETDEV_GOING_DOWN handler. cfg80211_leave(), called unconditionally just before it, already cancels any pending work under wiphy_lock via wiphy_work_cancel() inside cfg80211_pmsr_wdev_down().
--- include/net/cfg80211.h | 2 +- net/wireless/core.c | 3 +-- net/wireless/core.h | 2 +- net/wireless/pmsr.c | 8 +++----- 4 files changed, 6 insertions(+), 9 deletions(-)
include/net/cfg80211.h +1 -1
@@ -7027,7 +7027,7 @@ struct wireless_dev {struct list_head pmsr_list;spinlock_t pmsr_lock; -struct work_struct pmsr_free_wk; +struct wiphy_work pmsr_free_wk;unsigned long unprot_beacon_reported;
net/wireless/core.c +1 -2
@@ -1561,7 +1561,7 @@ void cfg80211_init_wdev(struct wireless_dev *wdev)INIT_LIST_HEAD (&wdev->mgmt_registrations);INIT_LIST_HEAD (&wdev->pmsr_list);spin_lock_init (&wdev->pmsr_lock); -INIT_WORK (&wdev->pmsr_free_wk, cfg80211_pmsr_free_wk); +wiphy_work_init (&wdev->pmsr_free_wk, cfg80211_pmsr_free_wk);#ifdef CONFIG_CFG80211_WEXT wdev->wext.default_key =-1 ;
@@ -1695,7 +1695,6 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,cfg80211_remove_links (wdev);/* since we just did cfg80211_leave() nothing to do there */ cancel_work_sync (&wdev->disconnect_wk); -cancel_work_sync (&wdev->pmsr_free_wk);break ;case NETDEV_DOWN :wiphy_lock (&rdev->wiphy);
net/wireless/core.h +1 -1
@@ -583,7 +583,7 @@ cfg80211_get_6ghz_power_type(const u8 *elems, size_t elems_len,void cfg80211_release_pmsr (struct wireless_dev *wdev,u32 portid);void cfg80211_pmsr_wdev_down (struct wireless_dev *wdev); -void cfg80211_pmsr_free_wk (struct work_struct *work); +void cfg80211_pmsr_free_wk (struct wiphy *wiphy,struct wiphy_work *work);void cfg80211_remove_link (struct wireless_dev *wdev,unsigned int link_id);void cfg80211_remove_links (struct wireless_dev *wdev);
net/wireless/pmsr.c +3 -5
@@ -645,13 +645,11 @@ static void cfg80211_pmsr_process_abort(struct wireless_dev *wdev) } } -void cfg80211_pmsr_free_wk (struct work_struct *work) +void cfg80211_pmsr_free_wk (struct wiphy *wiphy,struct wiphy_work *work) { struct wireless_dev *wdev = container_of(work, struct wireless_dev, pmsr_free_wk); -guard (wiphy)(wdev->wiphy); -cfg80211_pmsr_process_abort (wdev); }
@@ -667,7 +665,7 @@ void cfg80211_pmsr_wdev_down(struct wireless_dev *wdev) }spin_unlock_bh (&wdev->pmsr_lock); -cancel_work_sync (&wdev->pmsr_free_wk); +wiphy_work_cancel (wdev->wiphy, &wdev->pmsr_free_wk);if (found)cfg80211_pmsr_process_abort (wdev);
@@ -682,7 +680,7 @@ void cfg80211_release_pmsr(struct wireless_dev *wdev, u32 portid)list_for_each_entry (req, &wdev->pmsr_list, list) {if (req->nl_portid == portid) { req->nl_portid =0 ; -schedule_work (&wdev->pmsr_free_wk); +wiphy_work_queue (wdev->wiphy, &wdev->pmsr_free_wk); } }spin_unlock_bh (&wdev->pmsr_lock);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 60/744 wifi: nl80211: free RNR data on MBSSID mismatch
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Li <[email protected]>
[ Upstream commit 07a95ec2b54774201fdf4ef7ffb0ca2ab19ed29c ]
nl80211_parse_beacon() rejects EMA RNR data when there are fewer RNR entries than MBSSID entries.
The rejected RNR allocation has not been attached to the beacon data yet, so free it before returning the error.
--- net/wireless/nl80211.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/wireless/nl80211.c +3 -1
@@ -6519,8 +6519,10 @@ static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev,if (IS_ERR (rnr))return PTR_ERR (rnr); -if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) +if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) { +kfree (rnr);return -EINVAL ; + } bcn->rnr_ies = rnr; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 61/744 wifi: cfg80211: derive S1G beacon TSF from S1G fields
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Li <[email protected]>
[ Upstream commit 4e5a4641e7b4763656336b7891d01359aaf363cd ]
cfg80211_inform_bss_frame_data() parses S1G beacons with the extension frame layout, but still reads the TSF from the regular probe response layout after the S1G branch. For S1G beacons that reads bytes at the regular management-frame timestamp offset instead of the S1G timestamp.
Use the 32-bit S1G beacon timestamp and the S1G Beacon Compatibility element's TSF completion field when informing an S1G BSS. Keep the regular management-frame timestamp read in the non-S1G branch.
--- net/wireless/scan.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/wireless/scan.c +3 -2
@@ -3312,14 +3312,15 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy, bssid = ext->u.s1g_beacon.sa; capability =le16_to_cpu (compat->compat_info); beacon_interval =le16_to_cpu (compat->beacon_int); + tsf =le32_to_cpu (ext->u.s1g_beacon.timestamp); + tsf |= (u64 )le32_to_cpu (compat->tsf_completion) <<32 ; }else { bssid = mgmt->bssid; beacon_interval =le16_to_cpu (mgmt->u.probe_resp.beacon_int); capability =le16_to_cpu (mgmt->u.probe_resp.capab_info); + tsf =le64_to_cpu (mgmt->u.probe_resp.timestamp); } - tsf =le64_to_cpu (mgmt->u.probe_resp.timestamp); -if (ieee80211_is_probe_resp (mgmt->frame_control)) ftype =CFG80211_BSS_FTYPE_PRESP ;else if (ext)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 62/744 wifi: nl80211: validate nested MBSSID IE blobs
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Li <[email protected]>
[ Upstream commit 7f4b01812323443b55e4c65381c9dc851ff009e3 ]
Validate each nested NL80211_ATTR_MBSSID_ELEMS entry as a well-formed information-element stream before storing it for beacon construction.
RNR parsing already validates each nested blob with validate_ie_attr() before storing it. Apply the same syntactic IE validation to MBSSID entries before counting and copying their data and length pointers.
--- net/wireless/nl80211.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
net/wireless/nl80211.c +10 -2
@@ -6321,7 +6321,8 @@ static int nl80211_parse_mbssid_config(struct wiphy *wiphy, }static struct cfg80211_mbssid_elems * -nl80211_parse_mbssid_elems (struct wiphy *wiphy,struct nlattr *attrs) +nl80211_parse_mbssid_elems (struct wiphy *wiphy,struct nlattr *attrs, +struct netlink_ext_ack *extack) {struct nlattr *nl_elems;struct cfg80211_mbssid_elems *elems;
@@ -6332,6 +6333,12 @@ nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs)return ERR_PTR (-EINVAL );nla_for_each_nested (nl_elems, attrs, rem_elems) { +int ret; + + ret =validate_ie_attr (nl_elems, extack); +if (ret) +return ERR_PTR (ret); +if (num_elems >=255 )return ERR_PTR (-EINVAL ); num_elems++;
@@ -6503,7 +6510,8 @@ static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev,if (attrs[NL80211_ATTR_MBSSID_ELEMS ]) {struct cfg80211_mbssid_elems *mbssid =nl80211_parse_mbssid_elems (&rdev->wiphy, - attrs[NL80211_ATTR_MBSSID_ELEMS ]); + attrs[NL80211_ATTR_MBSSID_ELEMS ], + extack);if (IS_ERR (mbssid))return PTR_ERR (mbssid);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 63/744 wifi: nl80211: constrain MBSSID TX link ID range
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Li <[email protected]>
[ Upstream commit 172f06023669f0a96d32511669ff45c600731380 ]
MBSSID transmitted-profile link IDs are valid only in the range 0..IEEE80211_MLD_MAX_NUM_LINKS - 1. Constrain the nl80211 policy to reject out-of-range values during attribute validation.
--- net/wireless/nl80211.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/wireless/nl80211.c +1 -1
@@ -616,7 +616,7 @@ nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = { [NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 }, [NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG }, [NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID ] = - NLA_POLICY_MAX(NLA_U8, IEEE80211_MLD_MAX_NUM_LINKS), + NLA_POLICY_RANGE(NLA_U8, 0, IEEE80211_MLD_MAX_NUM_LINKS - 1), }; static const struct nla_policy
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 64/744 wifi: cfg80211: validate PMSR measurement type data
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Li <[email protected]>
[ Upstream commit 41aa973eb05922848dded26875c55ef982ac1c49 ]
PMSR request parsing accepts missing or duplicated measurement type entries in NL80211_PMSR_REQ_ATTR_DATA.
Track whether one measurement type was already provided, reject a second one immediately, and return an error if the request data block contains no measurement type at all.
--- net/wireless/pmsr.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
net/wireless/pmsr.c +17 -2
@@ -214,6 +214,7 @@ static int pmsr_parse_peer(struct cfg80211_registered_device *rdev, {struct nlattr *tb[NL80211_PMSR_PEER_ATTR_MAX +1 ];struct nlattr *req[NL80211_PMSR_REQ_ATTR_MAX +1 ]; +bool have_measurement_type = false;struct nlattr *treq;int err, rem;
@@ -267,6 +268,14 @@ static int pmsr_parse_peer(struct cfg80211_registered_device *rdev, }nla_for_each_nested (treq, req[NL80211_PMSR_REQ_ATTR_DATA ], rem) { +if (have_measurement_type) { +NL_SET_ERR_MSG_ATTR (info->extack, treq, +"multiple measurement types in request data" ); +return -EINVAL ; + } + + have_measurement_type = true; +switch (nla_type (treq)) {case NL80211_PMSR_TYPE_FTM : err =pmsr_parse_ftm (rdev, treq, out, info);
@@ -276,10 +285,16 @@ static int pmsr_parse_peer(struct cfg80211_registered_device *rdev, "unsupported measurement type"); err = -EINVAL ; } +if (err) +return err; } -if (err) -return err; +if (!have_measurement_type) { +NL_SET_ERR_MSG_ATTR (info->extack, + req[NL80211_PMSR_REQ_ATTR_DATA ], +"missing measurement type in request data" ); +return -EINVAL ; + }return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 65/744 wifi: cfg80211: validate PMSR FTM preamble range
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Li <[email protected]>
[ Upstream commit 36230936468f0ba4930e94aef496fc229d4bb951 ]
PMSR FTM request parsing accepts preamble values outside the enumerated nl80211 preamble range.
Reject out-of-range values before using them in the parser capability bit test using the policy.
--- net/wireless/nl80211.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/wireless/nl80211.c +3 -1
@@ -461,7 +461,9 @@ nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = {static const struct nla_policy nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX +1 ] = { [NL80211_PMSR_FTM_REQ_ATTR_ASAP ] = { .type =NLA_FLAG }, - [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE ] = { .type =NLA_U32 }, + [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE ] = +NLA_POLICY_RANGE (NLA_U32 ,NL80211_PREAMBLE_LEGACY , +NL80211_PREAMBLE_HE ), [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP ] =NLA_POLICY_MAX (NLA_U8 ,15 ), [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD ] = { .type =NLA_U16 },
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 66/744 wifi: cfg80211: reject unsupported PMSR FTM location requests
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Li <[email protected]>
[ Upstream commit 69ef6a7ec277f16d216be8da2b3cbe872786c999 ]
PMSR FTM location request flags are syntactically valid, but they must be rejected when the device capability does not advertise support for them.
Return an error immediately after rejecting unsupported LCI or civic location request bits so the request cannot reach the driver.
--- net/wireless/pmsr.c | 2 ++ 1 file changed, 2 insertions(+)
net/wireless/pmsr.c +2 -0
@@ -109,6 +109,7 @@ static int pmsr_parse_ftm(struct cfg80211_registered_device *rdev,NL_SET_ERR_MSG_ATTR (info->extack, tb[NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI ],"FTM: LCI request not supported" ); +return -EOPNOTSUPP ; } out->ftm.request_civicloc =
@@ -117,6 +118,7 @@ static int pmsr_parse_ftm(struct cfg80211_registered_device *rdev,NL_SET_ERR_MSG_ATTR (info->extack, tb[NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC ],"FTM: civic location request not supported" ); +return -EOPNOTSUPP ; } out->ftm.trigger_based =
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 67/744 wifi: cfg80211: reject empty PMSR peer lists
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Li <[email protected]>
[ Upstream commit 57c05ce14fea03df01288fe1250f49197e161710 ]
A PMSR request with an empty peers array is not a useful request and weakens the cfg80211-to-driver contract by allowing start_pmsr() with no target peer.
Reject empty peer lists before allocating the request object or calling into the driver.
--- net/wireless/pmsr.c | 5 +++++ 1 file changed, 5 insertions(+)
net/wireless/pmsr.c +5 -0
@@ -332,6 +332,11 @@ int nl80211_pmsr_start(struct sk_buff *skb, struct genl_info *info) } } +if (!count) { +NL_SET_ERR_MSG_ATTR (info->extack, peers,"No peers specified" ); +return -EINVAL ; + } + req =kzalloc_flex (*req, peers, count);if (!req)return -ENOMEM ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 68/744 wifi: mac80211: avoid non-S1G AID fallback for S1G assoc
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Li <[email protected]>
[ Upstream commit 035ed430ce6a2c35b01e211844a9f0a7643e57a4 ]
When assoc_data->s1g is set and no AID Response element is present, falling back to mgmt->u.assoc_resp.aid reads the non-S1G association-response layout.
Keep the fallback for non-S1G only. If a successful S1G association response omits the AID Response element, abandon the association instead of proceeding with AID 0. Initialize aid to 0 for other S1G responses so the later mask and logging flow keeps a defined value without reading the non-S1G layout.
--- net/mac80211/mlme.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/mac80211/mlme.c +4 -2
@@ -6659,7 +6659,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, {struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data; -u16 capab_info, status_code, aid; +u16 capab_info, status_code, aid =0 ;struct ieee80211_elems_parse_params parse_params = { .bss =NULL , .link_id =-1 ,
@@ -6737,8 +6737,10 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,if (elems->aid_resp) aid =le16_to_cpu (elems->aid_resp->aid); -else +else if (!assoc_data->s1g) aid =le16_to_cpu (mgmt->u.assoc_resp.aid); +else if (status_code ==WLAN_STATUS_SUCCESS ) + goto abandon_assoc;/* * The 5 MSB of the AID field are reserved for a non-S1G STA. For
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 69/744 ASoC: amd: acp: Fix linker error with SDCA quirks
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Syed Saba Kareem <[email protected]>
[ Upstream commit dbbb5bc5176e36b13aa22e2174ab4779c5ae1dca ]
Fix undefined reference to snd_soc_acpi_amd_sdca_is_device_rt712_vb linker error when CONFIG_SND_SOC_ACPI_AMD_MATCH=y and CONFIG_SND_SOC_ACPI_AMD_SDCA_QUIRKS=m, which causes built-in code to reference a symbol only available in a module.
Fix this by changing SND_SOC_ACPI_AMD_SDCA_QUIRKS from tristate to bool and compiling the quirks code directly into snd-soc-acpi-amd-match rather than as a separate module. This ensures the quirks symbols are always available at link time when the match tables reference them.
--- sound/soc/amd/acp/Kconfig | 10 +++++++--- sound/soc/amd/acp/Makefile | 3 +-- sound/soc/amd/acp/amd-acp70-acpi-match.c | 2 +- sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.c | 4 ---- 4 files changed, 9 insertions(+), 10 deletions(-)
sound/soc/amd/acp/Kconfig +7 -3
@@ -15,13 +15,17 @@ config SND_SOC_AMD_ACP_COMMON config SND_SOC_ACPI_AMD_MATCH tristate - select SND_SOC_ACPI_AMD_SDCA_QUIRKS if SND_SOC_SDCA select SND_SOC_ACPI if ACPI config SND_SOC_ACPI_AMD_SDCA_QUIRKS - tristate - depends on ACPI + bool "AMD ACPI SDCA quirks" + depends on SND_SOC_ACPI_AMD_MATCH depends on SND_SOC_SDCA + depends on SND_SOC_ACPI_AMD_MATCH = m || SND_SOC_SDCA = y + default y + help + Enable SDCA quirk support for AMD ACPI match tables. + This is compiled into the snd-soc-acpi-amd-match module. if SND_SOC_AMD_ACP_COMMON
sound/soc/amd/acp/Makefile +1 -2
@@ -24,10 +24,10 @@ snd-acp-mach-y := acp-mach-common.o snd-acp-legacy-mach-y := acp-legacy-mach.o acp3x-es83xx/acp3x-es83xx.o snd-acp-sof-mach-y := acp-sof-mach.o snd-soc-acpi-amd-match-y := amd-acp63-acpi-match.o amd-acp70-acpi-match.o +snd-soc-acpi-amd-match-$(CONFIG_SND_SOC_ACPI_AMD_SDCA_QUIRKS) += soc-acpi-amd-sdca-quirks.o snd-acp-sdw-mach-y := acp-sdw-mach-common.o snd-acp-sdw-sof-mach-y += acp-sdw-sof-mach.o snd-acp-sdw-legacy-mach-y += acp-sdw-legacy-mach.o -snd-soc-acpi-amd-sdca-quirks-y += soc-acpi-amd-sdca-quirks.o obj-$(CONFIG_SND_SOC_AMD_ACP_PCM) += snd-acp-pcm.o obj-$(CONFIG_SND_SOC_AMD_ACP_I2S) += snd-acp-i2s.o
@@ -41,7 +41,6 @@ obj-$(CONFIG_SND_AMD_ASOC_REMBRANDT) += snd-acp-rembrandt.o obj-$(CONFIG_SND_AMD_ASOC_ACP63) += snd-acp63.o obj-$(CONFIG_SND_AMD_ASOC_ACP70) += snd-acp70.o -obj-$(CONFIG_SND_SOC_ACPI_AMD_SDCA_QUIRKS) += snd-soc-acpi-amd-sdca-quirks.o obj-$(CONFIG_SND_AMD_SOUNDWIRE_ACPI) += snd-amd-sdw-acpi.o obj-$(CONFIG_SND_SOC_AMD_MACH_COMMON) += snd-acp-mach.o obj-$(CONFIG_SND_SOC_AMD_LEGACY_MACH) += snd-acp-legacy-mach.o
sound/soc/amd/acp/amd-acp70-acpi-match.c +1 -1
@@ -775,5 +775,5 @@ MODULE_DESCRIPTION("AMD ACP7.0 & ACP7.1 tables and support for ACPI enumeration"MODULE_LICENSE ("GPL" );MODULE_AUTHOR ("[email protected]" );#if IS_ENABLED (CONFIG_SND_SOC_ACPI_AMD_SDCA_QUIRKS ) -MODULE_IMPORT_NS ("SND_SOC_ACPI_AMD_SDCA_QUIRKS" ); +MODULE_IMPORT_NS ("SND_SOC_SDCA" );#endif
sound/soc/amd/acp/soc-acpi-amd-sdca-quirks.c +0 -4
@@ -35,8 +35,4 @@ bool snd_soc_acpi_amd_sdca_is_device_rt712_vb(void *arg)return false; } -EXPORT_SYMBOL_NS (snd_soc_acpi_amd_sdca_is_device_rt712_vb,"SND_SOC_ACPI_AMD_SDCA_QUIRKS" ); -MODULE_DESCRIPTION ("ASoC ACPI AMD SDCA quirks" ); -MODULE_LICENSE ("GPL" ); -MODULE_IMPORT_NS ("SND_SOC_SDCA" );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 70/744 wifi: mac80211: free AP_VLAN bc_buf SKBs outside IRQ lock
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cen Zhang <[email protected]>
[ Upstream commit f3858d5b1432098c1936e03d6e03dd0e33facf60 ]
ieee80211_do_stop() removes AP_VLAN packets from the parent AP ps->bc_buf while holding ps->bc_buf.lock with IRQs disabled. It then calls ieee80211_free_txskb() before dropping the lock.
ieee80211_free_txskb() is not just a passive SKB release. For SKBs with TX status state it can report a dropped frame through cfg80211/nl80211, and that path can reach netlink tap transmit. This is the same reason the pending queue cleanup in ieee80211_do_stop() already unlinks SKBs under the queue lock and frees them after IRQ state is restored.
The buggy scenario involves two paths, with each column showing the order within that path:
AP_VLAN management TX: AP_VLAN stop: 1. attach ACK-status state 1. clear the running state 2. queue a multicast SKB on 2. take ps->bc_buf.lock with IRQs
parent ps->bc_buf disabled
3. unlink the AP_VLAN SKB
4. call ieee80211_free_txskb()
Unlink matching AP_VLAN SKBs from ps->bc_buf under the existing lock, but move them to a local free queue. Drop the lock and restore IRQ state before calling ieee80211_free_txskb().
WARNING: kernel/softirq.c:430 at __local_bh_enable_ip
--- net/mac80211/iface.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/mac80211/iface.c +7 -1
@@ -588,6 +588,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_doWARN_ON (!list_empty (&sdata->u.ap.vlans)); }else if (sdata->vif.type ==NL80211_IFTYPE_AP_VLAN ) {/* remove all packets in parent bc_buf pointing to this dev */ +__skb_queue_head_init (&freeq); ps = &sdata->bss->ps;spin_lock_irqsave (&ps->bc_buf.lock, flags);
@@ -595,10 +596,15 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_doif (skb->dev == sdata->dev) {__skb_unlink (skb, &ps->bc_buf); local->total_ps_buffered--; -ieee80211_free_txskb (&local->hw, skb); +__skb_queue_tail (&freeq, skb); } }spin_unlock_irqrestore (&ps->bc_buf.lock, flags); + + skb_queue_walk_safe(&freeq, skb, tmp) { +__skb_unlink (skb, &freeq); +ieee80211_free_txskb (&local->hw, skb); + } }if (going_down)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 71/744 wifi: cfg80211: use wiphy work for socket owner autodisconnect
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cen Zhang <[email protected]>
[ Upstream commit 0c2ed186bbe14304415476d6707b747dddcd8583 ]
nl80211_netlink_notify() walks the cfg80211 wireless device list when a NETLINK_GENERIC socket is released. If the socket owns a connection, the notifier queues the embedded wdev->disconnect_wk work item.
That work is a plain work_struct today. NETDEV_GOING_DOWN cancels it, but a NETLINK_URELEASE notifier that already observed conn_owner_nlportid can queue it after that cancel returns. _cfg80211_unregister_wdev() then removes the wdev from the list and waits for RCU readers, but synchronize_net() does not drain work queued by such a reader.
Make the autodisconnect work a wiphy_work instead. The callback already needs the wiphy mutex, and wiphy_work runs under that mutex. This lets teardown cancel pending autodisconnect work while holding the mutex, without a cancel_work_sync() vs. worker locking concern.
Also cancel the wiphy work after list_del_rcu() and synchronize_net(). Any NETLINK_URELEASE notifier that had already reached the wdev list has then either queued the work and it is removed, or can no longer find the wdev.
--- include/net/cfg80211.h | 2 +- net/wireless/core.c | 10 ++++++---- net/wireless/core.h | 2 +- net/wireless/nl80211.c | 3 ++- net/wireless/sme.c | 6 ++---- 5 files changed, 12 insertions(+), 11 deletions(-)
include/net/cfg80211.h +1 -1
@@ -6990,7 +6990,7 @@ struct wireless_dev {enum ieee80211_bss_type conn_bss_type;u32 conn_owner_nlportid; -struct work_struct disconnect_wk; +struct wiphy_work disconnect_wk;u8 disconnect_bssid[ETH_ALEN ];struct list_head event_list;
net/wireless/core.c +6 -4
@@ -1378,6 +1378,7 @@ static void _cfg80211_unregister_wdev(struct wireless_dev *wdev,list_del_rcu (&wdev->list);synchronize_net (); rdev->devlist_generation++; +wiphy_work_cancel (wdev->wiphy, &wdev->disconnect_wk);cfg80211_mlme_purge_registrations (wdev);
@@ -1585,7 +1586,7 @@ void cfg80211_init_wdev(struct wireless_dev *wdev) wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr) wdev->netdev->priv_flags |= IFF_DONT_BRIDGE; -INIT_WORK (&wdev->disconnect_wk, cfg80211_autodisconnect_wk); +wiphy_work_init (&wdev->disconnect_wk, cfg80211_autodisconnect_wk); } void cfg80211_register_wdev(struct cfg80211_registered_device *rdev,
@@ -1691,10 +1692,11 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,break ;case NETDEV_GOING_DOWN :cfg80211_leave (rdev, wdev,-1 ); - scoped_guard(wiphy, &rdev->wiphy) + scoped_guard(wiphy, &rdev->wiphy) {cfg80211_remove_links (wdev); -/* since we just did cfg80211_leave() nothing to do there */ -cancel_work_sync (&wdev->disconnect_wk); +/* since we just did cfg80211_leave() nothing to do there */ +wiphy_work_cancel (wdev->wiphy, &wdev->disconnect_wk); + }break ;case NETDEV_DOWN :wiphy_lock (&rdev->wiphy);
net/wireless/core.h +1 -1
@@ -428,7 +428,7 @@ void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *peer_addr, const u8 *td_bitmap, u8 td_bitmap_len);int cfg80211_mgd_wext_connect (struct cfg80211_registered_device *rdev,struct wireless_dev *wdev); -void cfg80211_autodisconnect_wk (struct work_struct *work); +void cfg80211_autodisconnect_wk (struct wiphy *wiphy,struct wiphy_work *work);/* SME implementation */ void cfg80211_conn_work (struct work_struct *work);
net/wireless/nl80211.c +2 -1
@@ -22557,7 +22557,8 @@ static int nl80211_netlink_notify(struct notifier_block * nb, wdev->nl_owner_dead = true;schedule_work (&rdev->destroy_work); }else if (wdev->conn_owner_nlportid == notify->portid) { -schedule_work (&wdev->disconnect_wk); +wiphy_work_queue (wdev->wiphy, + &wdev->disconnect_wk); }cfg80211_release_pmsr (wdev, notify->portid);
net/wireless/sme.c +2 -4
@@ -1577,13 +1577,11 @@ int cfg80211_disconnect(struct cfg80211_registered_device *rdev,* Used to clean up after the connection / connection attempt owner socket * disconnects */ -void cfg80211_autodisconnect_wk (struct work_struct *work) +void cfg80211_autodisconnect_wk (struct wiphy *wiphy,struct wiphy_work *work) {struct wireless_dev *wdev = container_of(work, struct wireless_dev, disconnect_wk); -struct cfg80211_registered_device *rdev =wiphy_to_rdev (wdev->wiphy); - -guard (wiphy)(wdev->wiphy); +struct cfg80211_registered_device *rdev =wiphy_to_rdev (wiphy);if (wdev->conn_owner_nlportid) {switch (wdev->iftype) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 72/744 wifi: brcmfmac: initialize SDIO data work before cleanup
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Runyu Xiao <[email protected]>
[ Upstream commit 2a665946e0407a05a3f81bd56a08553c446498e0 ]
brcmf_sdio_probe() stores the newly allocated bus in sdiodev->bus before allocating the ordered workqueue. If that allocation fails, the function jumps to fail and calls brcmf_sdio_remove().
brcmf_sdio_remove() unconditionally cancels bus->datawork. Initialize the work item before the first failure path that can reach brcmf_sdio_remove(), so the cleanup path always observes a valid work object.
This issue was found by our static analysis tool and then confirmed by manual review of the probe error path and the remove-time work drain. The problem pattern is an early setup failure that reaches a cleanup helper which cancels an embedded work item before its initializer has run.
A QEMU PoC forced alloc_ordered_workqueue() to fail at the same point in brcmf_sdio_probe(), before INIT_WORK(&bus->datawork) is reached. The resulting fail path calls brcmf_sdio_remove(), and DEBUG_OBJECTS reports the invalid work drain with brcmf_sdio_probe() and brcmf_sdio_remove() in the stack.
--- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +1 -1
@@ -4465,6 +4465,7 @@ int brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev) bus->sdiodev = sdiodev; sdiodev->bus = bus;skb_queue_head_init (&bus->glom); +INIT_WORK (&bus->datawork, brcmf_sdio_dataworker); bus->txbound =BRCMF_TXBOUND ; bus->rxbound =BRCMF_RXBOUND ; bus->txminmax =BRCMF_TXMINMAX ;
@@ -4479,7 +4480,6 @@ int brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev) goto fail; }brcmf_sdiod_freezer_count (sdiodev); -INIT_WORK (&bus->datawork, brcmf_sdio_dataworker); bus->brcmf_wq = wq;/* attempt to attach to the dongle */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 73/744 wifi: cfg80211: bound element ID read when checking non-inheritance
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: HE WEI (ギカク) <[email protected]>
[ Upstream commit cb8afea4655ff004fa7feee825d5c79783525383 ]
cfg80211_is_element_inherited() reads the first data octet of the candidate element (id = elem->data[0]) to look it up in an extension non-inheritance list. It does so after testing elem->id, but without verifying that the element actually has a data octet. A zero-length extension element (WLAN_EID_EXTENSION with length 0) therefore makes it read one octet past the end of the element.
_ieee802_11_parse_elems_full() runs this check for every element of a frame once a non-inheritance context exists -- e.g. while parsing a per-STA profile of a Multi-Link element in a (re)association response, or a non-transmitted BSS profile -- so a crafted frame from an AP can trigger a one-octet slab-out-of-bounds read during element parsing:
BUG: KASAN: slab-out-of-bounds in cfg80211_is_element_inherited Read of size 1 ... in net/wireless/scan.c
Return early (treat the element as inherited) when an extension element carries no data, mirroring the existing handling of empty ID lists.
The bug was found by fuzzing ieee802_11_parse_elems_full() under KASAN.
--- net/wireless/scan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/wireless/scan.c +1 -1
@@ -205,7 +205,7 @@ bool cfg80211_is_element_inherited(const struct element *elem,return true;if (elem->id ==WLAN_EID_EXTENSION ) { -if (!ext_id_len) +if (!ext_id_len || !elem->datalen)return true; loop_len = ext_id_len; list = &non_inherit_elem->data[3 + id_len];
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 74/744 firmware: arm_ffa: Fix out-of-bound writes in ffa_setup_and_transmit()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mostafa Saleh <[email protected]>
[ Upstream commit 3383ffb7ef937317361713ffcc21921a7848511a ]
Sashiko (locally) reports multiple out-of-bound issues in ffa_setup_and_transmit:
1) Writing ep_mem_access->reserved can write out of bounds for FFA versions < 1.2 as ffa_emad_size_get() returns 16 bytes in that case while reserved has an offset of 24.
Instead of zeroing fields, memset the struct to zero first based on the FFA version.
2) Make sure there is enough size to write constituents.
While at it, convert the only sizeof() in the driver that uses a type instead of variable.
--- drivers/firmware/arm_ffa/driver.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/firmware/arm_ffa/driver.c +3 -4
@@ -723,11 +723,10 @@ ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize,for (idx =0 ; idx < args->nattrs; idx++) { ep_mem_access = buffer +ffa_mem_desc_offset (buffer, idx, drv_info->version); +memset (ep_mem_access,0 ,ffa_emad_size_get (drv_info->version)); ep_mem_access->receiver = args->attrs[idx].receiver; ep_mem_access->attrs = args->attrs[idx].attrs; ep_mem_access->composite_off = composite_offset; - ep_mem_access->flag =0 ; - ep_mem_access->reserved =0 ;ffa_emad_impdef_value_init (drv_info->version, ep_mem_access->impdef_val, args->attrs[idx].impdef_val);
@@ -767,7 +766,7 @@ ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize, constituents = buffer; } -if ((void *)constituents - buffer > max_fragsize) { +if ((void *)constituents +sizeof (*constituents) - buffer > max_fragsize) {pr_err ("Memory Region Fragment > Tx Buffer size\n" );return -EFAULT ; }
@@ -776,7 +775,7 @@ ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize, constituents->pg_cnt = args->sg->length /FFA_PAGE_SIZE ; constituents->reserved =0 ; constituents++; - frag_len +=sizeof (struct ffa_mem_region_addr_range ); + frag_len +=sizeof (*constituents); }while ((args->sg =sg_next (args->sg))); return ffa_transmit_fragment(func_id, addr, buf_sz, frag_len,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 75/744 firmware: arm_ffa: Fix Endpoint Memory Access Descriptor offset calculation
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Ene <[email protected]>
[ Upstream commit b4d961351aa84fdf0148783fb1f3a1391b8a0adb ]
Use the descriptor's ep_mem_offset to calculate the start of the endpoint memory access array and to comply with the FF-A spec instead of defaulting to sizeof(struct ffa_mem_region).
This requires moving ffa_mem_region_additional_setup() earlier in the setup flow.
Also, add sanity checks to ensure the calculated descriptor offsets do not exceed max_fragsize.
--- drivers/firmware/arm_ffa/driver.c | 20 +++++++++++++++----- include/linux/arm_ffa.h | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-)
drivers/firmware/arm_ffa/driver.c +15 -5
@@ -711,19 +711,30 @@ ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize,struct ffa_composite_mem_region *composite;struct ffa_mem_region_addr_range *constituents;struct ffa_mem_region_attributes *ep_mem_access; -u32 idx, frag_len, length, buf_sz =0 , num_entries =sg_nents (args->sg); +u32 idx, frag_len, length, buf_sz =0 , num_entries =sg_nents (args->sg), ep_offset; +u32 emad_end, emad_size =ffa_emad_size_get (drv_info->version); mem_region->tag = args->tag; mem_region->flags = args->flags; mem_region->sender_id = drv_info->vm_id; mem_region->attributes =ffa_memory_attributes_get (func_id); + +ffa_mem_region_additional_setup (drv_info->version, mem_region); composite_offset =ffa_mem_desc_offset (buffer, args->nattrs, drv_info->version); +if (composite_offset +sizeof (*composite) > max_fragsize) +return -ENXIO ;for (idx =0 ; idx < args->nattrs; idx++) { - ep_mem_access = buffer + -ffa_mem_desc_offset (buffer, idx, drv_info->version); -memset (ep_mem_access,0 ,ffa_emad_size_get (drv_info->version)); + ep_offset =ffa_mem_desc_offset (buffer, idx, drv_info->version); +if (check_add_overflow (ep_offset, emad_size, &emad_end)) +return -ENXIO ; + +if (emad_end > max_fragsize) +return -ENXIO ; + + ep_mem_access = buffer + ep_offset; +memset (ep_mem_access,0 , emad_size); ep_mem_access->receiver = args->attrs[idx].receiver; ep_mem_access->attrs = args->attrs[idx].attrs; ep_mem_access->composite_off = composite_offset;
@@ -733,7 +744,6 @@ ffa_setup_and_transmit(u32 func_id, void *buffer, u32 max_fragsize, } mem_region->handle =0 ; mem_region->ep_count = args->nattrs; -ffa_mem_region_additional_setup (drv_info->version, mem_region); composite = buffer + composite_offset; composite->total_pg_cnt =ffa_get_num_pages_sg (args->sg);
include/linux/arm_ffa.h +1 -1
@@ -445,7 +445,7 @@ ffa_mem_desc_offset(struct ffa_mem_region *buf, int count, u32 ffa_version)if (!FFA_MEM_REGION_HAS_EP_MEM_OFFSET (ffa_version)) offset += offsetof(struct ffa_mem_region , ep_mem_offset);else - offset +=sizeof (struct ffa_mem_region ); + offset += buf->ep_mem_offset;return offset; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 76/744 ASoC: meson: aiu: fifo-spdif: soft reset the S/PDIF datapath on start/stop
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Hewitt <[email protected]>
[ Upstream commit 6b59c53c8adc2b522327407af5e1793a65b67e4b ]
The I2S FIFO soft-resets its fast domain on start (AIU_RST_SOFT bit 0 + AIU_I2S_SYNC read in aiu_fifo_i2s_trigger), mirroring the downstream vendor driver's audio_out_i2s_enable(). The S/PDIF FIFO has no equivalent:
it only toggles the IEC958 DCU, so a stale datapath FIFO can be replayed, producing the "machine gun noise" buffer underrun - on start when switching outputs, and on stop when playback ends. The latter is audible on devices with an always-on S/PDIF-fed DAC (e.g. the ES7144 on the WeTek Play2).
The vendor driver resets the IEC958 fast domain (AIU_RST_SOFT bit 2) on both enable and disable (audio_hw_958_enable), and when reconfiguring (audio_hw_958_reset clears AIU_958_DCU_FF_CTRL then resets). Do the same:
reset before enabling the DCU on start, and before disabling on stop.
--- sound/soc/meson/aiu-fifo-spdif.c | 5 +++++ 1 file changed, 5 insertions(+)
sound/soc/meson/aiu-fifo-spdif.c +5 -0
@@ -24,6 +24,7 @@#define AIU_MEM_IEC958_CONTROL_MODE_16BIT BIT(7)#define AIU_MEM_IEC958_CONTROL_MODE_LINEAR BIT(8)#define AIU_MEM_IEC958_BUF_CNTL_INIT BIT(0) +#define AIU_RST_SOFT_958_FAST BIT(2)#define AIU_FIFO_SPDIF_BLOCK 8
@@ -68,11 +69,15 @@ static int fifo_spdif_trigger(struct snd_pcm_substream *substream, int cmd,case SNDRV_PCM_TRIGGER_START :case SNDRV_PCM_TRIGGER_RESUME :case SNDRV_PCM_TRIGGER_PAUSE_RELEASE : +snd_soc_component_write (component,AIU_RST_SOFT , +AIU_RST_SOFT_958_FAST );fifo_spdif_dcu_enable (component, true);break ;case SNDRV_PCM_TRIGGER_SUSPEND :case SNDRV_PCM_TRIGGER_PAUSE_PUSH :case SNDRV_PCM_TRIGGER_STOP : +snd_soc_component_write (component,AIU_RST_SOFT , +AIU_RST_SOFT_958_FAST );fifo_spdif_dcu_enable (component, false);break ;default :
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 77/744 ASoC: amd: ps: disable MSI on resume in ACP PCI driver
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vijendar Mukunda <[email protected]>
[ Upstream commit 5893013efabb056399a01e267f410cf76eba25eb ]
BIOS/firmware may re-enable MSI in PCI config space during system level resume even though this driver only uses legacy INTx interrupts. If MSI is left enabled with stale address/data registers, the device will write interrupts to a bogus address causing IOMMU IO_PAGE_FAULT and interrupt delivery failure.
Clear the MSI Enable bit before reinitializing the ACP hardware on system level resume.
--- sound/soc/amd/ps/pci-ps.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
sound/soc/amd/ps/pci-ps.c +29 -0
@@ -692,8 +692,37 @@ static int snd_acp_runtime_resume(struct device *dev)return acp_hw_runtime_resume (dev); } +static void acp_disable_msi_on_resume (struct pci_dev *pdev) +{ +u16 control; + +if (!pdev->msi_cap) +return ; + +pci_read_config_word (pdev, pdev->msi_cap +PCI_MSI_FLAGS , &control); +if (control &PCI_MSI_FLAGS_ENABLE ) { +dev_warn (&pdev->dev, +"ACP: MSI unexpectedly enabled after resume (flags=0x%04x), disabling\n" , + control); + control &= ~PCI_MSI_FLAGS_ENABLE ; +pci_write_config_word (pdev, pdev->msi_cap +PCI_MSI_FLAGS , control); + } +} +static int snd_acp_resume (struct device *dev) { +struct pci_dev *pdev =to_pci_dev (dev); + +/* +* BIOS/firmware may re-enable MSI in PCI config space during +* system resume even though this driver only uses legacy INTx +* interrupts. If MSI is left enabled with stale address/data +* registers, the device will write interrupts to a bogus address +* causing IOMMU IO_PAGE_FAULT and interrupt delivery failure. +* Explicitly clear the MSI Enable bit before reinitializing +* the ACP hardware. +*/ +acp_disable_msi_on_resume (pdev);return acp_hw_resume (dev); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 78/744 ASoC: amd: ps: fix wrong ACP version string in pci_request_regions()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vijendar Mukunda <[email protected]>
[ Upstream commit f7697ecf6eab9d4887dd731038b3dc405c7e755e ]
The driver handles ACP6.3/7.0/7.1/7.2 platforms but the region was claimed with the stale name "AMD ACP6.2 audio" left over from the original ACP6.2 driver. Correct it to "AMD ACP6.3 audio".
--- sound/soc/amd/ps/pci-ps.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/amd/ps/pci-ps.c +1 -1
@@ -601,7 +601,7 @@ static int snd_acp63_probe(struct pci_dev *pci,return -ENODEV ; } - ret =pci_request_regions (pci,"AMD ACP6.2 audio" ); + ret =pci_request_regions (pci,"AMD ACP6.3 audio" );if (ret <0 ) {dev_err (&pci->dev,"pci_request_regions failed\n" ); goto disable_pci;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 79/744 ASoC: amd: ps: replace bitwise OR with logical OR in IRQ return check
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vijendar Mukunda <[email protected]>
[ Upstream commit dec5aaa27603e1d7b426ce3504af6d1a62e4d444 ]
The condition 'irq_flag | wake_irq_flag' uses bitwise OR to combine two integer flags that are used as booleans. Replace with logical OR '||' to correctly express the intended boolean check.
--- sound/soc/amd/ps/pci-ps.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/amd/ps/pci-ps.c +1 -1
@@ -248,7 +248,7 @@ static irqreturn_t acp63_irq_handler(int irq, void *dev_id)if (sdw_dma_irq_flag)return IRQ_WAKE_THREAD ; -if (irq_flag | wake_irq_flag) +if (irq_flag || wake_irq_flag)return IRQ_HANDLED ;else return IRQ_NONE ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 80/744 erofs: relax sanity check for tail pclusters due to ztailpacking
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
[ Upstream commit d3386e17393bec1341cfeedb9d08d6846ccd6fb2 ]
If the tail data can be inlined into the inode meta block, it should be converted into a regular tail pcluster.
In principle, it should be converted into an uncompressed pcluster if there is not enough gain to use compression (map->m_llen < map->m_plen); but since there are various shipped images, relax the condition for ztailpacking tail pcluster fallback instead of reporting corruption incorrectly.
--- fs/erofs/zmap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/erofs/zmap.c +2 -1
@@ -721,7 +721,8 @@ static int z_erofs_map_sanity_check(struct inode *inode, map->m_algorithmformat, EROFS_I(inode)->nid);return -EFSCORRUPTED ; } -if (EROFS_MAP_FULL (map->m_flags) && map->m_llen < map->m_plen) { +if (EROFS_MAP_FULL (map->m_flags) && map->m_llen < map->m_plen && + map->m_la + map->m_llen < inode->i_size) {erofs_err (inode->i_sb,"too much compressed data @ la %llu of nid %llu" , map->m_la,EROFS_I (inode)->nid);return -EFSCORRUPTED ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 81/744 ASoC: cs42l43: Correct report for forced microphone jack
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Keepax <[email protected]>
[ Upstream commit f74e6e15485b68b92b2807071e822db6309b7e38 ]
Currently if the jack is forced to the microphone mode, it will report as line in. Correct the report to microphone.
--- sound/soc/codecs/cs42l43-jack.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/soc/codecs/cs42l43-jack.c +2 -1
@@ -310,6 +310,7 @@ irqreturn_t cs42l43_bias_detect_clamp(int irq, void *data)#define CS42L43_JACK_ABSENT 0x0#define CS42L43_JACK_OPTICAL (SND_JACK_MECHANICAL | SND_JACK_AVOUT) +#define CS42L43_JACK_MICROPHONE (SND_JACK_MECHANICAL | SND_JACK_MICROPHONE)#define CS42L43_JACK_HEADPHONE (SND_JACK_MECHANICAL | SND_JACK_HEADPHONE)#define CS42L43_JACK_HEADSET (SND_JACK_MECHANICAL | SND_JACK_HEADSET)#define CS42L43_JACK_LINEOUT (SND_JACK_MECHANICAL | SND_JACK_LINEOUT)
@@ -871,7 +872,7 @@ static const struct cs42l43_jack_override_mode { .hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES, .mic_ctrl = (0x3 <<CS42L43_JACK_STEREO_CONFIG_SHIFT ) | CS42L43_HS1_BIAS_EN_MASK | CS42L43_HS2_BIAS_EN_MASK, - .report = CS42L43_JACK_LINEIN, + .report = CS42L43_JACK_MICROPHONE, }, [CS42L43_JACK_RAW_OPTICAL] = { .hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 82/744 sched_ext: Enable tick for finite slices on nohz_full
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrea Righi <[email protected]>
[ Upstream commit 4ec10f38ff901dc10503d57cbdcf941248419ac1 ]
set_next_task_scx() updates the tick dependency before __schedule() updates rq->curr. When switching from a non-EXT task, such as idle, to an EXT task with a finite slice, sched_update_tick_dependency() checks the outgoing task and can allow the tick to remain stopped.
The dependency can also be lost without a slice-type transition. After a finite-slice task leaves the CPU idle, the enqueue path can clear the dependency against the idle rq->curr. SCX_RQ_CAN_STOP_TICK still records a finite slice, so another finite task skips the transition block and can run without the ticks needed to expire its slice.
The reverse mismatch can also happen when the last finite-slice EXT task is dequeued: sub_nr_running() updates the dependency before rq->curr changes, so the outgoing task state can keep the dependency set after the CPU goes idle.
Fix this by unconditionally enabling the scheduler tick whenever a finite-slice EXT task is selected on a nohz_full CPU. Moreover, when the last runnable EXT task leaves, ignore the outgoing EXT slice state so the generic scheduler can correctly re-evaluate and clear the tick dependency.
--- kernel/sched/ext.c | 47 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-)
kernel/sched/ext.c +35 -12
@@ -2985,24 +2985,38 @@ static void set_next_task_scx(struct rq *rq, struct task_struct *p, bool first)/* * @p is getting newly scheduled or got kicked after someone updated its -* slice. Refresh whether tick can be stopped. See scx_can_stop_tick(). +* slice. Update SCX_RQ_CAN_STOP_TICK to reflect whether the tick can be +* stopped. See scx_can_stop_tick(). +* +* Moreover, refresh the load_avgs just when transitioning in and out of +* nohz. In the future, we might want to add a mechanism to update +* load_avgs periodically on tick-stopped CPUs. */ -if ((p->scx.slice ==SCX_SLICE_INF ) != - (bool )(rq->scx.flags &SCX_RQ_CAN_STOP_TICK )) { -if (p->scx.slice ==SCX_SLICE_INF ) +if (p->scx.slice ==SCX_SLICE_INF ) { +if (!(rq->scx.flags &SCX_RQ_CAN_STOP_TICK )) { +/* +* Bypass mode always assigns finite slices, so @p +* can't have an infinite slice while bypassing. +* Therefore, sched_update_tick_dependency() can safely +* evaluate the outgoing task. +*/ rq->scx.flags |=SCX_RQ_CAN_STOP_TICK ; -else - rq->scx.flags &= ~SCX_RQ_CAN_STOP_TICK ; +sched_update_tick_dependency (rq); -sched_update_tick_dependency (rq); +update_other_load_avgs (rq); + } + }else { +if (rq->scx.flags &SCX_RQ_CAN_STOP_TICK ) { + rq->scx.flags &= ~SCX_RQ_CAN_STOP_TICK ; +update_other_load_avgs (rq); + }/* -* For now, let's refresh the load_avgs just when transitioning -* in and out of nohz. In the future, we might want to add a -* mechanism which calls the following periodically on -* tick-stopped CPUs. +* @rq still references the outgoing scheduling context. A finite +* slice is sufficient by itself to require the tick. */ -update_other_load_avgs (rq); +if (tick_nohz_full_cpu (cpu_of (rq))) +tick_nohz_dep_set_cpu (cpu_of (rq),TICK_DEP_BIT_SCHED ); } }
@@ -4296,6 +4310,15 @@ bool scx_can_stop_tick(struct rq *rq)if (p->sched_class != &ext_sched_class)return true; +/* +* @rq->curr may still reference an outgoing EXT task after it has been +* dequeued. If no EXT tasks are accounted on @rq, ignore its stale +* slice state. If another task is dispatched from a DSQ, +* set_next_task_scx() will update the dependency for the incoming task. +*/ +if (!rq->scx.nr_running) +return true; +if (scx_bypassing (sch,cpu_of (rq)))return false;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 83/744 ASoC: tas2562: fix deprecated shut-down GPIO always cleared after lookup
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uday Khare <[email protected]>
[ Upstream commit 3238c634725afbb2a137fdda762208510828f71d ]
In tas2562_parse_dt(), the fallback lookup for the deprecated "shut-down" GPIO property is broken due to a missing pair of braces.
The code intends to reset sdz_gpio to NULL only when the lookup returns an error that is not -EPROBE_DEFER (so the driver gracefully continues without a GPIO). However, without braces the statement:
tas2562->sdz_gpio = NULL;
falls outside the IS_ERR() check and is executed unconditionally for every path through the if block, including a successful GPIO lookup.
This means any device using the deprecated 'shut-down' DT property will always have sdz_gpio == NULL after probe, making the GPIO completely non-functional.
Fix this by adding the missing braces to scope the NULL assignment inside the IS_ERR() branch, matching the pattern already used for the primary 'shutdown' GPIO lookup above.
--- sound/soc/codecs/tas2562.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/soc/codecs/tas2562.c +3 -2
@@ -675,11 +675,12 @@ static int tas2562_parse_dt(struct tas2562_data *tas2562)if (tas2562->sdz_gpio ==NULL ) { tas2562->sdz_gpio =devm_gpiod_get_optional (dev,"shut-down" ,GPIOD_OUT_HIGH ); -if (IS_ERR (tas2562->sdz_gpio)) +if (IS_ERR (tas2562->sdz_gpio)) {if (PTR_ERR (tas2562->sdz_gpio) == -EPROBE_DEFER )return -EPROBE_DEFER ; - tas2562->sdz_gpio =NULL ; + tas2562->sdz_gpio =NULL ; + } }if (tas2562->model_id ==TAS2110 )
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 84/744 firmware: arm_scmi: Rate-limit queue-full warnings in IRQ context
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pushpendra Singh <[email protected]>
[ Upstream commit a4447c0693830d5ecadd6e755cb7fdc55d86aacc ]
The scmi_notify() function is called from interrupt context to queue received notification events onto a per-protocol kfifo. When the kfifo is full, it logs a warning via dev_warn() for every dropped event.
Under conditions where the platform sends a burst of SCMI notifications faster than the deferred worker can drain the queue, this results in a flood of dev_warn() calls from IRQ context. Each call acquires the console lock and may execute blocking console writes, causing the CPU to be held in interrupt context for an extended period and leading to observable system stalls.
Fix this by switching to dev_warn_ratelimited() to limit the frequency of log messages when the notification queue is full. This reduces console overhead in interrupt context and prevents CPU stalls caused by excessive logging, while still preserving diagnostic visibility.
--- drivers/firmware/arm_scmi/notify.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/firmware/arm_scmi/notify.c +3 -3
@@ -600,9 +600,9 @@ int scmi_notify(const struct scmi_handle *handle, u8 proto_id, u8 evt_id,return -EINVAL ; }if (kfifo_avail (&r_evt->proto->equeue.kfifo) <sizeof (eh) + len) { -dev_warn (handle->dev, -"queue full, dropping proto_id:%d evt_id:%d ts:%lld\n" , - proto_id, evt_id,ktime_to_ns (ts)); +dev_warn_ratelimited (handle->dev, +"queue full, dropping proto_id:%d evt_id:%d ts:%lld\n" , + proto_id, evt_id,ktime_to_ns (ts));return -ENOMEM ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 85/744 bpf: Fix UAF in sock clone early bailouts
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Bobrowski <[email protected]>
[ Upstream commit 7cbd0c4cebe4c9f678d15e6b9ba975e1155a107f ]
Similar to recent commit 9b51a6155d14 ("bpf,fork: wipe ->bpf_storage before bailouts that access it"), sk_clone() performs an initial shallow copy of the socket field ->sk_bpf_storage via sock_copy() for the cloned socket newsk.
If sk_clone() bails out early (e.g. if sk_filter_charge() fails) prior to calling bpf_sk_storage_clone(), newsk->sk_bpf_storage still points to the parent socket's BPF local storage. When newsk is subsequently freed via sk_free(), the deallocation path (__sk_destruct() -> bpf_sk_storage_free()) destroys the parent socket's BPF local storage, leading to a use-after-free (UAF) on the parent socket.
Fix this by resetting newsk->sk_bpf_storage to NULL immediately after sock_copy() in sk_clone(), and remove the now redundant initialization from bpf_sk_storage_clone().
--- net/core/bpf_sk_storage.c | 2 -- net/core/sock.c | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-)
net/core/bpf_sk_storage.c +0 -2
@@ -158,8 +158,6 @@ int bpf_sk_storage_clone(const struct sock *sk, struct sock *newsk)struct bpf_local_storage_elem *selem;int ret =0 ; -RCU_INIT_POINTER (newsk->sk_bpf_storage,NULL ); -rcu_read_lock_dont_migrate (); sk_storage =rcu_dereference (sk->sk_bpf_storage);
net/core/sock.c +3 -0
@@ -2492,6 +2492,9 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority,sock_copy (newsk, sk); newsk->sk_prot_creator = prot; +#ifdef CONFIG_BPF_SYSCALL +RCU_INIT_POINTER (newsk->sk_bpf_storage,NULL ); +#endif /* SANITY */ if (likely (newsk->sk_net_refcnt)) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 86/744 cpufreq: Make cpufreq_update_pressure() fall back to cpuinfo.max_freq
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
[ Upstream commit d2d5c129d07ea8eb91cd8a8633b5774116c4d171 ]
If arch_scale_freq_ref() is not defined for a given arch (like x86, for example), cpufreq_update_pressure() will always set cpufreq_pressure to zero for all CPUs in the system, which is generally problematic on systems with asymmetric capacity [1].
However, in the absence of arch_scale_freq_ref(), it is reasonable to assume that cpuinfo.max_freq is the maximum sustainable frequency for the given cpufreq policy. Moreover, there are cases in which arch_scale_freq_ref() would need to be defined to return essentially the cpuinfo.max_freq value anyway (for example, intel_pstate on hybrid platforms).
For the above reasons, update cpufreq_update_pressure() to fall back to using cpuinfo.max_freq as the reference frequency if zero is returned by arch_scale_freq_ref().
--- drivers/cpufreq/cpufreq.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/cpufreq/cpufreq.c +3 -0
@@ -2583,6 +2583,9 @@ static void cpufreq_update_pressure(struct cpufreq_policy *policy) cpu =cpumask_first (policy->related_cpus); max_freq =arch_scale_freq_ref (cpu); +if (!max_freq) + max_freq = policy->cpuinfo.max_freq; + capped_freq = policy->max;/*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 87/744 sched_ext: Record an error on errno-only sub-enable failure
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
[ Upstream commit db4e9defd2e8620abee04cfe5809c0bcd6ecf06a ]
scx_sub_enable_workfn() has several failure paths that only return an errno (e.g. -ENOMEM from an allocation) and jump to err_disable without calling scx_error(). scx_flush_disable_work() runs the disable, and thus ops.exit(), only when an error has been recorded, so an errno-only failure leaves the half-initialized sub-scheduler linked.
Record an error at the err_disable sink so every errno-only failure runs the disable path.
--- kernel/sched/ext.c | 6 ++++++ 1 file changed, 6 insertions(+)
kernel/sched/ext.c +6 -0
@@ -7440,6 +7440,12 @@ static void scx_sub_enable_workfn(struct kthread_work *work)percpu_up_write (&scx_fork_rwsem); err_disable:mutex_unlock (&scx_enable_mutex); +/* +* Some enable failures only return an errno (e.g. -ENOMEM from an +* allocation) without calling scx_error(). Record it so +* scx_flush_disable_work() runs the disable and ops.exit() fires. +*/ +scx_error (sch,"scx_sub_enable() failed (%d)" , ret);scx_flush_disable_work (sch); cmd->ret =0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 88/744 ppp: defer channel free to an RCU grace period to fix pppol2tp RX UAF
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Norbert Szetei <[email protected]>
[ Upstream commit ec4215683e47424c9c4762fd3c60f552a3119142 ]
pppol2tp_recv() runs in the L2TP UDP-encap softirq RX path:
l2tp_udp_encap_recv() -> l2tp_recv_common() -> pppol2tp_recv()
-> ppp_input(&po->chan)
It runs under rcu_read_lock() holding only an l2tp_session reference and takes NO reference on the internal PPP channel (struct channel, chan->ppp) that ppp_input() dereferences.
The pppox socket is SOCK_RCU_FREE, so 'po' and the embedded ppp_channel are RCU-safe. But the internal struct channel is a separate allocation that ppp_release_channel() frees with a plain kfree():
close(data socket) -> pppol2tp_release() -> pppox_unbind_sock()
-> ppp_unregister_channel() -> ppp_release_channel() -> kfree(pch)
For a channel that is bound (PPPIOCGCHAN) but not attached to a ppp unit (no PPPIOCCONNECT, pch->ppp == NULL) and not bridged, teardown skips both ppp_disconnect_channel()'s synchronize_net() and ppp_unbridge_channels()'s synchronize_rcu(), so the kfree() has no grace period. rcu_read_lock() in pppol2tp_recv() does not protect against a plain kfree(), so an in-flight ppp_input() on one CPU can dereference the channel just freed by close() on another CPU.
The bug is reachable by an unprivileged user.
Defer the channel free to an RCU callback via call_rcu() so the grace period fences any in-flight ppp_input(). The disconnect and unbridge teardown paths already fence with synchronize_net()/synchronize_rcu(); call_rcu() does the same here without stalling the close() path.
--- drivers/net/ppp/ppp_generic.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
drivers/net/ppp/ppp_generic.c +15 -3
@@ -184,6 +184,7 @@ struct channel {struct list_head clist;/* link in list of channels per unit */ spinlock_t upl;/* protects `ppp' and 'bridge' */ struct channel __rcu *bridge;/* "bridged" ppp channel */ +struct rcu_head rcu;/* for RCU-deferred free of the channel */ #ifdef CONFIG_PPP_MULTILINK u8 avail;/* flag used in multilink stuff */ u8 had_frag;/* >= 1 fragments have been sent */
@@ -3562,6 +3563,18 @@ ppp_disconnect_channel(struct channel *pch)return err; } +/* Purge after the grace period: a late ppp_input() may still queue an +* skb on pch->file.rq before the last RCU reader drains. +*/ +static void ppp_release_channel_free (struct rcu_head *rcu) +{ + struct channel *pch = container_of(rcu, struct channel, rcu); + +skb_queue_purge (&pch->file.xq); +skb_queue_purge (&pch->file.rq); +kfree (pch); +} +/* * Drop a reference to a ppp channel and free its memory if the refcount reaches * zero.
@@ -3581,9 +3594,7 @@ static void ppp_release_channel(struct channel *pch)pr_err ("ppp: destroying undead channel %p !\n" , pch);return ; } -skb_queue_purge (&pch->file.xq); -skb_queue_purge (&pch->file.rq); -kfree (pch); +call_rcu (&pch->rcu, ppp_release_channel_free); } static void __exit ppp_cleanup(void)
@@ -3596,6 +3607,7 @@ static void __exit ppp_cleanup(void)device_destroy (&ppp_class,MKDEV (PPP_MAJOR ,0 ));class_unregister (&ppp_class);unregister_pernet_device (&ppp_net_ops); +rcu_barrier ();/* wait for RCU callbacks before module unload */ }/*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 89/744 ipv4: fib: free fib_alias with kfree_rcu() on insert error path
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weiming Shi <[email protected]>
[ Upstream commit f2f152e94a67bc746afaf05a1b2702c195553112 ]
fib_table_insert() publishes new_fa into the leaf's fa_list with fib_insert_alias() before calling the fib entry notifiers. When a notifier fails, the error path removes new_fa with fib_remove_alias() (hlist_del_rcu) and frees it right away with kmem_cache_free().
fib_table_lookup() walks that list under rcu_read_lock() only, so a concurrent lookup that already reached new_fa keeps reading it after the free:
BUG: KASAN: slab-use-after-free in fib_table_lookup (net/ipv4/fib_trie.c:1601) Read of size 1 at addr ffff88810676d4eb by task exploit/297 Call Trace: fib_table_lookup (net/ipv4/fib_trie.c:1601) ip_route_output_key_hash_rcu (net/ipv4/route.c:2814) ip_route_output_key_hash (net/ipv4/route.c:2705) __ip4_datagram_connect (net/ipv4/datagram.c:49) udp_connect (net/ipv4/udp.c:2144) __sys_connect (net/socket.c:2167) __x64_sys_connect (net/socket.c:2173) do_syscall_64 entry_SYSCALL_64_after_hwframe which belongs to the cache ip_fib_alias of size 56
Triggering the error path needs CAP_NET_ADMIN and a registered fib notifier that can reject a route; a netdevsim device whose IPv4 FIB resource is exhausted is enough.
Free new_fa with alias_free_mem_rcu(), as fib_table_delete() already does for a fib_alias removed from the trie.
--- net/ipv4/fib_trie.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/fib_trie.c +1 -1
@@ -1385,7 +1385,7 @@ int fib_table_insert(struct net *net, struct fib_table *tb, out_remove_new_fa:fib_remove_alias (t, tp, l, new_fa); out_free_new_fa: -kmem_cache_free (fn_alias_kmem, new_fa); +alias_free_mem_rcu (new_fa); out:fib_release_info (fi); err:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 90/744 net/iucv: take a reference on the socket found in afiucv_hs_rcv()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryam Vargas <[email protected]>
[ Upstream commit 4fa349156043dc119721d067329714179f501749 ]
afiucv_hs_rcv() looks up the destination socket under iucv_sk_list.lock, drops the lock, and then passes the socket to the afiucv_hs_callback_*() handlers without holding a reference. AF_IUCV sockets are not RCU-protected and are freed synchronously by iucv_sock_kill() -> sock_put(), so a concurrent close can free the socket in the window between read_unlock() and the handler, which then dereferences freed memory (for example sk->sk_data_ready() in afiucv_hs_callback_syn()).
Take a reference with sock_hold() while the socket is still on the list and release it with sock_put() once the handler has run.
--- net/iucv/af_iucv.c | 4 ++++ 1 file changed, 4 insertions(+)
net/iucv/af_iucv.c +4 -0
@@ -2091,6 +2091,8 @@ static int afiucv_hs_rcv(struct sk_buff *skb, struct net_device *dev, } } } +if (sk) +sock_hold (sk);read_unlock (&iucv_sk_list.lock);if (!iucv) sk =NULL ;
@@ -2140,6 +2142,8 @@ static int afiucv_hs_rcv(struct sk_buff *skb, struct net_device *dev,kfree_skb (skb); } +if (sk) +sock_put (sk);return err; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 91/744 udmabuf: Ensure to perform cache synchronisation in begin_cpu_udmabuf()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Mader <[email protected]>
[ Upstream commit 1d0e25c1ddf2063c499264fb2ba0fa6a3e4f8a00 ]
The message of commit 504e2b4ab97a ("dma-buf/udmabuf: skip redundant cpu sync to fix cacheline EEXIST warning") says:
Quoted 4 lines
The CPU sync at map/unmap time is also redundant for udmabuf:
begin_cpu_udmabuf()andend_cpu_udmabuf()already perform explicit cache synchronization via dma_sync_sgtable_for_cpu/device() when CPU access is requested through the dma-buf interface.
This, however, does not apply to the first time begin_cpu_udmabuf() is called on an udmabuf, in which case the implementation previously relied on get_sg_table() to perform the cache synchronisation.
Ensure to call dma_sync_sgtable_for_cpu() in that case as well.
--- drivers/dma-buf/udmabuf.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/dma-buf/udmabuf.c +5 -4
@@ -247,21 +247,22 @@ static int begin_cpu_udmabuf(struct dma_buf *buf, {struct udmabuf *ubuf = buf->priv;struct device *dev = ubuf->device->this_device; -int ret =0 ;if (!ubuf->sg) { ubuf->sg =get_sg_table (dev, buf, direction);if (IS_ERR (ubuf->sg)) { +int ret; + ret =PTR_ERR (ubuf->sg); ubuf->sg =NULL ; +return ret; }else { ubuf->sg_dir = direction; } - }else { -dma_sync_sgtable_for_cpu (dev, ubuf->sg, direction); } -return ret; +dma_sync_sgtable_for_cpu (dev, ubuf->sg, direction); +return 0 ; } static int end_cpu_udmabuf(struct dma_buf *buf,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 92/744 scsi: core: wake eh reliably when using scsi_schedule_eh
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Jeffery <[email protected]>
[ Upstream commit dccf3b1798b70f94e958b3d00b83010399e6fb05 ]
Drivers which use the scsi_schedule_eh function to run the error handler currently risk the error handler thread never waking once all commands are timed out or inactive. There is no enforced memory order between setting the host into error recovery state and counting busy commands. This can result in a race with scsi_dec_host_busy where neither CPU sees both conditions of all commands inactive and the host error state to request waking the error handler.
To fix this, run the scsi_schedule_eh's scsi_eh_wakeup from a new work item which will use rcu to ensure scsi_schedule_eh's call to scsi_host_busy will occur after the error state is globally visible and will be seen by any current scsi_dec_host_busy callers.
--- drivers/scsi/hosts.c | 2 ++ drivers/scsi/scsi_error.c | 22 +++++++++++++++++++++- drivers/scsi/scsi_priv.h | 1 + include/scsi/scsi_host.h | 3 +++ 4 files changed, 27 insertions(+), 1 deletion(-)
drivers/scsi/hosts.c +2 -0
@@ -357,6 +357,7 @@ static void scsi_host_dev_release(struct device *dev)/* Wait for functions invoked through call_rcu(&scmd->rcu, ...) */ rcu_barrier (); +cancel_work_sync (&shost->eh_work);if (shost->tmf_work_q)destroy_workqueue (shost->tmf_work_q);if (shost->ehandler)
@@ -422,6 +423,7 @@ struct Scsi_Host *scsi_host_alloc(const struct scsi_host_template *sht, int privINIT_LIST_HEAD (&shost->starved_list);init_waitqueue_head (&shost->host_wait);mutex_init (&shost->scan_mutex); +INIT_WORK (&shost->eh_work, scsi_rcu_eh_wakeup); index =ida_alloc (&host_index_ida,GFP_KERNEL );if (index <0 ) {
drivers/scsi/scsi_error.c +21 -1
@@ -73,6 +73,26 @@ void scsi_eh_wakeup(struct Scsi_Host *shost, unsigned int busy) } } +void scsi_rcu_eh_wakeup (struct work_struct *work) +{ + struct Scsi_Host *shost = container_of(work, struct Scsi_Host, eh_work); +unsigned long flags; +unsigned int busy; + +/* +* Ensure any running scsi_dec_host_busy has completed its rcu section +* so changes to host state and host_eh_scheduled are visible to all +* future calls of scsi_dec_host_busy +*/ +synchronize_rcu (); + + busy =scsi_host_busy (shost); + +spin_lock_irqsave (shost->host_lock, flags); +scsi_eh_wakeup (shost, busy); +spin_unlock_irqrestore (shost->host_lock, flags); +} +/** * scsi_schedule_eh - schedule EH for SCSI host * @shost: SCSI host to invoke error handling on.
@@ -88,7 +108,7 @@ void scsi_schedule_eh(struct Scsi_Host *shost)if (scsi_host_set_state (shost,SHOST_RECOVERY ) ==0 ||scsi_host_set_state (shost,SHOST_CANCEL_RECOVERY ) ==0 ) { shost->host_eh_scheduled++; -scsi_eh_wakeup (shost,scsi_host_busy (shost)); +queue_work (shost->tmf_work_q, &shost->eh_work); }spin_unlock_irqrestore (shost->host_lock, flags);
drivers/scsi/scsi_priv.h +1 -0
@@ -91,6 +91,7 @@ extern enum blk_eh_timer_return scsi_timeout(struct request *req);extern int scsi_error_handler (void *host);extern enum scsi_disposition scsi_decide_disposition (struct scsi_cmnd *cmd);extern void scsi_eh_wakeup (struct Scsi_Host *shost,unsigned int busy); +extern void scsi_rcu_eh_wakeup (struct work_struct *work);extern void scsi_eh_scmd_add (struct scsi_cmnd *); void scsi_eh_ready_devs(struct Scsi_Host *shost, struct list_head *work_q,
include/scsi/scsi_host.h +3 -0
@@ -750,6 +750,9 @@ struct Scsi_Host {*/ struct device *dma_dev; +/* Used for an rcu-synchronizing eh wakeup */ +struct work_struct eh_work; +/* Delay for runtime autosuspend */ int rpm_autosuspend_delay;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 93/744 ata: sata_dwc_460ex: enable SATA interrupts only after IRQ handler is registered
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 4bbc16a353a98023e5ddfca7c1fc0e49971cf4d0 ]
sata_dwc_enable_interrupts() is called before platform_get_irq() and ata_host_activate(), leaving the SATA controller's interrupt mask enabled without a registered handler. If a later step fails (irq request, phy init, etc.) or if the controller asserts an interrupt during probe, the irq line may fire with no handler, causing a spurious interrupt storm.
Move sata_dwc_enable_interrupts() after ata_host_activate() so that interrupts are only unmasked once the handler is registered and the core is fully initialized.
--- drivers/ata/sata_dwc_460ex.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/ata/sata_dwc_460ex.c +2 -3
@@ -1168,9 +1168,6 @@ static int sata_dwc_probe(struct platform_device *ofdev)/* Save dev for later use in dev_xxx() routines */ hsdev->dev = dev; -/* Enable SATA Interrupts */ -sata_dwc_enable_interrupts (hsdev); -/* Get SATA interrupt number */ irq =irq_of_parse_and_map (np,0 );if (!irq) {
@@ -1203,6 +1200,8 @@ static int sata_dwc_probe(struct platform_device *ofdev)if (err)dev_err (dev,"failed to activate host" ); +/* Enable SATA Interrupts */ +sata_dwc_enable_interrupts (hsdev);return 0 ; error_out:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 94/744 ata: sata_dwc_460ex: use platform_get_irq()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit a4af122106f73ea510bb35a9ea1dedd980fc0db7 ]
Replace irq_of_parse_and_map() with platform_get_irq() in both sata_dwc_dma_init_old() and sata_dwc_probe(). This is the preferred way to obtain IRQs for platform devices and provides better error reporting. Remove the now-unnecessary #include <linux/of_irq.h>.
irq_of_parse_and_map() requires irq_dispose_mapping(), which is missing.
Also fix unused variable when CONFIG_SATA_DWC_OLD_DMA is disabled.
--- drivers/ata/sata_dwc_460ex.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-)
drivers/ata/sata_dwc_460ex.c +7 -14
@@ -19,7 +19,6 @@#include <linux/device.h> #include <linux/dmaengine.h> #include <linux/of.h> -#include <linux/of_irq.h> #include <linux/platform_device.h> #include <linux/phy/phy.h> #include <linux/libata.h>
@@ -226,7 +225,6 @@ static int sata_dwc_dma_init_old(struct platform_device *pdev, struct sata_dwc_device *hsdev) {struct device *dev = &pdev->dev; -struct device_node *np = dev->of_node; hsdev->dma =devm_kzalloc (dev,sizeof (*hsdev->dma),GFP_KERNEL );if (!hsdev->dma)
@@ -236,11 +234,9 @@ static int sata_dwc_dma_init_old(struct platform_device *pdev, hsdev->dma->id = pdev->id;/* Get SATA DMA interrupt number */ - hsdev->dma->irq =irq_of_parse_and_map (np,1 ); -if (!hsdev->dma->irq) { -dev_err (dev,"no SATA DMA irq\n" ); -return -ENODEV ; - } + hsdev->dma->irq =platform_get_irq (pdev,1 ); +if (hsdev->dma->irq <0 ) +return hsdev->dma->irq;/* Get physical SATA DMA register base address */ hsdev->dma->regs =devm_platform_ioremap_resource (pdev,1 );
@@ -1125,7 +1121,6 @@ static const struct ata_port_info sata_dwc_port_info[] = {static int sata_dwc_probe (struct platform_device *ofdev) {struct device *dev = &ofdev->dev; -struct device_node *np = dev->of_node;struct sata_dwc_device *hsdev;u32 idr, versionr;char *ver = (char *)&versionr;
@@ -1169,14 +1164,12 @@ static int sata_dwc_probe(struct platform_device *ofdev) hsdev->dev = dev;/* Get SATA interrupt number */ - irq =irq_of_parse_and_map (np,0 ); -if (!irq) { -dev_err (dev,"no SATA DMA irq\n" ); -return -ENODEV ; - } + irq =platform_get_irq (ofdev,0 ); +if (irq <0 ) +return irq;#ifdef CONFIG_SATA_DWC_OLD_DMA -if (!of_property_present (np,"dmas" )) { +if (!of_property_present (dev->of_node,"dmas" )) { err =sata_dwc_dma_init_old (ofdev, hsdev);if (err)return err;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 95/744 ata: sata_dwc_460ex: fix clear_interrupt_bit() clearing all pending interrupts
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 66c4e310ad71f41e41736d33dd8a1fb5eaaec7f3 ]
clear_interrupt_bit() ignores the bit argument and performs a read-write-back of the entire INTPR register. If INTPR uses standard Write-1-to-Clear semantics, this clears every pending interrupt bit, not just the intended one. Coalesced interrupts (e.g. DMAT + NEWFP) would be cleared together, silently losing the second event.
Write only the specific bit to clear so that other pending interrupts are preserved.
--- drivers/ata/sata_dwc_460ex.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/ata/sata_dwc_460ex.c +1 -2
@@ -394,8 +394,7 @@ static void clear_serror(struct ata_port *ap)static void clear_interrupt_bit (struct sata_dwc_device *hsdev,u32 bit) { -sata_dwc_writel (&hsdev->sata_dwc_regs->intpr, -sata_dwc_readl (&hsdev->sata_dwc_regs->intpr)); +sata_dwc_writel (&hsdev->sata_dwc_regs->intpr, bit); }static u32 qcmd_tag_to_mask (u8 tag)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 96/744 ata: sata_dwc_460ex: fix infinite loop in NCQ tag completion bit-scanning
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit c2130f6553f4a5cbdc259de069600117a995f197 ]
The hand-rolled bit-scanning loop in the NCQ completion path has an infinite loop bug. When tag_mask has only high bits set (e.g. 0x80000000), the inner while loop left-shifts tag_mask until it overflows to 0. At that point !(0 & 1) is always true and 0 <<= 1 stays 0, causing an infinite loop in hardirq context with a spinlock held.
Replace the open-coded bit-scanning with __ffs() which correctly finds the least significant set bit and is bounded by the width of the argument.
--- drivers/ata/sata_dwc_460ex.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
drivers/ata/sata_dwc_460ex.c +2 -7
@@ -607,14 +607,9 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance) status = ap->ops->sff_check_status (ap);dev_dbg (ap->dev,"%s ATA status register=0x%x\n" , __func__, status); - tag =0 ;while (tag_mask) { -while (!(tag_mask &0x00000001 )) { - tag++; - tag_mask <<=1 ; - } - - tag_mask &= (~0x00000001 ); + tag =__ffs (tag_mask); + tag_mask &= ~(1U << tag); qc =ata_qc_from_tag (ap, tag);if (unlikely (!qc)) {dev_err (ap->dev,"failed to get qc" );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 97/744 accel/ivpu: Fix wrong register read in LNL failure diagnostics
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karol Wachowski <[email protected]>
[ Upstream commit e4159045c2704dfe146f0ccb0445d9d074cd6882 ]
diagnose_failure_lnl() read VPU_HW_BTRS_MTL_INTERRUPT_STAT instead of VPU_HW_BTRS_LNL_INTERRUPT_STAT, which on LNL and newer parts is a different register with a different bit layout, so failure diagnostics decoded the wrong register and reported a bogus error cause. Read the LNL interrupt status register instead.
--- drivers/accel/ivpu/ivpu_hw_btrs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/accel/ivpu/ivpu_hw_btrs.c +1 -1
@@ -861,7 +861,7 @@ static void diagnose_failure_mtl(struct ivpu_device *vdev)static void diagnose_failure_lnl (struct ivpu_device *vdev) { -u32 reg =REGB_RD32 (VPU_HW_BTRS_MTL_INTERRUPT_STAT ) &BTRS_LNL_IRQ_MASK ; +u32 reg =REGB_RD32 (VPU_HW_BTRS_LNL_INTERRUPT_STAT ) &BTRS_LNL_IRQ_MASK ;if (REG_TEST_FLD (VPU_HW_BTRS_LNL_INTERRUPT_STAT ,ATS_ERR , reg)) { ivpu_err(vdev, "ATS_ERR_LOG1 0x%08x ATS_ERR_LOG2 0x%08x\n",
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 98/744 ALSA: usb-audio: Skip DSD quirk for Musical Fidelity M6s DAC
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 93b47e66cc6d6c6382d44b44f5e7f6fc3a7b38c3 ]
Salvador reported that the recent fix for applying the DSD quirk to Musical Fidelity devices broke for his M6s DAC model (2772:0502).
Although this is basically a firmware bug, the model in question is fairly old, and no further firmware update can be expected, so it'd be better to address in the driver side.
As an ad hoc workaround, skip the DSD quirk for this device by adding an empty quirk entry of 2772:0502; this essentially skips the later DSD quirk entry by the match with the vendor 2772.
--- sound/usb/quirks.c | 2 ++ 1 file changed, 2 insertions(+)
sound/usb/quirks.c +2 -0
@@ -2457,6 +2457,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { QUIRK_FLAG_DSD_RAW),DEVICE_FLG (0x2708 ,0x0002 ,/* Audient iD14 */ QUIRK_FLAG_IGNORE_CTL_ERROR ), +DEVICE_FLG (0x2772 ,0x0502 ,/* Musical Fidelity M6s DAC */ +0 ),/* for avoiding QUIRK_FLAG_DSD_RAW with vendor match */ DEVICE_FLG (0x2912 ,0x30c8 ,/* Audioengine D1 */ QUIRK_FLAG_GET_SAMPLE_RATE ), DEVICE_FLG(0x2a70, 0x1881, /* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 99/744 Bluetooth: qca: fix NVM tag length underflow in TLV parser
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit c90164ca0f7036942ba088eb7ea8d3f6c2352020 ]
In the TLV_TYPE_NVM branch of qca_tlv_check_data() the tag loop bound is "while (idx < length - sizeof(struct tlv_type_nvm))". "length" is a signed int from the firmware TLV header and sizeof(struct tlv_type_nvm) is a size_t (12), so "length" is converted to size_t and any firmware-supplied "length" < 12 makes the subtraction wrap to a huge value. The loop body then reads a 12-byte struct tlv_type_nvm past the end of the short vmalloc'd firmware buffer (and the EDL_TAG_ID_* handlers can write past it).
Rewrite the bound as "idx + sizeof(struct tlv_type_nvm) <= length"; both operands are non-negative, so it no longer underflows and a "length" too small for one record correctly skips the loop.
BUG: KASAN: vmalloc-out-of-bounds in qca_download_firmware.isra.0 (drivers/bluetooth/btqca.c:421) Read of size 2 at addr ffffc900000e5004 by task kworker/u9:0/52 Workqueue: hci0 hci_power_on Call Trace: ... kasan_report (mm/kasan/report.c:595) qca_download_firmware.isra.0 (drivers/bluetooth/btqca.c:421 drivers/bluetooth/btqca.c:617) qca_uart_setup (drivers/bluetooth/btqca.c:948) qca_setup (drivers/bluetooth/hci_qca.c:2029) hci_uart_setup (drivers/bluetooth/hci_ldisc.c:438) hci_dev_open_sync (net/bluetooth/hci_sync.c:5227) hci_power_on (net/bluetooth/hci_core.c:920) process_one_work (kernel/workqueue.c:3322) worker_thread (kernel/workqueue.c:3486) kthread (kernel/kthread.c:436) ret_from_fork (arch/x86/kernel/process.c:158) ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
--- drivers/bluetooth/btqca.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/bluetooth/btqca.c +1 -1
@@ -413,7 +413,7 @@ static int qca_tlv_check_data(struct hci_dev *hdev, idx =0 ; data = tlv->data; -while (idx < length -sizeof (struct tlv_type_nvm )) { +while (idx +sizeof (struct tlv_type_nvm ) <= length) { tlv_nvm = (struct tlv_type_nvm *)(data + idx); tag_id =le16_to_cpu (tlv_nvm->tag_id);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 100/744 Bluetooth: MGMT: revalidate LOAD_CONN_PARAM queued update
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cen Zhang <[email protected]>
[ Upstream commit 2bf282f8f715f5d05d6f4c49ffb3bd241c5e667e ]
MGMT_OP_LOAD_CONN_PARAM queues conn_update_sync() when a single parameter update changes an existing LE central connection. The queued work currently stores a borrowed hci_conn_params entry from hdev->le_conn_params. A later LOAD_CONN_PARAM request can clear disabled parameters and free that entry before hci_cmd_sync_work() runs the queued callback.
Do not keep the borrowed hci_conn_params pointer in queued work. Queue the hci_conn instead and hold a reference until the queued callback completes. When the work runs, revalidate that the connection is still present, look up the current hci_conn_params entry, and cancel the update if userspace removed that entry while the work was pending.
Copy the interval values from the current params entry under hdev->lock, then drop the lock and keep using hci_le_conn_update_sync() to issue the update.
Validation reproduced this kernel report:
BUG: KASAN: slab-use-after-free in conn_update_sync+0x2a/0xf0 [bluetooth] Read of size 1 at addr ffff88810c697126 by task kworker/u17:0/377 Workqueue: hci0 hci_cmd_sync_work [bluetooth] Call Trace: <TASK> dump_stack_lvl+0x66/0xa0 print_report+0xce/0x5f0 kasan_report+0xe0/0x110 conn_update_sync+0x2a/0xf0 [bluetooth] hci_cmd_sync_work+0x187/0x210 [bluetooth] process_one_work+0x4fd/0xbc0 worker_thread+0x2d8/0x570 kthread+0x1ad/0x1f0 ret_from_fork+0x3c9/0x540 ret_from_fork_asm+0x1a/0x30 Allocated by task 466: hci_conn_params_add+0xa6/0x240 [bluetooth] load_conn_param+0x4e1/0x850 [bluetooth] hci_sock_sendmsg+0x96b/0xf80 [bluetooth] Freed by task 474: kfree+0x313/0x590 hci_conn_params_clear_disabled+0x9b/0xc0 [bluetooth] load_conn_param+0x4bf/0x850 [bluetooth] hci_sock_sendmsg+0x96b/0xf80 [bluetooth]
--- net/bluetooth/mgmt.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-)
net/bluetooth/mgmt.c +35 -9
@@ -7940,14 +7940,36 @@ static int remove_device(struct sock *sk, struct hci_dev *hdev,static int conn_update_sync (struct hci_dev *hdev,void *data) { -struct hci_conn_params *params = data; -struct hci_conn *conn; +struct hci_conn *conn = data; +struct hci_conn_params *params; +struct hci_conn_params local = {}; - conn =hci_conn_hash_lookup_le (hdev, ¶ms->addr, params->addr_type); -if (!conn) -return -ECANCELED ; +hci_dev_lock (hdev); + +if (!hci_conn_valid (hdev, conn) || conn->role !=HCI_ROLE_MASTER ) + goto cancel; + + params =hci_conn_params_lookup (hdev, &conn->dst, conn->dst_type); +if (!params) + goto cancel; + + local.conn_min_interval = params->conn_min_interval; + local.conn_max_interval = params->conn_max_interval; + local.conn_latency = params->conn_latency; + local.supervision_timeout = params->supervision_timeout; -return hci_le_conn_update_sync (hdev, conn, params); +hci_dev_unlock (hdev); + +return hci_le_conn_update_sync (hdev, conn, &local); + +cancel: +hci_dev_unlock (hdev); +return -ECANCELED ; +} + +static void conn_update_sync_destroy (struct hci_dev *hdev,void *data,int err) +{ +hci_conn_put (data); } static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data,
@@ -8057,9 +8079,13 @@ static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data, (conn->le_conn_min_interval != min || conn->le_conn_max_interval != max || conn->le_conn_latency != latency || - conn->le_supv_timeout != timeout)) -hci_cmd_sync_queue (hdev, conn_update_sync, - hci_param,NULL ); + conn->le_supv_timeout != timeout)) { +hci_conn_get (conn); +if (hci_cmd_sync_queue (hdev, conn_update_sync, + conn, + conn_update_sync_destroy) <0 ) +hci_conn_put (conn); + } } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 101/744 Bluetooth: hci_sync: extend conn_hash lookup critical sections
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pauli Virtanen <[email protected]>
[ Upstream commit d5efd6e4b8b0634af6843178fe1a7dd2b2178a3d ]
Using RCU-protected pointers outside the critical sections without refcount is incorrect and may result to UAF.
Extend critical section to cover both hci_conn_hash lookup and use of the returned conn.
Add surrounding rcu_read_lock() also when return value is not used, in preparation for RCU lockdep requirement to hci_lookup_le_connect().
This avoids concurrent deletion of the conn before we are done dereferencing it.
Also, make sure to hold hdev->lock when accessing hdev->accept_list.
--- net/bluetooth/hci_sync.c | 42 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-)
net/bluetooth/hci_sync.c +39 -3
@@ -1054,14 +1054,19 @@ static int hci_set_random_addr_sync(struct hci_dev *hdev, bdaddr_t *rpa)* In this kind of scenario skip the update and let the random * address be updated at the next cycle. */ +rcu_read_lock (); +if (bacmp (&hdev->random_addr,BDADDR_ANY ) && (hci_dev_test_flag (hdev,HCI_LE_ADV ) ||hci_lookup_le_connect (hdev))) {bt_dev_dbg (hdev,"Deferring random address update" );hci_dev_set_flag (hdev,HCI_RPA_EXPIRED ); +rcu_read_unlock ();return 0 ; } +rcu_read_unlock (); +return __hci_cmd_sync_status (hdev,HCI_OP_LE_SET_RANDOM_ADDR ,6 , rpa,HCI_CMD_TIMEOUT ); }
@@ -2647,12 +2652,17 @@ static int hci_pause_addr_resolution(struct hci_dev *hdev)/* Cannot disable addr resolution if scanning is enabled or * when initiating an LE connection. */ +rcu_read_lock (); +if (hci_dev_test_flag (hdev,HCI_LE_SCAN ) ||hci_lookup_le_connect (hdev)) { +rcu_read_unlock ();bt_dev_err (hdev,"Command not allowed when scan/LE connect" );return -EPERM ; } +rcu_read_unlock (); +/* Cannot disable addr resolution if advertising is enabled. */ err =hci_pause_advertising_sync (hdev);if (err) {
@@ -2790,6 +2800,8 @@ static u8 hci_update_accept_list_sync(struct hci_dev *hdev)if (hci_dev_test_flag (hdev,HCI_PA_SYNC )) {struct hci_conn *conn; +rcu_read_lock (); + conn =hci_conn_hash_lookup_create_pa_sync (hdev);if (conn) {struct conn_params pa;
@@ -2799,6 +2811,8 @@ static u8 hci_update_accept_list_sync(struct hci_dev *hdev)bacpy (&pa.addr, &conn->dst); pa.addr_type = conn->dst_type; +rcu_read_unlock (); +/* Clear first since there could be addresses left * behind. */
@@ -2808,6 +2822,8 @@ static u8 hci_update_accept_list_sync(struct hci_dev *hdev) err =hci_le_add_accept_list_sync (hdev, &pa, &num_entries); goto done; + }else { +rcu_read_unlock (); } }
@@ -2818,10 +2834,13 @@ static u8 hci_update_accept_list_sync(struct hci_dev *hdev)* the controller. */ list_for_each_entry_safe (b, t, &hdev->le_accept_list, list) { -if (hci_conn_hash_lookup_le (hdev, &b->bdaddr, b->bdaddr_type)) +rcu_read_lock (); + +if (hci_conn_hash_lookup_le (hdev, &b->bdaddr, b->bdaddr_type)) { +rcu_read_unlock ();continue ; + } -/* Pointers not dereferenced, no locks needed */ pend_conn =hci_pend_le_action_lookup (&hdev->pend_le_conns, &b->bdaddr, b->bdaddr_type);
@@ -2829,6 +2848,8 @@ static u8 hci_update_accept_list_sync(struct hci_dev *hdev) &b->bdaddr, b->bdaddr_type); +rcu_read_unlock (); +/* If the device is not likely to connect or report, * remove it from the acceptlist. */
@@ -2955,6 +2976,8 @@ static int hci_le_set_ext_scan_param_sync(struct hci_dev *hdev, u8 type,if (sent) {struct hci_conn *conn; +rcu_read_lock (); + conn =hci_conn_hash_lookup_ba (hdev,PA_LINK , &sent->bdaddr);if (conn) {
@@ -2979,8 +3002,12 @@ static int hci_le_set_ext_scan_param_sync(struct hci_dev *hdev, u8 type, phy++; } +rcu_read_unlock (); +if (num_phy) goto done; + }else { +rcu_read_unlock (); } } }
@@ -3231,12 +3258,16 @@ int hci_update_passive_scan_sync(struct hci_dev *hdev)/* If there is at least one pending LE connection, we should * keep the background scan running. */ +bool exists;/* If controller is connecting, we should not start scanning * since some controllers are not able to scan and connect at * the same time. */ -if (hci_lookup_le_connect (hdev)) +rcu_read_lock (); + exists =hci_lookup_le_connect (hdev); +rcu_read_unlock (); +if (exists)return 0 ;bt_dev_dbg (hdev,"start background scanning" );
@@ -3454,6 +3485,7 @@ int hci_write_fast_connectable_sync(struct hci_dev *hdev, bool enable) }static bool disconnected_accept_list_entries (struct hci_dev *hdev) + __must_hold(&hdev->lock) {struct bdaddr_list *b;
@@ -3494,12 +3526,16 @@ int hci_update_scan_sync(struct hci_dev *hdev)if (hdev->scanning_paused)return 0 ; +hci_dev_lock (hdev); +if (hci_dev_test_flag (hdev,HCI_CONNECTABLE ) ||disconnected_accept_list_entries (hdev)) scan =SCAN_PAGE ;else scan =SCAN_DISABLED ; +hci_dev_unlock (hdev); +if (hci_dev_test_flag (hdev,HCI_DISCOVERABLE )) scan |=SCAN_INQUIRY ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 102/744 Bluetooth: mgmt: fix locking in unpair_device/disconnect_sync
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pauli Virtanen <[email protected]>
[ Upstream commit 16cd66443957e4ad42155c6fec401012f600c6f8 ]
Dereferencing RCU-protected pointers outside critical sections is invalid and may lead to UAF.
Take hdev->lock for hci_conn lookup and hci_abort_conn(). Don't use RCU to ensure the conn is fully initialized at this point.
--- net/bluetooth/mgmt.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
net/bluetooth/mgmt.c +16 -0
@@ -3094,6 +3094,8 @@ static int unpair_device_sync(struct hci_dev *hdev, void *data)struct mgmt_cp_unpair_device *cp = cmd->param;struct hci_conn *conn; +hci_dev_lock (hdev); +if (cp->addr.type ==BDADDR_BREDR ) conn =hci_conn_hash_lookup_ba (hdev,ACL_LINK , &cp->addr.bdaddr);
@@ -3101,6 +3103,11 @@ static int unpair_device_sync(struct hci_dev *hdev, void *data) conn =hci_conn_hash_lookup_le (hdev, &cp->addr.bdaddr,le_addr_type (cp->addr.type)); +if (conn) +hci_conn_get (conn); + +hci_dev_unlock (hdev); +if (!conn)return 0 ;
@@ -3108,6 +3115,7 @@ static int unpair_device_sync(struct hci_dev *hdev, void *data)* will clean up the connection no matter the error. */ hci_abort_conn (conn,HCI_ERROR_REMOTE_USER_TERM ); +hci_conn_put (conn);return 0 ; }
@@ -3255,6 +3263,8 @@ static int disconnect_sync(struct hci_dev *hdev, void *data)struct mgmt_cp_disconnect *cp = cmd->param;struct hci_conn *conn; +hci_dev_lock (hdev); +if (cp->addr.type ==BDADDR_BREDR ) conn =hci_conn_hash_lookup_ba (hdev,ACL_LINK , &cp->addr.bdaddr);
@@ -3262,6 +3272,11 @@ static int disconnect_sync(struct hci_dev *hdev, void *data) conn =hci_conn_hash_lookup_le (hdev, &cp->addr.bdaddr,le_addr_type (cp->addr.type)); +if (conn) +hci_conn_get (conn); + +hci_dev_unlock (hdev); +if (!conn)return -ENOTCONN ;
@@ -3269,6 +3284,7 @@ static int disconnect_sync(struct hci_dev *hdev, void *data)* will clean up the connection no matter the error. */ hci_abort_conn (conn,HCI_ERROR_REMOTE_USER_TERM ); +hci_conn_put (conn);return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 103/744 Bluetooth: mgmt: hold reference for hci_conn in mgmt_pending_cmds
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pauli Virtanen <[email protected]>
[ Upstream commit da55f570191d5d72f10c607a7043b947eb05ea46 ]
Dereferencing RCU-protected pointers outside critical sections is invalid and may lead to UAF. Use of hci_conn in hci_sync callbacks also needs to hold refcount to avoid UAF.
Take appropriate locks for hci_conn lookups, and take refcount for hci_conn pointers stored in mgmt_pending_cmd so that the pointer stays valid.
When accessing conn->state, ensure hdev->lock is held to avoid data race.
--- net/bluetooth/mgmt.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
net/bluetooth/mgmt.c +22 -4
@@ -7407,6 +7407,9 @@ static void get_conn_info_complete(struct hci_dev *hdev, void *data, int err) rp.max_tx_power =HCI_TX_POWER_INVALID ; } +if (conn) +hci_conn_put (conn); +mgmt_cmd_complete (cmd->sk, cmd->hdev->id,MGMT_OP_GET_CONN_INFO , status, &rp,sizeof (rp));
@@ -7421,6 +7424,8 @@ static int get_conn_info_sync(struct hci_dev *hdev, void *data)int err;__le16 handle; +hci_dev_lock (hdev); +/* Make sure we are still connected */ if (cp->addr.type ==BDADDR_BREDR ) conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
@@ -7428,12 +7433,16 @@ static int get_conn_info_sync(struct hci_dev *hdev, void *data)else conn =hci_conn_hash_lookup_ba (hdev,LE_LINK , &cp->addr.bdaddr); -if (!conn || conn->state !=BT_CONNECTED ) +if (!conn || conn->state !=BT_CONNECTED ) { +hci_dev_unlock (hdev);return MGMT_STATUS_NOT_CONNECTED ; + } - cmd->user_data = conn; + cmd->user_data =hci_conn_get (conn); handle =cpu_to_le16 (conn->handle); +hci_dev_unlock (hdev); +/* Refresh RSSI each time */ err =hci_read_rssi_sync (hdev, handle);
@@ -7567,6 +7576,9 @@ static void get_clock_info_complete(struct hci_dev *hdev, void *data, int err) } complete: +if (conn) +hci_conn_put (conn); +mgmt_cmd_complete (cmd->sk, cmd->hdev->id, cmd->opcode, status, &rp,sizeof (rp));
@@ -7583,15 +7595,21 @@ static int get_clock_info_sync(struct hci_dev *hdev, void *data)memset (&hci_cp,0 ,sizeof (hci_cp));hci_read_clock_sync (hdev, &hci_cp); +hci_dev_lock (hdev); +/* Make sure connection still exists */ conn =hci_conn_hash_lookup_ba (hdev,ACL_LINK , &cp->addr.bdaddr); -if (!conn || conn->state !=BT_CONNECTED ) +if (!conn || conn->state !=BT_CONNECTED ) { +hci_dev_unlock (hdev);return MGMT_STATUS_NOT_CONNECTED ; + } - cmd->user_data = conn; + cmd->user_data =hci_conn_get (conn); hci_cp.handle =cpu_to_le16 (conn->handle); hci_cp.which =0x01 ;/* Piconet clock */ +hci_dev_unlock (hdev); +return hci_read_clock_sync (hdev, &hci_cp); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 104/744 Bluetooth: hci_sync: hold hdev->lock for hci_conn_params lookups
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pauli Virtanen <[email protected]>
[ Upstream commit c363202ec841df36421ec280eea3d5f94f556143 ]
hci_conn_params_lookup requires hdev->lock be held, otherwise the list iteration or param access is not safe.
Hold hdev->lock for params lookups in hci_sync.
--- net/bluetooth/hci_sync.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
net/bluetooth/hci_sync.c +20 -4
@@ -6679,6 +6679,8 @@ static int hci_le_create_conn_sync(struct hci_dev *hdev, void *data)if (!hci_dev_test_flag (hdev,HCI_LE_SIMULTANEOUS_ROLES ))hci_pause_advertising_sync (hdev); +hci_dev_lock (hdev); + params =hci_conn_params_lookup (hdev, &conn->dst, conn->dst_type);if (params) { conn->le_conn_min_interval = params->conn_min_interval;
@@ -6692,6 +6694,8 @@ static int hci_le_create_conn_sync(struct hci_dev *hdev, void *data) conn->le_supv_timeout = hdev->le_supv_timeout; } +hci_dev_unlock (hdev); +/* If controller is scanning, we stop it since some controllers are * not able to scan and connect at the same time. Also set the * HCI_LE_SCAN_INTERRUPTED flag so that the command complete
@@ -7249,13 +7253,13 @@ static void create_pa_complete(struct hci_dev *hdev, void *data, int err) }static int hci_le_past_params_sync (struct hci_dev *hdev,struct hci_conn *conn, -struct hci_conn *acl,struct bt_iso_qos *qos) +u16 acl_handle,struct bt_iso_qos *qos) {struct hci_cp_le_past_params cp;int err;memset (&cp,0 ,sizeof (cp)); - cp.handle =cpu_to_le16 (acl->handle); + cp.handle =cpu_to_le16 (acl_handle);/* An HCI_LE_Periodic_Advertising_Sync_Transfer_Received event is sent * to the Host. HCI_LE_Periodic_Advertising_Report events will be * enabled with duplicate filtering enabled.
@@ -7320,16 +7324,28 @@ static int hci_le_pa_create_sync(struct hci_dev *hdev, void *data)* 2. Check if that HCI_CONN_FLAG_PAST has been set which indicates that * user really intended to use PAST. */ +hci_dev_lock (hdev); + le =hci_conn_hash_lookup_le (hdev, &conn->dst, conn->dst_type);if (le) {struct hci_conn_params *params; +hci_conn_flags_t flags =0 ; +u16 le_handle = le->handle; params =hci_conn_params_lookup (hdev, &le->dst, le->dst_type); -if (params && params->flags &HCI_CONN_FLAG_PAST ) { - err =hci_le_past_params_sync (hdev, conn, le, qos); +if (params) + flags = params->flags; + +hci_dev_unlock (hdev); + +if (flags &HCI_CONN_FLAG_PAST ) { + err =hci_le_past_params_sync (hdev, conn, le_handle, + qos);if (!err) goto done; } + }else { +hci_dev_unlock (hdev); }/* SID has not been set listen for HCI_EV_LE_EXT_ADV_REPORT to update
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 105/744 Bluetooth: hci_qca: Clear memdump state on invalid dump size
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ruoyu Wang <[email protected]>
[ Upstream commit bf587a10c33e5571a299742e45bc18960b9912e7 ]
qca_controller_memdump() allocates qca->qca_memdump before processing the first dump packet. For a sequence-zero packet it then disables IBS, marks memdump collection active, and reads the advertised dump size.
If the controller reports a zero dump size, the error path frees the local qca_memdump object and returns without clearing qca->qca_memdump or undoing the collection state. A later memdump work item initializes its local pointer from qca->qca_memdump and skips allocation when that pointer is non-NULL, so it can operate on freed memory. The stale collection and IBS-disabled flags can also leave waiters or later transmit handling blocked behind an aborted dump.
Clear the saved pointer and memdump state before returning from the invalid-size path, matching the cleanup used when hci_devcd_init() fails.
A static analysis checker reported the stale memdump state, and manual source review confirmed the invalid-size failure path.
--- drivers/bluetooth/hci_qca.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/bluetooth/hci_qca.c +4 -0
@@ -1088,6 +1088,10 @@ static void qca_controller_memdump(struct work_struct *work)if (!(qca_memdump->ram_dump_size)) {bt_dev_err (hu->hdev,"Rx invalid memdump size" );kfree (qca_memdump); + qca->qca_memdump =NULL ; + qca->memdump_state =QCA_MEMDUMP_COLLECTED ; +clear_and_wake_up_bit (QCA_MEMDUMP_COLLECTION , &qca->flags); +clear_bit (QCA_IBS_DISABLED , &qca->flags);kfree_skb (skb);mutex_unlock (&qca->hci_memdump_lock);return ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 106/744 Bluetooth: mgmt: Translate HCI reason in Device Disconnected event
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikhail Gavrilov <[email protected]>
[ Upstream commit c1cec2bbbeb5922d42d28c6af1707c4f3f8647e3 ]
MGMT_EV_DEVICE_DISCONNECTED carries a reason field which is defined to be one of MGMT_DEV_DISCONN_* (0x00..0x05). hci_disconn_complete_evt() converts the HCI error with hci_to_mgmt_reason(), but two other paths pass the raw HCI error straight through:
hci_cs_disconnect() -> cp->reason
mgmt_connect_failed() -> status
The latter is reached whenever the adapter is powered off or suspended:hci_disconnect_all_sync() aborts every link with HCI_ERROR_REMOTE_POWER_OFF, hci_disconnect_sync() deliberately does not wait for HCI_EV_DISCONN_COMPLETE for that reason, so that hci_abort_conn_sync() finishes the connection off through hci_conn_failed() instead.
As a result userspace sees an out of range reason:
@ MGMT Event: Device Disconnected (0x000c) plen 8
BR/EDR Address: 8C:A9:6F:2C:51:46
Reason: Reserved (0x15) bluetoothd: btd_bearer_disconnected() Unknown disconnection value: 21
bluetoothd: device_disconnected() Unknown disconnection value: 21
Export hci_to_mgmt_reason() and use it in both places, so that a power off is reported as MGMT_DEV_DISCONN_REMOTE rather than as the raw HCI_ERROR_REMOTE_POWER_OFF (0x15).
--- include/net/bluetooth/hci_core.h | 1 + net/bluetooth/hci_event.c | 18 +----------------- net/bluetooth/mgmt.c | 19 ++++++++++++++++++- 3 files changed, 20 insertions(+), 18 deletions(-)
include/net/bluetooth/hci_core.h +1 -0
@@ -2433,6 +2433,7 @@ void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, bool persistent);void mgmt_device_connected (struct hci_dev *hdev,struct hci_conn *conn,u8 *name,u8 name_len); +u8 hci_to_mgmt_reason (u8 err);void mgmt_device_disconnected (struct hci_dev *hdev,bdaddr_t *bdaddr,u8 link_type,u8 addr_type,u8 reason,bool mgmt_connected);
net/bluetooth/hci_event.c +1 -17
@@ -2766,7 +2766,7 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 status) }mgmt_device_disconnected (hdev, &conn->dst, conn->type, conn->dst_type, - cp->reason, mgmt_conn); +hci_to_mgmt_reason (cp->reason), mgmt_conn);hci_disconn_cfm (conn, cp->reason);
@@ -3384,22 +3384,6 @@ static void hci_conn_request_evt(struct hci_dev *hdev, void *data,hci_dev_unlock (hdev); } -static u8 hci_to_mgmt_reason (u8 err) -{ -switch (err) { -case HCI_ERROR_CONNECTION_TIMEOUT : -return MGMT_DEV_DISCONN_TIMEOUT ; -case HCI_ERROR_REMOTE_USER_TERM : -case HCI_ERROR_REMOTE_LOW_RESOURCES : -case HCI_ERROR_REMOTE_POWER_OFF : -return MGMT_DEV_DISCONN_REMOTE ; -case HCI_ERROR_LOCAL_HOST_TERM : -return MGMT_DEV_DISCONN_LOCAL_HOST ; -default : -return MGMT_DEV_DISCONN_UNKNOWN ; - } -} -static void hci_disconn_complete_evt (struct hci_dev *hdev,void *data,struct sk_buff *skb) {
net/bluetooth/mgmt.c +18 -1
@@ -9911,6 +9911,22 @@ bool mgmt_powering_down(struct hci_dev *hdev)return false; } +u8 hci_to_mgmt_reason (u8 err) +{ +switch (err) { +case HCI_ERROR_CONNECTION_TIMEOUT : +return MGMT_DEV_DISCONN_TIMEOUT ; +case HCI_ERROR_REMOTE_USER_TERM : +case HCI_ERROR_REMOTE_LOW_RESOURCES : +case HCI_ERROR_REMOTE_POWER_OFF : +return MGMT_DEV_DISCONN_REMOTE ; +case HCI_ERROR_LOCAL_HOST_TERM : +return MGMT_DEV_DISCONN_LOCAL_HOST ; +default : +return MGMT_DEV_DISCONN_UNKNOWN ; + } +} +void mgmt_device_disconnected (struct hci_dev *hdev,bdaddr_t *bdaddr,u8 link_type,u8 addr_type,u8 reason,bool mgmt_connected)
@@ -9972,7 +9988,8 @@ void mgmt_connect_failed(struct hci_dev *hdev, struct hci_conn *conn, u8 status)if (test_and_clear_bit (HCI_CONN_MGMT_CONNECTED , &conn->flags)) {mgmt_device_disconnected (hdev, &conn->dst, conn->type, - conn->dst_type, status, true); + conn->dst_type, +hci_to_mgmt_reason (status), true);return ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 107/744 smb/client: handle overlapping allocated ranges in fallocate
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huiwen He <[email protected]>
[ Upstream commit b09ae45d85dc816987a71db9eebc54b0ae288e94 ]
smb3_simple_fallocate_range() can skip holes when an allocated range returned by the server starts before the current fallocate offset. The skipped hole is not zero-filled, but fallocate still returns success. A later write to that hole may therefore fail with ENOSPC.
The function queries allocated ranges so that it can preserve existing contents and write zeroes only into holes. However, the server may return a range that starts before the current fallocate offset.
For example, assume the fallocate request is [100, 400) and the only allocated range returned by the server is [0, 200):
Request: [100, 400)
Server range: [ 0, 200) allocated
Correct:
[100, 200) allocated data, skip
[200, 400) hole, zero-fill
Current:
[100, 300) skipped
[300, 400) zero-filled afterwardsThe current code adds the full server range length, 200, to the current offset 100 and moves to 300. As a result, the hole in [200, 300) is skipped without being zero-filled.
Fix this by advancing only over the part of the allocated range that overlaps the current fallocate offset. Ignore ranges that end before the current offset and reject ranges whose end offset overflows.
This also prevents a malformed range length from causing an out-of-bounds zero-buffer read.
--- fs/smb/client/smb2ops.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
fs/smb/client/smb2ops.c +18 -7
@@ -3581,6 +3581,7 @@ static int smb3_simple_fallocate_range(unsigned int xid,struct file_allocated_range_buffer in_data, *out_data =NULL , *tmp_data;u32 out_data_len;char *buf =NULL ; +u64 range_start, range_len, range_end;loff_t l;int rc;
@@ -3617,13 +3618,21 @@ static int smb3_simple_fallocate_range(unsigned int xid, goto out; } -if (off <le64_to_cpu (tmp_data->file_offset)) { + range_start =le64_to_cpu (tmp_data->file_offset); + range_len =le64_to_cpu (tmp_data->length); +if (check_add_overflow (range_start, range_len, &range_end) || + range_end >S64_MAX ) { + rc = -EINVAL ; + goto out; + } + +if (off < range_start) {/* * We are at a hole. Write until the end of the region * or until the next allocated data, * whichever comes next. */ - l =le64_to_cpu (tmp_data->file_offset) - off; + l = range_start - off;if (len < l) l = len; rc = smb3_simple_fallocate_write_range(xid, tcon,
@@ -3640,11 +3649,13 @@ static int smb3_simple_fallocate_range(unsigned int xid,* until the end of the data or the end of the region * we are supposed to fallocate, whichever comes first. */ - l =le64_to_cpu (tmp_data->length); -if (len < l) - l = len; - off += l; - len -= l; +if (off < range_end) { + l = range_end - off; +if (len < l) + l = len; + off += l; + len -= l; + } tmp_data = &tmp_data[1 ]; out_data_len -=sizeof (struct file_allocated_range_buffer );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 108/744 riscv: Gate FUNCTION_ALIGNMENT_4B on DYNAMIC_FTRACE
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rui Qi <[email protected]>
[ Upstream commit 3a2694bf6ac8e47b3814293e80343f58fc72937f ]
The FUNCTION_ALIGNMENT_4B select forces the whole kernel to be built with -fmin-function-alignment=4. This alignment is only needed so the patchable-function-entry NOPs, which arch/riscv/Makefile emits under CONFIG_DYNAMIC_FTRACE, can be patched reliably on RISCV_ISA_C=y builds where compressed instructions otherwise allow 2-byte function alignment.
The select is currently gated on HAVE_DYNAMIC_FTRACE, a capability bit that is selected whenever the toolchain supports dynamic ftrace, rather than on whether tracing is actually enabled. As a result every RISCV_ISA_C=y build gets 4-byte function alignment across the entire kernel even when function tracing is disabled, needlessly growing the kernel image and wasting instruction cache for a feature that is not in use.
Gate the select on DYNAMIC_FTRACE instead, matching the condition under which arch/riscv/Makefile emits -fpatchable-function-entry, so the alignment is only applied when it is actually needed.
--- arch/riscv/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/Kconfig +1 -1
@@ -155,7 +155,7 @@ config RISCV select HAVE_DEBUG_KMEMLEAK select HAVE_DMA_CONTIGUOUS if MMU select HAVE_DYNAMIC_FTRACE if MMU && (CLANG_SUPPORTS_DYNAMIC_FTRACE || GCC_SUPPORTS_DYNAMIC_FTRACE) - select FUNCTION_ALIGNMENT_4B if HAVE_DYNAMIC_FTRACE && RISCV_ISA_C + select FUNCTION_ALIGNMENT_4B if DYNAMIC_FTRACE && RISCV_ISA_C select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS if HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS select HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS if (DYNAMIC_FTRACE_WITH_ARGS && !CFI) select HAVE_DYNAMIC_FTRACE_WITH_ARGS if HAVE_DYNAMIC_FTRACE
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 109/744 drm/i915/gt: use correct selftest config symbol
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengpeng Hou <[email protected]>
[ Upstream commit a82f1bb8191aec98a971a2196136016ef70c0880 ]
intel_engine_user.c checks CONFIG_DRM_I915_SELFTESTS before running the engine UABI isolation check. Kconfig defines DRM_I915_SELFTEST, without the trailing "S", and the rest of i915 uses CONFIG_DRM_I915_SELFTEST.
Because CONFIG_DRM_I915_SELFTESTS is not backed by any Kconfig symbol, the IS_ENABLED() test is always false. Use the existing selftest symbol so the debug/selftest guarded path can be reached when selftests are enabled.
This is a source-level fix. It does not claim dynamic hardware reproduction; the evidence is the Kconfig definition and the inconsistent guard in intel_engine_user.c.
--- drivers/gpu/drm/i915/gt/intel_engine_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/gt/intel_engine_user.c +1 -1
@@ -259,7 +259,7 @@ void intel_engines_driver_register(struct drm_i915_private *i915) p = &prev->rb_right; } -if (IS_ENABLED (CONFIG_DRM_I915_SELFTESTS ) && +if (IS_ENABLED (CONFIG_DRM_I915_SELFTEST ) &&IS_ENABLED (CONFIG_DRM_I915_DEBUG_GEM )) {struct intel_engine_cs *engine;unsigned int isolation;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 110/744 can: raw: add locking for raw flags bitfield
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Hartkopp <[email protected]>
[ Upstream commit 1e5185c090589f4146d728ab36417d8a5419f127 ]
With commit 890e5198a6e5 ("can: raw: use bitfields to store flags in struct raw_sock") the formerly separate integer values have been integrated into a single bitfield. This led to a read-modify-write operation when changing a flag in raw_setsockopt() which now needs a locking to prevent concurrent access.
Instead of adding a lock/unlock hell in each of the flag manipulations this patch introduces a wrapper for a new raw_setsockopt_locked() function analogue to the isotp_setsockopt[_locked]() approach in net/can/isotp.c
--- net/can/raw.c | 66 +++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 36 deletions(-)
net/can/raw.c +30 -36
@@ -562,8 +562,8 @@ static int raw_getname(struct socket *sock, struct sockaddr *uaddr,return RAW_MIN_NAMELEN ; } -static int raw_setsockopt (struct socket *sock,int level,int optname, -sockptr_t optval,unsigned int optlen) +static int raw_setsockopt_locked (struct socket *sock,int optname, +sockptr_t optval,unsigned int optlen) {struct sock *sk = sock->sk;struct raw_sock *ro =raw_sk (sk);
@@ -575,9 +575,6 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,int flag;int err =0 ; -if (level !=SOL_CAN_RAW ) -return -EINVAL ; -switch (optname) {case CAN_RAW_FILTER :if (optlen %sizeof (struct can_filter ) !=0 )
@@ -598,17 +595,11 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,return -EFAULT ; } -rtnl_lock (); -lock_sock (sk); - dev = ro->dev; -if (ro->bound && dev) { -if (dev->reg_state !=NETREG_REGISTERED ) { -if (count >1 ) -kfree (filter); - err = -ENODEV ; - goto out_fil; - } +if (ro->bound && dev && dev->reg_state !=NETREG_REGISTERED ) { +if (count >1 ) +kfree (filter); +return -ENODEV ; }if (ro->bound) {
@@ -622,7 +613,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,if (err) {if (count >1 )kfree (filter); - goto out_fil; +return err; }/* remove old filter registrations */
@@ -642,11 +633,6 @@ static int raw_setsockopt(struct socket *sock, int level, int optname, } ro->filter = filter; ro->count = count; - - out_fil: -release_sock (sk); -rtnl_unlock (); -break ;case CAN_RAW_ERR_FILTER :
@@ -658,16 +644,9 @@ static int raw_setsockopt(struct socket *sock, int level, int optname, err_mask &=CAN_ERR_MASK ; -rtnl_lock (); -lock_sock (sk); - dev = ro->dev; -if (ro->bound && dev) { -if (dev->reg_state !=NETREG_REGISTERED ) { - err = -ENODEV ; - goto out_err; - } - } +if (ro->bound && dev && dev->reg_state !=NETREG_REGISTERED ) +return -ENODEV ;/* remove current error mask */ if (ro->bound) {
@@ -676,7 +655,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname, err_mask);if (err) - goto out_err; +return err;/* remove old err_mask registration */ raw_disable_errfilter(sock_net(sk), dev, sk,
@@ -685,11 +664,6 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,/* link new err_mask to the socket */ ro->err_mask = err_mask; - - out_err: -release_sock (sk); -rtnl_unlock (); -break ;case CAN_RAW_LOOPBACK :
@@ -769,6 +743,26 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,return err; } +static int raw_setsockopt (struct socket *sock,int level,int optname, +sockptr_t optval,unsigned int optlen) +{ +struct sock *sk = sock->sk; +int err; + +if (level !=SOL_CAN_RAW ) +return -EINVAL ; + +rtnl_lock (); +lock_sock (sk); + + err =raw_setsockopt_locked (sock, optname, optval, optlen); + +release_sock (sk); +rtnl_unlock (); + +return err; +} +static int raw_getsockopt (struct socket *sock,int level,int optname,sockopt_t *opt) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 111/744 spi: cadence-quadspi: Fix indirect write timeout when DMA read mode is enabled
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srikanth Boyapally <[email protected]>
[ Upstream commit e919ca35a6e84b5adf085da9ffa1544c01d4ce1e ]
When use_dma_read is enabled, the IRQ handler unconditionally overwrites irq_status with the return value of get_dma_status(). For write operations, DMA status returns 0 since no DMA read is in progress, causing irq_status to become 0. The subsequent completion signal is never triggered and the write operation times out with -ETIMEDOUT:
cadence-qspi f1010000.spi: Indirect write timeout spi-nor spi0.1: operation failed with -110
Fix this by separating the DMA completion path from the write interrupt path. If get_dma_status() indicates DMA read completion, signal completion and return immediately. Otherwise, preserve the original irq_status so that write completion interrupts are correctly recognized and signalled.
--- drivers/spi/spi-cadence-quadspi.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/spi/spi-cadence-quadspi.c +8 -4
@@ -382,12 +382,16 @@ static irqreturn_t cqspi_irq_handler(int this_irq, void *dev)/* Clear interrupt */ writel (irq_status, cqspi->iobase +CQSPI_REG_IRQSTATUS ); -if (cqspi->use_dma_read && ddata && ddata->get_dma_status) - irq_status = ddata->get_dma_status (cqspi); -else if (cqspi->slow_sram) +if (cqspi->use_dma_read && ddata && ddata->get_dma_status) { +if (ddata->get_dma_status (cqspi)) { +complete (&cqspi->transfer_complete); +return IRQ_HANDLED ; + } + }else if (cqspi->slow_sram) { irq_status &=CQSPI_IRQ_MASK_RD_SLOW_SRAM |CQSPI_IRQ_MASK_WR ; -else + }else { irq_status &=CQSPI_IRQ_MASK_RD |CQSPI_IRQ_MASK_WR ; + }if (irq_status)complete (&cqspi->transfer_complete);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 112/744 powerpc/85xx: Add fsl,ifc to common device ids
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 25957f7c3dac3265332d766b71233e3622f17e14 ]
Add fsl,ifc to mpc85xx_common_ids so that of_platform_bus_probe creates a platform device for the IFC node even without 'simple-bus' in its compatible property. On P1010 and similar platforms the IFC node is a direct child of the root, so it must be explicitly matched to be populated.
--- arch/powerpc/platforms/85xx/common.c | 2 ++ 1 file changed, 2 insertions(+)
arch/powerpc/platforms/85xx/common.c +2 -0
@@ -42,6 +42,8 @@ static const struct of_device_id mpc85xx_common_ids[] __initconst = { { .compatible = "fsl,qoriq-pcie-v2.3", }, { .compatible = "fsl,qoriq-pcie-v2.2", }, { .compatible = "fsl,fman", }, + /* IFC NAND and NOR controllers */ + { .compatible = "fsl,ifc", }, {}, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 113/744 powerpc/time: Prepare to stop elapsing in dynticks-idle
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frederic Weisbecker <[email protected]>
[ Upstream commit c8ba971cf8567d49eb5f43ee90c4e50424331c18 ]
Currently the tick subsystem stores the idle cputime accounting in private fields, allowing cohabitation with architecture idle vtime accounting. The former is fetched on online CPUs, the latter on offline CPUs.
For consolidation purpose, architecture vtime accounting will continue to account the cputime but will make a break when the idle tick is stopped. The dyntick cputime accounting will then be relayed by the tick subsystem so that the idle cputime is still seen advancing coherently even when the tick isn't there to flush the idle vtime.
Prepare for that and introduce three new APIs which will be used in subsequent patches:
- vtime_dynticks_start() is deemed to be called when idle enters in dyntick mode. The idle cputime that elapsed so far is accumulated.
- vtime_dynticks_stop() is deemed to be called when idle exits from dyntick mode. The vtime entry clocks are fast-forward to current time so that idle accounting restarts elapsing from now.
- vtime_reset() is deemed to be called from dynticks idle IRQ entry to fast-forward the clock to current time so that the IRQ time is still accounted by vtime while nohz cputime is paused.
Also accumulated vtime won't be flushed from dyntick-idle ticks to avoid accounting twice the idle cputime, along with nohz accounting.
Stable-dep-of: c1c1ffa490fc ("powerpc/vtime: Initialize starttime at boot for native accounting")
--- arch/powerpc/kernel/time.c | 41 ++++++++++++++++++++++++++++++++++++++ include/linux/vtime.h | 6 ++++++ 2 files changed, 47 insertions(+)
arch/powerpc/kernel/time.c +41 -0
@@ -376,6 +376,47 @@ void vtime_task_switch(struct task_struct *prev) acct->starttime = acct0->starttime; } } + +#ifdef CONFIG_NO_HZ_COMMON +/** +* vtime_reset - Fast forward vtime entry clocks +* +* Called from dynticks idle IRQ entry to fast-forward the clocks to current time +* so that the IRQ time is still accounted by vtime while nohz cputime is paused. +*/ +void vtime_reset (void ) +{ +struct cpu_accounting_data *acct =get_accounting (current); + + acct->starttime =mftb (); +#ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME + acct->startspurr =read_spurr (acct->starttime); +#endif +} + +/** +* vtime_dyntick_start - Inform vtime about entry to idle-dynticks +* +* Called when idle enters in dyntick mode. The idle cputime that elapsed so far +* is accumulated and the tick subsystem takes over the idle cputime accounting. +*/ +void vtime_dyntick_start (void ) +{ +vtime_account_idle (current); +} + +/** +* vtime_dyntick_stop - Inform vtime about exit from idle-dynticks +* +* Called when idle exits from dyntick mode. The vtime entry clocks are +* fast-forward to current time so that idle accounting restarts elapsing from +* now. +*/ +void vtime_dyntick_stop (void ) +{ +vtime_reset (); +} +#endif /* CONFIG_NO_HZ_COMMON */ #endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ void __no_kcsan __delay(unsigned long loops)
include/linux/vtime.h +6 -0
@@ -32,11 +32,17 @@ extern void vtime_account_irq(struct task_struct *tsk, unsigned int offset);extern void vtime_account_softirq (struct task_struct *tsk);extern void vtime_account_hardirq (struct task_struct *tsk);extern void vtime_flush (struct task_struct *tsk); +extern void vtime_reset (void ); +extern void vtime_dyntick_start (void ); +extern void vtime_dyntick_stop (void );#else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ static inline void vtime_account_irq (struct task_struct *tsk,unsigned int offset) { }static inline void vtime_account_softirq (struct task_struct *tsk) { }static inline void vtime_account_hardirq (struct task_struct *tsk) { }static inline void vtime_flush (struct task_struct *tsk) { } +static inline void vtime_reset (void ) { } +static inline void vtime_dyntick_start (void ) { } +static inline void vtime_dyntick_stop (void ) { }#endif /*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 114/744 powerpc/vtime: Initialize starttime at boot for native accounting
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shrikanth Hegde <[email protected]>
[ Upstream commit c1c1ffa490fc33591e90852ed0d38804dd20bc36 ]
It was observed that /proc/stat had very large value for one ore more CPUs. It was more visible after recent code simplifications around cpustats.
System has 240 CPUs.
cat /proc/uptime;
194.18 46500.55
cat /proc/stat
cpu 5966 39 837032887 4650070 164 185 100 0 0 0
cpu0 108 0 837030890 19109 24 4 23 0 0 0
Since uptime is 194s, system time of each CPU can't be more than 19400. Sum of system time of all CPUs can't be more than 19400*240 4656000. In fact huge value is close to mftb(). Note mftb doesn't reset on powerVM when the LPAR restart. It only resets when whole system resets. The same issue exists for kexec too.
This happens since starttime is not setup at init time. Once it is set then subsequent vtime_delta will return the right delta.
Fix it by initializing the starttime during CPU initialization. This fixes the large times seen.
cat /proc/uptime; cat /proc/stat
15.78 3694.63
cpu 6035 35 1347 369479 23 144 49 0 0 0
cpu0 19 0 38 1508 0 1 14 0 0 0
Now, system time is reported as expected.
--- arch/powerpc/kernel/time.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/powerpc/kernel/time.c +3 -1
@@ -377,7 +377,6 @@ void vtime_task_switch(struct task_struct *prev) } } -#ifdef CONFIG_NO_HZ_COMMON /** * vtime_reset - Fast forward vtime entry clocks *
@@ -394,6 +393,7 @@ void vtime_reset(void)#endif } +#ifdef CONFIG_NO_HZ_COMMON /** * vtime_dyntick_start - Inform vtime about entry to idle-dynticks *
@@ -933,6 +933,7 @@ static void __init set_decrementer_max(void)static void __init init_decrementer_clockevent (void ) {register_decrementer_clockevent (smp_processor_id ()); +vtime_reset (); }void secondary_cpu_time_init (void )
@@ -948,6 +949,7 @@ void secondary_cpu_time_init(void)/* FIME: Should make unrelated change to move snapshot_timebase * call here ! */ register_decrementer_clockevent (smp_processor_id ()); +vtime_reset (); }/*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 115/744 bpf, sockmap: Reject unhashed UDP sockets on sockmap update
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Luczaj <[email protected]>
[ Upstream commit 66efd3368ae10d05e08fbe6425b50fdec7186ac7 ]
UDP sockets get SOCK_RCU_FREE set when (auto-)bound. This means sk_is_refcounted(unbound) = true, while sk_is_refcounted(bound) = false.
Because sockmap accepts unbound UDP sockets, a BPF program can increment a socket's refcount via lookup. If the socket is subsequently bound, the transition from unbound to bound causes bpf_sk_release() to skip the decrement of the refcount, causing a memory leak.
unreferenced object 0xffff88810bc2eb40 (size 1984):
comm "test_progs", pid 2451, jiffies 4295320596 hex dump (first 32 bytes):
7f 00 00 01 7f 00 00 01 d2 04 1b b7 04 d2 00 00 ................
02 00 01 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@............
backtrace (crc bdee079d):
kmem_cache_alloc_noprof+0x557/0x660
sk_prot_alloc+0x69/0x240
sk_alloc+0x30/0x460
inet_create+0x2ce/0xf80
__sock_create+0x25b/0x5c0
__sys_socket+0x119/0x1d0
__x64_sys_socket+0x72/0xd0
do_syscall_64+0xa1/0x5f0
entry_SYSCALL_64_after_hwframe+0x76/0x7eInstead of special-casing for refcounted sockets, reject unhashed UDP sockets during sockmap updates, as there is no benefit to supporting those. This effectively reverts the commit under Fixes, with two exceptions:
1. sock_map_sk_state_allowed() maintains a fall-through return true.
2. In the spirit of commit b8b8315e39ff ("bpf, sockmap: Remove unhash handler for BPF sockmap usage"), the proto::unhash BPF handler is not reintroduced.
Historical note: this issue is related to commit 67312adc96b5 ("bpf: reject unhashed sockets in bpf_sk_assign").
--- net/core/sock_map.c | 2 ++ 1 file changed, 2 insertions(+)
net/core/sock_map.c +2 -0
@@ -542,6 +542,8 @@ static bool sock_map_sk_state_allowed(const struct sock *sk) {if (sk_is_tcp (sk))return (1 << sk->sk_state) & (TCPF_ESTABLISHED |TCPF_LISTEN ); +if (sk_is_udp (sk)) +return sk_hashed (sk);if (sk_is_stream_unix (sk))return (1 <<READ_ONCE (sk->sk_state)) &TCPF_ESTABLISHED ; if (sk_is_vsock(sk) &&
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 116/744 drm/panthor: Check debugfs GEM lock initialization
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linmao Li <[email protected]>
[ Upstream commit 022e901333c3054656a640794e842bab7af5a75c ]
drmm_mutex_init() can fail while registering the managed cleanup action. When that happens, drmm_add_action_or_reset() destroys the mutex before returning the error. Continuing initialization would therefore leave the debugfs GEM object list with an unusable lock.
Propagate the error as is already done for the other managed mutexes in panthor_device_init().
--- drivers/gpu/drm/panthor/panthor_device.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/panthor/panthor_device.c +4 -1
@@ -207,7 +207,10 @@ int panthor_device_init(struct panthor_device *ptdev)return ret;#ifdef CONFIG_DEBUG_FS -drmm_mutex_init (&ptdev->base, &ptdev->gems.lock); + ret =drmm_mutex_init (&ptdev->base, &ptdev->gems.lock); +if (ret) +return ret; +INIT_LIST_HEAD (&ptdev->gems.node);#endif
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 117/744 s390/checksum: Fix csum_partial() without vector facility
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vasily Gorbik <[email protected]>
[ Upstream commit 4bb06b60d982355e22647b3d12d6619419f8c1fa ]
Currently csum_partial() calls csum_copy() with copy=false and dst=NULL. On machines without the vector facility, csum_copy() falls back to cksm(dst, ...), causing the checksum to be calculated from address zero instead of the source buffer.
The VX implementation already checksums data loaded from src. Make the fallback do the same by passing src to cksm().
--- arch/s390/lib/csum-partial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/lib/csum-partial.c +1 -1
@@ -23,7 +23,7 @@ static __always_inline __wsum csum_copy(void *dst, const void *src, int len, __wif (!cpu_has_vx ()) {if (copy)memcpy (dst, src, len); -return cksm (dst, len, sum); +return cksm (src, len, sum); }kernel_fpu_begin (&vxstate,KERNEL_VXR_V16V23 );fpu_vlvgf (16 , (__force u32 )sum,1 );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 118/744 riscv: hwprobe: Avoid uninitialized read in hwprobe_get_cpus()
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Harris <[email protected]>
[ Upstream commit 5caae1deee89a6582c761d5dcd4b924b744426cc ]
When cpusetsize < cpumask_size(), hwprobe_get_cpus() did not fully initialize its copy of the cpu mask, which could cause non-deterministic results from the riscv_hwprobe syscall on a system with more than 8 CPUs when the supplied cpu mask is empty. Address this by fully initializing the cpu mask.
--- arch/riscv/kernel/sys_hwprobe.c | 1 + 1 file changed, 1 insertion(+)
arch/riscv/kernel/sys_hwprobe.c +1 -0
@@ -450,6 +450,7 @@ static int hwprobe_get_cpus(struct riscv_hwprobe __user *pairs,if (cpusetsize >cpumask_size ()) cpusetsize =cpumask_size (); +cpumask_clear (&cpus); ret =copy_from_user (&cpus, cpus_user, cpusetsize);if (ret)return -EFAULT ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 119/744 can: j1939: fix lockless local-destination check
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shuhao Fu <[email protected]>
[ Upstream commit e4e8af62adab2fdcca230006f829407a953070cd ]
j1939_priv.ents[].nusers is documented as protected by priv->lock, and its updates already happen under that lock. j1939_can_recv() also reads it under read_lock_bh(). However, j1939_session_skb_queue() and j1939_tp_send() still read priv->ents[da].nusers without taking the lock.
Those transport-side checks decide whether to set J1939_ECU_LOCAL_DST, so they can race with j1939_local_ecu_get() and j1939_local_ecu_put() while userspace is binding or releasing sockets concurrently with TP traffic. This can misclassify TP/ETP sessions as local or remote and take the wrong transport path.
Fix both transport paths by routing the destination-locality check through a helper that reads ents[].nusers under read_lock_bh(&priv->lock).
--- net/can/j1939/transport.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
net/can/j1939/transport.c +14 -4
@@ -351,6 +351,18 @@ static void j1939_session_skb_drop_old(struct j1939_session *session) } } +static bool j1939_address_is_local (struct j1939_priv *priv,u8 addr) +{ +bool local = false; + +read_lock_bh (&priv->lock); +if (j1939_address_is_unicast (addr) && priv->ents[addr].nusers) + local = true; +read_unlock_bh (&priv->lock); + +return local; +} +void j1939_session_skb_queue (struct j1939_session *session,struct sk_buff *skb) {
@@ -359,8 +371,7 @@ void j1939_session_skb_queue(struct j1939_session *session,j1939_ac_fixup (priv, skb); -if (j1939_address_is_unicast (skcb->addr.da) && - priv->ents[skcb->addr.da].nusers) +if (j1939_address_is_local (priv, skcb->addr.da)) skcb->flags |=J1939_ECU_LOCAL_DST ; skcb->flags |=J1939_ECU_LOCAL_SRC ;
@@ -2038,8 +2049,7 @@ struct j1939_session *j1939_tp_send(struct j1939_priv *priv,return ERR_PTR (ret);/* fix DST flags, it may be used there soon */ -if (j1939_address_is_unicast (skcb->addr.da) && - priv->ents[skcb->addr.da].nusers) +if (j1939_address_is_local (priv, skcb->addr.da)) skcb->flags |=J1939_ECU_LOCAL_DST ;/* src is always local, I'm sending ... */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 120/744 drm/xe/vf: Fix VF CCS attach/detach race with in-flight BO moves
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Brost <[email protected]>
[ Upstream commit 56441f9e08ad68697295b8835266d2bc48ab59b5 ]
xe_bo_move() attaches VF CCS read/write batch buffers (BBs) to a BO after it transitions NULL/SYSTEM -> TT, and detaches them after it transitions TT -> SYSTEM. Both operations were done synchronously on the CPU immediately after building the move's copy/clear fence, without waiting for that fence to signal. This creates two races with VF migration:
- Attach happens too late relative to the copy job it is meant to protect. If the copy job is submitted before the CCS BBs are attached, a VF migration event that pauses execution mid-copy can observe partially copied CCS metadata without the attach state needed to correctly save/restore it.
- Detach happens too early relative to the copy job that moves data out of TT. The CCS BBs are torn down right after the copy fence is obtained, while the actual blit may still be in flight. A VF migration event that pauses execution mid-copy can then race the save/restore path against the still-running blit, and the CCS BBs it would need to make sense of the paused state have already been removed.
Fix both races:
- Move the attach call to before the copy/clear job is submitted, so the CCS BBs are already registered by the time the copy runs. On attach failure, unwind and bail out of the move. xe_migrate_ccs_rw_copy() now takes the destination resource explicitly, since bo->ttm.resource is not updated to the new resource until after the move commits.
- Detach only after explicitly waiting for the copy fence to signal, instead of tearing down the CCS BBs immediately after obtaining it.
While here, also fix xe_sriov_vf_ccs_attach_bo() to properly unwind and propagate errors: the per-context loop previously never broke out on error, silently discarding earlier failures. Unwind by clearing each attached context directly via xe_migrate_ccs_rw_copy_clear() instead of reusing xe_sriov_vf_ccs_detach_bo(), which requires both contexts to be attached before it will clean up either one.
--- drivers/gpu/drm/xe/xe_bo.c | 34 +++++++++++++++++++--------- drivers/gpu/drm/xe/xe_migrate.c | 5 +++- drivers/gpu/drm/xe/xe_migrate.h | 1 + drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 20 ++++++++++++++-- drivers/gpu/drm/xe/xe_sriov_vf_ccs.h | 3 ++- 5 files changed, 48 insertions(+), 15 deletions(-)
drivers/gpu/drm/xe/xe_bo.c +23 -11
@@ -1109,6 +1109,21 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,xe_pm_runtime_get_noresume (xe); } +/* +* Attach CCS BBs before submitting the copy job below so a VF +* migration racing the copy sees valid, up to date attach state. +*/ +if (IS_VF_CCS_READY (xe) && + ((move_lacks_source && new_mem->mem_type ==XE_PL_TT ) || + (old_mem_type ==XE_PL_SYSTEM && new_mem->mem_type ==XE_PL_TT )) && + handle_system_ccs) { + ret =xe_sriov_vf_ccs_attach_bo (bo, new_mem); +if (ret) { +xe_pm_runtime_put (xe); + goto out; + } + } +if (move_lacks_source) {u32 flags =0 ;
@@ -1146,22 +1161,19 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,ttm_bo_move_null (ttm_bo, new_mem); } -dma_fence_put (fence); -xe_pm_runtime_put (xe); -/* -* CCS meta data is migrated from TT -> SMEM. So, let us detach the -* BBs from BO as it is no longer needed. +* Detach must wait for the copy above to complete: a VF migration +* racing an in-flight copy must still see valid CCS BBs, so don't +* tear them down until the copy fence has signaled. */ if (IS_VF_CCS_READY (xe) && old_mem_type ==XE_PL_TT && - new_mem->mem_type ==XE_PL_SYSTEM ) + new_mem->mem_type ==XE_PL_SYSTEM ) { +dma_fence_wait (fence, false);xe_sriov_vf_ccs_detach_bo (bo); + } -if (IS_VF_CCS_READY (xe) && - ((move_lacks_source && new_mem->mem_type ==XE_PL_TT ) || - (old_mem_type ==XE_PL_SYSTEM && new_mem->mem_type ==XE_PL_TT )) && - handle_system_ccs) - ret =xe_sriov_vf_ccs_attach_bo (bo); +dma_fence_put (fence); +xe_pm_runtime_put (xe); out: if ((!ttm_bo->resource || ttm_bo->resource->mem_type == XE_PL_SYSTEM) &&
drivers/gpu/drm/xe/xe_migrate.c +4 -1
@@ -1145,6 +1145,8 @@ static int emit_flush_invalidate(u32 *dw, int i, u32 flags)* @tile: Tile whose migration context to be used. * @q : Execution to be used along with migration context. * @src_bo: The buffer object @src is currently bound to. +* @new_mem: The (not yet committed) destination resource @src_bo is being +* moved into; src_bo->ttm.resource is still the old resource. * @read_write : Creates BB commands for CCS read/write. * * Creates batch buffer instructions to copy CCS metadata from CCS pool to
@@ -1156,12 +1158,13 @@ static int emit_flush_invalidate(u32 *dw, int i, u32 flags)*/ int xe_migrate_ccs_rw_copy (struct xe_tile *tile,struct xe_exec_queue *q,struct xe_bo *src_bo, +struct ttm_resource *new_mem,enum xe_sriov_vf_ccs_rw_ctxs read_write) {bool src_is_pltt = read_write ==XE_SRIOV_VF_CCS_READ_CTX ;bool dst_is_pltt = read_write ==XE_SRIOV_VF_CCS_WRITE_CTX ; -struct ttm_resource *src = src_bo->ttm.resource; +struct ttm_resource *src = new_mem;struct xe_migrate *m = tile->migrate;struct xe_gt *gt = tile->primary_gt;u32 batch_size, batch_size_allocated;
drivers/gpu/drm/xe/xe_migrate.h +1 -0
@@ -138,6 +138,7 @@ struct dma_fence *xe_migrate_resolve(struct xe_migrate *m,int xe_migrate_ccs_rw_copy (struct xe_tile *tile,struct xe_exec_queue *q,struct xe_bo *src_bo, +struct ttm_resource *new_mem,enum xe_sriov_vf_ccs_rw_ctxs read_write); void xe_migrate_ccs_rw_copy_clear(struct xe_bo *src_bo,
drivers/gpu/drm/xe/xe_sriov_vf_ccs.c +18 -2
@@ -404,6 +404,8 @@ void xe_sriov_vf_ccs_rw_update_bb_addr(struct xe_sriov_vf_ccs_ctx *ctx)/** * xe_sriov_vf_ccs_attach_bo - Insert CCS read write commands in the BO. * @bo: the &buffer object to which batch buffer commands will be added. +* @new_mem: the (not yet committed) destination resource @bo is being moved +* into; bo->ttm.resource is still the old resource at this point. * * This function shall be called only by VF. It inserts the PTEs and copy * command instructions in the BO by calling xe_migrate_ccs_rw_copy()
@@ -411,7 +413,7 @@ void xe_sriov_vf_ccs_rw_update_bb_addr(struct xe_sriov_vf_ccs_ctx *ctx)* * Returns: 0 if successful, negative error code on failure. */ -int xe_sriov_vf_ccs_attach_bo (struct xe_bo *bo) +int xe_sriov_vf_ccs_attach_bo (struct xe_bo *bo,struct ttm_resource *new_mem) {struct xe_device *xe =xe_bo_device (bo);enum xe_sriov_vf_ccs_rw_ctxs ctx_id;
@@ -430,7 +432,21 @@ int xe_sriov_vf_ccs_attach_bo(struct xe_bo *bo)xe_assert (xe, !bb); ctx = &xe->sriov.vf.ccs.contexts[ctx_id]; - err =xe_migrate_ccs_rw_copy (tile, ctx->mig_q, bo, ctx_id); + err =xe_migrate_ccs_rw_copy (tile, ctx->mig_q, bo, new_mem, ctx_id); +if (err) + goto err_unwind; + } +return 0 ; + +err_unwind: +/* +* Clean up any contexts already attached. Can't reuse +* xe_sriov_vf_ccs_detach_bo() here as it requires both contexts +* attached before cleaning up either one. +*/ +for_each_ccs_rw_ctx (ctx_id) { +if (bo->bb_ccs[ctx_id]) +xe_migrate_ccs_rw_copy_clear (bo, ctx_id); }return err; }
drivers/gpu/drm/xe/xe_sriov_vf_ccs.h +2 -1
@@ -11,11 +11,12 @@#include "xe_sriov_vf_ccs_types.h" struct drm_printer ; +struct ttm_resource ;struct xe_device ;struct xe_bo ;int xe_sriov_vf_ccs_init (struct xe_device *xe); -int xe_sriov_vf_ccs_attach_bo (struct xe_bo *bo); +int xe_sriov_vf_ccs_attach_bo (struct xe_bo *bo,struct ttm_resource *new_mem);int xe_sriov_vf_ccs_detach_bo (struct xe_bo *bo);int xe_sriov_vf_ccs_register_context (struct xe_device *xe);void xe_sriov_vf_ccs_rebase (struct xe_device *xe);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 121/744 drm/xe/wopcm: fix WOPCM size for LNL+
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniele Ceraolo Spurio <[email protected]>
[ Upstream commit ad87e2476b3b246580f407afc8ffa91d621bc849 ]
Starting on LNL the WOPCM size is 8MB instead of 4, so we need to avoid using the [0, 8MB) range of the GGTT as that can be unaccessible from the microcontrollers.
Note that the proper long-term fix here is to read the WOPCM size from the HW, but that is a more serious rework that would be difficult to backport, so we can do that as a follow-up.
--- drivers/gpu/drm/xe/xe_wopcm.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/gpu/drm/xe/xe_wopcm.c +10 -5
@@ -49,9 +49,9 @@*/ /* Default WOPCM size is 2MB from Gen11, 1MB on previous platforms */ -/* FIXME: Larger size require for 2 tile PVC, do a proper probe sooner or later */ +/* FIXME: Larger size require for some platforms, do a proper probe sooner or later */ #define DGFX_WOPCM_SIZE SZ_4M -/* FIXME: Larger size require for MTL, do a proper probe sooner or later */ +#define LNL_WOPCM_SIZE SZ_8M#define MTL_WOPCM_SIZE SZ_4M#define WOPCM_SIZE SZ_2M
@@ -179,9 +179,14 @@ static int __wopcm_init_regs(struct xe_device *xe, struct xe_gt *gt,u32 xe_wopcm_size (struct xe_device *xe) { -return IS_DGFX (xe) ?DGFX_WOPCM_SIZE : - xe->info.platform ==XE_METEORLAKE ?MTL_WOPCM_SIZE : -WOPCM_SIZE ; +if (xe->info.platform >=XE_LUNARLAKE ) +return LNL_WOPCM_SIZE ; +else if (IS_DGFX (xe)) +return DGFX_WOPCM_SIZE ; +else if (xe->info.platform ==XE_METEORLAKE ) +return MTL_WOPCM_SIZE ; +else +return WOPCM_SIZE ; }static u32 max_wopcm_size (struct xe_device *xe)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 122/744 drm/xe: Assign queue name in time for drm_sched_init
In reply to Greg Kroah-Hartman7.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
[ Upstream commit 24f60b8e9f44b10614b43dbc4ba4b029f8ede3b6 ]
Currently the queue name is only assigned after the drm scheduler instance has been created. This loses information with all logging or debug workqueue facilities so lets re-order things a bit so the name gets assigned in time.
To be able to assign a GuC ID early we split the allocation into reservation and publish phases.
First, with the submission state lock held, we reserve the ID in the GuC ID manager, which serves as an authoritative source of truth. Then we can drop the lock and reserve entries in the exec queue lookup XArray. This can be lockless since the NULL entries are invisible both to the kernel and userspace. Only after the queue has been fully created we replace the reserved entries with the queue pointer, which can be done locklessly for single width queues.
Stable-dep-of: 299bc6d50b1b ("drm/xe/guc: Keep scheduler timeline name alive")
--- drivers/gpu/drm/xe/xe_guc_submit.c | 72 +++++++++++++++++------------- 1 file changed, 40 insertions(+), 32 deletions(-)
drivers/gpu/drm/xe/xe_guc_submit.c +40 -32
@@ -397,46 +397,43 @@ void xe_guc_submit_disable(struct xe_guc *guc) guc->submission_state.enabled = false; } -static void __release_guc_id (struct xe_guc *guc,struct xe_exec_queue *q,u32 xa_count) +static void __release_guc_id (struct xe_guc *guc,struct xe_exec_queue *q, +int count) {int i; -lockdep_assert_held (&guc->submission_state.lock); +mutex_lock (&guc->submission_state.lock); -for (i =0 ; i < xa_count; ++i) -xa_erase (&guc->submission_state.exec_queue_lookup, q->guc->id + i); +for (i =0 ; i < count; ++i) +xa_erase (&guc->submission_state.exec_queue_lookup, + q->guc->id + i);xe_guc_id_mgr_release_locked (&guc->submission_state.idm, q->guc->id, q->width);if (xa_empty (&guc->submission_state.exec_queue_lookup))wake_up (&guc->submission_state.fini_wq); + +mutex_unlock (&guc->submission_state.lock); }static int alloc_guc_id (struct xe_guc *guc,struct xe_exec_queue *q) { -int ret; -int i; - -/* -* Must use GFP_NOWAIT as this lock is in the dma fence signalling path, -* worse case user gets -ENOMEM on engine create and has to try again. -* -* FIXME: Have caller pre-alloc or post-alloc /w GFP_KERNEL to prevent -* failure. -*/ -lockdep_assert_held (&guc->submission_state.lock); +int ret, i; +mutex_lock (&guc->submission_state.lock); ret =xe_guc_id_mgr_reserve_locked (&guc->submission_state.idm, q->width); +mutex_unlock (&guc->submission_state.lock);if (ret <0 )return ret; q->guc->id = ret; +/* Reserve empty slots. */ for (i =0 ; i < q->width; ++i) { - ret =xa_err (xa_store (&guc->submission_state.exec_queue_lookup, - q->guc->id + i, q,GFP_NOWAIT )); + ret =xa_insert (&guc->submission_state.exec_queue_lookup, + q->guc->id + i,NULL ,GFP_KERNEL );if (ret) goto err_release; }
@@ -449,11 +446,24 @@ static int alloc_guc_id(struct xe_guc *guc, struct xe_exec_queue *q)return ret; } +static void publish_guc_id (struct xe_guc *guc,struct xe_exec_queue *q) +{ +int i; + +lockdep_assert_held (&guc->submission_state.lock); + +for (i =0 ; i < q->width; ++i) { +void *old; + + old =xa_store (&guc->submission_state.exec_queue_lookup, + q->guc->id + i, q,GFP_NOWAIT ); +XE_WARN_ON (old ||xa_is_err (old)); + } +} +static void release_guc_id (struct xe_guc *guc,struct xe_exec_queue *q) { -mutex_lock (&guc->submission_state.lock);__release_guc_id (guc, q, q->width); -mutex_unlock (&guc->submission_state.lock); }struct exec_queue_policy {
@@ -1957,6 +1967,12 @@ static int guc_exec_queue_init(struct xe_exec_queue *q) timeout = (q->vm &&xe_vm_in_lr_mode (q->vm)) ?MAX_SCHEDULE_TIMEOUT :msecs_to_jiffies (q->sched_props.job_timeout_ms); + err =alloc_guc_id (guc, q); +if (err) + goto err_free; + +xe_exec_queue_assign_name (q, q->guc->id); +/* * Use primary queue's submit_wq for all secondary queues of a * multi queue group. This serialization avoids any locking around
@@ -1973,28 +1989,21 @@ static int guc_exec_queue_init(struct xe_exec_queue *q) timeout,guc_to_gt (guc)->ordered_wq,NULL , q->name, gt_to_xe(q->gt)->drm.dev);if (err) - goto err_free; + goto err_release_id; sched = &ge->sched; err =xe_sched_entity_init (&ge->entity, sched);if (err) goto err_sched; -mutex_lock (&guc->submission_state.lock); - - err =alloc_guc_id (guc, q); -if (err) - goto err_entity; - q->entity = &ge->entity; +mutex_lock (&guc->submission_state.lock);if (xe_guc_read_stopped (guc) ||vf_recovery (guc))xe_sched_stop (sched); - +publish_guc_id (guc, q);mutex_unlock (&guc->submission_state.lock); -xe_exec_queue_assign_name (q, q->guc->id); -/* * Maintain secondary queues of the multi queue group in a list * for handling dependencies across the queues in the group.
@@ -2017,11 +2026,10 @@ static int guc_exec_queue_init(struct xe_exec_queue *q)return 0 ; -err_entity: -mutex_unlock (&guc->submission_state.lock); -xe_sched_entity_fini (&ge->entity); err_sched:xe_sched_fini (&ge->sched); +err_release_id: +release_guc_id (guc, q); err_free:kfree (ge);
Signature · 1 line
2.53.0