6.1.148-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 6.1.148-rc1 review
This is the start of the stable review cycle for the 6.1.148 release. There are 253 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 Thu, 14 Aug 2025 17:27:05 +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/v6.x/stable-review/patch-6.1.148-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-6.1.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.1.148-rc1
Tao Xue <[email protected]>
usb: gadget : fix use-after-free in composite_dev_cleanup()
Andy Shevchenko <[email protected]>
mm/hmm: move pmd_to_hmm_pfn_flags() to the respective #ifdeffery
Jiaxun Yang <[email protected]>
MIPS: mm: tlb-r4k: Uniquify TLB entries on init
Dave Hansen <[email protected]>
x86/fpu: Delay instruction pointer fixup until after warning
Geoffrey D. Bennett <[email protected]>
ALSA: scarlett2: Add retry on -EPROTO from scarlett2_usb_tx()
Thorsten Blum <[email protected]>
ALSA: intel_hdmi: Fix off-by-one error in __hdmi_lpe_audio_probe()
Tom Lendacky <[email protected]>
x86/sev: Evict cache lines during SNP memory validation
Ammar Faizi <[email protected]>
net: usbnet: Fix the wrong netif_carrier_on() call
John Ernberg <[email protected]>
net: usbnet: Avoid potential RCU stall on LINK_CHANGE event
Slark Xiao <[email protected]>
USB: serial: option: add Foxconn T99W709
Thorsten Blum <[email protected]>
smb: server: Fix extension string in ksmbd_extract_shortname()
Namjae Jeon <[email protected]>
ksmbd: limit repeated connections from clients with the same IP
Namjae Jeon <[email protected]>
ksmbd: fix corrupted mtime and ctime in smb2_open
Namjae Jeon <[email protected]>
ksmbd: fix Preauh_HashValue race condition
Namjae Jeon <[email protected]>
ksmbd: fix null pointer dereference error in generate_encryptionkey
Budimir Markovic <[email protected]>
vsock: Do not allow binding to VMADDR_PORT_ANY
Quang Le <[email protected]>
net/packet: fix a race in packet_set_ring() and packet_notifier()
Lorenzo Stoakes <[email protected]>
selftests/perf_events: Add a mmap() correctness test
Thomas Gleixner <[email protected]>
perf/core: Prevent VMA split of buffer mappings
Thomas Gleixner <[email protected]>
perf/core: Exit early on perf_mmap() fail
Thomas Gleixner <[email protected]>
perf/core: Don't leak AUX buffer refcount on allocation failure
Eric Dumazet <[email protected]>
pptp: fix pptp_xmit() error path
Stefan Metzmacher <[email protected]>
smb: client: let recv_done() cleanup before notifying the callers.
Stefan Metzmacher <[email protected]>
smb: server: let recv_done() avoid touching data_transfer after cleanup/move
Stefan Metzmacher <[email protected]>
smb: server: let recv_done() consistently call put_recvmsg/smb_direct_disconnect_rdma_connection
Stefan Metzmacher <[email protected]>
smb: server: make sure we call ib_dma_unmap_single() only if we called ib_dma_map_single already
Stefan Metzmacher <[email protected]>
smb: server: remove separate empty_recvmsg_queue
Takashi Iwai <[email protected]>
ALSA: hda/ca0132: Fix missing error handling in ca0132_alt_select_out()
Arnd Bergmann <[email protected]>
irqchip: Build IMX_MU_MSI only on ARM
Michal Schmidt <[email protected]>
benet: fix BUG when creating VFs
Wang Liang <[email protected]>
net: drop UFO packets in udp_rcv_segment()
Eric Dumazet <[email protected]>
ipv6: reject malicious packets in ipv6_gso_segment()
Christoph Paasch <[email protected]>
net/mlx5: Correctly set gso_segs when LRO is used
Eric Dumazet <[email protected]>
pptp: ensure minimal skb length in pptp_xmit()
Horatiu Vultur <[email protected]>
phy: mscc: Fix parsing of unicast frames
Jakub Kicinski <[email protected]>
netpoll: prevent hanging NAPI when netcons gets enabled
Benjamin Coddington <[email protected]>
NFS: Fixup allocation flags for nfsiod's __GFP_NORETRY
Olga Kornievskaia <[email protected]>
NFSv4.2: another fix for listxattr
Trond Myklebust <[email protected]>
NFS: Fix filehandle bounds checking in nfs_fh_to_dentry()
Trond Myklebust <[email protected]>
NFS: Fix wakeup of __nfs_lookup_revalidate() in unblock_revalidate()
NeilBrown <[email protected]>
sched: Add test_and_clear_wake_up_bit() and atomic_dec_and_wake_up()
Tigran Mkrtchyan <[email protected]>
pNFS/flexfiles: don't attempt pnfs on fatal DS errors
Timothy Pearson <[email protected]>
PCI: pnv_php: Fix surprise plug detection and recovery
Timothy Pearson <[email protected]>
powerpc/eeh: Make EEH driver device hotplug safe
Maciej W. Rozycki <[email protected]>
powerpc/eeh: Rely on dev->link_active_reporting
Timothy Pearson <[email protected]>
powerpc/eeh: Export eeh_unfreeze_pe()
Timothy Pearson <[email protected]>
PCI: pnv_php: Work around switches with broken presence detection
Timothy Pearson <[email protected]>
PCI: pnv_php: Clean up allocated IRQs on unplug
Masahiro Yamada <[email protected]>
kconfig: qconf: fix ConfigList::updateListAllforAll()
Salomon Dushimirimana <[email protected]>
scsi: sd: Make sd shutdown issue START STOP UNIT appropriately
Seunghui Lee <[email protected]>
scsi: ufs: core: Use link recovery when h8 exit fails during runtime resume
Li Lingfeng <[email protected]>
scsi: Revert "scsi: iscsi: Fix HW conn removal use after free"
Tomas Henzl <[email protected]>
scsi: mpt3sas: Fix a fw_event memory leak
Alex Williamson <[email protected]>
vfio/pci: Separate SR-IOV VF dev_set
Chao Yu <[email protected]>
f2fs: fix to calculate dirty data during has_not_enough_free_secs()
Chao Yu <[email protected]>
f2fs: fix to update upper_p in __get_secs_required() correctly
Jan Prusakowski <[email protected]>
f2fs: vm_unmap_ram() may be called from an invalid context
Chao Yu <[email protected]>
f2fs: fix to avoid out-of-boundary access in devs.path
Chao Yu <[email protected]>
f2fs: fix to avoid panic in f2fs_evict_inode
Chao Yu <[email protected]>
f2fs: fix to avoid UAF in f2fs_sync_inode_meta()
Chao Yu <[email protected]>
f2fs: doc: fix wrong quota mount option description
Abinash Singh <[email protected]>
f2fs: fix KMSAN uninit-value in extent_info usage
Brian Masney <[email protected]>
rtc: rv3028: fix incorrect maximum clock rate handling
Brian Masney <[email protected]>
rtc: pcf8563: fix incorrect maximum clock rate handling
Brian Masney <[email protected]>
rtc: pcf85063: fix incorrect maximum clock rate handling
Brian Masney <[email protected]>
rtc: nct3018y: fix incorrect maximum clock rate handling
Brian Masney <[email protected]>
rtc: hym8563: fix incorrect maximum clock rate handling
Brian Masney <[email protected]>
rtc: ds1307: fix incorrect maximum clock rate handling
Uros Bizjak <[email protected]>
ucount: fix atomic_long_inc_below() argument type
Petr Pavlu <[email protected]>
module: Restore the moduleparam prefix length check
Ryan Lee <[email protected]>
apparmor: ensure WB_HISTORY_SIZE value is a power of 2
Paul Chaignon <[email protected]>
bpf: Check flow_dissector ctx accesses are aligned
Mike Christie <[email protected]>
vhost-scsi: Fix log flooding with target does not exist errors
Balamanikandan Gunasundar <[email protected]>
mtd: rawnand: atmel: set pmecc data setup time
Thomas Fourier <[email protected]>
mtd: rawnand: rockchip: Add missing check after DMA map
Thomas Fourier <[email protected]>
mtd: rawnand: atmel: Fix dma_mapping_error() address
Zheng Yu <[email protected]>
jfs: fix metapage reference count leak in dbAllocCtl
Chenyuan Yang <[email protected]>
fbdev: imxfb: Check fb_add_videomode to prevent null-ptr-deref
Giovanni Cabiddu <[email protected]>
crypto: qat - fix seq_file position update in adf_ring_next()
Ben Hutchings <[email protected]>
sh: Do not use hyphen in exported variable name
Thomas Fourier <[email protected]>
dmaengine: nbpfaxi: Add missing check after DMA map
Thomas Fourier <[email protected]>
dmaengine: mv_xor: Fix missing check after DMA map and missing unmap
Dan Carpenter <[email protected]>
fs/orangefs: Allow 2 more characters in do_c_string()
Manivannan Sadhasivam <[email protected]>
PCI: endpoint: pci-epf-vntb: Fix the incorrect usage of __iomem attribute
Bard Liao <[email protected]>
soundwire: stream: restore params when prepare ports fail
Thomas Fourier <[email protected]>
crypto: img-hash - Fix dma_unmap_sg() nents value
Thomas Fourier <[email protected]>
crypto: keembay - Fix dma_unmap_sg() nents value
Ovidiu Panait <[email protected]>
hwrng: mtk - handle devm_pm_runtime_enable errors
Dan Carpenter <[email protected]>
watchdog: ziirave_wdt: check record length in ziirave_firm_verify()
Thomas Fourier <[email protected]>
scsi: isci: Fix dma_unmap_sg() nents value
Thomas Fourier <[email protected]>
scsi: mvsas: Fix dma_unmap_sg() nents value
Thomas Fourier <[email protected]>
scsi: elx: efct: Fix dma_unmap_sg() nents value
Thomas Fourier <[email protected]>
scsi: ibmvscsi_tgt: Fix dma_unmap_sg() nents value
Paul Kocialkowski <[email protected]>
clk: sunxi-ng: v3s: Fix de clock definition
Leo Yan <[email protected]>
perf tests bp_account: Fix leaked file descriptor
wangzijie <[email protected]>
proc: use the same treatment to check proc_lseek as ones for proc_read_iter et.al
Arnd Bergmann <[email protected]>
kernel: trace: preemptirq_delay_test: use offstack cpu mask
Junxian Huang <[email protected]>
RDMA/hns: Fix -Wframe-larger-than issue
Mengbiao Xiong <[email protected]>
crypto: ccp - Fix crash when rebind ccp device for ccp.ko
Thomas Fourier <[email protected]>
crypto: inside-secure - Fix dma_unmap_sg() nents value
Namhyung Kim <[email protected]>
perf sched: Fix memory leaks in 'perf sched latency'
Namhyung Kim <[email protected]>
perf sched: Fix memory leaks for evsel->priv in timehist
Nuno Sá <[email protected]>
clk: clk-axi-clkgen: fix fpfd_max frequency for zynq
Yuan Chen <[email protected]>
pinctrl: sunxi: Fix memory leak on krealloc failure
Jerome Brunet <[email protected]>
PCI: endpoint: pci-epf-vntb: Return -ENOENT if pci_epc_get_next_free_bar() fails
Arnd Bergmann <[email protected]>
crypto: arm/aes-neonbs - work around gcc-15 warning
Charles Han <[email protected]>
power: supply: max14577: Handle NULL pdata when CONFIG_OF is not set
Charles Han <[email protected]>
power: supply: cpcap-charger: Fix null check for power_supply_get_by_name
Rohit Visavalia <[email protected]>
clk: xilinx: vcu: unregister pll_post only if registered correctly
James Cowgill <[email protected]>
media: v4l2-ctrls: Fix H264 SEPARATE_COLOUR_PLANE check
Henry Martin <[email protected]>
clk: davinci: Add NULL check in davinci_lpsc_clk_register()
Ivan Stepchenko <[email protected]>
mtd: fix possible integer overflow in erase_xfer()
Herbert Xu <[email protected]>
crypto: marvell/cesa - Fix engine load inaccuracy
Ovidiu Panait <[email protected]>
crypto: sun8i-ce - fix nents passed to dma_unmap_sg()
Hans Zhang <[email protected]>
PCI: rockchip-host: Fix "Unexpected Completion" log message
Thomas Weißschuh <[email protected]>
bpf/preload: Don't select USERMODE_DRIVER
Eric Dumazet <[email protected]>
ipv6: annotate data-races around rt->fib6_nsiblings
Eric Dumazet <[email protected]>
ipv6: fix possible infinite loop in fib6_info_uses_dev()
Eric Dumazet <[email protected]>
ipv6: prevent infinite loop in rt6_nlmsg_size()
Stanislav Fomichev <[email protected]>
vrf: Drop existing dst reference in vrf_ip6_input_dst
Xiumei Mu <[email protected]>
selftests: rtnetlink.sh: remove esp4_offload after test
Florian Westphal <[email protected]>
netfilter: xt_nfacct: don't assume acct name is null-terminated
Jimmy Assarsson <[email protected]>
can: kvaser_usb: Assign netdev.dev_port based on device channel index
Jimmy Assarsson <[email protected]>
can: kvaser_pciefd: Store device channel index
Stephane Grosjean <[email protected]>
can: peak_usb: fix USB FD devices potential malfunction
Marco Elver <[email protected]>
kcsan: test: Initialize dummy variable
Gokul Sivakumar <[email protected]>
wifi: brcmfmac: fix P2P discovery failure in P2P peer due to missing P2P IE
Remi Pommarel <[email protected]>
Reapply "wifi: mac80211: Update skb's control block key in ieee80211_tx_dequeue()"
Remi Pommarel <[email protected]>
wifi: mac80211: Check 802.11 encaps offloading in ieee80211_tx_h_select_key()
Alexander Wetzel <[email protected]>
wifi: mac80211: Don't call fq_flow_idx() for management frames
Alexander Wetzel <[email protected]>
wifi: mac80211: Do not schedule stopped TXQs
Murad Masimov <[email protected]>
wifi: plfxlc: Fix error handling in usb driver probe
Moon Hee Lee <[email protected]>
wifi: mac80211: reject TDLS operations when station is not associated
Thomas Fourier <[email protected]>
mwl8k: Add missing check after DMA map
Martin Kaistra <[email protected]>
wifi: rtl8xxxu: Fix RX skb size for aggregation disabled
Juergen Gross <[email protected]>
xen/gntdev: remove struct gntdev_copy_batch from stack
Eric Dumazet <[email protected]>
net_sched: act_ctinfo: use atomic64_t for three counters
William Liu <[email protected]>
net/sched: Restrict conditions for adding duplicating netems to qdisc tree
Tiwei Bie <[email protected]>
um: rtc: Avoid shadowing err in uml_rtc_start()
Johan Korsnes <[email protected]>
arch: powerpc: defconfig: Drop obsolete CONFIG_NET_CLS_TCINDEX
Fedor Pchelkin <[email protected]>
netfilter: nf_tables: adjust lockdep assertions handling
Shixiong Ou <[email protected]>
fbcon: Fix outdated registered_fb reference in comment
Fedor Pchelkin <[email protected]>
drm/amd/pm/powerplay/hwmgr/smu_helper: fix order of mask and value
Finn Thain <[email protected]>
m68k: Don't unregister boot console needlessly
Mark Brown <[email protected]>
kselftest/arm64: Fix check for setting new VLs in sve-ptrace
Stav Aviram <[email protected]>
net/mlx5: Check device memory pointer before usage
xin.guo <[email protected]>
tcp: fix tcp_ofo_queue() to avoid including too much DUP SACK range
Sergey Senozhatsky <[email protected]>
wifi: ath11k: clear initialized flag for deinit-ed srng lists
Jiasheng Jiang <[email protected]>
iwlwifi: Add missing check for alloc_ordered_workqueue
Xiu Jianfeng <[email protected]>
wifi: iwlwifi: Fix memory leak in iwl_mvm_init()
Daniil Dulov <[email protected]>
wifi: rtl818x: Kill URBs before clearing tx status queue
Arnd Bergmann <[email protected]>
caif: reduce stack size, again
Yuan Chen <[email protected]>
bpftool: Fix memory leak in dump_xx_nlmsg on realloc failure
Petr Machata <[email protected]>
net: ipv6: ip6mr: Fix in/out netdev to pass to the FORWARD chain
Jiayuan Chen <[email protected]>
bpf, ktls: Fix data corruption when using bpf_msg_pop_data() in ktls
Jiayuan Chen <[email protected]>
bpf, sockmap: Fix psock incorrectly pointing to sk
Andy Yan <[email protected]>
drm/rockchip: cleanup fb when drm_gem_fb_afbc_init failed
Steven Rostedt <[email protected]>
selftests/tracing: Fix false failure of subsystem event test
Alok Tiwari <[email protected]>
staging: nvec: Fix incorrect null termination of battery manufacturer
Dmitry Baryshkov <[email protected]>
interconnect: qcom: sc8180x: specify num_nodes
Dmitry Baryshkov <[email protected]>
interconnect: qcom: sc8280xp: specify num_links for qnm_a1noc_cfg
Brahmajit Das <[email protected]>
samples: mei: Fix building on musl libc
Lifeng Zheng <[email protected]>
cpufreq: Init policy->rwsem before it may be possibly used
Lifeng Zheng <[email protected]>
cpufreq: Initialize cpufreq-based frequency-invariance later
Rafael J. Wysocki <[email protected]>
cpufreq: intel_pstate: Always use HWP_DESIRED_PERF in passive mode
Lifeng Zheng <[email protected]>
PM / devfreq: Check governor before using governor->name
Adam Ford <[email protected]>
arm64: dts: imx8mn-beacon: Fix HS400 USDHC clock speed
Adam Ford <[email protected]>
arm64: dts: imx8mm-beacon: Fix HS400 USDHC clock speed
Annette Kobou <[email protected]>
ARM: dts: imx6ul-kontron-bl-common: Fix RTS polarity for RS485 interface
Sumit Gupta <[email protected]>
soc/tegra: cbb: Clear ERR_FORCE register with ERR_STATUS
Albin Törnqvist <[email protected]>
arm: dts: ti: omap: Fixup pinheader typo
Lucas De Marchi <[email protected]>
usb: early: xhci-dbc: Fix early_ioremap leak
Sivan Zohar-Kotzer <[email protected]>
powercap: dtpm_cpu: Fix NULL pointer dereference in get_pd_power_uw()
Greg Kroah-Hartman <[email protected]>
Revert "vmci: Prevent the dispatching of uninitialized payloads"
Denis OSTERLAND-HEIM <[email protected]>
pps: fix poll support
Lizhi Xu <[email protected]>
vmci: Prevent the dispatching of uninitialized payloads
Abdun Nihaal <[email protected]>
staging: fbtft: fix potential memory leak in fbtft_framebuffer_alloc()
Charalampos Mitrodimas <[email protected]>
usb: misc: apple-mfi-fastcharge: Make power supply names unique
Seungjin Bae <[email protected]>
usb: host: xhci-plat: fix incorrect type for of_match variable in xhci_plat_probe()
Krzysztof Kozlowski <[email protected]>
ARM: dts: vfxxx: Correctly use two tuples for timer address
Konrad Dybcio <[email protected]>
arm64: dts: qcom: sc7180: Expand IMEM region
Konrad Dybcio <[email protected]>
arm64: dts: qcom: sdm845: Expand IMEM region
Alexander Wilhelm <[email protected]>
soc: qcom: QMI encoding/decoding for big endian
Dmitry Vyukov <[email protected]>
selftests: Fix errno checking in syscall_user_dispatch test
Arnd Bergmann <[email protected]>
ASoC: ops: dynamically allocate struct snd_ctl_elem_value
Kuninori Morimoto <[email protected]>
ASoC: soc-dai: tidyup return value of snd_soc_xlate_tdm_slot_mask()
Konstantin Komarov <[email protected]>
Revert "fs/ntfs3: Replace inode_trylock with inode_lock"
Yangtao Li <[email protected]>
hfsplus: remove mutex_lock check in hfsplus_free_extents
Caleb Sander Mateos <[email protected]>
ublk: use vmalloc for ublk_device's __queues
RubenKelevra <[email protected]>
fs_context: fix parameter name in infofc() macro
Arnd Bergmann <[email protected]>
ASoC: Intel: fix SND_SOC_SOF dependencies
Adam Queler <[email protected]>
ASoC: amd: yc: Add DMI entries to support HP 15-fb1xxx
Arnd Bergmann <[email protected]>
ethernet: intel: fix building with large NR_CPUS
Xu Yang <[email protected]>
usb: phy: mxs: disconnect line when USB charger is attached
Xu Yang <[email protected]>
usb: chipidea: add USB PHY event
Gao Xiang <[email protected]>
erofs: address D-cache aliasing
Gao Xiang <[email protected]>
erofs: simplify z_erofs_transform_plain()
Gao Xiang <[email protected]>
erofs: drop z_erofs_page_mark_eio()
Gao Xiang <[email protected]>
erofs: sunset erofs_dbg()
Gao Xiang <[email protected]>
erofs: get rid of debug_one_dentry()
Liu Shixin <[email protected]>
mm: khugepaged: fix call hpage_collapse_scan_file() for anonymous vma
Ville Syrjälä <[email protected]>
drm/i915/dp: Fix 2.7 Gbps DP_LINK_BW value on g4x
Daniel Dadap <[email protected]>
ALSA: hda: Add missing NVIDIA HDA codec IDs
Mohan Kumar D <[email protected]>
ALSA: hda/tegra: Add Tegra264 support
Ian Abbott <[email protected]>
comedi: comedi_test: Fix possible deletion of uninitialized timers
Dmitry Antipov <[email protected]>
jfs: reject on-disk inodes of an unsupported type
Michael Zhivich <[email protected]>
x86/bugs: Fix use of possibly uninit value in amd_check_tsa_microcode()
RD Babiera <[email protected]>
usb: typec: tcpm: apply vbus before data bringup in tcpm_src_attach
Michael Grzeschik <[email protected]>
usb: typec: tcpm: allow switching to mode accessory to mux properly
Michael Grzeschik <[email protected]>
usb: typec: tcpm: allow to use sink in accessory mode
Philip Yang <[email protected]>
drm/amdkfd: Don't call mmput from MMU notifier callback
Harry Yoo <[email protected]>
mm/zsmalloc: do not pass __GFP_MOVABLE if CONFIG_COMPACTION=n
Matthieu Baerts (NGI0) <[email protected]>
selftests: mptcp: connect: also cover checksum
Matthieu Baerts (NGI0) <[email protected]>
selftests: mptcp: connect: also cover alt modes
Ryusuke Konishi <[email protected]>
nilfs2: reject invalid file types when reading inodes
Marco Elver <[email protected]>
kasan: use vmalloc_dump_obj() for vmalloc error reports
Haoxiang Li <[email protected]>
ice: Fix a null pointer dereference in ice_copy_and_init_pkg()
Praveen Kaligineedi <[email protected]>
gve: Fix stuck TX queue for DQ queue format
Jacek Kowalski <[email protected]>
e1000e: ignore uninitialized checksum word on tgp
Jacek Kowalski <[email protected]>
e1000e: disregard NVM checksum on tgp when valid checksum bit is not set
Ma Ke <[email protected]>
dpaa2-switch: Fix device reference count leak in MAC endpoint handling
Ma Ke <[email protected]>
dpaa2-eth: Fix device reference count leak in MAC endpoint handling
Dawid Rezler <[email protected]>
ALSA: hda/realtek - Add mute LED support for HP Pavilion 15-eg0xxx
Ma Ke <[email protected]>
bus: fsl-mc: Fix potential double device reference in fsl_mc_get_endpoint()
Viresh Kumar <[email protected]>
i2c: virtio: Avoid hang by using interruptible completion wait
Akhil R <[email protected]>
i2c: tegra: Fix reset error handling with ACPI
Yang Xiwen <[email protected]>
i2c: qup: jump out of the loop in case of timeout
Rong Zhang <[email protected]>
platform/x86: ideapad-laptop: Fix kbd backlight not remembered among boots
Jian Shen <[email protected]>
net: hns3: fixed vf get max channels bug
Yonglong Liu <[email protected]>
net: hns3: disable interrupt when ptp init failed
Jian Shen <[email protected]>
net: hns3: fix concurrent setting vlan filter issue
Douglas Anderson <[email protected]>
drm/bridge: ti-sn65dsi86: Remove extra semicolon in ti_sn_bridge_probe()
Marc Kleine-Budde <[email protected]>
can: netlink: can_changelink(): fix NULL pointer deref of struct can_priv::do_set_mode
Marc Kleine-Budde <[email protected]>
can: dev: can_restart(): move debug message and stats after successful restart
Marc Kleine-Budde <[email protected]>
can: dev: can_restart(): reverse logic to remove need for goto
Xiang Mei <[email protected]>
net/sched: sch_qfq: Avoid triggering might_sleep in atomic context in qfq_delete_class
Kito Xu (veritas501) <[email protected]>
net: appletalk: Fix use-after-free in AARP proxy probe
Jamie Bainbridge <[email protected]>
i40e: When removing VF MAC filters, only check PF-set MAC
Dennis Chen <[email protected]>
i40e: report VF tx_dropped with tx_errors instead of tx_discards
Yajun Deng <[email protected]>
i40e: Add rx_missed_errors for buffer exhaustion
Chiara Meiohas <[email protected]>
net/mlx5: Fix memory leak in cmd_exec()
Eyal Birger <[email protected]>
xfrm: interface: fix use-after-free after changing collect_md xfrm interface
Stefan Wahren <[email protected]>
staging: vchiq_arm: Make vchiq_shutdown never fail
Umang Jain <[email protected]>
staging: vc04_services: Drop VCHIQ_RETRY usage
Umang Jain <[email protected]>
staging: vc04_services: Drop VCHIQ_ERROR usage
Umang Jain <[email protected]>
staging: vc04_services: Drop VCHIQ_SUCCESS usage
Nuno Das Neves <[email protected]>
x86/hyperv: Fix usage of cpu_online_mask to get valid cpu
Abdun Nihaal <[email protected]>
regmap: fix potential memory leak of regmap_bus
David Lechner <[email protected]>
iio: adc: ad7949: use spi_is_bpw_supported()
Xilin Wu <[email protected]>
interconnect: qcom: sc7280: Add missing num_links to xm_pcie3_1 node
Maor Gottlieb <[email protected]>
RDMA/core: Rate limit GID cache warning messages
Alessandro Carminati <[email protected]>
regulator: core: fix NULL dereference on unbind due to stale coupling data
Fabrice Gasnier <[email protected]>
Input: gpio-keys - fix a sleep while atomic with PREEMPT_RT
-------------
Diffstat:
Documentation/filesystems/f2fs.rst | 6 +- Makefile | 4 +- arch/arm/boot/dts/am335x-boneblack.dts | 2 +- arch/arm/boot/dts/imx6ul-kontron-bl-common.dtsi | 1 - arch/arm/boot/dts/vfxxx.dtsi | 2 +- arch/arm/crypto/aes-neonbs-glue.c | 2 +- .../boot/dts/freescale/imx8mm-beacon-som.dtsi | 2 + .../boot/dts/freescale/imx8mn-beacon-som.dtsi | 2 + arch/arm64/boot/dts/qcom/sc7180.dtsi | 10 +- arch/arm64/boot/dts/qcom/sdm845.dtsi | 10 +- arch/m68k/Kconfig.debug | 2 +- arch/m68k/kernel/early_printk.c | 42 +-- arch/m68k/kernel/head.S | 8 +- arch/mips/mm/tlb-r4k.c | 56 +++- arch/powerpc/configs/ppc6xx_defconfig | 1 - arch/powerpc/kernel/eeh.c | 1 + arch/powerpc/kernel/eeh_driver.c | 48 ++-- arch/powerpc/kernel/eeh_pe.c | 11 +- arch/powerpc/kernel/pci-hotplug.c | 3 + arch/sh/Makefile | 10 +- arch/sh/boot/compressed/Makefile | 4 +- arch/sh/boot/romimage/Makefile | 4 +- arch/um/drivers/rtc_user.c | 2 +- arch/x86/boot/compressed/sev.c | 7 + arch/x86/boot/cpuflags.c | 13 + arch/x86/hyperv/irqdomain.c | 4 +- arch/x86/include/asm/cpufeatures.h | 1 + arch/x86/kernel/cpu/amd.c | 2 + arch/x86/kernel/cpu/scattered.c | 1 + arch/x86/kernel/sev-shared.c | 18 ++ arch/x86/kernel/sev.c | 11 +- arch/x86/mm/extable.c | 5 +- drivers/base/regmap/regmap.c | 2 + drivers/block/ublk_drv.c | 4 +- drivers/bus/fsl-mc/fsl-mc-bus.c | 19 +- drivers/char/hw_random/mtk-rng.c | 4 +- drivers/clk/clk-axi-clkgen.c | 2 +- drivers/clk/davinci/psc.c | 5 + drivers/clk/sunxi-ng/ccu-sun8i-v3s.c | 3 +- drivers/clk/xilinx/xlnx_vcu.c | 4 +- drivers/comedi/drivers/comedi_test.c | 2 +- drivers/cpufreq/cpufreq.c | 21 +- drivers/cpufreq/intel_pstate.c | 4 +- .../crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c | 4 +- drivers/crypto/ccp/ccp-debugfs.c | 3 + drivers/crypto/img-hash.c | 2 +- drivers/crypto/inside-secure/safexcel_hash.c | 8 +- drivers/crypto/keembay/keembay-ocs-hcu-core.c | 8 +- drivers/crypto/marvell/cesa/cipher.c | 4 +- drivers/crypto/marvell/cesa/hash.c | 5 +- .../crypto/qat/qat_common/adf_transport_debug.c | 4 +- drivers/devfreq/devfreq.c | 10 +- drivers/dma/mv_xor.c | 21 +- drivers/dma/nbpfaxi.c | 13 + drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 47 ++-- .../gpu/drm/amd/pm/powerplay/hwmgr/smu_helper.c | 2 +- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 2 +- drivers/gpu/drm/i915/display/intel_dp.c | 6 + drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 9 +- drivers/i2c/busses/i2c-qup.c | 4 +- drivers/i2c/busses/i2c-tegra.c | 24 +- drivers/i2c/busses/i2c-virtio.c | 15 +- drivers/iio/adc/ad7949.c | 7 +- drivers/infiniband/core/cache.c | 4 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 15 +- drivers/infiniband/hw/mlx5/dm.c | 2 +- drivers/input/keyboard/gpio_keys.c | 4 +- drivers/interconnect/qcom/sc7280.c | 1 + drivers/interconnect/qcom/sc8180x.c | 6 + drivers/interconnect/qcom/sc8280xp.c | 1 + drivers/irqchip/Kconfig | 1 + drivers/media/v4l2-core/v4l2-ctrls-core.c | 8 +- drivers/mtd/ftl.c | 2 +- drivers/mtd/nand/raw/atmel/nand-controller.c | 2 +- drivers/mtd/nand/raw/atmel/pmecc.c | 6 + drivers/mtd/nand/raw/rockchip-nand-controller.c | 15 ++ drivers/net/can/dev/dev.c | 31 ++- drivers/net/can/dev/netlink.c | 12 + drivers/net/can/kvaser_pciefd.c | 1 + drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | 1 + drivers/net/can/usb/peak_usb/pcan_usb_fd.c | 17 +- drivers/net/ethernet/emulex/benet/be_cmds.c | 2 +- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 15 +- .../net/ethernet/freescale/dpaa2/dpaa2-switch.c | 15 +- drivers/net/ethernet/google/gve/gve_main.c | 67 ++--- .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 36 +-- .../net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | 9 +- .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 6 +- drivers/net/ethernet/intel/e1000e/defines.h | 3 + drivers/net/ethernet/intel/e1000e/ich8lan.c | 2 + drivers/net/ethernet/intel/e1000e/nvm.c | 6 + drivers/net/ethernet/intel/fm10k/fm10k.h | 3 +- drivers/net/ethernet/intel/i40e/i40e.h | 2 +- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 3 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 18 +- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 8 +- drivers/net/ethernet/intel/ice/ice_flex_pipe.c | 2 + drivers/net/ethernet/intel/ixgbe/ixgbe.h | 3 +- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 4 +- drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 1 + drivers/net/ethernet/mellanox/mlx5/core/lib/dm.c | 4 +- drivers/net/ethernet/mellanox/mlx5/core/main.c | 3 - drivers/net/phy/mscc/mscc_ptp.c | 1 + drivers/net/phy/mscc/mscc_ptp.h | 1 + drivers/net/ppp/pptp.c | 18 +- drivers/net/usb/usbnet.c | 11 +- drivers/net/vrf.c | 2 + drivers/net/wireless/ath/ath11k/hal.c | 4 + .../broadcom/brcm80211/brcmfmac/cfg80211.c | 8 +- drivers/net/wireless/intel/iwlwifi/dvm/main.c | 11 +- drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 4 +- drivers/net/wireless/marvell/mwl8k.c | 4 + drivers/net/wireless/purelifi/plfxlc/mac.c | 11 +- drivers/net/wireless/purelifi/plfxlc/mac.h | 2 +- drivers/net/wireless/purelifi/plfxlc/usb.c | 29 +- drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c | 3 +- .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 +- drivers/pci/controller/pcie-rockchip-host.c | 2 +- drivers/pci/endpoint/functions/pci-epf-vntb.c | 4 +- drivers/pci/hotplug/pnv_php.c | 235 ++++++++++++++-- drivers/pinctrl/sunxi/pinctrl-sunxi.c | 11 +- drivers/platform/x86/ideapad-laptop.c | 2 +- drivers/power/supply/cpcap-charger.c | 5 +- drivers/power/supply/max14577_charger.c | 4 +- drivers/powercap/dtpm_cpu.c | 2 + drivers/pps/pps.c | 11 +- drivers/regulator/core.c | 1 + drivers/rtc/rtc-ds1307.c | 2 +- drivers/rtc/rtc-hym8563.c | 2 +- drivers/rtc/rtc-nct3018y.c | 2 +- drivers/rtc/rtc-pcf85063.c | 2 +- drivers/rtc/rtc-pcf8563.c | 2 +- drivers/rtc/rtc-rv3028.c | 2 +- drivers/scsi/elx/efct/efct_lio.c | 2 +- drivers/scsi/ibmvscsi_tgt/libsrp.c | 6 +- drivers/scsi/isci/request.c | 2 +- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 3 +- drivers/scsi/mvsas/mv_sas.c | 4 +- drivers/scsi/scsi_transport_iscsi.c | 2 + drivers/scsi/sd.c | 4 +- drivers/soc/qcom/qmi_encdec.c | 46 +++- drivers/soc/tegra/cbb/tegra234-cbb.c | 2 + drivers/soundwire/stream.c | 2 +- drivers/staging/fbtft/fbtft-core.c | 1 + drivers/staging/nvec/nvec_power.c | 2 +- .../vc04_services/bcm2835-audio/bcm2835-vchiq.c | 4 +- .../include/linux/raspberrypi/vchiq.h | 2 - .../vc04_services/interface/vchiq_arm/vchiq_arm.c | 79 +++--- .../vc04_services/interface/vchiq_arm/vchiq_core.c | 172 ++++++------ .../vc04_services/interface/vchiq_arm/vchiq_dev.c | 36 +-- .../staging/vc04_services/vchiq-mmal/mmal-vchiq.c | 4 +- drivers/ufs/core/ufshcd.c | 10 +- drivers/usb/chipidea/ci.h | 18 +- drivers/usb/chipidea/udc.c | 10 + drivers/usb/early/xhci-dbc.c | 4 + drivers/usb/gadget/composite.c | 5 + drivers/usb/host/xhci-plat.c | 2 +- drivers/usb/misc/apple-mfi-fastcharge.c | 24 +- drivers/usb/phy/phy-mxs-usb.c | 4 +- drivers/usb/serial/option.c | 2 + drivers/usb/typec/tcpm/tcpm.c | 64 +++-- drivers/vfio/pci/vfio_pci_core.c | 2 +- drivers/vhost/scsi.c | 4 +- drivers/video/fbdev/core/fbcon.c | 4 +- drivers/video/fbdev/imxfb.c | 9 +- drivers/watchdog/ziirave_wdt.c | 3 + drivers/xen/gntdev-common.h | 4 + drivers/xen/gntdev.c | 71 +++-- fs/erofs/decompressor.c | 23 +- fs/erofs/dir.c | 17 -- fs/erofs/inode.c | 3 - fs/erofs/internal.h | 2 - fs/erofs/namei.c | 9 +- fs/erofs/zdata.c | 56 ++-- fs/erofs/zmap.c | 3 - fs/f2fs/data.c | 2 +- fs/f2fs/extent_cache.c | 2 +- fs/f2fs/f2fs.h | 2 +- fs/f2fs/inode.c | 21 +- fs/f2fs/segment.h | 5 +- fs/hfsplus/extents.c | 3 - fs/jfs/jfs_dmap.c | 4 +- fs/jfs/jfs_imap.c | 13 +- fs/nfs/dir.c | 4 +- fs/nfs/export.c | 11 +- fs/nfs/flexfilelayout/flexfilelayout.c | 26 +- fs/nfs/flexfilelayout/flexfilelayoutdev.c | 6 +- fs/nfs/internal.h | 9 +- fs/nfs/nfs4proc.c | 10 +- fs/nilfs2/inode.c | 9 +- fs/ntfs3/file.c | 5 +- fs/orangefs/orangefs-debugfs.c | 6 +- fs/proc/generic.c | 2 + fs/proc/inode.c | 2 +- fs/proc/internal.h | 5 + fs/smb/client/smbdirect.c | 14 +- fs/smb/server/connection.h | 1 + fs/smb/server/smb2pdu.c | 22 +- fs/smb/server/smb_common.c | 2 +- fs/smb/server/transport_rdma.c | 97 +++---- fs/smb/server/transport_tcp.c | 17 ++ fs/smb/server/vfs.c | 3 +- include/linux/fs_context.h | 2 +- include/linux/moduleparam.h | 5 +- include/linux/pps_kernel.h | 1 + include/linux/proc_fs.h | 1 + include/linux/skbuff.h | 23 ++ include/linux/usb/usbnet.h | 1 + include/linux/wait_bit.h | 60 +++++ include/net/tc_act/tc_ctinfo.h | 6 +- include/net/udp.h | 24 +- kernel/bpf/preload/Kconfig | 1 - kernel/events/core.c | 20 +- kernel/kcsan/kcsan_test.c | 2 +- kernel/trace/preemptirq_delay_test.c | 13 +- kernel/ucount.c | 2 +- mm/hmm.c | 2 +- mm/kasan/report.c | 4 +- mm/khugepaged.c | 4 +- mm/zsmalloc.c | 3 + net/appletalk/aarp.c | 24 +- net/caif/cfctrl.c | 294 ++++++++++----------- net/core/filter.c | 3 + net/core/netpoll.c | 7 + net/core/skmsg.c | 7 + net/ipv4/tcp_input.c | 3 +- net/ipv6/ip6_fib.c | 24 +- net/ipv6/ip6_offload.c | 4 +- net/ipv6/ip6mr.c | 3 +- net/ipv6/route.c | 60 +++-- net/mac80211/tdls.c | 2 +- net/mac80211/tx.c | 14 +- net/netfilter/nf_tables_api.c | 4 +- net/netfilter/xt_nfacct.c | 4 +- net/packet/af_packet.c | 12 +- net/sched/act_ctinfo.c | 19 +- net/sched/sch_netem.c | 40 +++ net/sched/sch_qfq.c | 7 +- net/tls/tls_sw.c | 13 + net/vmw_vsock/af_vsock.c | 3 +- net/xfrm/xfrm_interface_core.c | 7 +- samples/mei/mei-amt-version.c | 2 +- scripts/kconfig/qconf.cc | 2 +- security/apparmor/include/match.h | 3 +- security/apparmor/match.c | 1 + sound/pci/hda/hda_tegra.c | 51 +++- sound/pci/hda/patch_ca0132.c | 5 +- sound/pci/hda/patch_hdmi.c | 20 ++ sound/pci/hda/patch_realtek.c | 1 + sound/soc/amd/yc/acp6x-mach.c | 7 + sound/soc/intel/boards/Kconfig | 2 +- sound/soc/soc-dai.c | 16 +- sound/soc/soc-ops.c | 28 +- sound/usb/mixer_scarlett2.c | 7 + sound/x86/intel_hdmi_audio.c | 2 +- tools/bpf/bpftool/net.c | 15 +- tools/perf/builtin-sched.c | 39 ++- tools/perf/tests/bp_account.c | 1 + tools/perf/util/evsel.c | 11 + tools/perf/util/evsel.h | 2 + tools/testing/selftests/arm64/fp/sve-ptrace.c | 2 +- .../ftrace/test.d/event/subsystem-enable.tc | 28 +- tools/testing/selftests/net/mptcp/Makefile | 3 +- .../selftests/net/mptcp/mptcp_connect_checksum.sh | 5 + .../selftests/net/mptcp/mptcp_connect_mmap.sh | 5 + .../selftests/net/mptcp/mptcp_connect_sendfile.sh | 5 + tools/testing/selftests/net/rtnetlink.sh | 6 + tools/testing/selftests/perf_events/.gitignore | 1 + tools/testing/selftests/perf_events/Makefile | 2 +- tools/testing/selftests/perf_events/mmap.c | 236 +++++++++++++++++ .../selftests/syscall_user_dispatch/sud_test.c | 50 ++-- 271 files changed, 2449 insertions(+), 1170 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/253 Input: gpio-keys - fix a sleep while atomic with PREEMPT_RT
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fabrice Gasnier <[email protected]>
commit f4a8f561d08e39f7833d4a278ebfb12a41eef15f upstream.
When enabling PREEMPT_RT, the gpio_keys_irq_timer() callback runs in hard irq context, but the input_event() takes a spin_lock, which isn't allowed there as it is converted to a rt_spin_lock().
[ 4054.289999] BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48 [ 4054.290028] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 0, name: swapper/0 ... [ 4054.290195] __might_resched+0x13c/0x1f4 [ 4054.290209] rt_spin_lock+0x54/0x11c [ 4054.290219] input_event+0x48/0x80 [ 4054.290230] gpio_keys_irq_timer+0x4c/0x78 [ 4054.290243] __hrtimer_run_queues+0x1a4/0x438 [ 4054.290257] hrtimer_interrupt+0xe4/0x240 [ 4054.290269] arch_timer_handler_phys+0x2c/0x44 [ 4054.290283] handle_percpu_devid_irq+0x8c/0x14c [ 4054.290297] handle_irq_desc+0x40/0x58 [ 4054.290307] generic_handle_domain_irq+0x1c/0x28 [ 4054.290316] gic_handle_irq+0x44/0xcc
Considering the gpio_keys_irq_isr() can run in any context, e.g. it can be threaded, it seems there's no point in requesting the timer isr to run in hard irq context.
Relax the hrtimer not to use the hard context.
--- drivers/input/keyboard/gpio_keys.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/input/keyboard/gpio_keys.c +2 -2
@@ -495,7 +495,7 @@ static irqreturn_t gpio_keys_irq_isr(intif (bdata->release_delay)hrtimer_start (&bdata->release_timer,ms_to_ktime (bdata->release_delay), -HRTIMER_MODE_REL_HARD ); +HRTIMER_MODE_REL ); out:spin_unlock_irqrestore (&bdata->lock, flags);return IRQ_HANDLED ;
@@ -635,7 +635,7 @@ static int gpio_keys_setup_key(struct pl bdata->release_delay = button->debounce_interval;hrtimer_init (&bdata->release_timer, -CLOCK_REALTIME ,HRTIMER_MODE_REL_HARD ); +CLOCK_REALTIME ,HRTIMER_MODE_REL ); bdata->release_timer.function = gpio_keys_irq_timer; isr = gpio_keys_irq_isr;
Greg Kroah-Hartman
maintainerPATCH 2/253 regulator: core: fix NULL dereference on unbind due to stale coupling data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alessandro Carminati <[email protected]>
[ Upstream commit ca46946a482238b0cdea459fb82fc837fb36260e ]
Failing to reset coupling_desc.n_coupled after freeing coupled_rdevs can lead to NULL pointer dereference when regulators are accessed post-unbind.
This can happen during runtime PM or other regulator operations that rely on coupling metadata.
For example, on ridesx4, unbinding the 'reg-dummy' platform device triggers a panic in regulator_lock_recursive() due to stale coupling state.
Ensure n_coupled is set to 0 to prevent access to invalid pointers.
--- drivers/regulator/core.c | 1 + 1 file changed, 1 insertion(+)
drivers/regulator/core.c +1 -0
@@ -5423,6 +5423,7 @@ static void regulator_remove_coupling(struct regulator_dev *rdev) ERR_PTR(err)); } + rdev->coupling_desc.n_coupled =0 ;kfree (rdev->coupling_desc.coupled_rdevs); rdev->coupling_desc.coupled_rdevs =NULL ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 3/253 RDMA/core: Rate limit GID cache warning messages
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maor Gottlieb <[email protected]>
[ Upstream commit 333e4d79316c9ed5877d7aac8b8ed22efc74e96d ]
The GID cache warning messages can flood the kernel log when there are multiple failed attempts to add GIDs. This can happen when creating many virtual interfaces without having enough space for their GIDs in the GID table.
Change pr_warn to pr_warn_ratelimited to prevent log flooding while still maintaining visibility of the issue.
--- drivers/infiniband/core/cache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/core/cache.c +2 -2
@@ -582,8 +582,8 @@ static int __ib_cache_gid_add(struct ib_device *ib_dev, u32 port, out_unlock:mutex_unlock (&table->lock);if (ret) -pr_warn ("%s: unable to add gid %pI6 error=%d\n" , - __func__, gid->raw, ret); +pr_warn_ratelimited ("%s: unable to add gid %pI6 error=%d\n" , + __func__, gid->raw, ret);return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 4/253 interconnect: qcom: sc7280: Add missing num_links to xm_pcie3_1 node
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xilin Wu <[email protected]>
[ Upstream commit 886a94f008dd1a1702ee66dd035c266f70fd9e90 ]
This allows adding interconnect paths for PCIe 1 in device tree later.
--- drivers/interconnect/qcom/sc7280.c | 1 + 1 file changed, 1 insertion(+)
drivers/interconnect/qcom/sc7280.c +1 -0
@@ -164,6 +164,7 @@ static struct qcom_icc_node xm_pcie3_1 = { .id = SC7280_MASTER_PCIE_1, .channels = 1, .buswidth = 8, + .num_links = 1, .links = { SC7280_SLAVE_ANOC_PCIE_GEM_NOC }, };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 5/253 iio: adc: ad7949: use spi_is_bpw_supported()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Lechner <[email protected]>
[ Upstream commit 7b86482632788acd48d7b9ee1867f5ad3a32ccbb ]
Use spi_is_bpw_supported() instead of directly accessing spi->controller ->bits_per_word_mask. bits_per_word_mask may be 0, which implies that 8-bits-per-word is supported. spi_is_bpw_supported() takes this into account while spi_ctrl_mask == SPI_BPW_MASK(8) does not.
--- drivers/iio/adc/ad7949.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/iio/adc/ad7949.c +3 -4
@@ -308,7 +308,6 @@ static void ad7949_disable_reg(void *reg)static int ad7949_spi_probe (struct spi_device *spi) { -u32 spi_ctrl_mask = spi->controller->bits_per_word_mask;struct device *dev = &spi->dev;const struct ad7949_adc_spec *spec;struct ad7949_adc_chip *ad7949_adc;
@@ -337,11 +336,11 @@ static int ad7949_spi_probe(struct spi_device *spi) ad7949_adc->resolution = spec->resolution;/* Set SPI bits per word */ -if (spi_ctrl_mask &SPI_BPW_MASK (ad7949_adc->resolution)) { +if (spi_is_bpw_supported (spi, ad7949_adc->resolution)) { spi->bits_per_word = ad7949_adc->resolution; - }else if (spi_ctrl_mask ==SPI_BPW_MASK (16 )) { + }else if (spi_is_bpw_supported (spi,16 )) { spi->bits_per_word =16 ; - }else if (spi_ctrl_mask ==SPI_BPW_MASK (8 )) { + }else if (spi_is_bpw_supported (spi,8 )) { spi->bits_per_word =8 ; }else {dev_err (dev,"unable to find common BPW with spi controller\n" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 6/253 regmap: fix potential memory leak of regmap_bus
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abdun Nihaal <[email protected]>
[ Upstream commit c871c199accb39d0f4cb941ad0dccabfc21e9214 ]
When __regmap_init() is called from __regmap_init_i2c() and __regmap_init_spi() (and their devm versions), the bus argument obtained from regmap_get_i2c_bus() and regmap_get_spi_bus(), may be allocated using kmemdup() to support quirks. In those cases, the bus->free_on_exit field is set to true.
However, inside __regmap_init(), buf is not freed on any error path. This could lead to a memory leak of regmap_bus when __regmap_init() fails. Fix that by freeing bus on error path when free_on_exit is set.
--- drivers/base/regmap/regmap.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/base/regmap/regmap.c +2 -0
@@ -1266,6 +1266,8 @@ struct regmap *__regmap_init(struct device *dev, err_map:kfree (map); err: +if (bus && bus->free_on_exit) +kfree (bus);return ERR_PTR (ret); }EXPORT_SYMBOL_GPL (__regmap_init);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 7/253 x86/hyperv: Fix usage of cpu_online_mask to get valid cpu
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Das Neves <[email protected]>
[ Upstream commit bb169f80ed5a156ec3405e0e49c6b8e9ae264718 ]
Accessing cpu_online_mask here is problematic because the cpus read lock is not held in this context.
However, cpu_online_mask isn't needed here since the effective affinity mask is guaranteed to be valid in this callback. So, just use cpumask_first() to get the cpu instead of ANDing it with cpus_online_mask unnecessarily.
Message-ID: <1751582677-30930-4-git-send-email-nunodasneves@linux.microsoft.com>
--- arch/x86/hyperv/irqdomain.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
arch/x86/hyperv/irqdomain.c +1 -3
@@ -192,7 +192,6 @@ static void hv_irq_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)struct pci_dev *dev;struct hv_interrupt_entry out_entry, *stored_entry;struct irq_cfg *cfg =irqd_cfg (data); -const cpumask_t *affinity;int cpu;u64 status;
@@ -204,8 +203,7 @@ static void hv_irq_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)return ; } - affinity =irq_data_get_effective_affinity_mask (data); - cpu =cpumask_first_and (affinity, cpu_online_mask); + cpu =cpumask_first (irq_data_get_effective_affinity_mask (data));if (data->chip_data) {/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 8/253 staging: vc04_services: Drop VCHIQ_SUCCESS usage
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Umang Jain <[email protected]>
[ Upstream commit 3414994ba840425b313853a47d581dd5c6c2d300 ]
Drop the usage of VCHIQ_SUCCESS vchiq_status enum type. Replace it with 0 to report the success status.
This patch acts as intermediatory to address the TODO item:
* Get rid of custom function return values
for vc04_services/interface.
Stable-dep-of: f2b8ebfb8670 ("staging: vchiq_arm: Make vchiq_shutdown never fail")
--- .../bcm2835-audio/bcm2835-vchiq.c | 4 +- .../include/linux/raspberrypi/vchiq.h | 1 - .../interface/vchiq_arm/vchiq_arm.c | 36 ++++++------- .../interface/vchiq_arm/vchiq_core.c | 54 +++++++++---------- .../interface/vchiq_arm/vchiq_dev.c | 18 +++---- .../vc04_services/vchiq-mmal/mmal-vchiq.c | 4 +- 6 files changed, 57 insertions(+), 60 deletions(-)
drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c +2 -2
@@ -101,7 +101,7 @@ static enum vchiq_status audio_vchi_callback(struct vchiq_instance *vchiq_instanstruct vc_audio_msg *m;if (reason !=VCHIQ_MESSAGE_AVAILABLE ) -return VCHIQ_SUCCESS ; +return 0 ; m = (void *)header->data;if (m->type ==VC_AUDIO_MSG_TYPE_RESULT ) {
@@ -119,7 +119,7 @@ static enum vchiq_status audio_vchi_callback(struct vchiq_instance *vchiq_instan }vchiq_release_message (vchiq_instance, instance->service_handle, header); -return VCHIQ_SUCCESS ; +return 0 ; } static int
drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h +0 -1
@@ -19,7 +19,6 @@ enum vchiq_reason {enum vchiq_status {VCHIQ_ERROR =-1 , -VCHIQ_SUCCESS =0 ,VCHIQ_RETRY =1 };
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +18 -18
@@ -711,7 +711,7 @@ void free_bulk_waiter(struct vchiq_instance *instance)enum vchiq_status vchiq_shutdown (struct vchiq_instance *instance) { -enum vchiq_status status =VCHIQ_SUCCESS ; +int status =0 ;struct vchiq_state *state = instance->state;if (mutex_lock_killable (&state->mutex))
@@ -748,7 +748,7 @@ enum vchiq_status vchiq_connect(struct vchiq_instance *instance) } status =vchiq_connect_internal (state, instance); -if (status ==VCHIQ_SUCCESS ) +if (!status) instance->connected =1 ;mutex_unlock (&state->mutex);
@@ -780,7 +780,7 @@ vchiq_add_service(struct vchiq_instance *instance,if (service) { *phandle = service->handle; - status =VCHIQ_SUCCESS ; + status =0 ; }else { status =VCHIQ_ERROR ; }
@@ -809,7 +809,7 @@ vchiq_open_service(struct vchiq_instance *instance,if (service) { *phandle = service->handle; status =vchiq_open_service_internal (service, current->pid); -if (status !=VCHIQ_SUCCESS ) { +if (status) {vchiq_remove_service (instance, service->handle); *phandle =VCHIQ_SERVICE_HANDLE_INVALID ; }
@@ -991,7 +991,7 @@ add_completion(struct vchiq_instance *instance, enum vchiq_reason reason,return VCHIQ_RETRY ; }else if (instance->closing) {vchiq_log_info (vchiq_arm_log_level,"service_callback closing" ); -return VCHIQ_SUCCESS ; +return 0 ; }DEBUG_TRACE (SERVICE_CALLBACK_LINE ); }
@@ -1028,7 +1028,7 @@ add_completion(struct vchiq_instance *instance, enum vchiq_reason reason,complete (&instance->insert_event); -return VCHIQ_SUCCESS ; +return 0 ; }enum vchiq_status
@@ -1053,14 +1053,14 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason, service =handle_to_service (instance, handle);if (WARN_ON (!service)) {rcu_read_unlock (); -return VCHIQ_SUCCESS ; +return 0 ; } user_service = (struct user_service *)service->base.userdata;if (!instance || instance->closing) {rcu_read_unlock (); -return VCHIQ_SUCCESS ; +return 0 ; }/*
@@ -1097,7 +1097,7 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,DEBUG_TRACE (SERVICE_CALLBACK_LINE ); status =add_completion (instance, reason,NULL , user_service, bulk_userdata); -if (status !=VCHIQ_SUCCESS ) { +if (status) {DEBUG_TRACE (SERVICE_CALLBACK_LINE );vchiq_service_put (service);return status;
@@ -1145,7 +1145,7 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,vchiq_service_put (service);if (skip_completion) -return VCHIQ_SUCCESS ; +return 0 ;return add_completion (instance, reason, header, user_service, bulk_userdata);
@@ -1337,14 +1337,14 @@ vchiq_keepalive_thread_func(void *v) } status =vchiq_connect (instance); -if (status !=VCHIQ_SUCCESS ) { +if (status) {vchiq_log_error (vchiq_susp_log_level,"%s vchiq_connect failed %d" , __func__, status); goto shutdown; } status =vchiq_add_service (instance, ¶ms, &ka_handle); -if (status !=VCHIQ_SUCCESS ) { +if (status) {vchiq_log_error (vchiq_susp_log_level,"%s vchiq_open_service failed %d" , __func__, status); goto shutdown;
@@ -1373,14 +1373,14 @@ vchiq_keepalive_thread_func(void *v)while (uc--) {atomic_inc (&arm_state->ka_use_ack_count); status =vchiq_use_service (instance, ka_handle); -if (status !=VCHIQ_SUCCESS ) { +if (status) {vchiq_log_error (vchiq_susp_log_level,"%s vchiq_use_service error %d" , __func__, status); } }while (rc--) { status =vchiq_release_service (instance, ka_handle); -if (status !=VCHIQ_SUCCESS ) { +if (status) {vchiq_log_error (vchiq_susp_log_level,"%s vchiq_release_service error %d" , __func__, status);
@@ -1433,13 +1433,13 @@ vchiq_use_internal(struct vchiq_state *state, struct vchiq_service *service,write_unlock_bh (&arm_state->susp_res_lock);if (!ret) { -enum vchiq_status status =VCHIQ_SUCCESS ; +int status =0 ;long ack_cnt =atomic_xchg (&arm_state->ka_use_ack_count,0 ); -while (ack_cnt && (status ==VCHIQ_SUCCESS )) { +while (ack_cnt && !status) {/* Send the use notify to videocore */ status =vchiq_send_remote_use_active (state); -if (status ==VCHIQ_SUCCESS ) +if (!status) ack_cnt--;else atomic_add (ack_cnt, &arm_state->ka_use_ack_count);
@@ -1695,7 +1695,7 @@ vchiq_check_service(struct vchiq_service *service)read_lock_bh (&arm_state->susp_res_lock);if (service->service_use_count) - ret =VCHIQ_SUCCESS ; + ret =0 ;read_unlock_bh (&arm_state->susp_res_lock);if (ret ==VCHIQ_ERROR ) {
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +26 -28
202 lines not on this page · raw message
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c +9 -9
@@ -112,7 +112,7 @@ vchiq_ioc_queue_message(struct vchiq_instance *instance, unsigned int handle, struct vchiq_element *elements, unsigned long count) {struct vchiq_io_copy_callback_context context; -enum vchiq_status status =VCHIQ_SUCCESS ; +int status =0 ;unsigned long i;size_t total_size =0 ;
@@ -142,7 +142,7 @@ static int vchiq_ioc_create_service(struct vchiq_instance *instance, {struct user_service *user_service =NULL ;struct vchiq_service *service; -enum vchiq_status status =VCHIQ_SUCCESS ; +int status =0 ;struct vchiq_service_params_kernel params;int srvstate;
@@ -190,7 +190,7 @@ static int vchiq_ioc_create_service(struct vchiq_instance *instance,if (args->is_open) { status =vchiq_open_service_internal (service, instance->pid); -if (status !=VCHIQ_SUCCESS ) { +if (status) {vchiq_remove_service (instance, service->handle);return (status ==VCHIQ_RETRY ) ? -EINTR : -EIO ;
@@ -577,7 +577,7 @@ static long vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct vchiq_instance *instance = file->private_data; -enum vchiq_status status =VCHIQ_SUCCESS ; +int status =0 ;struct vchiq_service *service =NULL ;long ret =0 ;int i, rc;
@@ -598,12 +598,12 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) instance, &i))) { status =vchiq_remove_service (instance, service->handle);vchiq_service_put (service); -if (status !=VCHIQ_SUCCESS ) +if (status)break ; } service =NULL ; -if (status ==VCHIQ_SUCCESS ) { +if (!status) {/* Wake the completion thread and ask it to exit */ instance->closing =1 ;complete (&instance->insert_event);
@@ -627,7 +627,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) status =vchiq_connect_internal (instance->state, instance);mutex_unlock (&instance->state->mutex); -if (status ==VCHIQ_SUCCESS ) +if (!status) instance->connected =1 ;else vchiq_log_error(vchiq_arm_log_level,
@@ -675,7 +675,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) status = (cmd ==VCHIQ_IOC_CLOSE_SERVICE ) ?vchiq_close_service (instance, service->handle) :vchiq_remove_service (instance, service->handle); -if (status !=VCHIQ_SUCCESS ) +if (status)break ; }
@@ -868,7 +868,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ret = -EINTR ; } -if ((status ==VCHIQ_SUCCESS ) && (ret <0 ) && (ret != -EINTR ) && (ret != -EWOULDBLOCK )) +if (!status && (ret <0 ) && (ret != -EINTR ) && (ret != -EWOULDBLOCK )) vchiq_log_info(vchiq_arm_log_level, " ioctl instance %pK, cmd %s -> status %d, %ld", instance, (_IOC_NR(cmd) <= VCHIQ_IOC_MAX) ?
drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c +2 -2
@@ -560,7 +560,7 @@ static enum vchiq_status service_callback(struct vchiq_instance *vchiq_instance,if (!instance) {pr_err ("Message callback passed NULL instance\n" ); -return VCHIQ_SUCCESS ; +return 0 ; }switch (reason) {
@@ -644,7 +644,7 @@ static enum vchiq_status service_callback(struct vchiq_instance *vchiq_instance,break ; } -return VCHIQ_SUCCESS ; +return 0 ; } static int send_synchronous_mmal_msg(struct vchiq_mmal_instance *instance,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 9/253 staging: vc04_services: Drop VCHIQ_ERROR usage
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Umang Jain <[email protected]>
[ Upstream commit ab73dc85328195c10a55b8f0fbc5b0e2749c628a ]
Drop the usage of VCHIQ_ERROR vchiq_status enum type. Replace it with -EINVAL to report the error in most cases, -ENOMEM for out-of-memory errors and -EHOSTDOWN for service shutdown.
This patch acts as intermediatory to address the TODO item:
* Get rid of custom function return values
for vc04_services/interface.
Stable-dep-of: f2b8ebfb8670 ("staging: vchiq_arm: Make vchiq_shutdown never fail")
--- .../include/linux/raspberrypi/vchiq.h | 1 - .../interface/vchiq_arm/vchiq_arm.c | 24 +++++----- .../interface/vchiq_arm/vchiq_core.c | 44 +++++++++---------- .../interface/vchiq_arm/vchiq_dev.c | 6 +-- 4 files changed, 37 insertions(+), 38 deletions(-)
drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h +0 -1
@@ -18,7 +18,6 @@ enum vchiq_reason { };enum vchiq_status { -VCHIQ_ERROR =-1 ,VCHIQ_RETRY =1 };
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +12 -12
@@ -496,7 +496,7 @@ static int vchiq_platform_init(struct platform_device *pdev, struct vchiq_state vchiq_slot_zero =vchiq_init_slots (slot_mem, slot_mem_size);if (!vchiq_slot_zero) -return -EINVAL ; +return -ENOMEM ; vchiq_slot_zero->platform_data[VCHIQ_PLATFORM_FRAGMENTS_OFFSET_IDX ] = (int )slot_phys + slot_mem_size;
@@ -782,7 +782,7 @@ vchiq_add_service(struct vchiq_instance *instance, *phandle = service->handle; status =0 ; }else { - status =VCHIQ_ERROR ; + status = -EINVAL ; }vchiq_log_trace (vchiq_core_log_level,"%s(%p): returning %d" , __func__, instance, status);
@@ -795,7 +795,7 @@ vchiq_open_service(struct vchiq_instance *instance,const struct vchiq_service_params_kernel *params, unsigned int *phandle) { - enum vchiq_status status = VCHIQ_ERROR; + int status = -EINVAL;struct vchiq_state *state = instance->state;struct vchiq_service *service =NULL ;
@@ -842,7 +842,7 @@ vchiq_bulk_transmit(struct vchiq_instance *instance, unsigned int handle, const VCHIQ_BULK_TRANSMIT);break ;default : -return VCHIQ_ERROR ; +return -EINVAL ; }/*
@@ -879,7 +879,7 @@ enum vchiq_status vchiq_bulk_receive(struct vchiq_instance *instance, unsigned i VCHIQ_BULK_RECEIVE);break ;default : -return VCHIQ_ERROR ; +return -EINVAL ; }/*
@@ -907,7 +907,7 @@ vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handl service =find_service_by_handle (instance, handle);if (!service) -return VCHIQ_ERROR ; +return -EINVAL ;vchiq_service_put (service);
@@ -941,7 +941,7 @@ vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handl waiter =kzalloc (sizeof (*waiter),GFP_KERNEL );if (!waiter) {vchiq_log_error (vchiq_core_log_level,"%s - out of memory" , __func__); -return VCHIQ_ERROR ; +return -ENOMEM ; } }
@@ -1114,7 +1114,7 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,vchiq_log_info (vchiq_arm_log_level,"%s closing" , __func__);DEBUG_TRACE (SERVICE_CALLBACK_LINE );vchiq_service_put (service); -return VCHIQ_ERROR ; +return -EINVAL ; }DEBUG_TRACE (SERVICE_CALLBACK_LINE );spin_lock (&msg_queue_spinlock);
@@ -1577,7 +1577,7 @@ vchiq_instance_set_trace(struct vchiq_instance *instance, int trace)enum vchiq_status vchiq_use_service (struct vchiq_instance *instance,unsigned int handle) { -enum vchiq_status ret =VCHIQ_ERROR ; +int ret = -EINVAL ;struct vchiq_service *service =find_service_by_handle (instance, handle);if (service) {
@@ -1591,7 +1591,7 @@ EXPORT_SYMBOL(vchiq_use_service);enum vchiq_status vchiq_release_service (struct vchiq_instance *instance,unsigned int handle) { -enum vchiq_status ret =VCHIQ_ERROR ; +int ret = -EINVAL ;struct vchiq_service *service =find_service_by_handle (instance, handle);if (service) {
@@ -1686,7 +1686,7 @@ enum vchiq_status vchiq_check_service(struct vchiq_service *service) {struct vchiq_arm_state *arm_state; -enum vchiq_status ret =VCHIQ_ERROR ; +int ret = -EINVAL ;if (!service || !service->state) goto out;
@@ -1698,7 +1698,7 @@ vchiq_check_service(struct vchiq_service *service) ret =0 ;read_unlock_bh (&arm_state->susp_res_lock); -if (ret ==VCHIQ_ERROR ) { +if (ret) { vchiq_log_error(vchiq_susp_log_level, "%s ERROR - %c%c%c%c:%d service count %d, state count %d", __func__, VCHIQ_FOURCC_AS_4CHARS(service->base.fourcc), service->client_id,
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +22 -22
175 lines not on this page · raw message
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c +3 -3
@@ -130,7 +130,7 @@ vchiq_ioc_queue_message(struct vchiq_instance *instance, unsigned int handle, status =vchiq_queue_message (instance, handle, vchiq_ioc_copy_element_data, &context, total_size); -if (status ==VCHIQ_ERROR ) +if (status == -EINVAL )return -EIO ;else if (status ==VCHIQ_RETRY )return -EINTR ;
@@ -364,7 +364,7 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance,vchiq_service_put (service);if (ret)return ret; -else if (status ==VCHIQ_ERROR ) +else if (status == -EINVAL )return -EIO ;else if (status ==VCHIQ_RETRY )return -EINTR ;
@@ -862,7 +862,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)vchiq_service_put (service);if (ret ==0 ) { -if (status ==VCHIQ_ERROR ) +if (status == -EINVAL ) ret = -EIO ;else if (status ==VCHIQ_RETRY ) ret = -EINTR ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 10/253 staging: vc04_services: Drop VCHIQ_RETRY usage
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Umang Jain <[email protected]>
[ Upstream commit 82a9eb4a3561e1d6d408754f5516af7a59019df2 ]
Drop the usage of VCHIQ_RETRY vchiq_status enum type in most of the places and replace it with -EAGAIN. The exception to this replacement is vchiq_send_remote_use() and vchiq_send_remote_use_active() which will be addressed in the subsequent commit.
This patch acts as intermediatory to address the TODO item:
* Get rid of custom function return values
for vc04_services/interface.
Stable-dep-of: f2b8ebfb8670 ("staging: vchiq_arm: Make vchiq_shutdown never fail")
--- .../interface/vchiq_arm/vchiq_arm.c | 18 ++--- .../interface/vchiq_arm/vchiq_core.c | 76 +++++++++---------- .../interface/vchiq_arm/vchiq_dev.c | 12 +-- 3 files changed, 53 insertions(+), 53 deletions(-)
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +9 -9
@@ -715,7 +715,7 @@ enum vchiq_status vchiq_shutdown(struct vchiq_instance *instance)struct vchiq_state *state = instance->state;if (mutex_lock_killable (&state->mutex)) -return VCHIQ_RETRY ; +return -EAGAIN ;/* Remove all services */ vchiq_shutdown_internal (state, instance);
@@ -743,7 +743,7 @@ enum vchiq_status vchiq_connect(struct vchiq_instance *instance)if (mutex_lock_killable (&state->mutex)) {vchiq_log_trace (vchiq_core_log_level,"%s: call to mutex_lock failed" , __func__); - status =VCHIQ_RETRY ; + status = -EAGAIN ; goto failed; } status =vchiq_connect_internal (state, instance);
@@ -846,11 +846,11 @@ vchiq_bulk_transmit(struct vchiq_instance *instance, unsigned int handle, const }/* -* vchiq_*_bulk_transfer() may return VCHIQ_RETRY, so we need +* vchiq_*_bulk_transfer() may return -EAGAIN, so we need * to implement a retry mechanism since this function is * supposed to block until queued */ -if (status !=VCHIQ_RETRY ) +if (status != -EAGAIN )break ;msleep (1 );
@@ -883,11 +883,11 @@ enum vchiq_status vchiq_bulk_receive(struct vchiq_instance *instance, unsigned i }/* -* vchiq_*_bulk_transfer() may return VCHIQ_RETRY, so we need +* vchiq_*_bulk_transfer() may return -EAGAIN, so we need * to implement a retry mechanism since this function is * supposed to block until queued */ -if (status !=VCHIQ_RETRY ) +if (status != -EAGAIN )break ;msleep (1 );
@@ -948,7 +948,7 @@ vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handl status =vchiq_bulk_transfer (instance, handle, data,NULL , size, &waiter->bulk_waiter,VCHIQ_BULK_MODE_BLOCKING , dir); -if ((status !=VCHIQ_RETRY ) ||fatal_signal_pending (current) || !waiter->bulk_waiter.bulk) { +if ((status != -EAGAIN ) ||fatal_signal_pending (current) || !waiter->bulk_waiter.bulk) {struct vchiq_bulk *bulk = waiter->bulk_waiter.bulk;if (bulk) {
@@ -988,7 +988,7 @@ add_completion(struct vchiq_instance *instance, enum vchiq_reason reason,DEBUG_COUNT (COMPLETION_QUEUE_FULL_COUNT );if (wait_for_completion_interruptible (&instance->remove_event)) {vchiq_log_info (vchiq_arm_log_level,"service_callback interrupted" ); -return VCHIQ_RETRY ; +return -EAGAIN ; }else if (instance->closing) {vchiq_log_info (vchiq_arm_log_level,"service_callback closing" );return 0 ;
@@ -1109,7 +1109,7 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,vchiq_log_info (vchiq_arm_log_level,"%s interrupted" , __func__);DEBUG_TRACE (SERVICE_CALLBACK_LINE );vchiq_service_put (service); -return VCHIQ_RETRY ; +return -EAGAIN ; }else if (instance->closing) {vchiq_log_info (vchiq_arm_log_level,"%s closing" , __func__);DEBUG_TRACE (SERVICE_CALLBACK_LINE );
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +38 -38
284 lines not on this page · raw message
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c +6 -6
@@ -132,7 +132,7 @@ vchiq_ioc_queue_message(struct vchiq_instance *instance, unsigned int handle,if (status == -EINVAL )return -EIO ; -else if (status ==VCHIQ_RETRY ) +else if (status == -EAGAIN )return -EINTR ;return 0 ; }
@@ -192,7 +192,7 @@ static int vchiq_ioc_create_service(struct vchiq_instance *instance, status =vchiq_open_service_internal (service, instance->pid);if (status) {vchiq_remove_service (instance, service->handle); -return (status ==VCHIQ_RETRY ) ? +return (status == -EAGAIN ) ? -EINTR : -EIO ; } }
@@ -338,7 +338,7 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance, goto out; } -if ((status !=VCHIQ_RETRY ) ||fatal_signal_pending (current) || +if ((status != -EAGAIN ) ||fatal_signal_pending (current) || !waiter->bulk_waiter.bulk) {if (waiter->bulk_waiter.bulk) {/* Cancel the signal when the transfer completes. */
@@ -366,7 +366,7 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance,return ret; else if (status == -EINVAL) return -EIO; - else if (status == VCHIQ_RETRY) + else if (status == -EAGAIN) return -EINTR;return 0 ; }
@@ -686,7 +686,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)*/ if (user_service->close_pending &&wait_for_completion_interruptible (&user_service->close_event)) - status =VCHIQ_RETRY ; + status = -EAGAIN ;break ; }
@@ -864,7 +864,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)if (ret ==0 ) {if (status == -EINVAL ) ret = -EIO ; -else if (status ==VCHIQ_RETRY ) +else if (status == -EAGAIN ) ret = -EINTR ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 11/253 staging: vchiq_arm: Make vchiq_shutdown never fail
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
[ Upstream commit f2b8ebfb867011ddbefbdf7b04ad62626cbc2afd ]
Most of the users of vchiq_shutdown ignore the return value, which is bad because this could lead to resource leaks. So instead of changing all calls to vchiq_shutdown, it's easier to make vchiq_shutdown never fail.
--- drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +1 -2
@@ -714,8 +714,7 @@ enum vchiq_status vchiq_shutdown(struct vchiq_instance *instance)int status =0 ;struct vchiq_state *state = instance->state; -if (mutex_lock_killable (&state->mutex)) -return -EAGAIN ; +mutex_lock (&state->mutex);/* Remove all services */ vchiq_shutdown_internal (state, instance);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 12/253 xfrm: interface: fix use-after-free after changing collect_md xfrm interface
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eyal Birger <[email protected]>
[ Upstream commit a90b2a1aaacbcf0f91d7e4868ad6c51c5dee814b ]
collect_md property on xfrm interfaces can only be set on device creation, thus xfrmi_changelink() should fail when called on such interfaces.
The check to enforce this was done only in the case where the xi was returned from xfrmi_locate() which doesn't look for the collect_md interface, and thus the validation was never reached.
Calling changelink would thus errornously place the special interface xi in the xfrmi_net->xfrmi hash, but since it also exists in the xfrmi_net->collect_md_xfrmi pointer it would lead to a double free when the net namespace was taken down [1].
Change the check to use the xi from netdev_priv which is available earlier in the function to prevent changes in xfrm collect_md interfaces.
[1] resulting oops:
[ 8.516540] kernel BUG at net/core/dev.c:12029! [ 8.516552] Oops: invalid opcode: 0000 [#1] SMP NOPTI [ 8.516559] CPU: 0 UID: 0 PID: 12 Comm: kworker/u80:0 Not tainted 6.15.0-virtme #5 PREEMPT(voluntary) [ 8.516565] Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 8.516569] Workqueue: netns cleanup_net [ 8.516579] RIP: 0010:unregister_netdevice_many_notify+0x101/0xab0 [ 8.516590] Code: 90 0f 0b 90 48 8b b0 78 01 00 00 48 8b 90 80 01 00 00 48 89 56 08 48 89 32 4c 89 80 78 01 00 00 48 89 b8 80 01 00 00 eb ac 90 <0f> 0b 48 8b 45 00 4c 8d a0 88 fe ff ff 48 39 c5 74 5c 41 80 bc 24 [ 8.516593] RSP: 0018:ffffa93b8006bd30 EFLAGS: 00010206 [ 8.516598] RAX: ffff98fe4226e000 RBX: ffffa93b8006bd58 RCX: ffffa93b8006bc60 [ 8.516601] RDX: 0000000000000004 RSI: 0000000000000000 RDI: dead000000000122 [ 8.516603] RBP: ffffa93b8006bdd8 R08: dead000000000100 R09: ffff98fe4133c100 [ 8.516605] R10: 0000000000000000 R11: 00000000000003d2 R12: ffffa93b8006be00 [ 8.516608] R13: ffffffff96c1a510 R14: ffffffff96c1a510 R15: ffffa93b8006be00 [ 8.516615] FS: 0000000000000000(0000) GS:ffff98fee73b7000(0000) knlGS:0000000000000000 [ 8.516619] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 8.516622] CR2: 00007fcd2abd0700 CR3: 000000003aa40000 CR4: 0000000000752ef0 [ 8.516625] PKRU: 55555554 [ 8.516627] Call Trace: [ 8.516632] <TASK> [ 8.516635] ? rtnl_is_locked+0x15/0x20 [ 8.516641] ? unregister_netdevice_queue+0x29/0xf0 [ 8.516650] ops_undo_list+0x1f2/0x220 [ 8.516659] cleanup_net+0x1ad/0x2e0 [ 8.516664] process_one_work+0x160/0x380 [ 8.516673] worker_thread+0x2aa/0x3c0 [ 8.516679] ? __pfx_worker_thread+0x10/0x10 [ 8.516686] kthread+0xfb/0x200 [ 8.516690] ? __pfx_kthread+0x10/0x10 [ 8.516693] ? __pfx_kthread+0x10/0x10 [ 8.516697] ret_from_fork+0x82/0xf0 [ 8.516705] ? __pfx_kthread+0x10/0x10 [ 8.516709] ret_from_fork_asm+0x1a/0x30 [ 8.516718] </TASK>
--- net/xfrm/xfrm_interface_core.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
net/xfrm/xfrm_interface_core.c +1 -6
@@ -871,7 +871,7 @@ static int xfrmi_changelink(struct net_device *dev, struct nlattr *tb[],return -EINVAL ; } -if (p.collect_md) { +if (p.collect_md || xi->p.collect_md) {NL_SET_ERR_MSG (extack,"collect_md can't be changed" );return -EINVAL ; }
@@ -882,11 +882,6 @@ static int xfrmi_changelink(struct net_device *dev, struct nlattr *tb[], }else {if (xi->dev != dev)return -EEXIST ; -if (xi->p.collect_md) { -NL_SET_ERR_MSG (extack, -"device can't be changed to collect_md" ); -return -EINVAL ; - } }return xfrmi_update (xi, &p);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 13/253 net/mlx5: Fix memory leak in cmd_exec()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chiara Meiohas <[email protected]>
[ Upstream commit 3afa3ae3db52e3c216d77bd5907a5a86833806cc ]
If cmd_exec() is called with callback and mlx5_cmd_invoke() returns an error, resources allocated in cmd_exec() will not be freed.
Fix the code to release the resources if mlx5_cmd_invoke() returns an error.
--- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +2 -2
@@ -1913,8 +1913,8 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out, err =mlx5_cmd_invoke (dev, inb, outb, out, out_size, callback, context, pages_queue, token, force_polling); -if (callback) -return err; +if (callback && !err) +return 0 ;if (err >0 )/* Failed in FW, command didn't execute */ err =deliv_status_to_err (err);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 14/253 i40e: Add rx_missed_errors for buffer exhaustion
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yajun Deng <[email protected]>
[ Upstream commit 5337d294973331660e84e41836a54014de22e5b0 ]
As the comment in struct rtnl_link_stats64, rx_dropped should not include packets dropped by the device due to buffer exhaustion. They are counted in rx_missed_errors, procfs folds those two counters together.
Add rx_missed_errors for buffer exhaustion, rx_missed_errors corresponds to rx_discards, rx_dropped corresponds to rx_discards_other.
Stable-dep-of: 50b2af451597 ("i40e: report VF tx_dropped with tx_errors instead of tx_discards")
--- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 3 ++- drivers/net/ethernet/intel/i40e/i40e_main.c | 18 +++++++----------- .../net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 2 +- 3 files changed, 10 insertions(+), 13 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_ethtool.c +2 -1
@@ -245,6 +245,7 @@ static const struct i40e_stats i40e_gstrings_net_stats[] = {I40E_NETDEV_STAT (rx_errors),I40E_NETDEV_STAT (tx_errors),I40E_NETDEV_STAT (rx_dropped), +I40E_NETDEV_STAT (rx_missed_errors),I40E_NETDEV_STAT (tx_dropped),I40E_NETDEV_STAT (collisions), I40E_NETDEV_STAT(rx_length_errors),
@@ -321,7 +322,7 @@ static const struct i40e_stats i40e_gstrings_stats[] = {I40E_PF_STAT ("port.rx_broadcast" , stats.eth.rx_broadcast),I40E_PF_STAT ("port.tx_broadcast" , stats.eth.tx_broadcast),I40E_PF_STAT ("port.tx_errors" , stats.eth.tx_errors), -I40E_PF_STAT ("port.rx_dropped" , stats.eth.rx_discards), +I40E_PF_STAT ("port.rx_discards" , stats.eth.rx_discards),I40E_PF_STAT ("port.tx_dropped_link_down" , stats.tx_dropped_link_down),I40E_PF_STAT ("port.rx_crc_errors" , stats.crc_errors), I40E_PF_STAT("port.illegal_bytes", stats.illegal_bytes),
drivers/net/ethernet/intel/i40e/i40e_main.c +7 -11
@@ -495,6 +495,7 @@ static void i40e_get_netdev_stats_struct(struct net_device *netdev, stats->tx_dropped = vsi_stats->tx_dropped; stats->rx_errors = vsi_stats->rx_errors; stats->rx_dropped = vsi_stats->rx_dropped; + stats->rx_missed_errors = vsi_stats->rx_missed_errors; stats->rx_crc_errors = vsi_stats->rx_crc_errors; stats->rx_length_errors = vsi_stats->rx_length_errors; }
@@ -686,17 +687,13 @@ i40e_stats_update_rx_discards(struct i40e_vsi *vsi, struct i40e_hw *hw,struct i40e_eth_stats *stat_offset, struct i40e_eth_stats *stat) { - u64 rx_rdpc, rx_rxerr; -i40e_stat_update32 (hw ,I40E_GLV_RDPC (stat_idx ),offset_loaded , - &stat_offset->rx_discards, &rx_rdpc); + &stat_offset->rx_discards, &stat->rx_discards);i40e_stat_update64 (hw,I40E_GL_RXERR1H (i40e_compute_pci_to_hw_id (vsi, hw)),I40E_GL_RXERR1L (i40e_compute_pci_to_hw_id (vsi, hw)), offset_loaded, &stat_offset->rx_discards_other, - &rx_rxerr); - - stat->rx_discards = rx_rdpc + rx_rxerr; + &stat->rx_discards_other); }/**
@@ -718,9 +715,6 @@ void i40e_update_eth_stats(struct i40e_vsi *vsi)i40e_stat_update32 (hw,I40E_GLV_TEPC (stat_idx), vsi->stat_offsets_loaded, &oes->tx_errors, &es->tx_errors); -i40e_stat_update32 (hw,I40E_GLV_RDPC (stat_idx), - vsi->stat_offsets_loaded, - &oes->rx_discards, &es->rx_discards);i40e_stat_update32 (hw,I40E_GLV_RUPP (stat_idx), vsi->stat_offsets_loaded, &oes->rx_unknown_protocol, &es->rx_unknown_protocol);
@@ -977,8 +971,10 @@ static void i40e_update_vsi_stats(struct i40e_vsi *vsi) ns->tx_errors = es->tx_errors; ons->multicast = oes->rx_multicast; ns->multicast = es->rx_multicast; - ons->rx_dropped = oes->rx_discards; - ns->rx_dropped = es->rx_discards; + ons->rx_dropped = oes->rx_discards_other; + ns->rx_dropped = es->rx_discards_other; + ons->rx_missed_errors = oes->rx_discards; + ns->rx_missed_errors = es->rx_discards; ons->tx_dropped = oes->tx_discards; ns->tx_dropped = es->tx_discards;
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +1 -1
@@ -4934,7 +4934,7 @@ int i40e_get_vf_stats(struct net_device *netdev, int vf_id, vf_stats->tx_bytes = stats->tx_bytes; vf_stats->broadcast = stats->rx_broadcast; vf_stats->multicast = stats->rx_multicast; - vf_stats->rx_dropped = stats->rx_discards; + vf_stats->rx_dropped = stats->rx_discards + stats->rx_discards_other; vf_stats->tx_dropped = stats->tx_discards;return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 15/253 i40e: report VF tx_dropped with tx_errors instead of tx_discards
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dennis Chen <[email protected]>
[ Upstream commit 50b2af451597ca6eefe9d4543f8bbf8de8aa00e7 ]
Currently the tx_dropped field in VF stats is not updated correctly when reading stats from the PF. This is because it reads from i40e_eth_stats.tx_discards which seems to be unused for per VSI stats, as it is not updated by i40e_update_eth_stats() and the corresponding register, GLV_TDPC, is not implemented[1].
Use i40e_eth_stats.tx_errors instead, which is actually updated by i40e_update_eth_stats() by reading from GLV_TEPC.
To test, create a VF and try to send bad packets through it:
$ echo 1 > /sys/class/net/enp2s0f0/device/sriov_numvfs $ cat test.py from scapy.all import *
vlan_pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / Dot1Q(vlan=999) / IP(dst="192.168.0.1") / ICMP() ttl_pkt = IP(dst="8.8.8.8", ttl=0) / ICMP()
print("Send packet with bad VLAN tag")sendp(vlan_pkt, iface="enp2s0f0v0")print("Send packet with TTL=0")sendp(ttl_pkt, iface="enp2s0f0v0")
$ ip -s link show dev enp2s0f0
16: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 3c:ec:ef:b7:e0:ac brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped missed mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0
vf 0 link/ether e2:c6:fd:c1:1e:92 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
RX: bytes packets mcast bcast dropped
0 0 0 0 0
TX: bytes packets dropped
0 0 0
$ python test.py
Send packet with bad VLAN tag
.
Sent 1 packets.
Send packet with TTL=0
.
Sent 1 packets.
$ ip -s link show dev enp2s0f0
16: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 3c:ec:ef:b7:e0:ac brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped missed mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0
vf 0 link/ether e2:c6:fd:c1:1e:92 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
RX: bytes packets mcast bcast dropped
0 0 0 0 0
TX: bytes packets dropped
0 0 0A packet with non-existent VLAN tag and a packet with TTL = 0 are sent, but tx_dropped is not incremented.
After patch:
$ ip -s link show dev enp2s0f0
19: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 3c:ec:ef:b7:e0:ac brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped missed mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0
vf 0 link/ether 4a:b7:3d:37:f7:56 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
RX: bytes packets mcast bcast dropped
0 0 0 0 0
TX: bytes packets dropped
0 0 2--- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +1 -1
@@ -4935,7 +4935,7 @@ int i40e_get_vf_stats(struct net_device *netdev, int vf_id, vf_stats->broadcast = stats->rx_broadcast; vf_stats->multicast = stats->rx_multicast; vf_stats->rx_dropped = stats->rx_discards + stats->rx_discards_other; - vf_stats->tx_dropped = stats->tx_discards; + vf_stats->tx_dropped = stats->tx_errors;return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 16/253 i40e: When removing VF MAC filters, only check PF-set MAC
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jamie Bainbridge <[email protected]>
[ Upstream commit 5a0df02999dbe838c3feed54b1d59e9445f68b89 ]
When the PF is processing an Admin Queue message to delete a VF's MACs from the MAC filter, we currently check if the PF set the MAC and if the VF is trusted.
This results in undesirable behaviour, where if a trusted VF with a PF-set MAC sets itself down (which sends an AQ message to delete the VF's MAC filters) then the VF MAC is erased from the interface.
This results in the VF losing its PF-set MAC which should not happen.
There is no need to check for trust at all, because an untrusted VF cannot change its own MAC. The only check needed is whether the PF set the MAC. If the PF set the MAC, then don't erase the MAC on link-down.
Resolve this by changing the deletion check only for PF-set MAC.
(the out-of-tree driver has also intentionally removed the check for VF trust here with OOT driver version 2.26.8, this changes the Linux kernel driver behaviour and comment to match the OOT driver behaviour)
--- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +2 -2
@@ -3076,10 +3076,10 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg)const u8 *addr = al->list[i].addr;/* Allow to delete VF primary MAC only if it was not set -* administratively by PF or if VF is trusted. +* administratively by PF. */ if (ether_addr_equal (addr, vf->default_lan_addr.addr)) { -if (i40e_can_vf_change_mac (vf)) +if (!vf->pf_set_mac) was_unimac_deleted = true;else continue ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 17/253 net: appletalk: Fix use-after-free in AARP proxy probe
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kito Xu (veritas501) <[email protected]>
[ Upstream commit 6c4a92d07b0850342d3becf2e608f805e972467c ]
The AARP proxy‐probe routine (aarp_proxy_probe_network) sends a probe, releases the aarp_lock, sleeps, then re-acquires the lock. During that window an expire timer thread (__aarp_expire_timer) can remove and kfree() the same entry, leading to a use-after-free.
race condition:
cpu 0 | cpu 1
atalk_sendmsg() | atif_proxy_probe_device()
aarp_send_ddp() | aarp_proxy_probe_network()
mod_timer() | lock(aarp_lock) // LOCK!!
timeout around 200ms | alloc(aarp_entry)
and then call | proxies[hash] = aarp_entry
aarp_expire_timeout() | aarp_send_probe()
| unlock(aarp_lock) // UNLOCK!!
lock(aarp_lock) // LOCK!! | msleep(100);
__aarp_expire_timer(&proxies[ct]) |
free(aarp_entry) |
unlock(aarp_lock) // UNLOCK!! |
| lock(aarp_lock) // LOCK!!
| UAF aarp_entry !!==================================================================
BUG: KASAN: slab-use-after-free in aarp_proxy_probe_network+0x560/0x630 net/appletalk/aarp.c:493 Read of size 4 at addr ffff8880123aa360 by task repro/13278 CPU: 3 UID: 0 PID: 13278 Comm: repro Not tainted 6.15.2 #3 PREEMPT(full) Call Trace: <TASK> __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x116/0x1b0 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:408 [inline] print_report+0xc1/0x630 mm/kasan/report.c:521 kasan_report+0xca/0x100 mm/kasan/report.c:634 aarp_proxy_probe_network+0x560/0x630 net/appletalk/aarp.c:493 atif_proxy_probe_device net/appletalk/ddp.c:332 [inline] atif_ioctl+0xb58/0x16c0 net/appletalk/ddp.c:857 atalk_ioctl+0x198/0x2f0 net/appletalk/ddp.c:1818 sock_do_ioctl+0xdc/0x260 net/socket.c:1190 sock_ioctl+0x239/0x6a0 net/socket.c:1311 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:906 [inline] __se_sys_ioctl fs/ioctl.c:892 [inline] __x64_sys_ioctl+0x194/0x200 fs/ioctl.c:892 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcb/0x250 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f </TASK>
Allocated:
aarp_alloc net/appletalk/aarp.c:382 [inline] aarp_proxy_probe_network+0xd8/0x630 net/appletalk/aarp.c:468 atif_proxy_probe_device net/appletalk/ddp.c:332 [inline] atif_ioctl+0xb58/0x16c0 net/appletalk/ddp.c:857 atalk_ioctl+0x198/0x2f0 net/appletalk/ddp.c:1818
Freed:
kfree+0x148/0x4d0 mm/slub.c:4841 __aarp_expire net/appletalk/aarp.c:90 [inline] __aarp_expire_timer net/appletalk/aarp.c:261 [inline] aarp_expire_timeout+0x480/0x6e0 net/appletalk/aarp.c:317 The buggy address belongs to the object at ffff8880123aa300 which belongs to the cache kmalloc-192 of size 192
The buggy address is located 96 bytes inside of
freed 192-byte region [ffff8880123aa300, ffff8880123aa3c0)
Memory state around the buggy address:
ffff8880123aa200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff8880123aa280: 00 00 00 00 fc fc fc fc fc fc fc fc fc fc fc fc
>ffff8880123aa300: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff8880123aa380: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
ffff8880123aa400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
==================================================================--- net/appletalk/aarp.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-)
net/appletalk/aarp.c +21 -3
@@ -35,6 +35,7 @@#include <linux/seq_file.h> #include <linux/export.h> #include <linux/etherdevice.h> +#include <linux/refcount.h> int sysctl_aarp_expiry_time =AARP_EXPIRY_TIME ;int sysctl_aarp_tick_time =AARP_TICK_TIME ;
@@ -44,6 +45,7 @@ int sysctl_aarp_resolve_time = AARP_RESOLVE_TIME;/* Lists of aarp entries */ /** * struct aarp_entry - AARP entry +* @refcnt: Reference count * @last_sent: Last time we xmitted the aarp request * @packet_queue: Queue of frames wait for resolution * @status: Used for proxy AARP
@@ -55,6 +57,7 @@ int sysctl_aarp_resolve_time = AARP_RESOLVE_TIME;* @next: Next entry in chain */ struct aarp_entry { +refcount_t refcnt;/* These first two are only used for unresolved entries */ unsigned long last_sent;struct sk_buff_head packet_queue;
@@ -79,6 +82,17 @@ static DEFINE_RWLOCK(aarp_lock);/* Used to walk the list and purge/kick entries. */ static struct timer_list aarp_timer; +static inline void aarp_entry_get (struct aarp_entry *a) +{ +refcount_inc (&a->refcnt); +} + +static inline void aarp_entry_put (struct aarp_entry *a) +{ +if (refcount_dec_and_test (&a->refcnt)) +kfree (a); +} +/* * Delete an aarp queue *
@@ -87,7 +101,7 @@ static struct timer_list aarp_timer;static void __aarp_expire (struct aarp_entry *a) {skb_queue_purge (&a->packet_queue); -kfree (a); +aarp_entry_put (a); }/*
@@ -380,9 +394,11 @@ static void aarp_purge(void)static struct aarp_entry *aarp_alloc (void ) {struct aarp_entry *a =kmalloc (sizeof (*a),GFP_ATOMIC ); +if (!a) +return NULL ; -if (a) -skb_queue_head_init (&a->packet_queue); +refcount_set (&a->refcnt,1 ); +skb_queue_head_init (&a->packet_queue);return a; }
@@ -508,6 +524,7 @@ int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa) entry->dev = atif->dev;write_lock_bh (&aarp_lock); +aarp_entry_get (entry); hash = sa->s_node % (AARP_HASH_SIZE -1 ); entry->next = proxies[hash];
@@ -533,6 +550,7 @@ int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa) retval =1 ; } +aarp_entry_put (entry);write_unlock_bh (&aarp_lock); out:return retval;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 18/253 net/sched: sch_qfq: Avoid triggering might_sleep in atomic context in qfq_delete_class
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit cf074eca0065bc5142e6004ae236bb35a2687fdf ]
might_sleep could be trigger in the atomic context in qfq_delete_class.
qfq_destroy_class was moved into atomic context locked
by sch_tree_lock to avoid a race condition bug on qfq_aggregate. However, might_sleep could be triggered by qfq_destroy_class, which introduced sleeping in atomic context (path:qfq_destroy_class->qdisc_put->__qdisc_destroy->lockdep_unregister_key ->might_sleep).
Considering the race is on the qfq_aggregate objects, keeping qfq_rm_from_agg in the lock but moving the left part out can solve this issue.
--- net/sched/sch_qfq.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/sched/sch_qfq.c +3 -4
@@ -540,9 +540,6 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid,static void qfq_destroy_class (struct Qdisc *sch,struct qfq_class *cl) { -struct qfq_sched *q =qdisc_priv (sch); - -qfq_rm_from_agg (q, cl);gen_kill_estimator (&cl->rate_est);qdisc_put (cl->qdisc);kfree (cl);
@@ -561,10 +558,11 @@ static int qfq_delete_class(struct Qdisc *sch, unsigned long arg,qdisc_purge_queue (cl->qdisc);qdisc_class_hash_remove (&q->clhash, &cl->common); -qfq_destroy_class (sch, cl); +qfq_rm_from_agg (q, cl);sch_tree_unlock (sch); +qfq_destroy_class (sch, cl);return 0 ; }
@@ -1505,6 +1503,7 @@ static void qfq_destroy_qdisc(struct Qdisc *sch)for (i =0 ; i < q->clhash.hashsize; i++) {hlist_for_each_entry_safe (cl, next, &q->clhash.hash[i], common.hnode) { +qfq_rm_from_agg (q, cl);qfq_destroy_class (sch, cl); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 19/253 can: dev: can_restart(): reverse logic to remove need for goto
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit 8f3ec204d340af183fb2bb21b8e797ac2ed012b2 ]
Reverse the logic in the if statement and eliminate the need for a goto to simplify code readability.
Stable-dep-of: c1f3f9797c1f ("can: netlink: can_changelink(): fix NULL pointer deref of struct can_priv::do_set_mode")
--- drivers/net/can/dev/dev.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/net/can/dev/dev.c +4 -7
@@ -142,14 +142,11 @@ static void can_restart(struct net_device *dev)/* send restart message upstream */ skb =alloc_can_err_skb (dev, &cf); -if (!skb) - goto restart; - - cf->can_id |=CAN_ERR_RESTARTED ; - -netif_rx (skb); +if (skb) { + cf->can_id |=CAN_ERR_RESTARTED ; +netif_rx (skb); + } -restart:netdev_dbg (dev,"restarted\n" ); priv->can_stats.restarts++;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 20/253 can: dev: can_restart(): move debug message and stats after successful restart
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit f0e0c809c0be05fe865b9ac128ef3ee35c276021 ]
Move the debug message "restarted" and the CAN restart stats_after_ the successful restart of the CAN device, because the restart may fail.
While there update the error message from printing the error number to printing symbolic error names.
Stable-dep-of: c1f3f9797c1f ("can: netlink: can_changelink(): fix NULL pointer deref of struct can_priv::do_set_mode")
--- drivers/net/can/dev/dev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/can/dev/dev.c +4 -4
@@ -147,15 +147,15 @@ static void can_restart(struct net_device *dev)netif_rx (skb); } -netdev_dbg (dev,"restarted\n" ); - priv->can_stats.restarts++; -/* Now restart the device */ netif_carrier_on (dev); err = priv->do_set_mode (dev,CAN_MODE_START );if (err) { -netdev_err (dev,"Error %d during restart" , err); +netdev_err (dev,"Restart failed, error %pe\n" ,ERR_PTR (err));netif_carrier_off (dev); + }else { +netdev_dbg (dev,"Restarted\n" ); + priv->can_stats.restarts++; } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 21/253 can: netlink: can_changelink(): fix NULL pointer deref of struct can_priv::do_set_mode
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit c1f3f9797c1f44a762e6f5f72520b2e520537b52 ]
Andrei Lalaev reported a NULL pointer deref when a CAN device is restarted from Bus Off and the driver does not implement the struct can_priv::do_set_mode callback.
There are 2 code path that call struct can_priv::do_set_mode:
- directly by a manual restart from the user space, via can_changelink()
- delayed automatic restart after bus off (deactivated by default)
To prevent the NULL pointer deference, refuse a manual restart or configure the automatic restart delay in can_changelink() and report the error via extack to user space.
As an additional safety measure let can_restart() return an error if can_priv::do_set_mode is not set instead of dereferencing it unchecked.
--- drivers/net/can/dev/dev.c | 12 +++++++++--- drivers/net/can/dev/netlink.c | 12 ++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-)
drivers/net/can/dev/dev.c +9 -3
@@ -125,13 +125,16 @@ void can_change_state(struct net_device *dev, struct can_frame *cf,EXPORT_SYMBOL_GPL (can_change_state);/* CAN device restart for bus-off recovery */ -static void can_restart (struct net_device *dev) +static int can_restart (struct net_device *dev) {struct can_priv *priv =netdev_priv (dev);struct sk_buff *skb;struct can_frame *cf;int err; +if (!priv->do_set_mode) +return -EOPNOTSUPP ; +if (netif_carrier_ok (dev))netdev_err (dev,"Attempt to restart for bus-off recovery, but carrier is OK?\n" );
@@ -153,10 +156,14 @@ static void can_restart(struct net_device *dev)if (err) {netdev_err (dev,"Restart failed, error %pe\n" ,ERR_PTR (err));netif_carrier_off (dev); + +return err; }else {netdev_dbg (dev,"Restarted\n" ); priv->can_stats.restarts++; } + +return 0 ; }static void can_restart_work (struct work_struct *work)
@@ -181,9 +188,8 @@ int can_restart_now(struct net_device *dev)return -EBUSY ;cancel_delayed_work_sync (&priv->restart_work); -can_restart (dev); -return 0 ; +return can_restart (dev); }/* CAN bus-off
drivers/net/can/dev/netlink.c +12 -0
@@ -252,6 +252,12 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[], }if (data[IFLA_CAN_RESTART_MS ]) { +if (!priv->do_set_mode) { +NL_SET_ERR_MSG (extack, +"Device doesn't support restart from Bus Off" ); +return -EOPNOTSUPP ; + } +/* Do not allow changing restart delay while running */ if (dev->flags &IFF_UP )return -EBUSY ;
@@ -259,6 +265,12 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[], }if (data[IFLA_CAN_RESTART ]) { +if (!priv->do_set_mode) { +NL_SET_ERR_MSG (extack, +"Device doesn't support restart from Bus Off" ); +return -EOPNOTSUPP ; + } +/* Do not allow a restart while not running */ if (!(dev->flags &IFF_UP ))return -EINVAL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 22/253 drm/bridge: ti-sn65dsi86: Remove extra semicolon in ti_sn_bridge_probe()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Douglas Anderson <[email protected]>
[ Upstream commit 15a7ca747d9538c2ad8b0c81dd4c1261e0736c82 ]
As reported by the kernel test robot, a recent patch introduced an unnecessary semicolon. Remove it.
--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/bridge/ti-sn65dsi86.c +1 -1
@@ -1333,7 +1333,7 @@ static int ti_sn_bridge_probe(struct auxiliary_device *adev,regmap_update_bits (pdata->regmap,SN_HPD_DISABLE_REG ,HPD_DISABLE ,0 );mutex_unlock (&pdata->comms_mutex); - }; + }drm_bridge_add (&pdata->bridge);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 23/253 net: hns3: fix concurrent setting vlan filter issue
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian Shen <[email protected]>
[ Upstream commit 4555f8f8b6aa46940f55feb6a07704c2935b6d6e ]
The vport->req_vlan_fltr_en may be changed concurrently by function hclge_sync_vlan_fltr_state() called in periodic work task and function hclge_enable_vport_vlan_filter() called by user configuration. It may cause the user configuration inoperative. Fixes it by protect the vport->req_vlan_fltr by vport_lock.
--- .../hisilicon/hns3/hns3pf/hclge_main.c | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +21 -15
@@ -9599,33 +9599,36 @@ static bool hclge_need_enable_vport_vlan_filter(struct hclge_vport *vport)return false; } -int hclge_enable_vport_vlan_filter (struct hclge_vport *vport,bool request_en) +static int __hclge_enable_vport_vlan_filter (struct hclge_vport *vport, +bool request_en) { -struct hclge_dev *hdev = vport->back;bool need_en;int ret; -mutex_lock (&hdev->vport_lock); - - vport->req_vlan_fltr_en = request_en; - need_en =hclge_need_enable_vport_vlan_filter (vport); -if (need_en == vport->cur_vlan_fltr_en) { -mutex_unlock (&hdev->vport_lock); +if (need_en == vport->cur_vlan_fltr_en)return 0 ; - } ret =hclge_set_vport_vlan_filter (vport, need_en); -if (ret) { -mutex_unlock (&hdev->vport_lock); +if (ret)return ret; - } vport->cur_vlan_fltr_en = need_en; +return 0 ; +} + +int hclge_enable_vport_vlan_filter (struct hclge_vport *vport,bool request_en) +{ +struct hclge_dev *hdev = vport->back; +int ret; + +mutex_lock (&hdev->vport_lock); + vport->req_vlan_fltr_en = request_en; + ret =__hclge_enable_vport_vlan_filter (vport, request_en);mutex_unlock (&hdev->vport_lock); -return 0 ; +return ret; }static int hclge_enable_vlan_filter (struct hnae3_handle *handle,bool enable)
@@ -10646,16 +10649,19 @@ static void hclge_sync_vlan_fltr_state(struct hclge_dev *hdev) &vport->state))continue ; - ret =hclge_enable_vport_vlan_filter (vport, - vport->req_vlan_fltr_en); +mutex_lock (&hdev->vport_lock); + ret =__hclge_enable_vport_vlan_filter (vport, + vport->req_vlan_fltr_en);if (ret) {dev_err (&hdev->pdev->dev,"failed to sync vlan filter state for vport%u, ret = %d\n" , vport->vport_id, ret);set_bit (HCLGE_VPORT_STATE_VLAN_FLTR_CHANGE , &vport->state); +mutex_unlock (&hdev->vport_lock);return ; } +mutex_unlock (&hdev->vport_lock); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 24/253 net: hns3: disable interrupt when ptp init failed
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonglong Liu <[email protected]>
[ Upstream commit cde304655f25d94a996c45b0f9956e7dcc2bc4c0 ]
When ptp init failed, we'd better disable the interrupt and clear the flag, to avoid early report interrupt at next probe.
--- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c +6 -3
@@ -509,14 +509,14 @@ int hclge_ptp_init(struct hclge_dev *hdev)if (ret) {dev_err (&hdev->pdev->dev,"failed to init freq, ret = %d\n" , ret); - goto out; + goto out_clear_int; } ret =hclge_ptp_set_ts_mode (hdev, &hdev->ptp->ts_cfg);if (ret) {dev_err (&hdev->pdev->dev,"failed to init ts mode, ret = %d\n" , ret); - goto out; + goto out_clear_int; }ktime_get_real_ts64 (&ts);
@@ -524,7 +524,7 @@ int hclge_ptp_init(struct hclge_dev *hdev)if (ret) {dev_err (&hdev->pdev->dev,"failed to init ts time, ret = %d\n" , ret); - goto out; + goto out_clear_int; }set_bit (HCLGE_STATE_PTP_EN , &hdev->state);
@@ -532,6 +532,9 @@ int hclge_ptp_init(struct hclge_dev *hdev)return 0 ; +out_clear_int: +clear_bit (HCLGE_PTP_FLAG_EN , &hdev->ptp->flags); +hclge_ptp_int_en (hdev, false); out:hclge_ptp_destroy_clock (hdev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 25/253 net: hns3: fixed vf get max channels bug
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian Shen <[email protected]>
[ Upstream commit b3e75c0bcc53f647311960bc1b0970b9b480ca5a ]
Currently, the queried maximum of vf channels is the maximum of channels supported by each TC. However, the actual maximum of channels is the maximum of channels supported by the device.
--- drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +1 -5
@@ -3086,11 +3086,7 @@ static void hclgevf_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)static u32 hclgevf_get_max_channels (struct hclgevf_dev *hdev) { -struct hnae3_handle *nic = &hdev->nic; -struct hnae3_knic_private_info *kinfo = &nic->kinfo; - -return min_t (u32, hdev->rss_size_max, - hdev->num_tqps / kinfo->tc_info.num_tc); +return min (hdev->rss_size_max, hdev->num_tqps); }/**
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 26/253 platform/x86: ideapad-laptop: Fix kbd backlight not remembered among boots
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rong Zhang <[email protected]>
commit e10981075adce203eac0be866389309eeb8ef11e upstream.
On some models supported by ideapad-laptop, the HW/FW can remember the state of keyboard backlight among boots. However, it is always turned off while shutting down, as a side effect of the LED class device unregistering sequence.
This is inconvenient for users who always prefer turning on the keyboard backlight. Thus, set LED_RETAIN_AT_SHUTDOWN on the LED class device so that the state of keyboard backlight gets remembered, which also aligns with the behavior of manufacturer utilities on Windows.
--- drivers/platform/x86/ideapad-laptop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/ideapad-laptop.c +1 -1
@@ -1498,7 +1498,7 @@ static int ideapad_kbd_bl_init(struct id priv->kbd_bl.led.max_brightness =1 ; priv->kbd_bl.led.brightness_get = ideapad_kbd_bl_led_cdev_brightness_get; priv->kbd_bl.led.brightness_set_blocking = ideapad_kbd_bl_led_cdev_brightness_set; - priv->kbd_bl.led.flags =LED_BRIGHT_HW_CHANGED ; + priv->kbd_bl.led.flags =LED_BRIGHT_HW_CHANGED |LED_RETAIN_AT_SHUTDOWN ; err =led_classdev_register (&priv->platform_device->dev, &priv->kbd_bl.led);if (err)
Greg Kroah-Hartman
maintainerPATCH 27/253 i2c: qup: jump out of the loop in case of timeout
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Xiwen <[email protected]>
commit a7982a14b3012527a9583d12525cd0dc9f8d8934 upstream.
Original logic only sets the return value but doesn't jump out of the loop if the bus is kept active by a client. This is not expected. A malicious or buggy i2c client can hang the kernel in this case and should be avoided. This is observed during a long time test with a PCA953x GPIO extender.
Fix it by changing the logic to not only sets the return value, but also jumps out of the loop and return to the caller with -ETIMEDOUT.
--- drivers/i2c/busses/i2c-qup.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-qup.c +3 -1
@@ -452,8 +452,10 @@ static int qup_i2c_bus_active(struct qupif (!(status &I2C_STATUS_BUS_ACTIVE ))break ; -if (time_after (jiffies, timeout)) +if (time_after (jiffies, timeout)) { ret = -ETIMEDOUT ; +break ; + }usleep_range (len, len *2 ); }
Greg Kroah-Hartman
maintainerPATCH 28/253 i2c: tegra: Fix reset error handling with ACPI
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akhil R <[email protected]>
commit 56344e241c543f17e8102fa13466ad5c3e7dc9ff upstream.
The acpi_evaluate_object() returns an ACPI error code and not Linux one. For the some platforms the err will have positive code which may be interpreted incorrectly. Use device_reset() for reset control which handles it correctly.
--- drivers/i2c/busses/i2c-tegra.c | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-)
drivers/i2c/busses/i2c-tegra.c +1 -23
@@ -623,7 +623,6 @@ static int tegra_i2c_wait_for_config_loastatic int tegra_i2c_init (struct tegra_i2c_dev *i2c_dev) {u32 val, clk_divisor, clk_multiplier, tsu_thd, tlow, thigh, non_hs_mode; -acpi_handle handle =ACPI_HANDLE (i2c_dev->dev);struct i2c_timings *t = &i2c_dev->timings;int err;
@@ -635,11 +634,7 @@ static int tegra_i2c_init(struct tegra_i* emit a noisy warning on error, which won't stay unnoticed and * won't hose machine entirely. */ -if (handle) - err =acpi_evaluate_object (handle,"_RST" ,NULL ,NULL ); -else - err =reset_control_reset (i2c_dev->rst); - + err =device_reset (i2c_dev->dev);WARN_ON_ONCE (err);if (IS_DVC (i2c_dev))
@@ -1696,19 +1691,6 @@ static void tegra_i2c_parse_dt(struct te i2c_dev->is_vi = true; } -static int tegra_i2c_init_reset (struct tegra_i2c_dev *i2c_dev) -{ -if (ACPI_HANDLE (i2c_dev->dev)) -return 0 ; - - i2c_dev->rst =devm_reset_control_get_exclusive (i2c_dev->dev,"i2c" ); -if (IS_ERR (i2c_dev->rst)) -return dev_err_probe (i2c_dev->dev,PTR_ERR (i2c_dev->rst), -"failed to get reset control\n" ); - -return 0 ; -} -static int tegra_i2c_init_clocks (struct tegra_i2c_dev *i2c_dev) {int err;
@@ -1818,10 +1800,6 @@ static int tegra_i2c_probe(struct platfotegra_i2c_parse_dt (i2c_dev); - err =tegra_i2c_init_reset (i2c_dev); -if (err) -return err; - err =tegra_i2c_init_clocks (i2c_dev);if (err)return err;
Greg Kroah-Hartman
maintainerPATCH 29/253 i2c: virtio: Avoid hang by using interruptible completion wait
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
commit a663b3c47ab10f66130818cf94eb59c971541c3f upstream.
The current implementation uses wait_for_completion(), which can cause the caller to hang indefinitely if the transfer never completes.
Switch to wait_for_completion_interruptible() so that the operation can be interrupted by signals.
--- drivers/i2c/busses/i2c-virtio.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/i2c/busses/i2c-virtio.c +8 -7
@@ -116,15 +116,16 @@ static int virtio_i2c_complete_reqs(strufor (i =0 ; i < num; i++) {struct virtio_i2c_req *req = &reqs[i]; -wait_for_completion (&req->completion); - -if (!failed && req->in_hdr.status !=VIRTIO_I2C_MSG_OK ) - failed = true; +if (!failed) { +if (wait_for_completion_interruptible (&req->completion)) + failed = true; +else if (req->in_hdr.status !=VIRTIO_I2C_MSG_OK ) + failed = true; +else + j++; + }i2c_put_dma_safe_msg_buf (reqs[i].buf, &msgs[i], !failed); - -if (!failed) - j++; }return j;
Greg Kroah-Hartman
maintainerPATCH 30/253 bus: fsl-mc: Fix potential double device reference in fsl_mc_get_endpoint()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
commit bddbe13d36a02d5097b99cf02354d5752ad1ac60 upstream.
The fsl_mc_get_endpoint() function may call fsl_mc_device_lookup() twice, which would increment the device's reference count twice if both lookups find a device. This could lead to a reference count leak.
Found by code review.
--- drivers/bus/fsl-mc/fsl-mc-bus.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
drivers/bus/fsl-mc/fsl-mc-bus.c +9 -10
@@ -947,6 +947,7 @@ struct fsl_mc_device *fsl_mc_get_endpoinstruct fsl_mc_obj_desc endpoint_desc = {{0 }};struct dprc_endpoint endpoint1 = {{0 }};struct dprc_endpoint endpoint2 = {{0 }}; +struct fsl_mc_bus *mc_bus;int state, err; mc_bus_dev =to_fsl_mc_device (mc_dev->dev.parent);
@@ -970,6 +971,8 @@ struct fsl_mc_device *fsl_mc_get_endpoinstrcpy (endpoint_desc.type, endpoint2.type); endpoint_desc.id = endpoint2.id; endpoint =fsl_mc_device_lookup (&endpoint_desc, mc_bus_dev); +if (endpoint) +return endpoint;/* * We know that the device has an endpoint because we verified by
@@ -977,17 +980,13 @@ struct fsl_mc_device *fsl_mc_get_endpoin* yet discovered by the fsl-mc bus, thus the lookup returned NULL. * Force a rescan of the devices in this container and retry the lookup. */ -if (!endpoint) { -struct fsl_mc_bus *mc_bus =to_fsl_mc_bus (mc_bus_dev); - -if (mutex_trylock (&mc_bus->scan_mutex)) { - err =dprc_scan_objects (mc_bus_dev, true); -mutex_unlock (&mc_bus->scan_mutex); - } - -if (err <0 ) -return ERR_PTR (err); + mc_bus =to_fsl_mc_bus (mc_bus_dev); +if (mutex_trylock (&mc_bus->scan_mutex)) { + err =dprc_scan_objects (mc_bus_dev, true); +mutex_unlock (&mc_bus->scan_mutex); } +if (err <0 ) +return ERR_PTR (err); endpoint =fsl_mc_device_lookup (&endpoint_desc, mc_bus_dev);/*
Greg Kroah-Hartman
maintainerPATCH 31/253 ALSA: hda/realtek - Add mute LED support for HP Pavilion 15-eg0xxx
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dawid Rezler <[email protected]>
commit 9744ede7099e8a69c04aa23fbea44c15bc390c04 upstream.
The mute LED on the HP Pavilion Laptop 15-eg0xxx,
which uses the ALC287 codec, didn't work.
This patch fixes the issue by enabling the ALC287_FIXUP_HP_GPIO_LED quirk.
Tested on a physical device, the LED now works as intended.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9947,6 +9947,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x8788 ,"HP OMEN 15" ,ALC285_FIXUP_HP_MUTE_LED ),SND_PCI_QUIRK (0x103c ,0x87b7 ,"HP Laptop 14-fq0xxx" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x87c8 ,"HP" ,ALC287_FIXUP_HP_GPIO_LED ), +SND_PCI_QUIRK (0x103c ,0x87cc ,"HP Pavilion 15-eg0xxx" ,ALC287_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x87d3 ,"HP Laptop 15-gw0xxx" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x87df ,"HP ProBook 430 G8 Notebook PC" ,ALC236_FIXUP_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
Greg Kroah-Hartman
maintainerPATCH 32/253 dpaa2-eth: Fix device reference count leak in MAC endpoint handling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
commit ee9f3a81ab08dfe0538dbd1746f81fd4d5147fdc upstream.
The fsl_mc_get_endpoint() function uses device_find_child() for localization, which implicitly calls get_device() to increment the device's reference count before returning the pointer. However, the caller dpaa2_eth_connect_mac() fails to properly release this reference in multiple scenarios. We should call put_device() to decrement reference count properly.
As comment of device_find_child() says, 'NOTE: you will need to drop the reference with put_device() after use'.
Found by code review.
--- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +12 -3
@@ -4446,12 +4446,19 @@ static int dpaa2_eth_connect_mac(structif (PTR_ERR (dpmac_dev) == -EPROBE_DEFER )return PTR_ERR (dpmac_dev); -if (IS_ERR (dpmac_dev) || dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type) +if (IS_ERR (dpmac_dev))return 0 ; +if (dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type) { + err =0 ; + goto out_put_device; + } + mac =kzalloc (sizeof (struct dpaa2_mac ),GFP_KERNEL ); -if (!mac) -return -ENOMEM ; +if (!mac) { + err = -ENOMEM ; + goto out_put_device; + } mac->mc_dev = dpmac_dev; mac->mc_io = priv->mc_io;
@@ -4478,6 +4485,8 @@ err_close_mac: priv->mac =NULL ; err_free_mac:kfree (mac); +out_put_device: +put_device (&dpmac_dev->dev);return err; }
Greg Kroah-Hartman
maintainerPATCH 33/253 dpaa2-switch: Fix device reference count leak in MAC endpoint handling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
commit 96e056ffba912ef18a72177f71956a5b347b5177 upstream.
The fsl_mc_get_endpoint() function uses device_find_child() for localization, which implicitly calls get_device() to increment the device's reference count before returning the pointer. However, the caller dpaa2_switch_port_connect_mac() fails to properly release this reference in multiple scenarios. We should call put_device() to decrement reference count properly.
As comment of device_find_child() says, 'NOTE: you will need to drop the reference with put_device() after use'.
Found by code review.
--- drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +12 -3
@@ -1439,12 +1439,19 @@ static int dpaa2_switch_port_connect_macif (PTR_ERR (dpmac_dev) == -EPROBE_DEFER )return PTR_ERR (dpmac_dev); -if (IS_ERR (dpmac_dev) || dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type) +if (IS_ERR (dpmac_dev))return 0 ; +if (dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type) { + err =0 ; + goto out_put_device; + } + mac =kzalloc (sizeof (*mac),GFP_KERNEL ); -if (!mac) -return -ENOMEM ; +if (!mac) { + err = -ENOMEM ; + goto out_put_device; + } mac->mc_dev = dpmac_dev; mac->mc_io = port_priv->ethsw_data->mc_io;
@@ -1472,6 +1479,8 @@ err_close_mac: port_priv->mac =NULL ; err_free_mac:kfree (mac); +out_put_device: +put_device (&dpmac_dev->dev);return err; }
Greg Kroah-Hartman
maintainerPATCH 34/253 e1000e: disregard NVM checksum on tgp when valid checksum bit is not set
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacek Kowalski <[email protected]>
commit 536fd741c7ac907d63166cdae1081b1febfab613 upstream.
As described by Vitaly Lifshits:
Quoted 7 lines
Starting from Tiger Lake, LAN NVM is locked for writes by SW, so the driver cannot perform checksum validation and correction. This means that all NVM images must leave the factory with correct checksum and checksum valid bit set. Since Tiger Lake devices were the first to have this lock, some systems in the field did not meet this requirement. Therefore, for these transitional devices we skip checksum update and verification, if the valid bit is not set.
--- drivers/net/ethernet/intel/e1000e/ich8lan.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/intel/e1000e/ich8lan.c +2 -0
@@ -4146,6 +4146,8 @@ static s32 e1000_validate_nvm_checksum_i ret_val =e1000e_update_nvm_checksum (hw);if (ret_val)return ret_val; + }else if (hw->mac.type == e1000_pch_tgp) { +return 0 ; } }
Greg Kroah-Hartman
maintainerPATCH 35/253 e1000e: ignore uninitialized checksum word on tgp
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacek Kowalski <[email protected]>
commit 61114910a5f6a71d0b6ea3b95082dfe031b19dfe upstream.
As described by Vitaly Lifshits:
Quoted 4 lines
Starting from Tiger Lake, LAN NVM is locked for writes by SW, so the driver cannot perform checksum validation and correction. This means that all NVM images must leave the factory with correct checksum and checksum valid bit set.
Unfortunately some systems have left the factory with an uninitialized value of 0xFFFF at register address 0x3F (checksum word location). So on Tiger Lake platform we ignore the computed checksum when such condition is encountered.
--- drivers/net/ethernet/intel/e1000e/defines.h | 3 +++ drivers/net/ethernet/intel/e1000e/nvm.c | 6 ++++++ 2 files changed, 9 insertions(+)
drivers/net/ethernet/intel/e1000e/defines.h +3 -0
@@ -638,6 +638,9 @@/* For checksumming, the sum of all words in the NVM should equal 0xBABA. */ #define NVM_SUM 0xBABA +/* Uninitialized ("empty") checksum word value */ +#define NVM_CHECKSUM_UNINITIALIZED 0xFFFF +/* PBA (printed board assembly) number words */ #define NVM_PBA_OFFSET_0 8#define NVM_PBA_OFFSET_1 9
drivers/net/ethernet/intel/e1000e/nvm.c +6 -0
@@ -558,6 +558,12 @@ s32 e1000e_validate_nvm_checksum_generic checksum += nvm_data; } +if (hw->mac.type == e1000_pch_tgp && + nvm_data ==NVM_CHECKSUM_UNINITIALIZED ) { +e_dbg ("Uninitialized NVM Checksum on TGP platform - ignoring\n" ); +return 0 ; + } +if (checksum != (u16 )NVM_SUM ) {e_dbg ("NVM Checksum Invalid\n" );return -E1000_ERR_NVM ;
Greg Kroah-Hartman
maintainerPATCH 36/253 gve: Fix stuck TX queue for DQ queue format
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Praveen Kaligineedi <[email protected]>
commit b03f15c0192b184078206760c839054ae6eb4eaa upstream.
gve_tx_timeout was calculating missed completions in a way that is only relevant in the GQ queue format. Additionally, it was attempting to disable device interrupts, which is not needed in either GQ or DQ queue formats.
As a result, TX timeouts with the DQ queue format likely would have triggered early resets without kicking the queue at all.
This patch drops the check for pending work altogether and always kicks the queue after validating the queue has not seen a TX timeout too recently.
--- drivers/net/ethernet/google/gve/gve_main.c | 71 +++++++++++++++-------------- 1 file changed, 39 insertions(+), 32 deletions(-)
drivers/net/ethernet/google/gve/gve_main.c +39 -32
@@ -1124,49 +1124,56 @@ static void gve_turnup(struct gve_priv *gve_set_napi_enabled (priv); } -static void gve_tx_timeout (struct net_device *dev,unsigned int txqueue) +static struct gve_notify_block *gve_get_tx_notify_block (struct gve_priv *priv, +unsigned int txqueue) { -struct gve_notify_block *block; -struct gve_tx_ring *tx =NULL ; -struct gve_priv *priv; -u32 last_nic_done; -u32 current_time;u32 ntfy_idx; -netdev_info (dev,"Timeout on tx queue, %d" , txqueue); - priv =netdev_priv (dev);if (txqueue > priv->tx_cfg.num_queues) - goto reset; +return NULL ; ntfy_idx =gve_tx_idx_to_ntfy (priv, txqueue);if (ntfy_idx >= priv->num_ntfy_blks) - goto reset; +return NULL ; + +return &priv->ntfy_blocks[ntfy_idx]; +} + +static bool gve_tx_timeout_try_q_kick (struct gve_priv *priv, +unsigned int txqueue) +{ +struct gve_notify_block *block; +u32 current_time; - block = &priv->ntfy_blocks[ntfy_idx]; - tx = block->tx; + block =gve_get_tx_notify_block (priv, txqueue); + +if (!block) +return false; current_time =jiffies_to_msecs (jiffies); -if (tx->last_kick_msec +MIN_TX_TIMEOUT_GAP > current_time) - goto reset; +if (block->tx->last_kick_msec +MIN_TX_TIMEOUT_GAP > current_time) +return false; + +netdev_info (priv->dev,"Kicking queue %d" , txqueue); +napi_schedule (&block->napi); + block->tx->last_kick_msec = current_time; +return true; +} + +static void gve_tx_timeout (struct net_device *dev,unsigned int txqueue) +{ +struct gve_notify_block *block; +struct gve_priv *priv; + +netdev_info (dev,"Timeout on tx queue, %d" , txqueue); + priv =netdev_priv (dev); + +if (!gve_tx_timeout_try_q_kick (priv, txqueue)) +gve_schedule_reset (priv); -/* Check to see if there are missed completions, which will allow us to -* kick the queue. -*/ - last_nic_done =gve_tx_load_event_counter (priv, tx); -if (last_nic_done - tx->done) { -netdev_info (dev,"Kicking queue %d" , txqueue); -iowrite32be (GVE_IRQ_MASK ,gve_irq_doorbell (priv, block)); -napi_schedule (&block->napi); - tx->last_kick_msec = current_time; - goto out; - }// Else reset. - -reset: -gve_schedule_reset (priv); - -out: -if (tx) - tx->queue_timeout++; + block =gve_get_tx_notify_block (priv, txqueue); +if (block) + block->tx->queue_timeout++; priv->tx_timeo_cnt++; }
Greg Kroah-Hartman
maintainerPATCH 37/253 ice: Fix a null pointer dereference in ice_copy_and_init_pkg()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoxiang Li <[email protected]>
commit 4ff12d82dac119b4b99b5a78b5af3bf2474c0a36 upstream.
Add check for the return value of devm_kmemdup()
to prevent potential null pointer dereference.
--- drivers/net/ethernet/intel/ice/ice_flex_pipe.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/intel/ice/ice_flex_pipe.c +2 -0
@@ -1753,6 +1753,8 @@ ice_copy_and_init_pkg(struct ice_hw *hw,return ICE_DDP_PKG_ERR ; buf_copy =devm_kmemdup (ice_hw_to_dev (hw), buf, len,GFP_KERNEL ); +if (!buf_copy) +return ICE_DDP_PKG_ERR ; state =ice_init_pkg (hw, buf_copy, len);if (!ice_is_init_pkg_successful (state)) {
Greg Kroah-Hartman
maintainerPATCH 38/253 kasan: use vmalloc_dump_obj() for vmalloc error reports
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marco Elver <[email protected]>
commit 6ade153349c6bb990d170cecc3e8bdd8628119ab upstream.
Since 6ee9b3d84775 ("kasan: remove kasan_find_vm_area() to prevent possible deadlock"), more detailed info about the vmalloc mapping and the origin was dropped due to potential deadlocks.
While fixing the deadlock is necessary, that patch was too quick in killing an otherwise useful feature, and did no due-diligence in understanding if an alternative option is available.
Restore printing more helpful vmalloc allocation info in KASAN reports with the help of vmalloc_dump_obj(). Example report:
| BUG: KASAN: vmalloc-out-of-bounds in vmalloc_oob+0x4c9/0x610 | Read of size 1 at addr ffffc900002fd7f3 by task kunit_try_catch/493 | | CPU: [...] | Call Trace: | <TASK> | dump_stack_lvl+0xa8/0xf0 | print_report+0x17e/0x810 | kasan_report+0x155/0x190 | vmalloc_oob+0x4c9/0x610 | [...] | | The buggy address belongs to a 1-page vmalloc region starting at 0xffffc900002fd000 allocated at vmalloc_oob+0x36/0x610 | The buggy address belongs to the physical page: | page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x126364 | flags: 0x200000000000000(node=0|zone=2) | raw: 0200000000000000 0000000000000000 dead000000000122 0000000000000000 | raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000 | page dumped because: kasan: bad access detected | | [..]
--- mm/kasan/report.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
mm/kasan/report.c +3 -1
@@ -337,7 +337,9 @@ static void print_address_description(vo }if (is_vmalloc_addr (addr)) { -pr_err ("The buggy address %px belongs to a vmalloc virtual mapping\n" , addr); +pr_err ("The buggy address belongs to a" ); +if (!vmalloc_dump_obj (addr)) +pr_cont (" vmalloc virtual mapping\n" ); page =vmalloc_to_page (addr); }
Greg Kroah-Hartman
maintainerPATCH 39/253 nilfs2: reject invalid file types when reading inodes
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
commit 4aead50caf67e01020c8be1945c3201e8a972a27 upstream.
To prevent inodes with invalid file types from tripping through the vfs and causing malfunctions or assertion failures, add a missing sanity check when reading an inode from a block device. If the file type is not valid, treat it as a filesystem error.
--- fs/nilfs2/inode.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
fs/nilfs2/inode.c +8 -1
@@ -517,11 +517,18 @@ static int __nilfs_read_inode(struct sup inode->i_op = &nilfs_symlink_inode_operations;inode_nohighmem (inode); inode->i_mapping->a_ops = &nilfs_aops; - }else { + }else if (S_ISCHR (inode->i_mode) ||S_ISBLK (inode->i_mode) || +S_ISFIFO (inode->i_mode) ||S_ISSOCK (inode->i_mode)) { inode->i_op = &nilfs_special_inode_operations;init_special_inode ( inode, inode->i_mode,huge_decode_dev (le64_to_cpu (raw_inode->i_device_code))); + }else { +nilfs_error (sb, +"invalid file type bits in mode 0%o for inode %lu" , + inode->i_mode, ino); + err = -EIO ; + goto failed_unmap; }nilfs_ifile_unmap_inode (root->ifile, ino, bh);brelse (bh);
Greg Kroah-Hartman
maintainerPATCH 40/253 selftests: mptcp: connect: also cover alt modes
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
commit 37848a456fc38c191aedfe41f662cc24db8c23d9 upstream.
The "mmap" and "sendfile" alternate modes for mptcp_connect.sh/.c are available from the beginning, but only tested when mptcp_connect.sh is manually launched with "-m mmap" or "-m sendfile", not via the kselftests helpers.
The MPTCP CI was manually running "mptcp_connect.sh -m mmap", but not "-m sendfile". Plus other CIs, especially the ones validating the stable releases, were not validating these alternate modes.
To make sure these modes are validated by these CIs, add two new test programs executing mptcp_connect.sh with the alternate modes.
--- tools/testing/selftests/net/mptcp/Makefile | 3 ++- tools/testing/selftests/net/mptcp/mptcp_connect_mmap.sh | 5 +++++ tools/testing/selftests/net/mptcp/mptcp_connect_sendfile.sh | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100755 tools/testing/selftests/net/mptcp/mptcp_connect_mmap.sh create mode 100755 tools/testing/selftests/net/mptcp/mptcp_connect_sendfile.sh
tools/testing/selftests/net/mptcp/Makefile +2 -1
@@ -4,7 +4,8 @@ top_srcdir = ../../../../.. CFLAGS = -Wall -Wl,--no-as-needed -O2 -g -I$(top_srcdir)/usr/include $(KHDR_INCLUDES) -TEST_PROGS := mptcp_connect.sh pm_netlink.sh mptcp_join.sh diag.sh \ +TEST_PROGS := mptcp_connect.sh mptcp_connect_mmap.sh mptcp_connect_sendfile.sh \ + pm_netlink.sh mptcp_join.sh diag.sh \ simult_flows.sh mptcp_sockopt.sh userspace_pm.sh TEST_GEN_FILES = mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq
tools/testing/selftests/net/mptcp/mptcp_connect_mmap.sh new file +5 -0
@@ -0,0 +1,5 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +MPTCP_LIB_KSFT_TEST="$(basename "${0}" .sh)" \ + "$(dirname "${0}")/mptcp_connect.sh" -m mmap "${@}"
tools/testing/selftests/net/mptcp/mptcp_connect_sendfile.sh new file +5 -0
@@ -0,0 +1,5 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +MPTCP_LIB_KSFT_TEST="$(basename "${0}" .sh)" \ + "$(dirname "${0}")/mptcp_connect.sh" -m sendfile "${@}"
Greg Kroah-Hartman
maintainerPATCH 41/253 selftests: mptcp: connect: also cover checksum
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
commit fdf0f60a2bb02ba581d9e71d583e69dd0714a521 upstream.
The checksum mode has been added a while ago, but it is only validated when manually launching mptcp_connect.sh with "-C".
The different CIs were then not validating these MPTCP Connect tests with checksum enabled. To make sure they do, add a new test program executing mptcp_connect.sh with the checksum mode.
--- tools/testing/selftests/net/mptcp/Makefile | 2 +- tools/testing/selftests/net/mptcp/mptcp_connect_checksum.sh | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100755 tools/testing/selftests/net/mptcp/mptcp_connect_checksum.sh
tools/testing/selftests/net/mptcp/Makefile +1 -1
@@ -5,7 +5,7 @@ top_srcdir = ../../../../.. CFLAGS = -Wall -Wl,--no-as-needed -O2 -g -I$(top_srcdir)/usr/include $(KHDR_INCLUDES) TEST_PROGS := mptcp_connect.sh mptcp_connect_mmap.sh mptcp_connect_sendfile.sh \ - pm_netlink.sh mptcp_join.sh diag.sh \ + mptcp_connect_checksum.sh pm_netlink.sh mptcp_join.sh diag.sh \ simult_flows.sh mptcp_sockopt.sh userspace_pm.sh TEST_GEN_FILES = mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq
tools/testing/selftests/net/mptcp/mptcp_connect_checksum.sh new file +5 -0
@@ -0,0 +1,5 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +MPTCP_LIB_KSFT_TEST="$(basename "${0}" .sh)" \ + "$(dirname "${0}")/mptcp_connect.sh" -C "${@}"
Greg Kroah-Hartman
maintainerPATCH 42/253 mm/zsmalloc: do not pass __GFP_MOVABLE if CONFIG_COMPACTION=n
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harry Yoo <[email protected]>
commit 694d6b99923eb05a8fd188be44e26077d19f0e21 upstream.
Commit 48b4800a1c6a ("zsmalloc: page migration support") added support for migrating zsmalloc pages using the movable_operations migration framework. However, the commit did not take into account that zsmalloc supports migration only when CONFIG_COMPACTION is enabled. Tracing shows that zsmalloc was still passing the __GFP_MOVABLE flag even when compaction is not supported.
This can result in unmovable pages being allocated from movable page blocks (even without stealing page blocks), ZONE_MOVABLE and CMA area.
Possible user visible effects:
- Some ZONE_MOVABLE memory can be not actually movable
- CMA allocation can fail because of this
- Increased memory fragmentation due to ignoring the page mobility grouping feature
I'm not really sure who uses kernels without compaction support, though :(
To fix this, clear the __GFP_MOVABLE flag when
!IS_ENABLED(CONFIG_COMPACTION).
--- mm/zsmalloc.c | 3 +++ 1 file changed, 3 insertions(+)
mm/zsmalloc.c +3 -0
@@ -1049,6 +1049,9 @@ static struct zspage *alloc_zspage(strucif (!zspage)return NULL ; +if (!IS_ENABLED (CONFIG_COMPACTION )) + gfp &= ~__GFP_MOVABLE; + zspage->magic =ZSPAGE_MAGIC ;migrate_lock_init (zspage);
Greg Kroah-Hartman
maintainerPATCH 43/253 drm/amdkfd: Dont call mmput from MMU notifier callback
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philip Yang <[email protected]>
commit cf234231fcbc7d391e2135b9518613218cc5347f upstream.
If the process is exiting, the mmput inside mmu notifier callback from compactd or fork or numa balancing could release the last reference of mm struct to call exit_mmap and free_pgtable, this triggers deadlock with below backtrace.
The deadlock will leak kfd process as mmu notifier release is not called and cause VRAM leaking.
The fix is to take mm reference mmget_non_zero when adding prange to the deferred list to pair with mmput in deferred list work.
If prange split and add into pchild list, the pchild work_item.mm is not used, so remove the mm parameter from svm_range_unmap_split and svm_range_add_child.
The backtrace of hung task:
INFO: task python:348105 blocked for more than 64512 seconds. Call Trace: __schedule+0x1c3/0x550 schedule+0x46/0xb0 rwsem_down_write_slowpath+0x24b/0x4c0 unlink_anon_vmas+0xb1/0x1c0 free_pgtables+0xa9/0x130 exit_mmap+0xbc/0x1a0 mmput+0x5a/0x140 svm_range_cpu_invalidate_pagetables+0x2b/0x40 [amdgpu] mn_itree_invalidate+0x72/0xc0 __mmu_notifier_invalidate_range_start+0x48/0x60 try_to_unmap_one+0x10fa/0x1400 rmap_walk_anon+0x196/0x460 try_to_unmap+0xbb/0x210 migrate_page_unmap+0x54d/0x7e0 migrate_pages_batch+0x1c3/0xae0 migrate_pages_sync+0x98/0x240 migrate_pages+0x25c/0x520 compact_zone+0x29d/0x590 compact_zone_order+0xb6/0xf0 try_to_compact_pages+0xbe/0x220 __alloc_pages_direct_compact+0x96/0x1a0 __alloc_pages_slowpath+0x410/0x930 __alloc_pages_nodemask+0x3a9/0x3e0 do_huge_pmd_anonymous_page+0xd7/0x3e0 __handle_mm_fault+0x5e3/0x5f0 handle_mm_fault+0xf7/0x2e0 hmm_vma_fault.isra.0+0x4d/0xa0 walk_pmd_range.isra.0+0xa8/0x310 walk_pud_range+0x167/0x240 walk_pgd_range+0x55/0x100 __walk_page_range+0x87/0x90 walk_page_range+0xf6/0x160 hmm_range_fault+0x4f/0x90 amdgpu_hmm_range_get_pages+0x123/0x230 [amdgpu] amdgpu_ttm_tt_get_user_pages+0xb1/0x150 [amdgpu] init_user_pages+0xb1/0x2a0 [amdgpu] amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu+0x543/0x7d0 [amdgpu] kfd_ioctl_alloc_memory_of_gpu+0x24c/0x4e0 [amdgpu] kfd_ioctl+0x29d/0x500 [amdgpu]
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 47 ++++++++++++++++------------------- 1 file changed, 22 insertions(+), 25 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +22 -25
@@ -1076,13 +1076,12 @@ svm_range_split_head(struct svm_range *p }static void -svm_range_add_child (struct svm_range *prange,struct mm_struct *mm, -struct svm_range *pchild,enum svm_work_list_ops op) +svm_range_add_child (struct svm_range *prange,struct svm_range *pchild,enum svm_work_list_ops op) {pr_debug ("add child 0x%p [0x%lx 0x%lx] to prange 0x%p child list %d\n" , pchild, pchild->start, pchild->last, prange, op); - pchild->work_item.mm = mm; + pchild->work_item.mm =NULL ; pchild->work_item.op = op;list_add_tail (&pchild->child_list, &prange->child_list); }
@@ -1128,14 +1127,14 @@ svm_range_split_by_granularity(struct kf r =svm_range_split (prange, start, prange->last, &head);if (r)return r; -svm_range_add_child (parent, mm, head,SVM_OP_ADD_RANGE ); +svm_range_add_child (parent, head,SVM_OP_ADD_RANGE ); }if (last < prange->last) { r =svm_range_split (prange, prange->start, last, &tail);if (r)return r; -svm_range_add_child (parent, mm, tail,SVM_OP_ADD_RANGE ); +svm_range_add_child (parent, tail,SVM_OP_ADD_RANGE ); }/* xnack on, update mapping on GPUs with ACCESS_IN_PLACE */
@@ -2265,15 +2264,17 @@ svm_range_add_list_work(struct svm_range prange->work_item.op != SVM_OP_UNMAP_RANGE) prange->work_item.op = op; }else { - prange->work_item.op = op; - -/* Pairs with mmput in deferred_list_work */ -mmget (mm); - prange->work_item.mm = mm; -list_add_tail (&prange->deferred_list, - &prange->svms->deferred_range_list); -pr_debug ("add prange 0x%p [0x%lx 0x%lx] to work list op %d\n" , - prange, prange->start, prange->last, op); +/* Pairs with mmput in deferred_list_work. +* If process is exiting and mm is gone, don't update mmu notifier. +*/ +if (mmget_not_zero (mm)) { + prange->work_item.mm = mm; + prange->work_item.op = op; +list_add_tail (&prange->deferred_list, + &prange->svms->deferred_range_list); +pr_debug ("add prange 0x%p [0x%lx 0x%lx] to work list op %d\n" , + prange, prange->start, prange->last, op); + } }spin_unlock (&svms->deferred_list_lock); }
@@ -2287,8 +2288,7 @@ void schedule_deferred_list_work(struct }static void -svm_range_unmap_split (struct mm_struct *mm,struct svm_range *parent, -struct svm_range *prange,unsigned long start, +svm_range_unmap_split (struct svm_range *parent,struct svm_range *prange,unsigned long start,unsigned long last) {struct svm_range *head;
@@ -2309,12 +2309,12 @@ svm_range_unmap_split(struct mm_struct *svm_range_split (tail, last +1 , tail->last, &head);if (head != prange && tail != prange) { -svm_range_add_child (parent, mm, head,SVM_OP_UNMAP_RANGE ); -svm_range_add_child (parent, mm, tail,SVM_OP_ADD_RANGE ); +svm_range_add_child (parent, head,SVM_OP_UNMAP_RANGE ); +svm_range_add_child (parent, tail,SVM_OP_ADD_RANGE ); }else if (tail != prange) { -svm_range_add_child (parent, mm, tail,SVM_OP_UNMAP_RANGE ); +svm_range_add_child (parent, tail,SVM_OP_UNMAP_RANGE ); }else if (head != prange) { -svm_range_add_child (parent, mm, head,SVM_OP_UNMAP_RANGE ); +svm_range_add_child (parent, head,SVM_OP_UNMAP_RANGE ); }else if (parent != prange) { prange->work_item.op =SVM_OP_UNMAP_RANGE ; }
@@ -2353,14 +2353,14 @@ svm_range_unmap_from_cpu(struct mm_struc l =min (last, pchild->last);if (l >= s)svm_range_unmap_from_gpus (pchild, s, l, trigger); -svm_range_unmap_split (mm, prange, pchild, start, last); +svm_range_unmap_split (prange, pchild, start, last);mutex_unlock (&pchild->lock); } s =max (start, prange->start); l =min (last, prange->last);if (l >= s)svm_range_unmap_from_gpus (prange, s, l, trigger); -svm_range_unmap_split (mm, prange, prange, start, last); +svm_range_unmap_split (prange, prange, start, last);if (unmap_parent)svm_range_add_list_work (svms, prange, mm,SVM_OP_UNMAP_RANGE );
@@ -2403,8 +2403,6 @@ svm_range_cpu_invalidate_pagetables(struif (range->event ==MMU_NOTIFY_RELEASE )return true; -if (!mmget_not_zero (mni->mm)) -return true; start = mni->interval_tree.start; last = mni->interval_tree.last;
@@ -2431,7 +2429,6 @@ svm_range_cpu_invalidate_pagetables(stru }svm_range_unlock (prange); -mmput (mni->mm);return true; }
Greg Kroah-Hartman
maintainerPATCH 44/253 usb: typec: tcpm: allow to use sink in accessory mode
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Grzeschik <[email protected]>
commit 64843d0ba96d3eae297025562111d57585273366 upstream.
Since the function tcpm_acc_attach is not setting the data and role for for the sink case we extend it to check for it first.
Stable-dep-of: bec15191d523 ("usb: typec: tcpm: apply vbus before data bringup in tcpm_src_attach")
--- drivers/usb/typec/tcpm/tcpm.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/usb/typec/tcpm/tcpm.c +7 -2
@@ -3866,12 +3866,17 @@ static void tcpm_snk_detach(struct tcpm_static int tcpm_acc_attach (struct tcpm_port *port) {int ret; +enum typec_role role; +enum typec_data_role data;if (port->attached)return 0 ; - ret =tcpm_set_roles (port, true,TYPEC_SOURCE , -tcpm_data_role_for_source (port)); + role =tcpm_port_is_sink (port) ?TYPEC_SINK :TYPEC_SOURCE ; + data =tcpm_port_is_sink (port) ?tcpm_data_role_for_sink (port) + :tcpm_data_role_for_source (port); + + ret =tcpm_set_roles (port, true, role, data);if (ret <0 )return ret;
Greg Kroah-Hartman
maintainerPATCH 45/253 usb: typec: tcpm: allow switching to mode accessory to mux properly
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Grzeschik <[email protected]>
commit 8a50da849151e7e12b43c1d8fe7ad302223aef6b upstream.
The funciton tcpm_acc_attach is not setting the proper state when calling tcpm_set_role. The function tcpm_set_role is currently only handling TYPEC_STATE_USB. For the tcpm_acc_attach to switch into other modal states tcpm_set_role needs to be extended by an extra state parameter. This patch is handling the proper state change when calling tcpm_acc_attach.
Stable-dep-of: bec15191d523 ("usb: typec: tcpm: apply vbus before data bringup in tcpm_src_attach")
--- drivers/usb/typec/tcpm/tcpm.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
drivers/usb/typec/tcpm/tcpm.c +18 -9
@@ -1032,7 +1032,7 @@ static int tcpm_set_attached_state(struc port->data_role); } -static int tcpm_set_roles (struct tcpm_port *port,bool attached, +static int tcpm_set_roles (struct tcpm_port *port,bool attached,int state,enum typec_role role,enum typec_data_role data) {enum typec_orientation orientation;
@@ -1069,7 +1069,7 @@ static int tcpm_set_roles(struct tcpm_po } } - ret =tcpm_mux_set (port,TYPEC_STATE_USB , usb_role, orientation); + ret =tcpm_mux_set (port, state, usb_role, orientation);if (ret <0 )return ret;
@@ -3686,7 +3686,8 @@ static int tcpm_src_attach(struct tcpm_ptcpm_enable_auto_vbus_discharge (port, true); - ret =tcpm_set_roles (port, true,TYPEC_SOURCE ,tcpm_data_role_for_source (port)); + ret =tcpm_set_roles (port, true,TYPEC_STATE_USB , +TYPEC_SOURCE ,tcpm_data_role_for_source (port));if (ret <0 )return ret;
@@ -3844,7 +3845,8 @@ static int tcpm_snk_attach(struct tcpm_ptcpm_enable_auto_vbus_discharge (port, true); - ret =tcpm_set_roles (port, true,TYPEC_SINK ,tcpm_data_role_for_sink (port)); + ret =tcpm_set_roles (port, true,TYPEC_STATE_USB , +TYPEC_SINK ,tcpm_data_role_for_sink (port));if (ret <0 )return ret;
@@ -3868,6 +3870,7 @@ static int tcpm_acc_attach(struct tcpm_pint ret;enum typec_role role;enum typec_data_role data; +int state =TYPEC_STATE_USB ;if (port->attached)return 0 ;
@@ -3876,7 +3879,13 @@ static int tcpm_acc_attach(struct tcpm_p data =tcpm_port_is_sink (port) ?tcpm_data_role_for_sink (port) :tcpm_data_role_for_source (port); - ret =tcpm_set_roles (port, true, role, data); +if (tcpm_port_is_audio (port)) + state =TYPEC_MODE_AUDIO ; + +if (tcpm_port_is_debug (port)) + state =TYPEC_MODE_DEBUG ; + + ret =tcpm_set_roles (port, true, state, role, data);if (ret <0 )return ret;
@@ -4556,7 +4565,7 @@ static void run_state_machine(struct tcp*/ tcpm_set_vconn (port, false);tcpm_set_vbus (port, false); -tcpm_set_roles (port, port->self_powered,TYPEC_SOURCE , +tcpm_set_roles (port, port->self_powered,TYPEC_STATE_USB ,TYPEC_SOURCE ,tcpm_data_role_for_source (port));/* * If tcpc fails to notify vbus off, TCPM will wait for PD_T_SAFE_0V +
@@ -4588,7 +4597,7 @@ static void run_state_machine(struct tcptcpm_set_vconn (port, false);if (port->pd_capable)tcpm_set_charge (port, false); -tcpm_set_roles (port, port->self_powered,TYPEC_SINK , +tcpm_set_roles (port, port->self_powered,TYPEC_STATE_USB ,TYPEC_SINK ,tcpm_data_role_for_sink (port));/* * VBUS may or may not toggle, depending on the adapter.
@@ -4693,10 +4702,10 @@ static void run_state_machine(struct tcpcase DR_SWAP_CHANGE_DR :tcpm_unregister_altmodes (port);if (port->data_role ==TYPEC_HOST ) -tcpm_set_roles (port, true, port->pwr_role, +tcpm_set_roles (port, true,TYPEC_STATE_USB , port->pwr_role,TYPEC_DEVICE );else -tcpm_set_roles (port, true, port->pwr_role, +tcpm_set_roles (port, true,TYPEC_STATE_USB , port->pwr_role,TYPEC_HOST );tcpm_ams_finish (port);tcpm_set_state (port,ready_state (port),0 );
Greg Kroah-Hartman
maintainerPATCH 46/253 usb: typec: tcpm: apply vbus before data bringup in tcpm_src_attach
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: RD Babiera <[email protected]>
commit bec15191d52300defa282e3fd83820f69e447116 upstream.
This patch fixes Type-C compliance test TD 4.7.6 - Try.SNK DRP Connect SNKAS.
tVbusON has a limit of 275ms when entering SRC_ATTACHED. Compliance testers can interpret the TryWait.Src to Attached.Src transition after Try.Snk as being in Attached.Src the entire time, so ~170ms is lost to the debounce timer.
Setting the data role can be a costly operation in host mode, and when completed after 100ms can cause Type-C compliance test check TD 4.7.5.V.4 to fail.
Turn VBUS on before tcpm_set_roles to meet timing requirement.
--- drivers/usb/typec/tcpm/tcpm.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-)
drivers/usb/typec/tcpm/tcpm.c +17 -17
@@ -3686,17 +3686,6 @@ static int tcpm_src_attach(struct tcpm_ptcpm_enable_auto_vbus_discharge (port, true); - ret =tcpm_set_roles (port, true,TYPEC_STATE_USB , -TYPEC_SOURCE ,tcpm_data_role_for_source (port)); -if (ret <0 ) -return ret; - -if (port->pd_supported) { - ret = port->tcpc->set_pd_rx (port->tcpc, true); -if (ret <0 ) - goto out_disable_mux; - } -/* * USB Type-C specification, version 1.2, * chapter 4.5.2.2.8.1 (Attached.SRC Requirements)
@@ -3706,13 +3695,24 @@ static int tcpm_src_attach(struct tcpm_p (polarity == TYPEC_POLARITY_CC2 && port->cc1 == TYPEC_CC_RA)) { ret =tcpm_set_vconn (port, true);if (ret <0 ) - goto out_disable_pd; +return ret; } ret =tcpm_set_vbus (port, true);if (ret <0 ) goto out_disable_vconn; + ret =tcpm_set_roles (port, true,TYPEC_STATE_USB ,TYPEC_SOURCE , +tcpm_data_role_for_source (port)); +if (ret <0 ) + goto out_disable_vbus; + +if (port->pd_supported) { + ret = port->tcpc->set_pd_rx (port->tcpc, true); +if (ret <0 ) + goto out_disable_mux; + } + port->pd_capable = false; port->partner =NULL ;
@@ -3722,14 +3722,14 @@ static int tcpm_src_attach(struct tcpm_preturn 0 ; -out_disable_vconn: -tcpm_set_vconn (port, false); -out_disable_pd: -if (port->pd_supported) - port->tcpc->set_pd_rx (port->tcpc, false); out_disable_mux:tcpm_mux_set (port,TYPEC_STATE_SAFE ,USB_ROLE_NONE ,TYPEC_ORIENTATION_NONE ); +out_disable_vbus: +tcpm_set_vbus (port, false); +out_disable_vconn: +tcpm_set_vconn (port, false); +return ret; }
Greg Kroah-Hartman
maintainerPATCH 47/253 x86/bugs: Fix use of possibly uninit value in amd_check_tsa_microcode()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Zhivich <[email protected]>
For kernels compiled with CONFIG_INIT_STACK_NONE=y, the value of __reserved field in zen_patch_rev union on the stack may be garbage. If so, it will prevent correct microcode check when consulting p.ucode_rev, resulting in incorrect mitigation selection.
This is a stable-only fix.
---
Changes in v3:
- separate "fixes" tag for each stable
arch/x86/kernel/cpu/amd.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/kernel/cpu/amd.c +2 -0
@@ -563,6 +563,8 @@ static bool amd_check_tsa_microcode(void p.model = c->x86_model; p.ext_model = c->x86_model >>4 ; p.stepping = c->x86_stepping; +/* reserved bits are expected to be 0 in test below */ + p.__reserved =0 ;if (c->x86 ==0x19 ) {switch (p.ucode_rev >>8 ) {
Greg Kroah-Hartman
maintainerPATCH 48/253 jfs: reject on-disk inodes of an unsupported type
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
commit 8c3f9a70d2d4dd6c640afe294b05c6a0a45434d9 upstream.
Syzbot has reported the following BUG:
kernel BUG at fs/inode.c:668!
Oops: invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI CPU: 3 UID: 0 PID: 139 Comm: jfsCommit Not tainted 6.12.0-rc4-syzkaller-00085-g4e46774408d9 #0 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-3.fc41 04/01/2014 RIP: 0010:clear_inode+0x168/0x190 Code: 4c 89 f7 e8 ba fe e5 ff e9 61 ff ff ff 44 89 f1 80 e1 07 80 c1 03 38 c1 7c c1 4c 89 f7 e8 90 ff e5 ff eb b7 0b e8 01 5d 7f ff 90 0f 0b e8 f9 5c 7f ff 90 0f 0b e8 f1 5c 7f RSP: 0018:ffffc900027dfae8 EFLAGS: 00010093 RAX: ffffffff82157a87 RBX: 0000000000000001 RCX: ffff888104d4b980 RDX: 0000000000000000 RSI: 0000000000000001 RDI: 0000000000000000 RBP: ffffc900027dfc90 R08: ffffffff82157977 R09: fffff520004fbf38 R10: dffffc0000000000 R11: fffff520004fbf38 R12: dffffc0000000000 R13: ffff88811315bc00 R14: ffff88811315bda8 R15: ffff88811315bb80 FS: 0000000000000000(0000) GS:ffff888135f00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00005565222e0578 CR3: 0000000026ef0000 CR4: 00000000000006f0 Call Trace: <TASK> ? __die_body+0x5f/0xb0 ? die+0x9e/0xc0 ? do_trap+0x15a/0x3a0 ? clear_inode+0x168/0x190 ? do_error_trap+0x1dc/0x2c0 ? clear_inode+0x168/0x190 ? __pfx_do_error_trap+0x10/0x10 ? report_bug+0x3cd/0x500 ? handle_invalid_op+0x34/0x40 ? clear_inode+0x168/0x190 ? exc_invalid_op+0x38/0x50 ? asm_exc_invalid_op+0x1a/0x20 ? clear_inode+0x57/0x190 ? clear_inode+0x167/0x190 ? clear_inode+0x168/0x190 ? clear_inode+0x167/0x190 jfs_evict_inode+0xb5/0x440 ? __pfx_jfs_evict_inode+0x10/0x10 evict+0x4ea/0x9b0 ? __pfx_evict+0x10/0x10 ? iput+0x713/0xa50 txUpdateMap+0x931/0xb10 ? __pfx_txUpdateMap+0x10/0x10 jfs_lazycommit+0x49a/0xb80 ? _raw_spin_unlock_irqrestore+0x8f/0x140 ? lockdep_hardirqs_on+0x99/0x150 ? __pfx_jfs_lazycommit+0x10/0x10 ? __pfx_default_wake_function+0x10/0x10 ? __kthread_parkme+0x169/0x1d0 ? __pfx_jfs_lazycommit+0x10/0x10 kthread+0x2f2/0x390 ? __pfx_jfs_lazycommit+0x10/0x10 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x4d/0x80 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK>
This happens when 'clear_inode()' makes an attempt to finalize an underlying JFS inode of unknown type. According to JFS layout description from
https://jfs.sourceforge.net/project/pub/jfslayout.pdf, inode types from 5 to 15 are reserved for future extensions and should not be encountered on a valid filesystem. So add an extra check for valid inode type in 'copy_from_dinode()'.
--- fs/jfs/jfs_imap.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
fs/jfs/jfs_imap.c +11 -2
@@ -3029,14 +3029,23 @@ static void duplicateIXtree(struct super* * RETURN VALUES: * 0 - success -* -ENOMEM - insufficient memory +* -EINVAL - unexpected inode type */ static int copy_from_dinode (struct dinode * dip,struct inode *ip) {struct jfs_inode_info *jfs_ip =JFS_IP (ip);struct jfs_sb_info *sbi =JFS_SBI (ip->i_sb); +int fileset =le32_to_cpu (dip->di_fileset); - jfs_ip->fileset =le32_to_cpu (dip->di_fileset); +switch (fileset) { +case AGGR_RESERVED_I :case AGGREGATE_I :case BMAP_I : +case LOG_I :case BADBLOCK_I :case FILESYSTEM_I : +break ; +default : +return -EINVAL ; + } + + jfs_ip->fileset = fileset; jfs_ip->mode2 =le32_to_cpu (dip->di_mode);jfs_set_inode_flags (ip);
Greg Kroah-Hartman
maintainerPATCH 49/253 comedi: comedi_test: Fix possible deletion of uninitialized timers
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit 1b98304c09a0192598d0767f1eb8c83d7e793091 upstream.
In waveform_common_attach(), the two timers &devpriv->ai_timer and &devpriv->ao_timer are initialized after the allocation of the device private data by comedi_alloc_devpriv() and the subdevices by comedi_alloc_subdevices(). The function may return with an error between those function calls. In that case, waveform_detach() will be called by the Comedi core to clean up. The check that waveform_detach() uses to decide whether to delete the timers is incorrect. It only checks that the device private data was allocated, but that does not guarantee that the timers were initialized. It also needs to check that the subdevices were allocated. Fix it.
--- drivers/comedi/drivers/comedi_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/comedi/drivers/comedi_test.c +1 -1
@@ -788,7 +788,7 @@ static void waveform_detach(struct comed {struct waveform_private *devpriv = dev->private; -if (devpriv) { +if (devpriv && dev->n_subdevices) {del_timer_sync (&devpriv->ai_timer);del_timer_sync (&devpriv->ao_timer); }
Greg Kroah-Hartman
maintainerPATCH 50/253 ALSA: hda/tegra: Add Tegra264 support
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mohan Kumar D <[email protected]>
commit 1c4193917eb3279788968639f24d72ffeebdec6b upstream.
Update HDA driver to support Tegra264 differences from legacy HDA, which includes: clocks/resets, always power on, and hardware-managed FPCI/IPFS initialization. The driver retrieves this chip-specific information from soc_data.
Stable-dep-of: e0a911ac8685 ("ALSA: hda: Add missing NVIDIA HDA codec IDs")
--- sound/pci/hda/hda_tegra.c | 51 +++++++++++++++++++++++++++++++++++++++------ sound/pci/hda/patch_hdmi.c | 1 2 files changed, 46 insertions(+), 6 deletions(-)
sound/pci/hda/hda_tegra.c +45 -6
@@ -71,6 +71,10 @@struct hda_tegra_soc {bool has_hda2codec_2x_reset;bool has_hda2hdmi; +bool has_hda2codec_2x; +bool input_stream; +bool always_on; +bool requires_init; };struct hda_tegra {
@@ -186,7 +190,9 @@ static int __maybe_unused hda_tegra_runtif (rc !=0 )return rc;if (chip->running) { -hda_tegra_init (hda); +if (hda->soc->requires_init) +hda_tegra_init (hda); +azx_init_chip (chip,1 );/* disable controller wake up event*/ azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
@@ -251,7 +257,8 @@ static int hda_tegra_init_chip(struct az bus->remap_addr = hda->regs +HDA_BAR0 ; bus->addr = res->start +HDA_BAR0 ; -hda_tegra_init (hda); +if (hda->soc->requires_init) +hda_tegra_init (hda);return 0 ; }
@@ -324,7 +331,7 @@ static int hda_tegra_first_init(struct a* starts with offset 0 which is wrong as HW register for output stream * offset starts with 4. */ -if (of_device_is_compatible (np,"nvidia,tegra234-hda" )) +if (!hda->soc->input_stream) chip->capture_streams =4 ; chip->playback_streams = (gcap >>12 ) &0x0f ;
@@ -420,7 +427,6 @@ static int hda_tegra_create(struct snd_c chip->driver_caps = driver_caps; chip->driver_type = driver_caps &0xff ; chip->dev_index =0 ; - chip->jackpoll_interval =msecs_to_jiffies (5000 );INIT_LIST_HEAD (&chip->pcm_list); chip->codec_probe_mask =-1 ;
@@ -437,7 +443,16 @@ static int hda_tegra_create(struct snd_c chip->bus.core.sync_write =0 ; chip->bus.core.needs_damn_long_delay =1 ; chip->bus.core.aligned_mmio =1 ; - chip->bus.jackpoll_in_suspend =1 ; + +/* +* HDA power domain and clocks are always on for Tegra264 and +* the jack detection logic would work always, so no need of +* jack polling mechanism running. +*/ +if (!hda->soc->always_on) { + chip->jackpoll_interval =msecs_to_jiffies (5000 ); + chip->bus.jackpoll_in_suspend =1 ; + } err =snd_device_new (card,SNDRV_DEV_LOWLEVEL , chip, &ops);if (err <0 ) {
@@ -451,22 +466,44 @@ static int hda_tegra_create(struct snd_cstatic const struct hda_tegra_soc tegra30_data = { .has_hda2codec_2x_reset = true, .has_hda2hdmi = true, + .has_hda2codec_2x = true, + .input_stream = true, + .always_on = false, + .requires_init = true, };static const struct hda_tegra_soc tegra194_data = { .has_hda2codec_2x_reset = false, .has_hda2hdmi = true, + .has_hda2codec_2x = true, + .input_stream = true, + .always_on = false, + .requires_init = true, };static const struct hda_tegra_soc tegra234_data = { .has_hda2codec_2x_reset = true, .has_hda2hdmi = false, + .has_hda2codec_2x = true, + .input_stream = false, + .always_on = false, + .requires_init = true, +}; + +static const struct hda_tegra_soc tegra264_data = { + .has_hda2codec_2x_reset = true, + .has_hda2hdmi = false, + .has_hda2codec_2x = false, + .input_stream = false, + .always_on = true, + .requires_init = false, };static const struct of_device_id hda_tegra_match[] = { { .compatible ="nvidia,tegra30-hda" , .data = &tegra30_data }, { .compatible ="nvidia,tegra194-hda" , .data = &tegra194_data }, { .compatible ="nvidia,tegra234-hda" , .data = &tegra234_data }, + { .compatible ="nvidia,tegra264-hda" , .data = &tegra264_data }, {}, };MODULE_DEVICE_TABLE (of, hda_tegra_match);
@@ -521,7 +558,9 @@ static int hda_tegra_probe(struct platfo hda->clocks[hda->nclocks++].id ="hda" ;if (hda->soc->has_hda2hdmi) hda->clocks[hda->nclocks++].id ="hda2hdmi" ; - hda->clocks[hda->nclocks++].id ="hda2codec_2x" ; + +if (hda->soc->has_hda2codec_2x) + hda->clocks[hda->nclocks++].id ="hda2codec_2x" ; err =devm_clk_bulk_get (&pdev->dev, hda->nclocks, hda->clocks);if (err <0 )
sound/pci/hda/patch_hdmi.c +1 -0
@@ -4556,6 +4556,7 @@ HDA_CODEC_ENTRY(0x10de002e, "Tegra186 HDHDA_CODEC_ENTRY (0x10de002f ,"Tegra194 HDMI/DP2" , patch_tegra_hdmi),HDA_CODEC_ENTRY (0x10de0030 ,"Tegra194 HDMI/DP3" , patch_tegra_hdmi),HDA_CODEC_ENTRY (0x10de0031 ,"Tegra234 HDMI/DP" , patch_tegra234_hdmi), +HDA_CODEC_ENTRY (0x10de0034 ,"Tegra264 HDMI/DP" , patch_tegra234_hdmi),HDA_CODEC_ENTRY (0x10de0040 ,"GPU 40 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de0041 ,"GPU 41 HDMI/DP" , patch_nvhdmi), HDA_CODEC_ENTRY(0x10de0042, "GPU 42 HDMI/DP", patch_nvhdmi),
Greg Kroah-Hartman
maintainerPATCH 51/253 ALSA: hda: Add missing NVIDIA HDA codec IDs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Dadap <[email protected]>
commit e0a911ac86857a73182edde9e50d9b4b949b7f01 upstream.
Add codec IDs for several NVIDIA products with HDA controllers to the snd_hda_id_hdmi[] patch table.
--- sound/pci/hda/patch_hdmi.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
sound/pci/hda/patch_hdmi.c +19 -0
@@ -4556,7 +4556,9 @@ HDA_CODEC_ENTRY(0x10de002e, "Tegra186 HDHDA_CODEC_ENTRY (0x10de002f ,"Tegra194 HDMI/DP2" , patch_tegra_hdmi),HDA_CODEC_ENTRY (0x10de0030 ,"Tegra194 HDMI/DP3" , patch_tegra_hdmi),HDA_CODEC_ENTRY (0x10de0031 ,"Tegra234 HDMI/DP" , patch_tegra234_hdmi), +HDA_CODEC_ENTRY (0x10de0033 ,"SoC 33 HDMI/DP" , patch_tegra234_hdmi),HDA_CODEC_ENTRY (0x10de0034 ,"Tegra264 HDMI/DP" , patch_tegra234_hdmi), +HDA_CODEC_ENTRY (0x10de0035 ,"SoC 35 HDMI/DP" , patch_tegra234_hdmi),HDA_CODEC_ENTRY (0x10de0040 ,"GPU 40 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de0041 ,"GPU 41 HDMI/DP" , patch_nvhdmi), HDA_CODEC_ENTRY(0x10de0042, "GPU 42 HDMI/DP", patch_nvhdmi),
@@ -4595,15 +4597,32 @@ HDA_CODEC_ENTRY(0x10de0097, "GPU 97 HDMIHDA_CODEC_ENTRY (0x10de0098 ,"GPU 98 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de0099 ,"GPU 99 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de009a ,"GPU 9a HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de009b ,"GPU 9b HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de009c ,"GPU 9c HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de009d ,"GPU 9d HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de009e ,"GPU 9e HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de009f ,"GPU 9f HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de00a0 ,"GPU a0 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00a1 ,"GPU a1 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de00a3 ,"GPU a3 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de00a4 ,"GPU a4 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de00a5 ,"GPU a5 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de00a6 ,"GPU a6 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de00a7 ,"GPU a7 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00a8 ,"GPU a8 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00a9 ,"GPU a9 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00aa ,"GPU aa HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00ab ,"GPU ab HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00ad ,"GPU ad HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00ae ,"GPU ae HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00af ,"GPU af HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00b0 ,"GPU b0 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00b1 ,"GPU b1 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00c0 ,"GPU c0 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00c1 ,"GPU c1 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00c3 ,"GPU c3 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00c4 ,"GPU c4 HDMI/DP" , patch_nvhdmi), +HDA_CODEC_ENTRY (0x10de00c5 ,"GPU c5 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de8001 ,"MCP73 HDMI" , patch_nvhdmi_2ch),HDA_CODEC_ENTRY (0x10de8067 ,"MCP67/68 HDMI" , patch_nvhdmi_2ch), HDA_CODEC_ENTRY(0x67663d82, "Arise 82 HDMI/DP", patch_gf_hdmi),
Greg Kroah-Hartman
maintainerPATCH 52/253 drm/i915/dp: Fix 2.7 Gbps DP_LINK_BW value on g4x
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ville Syrjälä <[email protected]>
commit 9e0c433d0c05fde284025264b89eaa4ad59f0a3e upstream.
On g4x we currently use the 96MHz non-SSC refclk, which can't actually generate an exact 2.7 Gbps link rate. In practice we end up with 2.688 Gbps which seems to be close enough to actually work, but link training is currently failing due to miscalculating the DP_LINK_BW value (we calcualte it directly from port_clock which reflects the actual PLL outpout frequency).
Ideas how to fix this:
- nudge port_clock back up to 270000 during PLL computation/readout
- track port_clock and the nominal link rate separately so they might differ a bit
- switch to the 100MHz refclk, but that one should be SSC so perhaps not something we want
While we ponder about a better solution apply some band aid to the immediate issue of miscalculated DP_LINK_BW value. With this I can again use 2.7 Gbps link rate on g4x.
--- drivers/gpu/drm/i915/display/intel_dp.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/i915/display/intel_dp.c +6 -0
@@ -1139,6 +1139,12 @@ int intel_dp_rate_select(struct intel_dpvoid intel_dp_compute_rate (struct intel_dp *intel_dp,int port_clock,u8 *link_bw,u8 *rate_select) { +struct drm_i915_private *i915 =dp_to_i915 (intel_dp); + +/* FIXME g4x can't generate an exact 2.7GHz with the 96MHz non-SSC refclk */ +if (IS_G4X (i915) && port_clock ==268800 ) + port_clock =270000 ; +/* eDP 1.4 rate select method. */ if (intel_dp->use_rate_select) { *link_bw =0 ;
Greg Kroah-Hartman
maintainerPATCH 53/253 mm: khugepaged: fix call hpage_collapse_scan_file() for anonymous vma
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liu Shixin <[email protected]>
commit f1897f2f08b28ae59476d8b73374b08f856973af upstream.
syzkaller reported such a BUG_ON():
------------[ cut here ]------------ kernel BUG at mm/khugepaged.c:1835! Internal error: Oops - BUG: 00000000f2000800 [#1] SMP ... CPU: 6 UID: 0 PID: 8009 Comm: syz.15.106 Kdump: loaded Tainted: G W 6.13.0-rc6 #22 Tainted: [W]=WARN Hardware name: QEMU KVM Virtual Machine, BIOS 0.0.0 02/06/2015 pstate: 00400005 (nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : collapse_file+0xa44/0x1400 lr : collapse_file+0x88/0x1400 sp : ffff80008afe3a60 ... Call trace: collapse_file+0xa44/0x1400 (P) hpage_collapse_scan_file+0x278/0x400 madvise_collapse+0x1bc/0x678 madvise_vma_behavior+0x32c/0x448 madvise_walk_vmas.constprop.0+0xbc/0x140 do_madvise.part.0+0xdc/0x2c8 __arm64_sys_madvise+0x68/0x88 invoke_syscall+0x50/0x120 el0_svc_common.constprop.0+0xc8/0xf0 do_el0_svc+0x24/0x38 el0_svc+0x34/0x128 el0t_64_sync_handler+0xc8/0xd0 el0t_64_sync+0x190/0x198
This indicates that the pgoff is unaligned. After analysis, I confirm the vma is mapped to /dev/zero. Such a vma certainly has vm_file, but it is set to anonymous by mmap_zero(). So even if it's mmapped by 2m-unaligned, it can pass the check in thp_vma_allowable_order() as it is an anonymous-mmap, but then be collapsed as a file-mmap.
It seems the problem has existed for a long time, but actually, since we have khugepaged_max_ptes_none check before, we will skip collapse it as it is /dev/zero and so has no present page. But commit d8ea7cc8547c limit the check for only khugepaged, so the BUG_ON() can be triggered by madvise_collapse().
Add vma_is_anonymous() check to make such vma be processed by hpage_collapse_scan_pmd().
--- mm/khugepaged.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/khugepaged.c +2 -2
@@ -2345,7 +2345,7 @@ skip:VM_BUG_ON (khugepaged_scan.address < hstart || khugepaged_scan.address +HPAGE_PMD_SIZE > hend); -if (IS_ENABLED (CONFIG_SHMEM ) && vma->vm_file) { +if (IS_ENABLED (CONFIG_SHMEM ) && !vma_is_anonymous (vma)) {struct file *file =get_file (vma->vm_file);pgoff_t pgoff =linear_page_index (vma, khugepaged_scan.address);
@@ -2694,7 +2694,7 @@ int madvise_collapse(struct vm_area_strummap_assert_locked (mm);memset (cc->node_load,0 ,sizeof (cc->node_load));nodes_clear (cc->alloc_nmask); -if (IS_ENABLED (CONFIG_SHMEM ) && vma->vm_file) { +if (IS_ENABLED (CONFIG_SHMEM ) && !vma_is_anonymous (vma)) {struct file *file =get_file (vma->vm_file);pgoff_t pgoff =linear_page_index (vma, addr);
Greg Kroah-Hartman
maintainerPATCH 54/253 erofs: get rid of debug_one_dentry()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
commit e324eaa9790614577c93e819651e0a83963dac79 upstream.
Since erofsdump is available, no need to keep this debugging functionality at all.
Also drop a useless comment since it's the VFS behavior.
--- fs/erofs/dir.c | 17 ----------------- 1 file changed, 17 deletions(-)
fs/erofs/dir.c +0 -17
@@ -6,21 +6,6 @@*/ #include "internal.h" -static void debug_one_dentry (unsigned char d_type,const char *de_name, -unsigned int de_namelen) -{ -#ifdef CONFIG_EROFS_FS_DEBUG -/* since the on-disk name could not have the trailing '\0' */ -unsigned char dbg_namebuf[EROFS_NAME_LEN +1 ]; - -memcpy (dbg_namebuf, de_name, de_namelen); - dbg_namebuf[de_namelen] ='\0' ; - -erofs_dbg ("found dirent %s de_len %u d_type %d" , dbg_namebuf, - de_namelen, d_type); -#endif -} -static int erofs_fill_dentries (struct inode *dir,struct dir_context *ctx,void *dentry_blk,struct erofs_dirent *de,unsigned int nameoff,unsigned int maxsize)
@@ -52,10 +37,8 @@ static int erofs_fill_dentries(struct inreturn -EFSCORRUPTED ; } -debug_one_dentry (d_type, de_name, de_namelen);if (!dir_emit (ctx, de_name, de_namelen,le64_to_cpu (de->nid), d_type)) -/* stopped by some reason */ return 1 ; ++de; ctx->pos +=sizeof (struct erofs_dirent );
Greg Kroah-Hartman
maintainerPATCH 55/253 erofs: sunset erofs_dbg()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
commit 10656f9ca60ed85f4cfc06bcbe1f240ee310fa8c upstream.
Such debug messages are rarely used now. Let's get rid of these, and revert locally if they are needed for debugging.
--- fs/erofs/inode.c | 3 --- fs/erofs/internal.h | 2 -- fs/erofs/namei.c | 9 +++------ fs/erofs/zdata.c | 5 ----- fs/erofs/zmap.c | 3 --- 5 files changed, 3 insertions(+), 19 deletions(-)
fs/erofs/inode.c +0 -3
@@ -26,9 +26,6 @@ static void *erofs_read_inode(struct ero blkaddr =erofs_blknr (sb, inode_loc); *ofs =erofs_blkoff (sb, inode_loc); -erofs_dbg ("%s, reading inode nid %llu at %u of blkaddr %u" , - __func__, vi->nid, *ofs, blkaddr); - kaddr =erofs_read_metabuf (buf, sb, blkaddr,EROFS_KMAP );if (IS_ERR (kaddr)) { erofs_err(sb, "failed to get inode (nid: %llu) page, err %ld",
fs/erofs/internal.h +0 -2
@@ -32,10 +32,8 @@ __printf(3, 4) void _erofs_info(struct s#define erofs_info (sb, fmt, ...) \ _erofs_info(sb, __func__, fmt "\n", ##__VA_ARGS__)#ifdef CONFIG_EROFS_FS_DEBUG -#define erofs_dbg (x, ...) pr_debug(x "\n", ##__VA_ARGS__)#define DBG_BUGON BUG_ON#else -#define erofs_dbg (x, ...) ((void)0)#define DBG_BUGON (x) ((void)(x))#endif /* !CONFIG_EROFS_FS_DEBUG */
fs/erofs/namei.c +3 -6
@@ -203,16 +203,13 @@ static struct dentry *erofs_lookup(struc err =erofs_namei (dir, &dentry->d_name, &nid, &d_type); -if (err == -ENOENT ) { +if (err == -ENOENT )/* negative dentry */ inode =NULL ; - }else if (err) { +else if (err) inode =ERR_PTR (err); - }else { -erofs_dbg ("%s, %pd (nid %llu) found, d_type %u" , __func__, - dentry, nid, d_type); +else inode =erofs_iget (dir->i_sb, nid); - }return d_splice_alias (inode, dentry); }
fs/erofs/zdata.c +0 -5
@@ -818,8 +818,6 @@ repeat:if (offset + cur < map->m_la || offset + cur >= map->m_la + map->m_llen) { -erofs_dbg ("out-of-range map @ pos %llu" , offset + cur); -if (z_erofs_collector_end (fe)) fe->backmost = false; map->m_la = offset + cur;
@@ -935,9 +933,6 @@ out:if (err)z_erofs_page_mark_eio (page);z_erofs_onlinepage_endio (page); - -erofs_dbg ("%s, finish page: %pK spiltted: %u map->m_llen %llu" , - __func__, page, spiltted, map->m_llen);return err; }
fs/erofs/zmap.c +0 -3
@@ -603,9 +603,6 @@ static int z_erofs_do_map_blocks(struct unmap_out:erofs_unmap_metabuf (&m.map->buf); -erofs_dbg ("%s, m_la %llu m_pa %llu m_llen %llu m_plen %llu m_flags 0%o" , - __func__, map->m_la, map->m_pa, - map->m_llen, map->m_plen, map->m_flags);return err; }
Greg Kroah-Hartman
maintainerPATCH 56/253 erofs: drop z_erofs_page_mark_eio()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
commit 9a05c6a8bc26138d34e87b39e6a815603bc2a66c upstream.
It can be folded into z_erofs_onlinepage_endio() to simplify the code.
--- fs/erofs/zdata.c | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-)
fs/erofs/zdata.c +9 -20
@@ -144,22 +144,17 @@ static inline void z_erofs_onlinepage_spatomic_inc ((atomic_t *)&page->private); } -static inline void z_erofs_page_mark_eio (struct page *page) +static void z_erofs_onlinepage_endio (struct page *page,int err) { -int orig; +int orig, v; + +DBG_BUGON (!PagePrivate (page));do { orig =atomic_read ((atomic_t *)&page->private); - }while (atomic_cmpxchg ((atomic_t *)&page->private, orig, - orig |Z_EROFS_PAGE_EIO ) != orig); -} - -static inline void z_erofs_onlinepage_endio (struct page *page) -{ -unsigned int v; + v = (orig -1 ) | (err ?Z_EROFS_PAGE_EIO :0 ); + }while (atomic_cmpxchg ((atomic_t *)&page->private, orig, v) != orig); -DBG_BUGON (!PagePrivate (page)); - v =atomic_dec_return ((atomic_t *)&page->private);if (!(v & ~Z_EROFS_PAGE_EIO )) {set_page_private (page,0 );ClearPagePrivate (page);
@@ -930,9 +925,7 @@ next_part: goto repeat; out: -if (err) -z_erofs_page_mark_eio (page); -z_erofs_onlinepage_endio (page); +z_erofs_onlinepage_endio (page, err);return err; }
@@ -1035,9 +1028,7 @@ static void z_erofs_fill_other_copies(st cur += len; }kunmap_local (dst); -if (err) -z_erofs_page_mark_eio (bvi->bvec.page); -z_erofs_onlinepage_endio (bvi->bvec.page); +z_erofs_onlinepage_endio (bvi->bvec.page, err);list_del (p);kfree (bvi); }
@@ -1205,9 +1196,7 @@ out:/* recycle all individual short-lived pages */ if (z_erofs_put_shortlivedpage (be->pagepool, page))continue ; -if (err) -z_erofs_page_mark_eio (page); -z_erofs_onlinepage_endio (page); +z_erofs_onlinepage_endio (page, err); }if (be->decompressed_pages != be->onstack_pages)
Greg Kroah-Hartman
maintainerPATCH 57/253 erofs: simplify z_erofs_transform_plain()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
commit c5539762f32e97c5e16215fa1336e32095b8b0fd upstream.
Use memcpy_to_page() instead of open-coding them.
In addition, add a missing flush_dcache_page() even though almost all modern architectures clear PG_dcache_clean flag for new file cache pages so that it doesn't change anything in practice.
--- fs/erofs/decompressor.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
fs/erofs/decompressor.c +8 -11
@@ -323,7 +323,7 @@ static int z_erofs_transform_plain(strucconst unsigned int lefthalf = rq->outputsize - righthalf;const unsigned int interlaced_offset = rq->alg ==Z_EROFS_COMPRESSION_SHIFTED ?0 : rq->pageofs_out; -unsigned char *src, *dst; +u8 *src;if (outpages >2 && rq->alg ==Z_EROFS_COMPRESSION_SHIFTED ) {DBG_BUGON (1 );
@@ -336,22 +336,19 @@ static int z_erofs_transform_plain(struc } src =kmap_local_page (rq->in[inpages -1 ]) + rq->pageofs_in; -if (rq->out[0 ]) { - dst =kmap_local_page (rq->out[0 ]); -memcpy (dst + rq->pageofs_out, src + interlaced_offset, - righthalf); -kunmap_local (dst); - } +if (rq->out[0 ]) +memcpy_to_page (rq->out[0 ], rq->pageofs_out, + src + interlaced_offset, righthalf);if (outpages > inpages) {DBG_BUGON (!rq->out[outpages -1 ]);if (rq->out[outpages -1 ] != rq->in[inpages -1 ]) { - dst =kmap_local_page (rq->out[outpages -1 ]); -memcpy (dst, interlaced_offset ? src : - (src + righthalf), lefthalf); -kunmap_local (dst); +memcpy_to_page (rq->out[outpages -1 ],0 , src + + (interlaced_offset ?0 : righthalf), + lefthalf); }else if (!interlaced_offset) {memmove (src, src + righthalf, lefthalf); +flush_dcache_page (rq->in[inpages -1 ]); } }kunmap_local (src);
Greg Kroah-Hartman
maintainerPATCH 58/253 erofs: address D-cache aliasing
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
commit 27917e8194f91dffd8b4825350c63cb68e98ce58 upstream.
Flush the D-cache before unlocking folios for compressed inodes, as they are dirtied during decompression.
Avoid calling flush_dcache_folio() on every CPU write, since it's more like playing whack-a-mole without real benefit.
It has no impact on x86 and arm64/risc-v: on x86, flush_dcache_folio() is a no-op, and on arm64/risc-v, PG_dcache_clean (PG_arch_1) is clear for new page cache folios. However, certain ARM boards are affected, as reported.
--- fs/erofs/decompressor.c | 6 ++---- fs/erofs/zdata.c | 32 +++++++++++++++++++------------- 2 files changed, 21 insertions(+), 17 deletions(-)
fs/erofs/decompressor.c +2 -4
@@ -342,14 +342,12 @@ static int z_erofs_transform_plain(strucif (outpages > inpages) {DBG_BUGON (!rq->out[outpages -1 ]); -if (rq->out[outpages -1 ] != rq->in[inpages -1 ]) { +if (rq->out[outpages -1 ] != rq->in[inpages -1 ])memcpy_to_page (rq->out[outpages -1 ],0 , src + (interlaced_offset ?0 : righthalf), lefthalf); - }else if (!interlaced_offset) { +else if (!interlaced_offset)memmove (src, src + righthalf, lefthalf); -flush_dcache_page (rq->in[inpages -1 ]); - } }kunmap_local (src);return 0 ;
fs/erofs/zdata.c +19 -13
@@ -123,9 +123,11 @@ static inline unsigned int z_erofs_pclus/* * bit 30: I/O error occurred on this page +* bit 29: CPU has dirty data in D-cache (needs aliasing handling); * bit 0 - 29: remaining parts to complete this page */ -#define Z_EROFS_PAGE_EIO (1 << 30) +#define Z_EROFS_ONLINEPAGE_EIO 30 +#define Z_EROFS_ONLINEPAGE_DIRTY 29static inline void z_erofs_onlinepage_init (struct page *page) {
@@ -144,7 +146,7 @@ static inline void z_erofs_onlinepage_spatomic_inc ((atomic_t *)&page->private); } -static void z_erofs_onlinepage_endio (struct page *page,int err) +static void z_erofs_onlinepage_end (struct page *page,int err,bool dirty) {int orig, v;
@@ -152,16 +154,20 @@ static void z_erofs_onlinepage_endio(strdo { orig =atomic_read ((atomic_t *)&page->private); - v = (orig -1 ) | (err ?Z_EROFS_PAGE_EIO :0 ); +DBG_BUGON (orig <=0 ); + v = dirty <<Z_EROFS_ONLINEPAGE_DIRTY ; + v |= (orig -1 ) | (!!err <<Z_EROFS_ONLINEPAGE_EIO ); }while (atomic_cmpxchg ((atomic_t *)&page->private, orig, v) != orig); -if (!(v & ~Z_EROFS_PAGE_EIO )) { -set_page_private (page,0 ); -ClearPagePrivate (page); -if (!(v &Z_EROFS_PAGE_EIO )) -SetPageUptodate (page); -unlock_page (page); - } +if (v & (BIT (Z_EROFS_ONLINEPAGE_DIRTY ) -1 )) +return ; +set_page_private (page,0 ); +ClearPagePrivate (page); +if (v &BIT (Z_EROFS_ONLINEPAGE_DIRTY )) +flush_dcache_page (page); +if (!(v &BIT (Z_EROFS_ONLINEPAGE_EIO ))) +SetPageUptodate (page); +unlock_page (page); }#define Z_EROFS_ONSTACK_PAGES 32
@@ -925,7 +931,7 @@ next_part: goto repeat; out: -z_erofs_onlinepage_endio (page, err); +z_erofs_onlinepage_end (page, err, false);return err; }
@@ -1028,7 +1034,7 @@ static void z_erofs_fill_other_copies(st cur += len; }kunmap_local (dst); -z_erofs_onlinepage_endio (bvi->bvec.page, err); +z_erofs_onlinepage_end (bvi->bvec.page, err, true);list_del (p);kfree (bvi); }
@@ -1196,7 +1202,7 @@ out:/* recycle all individual short-lived pages */ if (z_erofs_put_shortlivedpage (be->pagepool, page))continue ; -z_erofs_onlinepage_endio (page, err); +z_erofs_onlinepage_end (page, err, true); }if (be->decompressed_pages != be->onstack_pages)
Greg Kroah-Hartman
maintainerPATCH 59/253 usb: chipidea: add USB PHY event
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Yang <[email protected]>
[ Upstream commit b7a62611fab72e585c729a7fcf666aa9c4144214 ]
Add USB PHY event for below situation:
- usb role changed
- vbus connect
- vbus disconnect
- gadget driver is enumerated
USB PHY driver can get the last event after above situation occurs and deal with different situations.
--- drivers/usb/chipidea/ci.h | 18 ++++++++++++++++-- drivers/usb/chipidea/udc.c | 10 ++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-)
drivers/usb/chipidea/ci.h +16 -2
@@ -278,8 +278,19 @@ static inline int ci_role_start(struct ci_hdrc *ci, enum ci_role role)return -ENXIO ; ret = ci->roles[role]->start (ci); -if (!ret) - ci->role = role; +if (ret) +return ret; + + ci->role = role; + +if (ci->usb_phy) { +if (role ==CI_ROLE_HOST ) +usb_phy_set_event (ci->usb_phy,USB_EVENT_ID ); +else +/* in device mode but vbus is invalid*/ +usb_phy_set_event (ci->usb_phy,USB_EVENT_NONE ); + } +return ret; }
@@ -293,6 +304,9 @@ static inline void ci_role_stop(struct ci_hdrc *ci) ci->role =CI_ROLE_END ; ci->roles[role]->stop (ci); + +if (ci->usb_phy) +usb_phy_set_event (ci->usb_phy,USB_EVENT_NONE ); }static inline enum usb_role ci_role_to_usb_role (struct ci_hdrc *ci)
drivers/usb/chipidea/udc.c +10 -0
@@ -1724,6 +1724,13 @@ static int ci_udc_vbus_session(struct usb_gadget *_gadget, int is_active) ret = ci->platdata->notify_event (ci,CI_HDRC_CONTROLLER_VBUS_EVENT ); +if (ci->usb_phy) { +if (is_active) +usb_phy_set_event (ci->usb_phy,USB_EVENT_VBUS ); +else +usb_phy_set_event (ci->usb_phy,USB_EVENT_NONE ); + } +if (ci->driver)ci_hdrc_gadget_connect (_gadget, is_active);
@@ -2040,6 +2047,9 @@ static irqreturn_t udc_irq(struct ci_hdrc *ci)if (USBi_PCI & intr) { ci->gadget.speed =hw_port_is_high_speed (ci) ?USB_SPEED_HIGH :USB_SPEED_FULL ; +if (ci->usb_phy) +usb_phy_set_event (ci->usb_phy, +USB_EVENT_ENUMERATED );if (ci->suspended) {if (ci->driver->resume) {spin_unlock (&ci->lock);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 60/253 usb: phy: mxs: disconnect line when USB charger is attached
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Yang <[email protected]>
[ Upstream commit 87ed257acb0934e08644568df6495988631afd4c ]
For mxs PHY, if there is a vbus but the bus is not enumerated, we need to force the dp/dm as SE0 from the controller side. If not, there is possible USB wakeup due to unstable dp/dm, since there is possible no pull on dp/dm, such as there is a USB charger on the port.
--- drivers/usb/phy/phy-mxs-usb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/phy/phy-mxs-usb.c +3 -1
@@ -394,6 +394,7 @@ static bool mxs_phy_is_otg_host(struct mxs_phy *mxs_phy)static void mxs_phy_disconnect_line (struct mxs_phy *mxs_phy,bool on) {bool vbus_is_on = false; +enum usb_phy_events last_event = mxs_phy->phy.last_event;/* If the SoCs don't need to disconnect line without vbus, quit */ if (!(mxs_phy->data->flags &MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS ))
@@ -405,7 +406,8 @@ static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on) vbus_is_on =mxs_phy_get_vbus_status (mxs_phy); -if (on && !vbus_is_on && !mxs_phy_is_otg_host (mxs_phy)) +if (on && ((!vbus_is_on && !mxs_phy_is_otg_host (mxs_phy)) + || (last_event ==USB_EVENT_VBUS )))__mxs_phy_disconnect_line (mxs_phy, true);else __mxs_phy_disconnect_line (mxs_phy, false);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 61/253 ethernet: intel: fix building with large NR_CPUS
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 24171a5a4a952c26568ff0d2a0bc8c4708a95e1d ]
With large values of CONFIG_NR_CPUS, three Intel ethernet drivers fail to compile like:
In function ‘i40e_free_q_vector’,
inlined from ‘i40e_vsi_alloc_q_vectors’ at drivers/net/ethernet/intel/i40e/i40e_main.c:12112:3:
571 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)include/linux/rcupdate.h:1084:17: note: in expansion of macro ‘BUILD_BUG_ON’
1084 | BUILD_BUG_ON(offsetof(typeof(*(ptr)), rhf) >= 4096); \drivers/net/ethernet/intel/i40e/i40e_main.c:5113:9: note: in expansion of macro ‘kfree_rcu’
5113 | kfree_rcu(q_vector, rcu);
| ^~~~~~~~~The problem is that the 'rcu' member in 'q_vector' is too far from the start of the structure. Move this member before the CPU mask instead, in all three drivers.
--- drivers/net/ethernet/intel/fm10k/fm10k.h | 3 ++- drivers/net/ethernet/intel/i40e/i40e.h | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe.h | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/fm10k/fm10k.h +2 -1
@@ -189,13 +189,14 @@ struct fm10k_q_vector {struct fm10k_ring_container rx, tx;struct napi_struct napi; +struct rcu_head rcu;/* to avoid race with update stats on free */ +cpumask_t affinity_mask;char name[IFNAMSIZ +9 ];#ifdef CONFIG_DEBUG_FS struct dentry *dbg_q_vector;#endif /* CONFIG_DEBUG_FS */ -struct rcu_head rcu;/* to avoid race with update stats on free */ /* for dynamic allocation of rings associated with this q_vector */ struct fm10k_ring ring[]____cacheline_internodealigned_in_smp ;
drivers/net/ethernet/intel/i40e/i40e.h +1 -1
@@ -980,6 +980,7 @@ struct i40e_q_vector {u16 reg_idx;/* register index of the interrupt */ struct napi_struct napi; +struct rcu_head rcu;/* to avoid race with update stats on free */ struct i40e_ring_container rx;struct i40e_ring_container tx;
@@ -990,7 +991,6 @@ struct i40e_q_vector {cpumask_t affinity_mask;struct irq_affinity_notify affinity_notify; -struct rcu_head rcu;/* to avoid race with update stats on free */ char name[I40E_INT_NAME_STR_LEN ];bool arm_wb_state;bool in_busy_poll;
drivers/net/ethernet/intel/ixgbe/ixgbe.h +2 -1
@@ -498,9 +498,10 @@ struct ixgbe_q_vector {struct ixgbe_ring_container rx, tx;struct napi_struct napi; +struct rcu_head rcu;/* to avoid race with update stats on free */ +cpumask_t affinity_mask;int numa_node; -struct rcu_head rcu;/* to avoid race with update stats on free */ char name[IFNAMSIZ +9 ];/* for dynamic allocation of rings associated with this q_vector */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 62/253 ASoC: amd: yc: Add DMI entries to support HP 15-fb1xxx
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Queler <[email protected]>
[ Upstream commit 949ddec3728f3a793a13c1c9003028b9b159aefc ]
This model requires an additional detection quirk to enable the internal microphone.
--- sound/soc/amd/yc/acp6x-mach.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/soc/amd/yc/acp6x-mach.c +7 -0
@@ -458,6 +458,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "OMEN by HP Gaming Laptop 16z-n000"), } }, + { + .driver_data = &acp6x_card, + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"HP" ), + DMI_MATCH(DMI_PRODUCT_NAME, "Victus by HP Gaming Laptop 15-fb1xxx"), + } + }, { .driver_data = &acp6x_card, .matches = {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 63/253 ASoC: Intel: fix SND_SOC_SOF dependencies
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit e837b59f8b411b5baf5e3de7a5aea10b1c545a63 ]
It is currently possible to configure a kernel with all Intel SoC configs as loadable modules, but the board config as built-in. This causes a link failure in the reference to the snd_soc_sof.ko module:
x86_64-linux-ld: sound/soc/intel/boards/sof_rt5682.o: in function `sof_rt5682_hw_params':
sof_rt5682.c:(.text+0x1f9): undefined reference to `sof_dai_get_mclk'
x86_64-linux-ld: sof_rt5682.c:(.text+0x234): undefined reference to `sof_dai_get_bclk'
x86_64-linux-ld: sound/soc/intel/boards/sof_rt5682.o: in function `sof_rt5682_codec_init':
sof_rt5682.c:(.text+0x3e0): undefined reference to `sof_dai_get_mclk'
x86_64-linux-ld: sound/soc/intel/boards/sof_cs42l42.o: in function `sof_cs42l42_hw_params':
sof_cs42l42.c:(.text+0x2a): undefined reference to `sof_dai_get_bclk'
x86_64-linux-ld: sound/soc/intel/boards/sof_nau8825.o: in function `sof_nau8825_hw_params':
sof_nau8825.c:(.text+0x7f): undefined reference to `sof_dai_get_bclk'
x86_64-linux-ld: sound/soc/intel/boards/sof_da7219.o: in function `da7219_codec_init':
sof_da7219.c:(.text+0xbf): undefined reference to `sof_dai_get_mclk'
x86_64-linux-ld: sound/soc/intel/boards/sof_maxim_common.o: in function `max_98373_hw_params':
sof_maxim_common.c:(.text+0x6f9): undefined reference to `sof_dai_get_tdm_slots'
x86_64-linux-ld: sound/soc/intel/boards/sof_realtek_common.o: in function `rt1015_hw_params':
sof_realtek_common.c:(.text+0x54c): undefined reference to `sof_dai_get_bclk'
x86_64-linux-ld: sound/soc/intel/boards/sof_realtek_common.o: in function `rt1308_hw_params':
sof_realtek_common.c:(.text+0x702): undefined reference to `sof_dai_get_mclk'
x86_64-linux-ld: sound/soc/intel/boards/sof_cirrus_common.o: in function `cs35l41_hw_params':
sof_cirrus_common.c:(.text+0x2f): undefined reference to `sof_dai_get_bclk'
Add an optional dependency on SND_SOC_SOF_INTEL_COMMON, to ensure that whenever the SOF support is in a loadable module, none of the board code can be built-in.
This may be be a little heavy-handed, but I also don't see a reason why one would want the boards to be built-in but not the SoC, so it shouldn't actually cause any usability problems.
--- sound/soc/intel/boards/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/intel/boards/Kconfig +1 -1
@@ -11,7 +11,7 @@ menuconfig SND_SOC_INTEL_MACH kernel: saying N will just cause the configurator to skip all the questions about Intel ASoC machine drivers. -if SND_SOC_INTEL_MACH +if SND_SOC_INTEL_MACH && (SND_SOC_SOF_INTEL_COMMON || !SND_SOC_SOF_INTEL_COMMON) config SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES bool "Use more user friendly long card names"
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 64/253 fs_context: fix parameter name in infofc() macro
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: RubenKelevra <[email protected]>
[ Upstream commit ffaf1bf3737f706e4e9be876de4bc3c8fc578091 ]
The macro takes a parameter called "p" but references "fc" internally. This happens to compile as long as callers pass a variable named fc, but breaks otherwise. Rename the first parameter to “fc” to match the usage and to be consistent with warnfc() / errorfc().
--- include/linux/fs_context.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/fs_context.h +1 -1
@@ -209,7 +209,7 @@ void logfc(struct fc_log *log, const char *prefix, char level, const char *fmt,*/ #define infof (fc, fmt, ...) __logfc(fc, 'i', fmt, ## __VA_ARGS__)#define info_plog (p, fmt, ...) __plog(p, 'i', fmt, ## __VA_ARGS__) -#define infofc (p, fmt, ...) __plog((&(fc)->log), 'i', fmt, ## __VA_ARGS__) +#define infofc (fc, fmt, ...) __plog((&(fc)->log), 'i', fmt, ## __VA_ARGS__)/** * warnf - Store supplementary warning message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 65/253 ublk: use vmalloc for ublk_devices __queues
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Caleb Sander Mateos <[email protected]>
[ Upstream commit c2f48453b7806d41f5a3270f206a5cd5640ed207 ]
struct ublk_device's __queues points to an allocation with up to UBLK_MAX_NR_QUEUES (4096) queues, each of which have:
- struct ublk_queue (48 bytes)
- Tail array of up to UBLK_MAX_QUEUE_DEPTH (4096) struct ublk_io's, 32 bytes each
This means the full allocation can exceed 512 MB, which may well be impossible to service with contiguous physical pages. Switch to kvcalloc() and kvfree(), since there is no need for physically contiguous memory.
--- drivers/block/ublk_drv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/block/ublk_drv.c +2 -2
@@ -1391,7 +1391,7 @@ static void ublk_deinit_queues(struct ublk_device *ub)for (i =0 ; i < nr_queues; i++)ublk_deinit_queue (ub, i); -kfree (ub->__queues); +kvfree (ub->__queues); }static int ublk_init_queues (struct ublk_device *ub)
@@ -1402,7 +1402,7 @@ static int ublk_init_queues(struct ublk_device *ub)int i, ret = -ENOMEM ; ub->queue_size = ubq_size; - ub->__queues =kcalloc (nr_queues, ubq_size,GFP_KERNEL ); + ub->__queues =kvcalloc (nr_queues, ubq_size,GFP_KERNEL );if (!ub->__queues)return ret;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 66/253 hfsplus: remove mutex_lock check in hfsplus_free_extents
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yangtao Li <[email protected]>
[ Upstream commit fcb96956c921f1aae7e7b477f2435c56f77a31b4 ]
Syzbot reported an issue in hfsplus filesystem:
------------[ cut here ]------------ WARNING: CPU: 0 PID: 4400 at fs/hfsplus/extents.c:346 hfsplus_free_extents+0x700/0xad0 Call Trace: <TASK> hfsplus_file_truncate+0x768/0xbb0 fs/hfsplus/extents.c:606 hfsplus_write_begin+0xc2/0xd0 fs/hfsplus/inode.c:56 cont_expand_zero fs/buffer.c:2383 [inline] cont_write_begin+0x2cf/0x860 fs/buffer.c:2446 hfsplus_write_begin+0x86/0xd0 fs/hfsplus/inode.c:52 generic_cont_expand_simple+0x151/0x250 fs/buffer.c:2347 hfsplus_setattr+0x168/0x280 fs/hfsplus/inode.c:263 notify_change+0xe38/0x10f0 fs/attr.c:420 do_truncate+0x1fb/0x2e0 fs/open.c:65 do_sys_ftruncate+0x2eb/0x380 fs/open.c:193 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
To avoid deadlock, Commit 31651c607151 ("hfsplus: avoid deadlock on file truncation") unlock extree before hfsplus_free_extents(), and add check wheather extree is locked in hfsplus_free_extents().
However, when operations such as hfsplus_file_release, hfsplus_setattr, hfsplus_unlink, and hfsplus_get_block are executed concurrently in different files, it is very likely to trigger the WARN_ON, which will lead syzbot and xfstest to consider it as an abnormality.
The comment above this warning also describes one of the easy triggering situations, which can easily trigger and cause xfstest&syzbot to report errors.
[task A] [task B]
->hfsplus_file_release
->hfsplus_file_truncate
->hfs_find_init
->mutex_lock
->mutex_unlock
->hfsplus_write_begin
->hfsplus_get_block
->hfsplus_file_extend
->hfsplus_ext_read_extent
->hfs_find_init
->mutex_lock
->hfsplus_free_extents
WARN_ON(mutex_is_locked) !!!Several threads could try to lock the shared extents tree. And warning can be triggered in one thread when another thread has locked the tree. This is the wrong behavior of the code and we need to remove the warning.
--- fs/hfsplus/extents.c | 3 --- 1 file changed, 3 deletions(-)
fs/hfsplus/extents.c +0 -3
@@ -342,9 +342,6 @@ static int hfsplus_free_extents(struct super_block *sb,int i;int err =0 ; -/* Mapping the allocation file may lock the extent tree */ -WARN_ON (mutex_is_locked (&HFSPLUS_SB (sb)->ext_tree->tree_lock)); -hfsplus_dump_extent (extent);for (i =0 ; i <8 ; extent++, i++) { count =be32_to_cpu (extent->block_count);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 67/253 Revert "fs/ntfs3: Replace inode_trylock with inode_lock"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Komarov <[email protected]>
[ Upstream commit a49f0abd8959048af18c6c690b065eb0d65b2d21 ]
This reverts commit 69505fe98f198ee813898cbcaf6770949636430b.
Initially, conditional lock acquisition was removed to fix an xfstest bug that was observed during internal testing. The deadlock reported by syzbot is resolved by reintroducing conditional acquisition. The xfstest bug no longer occurs on kernel version 6.16-rc1 during internal testing. I assume that changes in other modules may have contributed to this.
--- fs/ntfs3/file.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/ntfs3/file.c +4 -1
@@ -317,7 +317,10 @@ static int ntfs_file_mmap(struct file *file, struct vm_area_struct *vma) }if (ni->i_valid < to) { -inode_lock (inode); +if (!inode_trylock (inode)) { + err = -EAGAIN ; + goto out; + } err =ntfs_extend_initialized_size (file, ni, ni->i_valid, to);inode_unlock (inode);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 68/253 ASoC: soc-dai: tidyup return value of snd_soc_xlate_tdm_slot_mask()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit f4c77d5af0a9cd0ee22617baa8b49d0e151fbda7 ]
commit 7f1186a8d738661 ("ASoC: soc-dai: check return value at snd_soc_dai_set_tdm_slot()") checks return value of xlate_tdm_slot_mask() (A1)(A2).
/*
* ...
(Y) * TDM mode can be disabled by passing 0 for @slots. In this case @tx_mask,
* @rx_mask and @slot_width will be ignored.
* ...
*/
int snd_soc_dai_set_tdm_slot(...)
{
...
if (...)
(A1) ret = dai->driver->ops->xlate_tdm_slot_mask(...);
else
(A2) ret = snd_soc_xlate_tdm_slot_mask(...);
if (ret)
goto err;
...
}snd_soc_xlate_tdm_slot_mask() (A2) will return -EINVAL if slots was 0 (X), but snd_soc_dai_set_tdm_slot() allow to use it (Y).
(A) static int snd_soc_xlate_tdm_slot_mask(...)
{
...
if (!slots)
(X) return -EINVAL;
...
}Call xlate_tdm_slot_mask() only if slots was non zero.
--- sound/soc/soc-dai.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
sound/soc/soc-dai.c +9 -7
@@ -268,13 +268,15 @@ int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai, {int ret = -ENOTSUPP ; -if (dai->driver->ops && - dai->driver->ops->xlate_tdm_slot_mask) - ret = dai->driver->ops->xlate_tdm_slot_mask (slots, &tx_mask, &rx_mask); -else - ret =snd_soc_xlate_tdm_slot_mask (slots, &tx_mask, &rx_mask); -if (ret) - goto err; +if (slots) { +if (dai->driver->ops && + dai->driver->ops->xlate_tdm_slot_mask) + ret = dai->driver->ops->xlate_tdm_slot_mask (slots, &tx_mask, &rx_mask); +else + ret =snd_soc_xlate_tdm_slot_mask (slots, &tx_mask, &rx_mask); +if (ret) + goto err; + } dai->tx_mask = tx_mask; dai->rx_mask = rx_mask;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 69/253 ASoC: ops: dynamically allocate struct snd_ctl_elem_value
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 7e10d7242ea8a5947878880b912ffa5806520705 ]
This structure is really too larget to be allocated on the stack:
sound/soc/soc-ops.c:435:5: error: stack frame size (1296) exceeds limit (1280) in 'snd_soc_limit_volume' [-Werror,-Wframe-larger-than]
Change the function to dynamically allocate it instead.
There is probably a better way to do it since only two integer fields inside of that structure are actually used, but this is the simplest rework for the moment.
--- sound/soc/soc-ops.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-)
sound/soc/soc-ops.c +15 -11
@@ -641,28 +641,32 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw_range);static int snd_soc_clip_to_platform_max (struct snd_kcontrol *kctl) {struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; -struct snd_ctl_elem_value uctl; +struct snd_ctl_elem_value *uctl;int ret;if (!mc->platform_max)return 0 ; - ret = kctl->get (kctl, &uctl); + uctl =kzalloc (sizeof (*uctl),GFP_KERNEL ); +if (!uctl) +return -ENOMEM ; + + ret = kctl->get (kctl, uctl);if (ret <0 ) -return ret; + goto out; -if (uctl.value.integer.value[0 ] > mc->platform_max) - uctl.value.integer.value[0 ] = mc->platform_max; +if (uctl->value.integer.value[0 ] > mc->platform_max) + uctl->value.integer.value[0 ] = mc->platform_max;if (snd_soc_volsw_is_stereo (mc) && - uctl.value.integer.value[1 ] > mc->platform_max) - uctl.value.integer.value[1 ] = mc->platform_max; + uctl->value.integer.value[1 ] > mc->platform_max) + uctl->value.integer.value[1 ] = mc->platform_max; - ret = kctl->put (kctl, &uctl); -if (ret <0 ) -return ret; + ret = kctl->put (kctl, uctl); -return 0 ; +out: +kfree (uctl); +return ret; }/**
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 70/253 selftests: Fix errno checking in syscall_user_dispatch test
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Vyukov <[email protected]>
[ Upstream commit b89732c8c8357487185f260a723a060b3476144e ]
Successful syscalls don't change errno, so checking errno is wrong to ensure that a syscall has failed. For example for the following sequence:
prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0xff, 0); EXPECT_EQ(EINVAL, errno); prctl(PR_SET_SYSCALL_USER_DISPATCH, op, 0x0, 0x0, &sel); EXPECT_EQ(EINVAL, errno);
only the first syscall may fail and set errno, but the second may succeed and keep errno intact, and the check will falsely pass.
Or if errno happened to be EINVAL before, even the first check may falsely pass.
Also use EXPECT/ASSERT consistently. Currently there is an inconsistent mix without obvious reasons for usage of one or another.
--- .../syscall_user_dispatch/sud_test.c | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-)
tools/testing/selftests/syscall_user_dispatch/sud_test.c +25 -25
@@ -79,6 +79,21 @@ TEST_SIGNAL(dispatch_trigger_sigsys, SIGSYS) } } +static void prctl_valid (struct __test_metadata *_metadata, +unsigned long op,unsigned long off, +unsigned long size,void *sel) +{ +EXPECT_EQ (0 ,prctl (PR_SET_SYSCALL_USER_DISPATCH , op, off, size, sel)); +} + +static void prctl_invalid (struct __test_metadata *_metadata, +unsigned long op,unsigned long off, +unsigned long size,void *sel,int err) +{ +EXPECT_EQ (-1 ,prctl (PR_SET_SYSCALL_USER_DISPATCH , op, off, size, sel)); +EXPECT_EQ (err, errno); +} +TEST (bad_prctl_param) {char sel =SYSCALL_DISPATCH_FILTER_ALLOW ;
@@ -86,57 +101,42 @@ TEST(bad_prctl_param)/* Invalid op */ op =-1 ; -prctl (PR_SET_SYSCALL_USER_DISPATCH , op,0 ,0 , &sel); -ASSERT_EQ (EINVAL , errno); +prctl_invalid (_metadata, op,0 ,0 , &sel,EINVAL );/* PR_SYS_DISPATCH_OFF */ op =PR_SYS_DISPATCH_OFF ;/* offset != 0 */ -prctl (PR_SET_SYSCALL_USER_DISPATCH , op,0x1 ,0x0 ,0 ); -EXPECT_EQ (EINVAL , errno); +prctl_invalid (_metadata, op,0x1 ,0x0 ,0 ,EINVAL );/* len != 0 */ -prctl (PR_SET_SYSCALL_USER_DISPATCH , op,0x0 ,0xff ,0 ); -EXPECT_EQ (EINVAL , errno); +prctl_invalid (_metadata, op,0x0 ,0xff ,0 ,EINVAL );/* sel != NULL */ -prctl (PR_SET_SYSCALL_USER_DISPATCH , op,0x0 ,0x0 , &sel); -EXPECT_EQ (EINVAL , errno); +prctl_invalid (_metadata, op,0x0 ,0x0 , &sel,EINVAL );/* Valid parameter */ - errno =0 ; -prctl (PR_SET_SYSCALL_USER_DISPATCH , op,0x0 ,0x0 ,0x0 ); -EXPECT_EQ (0 , errno); +prctl_valid (_metadata, op,0x0 ,0x0 ,0x0 );/* PR_SYS_DISPATCH_ON */ op =PR_SYS_DISPATCH_ON ;/* Dispatcher region is bad (offset > 0 && len == 0) */ -prctl (PR_SET_SYSCALL_USER_DISPATCH , op,0x1 ,0x0 , &sel); -EXPECT_EQ (EINVAL , errno); -prctl (PR_SET_SYSCALL_USER_DISPATCH , op,-1L ,0x0 , &sel); -EXPECT_EQ (EINVAL , errno); +prctl_invalid (_metadata, op,0x1 ,0x0 , &sel,EINVAL ); +prctl_invalid (_metadata, op,-1L ,0x0 , &sel,EINVAL );/* Invalid selector */ -prctl (PR_SET_SYSCALL_USER_DISPATCH , op,0x0 ,0x1 , (void *)-1 ); -ASSERT_EQ (EFAULT , errno); +prctl_invalid (_metadata, op,0x0 ,0x1 , (void *)-1 ,EFAULT );/* * Dispatcher range overflows unsigned long */ -prctl (PR_SET_SYSCALL_USER_DISPATCH ,PR_SYS_DISPATCH_ON ,1 ,-1L , &sel); - ASSERT_EQ(EINVAL, errno) { -TH_LOG ("Should reject bad syscall range" ); - } +prctl_invalid (_metadata,PR_SYS_DISPATCH_ON ,1 ,-1L , &sel,EINVAL );/* * Allowed range overflows usigned long */ -prctl (PR_SET_SYSCALL_USER_DISPATCH ,PR_SYS_DISPATCH_ON ,-1L ,0x1 , &sel); - ASSERT_EQ(EINVAL, errno) { -TH_LOG ("Should reject bad syscall range" ); - } +prctl_invalid (_metadata,PR_SYS_DISPATCH_ON ,-1L ,0x1 , &sel,EINVAL ); }/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 71/253 soc: qcom: QMI encoding/decoding for big endian
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Wilhelm <[email protected]>
[ Upstream commit 3ced38da5f7de4c260f9eaa86fc805827953243a ]
The QMI_DATA_LEN type may have different sizes. Taking the element's address of that type and interpret it as a smaller sized ones works fine for little endian platforms but not for big endian ones. Instead use temporary variables of smaller sized types and cast them correctly to support big endian platforms.
--- drivers/soc/qcom/qmi_encdec.c | 46 +++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 8 deletions(-)
drivers/soc/qcom/qmi_encdec.c +38 -8
@@ -304,6 +304,8 @@ static int qmi_encode(const struct qmi_elem_info *ei_array, void *out_buf,const void *buf_src;int encode_tlv =0 ;int rc; +u8 val8; +u16 val16;if (!ei_array)return 0 ;
@@ -338,7 +340,6 @@ static int qmi_encode(const struct qmi_elem_info *ei_array, void *out_buf,break ;case QMI_DATA_LEN : -memcpy (&data_len_value, buf_src, temp_ei->elem_size); data_len_sz = temp_ei->elem_size ==sizeof (u8) ?sizeof (u8) :sizeof (u16);/* Check to avoid out of range buffer access */
@@ -348,8 +349,17 @@ static int qmi_encode(const struct qmi_elem_info *ei_array, void *out_buf, __func__);return -ETOOSMALL ; } - rc =qmi_encode_basic_elem (buf_dst, &data_len_value, -1 , data_len_sz); +if (data_len_sz ==sizeof (u8)) { + val8 = *(u8 *)buf_src; + data_len_value = (u32 )val8; + rc =qmi_encode_basic_elem (buf_dst, &val8, +1 , data_len_sz); + }else { + val16 = *(u16 *)buf_src; + data_len_value = (u32 )le16_to_cpu (val16); + rc =qmi_encode_basic_elem (buf_dst, &val16, +1 , data_len_sz); + }UPDATE_ENCODE_VARIABLES (temp_ei, buf_dst, encoded_bytes, tlv_len, encode_tlv, rc);
@@ -523,14 +533,23 @@ static int qmi_decode_string_elem(const struct qmi_elem_info *ei_array,u32 string_len =0 ;u32 string_len_sz =0 ;const struct qmi_elem_info *temp_ei = ei_array; +u8 val8; +u16 val16;if (dec_level ==1 ) { string_len = tlv_len; }else { string_len_sz = temp_ei->elem_len <=U8_MAX ?sizeof (u8) :sizeof (u16); - rc =qmi_decode_basic_elem (&string_len, buf_src, -1 , string_len_sz); +if (string_len_sz ==sizeof (u8)) { + rc =qmi_decode_basic_elem (&val8, buf_src, +1 , string_len_sz); + string_len = (u32 )val8; + }else { + rc =qmi_decode_basic_elem (&val16, buf_src, +1 , string_len_sz); + string_len = (u32 )val16; + } decoded_bytes += rc; }
@@ -604,6 +623,9 @@ static int qmi_decode(const struct qmi_elem_info *ei_array, void *out_c_struct,u32 decoded_bytes =0 ;const void *buf_src = in_buf;int rc; +u8 val8; +u16 val16; +u32 val32;while (decoded_bytes < in_buf_len) {if (dec_level >=2 && temp_ei->data_type ==QMI_EOTI )
@@ -642,9 +664,17 @@ static int qmi_decode(const struct qmi_elem_info *ei_array, void *out_c_struct,if (temp_ei->data_type ==QMI_DATA_LEN ) { data_len_sz = temp_ei->elem_size ==sizeof (u8) ?sizeof (u8) :sizeof (u16); - rc =qmi_decode_basic_elem (&data_len_value, buf_src, -1 , data_len_sz); -memcpy (buf_dst, &data_len_value,sizeof (u32)); +if (data_len_sz ==sizeof (u8)) { + rc =qmi_decode_basic_elem (&val8, buf_src, +1 , data_len_sz); + data_len_value = (u32 )val8; + }else { + rc =qmi_decode_basic_elem (&val16, buf_src, +1 , data_len_sz); + data_len_value = (u32 )val16; + } + val32 =cpu_to_le32 (data_len_value); +memcpy (buf_dst, &val32,sizeof (u32)); temp_ei = temp_ei +1 ; buf_dst = out_c_struct + temp_ei->offset; tlv_len -= data_len_sz;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 72/253 arm64: dts: qcom: sdm845: Expand IMEM region
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 81a4a7de3d4031e77b5796479ef21aefb0862807 ]
We need more than what is currently described, expand the region to its actual boundaries.
--- arch/arm64/boot/dts/qcom/sdm845.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm64/boot/dts/qcom/sdm845.dtsi +5 -5
@@ -4915,18 +4915,18 @@ spmi_bus: spmi@c440000 { cell-index = <0>; }; - sram@146bf000 { + sram@14680000 { compatible = "qcom,sdm845-imem", "syscon", "simple-mfd"; - reg = <0 0x146bf000 0 0x1000>; + reg = <0 0x14680000 0 0x40000>; #address-cells = <1>; #size-cells = <1>; - ranges = <0 0 0x146bf000 0x1000>; + ranges = <0 0 0x14680000 0x40000>; - pil-reloc@94c { + pil-reloc@3f94c { compatible = "qcom,pil-reloc-info"; - reg = <0x94c 0xc8>; + reg = <0x3f94c 0xc8>; }; };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 73/253 arm64: dts: qcom: sc7180: Expand IMEM region
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 965e28cad4739b11f1bc58c0a9935e025938bb1f ]
We need more than what is currently described, expand the region to its actual boundaries.
--- arch/arm64/boot/dts/qcom/sc7180.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm64/boot/dts/qcom/sc7180.dtsi +5 -5
@@ -3244,18 +3244,18 @@ spmi_bus: spmi@c440000 { cell-index = <0>; }; - sram@146aa000 { + sram@14680000 { compatible = "qcom,sc7180-imem", "syscon", "simple-mfd"; - reg = <0 0x146aa000 0 0x2000>; + reg = <0 0x14680000 0 0x2e000>; #address-cells = <1>; #size-cells = <1>; - ranges = <0 0 0x146aa000 0x2000>; + ranges = <0 0 0x14680000 0x2e000>; - pil-reloc@94c { + pil-reloc@2a94c { compatible = "qcom,pil-reloc-info"; - reg = <0x94c 0xc8>; + reg = <0x2a94c 0xc8>; }; };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 74/253 ARM: dts: vfxxx: Correctly use two tuples for timer address
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit f3440dcf8b994197c968fbafe047ce27eed226e8 ]
Address and size-cells are 1 and the ftm timer node takes two address spaces in "reg" property, so this should be in two <> tuples. Change has no functional impact, but original code is confusing/less readable.
--- arch/arm/boot/dts/vfxxx.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/vfxxx.dtsi +1 -1
@@ -617,7 +617,7 @@ usbmisc1: usb@400b4800 { ftm: ftm@400b8000 { compatible = "fsl,ftm-timer"; - reg = <0x400b8000 0x1000 0x400b9000 0x1000>; + reg = <0x400b8000 0x1000>, <0x400b9000 0x1000>; interrupts = <44 IRQ_TYPE_LEVEL_HIGH>; clock-names = "ftm-evt", "ftm-src", "ftm-evt-counter-en", "ftm-src-counter-en";
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 75/253 usb: host: xhci-plat: fix incorrect type for of_match variable in xhci_plat_probe()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Seungjin Bae <[email protected]>
[ Upstream commit d9e496a9fb4021a9e6b11e7ba221a41a2597ac27 ]
The variable of_match was incorrectly declared as a bool. It is assigned the return value of of_match_device(), which is a pointer of type const struct of_device_id *.
--- drivers/usb/host/xhci-plat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/xhci-plat.c +1 -1
@@ -184,7 +184,7 @@ static int xhci_plat_probe(struct platform_device *pdev)int ret;int irq;struct xhci_plat_priv *priv =NULL ; -bool of_match; +const struct of_device_id *of_match;if (usb_disabled ())return -ENODEV ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 76/253 usb: misc: apple-mfi-fastcharge: Make power supply names unique
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charalampos Mitrodimas <[email protected]>
[ Upstream commit 43007b89fb2de746443fbbb84aedd1089afdf582 ]
When multiple Apple devices are connected concurrently, the apple-mfi-fastcharge driver fails to probe the subsequent devices with the following error:
sysfs: cannot create duplicate filename '/class/power_supply/apple_mfi_fastcharge' apple-mfi-fastcharge 5-2.4.3.3: probe of 5-2.4.3.3 failed with error -17
This happens because the driver uses a fixed power supply name ("apple_mfi_fastcharge") for all devices, causing a sysfs name conflict when a second device is connected.
Fix this by generating unique names using the USB bus and device number (e.g., "apple_mfi_fastcharge_5-12"). This ensures each connected device gets a unique power supply entry in sysfs.
The change requires storing a copy of the power_supply_desc structure in the per-device mfi_device struct, since the name pointer needs to remain valid for the lifetime of the power supply registration.
--- drivers/usb/misc/apple-mfi-fastcharge.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-)
drivers/usb/misc/apple-mfi-fastcharge.c +21 -3
@@ -44,6 +44,7 @@ MODULE_DEVICE_TABLE(usb, mfi_fc_id_table);struct mfi_device {struct usb_device *udev;struct power_supply *battery; +struct power_supply_desc battery_desc;int charge_type; };
@@ -178,6 +179,7 @@ static int mfi_fc_probe(struct usb_device *udev) {struct power_supply_config battery_cfg = {};struct mfi_device *mfi =NULL ; +char *battery_name;int err;if (!mfi_fc_match (udev))
@@ -187,23 +189,38 @@ static int mfi_fc_probe(struct usb_device *udev)if (!mfi)return -ENOMEM ; + battery_name =kasprintf (GFP_KERNEL ,"apple_mfi_fastcharge_%d-%d" , + udev->bus->busnum, udev->devnum); +if (!battery_name) { + err = -ENOMEM ; + goto err_free_mfi; + } + + mfi->battery_desc = apple_mfi_fc_desc; + mfi->battery_desc.name = battery_name; + battery_cfg.drv_data = mfi; mfi->charge_type =POWER_SUPPLY_CHARGE_TYPE_TRICKLE ; mfi->battery =power_supply_register (&udev->dev, - &apple_mfi_fc_desc, + &mfi->battery_desc, &battery_cfg);if (IS_ERR (mfi->battery)) {dev_err (&udev->dev,"Can't register battery\n" ); err =PTR_ERR (mfi->battery); -kfree (mfi); -return err; + goto err_free_name; } mfi->udev =usb_get_dev (udev);dev_set_drvdata (&udev->dev, mfi);return 0 ; + +err_free_name: +kfree (battery_name); +err_free_mfi: +kfree (mfi); +return err; }static void mfi_fc_disconnect (struct usb_device *udev)
@@ -213,6 +230,7 @@ static void mfi_fc_disconnect(struct usb_device *udev) mfi =dev_get_drvdata (&udev->dev);if (mfi->battery)power_supply_unregister (mfi->battery); +kfree (mfi->battery_desc.name);dev_set_drvdata (&udev->dev,NULL );usb_put_dev (mfi->udev);kfree (mfi);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 77/253 staging: fbtft: fix potential memory leak in fbtft_framebuffer_alloc()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abdun Nihaal <[email protected]>
[ Upstream commit eb2cb7dab60f9be0b435ac4a674255429a36d72c ]
In the error paths after fb_info structure is successfully allocated, the memory allocated in fb_deferred_io_init() for info->pagerefs is not freed. Fix that by adding the cleanup function on the error path.
--- drivers/staging/fbtft/fbtft-core.c | 1 + 1 file changed, 1 insertion(+)
drivers/staging/fbtft/fbtft-core.c +1 -0
@@ -744,6 +744,7 @@ struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display,return info; release_framebuf: +fb_deferred_io_cleanup (info);framebuffer_release (info); alloc_fail:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 78/253 vmci: Prevent the dispatching of uninitialized payloads
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lizhi Xu <[email protected]>
[ Upstream commit bfb4cf9fb97e4063f0aa62e9e398025fb6625031 ]
The reproducer executes the host's unlocked_ioctl call in two different tasks. When init_context fails, the struct vmci_event_ctx is not fully initialized when executing vmci_datagram_dispatch() to send events to all vm contexts. This affects the datagram taken from the datagram queue of its context by another task, because the datagram payload is not initialized according to the size payload_size, which causes the kernel data to leak to the user space.
Before dispatching the datagram, and before setting the payload content, explicitly set the payload content to 0 to avoid data leakage caused by incomplete payload initialization.
--- drivers/misc/vmw_vmci/vmci_context.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/misc/vmw_vmci/vmci_context.c +2 -0
@@ -251,6 +251,8 @@ static int ctx_fire_notification(u32 context_id, u32 priv_flags) ev.msg.hdr.src =vmci_make_handle (VMCI_HYPERVISOR_CONTEXT_ID ,VMCI_CONTEXT_RESOURCE_ID ); ev.msg.hdr.payload_size =sizeof (ev) -sizeof (ev.msg.hdr); +memset ((char *)&ev.msg.hdr +sizeof (ev.msg.hdr),0 , + ev.msg.hdr.payload_size); ev.msg.event_data.event =VMCI_EVENT_CTX_REMOVED ; ev.payload.context_id = context_id;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 79/253 pps: fix poll support
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Denis OSTERLAND-HEIM <[email protected]>
[ Upstream commit 12c409aa1ec2592280a2ddcc66ff8f3c7f7bb171 ]
Because pps_cdev_poll() returns unconditionally EPOLLIN,
a user space program that calls select/poll get always an immediate data ready-to-read response. As a result the intended use to wait until next data becomes ready does not work.
User space snippet:
struct pollfd pollfd = {
.fd = open("/dev/pps0", O_RDONLY),
.events = POLLIN|POLLERR,
.revents = 0 };
while(1) {
poll(&pollfd, 1, 2000/*ms*/); // returns immediate, but should wait
if(revents & EPOLLIN) { // always true
struct pps_fdata fdata;
memset(&fdata, 0, sizeof(memdata));
ioctl(PPS_FETCH, &fdata); // currently fetches data at max speed
}
}Lets remember the last fetch event counter and compare this value in pps_cdev_poll() with most recent event counter
and return 0 if they are equal.
--- drivers/pps/pps.c | 11 +++++++++-- include/linux/pps_kernel.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-)
drivers/pps/pps.c +9 -2
@@ -41,6 +41,9 @@ static __poll_t pps_cdev_poll(struct file *file, poll_table *wait)poll_wait (file, &pps->queue, wait); +if (pps->last_fetched_ev == pps->last_ev) +return 0 ; +return EPOLLIN |EPOLLRDNORM ; }
@@ -186,9 +189,11 @@ static long pps_cdev_ioctl(struct file *file,if (err)return err; -/* Return the fetched timestamp */ +/* Return the fetched timestamp and save last fetched event */ spin_lock_irq (&pps->lock); + pps->last_fetched_ev = pps->last_ev; + fdata.info.assert_sequence = pps->assert_sequence; fdata.info.clear_sequence = pps->clear_sequence; fdata.info.assert_tu = pps->assert_tu;
@@ -272,9 +277,11 @@ static long pps_cdev_compat_ioctl(struct file *file,if (err)return err; -/* Return the fetched timestamp */ +/* Return the fetched timestamp and save last fetched event */ spin_lock_irq (&pps->lock); + pps->last_fetched_ev = pps->last_ev; + compat.info.assert_sequence = pps->assert_sequence; compat.info.clear_sequence = pps->clear_sequence; compat.info.current_mode = pps->current_mode;
include/linux/pps_kernel.h +1 -0
@@ -52,6 +52,7 @@ struct pps_device {int current_mode;/* PPS mode at event time */ unsigned int last_ev;/* last PPS event id */ +unsigned int last_fetched_ev;/* last fetched PPS event id */ wait_queue_head_t queue;/* PPS event queue */ unsigned int id;/* PPS source unique ID */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 80/253 Revert "vmci: Prevent the dispatching of uninitialized payloads"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kroah-Hartman <[email protected]>
[ Upstream commit 8f5d9bed6122b8d96508436e5ad2498bb797eb6b ]
This reverts commit bfb4cf9fb97e4063f0aa62e9e398025fb6625031.
While the code "looks" correct, the compiler has no way to know that doing "fun" pointer math like this really isn't a write off the end of the structure as there is no hint anywhere that the structure has data at the end of it.
This causes the following build warning:
In function 'fortify_memset_chk',
inlined from 'ctx_fire_notification.isra' at drivers/misc/vmw_vmci/vmci_context.c:254:3:include/linux/fortify-string.h:480:25: error: call to '__write_overflow_field' declared with attribute warning: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror=attribute-warning]
480 | __write_overflow_field(p_size_field, size);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~So revert it for now and it can come back in the future in a "sane" way that either correctly makes the structure know that there is trailing data, OR just the payload structure is properly referenced and zeroed out.
--- drivers/misc/vmw_vmci/vmci_context.c | 2 -- 1 file changed, 2 deletions(-)
drivers/misc/vmw_vmci/vmci_context.c +0 -2
@@ -251,8 +251,6 @@ static int ctx_fire_notification(u32 context_id, u32 priv_flags) ev.msg.hdr.src =vmci_make_handle (VMCI_HYPERVISOR_CONTEXT_ID ,VMCI_CONTEXT_RESOURCE_ID ); ev.msg.hdr.payload_size =sizeof (ev) -sizeof (ev.msg.hdr); -memset ((char *)&ev.msg.hdr +sizeof (ev.msg.hdr),0 , - ev.msg.hdr.payload_size); ev.msg.event_data.event =VMCI_EVENT_CTX_REMOVED ; ev.payload.context_id = context_id;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 81/253 powercap: dtpm_cpu: Fix NULL pointer dereference in get_pd_power_uw()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sivan Zohar-Kotzer <[email protected]>
[ Upstream commit 46dc57406887dd02565cb264224194a6776d882b ]
The get_pd_power_uw() function can crash with a NULL pointer dereference when em_cpu_get() returns NULL. This occurs when a CPU becomes impossible during runtime, causing get_cpu_device() to return NULL, which propagates through em_cpu_get() and leads to a crash when em_span_cpus() dereferences the NULL pointer.
Add a NULL check after em_cpu_get() and return 0 if unavailable, matching the existing fallback behavior in __dtpm_cpu_setup().
--- drivers/powercap/dtpm_cpu.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/powercap/dtpm_cpu.c +2 -0
@@ -93,6 +93,8 @@ static u64 get_pd_power_uw(struct dtpm *dtpm)int i; pd =em_cpu_get (dtpm_cpu->cpu); +if (!pd) +return 0 ; pd_mask =em_span_cpus (pd);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 82/253 usb: early: xhci-dbc: Fix early_ioremap leak
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lucas De Marchi <[email protected]>
[ Upstream commit 2b7eec2ec3015f52fc74cf45d0408925e984ecd1 ]
Using the kernel param earlyprintk=xdbc,keep without proper hardware setup leads to this:
[ ] xhci_dbc:early_xdbc_parse_parameter: dbgp_num: 0 ... [ ] xhci_dbc:early_xdbc_setup_hardware: failed to setup the connection to host ... [ ] calling kmemleak_late_init+0x0/0xa0 @ 1 [ ] kmemleak: Kernel memory leak detector initialized (mem pool available: 14919) [ ] kmemleak: Automatic memory scanning thread started [ ] initcall kmemleak_late_init+0x0/0xa0 returned 0 after 417 usecs [ ] calling check_early_ioremap_leak+0x0/0x70 @ 1 [ ] ------------[ cut here ]------------ [ ] Debug warning: early ioremap leak of 1 areas detected. please boot with early_ioremap_debug and report the dmesg. [ ] WARNING: CPU: 11 PID: 1 at mm/early_ioremap.c:90 check_early_ioremap_leak+0x4e/0x70
When early_xdbc_setup_hardware() fails, make sure to call early_iounmap() since xdbc_init() won't handle it.
--- drivers/usb/early/xhci-dbc.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/early/xhci-dbc.c +4 -0
@@ -682,6 +682,10 @@ int __init early_xdbc_setup_hardware(void) xdbc.table_base =NULL ; xdbc.out_buf =NULL ; + +early_iounmap (xdbc.xhci_base, xdbc.xhci_length); + xdbc.xhci_base =NULL ; + xdbc.xhci_length =0 ; }return ret;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 83/253 arm: dts: ti: omap: Fixup pinheader typo
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Albin Törnqvist <[email protected]>
[ Upstream commit a3a4be32b69c99fc20a66e0de83b91f8c882bf4c ]
This commit fixes a typo introduced in commitee368a10d0df ("ARM: dts: am335x-boneblack.dts: unique gpio-line-names"). gpio0_7 is located on the P9 header on the BBB.
This was verified with a BeagleBone Black by toggling the pin and checking with a multimeter that it corresponds to pin 42 on the P9 header.
--- arch/arm/boot/dts/am335x-boneblack.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/am335x-boneblack.dts +1 -1
@@ -34,7 +34,7 @@ &gpio0 { "P9_18 [spi0_d1]", "P9_17 [spi0_cs0]", "[mmc0_cd]", - "P8_42A [ecappwm0]", + "P9_42A [ecappwm0]", "P8_35 [lcd d12]", "P8_33 [lcd d13]", "P8_31 [lcd d14]",
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 84/253 soc/tegra: cbb: Clear ERR_FORCE register with ERR_STATUS
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sumit Gupta <[email protected]>
[ Upstream commit a0647bca8966db04b79af72851ebd04224a4da40 ]
When error is injected with the ERR_FORCE register, then this register is not auto cleared on clearing the ERR_STATUS register. This causes repeated interrupts on error injection. To fix, set the ERR_FORCE to zero along with clearing the ERR_STATUS register after handling error.
--- drivers/soc/tegra/cbb/tegra234-cbb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/soc/tegra/cbb/tegra234-cbb.c +2 -0
@@ -189,6 +189,8 @@ static void tegra234_cbb_error_clear(struct tegra_cbb *cbb) {struct tegra234_cbb *priv =to_tegra234_cbb (cbb); +writel (0 , priv->mon +FABRIC_MN_MASTER_ERR_FORCE_0 ); +writel (0x3f , priv->mon +FABRIC_MN_MASTER_ERR_STATUS_0 );dsb (sy); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 85/253 ARM: dts: imx6ul-kontron-bl-common: Fix RTS polarity for RS485 interface
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Annette Kobou <[email protected]>
[ Upstream commit 47ef5256124fb939d8157b13ca048c902435cf23 ]
The polarity of the DE signal of the transceiver is active-high for sending. Therefore rs485-rts-active-low is wrong and needs to be removed to make RS485 transmissions work.
--- arch/arm/boot/dts/imx6ul-kontron-bl-common.dtsi | 1 - 1 file changed, 1 deletion(-)
arch/arm/boot/dts/imx6ul-kontron-bl-common.dtsi +0 -1
@@ -169,7 +169,6 @@ &uart2 { pinctrl-0 = <&pinctrl_uart2>; linux,rs485-enabled-at-boot-time; rs485-rx-during-tx; - rs485-rts-active-low; uart-has-rtscts; status = "okay"; };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 86/253 arm64: dts: imx8mm-beacon: Fix HS400 USDHC clock speed
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Ford <[email protected]>
[ Upstream commit f83f69097a302ed2a2775975ddcf12e6a5ac6ec3 ]
The reference manual for the i.MX8MM states the clock rate in MMC mode is 1/2 of the input clock, therefore to properly run at HS400 rates, the input clock must be 400MHz to operate at 200MHz. Currently the clock is set to 200MHz which is half the rate it should be, so the throughput is half of what it should be for HS400 operation.
--- arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/freescale/imx8mm-beacon-som.dtsi +2 -0
@@ -284,6 +284,8 @@ &usdhc3 { pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>; + assigned-clocks = <&clk IMX8MM_CLK_USDHC3>; + assigned-clock-rates = <400000000>; bus-width = <8>; non-removable; status = "okay";
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 87/253 arm64: dts: imx8mn-beacon: Fix HS400 USDHC clock speed
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Ford <[email protected]>
[ Upstream commit e16ad6c79906bba5e2ac499492b6a5b29ab19d6c ]
The reference manual for the i.MX8MN states the clock rate in MMC mode is 1/2 of the input clock, therefore to properly run at HS400 rates, the input clock must be 400MHz to operate at 200MHz. Currently the clock is set to 200MHz which is half the rate it should be, so the throughput is half of what it should be for HS400 operation.
--- arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi +2 -0
@@ -295,6 +295,8 @@ &usdhc3 { pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>; + assigned-clocks = <&clk IMX8MN_CLK_USDHC3>; + assigned-clock-rates = <400000000>; bus-width = <8>; non-removable; status = "okay";
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 88/253 PM / devfreq: Check governor before using governor->name
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lifeng Zheng <[email protected]>
[ Upstream commit bab7834c03820eb11269bc48f07c3800192460d2 ]
Commit 96ffcdf239de ("PM / devfreq: Remove redundant governor_name from struct devfreq") removes governor_name and uses governor->name to replace it. But devfreq->governor may be NULL and directly using devfreq->governor->name may cause null pointer exception. Move the check of governor to before using governor->name.
--- drivers/devfreq/devfreq.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
drivers/devfreq/devfreq.c +3 -7
@@ -1381,15 +1381,11 @@ int devfreq_remove_governor(struct devfreq_governor *governor)int ret;struct device *dev = devfreq->dev.parent; +if (!devfreq->governor) +continue ; +if (!strncmp (devfreq->governor->name, governor->name,DEVFREQ_NAME_LEN )) { -/* we should have a devfreq governor! */ -if (!devfreq->governor) { -dev_warn (dev,"%s: Governor %s NOT present\n" , - __func__, governor->name); -continue ; -/* Fall through */ - } ret = devfreq->governor->event_handler (devfreq,DEVFREQ_GOV_STOP ,NULL );if (ret) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 89/253 cpufreq: intel_pstate: Always use HWP_DESIRED_PERF in passive mode
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
[ Upstream commit 1cefe495cacba5fb0417da3a75a1a76e3546d176 ]
In the passive mode, intel_cpufreq_update_pstate() sets HWP_MIN_PERF in accordance with the target frequency to ensure delivering adequate performance, but it sets HWP_DESIRED_PERF to 0, so the processor has no indication that the desired performance level is actually equal to the floor one. This may cause it to choose a performance point way above the desired level.
Moreover, this is inconsistent with intel_cpufreq_adjust_perf() which actually sets HWP_DESIRED_PERF in accordance with the target performance value.
Address this by adjusting intel_cpufreq_update_pstate() to pass target_pstate as both the minimum and the desired performance levels to intel_cpufreq_hwp_update().
--- drivers/cpufreq/intel_pstate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/cpufreq/intel_pstate.c +2 -2
@@ -2867,8 +2867,8 @@ static int intel_cpufreq_update_pstate(struct cpufreq_policy *policy,int max_pstate = policy->strict_target ? target_pstate : cpu->max_perf_ratio; -intel_cpufreq_hwp_update (cpu, target_pstate, max_pstate,0 , - fast_switch); +intel_cpufreq_hwp_update (cpu, target_pstate, max_pstate, + target_pstate, fast_switch); }else if (target_pstate != old_pstate) {intel_cpufreq_perf_ctl_update (cpu, target_pstate, fast_switch); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 90/253 cpufreq: Initialize cpufreq-based frequency-invariance later
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lifeng Zheng <[email protected]>
[ Upstream commit 2a6c727387062a2ea79eb6cf5004820cb1b0afe2 ]
The cpufreq-based invariance is enabled in cpufreq_register_driver(), but never disabled after registration fails. Move the invariance initialization to where all other initializations have been successfully done to solve this problem.
--- drivers/cpufreq/cpufreq.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/cpufreq/cpufreq.c +9 -9
@@ -2882,15 +2882,6 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) cpufreq_driver = driver_data;write_unlock_irqrestore (&cpufreq_driver_lock, flags); -/* -* Mark support for the scheduler's frequency invariance engine for -* drivers that implement target(), target_index() or fast_switch(). -*/ -if (!cpufreq_driver->setpolicy) { -static_branch_enable_cpuslocked (&cpufreq_freq_invariance); -pr_debug ("supports frequency invariance" ); - } -if (driver_data->setpolicy) driver_data->flags |=CPUFREQ_CONST_LOOPS ;
@@ -2921,6 +2912,15 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) hp_online = ret; ret =0 ; +/* +* Mark support for the scheduler's frequency invariance engine for +* drivers that implement target(), target_index() or fast_switch(). +*/ +if (!cpufreq_driver->setpolicy) { +static_branch_enable_cpuslocked (&cpufreq_freq_invariance); +pr_debug ("supports frequency invariance" ); + } +pr_debug ("driver %s up and running\n" , driver_data->name); goto out;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 91/253 cpufreq: Init policy->rwsem before it may be possibly used
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lifeng Zheng <[email protected]>
[ Upstream commit d1378d1d7edb3a4c4935a44fe834ae135be03564 ]
In cpufreq_policy_put_kobj(), policy->rwsem is used. But in cpufreq_policy_alloc(), if freq_qos_add_notifier() returns an error, error path via err_kobj_remove or err_min_qos_notifier will be reached and cpufreq_policy_put_kobj() will be called before policy->rwsem is initialized. Thus, the calling of init_rwsem() should be moved to where before these two error paths can be reached.
--- drivers/cpufreq/cpufreq.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/cpufreq/cpufreq.c +2 -1
@@ -1239,6 +1239,8 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu) goto err_free_real_cpus; } +init_rwsem (&policy->rwsem); +freq_constraints_init (&policy->constraints); policy->nb_min.notifier_call = cpufreq_notifier_min;
@@ -1261,7 +1263,6 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu) }INIT_LIST_HEAD (&policy->policy_list); -init_rwsem (&policy->rwsem);spin_lock_init (&policy->transition_lock);init_waitqueue_head (&policy->transition_wait);INIT_WORK (&policy->update, handle_update);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 92/253 samples: mei: Fix building on musl libc
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brahmajit Das <[email protected]>
[ Upstream commit 239df3e4b4752524e7c0fb3417c218d8063654b4 ]
The header bits/wordsize.h is glibc specific and on building on musl with allyesconfig results in
samples/mei/mei-amt-version.c:77:10: fatal error: bits/wordsize.h: No such file or directory
77 | #include <bits/wordsize.h>
| ^~~~~~~~~~~~~~~~~
mei-amt-version.c build file without bits/wordsize.h on musl and glibc.
However on musl we get the follwing error without sys/time.h
samples/mei/mei-amt-version.c: In function 'mei_recv_msg':samples/mei/mei-amt-version.c:159:24: error: storage size of 'tv' isn't known
159 | struct timeval tv;
| ^~samples/mei/mei-amt-version.c:160:9: error: unknown type name 'fd_set'
160 | fd_set set;
| ^~~~~~
samples/mei/mei-amt-version.c:168:9: error: implicit declaration of function 'FD_ZERO' [-Wimplicit-function-declaration]
168 | FD_ZERO(&set);
| ^~~~~~~
samples/mei/mei-amt-version.c:169:9: error: implicit declaration of function 'FD_SET'; did you mean 'L_SET'? [-Wimplicit-function-declaration]
169 | FD_SET(me->fd, &set);
| ^~~~~~
| L_SET
samples/mei/mei-amt-version.c:170:14: error: implicit declaration of function 'select' [-Wimplicit-function-declaration]
170 | rc = select(me->fd + 1, &set, NULL, NULL, &tv);
| ^~~~~~
samples/mei/mei-amt-version.c:171:23: error: implicit declaration of function 'FD_ISSET' [-Wimplicit-function-declaration]
171 | if (rc > 0 && FD_ISSET(me->fd, &set)) {
| ^~~~~~~~samples/mei/mei-amt-version.c:159:24: warning: unused variable 'tv' [-Wunused-variable]
159 | struct timeval tv;
| ^~
Hence the the file has been included.
--- samples/mei/mei-amt-version.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
samples/mei/mei-amt-version.c +1 -1
@@ -69,11 +69,11 @@#include <string.h> #include <fcntl.h> #include <sys/ioctl.h> +#include <sys/time.h> #include <unistd.h> #include <errno.h> #include <stdint.h> #include <stdbool.h> -#include <bits/wordsize.h> #include <linux/mei.h> /*****************************************************************************
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 93/253 interconnect: qcom: sc8280xp: specify num_links for qnm_a1noc_cfg
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 02ee375506dceb7d32007821a2bff31504d64b99 ]
The qnm_a1noc_cfg declaration didn't include .num_links definition, fix it.
--- drivers/interconnect/qcom/sc8280xp.c | 1 + 1 file changed, 1 insertion(+)
drivers/interconnect/qcom/sc8280xp.c +1 -0
@@ -47,6 +47,7 @@ static struct qcom_icc_node qnm_a1noc_cfg = { .id = SC8280XP_MASTER_A1NOC_CFG, .channels = 1, .buswidth = 4, + .num_links = 1, .links = { SC8280XP_SLAVE_SERVICE_A1NOC }, };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 94/253 interconnect: qcom: sc8180x: specify num_nodes
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 7e0b59496a02d25828612721e846ea4b717a97b9 ]
Specify .num_nodes for several BCMs which missed this declaration.
--- drivers/interconnect/qcom/sc8180x.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/interconnect/qcom/sc8180x.c +6 -0
@@ -1507,22 +1507,26 @@ static struct qcom_icc_bcm bcm_sh3 = {static struct qcom_icc_bcm bcm_sn0 = { .name ="SN0" , + .num_nodes =1 , .nodes = { &slv_qns_gemnoc_sf } };static struct qcom_icc_bcm bcm_sn1 = { .name ="SN1" , + .num_nodes =1 , .nodes = { &slv_qxs_imem } };static struct qcom_icc_bcm bcm_sn2 = { .name ="SN2" , .keepalive = true, + .num_nodes =1 , .nodes = { &slv_qns_gemnoc_gc } };static struct qcom_icc_bcm bcm_co2 = { .name ="CO2" , + .num_nodes =1 , .nodes = { &mas_qnm_npu } };
@@ -1534,12 +1538,14 @@ static struct qcom_icc_bcm bcm_ip0 = {static struct qcom_icc_bcm bcm_sn3 = { .name ="SN3" , .keepalive = true, + .num_nodes =2 , .nodes = { &slv_srvc_aggre1_noc, &slv_qns_cnoc } };static struct qcom_icc_bcm bcm_sn4 = { .name ="SN4" , + .num_nodes =1 , .nodes = { &slv_qxs_pimem } };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 95/253 staging: nvec: Fix incorrect null termination of battery manufacturer
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit a8934352ba01081c51d2df428e9d540aae0e88b5 ]
The battery manufacturer string was incorrectly null terminated using bat_model instead of bat_manu. This could result in an unintended write to the wrong field and potentially incorrect behavior.
fixe the issue by correctly null terminating the bat_manu string.
--- drivers/staging/nvec/nvec_power.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/nvec/nvec_power.c +1 -1
@@ -194,7 +194,7 @@ static int nvec_power_bat_notifier(struct notifier_block *nb,break ;case MANUFACTURER :memcpy (power->bat_manu, &res->plc, res->length -2 ); - power->bat_model[res->length -2 ] ='\0' ; + power->bat_manu[res->length -2 ] ='\0' ;break ;case MODEL :memcpy (power->bat_model, &res->plc, res->length -2 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 96/253 selftests/tracing: Fix false failure of subsystem event test
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
[ Upstream commit 213879061a9c60200ba971330dbefec6df3b4a30 ]
The subsystem event test enables all "sched" events and makes sure there's at least 3 different events in the output. It used to cat the entire trace file to | wc -l, but on slow machines, that could last a very long time. To solve that, it was changed to just read the first 100 lines of the trace file. This can cause false failures as some events repeat so often, that the 100 lines that are examined could possibly be of only one event.
Instead, create an awk script that looks for 3 different events and will exit out after it finds them. This will find the 3 events the test looks for (eventually if it works), and still exit out after the test is satisfied and not cause slower machines to run forever.
--- .../ftrace/test.d/event/subsystem-enable.tc | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-)
tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc +26 -2
@@ -14,11 +14,35 @@ fail() { #msg exit_fail } +# As reading trace can last forever, simply look for 3 different +# events then exit out of reading the file. If there's not 3 different +# events, then the test has failed. +check_unique() { + cat trace | grep -v '^#' | awk ' + BEGIN { cnt = 0; } + { + for (i = 0; i < cnt; i++) { + if (event[i] == $5) { + break; + } + } + if (i == cnt) { + event[cnt++] = $5; + if (cnt > 2) { + exit; + } + } + } + END { + printf "%d", cnt; + }' +} + echo 'sched:*' > set_event yield -count=`head -n 100 trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` +count=`check_unique` if [ $count -lt 3 ]; then fail "at least fork, exec and exit events should be recorded" fi
@@ -29,7 +53,7 @@ echo 1 > events/sched/enable yield -count=`head -n 100 trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` +count=`check_unique` if [ $count -lt 3 ]; then fail "at least fork, exec and exit events should be recorded" fi
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 97/253 drm/rockchip: cleanup fb when drm_gem_fb_afbc_init failed
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Yan <[email protected]>
[ Upstream commit 099593a28138b48feea5be8ce700e5bc4565e31d ]
In the function drm_gem_fb_init_with_funcs, the framebuffer (fb) and its corresponding object ID have already been registered.
So we need to cleanup the drm framebuffer if the subsequent execution of drm_gem_fb_afbc_init fails.
Directly call drm_framebuffer_put to ensure that all fb related resources are cleanup.
--- drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
drivers/gpu/drm/rockchip/rockchip_drm_fb.c +1 -8
@@ -82,16 +82,9 @@ rockchip_fb_create(struct drm_device *dev, struct drm_file *file, }if (drm_is_afbc (mode_cmd->modifier[0 ])) { -int ret, i; - ret =drm_gem_fb_afbc_init (dev, mode_cmd, afbc_fb);if (ret) { -struct drm_gem_object **obj = afbc_fb->base.obj; - -for (i =0 ; i < info->num_planes; ++i) -drm_gem_object_put (obj[i]); - -kfree (afbc_fb); +drm_framebuffer_put (&afbc_fb->base);return ERR_PTR (ret); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 98/253 bpf, sockmap: Fix psock incorrectly pointing to sk
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiayuan Chen <[email protected]>
[ Upstream commit 76be5fae32febb1fdb848ba09f78c4b2c76cb337 ]
We observed an issue from the latest selftest: sockmap_redir where sk_psock(psock->sk) != psock in the backlog. The root cause is the special behavior in sockmap_redir - it frequently performs map_update() and map_delete() on the same socket. During map_update(), we create a new psock and during map_delete(), we eventually free the psock via rcu_work in sk_psock_drop(). However, pending workqueues might still exist and not be processed yet. If users immediately perform another map_update(), a new psock will be allocated for the same sk, resulting in two psocks pointing to the same sk.
When the pending workqueue is later triggered, it uses the old psock to access sk for I/O operations, which is incorrect.
Timing Diagram:
cpu0 cpu1
map_update(sk):
sk->psock = psock1
psock1->sk = skmap_delete(sk):
rcu_work_free(psock1)
map_update(sk):
sk->psock = psock2
psock2->sk = sk
workqueue:
wakeup with psock1, but the sk of psock1 doesn't belong to psock1rcu_handler:
clean psock1
free(psock1)
Previously, we used reference counting to address the concurrency issue between backlog and sock_map_close(). This logic remains necessary as it prevents the sk from being freed while processing the backlog. But this patch prevents pending backlogs from using a psock after it has been stopped.
Note: We cannot call cancel_delayed_work_sync() in map_delete() since this might be invoked in BPF context by BPF helper, and the function may sleep.
--- net/core/skmsg.c | 7 +++++++ 1 file changed, 7 insertions(+)
net/core/skmsg.c +7 -0
@@ -654,6 +654,13 @@ static void sk_psock_backlog(struct work_struct *work)bool ingress;int ret; +/* If sk is quickly removed from the map and then added back, the old +* psock should not be scheduled, because there are now two psocks +* pointing to the same sk. +*/ +if (!sk_psock_test_state (psock,SK_PSOCK_TX_ENABLED )) +return ; +/* Increment the psock refcnt to synchronize with close(fd) path in * sock_map_close(), ensuring we wait for backlog thread completion * before sk_socket freed. If refcnt increment fails, it indicates
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 99/253 bpf, ktls: Fix data corruption when using bpf_msg_pop_data() in ktls
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiayuan Chen <[email protected]>
[ Upstream commit 178f6a5c8cb3b6be1602de0964cd440243f493c9 ]
When sending plaintext data, we initially calculated the corresponding ciphertext length. However, if we later reduced the plaintext data length via socket policy, we failed to recalculate the ciphertext length.
This results in transmitting buffers containing uninitialized data during ciphertext transmission.
This causes uninitialized bytes to be appended after a complete "Application Data" packet, leading to errors on the receiving end when parsing TLS record.
--- net/tls/tls_sw.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
net/tls/tls_sw.c +13 -0
@@ -868,6 +868,19 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk, delta = msg->sg.size; psock->eval =sk_psock_msg_verdict (sk, psock, msg); delta -= msg->sg.size; + +if ((s32 )delta >0 ) { +/* It indicates that we executed bpf_msg_pop_data(), +* causing the plaintext data size to decrease. +* Therefore the encrypted data size also needs to +* correspondingly decrease. We only need to subtract +* delta to calculate the new ciphertext length since +* ktls does not support block encryption. +*/ +struct sk_msg *enc = &ctx->open_rec->msg_encrypted; + +sk_msg_trim (sk, enc, enc->sg.size - delta); + } }if (msg->cork_bytes && msg->cork_bytes > msg->sg.size && !enospc && !full_record) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 100/253 net: ipv6: ip6mr: Fix in/out netdev to pass to the FORWARD chain
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Machata <[email protected]>
[ Upstream commit 3365afd3abda5f6a54f4a822dad5c9314e94c3fc ]
The netfilter hook is invoked with skb->dev for input netdevice, and vif_dev for output netdevice. However at the point of invocation, skb->dev is already set to vif_dev, and MR-forwarded packets are reported with in=out:
# ip6tables -A FORWARD -j LOG --log-prefix '[forw]' # cd tools/testing/selftests/net/forwarding # ./router_multicast.sh # dmesg | fgrep '[forw]' [ 1670.248245] [forw]IN=v5 OUT=v5 [...]
For reference, IPv4 MR code shows in and out as appropriate. Fix by caching skb->dev and using the updated value for output netdev.
--- net/ipv6/ip6mr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv6/ip6mr.c +2 -1
@@ -2045,6 +2045,7 @@ static int ip6mr_forward2(struct net *net, struct mr_table *mrt, struct sk_buff *skb, int vifi) {struct vif_device *vif = &mrt->vif_table[vifi]; +struct net_device *indev = skb->dev;struct net_device *vif_dev;struct ipv6hdr *ipv6h;struct dst_entry *dst;
@@ -2107,7 +2108,7 @@ static int ip6mr_forward2(struct net *net, struct mr_table *mrt,IP6CB (skb)->flags |=IP6SKB_FORWARDED ;return NF_HOOK (NFPROTO_IPV6 ,NF_INET_FORWARD , - net,NULL , skb, skb->dev, vif_dev, + net,NULL , skb, indev, skb->dev, ip6mr_forward2_finish); out_free:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 101/253 bpftool: Fix memory leak in dump_xx_nlmsg on realloc failure
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Chen <[email protected]>
[ Upstream commit 99fe8af069a9fa5b09140518b1364e35713a642e ]
In function dump_xx_nlmsg(), when realloc() fails to allocate memory, the original pointer to the buffer is overwritten with NULL. This causes a memory leak because the previously allocated buffer becomes unreachable without being freed.
--- tools/bpf/bpftool/net.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
tools/bpf/bpftool/net.c +9 -6
@@ -353,17 +353,18 @@ static int dump_link_nlmsg(void *cookie, void *msg, struct nlattr **tb) {struct bpf_netdev_t *netinfo = cookie;struct ifinfomsg *ifinfo = msg; +struct ip_devname_ifindex *tmp;if (netinfo->filter_idx >0 && netinfo->filter_idx != ifinfo->ifi_index)return 0 ;if (netinfo->used_len == netinfo->array_len) { - netinfo->devices =realloc (netinfo->devices, - (netinfo->array_len +16 ) * -sizeof (struct ip_devname_ifindex )); -if (!netinfo->devices) + tmp =realloc (netinfo->devices, + (netinfo->array_len +16 ) *sizeof (struct ip_devname_ifindex )); +if (!tmp)return -ENOMEM ; + netinfo->devices = tmp; netinfo->array_len +=16 ; } netinfo->devices[netinfo->used_len].ifindex = ifinfo->ifi_index;
@@ -382,6 +383,7 @@ static int dump_class_qdisc_nlmsg(void *cookie, void *msg, struct nlattr **tb) {struct bpf_tcinfo_t *tcinfo = cookie;struct tcmsg *info = msg; +struct tc_kind_handle *tmp;if (tcinfo->is_qdisc) {/* skip clsact qdisc */
@@ -393,11 +395,12 @@ static int dump_class_qdisc_nlmsg(void *cookie, void *msg, struct nlattr **tb) }if (tcinfo->used_len == tcinfo->array_len) { - tcinfo->handle_array =realloc (tcinfo->handle_array, + tmp =realloc (tcinfo->handle_array, (tcinfo->array_len +16 ) *sizeof (struct tc_kind_handle )); -if (!tcinfo->handle_array) +if (!tmp)return -ENOMEM ; + tcinfo->handle_array = tmp; tcinfo->array_len +=16 ; } tcinfo->handle_array[tcinfo->used_len].handle = info->tcm_handle;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 102/253 caif: reduce stack size, again
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit b630c781bcf6ff87657146661816d0d30a902139 ]
I tried to fix the stack usage in this function a couple of years ago, but there is still a problem with the latest gcc versions in some configurations:
net/caif/cfctrl.c:553:1: error: the frame size of 1296 bytes is larger than 1280 bytes [-Werror=frame-larger-than=]
Reduce this once again, with a separate cfctrl_link_setup() function that holds the bulk of all the local variables. It also turns out that the param[] array that takes up a large portion of the stack is write-only and can be left out here.
--- net/caif/cfctrl.c | 294 +++++++++++++++++++++++----------------------- 1 file changed, 144 insertions(+), 150 deletions(-)
net/caif/cfctrl.c +144 -150
@@ -351,17 +351,154 @@ int cfctrl_cancel_req(struct cflayer *layr, struct cflayer *adap_layer)return found; } +static int cfctrl_link_setup (struct cfctrl *cfctrl,struct cfpkt *pkt,u8 cmdrsp) +{ +u8 len; +u8 linkid =0 ; +enum cfctrl_srv serv; +enum cfctrl_srv servtype; +u8 endpoint; +u8 physlinkid; +u8 prio; +u8 tmp; +u8 *cp; +int i; +struct cfctrl_link_param linkparam; +struct cfctrl_request_info rsp, *req; + +memset (&linkparam,0 ,sizeof (linkparam)); + + tmp =cfpkt_extr_head_u8 (pkt); + + serv = tmp &CFCTRL_SRV_MASK ; + linkparam.linktype = serv; + + servtype = tmp >>4 ; + linkparam.chtype = servtype; + + tmp =cfpkt_extr_head_u8 (pkt); + physlinkid = tmp &0x07 ; + prio = tmp >>3 ; + + linkparam.priority = prio; + linkparam.phyid = physlinkid; + endpoint =cfpkt_extr_head_u8 (pkt); + linkparam.endpoint = endpoint &0x03 ; + +switch (serv) { +case CFCTRL_SRV_VEI : +case CFCTRL_SRV_DBG : +if (CFCTRL_ERR_BIT & cmdrsp) +break ; +/* Link ID */ + linkid =cfpkt_extr_head_u8 (pkt); +break ; +case CFCTRL_SRV_VIDEO : + tmp =cfpkt_extr_head_u8 (pkt); + linkparam.u.video.connid = tmp; +if (CFCTRL_ERR_BIT & cmdrsp) +break ; +/* Link ID */ + linkid =cfpkt_extr_head_u8 (pkt); +break ; + +case CFCTRL_SRV_DATAGRAM : + linkparam.u.datagram.connid =cfpkt_extr_head_u32 (pkt); +if (CFCTRL_ERR_BIT & cmdrsp) +break ; +/* Link ID */ + linkid =cfpkt_extr_head_u8 (pkt); +break ; +case CFCTRL_SRV_RFM : +/* Construct a frame, convert +* DatagramConnectionID +* to network format long and copy it out... +*/ + linkparam.u.rfm.connid =cfpkt_extr_head_u32 (pkt); + cp = (u8 *) linkparam.u.rfm.volume; +for (tmp =cfpkt_extr_head_u8 (pkt); +cfpkt_more (pkt) && tmp !='\0' ; + tmp =cfpkt_extr_head_u8 (pkt)) + *cp++ = tmp; + *cp ='\0' ; + +if (CFCTRL_ERR_BIT & cmdrsp) +break ; +/* Link ID */ + linkid =cfpkt_extr_head_u8 (pkt); + +break ; +case CFCTRL_SRV_UTIL : +/* Construct a frame, convert +* DatagramConnectionID +* to network format long and copy it out... +*/ +/* Fifosize KB */ + linkparam.u.utility.fifosize_kb =cfpkt_extr_head_u16 (pkt); +/* Fifosize bufs */ + linkparam.u.utility.fifosize_bufs =cfpkt_extr_head_u16 (pkt); +/* name */ + cp = (u8 *) linkparam.u.utility.name; +caif_assert (sizeof (linkparam.u.utility.name) + >=UTILITY_NAME_LENGTH ); +for (i =0 ; i <UTILITY_NAME_LENGTH &&cfpkt_more (pkt); i++) { + tmp =cfpkt_extr_head_u8 (pkt); + *cp++ = tmp; + } +/* Length */ + len =cfpkt_extr_head_u8 (pkt); + linkparam.u.utility.paramlen = len; +/* Param Data */ + cp = linkparam.u.utility.params; +while (cfpkt_more (pkt) && len--) { + tmp =cfpkt_extr_head_u8 (pkt); + *cp++ = tmp; + } +if (CFCTRL_ERR_BIT & cmdrsp) +break ; +/* Link ID */ + linkid =cfpkt_extr_head_u8 (pkt); +/* Length */ + len =cfpkt_extr_head_u8 (pkt); +/* Param Data */ +cfpkt_extr_head (pkt,NULL , len); +break ; +default : +pr_warn ("Request setup, invalid type (%d)\n" , serv); +return -1 ; + } + + rsp.cmd =CFCTRL_CMD_LINK_SETUP ; + rsp.param = linkparam; +spin_lock_bh (&cfctrl->info_list_lock); + req =cfctrl_remove_req (cfctrl, &rsp); + +if (CFCTRL_ERR_BIT == (CFCTRL_ERR_BIT & cmdrsp) || +cfpkt_erroneous (pkt)) { +pr_err ("Invalid O/E bit or parse error " +"on CAIF control channel\n" ); + cfctrl->res.reject_rsp (cfctrl->serv.layer.up,0 , + req ? req->client_layer :NULL ); + }else { + cfctrl->res.linksetup_rsp (cfctrl->serv.layer.up, linkid, + serv, physlinkid, + req ? req->client_layer :NULL ); + } + +kfree (req); + +spin_unlock_bh (&cfctrl->info_list_lock); + +return 0 ; +} +static int cfctrl_recv (struct cflayer *layer,struct cfpkt *pkt) {u8 cmdrsp;u8 cmd; -int ret =-1 ; -u8 len; -u8 param[255 ]; +int ret =0 ;u8 linkid =0 ;struct cfctrl *cfctrl =container_obj (layer); -struct cfctrl_request_info rsp, *req; - cmdrsp =cfpkt_extr_head_u8 (pkt); cmd = cmdrsp &CFCTRL_CMD_MASK ;
@@ -374,150 +511,7 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt)switch (cmd) {case CFCTRL_CMD_LINK_SETUP : - { -enum cfctrl_srv serv; -enum cfctrl_srv servtype; -u8 endpoint; -u8 physlinkid; -u8 prio; -u8 tmp; -u8 *cp; -int i; -struct cfctrl_link_param linkparam; -memset (&linkparam,0 ,sizeof (linkparam)); - - tmp =cfpkt_extr_head_u8 (pkt); - - serv = tmp &CFCTRL_SRV_MASK ; - linkparam.linktype = serv; - - servtype = tmp >>4 ; - linkparam.chtype = servtype; - - tmp =cfpkt_extr_head_u8 (pkt); - physlinkid = tmp &0x07 ; - prio = tmp >>3 ; - - linkparam.priority = prio; - linkparam.phyid = physlinkid; - endpoint =cfpkt_extr_head_u8 (pkt); - linkparam.endpoint = endpoint &0x03 ; - -switch (serv) { -case CFCTRL_SRV_VEI : -case CFCTRL_SRV_DBG : -if (CFCTRL_ERR_BIT & cmdrsp) -break ; -/* Link ID */ - linkid =cfpkt_extr_head_u8 (pkt); -break ; -case CFCTRL_SRV_VIDEO : - tmp =cfpkt_extr_head_u8 (pkt); - linkparam.u.video.connid = tmp; -if (CFCTRL_ERR_BIT & cmdrsp) -break ; -/* Link ID */ - linkid =cfpkt_extr_head_u8 (pkt); -break ; - -case CFCTRL_SRV_DATAGRAM : - linkparam.u.datagram.connid = -cfpkt_extr_head_u32 (pkt); -if (CFCTRL_ERR_BIT & cmdrsp) -break ; -/* Link ID */ - linkid =cfpkt_extr_head_u8 (pkt); -break ; -case CFCTRL_SRV_RFM : -/* Construct a frame, convert -* DatagramConnectionID -* to network format long and copy it out... -*/ - linkparam.u.rfm.connid = -cfpkt_extr_head_u32 (pkt); - cp = (u8 *) linkparam.u.rfm.volume; -for (tmp =cfpkt_extr_head_u8 (pkt); -cfpkt_more (pkt) && tmp !='\0' ; - tmp =cfpkt_extr_head_u8 (pkt)) - *cp++ = tmp; - *cp ='\0' ; - -if (CFCTRL_ERR_BIT & cmdrsp) -break ; -/* Link ID */ - linkid =cfpkt_extr_head_u8 (pkt); - -break ; -case CFCTRL_SRV_UTIL : -/* Construct a frame, convert -* DatagramConnectionID -* to network format long and copy it out... -*/ -/* Fifosize KB */ - linkparam.u.utility.fifosize_kb = -cfpkt_extr_head_u16 (pkt); -/* Fifosize bufs */ - linkparam.u.utility.fifosize_bufs = -cfpkt_extr_head_u16 (pkt); -/* name */ - cp = (u8 *) linkparam.u.utility.name; -caif_assert (sizeof (linkparam.u.utility.name) - >=UTILITY_NAME_LENGTH ); -for (i =0 ; - i <UTILITY_NAME_LENGTH - &&cfpkt_more (pkt); i++) { - tmp =cfpkt_extr_head_u8 (pkt); - *cp++ = tmp; - } -/* Length */ - len =cfpkt_extr_head_u8 (pkt); - linkparam.u.utility.paramlen = len; -/* Param Data */ - cp = linkparam.u.utility.params; -while (cfpkt_more (pkt) && len--) { - tmp =cfpkt_extr_head_u8 (pkt); - *cp++ = tmp; - } -if (CFCTRL_ERR_BIT & cmdrsp) -break ; -/* Link ID */ - linkid =cfpkt_extr_head_u8 (pkt); -/* Length */ - len =cfpkt_extr_head_u8 (pkt); -/* Param Data */ -cfpkt_extr_head (pkt, ¶m, len); -break ; -default : -pr_warn ("Request setup, invalid type (%d)\n" , - serv); - goto error; - } - - rsp.cmd = cmd; - rsp.param = linkparam; -spin_lock_bh (&cfctrl->info_list_lock); - req =cfctrl_remove_req (cfctrl, &rsp); - -if (CFCTRL_ERR_BIT == (CFCTRL_ERR_BIT & cmdrsp) || -cfpkt_erroneous (pkt)) { -pr_err ("Invalid O/E bit or parse error " -"on CAIF control channel\n" ); - cfctrl->res.reject_rsp (cfctrl->serv.layer.up, -0 , - req ? req->client_layer - :NULL ); - }else { - cfctrl->res.linksetup_rsp (cfctrl->serv. - layer.up, linkid, - serv, physlinkid, - req ? req-> - client_layer :NULL ); - } - -kfree (req); - -spin_unlock_bh (&cfctrl->info_list_lock); - } + ret =cfctrl_link_setup (cfctrl, pkt, cmdrsp);break ;case CFCTRL_CMD_LINK_DESTROY : linkid =cfpkt_extr_head_u8 (pkt);
@@ -544,9 +538,9 @@ static int cfctrl_recv(struct cflayer *layer, struct cfpkt *pkt)break ;default :pr_err ("Unrecognized Control Frame\n" ); + ret =-1 ; goto error; } - ret =0 ; error:cfpkt_destroy (pkt);return ret;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 103/253 wifi: rtl818x: Kill URBs before clearing tx status queue
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniil Dulov <[email protected]>
[ Upstream commit 16d8fd74dbfca0ea58645cd2fca13be10cae3cdd ]
In rtl8187_stop() move the call of usb_kill_anchored_urbs() before clearing b_tx_status.queue. This change prevents callbacks from using already freed skb due to anchor was not killed before freeing such skb.
BUG: kernel NULL pointer dereference, address: 0000000000000080 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: Oops: 0000 [#1] SMP NOPTI CPU: 7 UID: 0 PID: 0 Comm: swapper/7 Not tainted 6.15.0 #8 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 RIP: 0010:ieee80211_tx_status_irqsafe+0x21/0xc0 [mac80211] Call Trace: <IRQ> rtl8187_tx_cb+0x116/0x150 [rtl8187] __usb_hcd_giveback_urb+0x9d/0x120 usb_giveback_urb_bh+0xbb/0x140 process_one_work+0x19b/0x3c0 bh_worker+0x1a7/0x210 tasklet_action+0x10/0x30 handle_softirqs+0xf0/0x340 __irq_exit_rcu+0xcd/0xf0 common_interrupt+0x85/0xa0 </IRQ>
Tested on RTL8187BvE device.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c +2 -1
@@ -1041,10 +1041,11 @@ static void rtl8187_stop(struct ieee80211_hw *dev)rtl818x_iowrite8 (priv, &priv->map->CONFIG4, reg |RTL818X_CONFIG4_VCOOFF );rtl818x_iowrite8 (priv, &priv->map->EEPROM_CMD,RTL818X_EEPROM_CMD_NORMAL ); +usb_kill_anchored_urbs (&priv->anchored); +while ((skb =skb_dequeue (&priv->b_tx_status.queue)))dev_kfree_skb_any (skb); -usb_kill_anchored_urbs (&priv->anchored);mutex_unlock (&priv->conf_mutex);if (!priv->is_rtl8187b)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 104/253 wifi: iwlwifi: Fix memory leak in iwl_mvm_init()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiu Jianfeng <[email protected]>
[ Upstream commit ed2e916c890944633d6826dce267579334f63ea5 ]
When iwl_opmode_register() fails, it does not unregster rate control, which will cause a memory leak issue, this patch fixes it.
--- drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/mvm/ops.c +3 -1
@@ -64,8 +64,10 @@ static int __init iwl_mvm_init(void) } ret =iwl_opmode_register ("iwlmvm" , &iwl_mvm_ops); -if (ret) +if (ret) {pr_err ("Unable to register MVM op_mode: %d\n" , ret); +iwl_mvm_rate_control_unregister (); + }return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 105/253 iwlwifi: Add missing check for alloc_ordered_workqueue
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 90a0d9f339960448a3acc1437a46730f975efd6a ]
Add check for the return value of alloc_ordered_workqueue since it may return NULL pointer.
--- drivers/net/wireless/intel/iwlwifi/dvm/main.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/net/wireless/intel/iwlwifi/dvm/main.c +9 -2
@@ -1048,9 +1048,11 @@ static void iwl_bg_restart(struct work_struct *data)* *****************************************************************************/ -static void iwl_setup_deferred_work (struct iwl_priv *priv) +static int iwl_setup_deferred_work (struct iwl_priv *priv) { priv->workqueue =alloc_ordered_workqueue (DRV_NAME ,0 ); +if (!priv->workqueue) +return -ENOMEM ;INIT_WORK (&priv->restart, iwl_bg_restart);INIT_WORK (&priv->beacon_update, iwl_bg_beacon_update);
@@ -1067,6 +1069,8 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)timer_setup (&priv->statistics_periodic, iwl_bg_statistics_periodic,0 );timer_setup (&priv->ucode_trace, iwl_bg_ucode_trace,0 ); + +return 0 ; }void iwl_cancel_deferred_work (struct iwl_priv *priv)
@@ -1456,7 +1460,9 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,/******************** * 6. Setup services ********************/ -iwl_setup_deferred_work (priv); +if (iwl_setup_deferred_work (priv)) + goto out_uninit_drv; +iwl_setup_rx_handlers (priv);iwl_power_initialize (priv);
@@ -1494,6 +1500,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,iwl_cancel_deferred_work (priv);destroy_workqueue (priv->workqueue); priv->workqueue =NULL ; +out_uninit_drv:iwl_uninit_drv (priv); out_free_eeprom_blob:kfree (priv->eeprom_blob);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 106/253 wifi: ath11k: clear initialized flag for deinit-ed srng lists
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Senozhatsky <[email protected]>
[ Upstream commit a5b46aa7cf5f05c213316a018e49a8e086efd98e ]
In a number of cases we see kernel panics on resume due to ath11k kernel page fault, which happens under the following circumstances:
1) First ath11k_hal_dump_srng_stats() call
Last interrupt received for each group:
ath11k_pci 0000:01:00.0: group_id 0 22511ms before
ath11k_pci 0000:01:00.0: group_id 1 14440788ms before
[..]
ath11k_pci 0000:01:00.0: failed to receive control response completion, polling.. ath11k_pci 0000:01:00.0: Service connect timeout
ath11k_pci 0000:01:00.0: failed to connect to HTT: -110
ath11k_pci 0000:01:00.0: failed to start core: -110
ath11k_pci 0000:01:00.0: firmware crashed: MHI_CB_EE_RDDM
ath11k_pci 0000:01:00.0: already resetting count 2
ath11k_pci 0000:01:00.0: failed to wait wlan mode request (mode 4): -110 ath11k_pci 0000:01:00.0: qmi failed to send wlan mode off: -110 ath11k_pci 0000:01:00.0: failed to reconfigure driver on crash recovery [..]
2) At this point reconfiguration fails (we have 2 resets) and ath11k_core_reconfigure_on_crash() calls ath11k_hal_srng_deinit() which destroys srng lists. However, it does not reset per-list ->initialized flag.
3) Second ath11k_hal_dump_srng_stats() call sees stale ->initialized flag and attempts to dump srng stats:
Last interrupt received for each group:
ath11k_pci 0000:01:00.0: group_id 0 66785ms before ath11k_pci 0000:01:00.0: group_id 1 14485062ms before ath11k_pci 0000:01:00.0: group_id 2 14485062ms before ath11k_pci 0000:01:00.0: group_id 3 14485062ms before ath11k_pci 0000:01:00.0: group_id 4 14780845ms before ath11k_pci 0000:01:00.0: group_id 5 14780845ms before ath11k_pci 0000:01:00.0: group_id 6 14485062ms before ath11k_pci 0000:01:00.0: group_id 7 66814ms before ath11k_pci 0000:01:00.0: group_id 8 68997ms before ath11k_pci 0000:01:00.0: group_id 9 67588ms before ath11k_pci 0000:01:00.0: group_id 10 69511ms before
BUG: unable to handle page fault for address: ffffa007404eb010 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 100000067 P4D 100000067 PUD 10022d067 PMD 100b01067 PTE 0 Oops: 0000 [#1] PREEMPT SMP NOPTI RIP: 0010:ath11k_hal_dump_srng_stats+0x2b4/0x3b0 [ath11k] Call Trace: <TASK> ? __die_body+0xae/0xb0 ? page_fault_oops+0x381/0x3e0 ? exc_page_fault+0x69/0xa0 ? asm_exc_page_fault+0x22/0x30 ? ath11k_hal_dump_srng_stats+0x2b4/0x3b0 [ath11k (HASH:6cea 4)] ath11k_qmi_driver_event_work+0xbd/0x1050 [ath11k (HASH:6cea 4)] worker_thread+0x389/0x930 kthread+0x149/0x170
Clear per-list ->initialized flag in ath11k_hal_srng_deinit().
--- drivers/net/wireless/ath/ath11k/hal.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/ath/ath11k/hal.c +4 -0
@@ -1314,6 +1314,10 @@ EXPORT_SYMBOL(ath11k_hal_srng_init);void ath11k_hal_srng_deinit (struct ath11k_base *ab) {struct ath11k_hal *hal = &ab->hal; +int i; + +for (i =0 ; i <HAL_SRNG_RING_ID_MAX ; i++) + ab->hal.srng_list[i].initialized =0 ;ath11k_hal_unregister_srng_key (ab);ath11k_hal_free_cont_rdp (ab);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 107/253 tcp: fix tcp_ofo_queue() to avoid including too much DUP SACK range
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: xin.guo <[email protected]>
[ Upstream commit a041f70e573e185d5d5fdbba53f0db2fbe7257ad ]
If the new coming segment covers more than one skbs in the ofo queue, and which seq is equal to rcv_nxt, then the sequence range that is duplicated will be sent as DUP SACK, the detail as below, in step6, the {501,2001} range is clearly including too much DUP SACK range, in violation of RFC 2883 rules.
1. client > server: Flags [.], seq 501:1001, ack 1325288529, win 20000, length 500
2. server > client: Flags [.], ack 1, [nop,nop,sack 1 {501:1001}], length 0
3. client > server: Flags [.], seq 1501:2001, ack 1325288529, win 20000, length 500
4. server > client: Flags [.], ack 1, [nop,nop,sack 2 {1501:2001} {501:1001}], length 0
5. client > server: Flags [.], seq 1:2001, ack 1325288529, win 20000, length 2000
6. server > client: Flags [.], ack 2001, [nop,nop,sack 1 {501:2001}], length 0
After this fix, the final ACK is as below:
6. server > client: Flags [.], ack 2001, options [nop,nop,sack 1 {501:1001}], length 0
[edumazet] added a new packetdrill test in the following patch.
--- net/ipv4/tcp_input.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/tcp_input.c +2 -1
@@ -4834,8 +4834,9 @@ static void tcp_ofo_queue(struct sock *sk)if (before (TCP_SKB_CB (skb)->seq, dsack_high)) {__u32 dsack = dsack_high; +if (before (TCP_SKB_CB (skb)->end_seq, dsack_high)) - dsack_high =TCP_SKB_CB (skb)->end_seq; + dsack =TCP_SKB_CB (skb)->end_seq;tcp_dsack_extend (sk,TCP_SKB_CB (skb)->seq, dsack); } p =rb_next (p);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 108/253 net/mlx5: Check device memory pointer before usage
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stav Aviram <[email protected]>
[ Upstream commit 70f238c902b8c0461ae6fbb8d1a0bbddc4350eea ]
Add a NULL check before accessing device memory to prevent a crash if dev->dm allocation in mlx5_init_once() fails.
--- drivers/infiniband/hw/mlx5/dm.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/lib/dm.c | 4 ++-- drivers/net/ethernet/mellanox/mlx5/core/main.c | 3 --- 3 files changed, 3 insertions(+), 6 deletions(-)
drivers/infiniband/hw/mlx5/dm.c +1 -1
@@ -282,7 +282,7 @@ static struct ib_dm *handle_alloc_dm_memic(struct ib_ucontext *ctx,int err;u64 address; -if (!MLX5_CAP_DEV_MEM (dm_db->dev, memic)) +if (!dm_db || !MLX5_CAP_DEV_MEM (dm_db->dev, memic))return ERR_PTR (-EOPNOTSUPP ); dm =kzalloc (sizeof (*dm),GFP_KERNEL );
drivers/net/ethernet/mellanox/mlx5/core/lib/dm.c +2 -2
@@ -28,7 +28,7 @@ struct mlx5_dm *mlx5_dm_create(struct mlx5_core_dev *dev) dm =kzalloc (sizeof (*dm),GFP_KERNEL );if (!dm) -return ERR_PTR (-ENOMEM ); +return NULL ;spin_lock_init (&dm->lock);
@@ -80,7 +80,7 @@ struct mlx5_dm *mlx5_dm_create(struct mlx5_core_dev *dev) err_steering:kfree (dm); -return ERR_PTR (-ENOMEM ); +return NULL ; }void mlx5_dm_cleanup (struct mlx5_core_dev *dev)
drivers/net/ethernet/mellanox/mlx5/core/main.c +0 -3
@@ -1022,9 +1022,6 @@ static int mlx5_init_once(struct mlx5_core_dev *dev) } dev->dm =mlx5_dm_create (dev); -if (IS_ERR (dev->dm)) -mlx5_core_warn (dev,"Failed to init device memory %ld\n" ,PTR_ERR (dev->dm)); - dev->tracer =mlx5_fw_tracer_create (dev); dev->hv_vhca =mlx5_hv_vhca_create (dev); dev->rsc_dump =mlx5_rsc_dump_create (dev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 109/253 kselftest/arm64: Fix check for setting new VLs in sve-ptrace
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Brown <[email protected]>
[ Upstream commit 867446f090589626497638f70b10be5e61a0b925 ]
The check that the new vector length we set was the expected one was typoed to an assignment statement which for some reason the compilers didn't spot, most likely due to the macros involved.
--- tools/testing/selftests/arm64/fp/sve-ptrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/arm64/fp/sve-ptrace.c +1 -1
@@ -241,7 +241,7 @@ static void ptrace_set_get_vl(pid_t child, const struct vec_type *type,return ; } -ksft_test_result (new_sve->vl = prctl_vl,"Set %s VL %u\n" , +ksft_test_result (new_sve->vl == prctl_vl,"Set %s VL %u\n" , type->name, vl);free (new_sve);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 110/253 m68k: Dont unregister boot console needlessly
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Finn Thain <[email protected]>
[ Upstream commit 83f672a7f69ec38b1bbb27221e342937f68c11c7 ]
When MACH_IS_MVME147, the boot console calls mvme147_scc_write() to generate console output. That will continue to work even after debug_cons_nputs() becomes unavailable so there's no need to unregister the boot console.
Take the opportunity to remove a repeated MACH_IS_* test. Use the actual .write method (instead of a wrapper) and test that pointer instead. This means adding an unused parameter to debug_cons_nputs() for consistency with the struct console API.
early_printk.c is only built when CONFIG_EARLY_PRINTK=y. As of late, head.S is only built when CONFIG_MMU_MOTOROLA=y. So let the former symbol depend on the latter, to obviate some ifdef conditionals.
--- arch/m68k/Kconfig.debug | 2 +- arch/m68k/kernel/early_printk.c | 42 +++++++++++---------------------- arch/m68k/kernel/head.S | 8 +++---- 3 files changed, 19 insertions(+), 33 deletions(-)
arch/m68k/Kconfig.debug +1 -1
@@ -10,7 +10,7 @@ config BOOTPARAM_STRING config EARLY_PRINTK bool "Early printk" - depends on !(SUN3 || M68000 || COLDFIRE) + depends on MMU_MOTOROLA help Write kernel log output directly to a serial port. Where implemented, output goes to the framebuffer as well.
arch/m68k/kernel/early_printk.c +14 -28
65 lines not on this page · raw message
arch/m68k/kernel/head.S +4 -4
@@ -3267,8 +3267,8 @@ func_return putn * turns around and calls the internal routines. This routine * is used by the boot console. * - * The calling parameters are: - * void debug_cons_nputs(const char *str, unsigned length) + * The function signature is - + * void debug_cons_nputs(struct console *c, const char *s, unsigned int n) * * This routine does NOT understand variable arguments only * simple strings!
@@ -3277,8 +3277,8 @@ ENTRY(debug_cons_nputs) moveml %d0/%d1/%a0,%sp@- movew %sr,%sp@- ori #0x0700,%sr - movel %sp@(18),%a0 /* fetch parameter */ - movel %sp@(22),%d1 /* fetch parameter */ + movel %sp@(22),%a0 /* char *s */ + movel %sp@(26),%d1 /* unsigned int n */ jra 2f 1: #ifdef CONSOLE_DEBUG
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 111/253 drm/amd/pm/powerplay/hwmgr/smu_helper: fix order of mask and value
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit a54e4639c4ef37a0241bac7d2a77f2e6ffb57099 ]
There is a small typo in phm_wait_on_indirect_register().
Swap mask and value arguments provided to phm_wait_on_register() so that they satisfy the function signature and actual usage scheme.
Found by Linux Verification Center (linuxtesting.org) with Svace static analysis tool.
In practice this doesn't fix any issues because the only place this function is used uses the same value for the value and mask.
--- drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu_helper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu_helper.c +1 -1
@@ -149,7 +149,7 @@ int phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, }cgs_write_register (hwmgr->device, indirect_port, index); -return phm_wait_on_register (hwmgr, indirect_port +1 , mask, value); +return phm_wait_on_register (hwmgr, indirect_port +1 , value, mask); } int phm_wait_for_register_unequal(struct pp_hwmgr *hwmgr,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 112/253 fbcon: Fix outdated registered_fb reference in comment
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shixiong Ou <[email protected]>
[ Upstream commit 0f168e7be696a17487e83d1d47e5a408a181080f ]
The variable was renamed to fbcon_registered_fb, but this comment was not updated along with the change. Correct it to avoid confusion.
--- drivers/video/fbdev/core/fbcon.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/fbdev/core/fbcon.c +2 -2
@@ -935,13 +935,13 @@ static const char *fbcon_startup(void)int rows, cols;/* -* If num_registered_fb is zero, this is a call for the dummy part. +* If fbcon_num_registered_fb is zero, this is a call for the dummy part. * The frame buffer devices weren't initialized yet. */ if (!fbcon_num_registered_fb || info_idx ==-1 )return display_desc;/* -* Instead of blindly using registered_fb[0], we use info_idx, set by +* Instead of blindly using fbcon_registered_fb[0], we use info_idx, set by * fbcon_fb_registered(); */ info = fbcon_registered_fb[info_idx];
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 113/253 netfilter: nf_tables: adjust lockdep assertions handling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit 8df1b40de76979bb8e975201d07b71103d5de820 ]
It's needed to check the return value of lockdep_commit_lock_is_held(), otherwise there's no point in this assertion as it doesn't print any debug information on itself.
Found by Linux Verification Center (linuxtesting.org) with Svace static analysis tool.
--- net/netfilter/nf_tables_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/netfilter/nf_tables_api.c +2 -2
@@ -3513,7 +3513,7 @@ void nf_tables_rule_destroy(const struct nft_ctx *ctx, struct nft_rule *rule)/* can only be used if rule is no longer visible to dumps */ static void nf_tables_rule_release (const struct nft_ctx *ctx,struct nft_rule *rule) { -lockdep_commit_lock_is_held (ctx->net); +WARN_ON_ONCE (!lockdep_commit_lock_is_held (ctx->net));nft_rule_expr_deactivate (ctx, rule,NFT_TRANS_RELEASE );nf_tables_rule_destroy (ctx, rule);
@@ -5250,7 +5250,7 @@ void nf_tables_deactivate_set(const struct nft_ctx *ctx, struct nft_set *set,struct nft_set_binding *binding, enum nft_trans_phase phase) { - lockdep_commit_lock_is_held(ctx->net); + WARN_ON_ONCE(!lockdep_commit_lock_is_held(ctx->net));switch (phase) {case NFT_TRANS_PREPARE_ERROR :
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 114/253 arch: powerpc: defconfig: Drop obsolete CONFIG_NET_CLS_TCINDEX
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Korsnes <[email protected]>
[ Upstream commit 75cd37c5f28b85979fd5a65174013010f6b78f27 ]
This option was removed from the Kconfig in commit 8c710f75256b ("net/sched: Retire tcindex classifier") but it was not removed from the defconfigs.
--- arch/powerpc/configs/ppc6xx_defconfig | 1 - 1 file changed, 1 deletion(-)
arch/powerpc/configs/ppc6xx_defconfig +0 -1
@@ -263,7 +263,6 @@ CONFIG_NET_SCH_DSMARK=m CONFIG_NET_SCH_NETEM=m CONFIG_NET_SCH_INGRESS=m CONFIG_NET_CLS_BASIC=m -CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 115/253 um: rtc: Avoid shadowing err in uml_rtc_start()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tiwei Bie <[email protected]>
[ Upstream commit 4c916e3b224a02019b3cc3983a15f32bfd9a22df ]
Remove the declaration of 'err' inside the 'if (timetravel)' block, as it would otherwise be unavailable outside that block, potentially leading to uml_rtc_start() returning an uninitialized value.
--- arch/um/drivers/rtc_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/um/drivers/rtc_user.c +1 -1
@@ -28,7 +28,7 @@ int uml_rtc_start(bool timetravel)int err;if (timetravel) { -int err =os_pipe (uml_rtc_irq_fds,1 ,1 ); + err =os_pipe (uml_rtc_irq_fds,1 ,1 );if (err) goto fail; }else {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 116/253 net/sched: Restrict conditions for adding duplicating netems to qdisc tree
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: William Liu <[email protected]>
[ Upstream commit ec8e0e3d7adef940cdf9475e2352c0680189d14e ]
netem_enqueue's duplication prevention logic breaks when a netem resides in a qdisc tree with other netems - this can lead to a soft lockup and OOM loop in netem_dequeue, as seen in [1]. Ensure that a duplicating netem cannot exist in a tree with other netems.
Previous approaches suggested in discussions in chronological order:
1) Track duplication status or ttl in the sk_buff struct. Considered too specific a use case to extend such a struct, though this would be a resilient fix and address other previous and potential future DOS bugs like the one described in loopy fun [2].
2) Restrict netem_enqueue recursion depth like in act_mirred with a per cpu variable. However, netem_dequeue can call enqueue on its child, and the depth restriction could be bypassed if the child is a netem.
3) Use the same approach as in 2, but add metadata in netem_skb_cb to handle the netem_dequeue case and track a packet's involvement in duplication. This is an overly complex approach, and Jamal notes that the skb cb can be overwritten to circumvent this safeguard.
4) Prevent the addition of a netem to a qdisc tree if its ancestral path contains a netem. However, filters and actions can cause a packet to change paths when re-enqueued to the root from netem duplication, leading us to the current solution: prevent a duplicating netem from inhabiting the same tree as other netems.
[1] https://lore.kernel.org/netdev/8DuRWwfqjoRDLDmBMlIfbrsZg9Gx50DHJc1ilxsEBNe2D6NMoigR_eIRIG0LOjMc3r10nUUZtArXx4oZBIdUfZQrwjcQhdinnMis_0G7VEk=@willsroot.io/
[2] https://lwn.net/Articles/719297/
--- net/sched/sch_netem.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
net/sched/sch_netem.c +40 -0
@@ -962,6 +962,41 @@ static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla,return 0 ; } +static const struct Qdisc_class_ops netem_class_ops; + +static int check_netem_in_tree (struct Qdisc *sch,bool duplicates, +struct netlink_ext_ack *extack) +{ +struct Qdisc *root, *q; +unsigned int i; + + root =qdisc_root_sleeping (sch); + +if (sch != root && root->ops->cl_ops == &netem_class_ops) { +if (duplicates || + ((struct netem_sched_data *)qdisc_priv (root))->duplicate) + goto err; + } + +if (!qdisc_dev (root)) +return 0 ; + +hash_for_each (qdisc_dev (root)->qdisc_hash, i, q, hash) { +if (sch != q && q->ops->cl_ops == &netem_class_ops) { +if (duplicates || + ((struct netem_sched_data *)qdisc_priv (q))->duplicate) + goto err; + } + } + +return 0 ; + +err: +NL_SET_ERR_MSG (extack, +"netem: cannot mix duplicating netems with other netems in tree" ); +return -EINVAL ; +} +/* Parse netlink message to set options */ static int netem_change (struct Qdisc *sch,struct nlattr *opt,struct netlink_ext_ack *extack)
@@ -1020,6 +1055,11 @@ static int netem_change(struct Qdisc *sch, struct nlattr *opt, q->gap = qopt->gap; q->counter =0 ; q->loss = qopt->loss; + + ret =check_netem_in_tree (sch, qopt->duplicate, extack); +if (ret) + goto unlock; + q->duplicate = qopt->duplicate;/* for compatibility with earlier versions.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 117/253 net_sched: act_ctinfo: use atomic64_t for three counters
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit d300335b4e18672913dd792ff9f49e6cccf41d26 ]
Commit 21c167aa0ba9 ("net/sched: act_ctinfo: use percpu stats") missed that stats_dscp_set, stats_dscp_error and stats_cpmark_set might be written (and read) locklessly.
Use atomic64_t for these three fields, I doubt act_ctinfo is used heavily on big SMP hosts anyway.
--- include/net/tc_act/tc_ctinfo.h | 6 +++--- net/sched/act_ctinfo.c | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-)
include/net/tc_act/tc_ctinfo.h +3 -3
@@ -18,9 +18,9 @@ struct tcf_ctinfo_params {struct tcf_ctinfo {struct tc_action common;struct tcf_ctinfo_params __rcu *params; -u64 stats_dscp_set; -u64 stats_dscp_error; -u64 stats_cpmark_set; +atomic64_t stats_dscp_set; +atomic64_t stats_dscp_error; +atomic64_t stats_cpmark_set; };enum {
net/sched/act_ctinfo.c +11 -8
@@ -43,9 +43,9 @@ static void tcf_ctinfo_dscp_set(struct nf_conn *ct, struct tcf_ctinfo *ca,ipv4_change_dsfield (ip_hdr (skb),INET_ECN_MASK , newdscp); - ca->stats_dscp_set++; +atomic64_inc (&ca->stats_dscp_set); }else { - ca->stats_dscp_error++; +atomic64_inc (&ca->stats_dscp_error); } }break ;
@@ -56,9 +56,9 @@ static void tcf_ctinfo_dscp_set(struct nf_conn *ct, struct tcf_ctinfo *ca,ipv6_change_dsfield (ipv6_hdr (skb),INET_ECN_MASK , newdscp); - ca->stats_dscp_set++; +atomic64_inc (&ca->stats_dscp_set); }else { - ca->stats_dscp_error++; +atomic64_inc (&ca->stats_dscp_error); } }break ;
@@ -71,7 +71,7 @@ static void tcf_ctinfo_cpmark_set(struct nf_conn *ct, struct tcf_ctinfo *ca,struct tcf_ctinfo_params *cp, struct sk_buff *skb) { - ca->stats_cpmark_set++; + atomic64_inc(&ca->stats_cpmark_set); skb->mark =READ_ONCE (ct->mark) & cp->cpmarkmask; }
@@ -321,15 +321,18 @@ static int tcf_ctinfo_dump(struct sk_buff *skb, struct tc_action *a, }if (nla_put_u64_64bit (skb,TCA_CTINFO_STATS_DSCP_SET , - ci->stats_dscp_set,TCA_CTINFO_PAD )) +atomic64_read (&ci->stats_dscp_set), +TCA_CTINFO_PAD )) goto nla_put_failure;if (nla_put_u64_64bit (skb,TCA_CTINFO_STATS_DSCP_ERROR , - ci->stats_dscp_error,TCA_CTINFO_PAD )) +atomic64_read (&ci->stats_dscp_error), +TCA_CTINFO_PAD )) goto nla_put_failure;if (nla_put_u64_64bit (skb,TCA_CTINFO_STATS_CPMARK_SET , - ci->stats_cpmark_set,TCA_CTINFO_PAD )) +atomic64_read (&ci->stats_cpmark_set), +TCA_CTINFO_PAD )) goto nla_put_failure;spin_unlock_bh (&ci->tcf_lock);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 118/253 xen/gntdev: remove struct gntdev_copy_batch from stack
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juergen Gross <[email protected]>
[ Upstream commit 70045cf6593cbf0740956ea9b7b4269142c6ee38 ]
When compiling the kernel with LLVM, the following warning was issued:
drivers/xen/gntdev.c:991: warning: stack frame size (1160) exceeds limit (1024) in function 'gntdev_ioctl'
The main reason is struct gntdev_copy_batch which is located on the stack and has a size of nearly 1kb.
For performance reasons it shouldn't by just dynamically allocated instead, so allocate a new instance when needed and instead of freeing it put it into a list of free structs anchored in struct gntdev_priv.
Message-ID: <[email protected]>
--- drivers/xen/gntdev-common.h | 4 +++ drivers/xen/gntdev.c | 71 ++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 21 deletions(-)
drivers/xen/gntdev-common.h +4 -0
@@ -26,6 +26,10 @@ struct gntdev_priv {/* lock protects maps and freeable_maps. */ struct mutex lock; +/* Free instances of struct gntdev_copy_batch. */ +struct gntdev_copy_batch *batch; +struct mutex batch_lock; +#ifdef CONFIG_XEN_GRANT_DMA_ALLOC /* Device for which DMA memory is allocated. */ struct device *dma_dev;
drivers/xen/gntdev.c +50 -21
127 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 119/253 wifi: rtl8xxxu: Fix RX skb size for aggregation disabled
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Kaistra <[email protected]>
[ Upstream commit d76a1abcf57734d2bcd4a7ec051617edd4513d7f ]
Commit 1e5b3b3fe9e0 ("rtl8xxxu: Adjust RX skb size to include space for phystats") increased the skb size when aggregation is enabled but decreased it for the aggregation disabled case.
As a result, if a frame near the maximum size is received, rtl8xxxu_rx_complete() is called with status -EOVERFLOW and then the driver starts to malfunction and no further communication is possible.
Restore the skb size in the aggregation disabled case.
--- drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +1 -1
@@ -5858,7 +5858,7 @@ static int rtl8xxxu_submit_rx_urb(struct rtl8xxxu_priv *priv, skb_size = fops->rx_agg_buf_size; skb_size += (rx_desc_sz +sizeof (struct rtl8723au_phy_stats )); }else { - skb_size =IEEE80211_MAX_FRAME_LEN ; + skb_size =IEEE80211_MAX_FRAME_LEN + rx_desc_sz; } skb =__netdev_alloc_skb (NULL , skb_size,GFP_KERNEL );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 120/253 mwl8k: Add missing check after DMA map
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 50459501b9a212dbe7a673727589ee105a8a9954 ]
The DMA map functions can fail and should be tested for errors. If the mapping fails, unmap and return an error.
--- drivers/net/wireless/marvell/mwl8k.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/marvell/mwl8k.c +4 -0
@@ -1222,6 +1222,10 @@ static int rxq_refill(struct ieee80211_hw *hw, int index, int limit) addr =dma_map_single (&priv->pdev->dev, skb->data,MWL8K_RX_MAXSZ ,DMA_FROM_DEVICE ); +if (dma_mapping_error (&priv->pdev->dev, addr)) { +kfree_skb (skb); +break ; + } rxq->rxd_count++; rx = rxq->tail++;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 121/253 wifi: mac80211: reject TDLS operations when station is not associated
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Moon Hee Lee <[email protected]>
[ Upstream commit 16ecdab5446f15a61ec88eb0d23d25d009821db0 ]
syzbot triggered a WARN in ieee80211_tdls_oper() by sending NL80211_TDLS_ENABLE_LINK immediately after NL80211_CMD_CONNECT, before association completed and without prior TDLS setup.
This left internal state like sdata->u.mgd.tdls_peer uninitialized, leading to a WARN_ON() in code paths that assumed it was valid.
Reject the operation early if not in station mode or not associated.
--- net/mac80211/tdls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac80211/tdls.c +1 -1
@@ -1351,7 +1351,7 @@ int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,if (!(wiphy->flags &WIPHY_FLAG_SUPPORTS_TDLS ))return -ENOTSUPP ; -if (sdata->vif.type !=NL80211_IFTYPE_STATION ) +if (sdata->vif.type !=NL80211_IFTYPE_STATION || !sdata->vif.cfg.assoc)return -EINVAL ;switch (oper) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 122/253 wifi: plfxlc: Fix error handling in usb driver probe
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Murad Masimov <[email protected]>
[ Upstream commit 3fe79a25c3cd54d25d30bc235c0c57f8a123d9d5 ]
If probe fails before ieee80211_register_hw() is successfully done, ieee80211_unregister_hw() will be called anyway. This may lead to various bugs as the implementation of ieee80211_unregister_hw() assumes that ieee80211_register_hw() has been called.
Divide error handling section into relevant subsections, so that ieee80211_unregister_hw() is called only when it is appropriate. Correct the order of the calls: ieee80211_unregister_hw() should go before plfxlc_mac_release(). Also move ieee80211_free_hw() to plfxlc_mac_release() as it supposed to be the opposite to plfxlc_mac_alloc_hw() that calls ieee80211_alloc_hw().
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
--- drivers/net/wireless/purelifi/plfxlc/mac.c | 11 ++++---- drivers/net/wireless/purelifi/plfxlc/mac.h | 2 +- drivers/net/wireless/purelifi/plfxlc/usb.c | 29 +++++++++++----------- 3 files changed, 21 insertions(+), 21 deletions(-)
drivers/net/wireless/purelifi/plfxlc/mac.c +6 -5
@@ -100,11 +100,6 @@ int plfxlc_mac_init_hw(struct ieee80211_hw *hw)return r; } -void plfxlc_mac_release (struct plfxlc_mac *mac) -{ -plfxlc_chip_release (&mac->chip); -} -int plfxlc_op_start (struct ieee80211_hw *hw) {plfxlc_hw_mac (hw)->chip.usb.initialized =1 ;
@@ -751,3 +746,9 @@ struct ieee80211_hw *plfxlc_mac_alloc_hw(struct usb_interface *intf)SET_IEEE80211_DEV (hw, &intf->dev);return hw; } + +void plfxlc_mac_release_hw (struct ieee80211_hw *hw) +{ +plfxlc_chip_release (&plfxlc_hw_mac (hw)->chip); +ieee80211_free_hw (hw); +}
drivers/net/wireless/purelifi/plfxlc/mac.h +1 -1
@@ -168,7 +168,7 @@ static inline u8 *plfxlc_mac_get_perm_addr(struct plfxlc_mac *mac) }struct ieee80211_hw *plfxlc_mac_alloc_hw (struct usb_interface *intf); -void plfxlc_mac_release (struct plfxlc_mac *mac); +void plfxlc_mac_release_hw (struct ieee80211_hw *hw);int plfxlc_mac_preinit_hw (struct ieee80211_hw *hw,const u8 *hw_address);int plfxlc_mac_init_hw (struct ieee80211_hw *hw);
drivers/net/wireless/purelifi/plfxlc/usb.c +14 -15
@@ -604,7 +604,7 @@ static int probe(struct usb_interface *intf, r =plfxlc_upload_mac_and_serial (intf, hw_address, serial_number);if (r) {dev_err (&intf->dev,"MAC and Serial upload failed (%d)\n" , r); - goto error; + goto error_free_hw; } chip->unit_type =STA ;
@@ -613,13 +613,13 @@ static int probe(struct usb_interface *intf, r =plfxlc_mac_preinit_hw (hw, hw_address);if (r) {dev_err (&intf->dev,"Init mac failed (%d)\n" , r); - goto error; + goto error_free_hw; } r =ieee80211_register_hw (hw);if (r) {dev_err (&intf->dev,"Register device failed (%d)\n" , r); - goto error; + goto error_free_hw; } if ((le16_to_cpu(interface_to_usbdev(intf)->descriptor.idVendor) ==
@@ -632,7 +632,7 @@ static int probe(struct usb_interface *intf, }if (r !=0 ) {dev_err (&intf->dev,"FPGA download failed (%d)\n" , r); - goto error; + goto error_unreg_hw; } tx->mac_fifo_full =0 ;
@@ -642,21 +642,21 @@ static int probe(struct usb_interface *intf, r =plfxlc_usb_init_hw (usb);if (r <0 ) {dev_err (&intf->dev,"usb_init_hw failed (%d)\n" , r); - goto error; + goto error_unreg_hw; }msleep (PLF_MSLEEP_TIME ); r =plfxlc_chip_switch_radio (chip,PLFXLC_RADIO_ON );if (r <0 ) {dev_dbg (&intf->dev,"chip_switch_radio_on failed (%d)\n" , r); - goto error; + goto error_unreg_hw; }msleep (PLF_MSLEEP_TIME ); r =plfxlc_chip_set_rate (chip,8 );if (r <0 ) {dev_dbg (&intf->dev,"chip_set_rate failed (%d)\n" , r); - goto error; + goto error_unreg_hw; }msleep (PLF_MSLEEP_TIME );
@@ -664,7 +664,7 @@ static int probe(struct usb_interface *intf, hw_address, ETH_ALEN, USB_REQ_MAC_WR);if (r <0 ) {dev_dbg (&intf->dev,"MAC_WR failure (%d)\n" , r); - goto error; + goto error_unreg_hw; }plfxlc_chip_enable_rxtx (chip);
@@ -691,12 +691,12 @@ static int probe(struct usb_interface *intf,plfxlc_mac_init_hw (hw); usb->initialized = true;return 0 ; + +error_unreg_hw: +ieee80211_unregister_hw (hw); +error_free_hw: +plfxlc_mac_release_hw (hw); error: -if (hw) { -plfxlc_mac_release (plfxlc_hw_mac (hw)); -ieee80211_unregister_hw (hw); -ieee80211_free_hw (hw); - }dev_err (&intf->dev,"pureLifi:Device error" );return r; }
@@ -730,8 +730,7 @@ static void disconnect(struct usb_interface *intf)*/ usb_reset_device (interface_to_usbdev (intf)); -plfxlc_mac_release (mac); -ieee80211_free_hw (hw); +plfxlc_mac_release_hw (hw); }static void plfxlc_usb_resume (struct plfxlc_usb *usb)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 123/253 wifi: mac80211: Do not schedule stopped TXQs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Wetzel <[email protected]>
[ Upstream commit 11e3e22fa533f5d7cf04e32343b05a27eda3c7a5 ]
Ignore TXQs with the flag IEEE80211_TXQ_STOP when scheduling a queue.
The flag is only set after all fragments have been dequeued and won't allow dequeueing other frames as long as the flag is set.
For drivers using ieee80211_txq_schedule_start() this prevents an loop trying to push the queued frames while IEEE80211_TXQ_STOP is set:
After setting IEEE80211_TXQ_STOP the driver will call ieee80211_return_txq(). Which calls __ieee80211_schedule_txq(), detects that there sill are frames in the queue and immediately restarts the stopped TXQ. Which can't dequeue any frame and thus starts over the loop.
--- net/mac80211/tx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/mac80211/tx.c +3 -1
@@ -4024,7 +4024,9 @@ void __ieee80211_schedule_txq(struct ieee80211_hw *hw,spin_lock_bh (&local->active_txq_lock[txq->ac]); - has_queue = force ||txq_has_queue (txq); + has_queue = force || + (!test_bit (IEEE80211_TXQ_STOP , &txqi->flags) && +txq_has_queue (txq));if (list_empty (&txqi->schedule_order) && (has_queue ||ieee80211_txq_keep_active (txqi))) {/* If airtime accounting is active, always enqueue STAs at the
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 124/253 wifi: mac80211: Dont call fq_flow_idx() for management frames
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Wetzel <[email protected]>
[ Upstream commit cb3bb3d88dfcd177a1050c0a009a3ee147b2e5b9 ]
skb_get_hash() can only be used when the skb is linked to a netdev device.
--- net/mac80211/tx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/mac80211/tx.c +2 -1
@@ -1467,7 +1467,7 @@ static void ieee80211_txq_enqueue(struct ieee80211_local *local, {struct fq *fq = &local->fq;struct fq_tin *tin = &txqi->tin; -u32 flow_idx =fq_flow_idx (fq, skb); +u32 flow_idx;ieee80211_set_skb_enqueue_time (skb);
@@ -1483,6 +1483,7 @@ static void ieee80211_txq_enqueue(struct ieee80211_local *local,IEEE80211_TX_INTCFL_NEED_TXPROCESSING ;__skb_queue_tail (&txqi->frags, skb); }else { + flow_idx =fq_flow_idx (fq, skb);fq_tin_enqueue (fq, tin, flow_idx, skb, fq_skb_free_func); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 125/253 wifi: mac80211: Check 802.11 encaps offloading in ieee80211_tx_h_select_key()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Remi Pommarel <[email protected]>
[ Upstream commit 4037c468d1b3c508d69e6df0ef47fdee3d440e39 ]
With 802.11 encapsulation offloading, ieee80211_tx_h_select_key() is called on 802.3 frames. In that case do not try to use skb data as valid 802.11 headers.
--- net/mac80211/tx.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/mac80211/tx.c +6 -0
@@ -644,6 +644,12 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)else tx->key =NULL ; +if (info->flags &IEEE80211_TX_CTL_HW_80211_ENCAP ) { +if (tx->key && tx->key->flags &KEY_FLAG_UPLOADED_TO_HARDWARE ) + info->control.hw_key = &tx->key->conf; +return TX_CONTINUE ; + } +if (tx->key) {bool skip_hw = false;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 126/253 Reapply "wifi: mac80211: Update skbs control block key in ieee80211_tx_dequeue()"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Remi Pommarel <[email protected]>
[ Upstream commit 754fe848b3b297fc85ec24cd959bad22b6df8cb8 ]
This reverts commit 0937cb5f345c ("Revert "wifi: mac80211: Update skb's control block key in ieee80211_tx_dequeue()"").
This commit broke TX with 802.11 encapsulation HW offloading, now that this is fixed, reapply it.
--- net/mac80211/tx.c | 1 + 1 file changed, 1 insertion(+)
net/mac80211/tx.c +1 -0
@@ -3807,6 +3807,7 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,* The key can be removed while the packet was queued, so need to call * this here to get the current key. */ + info->control.hw_key =NULL ; r =ieee80211_tx_h_select_key (&tx);if (r !=TX_CONTINUE ) {ieee80211_free_txskb (&local->hw, skb);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 127/253 wifi: brcmfmac: fix P2P discovery failure in P2P peer due to missing P2P IE
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gokul Sivakumar <[email protected]>
[ Upstream commit 579bf8037b70b644a674c126a32bbb2212cf5c21 ]
After commit bd99a3013bdc ("brcmfmac: move configuration of probe request IEs"), the probe request MGMT IE addition operation brcmf_vif_set_mgmt_ie() got moved from the brcmf_p2p_scan_prep() to the brcmf_cfg80211_scan().
Because of this, as part of the scan request handler for the P2P Discovery, vif struct used for adding the Probe Request P2P IE in firmware got changed from the P2PAPI_BSSCFG_DEVICE vif to P2PAPI_BSSCFG_PRIMARY vif incorrectly. So the firmware stopped adding P2P IE to the outgoing P2P Discovery probe requests frames and the other P2P peers were unable to discover this device causing a regression on the P2P feature.
To fix this, while setting the P2P IE in firmware, properly use the vif of the P2P discovery wdev on which the driver received the P2P scan request. This is done by not changing the vif pointer, until brcmf_vif_set_mgmt_ie() is completed.
--- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +4 -4
@@ -1200,10 +1200,6 @@ brcmf_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)return -EAGAIN ; } -/* If scan req comes for p2p0, send it over primary I/F */ -if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE ].vif) - vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY ].vif; -brcmf_dbg (SCAN ,"START ESCAN\n" ); cfg->scan_request = request;
@@ -1219,6 +1215,10 @@ brcmf_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)if (err) goto scan_out; +/* If scan req comes for p2p0, send it over primary I/F */ +if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE ].vif) + vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY ].vif; + err =brcmf_do_escan (vif->ifp, request);if (err) goto scan_out;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 128/253 kcsan: test: Initialize dummy variable
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marco Elver <[email protected]>
[ Upstream commit 9872916ad1a1a5e7d089e05166c85dbd65e5b0e8 ]
Newer compiler versions rightfully point out:
kernel/kcsan/kcsan_test.c:591:41: error: variable 'dummy' is uninitialized when passed as a const pointer argument here [-Werror,-Wuninitialized-const-pointer]
591 | KCSAN_EXPECT_READ_BARRIER(atomic_read(&dummy), false);
| ^~~~~
1 error generated.
Although this particular test does not care about the value stored in the dummy atomic variable, let's silence the warning.
--- kernel/kcsan/kcsan_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/kcsan/kcsan_test.c +1 -1
@@ -530,7 +530,7 @@ static void test_barrier_nothreads(struct kunit *test)struct kcsan_scoped_access *reorder_access =NULL ;#endif arch_spinlock_t arch_spinlock = __ARCH_SPIN_LOCK_UNLOCKED; -atomic_t dummy; +atomic_t dummy =ATOMIC_INIT (0 );KCSAN_TEST_REQUIRES (test, reorder_access !=NULL );KCSAN_TEST_REQUIRES (test,IS_ENABLED (CONFIG_SMP ));
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 129/253 can: peak_usb: fix USB FD devices potential malfunction
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephane Grosjean <[email protected]>
[ Upstream commit 788199b73b6efe4ee2ade4d7457b50bb45493488 ]
The latest firmware versions of USB CAN FD interfaces export the EP numbers to be used to dialog with the device via the "type" field of a response to a vendor request structure, particularly when its value is greater than or equal to 2.
Correct the driver's test of this field.
--- drivers/net/can/usb/peak_usb/pcan_usb_fd.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/net/can/usb/peak_usb/pcan_usb_fd.c +9 -8
@@ -49,7 +49,7 @@ struct __packed pcan_ufd_fw_info {__le32 ser_no;/* S/N */ __le32 flags;/* special functions */ -/* extended data when type == PCAN_USBFD_TYPE_EXT */ +/* extended data when type >= PCAN_USBFD_TYPE_EXT */ u8 cmd_out_ep;/* ep for cmd */ u8 cmd_in_ep;/* ep for replies */ u8 data_out_ep[2 ];/* ep for CANx TX */
@@ -939,10 +939,11 @@ static int pcan_usb_fd_init(struct peak_usb_device *dev) dev->can.ctrlmode |=CAN_CTRLMODE_FD_NON_ISO ; } -/* if vendor rsp is of type 2, then it contains EP numbers to -* use for cmds pipes. If not, then default EP should be used. +/* if vendor rsp type is greater than or equal to 2, then it +* contains EP numbers to use for cmds pipes. If not, then +* default EP should be used. */ -if (fw_info->type !=cpu_to_le16 (PCAN_USBFD_TYPE_EXT )) { +if (le16_to_cpu (fw_info->type) <PCAN_USBFD_TYPE_EXT ) { fw_info->cmd_out_ep =PCAN_USBPRO_EP_CMDOUT ; fw_info->cmd_in_ep =PCAN_USBPRO_EP_CMDIN ; }
@@ -975,11 +976,11 @@ static int pcan_usb_fd_init(struct peak_usb_device *dev) dev->device_number =le32_to_cpu (pdev->usb_if->fw_info.dev_id[dev->ctrl_idx]); -/* if vendor rsp is of type 2, then it contains EP numbers to -* use for data pipes. If not, then statically defined EP are used -* (see peak_usb_create_dev()). +/* if vendor rsp type is greater than or equal to 2, then it contains EP +* numbers to use for data pipes. If not, then statically defined EP are +* used (see peak_usb_create_dev()). */ -if (fw_info->type ==cpu_to_le16 (PCAN_USBFD_TYPE_EXT )) { +if (le16_to_cpu (fw_info->type) >=PCAN_USBFD_TYPE_EXT ) { dev->ep_msg_in = fw_info->data_in_ep; dev->ep_msg_out = fw_info->data_out_ep[dev->ctrl_idx]; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 130/253 can: kvaser_pciefd: Store device channel index
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jimmy Assarsson <[email protected]>
[ Upstream commit d54b16b40ddadb7d0a77fff48af7b319a0cd6aae ]
Store device channel index in netdev.dev_port.
--- drivers/net/can/kvaser_pciefd.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/can/kvaser_pciefd.c +1 -0
@@ -966,6 +966,7 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie) can->err_rep_cnt =0 ; can->bec.txerr =0 ; can->bec.rxerr =0 ; + can->can.dev->dev_port = i;init_completion (&can->start_comp);init_completion (&can->flush_comp);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 131/253 can: kvaser_usb: Assign netdev.dev_port based on device channel index
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jimmy Assarsson <[email protected]>
[ Upstream commit c151b06a087a61c7a1790b75ee2f1d6edb6a8a45 ]
Assign netdev.dev_port based on the device channel index, to indicate the port number of the network device.
While this driver already uses netdev.dev_id for that purpose, dev_port is more appropriate. However, retain dev_id to avoid potential regressions.
--- drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c +1 -0
@@ -858,6 +858,7 @@ static int kvaser_usb_init_one(struct kvaser_usb *dev, int channel) }SET_NETDEV_DEV (netdev, &dev->intf->dev); netdev->dev_id = channel; + netdev->dev_port = channel; dev->nets[channel] = priv;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 132/253 netfilter: xt_nfacct: dont assume acct name is null-terminated
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit bf58e667af7d96c8eb9411f926a0a0955f41ce21 ]
BUG: KASAN: slab-out-of-bounds in .. lib/vsprintf.c:721 Read of size 1 at addr ffff88801eac95c8 by task syz-executor183/5851 [..] string+0x231/0x2b0 lib/vsprintf.c:721 vsnprintf+0x739/0xf00 lib/vsprintf.c:2874 [..] nfacct_mt_checkentry+0xd2/0xe0 net/netfilter/xt_nfacct.c:41 xt_check_match+0x3d1/0xab0 net/netfilter/x_tables.c:523
nfnl_acct_find_get() handles non-null input, but the error printk relied on its presence.
--- net/netfilter/xt_nfacct.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/netfilter/xt_nfacct.c +2 -2
@@ -38,8 +38,8 @@ nfacct_mt_checkentry(const struct xt_mtchk_param *par) nfacct =nfnl_acct_find_get (par->net, info->name);if (nfacct ==NULL ) { -pr_info_ratelimited ("accounting object `%s' does not exists\n" , - info->name); +pr_info_ratelimited ("accounting object `%.*s' does not exist\n" , +NFACCT_NAME_MAX , info->name);return -ENOENT ; } info->nfacct = nfacct;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 133/253 selftests: rtnetlink.sh: remove esp4_offload after test
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiumei Mu <[email protected]>
[ Upstream commit 5b32321fdaf3fd1a92ec726af18765e225b0ee2b ]
The esp4_offload module, loaded during IPsec offload tests, should be reset to its default settings after testing.
Otherwise, leaving it enabled could unintentionally affect subsequence test cases by keeping offload active.
Without this fix:
$ lsmod | grep offload; ./rtnetlink.sh -t kci_test_ipsec_offload ; lsmod | grep offload; PASS: ipsec_offload esp4_offload 12288 0 esp4 32768 1 esp4_offload
With this fix:
$ lsmod | grep offload; ./rtnetlink.sh -t kci_test_ipsec_offload ; lsmod | grep offload; PASS: ipsec_offload
--- tools/testing/selftests/net/rtnetlink.sh | 6 ++++++ 1 file changed, 6 insertions(+)
tools/testing/selftests/net/rtnetlink.sh +6 -0
@@ -746,6 +746,11 @@ kci_test_ipsec_offload() sysfsf=$sysfsd/ipsec sysfsnet=/sys/bus/netdevsim/devices/netdevsim0/net/ probed=false + esp4_offload_probed_default=false + + if lsmod | grep -q esp4_offload; then + esp4_offload_probed_default=true + fi # setup netdevsim since dummydev doesn't have offload support if [ ! -w /sys/bus/netdevsim/new_device ] ; then
@@ -835,6 +840,7 @@ EOF fi # clean up any leftovers + ! "$esp4_offload_probed_default" && lsmod | grep -q esp4_offload && rmmod esp4_offload echo 0 > /sys/bus/netdevsim/del_device $probed && rmmod netdevsim
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 134/253 vrf: Drop existing dst reference in vrf_ip6_input_dst
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanislav Fomichev <[email protected]>
[ Upstream commit f388f807eca1de9e6e70f9ffb1a573c3811c4215 ]
Commit ff3fbcdd4724 ("selftests: tc: Add generic erspan_opts matching support for tc-flower") started triggering the following kmemleak warning:
unreferenced object 0xffff888015fb0e00 (size 512):
comm "softirq", pid 0, jiffies 4294679065 hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 40 d2 85 9e ff ff ff ff ........@.......
41 69 59 9d ff ff ff ff 00 00 00 00 00 00 00 00 AiY.............
backtrace (crc 30b71e8b):
__kmalloc_noprof+0x359/0x460
metadata_dst_alloc+0x28/0x490
erspan_rcv+0x4f1/0x1160 [ip_gre]
gre_rcv+0x217/0x240 [ip_gre]
gre_rcv+0x1b8/0x400 [gre]
ip_protocol_deliver_rcu+0x31d/0x3a0
ip_local_deliver_finish+0x37d/0x620
ip_local_deliver+0x174/0x460
ip_rcv+0x52b/0x6b0
__netif_receive_skb_one_core+0x149/0x1a0
process_backlog+0x3c8/0x1390
__napi_poll.constprop.0+0xa1/0x390
net_rx_action+0x59b/0xe00
handle_softirqs+0x22b/0x630
do_softirq+0xb1/0xf0
__local_bh_enable_ip+0x115/0x150vrf_ip6_input_dst unconditionally sets skb dst entry, add a call to skb_dst_drop to drop any existing entry.
--- drivers/net/vrf.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/vrf.c +2 -0
@@ -1355,6 +1355,8 @@ static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev,struct net *net =dev_net (vrf_dev);struct rt6_info *rt6; +skb_dst_drop (skb); + rt6 =vrf_ip6_route_lookup (net, vrf_dev, &fl6, ifindex, skb,RT6_LOOKUP_F_HAS_SADDR |RT6_LOOKUP_F_IFACE );if (unlikely (!rt6))
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 135/253 ipv6: prevent infinite loop in rt6_nlmsg_size()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 54e6fe9dd3b0e7c481c2228782c9494d653546da ]
While testing prior patch, I was able to trigger an infinite loop in rt6_nlmsg_size() in the following place:
list_for_each_entry_rcu(sibling, &f6i->fib6_siblings,
fib6_siblings) {
rt6_nh_nlmsg_size(sibling->fib6_nh, &nexthop_len);
}This is because fib6_del_route() and fib6_add_rt2node() uses list_del_rcu(), which can confuse rcu readers, because they might no longer see the head of the list.
Restart the loop if f6i->fib6_nsiblings is zero.
--- net/ipv6/ip6_fib.c | 4 ++-- net/ipv6/route.c | 34 ++++++++++++++++++---------------- 2 files changed, 20 insertions(+), 18 deletions(-)
net/ipv6/ip6_fib.c +2 -2
@@ -1241,7 +1241,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, &rt->fib6_siblings, fib6_siblings) sibling->fib6_nsiblings--; - rt->fib6_nsiblings =0 ; +WRITE_ONCE (rt->fib6_nsiblings,0 );list_del_rcu (&rt->fib6_siblings);rt6_multipath_rebalance (next_sibling);return err;
@@ -1954,7 +1954,7 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn,list_for_each_entry_safe (sibling, next_sibling, &rt->fib6_siblings, fib6_siblings) sibling->fib6_nsiblings--; - rt->fib6_nsiblings =0 ; +WRITE_ONCE (rt->fib6_nsiblings,0 );list_del_rcu (&rt->fib6_siblings);rt6_multipath_rebalance (next_sibling); }
net/ipv6/route.c +18 -16
@@ -5580,32 +5580,34 @@ static int rt6_nh_nlmsg_size(struct fib6_nh *nh, void *arg)static size_t rt6_nlmsg_size (struct fib6_info *f6i) { +struct fib6_info *sibling; +struct fib6_nh *nh;int nexthop_len;if (f6i->nh) { nexthop_len =nla_total_size (4 );/* RTA_NH_ID */ nexthop_for_each_fib6_nh (f6i->nh, rt6_nh_nlmsg_size, &nexthop_len); - }else { -struct fib6_nh *nh = f6i->fib6_nh; -struct fib6_info *sibling; - - nexthop_len =0 ; -if (f6i->fib6_nsiblings) { -rt6_nh_nlmsg_size (nh, &nexthop_len); - -rcu_read_lock (); + goto common; + } -list_for_each_entry_rcu (sibling, &f6i->fib6_siblings, - fib6_siblings) { -rt6_nh_nlmsg_size (sibling->fib6_nh, &nexthop_len); - } +rcu_read_lock (); +retry: + nh = f6i->fib6_nh; + nexthop_len =0 ; +if (READ_ONCE (f6i->fib6_nsiblings)) { +rt6_nh_nlmsg_size (nh, &nexthop_len); -rcu_read_unlock (); +list_for_each_entry_rcu (sibling, &f6i->fib6_siblings, + fib6_siblings) { +rt6_nh_nlmsg_size (sibling->fib6_nh, &nexthop_len); +if (!READ_ONCE (f6i->fib6_nsiblings)) + goto retry; } - nexthop_len +=lwtunnel_get_encap_size (nh->fib_nh_lws); } - +rcu_read_unlock (); + nexthop_len +=lwtunnel_get_encap_size (nh->fib_nh_lws); +common:return NLMSG_ALIGN (sizeof (struct rtmsg )) +nla_total_size (16 )/* RTA_SRC */ +nla_total_size (16 )/* RTA_DST */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 136/253 ipv6: fix possible infinite loop in fib6_info_uses_dev()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit f8d8ce1b515a0a6af72b30502670a406cfb75073 ]
fib6_info_uses_dev() seems to rely on RCU without an explicit protection.
Like the prior fix in rt6_nlmsg_size(),
we need to make sure fib6_del_route() or fib6_add_rt2node() have not removed the anchor from the list, or we risk an infinite loop.
--- net/ipv6/route.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
net/ipv6/route.c +11 -6
@@ -5868,16 +5868,21 @@ static bool fib6_info_uses_dev(const struct fib6_info *f6i,if (f6i->fib6_nh->fib_nh_dev == dev)return true; -if (f6i->fib6_nsiblings) { -struct fib6_info *sibling, *next_sibling; +if (READ_ONCE (f6i->fib6_nsiblings)) { +const struct fib6_info *sibling; -list_for_each_entry_safe (sibling, next_sibling, - &f6i->fib6_siblings, fib6_siblings) { -if (sibling->fib6_nh->fib_nh_dev == dev) +rcu_read_lock (); +list_for_each_entry_rcu (sibling, &f6i->fib6_siblings, + fib6_siblings) { +if (sibling->fib6_nh->fib_nh_dev == dev) { +rcu_read_unlock ();return true; + } +if (!READ_ONCE (f6i->fib6_nsiblings)) +break ; } +rcu_read_unlock (); } -return false; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 137/253 ipv6: annotate data-races around rt->fib6_nsiblings
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 31d7d67ba1274f42494256d52e86da80ed09f3cb ]
rt->fib6_nsiblings can be read locklessly, add corresponding READ_ONCE() and WRITE_ONCE() annotations.
--- net/ipv6/ip6_fib.c | 20 +++++++++++++------- net/ipv6/route.c | 5 +++-- 2 files changed, 16 insertions(+), 9 deletions(-)
net/ipv6/ip6_fib.c +13 -7
@@ -438,15 +438,17 @@ struct fib6_dump_arg {static int fib6_rt_dump (struct fib6_info *rt,struct fib6_dump_arg *arg) {enum fib_event_type fib_event =FIB_EVENT_ENTRY_REPLACE ; +unsigned int nsiblings;int err;if (!rt || rt == arg->net->ipv6.fib6_null_entry)return 0 ; -if (rt->fib6_nsiblings) + nsiblings =READ_ONCE (rt->fib6_nsiblings); +if (nsiblings) err =call_fib6_multipath_entry_notifier (arg->nb, fib_event, rt, - rt->fib6_nsiblings, + nsiblings, arg->extack);else err = call_fib6_entry_notifier(arg->nb, fib_event, rt,
@@ -1119,7 +1121,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt,if (rt6_duplicate_nexthop (iter, rt)) {if (rt->fib6_nsiblings) - rt->fib6_nsiblings =0 ; +WRITE_ONCE (rt->fib6_nsiblings,0 );if (!(iter->fib6_flags &RTF_EXPIRES ))return -EEXIST ;if (!(rt->fib6_flags &RTF_EXPIRES ))
@@ -1145,7 +1147,8 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt,*/ if (rt_can_ecmp &&rt6_qualify_for_ecmp (iter)) - rt->fib6_nsiblings++; +WRITE_ONCE (rt->fib6_nsiblings, + rt->fib6_nsiblings +1 ); }if (iter->fib6_metric > rt->fib6_metric)
@@ -1195,7 +1198,8 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, fib6_nsiblings =0 ;list_for_each_entry_safe (sibling, temp_sibling, &rt->fib6_siblings, fib6_siblings) { - sibling->fib6_nsiblings++; +WRITE_ONCE (sibling->fib6_nsiblings, + sibling->fib6_nsiblings +1 );BUG_ON (sibling->fib6_nsiblings != rt->fib6_nsiblings); fib6_nsiblings++; }
@@ -1240,7 +1244,8 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt,list_for_each_entry_safe (sibling, next_sibling, &rt->fib6_siblings, fib6_siblings) - sibling->fib6_nsiblings--; +WRITE_ONCE (sibling->fib6_nsiblings, + sibling->fib6_nsiblings -1 );WRITE_ONCE (rt->fib6_nsiblings,0 );list_del_rcu (&rt->fib6_siblings);rt6_multipath_rebalance (next_sibling);
@@ -1953,7 +1958,8 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn, notify_del = true;list_for_each_entry_safe (sibling, next_sibling, &rt->fib6_siblings, fib6_siblings) - sibling->fib6_nsiblings--; +WRITE_ONCE (sibling->fib6_nsiblings, + sibling->fib6_nsiblings -1 );WRITE_ONCE (rt->fib6_nsiblings,0 );list_del_rcu (&rt->fib6_siblings);rt6_multipath_rebalance (next_sibling);
net/ipv6/route.c +3 -2
@@ -5233,7 +5233,8 @@ static void ip6_route_mpath_notify(struct fib6_info *rt,*/ rcu_read_lock (); -if ((nlflags &NLM_F_APPEND ) && rt_last && rt_last->fib6_nsiblings) { +if ((nlflags &NLM_F_APPEND ) && rt_last && +READ_ONCE (rt_last->fib6_nsiblings)) { rt =list_first_or_null_rcu (&rt_last->fib6_siblings, struct fib6_info, fib6_siblings);
@@ -5766,7 +5767,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb,if (dst->lwtstate &&lwtunnel_fill_encap (skb, dst->lwtstate,RTA_ENCAP ,RTA_ENCAP_TYPE ) <0 ) goto nla_put_failure; - }else if (rt->fib6_nsiblings) { + }else if (READ_ONCE (rt->fib6_nsiblings)) {struct fib6_info *sibling;struct nlattr *mp;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 138/253 bpf/preload: Dont select USERMODE_DRIVER
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit 2b03164eee20eac7ce0fe3aa4fbda7efc1e5427a ]
The usermode driver framework is not used anymore by the BPF preload code.
--- kernel/bpf/preload/Kconfig | 1 - 1 file changed, 1 deletion(-)
kernel/bpf/preload/Kconfig +0 -1
@@ -10,7 +10,6 @@ menuconfig BPF_PRELOAD # The dependency on !COMPILE_TEST prevents it from being enabled # in allmodconfig or allyesconfig configurations depends on !COMPILE_TEST - select USERMODE_DRIVER help This builds kernel module with several embedded BPF programs that are pinned into BPF FS mount point as human readable files that are
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 139/253 PCI: rockchip-host: Fix "Unexpected Completion" log message
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Zhang <[email protected]>
[ Upstream commit fcc5f586c4edbcc10de23fb9b8c0972a84e945cd ]
Fix the debug message for the PCIE_CORE_INT_UCR interrupt to clearly indicate "Unexpected Completion" instead of a duplicate "malformed TLP" message.
--- drivers/pci/controller/pcie-rockchip-host.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/controller/pcie-rockchip-host.c +1 -1
@@ -439,7 +439,7 @@ static irqreturn_t rockchip_pcie_subsys_irq_handler(int irq, void *arg)dev_dbg (dev,"malformed TLP received from the link\n" );if (sub_reg &PCIE_CORE_INT_UCR ) -dev_dbg (dev,"malformed TLP received from the link\n" ); +dev_dbg (dev,"Unexpected Completion received from the link\n" );if (sub_reg &PCIE_CORE_INT_FCE )dev_dbg (dev,"an error was observed in the flow control advertisements from the other side\n" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 140/253 crypto: sun8i-ce - fix nents passed to dma_unmap_sg()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ovidiu Panait <[email protected]>
[ Upstream commit b6cd3cfb5afe49952f8f6be947aeeca9ba0faebb ]
In sun8i_ce_cipher_unprepare(), dma_unmap_sg() is incorrectly called with the number of entries returned by dma_map_sg(), rather than using the original number of entries passed when mapping the scatterlist.
To fix this, stash the original number of entries passed to dma_map_sg() in the request context.
--- drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +2 -2
@@ -260,8 +260,8 @@ static int sun8i_ce_cipher_prepare(struct crypto_engine *engine, void *async_req } chan->timeout = areq->cryptlen; - rctx->nr_sgs = nr_sgs; - rctx->nr_sgd = nr_sgd; + rctx->nr_sgs = ns; + rctx->nr_sgd = nd;return 0 ; theend_sgs:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 141/253 crypto: marvell/cesa - Fix engine load inaccuracy
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit 442134ab30e75b7229c4bfc1ac5641d245cffe27 ]
If an error occurs during queueing the engine load will never be decremented. Fix this by moving the engine load adjustment into the cleanup function.
--- drivers/crypto/marvell/cesa/cipher.c | 4 +++- drivers/crypto/marvell/cesa/hash.c | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-)
drivers/crypto/marvell/cesa/cipher.c +3 -1
@@ -75,9 +75,12 @@ mv_cesa_skcipher_dma_cleanup(struct skcipher_request *req)static inline void mv_cesa_skcipher_cleanup (struct skcipher_request *req) {struct mv_cesa_skcipher_req *creq =skcipher_request_ctx (req); +struct mv_cesa_engine *engine = creq->base.engine;if (mv_cesa_req_get_type (&creq->base) ==CESA_DMA_REQ )mv_cesa_skcipher_dma_cleanup (req); + +atomic_sub (req->cryptlen, &engine->load); }static void mv_cesa_skcipher_std_step (struct skcipher_request *req)
@@ -212,7 +215,6 @@ mv_cesa_skcipher_complete(struct crypto_async_request *req)struct mv_cesa_engine *engine = creq->base.engine;unsigned int ivsize; -atomic_sub (skreq->cryptlen, &engine->load); ivsize =crypto_skcipher_ivsize (crypto_skcipher_reqtfm (skreq));if (mv_cesa_req_get_type (&creq->base) ==CESA_DMA_REQ ) {
drivers/crypto/marvell/cesa/hash.c +3 -2
@@ -110,9 +110,12 @@ static inline void mv_cesa_ahash_dma_cleanup(struct ahash_request *req)static inline void mv_cesa_ahash_cleanup (struct ahash_request *req) {struct mv_cesa_ahash_req *creq =ahash_request_ctx (req); +struct mv_cesa_engine *engine = creq->base.engine;if (mv_cesa_req_get_type (&creq->base) ==CESA_DMA_REQ )mv_cesa_ahash_dma_cleanup (req); + +atomic_sub (req->nbytes, &engine->load); }static void mv_cesa_ahash_last_cleanup (struct ahash_request *req)
@@ -395,8 +398,6 @@ static void mv_cesa_ahash_complete(struct crypto_async_request *req) } } } - -atomic_sub (ahashreq->nbytes, &engine->load); } static void mv_cesa_ahash_prepare(struct crypto_async_request *req,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 142/253 mtd: fix possible integer overflow in erase_xfer()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Stepchenko <[email protected]>
[ Upstream commit 9358bdb9f9f54d94ceafc650deffefd737d19fdd ]
The expression '1 << EraseUnitSize' is evaluated in int, which causes a negative result when shifting by 31 - the upper bound of the valid range [10, 31], enforced by scan_header(). This leads to incorrect extension when storing the result in 'erase->len' (uint64_t), producing a large unexpected value.
Found by Linux Verification Center (linuxtesting.org) with Svace.
--- drivers/mtd/ftl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ftl.c +1 -1
@@ -344,7 +344,7 @@ static int erase_xfer(partition_t *part,return -ENOMEM ; erase->addr = xfer->Offset; - erase->len =1 << part->header.EraseUnitSize; + erase->len =1ULL << part->header.EraseUnitSize; ret =mtd_erase (part->mbd.mtd, erase);if (!ret) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 143/253 clk: davinci: Add NULL check in davinci_lpsc_clk_register()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Henry Martin <[email protected]>
[ Upstream commit 13de464f445d42738fe18c9a28bab056ba3a290a ]
devm_kasprintf() returns NULL when memory allocation fails. Currently, davinci_lpsc_clk_register() does not check for this case, which results in a NULL pointer dereference.
Add NULL check after devm_kasprintf() to prevent this issue and ensuring no resources are left allocated.
--- drivers/clk/davinci/psc.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/clk/davinci/psc.c +5 -0
@@ -278,6 +278,11 @@ davinci_lpsc_clk_register(struct device *dev, const char *name, lpsc->pm_domain.name =devm_kasprintf (dev,GFP_KERNEL ,"%s: %s" ,best_dev_name (dev), name); +if (!lpsc->pm_domain.name) { +clk_hw_unregister (&lpsc->hw); +kfree (lpsc); +return ERR_PTR (-ENOMEM ); + } lpsc->pm_domain.attach_dev = davinci_psc_genpd_attach_dev; lpsc->pm_domain.detach_dev = davinci_psc_genpd_detach_dev; lpsc->pm_domain.flags =GENPD_FLAG_PM_CLK ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 144/253 media: v4l2-ctrls: Fix H264 SEPARATE_COLOUR_PLANE check
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Cowgill <[email protected]>
[ Upstream commit 803b9eabc649c778986449eb0596e5ffeb7a8aed ]
The separate_colour_plane_flag element is only present in the SPS if chroma_format_idc == 3, so the corresponding flag should be disabled whenever that is not the case and not just on profiles where chroma_format_idc is not present.
--- drivers/media/v4l2-core/v4l2-ctrls-core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/media/v4l2-core/v4l2-ctrls-core.c +4 -4
@@ -651,12 +651,12 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx, p_h264_sps->flags &= ~V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS ; - -if (p_h264_sps->chroma_format_idc <3 ) - p_h264_sps->flags &= - ~V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE ; } +if (p_h264_sps->chroma_format_idc <3 ) + p_h264_sps->flags &= + ~V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE ; +if (p_h264_sps->flags &V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY ) p_h264_sps->flags &= ~V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 145/253 clk: xilinx: vcu: unregister pll_post only if registered correctly
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rohit Visavalia <[email protected]>
[ Upstream commit 3b0abc443ac22f7d4f61ddbbbbc5dbb06c87139d ]
If registration of pll_post is failed, it will be set to NULL or ERR, unregistering same will fail with following call trace:
Unable to handle kernel NULL pointer dereference at virtual address 008 pc : clk_hw_unregister+0xc/0x20 lr : clk_hw_unregister_fixed_factor+0x18/0x30 sp : ffff800011923850 ... Call trace: clk_hw_unregister+0xc/0x20 clk_hw_unregister_fixed_factor+0x18/0x30 xvcu_unregister_clock_provider+0xcc/0xf4 [xlnx_vcu] xvcu_probe+0x2bc/0x53c [xlnx_vcu]
--- drivers/clk/xilinx/xlnx_vcu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/xilinx/xlnx_vcu.c +2 -2
@@ -587,8 +587,8 @@ static void xvcu_unregister_clock_provider(struct xvcu_device *xvcu)xvcu_clk_hw_unregister_leaf (hws[CLK_XVCU_ENC_MCU ]);if (!IS_ERR_OR_NULL (hws[CLK_XVCU_ENC_CORE ]))xvcu_clk_hw_unregister_leaf (hws[CLK_XVCU_ENC_CORE ]); - -clk_hw_unregister_fixed_factor (xvcu->pll_post); +if (!IS_ERR_OR_NULL (xvcu->pll_post)) +clk_hw_unregister_fixed_factor (xvcu->pll_post); }/**
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 146/253 power: supply: cpcap-charger: Fix null check for power_supply_get_by_name
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Han <[email protected]>
[ Upstream commit d9fa3aae08f99493e67fb79413c0e95d30fca5e9 ]
In the cpcap_usb_detect() function, the power_supply_get_by_name() function may return NULL instead of an error pointer. To prevent potential null pointer dereferences, Added a null check.
--- drivers/power/supply/cpcap-charger.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/power/supply/cpcap-charger.c +2 -3
@@ -689,9 +689,8 @@ static void cpcap_usb_detect(struct work_struct *work)struct power_supply *battery; battery =power_supply_get_by_name ("battery" ); -if (IS_ERR_OR_NULL (battery)) { -dev_err (ddata->dev,"battery power_supply not available %li\n" , -PTR_ERR (battery)); +if (!battery) { +dev_err (ddata->dev,"battery power_supply not available\n" );return ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 147/253 power: supply: max14577: Handle NULL pdata when CONFIG_OF is not set
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Han <[email protected]>
[ Upstream commit 2937f5d2e24eefef8cb126244caec7fe3307f724 ]
When the kernel is not configured CONFIG_OF, the max14577_charger_dt_init function returns NULL. Fix the max14577_charger_probe functionby returning -ENODATA instead of potentially passing a NULL pointer to PTR_ERR.
This fixes the below smatch warning:max14577_charger_probe() warn: passing zero to 'PTR_ERR'
--- drivers/power/supply/max14577_charger.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/power/supply/max14577_charger.c +2 -2
@@ -501,7 +501,7 @@ static struct max14577_charger_platform_data *max14577_charger_dt_init(static struct max14577_charger_platform_data *max14577_charger_dt_init (struct platform_device *pdev) { -return NULL ; +return ERR_PTR (-ENODATA ); }#endif /* CONFIG_OF */
@@ -572,7 +572,7 @@ static int max14577_charger_probe(struct platform_device *pdev) chg->max14577 = max14577; chg->pdata =max14577_charger_dt_init (pdev); -if (IS_ERR_OR_NULL (chg->pdata)) +if (IS_ERR (chg->pdata))return PTR_ERR (chg->pdata); ret =max14577_charger_reg_init (chg);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 148/253 crypto: arm/aes-neonbs - work around gcc-15 warning
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit d5fa96dc5590915f060fee3209143313e4f5b03b ]
I get a very rare -Wstringop-overread warning with gcc-15 for one function in aesbs_ctr_encrypt():
arch/arm/crypto/aes-neonbs-glue.c: In function 'ctr_encrypt':arch/arm/crypto/aes-neonbs-glue.c:212:1446: error: '__builtin_memcpy' offset [17, 2147483647] is out of the bounds [0, 16] of object 'buf' with type 'u8[16]' {aka 'unsigned char[16]'} [-Werror=array-bounds=]
212 | src = dst = memcpy(buf + sizeof(buf) - bytes,arch/arm/crypto/aes-neonbs-glue.c: In function 'ctr_encrypt':arch/arm/crypto/aes-neonbs-glue.c:218:17: error: 'aesbs_ctr_encrypt' reading 1 byte from a region of size 0 [-Werror=stringop-overread]
218 | aesbs_ctr_encrypt(dst, src, ctx->rk, ctx->rounds, bytes, walk.iv);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~arch/arm/crypto/aes-neonbs-glue.c:218:17: note: referencing argument 2 of type 'const u8[0]' {aka 'const unsigned char[]'} arch/arm/crypto/aes-neonbs-glue.c:218:17: note: referencing argument 3 of type 'const u8[0]' {aka 'const unsigned char[]'} arch/arm/crypto/aes-neonbs-glue.c:218:17: note: referencing argument 6 of type 'u8[0]' {aka 'unsigned char[]'} arch/arm/crypto/aes-neonbs-glue.c:36:17: note: in a call to function 'aesbs_ctr_encrypt'
36 | asmlinkage void aesbs_ctr_encrypt(u8 out[], u8 const in[], u8 const rk[],
This could happen in theory if walk.nbytes is larger than INT_MAX and gets converted to a negative local variable.
Keep the type unsigned like the orignal nbytes to be sure there is no integer overflow.
--- arch/arm/crypto/aes-neonbs-glue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/crypto/aes-neonbs-glue.c +1 -1
@@ -245,7 +245,7 @@ static int ctr_encrypt(struct skcipher_request *req)while (walk.nbytes >0 ) {const u8 *src = walk.src.virt.addr;u8 *dst = walk.dst.virt.addr; -int bytes = walk.nbytes; +unsigned int bytes = walk.nbytes;if (unlikely (bytes <AES_BLOCK_SIZE )) src = dst = memcpy(buf + sizeof(buf) - bytes,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 149/253 PCI: endpoint: pci-epf-vntb: Return -ENOENT if pci_epc_get_next_free_bar() fails
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jerome Brunet <[email protected]>
[ Upstream commit 7ea488cce73263231662e426639dd3e836537068 ]
According the function documentation of epf_ntb_init_epc_bar(), the function should return an error code on error. However, it returns -1 when no BAR is available i.e., when pci_epc_get_next_free_bar() fails.
Return -ENOENT instead.
--- drivers/pci/endpoint/functions/pci-epf-vntb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/endpoint/functions/pci-epf-vntb.c +1 -1
@@ -714,7 +714,7 @@ static int epf_ntb_init_epc_bar(struct epf_ntb *ntb) barno =pci_epc_get_next_free_bar (epc_features, barno);if (barno <0 ) {dev_err (dev,"Fail to get NTB function BAR\n" ); -return barno; +return -ENOENT ; } ntb->epf_ntb_bar[bar] = barno; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 150/253 pinctrl: sunxi: Fix memory leak on krealloc failure
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Chen <[email protected]>
[ Upstream commit e3507c56cbb208d4f160942748c527ef6a528ba1 ]
In sunxi_pctrl_dt_node_to_map(), when krealloc() fails to resize the pinctrl_map array, the function returns -ENOMEM directly without freeing the previously allocated *map buffer. This results in a memory leak of the original kmalloc_array allocation.
--- drivers/pinctrl/sunxi/pinctrl-sunxi.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/pinctrl/sunxi/pinctrl-sunxi.c +8 -3
@@ -396,6 +396,7 @@ static int sunxi_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,const char *function, *pin_prop;const char *group;int ret, npins, nmaps, configlen =0 , i =0 ; +struct pinctrl_map *new_map; *map =NULL ; *num_maps =0 ;
@@ -470,9 +471,13 @@ static int sunxi_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,* We know have the number of maps we need, we can resize our * map array */ - *map =krealloc (*map, i *sizeof (struct pinctrl_map ),GFP_KERNEL ); -if (!*map) -return -ENOMEM ; + new_map =krealloc (*map, i *sizeof (struct pinctrl_map ),GFP_KERNEL ); +if (!new_map) { + ret = -ENOMEM ; + goto err_free_map; + } + + *map = new_map;return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 151/253 clk: clk-axi-clkgen: fix fpfd_max frequency for zynq
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sá <[email protected]>
[ Upstream commit ce8a9096699500e2c5bca09dde27b16edda5f636 ]
The fpfd_max frequency should be set to 450 MHz instead of 300 MHz. Well, it actually depends on the platform speed grade but we are being conservative for ultrascale so let's be consistent. In a following change we will set these limits at runtime.
--- drivers/clk/clk-axi-clkgen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/clk-axi-clkgen.c +1 -1
@@ -118,7 +118,7 @@ static const struct axi_clkgen_limits axi_clkgen_zynqmp_default_limits = {static const struct axi_clkgen_limits axi_clkgen_zynq_default_limits = { .fpfd_min =10000 , - .fpfd_max =300000 , + .fpfd_max =450000 , .fvco_min =600000 , .fvco_max =1200000 , };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 152/253 perf sched: Fix memory leaks for evsel->priv in timehist
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 117e5c33b1c44037af016d77ce6c0b086d55535f ]
It uses evsel->priv to save per-cpu timing information. It should be freed when the evsel is released.
Add the priv destructor for evsel same as thread to handle that.
--- tools/perf/builtin-sched.c | 12 ++++++++++++ tools/perf/util/evsel.c | 11 +++++++++++ tools/perf/util/evsel.h | 2 ++ 3 files changed, 25 insertions(+)
tools/perf/builtin-sched.c +12 -0
@@ -1929,6 +1929,16 @@ static u64 evsel__get_time(struct evsel *evsel, u32 cpu)return r->last_time[cpu]; } +static void timehist__evsel_priv_destructor (void *priv) +{ +struct evsel_runtime *r = priv; + +if (r) { +free (r->last_time); +free (r); + } +} +static int comm_width =30 ;static char *timehist_get_commstr (struct thread *thread)
@@ -3068,6 +3078,8 @@ static int perf_sched__timehist(struct perf_sched *sched)setup_pager (); +evsel__set_priv_destructor (timehist__evsel_priv_destructor); +/* prefer sched_waking if it is captured */ if (evlist__find_tracepoint_by_name (session->evlist,"sched:sched_waking" )) handlers[1 ].handler = timehist_sched_wakeup_ignore;
tools/perf/util/evsel.c +11 -0
@@ -1486,6 +1486,15 @@ static void evsel__free_config_terms(struct evsel *evsel)free_config_terms (&evsel->config_terms); } +static void (*evsel__priv_destructor)(void *priv); + +void evsel__set_priv_destructor (void (*destructor)(void *priv)) +{ +assert (evsel__priv_destructor ==NULL ); + + evsel__priv_destructor = destructor; +} +void evsel__exit (struct evsel *evsel) {assert (list_empty (&evsel->core.node));
@@ -1508,6 +1517,8 @@ void evsel__exit(struct evsel *evsel)hashmap__free (evsel->per_pkg_mask); evsel->per_pkg_mask =NULL ;zfree (&evsel->metric_events); +if (evsel__priv_destructor) +evsel__priv_destructor (evsel->priv); perf_evsel__object.fini (evsel); }
tools/perf/util/evsel.h +2 -0
@@ -246,6 +246,8 @@ void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);void evsel__exit (struct evsel *evsel);void evsel__delete (struct evsel *evsel); +void evsel__set_priv_destructor (void (*destructor)(void *priv)); +struct callchain_param ; void evsel__config(struct evsel *evsel, struct record_opts *opts,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 153/253 perf sched: Fix memory leaks in perf sched latency
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit e68b1c0098b959cb88afce5c93dd6a9324e6da78 ]
The work_atoms should be freed after use. Add free_work_atoms() to make sure to release all. It should use list_splice_init() when merging atoms to prevent accessing invalid pointers.
--- tools/perf/builtin-sched.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-)
tools/perf/builtin-sched.c +24 -3
@@ -1125,6 +1125,21 @@ add_sched_in_event(struct work_atoms *atoms, u64 timestamp) atoms->nb_atoms++; } +static void free_work_atoms (struct work_atoms *atoms) +{ +struct work_atom *atom, *tmp; + +if (atoms ==NULL ) +return ; + +list_for_each_entry_safe (atom, tmp, &atoms->work_list, list) { +list_del (&atom->list); +free (atom); + } +thread__zput (atoms->thread); +free (atoms); +} + static int latency_switch_event(struct perf_sched *sched, struct evsel *evsel, struct perf_sample *sample,
@@ -3180,13 +3195,13 @@ static void __merge_work_atoms(struct rb_root_cached *root, struct work_atoms *d this->total_runtime += data->total_runtime; this->nb_atoms += data->nb_atoms; this->total_lat += data->total_lat; -list_splice (&data->work_list, &this->work_list); +list_splice_init (&data->work_list, &this->work_list);if (this->max_lat < data->max_lat) { this->max_lat = data->max_lat; this->max_lat_start = data->max_lat_start; this->max_lat_end = data->max_lat_end; } -zfree (&data); +free_work_atoms (data);return ; } }
@@ -3265,7 +3280,6 @@ static int perf_sched__lat(struct perf_sched *sched) work_list = rb_entry(next, struct work_atoms, node);output_lat_thread (sched, work_list); next =rb_next (next); -thread__zput (work_list->thread); }printf (" -----------------------------------------------------------------------------------------------------------------\n" );
@@ -3279,6 +3293,13 @@ static int perf_sched__lat(struct perf_sched *sched) rc =0 ; +while ((next =rb_first_cached (&sched->sorted_atom_root))) { +struct work_atoms *data; + + data = rb_entry(next, struct work_atoms, node); +rb_erase_cached (next, &sched->sorted_atom_root); +free_work_atoms (data); + } out_free_cpus_switch_event:free_cpus_switch_event (sched);return rc;
Signature · 1 line
2.39.5