6.12.5-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 6.12.5-rc1 review
This is the start of the stable review cycle for the 6.12.5 release. There are 466 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat, 14 Dec 2024 14:41:35 +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.12.5-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.12.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.12.5-rc1
Thomas Gleixner <[email protected]>
clocksource: Make negative motion detection more robust
Colin Ian King <[email protected]>
ALSA: hda/realtek: Fix spelling mistake "Firelfy" -> "Firefly"
Niklas Schnelle <[email protected]>
s390/pci: Fix leak of struct zpci_dev when zpci_add_device() fails
Alex Deucher <[email protected]>
Revert "drm/amd/display: parse umc_info or vram_info based on ASIC"
Takashi Iwai <[email protected]>
ALSA: hda: Fix build error without CONFIG_SND_DEBUG
Alex Deucher <[email protected]>
drm/amdgpu: rework resume handling for display (v2)
Amadeusz Sławiński <[email protected]>
ASoC: Intel: avs: Fix return status of avs_pcm_hw_constraints_init()
Sebastian Ott <[email protected]>
net/mlx5: unique names for per device caches
Heming Zhao <[email protected]>
ocfs2: Revert "ocfs2: fix the la space leak when unmounting an ocfs2 volume"
Bingbu Cao <[email protected]>
media: ipu6: use the IPU6 DMA mapping APIs to do mapping
Richard Weinberger <[email protected]>
jffs2: Fix rtime decompressor
Kinsey Moore <[email protected]>
jffs2: Prevent rtime decompress memory corruption
Nikolay Kuratov <[email protected]>
KVM: x86/mmu: Ensure that kvm_release_pfn_clean() takes exact pfn from kvm_faultin_pfn()
Hari Bathini <[email protected]>
selftests/ftrace: adjust offset for kprobe syntax error test
Yishai Hadas <[email protected]>
vfio/mlx5: Align the page tracking max message size with the device capability
Linus Torvalds <[email protected]>
Revert "unicode: Don't special case ignorable code points"
Damien Le Moal <[email protected]>
x86: Fix build regression with CONFIG_KEXEC_JUMP enabled
Masami Hiramatsu (Google) <[email protected]>
tracing/eprobe: Fix to release eprobe when failed to add dyn_event
Haoyu Li <[email protected]>
clk: en7523: Initialize num before accessing hws in en7523_register_clocks()
Filipe Manana <[email protected]>
btrfs: fix missing snapshot drew unlock when root is dead during swap activation
Qu Wenruo <[email protected]>
btrfs: fix mount failure due to remount races
David Sterba <[email protected]>
btrfs: drop unused parameter data from btrfs_fill_super()
David Sterba <[email protected]>
btrfs: drop unused parameter options from open_ctree()
Wander Lairson Costa <[email protected]>
sched/deadline: Fix warning in migrate_enable for boosted tasks
K Prateek Nayak <[email protected]>
sched/core: Prevent wakeup of ksoftirqd during idle load balance
K Prateek Nayak <[email protected]>
sched/fair: Check idle_cpu() before need_resched() to detect ilb CPU turning busy
K Prateek Nayak <[email protected]>
sched/core: Remove the unnecessary need_resched() check in nohz_csd_func()
Josh Don <[email protected]>
sched: fix warning in sched_setaffinity
Sung Lee <[email protected]>
drm/amd/display: Add option to retrieve detile buffer size
Austin Zheng <[email protected]>
drm/amd/display: Update Interface to Check UCLK DPM
Himal Prasad Ghimiray <[email protected]>
drm/xe/devcoredump: Update handling of xe_force_wake_get return
Himal Prasad Ghimiray <[email protected]>
drm/xe/forcewake: Add a helper xe_force_wake_ref_has_domain()
John Harrison <[email protected]>
drm/xe/guc: Copy GuC log prior to dumping
John Harrison <[email protected]>
drm/xe/devcoredump: Add ASCII85 dump helper function
John Harrison <[email protected]>
drm/xe/devcoredump: Improve section headings and add tile info
John Harrison <[email protected]>
drm/xe/devcoredump: Use drm_puts and already cached local variables
Manivannan Sadhasivam <[email protected]>
scsi: ufs: pltfrm: Dellocate HBA during ufshcd_pltfrm_remove()
Jens Axboe <[email protected]>
io_uring/tctx: work around xa_store() allocation error issue
Rasmus Villemoes <[email protected]>
setlocalversion: work around "git describe" performance
Paulo Alcantara <[email protected]>
smb: client: don't try following DFS links in cifs_tree_connect()
Zhou Wang <[email protected]>
irqchip/gicv3-its: Add workaround for hip09 ITS erratum 162100801
Nilay Shroff <[email protected]>
Revert "nvme: make keep-alive synchronous operation"
Inochi Amaoto <[email protected]>
serial: 8250_dw: Add Sophgo SG2044 quirk
Dmitry Torokhov <[email protected]>
rtc: cmos: avoid taking rtc_lock for extended period of time
Parker Newman <[email protected]>
misc: eeprom: eeprom_93cx6: Add quirk for extra read clock cycle
Michael Ellerman <[email protected]>
powerpc/prom_init: Fixup missing powermac #size-cells
Uwe Kleine-König <[email protected]>
ASoC: amd: yc: Add quirk for microphone on Lenovo Thinkpad T14s Gen 6 21M1CTO1WW
Xi Ruoyao <[email protected]>
MIPS: Loongson64: DTS: Really fix PCIe port nodes for ls7a
Xiang Liu <[email protected]>
drm/amdgpu/vcn: reset fw_shared when VCPU buffers corrupted on vcn v4.0.3
Alex Far <[email protected]>
ASoC: amd: yc: fix internal mic on Redmi G 2022
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: glink: be more precise on orientation-aware ports
Andy Shevchenko <[email protected]>
iio: light: ltr501: Add LTER0303 to the supported devices
Nuno Sa <[email protected]>
iio: adc: ad7192: properly check spi_get_device_match_data()
Saranya Gopal <[email protected]>
usb: typec: ucsi: Do not call ACPI _DSM method for UCSI read operations
Xu Yang <[email protected]>
usb: chipidea: udc: handle USB Error Interrupt if IOC not set
Xu Yang <[email protected]>
usb: chipidea: udc: create bounce buffer for problem sglist entries if possible
Xu Yang <[email protected]>
usb: chipidea: udc: limit usb request length to max 16KB
Xu Yang <[email protected]>
usb: chipidea: add CI_HDRC_HAS_SHORT_PKT_LIMIT flag
Melody Olvera <[email protected]>
regulator: qcom-rpmh: Update ranges for FTSMPS525
Konstantin Komarov <[email protected]>
fs/ntfs3: Fix case when unmarked clusters intersect with zone
Konstantin Komarov <[email protected]>
fs/ntfs3: Fix warning in ni_fiemap
Huacai Chen <[email protected]>
LoongArch: Fix sleeping in atomic context for PREEMPT_RT
Hans de Goede <[email protected]>
ACPI: x86: Clean up Asus entries in acpi_quirk_skip_dmi_ids[]
Hans de Goede <[email protected]>
ACPI: x86: Add skip i2c clients quirk for Acer Iconia One 8 A1-840
Chao Yu <[email protected]>
f2fs: add a sysfs node to limit max read extent count per-inode
Chao Yu <[email protected]>
f2fs: fix to shrink read extent node in batches
Chao Yu <[email protected]>
f2fs: print message if fscorrupted was found in f2fs_new_node_page()
Defa Li <[email protected]>
i3c: Use i3cdev->desc->info instead of calling i3c_device_get_info() to avoid deadlock
Dmitry Baryshkov <[email protected]>
remoteproc: qcom: pas: enable SAR2130P audio DSP support
Mengyuan Lou <[email protected]>
PCI: Add ACS quirk for Wangxun FF5xxx NICs
Keith Busch <[email protected]>
PCI: Add 'reset_subordinate' to reset hierarchy below bridge
Mayank Rana <[email protected]>
PCI: starfive: Enable controller runtime PM before probing host bridge
Esther Shimanovich <[email protected]>
PCI: Detect and trust built-in Thunderbolt chips
Jian-Hong Pan <[email protected]>
PCI: vmd: Set devices to D0 before enabling PM L1 Substates
Nirmal Patel <[email protected]>
PCI: vmd: Add DID 8086:B06F and 8086:B60B for Intel client SKUs
devi priya <[email protected]>
PCI: qcom: Add support for IPQ9574
Jarkko Nikula <[email protected]>
i3c: mipi-i3c-hci: Mask ring interrupts before ring stop request
Qianqiang Liu <[email protected]>
KMSAN: uninit-value in inode_go_dump (5)
Qi Han <[email protected]>
f2fs: fix f2fs_bug_on when uninstalling filesystem call f2fs_evict_inode.
Adam Young <[email protected]>
mailbox: pcc: Check before sending MCTP PCC response ACK
Gabriele Monaco <[email protected]>
verification/dot2: Improve dot parser robustness
furkanonder <[email protected]>
tools/rtla: Enhance argument parsing in timerlat_load.py
Tatsuya S <[email protected]>
tracing: Fix function name for trampoline
Kees Cook <[email protected]>
smb: client: memcpy() with surrounding object base address
Yi Yang <[email protected]>
nvdimm: rectify the illogical code within nd_dax_probe()
Barnabás Czémán <[email protected]>
thermal/drivers/qcom/tsens-v1: Add support for MSM8937 tsens
Barnabás Czémán <[email protected]>
pinctrl: qcom: spmi-mpp: Add PM8937 compatible
Barnabás Czémán <[email protected]>
pinctrl: qcom-pmic-gpio: add support for PM8937
Kai Mäkisara <[email protected]>
scsi: st: Add MTIOCGET and MTLOAD to ioctls allowed after device reset
Kai Mäkisara <[email protected]>
scsi: st: Don't modify unknown block number in MTIOCGET
Mukesh Ojha <[email protected]>
leds: class: Protect brightness_show() with led_cdev->led_access mutex
Devi Priya <[email protected]>
clk: qcom: clk-alpha-pll: Add NSS HUAYRA ALPHA PLL support for ipq9574
Dmitry Baryshkov <[email protected]>
clk: qcom: dispcc-sm8550: enable support for SAR2130P
Dmitry Baryshkov <[email protected]>
clk: qcom: tcsrcc-sm8550: add SAR2130P support
Dmitry Baryshkov <[email protected]>
clk: qcom: rpmh: add support for SAR2130P
Dmitry Baryshkov <[email protected]>
clk: qcom: rcg2: add clk_rcg2_shared_floor_ops
Justin Tee <[email protected]>
scsi: lpfc: Prevent NDLP reference count underflow in dev_loss_tmo callback
Justin Tee <[email protected]>
scsi: lpfc: Check SLI_ACTIVE flag in FDMI cmpl before submitting follow up FDMI
Justin Tee <[email protected]>
scsi: lpfc: Call lpfc_sli4_queue_unset() in restart and rmmod paths
Andrii Nakryiko <[email protected]>
bpf: put bpf_link's program when link is safe to be deallocated
Jason Gunthorpe <[email protected]>
iommu/amd: Fix corruption when mapping large pages from 0
Bart Van Assche <[email protected]>
scsi: ufs: core: Make DMA mask configuration more flexible
Mukesh Ojha <[email protected]>
pinmux: Use sequential access to access desc->pinmux data
Petr Pavlu <[email protected]>
ring-buffer: Limit time with disabled interrupts in rb_check_pages()
Yihang Li <[email protected]>
scsi: hisi_sas: Create all dump files during debugfs initialization
Yihang Li <[email protected]>
scsi: hisi_sas: Add cond_resched() for no forced preemption model
Tomas Glozar <[email protected]>
rtla/timerlat: Make timerlat_hist_cpu->*_count unsigned long long
Tomas Glozar <[email protected]>
rtla/timerlat: Make timerlat_top_cpu->*_count unsigned long long
Jan Stancek <[email protected]>
tools/rtla: fix collision with glibc sched_attr/sched_set_attr
Uros Bizjak <[email protected]>
tracing: Use atomic64_inc_return() in trace_clock_counter()
Mathieu Desnoyers <[email protected]>
tracing/ftrace: disable preemption in syscall probe
Gabriele Monaco <[email protected]>
rtla: Fix consistency in getopt_long for timerlat_hist
Esben Haabendal <[email protected]>
pinctrl: freescale: fix COMPILE_TEST error with PINCTRL_IMX_SCU
Breno Leitao <[email protected]>
netpoll: Use rcu_access_pointer() in __netpoll_setup
Jakub Kicinski <[email protected]>
net/neighbor: clear error in case strict check is not set
Dmitry Antipov <[email protected]>
rocker: fix link status detection in rocker_carrier_init()
Jonas Karlman <[email protected]>
ASoC: hdmi-codec: reorder channel allocation list
Jiande Lu <[email protected]>
Bluetooth: btusb: Add 3 HWIDs for MT7925
Jonathan McCrohan <[email protected]>
Bluetooth: btusb: Add new VID/PID 0489/e124 for MT7925
Hao Qin <[email protected]>
Bluetooth: btusb: Add new VID/PID 0489/e111 for MT7925
Danil Pylaev <[email protected]>
Bluetooth: Set quirks for ATS2851
Danil Pylaev <[email protected]>
Bluetooth: Support new quirks for ATS2851
Danil Pylaev <[email protected]>
Bluetooth: Add new quirks for ATS2851
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_core: Fix not checking skb length on hci_acldata_packet
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_conn: Use disable_delayed_work_sync
Jiande Lu <[email protected]>
Bluetooth: btusb: Add USB HW IDs for MT7920/MT7925
Hilda Wu <[email protected]>
Bluetooth: btusb: Add RTL8852BE device 0489:e123 to device tables
Markus Elfring <[email protected]>
Bluetooth: hci_conn: Reduce hci_conn_drop() calls in two functions
Jarkko Nikula <[email protected]>
i2c: i801: Add support for Intel Panther Lake
Andrew Lunn <[email protected]>
dsa: qca8k: Use nested lock to avoid splat
Dmitry Kandybka <[email protected]>
mptcp: fix possible integer overflow in mptcp_reset_tout_timer
Hou Tao <[email protected]>
bpf: Call free_htab_elem() after htab_unlock_bucket()
Norbert van Bolhuis <[email protected]>
wifi: brcmfmac: Fix oops due to NULL pointer dereference in brcmf_sdiod_sglist_rw()
Jiapeng Chong <[email protected]>
wifi: ipw2x00: libipw_rx_any(): fix bad alignment
Prike Liang <[email protected]>
drm/amdgpu: set the right AMDGPU sg segment limitation
Takashi Iwai <[email protected]>
ALSA: usb-audio: Make mic volume workarounds globally applicable
Xuan Zhuo <[email protected]>
virtio-net: fix overflow inside virtnet_rq_alloc
Victor Zhao <[email protected]>
drm/amdgpu: skip amdgpu_device_cache_pci_state under sriov
Fangzhi Zuo <[email protected]>
drm/amd/display: Prune Invalid Modes For HDMI Output
Aurabindo Pillai <[email protected]>
drm/amd/display: parse umc_info or vram_info based on ASIC
Ausef Yousof <[email protected]>
drm/amd/display: Remove hw w/a toggle if on DP2/HPO
Jocelyn Falempe <[email protected]>
drm/panic: Add ABGR2101010 support
Dmitry Safonov <[email protected]>
net/tcp: Add missing lockdep annotations for TCP-AO hlist traversals
Aleksandr Mishin <[email protected]>
fsl/fman: Validate cell-index value obtained from Device Tree
Nihar Chaithanya <[email protected]>
jfs: add a check to prevent array-index-out-of-bounds in dbAdjTree
Ghanshyam Agrawal <[email protected]>
jfs: fix array-index-out-of-bounds in jfs_readdir
Ghanshyam Agrawal <[email protected]>
jfs: fix shift-out-of-bounds in dbSplit
Ghanshyam Agrawal <[email protected]>
jfs: array-index-out-of-bounds fix in dtReadFirst
Levi Yun <[email protected]>
dma-debug: fix a possible deadlock on radix_lock
Gang Yan <[email protected]>
mptcp: annotate data-races around subflow->fully_established
Leo Ma <[email protected]>
drm/amd/display: Fix underflow when playing 8K video in full screen mode
Mac Chiang <[email protected]>
ASoC: Intel: soc-acpi-intel-arl-match: Add rt722 and rt1320 support
Mac Chiang <[email protected]>
ASoC: sdw_utils: Add quirk to exclude amplifier function
Lang Yu <[email protected]>
drm/amdgpu: refine error handling in amdgpu_ttm_tt_pin_userptr
Donald Hunter <[email protected]>
netlink: specs: Add missing bitset attrs to ethtool spec
Prike Liang <[email protected]>
drm/amdgpu: Dereference the ATCS ACPI buffer
Victor Lu <[email protected]>
drm/amdgpu: clear RB_OVERFLOW bit when enabling interrupts for vega20_ih
Srinivasan Shanmugam <[email protected]>
drm/amdgpu/gfx9: Add cleaner shader for GFX9.4.2
Leo Chen <[email protected]>
drm/amd/display: Adding array index check to prevent memory corruption
Philipp Stanner <[email protected]>
drm/sched: memset() 'job' in drm_sched_job_init()
Abhishek Chauhan <[email protected]>
net: stmmac: Programming sequence for VLAN packets with split header
Shengyu Qu <[email protected]>
net: sfp: change quirks for Alcatel Lucent G-010S-P
Manikandan Muralidharan <[email protected]>
drm/panel: simple: Add Microchip AC69T88A LVDS Display panel
Badal Nilawar <[email protected]>
drm/xe/guc/ct: Flush g2h worker in case of g2h response timeout
Charles Keepax <[email protected]>
ASoC: Intel: sof_sdw: Add quirks for some new Lenovo laptops
Charles Keepax <[email protected]>
ASoC: Intel: sof_sdw: Add quirk for cs42l43 system using host DMICs
Charles Keepax <[email protected]>
ASoC: sdw_utils: Add a quirk to allow the cs42l43 mic DAI to be ignored
Charles Keepax <[email protected]>
ASoC: sdw_utils: Add support for exclusion DAI quirks
Leon Hwang <[email protected]>
bpf: Prevent tailcall infinite loop caused by freplace
Amir Goldstein <[email protected]>
fanotify: allow reporting errors on failure to open fd
Rosen Penev <[email protected]>
wifi: ath5k: add PCI ID for Arcadyan devices
Rosen Penev <[email protected]>
wifi: ath5k: add PCI ID for SX76X
Kang Yang <[email protected]>
wifi: ath10k: avoid NULL pointer error during sdio remove
Ignat Korchagin <[email protected]>
net: inet6: do not leave a dangling sk pointer in inet6_create()
Ignat Korchagin <[email protected]>
net: inet: do not leave a dangling sk pointer in inet_create()
Ignat Korchagin <[email protected]>
net: ieee802154: do not leave a dangling sk pointer in ieee802154_create()
Ignat Korchagin <[email protected]>
net: af_can: do not leave a dangling sk pointer in can_create()
Ignat Korchagin <[email protected]>
Bluetooth: RFCOMM: avoid leaving dangling sk pointer in rfcomm_sock_alloc()
Ignat Korchagin <[email protected]>
Bluetooth: L2CAP: do not leave dangling sk pointer on error in l2cap_sock_create()
Ignat Korchagin <[email protected]>
af_packet: avoid erroring out after sock_init_data() in packet_create()
Elena Salomatkina <[email protected]>
net/sched: cbs: Fix integer overflow in cbs_set_port_rate()
Simon Horman <[email protected]>
net: ethernet: fs_enet: Use %pa to format resource_size_t
Simon Horman <[email protected]>
net: fec_mpc52xx_phy: Use %pa to format resource_size_t
Leo Chen <[email protected]>
drm/amd/display: Full exit out of IPS2 when all allow signals have been cleared
Jeffrey Hugo <[email protected]>
accel/qaic: Add AIC080 support
Kalle Valo <[email protected]>
wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()
Zhu Jun <[email protected]>
samples/bpf: Fix a resource leak
Heiner Kallweit <[email protected]>
r8169: don't apply UDP padding quirk on RTL8126A
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Use codec SSID matching for Lenovo devices
Takashi Iwai <[email protected]>
ALSA: hda/conexant: Use the new codec SSID matching
Takashi Iwai <[email protected]>
ALSA: hda: Use own quirk lookup helper
Brahmajit Das <[email protected]>
drm/display: Fix building with GCC 15
Gustavo Sousa <[email protected]>
drm/xe/xe3: Add initial set of workarounds
Shekhar Chauhan <[email protected]>
drm/xe/ptl: L3bank mask is not available on the media GT
Alex Deucher <[email protected]>
drm/amd/display: disable SG displays on cyan skillfish
Zhongwei <[email protected]>
drm/amd/display: Fix garbage or black screen when resetting otg
Fudongwang <[email protected]>
drm/amd/display: skip disable CRTC in seemless bootup case
Alexander Aring <[email protected]>
dlm: fix possible lkb_resource null dereference
Balamurugan C <[email protected]>
ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for MTL.
Igor Artemiev <[email protected]>
drm/radeon/r600_cs: Fix possible int overflow in r600_packet3_check()
Srinivasan Shanmugam <[email protected]>
drm/amd/display: Fix out-of-bounds access in 'dcn21_link_encoder_create'
Ping-Ke Shih <[email protected]>
wifi: rtw89: check return value of ieee80211_probereq_get() for RNR
Liao Chen <[email protected]>
drm/mcde: Enable module autoloading
Liao Chen <[email protected]>
drm/bridge: it6505: Enable module autoloading
Joaquín Ignacio Aramendía <[email protected]>
drm: panel-orientation-quirks: Add quirk for AYA NEO GEEK
Joaquín Ignacio Aramendía <[email protected]>
drm: panel-orientation-quirks: Add quirk for AYA NEO Founder edition
Joaquín Ignacio Aramendía <[email protected]>
drm: panel-orientation-quirks: Add quirk for AYA NEO 2 model
Dnyaneshwar Bhadane <[email protected]>
drm/xe/pciid: Add new PCI id for ARL
Ping-Ke Shih <[email protected]>
wifi: rtw88: use ieee80211_purge_tx_queue() to purge TX skb
Rodrigo Vivi <[email protected]>
drm/xe/pciids: Add PVC's PCI device ID macros
Dave Stevenson <[email protected]>
drm/vc4: hvs: Set AXI panic modes for the HVS
Dom Cobley <[email protected]>
drm/vc4: hdmi: Avoid log spam for audio start failure
Jani Nikula <[email protected]>
drm/xe/pciids: separate ARL and MTL PCI IDs
Jani Nikula <[email protected]>
drm/xe/pciids: separate RPL-U and RPL-P PCI IDs
Callahan Kovacs <[email protected]>
HID: magicmouse: Apple Magic Trackpad 2 USB-C driver support
Changwoo Min <[email protected]>
sched_ext: add a missing rcu_read_lock/unlock pair at scx_select_cpu_dfl()
Reinette Chatre <[email protected]>
selftests/resctrl: Protect against array overflow when reading strings
Cristian Ciocaltea <[email protected]>
regmap: maple: Provide lockdep (sub)class for maple tree's internal lock
Marek Vasut <[email protected]>
soc: imx8m: Probe the SoC driver as platform driver
Aleksandrs Vinarskis <[email protected]>
firmware: qcom: scm: Allow QSEECOM on Dell XPS 13 9345
Peng Fan <[email protected]>
mmc: sdhci-esdhc-imx: enable quirks SDHCI_QUIRK_NO_LED
Keita Aihara <[email protected]>
mmc: core: Add SD card quirk for broken poweroff notification
Rohan Barar <[email protected]>
media: cx231xx: Add support for Dexatek USB Video Grabber 1d19:6108
Ricardo Ribalda <[email protected]>
media: uvcvideo: Force UVC version to 1.0a for 0408:4033
David Given <[email protected]>
media: uvcvideo: Add a quirk for the Kaiweets KTI-W02 infrared camera
Dmitry Perchanov <[email protected]>
media: uvcvideo: RealSense D421 Depth module metadata
Bjorn Andersson <[email protected]>
soc: qcom: pd-mapper: Add QCM6490 PD maps
Maya Matuszczyk <[email protected]>
firmware: qcom: scm: Allow QSEECOM on Lenovo Yoga Slim 7x
Benjamin Tissoires <[email protected]>
HID: add per device quirk to force bind to hid-generic
Konrad Dybcio <[email protected]>
soc: qcom: llcc: Use designated initializers for LLC settings
Stefan Wahren <[email protected]>
spi: spi-fsl-lpspi: Adjust type of scldiv
Bartosz Golaszewski <[email protected]>
gpio: free irqs that are still requested when the chip is being removed
Thomas Gleixner <[email protected]>
timekeeping: Always check for negative motion
Stephen Rothwell <[email protected]>
iio: magnetometer: fix if () scoped_guard() formatting
Przemek Kitszel <[email protected]>
cleanup: Adjust scoped_guard() macros to avoid potential warning
Breno Leitao <[email protected]>
perf/x86/amd: Warn only on new bits set
Jonathan Denose <[email protected]>
ACPI: video: force native for Apple MacbookPro11,2 and Air7,2
Hans de Goede <[email protected]>
ACPI: x86: Add adev NULL check to acpi_quirk_skip_serdev_enumeration()
Hans de Goede <[email protected]>
ACPI: x86: Make UART skip quirks work on PCI UARTs without an UID
Sarah Maedel <[email protected]>
hwmon: (nct6775) Add 665-ACE/600M-CL to ASUS WMI monitoring list
Marco Elver <[email protected]>
kcsan: Turn report_filterlist_lock into a raw_spinlock
Lukas Wunner <[email protected]>
crypto: ecdsa - Avoid signed integer overflow on signature decoding
Brian Foster <[email protected]>
ext4: partial zero eof block on unaligned inode size extension
Mark Brown <[email protected]>
kselftest/arm64: Don't leak pipe fds in pac.exec_sign_all()
Boris Burkov <[email protected]>
btrfs: do not clear read-only when adding sprout device
Qu Wenruo <[email protected]>
btrfs: canonicalize the device path before adding it
Qu Wenruo <[email protected]>
btrfs: avoid unnecessary device path update for the same device
Johannes Thumshirn <[email protected]>
btrfs: don't take dev_replace rwsem on task already holding it
Damien Le Moal <[email protected]>
block: RCU protect disk->conv_zones_bitmap
Thomas Richter <[email protected]>
s390/cpum_sf: Handle CPU hotplug remove during sampling
Mark Brown <[email protected]>
kselftest/arm64: Log fp-stress child startup errors to stdout
Christian Brauner <[email protected]>
epoll: annotate racy check
Niklas Schnelle <[email protected]>
s390/pci: Ignore RID for isolated VFs
Niklas Schnelle <[email protected]>
s390/pci: Use topology ID for multi-function devices
Niklas Schnelle <[email protected]>
s390/pci: Sort PCI functions prior to creating virtual busses
Gary Guo <[email protected]>
rust: enable arbitrary_self_types and remove Receiver
Mike Rapoport (Microsoft) <[email protected]>
memblock: allow zero threshold in validate_numa_converage()
Manivannan Sadhasivam <[email protected]>
scsi: ufs: pltfrm: Drop PM runtime reference count after ufshcd_remove()
Kalesh Singh <[email protected]>
mm: respect mmap hint address when aligning for THP
Andrii Nakryiko <[email protected]>
mm: fix vrealloc()'s KASAN poisoning logic
Matthew Wilcox (Oracle) <[email protected]>
mm: open-code page_folio() in dump_page()
Matthew Wilcox (Oracle) <[email protected]>
mm: open-code PageTail in folio_flags() and const_folio_flags()
John Sperbeck <[email protected]>
mm: memcg: declare do_memsw_account inline
Akinobu Mita <[email protected]>
mm/damon: fix order of arguments in damos_before_apply tracepoint
David Woodhouse <[email protected]>
x86/mm: Add _PAGE_NOPTISHADOW bit to avoid updating userspace page tables
Fernando Fernandez Mancera <[email protected]>
x86/cpu/topology: Remove limit of CPUs due to disabled IO/APIC
David Hildenbrand <[email protected]>
mm/mempolicy: fix migrate_to_node() assuming there is at least one VMA in a MM
John Hubbard <[email protected]>
mm/gup: handle NULL pages in unpin_user_pages()
Jared Kangas <[email protected]>
kasan: make report_lock a raw spinlock
Adrian Huang <[email protected]>
sched/numa: fix memory leak due to the overwritten vma->numab_state
Kees Cook <[email protected]>
lib: stackinit: hide never-taken branch from compiler
Marco Elver <[email protected]>
stackdepot: fix stack_depot_save_flags() in NMI context
Wengang Wang <[email protected]>
ocfs2: update seq_file index in ocfs2_dlm_seq_next
Len Brown <[email protected]>
x86/cpu: Add Lunar Lake to list of CPUs with a broken MONITOR implementation
Ulf Hansson <[email protected]>
mmc: core: Further prevent card detect during shutdown
Hans de Goede <[email protected]>
mmc: sdhci-pci: Add DMI quirk for missing CD GPIO on Vexia Edu Atla 10 tablet
Marc Zyngier <[email protected]>
arch_numa: Restore nid checks before registering a memblock with a node
Cosmin Tanislav <[email protected]>
regmap: detach regmap from dev on regmap_exit
Maciej Fijalkowski <[email protected]>
xsk: fix OOB map writes when deleting elements
Tvrtko Ursulin <[email protected]>
dma-fence: Use kernel's sort for merging fences
Tvrtko Ursulin <[email protected]>
dma-fence: Fix reference leak on fence merge failure path
Christian König <[email protected]>
dma-buf: fix dma_fence_array_signaled v4
Maciej Fijalkowski <[email protected]>
bpf: fix OOB devmap writes when deleting elements
David Woodhouse <[email protected]>
x86/kexec: Restore GDT on return from ::preserve_context kexec
Thomas Gleixner <[email protected]>
modpost: Add .irqentry.text to OTHER_SECTIONS
Alex Deucher <[email protected]>
drm/amdgpu/hdp5.2: do a posting read when flushing HDP
Alex Deucher <[email protected]>
drm/amdgpu/hdp7.0: do a posting read when flushing HDP
Alex Deucher <[email protected]>
drm/amdgpu/hdp5.0: do a posting read when flushing HDP
Alex Deucher <[email protected]>
drm/amdgpu/hdp4.0: do a posting read when flushing HDP
Alex Deucher <[email protected]>
drm/amdgpu/hdp6.0: do a posting read when flushing HDP
Peterson Guo <[email protected]>
drm/amd/display: Add a left edge pixel if in YCbCr422 or YCbCr420 and odm
Dillon Varone <[email protected]>
drm/amd/display: Limit VTotal range to max hw cap minus fp
Lo-an Chen <[email protected]>
drm/amd/display: Correct prefetch calculation
Imre Deak <[email protected]>
drm/dp_mst: Fix resetting msg rx state after topology removal
Imre Deak <[email protected]>
drm/dp_mst: Verify request type in the corresponding down message reply
Alex Deucher <[email protected]>
drm/amd/pm: fix and simplify workload handling
Sreekant Somasekharan <[email protected]>
drm/amdkfd: add MEC version that supports no PCIe atomics for GFX12
Imre Deak <[email protected]>
drm/dp_mst: Fix MST sideband message body length check
David Yat Sin <[email protected]>
drm/amdkfd: hard-code cacheline for gc943,gc944
Ricardo Neri <[email protected]>
x86/cacheinfo: Delete global num_cache_leaves
Ricardo Neri <[email protected]>
cacheinfo: Allocate memory during CPU hotplug if not done from the primary CPU
Mark Brown <[email protected]>
selftest: hugetlb_dio: fix test naming
Maximilian Heyne <[email protected]>
selftests/damon: add _damon_sysfs.py to TEST_FILES
Shengjiu Wang <[email protected]>
pmdomain: imx: gpcv2: Adjust delay after power up handshake
Jan Kara <[email protected]>
Revert "readahead: properly shorten readahead when falling back to do_page_cache_ra()"
Liequan Che <[email protected]>
bcache: revert replacing IS_ERR_OR_NULL with IS_ERR again
Bernd Schubert <[email protected]>
io_uring: Change res2 parameter type in io_uring_cmd_done
Steve French <[email protected]>
smb3.1.1: fix posix mounts to older servers
Ralph Boehme <[email protected]>
fs/smb/client: cifs_prime_dcache() for SMB3 POSIX reparse points
Ralph Boehme <[email protected]>
fs/smb/client: Implement new SMB3 POSIX type
Ralph Boehme <[email protected]>
fs/smb/client: avoid querying SMB2_OP_QUERY_WSL_EA for SMB3 POSIX
Ryusuke Konishi <[email protected]>
nilfs2: fix potential out-of-bounds memory access in nilfs_find_entry()
Peter Wang <[email protected]>
scsi: ufs: core: Add missing post notify for power mode change
Manivannan Sadhasivam <[email protected]>
scsi: ufs: pltfrm: Disable runtime PM during removal of glue drivers
Manivannan Sadhasivam <[email protected]>
scsi: ufs: qcom: Only free platform MSIs when ESI is enabled
Manivannan Sadhasivam <[email protected]>
scsi: ufs: core: Cancel RTC work during ufshcd_remove()
Gwendal Grignou <[email protected]>
scsi: ufs: core: sysfs: Prevent div by zero
Saurav Kashyap <[email protected]>
scsi: qla2xxx: Remove check req_sg_cnt should be equal to rsp_sg_cnt
Quinn Tran <[email protected]>
scsi: qla2xxx: Fix use after free on unload
Anil Gurumurthy <[email protected]>
scsi: qla2xxx: Supported speed displayed incorrectly for VPorts
Quinn Tran <[email protected]>
scsi: qla2xxx: Fix NVMe and NPIV connect issue
Quinn Tran <[email protected]>
scsi: qla2xxx: Fix abort in bsg timeout
Sahas Leelodharry <[email protected]>
ALSA: hda/realtek: Add support for Samsung Galaxy Book3 360 (NP730QFG)
Nazar Bilinskyi <[email protected]>
ALSA: hda/realtek: Enable mute and micmute LED on HP ProBook 430 G8
Marie Ramlow <[email protected]>
ALSA: usb-audio: add mixer mapping for Corsair HS80
Chris Chiu <[email protected]>
ALSA: hda/realtek: fix micmute LEDs don't work on HP Laptops
Asahi Lina <[email protected]>
ALSA: usb-audio: Add extra PID for RME Digiface USB
Dan Carpenter <[email protected]>
ALSA: usb-audio: Fix a DMA to stack memory bug
Mark Rutland <[email protected]>
arm64: ptrace: fix partial SETREGSET for NT_ARM_POE
Mark Rutland <[email protected]>
arm64: ptrace: fix partial SETREGSET for NT_ARM_FPMR
Mark Rutland <[email protected]>
arm64: ptrace: fix partial SETREGSET for NT_ARM_TAGGED_ADDR_CTRL
Catalin Marinas <[email protected]>
arm64: Ensure bits ASID[15:8] are masked out when the kernel uses 8-bit ASIDs
Yang Shi <[email protected]>
arm64: mm: Fix zone_dma_limit calculation
Nicolin Chen <[email protected]>
iommufd: Fix out_fput in iommufd_fault_alloc()
Shradha Gupta <[email protected]>
net :mana :Request a V2 response version for MANA_QUERY_GF_STAT
Kuan-Wei Chiu <[email protected]>
tracing: Fix cmp_entries_dup() to respect sort() comparison rules
Marc Kleine-Budde <[email protected]>
can: mcp251xfd: mcp251xfd_get_tef_len(): work around erratum DS80000789E 6.
Marc Kleine-Budde <[email protected]>
can: dev: can_set_termination(): allow sleeping GPIOs
Alexander Sverdlin <[email protected]>
watchdog: rti: of: honor timeout-sec property
Jordy Zomer <[email protected]>
ksmbd: fix Out-of-Bounds Write in ksmbd_vfs_stream_write
Jordy Zomer <[email protected]>
ksmbd: fix Out-of-Bounds Read in ksmbd_vfs_stream_read
Huacai Chen <[email protected]>
LoongArch: KVM: Protect kvm_check_requests() with SRCU
Bibo Mao <[email protected]>
LoongArch: Add architecture specific huge_pte_clear()
WangYuli <[email protected]>
HID: wacom: fix when get product name maybe null pointer
Kenny Levinsen <[email protected]>
HID: i2c-hid: Revert to using power commands to wake on resume
Miguel Ojeda <[email protected]>
rust: allow clippy::needless_lifetimes
Sean Christopherson <[email protected]>
x86/CPU/AMD: WARN when setting EFER.AUTOIBRS if and only if the WRMSR fails
Hou Tao <[email protected]>
bpf: Fix exact match conditions in trie_get_next_key()
Hou Tao <[email protected]>
bpf: Handle in-place update for full LPM trie correctly
Hou Tao <[email protected]>
bpf: Remove unnecessary kfree(im_node) in lpm_trie_update_elem
Hou Tao <[email protected]>
bpf: Handle BPF_EXIST and BPF_NOEXIST for LPM trie
Paulo Alcantara <[email protected]>
smb: client: fix potential race in cifs_put_tcon()
Jakob Hauser <[email protected]>
iio: magnetometer: yas530: use signed integer type for clamp limits
Randy Dunlap <[email protected]>
scatterlist: fix incorrect func name in kernel-doc
Tetsuo Handa <[email protected]>
ocfs2: free inode when ocfs2_get_init_inode() fails
Maíra Canal <[email protected]>
drm/v3d: Enable Performance Counters before clearing them
Nícolas F. R. A. Prado <[email protected]>
ASoC: mediatek: mt8188-mt6359: Remove hardcoded dmic codec
John Garry <[email protected]>
scsi: scsi_debug: Fix hrtimer support for ndelay
Suraj Sonawane <[email protected]>
scsi: sg: Fix slab-use-after-free read in sg_release()
Chunguang.xu <[email protected]>
nvme-rdma: unquiesce admin_q before destroy it
Chunguang.xu <[email protected]>
nvme-tcp: fix the memleak while create new ctrl failed
Maurizio Lombardi <[email protected]>
nvme-fabrics: handle zero MAXCMD without closing the connection
Tao Lyu <[email protected]>
bpf: Fix narrow scalar spill onto 64-bit spilled scalar slots
Kumar Kartikeya Dwivedi <[email protected]>
bpf: Don't mark STACK_INVALID as STACK_MISC in mark_stack_slot_misc
Will Deacon <[email protected]>
drivers/virt: pkvm: Don't fail ioremap() call if MMIO_GUARD fails
Geert Uytterhoeven <[email protected]>
irqchip/stm32mp-exti: CONFIG_STM32MP_EXTI should not default to y when compile-testing
Tao Lyu <[email protected]>
bpf: Ensure reg is PTR_TO_STACK in process_iter_arg
Aruna Ramakrishna <[email protected]>
x86/pkeys: Ensure updated PKRU value is XRSTOR'd
Aruna Ramakrishna <[email protected]>
x86/pkeys: Change caller of update_pkru_in_sigframe()
Christoph Hellwig <[email protected]>
nvme: don't apply NVME_QUIRK_DEALLOCATE_ZEROES when DSM is not supported
Ulf Hansson <[email protected]>
pmdomain: core: Fix error path in pm_genpd_init() when ida alloc fails
Ulf Hansson <[email protected]>
pmdomain: core: Add missing put_device()
Dan Carpenter <[email protected]>
ASoC: SOF: ipc3-topology: fix resource leaks in sof_ipc3_widget_setup_comp_dai()
Bard Liao <[email protected]>
ASoC: SOF: ipc3-topology: Convert the topology pin index to ALH dai index
Pei Xiao <[email protected]>
spi: mpc52xx: Add cancel_work_sync before module remove
Björn Töpel <[email protected]>
tools: Override makefile ARCH variable if defined, but empty
Takashi Iwai <[email protected]>
ALSA: usb-audio: Notify xrun for low-latency mode
Takashi Iwai <[email protected]>
ALSA: seq: ump: Fix seq port updates per FB info notify
Zijian Zhang <[email protected]>
tcp_bpf: Fix the sk_mem_uncharge logic in tcp_bpf_sendmsg
Pei Xiao <[email protected]>
drm/sti: Add __iomem for mixer_dbg_mxn's parameter
Amir Mohammadi <[email protected]>
bpftool: fix potential NULL pointer dereferencing in prog_dump()
Larysa Zaremba <[email protected]>
xsk: always clear DMA mapping information when unmapping the pool
Michal Luczaj <[email protected]>
bpf, vsock: Invoke proto::close on close()
Michal Luczaj <[email protected]>
bpf, vsock: Fix poll() missing a queue
Ziqi Chen <[email protected]>
scsi: ufs: core: Add ufshcd_send_bsg_uic_cmd() for UFS BSG
Bart Van Assche <[email protected]>
scsi: ufs: core: Always initialize the UIC done completion
Chris Park <[email protected]>
drm/amd/display: Ignore scalar validation failure if pipe is phantom
Yihan Zhu <[email protected]>
drm/amd/display: calculate final viewport before TAP optimization
Frank Li <[email protected]>
i3c: master: Fix dynamic address leak when 'assigned-address' is present
Frank Li <[email protected]>
i3c: master: Extend address status bit to 4 and add I3C_ADDR_SLOT_EXT_DESIRED
Frank Li <[email protected]>
i3c: master: Replace hard code 2 with macro I3C_ADDR_SLOT_STATUS_BITS
Chao Yu <[email protected]>
f2fs: fix to requery extent which cross boundary of inquiry
Zhiguo Niu <[email protected]>
f2fs: fix to adjust appropriate length for fiemap
Chao Yu <[email protected]>
f2fs: clean up w/ F2FS_{BLK_TO_BYTES,BTYES_TO_BLK}Marcelo Dalmas <[email protected]>
ntp: Remove invalid cast in time offset math
Sergey Senozhatsky <[email protected]>
zram: clear IDLE flag in mark_idle()
Sergey Senozhatsky <[email protected]>
zram: do not mark idle slots that cannot be idle
Avri Altman <[email protected]>
mmc: core: Use GFP_NOIO in ACMD22
Avri Altman <[email protected]>
mmc: core: Adjust ACMD22 to SDUC
Avri Altman <[email protected]>
mmc: sd: SDUC Support Recognition
Andy-ld Lu <[email protected]>
mmc: mtk-sd: Fix MMC_CAP2_CRYPTO flag setting
Rosen Penev <[email protected]>
mmc: mtk-sd: fix devm_clk_get_optional usage
Andy-ld Lu <[email protected]>
mmc: mtk-sd: Fix error handle of probe function
Rosen Penev <[email protected]>
mmc: mtk-sd: use devm_mmc_alloc_host
Charles Han <[email protected]>
gpio: grgpio: Add NULL check in grgpio_probe
Bartosz Golaszewski <[email protected]>
gpio: grgpio: use a helper variable to store the address of ofdev->dev
Eric Dumazet <[email protected]>
net: avoid potential UAF in default_operstate()
Konstantin Shkolnyy <[email protected]>
vsock/test: fix parameter types in SO_VM_SOCKETS_* calls
Konstantin Shkolnyy <[email protected]>
vsock/test: fix failures due to wrong SO_RCVLOWAT parameter
Jianbo Liu <[email protected]>
net/mlx5e: Remove workaround to avoid syndrome for internal port
Tariq Toukan <[email protected]>
net/mlx5e: SD, Use correct mdev to build channel param
Cosmin Ratiu <[email protected]>
net/mlx5: HWS: Properly set bwc queue locks lock classes
Cosmin Ratiu <[email protected]>
net/mlx5: HWS: Fix memory leak in mlx5hws_definer_calc_layout
Eric Dumazet <[email protected]>
geneve: do not assume mac header is set in geneve_xmit_skb()
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_flex_keys: Use correct key block on Spectrum-4
Christophe JAILLET <[email protected]>
mlxsw: spectrum_acl_flex_keys: Constify struct mlxsw_afk_element_inst
Kory Maincent <[email protected]>
ethtool: Fix wrong mod state in case of verbose and no_mask bitset
Pablo Neira Ayuso <[email protected]>
netfilter: nft_set_hash: skip duplicated elements pending gc run
Phil Sutter <[email protected]>
netfilter: ipset: Hold module reference while requesting a module
Xin Long <[email protected]>
net: sched: fix erspan_opt settings in cls_flower
Fernando Fernandez Mancera <[email protected]>
Revert "udp: avoid calling sock_def_readable() if possible"
Pablo Neira Ayuso <[email protected]>
netfilter: nft_inner: incorrect percpu area handling under softirq
Yuan Can <[email protected]>
igb: Fix potential invalid memory access in igb_init_module()
Tore Amundsen <[email protected]>
ixgbe: Correct BASE-BX10 compliance code
Jacob Keller <[email protected]>
ixgbe: downgrade logging of unsupported VF API version to debug
Jacob Keller <[email protected]>
ixgbevf: stop attempting IPSEC offload on Mailbox API 1.5
Joshua Hay <[email protected]>
idpf: set completion tag for "empty" bufs associated with a packet
Marcin Szycik <[email protected]>
ice: Fix VLAN pruning in switchdev mode
Przemyslaw Korba <[email protected]>
ice: fix PHY timestamp extraction for ETH56G
Arkadiusz Kubalewski <[email protected]>
ice: fix PHY Clock Recovery availability check
Eric Dumazet <[email protected]>
net: hsr: must allocate more bytes for RedBox support
Louis Leseur <[email protected]>
net/qed: allow old cards not supporting "num_images" to work
Wen Gu <[email protected]>
net/smc: fix LGR and link use-after-free issue
Wen Gu <[email protected]>
net/smc: initialize close_work early to avoid warning
Kuniyuki Iwashima <[email protected]>
tipc: Fix use-after-free of kernel socket in cleanup_bearer().
Ivan Solodovnikov <[email protected]>
dccp: Fix memory leak in dccp_feat_change_recv
Jiri Wiesner <[email protected]>
net/ipv6: release expired exception dst cached in socket
Oleksij Rempel <[email protected]>
net: phy: microchip: Reset LAN88xx PHY to ensure clean link state on LAN7800/7850
Armin Wolf <[email protected]>
platform/x86: asus-wmi: Ignore return value when writing thermal policy
Dmitry Antipov <[email protected]>
can: j1939: j1939_session_new(): fix skb reference counting
Eric Dumazet <[email protected]>
ipv6: avoid possible NULL deref in modify_prefix_route()
Dong Chenchen <[email protected]>
net: Fix icmp host relookup triggering ip_rt_bug
Daniel Xu <[email protected]>
bnxt_en: ethtool: Supply ntuple rss context action
Eric Dumazet <[email protected]>
net: hsr: avoid potential out-of-bound access in fill_frame_info()
Martin Ottens <[email protected]>
net/sched: tbf: correct backlog statistic for GSO packets
Ajay Kaher <[email protected]>
ptp: Add error handling for adjfine callback in ptp_clock_adjtime
Wei Fang <[email protected]>
net: enetc: Do not configure preemptible TCs if SIs do not support
Maximilian Heyne <[email protected]>
selftests: hid: fix typo and exit code
Pablo Neira Ayuso <[email protected]>
netfilter: nft_socket: remove WARN_ON_ONCE on maximum cgroup level
Dmitry Antipov <[email protected]>
netfilter: x_tables: fix LED ID check in led_tg_check()
Jinghao Jia <[email protected]>
ipvs: fix UB due to uninitialized stack access in ip_vs_protocol_init()
Dario Binacchi <[email protected]>
can: f81604: f81604_handle_can_bus_errors(): fix {rx,tx}_errors statisticsDario Binacchi <[email protected]>
can: ems_usb: ems_usb_rx_err(): fix {rx,tx}_errors statistics
Dario Binacchi <[email protected]>
can: sun4i_can: sun4i_can_err(): fix {rx,tx}_errors statistics
Dario Binacchi <[email protected]>
can: sja1000: sja1000_err(): fix {rx,tx}_errors statisticsDario Binacchi <[email protected]>
can: hi311x: hi3110_can_ist(): fix {rx,tx}_errors statisticsDario Binacchi <[email protected]>
can: ifi_canfd: ifi_canfd_handle_lec_err(): fix {rx,tx}_errors statistics
Dario Binacchi <[email protected]>
can: m_can: m_can_handle_lec_err(): fix {rx,tx}_errors statistics
Dario Binacchi <[email protected]>
can: hi311x: hi3110_can_ist(): fix potential use-after-free
Dario Binacchi <[email protected]>
can: sun4i_can: sun4i_can_err(): call can_change_state() even if cf is NULL
Dario Binacchi <[email protected]>
can: c_can: c_can_handle_bus_err(): update statistics if skb allocation fails
Alexander Kozhinov <[email protected]>
can: gs_usb: add usb endpoint address detection at driver probe step
Yassine Oudjana <[email protected]>
watchdog: mediatek: Make sure system reset gets asserted in mtk_wdt_restart()
Nick Chan <[email protected]>
watchdog: apple: Actually flush writes after requesting watchdog restart
Harini T <[email protected]>
watchdog: xilinx_wwdt: Calculate max_hw_heartbeat_ms using clock frequency
Oleksandr Ocheretnyi <[email protected]>
iTCO_wdt: mask NMI_NOW bit for update_no_reboot_bit() call
-------------
Diffstat:
Documentation/ABI/testing/sysfs-bus-pci | 11 + Documentation/ABI/testing/sysfs-fs-f2fs | 6 + Documentation/accel/qaic/aic080.rst | 14 + Documentation/accel/qaic/index.rst | 1 + Documentation/arch/arm64/silicon-errata.rst | 2 + Documentation/i2c/busses/i2c-i801.rst | 1 + Documentation/netlink/specs/ethtool.yaml | 7 +- Makefile | 5 +- arch/arm64/Kconfig | 11 + arch/arm64/kernel/ptrace.c | 10 +- arch/arm64/mm/context.c | 4 +- arch/arm64/mm/init.c | 17 +- arch/loongarch/include/asm/hugetlb.h | 10 + arch/loongarch/kvm/vcpu.c | 4 +- arch/loongarch/mm/tlb.c | 2 +- arch/mips/boot/dts/loongson/ls7a-pch.dtsi | 73 +- arch/powerpc/kernel/prom_init.c | 29 +- arch/s390/include/asm/pci.h | 14 +- arch/s390/include/asm/pci_clp.h | 8 +- arch/s390/kernel/perf_cpum_sf.c | 4 +- arch/s390/pci/pci.c | 88 +- arch/s390/pci/pci_bus.c | 48 +- arch/s390/pci/pci_clp.c | 17 +- arch/s390/pci/pci_event.c | 19 +- arch/x86/Kconfig | 1 - arch/x86/events/amd/core.c | 10 +- arch/x86/include/asm/pgtable_types.h | 8 +- arch/x86/kernel/cpu/amd.c | 2 +- arch/x86/kernel/cpu/cacheinfo.c | 43 +- arch/x86/kernel/cpu/intel.c | 4 +- arch/x86/kernel/cpu/topology.c | 6 +- arch/x86/kernel/fpu/signal.c | 20 +- arch/x86/kernel/fpu/xstate.h | 27 +- arch/x86/kernel/relocate_kernel_64.S | 8 + arch/x86/kvm/mmu/mmu.c | 10 +- arch/x86/kvm/mmu/paging_tmpl.h | 5 +- arch/x86/mm/ident_map.c | 6 +- arch/x86/mm/pti.c | 2 +- arch/x86/pci/acpi.c | 119 + block/blk-zoned.c | 43 +- crypto/ecdsa.c | 19 +- drivers/accel/qaic/qaic_drv.c | 4 +- drivers/acpi/video_detect.c | 16 + drivers/acpi/x86/utils.c | 85 +- drivers/base/arch_numa.c | 4 + drivers/base/cacheinfo.c | 14 +- drivers/base/regmap/internal.h | 1 + drivers/base/regmap/regcache-maple.c | 3 + drivers/base/regmap/regmap.c | 13 + drivers/block/zram/zram_drv.c | 29 +- drivers/bluetooth/btusb.c | 26 + drivers/clk/clk-en7523.c | 4 +- drivers/clk/qcom/Kconfig | 4 +- drivers/clk/qcom/clk-alpha-pll.c | 11 + drivers/clk/qcom/clk-alpha-pll.h | 1 + drivers/clk/qcom/clk-rcg.h | 1 + drivers/clk/qcom/clk-rcg2.c | 48 +- drivers/clk/qcom/clk-rpmh.c | 13 + drivers/clk/qcom/dispcc-sm8550.c | 18 +- drivers/clk/qcom/tcsrcc-sm8550.c | 18 +- drivers/dma-buf/dma-fence-array.c | 28 +- drivers/dma-buf/dma-fence-unwrap.c | 126 +- drivers/firmware/qcom/qcom_scm.c | 2 + drivers/gpio/gpio-grgpio.c | 26 +- drivers/gpio/gpiolib.c | 41 + drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 48 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 5 +- drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 12 + .../gpu/drm/amd/amdgpu/gfx_v9_0_cleaner_shader.h | 44 +- .../drm/amd/amdgpu/gfx_v9_4_2_cleaner_shader.asm | 153 + drivers/gpu/drm/amd/amdgpu/hdp_v4_0.c | 12 +- drivers/gpu/drm/amd/amdgpu/hdp_v5_0.c | 7 +- drivers/gpu/drm/amd/amdgpu/hdp_v5_2.c | 6 +- drivers/gpu/drm/amd/amdgpu/hdp_v6_0.c | 6 +- drivers/gpu/drm/amd/amdgpu/hdp_v7_0.c | 6 +- drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 30 +- drivers/gpu/drm/amd/amdgpu/vega20_ih.c | 27 + drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 6 + drivers/gpu/drm/amd/amdkfd/kfd_device.c | 3 + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 25 +- .../amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c | 17 +- drivers/gpu/drm/amd/display/dc/core/dc.c | 27 +- drivers/gpu/drm/amd/display/dc/core/dc_debug.c | 40 + drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 57 +- drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 6 +- drivers/gpu/drm/amd/display/dc/dc.h | 3 + drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c | 6 +- .../dc/dio/dcn314/dcn314_dio_stream_encoder.c | 10 + .../drm/amd/display/dc/dml2/display_mode_core.c | 1 + .../dc/dml2/dml21/dml21_translation_helper.c | 29 +- .../dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.c | 1 + .../drm/amd/display/dc/hwss/dcn314/dcn314_hwseq.c | 20 +- drivers/gpu/drm/amd/display/dc/inc/core_status.h | 2 + drivers/gpu/drm/amd/display/dc/inc/core_types.h | 5 + .../amd/display/dc/resource/dcn20/dcn20_resource.c | 23 + .../amd/display/dc/resource/dcn21/dcn21_resource.c | 2 +- .../amd/display/dc/resource/dcn30/dcn30_resource.c | 1 + .../display/dc/resource/dcn302/dcn302_resource.c | 1 + .../display/dc/resource/dcn303/dcn303_resource.c | 1 + .../amd/display/dc/resource/dcn31/dcn31_resource.c | 7 + .../amd/display/dc/resource/dcn31/dcn31_resource.h | 3 + .../display/dc/resource/dcn314/dcn314_resource.c | 1 + .../display/dc/resource/dcn315/dcn315_resource.c | 7 + .../display/dc/resource/dcn316/dcn316_resource.c | 1 + .../amd/display/dc/resource/dcn32/dcn32_resource.c | 1 + .../display/dc/resource/dcn321/dcn321_resource.c | 1 + .../amd/display/dc/resource/dcn35/dcn35_resource.c | 2 + .../display/dc/resource/dcn351/dcn351_resource.c | 2 + .../display/dc/resource/dcn401/dcn401_resource.c | 18 + drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h | 3 +- .../drm/amd/display/modules/freesync/freesync.c | 13 +- drivers/gpu/drm/amd/pm/amdgpu_pm.c | 6 +- drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 148 +- drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h | 15 +- drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c | 190 +- drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c | 181 +- .../drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 182 +- drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 41 +- drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c | 43 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 169 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 152 +- .../gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c | 172 +- drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c | 25 + drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h | 4 + drivers/gpu/drm/bridge/ite-it6505.c | 1 + drivers/gpu/drm/display/drm_dp_dual_mode_helper.c | 4 +- drivers/gpu/drm/display/drm_dp_mst_topology.c | 55 +- drivers/gpu/drm/drm_panel_orientation_quirks.c | 18 + drivers/gpu/drm/drm_panic.c | 10 + drivers/gpu/drm/mcde/mcde_drv.c | 1 + drivers/gpu/drm/panel/panel-simple.c | 28 + drivers/gpu/drm/radeon/r600_cs.c | 2 +- drivers/gpu/drm/scheduler/sched_main.c | 8 + drivers/gpu/drm/sti/sti_mixer.c | 2 +- drivers/gpu/drm/v3d/v3d_perfmon.c | 2 +- drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +- drivers/gpu/drm/vc4/vc4_hvs.c | 11 + drivers/gpu/drm/xe/regs/xe_engine_regs.h | 1 + drivers/gpu/drm/xe/regs/xe_gt_regs.h | 3 + drivers/gpu/drm/xe/xe_devcoredump.c | 146 +- drivers/gpu/drm/xe/xe_devcoredump.h | 6 + drivers/gpu/drm/xe/xe_devcoredump_types.h | 3 +- drivers/gpu/drm/xe/xe_device.c | 1 + drivers/gpu/drm/xe/xe_force_wake.h | 16 + drivers/gpu/drm/xe/xe_gt_topology.c | 14 + drivers/gpu/drm/xe/xe_guc_ct.c | 18 + drivers/gpu/drm/xe/xe_guc_log.c | 40 +- drivers/gpu/drm/xe/xe_guc_submit.c | 2 +- drivers/gpu/drm/xe/xe_hw_engine.c | 1 - drivers/gpu/drm/xe/xe_pci.c | 2 + drivers/gpu/drm/xe/xe_query.c | 42 +- drivers/gpu/drm/xe/xe_wa.c | 47 + drivers/gpu/drm/xe/xe_wa_oob.rules | 2 + drivers/hid/hid-core.c | 5 +- drivers/hid/hid-generic.c | 3 + drivers/hid/hid-ids.h | 1 + drivers/hid/hid-magicmouse.c | 56 +- drivers/hid/i2c-hid/i2c-hid-core.c | 20 +- drivers/hid/wacom_sys.c | 3 +- drivers/hwmon/nct6775-platform.c | 2 + drivers/i2c/busses/Kconfig | 1 + drivers/i2c/busses/i2c-i801.c | 6 + drivers/i3c/master.c | 85 +- drivers/i3c/master/mipi-i3c-hci/dma.c | 2 +- drivers/iio/adc/ad7192.c | 3 + drivers/iio/light/ltr501.c | 2 + drivers/iio/magnetometer/af8133j.c | 3 +- drivers/iio/magnetometer/yamaha-yas530.c | 13 +- drivers/iommu/amd/io_pgtable.c | 11 +- drivers/iommu/iommufd/fault.c | 2 - drivers/irqchip/Kconfig | 2 +- drivers/irqchip/irq-gic-v3-its.c | 50 +- drivers/leds/led-class.c | 14 +- drivers/mailbox/pcc.c | 61 +- drivers/md/bcache/super.c | 2 +- drivers/media/pci/intel/ipu6/Kconfig | 2 +- drivers/media/pci/intel/ipu6/ipu6-isys-queue.c | 66 +- drivers/media/pci/intel/ipu6/ipu6-isys-queue.h | 1 + drivers/media/pci/intel/ipu6/ipu6-isys.c | 19 +- drivers/media/usb/cx231xx/cx231xx-cards.c | 2 + drivers/media/usb/uvc/uvc_driver.c | 31 + drivers/misc/eeprom/eeprom_93cx6.c | 10 + drivers/mmc/core/block.c | 26 +- drivers/mmc/core/bus.c | 6 +- drivers/mmc/core/card.h | 10 + drivers/mmc/core/core.c | 3 + drivers/mmc/core/quirks.h | 9 + drivers/mmc/core/sd.c | 30 +- drivers/mmc/core/sd.h | 2 +- drivers/mmc/core/sdio.c | 2 +- drivers/mmc/host/mtk-sd.c | 64 +- drivers/mmc/host/sdhci-esdhc-imx.c | 6 + drivers/mmc/host/sdhci-pci-core.c | 72 + drivers/mmc/host/sdhci-pci.h | 1 + drivers/net/can/c_can/c_can_main.c | 26 +- drivers/net/can/dev/dev.c | 2 +- drivers/net/can/ifi_canfd/ifi_canfd.c | 58 +- drivers/net/can/m_can/m_can.c | 33 +- drivers/net/can/sja1000/sja1000.c | 65 +- drivers/net/can/spi/hi311x.c | 48 +- drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c | 29 +- drivers/net/can/sun4i_can.c | 22 +- drivers/net/can/usb/ems_usb.c | 58 +- drivers/net/can/usb/f81604.c | 10 +- drivers/net/can/usb/gs_usb.c | 25 +- drivers/net/dsa/qca/qca8k-8xxx.c | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 8 +- drivers/net/ethernet/freescale/enetc/enetc.c | 3 + drivers/net/ethernet/freescale/fec_mpc52xx_phy.c | 2 +- drivers/net/ethernet/freescale/fman/fman.c | 1 - drivers/net/ethernet/freescale/fman/fman.h | 3 + drivers/net/ethernet/freescale/fman/mac.c | 5 + .../net/ethernet/freescale/fs_enet/mii-bitbang.c | 2 +- drivers/net/ethernet/intel/ice/ice_common.c | 25 +- drivers/net/ethernet/intel/ice/ice_main.c | 8 +- drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 3 +- drivers/net/ethernet/intel/ice/ice_ptp_hw.h | 5 +- drivers/net/ethernet/intel/idpf/idpf_txrx.c | 1 + drivers/net/ethernet/intel/igb/igb_main.c | 4 + drivers/net/ethernet/intel/ixgbe/ixgbe_common.h | 2 + drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 2 +- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 1 - .../ethernet/mellanox/mlx5/core/en/tc_tun_encap.c | 13 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 32 +- drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 7 +- .../mlx5/core/steering/hws/mlx5hws_bwc_complex.c | 2 + .../mellanox/mlx5/core/steering/hws/mlx5hws_send.c | 1 + .../ethernet/mellanox/mlxsw/core_acl_flex_keys.c | 6 +- .../ethernet/mellanox/mlxsw/core_acl_flex_keys.h | 2 +- .../mellanox/mlxsw/spectrum_acl_flex_keys.c | 72 +- drivers/net/ethernet/microsoft/mana/mana_en.c | 1 + drivers/net/ethernet/qlogic/qed/qed_mcp.c | 4 +- drivers/net/ethernet/realtek/r8169_main.c | 14 +- drivers/net/ethernet/rocker/rocker_main.c | 2 +- drivers/net/ethernet/stmicro/stmmac/dwmac4.h | 5 + drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | 5 + drivers/net/geneve.c | 2 +- drivers/net/phy/microchip.c | 21 + drivers/net/phy/sfp.c | 3 +- drivers/net/virtio_net.c | 12 +- drivers/net/wireless/ath/ath10k/sdio.c | 6 +- drivers/net/wireless/ath/ath12k/mac.c | 18 +- drivers/net/wireless/ath/ath5k/pci.c | 2 + .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 +- drivers/net/wireless/intel/ipw2x00/libipw_rx.c | 8 +- drivers/net/wireless/realtek/rtw88/sdio.c | 6 +- drivers/net/wireless/realtek/rtw88/usb.c | 5 +- drivers/net/wireless/realtek/rtw89/fw.c | 3 + drivers/nvdimm/dax_devs.c | 4 +- drivers/nvdimm/nd.h | 7 + drivers/nvme/host/core.c | 25 +- drivers/nvme/host/rdma.c | 8 +- drivers/nvme/host/tcp.c | 2 +- drivers/pci/controller/dwc/pcie-qcom.c | 1 + drivers/pci/controller/plda/pcie-starfive.c | 10 +- drivers/pci/controller/vmd.c | 17 +- drivers/pci/pci-sysfs.c | 26 + drivers/pci/pci.c | 2 +- drivers/pci/pci.h | 1 + drivers/pci/probe.c | 30 +- drivers/pci/quirks.c | 15 +- drivers/pinctrl/core.c | 3 + drivers/pinctrl/core.h | 1 + drivers/pinctrl/freescale/Kconfig | 2 +- drivers/pinctrl/pinmux.c | 173 +- drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 2 + drivers/pinctrl/qcom/pinctrl-spmi-mpp.c | 1 + drivers/platform/x86/asus-wmi.c | 11 +- drivers/pmdomain/core.c | 37 +- drivers/pmdomain/imx/gpcv2.c | 2 +- drivers/ptp/ptp_clock.c | 3 +- drivers/regulator/qcom-rpmh-regulator.c | 83 +- drivers/remoteproc/qcom_q6v5_pas.c | 1 + drivers/rtc/rtc-cmos.c | 37 +- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 100 +- drivers/scsi/lpfc/lpfc_ct.c | 21 +- drivers/scsi/lpfc/lpfc_hbadisc.c | 36 +- drivers/scsi/lpfc/lpfc_init.c | 2 + drivers/scsi/lpfc/lpfc_sli.c | 41 +- drivers/scsi/qla2xxx/qla_attr.c | 1 + drivers/scsi/qla2xxx/qla_bsg.c | 124 +- drivers/scsi/qla2xxx/qla_mid.c | 1 + drivers/scsi/qla2xxx/qla_os.c | 15 +- drivers/scsi/scsi_debug.c | 2 +- drivers/scsi/sg.c | 2 +- drivers/scsi/st.c | 31 +- drivers/soc/imx/soc-imx8m.c | 107 +- drivers/soc/qcom/llcc-qcom.c | 2644 +++++++- drivers/soc/qcom/qcom_pd_mapper.c | 1 + drivers/spi/spi-fsl-lpspi.c | 7 +- drivers/spi/spi-mpc52xx.c | 1 + drivers/thermal/qcom/tsens-v1.c | 21 +- drivers/thermal/qcom/tsens.c | 3 + drivers/thermal/qcom/tsens.h | 2 +- drivers/tty/serial/8250/8250_dw.c | 5 +- drivers/ufs/core/ufs-sysfs.c | 6 + drivers/ufs/core/ufs_bsg.c | 2 +- drivers/ufs/core/ufshcd-priv.h | 1 + drivers/ufs/core/ufshcd.c | 59 +- drivers/ufs/host/cdns-pltfrm.c | 4 +- drivers/ufs/host/tc-dwc-g210-pltfrm.c | 5 +- drivers/ufs/host/ufs-exynos.c | 3 +- drivers/ufs/host/ufs-hisi.c | 4 +- drivers/ufs/host/ufs-mediatek.c | 5 +- drivers/ufs/host/ufs-qcom.c | 7 +- drivers/ufs/host/ufs-renesas.c | 13 +- drivers/ufs/host/ufs-sprd.c | 5 +- drivers/ufs/host/ufshcd-pltfrm.c | 16 + drivers/ufs/host/ufshcd-pltfrm.h | 1 + drivers/usb/chipidea/ci.h | 2 + drivers/usb/chipidea/ci_hdrc_imx.c | 1 + drivers/usb/chipidea/core.c | 2 + drivers/usb/chipidea/udc.c | 156 +- drivers/usb/chipidea/udc.h | 2 + drivers/usb/typec/ucsi/ucsi_acpi.c | 56 +- drivers/usb/typec/ucsi/ucsi_glink.c | 10 +- drivers/vfio/pci/mlx5/cmd.c | 47 +- drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c | 6 +- drivers/watchdog/apple_wdt.c | 2 +- drivers/watchdog/iTCO_wdt.c | 21 +- drivers/watchdog/mtk_wdt.c | 6 + drivers/watchdog/rti_wdt.c | 3 +- drivers/watchdog/xilinx_wwdt.c | 75 +- fs/btrfs/dev-replace.c | 2 + fs/btrfs/disk-io.c | 3 +- fs/btrfs/disk-io.h | 3 +- fs/btrfs/fs.h | 2 + fs/btrfs/inode.c | 1 + fs/btrfs/super.c | 73 +- fs/btrfs/volumes.c | 137 +- fs/dlm/lock.c | 10 +- fs/eventpoll.c | 6 +- fs/ext4/extents.c | 7 +- fs/ext4/inode.c | 53 +- fs/f2fs/data.c | 82 +- fs/f2fs/extent_cache.c | 74 +- fs/f2fs/f2fs.h | 4 + fs/f2fs/inode.c | 4 +- fs/f2fs/node.c | 7 +- fs/f2fs/sysfs.c | 10 + fs/gfs2/super.c | 2 + fs/jffs2/compr_rtime.c | 3 + fs/jfs/jfs_dmap.c | 6 + fs/jfs/jfs_dtree.c | 15 + fs/nilfs2/dir.c | 2 +- fs/notify/fanotify/fanotify_user.c | 85 +- fs/ntfs3/attrib.c | 9 +- fs/ntfs3/frecord.c | 103 +- fs/ntfs3/ntfs_fs.h | 3 +- fs/ntfs3/run.c | 40 +- fs/ocfs2/dlmglue.c | 1 + fs/ocfs2/localalloc.c | 19 - fs/ocfs2/namei.c | 4 +- fs/smb/client/cifsproto.h | 1 + fs/smb/client/cifssmb.c | 2 +- fs/smb/client/connect.c | 4 +- fs/smb/client/dfs.c | 188 +- fs/smb/client/inode.c | 94 +- fs/smb/client/readdir.c | 54 +- fs/smb/client/reparse.c | 90 +- fs/smb/client/smb2inode.c | 3 +- fs/smb/server/smb2pdu.c | 6 + fs/unicode/mkutf8data.c | 70 + fs/unicode/utf8data.c_shipped | 6703 ++++++++++---------- include/acpi/pcc.h | 7 + include/drm/display/drm_dp_mst_helper.h | 7 + include/drm/intel/xe_pciids.h | 31 +- include/linux/blkdev.h | 2 +- include/linux/bpf.h | 17 +- include/linux/cleanup.h | 48 +- include/linux/clocksource.h | 2 + include/linux/eeprom_93cx6.h | 11 + include/linux/eventpoll.h | 2 +- include/linux/f2fs_fs.h | 1 + include/linux/fanotify.h | 1 + include/linux/hid.h | 2 + include/linux/i3c/master.h | 9 +- include/linux/io_uring/cmd.h | 4 +- include/linux/leds.h | 2 +- include/linux/mmc/card.h | 3 +- include/linux/mmc/sd.h | 1 + include/linux/page-flags.h | 4 +- include/linux/pci.h | 6 + include/linux/scatterlist.h | 2 +- include/linux/stackdepot.h | 6 +- include/linux/usb/chipidea.h | 1 + include/net/bluetooth/hci.h | 14 + include/net/bluetooth/hci_core.h | 10 +- include/net/netfilter/nf_tables_core.h | 1 + include/net/tcp_ao.h | 3 +- include/sound/soc_sdw_utils.h | 2 + include/trace/events/damon.h | 2 +- include/trace/trace_events.h | 36 +- include/uapi/drm/xe_drm.h | 4 +- include/uapi/linux/fanotify.h | 1 + include/ufs/ufshcd.h | 19 +- io_uring/tctx.c | 13 +- io_uring/uring_cmd.c | 2 +- kernel/bpf/arraymap.c | 26 +- kernel/bpf/core.c | 1 + kernel/bpf/devmap.c | 6 +- kernel/bpf/hashtab.c | 56 +- kernel/bpf/lpm_trie.c | 55 +- kernel/bpf/syscall.c | 29 +- kernel/bpf/trampoline.c | 47 +- kernel/bpf/verifier.c | 15 +- kernel/dma/debug.c | 8 +- kernel/kcsan/debugfs.c | 74 +- kernel/sched/core.c | 4 +- kernel/sched/deadline.c | 1 + kernel/sched/ext.c | 9 + kernel/sched/fair.c | 14 +- kernel/sched/syscalls.c | 2 +- kernel/time/Kconfig | 5 - kernel/time/clocksource.c | 11 +- kernel/time/ntp.c | 2 +- kernel/time/timekeeping.c | 6 +- kernel/time/timekeeping_internal.h | 15 +- kernel/trace/ring_buffer.c | 98 +- kernel/trace/trace.c | 33 +- kernel/trace/trace.h | 7 + kernel/trace/trace_clock.c | 2 +- kernel/trace/trace_eprobe.c | 5 + kernel/trace/trace_output.c | 4 + kernel/trace/trace_syscalls.c | 12 + kernel/trace/tracing_map.c | 6 +- lib/stackdepot.c | 10 +- lib/stackinit_kunit.c | 1 + mm/debug.c | 7 +- mm/gup.c | 11 +- mm/kasan/report.c | 6 +- mm/memblock.c | 4 +- mm/memcontrol-v1.h | 2 +- mm/mempolicy.c | 4 + mm/mmap.c | 1 + mm/readahead.c | 5 +- mm/vmalloc.c | 3 +- net/bluetooth/hci_conn.c | 19 +- net/bluetooth/hci_core.c | 13 +- net/bluetooth/hci_event.c | 7 + net/bluetooth/hci_sync.c | 9 +- net/bluetooth/l2cap_sock.c | 1 + net/bluetooth/rfcomm/sock.c | 10 +- net/can/af_can.c | 1 + net/can/j1939/transport.c | 2 +- net/core/link_watch.c | 7 +- net/core/neighbour.c | 1 + net/core/netpoll.c | 2 +- net/dccp/feat.c | 6 +- net/ethtool/bitset.c | 48 +- net/hsr/hsr_device.c | 19 +- net/hsr/hsr_forward.c | 2 + net/ieee802154/socket.c | 12 +- net/ipv4/af_inet.c | 22 +- net/ipv4/icmp.c | 3 + net/ipv4/tcp_ao.c | 42 +- net/ipv4/tcp_bpf.c | 11 +- net/ipv4/tcp_ipv4.c | 3 +- net/ipv4/udp.c | 14 +- net/ipv6/addrconf.c | 13 +- net/ipv6/af_inet6.c | 22 +- net/ipv6/route.c | 6 +- net/ipv6/tcp_ipv6.c | 4 +- net/mptcp/diag.c | 2 +- net/mptcp/options.c | 4 +- net/mptcp/protocol.c | 6 +- net/mptcp/protocol.h | 6 +- net/mptcp/subflow.c | 4 +- net/netfilter/ipset/ip_set_core.c | 5 + net/netfilter/ipvs/ip_vs_proto.c | 4 +- net/netfilter/nft_inner.c | 59 +- net/netfilter/nft_set_hash.c | 16 + net/netfilter/nft_socket.c | 2 +- net/netfilter/xt_LED.c | 4 +- net/packet/af_packet.c | 12 +- net/sched/cls_flower.c | 5 +- net/sched/sch_cbs.c | 2 +- net/sched/sch_tbf.c | 18 +- net/smc/af_smc.c | 6 +- net/tipc/udp_media.c | 2 +- net/vmw_vsock/af_vsock.c | 70 +- net/xdp/xsk_buff_pool.c | 5 +- net/xdp/xskmap.c | 2 +- rust/kernel/lib.rs | 2 +- rust/kernel/list/arc.rs | 3 - rust/kernel/sync/arc.rs | 6 - samples/bpf/test_cgrp2_sock.c | 4 +- scripts/Makefile.build | 2 +- scripts/mod/modpost.c | 2 +- scripts/setlocalversion | 54 +- sound/core/seq/seq_ump_client.c | 6 +- sound/pci/hda/hda_auto_parser.c | 61 +- sound/pci/hda/hda_local.h | 28 +- sound/pci/hda/patch_analog.c | 6 +- sound/pci/hda/patch_cirrus.c | 8 +- sound/pci/hda/patch_conexant.c | 36 +- sound/pci/hda/patch_cs8409-tables.c | 2 +- sound/pci/hda/patch_cs8409.h | 2 +- sound/pci/hda/patch_realtek.c | 126 +- sound/pci/hda/patch_sigmatel.c | 22 +- sound/pci/hda/patch_via.c | 2 +- sound/soc/amd/yc/acp6x-mach.c | 14 + sound/soc/codecs/hdmi-codec.c | 144 +- sound/soc/intel/avs/pcm.c | 2 +- sound/soc/intel/boards/sof_rt5682.c | 7 + sound/soc/intel/boards/sof_sdw.c | 41 + sound/soc/intel/common/soc-acpi-intel-arl-match.c | 63 + sound/soc/intel/common/soc-acpi-intel-mtl-match.c | 7 + sound/soc/mediatek/mt8188/mt8188-mt6359.c | 4 +- sound/soc/sdw_utils/soc_sdw_utils.c | 7 +- sound/soc/sof/ipc3-topology.c | 31 +- sound/usb/endpoint.c | 14 +- sound/usb/mixer.c | 58 +- sound/usb/mixer_maps.c | 10 + sound/usb/mixer_quirks.c | 1 + sound/usb/quirks-table.h | 341 +- sound/usb/quirks.c | 75 +- sound/usb/usbaudio.h | 4 + tools/bpf/bpftool/prog.c | 17 +- tools/scripts/Makefile.arch | 4 +- tools/testing/selftests/arm64/fp/fp-stress.c | 15 +- tools/testing/selftests/arm64/pauth/pac.c | 3 + .../selftests/bpf/progs/verifier_bits_iter.c | 4 +- tools/testing/selftests/damon/Makefile | 2 +- .../ftrace/test.d/kprobe/kprobe_syntax_errors.tc | 2 +- tools/testing/selftests/hid/run-hid-tools-tests.sh | 16 +- tools/testing/selftests/mm/hugetlb_dio.c | 14 +- tools/testing/selftests/resctrl/resctrl_val.c | 4 +- tools/testing/selftests/resctrl/resctrlfs.c | 2 +- tools/testing/vsock/vsock_perf.c | 10 +- tools/testing/vsock/vsock_test.c | 26 +- tools/tracing/rtla/sample/timerlat_load.py | 9 +- tools/tracing/rtla/src/timerlat_hist.c | 20 +- tools/tracing/rtla/src/timerlat_top.c | 8 +- tools/tracing/rtla/src/utils.c | 4 +- tools/tracing/rtla/src/utils.h | 2 + tools/verification/dot2/automata.py | 18 +- 539 files changed, 13136 insertions(+), 7041 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/466 iTCO_wdt: mask NMI_NOW bit for update_no_reboot_bit() call
6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksandr Ocheretnyi <[email protected]>
[ Upstream commit daa814d784ac034c62ab3fb0ef83daeafef527e2 ]
Commit da23b6faa8bf ("watchdog: iTCO: Add support for Cannon Lake PCH iTCO") does not mask NMI_NOW bit during TCO1_CNT register's value comparison for update_no_reboot_bit() call causing following failure:
...
iTCO_vendor_support: vendor-support=0
iTCO_wdt iTCO_wdt: unable to reset NO_REBOOT flag, device
disabled by hardware/BIOS
...
and this can lead to unexpected NMIs later during regular crashkernel's workflow because of watchdog probe call failures.
This change masks NMI_NOW bit for TCO1_CNT register values to avoid unexpected NMI_NOW bit inversions.
--- drivers/watchdog/iTCO_wdt.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
drivers/watchdog/iTCO_wdt.c +19 -2
@@ -82,6 +82,13 @@#define TCO2_CNT (p) (TCOBASE(p) + 0x0a)/* TCO2 Control Register */ #define TCOv2_TMR (p) (TCOBASE(p) + 0x12)/* TCOv2 Timer Initial Value*/ +/* +* NMI_NOW is bit 8 of TCO1_CNT register +* Read/Write +* This bit is implemented as RW but has no effect on HW. +*/ +#define NMI_NOW BIT(8) +/* internal variables */ struct iTCO_wdt_private {struct watchdog_device wddev;
@@ -219,13 +226,23 @@ static int update_no_reboot_bit_cnt(void *priv, bool set)struct iTCO_wdt_private *p = priv;u16 val, newval; - val =inw (TCO1_CNT (p)); +/* +* writing back 1b1 to NMI_NOW of TCO1_CNT register +* causes NMI_NOW bit inversion what consequently does +* not allow to perform the register's value comparison +* properly. +* +* NMI_NOW bit masking for TCO1_CNT register values +* helps to avoid possible NMI_NOW bit inversions on +* following write operation. +*/ + val =inw (TCO1_CNT (p)) & ~NMI_NOW ;if (set) val |=BIT (0 );else val &= ~BIT (0 );outw (val,TCO1_CNT (p)); - newval =inw (TCO1_CNT (p)); + newval =inw (TCO1_CNT (p)) & ~NMI_NOW ;/* make sure the update is successful */ return val != newval ? -EIO :0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 2/466 watchdog: xilinx_wwdt: Calculate max_hw_heartbeat_ms using clock frequency
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harini T <[email protected]>
[ Upstream commit 006778844c2c132c28cfa90e3570560351e01b9a ]
In the current implementation, the value of max_hw_heartbeat_ms is set to the timeout period expressed in milliseconds and fails to verify if the close window percentage exceeds the maximum value that the hardware supports.
1. Calculate max_hw_heartbeat_ms based on input clock frequency.
2. Update frequency check to require a minimum frequency of 1Mhz.
3. Limit the close and open window percent to hardware supported value to avoid truncation.
4. If the user input timeout exceeds the maximum timeout supported, use only open window and the framework supports the higher timeouts.
--- drivers/watchdog/xilinx_wwdt.c | 75 ++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 12 deletions(-)
drivers/watchdog/xilinx_wwdt.c +63 -12
@@ -2,7 +2,7 @@/* * Window watchdog device driver for Xilinx Versal WWDT * -* Copyright (C) 2022 - 2023, Advanced Micro Devices, Inc. +* Copyright (C) 2022 - 2024, Advanced Micro Devices, Inc. */ #include <linux/clk.h>
@@ -36,6 +36,12 @@#define XWWDT_CLOSE_WINDOW_PERCENT 50 +/* Maximum count value of each 32 bit window */ +#define XWWDT_MAX_COUNT_WINDOW GENMASK(31, 0) + +/* Maximum count value of closed and open window combined */ +#define XWWDT_MAX_COUNT_WINDOW_COMBINED GENMASK_ULL(32, 1) +static int wwdt_timeout;static int closed_window_percent;
@@ -54,6 +60,8 @@ MODULE_PARM_DESC(closed_window_percent,* @xilinx_wwdt_wdd: watchdog device structure * @freq: source clock frequency of WWDT * @close_percent: Closed window percent +* @closed_timeout: Closed window timeout in ticks +* @open_timeout: Open window timeout in ticks */ struct xwwdt_device {void __iomem *base;
@@ -61,27 +69,22 @@ struct xwwdt_device {struct watchdog_device xilinx_wwdt_wdd;unsigned long freq;u32 close_percent; +u64 closed_timeout; +u64 open_timeout; };static int xilinx_wwdt_start (struct watchdog_device *wdd) {struct xwwdt_device *xdev =watchdog_get_drvdata (wdd);struct watchdog_device *xilinx_wwdt_wdd = &xdev->xilinx_wwdt_wdd; -u64 time_out, closed_timeout, open_timeout;u32 control_status_reg; -/* Calculate timeout count */ - time_out = xdev->freq * wdd->timeout; - closed_timeout =div_u64 (time_out * xdev->close_percent,100 ); - open_timeout = time_out - closed_timeout; - wdd->min_hw_heartbeat_ms = xdev->close_percent *10 * wdd->timeout; -spin_lock (&xdev->spinlock);iowrite32 (XWWDT_MWR_MASK , xdev->base +XWWDT_MWR_OFFSET );iowrite32 (~(u32 )XWWDT_ESR_WEN_MASK , xdev->base +XWWDT_ESR_OFFSET ); -iowrite32 ((u32 )closed_timeout, xdev->base +XWWDT_FWR_OFFSET ); -iowrite32 ((u32 )open_timeout, xdev->base +XWWDT_SWR_OFFSET ); +iowrite32 ((u32 )xdev->closed_timeout, xdev->base +XWWDT_FWR_OFFSET ); +iowrite32 ((u32 )xdev->open_timeout, xdev->base +XWWDT_SWR_OFFSET );/* Enable the window watchdog timer */ control_status_reg =ioread32 (xdev->base +XWWDT_ESR_OFFSET );
@@ -133,7 +136,12 @@ static int xwwdt_probe(struct platform_device *pdev)struct watchdog_device *xilinx_wwdt_wdd;struct device *dev = &pdev->dev;struct xwwdt_device *xdev; +u64 max_per_window_ms; +u64 min_per_window_ms; +u64 timeout_count;struct clk *clk; +u32 timeout_ms; +u64 ms_count;int ret; xdev =devm_kzalloc (dev,sizeof (*xdev),GFP_KERNEL );
@@ -154,12 +162,13 @@ static int xwwdt_probe(struct platform_device *pdev)return PTR_ERR (clk); xdev->freq =clk_get_rate (clk); -if (!xdev->freq) +if (xdev->freq <1000000 )return -EINVAL ; xilinx_wwdt_wdd->min_timeout =XWWDT_MIN_TIMEOUT ; xilinx_wwdt_wdd->timeout =XWWDT_DEFAULT_TIMEOUT ; - xilinx_wwdt_wdd->max_hw_heartbeat_ms =1000 * xilinx_wwdt_wdd->timeout; + xilinx_wwdt_wdd->max_hw_heartbeat_ms = +div64_u64 (XWWDT_MAX_COUNT_WINDOW_COMBINED , xdev->freq) *1000 ;if (closed_window_percent ==0 || closed_window_percent >=100 ) xdev->close_percent =XWWDT_CLOSE_WINDOW_PERCENT ;
@@ -167,6 +176,48 @@ static int xwwdt_probe(struct platform_device *pdev) xdev->close_percent = closed_window_percent;watchdog_init_timeout (xilinx_wwdt_wdd, wwdt_timeout, &pdev->dev); + +/* Calculate ticks for 1 milli-second */ + ms_count =div_u64 (xdev->freq,1000 ); + timeout_ms = xilinx_wwdt_wdd->timeout *1000 ; + timeout_count = timeout_ms * ms_count; + +if (timeout_ms > xilinx_wwdt_wdd->max_hw_heartbeat_ms) { +/* +* To avoid ping restrictions until the minimum hardware heartbeat, +* we will solely rely on the open window and +* adjust the minimum hardware heartbeat to 0. +*/ + xdev->closed_timeout =0 ; + xdev->open_timeout =XWWDT_MAX_COUNT_WINDOW ; + xilinx_wwdt_wdd->min_hw_heartbeat_ms =0 ; + xilinx_wwdt_wdd->max_hw_heartbeat_ms = xilinx_wwdt_wdd->max_hw_heartbeat_ms /2 ; + }else { + xdev->closed_timeout =div64_u64 (timeout_count * xdev->close_percent,100 ); + xilinx_wwdt_wdd->min_hw_heartbeat_ms = +div64_u64 (timeout_ms * xdev->close_percent,100 ); + +if (timeout_ms > xilinx_wwdt_wdd->max_hw_heartbeat_ms /2 ) { + max_per_window_ms = xilinx_wwdt_wdd->max_hw_heartbeat_ms /2 ; + min_per_window_ms = timeout_ms - max_per_window_ms; + +if (xilinx_wwdt_wdd->min_hw_heartbeat_ms > max_per_window_ms) { +dev_info (xilinx_wwdt_wdd->parent, +"Closed window cannot be set to %d%%. Using maximum supported value.\n" , + xdev->close_percent); + xdev->closed_timeout = max_per_window_ms * ms_count; + xilinx_wwdt_wdd->min_hw_heartbeat_ms = max_per_window_ms; + }else if (xilinx_wwdt_wdd->min_hw_heartbeat_ms < min_per_window_ms) { +dev_info (xilinx_wwdt_wdd->parent, +"Closed window cannot be set to %d%%. Using minimum supported value.\n" , + xdev->close_percent); + xdev->closed_timeout = min_per_window_ms * ms_count; + xilinx_wwdt_wdd->min_hw_heartbeat_ms = min_per_window_ms; + } + } + xdev->open_timeout = timeout_count - xdev->closed_timeout; + } +spin_lock_init (&xdev->spinlock);watchdog_set_drvdata (xilinx_wwdt_wdd, xdev);watchdog_set_nowayout (xilinx_wwdt_wdd,1 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 3/466 watchdog: apple: Actually flush writes after requesting watchdog restart
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nick Chan <[email protected]>
[ Upstream commit 51dfe714c03c066aabc815a2bb2adcc998dfcb30 ]
Although there is an existing code comment about flushing the writes, writes were not actually being flushed.
Actually flush the writes by changing readl_relaxed() to readl().
--- drivers/watchdog/apple_wdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/watchdog/apple_wdt.c +1 -1
@@ -130,7 +130,7 @@ static int apple_wdt_restart(struct watchdog_device *wdd, unsigned long mode,* can take up to ~20-25ms until the SoC is actually reset. Just wait * 50ms here to be safe. */ - (void )readl_relaxed (wdt->regs +APPLE_WDT_WD1_CUR_TIME ); + (void )readl (wdt->regs +APPLE_WDT_WD1_CUR_TIME );mdelay (50 );return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 4/466 watchdog: mediatek: Make sure system reset gets asserted in mtk_wdt_restart()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yassine Oudjana <[email protected]>
[ Upstream commit a1495a21e0b8aad92132dfcf9c6fffc1bde9d5b2 ]
Clear the IRQ enable bit of WDT_MODE before asserting software reset in order to make TOPRGU issue a system reset signal instead of an IRQ.
--- drivers/watchdog/mtk_wdt.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/watchdog/mtk_wdt.c +6 -0
@@ -225,9 +225,15 @@ static int mtk_wdt_restart(struct watchdog_device *wdt_dev, {struct mtk_wdt_dev *mtk_wdt =watchdog_get_drvdata (wdt_dev);void __iomem *wdt_base; +u32 reg; wdt_base = mtk_wdt->wdt_base; +/* Enable reset in order to issue a system reset instead of an IRQ */ + reg =readl (wdt_base +WDT_MODE ); + reg &= ~WDT_MODE_IRQ_EN ; +writel (reg |WDT_MODE_KEY , wdt_base +WDT_MODE ); +while (1 ) {writel (WDT_SWRST_KEY , wdt_base +WDT_SWRST );mdelay (5 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 5/466 can: gs_usb: add usb endpoint address detection at driver probe step
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Kozhinov <[email protected]>
[ Upstream commit 889b2ae9139a87b3390f7003cb1bb3d65bf90a26 ]
There is an approach made to implement gs_usb firmware/driver based on Zephyr RTOS. It was found that USB stack of Zephyr RTOS overwrites USB EP addresses, if they have different last 4 bytes in absence of other endpoints.
For example in case of gs_usb candlelight firmware EP-IN is 0x81 and EP-OUT 0x02. If there are no additional USB endpoints, Zephyr RTOS will overwrite EP-OUT to 0x01. More information can be found in the discussion with Zephyr RTOS USB stack maintainer here:
https://github.com/zephyrproject-rtos/zephyr/issues/67812
There are already two different gs_usb FW driver implementations based on Zephyr RTOS:
1. https://github.com/CANnectivity/cannectivity
(by: https://github.com/henrikbrixandersen)
2. https://github.com/zephyrproject-rtos/zephyr/compare/main...KozhinovAlexander:zephyr:gs_usb
(by: https://github.com/KozhinovAlexander)
At the moment both Zephyr RTOS implementations use dummy USB endpoint, to overcome described USB stack behavior from Zephyr itself. Since Zephyr RTOS is intended to be used on microcontrollers with very constrained amount of resources (ROM, RAM) and additional endpoint requires memory, it is more convenient to update the gs_usb driver in the Linux kernel.
To fix this problem, update the gs_usb driver from using hard coded endpoint numbers to evaluate the endpoint descriptors and use the endpoints provided there.
--- drivers/net/can/usb/gs_usb.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
drivers/net/can/usb/gs_usb.c +18 -7
@@ -43,9 +43,6 @@#define USB_XYLANTA_SAINT3_VENDOR_ID 0x16d0#define USB_XYLANTA_SAINT3_PRODUCT_ID 0x0f30 -#define GS_USB_ENDPOINT_IN 1 -#define GS_USB_ENDPOINT_OUT 2 -/* Timestamp 32 bit timer runs at 1 MHz (1 µs tick). Worker accounts * for timer overflow (will be after ~71 minutes) */
@@ -336,6 +333,9 @@ struct gs_usb {unsigned int hf_size_rx;u8 active_channels; + +unsigned int pipe_in; +unsigned int pipe_out; };/* 'allocate' a tx context.
@@ -687,7 +687,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb) resubmit_urb:usb_fill_bulk_urb (urb, parent->udev, -usb_rcvbulkpipe (parent->udev,GS_USB_ENDPOINT_IN ), + parent->pipe_in, hf, dev->parent->hf_size_rx, gs_usb_receive_bulk_callback, parent);
@@ -819,7 +819,7 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb, }usb_fill_bulk_urb (urb, dev->udev, -usb_sndbulkpipe (dev->udev,GS_USB_ENDPOINT_OUT ), + dev->parent->pipe_out, hf, dev->hf_size_tx, gs_usb_xmit_callback, txc);
@@ -925,8 +925,7 @@ static int gs_can_open(struct net_device *netdev)/* fill, anchor, and submit rx urb */ usb_fill_bulk_urb (urb, dev->udev, -usb_rcvbulkpipe (dev->udev, -GS_USB_ENDPOINT_IN ), + dev->parent->pipe_in, buf, dev->parent->hf_size_rx, gs_usb_receive_bulk_callback, parent);
@@ -1413,6 +1412,7 @@ static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) {struct usb_device *udev =interface_to_usbdev (intf); +struct usb_endpoint_descriptor *ep_in, *ep_out;struct gs_host_frame *hf;struct gs_usb *parent;struct gs_host_config hconf = {
@@ -1422,6 +1422,13 @@ static int gs_usb_probe(struct usb_interface *intf,unsigned int icount, i;int rc; + rc =usb_find_common_endpoints (intf->cur_altsetting, + &ep_in, &ep_out,NULL ,NULL ); +if (rc) { +dev_err (&intf->dev,"Required endpoints not found\n" ); +return rc; + } +/* send host config */ rc = usb_control_msg_send(udev, 0, GS_USB_BREQ_HOST_FORMAT,
@@ -1466,6 +1473,10 @@ static int gs_usb_probe(struct usb_interface *intf,usb_set_intfdata (intf, parent); parent->udev = udev; +/* store the detected endpoints */ + parent->pipe_in =usb_rcvbulkpipe (parent->udev, ep_in->bEndpointAddress); + parent->pipe_out =usb_sndbulkpipe (parent->udev, ep_out->bEndpointAddress); +for (i =0 ; i < icount; i++) {unsigned int hf_size_rx =0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 6/466 can: c_can: c_can_handle_bus_err(): update statistics if skb allocation fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 9e66242504f49e17481d8e197730faba7d99c934 ]
Ensure that the statistics are always updated, even if the skb allocation fails.
--- drivers/net/can/c_can/c_can_main.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-)
drivers/net/can/c_can/c_can_main.c +17 -9
@@ -1014,49 +1014,57 @@ static int c_can_handle_bus_err(struct net_device *dev,/* propagate the error condition to the CAN stack */ skb =alloc_can_err_skb (dev, &cf); -if (unlikely (!skb)) -return 0 ;/* check for 'last error code' which tells us the * type of the last error to occur on the CAN bus */ - cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; +if (likely (skb)) + cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ;switch (lec_type) {case LEC_STUFF_ERROR :netdev_dbg (dev,"stuff error\n" ); - cf->data[2 ] |=CAN_ERR_PROT_STUFF ; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_STUFF ; stats->rx_errors++;break ;case LEC_FORM_ERROR :netdev_dbg (dev,"form error\n" ); - cf->data[2 ] |=CAN_ERR_PROT_FORM ; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_FORM ; stats->rx_errors++;break ;case LEC_ACK_ERROR :netdev_dbg (dev,"ack error\n" ); - cf->data[3 ] =CAN_ERR_PROT_LOC_ACK ; +if (likely (skb)) + cf->data[3 ] =CAN_ERR_PROT_LOC_ACK ; stats->tx_errors++;break ;case LEC_BIT1_ERROR :netdev_dbg (dev,"bit1 error\n" ); - cf->data[2 ] |=CAN_ERR_PROT_BIT1 ; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_BIT1 ; stats->tx_errors++;break ;case LEC_BIT0_ERROR :netdev_dbg (dev,"bit0 error\n" ); - cf->data[2 ] |=CAN_ERR_PROT_BIT0 ; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_BIT0 ; stats->tx_errors++;break ;case LEC_CRC_ERROR :netdev_dbg (dev,"CRC error\n" ); - cf->data[3 ] =CAN_ERR_PROT_LOC_CRC_SEQ ; +if (likely (skb)) + cf->data[3 ] =CAN_ERR_PROT_LOC_CRC_SEQ ; stats->rx_errors++;break ;default :break ; } +if (unlikely (!skb)) +return 0 ; +netif_receive_skb (skb);return 1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 7/466 can: sun4i_can: sun4i_can_err(): call can_change_state() even if cf is NULL
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit ee6bf3677ae03569d833795064e17f605c2163c7 ]
Call the function can_change_state() if the allocation of the skb fails, as it handles the cf parameter when it is null.
Additionally, this ensures that the statistics related to state error counters (i. e. warning, passive, and bus-off) are updated.
--- drivers/net/can/sun4i_can.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/can/sun4i_can.c +4 -4
@@ -629,10 +629,10 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status) tx_state = txerr >= rxerr ? state :0 ; rx_state = txerr <= rxerr ? state :0 ; -if (likely (skb)) -can_change_state (dev, cf, tx_state, rx_state); -else - priv->can.state = state; +/* The skb allocation might fail, but can_change_state() +* handles cf == NULL. +*/ +can_change_state (dev, cf, tx_state, rx_state);if (state ==CAN_STATE_BUS_OFF )can_bus_off (dev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 8/466 can: hi311x: hi3110_can_ist(): fix potential use-after-free
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 9ad86d377ef4a19c75a9c639964879a5b25a433b ]
The commit a22bd630cfff ("can: hi311x: do not report txerr and rxerr during bus-off") removed the reporting of rxerr and txerr even in case of correct operation (i. e. not bus-off).
The error count information added to the CAN frame after netif_rx() is a potential use after free, since there is no guarantee that the skb is in the same state. It might be freed or reused.
Fix the issue by postponing the netif_rx() call in case of txerr and rxerr reporting.
--- drivers/net/can/spi/hi311x.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/can/spi/hi311x.c +2 -1
@@ -671,9 +671,9 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id) tx_state = txerr >= rxerr ? new_state :0 ; rx_state = txerr <= rxerr ? new_state :0 ;can_change_state (net, cf, tx_state, rx_state); -netif_rx (skb);if (new_state ==CAN_STATE_BUS_OFF ) { +netif_rx (skb);can_bus_off (net);if (priv->can.restart_ms ==0 ) { priv->force_quit =1 ;
@@ -684,6 +684,7 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id) cf->can_id |=CAN_ERR_CNT ; cf->data[6 ] = txerr; cf->data[7 ] = rxerr; +netif_rx (skb); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 9/466 can: m_can: m_can_handle_lec_err(): fix {rx,tx}_errors statistics
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 988d4222bf9039a875a3d48f2fe35c317831ff68 ]
The m_can_handle_lec_err() function was incorrectly incrementing only the receive error counter, even in cases of bit or acknowledgment errors that occur during transmission.
Fix the issue by incrementing the appropriate counter based on the type of error.
--- drivers/net/can/m_can/m_can.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-)
drivers/net/can/m_can/m_can.c +23 -10
@@ -695,47 +695,60 @@ static int m_can_handle_lec_err(struct net_device *dev,u32 timestamp =0 ; cdev->can.can_stats.bus_error++; - stats->rx_errors++;/* propagate the error condition to the CAN stack */ skb =alloc_can_err_skb (dev, &cf); -if (unlikely (!skb)) -return 0 ;/* check for 'last error code' which tells us the * type of the last error to occur on the CAN bus */ - cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; +if (likely (skb)) + cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ;switch (lec_type) {case LEC_STUFF_ERROR :netdev_dbg (dev,"stuff error\n" ); - cf->data[2 ] |=CAN_ERR_PROT_STUFF ; + stats->rx_errors++; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_STUFF ;break ;case LEC_FORM_ERROR :netdev_dbg (dev,"form error\n" ); - cf->data[2 ] |=CAN_ERR_PROT_FORM ; + stats->rx_errors++; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_FORM ;break ;case LEC_ACK_ERROR :netdev_dbg (dev,"ack error\n" ); - cf->data[3 ] =CAN_ERR_PROT_LOC_ACK ; + stats->tx_errors++; +if (likely (skb)) + cf->data[3 ] =CAN_ERR_PROT_LOC_ACK ;break ;case LEC_BIT1_ERROR :netdev_dbg (dev,"bit1 error\n" ); - cf->data[2 ] |=CAN_ERR_PROT_BIT1 ; + stats->tx_errors++; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_BIT1 ;break ;case LEC_BIT0_ERROR :netdev_dbg (dev,"bit0 error\n" ); - cf->data[2 ] |=CAN_ERR_PROT_BIT0 ; + stats->tx_errors++; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_BIT0 ;break ;case LEC_CRC_ERROR :netdev_dbg (dev,"CRC error\n" ); - cf->data[3 ] =CAN_ERR_PROT_LOC_CRC_SEQ ; + stats->rx_errors++; +if (likely (skb)) + cf->data[3 ] =CAN_ERR_PROT_LOC_CRC_SEQ ;break ;default :break ; } +if (unlikely (!skb)) +return 0 ; +if (cdev->is_peripheral) timestamp =m_can_get_timestamp (cdev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 10/466 can: ifi_canfd: ifi_canfd_handle_lec_err(): fix {rx,tx}_errors statistics
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit bb03d568bb21b4afe7935d1943bcf68ddea3ea45 ]
The ifi_canfd_handle_lec_err() function was incorrectly incrementing only the receive error counter, even in cases of bit or acknowledgment errors that occur during transmission.
Fix the issue by incrementing the appropriate counter based on the type of error.
--- drivers/net/can/ifi_canfd/ifi_canfd.c | 58 ++++++++++++++++++--------- 1 file changed, 40 insertions(+), 18 deletions(-)
drivers/net/can/ifi_canfd/ifi_canfd.c +40 -18
@@ -390,36 +390,55 @@ static int ifi_canfd_handle_lec_err(struct net_device *ndev)return 0 ; priv->can.can_stats.bus_error++; - stats->rx_errors++;/* Propagate the error condition to the CAN stack. */ skb =alloc_can_err_skb (ndev, &cf); -if (unlikely (!skb)) -return 0 ;/* Read the error counter register and check for new errors. */ - cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; +if (likely (skb)) + cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; -if (errctr &IFI_CANFD_ERROR_CTR_OVERLOAD_FIRST ) - cf->data[2 ] |=CAN_ERR_PROT_OVERLOAD ; +if (errctr &IFI_CANFD_ERROR_CTR_OVERLOAD_FIRST ) { + stats->rx_errors++; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_OVERLOAD ; + } -if (errctr &IFI_CANFD_ERROR_CTR_ACK_ERROR_FIRST ) - cf->data[3 ] =CAN_ERR_PROT_LOC_ACK ; +if (errctr &IFI_CANFD_ERROR_CTR_ACK_ERROR_FIRST ) { + stats->tx_errors++; +if (likely (skb)) + cf->data[3 ] =CAN_ERR_PROT_LOC_ACK ; + } -if (errctr &IFI_CANFD_ERROR_CTR_BIT0_ERROR_FIRST ) - cf->data[2 ] |=CAN_ERR_PROT_BIT0 ; +if (errctr &IFI_CANFD_ERROR_CTR_BIT0_ERROR_FIRST ) { + stats->tx_errors++; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_BIT0 ; + } -if (errctr &IFI_CANFD_ERROR_CTR_BIT1_ERROR_FIRST ) - cf->data[2 ] |=CAN_ERR_PROT_BIT1 ; +if (errctr &IFI_CANFD_ERROR_CTR_BIT1_ERROR_FIRST ) { + stats->tx_errors++; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_BIT1 ; + } -if (errctr &IFI_CANFD_ERROR_CTR_STUFF_ERROR_FIRST ) - cf->data[2 ] |=CAN_ERR_PROT_STUFF ; +if (errctr &IFI_CANFD_ERROR_CTR_STUFF_ERROR_FIRST ) { + stats->rx_errors++; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_STUFF ; + } -if (errctr &IFI_CANFD_ERROR_CTR_CRC_ERROR_FIRST ) - cf->data[3 ] =CAN_ERR_PROT_LOC_CRC_SEQ ; +if (errctr &IFI_CANFD_ERROR_CTR_CRC_ERROR_FIRST ) { + stats->rx_errors++; +if (likely (skb)) + cf->data[3 ] =CAN_ERR_PROT_LOC_CRC_SEQ ; + } -if (errctr &IFI_CANFD_ERROR_CTR_FORM_ERROR_FIRST ) - cf->data[2 ] |=CAN_ERR_PROT_FORM ; +if (errctr &IFI_CANFD_ERROR_CTR_FORM_ERROR_FIRST ) { + stats->rx_errors++; +if (likely (skb)) + cf->data[2 ] |=CAN_ERR_PROT_FORM ; + }/* Reset the error counter, ack the IRQ and re-enable the counter. */ writel (IFI_CANFD_ERROR_CTR_ER_RESET , priv->base +IFI_CANFD_ERROR_CTR );
@@ -427,6 +446,9 @@ static int ifi_canfd_handle_lec_err(struct net_device *ndev) priv->base + IFI_CANFD_INTERRUPT);writel (IFI_CANFD_ERROR_CTR_ER_ENABLE , priv->base +IFI_CANFD_ERROR_CTR ); +if (unlikely (!skb)) +return 0 ; +netif_receive_skb (skb);return 1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 11/466 can: hi311x: hi3110_can_ist(): fix {rx,tx}_errors statistics
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 3e4645931655776e757f9fb5ae29371cd7cb21a2 ]
The hi3110_can_ist() function was incorrectly incrementing only the receive error counter, even in cases of bit or acknowledgment errors that occur during transmission.
The fix the issue by incrementing the appropriate counter based on the type of error.
--- drivers/net/can/spi/hi311x.c | 47 ++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 18 deletions(-)
drivers/net/can/spi/hi311x.c +29 -18
@@ -697,27 +697,38 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id)/* Check for protocol errors */ if (eflag &HI3110_ERR_PROTOCOL_MASK ) { skb =alloc_can_err_skb (net, &cf); -if (!skb) -break ; +if (skb) + cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; - cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; priv->can.can_stats.bus_error++; - priv->net->stats.rx_errors++; -if (eflag &HI3110_ERR_BITERR ) - cf->data[2 ] |=CAN_ERR_PROT_BIT ; -else if (eflag &HI3110_ERR_FRMERR ) - cf->data[2 ] |=CAN_ERR_PROT_FORM ; -else if (eflag &HI3110_ERR_STUFERR ) - cf->data[2 ] |=CAN_ERR_PROT_STUFF ; -else if (eflag &HI3110_ERR_CRCERR ) - cf->data[3 ] |=CAN_ERR_PROT_LOC_CRC_SEQ ; -else if (eflag &HI3110_ERR_ACKERR ) - cf->data[3 ] |=CAN_ERR_PROT_LOC_ACK ; - - cf->data[6 ] =hi3110_read (spi,HI3110_READ_TEC ); - cf->data[7 ] =hi3110_read (spi,HI3110_READ_REC ); +if (eflag &HI3110_ERR_BITERR ) { + priv->net->stats.tx_errors++; +if (skb) + cf->data[2 ] |=CAN_ERR_PROT_BIT ; + }else if (eflag &HI3110_ERR_FRMERR ) { + priv->net->stats.rx_errors++; +if (skb) + cf->data[2 ] |=CAN_ERR_PROT_FORM ; + }else if (eflag &HI3110_ERR_STUFERR ) { + priv->net->stats.rx_errors++; +if (skb) + cf->data[2 ] |=CAN_ERR_PROT_STUFF ; + }else if (eflag &HI3110_ERR_CRCERR ) { + priv->net->stats.rx_errors++; +if (skb) + cf->data[3 ] |=CAN_ERR_PROT_LOC_CRC_SEQ ; + }else if (eflag &HI3110_ERR_ACKERR ) { + priv->net->stats.tx_errors++; +if (skb) + cf->data[3 ] |=CAN_ERR_PROT_LOC_ACK ; + } +netdev_dbg (priv->net,"Bus Error\n" ); -netif_rx (skb); +if (skb) { + cf->data[6 ] =hi3110_read (spi,HI3110_READ_TEC ); + cf->data[7 ] =hi3110_read (spi,HI3110_READ_REC ); +netif_rx (skb); + } } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 12/466 can: sja1000: sja1000_err(): fix {rx,tx}_errors statistics
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 2c4ef3af4b028a0eaaf378df511d3b425b1df61f ]
The sja1000_err() function only incremented the receive error counter and never the transmit error counter, even if the ECC_DIR flag reported that an error had occurred during transmission.
Increment the receive/transmit error counter based on the value of the ECC_DIR flag.
--- drivers/net/can/sja1000/sja1000.c | 67 ++++++++++++++++++------------- 1 file changed, 39 insertions(+), 28 deletions(-)
drivers/net/can/sja1000/sja1000.c +39 -28
@@ -416,8 +416,6 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)int ret =0 ; skb =alloc_can_err_skb (dev, &cf); -if (skb ==NULL ) -return -ENOMEM ; txerr = priv->read_reg (priv,SJA1000_TXERR ); rxerr = priv->read_reg (priv,SJA1000_RXERR );
@@ -425,8 +423,11 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)if (isrc &IRQ_DOI ) {/* data overrun interrupt */ netdev_dbg (dev,"data overrun interrupt\n" ); - cf->can_id |=CAN_ERR_CRTL ; - cf->data[1 ] =CAN_ERR_CRTL_RX_OVERFLOW ; +if (skb) { + cf->can_id |=CAN_ERR_CRTL ; + cf->data[1 ] =CAN_ERR_CRTL_RX_OVERFLOW ; + } + stats->rx_over_errors++; stats->rx_errors++;sja1000_write_cmdreg (priv,CMD_CDO );/* clear bit */
@@ -452,7 +453,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)else state =CAN_STATE_ERROR_ACTIVE ; } -if (state !=CAN_STATE_BUS_OFF ) { +if (state !=CAN_STATE_BUS_OFF && skb) { cf->can_id |=CAN_ERR_CNT ; cf->data[6 ] = txerr; cf->data[7 ] = rxerr;
@@ -460,33 +461,38 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)if (isrc &IRQ_BEI ) {/* bus error interrupt */ priv->can.can_stats.bus_error++; - stats->rx_errors++; ecc = priv->read_reg (priv,SJA1000_ECC ); +if (skb) { + cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; - cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; - -/* set error type */ -switch (ecc &ECC_MASK ) { -case ECC_BIT : - cf->data[2 ] |=CAN_ERR_PROT_BIT ; -break ; -case ECC_FORM : - cf->data[2 ] |=CAN_ERR_PROT_FORM ; -break ; -case ECC_STUFF : - cf->data[2 ] |=CAN_ERR_PROT_STUFF ; -break ; -default : -break ; - } +/* set error type */ +switch (ecc &ECC_MASK ) { +case ECC_BIT : + cf->data[2 ] |=CAN_ERR_PROT_BIT ; +break ; +case ECC_FORM : + cf->data[2 ] |=CAN_ERR_PROT_FORM ; +break ; +case ECC_STUFF : + cf->data[2 ] |=CAN_ERR_PROT_STUFF ; +break ; +default : +break ; + } -/* set error location */ - cf->data[3 ] = ecc &ECC_SEG ; +/* set error location */ + cf->data[3 ] = ecc &ECC_SEG ; + }/* Error occurred during transmission? */ -if ((ecc &ECC_DIR ) ==0 ) - cf->data[2 ] |=CAN_ERR_PROT_TX ; +if ((ecc &ECC_DIR ) ==0 ) { + stats->tx_errors++; +if (skb) + cf->data[2 ] |=CAN_ERR_PROT_TX ; + }else { + stats->rx_errors++; + } }if (isrc &IRQ_EPI ) {/* error passive interrupt */
@@ -502,8 +508,10 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)netdev_dbg (dev,"arbitration lost interrupt\n" ); alc = priv->read_reg (priv,SJA1000_ALC ); priv->can.can_stats.arbitration_lost++; - cf->can_id |=CAN_ERR_LOSTARB ; - cf->data[0 ] = alc &0x1f ; +if (skb) { + cf->can_id |=CAN_ERR_LOSTARB ; + cf->data[0 ] = alc &0x1f ; + } }if (state != priv->can.state) {
@@ -516,6 +524,9 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)can_bus_off (dev); } +if (!skb) +return -ENOMEM ; +netif_rx (skb);return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 13/466 can: sun4i_can: sun4i_can_err(): fix {rx,tx}_errors statistics
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 595a81988a6fe06eb5849e972c8b9cb21c4e0d54 ]
The sun4i_can_err() function only incremented the receive error counter and never the transmit error counter, even if the STA_ERR_DIR flag reported that an error had occurred during transmission.
Increment the receive/transmit error counter based on the value of the STA_ERR_DIR flag.
--- drivers/net/can/sun4i_can.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/net/can/sun4i_can.c +9 -5
@@ -579,11 +579,9 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)/* bus error interrupt */ netdev_dbg (dev,"bus error interrupt\n" ); priv->can.can_stats.bus_error++; - stats->rx_errors++; + ecc =readl (priv->base +SUN4I_REG_STA_ADDR );if (likely (skb)) { - ecc =readl (priv->base +SUN4I_REG_STA_ADDR ); - cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ;switch (ecc &SUN4I_STA_MASK_ERR ) {
@@ -601,9 +599,15 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status) >> 16;break ; } -/* error occurred during transmission? */ -if ((ecc &SUN4I_STA_ERR_DIR ) ==0 ) + } + +/* error occurred during transmission? */ +if ((ecc &SUN4I_STA_ERR_DIR ) ==0 ) { +if (likely (skb)) cf->data[2 ] |=CAN_ERR_PROT_TX ; + stats->tx_errors++; + }else { + stats->rx_errors++; } }if (isrc &SUN4I_INT_ERR_PASSIVE ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 14/466 can: ems_usb: ems_usb_rx_err(): fix {rx,tx}_errors statistics
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 72a7e2e74b3075959f05e622bae09b115957dffe ]
The ems_usb_rx_err() function only incremented the receive error counter and never the transmit error counter, even if the ECC_DIR flag reported that an error had occurred during transmission.
Increment the receive/transmit error counter based on the value of the ECC_DIR flag.
--- drivers/net/can/usb/ems_usb.c | 58 ++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 25 deletions(-)
drivers/net/can/usb/ems_usb.c +33 -25
@@ -335,15 +335,14 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)struct net_device_stats *stats = &dev->netdev->stats; skb =alloc_can_err_skb (dev->netdev, &cf); -if (skb ==NULL ) -return ;if (msg->type ==CPC_MSG_TYPE_CAN_STATE ) {u8 state = msg->msg.can_state;if (state &SJA1000_SR_BS ) { dev->can.state =CAN_STATE_BUS_OFF ; - cf->can_id |=CAN_ERR_BUSOFF ; +if (skb) + cf->can_id |=CAN_ERR_BUSOFF ; dev->can.can_stats.bus_off++;can_bus_off (dev->netdev);
@@ -361,44 +360,53 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)/* bus error interrupt */ dev->can.can_stats.bus_error++; - stats->rx_errors++; - cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; +if (skb) { + cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ; -switch (ecc &SJA1000_ECC_MASK ) { -case SJA1000_ECC_BIT : - cf->data[2 ] |=CAN_ERR_PROT_BIT ; -break ; -case SJA1000_ECC_FORM : - cf->data[2 ] |=CAN_ERR_PROT_FORM ; -break ; -case SJA1000_ECC_STUFF : - cf->data[2 ] |=CAN_ERR_PROT_STUFF ; -break ; -default : - cf->data[3 ] = ecc &SJA1000_ECC_SEG ; -break ; +switch (ecc &SJA1000_ECC_MASK ) { +case SJA1000_ECC_BIT : + cf->data[2 ] |=CAN_ERR_PROT_BIT ; +break ; +case SJA1000_ECC_FORM : + cf->data[2 ] |=CAN_ERR_PROT_FORM ; +break ; +case SJA1000_ECC_STUFF : + cf->data[2 ] |=CAN_ERR_PROT_STUFF ; +break ; +default : + cf->data[3 ] = ecc &SJA1000_ECC_SEG ; +break ; + } }/* Error occurred during transmission? */ -if ((ecc &SJA1000_ECC_DIR ) ==0 ) - cf->data[2 ] |=CAN_ERR_PROT_TX ; +if ((ecc &SJA1000_ECC_DIR ) ==0 ) { + stats->tx_errors++; +if (skb) + cf->data[2 ] |=CAN_ERR_PROT_TX ; + }else { + stats->rx_errors++; + } -if (dev->can.state ==CAN_STATE_ERROR_WARNING || - dev->can.state ==CAN_STATE_ERROR_PASSIVE ) { +if (skb && (dev->can.state ==CAN_STATE_ERROR_WARNING || + dev->can.state ==CAN_STATE_ERROR_PASSIVE )) { cf->can_id |=CAN_ERR_CRTL ; cf->data[1 ] = (txerr > rxerr) ?CAN_ERR_CRTL_TX_PASSIVE :CAN_ERR_CRTL_RX_PASSIVE ; } }else if (msg->type ==CPC_MSG_TYPE_OVERRUN ) { - cf->can_id |=CAN_ERR_CRTL ; - cf->data[1 ] =CAN_ERR_CRTL_RX_OVERFLOW ; +if (skb) { + cf->can_id |=CAN_ERR_CRTL ; + cf->data[1 ] =CAN_ERR_CRTL_RX_OVERFLOW ; + } stats->rx_over_errors++; stats->rx_errors++; } -netif_rx (skb); +if (skb) +netif_rx (skb); }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 15/466 can: f81604: f81604_handle_can_bus_errors(): fix {rx,tx}_errors statistics
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit d7b916540c2ba3d2a88c27b2a6287b39d8eac052 ]
The f81604_handle_can_bus_errors() function only incremented the receive error counter and never the transmit error counter, even if the ECC_DIR flag reported that an error had occurred during transmission.
Increment the receive/transmit error counter based on the value of the ECC_DIR flag.
--- drivers/net/can/usb/f81604.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/net/can/usb/f81604.c +7 -3
@@ -526,7 +526,6 @@ static void f81604_handle_can_bus_errors(struct f81604_port_priv *priv,netdev_dbg (netdev,"bus error interrupt\n" ); priv->can.can_stats.bus_error++; - stats->rx_errors++;if (skb) { cf->can_id |=CAN_ERR_PROT |CAN_ERR_BUSERROR ;
@@ -548,10 +547,15 @@ static void f81604_handle_can_bus_errors(struct f81604_port_priv *priv,/* set error location */ cf->data[3 ] = data->ecc &F81604_SJA1000_ECC_SEG ; + } -/* Error occurred during transmission? */ -if ((data->ecc &F81604_SJA1000_ECC_DIR ) ==0 ) +/* Error occurred during transmission? */ +if ((data->ecc &F81604_SJA1000_ECC_DIR ) ==0 ) { + stats->tx_errors++; +if (skb) cf->data[2 ] |=CAN_ERR_PROT_TX ; + }else { + stats->rx_errors++; }set_bit (F81604_CLEAR_ECC , &priv->clear_flags);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 16/466 ipvs: fix UB due to uninitialized stack access in ip_vs_protocol_init()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinghao Jia <[email protected]>
[ Upstream commit 146b6f1112eb30a19776d6c323c994e9d67790db ]
Under certain kernel configurations when building with Clang/LLVM, the compiler does not generate a return or jump as the terminator instruction for ip_vs_protocol_init(), triggering the following objtool warning during build time:
vmlinux.o: warning: objtool: ip_vs_protocol_init() falls through to next function __initstub__kmod_ip_vs_rr__935_123_ip_vs_rr_init6()
At runtime, this either causes an oops when trying to load the ipvs module or a boot-time panic if ipvs is built-in. This same issue has been reported by the Intel kernel test robot previously.
Digging deeper into both LLVM and the kernel code reveals this to be a undefined behavior problem. ip_vs_protocol_init() uses a on-stack buffer of 64 chars to store the registered protocol names and leaves it uninitialized after definition. The function calls strnlen() when concatenating protocol names into the buffer. With CONFIG_FORTIFY_SOURCE strnlen() performs an extra step to check whether the last byte of the input char buffer is a null character (commit 3009f891bb9f ("fortify:
Allow strlen() and strnlen() to pass compile-time known lengths")). This, together with possibly other configurations, cause the following IR to be generated:
define hidden i32 @ip_vs_protocol_init() local_unnamed_addr #5 section ".init.text" align 16 !kcfi_type !29 {
%1 = alloca [64 x i8], align 16
...14: ; preds = %11
%15 = getelementptr inbounds i8, ptr %1, i64 63
%16 = load i8, ptr %15, align 1
%17 = tail call i1 @llvm.is.constant.i8(i8 %16)
%18 = icmp eq i8 %16, 0
%19 = select i1 %17, i1 %18, i1 false
br i1 %19, label %20, label %23 20: ; preds = %14
%21 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %1) #23
...
23: ; preds = %14, %11, %20
%24 = call i64 @strnlen(ptr noundef nonnull dereferenceable(1) %1, i64 noundef 64) #24
...
}The above code calculates the address of the last char in the buffer (value %15) and then loads from it (value %16). Because the buffer is never initialized, the LLVM GVN pass marks value %16 as undefined:
%13 = getelementptr inbounds i8, ptr %1, i64 63
br i1 undef, label %14, label %17
This gives later passes (SCCP, in particular) more DCE opportunities by propagating the undef value further, and eventually removes everything after the load on the uninitialized stack location:
define hidden i32 @ip_vs_protocol_init() local_unnamed_addr #0 section ".init.text" align 16 !kcfi_type !11 {
%1 = alloca [64 x i8], align 16
...
12: ; preds = %11
%13 = getelementptr inbounds i8, ptr %1, i64 63
unreachable
}In this way, the generated native code will just fall through to the next function, as LLVM does not generate any code for the unreachable IR instruction and leaves the function without a terminator.
Zero the on-stack buffer to avoid this possible UB.
--- net/netfilter/ipvs/ip_vs_proto.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
net/netfilter/ipvs/ip_vs_proto.c +1 -3
@@ -340,7 +340,7 @@ void __net_exit ip_vs_protocol_net_cleanup(struct netns_ipvs *ipvs)int __init ip_vs_protocol_init (void ) { -char protocols[64 ]; +char protocols[64 ] = {0 };#define REGISTER_PROTOCOL (p) \ do { \ register_ip_vs_protocol(p); \
@@ -348,8 +348,6 @@ int __init ip_vs_protocol_init(void)strcat (protocols, (p)->name); \ } while (0) - protocols[0 ] ='\0' ; - protocols[2 ] ='\0' ;#ifdef CONFIG_IP_VS_PROTO_TCP REGISTER_PROTOCOL (&ip_vs_protocol_tcp);#endif
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 17/466 netfilter: x_tables: fix LED ID check in led_tg_check()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
[ Upstream commit 04317f4eb2aad312ad85c1a17ad81fe75f1f9bc7 ]
Syzbot has reported the following BUG detected by KASAN:
BUG: KASAN: slab-out-of-bounds in strlen+0x58/0x70 Read of size 1 at addr ffff8881022da0c8 by task repro/5879 ... Call Trace: <TASK> dump_stack_lvl+0x241/0x360 ? __pfx_dump_stack_lvl+0x10/0x10 ? __pfx__printk+0x10/0x10 ? _printk+0xd5/0x120 ? __virt_addr_valid+0x183/0x530 ? __virt_addr_valid+0x183/0x530 print_report+0x169/0x550 ? __virt_addr_valid+0x183/0x530 ? __virt_addr_valid+0x183/0x530 ? __virt_addr_valid+0x45f/0x530 ? __phys_addr+0xba/0x170 ? strlen+0x58/0x70 kasan_report+0x143/0x180 ? strlen+0x58/0x70 strlen+0x58/0x70 kstrdup+0x20/0x80 led_tg_check+0x18b/0x3c0 xt_check_target+0x3bb/0xa40 ? __pfx_xt_check_target+0x10/0x10 ? stack_depot_save_flags+0x6e4/0x830 ? nft_target_init+0x174/0xc30 nft_target_init+0x82d/0xc30 ? __pfx_nft_target_init+0x10/0x10 ? nf_tables_newrule+0x1609/0x2980 ? nf_tables_newrule+0x1609/0x2980 ? rcu_is_watching+0x15/0xb0 ? nf_tables_newrule+0x1609/0x2980 ? nf_tables_newrule+0x1609/0x2980 ? __kmalloc_noprof+0x21a/0x400 nf_tables_newrule+0x1860/0x2980 ? __pfx_nf_tables_newrule+0x10/0x10 ? __nla_parse+0x40/0x60 nfnetlink_rcv+0x14e5/0x2ab0 ? __pfx_validate_chain+0x10/0x10 ? __pfx_nfnetlink_rcv+0x10/0x10 ? __lock_acquire+0x1384/0x2050 ? netlink_deliver_tap+0x2e/0x1b0 ? __pfx_lock_release+0x10/0x10 ? netlink_deliver_tap+0x2e/0x1b0 netlink_unicast+0x7f8/0x990 ? __pfx_netlink_unicast+0x10/0x10 ? __virt_addr_valid+0x183/0x530 ? __check_object_size+0x48e/0x900 netlink_sendmsg+0x8e4/0xcb0 ? __pfx_netlink_sendmsg+0x10/0x10 ? aa_sock_msg_perm+0x91/0x160 ? __pfx_netlink_sendmsg+0x10/0x10 __sock_sendmsg+0x223/0x270 ____sys_sendmsg+0x52a/0x7e0 ? __pfx_____sys_sendmsg+0x10/0x10 __sys_sendmsg+0x292/0x380 ? __pfx___sys_sendmsg+0x10/0x10 ? lockdep_hardirqs_on_prepare+0x43d/0x780 ? __pfx_lockdep_hardirqs_on_prepare+0x10/0x10 ? exc_page_fault+0x590/0x8c0 ? do_syscall_64+0xb6/0x230 do_syscall_64+0xf3/0x230 entry_SYSCALL_64_after_hwframe+0x77/0x7f ... </TASK>
Since an invalid (without '\0' byte at all) byte sequence may be passed from userspace, add an extra check to ensure that such a sequence is rejected as possible ID and so never passed to 'kstrdup()' and further.
--- net/netfilter/xt_LED.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/netfilter/xt_LED.c +3 -1
@@ -96,7 +96,9 @@ static int led_tg_check(const struct xt_tgchk_param *par)struct xt_led_info_internal *ledinternal;int err; -if (ledinfo->id[0 ] =='\0' ) +/* Bail out if empty string or not a string at all. */ +if (ledinfo->id[0 ] =='\0' || + !memchr (ledinfo->id,'\0' ,sizeof (ledinfo->id)))return -EINVAL ;mutex_lock (&xt_led_mutex);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 18/466 netfilter: nft_socket: remove WARN_ON_ONCE on maximum cgroup level
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit b7529880cb961d515642ce63f9d7570869bbbdc3 ]
cgroup maximum depth is INT_MAX by default, there is a cgroup toggle to restrict this maximum depth to a more reasonable value not to harm performance. Remove unnecessary WARN_ON_ONCE which is reachable from userspace.
--- net/netfilter/nft_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/nft_socket.c +1 -1
@@ -68,7 +68,7 @@ static noinline int nft_socket_cgroup_subtree_level(void)cgroup_put (cgrp); -if (WARN_ON_ONCE (level >255 )) +if (level >255 )return -ERANGE ;if (WARN_ON_ONCE (level <0 ))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 19/466 selftests: hid: fix typo and exit code
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maximilian Heyne <[email protected]>
[ Upstream commit e8f34747bddedaf3895e5d5066e0f71713fff811 ]
The correct exit code to mark a test as skipped is 4.
--- .../testing/selftests/hid/run-hid-tools-tests.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
tools/testing/selftests/hid/run-hid-tools-tests.sh +9 -7
@@ -2,24 +2,26 @@ # SPDX-License-Identifier: GPL-2.0 # Runs tests for the HID subsystem +KSELFTEST_SKIP_TEST=4 + if ! command -v python3 > /dev/null 2>&1; then echo "hid-tools: [SKIP] python3 not installed" - exit 77 + exit $KSELFTEST_SKIP_TEST fi if ! python3 -c "import pytest" > /dev/null 2>&1; then - echo "hid: [SKIP/ pytest module not installed" - exit 77 + echo "hid: [SKIP] pytest module not installed" + exit $KSELFTEST_SKIP_TEST fi if ! python3 -c "import pytest_tap" > /dev/null 2>&1; then - echo "hid: [SKIP/ pytest_tap module not installed" - exit 77 + echo "hid: [SKIP] pytest_tap module not installed" + exit $KSELFTEST_SKIP_TEST fi if ! python3 -c "import hidtools" > /dev/null 2>&1; then - echo "hid: [SKIP/ hid-tools module not installed" - exit 77 + echo "hid: [SKIP] hid-tools module not installed" + exit $KSELFTEST_SKIP_TEST fi TARGET=${TARGET:=.}
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 20/466 net: enetc: Do not configure preemptible TCs if SIs do not support
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Fang <[email protected]>
[ Upstream commit b2420b8c81ec674552d00c55d46245e5c184b260 ]
Both ENETC PF and VF drivers share enetc_setup_tc_mqprio() to configure MQPRIO. And enetc_setup_tc_mqprio() calls enetc_change_preemptible_tcs() to configure preemptible TCs. However, only PF is able to configure preemptible TCs. Because only PF has related registers, while VF does not have these registers. So for VF, its hw->port pointer is NULL. Therefore, VF will access an invalid pointer when accessing a non-existent register, which will cause a crash issue. The simplified log is as follows.
root@ls1028ardb:~# tc qdisc add dev eno0vf0 parent root handle 100: \ mqprio num_tc 4 map 0 0 1 1 2 2 3 3 queues 1@0 1@1 1@2 1@3 hw 1 [ 187.290775] Unable to handle kernel paging request at virtual address 0000000000001f00 [ 187.424831] pc : enetc_mm_commit_preemptible_tcs+0x1c4/0x400 [ 187.430518] lr : enetc_mm_commit_preemptible_tcs+0x30c/0x400 [ 187.511140] Call trace: [ 187.513588] enetc_mm_commit_preemptible_tcs+0x1c4/0x400 [ 187.518918] enetc_setup_tc_mqprio+0x180/0x214 [ 187.523374] enetc_vf_setup_tc+0x1c/0x30 [ 187.527306] mqprio_enable_offload+0x144/0x178 [ 187.531766] mqprio_init+0x3ec/0x668 [ 187.535351] qdisc_create+0x15c/0x488 [ 187.539023] tc_modify_qdisc+0x398/0x73c [ 187.542958] rtnetlink_rcv_msg+0x128/0x378 [ 187.547064] netlink_rcv_skb+0x60/0x130 [ 187.550910] rtnetlink_rcv+0x18/0x24 [ 187.554492] netlink_unicast+0x300/0x36c [ 187.558425] netlink_sendmsg+0x1a8/0x420 [ 187.606759] ---[ end trace 0000000000000000 ]---
In addition, some PFs also do not support configuring preemptible TCs, such as eno1 and eno3 on LS1028A. It won't crash like it does for VFs, but we should prevent these PFs from accessing these unimplemented registers.
--- drivers/net/ethernet/freescale/enetc/enetc.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/freescale/enetc/enetc.c +3 -0
@@ -28,6 +28,9 @@ EXPORT_SYMBOL_GPL(enetc_port_mac_wr);static void enetc_change_preemptible_tcs (struct enetc_ndev_priv *priv,u8 preemptible_tcs) { +if (!(priv->si->hw_features &ENETC_SI_F_QBU )) +return ; + priv->preemptible_tcs = preemptible_tcs;enetc_mm_commit_preemptible_tcs (priv); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 21/466 ptp: Add error handling for adjfine callback in ptp_clock_adjtime
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ajay Kaher <[email protected]>
[ Upstream commit 98337d7c87577ded71114f6976edb70a163e27bc ]
ptp_clock_adjtime sets ptp->dialed_frequency even when adjfine callback returns an error. This causes subsequent reads to return an incorrect value.
Fix this by adding error check before ptp->dialed_frequency is set.
--- drivers/ptp/ptp_clock.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/ptp/ptp_clock.c +2 -1
@@ -150,7 +150,8 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx)if (ppb > ops->max_adj || ppb < -ops->max_adj)return -ERANGE ; err = ops->adjfine (ops, tx->freq); - ptp->dialed_frequency = tx->freq; +if (!err) + ptp->dialed_frequency = tx->freq; }else if (tx->modes &ADJ_OFFSET ) {if (ops->adjphase) {s32 max_phase_adj = ops->getmaxphase (ops);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 22/466 net/sched: tbf: correct backlog statistic for GSO packets
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Ottens <[email protected]>
[ Upstream commit 1596a135e3180c92e42dd1fbcad321f4fb3e3b17 ]
When the length of a GSO packet in the tbf qdisc is larger than the burst size configured the packet will be segmented by the tbf_segment function. Whenever this function is used to enqueue SKBs, the backlog statistic of the tbf is not increased correctly. This can lead to underflows of the 'backlog' byte-statistic value when these packets are dequeued from tbf.
Reproduce the bug:
Ensure that the sender machine has GSO enabled. Configured the tbf on the outgoing interface of the machine as follows (burstsize = 1 MTU):
$ tc qdisc add dev <oif> root handle 1: tbf rate 50Mbit burst 1514 latency 50ms
Send bulk TCP traffic out via this interface, e.g., by running an iPerf3 client on this machine. Check the qdisc statistics:
$ tc -s qdisc show dev <oif>
The 'backlog' byte-statistic has incorrect values while traffic is transferred, e.g., high values due to u32 underflows. When the transfer is stopped, the value is != 0, which should never happen.
This patch fixes this bug by updating the statistics correctly, even if single SKBs of a GSO SKB cannot be enqueued.
--- net/sched/sch_tbf.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
net/sched/sch_tbf.c +12 -6
@@ -208,7 +208,7 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch,struct tbf_sched_data *q =qdisc_priv (sch);struct sk_buff *segs, *nskb;netdev_features_t features =netif_skb_features (skb); -unsigned int len =0 , prev_len =qdisc_pkt_len (skb); +unsigned int len =0 , prev_len =qdisc_pkt_len (skb), seg_len;int ret, nb; segs =skb_gso_segment (skb, features & ~NETIF_F_GSO_MASK );
@@ -219,21 +219,27 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch, nb =0 ; skb_list_walk_safe(segs, segs, nskb) {skb_mark_not_on_list (segs); -qdisc_skb_cb (segs)->pkt_len = segs->len; - len += segs->len; + seg_len = segs->len; +qdisc_skb_cb (segs)->pkt_len = seg_len; ret =qdisc_enqueue (segs, q->qdisc, to_free);if (ret !=NET_XMIT_SUCCESS ) {if (net_xmit_drop_count (ret))qdisc_qstats_drop (sch); }else { nb++; + len += seg_len; } } sch->q.qlen += nb; -if (nb >1 ) + sch->qstats.backlog += len; +if (nb >0 ) {qdisc_tree_reduce_backlog (sch,1 - nb, prev_len - len); -consume_skb (skb); -return nb >0 ?NET_XMIT_SUCCESS :NET_XMIT_DROP ; +consume_skb (skb); +return NET_XMIT_SUCCESS ; + } + +kfree_skb (skb); +return NET_XMIT_DROP ; } static int tbf_enqueue(struct sk_buff *skb, struct Qdisc *sch,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 23/466 net: hsr: avoid potential out-of-bound access in fill_frame_info()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit b9653d19e556c6afd035602927a93d100a0d7644 ]
syzbot is able to feed a packet with 14 bytes, pretending it is a vlan one.
Since fill_frame_info() is relying on skb->mac_len already, extend the check to cover this case.
BUG: KMSAN: uninit-value in fill_frame_info net/hsr/hsr_forward.c:709 [inline] BUG: KMSAN: uninit-value in hsr_forward_skb+0x9ee/0x3b10 net/hsr/hsr_forward.c:724 fill_frame_info net/hsr/hsr_forward.c:709 [inline] hsr_forward_skb+0x9ee/0x3b10 net/hsr/hsr_forward.c:724 hsr_dev_xmit+0x2f0/0x350 net/hsr/hsr_device.c:235 __netdev_start_xmit include/linux/netdevice.h:5002 [inline] netdev_start_xmit include/linux/netdevice.h:5011 [inline] xmit_one net/core/dev.c:3590 [inline] dev_hard_start_xmit+0x247/0xa20 net/core/dev.c:3606 __dev_queue_xmit+0x366a/0x57d0 net/core/dev.c:4434 dev_queue_xmit include/linux/netdevice.h:3168 [inline] packet_xmit+0x9c/0x6c0 net/packet/af_packet.c:276 packet_snd net/packet/af_packet.c:3146 [inline] packet_sendmsg+0x91ae/0xa6f0 net/packet/af_packet.c:3178 sock_sendmsg_nosec net/socket.c:711 [inline] __sock_sendmsg+0x30f/0x380 net/socket.c:726 __sys_sendto+0x594/0x750 net/socket.c:2197 __do_sys_sendto net/socket.c:2204 [inline] __se_sys_sendto net/socket.c:2200 [inline] __x64_sys_sendto+0x125/0x1d0 net/socket.c:2200 x64_sys_call+0x346a/0x3c30 arch/x86/include/generated/asm/syscalls_64.h:45 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x1e0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f
Uninit was created at:
slab_post_alloc_hook mm/slub.c:4091 [inline] slab_alloc_node mm/slub.c:4134 [inline] kmem_cache_alloc_node_noprof+0x6bf/0xb80 mm/slub.c:4186 kmalloc_reserve+0x13d/0x4a0 net/core/skbuff.c:587 __alloc_skb+0x363/0x7b0 net/core/skbuff.c:678 alloc_skb include/linux/skbuff.h:1323 [inline] alloc_skb_with_frags+0xc8/0xd00 net/core/skbuff.c:6612 sock_alloc_send_pskb+0xa81/0xbf0 net/core/sock.c:2881 packet_alloc_skb net/packet/af_packet.c:2995 [inline] packet_snd net/packet/af_packet.c:3089 [inline] packet_sendmsg+0x74c6/0xa6f0 net/packet/af_packet.c:3178 sock_sendmsg_nosec net/socket.c:711 [inline] __sock_sendmsg+0x30f/0x380 net/socket.c:726 __sys_sendto+0x594/0x750 net/socket.c:2197 __do_sys_sendto net/socket.c:2204 [inline] __se_sys_sendto net/socket.c:2200 [inline] __x64_sys_sendto+0x125/0x1d0 net/socket.c:2200 x64_sys_call+0x346a/0x3c30 arch/x86/include/generated/asm/syscalls_64.h:45 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x1e0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f
--- net/hsr/hsr_forward.c | 2 ++ 1 file changed, 2 insertions(+)
net/hsr/hsr_forward.c +2 -0
@@ -688,6 +688,8 @@ static int fill_frame_info(struct hsr_frame_info *frame, frame->is_vlan = true;if (frame->is_vlan) { + if (skb->mac_len < offsetofend(struct hsr_vlan_ethhdr, vlanhdr)) +return -EINVAL ; vlan_hdr = (struct hsr_vlan_ethhdr *)ethhdr; proto = vlan_hdr->vlanhdr.h_vlan_encapsulated_proto;/* FIXME: */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 24/466 bnxt_en: ethtool: Supply ntuple rss context action
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Xu <[email protected]>
[ Upstream commit be75cda92a65a13db242117d674cd5584477a168 ]
Commit 2f4f9fe5bf5f ("bnxt_en: Support adding ntuple rules on RSS contexts") added support for redirecting to an RSS context as an ntuple rule action. However, it forgot to update the ETHTOOL_GRXCLSRULE codepath. This caused ethtool -n to always report the action as "Action: Direct to queue 0" which is wrong.
Fix by teaching bnxt driver to report the RSS context when applicable.
--- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +6 -2
@@ -1193,10 +1193,14 @@ static int bnxt_grxclsrule(struct bnxt *bp, struct ethtool_rxnfc *cmd) } } -if (fltr->base.flags &BNXT_ACT_DROP ) +if (fltr->base.flags &BNXT_ACT_DROP ) { fs->ring_cookie =RX_CLS_FLOW_DISC ; -else + }else if (fltr->base.flags &BNXT_ACT_RSS_CTX ) { + fs->flow_type |=FLOW_RSS ; + cmd->rss_context = fltr->base.fw_vnic_id; + }else { fs->ring_cookie = fltr->base.rxq; + } rc =0 ; fltr_err:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 25/466 net: Fix icmp host relookup triggering ip_rt_bug
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dong Chenchen <[email protected]>
[ Upstream commit c44daa7e3c73229f7ac74985acb8c7fb909c4e0a ]
arp link failure may trigger ip_rt_bug while xfrm enabled, call trace is:
WARNING: CPU: 0 PID: 0 at net/ipv4/route.c:1241 ip_rt_bug+0x14/0x20 Modules linked in: CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.12.0-rc6-00077-g2e1b3cc9d7f7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:ip_rt_bug+0x14/0x20 Call Trace: <IRQ> ip_send_skb+0x14/0x40 __icmp_send+0x42d/0x6a0 ipv4_link_failure+0xe2/0x1d0 arp_error_report+0x3c/0x50 neigh_invalidate+0x8d/0x100 neigh_timer_handler+0x2e1/0x330 call_timer_fn+0x21/0x120 __run_timer_base.part.0+0x1c9/0x270 run_timer_softirq+0x4c/0x80 handle_softirqs+0xac/0x280 irq_exit_rcu+0x62/0x80 sysvec_apic_timer_interrupt+0x77/0x90
The script below reproduces this scenario:
ip xfrm policy add src 0.0.0.0/0 dst 0.0.0.0/0 \
dir out priority 0 ptype main flag localok icmp
ip l a veth1 type veth
ip a a 192.168.141.111/24 dev veth0
ip l s veth0 up
ping 192.168.141.155 -c 1
icmp_route_lookup() create input routes for locally generated packets while xfrm relookup ICMP traffic.Then it will set input route (dst->out = ip_rt_bug) to skb for DESTUNREACH.
For ICMP err triggered by locally generated packets, dst->dev of output route is loopback. Generally, xfrm relookup verification is not required on loopback interfaces (net.ipv4.conf.lo.disable_xfrm = 1).
Skip icmp relookup for locally generated packets to fix it.
--- net/ipv4/icmp.c | 3 +++ 1 file changed, 3 insertions(+)
net/ipv4/icmp.c +3 -0
@@ -519,6 +519,9 @@ static struct rtable *icmp_route_lookup(struct net *net,if (!IS_ERR (dst)) {if (rt != rt2)return rt; +if (inet_addr_type_dev_table (net, route_lookup_dev, + fl4->daddr) ==RTN_LOCAL ) +return rt; }else if (PTR_ERR (dst) == -EPERM ) { rt =NULL ; }else {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 26/466 ipv6: avoid possible NULL deref in modify_prefix_route()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit a747e02430dfb3657141f99aa6b09331283fa493 ]
syzbot found a NULL deref [1] in modify_prefix_route(), caused by one fib6_info without a fib6_table pointer set.
This can happen for net->ipv6.fib6_null_entry
[1]
Oops: general protection fault, probably for non-canonical address 0xdffffc0000000006: 0000 [#1] PREEMPT SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000030-0x0000000000000037] CPU: 1 UID: 0 PID: 5837 Comm: syz-executor888 Not tainted 6.12.0-syzkaller-09567-g7eef7e306d3c #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 RIP: 0010:__lock_acquire+0xe4/0x3c40 kernel/locking/lockdep.c:5089 Code: 08 84 d2 0f 85 15 14 00 00 44 8b 0d ca 98 f5 0e 45 85 c9 0f 84 b4 0e 00 00 48 b8 00 00 00 00 00 fc ff df 4c 89 e2 48 c1 ea 03 <80> 3c 02 00 0f 85 96 2c 00 00 49 8b 04 24 48 3d a0 07 7f 93 0f 84 RSP: 0018:ffffc900035d7268 EFLAGS: 00010006 RAX: dffffc0000000000 RBX: 0000000000000000 RCX: 0000000000000000 RDX: 0000000000000006 RSI: 1ffff920006bae5f RDI: 0000000000000030 RBP: 0000000000000000 R08: 0000000000000001 R09: 0000000000000001 R10: ffffffff90608e17 R11: 0000000000000001 R12: 0000000000000030 R13: ffff888036334880 R14: 0000000000000000 R15: 0000000000000000 FS: 0000555579e90380(0000) GS:ffff8880b8700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007ffc59cc4278 CR3: 0000000072b54000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> lock_acquire.part.0+0x11b/0x380 kernel/locking/lockdep.c:5849 __raw_spin_lock_bh include/linux/spinlock_api_smp.h:126 [inline] _raw_spin_lock_bh+0x33/0x40 kernel/locking/spinlock.c:178 spin_lock_bh include/linux/spinlock.h:356 [inline] modify_prefix_route+0x30b/0x8b0 net/ipv6/addrconf.c:4831 inet6_addr_modify net/ipv6/addrconf.c:4923 [inline] inet6_rtm_newaddr+0x12c7/0x1ab0 net/ipv6/addrconf.c:5055 rtnetlink_rcv_msg+0x3c7/0xea0 net/core/rtnetlink.c:6920 netlink_rcv_skb+0x16b/0x440 net/netlink/af_netlink.c:2541 netlink_unicast_kernel net/netlink/af_netlink.c:1321 [inline] netlink_unicast+0x53c/0x7f0 net/netlink/af_netlink.c:1347 netlink_sendmsg+0x8b8/0xd70 net/netlink/af_netlink.c:1891 sock_sendmsg_nosec net/socket.c:711 [inline] __sock_sendmsg net/socket.c:726 [inline] ____sys_sendmsg+0xaaf/0xc90 net/socket.c:2583 ___sys_sendmsg+0x135/0x1e0 net/socket.c:2637 __sys_sendmsg+0x16e/0x220 net/socket.c:2669 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7fd1dcef8b79 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 c1 17 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007ffc59cc4378 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fd1dcef8b79 RDX: 0000000000040040 RSI: 0000000020000140 RDI: 0000000000000004 RBP: 00000000000113fd R08: 0000000000000006 R09: 0000000000000006 R10: 0000000000000006 R11: 0000000000000246 R12: 00007ffc59cc438c R13: 431bde82d7b634db R14: 0000000000000001 R15: 0000000000000001 </TASK>
--- net/ipv6/addrconf.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
net/ipv6/addrconf.c +7 -6
@@ -4821,7 +4821,7 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, ifm->ifa_prefixlen, extack); } -static int modify_prefix_route (struct inet6_ifaddr *ifp, +static int modify_prefix_route (struct net *net,struct inet6_ifaddr *ifp,unsigned long expires,u32 flags,bool modify_peer) {
@@ -4845,7 +4845,9 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp, ifp->prefix_len, ifp->rt_priority, ifp->idev->dev, expires, flags, GFP_KERNEL); - }else { +return 0 ; + } +if (f6i != net->ipv6.fib6_null_entry) { table = f6i->fib6_table;spin_lock_bh (&table->tb6_lock);
@@ -4858,9 +4860,8 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp, }spin_unlock_bh (&table->tb6_lock); - -fib6_info_release (f6i); } +fib6_info_release (f6i);return 0 ; }
@@ -4939,7 +4940,7 @@ static int inet6_addr_modify(struct net *net, struct inet6_ifaddr *ifp,int rc = -ENOENT ;if (had_prefixroute) - rc =modify_prefix_route (ifp, expires, flags, false); + rc =modify_prefix_route (net, ifp, expires, flags, false);/* prefix route could have been deleted; if so restore it */ if (rc == -ENOENT ) {
@@ -4949,7 +4950,7 @@ static int inet6_addr_modify(struct net *net, struct inet6_ifaddr *ifp, }if (had_prefixroute && !ipv6_addr_any (&ifp->peer_addr)) - rc =modify_prefix_route (ifp, expires, flags, true); + rc =modify_prefix_route (net, ifp, expires, flags, true);if (rc == -ENOENT && !ipv6_addr_any (&ifp->peer_addr)) { addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 27/466 can: j1939: j1939_session_new(): fix skb reference counting
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
[ Upstream commit a8c695005bfe6569acd73d777ca298ddddd66105 ]
Since j1939_session_skb_queue() does an extra skb_get() for each new skb, do the same for the initial one in j1939_session_new() to avoid refcount underflow.
--- net/can/j1939/transport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/can/j1939/transport.c +1 -1
@@ -1505,7 +1505,7 @@ static struct j1939_session *j1939_session_new(struct j1939_priv *priv, session->state =J1939_SESSION_NEW ;skb_queue_head_init (&session->skb_queue); -skb_queue_tail (&session->skb_queue, skb); +skb_queue_tail (&session->skb_queue,skb_get (skb)); skcb =j1939_skb_to_cb (skb);memcpy (&session->skcb, skcb,sizeof (session->skcb));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 28/466 platform/x86: asus-wmi: Ignore return value when writing thermal policy
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit 25fb5f47f34d90aceda2c47a4230315536e97fa8 ]
On some machines like the ASUS Vivobook S14 writing the thermal policy returns the currently writen thermal policy instead of an error code.
Ignore the return code to avoid falsely returning an error when the thermal policy was written successfully.
--- drivers/platform/x86/asus-wmi.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-)
drivers/platform/x86/asus-wmi.c +2 -9
@@ -3696,7 +3696,6 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)/* Throttle thermal policy ****************************************************/ static int throttle_thermal_policy_write (struct asus_wmi *asus) { -u32 retval;u8 value;int err;
@@ -3718,8 +3717,8 @@ static int throttle_thermal_policy_write(struct asus_wmi *asus) value = asus->throttle_thermal_policy_mode; } - err =asus_wmi_set_devstate (asus->throttle_thermal_policy_dev, - value, &retval); +/* Some machines do not return an error code as a result, so we ignore it */ + err =asus_wmi_set_devstate (asus->throttle_thermal_policy_dev, value,NULL );sysfs_notify (&asus->platform_device->dev.kobj,NULL ,"throttle_thermal_policy" );
@@ -3729,12 +3728,6 @@ static int throttle_thermal_policy_write(struct asus_wmi *asus)return err; } -if (retval !=1 ) { -pr_warn ("Failed to set throttle thermal policy (retval): 0x%x\n" , - retval); -return -EIO ; - } -/* Must set to disabled if mode is toggled */ if (asus->cpu_fan_curve_available) asus->custom_fan_curves[FAN_CURVE_DEV_CPU ].enabled = false;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 29/466 net: phy: microchip: Reset LAN88xx PHY to ensure clean link state on LAN7800/7850
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
[ Upstream commit ccb989e4d1efe0dd81b28c437443532d80d9ecee ]
Fix outdated MII_LPA data in the LAN88xx PHY, which is used in LAN7800 and LAN7850 USB Ethernet controllers. Due to a hardware limitation, the PHY cannot reliably update link status after parallel detection when the link partner does not support auto-negotiation. To mitigate this, add a PHY reset in lan88xx_link_change_notify() when phydev->state is PHY_NOLINK, ensuring the PHY starts in a clean state and reports accurate fixed link parallel detection results.
--- drivers/net/phy/microchip.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/net/phy/microchip.c +21 -0
@@ -351,6 +351,22 @@ static int lan88xx_config_aneg(struct phy_device *phydev)static void lan88xx_link_change_notify (struct phy_device *phydev) {int temp; +int ret; + +/* Reset PHY to ensure MII_LPA provides up-to-date information. This +* issue is reproducible only after parallel detection, as described +* in IEEE 802.3-2022, Section 28.2.3.1 ("Parallel detection function"), +* where the link partner does not support auto-negotiation. +*/ +if (phydev->state ==PHY_NOLINK ) { + ret =phy_init_hw (phydev); +if (ret <0 ) + goto link_change_notify_failed; + + ret =_phy_start_aneg (phydev); +if (ret <0 ) + goto link_change_notify_failed; + }/* At forced 100 F/H mode, chip may fail to set mode correctly * when cable is switched between long(~50+m) and short one.
@@ -377,6 +393,11 @@ static void lan88xx_link_change_notify(struct phy_device *phydev) temp |=LAN88XX_INT_MASK_MDINTPIN_EN_ ;phy_write (phydev,LAN88XX_INT_MASK , temp); } + +return ; + +link_change_notify_failed: +phydev_err (phydev,"Link change process failed %pe\n" ,ERR_PTR (ret)); }/**
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 30/466 net/ipv6: release expired exception dst cached in socket
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Wiesner <[email protected]>
[ Upstream commit 3301ab7d5aeb0fe270f73a3d4810c9d1b6a9f045 ]
Dst objects get leaked in ip6_negative_advice() when this function is executed for an expired IPv6 route located in the exception table. There are several conditions that must be fulfilled for the leak to occur:
* an ICMPv6 packet indicating a change of the MTU for the path is received, resulting in an exception dst being created
* a TCP connection that uses the exception dst for routing packets must start timing out so that TCP begins retransmissions
* after the exception dst expires, the FIB6 garbage collector must not run before TCP executes ip6_negative_advice() for the expired exception dst
When TCP executes ip6_negative_advice() for an exception dst that has expired and if no other socket holds a reference to the exception dst, the refcount of the exception dst is 2, which corresponds to the increment made by dst_init() and the increment made by the TCP socket for which the connection is timing out. The refcount made by the socket is never released. The refcount of the dst is decremented in sk_dst_reset() but that decrement is counteracted by a dst_hold() intentionally placed just before the sk_dst_reset() in ip6_negative_advice(). After ip6_negative_advice() has finished, there is no other object tied to the dst. The socket lost its reference stored in sk_dst_cache and the dst is no longer in the exception table. The exception dst becomes a leaked object.
As a result of this dst leak, an unbalanced refcount is reported for the loopback device of a net namespace being destroyed under kernels that do not contain e5f80fcf869a ("ipv6: give an IPv6 dev to blackhole_netdev"):unregister_netdevice: waiting for lo to become free. Usage count = 2
Fix the dst leak by removing the dst_hold() in ip6_negative_advice(). The patch that introduced the dst_hold() in ip6_negative_advice() was 92f1655aa2b22 ("net: fix __dst_negative_advice() race"). But 92f1655aa2b22 merely refactored the code with regards to the dst refcount so the issue was present even before 92f1655aa2b22. The bug was introduced in 54c1a859efd9f ("ipv6: Don't drop cache route entry unless timer actually expired.") where the expired cached route is deleted and the sk_dst_cache member of the socket is set to NULL by calling dst_negative_advice() but the refcount belonging to the socket is left unbalanced.
The IPv4 version - ipv4_negative_advice() - is not affected by this bug. When the TCP connection times out ipv4_negative_advice() merely resets the sk_dst_cache of the socket while decrementing the refcount of the exception dst.
--- net/ipv6/route.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/ipv6/route.c +3 -3
@@ -2780,10 +2780,10 @@ static void ip6_negative_advice(struct sock *sk,if (rt->rt6i_flags &RTF_CACHE ) {rcu_read_lock ();if (rt6_check_expired (rt)) { -/* counteract the dst_release() in sk_dst_reset() */ -dst_hold (dst); +/* rt/dst can not be destroyed yet, +* because of rcu_read_lock() +*/ sk_dst_reset (sk); -rt6_remove_exception_rt (rt); }rcu_read_unlock ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 31/466 dccp: Fix memory leak in dccp_feat_change_recv
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Solodovnikov <[email protected]>
[ Upstream commit 22be4727a8f898442066bcac34f8a1ad0bc72e14 ]
If dccp_feat_push_confirm() fails after new value for SP feature was accepted without reconciliation ('entry == NULL' branch), memory allocated for that value with dccp_feat_clone_sp_val() is never freed.
Here is the kmemleak stack for this:
unreferenced object 0xffff88801d4ab488 (size 8):
comm "syz-executor310", pid 1127, jiffies 4295085598 (age 41.666s) hex dump (first 8 bytes):
01 b4 4a 1d 80 88 ff ff ..J.....
backtrace:
[<00000000db7cabfe>] kmemdup+0x23/0x50 mm/util.c:128
[<0000000019b38405>] kmemdup include/linux/string.h:465 [inline]
[<0000000019b38405>] dccp_feat_clone_sp_val net/dccp/feat.c:371 [inline]
[<0000000019b38405>] dccp_feat_clone_sp_val net/dccp/feat.c:367 [inline]
[<0000000019b38405>] dccp_feat_change_recv net/dccp/feat.c:1145 [inline]
[<0000000019b38405>] dccp_feat_parse_options+0x1196/0x2180 net/dccp/feat.c:1416
[<00000000b1f6d94a>] dccp_parse_options+0xa2a/0x1260 net/dccp/options.c:125
[<0000000030d7b621>] dccp_rcv_state_process+0x197/0x13d0 net/dccp/input.c:650
[<000000001f74c72e>] dccp_v4_do_rcv+0xf9/0x1a0 net/dccp/ipv4.c:688
[<00000000a6c24128>] sk_backlog_rcv include/net/sock.h:1041 [inline]
[<00000000a6c24128>] __release_sock+0x139/0x3b0 net/core/sock.c:2570
[<00000000cf1f3a53>] release_sock+0x54/0x1b0 net/core/sock.c:3111
[<000000008422fa23>] inet_wait_for_connect net/ipv4/af_inet.c:603 [inline]
[<000000008422fa23>] __inet_stream_connect+0x5d0/0xf70 net/ipv4/af_inet.c:696
[<0000000015b6f64d>] inet_stream_connect+0x53/0xa0 net/ipv4/af_inet.c:735
[<0000000010122488>] __sys_connect_file+0x15c/0x1a0 net/socket.c:1865
[<00000000b4b70023>] __sys_connect+0x165/0x1a0 net/socket.c:1882
[<00000000f4cb3815>] __do_sys_connect net/socket.c:1892 [inline]
[<00000000f4cb3815>] __se_sys_connect net/socket.c:1889 [inline]
[<00000000f4cb3815>] __x64_sys_connect+0x6e/0xb0 net/socket.c:1889
[<00000000e7b1e839>] do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46
[<0000000055e91434>] entry_SYSCALL_64_after_hwframe+0x67/0xd1Clean up the allocated memory in case of dccp_feat_push_confirm() failure and bail out with an error reset code.
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
--- net/dccp/feat.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/dccp/feat.c +5 -1
@@ -1166,8 +1166,12 @@ static u8 dccp_feat_change_recv(struct list_head *fn, u8 is_mandatory, u8 opt, goto not_valid_or_not_known; } -return dccp_feat_push_confirm (fn, feat, local, &fval); +if (dccp_feat_push_confirm (fn, feat, local, &fval)) { +kfree (fval.sp.vec); +return DCCP_RESET_CODE_TOO_BUSY ; + } +return 0 ; }else if (entry->state ==FEAT_UNSTABLE ) {/* 6.6.2 */ return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 32/466 tipc: Fix use-after-free of kernel socket in cleanup_bearer().
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 6a2fa13312e51a621f652d522d7e2df7066330b6 ]
syzkaller reported a use-after-free of UDP kernel socket in cleanup_bearer() without repro. [0][1]
When bearer_disable() calls tipc_udp_disable(), cleanup of the UDP kernel socket is deferred by work calling cleanup_bearer().
tipc_net_stop() waits for such works to finish by checking tipc_net(net)->wq_count. However, the work decrements the count too early before releasing the kernel socket, unblocking cleanup_net() and resulting in use-after-free.
Let's move the decrement after releasing the socket in cleanup_bearer().
[0]:ref_tracker: net notrefcnt@000000009b3d1faf has 1/1 users at
sk_alloc+0x438/0x608
inet_create+0x4c8/0xcb0
__sock_create+0x350/0x6b8
sock_create_kern+0x58/0x78
udp_sock_create4+0x68/0x398
udp_sock_create+0x88/0xc8
tipc_udp_enable+0x5e8/0x848
__tipc_nl_bearer_enable+0x84c/0xed8
tipc_nl_bearer_enable+0x38/0x60
genl_family_rcv_msg_doit+0x170/0x248
genl_rcv_msg+0x400/0x5b0
netlink_rcv_skb+0x1dc/0x398
genl_rcv+0x44/0x68
netlink_unicast+0x678/0x8b0
netlink_sendmsg+0x5e4/0x898
____sys_sendmsg+0x500/0x830[1]:
BUG: KMSAN: use-after-free in udp_hashslot include/net/udp.h:85 [inline] BUG: KMSAN: use-after-free in udp_lib_unhash+0x3b8/0x930 net/ipv4/udp.c:1979 udp_hashslot include/net/udp.h:85 [inline] udp_lib_unhash+0x3b8/0x930 net/ipv4/udp.c:1979 sk_common_release+0xaf/0x3f0 net/core/sock.c:3820 inet_release+0x1e0/0x260 net/ipv4/af_inet.c:437 inet6_release+0x6f/0xd0 net/ipv6/af_inet6.c:489 __sock_release net/socket.c:658 [inline] sock_release+0xa0/0x210 net/socket.c:686 cleanup_bearer+0x42d/0x4c0 net/tipc/udp_media.c:819 process_one_work kernel/workqueue.c:3229 [inline] process_scheduled_works+0xcaf/0x1c90 kernel/workqueue.c:3310 worker_thread+0xf6c/0x1510 kernel/workqueue.c:3391 kthread+0x531/0x6b0 kernel/kthread.c:389 ret_from_fork+0x60/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x11/0x20 arch/x86/entry/entry_64.S:244
Uninit was created at:
slab_free_hook mm/slub.c:2269 [inline] slab_free mm/slub.c:4580 [inline] kmem_cache_free+0x207/0xc40 mm/slub.c:4682 net_free net/core/net_namespace.c:454 [inline] cleanup_net+0x16f2/0x19d0 net/core/net_namespace.c:647 process_one_work kernel/workqueue.c:3229 [inline] process_scheduled_works+0xcaf/0x1c90 kernel/workqueue.c:3310 worker_thread+0xf6c/0x1510 kernel/workqueue.c:3391 kthread+0x531/0x6b0 kernel/kthread.c:389 ret_from_fork+0x60/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x11/0x20 arch/x86/entry/entry_64.S:244 CPU: 0 UID: 0 PID: 54 Comm: kworker/0:2 Not tainted 6.12.0-rc1-00131-gf66ebf37d69c #7 91723d6f74857f70725e1583cba3cf4adc716cfa Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 Workqueue: events cleanup_bearer
--- net/tipc/udp_media.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/tipc/udp_media.c +1 -1
@@ -814,10 +814,10 @@ static void cleanup_bearer(struct work_struct *work)kfree_rcu (rcast, rcu); } -atomic_dec (&tipc_net (sock_net (ub->ubsock->sk))->wq_count);dst_cache_destroy (&ub->rcast.dst_cache);udp_tunnel_sock_release (ub->ubsock);synchronize_net (); +atomic_dec (&tipc_net (sock_net (ub->ubsock->sk))->wq_count);kfree (ub); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 33/466 net/smc: initialize close_work early to avoid warning
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wen Gu <[email protected]>
[ Upstream commit 0541db8ee32c09463a72d0987382b3a3336b0043 ]
We encountered a warning that close_work was canceled before initialization.
WARNING: CPU: 7 PID: 111103 at kernel/workqueue.c:3047 __flush_work+0x19e/0x1b0 Workqueue: events smc_lgr_terminate_work [smc] RIP: 0010:__flush_work+0x19e/0x1b0 Call Trace: ? __wake_up_common+0x7a/0x190 ? work_busy+0x80/0x80 __cancel_work_timer+0xe3/0x160 smc_close_cancel_work+0x1a/0x70 [smc] smc_close_active_abort+0x207/0x360 [smc] __smc_lgr_terminate.part.38+0xc8/0x180 [smc] process_one_work+0x19e/0x340 worker_thread+0x30/0x370 ? process_one_work+0x340/0x340 kthread+0x117/0x130 ? __kthread_cancel_work+0x50/0x50 ret_from_fork+0x22/0x30
This is because when smc_close_cancel_work is triggered, e.g. the RDMA driver is rmmod and the LGR is terminated, the conn->close_work is flushed before initialization, resulting in WARN_ON(!work->func).
__smc_lgr_terminate | smc_connect_{rdma|ism}
-------------------------------------------------------------
| smc_conn_create | \- smc_lgr_register_conn
for conn in lgr->conns_all |
\- smc_conn_kill |
\- smc_close_active_abort |
\- smc_close_cancel_work |
\- cancel_work_sync |
\- __flush_work |
(close_work) |
| smc_close_init
| \- INIT_WORK(&close_work)So fix this by initializing close_work before establishing the connection.
--- net/smc/af_smc.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
net/smc/af_smc.c +1 -3
@@ -383,6 +383,7 @@ void smc_sk_init(struct net *net, struct sock *sk, int protocol) smc->limit_smc_hs = net->smc.limit_smc_hs; smc->use_fallback = false;/* assume rdma capability first */ smc->fallback_rsn =0 ; +smc_close_init (smc); } static struct sock *smc_sock_alloc(struct net *net, struct socket *sock,
@@ -1299,7 +1300,6 @@ static int smc_connect_rdma(struct smc_sock *smc, goto connect_abort; } -smc_close_init (smc);smc_rx_init (smc);if (ini->first_contact_local) {
@@ -1435,7 +1435,6 @@ static int smc_connect_ism(struct smc_sock *smc, goto connect_abort; } } -smc_close_init (smc);smc_rx_init (smc);smc_tx_init (smc);
@@ -2479,7 +2478,6 @@ static void smc_listen_work(struct work_struct *work) goto out_decl;mutex_lock (&smc_server_lgr_pending); -smc_close_init (new_smc);smc_rx_init (new_smc);smc_tx_init (new_smc);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 34/466 net/smc: fix LGR and link use-after-free issue
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wen Gu <[email protected]>
[ Upstream commit 2c7f14ed9c19ec0f149479d1c2842ec1f9bf76d7 ]
We encountered a LGR/link use-after-free issue, which manifested as the LGR/link refcnt reaching 0 early and entering the clear process, making resource access unsafe.
refcount_t: addition on 0; use-after-free.
WARNING: CPU: 14 PID: 107447 at lib/refcount.c:25 refcount_warn_saturate+0x9c/0x140 Workqueue: events smc_lgr_terminate_work [smc] Call trace: refcount_warn_saturate+0x9c/0x140 __smc_lgr_terminate.part.45+0x2a8/0x370 [smc] smc_lgr_terminate_work+0x28/0x30 [smc] process_one_work+0x1b8/0x420 worker_thread+0x158/0x510 kthread+0x114/0x118
or
refcount_t: underflow; use-after-free.
WARNING: CPU: 6 PID: 93140 at lib/refcount.c:28 refcount_warn_saturate+0xf0/0x140 Workqueue: smc_hs_wq smc_listen_work [smc] Call trace: refcount_warn_saturate+0xf0/0x140 smcr_link_put+0x1cc/0x1d8 [smc] smc_conn_free+0x110/0x1b0 [smc] smc_conn_abort+0x50/0x60 [smc] smc_listen_find_device+0x75c/0x790 [smc] smc_listen_work+0x368/0x8a0 [smc] process_one_work+0x1b8/0x420 worker_thread+0x158/0x510 kthread+0x114/0x118
It is caused by repeated release of LGR/link refcnt. One suspect is that smc_conn_free() is called repeatedly because some smc_conn_free() from server listening path are not protected by sock lock.
e.g.
Calls under socklock | smc_listen_work
-------------------------------------------------------
lock_sock(sk) | smc_conn_abort smc_conn_free | \- smc_conn_free \- smcr_link_put | \- smcr_link_put (duplicated)
release_sock(sk)
So here add sock lock protection in smc_listen_work() path, making it exclusive with other connection operations.
--- net/smc/af_smc.c | 2 ++ 1 file changed, 2 insertions(+)
net/smc/af_smc.c +2 -0
@@ -1900,6 +1900,7 @@ static void smc_listen_out(struct smc_sock *new_smc)if (tcp_sk (new_smc->clcsock->sk)->syn_smc)atomic_dec (&lsmc->queued_smc_hs); +release_sock (newsmcsk);/* lock in smc_listen_work() */ if (lsmc->sk.sk_state ==SMC_LISTEN ) {lock_sock_nested (&lsmc->sk,SINGLE_DEPTH_NESTING );smc_accept_enqueue (&lsmc->sk, newsmcsk);
@@ -2421,6 +2422,7 @@ static void smc_listen_work(struct work_struct *work)u8 accept_version;int rc =0 ; +lock_sock (&new_smc->sk);/* release in smc_listen_out() */ if (new_smc->listen_smc->sk.sk_state !=SMC_LISTEN )return smc_listen_out_err (new_smc);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 35/466 net/qed: allow old cards not supporting "num_images" to work
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Louis Leseur <[email protected]>
[ Upstream commit 7a0ea70da56ee8c2716d0b79e9959d3c47efab62 ]
Commit 43645ce03e00 ("qed: Populate nvm image attribute shadow.") added support for populating flash image attributes, notably "num_images". However, some cards were not able to return this information. In such cases, the driver would return EINVAL, causing the driver to exit.
Add check to return EOPNOTSUPP instead of EINVAL when the card is not able to return these information. The caller function already handles EOPNOTSUPP without error.
--- drivers/net/ethernet/qlogic/qed/qed_mcp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/qlogic/qed/qed_mcp.c +3 -1
@@ -3314,7 +3314,9 @@ int qed_mcp_bist_nvm_get_num_images(struct qed_hwfn *p_hwfn,if (rc)return rc; -if (((rsp &FW_MSG_CODE_MASK ) !=FW_MSG_CODE_OK )) +if (((rsp &FW_MSG_CODE_MASK ) ==FW_MSG_CODE_UNSUPPORTED )) + rc = -EOPNOTSUPP ; +else if (((rsp &FW_MSG_CODE_MASK ) !=FW_MSG_CODE_OK )) rc = -EINVAL ;return rc;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 36/466 net: hsr: must allocate more bytes for RedBox support
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit af8edaeddbc52e53207d859c912b017fd9a77629 ]
Blamed commit forgot to change hsr_init_skb() to allocate larger skb for RedBox case.
Indeed, send_hsr_supervision_frame() will add
two additional components (struct hsr_sup_tlv
and struct hsr_sup_payload)
syzbot reported the following crash:
skbuff: skb_over_panic: text:ffffffff8afd4b0a len:34 put:6 head:ffff88802ad29e00 data:ffff88802ad29f22 tail:0x144 end:0x140 dev:gretap0
------------[ cut here ]------------ kernel BUG at net/core/skbuff.c:206 ! Oops: invalid opcode: 0000 [#1] PREEMPT SMP KASAN NOPTI CPU: 2 UID: 0 PID: 7611 Comm: syz-executor Not tainted 6.12.0-syzkaller #0 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 RIP: 0010:skb_panic+0x157/0x1d0 net/core/skbuff.c:206 Code: b6 04 01 84 c0 74 04 3c 03 7e 21 8b 4b 70 41 56 45 89 e8 48 c7 c7 a0 7d 9b 8c 41 57 56 48 89 ee 52 4c 89 e2 e8 9a 76 79 f8 90 <0f> 0b 4c 89 4c 24 10 48 89 54 24 08 48 89 34 24 e8 94 76 fb f8 4c RSP: 0018:ffffc90000858ab8 EFLAGS: 00010282 RAX: 0000000000000087 RBX: ffff8880598c08c0 RCX: ffffffff816d3e69 RDX: 0000000000000000 RSI: ffffffff816de786 RDI: 0000000000000005 RBP: ffffffff8c9b91c0 R08: 0000000000000005 R09: 0000000000000000 R10: 0000000000000302 R11: ffffffff961cc1d0 R12: ffffffff8afd4b0a R13: 0000000000000006 R14: ffff88804b938130 R15: 0000000000000140 FS: 000055558a3d6500(0000) GS:ffff88806a800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f1295974ff8 CR3: 000000002ab6e000 CR4: 0000000000352ef0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <IRQ> skb_over_panic net/core/skbuff.c:211 [inline] skb_put+0x174/0x1b0 net/core/skbuff.c:2617 send_hsr_supervision_frame+0x6fa/0x9e0 net/hsr/hsr_device.c:342 hsr_proxy_announce+0x1a3/0x4a0 net/hsr/hsr_device.c:436 call_timer_fn+0x1a0/0x610 kernel/time/timer.c:1794 expire_timers kernel/time/timer.c:1845 [inline] __run_timers+0x6e8/0x930 kernel/time/timer.c:2419 __run_timer_base kernel/time/timer.c:2430 [inline] __run_timer_base kernel/time/timer.c:2423 [inline] run_timer_base+0x111/0x190 kernel/time/timer.c:2439 run_timer_softirq+0x1a/0x40 kernel/time/timer.c:2449 handle_softirqs+0x213/0x8f0 kernel/softirq.c:554 __do_softirq kernel/softirq.c:588 [inline] invoke_softirq kernel/softirq.c:428 [inline] __irq_exit_rcu kernel/softirq.c:637 [inline] irq_exit_rcu+0xbb/0x120 kernel/softirq.c:649 instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1049 [inline] sysvec_apic_timer_interrupt+0xa4/0xc0 arch/x86/kernel/apic/apic.c:1049 </IRQ>
--- net/hsr/hsr_device.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
net/hsr/hsr_device.c +13 -6
@@ -246,20 +246,22 @@ static const struct header_ops hsr_header_ops = { .parse = eth_header_parse, }; -static struct sk_buff *hsr_init_skb (struct hsr_port *master) +static struct sk_buff *hsr_init_skb (struct hsr_port *master,int extra) {struct hsr_priv *hsr = master->hsr;struct sk_buff *skb;int hlen, tlen; +int len; hlen =LL_RESERVED_SPACE (master->dev); tlen = master->dev->needed_tailroom; + len =sizeof (struct hsr_sup_tag ) +sizeof (struct hsr_sup_payload );/* skb size is same for PRP/HSR frames, only difference * being, for PRP it is a trailer and for HSR it is a -* header +* header. +* RedBox might use @extra more bytes. */ - skb =dev_alloc_skb (sizeof (struct hsr_sup_tag ) + -sizeof (struct hsr_sup_payload ) + hlen + tlen); + skb =dev_alloc_skb (len + extra + hlen + tlen);if (!skb)return skb;
@@ -295,6 +297,7 @@ static void send_hsr_supervision_frame(struct hsr_port *port,struct hsr_sup_tlv *hsr_stlv;struct hsr_sup_tag *hsr_stag;struct sk_buff *skb; +int extra =0 ; *interval =msecs_to_jiffies (HSR_LIFE_CHECK_INTERVAL );if (hsr->announce_count <3 && hsr->prot_version ==0 ) {
@@ -303,7 +306,11 @@ static void send_hsr_supervision_frame(struct hsr_port *port, hsr->announce_count++; } - skb =hsr_init_skb (port); +if (hsr->redbox) + extra =sizeof (struct hsr_sup_tlv ) + +sizeof (struct hsr_sup_payload ); + + skb =hsr_init_skb (port, extra);if (!skb) {netdev_warn_once (port->dev,"HSR: Could not send supervision frame\n" );return ;
@@ -362,7 +369,7 @@ static void send_prp_supervision_frame(struct hsr_port *master,struct hsr_sup_tag *hsr_stag;struct sk_buff *skb; - skb =hsr_init_skb (master); + skb =hsr_init_skb (master,0 );if (!skb) {netdev_warn_once (master->dev,"PRP: Could not send supervision frame\n" );return ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 37/466 ice: fix PHY Clock Recovery availability check
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arkadiusz Kubalewski <[email protected]>
[ Upstream commit 01fd68e54794fb1e1fe95be38facf9bbafee9ca3 ]
To check if PHY Clock Recovery mechanic is available for a device, there is a need to verify if given PHY is available within the netlist, but the netlist node type used for the search is wrong, also the search context shall be specified.
Modify the search function to allow specifying the context in the search.
Use the PHY node type instead of CLOCK CONTROLLER type, also use proper search context which for PHY search is PORT, as defined in E810 Datasheet [1] ('3.3.8.2.4 Node Part Number and Node Options (0x0003)' and 'Table 3-105. Program Topology Device NVM Admin Command').
[1] https://cdrdv2.intel.com/v1/dl/getContent/613875?explicitVersion=true
--- drivers/net/ethernet/intel/ice/ice_common.c | 25 ++++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-)
drivers/net/ethernet/intel/ice/ice_common.c +17 -8
@@ -542,7 +542,8 @@ ice_aq_get_netlist_node(struct ice_hw *hw, struct ice_aqc_get_link_topo *cmd,/** * ice_find_netlist_node * @hw: pointer to the hw struct -* @node_type_ctx: type of netlist node to look for +* @node_type: type of netlist node to look for +* @ctx: context of the search * @node_part_number: node part number to look for * @node_handle: output parameter if node found - optional *
@@ -552,10 +553,12 @@ ice_aq_get_netlist_node(struct ice_hw *hw, struct ice_aqc_get_link_topo *cmd,* valid if the function returns zero, and should be ignored on any non-zero * return value. * -* Returns: 0 if the node is found, -ENOENT if no handle was found, and -* a negative error code on failure to access the AQ. +* Return: +* * 0 if the node is found, +* * -ENOENT if no handle was found, +* * negative error code on failure to access the AQ. */ -static int ice_find_netlist_node (struct ice_hw *hw,u8 node_type_ctx, +static int ice_find_netlist_node (struct ice_hw *hw,u8 node_type,u8 ctx,u8 node_part_number,u16 *node_handle) {u8 idx;
@@ -566,8 +569,8 @@ static int ice_find_netlist_node(struct ice_hw *hw, u8 node_type_ctx,int status; cmd.addr.topo_params.node_type_ctx = -FIELD_PREP (ICE_AQC_LINK_TOPO_NODE_TYPE_M , - node_type_ctx); +FIELD_PREP (ICE_AQC_LINK_TOPO_NODE_TYPE_M , node_type) | +FIELD_PREP (ICE_AQC_LINK_TOPO_NODE_CTX_M , ctx); cmd.addr.topo_params.index = idx; status = ice_aq_get_netlist_node(hw, &cmd,
@@ -2726,9 +2729,11 @@ bool ice_is_pf_c827(struct ice_hw *hw)*/ bool ice_is_phy_rclk_in_netlist (struct ice_hw *hw) { -if (ice_find_netlist_node (hw,ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL , +if (ice_find_netlist_node (hw,ICE_AQC_LINK_TOPO_NODE_TYPE_PHY , +ICE_AQC_LINK_TOPO_NODE_CTX_PORT ,ICE_AQC_GET_LINK_TOPO_NODE_NR_C827 ,NULL ) && -ice_find_netlist_node (hw,ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL , +ice_find_netlist_node (hw,ICE_AQC_LINK_TOPO_NODE_TYPE_PHY , +ICE_AQC_LINK_TOPO_NODE_CTX_PORT ,ICE_AQC_GET_LINK_TOPO_NODE_NR_E822_PHY ,NULL ))return false;
@@ -2744,6 +2749,7 @@ bool ice_is_phy_rclk_in_netlist(struct ice_hw *hw)bool ice_is_clock_mux_in_netlist (struct ice_hw *hw) {if (ice_find_netlist_node (hw,ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_MUX , +ICE_AQC_LINK_TOPO_NODE_CTX_GLOBAL ,ICE_AQC_GET_LINK_TOPO_NODE_NR_GEN_CLK_MUX ,NULL ))return false;
@@ -2764,12 +2770,14 @@ bool ice_is_clock_mux_in_netlist(struct ice_hw *hw)bool ice_is_cgu_in_netlist (struct ice_hw *hw) {if (!ice_find_netlist_node (hw,ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL , +ICE_AQC_LINK_TOPO_NODE_CTX_GLOBAL ,ICE_AQC_GET_LINK_TOPO_NODE_NR_ZL30632_80032 ,NULL )) { hw->cgu_part_number =ICE_AQC_GET_LINK_TOPO_NODE_NR_ZL30632_80032 ;return true; }else if (!ice_find_netlist_node (hw,ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL , +ICE_AQC_LINK_TOPO_NODE_CTX_GLOBAL ,ICE_AQC_GET_LINK_TOPO_NODE_NR_SI5383_5384 ,NULL )) { hw->cgu_part_number =ICE_AQC_GET_LINK_TOPO_NODE_NR_SI5383_5384 ;
@@ -2788,6 +2796,7 @@ bool ice_is_cgu_in_netlist(struct ice_hw *hw)bool ice_is_gps_in_netlist (struct ice_hw *hw) {if (ice_find_netlist_node (hw,ICE_AQC_LINK_TOPO_NODE_TYPE_GPS , +ICE_AQC_LINK_TOPO_NODE_CTX_GLOBAL ,ICE_AQC_GET_LINK_TOPO_NODE_NR_GEN_GPS ,NULL ))return false;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 38/466 ice: fix PHY timestamp extraction for ETH56G
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Przemyslaw Korba <[email protected]>
[ Upstream commit 3214fae85e8336fe13e20cf78fc9b6a668bdedff ]
Fix incorrect PHY timestamp extraction for ETH56G. It's better to use FIELD_PREP() than manual shift.
--- drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 3 ++- drivers/net/ethernet/intel/ice/ice_ptp_hw.h | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/ice/ice_ptp_hw.c +2 -1
@@ -1495,7 +1495,8 @@ static int ice_read_ptp_tstamp_eth56g(struct ice_hw *hw, u8 port, u8 idx,* lower 8 bits in the low register, and the upper 32 bits in the high * register. */ - *tstamp = ((u64 )hi) <<TS_PHY_HIGH_S | ((u64 )lo &TS_PHY_LOW_M ); + *tstamp =FIELD_PREP (TS_PHY_HIGH_M , hi) | +FIELD_PREP (TS_PHY_LOW_M , lo);return 0 ; }
drivers/net/ethernet/intel/ice/ice_ptp_hw.h +2 -3
@@ -663,9 +663,8 @@ static inline u64 ice_get_base_incval(struct ice_hw *hw)#define TS_HIGH_M 0xFF#define TS_HIGH_S 32 -#define TS_PHY_LOW_M 0xFF -#define TS_PHY_HIGH_M 0xFFFFFFFF -#define TS_PHY_HIGH_S 8 +#define TS_PHY_LOW_M GENMASK(7, 0) +#define TS_PHY_HIGH_M GENMASK_ULL(39, 8)#define BYTES_PER_IDX_ADDR_L_U 8#define BYTES_PER_IDX_ADDR_L 4
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 39/466 ice: Fix VLAN pruning in switchdev mode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcin Szycik <[email protected]>
[ Upstream commit 761e0be2888a931465e0d7bbeecce797f9c311a3 ]
In switchdev mode the uplink VSI should receive all unmatched packets, including VLANs. Therefore, VLAN pruning should be disabled if uplink is in switchdev mode. It is already being done in ice_eswitch_setup_env(), however the addition of ice_up() in commit 44ba608db509 ("ice: do switchdev slow-path Rx using PF VSI") caused VLAN pruning to be re-enabled after disabling it.
Add a check to ice_set_vlan_filtering_features() to ensure VLAN filtering will not be enabled if uplink is in switchdev mode. Note that ice_is_eswitch_mode_switchdev() is being used instead of ice_is_switchdev_running(), as the latter would only return true after the whole switchdev setup completes.
--- drivers/net/ethernet/intel/ice/ice_main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/ice/ice_main.c +5 -3
@@ -6361,10 +6361,12 @@ ice_set_vlan_filtering_features(struct ice_vsi *vsi, netdev_features_t features)int err =0 ;/* support Single VLAN Mode (SVM) and Double VLAN Mode (DVM) by checking -* if either bit is set +* if either bit is set. In switchdev mode Rx filtering should never be +* enabled. */ -if (features & - (NETIF_F_HW_VLAN_CTAG_FILTER |NETIF_F_HW_VLAN_STAG_FILTER )) +if ((features & + (NETIF_F_HW_VLAN_CTAG_FILTER |NETIF_F_HW_VLAN_STAG_FILTER )) && + !ice_is_eswitch_mode_switchdev (vsi->back)) err = vlan_ops->ena_rx_filtering (vsi);else err = vlan_ops->dis_rx_filtering (vsi);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 40/466 idpf: set completion tag for "empty" bufs associated with a packet
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joshua Hay <[email protected]>
[ Upstream commit 4c69c77aafe74cf755af55070584b643e5c4e4d8 ]
Commit d9028db618a6 ("idpf: convert to libeth Tx buffer completion") inadvertently removed code that was necessary for the tx buffer cleaning routine to iterate over all buffers associated with a packet.
When a frag is too large for a single data descriptor, it will be split across multiple data descriptors. This means the frag will span multiple buffers in the buffer ring in order to keep the descriptor and buffer ring indexes aligned. The buffer entries in the ring are technically empty and no cleaning actions need to be performed. These empty buffers can precede other frags associated with the same packet. I.e. a single packet on the buffer ring can look like:
buf[0]=skb0.frag0 buf[1]=skb0.frag1 buf[2]=empty buf[3]=skb0.frag2
The cleaning routine iterates through these buffers based on a matching completion tag. If the completion tag is not set for buf2, the loop will end prematurely. Frag2 will be left uncleaned and next_to_clean will be left pointing to the end of packet, which will break the cleaning logic for subsequent cleans. This consequently leads to tx timeouts.
Assign the empty bufs the same completion tag for the packet to ensure the cleaning routine iterates over all of the buffers associated with the packet.
--- drivers/net/ethernet/intel/idpf/idpf_txrx.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/idpf/idpf_txrx.c +1 -0
@@ -2448,6 +2448,7 @@ static void idpf_tx_splitq_map(struct idpf_tx_queue *tx_q,* rest of the packet. */ tx_buf->type =LIBETH_SQE_EMPTY ; +idpf_tx_buf_compl_tag (tx_buf) = params->compl_tag;/* Adjust the DMA offset and the remaining size of the * fragment. On the first iteration of this loop,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 41/466 ixgbevf: stop attempting IPSEC offload on Mailbox API 1.5
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Keller <[email protected]>
[ Upstream commit d0725312adf5a803de8f621bd1b12ba7a6464a29 ]
Commit 339f28964147 ("ixgbevf: Add support for new mailbox communication between PF and VF") added support for v1.5 of the PF to VF mailbox communication API. This commit mistakenly enabled IPSEC offload for API v1.5.
No implementation of the v1.5 API has support for IPSEC offload. This offload is only supported by the Linux PF as mailbox API v1.4. In fact, the v1.5 API is not implemented in any Linux PF.
Attempting to enable IPSEC offload on a PF which supports v1.5 API will not work. Only the Linux upstream ixgbe and ixgbevf support IPSEC offload, and only as part of the v1.4 API.
Fix the ixgbevf Linux driver to stop attempting IPSEC offload when the mailbox API does not support it.
The existing API design choice makes it difficult to support future API versions, as other non-Linux hosts do not implement IPSEC offload. If we add support for v1.5 to the Linux PF, then we lose support for IPSEC offload.
A full solution likely requires a new mailbox API with a proper negotiation to check that IPSEC is actually supported by the host.
--- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/ethernet/intel/ixgbevf/ipsec.c +0 -1
@@ -629,7 +629,6 @@ void ixgbevf_init_ipsec_offload(struct ixgbevf_adapter *adapter)switch (adapter->hw.api_version) {case ixgbe_mbox_api_14: -case ixgbe_mbox_api_15:break ;default :return ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 42/466 ixgbe: downgrade logging of unsupported VF API version to debug
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Keller <[email protected]>
[ Upstream commit 15915b43a7fb938934bb7fc4290127218859d795 ]
The ixgbe PF driver logs an info message when a VF attempts to negotiate an API version which it does not support:
VF 0 requested invalid api version 6
The ixgbevf driver attempts to load with mailbox API v1.5, which is required for best compatibility with other hosts such as the ESX VMWare PF.
The Linux PF only supports API v1.4, and does not currently have support for the v1.5 API.
The logged message can confuse users, as the v1.5 API is valid, but just happens to not currently be supported by the Linux PF.
Downgrade the info message to a debug message, and fix the language to use 'unsupported' instead of 'invalid' to improve message clarity.
Long term, we should investigate whether the improvements in the v1.5 API make sense for the Linux PF, and if so implement them properly. This may require yet another API version to resolve issues with negotiating IPSEC offload support.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_common.h | 2 ++ drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_common.h +2 -0
@@ -194,6 +194,8 @@ u32 ixgbe_read_reg(struct ixgbe_hw *hw, u32 reg); dev_err(&adapter->pdev->dev, format, ## arg) #define e_dev_notice(format, arg...) \ dev_notice(&adapter->pdev->dev, format, ## arg) +#define e_dbg(msglvl, format, arg...) \ + netif_dbg(adapter, msglvl, adapter->netdev, format, ## arg) #define e_info(msglvl, format, arg...) \ netif_info(adapter, msglvl, adapter->netdev, format, ## arg) #define e_err(msglvl, format, arg...) \
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +1 -1
@@ -1047,7 +1047,7 @@ static int ixgbe_negotiate_vf_api(struct ixgbe_adapter *adapter,break ; } -e_info (drv,"VF %d requested invalid api version %u\n" , vf, api); +e_dbg (drv,"VF %d requested unsupported api version %u\n" , vf, api);return -1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 43/466 ixgbe: Correct BASE-BX10 compliance code
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tore Amundsen <[email protected]>
[ Upstream commit f72ce14b231f7bf06088e4e50f1875f1e35f79d7 ]
SFF-8472 (section 5.4 Transceiver Compliance Codes) defines bit 6 as BASE-BX10. Bit 6 means a value of 0x40 (decimal 64).
The current value in the source code is 0x64, which appears to be a mix-up of hex and decimal values. A value of 0x64 (binary 01100100) incorrectly sets bit 2 (1000BASE-CX) and bit 5 (100BASE-FX) as well.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h +1 -1
@@ -40,7 +40,7 @@#define IXGBE_SFF_1GBASESX_CAPABLE 0x1#define IXGBE_SFF_1GBASELX_CAPABLE 0x2#define IXGBE_SFF_1GBASET_CAPABLE 0x8 -#define IXGBE_SFF_BASEBX10_CAPABLE 0x64 +#define IXGBE_SFF_BASEBX10_CAPABLE 0x40#define IXGBE_SFF_10GBASESR_CAPABLE 0x10#define IXGBE_SFF_10GBASELR_CAPABLE 0x20#define IXGBE_SFF_SOFT_RS_SELECT_MASK 0x8
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 44/466 igb: Fix potential invalid memory access in igb_init_module()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Can <[email protected]>
[ Upstream commit 0566f83d206c7a864abcd741fe39d6e0ae5eef29 ]
The pci_register_driver() can fail and when this happened, the dca_notifier needs to be unregistered, otherwise the dca_notifier can be called when igb fails to install, resulting to invalid memory access.
--- drivers/net/ethernet/intel/igb/igb_main.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/intel/igb/igb_main.c +4 -0
@@ -637,6 +637,10 @@ static int __init igb_init_module(void)dca_register_notify (&dca_notifier);#endif ret =pci_register_driver (&igb_driver); +#ifdef CONFIG_IGB_DCA +if (ret) +dca_unregister_notify (&dca_notifier); +#endif return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 45/466 netfilter: nft_inner: incorrect percpu area handling under softirq
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 7b1d83da254be3bf054965c8f3b1ad976f460ae5 ]
Softirq can interrupt ongoing packet from process context that is walking over the percpu area that contains inner header offsets.
Disable bh and perform three checks before restoring the percpu inner header offsets to validate that the percpu area is valid for this skbuff:
1) If the NFT_PKTINFO_INNER_FULL flag is set on, then this skbuff has already been parsed before for inner header fetching to register.
2) Validate that the percpu area refers to this skbuff using the skbuff pointer as a cookie. If there is a cookie mismatch, then this skbuff needs to be parsed again.
3) Finally, validate if the percpu area refers to this tunnel type.
Only after these three checks the percpu area is restored to a on-stack copy and bh is enabled again.
After inner header fetching, the on-stack copy is stored back to the percpu area.
--- include/net/netfilter/nf_tables_core.h | 1 + net/netfilter/nft_inner.c | 57 ++++++++++++++++++++------ 2 files changed, 46 insertions(+), 12 deletions(-)
include/net/netfilter/nf_tables_core.h +1 -0
@@ -161,6 +161,7 @@ enum { };struct nft_inner_tun_ctx { +unsigned long cookie;u16 type;u16 inner_tunoff;u16 inner_lloff;
net/netfilter/nft_inner.c +45 -12
107 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 46/466 Revert "udp: avoid calling sock_def_readable() if possible"
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fernando Fernandez Mancera <[email protected]>
[ Upstream commit 3d501f562f63b290351169e3e9931ffe3d57b2ae ]
This reverts commit 612b1c0dec5bc7367f90fc508448b8d0d7c05414. On a scenario with multiple threads blocking on a recvfrom(), we need to call sock_def_readable() on every __udp_enqueue_schedule_skb() otherwise the threads won't be woken up as __skb_wait_for_more_packets() is using prepare_to_wait_exclusive().
--- net/ipv4/udp.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-)
net/ipv4/udp.c +3 -11
@@ -1516,7 +1516,6 @@ int __udp_enqueue_schedule_skb(struct sock *sk, struct sk_buff *skb)struct sk_buff_head *list = &sk->sk_receive_queue;int rmem, err = -ENOMEM ;spinlock_t *busy =NULL ; -bool becomes_readable;int size, rcvbuf;/* Immediately drop when the receive queue is full.
@@ -1557,19 +1556,12 @@ int __udp_enqueue_schedule_skb(struct sock *sk, struct sk_buff *skb)*/ sock_skb_set_dropcount (sk, skb); - becomes_readable =skb_queue_empty (list);__skb_queue_tail (list, skb);spin_unlock (&list->lock); -if (!sock_flag (sk,SOCK_DEAD )) { -if (becomes_readable || - sk->sk_data_ready != sock_def_readable || -READ_ONCE (sk->sk_peek_off) >=0 ) -INDIRECT_CALL_1 (sk->sk_data_ready, - sock_def_readable, sk); -else -sk_wake_async_rcu (sk,SOCK_WAKE_WAITD ,POLL_IN ); - } +if (!sock_flag (sk,SOCK_DEAD )) +INDIRECT_CALL_1 (sk->sk_data_ready, sock_def_readable, sk); +busylock_release (busy);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 47/466 net: sched: fix erspan_opt settings in cls_flower
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit 292207809486d99c78068d3f459cbbbffde88415 ]
When matching erspan_opt in cls_flower, only the (version, dir, hwid) fields are relevant. However, in fl_set_erspan_opt() it initializes all bits of erspan_opt and its mask to 1. This inadvertently requires packets to match not only the (version, dir, hwid) fields but also the other fields that are unexpectedly set to 1.
This patch resolves the issue by ensuring that only the (version, dir, hwid) fields are configured in fl_set_erspan_opt(), leaving the other fields to 0 in erspan_opt.
--- net/sched/cls_flower.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/sched/cls_flower.c +3 -2
@@ -1369,7 +1369,6 @@ static int fl_set_erspan_opt(const struct nlattr *nla, struct fl_flow_key *key,int err; md = (struct erspan_metadata *)&key->enc_opts.data[key->enc_opts.len]; -memset (md,0xff ,sizeof (*md)); md->version =1 ;if (!depth)
@@ -1398,9 +1397,9 @@ static int fl_set_erspan_opt(const struct nlattr *nla, struct fl_flow_key *key,NL_SET_ERR_MSG (extack,"Missing tunnel key erspan option index" );return -EINVAL ; } +memset (&md->u.index,0xff ,sizeof (md->u.index));if (tb[TCA_FLOWER_KEY_ENC_OPT_ERSPAN_INDEX ]) { nla = tb[TCA_FLOWER_KEY_ENC_OPT_ERSPAN_INDEX ]; -memset (&md->u,0x00 ,sizeof (md->u)); md->u.index =nla_get_be32 (nla); } }else if (md->version ==2 ) {
@@ -1409,10 +1408,12 @@ static int fl_set_erspan_opt(const struct nlattr *nla, struct fl_flow_key *key,NL_SET_ERR_MSG (extack,"Missing tunnel key erspan option dir or hwid" );return -EINVAL ; } + md->u.md2.dir =1 ;if (tb[TCA_FLOWER_KEY_ENC_OPT_ERSPAN_DIR ]) { nla = tb[TCA_FLOWER_KEY_ENC_OPT_ERSPAN_DIR ]; md->u.md2.dir =nla_get_u8 (nla); } +set_hwid (&md->u.md2,0xff );if (tb[TCA_FLOWER_KEY_ENC_OPT_ERSPAN_HWID ]) { nla = tb[TCA_FLOWER_KEY_ENC_OPT_ERSPAN_HWID ];set_hwid (&md->u.md2,nla_get_u8 (nla));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 48/466 netfilter: ipset: Hold module reference while requesting a module
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Sutter <[email protected]>
[ Upstream commit 456f010bfaefde84d3390c755eedb1b0a5857c3c ]
User space may unload ip_set.ko while it is itself requesting a set type backend module, leading to a kernel crash. The race condition may be provoked by inserting an mdelay() right after the nfnl_unlock() call.
--- net/netfilter/ipset/ip_set_core.c | 5 +++++ 1 file changed, 5 insertions(+)
net/netfilter/ipset/ip_set_core.c +5 -0
@@ -104,14 +104,19 @@ find_set_type(const char *name, u8 family, u8 revision)static bool load_settype (const char *name) { +if (!try_module_get (THIS_MODULE )) +return false; +nfnl_unlock (NFNL_SUBSYS_IPSET );pr_debug ("try to load ip_set_%s\n" , name);if (request_module ("ip_set_%s" , name) <0 ) {pr_warn ("Can't find ip_set type %s\n" , name);nfnl_lock (NFNL_SUBSYS_IPSET ); +module_put (THIS_MODULE );return false; }nfnl_lock (NFNL_SUBSYS_IPSET ); +module_put (THIS_MODULE );return true; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 49/466 netfilter: nft_set_hash: skip duplicated elements pending gc run
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 7ffc7481153bbabf3332c6a19b289730c7e1edf5 ]
rhashtable does not provide stable walk, duplicated elements are possible in case of resizing. I considered that checking for errors when calling rhashtable_walk_next() was sufficient to detect the resizing. However, rhashtable_walk_next() returns -EAGAIN only at the end of the iteration, which is too late, because a gc work containing duplicated elements could have been already scheduled for removal to the worker.
Add a u32 gc worker sequence number per set, bump it on every workqueue run. Annotate gc worker sequence number on the expired element. Use it to skip those already seen in this gc workqueue run.
Note that this new field is never reset in case gc transaction fails, so next gc worker run on the expired element overrides it. Wraparound of gc worker sequence number should not be an issue with stale gc worker sequence number in the element, that would just postpone the element removal in one gc run.
Note that it is not possible to use flags to annotate that element is pending gc run to detect duplicates, given that gc transaction can be invalidated in case of update from the control plane, therefore, not allowing to clear such flag.
On x86_64, pahole reports no changes in the size of nft_rhash_elem.
--- net/netfilter/nft_set_hash.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
net/netfilter/nft_set_hash.c +16 -0
@@ -24,11 +24,13 @@struct nft_rhash {struct rhashtable ht;struct delayed_work gc_work; +u32 wq_gc_seq; };struct nft_rhash_elem {struct nft_elem_priv priv;struct rhash_head node; +u32 wq_gc_seq;struct nft_set_ext ext; };
@@ -338,6 +340,10 @@ static void nft_rhash_gc(struct work_struct *work)if (!gc) goto done; +/* Elements never collected use a zero gc worker sequence number. */ +if (unlikely (++priv->wq_gc_seq ==0 )) + priv->wq_gc_seq++; +rhashtable_walk_enter (&priv->ht, &hti);rhashtable_walk_start (&hti);
@@ -355,6 +361,14 @@ static void nft_rhash_gc(struct work_struct *work) goto try_later; } +/* rhashtable walk is unstable, already seen in this gc run? +* Then, skip this element. In case of (unlikely) sequence +* wraparound and stale element wq_gc_seq, next gc run will +* just find this expired element. +*/ +if (he->wq_gc_seq == priv->wq_gc_seq) +continue ; +if (nft_set_elem_is_dead (&he->ext)) goto dead_elem;
@@ -371,6 +385,8 @@ static void nft_rhash_gc(struct work_struct *work)if (!gc) goto try_later; +/* annotate gc sequence for this attempt. */ + he->wq_gc_seq = priv->wq_gc_seq;nft_trans_gc_elem_add (gc, he); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 50/466 ethtool: Fix wrong mod state in case of verbose and no_mask bitset
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kory Maincent <[email protected]>
[ Upstream commit 910c4788d6155b2202ec88273376cd7ecdc24f0a ]
A bitset without mask in a _SET request means we want exactly the bits in the bitset to be set. This works correctly for compact format but when verbose format is parsed, ethnl_update_bitset32_verbose() only sets the bits present in the request bitset but does not clear the rest. The commit 6699170376ab ("ethtool: fix application of verbose no_mask bitset") fixes this issue by clearing the whole target bitmap before we start iterating. The solution proposed brought an issue with the behavior of the mod variable. As the bitset is always cleared the old value will always differ to the new value.
Fix it by adding a new function to compare bitmaps and a temporary variable which save the state of the old bitmap.
--- net/ethtool/bitset.c | 48 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-)
net/ethtool/bitset.c +44 -4
@@ -425,12 +425,32 @@ static int ethnl_parse_bit(unsigned int *index, bool *val, unsigned int nbits,return 0 ; } +/** +* ethnl_bitmap32_equal() - Compare two bitmaps +* @map1: first bitmap +* @map2: second bitmap +* @nbits: bit size to compare +* +* Return: true if first @nbits are equal, false if not +*/ +static bool ethnl_bitmap32_equal (const u32 *map1,const u32 *map2, +unsigned int nbits) +{ +if (memcmp (map1, map2, nbits /32 *sizeof (u32))) +return false; +if (nbits %32 ==0 ) +return true; +return !((map1[nbits /32 ] ^ map2[nbits /32 ]) & +ethnl_lower_bits (nbits %32 )); +} +static int ethnl_update_bitset32_verbose (u32 *bitmap,unsigned int nbits,const struct nlattr *attr,struct nlattr **tb,ethnl_string_array_t names,struct netlink_ext_ack *extack,bool *mod) { +u32 *saved_bitmap =NULL ;struct nlattr *bit_attr;bool no_mask;int rem;
@@ -448,8 +468,20 @@ ethnl_update_bitset32_verbose(u32 *bitmap, unsigned int nbits, } no_mask = tb[ETHTOOL_A_BITSET_NOMASK ]; -if (no_mask) -ethnl_bitmap32_clear (bitmap,0 , nbits, mod); +if (no_mask) { +unsigned int nwords =DIV_ROUND_UP (nbits,32 ); +unsigned int nbytes = nwords *sizeof (u32); +bool dummy; + +/* The bitmap size is only the size of the map part without +* its mask part. +*/ + saved_bitmap =kcalloc (nwords,sizeof (u32),GFP_KERNEL ); +if (!saved_bitmap) +return -ENOMEM ; +memcpy (saved_bitmap, bitmap, nbytes); +ethnl_bitmap32_clear (bitmap,0 , nbits, &dummy); + }nla_for_each_nested (bit_attr, tb[ETHTOOL_A_BITSET_BITS ], rem) {bool old_val, new_val;
@@ -458,22 +490,30 @@ ethnl_update_bitset32_verbose(u32 *bitmap, unsigned int nbits,if (nla_type (bit_attr) !=ETHTOOL_A_BITSET_BITS_BIT ) {NL_SET_ERR_MSG_ATTR (extack, bit_attr,"only ETHTOOL_A_BITSET_BITS_BIT allowed in ETHTOOL_A_BITSET_BITS" ); +kfree (saved_bitmap);return -EINVAL ; } ret =ethnl_parse_bit (&idx, &new_val, nbits, bit_attr, no_mask, names, extack); -if (ret <0 ) +if (ret <0 ) { +kfree (saved_bitmap);return ret; + } old_val = bitmap[idx /32 ] & ((u32 )1 << (idx %32 ));if (new_val != old_val) {if (new_val) bitmap[idx /32 ] |= ((u32 )1 << (idx %32 ));else bitmap[idx /32 ] &= ~((u32 )1 << (idx %32 )); - *mod = true; +if (!no_mask) + *mod = true; } } +if (no_mask && !ethnl_bitmap32_equal (saved_bitmap, bitmap, nbits)) + *mod = true; + +kfree (saved_bitmap);return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 51/466 mlxsw: spectrum_acl_flex_keys: Constify struct mlxsw_afk_element_inst
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit bec2a32145d5cc066df29182fa0e5b0d4329b1a1 ]
'struct mlxsw_afk_element_inst' are not modified in these drivers.
Constifying these structures moves some data to a read-only section, so increases overall security.
Update a few functions and struct mlxsw_afk_block accordingly.
On a x86_64, with allmodconfig, as an example:
Before:
======
text data bss dec hex filename
4278 4032 0 8310 2076 drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.o
After:
=====
text data bss dec hex filename
7934 352 0 8286 205e drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.o
Stable-dep-of: 217bbf156f93 ("mlxsw: spectrum_acl_flex_keys: Use correct key block on Spectrum-4")
--- .../mellanox/mlxsw/core_acl_flex_keys.c | 6 +- .../mellanox/mlxsw/core_acl_flex_keys.h | 2 +- .../mellanox/mlxsw/spectrum_acl_flex_keys.c | 66 +++++++++---------- 3 files changed, 37 insertions(+), 37 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c +3 -3
@@ -67,7 +67,7 @@ static bool mlxsw_afk_blocks_check(struct mlxsw_afk *mlxsw_afk)for (j =0 ; j < block->instances_count; j++) {const struct mlxsw_afk_element_info *elinfo; -struct mlxsw_afk_element_inst *elinst; +const struct mlxsw_afk_element_inst *elinst; elinst = &block->instances[j]; elinfo = &mlxsw_afk_element_infos[elinst->element];
@@ -154,7 +154,7 @@ static void mlxsw_afk_picker_count_hits(struct mlxsw_afk *mlxsw_afk,const struct mlxsw_afk_block *block = &mlxsw_afk->blocks[i];for (j =0 ; j < block->instances_count; j++) { -struct mlxsw_afk_element_inst *elinst; +const struct mlxsw_afk_element_inst *elinst; elinst = &block->instances[j];if (elinst->element == element) {
@@ -386,7 +386,7 @@ mlxsw_afk_block_elinst_get(const struct mlxsw_afk_block *block,int i;for (i =0 ; i < block->instances_count; i++) { -struct mlxsw_afk_element_inst *elinst; +const struct mlxsw_afk_element_inst *elinst; elinst = &block->instances[i];if (elinst->element == element)
drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h +1 -1
@@ -117,7 +117,7 @@ struct mlxsw_afk_element_inst { /* element instance in actual block */struct mlxsw_afk_block {u16 encoding;/* block ID */ -struct mlxsw_afk_element_inst *instances; +const struct mlxsw_afk_element_inst *instances;unsigned int instances_count;bool high_entropy; };
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c +33 -33
215 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 52/466 mlxsw: spectrum_acl_flex_keys: Use correct key block on Spectrum-4
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 217bbf156f93ada86b91617489e7ba8a0904233c ]
The driver is currently using an ACL key block that is not supported by Spectrum-4. This works because the driver is only using a single field from this key block which is located in the same offset in the equivalent Spectrum-4 key block.
The issue was discovered when the firmware started rejecting the use of the unsupported key block. The change has been reverted to avoid breaking users that only update their firmware.
Nonetheless, fix the issue by using the correct key block.
--- .../net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c +5 -1
@@ -324,6 +324,10 @@ static const struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_5b[] = MLXSW_AFK_ELEMENT_INST_EXT_U32(SRC_SYS_PORT, 0x04, 0, 9, -1, true), /* RX_ACL_SYSTEM_PORT */ }; +static const struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_1b[] = { +MLXSW_AFK_ELEMENT_INST_BUF (SRC_IP_0_31 ,0x04 ,4 ), +}; +static const struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_5b[] = {MLXSW_AFK_ELEMENT_INST_U32 (VIRT_ROUTER ,0x04 ,20 ,12 ), };
@@ -341,7 +345,7 @@ static const struct mlxsw_afk_block mlxsw_sp4_afk_blocks[] = {MLXSW_AFK_BLOCK (0x14 , mlxsw_sp_afk_element_info_mac_4),MLXSW_AFK_BLOCK_HIGH_ENTROPY (0x1A , mlxsw_sp_afk_element_info_mac_5b),MLXSW_AFK_BLOCK_HIGH_ENTROPY (0x38 , mlxsw_sp_afk_element_info_ipv4_0), -MLXSW_AFK_BLOCK_HIGH_ENTROPY (0x39 , mlxsw_sp_afk_element_info_ipv4_1), +MLXSW_AFK_BLOCK_HIGH_ENTROPY (0x3F , mlxsw_sp_afk_element_info_ipv4_1b),MLXSW_AFK_BLOCK (0x3A , mlxsw_sp_afk_element_info_ipv4_2),MLXSW_AFK_BLOCK (0x36 , mlxsw_sp_afk_element_info_ipv4_5b), MLXSW_AFK_BLOCK(0x40, mlxsw_sp_afk_element_info_ipv6_0),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 53/466 geneve: do not assume mac header is set in geneve_xmit_skb()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 8588c99c7d47448fcae39e3227d6e2bb97aad86d ]
We should not assume mac header is set in output path.
Use skb_eth_hdr() instead of eth_hdr() to fix the issue.
sysbot reported the following :
WARNING: CPU: 0 PID: 11635 at include/linux/skbuff.h:3052 skb_mac_header include/linux/skbuff.h:3052 [inline] WARNING: CPU: 0 PID: 11635 at include/linux/skbuff.h:3052 eth_hdr include/linux/if_ether.h:24 [inline] WARNING: CPU: 0 PID: 11635 at include/linux/skbuff.h:3052 geneve_xmit_skb drivers/net/geneve.c:898 [inline] WARNING: CPU: 0 PID: 11635 at include/linux/skbuff.h:3052 geneve_xmit+0x4c38/0x5730 drivers/net/geneve.c:1039 Modules linked in: CPU: 0 UID: 0 PID: 11635 Comm: syz.4.1423 Not tainted 6.12.0-syzkaller-10296-gaaf20f870da0 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 RIP: 0010:skb_mac_header include/linux/skbuff.h:3052 [inline] RIP: 0010:eth_hdr include/linux/if_ether.h:24 [inline] RIP: 0010:geneve_xmit_skb drivers/net/geneve.c:898 [inline] RIP: 0010:geneve_xmit+0x4c38/0x5730 drivers/net/geneve.c:1039 Code: 21 c6 02 e9 35 d4 ff ff e8 a5 48 4c fb 90 0f 0b 90 e9 fd f5 ff ff e8 97 48 4c fb 90 0f 0b 90 e9 d8 f5 ff ff e8 89 48 4c fb 90 <0f> 0b 90 e9 41 e4 ff ff e8 7b 48 4c fb 90 0f 0b 90 e9 cd e7 ff ff RSP: 0018:ffffc90003b2f870 EFLAGS: 00010283 RAX: 000000000000037a RBX: 000000000000ffff RCX: ffffc9000dc3d000 RDX: 0000000000080000 RSI: ffffffff86428417 RDI: 0000000000000003 RBP: ffffc90003b2f9f0 R08: 0000000000000003 R09: 000000000000ffff R10: 000000000000ffff R11: 0000000000000002 R12: ffff88806603c000 R13: 0000000000000000 R14: ffff8880685b2780 R15: 0000000000000e23 FS: 00007fdc2deed6c0(0000) GS:ffff8880b8600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000001b30a1dff8 CR3: 0000000056b8c000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> __netdev_start_xmit include/linux/netdevice.h:5002 [inline] netdev_start_xmit include/linux/netdevice.h:5011 [inline] __dev_direct_xmit+0x58a/0x720 net/core/dev.c:4490 dev_direct_xmit include/linux/netdevice.h:3181 [inline] packet_xmit+0x1e4/0x360 net/packet/af_packet.c:285 packet_snd net/packet/af_packet.c:3146 [inline] packet_sendmsg+0x2700/0x5660 net/packet/af_packet.c:3178 sock_sendmsg_nosec net/socket.c:711 [inline] __sock_sendmsg net/socket.c:726 [inline] __sys_sendto+0x488/0x4f0 net/socket.c:2197 __do_sys_sendto net/socket.c:2204 [inline] __se_sys_sendto net/socket.c:2200 [inline] __x64_sys_sendto+0xe0/0x1c0 net/socket.c:2200 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f
--- drivers/net/geneve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/geneve.c +1 -1
@@ -895,7 +895,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,if (geneve->cfg.df ==GENEVE_DF_SET ) { df =htons (IP_DF ); }else if (geneve->cfg.df ==GENEVE_DF_INHERIT ) { -struct ethhdr *eth =eth_hdr (skb); +struct ethhdr *eth =skb_eth_hdr (skb);if (ntohs (eth->h_proto) ==ETH_P_IPV6 ) { df =htons (IP_DF );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 54/466 net/mlx5: HWS: Fix memory leak in mlx5hws_definer_calc_layout
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cosmin Ratiu <[email protected]>
[ Upstream commit 530b69a26952c95ffc9e6dcd1cff6f249032780a ]
It allocates a match template, which creates a compressed definer fc struct, but that is not deallocated.
This commit fixes that.
--- .../mellanox/mlx5/core/steering/hws/mlx5hws_bwc_complex.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_bwc_complex.c +2 -0
@@ -39,6 +39,8 @@ bool mlx5hws_bwc_match_params_is_complex(struct mlx5hws_context *ctx, }else {mlx5hws_err (ctx,"Failed to calculate matcher definer layout\n" ); } + }else { +kfree (mt->fc); }mlx5hws_match_template_destroy (mt);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 55/466 net/mlx5: HWS: Properly set bwc queue locks lock classes
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cosmin Ratiu <[email protected]>
[ Upstream commit 10e0f0c018d5ce5ba4f349875c67f99c3253b5c3 ]
The mentioned "Fixes" patch forgot to do that.
--- .../net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_send.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws_send.c +1 -0
@@ -990,6 +990,7 @@ static int hws_bwc_send_queues_init(struct mlx5hws_context *ctx)for (i =0 ; i < bwc_queues; i++) {mutex_init (&ctx->bwc_send_queue_locks[i]);lockdep_register_key (ctx->bwc_lock_class_keys + i); +lockdep_set_class (ctx->bwc_send_queue_locks + i, ctx->bwc_lock_class_keys + i); }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 56/466 net/mlx5e: SD, Use correct mdev to build channel param
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tariq Toukan <[email protected]>
[ Upstream commit 31f114c3d158dacbeda33f2afb0ca41f4ec6c9f9 ]
In a multi-PF netdev, each traffic channel creates its own resources against a specific PF.
In the cited commit, where this support was added, the channel_param logic was mistakenly kept unchanged, so it always used the primary PF which is found at priv->mdev.
In this patch we fix this by moving the logic to be per-channel, and passing the correct mdev instance.
This bug happened to be usually harmless, as the resulting cparam structures would be the same for all channels, due to identical FW logic and decisions.
However, in some use cases, like fwreset, this gets broken.
This could lead to different symptoms. Example:
Error cqe on cqn 0x428, ci 0x0, qn 0x10a9, opcode 0xe, syndrome 0x4, vendor syndrome 0x32
--- .../net/ethernet/mellanox/mlx5/core/en_main.c | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +17 -15
@@ -2652,11 +2652,11 @@ void mlx5e_trigger_napi_sched(struct napi_struct *napi)static int mlx5e_open_channel (struct mlx5e_priv *priv,int ix,struct mlx5e_params *params, -struct mlx5e_channel_param *cparam,struct xsk_buff_pool *xsk_pool,struct mlx5e_channel **cp) {struct net_device *netdev = priv->netdev; +struct mlx5e_channel_param *cparam;struct mlx5_core_dev *mdev;struct mlx5e_xsk_param xsk;struct mlx5e_channel *c;
@@ -2678,8 +2678,15 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,return err; c =kvzalloc_node (sizeof (*c),GFP_KERNEL ,cpu_to_node (cpu)); -if (!c) -return -ENOMEM ; + cparam =kvzalloc (sizeof (*cparam),GFP_KERNEL ); +if (!c || !cparam) { + err = -ENOMEM ; + goto err_free; + } + + err =mlx5e_build_channel_param (mdev, params, cparam); +if (err) + goto err_free; c->priv = priv; c->mdev = mdev;
@@ -2713,6 +2720,7 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix, *cp = c; +kvfree (cparam);return 0 ; err_close_queues:
@@ -2721,6 +2729,8 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix, err_napi_del:netif_napi_del (&c->napi); +err_free: +kvfree (cparam);kvfree (c);return err;
@@ -2779,20 +2789,14 @@ static void mlx5e_close_channel(struct mlx5e_channel *c)int mlx5e_open_channels (struct mlx5e_priv *priv,struct mlx5e_channels *chs) { -struct mlx5e_channel_param *cparam;int err = -ENOMEM ;int i; chs->num = chs->params.num_channels; chs->c =kcalloc (chs->num,sizeof (struct mlx5e_channel *),GFP_KERNEL ); - cparam =kvzalloc (sizeof (struct mlx5e_channel_param ),GFP_KERNEL ); -if (!chs->c || !cparam) - goto err_free; - - err =mlx5e_build_channel_param (priv->mdev, &chs->params, cparam); -if (err) - goto err_free; +if (!chs->c) + goto err_out;for (i =0 ; i < chs->num; i++) {struct xsk_buff_pool *xsk_pool =NULL ;
@@ -2800,7 +2804,7 @@ int mlx5e_open_channels(struct mlx5e_priv *priv,if (chs->params.xdp_prog) xsk_pool =mlx5e_xsk_get_pool (&chs->params, chs->params.xsk, i); - err =mlx5e_open_channel (priv, i, &chs->params, cparam, xsk_pool, &chs->c[i]); + err =mlx5e_open_channel (priv, i, &chs->params, xsk_pool, &chs->c[i]);if (err) goto err_close_channels; }
@@ -2818,7 +2822,6 @@ int mlx5e_open_channels(struct mlx5e_priv *priv, }mlx5e_health_channels_update (priv); -kvfree (cparam);return 0 ; err_close_ptp:
@@ -2829,9 +2832,8 @@ int mlx5e_open_channels(struct mlx5e_priv *priv,for (i--; i >=0 ; i--)mlx5e_close_channel (chs->c[i]); -err_free:kfree (chs->c); -kvfree (cparam); +err_out: chs->num =0 ;return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 57/466 net/mlx5e: Remove workaround to avoid syndrome for internal port
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jianbo Liu <[email protected]>
[ Upstream commit 5085f861b414e4a51ce28a891dfa32a10a54b64e ]
Previously a workaround was added to avoid syndrome 0xcdb051. It is triggered when offload a rule with tunnel encapsulation, and forwarding to another table, but not matching on the internal port in firmware steering mode. The original workaround skips internal tunnel port logic, which is not correct as not all cases are considered. As an example, if vlan is configured on the uplink port, traffic can't pass because vlan header is not added with this workaround. Besides, there is no such issue for software steering. So, this patch removes that, and returns error directly if trying to offload such rule for firmware steering.
--- .../ethernet/mellanox/mlx5/core/en/tc_tun_encap.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c +11 -2
@@ -5,6 +5,7 @@#include <net/nexthop.h> #include <net/ip_tunnels.h> #include "tc_tun_encap.h" +#include "fs_core.h" #include "en_tc.h" #include "tc_tun.h" #include "rep/tc.h"
@@ -24,10 +25,18 @@ static int mlx5e_set_int_port_tunnel(struct mlx5e_priv *priv, route_dev =dev_get_by_index (dev_net (e->out_dev), e->route_dev_ifindex); -if (!route_dev || !netif_is_ovs_master (route_dev) || - attr->parse_attr->filter_dev == e->out_dev) +if (!route_dev || !netif_is_ovs_master (route_dev)) goto out; +if (priv->mdev->priv.steering->mode ==MLX5_FLOW_STEERING_MODE_DMFS && +mlx5e_eswitch_uplink_rep (attr->parse_attr->filter_dev) && + (attr->esw_attr->dests[out_index].flags &MLX5_ESW_DEST_ENCAP )) { +mlx5_core_warn (priv->mdev, +"Matching on external port with encap + fwd to table actions is not allowed for firmware steering\n" ); + err = -EINVAL ; + goto out; + } + err =mlx5e_set_fwd_to_int_port_actions (priv, attr, e->route_dev_ifindex,MLX5E_TC_INT_PORT_EGRESS , &attr->action, out_index);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 58/466 vsock/test: fix failures due to wrong SO_RCVLOWAT parameter
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Shkolnyy <[email protected]>
[ Upstream commit 7ce1c0921a806ee7d4bb24f74a3b30c89fc5fb39 ]
This happens on 64-bit big-endian machines.SO_RCVLOWAT requires an int parameter. However, instead of int, the test uses unsigned long in one place and size_t in another. Both are 8 bytes long on 64-bit machines. The kernel, having received the 8 bytes, doesn't test for the exact size of the parameter, it only cares that it's >= sizeof(int), and casts the 4 lower-addressed bytes to an int, which, on a big-endian machine, contains 0. 0 doesn't trigger an error, SO_RCVLOWAT returns with success and the socket stays with the default SO_RCVLOWAT = 1, which results in vsock_test failures, while vsock_perf doesn't even notice that it's failed to change it.
--- tools/testing/vsock/vsock_perf.c | 6 +++--- tools/testing/vsock/vsock_test.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-)
tools/testing/vsock/vsock_perf.c +3 -3
@@ -133,7 +133,7 @@ static float get_gbps(unsigned long bits, time_t ns_delta) ((float )ns_delta /NSEC_PER_SEC ); } -static void run_receiver (unsigned long rcvlowat_bytes) +static void run_receiver (int rcvlowat_bytes) {unsigned int read_cnt;time_t rx_begin_ns;
@@ -163,7 +163,7 @@ static void run_receiver(unsigned long rcvlowat_bytes)printf ("Listen port %u\n" , port);printf ("RX buffer %lu bytes\n" , buf_size_bytes);printf ("vsock buffer %lu bytes\n" , vsock_buf_bytes); -printf ("SO_RCVLOWAT %lu bytes\n" , rcvlowat_bytes); +printf ("SO_RCVLOWAT %d bytes\n" , rcvlowat_bytes); fd =socket (AF_VSOCK ,SOCK_STREAM ,0 );
@@ -439,7 +439,7 @@ static long strtolx(const char *arg)int main (int argc,char **argv) {unsigned long to_send_bytes =DEFAULT_TO_SEND_BYTES ; -unsigned long rcvlowat_bytes =DEFAULT_RCVLOWAT_BYTES ; +int rcvlowat_bytes =DEFAULT_RCVLOWAT_BYTES ;int peer_cid =-1 ;bool sender = false;
tools/testing/vsock/vsock_test.c +2 -2
@@ -835,7 +835,7 @@ static void test_stream_poll_rcvlowat_server(const struct test_opts *opts)static void test_stream_poll_rcvlowat_client (const struct test_opts *opts) { -unsigned long lowat_val =RCVLOWAT_BUF_SIZE ; +int lowat_val =RCVLOWAT_BUF_SIZE ;char buf[RCVLOWAT_BUF_SIZE ];struct pollfd fds;short poll_flags;
@@ -1357,7 +1357,7 @@ static void test_stream_rcvlowat_def_cred_upd_client(const struct test_opts *optstatic void test_stream_credit_update_test (const struct test_opts *opts,bool low_rx_bytes_test) { -size_t recv_buf_size; +int recv_buf_size;struct pollfd fds;size_t buf_size;void *buf;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 59/466 vsock/test: fix parameter types in SO_VM_SOCKETS_* calls
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Shkolnyy <[email protected]>
[ Upstream commit 3f36ee29e732b68044d531f47d31f22d265954c6 ]
Change parameters of SO_VM_SOCKETS_* to unsigned long long as documented in the vm_sockets.h, because the corresponding kernel code requires them to be at least 64-bit, no matter what architecture. Otherwise they are too small on 32-bit machines.
--- tools/testing/vsock/vsock_perf.c | 4 ++-- tools/testing/vsock/vsock_test.c | 22 +++++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-)
tools/testing/vsock/vsock_perf.c +2 -2
@@ -33,7 +33,7 @@static unsigned int port =DEFAULT_PORT ;static unsigned long buf_size_bytes =DEFAULT_BUF_SIZE_BYTES ; -static unsigned long vsock_buf_bytes =DEFAULT_VSOCK_BUF_BYTES ; +static unsigned long long vsock_buf_bytes =DEFAULT_VSOCK_BUF_BYTES ;static bool zerocopy;static void error (const char *s)
@@ -162,7 +162,7 @@ static void run_receiver(int rcvlowat_bytes)printf ("Run as receiver\n" );printf ("Listen port %u\n" , port);printf ("RX buffer %lu bytes\n" , buf_size_bytes); -printf ("vsock buffer %lu bytes\n" , vsock_buf_bytes); +printf ("vsock buffer %llu bytes\n" , vsock_buf_bytes);printf ("SO_RCVLOWAT %d bytes\n" , rcvlowat_bytes); fd =socket (AF_VSOCK ,SOCK_STREAM ,0 );
tools/testing/vsock/vsock_test.c +17 -5
@@ -429,7 +429,7 @@ static void test_seqpacket_msg_bounds_client(const struct test_opts *opts)static void test_seqpacket_msg_bounds_server (const struct test_opts *opts) { -unsigned long sock_buf_size; +unsigned long long sock_buf_size;unsigned long remote_hash;unsigned long curr_hash;int fd;
@@ -634,7 +634,8 @@ static void test_seqpacket_timeout_server(const struct test_opts *opts)static void test_seqpacket_bigmsg_client (const struct test_opts *opts) { -unsigned long sock_buf_size; +unsigned long long sock_buf_size; +size_t buf_size;socklen_t len;void *data;int fd;
@@ -655,13 +656,20 @@ static void test_seqpacket_bigmsg_client(const struct test_opts *opts) sock_buf_size++; - data =malloc (sock_buf_size); +/* size_t can be < unsigned long long */ + buf_size = (size_t )sock_buf_size; +if (buf_size != sock_buf_size) { +fprintf (stderr,"Returned BUFFER_SIZE too large\n" ); +exit (EXIT_FAILURE ); + } + + data =malloc (buf_size);if (!data) {perror ("malloc" );exit (EXIT_FAILURE ); } -send_buf (fd, data, sock_buf_size,0 , -EMSGSIZE ); +send_buf (fd, data, buf_size,0 , -EMSGSIZE );control_writeln ("CLISENT" );
@@ -1360,6 +1368,7 @@ static void test_stream_credit_update_test(const struct test_opts *opts,int recv_buf_size;struct pollfd fds;size_t buf_size; +unsigned long long sock_buf_size;void *buf;int fd;
@@ -1371,8 +1380,11 @@ static void test_stream_credit_update_test(const struct test_opts *opts, buf_size =RCVLOWAT_CREDIT_UPD_BUF_SIZE ; +/* size_t can be < unsigned long long */ + sock_buf_size = buf_size; +if (setsockopt (fd,AF_VSOCK ,SO_VM_SOCKETS_BUFFER_SIZE , - &buf_size,sizeof (buf_size))) { + &sock_buf_size,sizeof (sock_buf_size))) {perror ("setsockopt(SO_VM_SOCKETS_BUFFER_SIZE)" );exit (EXIT_FAILURE ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 60/466 net: avoid potential UAF in default_operstate()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 750e51603395e755537da08f745864c93e3ce741 ]
syzbot reported an UAF in default_operstate() [1]
Issue is a race between device and netns dismantles.
After calling __rtnl_unlock() from netdev_run_todo(), we can not assume the netns of each device is still alive.
Make sure the device is not in NETREG_UNREGISTERED state, and add an ASSERT_RTNL() before the call to __dev_get_by_index().
We might move this ASSERT_RTNL() in __dev_get_by_index() in the future.
[1]
BUG: KASAN: slab-use-after-free in __dev_get_by_index+0x5d/0x110 net/core/dev.c:852 Read of size 8 at addr ffff888043eba1b0 by task syz.0.0/5339 CPU: 0 UID: 0 PID: 5339 Comm: syz.0.0 Not tainted 6.12.0-syzkaller-10296-gaaf20f870da0 #0 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 Call Trace: <TASK> __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:378 [inline] print_report+0x169/0x550 mm/kasan/report.c:489 kasan_report+0x143/0x180 mm/kasan/report.c:602 __dev_get_by_index+0x5d/0x110 net/core/dev.c:852 default_operstate net/core/link_watch.c:51 [inline] rfc2863_policy+0x224/0x300 net/core/link_watch.c:67 linkwatch_do_dev+0x3e/0x170 net/core/link_watch.c:170 netdev_run_todo+0x461/0x1000 net/core/dev.c:10894 rtnl_unlock net/core/rtnetlink.c:152 [inline] rtnl_net_unlock include/linux/rtnetlink.h:133 [inline] rtnl_dellink+0x760/0x8d0 net/core/rtnetlink.c:3520 rtnetlink_rcv_msg+0x791/0xcf0 net/core/rtnetlink.c:6911 netlink_rcv_skb+0x1e3/0x430 net/netlink/af_netlink.c:2541 netlink_unicast_kernel net/netlink/af_netlink.c:1321 [inline] netlink_unicast+0x7f6/0x990 net/netlink/af_netlink.c:1347 netlink_sendmsg+0x8e4/0xcb0 net/netlink/af_netlink.c:1891 sock_sendmsg_nosec net/socket.c:711 [inline] __sock_sendmsg+0x221/0x270 net/socket.c:726 ____sys_sendmsg+0x52a/0x7e0 net/socket.c:2583 ___sys_sendmsg net/socket.c:2637 [inline] __sys_sendmsg+0x269/0x350 net/socket.c:2669 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f2a3cb80809 Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f2a3d9cd058 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 00007f2a3cd45fa0 RCX: 00007f2a3cb80809 RDX: 0000000000000000 RSI: 0000000020000000 RDI: 0000000000000008 RBP: 00007f2a3cbf393e R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000000 R14: 00007f2a3cd45fa0 R15: 00007ffd03bc65c8 </TASK> Allocated by task 5339: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3f/0x80 mm/kasan/common.c:68 poison_kmalloc_redzone mm/kasan/common.c:377 [inline] __kasan_kmalloc+0x98/0xb0 mm/kasan/common.c:394 kasan_kmalloc include/linux/kasan.h:260 [inline] __kmalloc_cache_noprof+0x243/0x390 mm/slub.c:4314 kmalloc_noprof include/linux/slab.h:901 [inline] kmalloc_array_noprof include/linux/slab.h:945 [inline] netdev_create_hash net/core/dev.c:11870 [inline] netdev_init+0x10c/0x250 net/core/dev.c:11890 ops_init+0x31e/0x590 net/core/net_namespace.c:138 setup_net+0x287/0x9e0 net/core/net_namespace.c:362 copy_net_ns+0x33f/0x570 net/core/net_namespace.c:500 create_new_namespaces+0x425/0x7b0 kernel/nsproxy.c:110 unshare_nsproxy_namespaces+0x124/0x180 kernel/nsproxy.c:228 ksys_unshare+0x57d/0xa70 kernel/fork.c:3314 __do_sys_unshare kernel/fork.c:3385 [inline] __se_sys_unshare kernel/fork.c:3383 [inline] __x64_sys_unshare+0x38/0x40 kernel/fork.c:3383 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 12: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3f/0x80 mm/kasan/common.c:68 kasan_save_free_info+0x40/0x50 mm/kasan/generic.c:582 poison_slab_object mm/kasan/common.c:247 [inline] __kasan_slab_free+0x59/0x70 mm/kasan/common.c:264 kasan_slab_free include/linux/kasan.h:233 [inline] slab_free_hook mm/slub.c:2338 [inline] slab_free mm/slub.c:4598 [inline] kfree+0x196/0x420 mm/slub.c:4746 netdev_exit+0x65/0xd0 net/core/dev.c:11992 ops_exit_list net/core/net_namespace.c:172 [inline] cleanup_net+0x802/0xcc0 net/core/net_namespace.c:632 process_one_work kernel/workqueue.c:3229 [inline] process_scheduled_works+0xa63/0x1850 kernel/workqueue.c:3310 worker_thread+0x870/0xd30 kernel/workqueue.c:3391 kthread+0x2f0/0x390 kernel/kthread.c:389 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244 The buggy address belongs to the object at ffff888043eba000 which belongs to the cache kmalloc-2k of size 2048
The buggy address is located 432 bytes inside of
freed 2048-byte region [ffff888043eba000, ffff888043eba800)
The buggy address belongs to the physical page: page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x43eb8 head: order:3 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0 flags: 0x4fff00000000040(head|node=1|zone=1|lastcpupid=0x7ff) page_type: f5(slab) raw: 04fff00000000040 ffff88801ac42000 dead000000000122 0000000000000000 raw: 0000000000000000 0000000000080008 00000001f5000000 0000000000000000
head: 04fff00000000040 ffff88801ac42000 dead000000000122 0000000000000000
head: 0000000000000000 0000000000080008 00000001f5000000 0000000000000000
head: 04fff00000000003 ffffea00010fae01 ffffffffffffffff 0000000000000000
head: 0000000000000008 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as allocated
page last allocated via order 3, migratetype Unmovable, gfp_mask 0xd20c0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC), pid 5339, tgid 5338 (syz.0.0), ts 69674195892, free_ts 69663220888
set_page_owner include/linux/page_owner.h:32 [inline]
post_alloc_hook+0x1f3/0x230 mm/page_alloc.c:1556
prep_new_page mm/page_alloc.c:1564 [inline]
get_page_from_freelist+0x3649/0x3790 mm/page_alloc.c:3474
__alloc_pages_noprof+0x292/0x710 mm/page_alloc.c:4751
alloc_pages_mpol_noprof+0x3e8/0x680 mm/mempolicy.c:2265
alloc_slab_page+0x6a/0x140 mm/slub.c:2408
allocate_slab+0x5a/0x2f0 mm/slub.c:2574
new_slab mm/slub.c:2627 [inline]
___slab_alloc+0xcd1/0x14b0 mm/slub.c:3815
__slab_alloc+0x58/0xa0 mm/slub.c:3905
__slab_alloc_node mm/slub.c:3980 [inline]
slab_alloc_node mm/slub.c:4141 [inline]
__do_kmalloc_node mm/slub.c:4282 [inline]
__kmalloc_noprof+0x2e6/0x4c0 mm/slub.c:4295
kmalloc_noprof include/linux/slab.h:905 [inline]
sk_prot_alloc+0xe0/0x210 net/core/sock.c:2165
sk_alloc+0x38/0x370 net/core/sock.c:2218
__netlink_create+0x65/0x260 net/netlink/af_netlink.c:629
__netlink_kernel_create+0x174/0x6f0 net/netlink/af_netlink.c:2015
netlink_kernel_create include/linux/netlink.h:62 [inline]
uevent_net_init+0xed/0x2d0 lib/kobject_uevent.c:783
ops_init+0x31e/0x590 net/core/net_namespace.c:138
setup_net+0x287/0x9e0 net/core/net_namespace.c:362
page last free pid 1032 tgid 1032 stack trace:
reset_page_owner include/linux/page_owner.h:25 [inline]
free_pages_prepare mm/page_alloc.c:1127 [inline]
free_unref_page+0xdf9/0x1140 mm/page_alloc.c:2657
__slab_free+0x31b/0x3d0 mm/slub.c:4509
qlink_free mm/kasan/quarantine.c:163 [inline]
qlist_free_all+0x9a/0x140 mm/kasan/quarantine.c:179
kasan_quarantine_reduce+0x14f/0x170 mm/kasan/quarantine.c:286
__kasan_slab_alloc+0x23/0x80 mm/kasan/common.c:329
kasan_slab_alloc include/linux/kasan.h:250 [inline]
slab_post_alloc_hook mm/slub.c:4104 [inline]
slab_alloc_node mm/slub.c:4153 [inline]
kmem_cache_alloc_node_noprof+0x1d9/0x380 mm/slub.c:4205
__alloc_skb+0x1c3/0x440 net/core/skbuff.c:668
alloc_skb include/linux/skbuff.h:1323 [inline]
alloc_skb_with_frags+0xc3/0x820 net/core/skbuff.c:6612
sock_alloc_send_pskb+0x91a/0xa60 net/core/sock.c:2881
sock_alloc_send_skb include/net/sock.h:1797 [inline]
mld_newpack+0x1c3/0xaf0 net/ipv6/mcast.c:1747
add_grhead net/ipv6/mcast.c:1850 [inline]
add_grec+0x1492/0x19a0 net/ipv6/mcast.c:1988
mld_send_initial_cr+0x228/0x4b0 net/ipv6/mcast.c:2234
ipv6_mc_dad_complete+0x88/0x490 net/ipv6/mcast.c:2245
addrconf_dad_completed+0x712/0xcd0 net/ipv6/addrconf.c:4342
addrconf_dad_work+0xdc2/0x16f0
process_one_work kernel/workqueue.c:3229 [inline]
process_scheduled_works+0xa63/0x1850 kernel/workqueue.c:3310
Memory state around the buggy address:
ffff888043eba080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff888043eba100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff888043eba180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff888043eba200: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff888043eba280: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb--- net/core/link_watch.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
net/core/link_watch.c +6 -1
@@ -45,9 +45,14 @@ static unsigned int default_operstate(const struct net_device *dev)int iflink =dev_get_iflink (dev);struct net_device *peer; -if (iflink == dev->ifindex) +/* If called from netdev_run_todo()/linkwatch_sync_dev(), +* dev_net(dev) can be already freed, and RTNL is not held. +*/ +if (dev->reg_state ==NETREG_UNREGISTERED || + iflink == dev->ifindex)return IF_OPER_DOWN ; +ASSERT_RTNL (); peer =__dev_get_by_index (dev_net (dev), iflink);if (!peer)return IF_OPER_DOWN ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 61/466 gpio: grgpio: use a helper variable to store the address of ofdev->dev
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bartosz Golaszewski <[email protected]>
[ Upstream commit d036ae41cebdfae92666024163c109b8fef516fa ]
Instead of dereferencing the platform device pointer repeatedly, just store its address in a helper variable.
Stable-dep-of: 050b23d081da ("gpio: grgpio: Add NULL check in grgpio_probe")
--- drivers/gpio/gpio-grgpio.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
drivers/gpio/gpio-grgpio.c +12 -11
@@ -328,6 +328,7 @@ static const struct irq_domain_ops grgpio_irq_domain_ops = {static int grgpio_probe (struct platform_device *ofdev) {struct device_node *np = ofdev->dev.of_node; +struct device *dev = &ofdev->dev;void __iomem *regs;struct gpio_chip *gc;struct grgpio_priv *priv;
@@ -337,7 +338,7 @@ static int grgpio_probe(struct platform_device *ofdev)int size;int i; - priv =devm_kzalloc (&ofdev->dev,sizeof (*priv),GFP_KERNEL ); + priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL );if (!priv)return -ENOMEM ;
@@ -346,28 +347,28 @@ static int grgpio_probe(struct platform_device *ofdev)return PTR_ERR (regs); gc = &priv->gc; - err =bgpio_init (gc, &ofdev->dev,4 , regs +GRGPIO_DATA , + err =bgpio_init (gc, dev,4 , regs +GRGPIO_DATA , regs +GRGPIO_OUTPUT ,NULL , regs +GRGPIO_DIR ,NULL ,BGPIOF_BIG_ENDIAN_BYTE_ORDER );if (err) { -dev_err (&ofdev->dev,"bgpio_init() failed\n" ); +dev_err (dev,"bgpio_init() failed\n" );return err; } priv->regs = regs; priv->imask = gc->read_reg (regs +GRGPIO_IMASK ); - priv->dev = &ofdev->dev; + priv->dev = dev; gc->owner =THIS_MODULE ; gc->to_irq = grgpio_to_irq; - gc->label =devm_kasprintf (&ofdev->dev,GFP_KERNEL ,"%pOF" , np); + gc->label =devm_kasprintf (dev,GFP_KERNEL ,"%pOF" , np); gc->base =-1 ; err =of_property_read_u32 (np,"nbits" , &prop);if (err || prop <=0 || prop >GRGPIO_MAX_NGPIO ) { gc->ngpio =GRGPIO_MAX_NGPIO ; -dev_dbg (&ofdev->dev, -"No or invalid nbits property: assume %d\n" , gc->ngpio); +dev_dbg (dev,"No or invalid nbits property: assume %d\n" , + gc->ngpio); }else { gc->ngpio = prop; }
@@ -379,7 +380,7 @@ static int grgpio_probe(struct platform_device *ofdev) irqmap = (s32 *)of_get_property (np,"irqmap" , &size);if (irqmap) {if (size < gc->ngpio) { -dev_err (&ofdev->dev, +dev_err (dev,"irqmap shorter than ngpio (%d < %d)\n" , size, gc->ngpio);return -EINVAL ;
@@ -389,7 +390,7 @@ static int grgpio_probe(struct platform_device *ofdev) &grgpio_irq_domain_ops, priv);if (!priv->domain) { -dev_err (&ofdev->dev,"Could not add irq domain\n" ); +dev_err (dev,"Could not add irq domain\n" );return -EINVAL ; }
@@ -419,13 +420,13 @@ static int grgpio_probe(struct platform_device *ofdev) err =gpiochip_add_data (gc, priv);if (err) { -dev_err (&ofdev->dev,"Could not add gpiochip\n" ); +dev_err (dev,"Could not add gpiochip\n" );if (priv->domain)irq_domain_remove (priv->domain);return err; } -dev_info (&ofdev->dev,"regs=0x%p, base=%d, ngpio=%d, irqs=%s\n" , +dev_info (dev,"regs=0x%p, base=%d, ngpio=%d, irqs=%s\n" , priv->regs, gc->base, gc->ngpio, priv->domain ?"on" :"off" );return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 62/466 gpio: grgpio: Add NULL check in grgpio_probe
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Han <[email protected]>
[ Upstream commit 050b23d081da0f29474de043e9538c1f7a351b3b ]
devm_kasprintf() can return a NULL pointer on failure,but this returned value in grgpio_probe is not checked.
Add NULL check in grgpio_probe, to handle kernel NULL pointer dereference error.
--- drivers/gpio/gpio-grgpio.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpio/gpio-grgpio.c +3 -0
@@ -362,6 +362,9 @@ static int grgpio_probe(struct platform_device *ofdev) gc->owner =THIS_MODULE ; gc->to_irq = grgpio_to_irq; gc->label =devm_kasprintf (dev,GFP_KERNEL ,"%pOF" , np); +if (!gc->label) +return -ENOMEM ; + gc->base =-1 ; err =of_property_read_u32 (np,"nbits" , &prop);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 63/466 mmc: mtk-sd: use devm_mmc_alloc_host
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 7a2fa8eed936b33b22e49b1d2349cd7d02f22710 ]
Allows removing several gotos.
Also fixed some wrong ones.
Added dev_err_probe where EPROBE_DEFER is possible.
Stable-dep-of: 291220451c77 ("mmc: mtk-sd: Fix error handle of probe function")
--- drivers/mmc/host/mtk-sd.c | 55 ++++++++++++++------------------------- 1 file changed, 20 insertions(+), 35 deletions(-)
drivers/mmc/host/mtk-sd.c +20 -35
@@ -2736,20 +2736,18 @@ static int msdc_drv_probe(struct platform_device *pdev) }/* Allocate MMC host for this device */ - mmc =mmc_alloc_host (sizeof (struct msdc_host ), &pdev->dev); + mmc =devm_mmc_alloc_host (&pdev->dev,sizeof (struct msdc_host ));if (!mmc)return -ENOMEM ; host =mmc_priv (mmc); ret =mmc_of_parse (mmc);if (ret) - goto host_free; +return ret; host->base =devm_platform_ioremap_resource (pdev,0 ); -if (IS_ERR (host->base)) { - ret =PTR_ERR (host->base); - goto host_free; - } +if (IS_ERR (host->base)) +return PTR_ERR (host->base); res =platform_get_resource (pdev,IORESOURCE_MEM ,1 );if (res) {
@@ -2760,18 +2758,16 @@ static int msdc_drv_probe(struct platform_device *pdev) ret =mmc_regulator_get_supply (mmc);if (ret) - goto host_free; +return ret; ret =msdc_of_clock_parse (pdev, host);if (ret) - goto host_free; +return ret; host->reset =devm_reset_control_get_optional_exclusive (&pdev->dev,"hrst" ); -if (IS_ERR (host->reset)) { - ret =PTR_ERR (host->reset); - goto host_free; - } +if (IS_ERR (host->reset)) +return PTR_ERR (host->reset);/* only eMMC has crypto property */ if (!(mmc->caps2 &MMC_CAP2_NO_MMC )) {
@@ -2783,30 +2779,24 @@ static int msdc_drv_probe(struct platform_device *pdev) } host->irq =platform_get_irq (pdev,0 ); -if (host->irq <0 ) { - ret = host->irq; - goto host_free; - } +if (host->irq <0 ) +return host->irq; host->pinctrl =devm_pinctrl_get (&pdev->dev); -if (IS_ERR (host->pinctrl)) { - ret =PTR_ERR (host->pinctrl); -dev_err (&pdev->dev,"Cannot find pinctrl!\n" ); - goto host_free; - } +if (IS_ERR (host->pinctrl)) +return dev_err_probe (&pdev->dev,PTR_ERR (host->pinctrl), +"Cannot find pinctrl" ); host->pins_default =pinctrl_lookup_state (host->pinctrl,"default" );if (IS_ERR (host->pins_default)) { - ret =PTR_ERR (host->pins_default);dev_err (&pdev->dev,"Cannot find pinctrl default!\n" ); - goto host_free; +return PTR_ERR (host->pins_default); } host->pins_uhs =pinctrl_lookup_state (host->pinctrl,"state_uhs" );if (IS_ERR (host->pins_uhs)) { - ret =PTR_ERR (host->pins_uhs);dev_err (&pdev->dev,"Cannot find pinctrl uhs!\n" ); - goto host_free; +return PTR_ERR (host->pins_uhs); }/* Support for SDIO eint irq ? */
@@ -2895,14 +2885,14 @@ static int msdc_drv_probe(struct platform_device *pdev) GFP_KERNEL);if (!host->cq_host) { ret = -ENOMEM ; - goto host_free; + goto release_mem; } host->cq_host->caps |=CQHCI_TASK_DESC_SZ_128 ; host->cq_host->mmio = host->base +0x800 ; host->cq_host->ops = &msdc_cmdq_ops; ret =cqhci_init (host->cq_host, mmc, true);if (ret) - goto host_free; + goto release_mem; mmc->max_segs =128 ;/* cqhci 16bit length */ /* 0 size, means 65536 so we don't have to -1 here */
@@ -2939,11 +2929,8 @@ static int msdc_drv_probe(struct platform_device *pdev) host->dma.gpd, host->dma.gpd_addr);if (host->dma.bd)dma_free_coherent (&pdev->dev, -MAX_BD_NUM *sizeof (struct mt_bdma_desc ), - host->dma.bd, host->dma.bd_addr); -host_free: -mmc_free_host (mmc); - +MAX_BD_NUM *sizeof (struct mt_bdma_desc ), + host->dma.bd, host->dma.bd_addr);return ret; }
@@ -2968,9 +2955,7 @@ static void msdc_drv_remove(struct platform_device *pdev)2 *sizeof (struct mt_gpdma_desc ), host->dma.gpd, host->dma.gpd_addr);dma_free_coherent (&pdev->dev,MAX_BD_NUM *sizeof (struct mt_bdma_desc ), - host->dma.bd, host->dma.bd_addr); - -mmc_free_host (mmc); + host->dma.bd, host->dma.bd_addr); }static void msdc_save_reg (struct msdc_host *host)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 64/466 mmc: mtk-sd: Fix error handle of probe function
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy-ld Lu <[email protected]>
[ Upstream commit 291220451c775a054cedc4fab4578a1419eb6256 ]
In the probe function, it goes to 'release_mem' label and returns after some procedure failure. But if the clocks (partial or all) have been enabled previously, they would not be disabled in msdc_runtime_suspend, since runtime PM is not yet enabled for this case.
That cause mmc related clocks always on during system suspend and block suspend flow. Below log is from a SDCard issue of MT8196 chromebook, it returns -ETIMEOUT while polling clock stable in the msdc_ungate_clock() and probe failed, but the enabled clocks could not be disabled anyway.
[ 129.059253] clk_chk_dev_pm_suspend() [ 129.350119] suspend warning: msdcpll is on [ 129.354494] [ck_msdc30_1_sel : enabled, 1, 1, 191999939, ck_msdcpll_d2] [ 129.362787] [ck_msdcpll_d2 : enabled, 1, 1, 191999939, msdcpll] [ 129.371041] [ck_msdc30_1_ck : enabled, 1, 1, 191999939, ck_msdc30_1_sel] [ 129.379295] [msdcpll : enabled, 1, 1, 383999878, clk26m]
Add a new 'release_clk' label and reorder the error handle functions to make sure the clocks be disabled after probe failure.
Message-ID: <[email protected]>
--- drivers/mmc/host/mtk-sd.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/mmc/host/mtk-sd.c +5 -4
@@ -2875,7 +2875,7 @@ static int msdc_drv_probe(struct platform_device *pdev) ret =msdc_ungate_clock (host);if (ret) {dev_err (&pdev->dev,"Cannot ungate clocks!\n" ); - goto release_mem; + goto release_clk; }msdc_init_hw (host);
@@ -2885,14 +2885,14 @@ static int msdc_drv_probe(struct platform_device *pdev) GFP_KERNEL);if (!host->cq_host) { ret = -ENOMEM ; - goto release_mem; + goto release; } host->cq_host->caps |=CQHCI_TASK_DESC_SZ_128 ; host->cq_host->mmio = host->base +0x800 ; host->cq_host->ops = &msdc_cmdq_ops; ret =cqhci_init (host->cq_host, mmc, true);if (ret) - goto release_mem; + goto release; mmc->max_segs =128 ;/* cqhci 16bit length */ /* 0 size, means 65536 so we don't have to -1 here */
@@ -2919,9 +2919,10 @@ static int msdc_drv_probe(struct platform_device *pdev) end:pm_runtime_disable (host->dev); release: -platform_set_drvdata (pdev,NULL );msdc_deinit_hw (host); +release_clk:msdc_gate_clock (host); +platform_set_drvdata (pdev,NULL ); release_mem:if (host->dma.gpd) dma_free_coherent(&pdev->dev,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 65/466 mmc: mtk-sd: fix devm_clk_get_optional usage
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit ed299eda8fbb37cb0e05c7001ab6a6b2627ec087 ]
This already returns NULL when not found. However, it can return EPROBE_DEFER and should thus return here.
Stable-dep-of: 2508925fb346 ("mmc: mtk-sd: Fix MMC_CAP2_CRYPTO flag setting")
--- drivers/mmc/host/mtk-sd.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/mmc/host/mtk-sd.c +2 -3
@@ -2773,9 +2773,8 @@ static int msdc_drv_probe(struct platform_device *pdev)if (!(mmc->caps2 &MMC_CAP2_NO_MMC )) { host->crypto_clk =devm_clk_get_optional (&pdev->dev,"crypto" );if (IS_ERR (host->crypto_clk)) - host->crypto_clk =NULL ; -else - mmc->caps2 |=MMC_CAP2_CRYPTO ; +return PTR_ERR (host->crypto_clk); + mmc->caps2 |=MMC_CAP2_CRYPTO ; } host->irq =platform_get_irq (pdev,0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 66/466 mmc: mtk-sd: Fix MMC_CAP2_CRYPTO flag setting
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy-ld Lu <[email protected]>
[ Upstream commit 2508925fb346661bad9f50b497d7ac7d0b6085d0 ]
Currently, the MMC_CAP2_CRYPTO flag is set by default for eMMC hosts. However, this flag should not be set for hosts that do not support inline encryption.
The 'crypto' clock, as described in the documentation, is used for data encryption and decryption. Therefore, only hosts that are configured with this 'crypto' clock should have the MMC_CAP2_CRYPTO flag set.
Message-ID: <[email protected]>
--- drivers/mmc/host/mtk-sd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/mmc/host/mtk-sd.c +2 -1
@@ -2774,7 +2774,8 @@ static int msdc_drv_probe(struct platform_device *pdev) host->crypto_clk =devm_clk_get_optional (&pdev->dev,"crypto" );if (IS_ERR (host->crypto_clk))return PTR_ERR (host->crypto_clk); - mmc->caps2 |=MMC_CAP2_CRYPTO ; +else if (host->crypto_clk) + mmc->caps2 |=MMC_CAP2_CRYPTO ; } host->irq =platform_get_irq (pdev,0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 67/466 mmc: sd: SDUC Support Recognition
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avri Altman <[email protected]>
[ Upstream commit fce2ce78af1e14dc1316aaddb5b3308be05cf452 ]
Ultra Capacity SD cards (SDUC) was already introduced in SD7.0. Those cards support capacity larger than 2TB and up to including 128TB.
ACMD41 was extended to support the host-card handshake during initialization. The card expects that the HCS & HO2T bits to be set in the command argument, and sets the applicable bits in the R3 returned response. On the contrary, if a SDUC card is inserted to a non-supporting host, it will never respond to this ACMD41 until eventually, the host will timed out and give up.
Also, add SD CSD version 3.0 - designated for SDUC, and properly parse the csd register as the c_size field got expanded to 28 bits.
Do not enable SDUC for now - leave it to the last patch in the series.
Stable-dep-of: 869d37475788 ("mmc: core: Use GFP_NOIO in ACMD22")
--- drivers/mmc/core/bus.c | 4 +++- drivers/mmc/core/card.h | 3 +++ drivers/mmc/core/sd.c | 28 +++++++++++++++++----------- drivers/mmc/core/sd.h | 2 +- drivers/mmc/core/sdio.c | 2 +- include/linux/mmc/card.h | 2 +- include/linux/mmc/sd.h | 1 + 7 files changed, 27 insertions(+), 15 deletions(-)
drivers/mmc/core/bus.c +3 -1
@@ -321,7 +321,9 @@ int mmc_add_card(struct mmc_card *card)case MMC_TYPE_SD : type ="SD" ;if (mmc_card_blockaddr (card)) { -if (mmc_card_ext_capacity (card)) +if (mmc_card_ult_capacity (card)) + type ="SDUC" ; +else if (mmc_card_ext_capacity (card)) type ="SDXC" ;else type ="SDHC" ;
drivers/mmc/core/card.h +3 -0
@@ -23,6 +23,7 @@#define MMC_CARD_SDXC (1<<3)/* card is SDXC */ #define MMC_CARD_REMOVED (1<<4)/* card has been removed */ #define MMC_STATE_SUSPENDED (1<<5)/* card is suspended */ +#define MMC_CARD_SDUC (1<<6)/* card is SDUC */ #define mmc_card_present (c) ((c)->state & MMC_STATE_PRESENT)#define mmc_card_readonly (c) ((c)->state & MMC_STATE_READONLY)
@@ -30,11 +31,13 @@#define mmc_card_ext_capacity (c) ((c)->state & MMC_CARD_SDXC)#define mmc_card_removed (c) ((c) && ((c)->state & MMC_CARD_REMOVED))#define mmc_card_suspended (c) ((c)->state & MMC_STATE_SUSPENDED) +#define mmc_card_ult_capacity (c) ((c)->state & MMC_CARD_SDUC)#define mmc_card_set_present (c) ((c)->state |= MMC_STATE_PRESENT)#define mmc_card_set_readonly (c) ((c)->state |= MMC_STATE_READONLY)#define mmc_card_set_blockaddr (c) ((c)->state |= MMC_STATE_BLOCKADDR)#define mmc_card_set_ext_capacity (c) ((c)->state |= MMC_CARD_SDXC) +#define mmc_card_set_ult_capacity (c) ((c)->state |= MMC_CARD_SDUC)#define mmc_card_set_removed (c) ((c)->state |= MMC_CARD_REMOVED)#define mmc_card_set_suspended (c) ((c)->state |= MMC_STATE_SUSPENDED)#define mmc_card_clr_suspended (c) ((c)->state &= ~MMC_STATE_SUSPENDED)
drivers/mmc/core/sd.c +17 -11
@@ -100,7 +100,7 @@ void mmc_decode_cid(struct mmc_card *card)/* * Given a 128-bit response, decode to our card CSD structure. */ -static int mmc_decode_csd (struct mmc_card *card) +static int mmc_decode_csd (struct mmc_card *card,bool is_sduc) {struct mmc_csd *csd = &card->csd;unsigned int e, m, csd_struct;
@@ -144,9 +144,10 @@ static int mmc_decode_csd(struct mmc_card *card)mmc_card_set_readonly (card);break ;case 1 : +case 2 :/* -* This is a block-addressed SDHC or SDXC card. Most -* interesting fields are unused and have fixed +* This is a block-addressed SDHC, SDXC or SDUC card. +* Most interesting fields are unused and have fixed * values. To avoid getting tripped by buggy cards, * we assume those fixed values ourselves. */
@@ -159,14 +160,19 @@ static int mmc_decode_csd(struct mmc_card *card) e =unstuff_bits (resp,96 ,3 ); csd->max_dtr = tran_exp[e] * tran_mant[m]; csd->cmdclass =unstuff_bits (resp,84 ,12 ); - csd->c_size =unstuff_bits (resp,48 ,22 ); -/* SDXC cards have a minimum C_SIZE of 0x00FFFF */ -if (csd->c_size >=0xFFFF ) +if (csd_struct ==1 ) + m =unstuff_bits (resp,48 ,22 ); +else + m =unstuff_bits (resp,48 ,28 ); + csd->c_size = m; + +if (csd->c_size >=0x400000 && is_sduc) +mmc_card_set_ult_capacity (card); +else if (csd->c_size >=0xFFFF )mmc_card_set_ext_capacity (card); - m =unstuff_bits (resp,48 ,22 ); - csd->capacity = (1 + m) <<10 ; + csd->capacity = (1 + (typeof (sector_t ))m) <<10 ; csd->read_blkbits =9 ; csd->read_partial =0 ;
@@ -876,7 +882,7 @@ int mmc_sd_get_cid(struct mmc_host *host, u32 ocr, u32 *cid, u32 *rocr)return err; } -int mmc_sd_get_csd (struct mmc_card *card) +int mmc_sd_get_csd (struct mmc_card *card,bool is_sduc) {int err;
@@ -887,7 +893,7 @@ int mmc_sd_get_csd(struct mmc_card *card)if (err)return err; - err =mmc_decode_csd (card); + err =mmc_decode_csd (card, is_sduc);if (err)return err;
@@ -1442,7 +1448,7 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, }if (!oldcard) { - err =mmc_sd_get_csd (card); + err =mmc_sd_get_csd (card, false);if (err) goto free_card;
drivers/mmc/core/sd.h +1 -1
@@ -10,7 +10,7 @@ struct mmc_host;struct mmc_card ;int mmc_sd_get_cid (struct mmc_host *host,u32 ocr,u32 *cid,u32 *rocr); -int mmc_sd_get_csd (struct mmc_card *card); +int mmc_sd_get_csd (struct mmc_card *card,bool is_sduc);void mmc_decode_cid (struct mmc_card *card);int mmc_sd_setup_card (struct mmc_host *host,struct mmc_card *card,bool reinit);
drivers/mmc/core/sdio.c +1 -1
@@ -769,7 +769,7 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr,* Read CSD, before selecting the card */ if (!oldcard &&mmc_card_sd_combo (card)) { - err =mmc_sd_get_csd (card); + err =mmc_sd_get_csd (card, false);if (err) goto remove;
include/linux/mmc/card.h +1 -1
@@ -35,7 +35,7 @@ struct mmc_csd {unsigned int wp_grp_size;unsigned int read_blkbits;unsigned int write_blkbits; -unsigned int capacity; +sector_t capacity; unsigned int read_partial:1, read_misalign:1, write_partial:1,
include/linux/mmc/sd.h +1 -0
@@ -36,6 +36,7 @@/* OCR bit definitions */ #define SD_OCR_S18R (1 << 24)/* 1.8V switching request */ #define SD_ROCR_S18A SD_OCR_S18R/* 1.8V switching accepted by card */ +#define SD_OCR_2T (1 << 27)/* HO2T/CO2T - SDUC support */ #define SD_OCR_XPC (1 << 28)/* SDXC power control */ #define SD_OCR_CCS (1 << 30)/* Card Capacity Status */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 68/466 mmc: core: Adjust ACMD22 to SDUC
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avri Altman <[email protected]>
[ Upstream commit 449f34a34088d02457fa0f3216747e8a35bc03ae ]
ACMD22 is used to verify the previously write operation. Normally, it returns the number of written sectors as u32. SDUC, however, returns it as u64. This is not a superfluous requirement, because SDUC writes may exceeds 2TB. For Linux mmc however, the previously write operation could not be more than the block layer limits, thus we make room for a u64 and cast the returning value to u32.
Stable-dep-of: 869d37475788 ("mmc: core: Use GFP_NOIO in ACMD22")
--- drivers/mmc/core/block.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-)
drivers/mmc/core/block.c +18 -6
@@ -50,6 +50,7 @@#include <linux/mmc/sd.h> #include <linux/uaccess.h> +#include <linux/unaligned.h> #include "queue.h" #include "block.h"
@@ -993,11 +994,10 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks)int err;u32 result;__be32 *blocks; - +u8 resp_sz =mmc_card_ult_capacity (card) ?8 :4 ;struct mmc_request mrq = {};struct mmc_command cmd = {};struct mmc_data data = {}; -struct scatterlist sg; err =mmc_app_cmd (card->host, card);
@@ -1008,7 +1008,7 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks) cmd.arg =0 ; cmd.flags =MMC_RSP_SPI_R1 |MMC_RSP_R1 |MMC_CMD_ADTC ; - data.blksz =4 ; + data.blksz = resp_sz; data.blocks =1 ; data.flags =MMC_DATA_READ ; data.sg = &sg;
@@ -1018,15 +1018,27 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks) mrq.cmd = &cmd; mrq.data = &data; - blocks =kmalloc (4 ,GFP_KERNEL ); + blocks =kmalloc (resp_sz,GFP_KERNEL );if (!blocks)return -ENOMEM ; -sg_init_one (&sg, blocks,4 ); +sg_init_one (&sg, blocks, resp_sz);mmc_wait_for_req (card->host, &mrq); - result =ntohl (*blocks); +if (mmc_card_ult_capacity (card)) { +/* +* Normally, ACMD22 returns the number of written sectors as +* u32. SDUC, however, returns it as u64. This is not a +* superfluous requirement, because SDUC writes may exceed 2TB. +* For Linux mmc however, the previously write operation could +* not be more than the block layer limits, thus just make room +* for a u64 and cast the response back to u32. +*/ + result =clamp_val (get_unaligned_be64 (blocks),0 ,UINT_MAX ); + }else { + result =ntohl (*blocks); + }kfree (blocks);if (cmd.error || data.error)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 69/466 mmc: core: Use GFP_NOIO in ACMD22
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avri Altman <[email protected]>
[ Upstream commit 869d37475788b0044bec1a33335e24abaf5e8884 ]
While reviewing the SDUC series, Adrian made a comment concerning the memory allocation code in mmc_sd_num_wr_blocks() - see [1]. Prevent memory allocations from triggering I/O operations while ACMD22 is in progress.
[1] https://lore.kernel.org/linux-mmc/[email protected]/
Message-ID: <[email protected]>
--- drivers/mmc/core/block.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/mmc/core/block.c +4 -0
@@ -995,6 +995,8 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks)u32 result;__be32 *blocks;u8 resp_sz =mmc_card_ult_capacity (card) ?8 :4 ; +unsigned int noio_flag; +struct mmc_request mrq = {};struct mmc_command cmd = {};struct mmc_data data = {};
@@ -1018,7 +1020,9 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks) mrq.cmd = &cmd; mrq.data = &data; + noio_flag =memalloc_noio_save (); blocks =kmalloc (resp_sz,GFP_KERNEL ); +memalloc_noio_restore (noio_flag);if (!blocks)return -ENOMEM ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 70/466 zram: do not mark idle slots that cannot be idle
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Senozhatsky <[email protected]>
[ Upstream commit b967fa1ba72b5da2b6d9bf95f0b13420a59e0701 ]
ZRAM_SAME slots cannot be post-processed (writeback or recompress) so do not mark them ZRAM_IDLE. Same with ZRAM_WB slots, they cannot be ZRAM_IDLE because they are not in zsmalloc pool anymore.
Stable-dep-of: d37da422edb0 ("zram: clear IDLE flag in mark_idle()")
--- drivers/block/zram/zram_drv.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
drivers/block/zram/zram_drv.c +18 -7
@@ -298,17 +298,28 @@ static void mark_idle(struct zram *zram, ktime_t cutoff)/* * Do not mark ZRAM_UNDER_WB slot as ZRAM_IDLE to close race. * See the comment in writeback_store. +* +* Also do not mark ZRAM_SAME slots as ZRAM_IDLE, because no +* post-processing (recompress, writeback) happens to the +* ZRAM_SAME slot. +* +* And ZRAM_WB slots simply cannot be ZRAM_IDLE. */ zram_slot_lock (zram, index); -if (zram_allocated (zram, index) && - !zram_test_flag (zram, index,ZRAM_UNDER_WB )) { +if (!zram_allocated (zram, index) || +zram_test_flag (zram, index,ZRAM_WB ) || +zram_test_flag (zram, index,ZRAM_UNDER_WB ) || +zram_test_flag (zram, index,ZRAM_SAME )) { +zram_slot_unlock (zram, index); +continue ; + } +#ifdef CONFIG_ZRAM_TRACK_ENTRY_ACTIME - is_idle = !cutoff ||ktime_after (cutoff, - zram->table[index].ac_time); + is_idle = !cutoff || +ktime_after (cutoff, zram->table[index].ac_time);#endif -if (is_idle) -zram_set_flag (zram, index,ZRAM_IDLE ); - } +if (is_idle) +zram_set_flag (zram, index,ZRAM_IDLE );zram_slot_unlock (zram, index); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 71/466 zram: clear IDLE flag in mark_idle()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Senozhatsky <[email protected]>
[ Upstream commit d37da422edb0664a2037e6d7d42fe6d339aae78a ]
If entry does not fulfill current mark_idle() parameters, e.g. cutoff time, then we should clear its ZRAM_IDLE from previous mark_idle() invocations.
Consider the following case:
- mark_idle() cutoff time 8h
- mark_idle() cutoff time 4h
- writeback() idle - will writeback entries with cutoff time 8h, while it should only pick entries with cutoff time 4h
The bug was reported by Shin Kawamura.
--- drivers/block/zram/zram_drv.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/block/zram/zram_drv.c +2 -0
@@ -320,6 +320,8 @@ static void mark_idle(struct zram *zram, ktime_t cutoff)#endif if (is_idle)zram_set_flag (zram, index,ZRAM_IDLE ); +else +zram_clear_flag (zram, index,ZRAM_IDLE );zram_slot_unlock (zram, index); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 72/466 ntp: Remove invalid cast in time offset math
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcelo Dalmas <[email protected]>
commit f5807b0606da7ac7c1b74a386b22134ec7702d05 upstream.
Due to an unsigned cast, adjtimex() returns the wrong offest when using ADJ_MICRO and the offset is negative. In this case a small negative offset returns approximately 4.29 seconds (~ 2^32/1000 milliseconds) due to the unsigned cast of the negative offset.
This cast was added when the kernel internal struct timex was changed to use type long long for the time offset value to address the problem of a 64bit/32bit division on 32bit systems.
The correct cast would have been (s32), which is correct as time_offset can only be in the range of [INT_MIN..INT_MAX] because the shift constant used for calculating it is 32. But that's non-obvious.
Remove the cast and use div_s64() to cure the issue.
[ tglx: Fix white space damage, use div_s64() and amend the change log ]
--- kernel/time/ntp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/time/ntp.c +1 -1
@@ -804,7 +804,7 @@ int __do_adjtimex(struct __kernel_timex txc->offset =shift_right (time_offset *NTP_INTERVAL_FREQ ,NTP_SCALE_SHIFT );if (!(time_status &STA_NANO )) - txc->offset = (u32 )txc->offset /NSEC_PER_USEC ; + txc->offset =div_s64 (txc->offset,NSEC_PER_USEC ); } result = time_state;/* mostly `TIME_OK' */
Greg Kroah-Hartman
maintainerPATCH 73/466 f2fs: clean up w/ F2FS_{BLK_TO_BYTES,BTYES_TO_BLK}
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 7461f37094180200cb2f98e60ef99a0cea97beec ]
f2fs doesn't support different blksize in one instance, so bytes_to_blks() and blks_to_bytes() are equal to F2FS_BYTES_TO_BLK and F2FS_BLK_TO_BYTES, let's use F2FS_BYTES_TO_BLK/F2FS_BLK_TO_BYTES instead for cleanup.
Stable-dep-of: 6787a8224585 ("f2fs: fix to requery extent which cross boundary of inquiry")
--- fs/f2fs/data.c | 68 +++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 39 deletions(-)
fs/f2fs/data.c +29 -39
@@ -1819,16 +1819,6 @@ bool f2fs_overwrite_io(struct inode *inode, loff_t pos, size_t len)return true; } -static inline u64 bytes_to_blks (struct inode *inode,u64 bytes) -{ -return (bytes >> inode->i_blkbits); -} - -static inline u64 blks_to_bytes (struct inode *inode,u64 blks) -{ -return (blks << inode->i_blkbits); -} -static int f2fs_xattr_fiemap (struct inode *inode,struct fiemap_extent_info *fieinfo) {
@@ -1854,7 +1844,7 @@ static int f2fs_xattr_fiemap(struct inode *inode,return err; } - phys =blks_to_bytes (inode, ni.blk_addr); + phys =F2FS_BLK_TO_BYTES (ni.blk_addr); offset = offsetof(struct f2fs_inode , i_addr) +sizeof (__le32) * (DEF_ADDRS_PER_INODE -get_inline_xattr_addrs (inode));
@@ -1886,7 +1876,7 @@ static int f2fs_xattr_fiemap(struct inode *inode,return err; } - phys =blks_to_bytes (inode, ni.blk_addr); + phys =F2FS_BLK_TO_BYTES (ni.blk_addr); len = inode->i_sb->s_blocksize;f2fs_put_page (page,1 );
@@ -1948,16 +1938,16 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, goto out; } -if (bytes_to_blks (inode, len) ==0 ) - len =blks_to_bytes (inode,1 ); +if (F2FS_BYTES_TO_BLK (len) ==0 ) + len =F2FS_BLKSIZE ; - start_blk =bytes_to_blks (inode, start); - last_blk =bytes_to_blks (inode, start + len -1 ); + start_blk =F2FS_BYTES_TO_BLK (start); + last_blk =F2FS_BYTES_TO_BLK (start + len -1 ); next:memset (&map,0 ,sizeof (map)); map.m_lblk = start_blk; - map.m_len =bytes_to_blks (inode, len); + map.m_len =F2FS_BYTES_TO_BLK (len); map.m_next_pgofs = &next_pgofs; map.m_seg_type =NO_CHECK_TYPE ;
@@ -1974,7 +1964,7 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,if (!compr_cluster && !(map.m_flags &F2FS_MAP_FLAGS )) { start_blk = next_pgofs; -if (blks_to_bytes (inode, start_blk) < maxbytes) +if (F2FS_BLK_TO_BYTES (start_blk) < maxbytes) goto prep_next; flags |=FIEMAP_EXTENT_LAST ;
@@ -2011,14 +2001,14 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, }else if (compr_appended) {unsigned int appended_blks = cluster_size - count_in_cluster +1 ; - size +=blks_to_bytes (inode, appended_blks); + size +=F2FS_BLK_TO_BYTES (appended_blks); start_blk += appended_blks; compr_cluster = false; }else { - logical =blks_to_bytes (inode, start_blk); + logical =F2FS_BLK_TO_BYTES (start_blk); phys =__is_valid_data_blkaddr (map.m_pblk) ? -blks_to_bytes (inode, map.m_pblk) :0 ; - size =blks_to_bytes (inode, map.m_len); +F2FS_BLK_TO_BYTES (map.m_pblk) :0 ; + size =F2FS_BLK_TO_BYTES (map.m_len); flags =0 ;if (compr_cluster) {
@@ -2026,13 +2016,13 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, count_in_cluster += map.m_len;if (count_in_cluster == cluster_size) { compr_cluster = false; - size +=blks_to_bytes (inode,1 ); + size +=F2FS_BLKSIZE ; } }else if (map.m_flags &F2FS_MAP_DELALLOC ) { flags =FIEMAP_EXTENT_UNWRITTEN ; } - start_blk +=bytes_to_blks (inode, size); + start_blk +=F2FS_BYTES_TO_BLK (size); } prep_next:
@@ -2070,7 +2060,7 @@ static int f2fs_read_single_page(struct inode *inode, struct folio *folio, struct readahead_control *rac) {struct bio *bio = *bio_ret; -const unsigned blocksize =blks_to_bytes (inode,1 ); +const unsigned int blocksize =F2FS_BLKSIZE ;sector_t block_in_file;sector_t last_block;sector_t last_block_in_file;
@@ -2080,8 +2070,8 @@ static int f2fs_read_single_page(struct inode *inode, struct folio *folio, block_in_file = (sector_t )index; last_block = block_in_file + nr_pages; - last_block_in_file =bytes_to_blks (inode, -f2fs_readpage_limit (inode) + blocksize -1 ); + last_block_in_file =F2FS_BYTES_TO_BLK (f2fs_readpage_limit (inode) + + blocksize -1 );if (last_block > last_block_in_file) last_block = last_block_in_file;
@@ -2181,7 +2171,7 @@ int f2fs_read_multi_pages(struct compress_ctx *cc, struct bio **bio_ret,struct bio *bio = *bio_ret;unsigned int start_idx = cc->cluster_idx << cc->log_cluster_size;sector_t last_block_in_file; -const unsigned blocksize =blks_to_bytes (inode,1 ); +const unsigned int blocksize =F2FS_BLKSIZE ;struct decompress_io_ctx *dic =NULL ;struct extent_info ei = {};bool from_dnode = true;
@@ -2190,8 +2180,8 @@ int f2fs_read_multi_pages(struct compress_ctx *cc, struct bio **bio_ret,f2fs_bug_on (sbi,f2fs_cluster_is_empty (cc)); - last_block_in_file =bytes_to_blks (inode, -f2fs_readpage_limit (inode) + blocksize -1 ); + last_block_in_file =F2FS_BYTES_TO_BLK (f2fs_readpage_limit (inode) + + blocksize -1 );/* get rid of pages beyond EOF */ for (i =0 ; i < cc->cluster_size; i++) {
@@ -3952,7 +3942,7 @@ static int check_swap_activate(struct swap_info_struct *sis,* to be very smart. */ cur_lblock =0 ; - last_lblock =bytes_to_blks (inode,i_size_read (inode)); + last_lblock =F2FS_BYTES_TO_BLK (i_size_read (inode));while (cur_lblock < last_lblock && cur_lblock < sis->max) {struct f2fs_map_blocks map;
@@ -4195,8 +4185,8 @@ static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,pgoff_t next_pgofs =0 ;int err; - map.m_lblk =bytes_to_blks (inode, offset); - map.m_len =bytes_to_blks (inode, offset + length -1 ) - map.m_lblk +1 ; + map.m_lblk =F2FS_BYTES_TO_BLK (offset); + map.m_len =F2FS_BYTES_TO_BLK (offset + length -1 ) - map.m_lblk +1 ; map.m_next_pgofs = &next_pgofs; map.m_seg_type =f2fs_rw_hint_to_seg_type (F2FS_I_SB (inode), inode->i_write_hint);
@@ -4207,7 +4197,7 @@ static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,if (err)return err; - iomap->offset =blks_to_bytes (inode, map.m_lblk); + iomap->offset =F2FS_BLK_TO_BYTES (map.m_lblk);/* * When inline encryption is enabled, sometimes I/O to an encrypted file
@@ -4227,21 +4217,21 @@ static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,if (WARN_ON_ONCE (map.m_pblk ==NEW_ADDR ))return -EINVAL ; - iomap->length =blks_to_bytes (inode, map.m_len); + iomap->length =F2FS_BLK_TO_BYTES (map.m_len); iomap->type =IOMAP_MAPPED ; iomap->flags |=IOMAP_F_MERGED ; iomap->bdev = map.m_bdev; - iomap->addr =blks_to_bytes (inode, map.m_pblk); + iomap->addr =F2FS_BLK_TO_BYTES (map.m_pblk); }else {if (flags &IOMAP_WRITE )return -ENOTBLK ;if (map.m_pblk ==NULL_ADDR ) { - iomap->length =blks_to_bytes (inode, next_pgofs) - - iomap->offset; + iomap->length =F2FS_BLK_TO_BYTES (next_pgofs) - + iomap->offset; iomap->type =IOMAP_HOLE ; }else if (map.m_pblk ==NEW_ADDR ) { - iomap->length =blks_to_bytes (inode, map.m_len); + iomap->length =F2FS_BLK_TO_BYTES (map.m_len); iomap->type =IOMAP_UNWRITTEN ; }else {f2fs_bug_on (F2FS_I_SB (inode),1 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 74/466 f2fs: fix to adjust appropriate length for fiemap
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiguo Niu <[email protected]>
[ Upstream commit 77569f785c8624fa4189795fb52e635a973672e5 ]
If user give a file size as "length" parameter for fiemap operations, but if this size is non-block size aligned, it will show 2 segments fiemap results even this whole file is contiguous on disk, such as the following results:
./f2fs_io fiemap 0 19034 ylog/analyzer.py
Fiemap: offset = 0 len = 19034
logical addr. physical addr. length flags
0 0000000000000000 0000000020baa000 0000000000004000 00001000
1 0000000000004000 0000000020bae000 0000000000001000 00001001
after this patch:
./f2fs_io fiemap 0 19034 ylog/analyzer.py
Fiemap: offset = 0 len = 19034
logical addr. physical addr. length flags
0 0000000000000000 00000000315f3000 0000000000005000 00001001
Stable-dep-of: 6787a8224585 ("f2fs: fix to requery extent which cross boundary of inquiry")
--- fs/f2fs/data.c | 6 +++--- include/linux/f2fs_fs.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-)
fs/f2fs/data.c +3 -3
@@ -1938,12 +1938,12 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, goto out; } -if (F2FS_BYTES_TO_BLK (len) ==0 ) - len =F2FS_BLKSIZE ; - start_blk =F2FS_BYTES_TO_BLK (start); last_blk =F2FS_BYTES_TO_BLK (start + len -1 ); +if (len &F2FS_BLKSIZE_MASK ) + len =round_up (len,F2FS_BLKSIZE ); + next:memset (&map,0 ,sizeof (map)); map.m_lblk = start_blk;
include/linux/f2fs_fs.h +1 -0
@@ -24,6 +24,7 @@#define NEW_ADDR ((block_t)-1)/* used as block_t addresses */ #define COMPRESS_ADDR ((block_t)-2)/* used as compressed data flag */ +#define F2FS_BLKSIZE_MASK (F2FS_BLKSIZE - 1)#define F2FS_BYTES_TO_BLK (bytes) ((unsigned long long)(bytes) >> F2FS_BLKSIZE_BITS)#define F2FS_BLK_TO_BYTES (blk) ((unsigned long long)(blk) << F2FS_BLKSIZE_BITS)#define F2FS_BLK_END_BYTES (blk) (F2FS_BLK_TO_BYTES(blk + 1) - 1)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 75/466 f2fs: fix to requery extent which cross boundary of inquiry
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 6787a82245857271133b63ae7f72f1dc9f29e985 ]
dd if=/dev/zero of=file bs=4k count=5xfs_io file -c "fiemap -v 2 16384"
file:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..31]: 139272..139303 32 0x1000
1: [32..39]: 139304..139311 8 0x1001
xfs_io file -c "fiemap -v 0 16384"
file:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..31]: 139272..139303 32 0x1000
xfs_io file -c "fiemap -v 0 16385"
file:
EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS
0: [0..39]: 139272..139311 40 0x1001There are two problems:
- continuous extent is split to two
- FIEMAP_EXTENT_LAST is missing in last extent
The root cause is: if upper boundary of inquiry crosses extent, f2fs_map_blocks() will truncate length of returned extent to F2FS_BYTES_TO_BLK(len), and also, it will stop to query latter extent or hole to make sure current extent is last or not.
In order to fix this issue, once we found an extent locates in the end of inquiry range by f2fs_map_blocks(), we need to expand inquiry range to requiry.
--- fs/f2fs/data.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
fs/f2fs/data.c +15 -5
@@ -1896,7 +1896,7 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, u64 start, u64 len) {struct f2fs_map_blocks map; -sector_t start_blk, last_blk; +sector_t start_blk, last_blk, blk_len, max_len;pgoff_t next_pgofs;u64 logical =0 , phys =0 , size =0 ;u32 flags =0 ;
@@ -1940,14 +1940,13 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, start_blk =F2FS_BYTES_TO_BLK (start); last_blk =F2FS_BYTES_TO_BLK (start + len -1 ); - -if (len &F2FS_BLKSIZE_MASK ) - len =round_up (len,F2FS_BLKSIZE ); + blk_len = last_blk - start_blk +1 ; + max_len =F2FS_BYTES_TO_BLK (maxbytes) - start_blk; next:memset (&map,0 ,sizeof (map)); map.m_lblk = start_blk; - map.m_len =F2FS_BYTES_TO_BLK (len); + map.m_len = blk_len; map.m_next_pgofs = &next_pgofs; map.m_seg_type =NO_CHECK_TYPE ;
@@ -1970,6 +1969,17 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, flags |=FIEMAP_EXTENT_LAST ; } +/* +* current extent may cross boundary of inquiry, increase len to +* requery. +*/ +if (!compr_cluster && (map.m_flags &F2FS_MAP_MAPPED ) && + map.m_lblk + map.m_len -1 == last_blk && + blk_len != max_len) { + blk_len = max_len; + goto next; + } + compr_appended = false;/* In a case of compressed cluster, append this to the last extent */ if (compr_cluster && ((map.m_flags & F2FS_MAP_DELALLOC) ||
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 76/466 i3c: master: Replace hard code 2 with macro I3C_ADDR_SLOT_STATUS_BITS
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
[ Upstream commit 16aed0a6520ba01b7d22c32e193fc1ec674f92d4 ]
Replace the hardcoded value 2, which indicates 2 bits for I3C address status, with the predefined macro I3C_ADDR_SLOT_STATUS_BITS.
Improve maintainability and extensibility of the code.
Stable-dep-of: 851bd21cdb55 ("i3c: master: Fix dynamic address leak when 'assigned-address' is present")
--- drivers/i3c/master.c | 4 ++-- include/linux/i3c/master.h | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-)
drivers/i3c/master.c +2 -2
@@ -348,7 +348,7 @@ static enum i3c_addr_slot_status i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr) {unsigned long status; -int bitpos = addr *2 ; +int bitpos = addr *I3C_ADDR_SLOT_STATUS_BITS ;if (addr >I2C_MAX_ADDR )return I3C_ADDR_SLOT_RSVD ;
@@ -362,7 +362,7 @@ i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr)static void i3c_bus_set_addr_slot_status (struct i3c_bus *bus,u16 addr,enum i3c_addr_slot_status status) { -int bitpos = addr *2 ; +int bitpos = addr *I3C_ADDR_SLOT_STATUS_BITS ;unsigned long *ptr;if (addr >I2C_MAX_ADDR )
include/linux/i3c/master.h +3 -1
@@ -313,6 +313,8 @@ enum i3c_addr_slot_status { I3C_ADDR_SLOT_STATUS_MASK = 3, }; +#define I3C_ADDR_SLOT_STATUS_BITS 2 +/** * struct i3c_bus - I3C bus object * @cur_master: I3C master currently driving the bus. Since I3C is multi-master
@@ -354,7 +356,7 @@ enum i3c_addr_slot_status {struct i3c_bus {struct i3c_dev_desc *cur_master;int id; -unsigned long addrslots[((I2C_MAX_ADDR +1 ) *2 ) /BITS_PER_LONG ]; +unsigned long addrslots[((I2C_MAX_ADDR +1 ) *I3C_ADDR_SLOT_STATUS_BITS ) /BITS_PER_LONG ];enum i3c_bus_mode mode;struct {unsigned long i3c;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 77/466 i3c: master: Extend address status bit to 4 and add I3C_ADDR_SLOT_EXT_DESIRED
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
[ Upstream commit 2f552fa280590e61bd3dbe66a7b54b99caa642a4 ]
Extend the address status bit to 4 and introduce the I3C_ADDR_SLOT_EXT_DESIRED macro to indicate that a device prefers a specific address. This is generally set by the 'assigned-address' in the device tree source (dts) file.
┌────┬─────────────┬───┬─────────┬───┐
│S/Sr│ 7'h7E RnW=0 │ACK│ ENTDAA │ T ├────┐
└────┴─────────────┴───┴─────────┴───┘ │
┌─────────────────────────────────────────┘
│ ┌──┬─────────────┬───┬─────────────────┬────────────────┬───┬─────────┐
└─►│Sr│7'h7E RnW=1 │ACK│48bit UID BCR DCR│Assign 7bit Addr│PAR│ ACK/NACK│
└──┴─────────────┴───┴─────────────────┴────────────────┴───┴─────────┘Some master controllers (such as HCI) need to prepare the entire above transaction before sending it out to the I3C bus. This means that a 7-bit dynamic address needs to be allocated before knowing the target device's UID information.
However, some I3C targets may request specific addresses (called as "init_dyn_addr"), which is typically specified by the DT-'s assigned-address property. Lower addresses having higher IBI priority. If it is available, i3c_bus_get_free_addr() preferably return a free address that is not in the list of desired addresses (called as "init_dyn_addr"). This allows the device with the "init_dyn_addr" to switch to its "init_dyn_addr" when it hot-joins the I3C bus. Otherwise, if the "init_dyn_addr" is already in use by another I3C device, the target device will not be able to switch to its desired address.
If the previous step fails, fallback returning one of the remaining unassigned address, regardless of its state in the desired list.
Stable-dep-of: 851bd21cdb55 ("i3c: master: Fix dynamic address leak when 'assigned-address' is present")
--- drivers/i3c/master.c | 65 +++++++++++++++++++++++++++++++------- include/linux/i3c/master.h | 7 ++-- 2 files changed, 59 insertions(+), 13 deletions(-)
drivers/i3c/master.c +54 -11
@@ -345,7 +345,7 @@ const struct bus_type i3c_bus_type = {EXPORT_SYMBOL_GPL (i3c_bus_type);static enum i3c_addr_slot_status -i3c_bus_get_addr_slot_status (struct i3c_bus *bus,u16 addr) +i3c_bus_get_addr_slot_status_mask (struct i3c_bus *bus,u16 addr,u32 mask) {unsigned long status;int bitpos = addr *I3C_ADDR_SLOT_STATUS_BITS ;
@@ -356,11 +356,17 @@ i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr) status = bus->addrslots[bitpos /BITS_PER_LONG ]; status >>= bitpos %BITS_PER_LONG ; -return status &I3C_ADDR_SLOT_STATUS_MASK ; +return status & mask; } -static void i3c_bus_set_addr_slot_status (struct i3c_bus *bus,u16 addr, -enum i3c_addr_slot_status status) +static enum i3c_addr_slot_status +i3c_bus_get_addr_slot_status (struct i3c_bus *bus,u16 addr) +{ +return i3c_bus_get_addr_slot_status_mask (bus, addr,I3C_ADDR_SLOT_STATUS_MASK ); +} + +static void i3c_bus_set_addr_slot_status_mask (struct i3c_bus *bus,u16 addr, +enum i3c_addr_slot_status status,u32 mask) {int bitpos = addr *I3C_ADDR_SLOT_STATUS_BITS ;unsigned long *ptr;
@@ -369,9 +375,14 @@ static void i3c_bus_set_addr_slot_status(struct i3c_bus *bus, u16 addr,return ; ptr = bus->addrslots + (bitpos /BITS_PER_LONG ); - *ptr &= ~((unsigned long )I3C_ADDR_SLOT_STATUS_MASK << - (bitpos %BITS_PER_LONG )); - *ptr |= (unsigned long )status << (bitpos %BITS_PER_LONG ); + *ptr &= ~((unsigned long )mask << (bitpos %BITS_PER_LONG )); + *ptr |= ((unsigned long )status & mask) << (bitpos %BITS_PER_LONG ); +} + +static void i3c_bus_set_addr_slot_status (struct i3c_bus *bus,u16 addr, +enum i3c_addr_slot_status status) +{ +i3c_bus_set_addr_slot_status_mask (bus, addr, status,I3C_ADDR_SLOT_STATUS_MASK ); }static bool i3c_bus_dev_addr_is_avail (struct i3c_bus *bus,u8 addr)
@@ -383,13 +394,44 @@ static bool i3c_bus_dev_addr_is_avail(struct i3c_bus *bus, u8 addr)return status ==I3C_ADDR_SLOT_FREE ; } +/* +* ┌────┬─────────────┬───┬─────────┬───┐ +* │S/Sr│ 7'h7E RnW=0 │ACK│ ENTDAA │ T ├────┐ +* └────┴─────────────┴───┴─────────┴───┘ │ +* ┌─────────────────────────────────────────┘ +* │ ┌──┬─────────────┬───┬─────────────────┬────────────────┬───┬─────────┐ +* └─►│Sr│7'h7E RnW=1 │ACK│48bit UID BCR DCR│Assign 7bit Addr│PAR│ ACK/NACK│ +* └──┴─────────────┴───┴─────────────────┴────────────────┴───┴─────────┘ +* Some master controllers (such as HCI) need to prepare the entire above transaction before +* sending it out to the I3C bus. This means that a 7-bit dynamic address needs to be allocated +* before knowing the target device's UID information. +* +* However, some I3C targets may request specific addresses (called as "init_dyn_addr"), which is +* typically specified by the DT-'s assigned-address property. Lower addresses having higher IBI +* priority. If it is available, i3c_bus_get_free_addr() preferably return a free address that is +* not in the list of desired addresses (called as "init_dyn_addr"). This allows the device with +* the "init_dyn_addr" to switch to its "init_dyn_addr" when it hot-joins the I3C bus. Otherwise, +* if the "init_dyn_addr" is already in use by another I3C device, the target device will not be +* able to switch to its desired address. +* +* If the previous step fails, fallback returning one of the remaining unassigned address, +* regardless of its state in the desired list. +*/ static int i3c_bus_get_free_addr (struct i3c_bus *bus,u8 start_addr) {enum i3c_addr_slot_status status;u8 addr;for (addr = start_addr; addr <I3C_MAX_ADDR ; addr++) { - status =i3c_bus_get_addr_slot_status (bus, addr); + status =i3c_bus_get_addr_slot_status_mask (bus, addr, +I3C_ADDR_SLOT_EXT_STATUS_MASK ); +if (status ==I3C_ADDR_SLOT_FREE ) +return addr; + } + +for (addr = start_addr; addr <I3C_MAX_ADDR ; addr++) { + status =i3c_bus_get_addr_slot_status_mask (bus, addr, +I3C_ADDR_SLOT_STATUS_MASK );if (status ==I3C_ADDR_SLOT_FREE )return addr; }
@@ -1918,9 +1960,10 @@ static int i3c_master_bus_init(struct i3c_master_controller *master) goto err_rstdaa; } -i3c_bus_set_addr_slot_status (&master->bus, - i3cboardinfo->init_dyn_addr, -I3C_ADDR_SLOT_I3C_DEV ); +i3c_bus_set_addr_slot_status_mask (&master->bus, + i3cboardinfo->init_dyn_addr, +I3C_ADDR_SLOT_I3C_DEV |I3C_ADDR_SLOT_EXT_DESIRED , +I3C_ADDR_SLOT_EXT_STATUS_MASK );/* * Only try to create/attach devices that have a static
include/linux/i3c/master.h +5 -2
@@ -298,7 +298,8 @@ enum i3c_open_drain_speed {* @I3C_ADDR_SLOT_I2C_DEV: address is assigned to an I2C device * @I3C_ADDR_SLOT_I3C_DEV: address is assigned to an I3C device * @I3C_ADDR_SLOT_STATUS_MASK: address slot mask -* +* @I3C_ADDR_SLOT_EXT_DESIRED: the bitmask represents addresses that are preferred by some devices, +* such as the "assigned-address" property in a device tree source. * On an I3C bus, addresses are assigned dynamically, and we need to know which * addresses are free to use and which ones are already assigned. *
@@ -311,9 +312,11 @@ enum i3c_addr_slot_status {I3C_ADDR_SLOT_I2C_DEV ,I3C_ADDR_SLOT_I3C_DEV ,I3C_ADDR_SLOT_STATUS_MASK =3 , +I3C_ADDR_SLOT_EXT_STATUS_MASK =7 , + I3C_ADDR_SLOT_EXT_DESIRED = BIT(2), }; -#define I3C_ADDR_SLOT_STATUS_BITS 2 +#define I3C_ADDR_SLOT_STATUS_BITS 4/** * struct i3c_bus - I3C bus object
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 78/466 i3c: master: Fix dynamic address leak when assigned-address is present
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
[ Upstream commit 851bd21cdb55e727ab29280bc9f6b678164f802a ]
If the DTS contains 'assigned-address', a dynamic address leak occurs during hotjoin events.
Assume a device have assigned-address 0xb.
- Device issue Hotjoin
- Call i3c_master_do_daa()
- Call driver xxx_do_daa()
- Call i3c_master_get_free_addr() to get dynamic address 0x9
- i3c_master_add_i3c_dev_locked(0x9)
- expected_dyn_addr = newdev->boardinfo->init_dyn_addr (0xb);
- i3c_master_reattach_i3c_dev(newdev(0xb), old_dyn_addr(0x9));
- if (dev->info.dyn_addr != old_dyn_addr &&
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0xb != 0x9 -> TRUE
(!dev->boardinfo ||
^^^^^^^^^^^^^^^ -> FALSE
dev->info.dyn_addr != dev->boardinfo->init_dyn_addr)) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
0xb != 0xb -> FALSE
...
i3c_bus_set_addr_slot_status(&master->bus, old_dyn_addr,
I3C_ADDR_SLOT_FREE);
^^^
This will be skipped. So old_dyn_addr never free
} - i3c_master_get_free_addr() will return increased sequence number.
Remove dev->info.dyn_addr != dev->boardinfo->init_dyn_addr condition check. dev->info.dyn_addr should be checked before calling this function because i3c_master_setnewda_locked() has already been called and the target device has already accepted dyn_addr. It is too late to check if dyn_addr is free in i3c_master_reattach_i3c_dev().
Add check to ensure expected_dyn_addr is free before i3c_master_setnewda_locked().
--- drivers/i3c/master.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)
drivers/i3c/master.c +5 -10
@@ -1548,16 +1548,9 @@ static int i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev, u8 old_dyn_addr) {struct i3c_master_controller *master =i3c_dev_get_master (dev); -enum i3c_addr_slot_status status;int ret; -if (dev->info.dyn_addr != old_dyn_addr && - (!dev->boardinfo || - dev->info.dyn_addr != dev->boardinfo->init_dyn_addr)) { - status =i3c_bus_get_addr_slot_status (&master->bus, - dev->info.dyn_addr); -if (status !=I3C_ADDR_SLOT_FREE ) -return -EBUSY ; +if (dev->info.dyn_addr != old_dyn_addr) {i3c_bus_set_addr_slot_status (&master->bus, dev->info.dyn_addr,I3C_ADDR_SLOT_I3C_DEV );
@@ -1960,9 +1953,10 @@ static int i3c_master_bus_init(struct i3c_master_controller *master) goto err_rstdaa; } +/* Do not mark as occupied until real device exist in bus */ i3c_bus_set_addr_slot_status_mask (&master->bus, i3cboardinfo->init_dyn_addr, -I3C_ADDR_SLOT_I3C_DEV |I3C_ADDR_SLOT_EXT_DESIRED , +I3C_ADDR_SLOT_EXT_DESIRED ,I3C_ADDR_SLOT_EXT_STATUS_MASK );/*
@@ -2131,7 +2125,8 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master,else expected_dyn_addr = newdev->info.dyn_addr; -if (newdev->info.dyn_addr != expected_dyn_addr) { +if (newdev->info.dyn_addr != expected_dyn_addr && +i3c_bus_get_addr_slot_status (&master->bus, expected_dyn_addr) ==I3C_ADDR_SLOT_FREE ) {/* * Try to apply the expected dynamic address. If it fails, keep * the address assigned by the master.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 79/466 drm/amd/display: calculate final viewport before TAP optimization
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yihan Zhu <[email protected]>
[ Upstream commit e982310c9ce074e428abc260dc3cba1b1ea62b78 ]
Viewport size excess surface size observed sometime with some timings or resizing the MPO video window to cause MPO unsupported. Calculate final viewport size first with a 100x100 dummy viewport to get the max TAP support and then re-run final viewport calculation if TAP value changed. Removed obsolete preliminary viewport calculation for TAP validation.
Stable-dep-of: c33a93201ca0 ("drm/amd/display: Ignore scalar validation failure if pipe is phantom")
--- .../gpu/drm/amd/display/dc/core/dc_resource.c | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc_resource.c +23 -26
@@ -765,25 +765,6 @@ static inline void get_vp_scan_direction( *flip_horz_scan_dir = !*flip_horz_scan_dir; } -/* -* This is a preliminary vp size calculation to allow us to check taps support. -* The result is completely overridden afterwards. -*/ -static void calculate_viewport_size (struct pipe_ctx *pipe_ctx) -{ -struct scaler_data *data = &pipe_ctx->plane_res.scl_data; - - data->viewport.width =dc_fixpt_ceil (dc_fixpt_mul_int (data->ratios.horz, data->recout.width)); - data->viewport.height =dc_fixpt_ceil (dc_fixpt_mul_int (data->ratios.vert, data->recout.height)); - data->viewport_c.width =dc_fixpt_ceil (dc_fixpt_mul_int (data->ratios.horz_c, data->recout.width)); - data->viewport_c.height =dc_fixpt_ceil (dc_fixpt_mul_int (data->ratios.vert_c, data->recout.height)); -if (pipe_ctx->plane_state->rotation ==ROTATION_ANGLE_90 || - pipe_ctx->plane_state->rotation ==ROTATION_ANGLE_270 ) { -swap (data->viewport.width, data->viewport.height); -swap (data->viewport_c.width, data->viewport_c.height); - } -} -static struct rect intersect_rec (const struct rect *r0,const struct rect *r1) {struct rect rec;
@@ -1468,6 +1449,7 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx)const struct dc_plane_state *plane_state = pipe_ctx->plane_state;struct dc_crtc_timing *timing = &pipe_ctx->stream->timing;const struct rect odm_slice_src =resource_get_odm_slice_src_rect (pipe_ctx); +struct scaling_taps temp = {0 };bool res = false;DC_LOGGER_INIT (pipe_ctx->stream->ctx->logger);
@@ -1525,8 +1507,6 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx)calculate_recout (pipe_ctx);/* depends on pixel format */ calculate_scaling_ratios (pipe_ctx); -/* depends on scaling ratios and recout, does not calculate offset yet */ -calculate_viewport_size (pipe_ctx);/* * LB calculations depend on vp size, h/v_active and scaling ratios
@@ -1547,6 +1527,24 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx) pipe_ctx->plane_res.scl_data.lb_params.alpha_en = plane_state->per_pixel_alpha; +// get TAP value with 100x100 dummy data for max scaling qualify, override +// if a new scaling quality required + pipe_ctx->plane_res.scl_data.viewport.width =100 ; + pipe_ctx->plane_res.scl_data.viewport.height =100 ; + pipe_ctx->plane_res.scl_data.viewport_c.width =100 ; + pipe_ctx->plane_res.scl_data.viewport_c.height =100 ; +if (pipe_ctx->plane_res.xfm !=NULL ) + res = pipe_ctx->plane_res.xfm->funcs->transform_get_optimal_number_of_taps ( + pipe_ctx->plane_res.xfm, &pipe_ctx->plane_res.scl_data, &plane_state->scaling_quality); + +if (pipe_ctx->plane_res.dpp !=NULL ) + res = pipe_ctx->plane_res.dpp->funcs->dpp_get_optimal_number_of_taps ( + pipe_ctx->plane_res.dpp, &pipe_ctx->plane_res.scl_data, &plane_state->scaling_quality); + + temp = pipe_ctx->plane_res.scl_data.taps; + +calculate_inits_and_viewports (pipe_ctx); +if (pipe_ctx->plane_res.xfm !=NULL ) res = pipe_ctx->plane_res.xfm->funcs->transform_get_optimal_number_of_taps ( pipe_ctx->plane_res.xfm, &pipe_ctx->plane_res.scl_data, &plane_state->scaling_quality);
@@ -1573,11 +1571,10 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx) &plane_state->scaling_quality); } -/* -* Depends on recout, scaling ratios, h_active and taps -* May need to re-check lb size after this in some obscure scenario -*/ -if (res) +if (res && (pipe_ctx->plane_res.scl_data.taps.v_taps != temp.v_taps || + pipe_ctx->plane_res.scl_data.taps.h_taps != temp.h_taps || + pipe_ctx->plane_res.scl_data.taps.v_taps_c != temp.v_taps_c || + pipe_ctx->plane_res.scl_data.taps.h_taps_c != temp.h_taps_c))calculate_inits_and_viewports (pipe_ctx);/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 80/466 drm/amd/display: Ignore scalar validation failure if pipe is phantom
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Park <[email protected]>
[ Upstream commit c33a93201ca07119de90e8c952fbdf65920ab55d ]
[Why]
There are some pipe scaler validation failure when the pipe is phantom and causes crash in DML validation. Since, scalar parameters are not as important in phantom pipe and we require this plane to do successful MCLK switches, the failure condition can be ignored.
[How]
Ignore scalar validation failure if the pipe validation is marked as phantom pipe.
--- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc_resource.c +8 -0
@@ -1501,6 +1501,10 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx) res =spl_calculate_scaler_params (spl_in, spl_out);// Convert respective out params from SPL to scaler data translate_SPL_out_params_to_pipe_ctx (pipe_ctx, spl_out); + +/* Ignore scaler failure if pipe context plane is phantom plane */ +if (!res && plane_state->is_phantom) + res = true; }else {#endif /* depends on h_active */
@@ -1571,6 +1575,10 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx) &plane_state->scaling_quality); } +/* Ignore scaler failure if pipe context plane is phantom plane */ +if (!res && plane_state->is_phantom) + res = true; + if (res && (pipe_ctx->plane_res.scl_data.taps.v_taps != temp.v_taps || pipe_ctx->plane_res.scl_data.taps.h_taps != temp.h_taps || pipe_ctx->plane_res.scl_data.taps.v_taps_c != temp.v_taps_c ||
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 81/466 scsi: ufs: core: Always initialize the UIC done completion
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
[ Upstream commit b1e8c53749adb795bfb0bf4e2f7836e26684bb90 ]
Simplify __ufshcd_send_uic_cmd() by always initializing the uic_cmd::done completion. This is fine since the time required to initialize a completion is small compared to the time required to process an UIC command.
Stable-dep-of: 60b4dd1460f6 ("scsi: ufs: core: Add ufshcd_send_bsg_uic_cmd() for UFS BSG")
--- drivers/ufs/core/ufshcd.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/ufs/core/ufshcd.c +4 -7
@@ -2551,13 +2551,11 @@ ufshcd_wait_for_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)* __ufshcd_send_uic_cmd - Send UIC commands and retrieve the result * @hba: per adapter instance * @uic_cmd: UIC command -* @completion: initialize the completion only if this is set to true * * Return: 0 only if success. */ static int -__ufshcd_send_uic_cmd (struct ufs_hba *hba,struct uic_command *uic_cmd, -bool completion) +__ufshcd_send_uic_cmd (struct ufs_hba *hba,struct uic_command *uic_cmd) {lockdep_assert_held (&hba->uic_cmd_mutex);
@@ -2567,8 +2565,7 @@ __ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd,return -EIO ; } -if (completion) -init_completion (&uic_cmd->done); +init_completion (&uic_cmd->done); uic_cmd->cmd_active =1 ;ufshcd_dispatch_uic_cmd (hba, uic_cmd);
@@ -2594,7 +2591,7 @@ int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)mutex_lock (&hba->uic_cmd_mutex);ufshcd_add_delay_before_dme_cmd (hba); - ret =__ufshcd_send_uic_cmd (hba, uic_cmd, true); + ret =__ufshcd_send_uic_cmd (hba, uic_cmd);if (!ret) ret =ufshcd_wait_for_uic_cmd (hba, uic_cmd);
@@ -4288,7 +4285,7 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd) reenable_intr = true; }spin_unlock_irqrestore (hba->host->host_lock, flags); - ret =__ufshcd_send_uic_cmd (hba, cmd, false); + ret =__ufshcd_send_uic_cmd (hba, cmd);if (ret) { dev_err(hba->dev, "pwr ctrl cmd 0x%x with mode 0x%x uic error %d\n",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 82/466 scsi: ufs: core: Add ufshcd_send_bsg_uic_cmd() for UFS BSG
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ziqi Chen <[email protected]>
[ Upstream commit 60b4dd1460f6d65739acb0f28d12bd9abaeb34b4 ]
User layer applications can send UIC GET/SET commands via the BSG framework, and if the user layer application sends a UIC SET command to the PA_PWRMODE attribute, a power mode change shall be initiated in UniPro and two interrupts shall be triggered if the power mode is successfully changed, i.e., UIC Command Completion interrupt and UIC Power Mode interrupt.
The current UFS BSG code calls ufshcd_send_uic_cmd() directly, with which the second interrupt, i.e., UIC Power Mode interrupt, shall be treated as unhandled interrupt. In addition, after the UIC command is completed, user layer application has to poll UniPro and/or M-PHY state machine to confirm the power mode change is finished.
Add a new wrapper function ufshcd_send_bsg_uic_cmd() and call it from ufs_bsg_request() so that if a UIC SET command is targeting the PA_PWRMODE attribute it can be redirected to ufshcd_uic_pwr_ctrl().
--- drivers/ufs/core/ufs_bsg.c | 2 +- drivers/ufs/core/ufshcd-priv.h | 1 + drivers/ufs/core/ufshcd.c | 36 ++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-)
drivers/ufs/core/ufs_bsg.c +1 -1
@@ -170,7 +170,7 @@ static int ufs_bsg_request(struct bsg_job *job)break ;case UPIU_TRANSACTION_UIC_CMD :memcpy (&uc, &bsg_request->upiu_req.uc,UIC_CMD_SIZE ); - ret =ufshcd_send_uic_cmd (hba, &uc); + ret =ufshcd_send_bsg_uic_cmd (hba, &uc);if (ret)dev_err (hba->dev,"send uic cmd: error code %d\n" , ret);
drivers/ufs/core/ufshcd-priv.h +1 -0
@@ -84,6 +84,7 @@ int ufshcd_read_string_desc(struct ufs_hba *hba, u8 desc_index, u8 **buf, bool ascii);int ufshcd_send_uic_cmd (struct ufs_hba *hba,struct uic_command *uic_cmd); +int ufshcd_send_bsg_uic_cmd (struct ufs_hba *hba,struct uic_command *uic_cmd); int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba, struct utp_upiu_req *req_upiu,
drivers/ufs/core/ufshcd.c +36 -0
@@ -4340,6 +4340,42 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)return ret; } +/** +* ufshcd_send_bsg_uic_cmd - Send UIC commands requested via BSG layer and retrieve the result +* @hba: per adapter instance +* @uic_cmd: UIC command +* +* Return: 0 only if success. +*/ +int ufshcd_send_bsg_uic_cmd (struct ufs_hba *hba,struct uic_command *uic_cmd) +{ +int ret; + +if (hba->quirks &UFSHCD_QUIRK_BROKEN_UIC_CMD ) +return 0 ; + +ufshcd_hold (hba); + +if (uic_cmd->argument1 ==UIC_ARG_MIB (PA_PWRMODE ) && + uic_cmd->command ==UIC_CMD_DME_SET ) { + ret =ufshcd_uic_pwr_ctrl (hba, uic_cmd); + goto out; + } + +mutex_lock (&hba->uic_cmd_mutex); +ufshcd_add_delay_before_dme_cmd (hba); + + ret =__ufshcd_send_uic_cmd (hba, uic_cmd); +if (!ret) + ret =ufshcd_wait_for_uic_cmd (hba, uic_cmd); + +mutex_unlock (&hba->uic_cmd_mutex); + +out: +ufshcd_release (hba); +return ret; +} +/** * ufshcd_uic_change_pwr_mode - Perform the UIC power mode chage * using DME_SET primitives.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 83/466 bpf, vsock: Fix poll() missing a queue
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Luczaj <[email protected]>
[ Upstream commit 9f0fc98145218ff8f50d8cfa3b393785056c53e1 ]
When a verdict program simply passes a packet without redirection, sk_msg is enqueued on sk_psock::ingress_msg. Add a missing check to poll().
--- net/vmw_vsock/af_vsock.c | 3 +++ 1 file changed, 3 insertions(+)
net/vmw_vsock/af_vsock.c +3 -0
@@ -1054,6 +1054,9 @@ static __poll_t vsock_poll(struct file *file, struct socket *sock, mask |=EPOLLRDHUP ; } +if (sk_is_readable (sk)) + mask |=EPOLLIN |EPOLLRDNORM ; +if (sock->type ==SOCK_DGRAM ) {/* For datagram sockets we can read if there is something in * the queue and write as long as the socket isn't shutdown for
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 84/466 bpf, vsock: Invoke proto::close on close()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Luczaj <[email protected]>
[ Upstream commit 135ffc7becc82cfb84936ae133da7969220b43b2 ]
vsock defines a BPF callback to be invoked when close() is called. However, this callback is never actually executed. As a result, a closed vsock socket is not automatically removed from the sockmap/sockhash.
Introduce a dummy vsock_close() and make vsock_release() call proto::close.
Note: changes in __vsock_release() look messy, but it's only due to indent level reduction and variables xmas tree reorder.
--- net/vmw_vsock/af_vsock.c | 67 ++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 27 deletions(-)
net/vmw_vsock/af_vsock.c +40 -27
@@ -117,12 +117,14 @@static int __vsock_bind (struct sock *sk,struct sockaddr_vm *addr);static void vsock_sk_destruct (struct sock *sk);static int vsock_queue_rcv_skb (struct sock *sk,struct sk_buff *skb); +static void vsock_close (struct sock *sk,long timeout);/* Protocol family. */ struct proto vsock_proto = { .name ="AF_VSOCK" , .owner =THIS_MODULE , .obj_size =sizeof (struct vsock_sock ), + .close = vsock_close, #ifdef CONFIG_BPF_SYSCALL .psock_update_sk_prot = vsock_bpf_update_proto, #endif
@@ -797,39 +799,37 @@ static bool sock_type_connectible(u16 type)static void __vsock_release (struct sock *sk,int level) { -if (sk) { -struct sock *pending; -struct vsock_sock *vsk; - - vsk =vsock_sk (sk); - pending =NULL ;/* Compiler warning. */ +struct vsock_sock *vsk; +struct sock *pending; -/* When "level" is SINGLE_DEPTH_NESTING, use the nested -* version to avoid the warning "possible recursive locking -* detected". When "level" is 0, lock_sock_nested(sk, level) -* is the same as lock_sock(sk). -*/ -lock_sock_nested (sk, level); + vsk =vsock_sk (sk); + pending =NULL ;/* Compiler warning. */ -if (vsk->transport) - vsk->transport->release (vsk); -else if (sock_type_connectible (sk->sk_type)) -vsock_remove_sock (vsk); +/* When "level" is SINGLE_DEPTH_NESTING, use the nested +* version to avoid the warning "possible recursive locking +* detected". When "level" is 0, lock_sock_nested(sk, level) +* is the same as lock_sock(sk). +*/ +lock_sock_nested (sk, level); -sock_orphan (sk); - sk->sk_shutdown =SHUTDOWN_MASK ; +if (vsk->transport) + vsk->transport->release (vsk); +else if (sock_type_connectible (sk->sk_type)) +vsock_remove_sock (vsk); -skb_queue_purge (&sk->sk_receive_queue); +sock_orphan (sk); + sk->sk_shutdown =SHUTDOWN_MASK ; -/* Clean up any sockets that never were accepted. */ -while ((pending =vsock_dequeue_accept (sk)) !=NULL ) { -__vsock_release (pending,SINGLE_DEPTH_NESTING ); -sock_put (pending); - } +skb_queue_purge (&sk->sk_receive_queue); -release_sock (sk); -sock_put (sk); +/* Clean up any sockets that never were accepted. */ +while ((pending =vsock_dequeue_accept (sk)) !=NULL ) { +__vsock_release (pending,SINGLE_DEPTH_NESTING ); +sock_put (pending); } + +release_sock (sk); +sock_put (sk); }static void vsock_sk_destruct (struct sock *sk)
@@ -901,9 +901,22 @@ void vsock_data_ready(struct sock *sk) }EXPORT_SYMBOL_GPL (vsock_data_ready); +/* Dummy callback required by sockmap. +* See unconditional call of saved_close() in sock_map_close(). +*/ +static void vsock_close (struct sock *sk,long timeout) +{ +} +static int vsock_release (struct socket *sock) { -__vsock_release (sock->sk,0 ); +struct sock *sk = sock->sk; + +if (!sk) +return 0 ; + + sk->sk_prot->close (sk,0 ); +__vsock_release (sk,0 ); sock->sk =NULL ; sock->state =SS_FREE ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 85/466 xsk: always clear DMA mapping information when unmapping the pool
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larysa Zaremba <[email protected]>
[ Upstream commit ac9a48a6f1610b094072b815e884e1668aea4401 ]
When the umem is shared, the DMA mapping is also shared between the xsk pools, therefore it should stay valid as long as at least 1 user remains. However, the pool also keeps the copies of DMA-related information that are initialized in the same way in xp_init_dma_info(), but cleared by xp_dma_unmap() only for the last remaining pool, this causes the problems below.
The first one is that the commit adbf5a42341f ("ice: remove af_xdp_zc_qps bitmap") relies on pool->dev to determine the presence of a ZC pool on a given queue, avoiding internal bookkeeping. This works perfectly fine if the UMEM is not shared, but reliably fails otherwise as stated in the linked report.
The second one is pool->dma_pages which is dynamically allocated and only freed in xp_dma_unmap(), this leads to a small memory leak. kmemleak does not catch it, but by printing the allocation results after terminating the userspace program it is possible to see that all addresses except the one belonging to the last detached pool are still accessible through the kmemleak dump functionality.
Always clear the DMA mapping information from the pool and free pool->dma_pages when unmapping the pool, so that the only difference between results of the last remaining user's call and the ones before would be the destruction of the DMA mapping.
--- net/xdp/xsk_buff_pool.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
net/xdp/xsk_buff_pool.c +2 -3
@@ -387,10 +387,9 @@ void xp_dma_unmap(struct xsk_buff_pool *pool, unsigned long attrs)return ; } -if (!refcount_dec_and_test (&dma_map->users)) -return ; +if (refcount_dec_and_test (&dma_map->users)) +__xp_dma_unmap (dma_map, attrs); -__xp_dma_unmap (dma_map, attrs);kvfree (pool->dma_pages); pool->dma_pages =NULL ; pool->dma_pages_cnt =0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 86/466 bpftool: fix potential NULL pointer dereferencing in prog_dump()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amir Mohammadi <[email protected]>
[ Upstream commit ef3ba8c258ee368a5343fa9329df85b4bcb9e8b5 ]
A NULL pointer dereference could occur if ksyms
is not properly checked before usage in the prog_dump() function.
--- tools/bpf/bpftool/prog.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
tools/bpf/bpftool/prog.c +12 -5
@@ -822,11 +822,18 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,printf ("%s:\n" , sym_name); } -if (disasm_print_insn (img, lens[i], opcodes, - name, disasm_opt, btf, - prog_linfo, ksyms[i], i, - linum)) - goto exit_free; +if (ksyms) { +if (disasm_print_insn (img, lens[i], opcodes, + name, disasm_opt, btf, + prog_linfo, ksyms[i], i, + linum)) + goto exit_free; + }else { +if (disasm_print_insn (img, lens[i], opcodes, + name, disasm_opt, btf, +NULL ,0 ,0 , false)) + goto exit_free; + } img += lens[i];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 87/466 drm/sti: Add __iomem for mixer_dbg_mxns parameter
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pei Xiao <[email protected]>
[ Upstream commit 86e8f94789dd6f3e705bfa821e1e416f97a2f863 ]
Sparse complains about incorrect type in argument 1. expected void const volatile __iomem *ptr but got void *. so modify mixer_dbg_mxn's addr parameter.
--- drivers/gpu/drm/sti/sti_mixer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/sti/sti_mixer.c +1 -1
@@ -137,7 +137,7 @@ static void mixer_dbg_crb(struct seq_file *s, int val) } } -static void mixer_dbg_mxn (struct seq_file *s,void *addr) +static void mixer_dbg_mxn (struct seq_file *s,void __iomem *addr) {int i;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 88/466 tcp_bpf: Fix the sk_mem_uncharge logic in tcp_bpf_sendmsg
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit ca70b8baf2bd125b2a4d96e76db79375c07d7ff2 ]
The current sk memory accounting logic in __SK_REDIRECT is pre-uncharging tosend bytes, which is either msg->sg.size or a smaller value apply_bytes.
Potential problems with this strategy are as follows:
- If the actual sent bytes are smaller than tosend, we need to charge some bytes back, as in line 487, which is okay but seems not clean.
- When tosend is set to apply_bytes, as in line 417, and (ret < 0), we may miss uncharging (msg->sg.size - apply_bytes) bytes.
[...]
415 tosend = msg->sg.size;
416 if (psock->apply_bytes && psock->apply_bytes < tosend)
417 tosend = psock->apply_bytes;
[...]
443 sk_msg_return(sk, msg, tosend);
444 release_sock(sk);
446 origsize = msg->sg.size;
447 ret = tcp_bpf_sendmsg_redir(sk_redir, redir_ingress,
448 msg, tosend, flags);
449 sent = origsize - msg->sg.size;
[...]
454 lock_sock(sk);
455 if (unlikely(ret < 0)) {
456 int free = sk_msg_free_nocharge(sk, msg);
458 if (!cork)
459 *copied -= free;
460 }
[...]
487 if (eval == __SK_REDIRECT)
488 sk_mem_charge(sk, tosend - sent);
[...]
When running the selftest test_txmsg_redir_wait_sndmem with txmsg_apply, the following warning will be reported:
------------[ cut here ]------------ WARNING: CPU: 6 PID: 57 at net/ipv4/af_inet.c:156 inet_sock_destruct+0x190/0x1a0 Modules linked in: CPU: 6 UID: 0 PID: 57 Comm: kworker/6:0 Not tainted 6.12.0-rc1.bm.1-amd64+ #43 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014 Workqueue: events sk_psock_destroy RIP: 0010:inet_sock_destruct+0x190/0x1a0 RSP: 0018:ffffad0a8021fe08 EFLAGS: 00010206 RAX: 0000000000000011 RBX: ffff9aab4475b900 RCX: ffff9aab481a0800 RDX: 0000000000000303 RSI: 0000000000000011 RDI: ffff9aab4475b900 RBP: ffff9aab4475b990 R08: 0000000000000000 R09: ffff9aab40050ec0 R10: 0000000000000000 R11: ffff9aae6fdb1d01 R12: ffff9aab49c60400 R13: ffff9aab49c60598 R14: ffff9aab49c60598 R15: dead000000000100 FS: 0000000000000000(0000) GS:ffff9aae6fd80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007ffec7e47bd8 CR3: 00000001a1a1c004 CR4: 0000000000770ef0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <TASK> ? __warn+0x89/0x130 ? inet_sock_destruct+0x190/0x1a0 ? report_bug+0xfc/0x1e0 ? handle_bug+0x5c/0xa0 ? exc_invalid_op+0x17/0x70 ? asm_exc_invalid_op+0x1a/0x20 ? inet_sock_destruct+0x190/0x1a0 __sk_destruct+0x25/0x220 sk_psock_destroy+0x2b2/0x310 process_scheduled_works+0xa3/0x3e0 worker_thread+0x117/0x240 ? __pfx_worker_thread+0x10/0x10 kthread+0xcf/0x100 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x31/0x40 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK> ---[ end trace 0000000000000000 ]---
In __SK_REDIRECT, a more concise way is delaying the uncharging after sent bytes are finalized, and uncharge this value. When (ret < 0), we shall invoke sk_msg_free.
Same thing happens in case __SK_DROP, when tosend is set to apply_bytes, we may miss uncharging (msg->sg.size - apply_bytes) bytes. The same warning will be reported in selftest.
[...]
468 case __SK_DROP:
469 default:
470 sk_msg_free_partial(sk, msg, tosend);
471 sk_msg_apply_bytes(psock, tosend);
472 *copied -= (tosend + delta);
473 return -EACCES;
[...]
So instead of sk_msg_free_partial we can do sk_msg_free here.
--- net/ipv4/tcp_bpf.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
net/ipv4/tcp_bpf.c +4 -7
@@ -441,7 +441,6 @@ static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock, cork = true; psock->cork =NULL ; } -sk_msg_return (sk, msg, tosend);release_sock (sk); origsize = msg->sg.size;
@@ -453,8 +452,9 @@ static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock,sock_put (sk_redir);lock_sock (sk); +sk_mem_uncharge (sk, sent);if (unlikely (ret <0 )) { -int free =sk_msg_free_nocharge (sk, msg); +int free =sk_msg_free (sk, msg);if (!cork) *copied -= free;
@@ -468,7 +468,7 @@ static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock,break ;case __SK_DROP:default : -sk_msg_free_partial (sk, msg, tosend); +sk_msg_free (sk, msg);sk_msg_apply_bytes (psock, tosend); *copied -= (tosend + delta);return -EACCES ;
@@ -484,11 +484,8 @@ static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock, }if (msg && msg->sg.data[msg->sg.start].page_link && - msg->sg.data[msg->sg.start].length) { -if (eval == __SK_REDIRECT) -sk_mem_charge (sk, tosend - sent); + msg->sg.data[msg->sg.start].length) goto more_data; - } }return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 89/466 ALSA: seq: ump: Fix seq port updates per FB info notify
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit aaa55faa2495320e44bc643a917c701f2cc89ee7 ]
update_port_infos() is called when a UMP FB Info update notification is received, and this function is supposed to update the attributes of the corresponding sequencer port. However, the function had a few issues and it brought to the incorrect states. Namely:
- It tried to get a wrong sequencer info for the update without correcting the port number with the group-offset 1
- The loop exited immediately when a sequencer port isn't present; this ended up with the truncation if a sequencer port in the middle goes away
This patch addresses those bugs.
--- sound/core/seq/seq_ump_client.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/core/seq/seq_ump_client.c +3 -3
@@ -257,12 +257,12 @@ static void update_port_infos(struct seq_ump_client *client)continue ; old->addr.client = client->seq_client; - old->addr.port = i; + old->addr.port =ump_group_to_seq_port (i); err =snd_seq_kernel_client_ctl (client->seq_client,SNDRV_SEQ_IOCTL_GET_PORT_INFO , old);if (err <0 ) -return ; +continue ;fill_port_info (new, client, &client->ump->groups[i]);if (old->capability == new->capability && !strcmp (old->name, new->name))
@@ -271,7 +271,7 @@ static void update_port_infos(struct seq_ump_client *client)SNDRV_SEQ_IOCTL_SET_PORT_INFO , new);if (err <0 ) -return ; +continue ;/* notify to system port */ snd_seq_system_client_ev_port_change (client->seq_client, i); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 90/466 ALSA: usb-audio: Notify xrun for low-latency mode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 4f9d674377d090e38d93360bd4df21b67534d622 ]
The low-latency mode of USB-audio driver uses a similar approach like the implicit feedback mode but it has an explicit queuing at the trigger start time. The difference is, however, that no packet will be handled any longer after all queued packets are handled but no enough data is fed. In the case of implicit feedback mode, the capture-side packet handling triggers the re-queuing, and this checks the XRUN. OTOH, in the low-latency mode, it just stops without XRUN notification unless any new action is taken from user-space via ack callback. For example, when you stop the stream in aplay, no XRUN is reported.
This patch adds the XRUN check at the packet complete callback in the case all pending URBs are exhausted. Strictly speaking, this state doesn't match really with XRUN; in theory the application may queue immediately after this happens. But such behavior is only for 1-period configuration, which the USB-audio driver doesn't support. So we may conclude that this situation leads certainly to XRUN.
A caveat is that the XRUN should be triggered only for the PCM RUNNING state, and not during DRAINING. This additional state check is put in notify_xrun(), too.
--- sound/usb/endpoint.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
sound/usb/endpoint.c +11 -3
@@ -403,10 +403,15 @@ static int prepare_inbound_urb(struct snd_usb_endpoint *ep,static void notify_xrun (struct snd_usb_endpoint *ep) {struct snd_usb_substream *data_subs; +struct snd_pcm_substream *psubs; data_subs =READ_ONCE (ep->data_subs); -if (data_subs && data_subs->pcm_substream) -snd_pcm_stop_xrun (data_subs->pcm_substream); +if (!data_subs) +return ; + psubs = data_subs->pcm_substream; +if (psubs && psubs->runtime && + psubs->runtime->state ==SNDRV_PCM_STATE_RUNNING ) +snd_pcm_stop_xrun (psubs); } static struct snd_usb_packet_info *
@@ -562,7 +567,10 @@ static void snd_complete_urb(struct urb *urb)push_back_to_ready_list (ep, ctx);clear_bit (ctx->index, &ep->active_mask);snd_usb_queue_pending_output_urbs (ep, false); -atomic_dec (&ep->submitted_urbs);/* decrement at last */ +/* decrement at last, and check xrun */ +if (atomic_dec_and_test (&ep->submitted_urbs) && + !snd_usb_endpoint_implicit_feedback_sink (ep)) +notify_xrun (ep);return ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 91/466 tools: Override makefile ARCH variable if defined, but empty
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Björn Töpel <[email protected]>
[ Upstream commit 537a2525eaf76ea9b0dca62b994500d8670b39d5 ]
There are a number of tools (bpftool, selftests), that require a "bootstrap" build. Here, a bootstrap build is a build host variant of a target. E.g., assume that you're performing a bpftool cross-build on x86 to riscv, a bootstrap build would then be an x86 variant of bpftool. The typical way to perform the host build variant, is to pass "ARCH=" in a sub-make. However, if a variable has been set with a command argument, then ordinary assignments in the makefile are ignored.
This side-effect results in that ARCH, and variables depending on ARCH are not set. Workaround by overriding ARCH to the host arch, if ARCH is empty.
--- tools/scripts/Makefile.arch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/scripts/Makefile.arch +2 -2
@@ -7,8 +7,8 @@ HOSTARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ \ -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ \ -e s/riscv.*/riscv/ -e s/loongarch.*/loongarch/) -ifndef ARCH -ARCH := $(HOSTARCH) +ifeq ($(strip $(ARCH)),) +override ARCH := $(HOSTARCH) endif SRCARCH := $(ARCH)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 92/466 spi: mpc52xx: Add cancel_work_sync before module remove
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pei Xiao <[email protected]>
[ Upstream commit 984836621aad98802d92c4a3047114cf518074c8 ]
If we remove the module which will call mpc52xx_spi_remove it will free 'ms' through spi_unregister_controller. while the work ms->work will be used. The sequence of operations that may lead to a UAF bug.
Fix it by ensuring that the work is canceled before proceeding with the cleanup in mpc52xx_spi_remove.
--- drivers/spi/spi-mpc52xx.c | 1 + 1 file changed, 1 insertion(+)
drivers/spi/spi-mpc52xx.c +1 -0
@@ -520,6 +520,7 @@ static void mpc52xx_spi_remove(struct platform_device *op)struct mpc52xx_spi *ms =spi_controller_get_devdata (host);int i; +cancel_work_sync (&ms->work);free_irq (ms->irq0, ms);free_irq (ms->irq1, ms);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 93/466 ASoC: SOF: ipc3-topology: Convert the topology pin index to ALH dai index
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bard Liao <[email protected]>
[ Upstream commit e9db1b551774037ebe39dde4a658d89ba95e260b ]
Intel SoundWire machine driver always uses Pin number 2 and above. Currently, the pin number is used as the FW DAI index directly. As a result, FW DAI 0 and 1 are never used. That worked fine because we use up to 2 DAIs in a SDW link. Convert the topology pin index to ALH dai index, the mapping is using 2-off indexing, iow, pin #2 is ALH dai #0.
The issue exists since beginning. And the Fixes tag is the first commit that this commit can be applied.
Stable-dep-of: 6d544ea21d36 ("ASoC: SOF: ipc3-topology: fix resource leaks in sof_ipc3_widget_setup_comp_dai()")
--- sound/soc/sof/ipc3-topology.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
sound/soc/sof/ipc3-topology.c +24 -2
@@ -20,6 +20,9 @@/* size of tplg ABI in bytes */ #define SOF_IPC3_TPLG_ABI_SIZE 3 +/* Base of SOF_DAI_INTEL_ALH, this should be aligned with SOC_SDW_INTEL_BIDIR_PDI_BASE */ +#define INTEL_ALH_DAI_INDEX_BASE 2 +struct sof_widget_data {int ctrl_type;int ipc_cmd;
@@ -1594,6 +1597,17 @@ static int sof_ipc3_widget_setup_comp_dai(struct snd_sof_widget *swidget)if (ret <0 ) goto free; +/* Subtract the base to match the FW dai index. */ +if (comp_dai->type ==SOF_DAI_INTEL_ALH ) { +if (comp_dai->dai_index <INTEL_ALH_DAI_INDEX_BASE ) { +dev_err (sdev->dev, +"Invalid ALH dai index %d, only Pin numbers >= %d can be used\n" , + comp_dai->dai_index,INTEL_ALH_DAI_INDEX_BASE ); +return -EINVAL ; + } + comp_dai->dai_index -=INTEL_ALH_DAI_INDEX_BASE ; + } +dev_dbg (scomp->dev,"dai %s: type %d index %d\n" , swidget->widget->name, comp_dai->type, comp_dai->dai_index);sof_dbg_comp_config (scomp, &comp_dai->config);
@@ -2167,8 +2181,16 @@ static int sof_ipc3_dai_config(struct snd_sof_dev *sdev, struct snd_sof_widget *case SOF_DAI_INTEL_ALH :if (data) {/* save the dai_index during hw_params and reuse it for hw_free */ -if (flags &SOF_DAI_CONFIG_FLAGS_HW_PARAMS ) - config->dai_index = data->dai_index; +if (flags &SOF_DAI_CONFIG_FLAGS_HW_PARAMS ) { +/* Subtract the base to match the FW dai index. */ +if (data->dai_index <INTEL_ALH_DAI_INDEX_BASE ) { +dev_err (sdev->dev, +"Invalid ALH dai index %d, only Pin numbers >= %d can be used\n" , + config->dai_index,INTEL_ALH_DAI_INDEX_BASE ); +return -EINVAL ; + } + config->dai_index = data->dai_index -INTEL_ALH_DAI_INDEX_BASE ; + } config->alh.stream_id = data->dai_data; }break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 94/466 ASoC: SOF: ipc3-topology: fix resource leaks in sof_ipc3_widget_setup_comp_dai()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 6d544ea21d367cbd9746ae882e67a839391a6594 ]
These error paths should free comp_dai before returning.
--- sound/soc/sof/ipc3-topology.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
sound/soc/sof/ipc3-topology.c +4 -3
@@ -1588,14 +1588,14 @@ static int sof_ipc3_widget_setup_comp_dai(struct snd_sof_widget *swidget) ret =sof_update_ipc_object (scomp, comp_dai,SOF_DAI_TOKENS , swidget->tuples, swidget->num_tuples,sizeof (*comp_dai),1 );if (ret <0 ) - goto free; + goto free_comp;/* update comp_tokens */ ret =sof_update_ipc_object (scomp, &comp_dai->config,SOF_COMP_TOKENS , swidget->tuples, swidget->num_tuples,sizeof (comp_dai->config),1 );if (ret <0 ) - goto free; + goto free_comp;/* Subtract the base to match the FW dai index. */ if (comp_dai->type ==SOF_DAI_INTEL_ALH ) {
@@ -1603,7 +1603,8 @@ static int sof_ipc3_widget_setup_comp_dai(struct snd_sof_widget *swidget)dev_err (sdev->dev,"Invalid ALH dai index %d, only Pin numbers >= %d can be used\n" , comp_dai->dai_index,INTEL_ALH_DAI_INDEX_BASE ); -return -EINVAL ; + ret = -EINVAL ; + goto free_comp; } comp_dai->dai_index -=INTEL_ALH_DAI_INDEX_BASE ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 95/466 pmdomain: core: Add missing put_device()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ulf Hansson <[email protected]>
[ Upstream commit b8f7bbd1f4ecff6d6277b8c454f62bb0a1c6dbe4 ]
When removing a genpd we don't clean up the genpd->dev correctly. Let's add the missing put_device() in genpd_free_data() to fix this.
Message-ID: <[email protected]>
Stable-dep-of: 3e3b71d35a02 ("pmdomain: core: Fix error path in pm_genpd_init() when ida alloc fails")
--- drivers/pmdomain/core.c | 1 + 1 file changed, 1 insertion(+)
drivers/pmdomain/core.c +1 -0
@@ -2182,6 +2182,7 @@ static int genpd_alloc_data(struct generic_pm_domain *genpd)static void genpd_free_data (struct generic_pm_domain *genpd) { +put_device (&genpd->dev);if (genpd_is_cpu_domain (genpd))free_cpumask_var (genpd->cpus);if (genpd->free_states)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 96/466 pmdomain: core: Fix error path in pm_genpd_init() when ida alloc fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ulf Hansson <[email protected]>
[ Upstream commit 3e3b71d35a02cee4b2cc3d4255668a6609165518 ]
When the ida allocation fails we need to free up the previously allocated memory before returning the error code. Let's fix this and while at it, let's also move the ida allocation to genpd_alloc_data() and the freeing to genpd_free_data(), as it better belongs there.
Message-ID: <[email protected]>
--- drivers/pmdomain/core.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-)
drivers/pmdomain/core.c +19 -17
@@ -2171,8 +2171,24 @@ static int genpd_alloc_data(struct generic_pm_domain *genpd) } genpd->gd = gd; -return 0 ; +device_initialize (&genpd->dev); + +if (!genpd_is_dev_name_fw (genpd)) { +dev_set_name (&genpd->dev,"%s" , genpd->name); + }else { + ret =ida_alloc (&genpd_ida,GFP_KERNEL ); +if (ret <0 ) + goto put; + genpd->device_id = ret; +dev_set_name (&genpd->dev,"%s_%u" , genpd->name, genpd->device_id); + } + +return 0 ; +put: +put_device (&genpd->dev); +if (genpd->free_states == genpd_free_default_power_state) +kfree (genpd->states); free:if (genpd_is_cpu_domain (genpd))free_cpumask_var (genpd->cpus);
@@ -2183,6 +2199,8 @@ static int genpd_alloc_data(struct generic_pm_domain *genpd)static void genpd_free_data (struct generic_pm_domain *genpd) {put_device (&genpd->dev); +if (genpd->device_id != -ENXIO ) +ida_free (&genpd_ida, genpd->device_id);if (genpd_is_cpu_domain (genpd))free_cpumask_var (genpd->cpus);if (genpd->free_states)
@@ -2271,20 +2289,6 @@ int pm_genpd_init(struct generic_pm_domain *genpd,if (ret)return ret; -device_initialize (&genpd->dev); - -if (!genpd_is_dev_name_fw (genpd)) { -dev_set_name (&genpd->dev,"%s" , genpd->name); - }else { - ret =ida_alloc (&genpd_ida,GFP_KERNEL ); -if (ret <0 ) { -put_device (&genpd->dev); -return ret; - } - genpd->device_id = ret; -dev_set_name (&genpd->dev,"%s_%u" , genpd->name, genpd->device_id); - } -mutex_lock (&gpd_list_lock);list_add (&genpd->gpd_list_node, &gpd_list);mutex_unlock (&gpd_list_lock);
@@ -2325,8 +2329,6 @@ static int genpd_remove(struct generic_pm_domain *genpd)genpd_unlock (genpd);genpd_debug_remove (genpd);cancel_work_sync (&genpd->power_off_work); -if (genpd->device_id != -ENXIO ) -ida_free (&genpd_ida, genpd->device_id);genpd_free_data (genpd);pr_debug ("%s: removed %s\n" , __func__,dev_name (&genpd->dev));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 97/466 nvme: dont apply NVME_QUIRK_DEALLOCATE_ZEROES when DSM is not supported
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit 58a0c875ce028678c9594c7bdf3fe33462392808 ]
Commit 63dfa1004322 ("nvme: move NVME_QUIRK_DEALLOCATE_ZEROES out of nvme_config_discard") started applying the NVME_QUIRK_DEALLOCATE_ZEROES quirk even then the Dataset Management is not supported. It turns out that there versions of these old Intel SSDs that have DSM support disabled in the firmware, which will now lead to errors everytime a Write Zeroes command is issued. Fix this by checking for DSM support before applying the quirk.
--- drivers/nvme/host/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/nvme/host/core.c +2 -1
@@ -2064,7 +2064,8 @@ static bool nvme_update_disk_info(struct nvme_ns *ns, struct nvme_id_ns *id, lim->physical_block_size =min (phys_bs, atomic_bs); lim->io_min = phys_bs; lim->io_opt = io_opt; -if (ns->ctrl->quirks &NVME_QUIRK_DEALLOCATE_ZEROES ) +if ((ns->ctrl->quirks &NVME_QUIRK_DEALLOCATE_ZEROES ) && + (ns->ctrl->oncs &NVME_CTRL_ONCS_DSM )) lim->max_write_zeroes_sectors =UINT_MAX ;else lim->max_write_zeroes_sectors = ns->ctrl->max_zeroes_sectors;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 98/466 x86/pkeys: Change caller of update_pkru_in_sigframe()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aruna Ramakrishna <[email protected]>
[ Upstream commit 6a1853bdf17874392476b552398df261f75503e0 ]
update_pkru_in_sigframe() will shortly need some information which is only available inside xsave_to_user_sigframe(). Move update_pkru_in_sigframe() inside the other function to make it easier to provide it that information.
No functional changes.
Stable-dep-of: ae6012d72fa6 ("x86/pkeys: Ensure updated PKRU value is XRSTOR'd")
--- arch/x86/kernel/fpu/signal.c | 20 ++------------------ arch/x86/kernel/fpu/xstate.h | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 19 deletions(-)
arch/x86/kernel/fpu/signal.c +2 -18
@@ -63,16 +63,6 @@ static inline bool check_xstate_in_sigframe(struct fxregs_state __user *fxbuf,return true; } -/* -* Update the value of PKRU register that was already pushed onto the signal frame. -*/ -static inline int update_pkru_in_sigframe (struct xregs_state __user *buf,u32 pkru) -{ -if (unlikely (!cpu_feature_enabled (X86_FEATURE_OSPKE ))) -return 0 ; -return __put_user (pkru, (unsigned int __user *)get_xsave_addr_user (buf,XFEATURE_PKRU )); -} -/* * Signal frame handlers. */
@@ -168,14 +158,8 @@ static inline bool save_xstate_epilog(void __user *buf, int ia32_frame,static inline int copy_fpregs_to_sigframe (struct xregs_state __user *buf,u32 pkru) { -int err =0 ; - -if (use_xsave ()) { - err =xsave_to_user_sigframe (buf); -if (!err) - err =update_pkru_in_sigframe (buf, pkru); -return err; - } +if (use_xsave ()) +return xsave_to_user_sigframe (buf, pkru);if (use_fxsr ())return fxsave_to_user_sigframe ((struct fxregs_state __user *) buf);
arch/x86/kernel/fpu/xstate.h +14 -1
@@ -69,6 +69,16 @@ static inline u64 xfeatures_mask_independent(void)return fpu_kernel_cfg.independent_features; } +/* +* Update the value of PKRU register that was already pushed onto the signal frame. +*/ +static inline int update_pkru_in_sigframe (struct xregs_state __user *buf,u32 pkru) +{ +if (unlikely (!cpu_feature_enabled (X86_FEATURE_OSPKE ))) +return 0 ; +return __put_user (pkru, (unsigned int __user *)get_xsave_addr_user (buf,XFEATURE_PKRU )); +} +/* XSAVE/XRSTOR wrapper functions */ #ifdef CONFIG_X86_64
@@ -256,7 +266,7 @@ static inline u64 xfeatures_need_sigframe_write(void)* The caller has to zero buf::header before calling this because XSAVE* * does not touch the reserved fields in the header. */ -static inline int xsave_to_user_sigframe (struct xregs_state __user *buf) +static inline int xsave_to_user_sigframe (struct xregs_state __user *buf,u32 pkru) {/* * Include the features which are not xsaved/rstored by the kernel
@@ -281,6 +291,9 @@ static inline int xsave_to_user_sigframe(struct xregs_state __user *buf)XSTATE_OP (XSAVE , buf, lmask, hmask, err);clac (); +if (!err) + err =update_pkru_in_sigframe (buf, pkru); +return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 99/466 x86/pkeys: Ensure updated PKRU value is XRSTORd
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aruna Ramakrishna <[email protected]>
[ Upstream commit ae6012d72fa60c9ff92de5bac7a8021a47458e5b ]
When XSTATE_BV[i] is 0, and XRSTOR attempts to restore state component 'i' it ignores any value in the XSAVE buffer and instead restores the state component's init value.
This means that if XSAVE writes XSTATE_BV[PKRU]=0 then XRSTOR will ignore the value that update_pkru_in_sigframe() writes to the XSAVE buffer.
XSTATE_BV[PKRU] only gets written as 0 if PKRU is in its init state. On Intel CPUs, basically never happens because the kernel usually overwrites the init value (aside: this is why we didn't notice this bug until now). But on AMD, the init tracker is more aggressive and will track PKRU as being in its init state upon any wrpkru(0x0). Unfortunately, sig_prepare_pkru() does just that: wrpkru(0x0).
This writes XSTATE_BV[PKRU]=0 which makes XRSTOR ignore the PKRU value in the sigframe.
To fix this, always overwrite the sigframe XSTATE_BV with a value that has XSTATE_BV[PKRU]==1. This ensures that XRSTOR will not ignore what update_pkru_in_sigframe() wrote.
The problematic sequence of events is something like this:
Userspace does:
* wrpkru(0xffff0000) (or whatever)
* Hardware sets: XINUSE[PKRU]=1
Signal happens, kernel is entered:
* sig_prepare_pkru() => wrpkru(0x00000000)
* Hardware sets: XINUSE[PKRU]=0 (aggressive AMD init tracker)
* XSAVE writes most of XSAVE buffer, including XSTATE_BV[PKRU]=XINUSE[PKRU]=0
* update_pkru_in_sigframe() overwrites PKRU in XSAVE buffer
... signal handling
* XRSTOR sees XSTATE_BV[PKRU]==0, ignores just-written value from update_pkru_in_sigframe()
--- arch/x86/kernel/fpu/xstate.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
arch/x86/kernel/fpu/xstate.h +14 -2
@@ -72,10 +72,22 @@ static inline u64 xfeatures_mask_independent(void)/* * Update the value of PKRU register that was already pushed onto the signal frame. */ -static inline int update_pkru_in_sigframe (struct xregs_state __user *buf,u32 pkru) +static inline int update_pkru_in_sigframe (struct xregs_state __user *buf,u64 mask,u32 pkru) { +u64 xstate_bv; +int err; +if (unlikely (!cpu_feature_enabled (X86_FEATURE_OSPKE )))return 0 ; + +/* Mark PKRU as in-use so that it is restored correctly. */ + xstate_bv = (mask &xfeatures_in_use ()) |XFEATURE_MASK_PKRU ; + + err =__put_user (xstate_bv, &buf->header.xfeatures); +if (err) +return err; + +/* Update PKRU value in the userspace xsave buffer. */ return __put_user (pkru, (unsigned int __user *)get_xsave_addr_user (buf,XFEATURE_PKRU )); }
@@ -292,7 +304,7 @@ static inline int xsave_to_user_sigframe(struct xregs_state __user *buf, u32 pkrclac ();if (!err) - err =update_pkru_in_sigframe (buf, pkru); + err =update_pkru_in_sigframe (buf, mask, pkru);return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 100/466 bpf: Ensure reg is PTR_TO_STACK in process_iter_arg
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tao Lyu <[email protected]>
[ Upstream commit 12659d28615d606b36e382f4de2dd05550d202af ]
Currently, KF_ARG_PTR_TO_ITER handling missed checking the reg->type and ensuring it is PTR_TO_STACK. Instead of enforcing this in the caller of process_iter_arg, move the check into it instead so that all callers will gain the check by default. This is similar to process_dynptr_func.
An existing selftest in verifier_bits_iter.c fails due to this change, but it's because it was passing a NULL pointer into iter_next helper and getting an error further down the checks, but probably meant to pass an uninitialized iterator on the stack (as is done in the subsequent test below it). We will gain coverage for non-PTR_TO_STACK arguments in later patches hence just change the declaration to zero-ed stack object.
--- kernel/bpf/verifier.c | 5 +++++ tools/testing/selftests/bpf/progs/verifier_bits_iter.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-)
kernel/bpf/verifier.c +5 -0
@@ -8021,6 +8021,11 @@ static int process_iter_arg(struct bpf_verifier_env *env, int regno, int insn_idconst struct btf_type *t;int spi, err, i, nr_slots, btf_id; +if (reg->type !=PTR_TO_STACK ) { +verbose (env,"arg#%d expected pointer to an iterator on stack\n" , regno -1 ); +return -EINVAL ; + } +/* For iter_{new,next,destroy} functions, btf_check_iter_kfuncs() * ensures struct convention, so we wouldn't need to do any BTF * validation here. But given iter state can be passed as a parameter
tools/testing/selftests/bpf/progs/verifier_bits_iter.c +2 -2
@@ -35,9 +35,9 @@ __description("uninitialized iter in ->next()") __failure __msg("expected an initialized iter_bits as arg #1")int BPF_PROG (next_uninit ,struct bpf_iter_meta *meta,struct cgroup *cgrp) { -struct bpf_iter_bits *it =NULL ; +struct bpf_iter_bits it = {}; -bpf_iter_bits_next (it); +bpf_iter_bits_next (&it);return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 101/466 irqchip/stm32mp-exti: CONFIG_STM32MP_EXTI should not default to y when compile-testing
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 9151299ee5101e03eeed544c1280b0e14b89a8a4 ]
Merely enabling compile-testing should not enable additional functionality.
--- drivers/irqchip/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/irqchip/Kconfig +1 -1
@@ -407,7 +407,7 @@ config PARTITION_PERCPU config STM32MP_EXTI tristate "STM32MP extended interrupts and event controller" depends on (ARCH_STM32 && !ARM_SINGLE_ARMV7M) || COMPILE_TEST - default y + default ARCH_STM32 && !ARM_SINGLE_ARMV7M select IRQ_DOMAIN_HIERARCHY select GENERIC_IRQ_CHIP help
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 102/466 drivers/virt: pkvm: Dont fail ioremap() call if MMIO_GUARD fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[ Upstream commit d44679fb954ffea961036ed1aeb7d65035f78489 ]
Calling the MMIO_GUARD hypercall from guests which have not been enrolled (e.g. because they are running without pvmfw) results in -EINVAL being returned. In this case, MMIO_GUARD is not active and so we can simply proceed with the normal ioremap() routine.
Don't fail ioremap() if MMIO_GUARD fails; instead WARN_ON_ONCE() to highlight that the pvm environment is slightly wonky.
--- drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c +1 -5
@@ -87,12 +87,8 @@ static int mmio_guard_ioremap_hook(phys_addr_t phys, size_t size,while (phys < end) {const int func_id =ARM_SMCCC_VENDOR_HYP_KVM_MMIO_GUARD_FUNC_ID ; -int err; - - err =arm_smccc_do_one_page (func_id, phys); -if (err) -return err; +WARN_ON_ONCE (arm_smccc_do_one_page (func_id, phys)); phys +=PAGE_SIZE ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 103/466 bpf: Dont mark STACK_INVALID as STACK_MISC in mark_stack_slot_misc
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kumar Kartikeya Dwivedi <[email protected]>
[ Upstream commit 69772f509e084ec6bca12dbcdeeeff41b0103774 ]
Inside mark_stack_slot_misc, we should not upgrade STACK_INVALID to STACK_MISC when allow_ptr_leaks is false, since invalid contents shouldn't be read unless the program has the relevant capabilities. The relaxation only makes sense when env->allow_ptr_leaks is true.
However, such conversion in privileged mode becomes unnecessary, as invalid slots can be read without being upgraded to STACK_MISC.
Currently, the condition is inverted (i.e. checking for true instead of false), simply remove it to restore correct behavior.
--- kernel/bpf/verifier.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
kernel/bpf/verifier.c +6 -3
@@ -1200,14 +1200,17 @@ static bool is_spilled_scalar_reg64(const struct bpf_stack_state *stack)/* Mark stack slot as STACK_MISC, unless it is already STACK_INVALID, in which * case they are equivalent, or it's STACK_ZERO, in which case we preserve * more precise STACK_ZERO. -* Note, in uprivileged mode leaving STACK_INVALID is wrong, so we take -* env->allow_ptr_leaks into account and force STACK_MISC, if necessary. +* Regardless of allow_ptr_leaks setting (i.e., privileged or unprivileged +* mode), we won't promote STACK_INVALID to STACK_MISC. In privileged case it is +* unnecessary as both are considered equivalent when loading data and pruning, +* in case of unprivileged mode it will be incorrect to allow reads of invalid +* slots. */ static void mark_stack_slot_misc (struct bpf_verifier_env *env,u8 *stype) {if (*stype ==STACK_ZERO )return ; -if (env->allow_ptr_leaks && *stype ==STACK_INVALID ) +if (*stype ==STACK_INVALID )return ; *stype =STACK_MISC ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 104/466 bpf: Fix narrow scalar spill onto 64-bit spilled scalar slots
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tao Lyu <[email protected]>
[ Upstream commit b0e66977dc072906bb76555fb1a64261d7f63d0f ]
When CAP_PERFMON and CAP_SYS_ADMIN (allow_ptr_leaks) are disabled, the verifier aims to reject partial overwrite on an 8-byte stack slot that contains a spilled pointer.
However, in such a scenario, it rejects all partial stack overwrites as long as the targeted stack slot is a spilled register, because it does not check if the stack slot is a spilled pointer.
Incomplete checks will result in the rejection of valid programs, which spill narrower scalar values onto scalar slots, as shown below.
0: R1=ctx() R10=fp0
; asm volatile ( @ repro.bpf.c:679
0: (7a) *(u64 *)(r10 -8) = 1 ; R10=fp0 fp-8_w=1
1: (62) *(u32 *)(r10 -8) = 1
attempt to corrupt spilled pointer on stack
processed 2 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0.
Fix this by expanding the check to not consider spilled scalar registers when rejecting the write into the stack.
Previous discussion on this patch is at link [0].
[0]: https://lore.kernel.org/bpf/[email protected]
--- kernel/bpf/verifier.c | 1 + 1 file changed, 1 insertion(+)
kernel/bpf/verifier.c +1 -0
@@ -4649,6 +4649,7 @@ static int check_stack_write_fixed_off(struct bpf_verifier_env *env,*/ if (!env->allow_ptr_leaks &&is_spilled_reg (&state->stack[spi]) && + !is_spilled_scalar_reg (&state->stack[spi]) && size !=BPF_REG_SIZE ) {verbose (env,"attempt to corrupt spilled pointer on stack\n" );return -EACCES ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 105/466 nvme-fabrics: handle zero MAXCMD without closing the connection
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maurizio Lombardi <[email protected]>
[ Upstream commit 88c23a32b851e36adc4ab36f796d9b711f47e2bb ]
The NVMe specification states that MAXCMD is mandatory
for NVMe-over-Fabrics implementations. However, some NVMe/TCP and NVMe/FC arrays from major vendors have buggy firmware that reports MAXCMD as zero in the Identify Controller data structure.
Currently, the implementation closes the connection in such cases, completely preventing the host from connecting to the target.
Fix the issue by printing a clear error message about the firmware bug and allowing the connection to proceed. It assumes that the target supports a MAXCMD value of SQSIZE + 1. If any issues arise, the user can manually adjust SQSIZE to mitigate them.
--- drivers/nvme/host/core.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/nvme/host/core.c +3 -2
@@ -3251,8 +3251,9 @@ static int nvme_check_ctrl_fabric_info(struct nvme_ctrl *ctrl, struct nvme_id_ct }if (!ctrl->maxcmd) { -dev_err (ctrl->device,"Maximum outstanding commands is 0\n" ); -return -EINVAL ; +dev_warn (ctrl->device, +"Firmware bug: maximum outstanding commands is 0\n" ); + ctrl->maxcmd = ctrl->sqsize +1 ; }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 106/466 nvme-tcp: fix the memleak while create new ctrl failed
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunguang.xu <[email protected]>
[ Upstream commit fec55c29e54d3ca6fe9d7d7d9266098b4514fd34 ]
Now while we create new ctrl failed, we have not free the tagset occupied by admin_q, here try to fix it.
--- drivers/nvme/host/tcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/tcp.c +1 -1
@@ -2278,7 +2278,7 @@ static int nvme_tcp_setup_ctrl(struct nvme_ctrl *ctrl, bool new) } destroy_admin:nvme_stop_keep_alive (ctrl); -nvme_tcp_teardown_admin_queue (ctrl, false); +nvme_tcp_teardown_admin_queue (ctrl, new);return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 107/466 nvme-rdma: unquiesce admin_q before destroy it
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunguang.xu <[email protected]>
[ Upstream commit 5858b687559809f05393af745cbadf06dee61295 ]
Kernel will hang on destroy admin_q while we create ctrl failed, such as following calltrace:
PID: 23644 TASK: ff2d52b40f439fc0 CPU: 2 COMMAND: "nvme"
#0 [ff61d23de260fb78] __schedule at ffffffff8323bc15
#1 [ff61d23de260fc08] schedule at ffffffff8323c014
#2 [ff61d23de260fc28] blk_mq_freeze_queue_wait at ffffffff82a3dba1 #3 [ff61d23de260fc78] blk_freeze_queue at ffffffff82a4113a #4 [ff61d23de260fc90] blk_cleanup_queue at ffffffff82a33006 #5 [ff61d23de260fcb0] nvme_rdma_destroy_admin_queue at ffffffffc12686ce #6 [ff61d23de260fcc8] nvme_rdma_setup_ctrl at ffffffffc1268ced #7 [ff61d23de260fd28] nvme_rdma_create_ctrl at ffffffffc126919b #8 [ff61d23de260fd68] nvmf_dev_write at ffffffffc024f362
#9 [ff61d23de260fe38] vfs_write at ffffffff827d5f25
RIP: 00007fda7891d574 RSP: 00007ffe2ef06958 RFLAGS: 00000202
RAX: ffffffffffffffda RBX: 000055e8122a4d90 RCX: 00007fda7891d574
RDX: 000000000000012b RSI: 000055e8122a4d90 RDI: 0000000000000004
RBP: 00007ffe2ef079c0 R8: 000000000000012b R9: 000055e8122a4d90
R10: 0000000000000000 R11: 0000000000000202 R12: 0000000000000004
R13: 000055e8122923c0 R14: 000000000000012b R15: 00007fda78a54500
ORIG_RAX: 0000000000000001 CS: 0033 SS: 002bThis due to we have quiesced admi_q before cancel requests, but forgot to unquiesce before destroy it, as a result we fail to drain the pending requests, and hang on blk_mq_freeze_queue_wait() forever. Here try to reuse nvme_rdma_teardown_admin_queue() to fix this issue and simplify the code.
--- drivers/nvme/host/rdma.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/nvme/host/rdma.c +1 -7
@@ -1091,13 +1091,7 @@ static int nvme_rdma_setup_ctrl(struct nvme_rdma_ctrl *ctrl, bool new) } destroy_admin:nvme_stop_keep_alive (&ctrl->ctrl); -nvme_quiesce_admin_queue (&ctrl->ctrl); -blk_sync_queue (ctrl->ctrl.admin_q); -nvme_rdma_stop_queue (&ctrl->queues[0 ]); -nvme_cancel_admin_tagset (&ctrl->ctrl); -if (new) -nvme_remove_admin_tag_set (&ctrl->ctrl); -nvme_rdma_destroy_admin_queue (ctrl); +nvme_rdma_teardown_admin_queue (ctrl, new);return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 108/466 scsi: sg: Fix slab-use-after-free read in sg_release()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suraj Sonawane <[email protected]>
[ Upstream commit f10593ad9bc36921f623361c9e3dd96bd52d85ee ]
Fix a use-after-free bug in sg_release(), detected by syzbot with KASAN:
BUG: KASAN: slab-use-after-free in lock_release+0x151/0xa30 kernel/locking/lockdep.c:5838 __mutex_unlock_slowpath+0xe2/0x750 kernel/locking/mutex.c:912 sg_release+0x1f4/0x2e0 drivers/scsi/sg.c:407
In sg_release(), the function kref_put(&sfp->f_ref, sg_remove_sfp) is called before releasing the open_rel_lock mutex. The kref_put() call may decrement the reference count of sfp to zero, triggering its cleanup through sg_remove_sfp(). This cleanup includes scheduling deferred work via sg_remove_sfp_usercontext(), which ultimately frees sfp.
After kref_put(), sg_release() continues to unlock open_rel_lock and may reference sfp or sdp. If sfp has already been freed, this results in a slab-use-after-free error.
Move the kref_put(&sfp->f_ref, sg_remove_sfp) call after unlocking the open_rel_lock mutex. This ensures:
- No references to sfp or sdp occur after the reference count is decremented.
- Cleanup functions such as sg_remove_sfp() and sg_remove_sfp_usercontext() can safely execute without impacting the mutex handling in sg_release().
The fix has been tested and validated by syzbot. This patch closes the bug reported at the following syzkaller link and ensures proper sequencing of resource cleanup and mutex operations, eliminating the risk of use-after-free errors in sg_release().
--- drivers/scsi/sg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/sg.c +1 -1
@@ -386,7 +386,6 @@ sg_release(struct inode *inode, struct file *filp)SCSI_LOG_TIMEOUT (3 ,sg_printk (KERN_INFO , sdp,"sg_release\n" ));mutex_lock (&sdp->open_rel_lock); -kref_put (&sfp->f_ref, sg_remove_sfp); sdp->open_cnt--;/* possibly many open()s waiting on exlude clearing, start many;
@@ -398,6 +397,7 @@ sg_release(struct inode *inode, struct file *filp)wake_up_interruptible (&sdp->open_wait); }mutex_unlock (&sdp->open_rel_lock); +kref_put (&sfp->f_ref, sg_remove_sfp);return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 109/466 scsi: scsi_debug: Fix hrtimer support for ndelay
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Garry <[email protected]>
[ Upstream commit 6918141d815acef056a0d10e966a027d869a922d ]
Since commit 771f712ba5b0 ("scsi: scsi_debug: Fix cmd duration calculation"), ns_from_boot value is only evaluated in schedule_resp() for polled requests.
However, ns_from_boot is also required for hrtimer support for when ndelay is less than INCLUSIVE_TIMING_MAX_NS, so fix up the logic to decide when to evaluate ns_from_boot.
--- drivers/scsi/scsi_debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/scsi_debug.c +1 -1
@@ -6447,7 +6447,7 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip, } sd_dp = &sqcp->sd_dp; -if (polled) +if (polled || (ndelay >0 && ndelay <INCLUSIVE_TIMING_MAX_NS )) ns_from_boot =ktime_get_boottime_ns ();/* one of the resp_*() response functions is called here */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 110/466 ASoC: mediatek: mt8188-mt6359: Remove hardcoded dmic codec
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nícolas F. R. A. Prado <[email protected]>
[ Upstream commit ec16a3cdf37e507013062f9c4a2067eacdd12b62 ]
Remove hardcoded dmic codec from the UL_SRC dai link to avoid requiring a dmic codec to be present for the driver to probe, as not every MT8188-based platform might need a dmic codec. The codec can be assigned to the dai link through the dai-link property in Devicetree on the platforms where it is needed.
No Devicetree currently relies on it so it is safe to remove without worrying about backward compatibility.
--- sound/soc/mediatek/mt8188/mt8188-mt6359.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
sound/soc/mediatek/mt8188/mt8188-mt6359.c +1 -3
@@ -188,9 +188,7 @@ SND_SOC_DAILINK_DEFS(pcm1,SND_SOC_DAILINK_DEFS (ul_src,DAILINK_COMP_ARRAY (COMP_CPU ("UL_SRC" )),DAILINK_COMP_ARRAY (COMP_CODEC ("mt6359-sound" , -"mt6359-snd-codec-aif1" ), -COMP_CODEC ("dmic-codec" , -"dmic-hifi" )), +"mt6359-snd-codec-aif1" )),DAILINK_COMP_ARRAY (COMP_EMPTY ())); SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 111/466 drm/v3d: Enable Performance Counters before clearing them
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maíra Canal <[email protected]>
[ Upstream commit c98b10496b2f3c4f576af3482c71aadcfcbf765e ]
On the Raspberry Pi 5, performance counters are not being cleared when v3d_perfmon_start() is called, even though we write to the CLR register. As a result, their values accumulate until they overflow.
The expected behavior is for performance counters to reset to zero at the start of a job. When the job finishes and the perfmon is stopped, the counters should accurately reflect the values for that specific job.
To ensure this behavior, the performance counters are now enabled before being cleared. This allows the CLR register to function as intended, zeroing the counter values when the job begins.
--- drivers/gpu/drm/v3d/v3d_perfmon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/v3d/v3d_perfmon.c +1 -1
@@ -254,9 +254,9 @@ void v3d_perfmon_start(struct v3d_dev *v3d, struct v3d_perfmon *perfmon)V3D_CORE_WRITE (0 ,V3D_V4_PCTR_0_SRC_X (source), channel); } +V3D_CORE_WRITE (0 ,V3D_V4_PCTR_0_EN , mask);V3D_CORE_WRITE (0 ,V3D_V4_PCTR_0_CLR , mask);V3D_CORE_WRITE (0 ,V3D_PCTR_0_OVERFLOW , mask); -V3D_CORE_WRITE (0 ,V3D_V4_PCTR_0_EN , mask); v3d->active_perfmon = perfmon; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 112/466 ocfs2: free inode when ocfs2_get_init_inode() fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
[ Upstream commit 965b5dd1894f4525f38c1b5f99b0106a07dbb5db ]
syzbot is reporting busy inodes after unmount, for commit 9c89fe0af826 ("ocfs2: Handle error from dquot_initialize()") forgot to call iput() when new_inode() succeeded and dquot_initialize() failed.
--- fs/ocfs2/namei.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/ocfs2/namei.c +3 -1
@@ -200,8 +200,10 @@ static struct inode *ocfs2_get_init_inode(struct inode *dir, umode_t mode) mode =mode_strip_sgid (&nop_mnt_idmap, dir, mode);inode_init_owner (&nop_mnt_idmap, inode, dir, mode); status =dquot_initialize (inode); -if (status) +if (status) { +iput (inode);return ERR_PTR (status); + }return inode; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 113/466 scatterlist: fix incorrect func name in kernel-doc
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit d89c8ec0546184267cb211b579514ebaf8916100 ]
Fix a kernel-doc warning by making the kernel-doc function description match the function name:
include/linux/scatterlist.h:323: warning: expecting prototype for sg_unmark_bus_address(). Prototype was for sg_dma_unmark_bus_address() instead
--- include/linux/scatterlist.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/scatterlist.h +1 -1
@@ -313,7 +313,7 @@ static inline void sg_dma_mark_bus_address(struct scatterlist *sg) }/** -* sg_unmark_bus_address - Unmark the scatterlist entry as a bus address +* sg_dma_unmark_bus_address - Unmark the scatterlist entry as a bus address * @sg: SG entry * * Description:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 114/466 iio: magnetometer: yas530: use signed integer type for clamp limits
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakob Hauser <[email protected]>
[ Upstream commit f1ee5483e40881d8ad5a63aa148b753b5c6a839b ]
In the function yas537_measure() there is a clamp_val() with limits of -BIT(13) and BIT(13) - 1. The input clamp value h[] is of type s32. The BIT() is of type unsigned long integer due to its define in include/vdso/bits.h. The lower limit -BIT(13) is recognized as -8192 but expressed as an unsigned long integer. The size of an unsigned long integer differs between 32-bit and 64-bit architectures. Converting this to type s32 may lead to undesired behavior.
Additionally, in the calculation lines h[0], h[1] and h[2] the unsigned long integer divisor BIT(13) causes an unsigned division, shifting the left-hand side of the equation back and forth, possibly ending up in large positive values instead of negative values on 32-bit architectures.
To solve those two issues, declare a signed integer with a value of BIT(13).
There is another omission in the clamp line: clamp_val() returns a value and it's going nowhere here. Self-assign it to h[i] to make use of the clamp macro.
Finally, replace clamp_val() macro by clamp() because after changing the limits from type unsigned long integer to signed integer it's fine that way.
--- drivers/iio/magnetometer/yamaha-yas530.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/iio/magnetometer/yamaha-yas530.c +7 -6
@@ -372,6 +372,7 @@ static int yas537_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *yu8 data[8 ];u16 xy1y2[3 ];s32 h[3 ], s[3 ]; +int half_range =BIT (13 );int i, ret;mutex_lock (&yas5xx->lock);
@@ -406,13 +407,13 @@ static int yas537_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y/* The second version of YAS537 needs to include calibration coefficients */ if (yas5xx->version ==YAS537_VERSION_1 ) {for (i =0 ; i <3 ; i++) - s[i] = xy1y2[i] -BIT (13 ); - h[0 ] = (c->k * (128 * s[0 ] + c->a2 * s[1 ] + c->a3 * s[2 ])) /BIT (13 ); - h[1 ] = (c->k * (c->a4 * s[0 ] + c->a5 * s[1 ] + c->a6 * s[2 ])) /BIT (13 ); - h[2 ] = (c->k * (c->a7 * s[0 ] + c->a8 * s[1 ] + c->a9 * s[2 ])) /BIT (13 ); + s[i] = xy1y2[i] - half_range; + h[0 ] = (c->k * (128 * s[0 ] + c->a2 * s[1 ] + c->a3 * s[2 ])) / half_range; + h[1 ] = (c->k * (c->a4 * s[0 ] + c->a5 * s[1 ] + c->a6 * s[2 ])) / half_range; + h[2 ] = (c->k * (c->a7 * s[0 ] + c->a8 * s[1 ] + c->a9 * s[2 ])) / half_range;for (i =0 ; i <3 ; i++) { -clamp_val (h[i], -BIT (13 ),BIT (13 ) -1 ); - xy1y2[i] = h[i] +BIT (13 ); + h[i] =clamp (h[i], -half_range, half_range -1 ); + xy1y2[i] = h[i] + half_range; } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 115/466 smb: client: fix potential race in cifs_put_tcon()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
[ Upstream commit c32b624fa4f7ca5a2ff217a0b1b2f1352bb4ec11 ]
dfs_cache_refresh() delayed worker could race with cifs_put_tcon(), so make sure to call list_replace_init() on @tcon->dfs_ses_list after kworker is cancelled or finished.
--- fs/smb/client/connect.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
fs/smb/client/connect.c +1 -3
@@ -2512,9 +2512,6 @@ cifs_put_tcon(struct cifs_tcon *tcon, enum smb3_tcon_ref_trace trace)list_del_init (&tcon->tcon_list); tcon->status =TID_EXITING ; -#ifdef CONFIG_CIFS_DFS_UPCALL -list_replace_init (&tcon->dfs_ses_list, &ses_list); -#endif spin_unlock (&tcon->tc_lock);spin_unlock (&cifs_tcp_ses_lock);
@@ -2522,6 +2519,7 @@ cifs_put_tcon(struct cifs_tcon *tcon, enum smb3_tcon_ref_trace trace)cancel_delayed_work_sync (&tcon->query_interfaces);#ifdef CONFIG_CIFS_DFS_UPCALL cancel_delayed_work_sync (&tcon->dfs_cache_work); +list_replace_init (&tcon->dfs_ses_list, &ses_list);#endif if (tcon->use_witness) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 116/466 bpf: Handle BPF_EXIST and BPF_NOEXIST for LPM trie
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Tao <[email protected]>
[ Upstream commit eae6a075e9537dd69891cf77ca5a88fa8a28b4a1 ]
Add the currently missing handling for the BPF_EXIST and BPF_NOEXIST flags. These flags can be specified by users and are relevant since LPM trie supports exact matches during update.
--- kernel/bpf/lpm_trie.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
kernel/bpf/lpm_trie.c +20 -3
@@ -376,6 +376,10 @@ static long trie_update_elem(struct bpf_map *map,* simply assign the @new_node to that slot and be done. */ if (!node) { +if (flags ==BPF_EXIST ) { + ret = -ENOENT ; + goto out; + }rcu_assign_pointer (*slot, new_node); goto out; }
@@ -384,18 +388,31 @@ static long trie_update_elem(struct bpf_map *map,* which already has the correct data array set. */ if (node->prefixlen == matchlen) { +if (!(node->flags &LPM_TREE_NODE_FLAG_IM )) { +if (flags ==BPF_NOEXIST ) { + ret = -EEXIST ; + goto out; + } + trie->n_entries--; + }else if (flags ==BPF_EXIST ) { + ret = -ENOENT ; + goto out; + } + new_node->child[0 ] = node->child[0 ]; new_node->child[1 ] = node->child[1 ]; -if (!(node->flags &LPM_TREE_NODE_FLAG_IM )) - trie->n_entries--; -rcu_assign_pointer (*slot, new_node); free_node = node; goto out; } +if (flags ==BPF_EXIST ) { + ret = -ENOENT ; + goto out; + } +/* If the new node matches the prefix completely, it must be inserted * as an ancestor. Simply insert it between @node and *@slot. */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 117/466 bpf: Remove unnecessary kfree(im_node) in lpm_trie_update_elem
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Tao <[email protected]>
[ Upstream commit 3d5611b4d7efbefb85a74fcdbc35c603847cc022 ]
There is no need to call kfree(im_node) when updating element fails, because im_node must be NULL. Remove the unnecessary kfree() for im_node.
Stable-dep-of: 532d6b36b2bf ("bpf: Handle in-place update for full LPM trie correctly")
--- kernel/bpf/lpm_trie.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
kernel/bpf/lpm_trie.c +1 -3
@@ -315,7 +315,7 @@ static long trie_update_elem(struct bpf_map *map, void *_key, void *value, u64 flags) { struct lpm_trie *trie = container_of(map, struct lpm_trie, map); -struct lpm_trie_node *node, *im_node =NULL , *new_node =NULL ; +struct lpm_trie_node *node, *im_node, *new_node =NULL ;struct lpm_trie_node *free_node =NULL ;struct lpm_trie_node __rcu **slot;struct bpf_lpm_trie_key_u8 *key = _key;
@@ -449,9 +449,7 @@ static long trie_update_elem(struct bpf_map *map,if (ret) {if (new_node) trie->n_entries--; -kfree (new_node); -kfree (im_node); }spin_unlock_irqrestore (&trie->lock, irq_flags);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 118/466 bpf: Handle in-place update for full LPM trie correctly
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Tao <[email protected]>
[ Upstream commit 532d6b36b2bfac5514426a97a4df8d103d700d43 ]
When a LPM trie is full, in-place updates of existing elements incorrectly return -ENOSPC.
Fix this by deferring the check of trie->n_entries. For new insertions, n_entries must not exceed max_entries. However, in-place updates are allowed even when the trie is full.
--- kernel/bpf/lpm_trie.c | 44 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 23 deletions(-)
kernel/bpf/lpm_trie.c +21 -23
@@ -310,6 +310,16 @@ static struct lpm_trie_node *lpm_trie_node_alloc(const struct lpm_trie *trie,return node; } +static int trie_check_add_elem (struct lpm_trie *trie,u64 flags) +{ +if (flags ==BPF_EXIST ) +return -ENOENT ; +if (trie->n_entries == trie->map.max_entries) +return -ENOSPC ; + trie->n_entries++; +return 0 ; +} +/* Called from syscall or from eBPF program */ static long trie_update_elem (struct bpf_map *map,void *_key,void *value,u64 flags)
@@ -333,20 +343,12 @@ static long trie_update_elem(struct bpf_map *map,spin_lock_irqsave (&trie->lock, irq_flags);/* Allocate and fill a new node */ - -if (trie->n_entries == trie->map.max_entries) { - ret = -ENOSPC ; - goto out; - } - new_node =lpm_trie_node_alloc (trie, value);if (!new_node) { ret = -ENOMEM ; goto out; } - trie->n_entries++; - new_node->prefixlen = key->prefixlen;RCU_INIT_POINTER (new_node->child[0 ],NULL );RCU_INIT_POINTER (new_node->child[1 ],NULL );
@@ -376,10 +378,10 @@ static long trie_update_elem(struct bpf_map *map,* simply assign the @new_node to that slot and be done. */ if (!node) { -if (flags ==BPF_EXIST ) { - ret = -ENOENT ; + ret =trie_check_add_elem (trie, flags); +if (ret) goto out; - } +rcu_assign_pointer (*slot, new_node); goto out; }
@@ -393,10 +395,10 @@ static long trie_update_elem(struct bpf_map *map, ret = -EEXIST ; goto out; } - trie->n_entries--; - }else if (flags ==BPF_EXIST ) { - ret = -ENOENT ; - goto out; + }else { + ret =trie_check_add_elem (trie, flags); +if (ret) + goto out; } new_node->child[0 ] = node->child[0 ];
@@ -408,10 +410,9 @@ static long trie_update_elem(struct bpf_map *map, goto out; } -if (flags ==BPF_EXIST ) { - ret = -ENOENT ; + ret =trie_check_add_elem (trie, flags); +if (ret) goto out; - }/* If the new node matches the prefix completely, it must be inserted * as an ancestor. Simply insert it between @node and *@slot.
@@ -425,6 +426,7 @@ static long trie_update_elem(struct bpf_map *map, im_node =lpm_trie_node_alloc (trie,NULL );if (!im_node) { + trie->n_entries--; ret = -ENOMEM ; goto out; }
@@ -446,12 +448,8 @@ static long trie_update_elem(struct bpf_map *map,rcu_assign_pointer (*slot, im_node); out: -if (ret) { -if (new_node) - trie->n_entries--; +if (ret)kfree (new_node); - } -spin_unlock_irqrestore (&trie->lock, irq_flags);kfree_rcu (free_node, rcu);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 119/466 bpf: Fix exact match conditions in trie_get_next_key()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Tao <[email protected]>
[ Upstream commit 27abc7b3fa2e09bbe41e2924d328121546865eda ]
trie_get_next_key() uses node->prefixlen == key->prefixlen to identify an exact match, However, it is incorrect because when the target key doesn't fully match the found node (e.g., node->prefixlen != matchlen), these two nodes may also have the same prefixlen. It will return expected result when the passed key exist in the trie. However when a recently-deleted key or nonexistent key is passed to trie_get_next_key(), it may skip keys and return incorrect result.
Fix it by using node->prefixlen == matchlen to identify exact matches. When the condition is true after the search, it also implies node->prefixlen equals key->prefixlen, otherwise, the search would return NULL instead.
--- kernel/bpf/lpm_trie.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/bpf/lpm_trie.c +2 -2
@@ -646,7 +646,7 @@ static int trie_get_next_key(struct bpf_map *map, void *_key, void *_next_key)struct lpm_trie_node **node_stack =NULL ;int err =0 , stack_ptr =-1 ;unsigned int next_bit; -size_t matchlen; +size_t matchlen =0 ;/* The get_next_key follows postorder. For the 4 node example in * the top of this file, the trie_get_next_key() returns the following
@@ -685,7 +685,7 @@ static int trie_get_next_key(struct bpf_map *map, void *_key, void *_next_key) next_bit =extract_bit (key->data, node->prefixlen); node =rcu_dereference (node->child[next_bit]); } -if (!node || node->prefixlen != key->prefixlen || +if (!node || node->prefixlen != matchlen || (node->flags &LPM_TREE_NODE_FLAG_IM )) goto find_leftmost;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 120/466 x86/CPU/AMD: WARN when setting EFER.AUTOIBRS if and only if the WRMSR fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
[ Upstream commit 492077668fb453b8b16c842fcf3fafc2ebc190e9 ]
When ensuring EFER.AUTOIBRS is set, WARN only on a negative return code from msr_set_bit(), as '1' is used to indicate the WRMSR was successful ('0' indicates the MSR bit was already set).
--- arch/x86/kernel/cpu/amd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/cpu/amd.c +1 -1
@@ -1065,7 +1065,7 @@ static void init_amd(struct cpuinfo_x86 *c)*/ if (spectre_v2_in_eibrs_mode (spectre_v2_enabled) &&cpu_has (c,X86_FEATURE_AUTOIBRS )) -WARN_ON_ONCE (msr_set_bit (MSR_EFER , _EFER_AUTOIBRS)); +WARN_ON_ONCE (msr_set_bit (MSR_EFER , _EFER_AUTOIBRS) <0 );/* AMD CPUs don't need fencing after x2APIC/TSC_DEADLINE MSR writes. */ clear_cpu_cap (c,X86_FEATURE_APIC_MSRS_FENCE );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 121/466 rust: allow `clippy::needless_lifetimes`
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miguel Ojeda <[email protected]>
commit 60fc1e6750133620e404d40b93df5afe32e3e6c6 upstream.
In beta Clippy (i.e. Rust 1.83.0), the needless_lifetimes lint has been extended [1] to suggest eliding impl lifetimes, e.g.
error: the following explicit lifetimes could be elided: 'a
--> rust/kernel/list.rs:647:6
|
647 | impl<'a, T: ?Sized + ListItem<ID>, const ID: u64> FusedIterator for Iter<'a, T, ID> {}
| ^^ ^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes
= note: `-D clippy::needless-lifetimes` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::needless_lifetimes)]`
help: elide the lifetimes
|
647 - impl<'a, T: ?Sized + ListItem<ID>, const ID: u64> FusedIterator for Iter<'a, T, ID> {}
647 + impl<T: ?Sized + ListItem<ID>, const ID: u64> FusedIterator for Iter<'_, T, ID> {}A possibility would have been to clean them -- the RFC patch [2] did this, while asking if we wanted these cleanups. There is an open issue
[3] in Clippy about being able to differentiate some of the new cases, e.g. those that do not involve introducing '_. Thus it seems others feel similarly.
Thus, for the time being, we decided to allow the lint.
--- Makefile | 1 + 1 file changed, 1 insertion(+)
Makefile +1 -0
@@ -456,6 +456,7 @@ export rust_common_flags := --edition=20 -Wclippy::mut_mut \ -Wclippy::needless_bitwise_bool \ -Wclippy::needless_continue \ + -Aclippy::needless_lifetimes \ -Wclippy::no_mangle_with_rust_abi \ -Wclippy::dbg_macro
Greg Kroah-Hartman
maintainerPATCH 122/466 HID: i2c-hid: Revert to using power commands to wake on resume
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kenny Levinsen <[email protected]>
commit 34851431ceca1bf457d85895bd38a4e7967e2055 upstream.
commit 7d6f065de37c ("HID: i2c-hid: Use address probe to wake on resume") replaced the retry of power commands with the dummy read "bus probe" we use on boot which accounts for a necessary delay before retry.
This made at least one Weida device (2575:0910 in an ASUS Vivobook S14) very unhappy, as the bus probe despite being successful somehow lead to the following power command failing so hard that the device never lets go of the bus. This means that even retries of the power command would fail on a timeout as the bus remains busy.
Remove the bus probe on resume and instead reintroduce retry of the power command for wake-up purposes while respecting the newly established wake-up retry timings.
--- drivers/hid/i2c-hid/i2c-hid-core.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
drivers/hid/i2c-hid/i2c-hid-core.c +12 -8
@@ -414,7 +414,19 @@ static int i2c_hid_set_power(struct i2c_hid *ihid, int power_state)i2c_hid_dbg (ihid,"%s\n" , __func__); +/* +* Some STM-based devices need 400µs after a rising clock edge to wake +* from deep sleep, in which case the first request will fail due to +* the address not being acknowledged. Try after a short sleep to see +* if the device came alive on the bus. Certain Weida Tech devices also +* need this. +*/ ret =i2c_hid_set_power_command (ihid, power_state); +if (ret && power_state ==I2C_HID_PWR_ON ) { +usleep_range (400 ,500 ); + ret =i2c_hid_set_power_command (ihid,I2C_HID_PWR_ON ); + } +if (ret)dev_err (&ihid->client->dev,"failed to change power setting.\n" );
@@ -976,14 +988,6 @@ static int i2c_hid_core_resume(struct i2c_hid *ihid)enable_irq (client->irq); -/* Make sure the device is awake on the bus */ - ret =i2c_hid_probe_address (ihid); -if (ret <0 ) { -dev_err (&client->dev,"nothing at address after resume: %d\n" , - ret); -return -ENXIO ; - } -/* On Goodix 27c6:0d42 wait extra time before device wakeup. * It's not clear why but if we send wakeup too early, the device will * never trigger input interrupts.
Signature · 1 line
2.47.1
Greg Kroah-Hartman
maintainerPATCH 123/466 HID: wacom: fix when get product name maybe null pointer
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: WangYuli <[email protected]>
commit 59548215b76be98cf3422eea9a67d6ea578aca3d upstream.
Due to incorrect dev->product reporting by certain devices, null pointer dereferences occur when dev->product is empty, leading to potential system crashes.
This issue was found on EXCELSIOR DL37-D05 device with Loongson-LS3A6000-7A2000-DL37 motherboard.
Kernel logs:
[ 56.470885] usb 4-3: new full-speed USB device number 4 using ohci-pci [ 56.671638] usb 4-3: string descriptor 0 read error: -22 [ 56.671644] usb 4-3: New USB device found, idVendor=056a, idProduct=0374, bcdDevice= 1.07 [ 56.671647] usb 4-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 56.678839] hid-generic 0003:056A:0374.0004: hiddev0,hidraw3: USB HID v1.10 Device [HID 056a:0374] on usb-0000:00:05.0-3/input0 [ 56.697719] CPU 2 Unable to handle kernel paging request at virtual address 0000000000000000, era == 90000000066e35c8, ra == ffff800004f98a80 [ 56.697732] Oops[#1]: [ 56.697734] CPU: 2 PID: 2742 Comm: (udev-worker) Tainted: G OE 6.6.0-loong64-desktop #25.00.2000.015 [ 56.697737] Hardware name: Inspur CE520L2/C09901N000000000, BIOS 2.09.00 10/11/2024 [ 56.697739] pc 90000000066e35c8 ra ffff800004f98a80 tp 9000000125478000 sp 900000012547b8a0 [ 56.697741] a0 0000000000000000 a1 ffff800004818b28 a2 0000000000000000 a3 0000000000000000 [ 56.697743] a4 900000012547b8f0 a5 0000000000000000 a6 0000000000000000 a7 0000000000000000 [ 56.697745] t0 ffff800004818b2d t1 0000000000000000 t2 0000000000000003 t3 0000000000000005 [ 56.697747] t4 0000000000000000 t5 0000000000000000 t6 0000000000000000 t7 0000000000000000 [ 56.697748] t8 0000000000000000 u0 0000000000000000 s9 0000000000000000 s0 900000011aa48028 [ 56.697750] s1 0000000000000000 s2 0000000000000000 s3 ffff800004818e80 s4 ffff800004810000 [ 56.697751] s5 90000001000b98d0 s6 ffff800004811f88 s7 ffff800005470440 s8 0000000000000000 [ 56.697753] ra: ffff800004f98a80 wacom_update_name+0xe0/0x300 [wacom] [ 56.697802] ERA: 90000000066e35c8 strstr+0x28/0x120 [ 56.697806] CRMD: 000000b0 (PLV0 -IE -DA +PG DACF=CC DACM=CC -WE) [ 56.697816] PRMD: 0000000c (PPLV0 +PIE +PWE) [ 56.697821] EUEN: 00000000 (-FPE -SXE -ASXE -BTE) [ 56.697827] ECFG: 00071c1d (LIE=0,2-4,10-12 VS=7) [ 56.697831] ESTAT: 00010000 [PIL] (IS= ECode=1 EsubCode=0) [ 56.697835] BADV: 0000000000000000 [ 56.697836] PRID: 0014d000 (Loongson-64bit, Loongson-3A6000) [ 56.697838] Modules linked in: wacom(+) bnep bluetooth rfkill qrtr nls_iso8859_1 nls_cp437 snd_hda_codec_conexant snd_hda_codec_generic ledtrig_audio snd_hda_codec_hdmi snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_timer snd soundcore input_leds mousedev led_class joydev deepin_netmonitor(OE) fuse nfnetlink dmi_sysfs ip_tables x_tables overlay amdgpu amdxcp drm_exec gpu_sched drm_buddy radeon drm_suballoc_helper i2c_algo_bit drm_ttm_helper r8169 ttm drm_display_helper spi_loongson_pci xhci_pci cec xhci_pci_renesas spi_loongson_core hid_generic realtek gpio_loongson_64bit [ 56.697887] Process (udev-worker) (pid: 2742, threadinfo=00000000aee0d8b4, task=00000000a9eff1f3) [ 56.697890] Stack : 0000000000000000 ffff800004817e00 0000000000000000 0000251c00000000 [ 56.697896] 0000000000000000 00000011fffffffd 0000000000000000 0000000000000000 [ 56.697901] 0000000000000000 1b67a968695184b9 0000000000000000 90000001000b98d0 [ 56.697906] 90000001000bb8d0 900000011aa48028 0000000000000000 ffff800004f9d74c [ 56.697911] 90000001000ba000 ffff800004f9ce58 0000000000000000 ffff800005470440 [ 56.697916] ffff800004811f88 90000001000b98d0 9000000100da2aa8 90000001000bb8d0 [ 56.697921] 0000000000000000 90000001000ba000 900000011aa48028 ffff800004f9d74c [ 56.697926] ffff8000054704e8 90000001000bb8b8 90000001000ba000 0000000000000000 [ 56.697931] 90000001000bb8d0 9000000006307564 9000000005e666e0 90000001752359b8 [ 56.697936] 9000000008cbe400 900000000804d000 9000000005e666e0 0000000000000000 [ 56.697941] ... [ 56.697944] Call Trace: [ 56.697945] [<90000000066e35c8>] strstr+0x28/0x120 [ 56.697950] [<ffff800004f98a80>] wacom_update_name+0xe0/0x300 [wacom] [ 56.698000] [<ffff800004f9ce58>] wacom_parse_and_register+0x338/0x900 [wacom] [ 56.698050] [<ffff800004f9d74c>] wacom_probe+0x32c/0x420 [wacom] [ 56.698099] [<9000000006307564>] hid_device_probe+0x144/0x260 [ 56.698103] [<9000000005e65d68>] really_probe+0x208/0x540 [ 56.698109] [<9000000005e661dc>] __driver_probe_device+0x13c/0x1e0 [ 56.698112] [<9000000005e66620>] driver_probe_device+0x40/0x100 [ 56.698116] [<9000000005e6680c>] __device_attach_driver+0x12c/0x180 [ 56.698119] [<9000000005e62bc8>] bus_for_each_drv+0x88/0x160 [ 56.698123] [<9000000005e66468>] __device_attach+0x108/0x260 [ 56.698126] [<9000000005e63918>] device_reprobe+0x78/0x100 [ 56.698129] [<9000000005e62a68>] bus_for_each_dev+0x88/0x160 [ 56.698132] [<9000000006304e54>] __hid_bus_driver_added+0x34/0x80 [ 56.698134] [<9000000005e62bc8>] bus_for_each_drv+0x88/0x160 [ 56.698137] [<9000000006304df0>] __hid_register_driver+0x70/0xa0 [ 56.698142] [<9000000004e10fe4>] do_one_initcall+0x104/0x320 [ 56.698146] [<9000000004f38150>] do_init_module+0x90/0x2c0 [ 56.698151] [<9000000004f3a3d8>] init_module_from_file+0xb8/0x120 [ 56.698155] [<9000000004f3a590>] idempotent_init_module+0x150/0x3a0 [ 56.698159] [<9000000004f3a890>] sys_finit_module+0xb0/0x140 [ 56.698163] [<900000000671e4e8>] do_syscall+0x88/0xc0 [ 56.698166] [<9000000004e12404>] handle_syscall+0xc4/0x160 [ 56.698171] Code: 0011958f 00150224 5800cd85 <2a00022c> 00150004 4000c180 0015022c 03400000 03400000 [ 56.698192] ---[ end trace 0000000000000000 ]---
--- drivers/hid/wacom_sys.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/hid/wacom_sys.c +2 -1
@@ -2241,7 +2241,8 @@ static void wacom_update_name(struct wacif (hid_is_usb (wacom->hdev)) {struct usb_interface *intf =to_usb_interface (wacom->hdev->dev.parent);struct usb_device *dev =interface_to_usbdev (intf); - product_name = dev->product; +if (dev->product !=NULL ) + product_name = dev->product; }if (wacom->hdev->bus ==BUS_I2C ) {
Greg Kroah-Hartman
maintainerPATCH 124/466 LoongArch: Add architecture specific huge_pte_clear()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bibo Mao <[email protected]>
commit 7cd1f5f77925ae905a57296932f0f9ef0dc364f8 upstream.
When executing mm selftests run_vmtests.sh, there is such an error:
BUG: Bad page state in process uffd-unit-tests pfn:00000
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x0
flags: 0xffff0000002000(reserved|node=0|zone=0|lastcpupid=0xffff)
raw: 00ffff0000002000 ffffbf0000000008 ffffbf0000000008 0000000000000000
raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: PAGE_FLAGS_CHECK_AT_FREE flag(s) set
Modules linked in: snd_seq_dummy snd_seq snd_seq_device rfkill vfat fat
virtio_balloon efi_pstore virtio_net pstore net_failover failover fuse
nfnetlink virtio_scsi virtio_gpu virtio_dma_buf dm_multipath efivarfs
CPU: 2 UID: 0 PID: 1913 Comm: uffd-unit-tests Not tainted 6.12.0 #184
Hardware name: QEMU QEMU Virtual Machine, BIOS unknown 2/2/2022
Stack : 900000047c8ac000 0000000000000000 9000000000223a7c 900000047c8ac000
900000047c8af690 900000047c8af698 0000000000000000 900000047c8af7d8
900000047c8af7d0 900000047c8af7d0 900000047c8af5b0 0000000000000001
0000000000000001 900000047c8af698 10b3c7d53da40d26 0000010000000000
0000000000000022 0000000fffffffff fffffffffe000000 ffff800000000000
000000000000002f 0000800000000000 000000017a6d4000 90000000028f8940
0000000000000000 0000000000000000 90000000025aa5e0 9000000002905000
0000000000000000 90000000028f8940 ffff800000000000 0000000000000000
0000000000000000 0000000000000000 9000000000223a94 000000012001839c
00000000000000b0 0000000000000004 0000000000000000 0000000000071c1d
...
Call Trace:
[<9000000000223a94>] show_stack+0x5c/0x180
[<9000000001c3fd64>] dump_stack_lvl+0x6c/0xa0
[<900000000056aa08>] bad_page+0x1a0/0x1f0
[<9000000000574978>] free_unref_folios+0xbf0/0xd20
[<90000000004e65cc>] folios_put_refs+0x1a4/0x2b8
[<9000000000599a0c>] free_pages_and_swap_cache+0x164/0x260
[<9000000000547698>] tlb_batch_pages_flush+0xa8/0x1c0
[<9000000000547f30>] tlb_finish_mmu+0xa8/0x218
[<9000000000543cb8>] exit_mmap+0x1a0/0x360
[<9000000000247658>] __mmput+0x78/0x200
[<900000000025583c>] do_exit+0x43c/0xde8
[<9000000000256490>] do_group_exit+0x68/0x110
[<9000000000256554>] sys_exit_group+0x1c/0x20
[<9000000001c413b4>] do_syscall+0x94/0x130
[<90000000002216d8>] handle_syscall+0xb8/0x158
Disabling lock debugging due to kernel taint
BUG: non-zero pgtables_bytes on freeing mm: -16384On LoongArch system, invalid huge pte entry should be invalid_pte_table or a single _PAGE_HUGE bit rather than a zero value. And it should be the same with invalid pmd entry, since pmd_none() is called by function free_pgd_range() and pmd_none() return 0 by huge_pte_clear(). So single _PAGE_HUGE bit is also treated as a valid pte table and free_pte_range() will be called in free_pmd_range().
free_pmd_range()
pmd = pmd_offset(pud, addr);
do {
next = pmd_addr_end(addr, end);
if (pmd_none_or_clear_bad(pmd))
continue;
free_pte_range(tlb, pmd, addr);
} while (pmd++, addr = next, addr != end);Here invalid_pte_table is used for both invalid huge pte entry and pmd entry.
--- arch/loongarch/include/asm/hugetlb.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
arch/loongarch/include/asm/hugetlb.h +10 -0
@@ -29,6 +29,16 @@ static inline int prepare_hugepage_rangereturn 0 ; } +#define __HAVE_ARCH_HUGE_PTE_CLEAR +static inline void huge_pte_clear (struct mm_struct *mm,unsigned long addr, +pte_t *ptep,unsigned long sz) +{ +pte_t clear; + +pte_val (clear) = (unsigned long )invalid_pte_table; +set_pte_at (mm, addr, ptep, clear); +} +#define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEARstatic inline pte_t huge_ptep_get_and_clear (struct mm_struct *mm,unsigned long addr,pte_t *ptep)
Greg Kroah-Hartman
maintainerPATCH 125/466 LoongArch: KVM: Protect kvm_check_requests() with SRCU
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit 589e6cc7597655bed7b8543b8286925f631f597c upstream.
When we enable lockdep we get such a warning:
=============================
WARNING: suspicious RCU usage
6.12.0-rc7+ #1891 Tainted: G W
-----------------------------
include/linux/kvm_host.h:1043 suspicious rcu_dereference_check() usage! other info that might help us debug this:
rcu_scheduler_active = 2, debug_locks = 1
1 lock held by qemu-system-loo/948:
#0: 90000001184a00a8 (&vcpu->mutex){+.+.}-{4:4}, at: kvm_vcpu_ioctl+0xf4/0xe20 [kvm]
stack backtrace:
CPU: 0 UID: 0 PID: 948 Comm: qemu-system-loo Tainted: G W 6.12.0-rc7+ #1891
Tainted: [W]=WARN
Hardware name: Loongson Loongson-3A5000-7A1000-1w-CRB/Loongson-LS3A5000-7A1000-1w-CRB, BIOS vUDK2018-LoongArch-V2.0.0-prebeta9 10/21/2022
Stack : 0000000000000089 9000000005a0db9c 90000000071519c8 900000012c578000
900000012c57b920 0000000000000000 900000012c57b928 9000000007e53788
900000000815bcc8 900000000815bcc0 900000012c57b790 0000000000000001
0000000000000001 4b031894b9d6b725 0000000004dec000 90000001003299c0
0000000000000414 0000000000000001 000000000000002d 0000000000000003
0000000000000030 00000000000003b4 0000000004dec000 90000001184a0000
900000000806d000 9000000007e53788 00000000000000b4 0000000000000004
0000000000000004 0000000000000000 0000000000000000 9000000107baf600
9000000008916000 9000000007e53788 9000000005924778 0000000010000044
00000000000000b0 0000000000000004 0000000000000000 0000000000071c1d
...
Call Trace:
[<9000000005924778>] show_stack+0x38/0x180
[<90000000071519c4>] dump_stack_lvl+0x94/0xe4
[<90000000059eb754>] lockdep_rcu_suspicious+0x194/0x240
[<ffff8000022143bc>] kvm_gfn_to_hva_cache_init+0xfc/0x120 [kvm]
[<ffff80000222ade4>] kvm_pre_enter_guest+0x3a4/0x520 [kvm]
[<ffff80000222b3dc>] kvm_handle_exit+0x23c/0x480 [kvm]Fix it by protecting kvm_check_requests() with SRCU.
--- arch/loongarch/kvm/vcpu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/loongarch/kvm/vcpu.c +3 -1
@@ -240,7 +240,7 @@ static void kvm_late_check_requests(stru*/ static int kvm_enter_guest_check (struct kvm_vcpu *vcpu) { -int ret; +int idx, ret;/* * Check conditions before entering the guest
@@ -249,7 +249,9 @@ static int kvm_enter_guest_check(structif (ret <0 )return ret; + idx =srcu_read_lock (&vcpu->kvm->srcu); ret =kvm_check_requests (vcpu); +srcu_read_unlock (&vcpu->kvm->srcu, idx);return ret; }
Greg Kroah-Hartman
maintainerPATCH 126/466 ksmbd: fix Out-of-Bounds Read in ksmbd_vfs_stream_read
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jordy Zomer <[email protected]>
commit fc342cf86e2dc4d2edb0fc2ff5e28b6c7845adb9 upstream.
An offset from client could be a negative value, It could lead to an out-of-bounds read from the stream_buf.
Note that this issue is coming when setting
'vfs objects = streams_xattr parameter' in ksmbd.conf.
--- fs/smb/server/smb2pdu.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/smb/server/smb2pdu.c +4 -0
@@ -6651,6 +6651,10 @@ int smb2_read(struct ksmbd_work *work) } offset =le64_to_cpu (req->Offset); +if (offset <0 ) { + err = -EINVAL ; + goto out; + } length =le32_to_cpu (req->Length); mincount =le32_to_cpu (req->MinimumCount);
Greg Kroah-Hartman
maintainerPATCH 127/466 ksmbd: fix Out-of-Bounds Write in ksmbd_vfs_stream_write
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jordy Zomer <[email protected]>
commit 313dab082289e460391c82d855430ec8a28ddf81 upstream.
An offset from client could be a negative value, It could allows to write data outside the bounds of the allocated buffer. Note that this issue is coming when setting
'vfs objects = streams_xattr parameter' in ksmbd.conf.
--- fs/smb/server/smb2pdu.c | 2 ++ 1 file changed, 2 insertions(+)
fs/smb/server/smb2pdu.c +2 -0
@@ -6868,6 +6868,8 @@ int smb2_write(struct ksmbd_work *work) } offset =le64_to_cpu (req->Offset); +if (offset <0 ) +return -EINVAL ; length =le32_to_cpu (req->Length); if (req->Channel == SMB2_CHANNEL_RDMA_V1 ||
Greg Kroah-Hartman
maintainerPATCH 128/466 watchdog: rti: of: honor timeout-sec property
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Sverdlin <[email protected]>
commit 4962ee045d8f06638714d801ab0fb72f89c16690 upstream.
Currently "timeout-sec" Device Tree property is being silently ignored:
even though watchdog_init_timeout() is being used, the driver always passes "heartbeat" == DEFAULT_HEARTBEAT == 60 as argument.
Fix this by setting struct watchdog_device::timeout to DEFAULT_HEARTBEAT and passing real module parameter value to watchdog_init_timeout() (which may now be 0 if not specified).
--- drivers/watchdog/rti_wdt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/watchdog/rti_wdt.c +2 -1
@@ -61,7 +61,7 @@#define MAX_HW_ERROR 250 -static int heartbeat =DEFAULT_HEARTBEAT ; +static int heartbeat;/* * struct to hold data for each WDT device
@@ -252,6 +252,7 @@ static int rti_wdt_probe(struct platform wdd->min_timeout =1 ; wdd->max_hw_heartbeat_ms = (WDT_PRELOAD_MAX <<WDT_PRELOAD_SHIFT ) / wdt->freq *1000 ; + wdd->timeout =DEFAULT_HEARTBEAT ; wdd->parent = dev;watchdog_set_drvdata (wdd, wdt);
Greg Kroah-Hartman
maintainerPATCH 129/466 can: dev: can_set_termination(): allow sleeping GPIOs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
commit ee1dfbdd8b4b6de85e96ae2059dc9c1bdb6b49b5 upstream.
In commit 6e86a1543c37 ("can: dev: provide optional GPIO based termination support") GPIO based termination support was added.
For no particular reason that patch uses gpiod_set_value() to set the GPIO. This leads to the following warning, if the systems uses a sleeping GPIO, i.e. behind an I2C port expander:
| WARNING: CPU: 0 PID: 379 at /drivers/gpio/gpiolib.c:3496 gpiod_set_value+0x50/0x6c
| CPU: 0 UID: 0 PID: 379 Comm: ip Not tainted 6.11.0-20241016-1 #1 823affae360cc91126e4d316d7a614a8bf86236c
Replace gpiod_set_value() by gpiod_set_value_cansleep() to allow the use of sleeping GPIOs.
--- drivers/net/can/dev/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/can/dev/dev.c +1 -1
@@ -468,7 +468,7 @@ static int can_set_termination(struct neelse set =0 ; -gpiod_set_value (priv->termination_gpio, set); +gpiod_set_value_cansleep (priv->termination_gpio, set);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 130/466 can: mcp251xfd: mcp251xfd_get_tef_len(): work around erratum DS80000789E 6.
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
commit 30447a1bc0e066e492552b3e5ffeb63c1605dfe2 upstream.
Commit b8e0ddd36ce9 ("can: mcp251xfd: tef: prepare to workaround broken TEF FIFO tail index erratum") introduced mcp251xfd_get_tef_len() to get the number of unhandled transmit events from the Transmit Event FIFO (TEF).
As the TEF has no head index, the driver uses the TX-FIFO's tail index instead, assuming that send frames are completed.
When calculating the number of unhandled TEF events, that commit didn't take mcp2518fd erratum DS80000789E 6. into account. According to that erratum, the FIFOCI bits of a FIFOSTA register, here the TX-FIFO tail index might be corrupted.
However here it seems the bit indicating that the TX-FIFO is empty (MCP251XFD_REG_FIFOSTA_TFERFFIF) is not correct while the TX-FIFO tail index is.
Assume that the TX-FIFO is indeed empty if:
- Chip's head and tail index are equal (len == 0).
- The TX-FIFO is less than half full.
(The TX-FIFO empty case has already been checked at the
beginning of this function.)
- No free buffers in the TX ring.
If the TX-FIFO is assumed to be empty, assume that the TEF is full and return the number of elements in the TX-FIFO (which equals the number of TEF elements).
If these assumptions are false, the driver might read to many objects from the TEF. mcp251xfd_handle_tefif_one() checks the sequence numbers and will refuse to process old events.
--- drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c | 29 +++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)
drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c +28 -1
@@ -21,6 +21,11 @@ static inline bool mcp251xfd_tx_fifo_stareturn fifo_sta &MCP251XFD_REG_FIFOSTA_TFERFFIF ; } +static inline bool mcp251xfd_tx_fifo_sta_less_than_half_full (u32 fifo_sta) +{ +return fifo_sta &MCP251XFD_REG_FIFOSTA_TFHRFHIF ; +} +static inline int mcp251xfd_tef_tail_get_from_chip (const struct mcp251xfd_priv *priv,u8 *tef_tail)
@@ -147,7 +152,29 @@ mcp251xfd_get_tef_len(struct mcp251xfd_pBUILD_BUG_ON (sizeof (tx_ring->obj_num) !=sizeof (len)); len = (chip_tx_tail << shift) - (tail << shift); - *len_p = len >> shift; + len >>= shift; + +/* According to mcp2518fd erratum DS80000789E 6. the FIFOCI +* bits of a FIFOSTA register, here the TX-FIFO tail index +* might be corrupted. +* +* However here it seems the bit indicating that the TX-FIFO +* is empty (MCP251XFD_REG_FIFOSTA_TFERFFIF) is not correct +* while the TX-FIFO tail index is. +* +* We assume the TX-FIFO is empty, i.e. all pending CAN frames +* haven been send, if: +* - Chip's head and tail index are equal (len == 0). +* - The TX-FIFO is less than half full. +* (The TX-FIFO empty case has already been checked at the +* beginning of this function.) +* - No free buffers in the TX ring. +*/ +if (len ==0 &&mcp251xfd_tx_fifo_sta_less_than_half_full (fifo_sta) && +mcp251xfd_get_tx_free (tx_ring) ==0 ) + len = tx_ring->obj_num; + + *len_p = len;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 131/466 tracing: Fix cmp_entries_dup() to respect sort() comparison rules
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Wei Chiu <[email protected]>
commit e63fbd5f6810ed756bbb8a1549c7d4132968baa9 upstream.
The cmp_entries_dup() function used as the comparator for sort() violated the symmetry and transitivity properties required by the sorting algorithm. Specifically, it returned 1 whenever memcmp() was non-zero, which broke the following expectations:
* Symmetry: If x < y, then y > x.
* Transitivity: If x < y and y < z, then x < z.
These violations could lead to incorrect sorting and failure to correctly identify duplicate elements.
Fix the issue by directly returning the result of memcmp(), which adheres to the required comparison properties.
--- kernel/trace/tracing_map.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
kernel/trace/tracing_map.c +1 -5
@@ -845,15 +845,11 @@ int tracing_map_init(struct tracing_mapstatic int cmp_entries_dup (const void *A ,const void *B ) {const struct tracing_map_sort_entry *a, *b; -int ret =0 ; a = *(const struct tracing_map_sort_entry **)A ; b = *(const struct tracing_map_sort_entry **)B ; -if (memcmp (a->key, b->key, a->elt->map->key_size)) - ret =1 ; - -return ret; +return memcmp (a->key, b->key, a->elt->map->key_size); }static int cmp_entries_sum (const void *A ,const void *B )