6.6.51-rc1 review
Subsystems (7)
Greg Kroah-Hartman
maintainercover 6.6.51-rc1 review
This is the start of the stable review cycle for the 6.6.51 release. There are 269 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 12 Sep 2024 09:25:22 +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.6.51-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.6.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.6.51-rc1
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_sync: Fix UAF on hci_abort_conn_sync
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_sync: Fix UAF on create_le_conn_complete
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_sync: Fix UAF in hci_acl_create_conn_sync
Stefan Wahren <[email protected]>
spi: spi-fsl-lpspi: Fix off-by-one in prescale max
Filipe Manana <[email protected]>
btrfs: fix race between direct IO write and fsync when using same fd
Thomas Gleixner <[email protected]>
x86/mm: Fix PTI for i386 some more
Andrea Parri <[email protected]>
membarrier: riscv: Add full memory barrier in switch_mm()
Li Nan <[email protected]>
ublk_drv: fix NULL pointer dereference in ublk_ctrl_start_recovery()
Alexandre Ghiti <[email protected]>
riscv: Do not restrict memory size because of linear mapping on nommu
Anton Blanchard <[email protected]>
riscv: Fix toolchain vector detection
Paulo Alcantara <[email protected]>
smb: client: fix double put of @cfile in smb2_rename_path()
Liao Chen <[email protected]>
gpio: modepin: Enable module autoloading
Krzysztof Kozlowski <[email protected]>
gpio: rockchip: fix OF node leak in probe()
Andy Shevchenko <[email protected]>
drm/i915/fence: Mark debug_fence_free() with __maybe_unused
Andy Shevchenko <[email protected]>
drm/i915/fence: Mark debug_fence_init_onstack() with __maybe_unused
Stephen Boyd <[email protected]>
clk: qcom: gcc-sm8550: Don't park the USB RCG at registration time
Stephen Boyd <[email protected]>
clk: qcom: gcc-sm8550: Don't use parking clk_ops for QUPs
Matteo Martelli <[email protected]>
ASoC: sunxi: sun4i-i2s: fix LRCLK polarity in i2s mode
Chen-Yu Tsai <[email protected]>
ASoc: SOF: topology: Clear SOF link platform name upon unload
Keith Busch <[email protected]>
nvme-pci: allocate tagset on reset if necessary
Maurizio Lombardi <[email protected]>
nvmet-tcp: fix kernel crash if commands allocation fails
Mohan Kumar <[email protected]>
ASoC: tegra: Fix CBB error during probe()
Christophe Leroy <[email protected]>
powerpc/vdso: Don't discard rela sections
Christophe Leroy <[email protected]>
powerpc/64e: Define mmu_pte_psize static
Michael Ellerman <[email protected]>
powerpc/64e: split out nohash Book3E 64-bit code
Michael Ellerman <[email protected]>
powerpc/64e: remove unused IBM HTW code
devi priya <[email protected]>
clk: qcom: ipq9574: Update the alpha PLL type for GPLLs
Jia Jie Ho <[email protected]>
crypto: starfive - Fix nent assignment in rsa dec
Jia Jie Ho <[email protected]>
crypto: starfive - Align rsa input data to 32-bit
Igor Pylypiv <[email protected]>
ata: libata-scsi: Check ATA_QCFLAG_RTF_FILLED before using result_tf
Igor Pylypiv <[email protected]>
ata: libata-scsi: Remove redundant sense_buffer memsets
Marek Olšák <[email protected]>
drm/amdgpu: handle gfx12 in amdgpu_display_verify_sizes
Aurabindo Pillai <[email protected]>
drm/amd: Add gfx12 swizzle mode defs
Marc Kleine-Budde <[email protected]>
can: mcp251xfd: rx: add workaround for erratum DS80000789E 6 of mcp2518fd
Marc Kleine-Budde <[email protected]>
can: mcp251xfd: clarify the meaning of timestamp
Marc Kleine-Budde <[email protected]>
can: mcp251xfd: rx: prepare to workaround broken RX FIFO head index erratum
Marc Kleine-Budde <[email protected]>
can: mcp251xfd: mcp251xfd_handle_rxif_ring_uinc(): factor out in separate function
Jonathan Cameron <[email protected]>
arm64: acpi: Harden get_cpu_for_acpi_id() against missing CPU entry
James Morse <[email protected]>
arm64: acpi: Move get_cpu_for_acpi_id() to a header
Jonathan Cameron <[email protected]>
ACPI: processor: Fix memory leaks in error paths of processor_add()
Jonathan Cameron <[email protected]>
ACPI: processor: Return an error if acpi_processor_get_info() fails in processor_add()
Nicholas Piggin <[email protected]>
workqueue: Improve scalability of workqueue watchdog touch
Nicholas Piggin <[email protected]>
workqueue: wq_watchdog_touch is always called with valid CPU
Usama Arif <[email protected]>
Revert "mm: skip CMA pages when they are not available"
Vern Hao <[email protected]>
mm/vmscan: use folio_migratetype() instead of get_pageblock_migratetype()
Peter Zijlstra <[email protected]>
perf/aux: Fix AUX buffer serialization
Sven Schnelle <[email protected]>
uprobes: Use kzalloc to allocate xol area
Daniel Lezcano <[email protected]>
clocksource/drivers/timer-of: Remove percpu irq related code
Jacky Bai <[email protected]>
clocksource/drivers/imx-tpm: Fix next event not taking effect sometime
Jacky Bai <[email protected]>
clocksource/drivers/imx-tpm: Fix return -ETIME when delta exceeds INT_MAX
David Fernandez Gonzalez <[email protected]>
VMCI: Fix use-after-free when removing resource in vmci_resource_remove()
Naman Jain <[email protected]>
Drivers: hv: vmbus: Fix rescind handling in uio_hv_generic
Saurabh Sengar <[email protected]>
uio_hv_generic: Fix kernel NULL pointer dereference in hv_uio_rescind
Geert Uytterhoeven <[email protected]>
nvmem: Fix return type of devm_nvmem_device_get() in kerneldoc
Carlos Llamas <[email protected]>
binder: fix UAF caused by offsets overwrite
Sukrut Bellary <[email protected]>
misc: fastrpc: Fix double free of 'buf' in error path
Prashanth K <[email protected]>
usb: dwc3: Avoid waking up gadget during startxfer
Pawel Laszczak <[email protected]>
usb: cdns2: Fix controller reset issue
Faisal Hassan <[email protected]>
usb: dwc3: core: update LC timer as per USB Spec V3.2
Dumitru Ceclan <[email protected]>
iio: adc: ad7124: fix chip ID mismatch
Guillaume Stols <[email protected]>
iio: adc: ad7606: remove frstdata check for serial mode
Dumitru Ceclan <[email protected]>
iio: adc: ad7124: fix config comparison
Matteo Martelli <[email protected]>
iio: fix scale application in iio_convert_raw_to_processed_unlocked
David Lechner <[email protected]>
iio: buffer-dmaengine: fix releasing dma channel on error
Aleksandr Mishin <[email protected]>
staging: iio: frequency: ad9834: Validate frequency parameter value
Sasha Neftin <[email protected]>
intel: legacy: Partial revert of field get conversion
Matthieu Baerts (NGI0) <[email protected]>
tcp: process the 3rd ACK with sk_socket for TFO/MPTCP
Perry Yuan <[email protected]>
cpufreq: amd-pstate: fix the highest frequency issue which limits performance
Meng Li <[email protected]>
cpufreq: amd-pstate: Enable amd-pstate preferred core support
Meng Li <[email protected]>
ACPI: CPPC: Add helper to get the highest performance value
Alexandre Ghiti <[email protected]>
riscv: Use accessors to page table entries instead of direct dereference
Alexandre Ghiti <[email protected]>
riscv: mm: Only compile pgtable.c if MMU
Alexandre Ghiti <[email protected]>
mm: Introduce pudp/p4dp/pgdp_get() functions
Alexandre Ghiti <[email protected]>
riscv: Use WRITE_ONCE() when setting page table entries
Trond Myklebust <[email protected]>
NFSv4: Add missing rescheduling points in nfs_client_return_marked_delegations
ChenXiaoSong <[email protected]>
smb/server: fix potential null-ptr-deref of lease_ctx_info in smb2_open()
Michael Ellerman <[email protected]>
ata: pata_macio: Use WARN instead of BUG
Carlos Song <[email protected]>
spi: spi-fsl-lpspi: limit PRESCALE bit in TCR register
Jiaxun Yang <[email protected]>
MIPS: cevt-r4k: Don't call get_c0_compare_int if timer irq is installed
Kent Overstreet <[email protected]>
lib/generic-radix-tree.c: Fix rare race in __genradix_ptr_alloc()
Stefan Wiehler <[email protected]>
of/irq: Prevent device address out-of-bounds read in interrupt map walk
Phillip Lougher <[email protected]>
Squashfs: sanity check symbolic link size
Oliver Neukum <[email protected]>
usbnet: ipheth: race between ipheth_close and error handling
Dmitry Torokhov <[email protected]>
Input: uinput - reject requests with unreasonable number of slots
Olivier Sobrie <[email protected]>
HID: amd_sfh: free driver_data after destroying hid device
Camila Alvarez <[email protected]>
HID: cougar: fix slab-out-of-bounds Read in cougar_report_fixup
Heiko Carstens <[email protected]>
s390/vmlinux.lds.S: Move ro_after_init section behind rodata section
David Sterba <[email protected]>
btrfs: initialize location to fix -Wmaybe-uninitialized in btrfs_lookup_dentry()
Devyn Liu <[email protected]>
spi: hisi-kunpeng: Add verification for the max_frequency provided by the firmware
Zenghui Yu <[email protected]>
kselftests: dmabuf-heaps: Ensure the driver name is null-terminated
Jarkko Nikula <[email protected]>
i3c: mipi-i3c-hci: Error out instead on BUG_ON() in IBI DMA setup
Frank Li <[email protected]>
i3c: master: svc: resend target address when get NACK
David Howells <[email protected]>
vfs: Fix potential circular locking through setxattr() and removexattr()
Arnd Bergmann <[email protected]>
regmap: maple: work around gcc-14.1 false-positive warning
Huacai Chen <[email protected]>
LoongArch: Use correct API to map cmdline in relocate_kernel()
Vladimir Oltean <[email protected]>
net: dpaa: avoid on-stack arrays of NR_CPUS elements
Neeraj Sanjay Kale <[email protected]>
Bluetooth: btnxpuart: Fix Null pointer dereference in btnxpuart_flush()
Kuniyuki Iwashima <[email protected]>
tcp: Don't drop SYN+ACK for simultaneous connect().
Dan Williams <[email protected]>
PCI: Add missing bridge lock to pci_bus_lock()
yang.zhang <[email protected]>
riscv: set trap vector earlier
Alison Schofield <[email protected]>
cxl/region: Verify target positions using the ordered target list
Filipe Manana <[email protected]>
btrfs: replace BUG_ON() with error handling at update_ref_for_cow()
Josef Bacik <[email protected]>
btrfs: clean up our handling of refs == 0 in snapshot delete
Josef Bacik <[email protected]>
btrfs: replace BUG_ON with ASSERT in walk_down_proc()
Konstantin Komarov <[email protected]>
fs/ntfs3: Check more cases when directory is corrupted
Zqiang <[email protected]>
smp: Add missing destroy_work_on_stack() call in smp_call_on_cpu()
Christian König <[email protected]>
drm/amdgpu: reject gang submit on reserved VMIDs
Sascha Hauer <[email protected]>
wifi: mwifiex: Do not return unused priv in mwifiex_get_priv_by_id()
Yicong Yang <[email protected]>
dma-mapping: benchmark: Don't starve others when doing the test
Ye Bin <[email protected]>
jbd2: avoid mount failed when commit block is partial submitted
Luis Henriques (SUSE) <[email protected]>
ext4: fix possible tid_t sequence overflows
Yifan Zha <[email protected]>
drm/amdgpu: Set no_hw_access when VF request full GPU fails
Andreas Ziegler <[email protected]>
libbpf: Add NULL checks to bpf_object__{prev_map,next_map}Shenghao Ding <[email protected]>
ASoc: TAS2781: replace beXX_to_cpup with get_unaligned_beXX for potentially broken alignment
Guenter Roeck <[email protected]>
hwmon: (w83627ehf) Fix underflows seen when writing limit attributes
Guenter Roeck <[email protected]>
hwmon: (nct6775-core) Fix underflows seen when writing limit attributes
Guenter Roeck <[email protected]>
hwmon: (lm95234) Fix underflows seen when writing limit attributes
Guenter Roeck <[email protected]>
hwmon: (adc128d818) Fix underflows seen when writing limit attributes
Hareshx Sankar Raj <[email protected]>
crypto: qat - fix unintentional re-enabling of error interrupts
Igor Pylypiv <[email protected]>
scsi: pm80xx: Set phy->enable_completion only when we wait for it
Kyoungrul Kim <[email protected]>
scsi: ufs: core: Remove SCSI host only if added
Marcin Ślusarz <[email protected]>
wifi: rtw88: usb: schedule rx work after everything is set up
Xuan Zhuo <[email protected]>
virtio_ring: fix KMSAN error for premapped mode
Krishna Kumar <[email protected]>
pci/hotplug/pnv_php: Fix hotplug driver crash on Powernv
Zijun Hu <[email protected]>
devres: Initialize an uninitialized struct member
Johannes Berg <[email protected]>
um: line: always fill *error_out in setup_one_line()
Waiman Long <[email protected]>
cgroup: Protect css->cgroup write under css_set_lock
Jacob Pan <[email protected]>
iommu/vt-d: Handle volatile descriptor status read
Benjamin Marzinski <[email protected]>
dm init: Handle minors larger than 255
Amadeusz Sławiński <[email protected]>
ASoC: topology: Properly initialize soc_enum values
Sean Anderson <[email protected]>
phy: zynqmp: Take the phy mutex in xlate
Richard Fitzgerald <[email protected]>
firmware: cs_dsp: Don't allow writes to read-only controls
Viresh Kumar <[email protected]>
xen: privcmd: Fix possible access to a freed kirqfd instance
Jamie Bainbridge <[email protected]>
selftests: net: enable bind tests
Pawel Dembicki <[email protected]>
net: dsa: vsc73xx: fix possible subblocks range of CAPT block
Jonas Gorski <[email protected]>
net: bridge: br_fdb_external_learn_add(): always set EXT_LEARN
Hayes Wang <[email protected]>
r8152: fix the firmware doesn't work
Kuniyuki Iwashima <[email protected]>
fou: Fix null-ptr-deref in GRO.
Guillaume Nault <[email protected]>
bareudp: Fix device stats updates.
Tze-nan Wu <[email protected]>
bpf, net: Fix a potential race in do_sock_getsockopt()
Breno Leitao <[email protected]>
net/socket: Break down __sys_getsockopt
Breno Leitao <[email protected]>
net/socket: Break down __sys_setsockopt
Breno Leitao <[email protected]>
bpf: Add sockptr support for setsockopt
Breno Leitao <[email protected]>
bpf: Add sockptr support for getsockopt
Oliver Neukum <[email protected]>
usbnet: modern method to get random MAC
Larysa Zaremba <[email protected]>
ice: do not bring the VSI up, if it was down before the XDP setup
Larysa Zaremba <[email protected]>
ice: protect XDP configuration with a mutex
Jinjie Ruan <[email protected]>
net: phy: Fix missing of_node_put() for leds
Armin Wolf <[email protected]>
hwmon: (hp-wmi-sensors) Check if WMI event data exists
Dan Carpenter <[email protected]>
igc: Unlock on error in igc_io_resume()
Luiz Augusto von Dentz <[email protected]>
Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_sync: Introduce hci_cmd_sync_run/hci_cmd_sync_run_once
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_sync: Attempt to dequeue connection attempt
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_sync: Add helper functions to manipulate cmd_sync queue
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_conn: Fix UAF Write in __hci_acl_create_connection_sync
Jonas Dreßler <[email protected]>
Bluetooth: Remove pending ACL connection attempts
Jonas Dreßler <[email protected]>
Bluetooth: hci_conn: Only do ACL connections sequentially
Jonas Dreßler <[email protected]>
Bluetooth: hci_event: Use HCI error defines instead of magic values
Douglas Anderson <[email protected]>
Bluetooth: qca: If memdump doesn't work, re-enable IBS
Martin Jocic <[email protected]>
can: kvaser_pciefd: Use a single write when releasing RX buffers
Martin Jocic <[email protected]>
can: kvaser_pciefd: Move reset of DMA RX buffers to the end of the ISR
Martin Jocic <[email protected]>
can: kvaser_pciefd: Rename board_irq to pci_irq
Martin Jocic <[email protected]>
can: kvaser_pciefd: Remove unnecessary comment
Martin Jocic <[email protected]>
can: kvaser_pciefd: Skip redundant NULL pointer check in ISR
Douglas Anderson <[email protected]>
regulator: core: Stub devm_regulator_bulk_get_const() if !CONFIG_REGULATOR
Aleksandr Mishin <[email protected]>
platform/x86: dell-smbios: Fix error path in dell_smbios_init()
Dawid Osuchowski <[email protected]>
ice: Add netif_device_attach/detach into PF reset flow
Daiwei Li <[email protected]>
igb: Fix not clearing TimeSync interrupts for 82580
David Howells <[email protected]>
cifs: Fix FALLOC_FL_ZERO_RANGE to preflush buffered part of target region
Andreas Hindborg <[email protected]>
rust: kbuild: fix export of bss symbols
Matthew Maurer <[email protected]>
rust: Use awk instead of recent xargs
Marc Kleine-Budde <[email protected]>
can: mcp251xfd: fix ring configuration when switching from CAN-CC to CAN-FD mode
Simon Horman <[email protected]>
can: m_can: Release irq on error in m_can_open
Kuniyuki Iwashima <[email protected]>
can: bcm: Remove proc entry when dev is unregistered.
Marek Olšák <[email protected]>
drm/amdgpu: check for LINEAR_ALIGNED correctly in check_tiling_flags_gfx6
Alex Hung <[email protected]>
drm/amd/display: Check denominator pbn_div before used
Jules Irenge <[email protected]>
pcmcia: Use resource_size function on resource object
Chen Ni <[email protected]>
media: qcom: camss: Add check for v4l2_fwnode_endpoint_parse
Dmitry Torokhov <[email protected]>
Input: ili210x - use kvmalloc() to allocate buffer for firmware update
Kishon Vijay Abraham I <[email protected]>
PCI: keystone: Add workaround for Errata #i2037 (AM65x SR 1.0)
Eric Joyner <[email protected]>
ice: Check all ice_vsi_rebuild() errors in function
Shivaprasad G Bhat <[email protected]>
vfio/spapr: Always clear TCEs before unsetting the window
Hans Verkuil <[email protected]>
media: vivid: don't set HDMI TX controls if there are no HDMI outputs
Danijel Slivka <[email protected]>
drm/amdgpu: clear RB_OVERFLOW bit when enabling interrupts
Hawking Zhang <[email protected]>
drm/amdgpu: Fix smatch static checker warning
Alex Hung <[email protected]>
drm/amd/display: Check HDCP returned status
Alex Hung <[email protected]>
drm/amd/display: Run DC_LOG_DC after checking link->link_enc
Ma Ke <[email protected]>
usb: gadget: aspeed_udc: validate endpoint index for ast udc
Shantanu Goel <[email protected]>
usb: uas: set host status byte on data completion error
Arend van Spriel <[email protected]>
wifi: brcmsmac: advertise MFP_CAPABLE to enable WPA3
Andy Shevchenko <[email protected]>
leds: spi-byte: Call of_node_put() on error path
Hans Verkuil <[email protected]>
media: vivid: fix wrong sizeimage value for mplane
Samuel Holland <[email protected]>
riscv: kprobes: Use patch_text_nosync() for insn slots
Konstantin Komarov <[email protected]>
fs/ntfs3: One more reason to mark inode bad
Jan Kara <[email protected]>
udf: Avoid excessive partition lengths
Johannes Berg <[email protected]>
wifi: iwlwifi: mvm: use IWL_FW_CHECK for link ID check
Yunjian Wang <[email protected]>
netfilter: nf_conncount: fix wrong variable type
Jernej Skrabec <[email protected]>
iommu: sun50i: clear bypass register
Brian Johannesmeyer <[email protected]>
x86/kmsan: Fix hook for unaligned accesses
Kuniyuki Iwashima <[email protected]>
af_unix: Remove put_pid()/put_cred() in copy_peercred().
Pali Rohár <[email protected]>
irqchip/armada-370-xp: Do not allow mapping IRQ 0 and 1
Rakesh Ughreja <[email protected]>
accel/habanalabs/gaudi2: unsecure edma max outstanding register
Alexey Dobriyan <[email protected]>
ELF: fix kernel.randomize_va_space double read
Leon Hwang <[email protected]>
bpf, verifier: Correct tail_call_reachable for bpf prog
Konstantin Andreev <[email protected]>
smack: unix sockets: fix accept()ed socket label
Ajith C <[email protected]>
wifi: ath12k: fix firmware crash due to invalid peer nss
Aaradhana Sahu <[email protected]>
wifi: ath12k: fix uninitialize symbol error on ath12k_peer_assoc_h_he()
Takashi Iwai <[email protected]>
ALSA: hda: Add input value sanity checks to HDMI channel map controls
Takashi Iwai <[email protected]>
ALSA: control: Apply sanity check of input values for user elements
Daniele Ceraolo Spurio <[email protected]>
drm/i915: Do not attempt to load the GSC multiple times
Ryusuke Konishi <[email protected]>
nilfs2: fix state management in error path of log writing function
Ryusuke Konishi <[email protected]>
nilfs2: protect references to superblock parameters exposed in sysfs
Ryusuke Konishi <[email protected]>
nilfs2: fix missing cleanup on rollforward recovery error
Toke Høiland-Jørgensen <[email protected]>
sched: sch_cake: fix bulk flow accounting logic for host fairness
Eric Dumazet <[email protected]>
ila: call nf_unregister_net_hooks() sooner
Cong Wang <[email protected]>
tcp_bpf: fix return value of tcp_bpf_sendmsg()
Alex Deucher <[email protected]>
Revert "drm/amdgpu: align pp_power_profile_mode with kernel docs"
Yuntao Wang <[email protected]>
x86/apic: Make x2apic_disable() work correctly
Mitchell Levy <[email protected]>
x86/fpu: Avoid writing LBR bit to IA32_XSS unless supported
Matt Johnston <[email protected]>
net: mctp-serial: Fix missing escapes on transmit
Souradeep Chakrabarti <[email protected]>
net: mana: Fix error handling in mana_create_txq/rxq's NAPI cleanup
Steven Rostedt <[email protected]>
eventfs: Use list_del_rcu() for SRCU protected list variable
Baokun Li <[email protected]>
fscache: delete fscache_cookie_lru_timer when fscache exits to avoid UAF
Jann Horn <[email protected]>
userfaultfd: fix checks for huge PMDs
Jann Horn <[email protected]>
userfaultfd: don't BUG_ON() if khugepaged yanks our page table
Steven Rostedt <[email protected]>
tracing/timerlat: Add interface_lock around clearing of kthread in stop_kthread()
Zheng Yejian <[email protected]>
tracing: Avoid possible softlockup in tracing_iter_reset()
Steven Rostedt <[email protected]>
tracing/timerlat: Only clear timer if a kthread exists
Steven Rostedt <[email protected]>
tracing/osnoise: Use a cpumask to know what threads are kthreads
Brian Norris <[email protected]>
spi: rockchip: Resolve unbalanced runtime PM / system PM handling
Will Deacon <[email protected]>
mm: vmalloc: ensure vmap_block is initialised before adding to queue
Petr Tesarik <[email protected]>
kexec_file: fix elfcorehdr digest exclusion when CONFIG_CRASH_HOTPLUG=y
Simon Arlott <[email protected]>
can: mcp251x: fix deadlock if an interrupt occurs during mcp251x_open
Satya Priya Kakitapalli <[email protected]>
clk: qcom: clk-alpha-pll: Update set_rate for Zonda PLL
Satya Priya Kakitapalli <[email protected]>
clk: qcom: clk-alpha-pll: Fix zonda set_rate failure when PLL is disabled
Satya Priya Kakitapalli <[email protected]>
clk: qcom: clk-alpha-pll: Fix the trion pll postdiv set rate API
Satya Priya Kakitapalli <[email protected]>
clk: qcom: clk-alpha-pll: Fix the pll post div mask
Xingyu Wu <[email protected]>
clk: starfive: jh7110-sys: Add notifier for PLL0 clock
yangyun <[email protected]>
fuse: fix memory leak in fuse_create_open
Jann Horn <[email protected]>
fuse: use unsigned type for getxattr/listxattr size truncation
Joanne Koong <[email protected]>
fuse: update stats for pages in dropped aux writeback list
Seunghwan Baek <[email protected]>
mmc: cqhci: Fix checking of CQHCI_HALT state
Liao Chen <[email protected]>
mmc: sdhci-of-aspeed: fix module autoloading
Sam Protsenko <[email protected]>
mmc: dw_mmc: Fix IDMAC operation with pages bigger than 4K
Jonathan Bell <[email protected]>
mmc: core: apply SD quirks earlier during probe
Luiz Augusto von Dentz <[email protected]>
Bluetooth: MGMT: Ignore keys being loaded with invalid type
Luiz Augusto von Dentz <[email protected]>
Revert "Bluetooth: MGMT/SMP: Fix address type when using SMP over BREDR/LE"
Boqun Feng <[email protected]>
rust: macros: provide correct provenance when constructing THIS_MODULE
Boqun Feng <[email protected]>
rust: types: Make Opaque::get const
Georg Gottleuber <[email protected]>
nvme-pci: Add sleep quirk for Samsung 990 Evo
Roland Xu <[email protected]>
rtmutex: Drop rt_mutex::wait_lock before scheduling
Thomas Gleixner <[email protected]>
x86/kaslr: Expose and use the end of the physical memory address space
Ma Ke <[email protected]>
irqchip/gic-v2m: Fix refcount leak in gicv2m_of_init()
Kan Liang <[email protected]>
perf/x86/intel: Limit the period on Haswell
Kirill A. Shutemov <[email protected]>
x86/tdx: Fix data leak in mmio_read()
Zheng Qixing <[email protected]>
ata: libata: Fix memory leak for error path in ata_host_alloc()
Dan Carpenter <[email protected]>
ksmbd: Unlock on in ksmbd_tcp_set_interfaces()
Namjae Jeon <[email protected]>
ksmbd: unset the binding mark of a reused connection
Paulo Alcantara <[email protected]>
smb: client: fix double put of @cfile in smb2_set_path_size()
Nysal Jan K.A. <[email protected]>
powerpc/qspinlock: Fix deadlock in MCS queue
Maximilien Perreault <[email protected]>
ALSA: hda/realtek: Support mute LED on HP Laptop 14-dq2xxx
Terry Cheong <[email protected]>
ALSA: hda/realtek: add patch for internal mic in Lenovo V145
Christoffer Sandberg <[email protected]>
ALSA: hda/conexant: Add pincfg quirk to enable top speakers on Sirius devices
Ravi Bangoria <[email protected]>
KVM: SVM: Don't advertise Bus Lock Detect to guest if SVM support is missing
Maxim Levitsky <[email protected]>
KVM: SVM: fix emulation of msr reads/writes of MSR_FS_BASE and MSR_GS_BASE
Sean Christopherson <[email protected]>
KVM: x86: Acquire kvm->srcu when handling KVM_SET_VCPU_EVENTS
robelin <[email protected]>
ASoC: dapm: Fix UAF for snd_soc_pcm_runtime object
Jens Emil Schulz Østergaard <[email protected]>
net: microchip: vcap: Fix use-after-free error in kunit test
Stephen Hemminger <[email protected]>
sch/netem: fix use after free in netem_dequeue
-------------
Diffstat:
MAINTAINERS | 2 +- Makefile | 4 +- arch/arm/include/asm/pgtable.h | 2 + arch/arm64/include/asm/acpi.h | 12 + arch/arm64/kernel/acpi_numa.c | 11 - arch/loongarch/kernel/relocate.c | 4 +- arch/mips/kernel/cevt-r4k.c | 15 +- arch/powerpc/include/asm/nohash/mmu-e500.h | 3 +- arch/powerpc/kernel/vdso/vdso32.lds.S | 4 +- arch/powerpc/kernel/vdso/vdso64.lds.S | 4 +- arch/powerpc/lib/qspinlock.c | 10 +- arch/powerpc/mm/nohash/Makefile | 2 +- arch/powerpc/mm/nohash/tlb.c | 398 +-------------------- arch/powerpc/mm/nohash/tlb_64e.c | 361 +++++++++++++++++++ arch/powerpc/mm/nohash/tlb_low_64e.S | 195 ---------- arch/riscv/Kconfig | 5 +- arch/riscv/include/asm/kfence.h | 4 +- arch/riscv/include/asm/membarrier.h | 31 ++ arch/riscv/include/asm/pgtable-64.h | 22 +- arch/riscv/include/asm/pgtable.h | 33 +- arch/riscv/kernel/efi.c | 2 +- arch/riscv/kernel/head.S | 3 + arch/riscv/kernel/probes/kprobes.c | 5 +- arch/riscv/kvm/mmu.c | 22 +- arch/riscv/mm/Makefile | 3 +- arch/riscv/mm/context.c | 2 + arch/riscv/mm/fault.c | 16 +- arch/riscv/mm/hugetlbpage.c | 12 +- arch/riscv/mm/init.c | 2 +- arch/riscv/mm/kasan_init.c | 45 +-- arch/riscv/mm/pageattr.c | 44 +-- arch/riscv/mm/pgtable.c | 51 ++- arch/s390/kernel/vmlinux.lds.S | 9 + arch/um/drivers/line.c | 2 + arch/x86/coco/tdx/tdx.c | 1 - arch/x86/events/intel/core.c | 23 +- arch/x86/include/asm/fpu/types.h | 7 + arch/x86/include/asm/page_64.h | 1 + arch/x86/include/asm/pgtable_64_types.h | 4 + arch/x86/kernel/apic/apic.c | 11 +- arch/x86/kernel/fpu/xstate.c | 3 + arch/x86/kernel/fpu/xstate.h | 4 +- arch/x86/kvm/svm/svm.c | 15 + arch/x86/kvm/x86.c | 2 + arch/x86/lib/iomem.c | 5 +- arch/x86/mm/init_64.c | 4 + arch/x86/mm/kaslr.c | 34 +- arch/x86/mm/pti.c | 45 ++- drivers/accel/habanalabs/gaudi2/gaudi2_security.c | 1 + drivers/acpi/acpi_processor.c | 15 +- drivers/acpi/cppc_acpi.c | 13 + drivers/android/binder.c | 1 + drivers/ata/libata-core.c | 4 +- drivers/ata/libata-scsi.c | 24 +- drivers/ata/pata_macio.c | 7 +- drivers/base/devres.c | 1 + drivers/base/regmap/regcache-maple.c | 3 +- drivers/block/ublk_drv.c | 2 + drivers/bluetooth/btnxpuart.c | 12 +- drivers/bluetooth/hci_qca.c | 1 + drivers/clk/qcom/clk-alpha-pll.c | 25 +- drivers/clk/qcom/clk-rcg.h | 1 + drivers/clk/qcom/clk-rcg2.c | 30 ++ drivers/clk/qcom/gcc-ipq9574.c | 12 +- drivers/clk/qcom/gcc-sm8550.c | 54 +-- drivers/clk/starfive/clk-starfive-jh7110-sys.c | 31 +- drivers/clk/starfive/clk-starfive-jh71x0.h | 2 + drivers/clocksource/timer-imx-tpm.c | 16 +- drivers/clocksource/timer-of.c | 17 +- drivers/clocksource/timer-of.h | 1 - drivers/cpufreq/amd-pstate.c | 147 +++++++- .../crypto/intel/qat/qat_common/adf_gen2_pfvf.c | 4 +- .../intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c | 8 +- drivers/crypto/starfive/jh7110-cryp.h | 4 +- drivers/crypto/starfive/jh7110-rsa.c | 15 +- drivers/cxl/core/region.c | 5 +- drivers/firmware/cirrus/cs_dsp.c | 3 + drivers/gpio/gpio-rockchip.c | 1 + drivers/gpio/gpio-zynqmp-modepin.c | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 15 + drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 30 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 15 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 4 +- drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 8 +- drivers/gpu/drm/amd/amdgpu/ih_v6_0.c | 28 ++ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- drivers/gpu/drm/amd/display/dc/link/link_factory.c | 6 +- .../drm/amd/display/modules/hdcp/hdcp1_execution.c | 15 +- drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 6 +- drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c | 2 +- drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h | 5 + drivers/gpu/drm/i915/i915_sw_fence.c | 8 +- drivers/hid/amd-sfh-hid/amd_sfh_hid.c | 4 +- drivers/hid/hid-cougar.c | 2 +- drivers/hv/vmbus_drv.c | 1 + drivers/hwmon/adc128d818.c | 4 +- drivers/hwmon/hp-wmi-sensors.c | 2 + drivers/hwmon/lm95234.c | 9 +- drivers/hwmon/nct6775-core.c | 2 +- drivers/hwmon/w83627ehf.c | 4 +- drivers/i3c/master/mipi-i3c-hci/dma.c | 5 +- drivers/i3c/master/svc-i3c-master.c | 58 ++- drivers/iio/adc/ad7124.c | 27 +- drivers/iio/adc/ad7606.c | 28 +- drivers/iio/adc/ad7606.h | 2 + drivers/iio/adc/ad7606_par.c | 46 ++- drivers/iio/buffer/industrialio-buffer-dmaengine.c | 4 +- drivers/iio/inkern.c | 8 +- drivers/input/misc/uinput.c | 14 + drivers/input/touchscreen/ili210x.c | 6 +- drivers/iommu/intel/dmar.c | 2 +- drivers/iommu/sun50i-iommu.c | 1 + drivers/irqchip/irq-armada-370-xp.c | 4 + drivers/irqchip/irq-gic-v2m.c | 6 +- drivers/leds/leds-spi-byte.c | 6 +- drivers/md/dm-init.c | 4 +- drivers/media/platform/qcom/camss/camss.c | 5 +- drivers/media/test-drivers/vivid/vivid-vid-cap.c | 17 +- drivers/media/test-drivers/vivid/vivid-vid-out.c | 16 +- drivers/misc/fastrpc.c | 5 +- drivers/misc/vmw_vmci/vmci_resource.c | 3 +- drivers/mmc/core/quirks.h | 22 +- drivers/mmc/core/sd.c | 4 + drivers/mmc/host/cqhci-core.c | 2 +- drivers/mmc/host/dw_mmc.c | 4 +- drivers/mmc/host/sdhci-of-aspeed.c | 1 + drivers/net/bareudp.c | 22 +- drivers/net/can/kvaser_pciefd.c | 43 ++- drivers/net/can/m_can/m_can.c | 5 +- drivers/net/can/spi/mcp251x.c | 2 +- drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c | 28 +- drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.c | 11 +- drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c | 23 +- drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c | 165 ++++++--- drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c | 2 +- .../net/can/spi/mcp251xfd/mcp251xfd-timestamp.c | 22 +- drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 42 ++- drivers/net/dsa/vitesse-vsc73xx-core.c | 10 +- drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 20 +- drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c | 10 +- drivers/net/ethernet/intel/e1000e/ich8lan.c | 2 +- drivers/net/ethernet/intel/ice/ice.h | 2 + drivers/net/ethernet/intel/ice/ice_lib.c | 34 +- drivers/net/ethernet/intel/ice/ice_main.c | 46 ++- drivers/net/ethernet/intel/ice/ice_xsk.c | 3 +- drivers/net/ethernet/intel/igb/igb_main.c | 10 + drivers/net/ethernet/intel/igc/igc_main.c | 1 + .../net/ethernet/microchip/vcap/vcap_api_kunit.c | 14 +- drivers/net/ethernet/microsoft/mana/mana_en.c | 22 +- drivers/net/mctp/mctp-serial.c | 4 +- drivers/net/phy/phy_device.c | 2 + drivers/net/usb/ipheth.c | 2 +- drivers/net/usb/r8152.c | 17 +- drivers/net/usb/usbnet.c | 11 +- drivers/net/wireless/ath/ath12k/mac.c | 9 +- .../broadcom/brcm80211/brcmsmac/mac80211_if.c | 1 + drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 +- drivers/net/wireless/marvell/mwifiex/main.h | 3 + drivers/net/wireless/realtek/rtw88/usb.c | 13 +- drivers/nvme/host/pci.c | 17 + drivers/nvme/target/tcp.c | 4 +- drivers/nvmem/core.c | 6 +- drivers/of/irq.c | 15 +- drivers/pci/controller/dwc/pci-keystone.c | 44 ++- drivers/pci/hotplug/pnv_php.c | 3 +- drivers/pci/pci.c | 35 +- drivers/pcmcia/yenta_socket.c | 6 +- drivers/phy/xilinx/phy-zynqmp.c | 1 + drivers/platform/x86/dell/dell-smbios-base.c | 5 +- drivers/scsi/pm8001/pm8001_sas.c | 4 +- drivers/spi/spi-fsl-lpspi.c | 31 +- drivers/spi/spi-hisi-kunpeng.c | 3 + drivers/spi/spi-rockchip.c | 23 +- drivers/staging/iio/frequency/ad9834.c | 2 +- drivers/ufs/core/ufshcd.c | 7 +- drivers/uio/uio_hv_generic.c | 11 +- drivers/usb/dwc3/core.c | 15 + drivers/usb/dwc3/core.h | 2 + drivers/usb/dwc3/gadget.c | 41 +-- drivers/usb/gadget/udc/aspeed_udc.c | 2 + drivers/usb/gadget/udc/cdns2/cdns2-gadget.c | 12 +- drivers/usb/gadget/udc/cdns2/cdns2-gadget.h | 9 + drivers/usb/storage/uas.c | 1 + drivers/vfio/vfio_iommu_spapr_tce.c | 13 +- drivers/virtio/virtio_ring.c | 4 +- drivers/xen/privcmd.c | 10 +- fs/binfmt_elf.c | 5 +- fs/btrfs/ctree.c | 12 +- fs/btrfs/ctree.h | 1 - fs/btrfs/extent-tree.c | 32 +- fs/btrfs/file.c | 25 +- fs/btrfs/inode.c | 2 +- fs/btrfs/transaction.h | 6 + fs/ext4/fast_commit.c | 8 +- fs/fscache/main.c | 1 + fs/fuse/dir.c | 2 +- fs/fuse/file.c | 8 +- fs/fuse/xattr.c | 4 +- fs/jbd2/recovery.c | 30 ++ fs/nfs/super.c | 2 + fs/nilfs2/recovery.c | 35 +- fs/nilfs2/segment.c | 10 +- fs/nilfs2/sysfs.c | 43 ++- fs/ntfs3/dir.c | 52 +-- fs/ntfs3/frecord.c | 4 +- fs/smb/client/smb2inode.c | 3 + fs/smb/client/smb2ops.c | 16 +- fs/smb/server/oplock.c | 2 +- fs/smb/server/smb2pdu.c | 14 +- fs/smb/server/transport_tcp.c | 4 +- fs/squashfs/inode.c | 7 +- fs/tracefs/event_inode.c | 2 +- fs/udf/super.c | 15 + fs/xattr.c | 91 ++--- include/acpi/cppc_acpi.h | 5 + include/linux/amd-pstate.h | 4 + include/linux/bpf-cgroup.h | 16 +- include/linux/mm.h | 4 + include/linux/pgtable.h | 21 ++ include/linux/regulator/consumer.h | 8 + include/net/bluetooth/hci.h | 3 + include/net/bluetooth/hci_core.h | 25 +- include/net/bluetooth/hci_sync.h | 24 +- include/net/mana/mana.h | 2 + include/net/sock.h | 6 +- include/uapi/drm/drm_fourcc.h | 18 + kernel/bpf/cgroup.c | 25 +- kernel/bpf/verifier.c | 4 +- kernel/cgroup/cgroup.c | 2 +- kernel/dma/map_benchmark.c | 16 + kernel/events/core.c | 18 +- kernel/events/internal.h | 1 + kernel/events/ring_buffer.c | 2 + kernel/events/uprobes.c | 3 +- kernel/kexec_file.c | 2 +- kernel/locking/rtmutex.c | 9 +- kernel/resource.c | 6 +- kernel/sched/core.c | 5 +- kernel/smp.c | 1 + kernel/trace/trace.c | 2 + kernel/trace/trace_osnoise.c | 50 ++- kernel/workqueue.c | 14 +- lib/generic-radix-tree.c | 2 + mm/memory_hotplug.c | 2 +- mm/sparse.c | 2 +- mm/userfaultfd.c | 29 +- mm/vmalloc.c | 2 +- mm/vmscan.c | 24 +- net/bluetooth/hci_conn.c | 158 ++------ net/bluetooth/hci_event.c | 27 +- net/bluetooth/hci_sync.c | 307 +++++++++++++++- net/bluetooth/mgmt.c | 144 ++++---- net/bluetooth/smp.c | 7 - net/bridge/br_fdb.c | 6 +- net/can/bcm.c | 4 + net/core/sock.c | 8 - net/ipv4/fou_core.c | 29 +- net/ipv4/tcp_bpf.c | 2 +- net/ipv4/tcp_input.c | 6 + net/ipv6/ila/ila.h | 1 + net/ipv6/ila/ila_main.c | 6 + net/ipv6/ila/ila_xlat.c | 13 +- net/netfilter/nf_conncount.c | 8 +- net/sched/sch_cake.c | 11 +- net/sched/sch_netem.c | 9 +- net/socket.c | 104 ++++-- net/unix/af_unix.c | 9 +- rust/Makefile | 4 +- rust/kernel/types.rs | 2 +- rust/macros/module.rs | 6 +- security/smack/smack_lsm.c | 12 +- sound/core/control.c | 6 +- sound/hda/hdmi_chmap.c | 18 + sound/pci/hda/patch_conexant.c | 11 + sound/pci/hda/patch_realtek.c | 10 + sound/soc/codecs/tas2781-fmwlib.c | 71 ++-- sound/soc/soc-dapm.c | 1 + sound/soc/soc-topology.c | 2 + sound/soc/sof/topology.c | 2 + sound/soc/sunxi/sun4i-i2s.c | 143 ++++---- sound/soc/tegra/tegra210_ahub.c | 12 +- tools/lib/bpf/libbpf.c | 4 +- tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c | 4 +- tools/testing/selftests/net/Makefile | 3 +- 285 files changed, 3319 insertions(+), 2007 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/269 sch/netem: fix use after free in netem_dequeue
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Hemminger <[email protected]>
commit 3b3a2a9c6349e25a025d2330f479bc33a6ccb54a upstream.
If netem_dequeue() enqueues packet to inner qdisc and that qdisc returns __NET_XMIT_STOLEN. The packet is dropped but qdisc_tree_reduce_backlog() is not called to update the parent's q.qlen, leading to the similar use-after-free as Commit e04991a48dbaf382 ("netem: fix return value if duplicate enqueue fails")
Commands to trigger KASAN UaF:
ip link add type dummy
ip link set lo up
ip link set dummy0 up
tc qdisc add dev lo parent root handle 1: drr
tc filter add dev lo parent 1: basic classid 1:1
tc class add dev lo classid 1:1 drr
tc qdisc add dev lo parent 1:1 handle 2: netem
tc qdisc add dev lo parent 2: handle 3: drr
tc filter add dev lo parent 3: basic classid 3:1 action mirred egress redirect dev dummy0
tc class add dev lo classid 3:1 drr
ping -c1 -W0.01 localhost # Trigger bug
tc class del dev lo classid 1:1
tc class add dev lo classid 1:1 drr
ping -c1 -W0.01 localhost # UaF
--- net/sched/sch_netem.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
net/sched/sch_netem.c +4 -5
@@ -742,11 +742,10 @@ deliver: err =qdisc_enqueue (skb, q->qdisc, &to_free);kfree_skb_list (to_free); -if (err !=NET_XMIT_SUCCESS && -net_xmit_drop_count (err)) { -qdisc_qstats_drop (sch); -qdisc_tree_reduce_backlog (sch,1 , - pkt_len); +if (err !=NET_XMIT_SUCCESS ) { +if (net_xmit_drop_count (err)) +qdisc_qstats_drop (sch); +qdisc_tree_reduce_backlog (sch,1 , pkt_len); } goto tfifo_dequeue; }
Greg Kroah-Hartman
maintainerPATCH 2/269 net: microchip: vcap: Fix use-after-free error in kunit test
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Emil Schulz Østergaard <[email protected]>
commit a3c1e45156ad39f225cd7ddae0f81230a3b1e657 upstream.
This is a clear use-after-free error. We remove it, and rely on checking the return code of vcap_del_rule.
--- drivers/net/ethernet/microchip/vcap/vcap_api_kunit.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-)
drivers/net/ethernet/microchip/vcap/vcap_api_kunit.c +2 -12
@@ -1442,18 +1442,8 @@ static void vcap_api_encode_rule_test(stvcap_enable_lookups (&test_vctrl, &test_netdev,0 ,0 , rule->cookie, false); -vcap_free_rule (rule); - -/* Check that the rule has been freed: tricky to access since this -* memory should not be accessible anymore -*/ -KUNIT_EXPECT_PTR_NE (test,NULL , rule); - ret =list_empty (&rule->keyfields); -KUNIT_EXPECT_EQ (test, true, ret); - ret =list_empty (&rule->actionfields); -KUNIT_EXPECT_EQ (test, true, ret); - -vcap_del_rule (&test_vctrl, &test_netdev, id); + ret =vcap_del_rule (&test_vctrl, &test_netdev, id); +KUNIT_EXPECT_EQ (test,0 , ret); }static void vcap_api_set_rule_counter_test (struct kunit *test)
Greg Kroah-Hartman
maintainerPATCH 3/269 ASoC: dapm: Fix UAF for snd_soc_pcm_runtime object
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: robelin <[email protected]>
commit b4a90b543d9f62d3ac34ec1ab97fc5334b048565 upstream.
When using kernel with the following extra config,
- CONFIG_KASAN=y
- CONFIG_KASAN_GENERIC=y
- CONFIG_KASAN_INLINE=y
- CONFIG_KASAN_VMALLOC=y
- CONFIG_FRAME_WARN=4096
kernel detects that snd_pcm_suspend_all() access a freed 'snd_soc_pcm_runtime' object when the system is suspended, which leads to a use-after-free bug:
[ 52.047746] BUG: KASAN: use-after-free in snd_pcm_suspend_all+0x1a8/0x270 [ 52.047765] Read of size 1 at addr ffff0000b9434d50 by task systemd-sleep/2330
[ 52.047785] Call trace: [ 52.047787] dump_backtrace+0x0/0x3c0 [ 52.047794] show_stack+0x34/0x50 [ 52.047797] dump_stack_lvl+0x68/0x8c [ 52.047802] print_address_description.constprop.0+0x74/0x2c0 [ 52.047809] kasan_report+0x210/0x230 [ 52.047815] __asan_report_load1_noabort+0x3c/0x50 [ 52.047820] snd_pcm_suspend_all+0x1a8/0x270 [ 52.047824] snd_soc_suspend+0x19c/0x4e0
The snd_pcm_sync_stop() has a NULL check on 'substream->runtime' before making any access. So we need to always set 'substream->runtime' to NULL everytime we kfree() it.
--- sound/soc/soc-dapm.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/soc-dapm.c +1 -0
@@ -4018,6 +4018,7 @@ static int snd_soc_dai_link_event(structcase SND_SOC_DAPM_POST_PMD :kfree (substream->runtime); + substream->runtime =NULL ;break ;default :
Greg Kroah-Hartman
maintainerPATCH 4/269 KVM: x86: Acquire kvm->srcu when handling KVM_SET_VCPU_EVENTS
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit 4bcdd831d9d01e0fb64faea50732b59b2ee88da1 upstream.
Grab kvm->srcu when processing KVM_SET_VCPU_EVENTS, as KVM will forcibly leave nested VMX/SVM if SMM mode is being toggled, and leaving nested VMX reads guest memory.
Note, kvm_vcpu_ioctl_x86_set_vcpu_events() can also be called from KVM_RUN via sync_regs(), which already holds SRCU. I.e. trying to precisely use kvm_vcpu_srcu_read_lock() around the problematic SMM code would cause problems. Acquiring SRCU isn't all that expensive, so for simplicity, grab it unconditionally for KVM_SET_VCPU_EVENTS.
=============================
WARNING: suspicious RCU usage 6.10.0-rc7-332d2c1d713e-next-vm #552 Not tainted
-----------------------------
include/linux/kvm_host.h:1027 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
rcu_scheduler_active = 2, debug_locks = 1
1 lock held by repro/1071:
#0: ffff88811e424430 (&vcpu->mutex){+.+.}-{3:3}, at: kvm_vcpu_ioctl+0x7d/0x970 [kvm]
stack backtrace: CPU: 15 PID: 1071 Comm: repro Not tainted 6.10.0-rc7-332d2c1d713e-next-vm #552 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 Call Trace: <TASK> dump_stack_lvl+0x7f/0x90 lockdep_rcu_suspicious+0x13f/0x1a0 kvm_vcpu_gfn_to_memslot+0x168/0x190 [kvm] kvm_vcpu_read_guest+0x3e/0x90 [kvm] nested_vmx_load_msr+0x6b/0x1d0 [kvm_intel] load_vmcs12_host_state+0x432/0xb40 [kvm_intel] vmx_leave_nested+0x30/0x40 [kvm_intel] kvm_vcpu_ioctl_x86_set_vcpu_events+0x15d/0x2b0 [kvm] kvm_arch_vcpu_ioctl+0x1107/0x1750 [kvm] ? mark_held_locks+0x49/0x70 ? kvm_vcpu_ioctl+0x7d/0x970 [kvm] ? kvm_vcpu_ioctl+0x497/0x970 [kvm] kvm_vcpu_ioctl+0x497/0x970 [kvm] ? lock_acquire+0xba/0x2d0 ? find_held_lock+0x2b/0x80 ? do_user_addr_fault+0x40c/0x6f0 ? lock_release+0xb7/0x270 __x64_sys_ioctl+0x82/0xb0 do_syscall_64+0x6c/0x170 entry_SYSCALL_64_after_hwframe+0x4b/0x53 RIP: 0033:0x7ff11eb1b539 </TASK>
--- arch/x86/kvm/x86.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/kvm/x86.c +2 -0
@@ -5829,7 +5829,9 @@ long kvm_arch_vcpu_ioctl(struct file *fiif (copy_from_user (&events, argp,sizeof (struct kvm_vcpu_events )))break ; +kvm_vcpu_srcu_read_lock (vcpu); r =kvm_vcpu_ioctl_x86_set_vcpu_events (vcpu, &events); +kvm_vcpu_srcu_read_unlock (vcpu);break ; }case KVM_GET_DEBUGREGS : {
Greg Kroah-Hartman
maintainerPATCH 5/269 KVM: SVM: fix emulation of msr reads/writes of MSR_FS_BASE and MSR_GS_BASE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxim Levitsky <[email protected]>
commit dad1613e0533b380318281c1519e1a3477c2d0d2 upstream.
If these msrs are read by the emulator (e.g due to 'force emulation' prefix), SVM code currently fails to extract the corresponding segment bases, and return them to the emulator.
Fix that.
--- arch/x86/kvm/svm/svm.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
arch/x86/kvm/svm/svm.c +12 -0
@@ -2869,6 +2869,12 @@ static int svm_get_msr(struct kvm_vcpu *case MSR_CSTAR : msr_info->data = svm->vmcb01.ptr->save.cstar;break ; +case MSR_GS_BASE : + msr_info->data = svm->vmcb01.ptr->save.gs.base; +break ; +case MSR_FS_BASE : + msr_info->data = svm->vmcb01.ptr->save.fs.base; +break ;case MSR_KERNEL_GS_BASE : msr_info->data = svm->vmcb01.ptr->save.kernel_gs_base;break ;
@@ -3090,6 +3096,12 @@ static int svm_set_msr(struct kvm_vcpu *case MSR_CSTAR : svm->vmcb01.ptr->save.cstar = data;break ; +case MSR_GS_BASE : + svm->vmcb01.ptr->save.gs.base = data; +break ; +case MSR_FS_BASE : + svm->vmcb01.ptr->save.fs.base = data; +break ;case MSR_KERNEL_GS_BASE : svm->vmcb01.ptr->save.kernel_gs_base = data;break ;
Greg Kroah-Hartman
maintainerPATCH 6/269 KVM: SVM: Dont advertise Bus Lock Detect to guest if SVM support is missing
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ravi Bangoria <[email protected]>
commit 54950bfe2b69cdc06ef753872b5225e54eb73506 upstream.
If host supports Bus Lock Detect, KVM advertises it to guests even if SVM support is absent. Additionally, guest wouldn't be able to use it despite guest CPUID bit being set. Fix it by unconditionally clearing the feature bit in KVM cpu capability.
--- arch/x86/kvm/svm/svm.c | 3 +++ 1 file changed, 3 insertions(+)
arch/x86/kvm/svm/svm.c +3 -0
@@ -5178,6 +5178,9 @@ static __init void svm_set_cpu_caps(void/* CPUID 0x8000001F (SME/SEV features) */ sev_set_cpu_caps (); + +/* Don't advertise Bus Lock Detect to guest if SVM support is absent */ +kvm_cpu_cap_clear (X86_FEATURE_BUS_LOCK_DETECT ); }static __init int svm_hardware_setup (void )
Greg Kroah-Hartman
maintainerPATCH 7/269 ALSA: hda/conexant: Add pincfg quirk to enable top speakers on Sirius devices
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoffer Sandberg <[email protected]>
commit 4178d78cd7a86510ba68d203f26fc01113c7f126 upstream.
The Sirius notebooks have two sets of speakers 0x17 (sides) and 0x1d (top center). The side speakers are active by default but the top speakers aren't.
This patch provides a pincfg quirk to activate the top speakers.
--- sound/pci/hda/patch_conexant.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
sound/pci/hda/patch_conexant.c +11 -0
@@ -311,6 +311,7 @@ enum {CXT_FIXUP_HEADSET_MIC ,CXT_FIXUP_HP_MIC_NO_PRESENCE ,CXT_PINCFG_SWS_JS201D , + CXT_PINCFG_TOP_SPEAKER, };/* for hda_fixup_thinkpad_acpi() */
@@ -978,6 +979,13 @@ static const struct hda_fixup cxt_fixups .type = HDA_FIXUP_PINS, .v.pins = cxt_pincfg_sws_js201d, }, + [CXT_PINCFG_TOP_SPEAKER] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x1d ,0x82170111 }, + { } + }, + }, };static const struct snd_pci_quirk cxt5045_fixups[] = {
@@ -1074,6 +1082,8 @@ static const struct snd_pci_quirk cxt506SND_PCI_QUIRK_VENDOR (0x17aa ,"Thinkpad" ,CXT_FIXUP_THINKPAD_ACPI ),SND_PCI_QUIRK (0x1c06 ,0x2011 ,"Lemote A1004" ,CXT_PINCFG_LEMOTE_A1004 ),SND_PCI_QUIRK (0x1c06 ,0x2012 ,"Lemote A1205" ,CXT_PINCFG_LEMOTE_A1205 ), +SND_PCI_QUIRK (0x2782 ,0x12c3 ,"Sirius Gen1" ,CXT_PINCFG_TOP_SPEAKER ), + SND_PCI_QUIRK(0x2782, 0x12c5, "Sirius Gen2", CXT_PINCFG_TOP_SPEAKER), {} };
@@ -1093,6 +1103,7 @@ static const struct hda_model_fixup cxt5 { .id = CXT_FIXUP_HP_MIC_NO_PRESENCE, .name = "hp-mic-fix" }, { .id = CXT_PINCFG_LENOVO_NOTEBOOK, .name = "lenovo-20149" }, { .id = CXT_PINCFG_SWS_JS201D, .name = "sws-js201d" }, + { .id = CXT_PINCFG_TOP_SPEAKER, .name = "sirius-top-speaker" }, {} };
Greg Kroah-Hartman
maintainerPATCH 8/269 ALSA: hda/realtek: add patch for internal mic in Lenovo V145
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Terry Cheong <[email protected]>
commit ef27e89e7f3015be2b3c124833fbd6d2e4686561 upstream.
Lenovo V145 is having phase inverted dmic but simply applying inverted dmic fixups does not work. Chaining up verb fixes for ALC283 enables inverting dmic fixup to work properly.
--- sound/pci/hda/patch_realtek.c | 9 +++++++++ 1 file changed, 9 insertions(+)
sound/pci/hda/patch_realtek.c +9 -0
@@ -7366,6 +7366,7 @@ enum {ALC236_FIXUP_HP_GPIO_LED ,ALC236_FIXUP_HP_MUTE_LED ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF , +ALC236_FIXUP_LENOVO_INV_DMIC ,ALC298_FIXUP_SAMSUNG_AMP ,ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET , ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
@@ -8922,6 +8923,12 @@ static const struct hda_fixup alc269_fix .type = HDA_FIXUP_FUNC, .v.func = alc236_fixup_hp_mute_led_micmute_vref, }, + [ALC236_FIXUP_LENOVO_INV_DMIC] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_inv_dmic, + .chained = true, + .chain_id = ALC283_FIXUP_INT_MIC, + }, [ALC298_FIXUP_SAMSUNG_AMP] = { .type = HDA_FIXUP_FUNC, .v.func = alc298_fixup_samsung_amp,
@@ -10298,6 +10305,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x38f9 ,"Thinkbook 16P Gen5" ,ALC287_FIXUP_CS35L41_I2C_2 ),SND_PCI_QUIRK (0x17aa ,0x38fa ,"Thinkbook 16P Gen5" ,ALC287_FIXUP_CS35L41_I2C_2 ),SND_PCI_QUIRK (0x17aa ,0x3902 ,"Lenovo E50-80" ,ALC269_FIXUP_DMIC_THINKPAD_ACPI ), +SND_PCI_QUIRK (0x17aa ,0x3913 ,"Lenovo 145" ,ALC236_FIXUP_LENOVO_INV_DMIC ),SND_PCI_QUIRK (0x17aa ,0x3977 ,"IdeaPad S210" ,ALC283_FIXUP_INT_MIC ),SND_PCI_QUIRK (0x17aa ,0x3978 ,"Lenovo B50-70" ,ALC269_FIXUP_DMIC_THINKPAD_ACPI ), SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
@@ -10546,6 +10554,7 @@ static const struct hda_model_fixup alc2 {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"}, {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"}, {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"}, + {.id = ALC236_FIXUP_LENOVO_INV_DMIC, .name = "alc236-fixup-lenovo-inv-mic"}, {} };#define ALC225_STANDARD_PINS \
Greg Kroah-Hartman
maintainerPATCH 9/269 ALSA: hda/realtek: Support mute LED on HP Laptop 14-dq2xxx
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maximilien Perreault <[email protected]>
commit 47a9e8dbb8d4713a9aac7cc6ce3c82dcc94217d8 upstream.
The mute LED on this HP laptop uses ALC236 and requires a quirk to function. This patch enables the existing quirk for the device.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9873,6 +9873,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x87f5 ,"HP" ,ALC287_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x87f6 ,"HP Spectre x360 14" ,ALC245_FIXUP_HP_X360_AMP ),SND_PCI_QUIRK (0x103c ,0x87f7 ,"HP Spectre x360 14" ,ALC245_FIXUP_HP_X360_AMP ), +SND_PCI_QUIRK (0x103c ,0x87fd ,"HP Laptop 14-dq2xxx" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x87fe ,"HP Laptop 15s-fq2xxx" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x8805 ,"HP ProBook 650 G8 Notebook PC" ,ALC236_FIXUP_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
Greg Kroah-Hartman
maintainerPATCH 10/269 powerpc/qspinlock: Fix deadlock in MCS queue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nysal Jan K.A. <[email protected]>
commit 734ad0af3609464f8f93e00b6c0de1e112f44559 upstream.
If an interrupt occurs in queued_spin_lock_slowpath() after we increment qnodesp->count and before node->lock is initialized, another CPU might see stale lock values in get_tail_qnode(). If the stale lock value happens to match the lock on that CPU, then we write to the "next" pointer of the wrong qnode. This causes a deadlock as the former CPU, once it becomes the head of the MCS queue, will spin indefinitely until it's "next" pointer is set by its successor in the queue.
Running stress-ng on a 16 core (16EC/16VP) shared LPAR, results in occasional lockups similar to the following:
$ stress-ng --all 128 --vm-bytes 80% --aggressive \
--maximize --oomable --verify --syslog \
--metrics --times --timeout 5m watchdog: CPU 15 Hard LOCKUP
......
NIP [c0000000000b78f4] queued_spin_lock_slowpath+0x1184/0x1490 LR [c000000001037c5c] _raw_spin_lock+0x6c/0x90
Call Trace:
0xc000002cfffa3bf0 (unreliable)
_raw_spin_lock+0x6c/0x90
raw_spin_rq_lock_nested.part.135+0x4c/0xd0
sched_ttwu_pending+0x60/0x1f0
__flush_smp_call_function_queue+0x1dc/0x670
smp_ipi_demux_relaxed+0xa4/0x100
xive_muxed_ipi_action+0x20/0x40
__handle_irq_event_percpu+0x80/0x240
handle_irq_event_percpu+0x2c/0x80
handle_percpu_irq+0x84/0xd0
generic_handle_irq+0x54/0x80
__do_irq+0xac/0x210
__do_IRQ+0x74/0xd0
0x0
do_IRQ+0x8c/0x170
hardware_interrupt_common_virt+0x29c/0x2a0
--- interrupt: 500 at queued_spin_lock_slowpath+0x4b8/0x1490
......
NIP [c0000000000b6c28] queued_spin_lock_slowpath+0x4b8/0x1490
LR [c000000001037c5c] _raw_spin_lock+0x6c/0x90
--- interrupt: 500
0xc0000029c1a41d00 (unreliable)
_raw_spin_lock+0x6c/0x90
futex_wake+0x100/0x260
do_futex+0x21c/0x2a0
sys_futex+0x98/0x270
system_call_exception+0x14c/0x2f0
system_call_vectored_common+0x15c/0x2ecThe following code flow illustrates how the deadlock occurs. For the sake of brevity, assume that both locks (A and B) are contended and we call the queued_spin_lock_slowpath() function.
CPU0 CPU1
---- ----
spin_lock_irqsave(A) |
spin_unlock_irqrestore(A) |
spin_lock(B) |
| |
▼ |
id = qnodesp->count++; |
(Note that nodes[0].lock == A) |
| |
▼ |
Interrupt |
(happens before "nodes[0].lock = B") |
| |
▼ |
spin_lock_irqsave(A) |
| |
▼ |
id = qnodesp->count++ |
nodes[1].lock = A |
| |
▼ |
Tail of MCS queue |
| spin_lock_irqsave(A)
▼ |
Head of MCS queue ▼
| CPU0 is previous tail
▼ |
Spin indefinitely ▼
(until "nodes[1].next != NULL") prev = get_tail_qnode(A, CPU0)
|
▼
prev == &qnodes[CPU0].nodes[0]
(as qnodes[CPU0].nodes[0].lock == A)
|
▼
WRITE_ONCE(prev->next, node)
|
▼
Spin indefinitely
(until nodes[0].locked == 1)Thanks to Saket Kumar Bhaskar for help with recreating the issue
--- arch/powerpc/lib/qspinlock.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
arch/powerpc/lib/qspinlock.c +9 -1
@@ -715,7 +715,15 @@ again: } release: - qnodesp->count--;/* release the node */ +/* +* Clear the lock before releasing the node, as another CPU might see stale +* values if an interrupt occurs after we increment qnodesp->count +* but before node->lock is initialized. The barrier ensures that +* there are no further stores to the node after it has been released. +*/ + node->lock =NULL ; +barrier (); + qnodesp->count--; }void queued_spin_lock_slowpath (struct qspinlock *lock)
Greg Kroah-Hartman
maintainerPATCH 11/269 smb: client: fix double put of @cfile in smb2_set_path_size()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
commit f9c169b51b6ce20394594ef674d6b10efba31220 upstream.
If smb2_compound_op() is called with a valid @cfile and returned -EINVAL, we need to call cifs_get_writable_path() before retrying it as the reference of @cfile was already dropped by previous call.
This fixes the following KASAN splat when running fstests generic/013 against Windows Server 2022:
CIFS: Attempting to mount //w22-fs0/scratch
run fstests generic/013 at 2024-09-02 19:48:59
==================================================================
BUG: KASAN: slab-use-after-free in detach_if_pending+0xab/0x200 Write of size 8 at addr ffff88811f1a3730 by task kworker/3:2/176 CPU: 3 UID: 0 PID: 176 Comm: kworker/3:2 Not tainted 6.11.0-rc6 #2 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-2.fc40 04/01/2014 Workqueue: cifsoplockd cifs_oplock_break [cifs] Call Trace: <TASK> dump_stack_lvl+0x5d/0x80 ? detach_if_pending+0xab/0x200 print_report+0x156/0x4d9 ? detach_if_pending+0xab/0x200 ? __virt_addr_valid+0x145/0x300 ? __phys_addr+0x46/0x90 ? detach_if_pending+0xab/0x200 kasan_report+0xda/0x110 ? detach_if_pending+0xab/0x200 detach_if_pending+0xab/0x200 timer_delete+0x96/0xe0 ? __pfx_timer_delete+0x10/0x10 ? rcu_is_watching+0x20/0x50 try_to_grab_pending+0x46/0x3b0 __cancel_work+0x89/0x1b0 ? __pfx___cancel_work+0x10/0x10 ? kasan_save_track+0x14/0x30 cifs_close_deferred_file+0x110/0x2c0 [cifs] ? __pfx_cifs_close_deferred_file+0x10/0x10 [cifs] ? __pfx_down_read+0x10/0x10 cifs_oplock_break+0x4c1/0xa50 [cifs] ? __pfx_cifs_oplock_break+0x10/0x10 [cifs] ? lock_is_held_type+0x85/0xf0 ? mark_held_locks+0x1a/0x90 process_one_work+0x4c6/0x9f0 ? find_held_lock+0x8a/0xa0 ? __pfx_process_one_work+0x10/0x10 ? lock_acquired+0x220/0x550 ? __list_add_valid_or_report+0x37/0x100 worker_thread+0x2e4/0x570 ? __kthread_parkme+0xd1/0xf0 ? __pfx_worker_thread+0x10/0x10 kthread+0x17f/0x1c0 ? kthread+0xda/0x1c0 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x31/0x60 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK> Allocated by task 1118: kasan_save_stack+0x30/0x50 kasan_save_track+0x14/0x30 __kasan_kmalloc+0xaa/0xb0 cifs_new_fileinfo+0xc8/0x9d0 [cifs] cifs_atomic_open+0x467/0x770 [cifs] lookup_open.isra.0+0x665/0x8b0 path_openat+0x4c3/0x1380 do_filp_open+0x167/0x270 do_sys_openat2+0x129/0x160 __x64_sys_creat+0xad/0xe0 do_syscall_64+0xbb/0x1d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 83: kasan_save_stack+0x30/0x50 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x70 poison_slab_object+0xe9/0x160 __kasan_slab_free+0x32/0x50 kfree+0xf2/0x300 process_one_work+0x4c6/0x9f0 worker_thread+0x2e4/0x570 kthread+0x17f/0x1c0 ret_from_fork+0x31/0x60 ret_from_fork_asm+0x1a/0x30 Last potentially related work creation: kasan_save_stack+0x30/0x50 __kasan_record_aux_stack+0xad/0xc0 insert_work+0x29/0xe0 __queue_work+0x5ea/0x760 queue_work_on+0x6d/0x90 _cifsFileInfo_put+0x3f6/0x770 [cifs] smb2_compound_op+0x911/0x3940 [cifs] smb2_set_path_size+0x228/0x270 [cifs] cifs_set_file_size+0x197/0x460 [cifs] cifs_setattr+0xd9c/0x14b0 [cifs] notify_change+0x4e3/0x740 do_truncate+0xfa/0x180 vfs_truncate+0x195/0x200 __x64_sys_truncate+0x109/0x150 do_syscall_64+0xbb/0x1d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f
--- fs/smb/client/smb2inode.c | 1 + 1 file changed, 1 insertion(+)
fs/smb/client/smb2inode.c +1 -0
@@ -1149,6 +1149,7 @@ smb2_set_path_size(const unsigned int xi cfile, NULL, NULL, dentry);if (rc == -EINVAL ) {cifs_dbg (FYI ,"invalid lease key, resending request without lease" ); +cifs_get_writable_path (tcon, full_path,FIND_WR_ANY , &cfile); rc = smb2_compound_op(xid, tcon, cifs_sb, full_path, &oparms, &in_iov, &(int){SMB2_OP_SET_EOF}, 1,
Greg Kroah-Hartman
maintainerPATCH 12/269 ksmbd: unset the binding mark of a reused connection
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
commit 78c5a6f1f630172b19af4912e755e1da93ef0ab5 upstream.
Steve French reported null pointer dereference error from sha256 lib. cifs.ko can send session setup requests on reused connection. If reused connection is used for binding session, conn->binding can still remain true and generate_preauth_hash() will not set sess->Preauth_HashValue and it will be NULL.
It is used as a material to create an encryption key in ksmbd_gen_smb311_encryptionkey. ->Preauth_HashValue cause null pointer dereference error from crypto_shash_update().
BUG: kernel NULL pointer dereference, address: 0000000000000000 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] PREEMPT SMP PTI CPU: 8 PID: 429254 Comm: kworker/8:39 Hardware name: LENOVO 20MAS08500/20MAS08500, BIOS N2CET69W (1.52 ) Workqueue: ksmbd-io handle_ksmbd_work [ksmbd] RIP: 0010:lib_sha256_base_do_update.isra.0+0x11e/0x1d0 [sha256_ssse3] <TASK> ? show_regs+0x6d/0x80 ? __die+0x24/0x80 ? page_fault_oops+0x99/0x1b0 ? do_user_addr_fault+0x2ee/0x6b0 ? exc_page_fault+0x83/0x1b0 ? asm_exc_page_fault+0x27/0x30 ? __pfx_sha256_transform_rorx+0x10/0x10 [sha256_ssse3] ? lib_sha256_base_do_update.isra.0+0x11e/0x1d0 [sha256_ssse3] ? __pfx_sha256_transform_rorx+0x10/0x10 [sha256_ssse3] ? __pfx_sha256_transform_rorx+0x10/0x10 [sha256_ssse3] _sha256_update+0x77/0xa0 [sha256_ssse3] sha256_avx2_update+0x15/0x30 [sha256_ssse3] crypto_shash_update+0x1e/0x40 hmac_update+0x12/0x20 crypto_shash_update+0x1e/0x40 generate_key+0x234/0x380 [ksmbd] generate_smb3encryptionkey+0x40/0x1c0 [ksmbd] ksmbd_gen_smb311_encryptionkey+0x72/0xa0 [ksmbd] ntlm_authenticate.isra.0+0x423/0x5d0 [ksmbd] smb2_sess_setup+0x952/0xaa0 [ksmbd] __process_request+0xa3/0x1d0 [ksmbd] __handle_ksmbd_work+0x1c4/0x2f0 [ksmbd] handle_ksmbd_work+0x2d/0xa0 [ksmbd] process_one_work+0x16c/0x350 worker_thread+0x306/0x440 ? __pfx_worker_thread+0x10/0x10 kthread+0xef/0x120 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x44/0x70 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1b/0x30 </TASK>
--- fs/smb/server/smb2pdu.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/smb/server/smb2pdu.c +4 -0
@@ -1687,6 +1687,8 @@ int smb2_sess_setup(struct ksmbd_work *w rc =ksmbd_session_register (conn, sess);if (rc) goto out_err; + + conn->binding = false; }else if (conn->dialect >=SMB30_PROT_ID && (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL ) && req->Flags &SMB2_SESSION_REQ_FLAG_BINDING ) {
@@ -1765,6 +1767,8 @@ int smb2_sess_setup(struct ksmbd_work *w sess =NULL ; goto out_err; } + + conn->binding = false; } work->sess = sess;
Greg Kroah-Hartman
maintainerPATCH 13/269 ksmbd: Unlock on in ksmbd_tcp_set_interfaces()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 844436e045ac2ab7895d8b281cb784a24de1d14d upstream.
Unlock before returning an error code if this allocation fails.
--- fs/smb/server/transport_tcp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/smb/server/transport_tcp.c +3 -1
@@ -624,8 +624,10 @@ int ksmbd_tcp_set_interfaces(char *ifc_lfor_each_netdev (&init_net, netdev) {if (netif_is_bridge_port (netdev))continue ; -if (!alloc_iface (kstrdup (netdev->name,GFP_KERNEL ))) +if (!alloc_iface (kstrdup (netdev->name,GFP_KERNEL ))) { +rtnl_unlock ();return -ENOMEM ; + } }rtnl_unlock (); bind_additional_ifaces =1 ;
Greg Kroah-Hartman
maintainerPATCH 14/269 ata: libata: Fix memory leak for error path in ata_host_alloc()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zheng Qixing <[email protected]>
commit 284b75a3d83c7631586d98f6dede1d90f128f0db upstream.
In ata_host_alloc(), if devres_alloc() fails to allocate the device host resource data pointer, the already allocated ata_host structure is not freed before returning from the function. This results in a potential memory leak.
Call kfree(host) before jumping to the error handling path to ensure that the ata_host structure is properly freed if devres_alloc() fails.
--- drivers/ata/libata-core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/ata/libata-core.c +3 -1
@@ -5593,8 +5593,10 @@ struct ata_host *ata_host_alloc(struct d } dr =devres_alloc (ata_devres_release,0 ,GFP_KERNEL ); -if (!dr) +if (!dr) { +kfree (host); goto err_out; + }devres_add (dev, dr);dev_set_drvdata (dev, host);
Greg Kroah-Hartman
maintainerPATCH 15/269 x86/tdx: Fix data leak in mmio_read()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill A. Shutemov <[email protected]>
commit b6fb565a2d15277896583d471b21bc14a0c99661 upstream.
The mmio_read() function makes a TDVMCALL to retrieve MMIO data for an address from the VMM.
Sean noticed that mmio_read() unintentionally exposes the value of an initialized variable (val) on the stack to the VMM.
This variable is only needed as an output value. It did not need to be passed to the VMM in the first place.
Do not send the original value of *val to the VMM.
[ dhansen: clarify what 'val' is used for. ]
--- arch/x86/coco/tdx/tdx.c | 1 - 1 file changed, 1 deletion(-)
arch/x86/coco/tdx/tdx.c +0 -1
@@ -362,7 +362,6 @@ static bool mmio_read(int size, unsigned .r12 = size, .r13 = EPT_READ, .r14 = addr, - .r15 = *val, };if (__tdx_hypercall_ret (&args))
Greg Kroah-Hartman
maintainerPATCH 16/269 perf/x86/intel: Limit the period on Haswell
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kan Liang <[email protected]>
commit 25dfc9e357af8aed1ca79b318a73f2c59c1f0b2b upstream.
Running the ltp test cve-2015-3290 concurrently reports the following warnings.
perfevents: irq loop stuck!
WARNING: CPU: 31 PID: 32438 at arch/x86/events/intel/core.c:3174 intel_pmu_handle_irq+0x285/0x370 Call Trace: <NMI> ? __warn+0xa4/0x220 ? intel_pmu_handle_irq+0x285/0x370 ? __report_bug+0x123/0x130 ? intel_pmu_handle_irq+0x285/0x370 ? __report_bug+0x123/0x130 ? intel_pmu_handle_irq+0x285/0x370 ? report_bug+0x3e/0xa0 ? handle_bug+0x3c/0x70 ? exc_invalid_op+0x18/0x50 ? asm_exc_invalid_op+0x1a/0x20 ? irq_work_claim+0x1e/0x40 ? intel_pmu_handle_irq+0x285/0x370 perf_event_nmi_handler+0x3d/0x60 nmi_handle+0x104/0x330
Thanks to Thomas Gleixner's analysis, the issue is caused by the low initial period (1) of the frequency estimation algorithm, which triggers the defects of the HW, specifically erratum HSW11 and HSW143. (For the details, please refer https://lore.kernel.org/lkml/87plq9l5d2.ffs@tglx/)
The HSW11 requires a period larger than 100 for the INST_RETIRED.ALL event, but the initial period in the freq mode is 1. The erratum is the same as the BDM11, which has been supported in the kernel. A minimum period of 128 is enforced as well on HSW.
HSW143 is regarding that the fixed counter 1 may overcount 32 with the Hyper-Threading is enabled. However, based on the test, the hardware has more issues than it tells. Besides the fixed counter 1, the message 'interrupt took too long' can be observed on any counter which was armed with a period < 32 and two events expired in the same NMI. A minimum period of 32 is enforced for the rest of the events.
The recommended workaround code of the HSW143 is not implemented. Because it only addresses the issue for the fixed counter. It brings extra overhead through extra MSR writing. No related overcounting issue has been reported so far.
--- arch/x86/events/intel/core.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
arch/x86/events/intel/core.c +21 -2
@@ -4465,6 +4465,25 @@ static u8 adl_get_hybrid_cpu_type(void)return hybrid_big; } +static inline bool erratum_hsw11 (struct perf_event *event) +{ +return (event->hw.config &INTEL_ARCH_EVENT_MASK ) == + X86_CONFIG(.event=0xc0, .umask=0x01); +} + +/* +* The HSW11 requires a period larger than 100 which is the same as the BDM11. +* A minimum period of 128 is enforced as well for the INST_RETIRED.ALL. +* +* The message 'interrupt took too long' can be observed on any counter which +* was armed with a period < 32 and two events expired in the same NMI. +* A minimum period of 32 is enforced for the rest of the events. +*/ +static void hsw_limit_period (struct perf_event *event,s64 *left) +{ + *left =max (*left,erratum_hsw11 (event) ?128 :32 ); +} +/* * Broadwell: *
@@ -4482,8 +4501,7 @@ static u8 adl_get_hybrid_cpu_type(void)*/ static void bdw_limit_period (struct perf_event *event,s64 *left) { -if ((event->hw.config &INTEL_ARCH_EVENT_MASK ) == - X86_CONFIG(.event=0xc0, .umask=0x01)) { +if (erratum_hsw11 (event)) {if (*left <128 ) *left =128 ; *left &= ~0x3fULL ;
@@ -6392,6 +6410,7 @@ __init int intel_pmu_init(void) x86_pmu.hw_config = hsw_hw_config; x86_pmu.get_event_constraints = hsw_get_event_constraints; + x86_pmu.limit_period = hsw_limit_period; x86_pmu.lbr_double_abort = true; extra_attr =boot_cpu_has (X86_FEATURE_RTM ) ? hsw_format_attr : nhm_format_attr;
Greg Kroah-Hartman
maintainerPATCH 17/269 irqchip/gic-v2m: Fix refcount leak in gicv2m_of_init()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
commit c5af2c90ba5629f0424a8d315f75fb8d91713c3c upstream.
gicv2m_of_init() fails to perform an of_node_put() when of_address_to_resource() fails, leading to a refcount leak.
Address this by moving the error handling path outside of the loop and making it common to all failure modes.
--- drivers/irqchip/irq-gic-v2m.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/irqchip/irq-gic-v2m.c +3 -3
@@ -438,12 +438,12 @@ static int __init gicv2m_of_init(struct ret =gicv2m_init_one (&child->fwnode, spi_start, nr_spis, &res,0 ); -if (ret) { -of_node_put (child); +if (ret)break ; - } } +if (ret && child) +of_node_put (child);if (!ret) ret =gicv2m_allocate_domains (parent);if (ret)
Greg Kroah-Hartman
maintainerPATCH 18/269 x86/kaslr: Expose and use the end of the physical memory address space
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit ea72ce5da22806d5713f3ffb39a6d5ae73841f93 upstream.
iounmap() on x86 occasionally fails to unmap because the provided valid ioremap address is not below high_memory. It turned out that this happens due to KASLR.
KASLR uses the full address space between PAGE_OFFSET and vaddr_end to randomize the starting points of the direct map, vmalloc and vmemmap regions. It thereby limits the size of the direct map by using the installed memory size plus an extra configurable margin for hot-plug memory. This limitation is done to gain more randomization space because otherwise only the holes between the direct map, vmalloc, vmemmap and vaddr_end would be usable for randomizing.
The limited direct map size is not exposed to the rest of the kernel, so the memory hot-plug and resource management related code paths still operate under the assumption that the available address space can be determined with MAX_PHYSMEM_BITS.
request_free_mem_region() allocates from (1 << MAX_PHYSMEM_BITS) - 1 downwards. That means the first allocation happens past the end of the direct map and if unlucky this address is in the vmalloc space, which causes high_memory to become greater than VMALLOC_START and consequently causes iounmap() to fail for valid ioremap addresses.
MAX_PHYSMEM_BITS cannot be changed for that because the randomization does not align with address bit boundaries and there are other places which actually require to know the maximum number of address bits. All remaining usage sites of MAX_PHYSMEM_BITS have been analyzed and found to be correct.
Cure this by exposing the end of the direct map via PHYSMEM_END and use that for the memory hot-plug and resource management related places instead of relying on MAX_PHYSMEM_BITS. In the KASLR case PHYSMEM_END maps to a variable which is initialized by the KASLR initialization and otherwise it is based on MAX_PHYSMEM_BITS as before.
To prevent future hickups add a check into add_pages() to catch callers trying to add memory above PHYSMEM_END.
--- arch/x86/include/asm/page_64.h | 1 + arch/x86/include/asm/pgtable_64_types.h | 4 ++++ arch/x86/mm/init_64.c | 4 ++++ arch/x86/mm/kaslr.c | 32 ++++++++++++++++++++++++++------ include/linux/mm.h | 4 ++++ kernel/resource.c | 6 ++---- mm/memory_hotplug.c | 2 +- mm/sparse.c | 2 +- 8 files changed, 43 insertions(+), 12 deletions(-)
arch/x86/include/asm/page_64.h +1 -0
@@ -17,6 +17,7 @@ extern unsigned long phys_base;extern unsigned long page_offset_base;extern unsigned long vmalloc_base;extern unsigned long vmemmap_base; +extern unsigned long physmem_end;static __always_inline unsigned long __phys_addr_nodebug (unsigned long x) {
arch/x86/include/asm/pgtable_64_types.h +4 -0
@@ -140,6 +140,10 @@ extern unsigned int ptrs_per_p4d;# define VMEMMAP_START __VMEMMAP_BASE_L4#endif /* CONFIG_DYNAMIC_MEMORY_LAYOUT */ +#ifdef CONFIG_RANDOMIZE_MEMORY +# define PHYSMEM_END physmem_end +#endif +/* * End of the region for which vmalloc page tables are pre-allocated. * For non-KMSAN builds, this is the same as VMALLOC_END.
arch/x86/mm/init_64.c +4 -0
@@ -950,8 +950,12 @@ static void update_end_of_memory_vars(u6int add_pages (int nid,unsigned long start_pfn,unsigned long nr_pages,struct mhp_params *params) { +unsigned long end = ((start_pfn + nr_pages) <<PAGE_SHIFT ) -1 ;int ret; +if (WARN_ON_ONCE (end >PHYSMEM_END )) +return -ERANGE ; + ret =__add_pages (nid, start_pfn, nr_pages, params);WARN_ON_ONCE (ret);
arch/x86/mm/kaslr.c +26 -6
@@ -47,13 +47,24 @@ static const unsigned long vaddr_end = C*/ static __initdata struct kaslr_memory_region {unsigned long *base; +unsigned long *end;unsigned long size_tb; } kaslr_regions[] = { - { &page_offset_base,0 }, - { &vmalloc_base,0 }, - { &vmemmap_base,0 }, + { + .base = &page_offset_base, + .end = &physmem_end, + }, + { + .base = &vmalloc_base, + }, + { + .base = &vmemmap_base, + }, }; +/* The end of the possible address space for physical memory */ +unsigned long physmem_end__ro_after_init ; +/* Get size in bytes used by the memory region */ static inline unsigned long get_padding (struct kaslr_memory_region *region) {
@@ -82,6 +93,8 @@ void __init kernel_randomize_memory(voidBUILD_BUG_ON (vaddr_end !=CPU_ENTRY_AREA_BASE );BUILD_BUG_ON (vaddr_end > __START_KERNEL_map); +/* Preset the end of the possible address space for physical memory */ + physmem_end = ((1ULL <<MAX_PHYSMEM_BITS ) -1 );if (!kaslr_memory_enabled ())return ;
@@ -128,11 +141,18 @@ void __init kernel_randomize_memory(void vaddr += entropy; *kaslr_regions[i].base = vaddr; +/* Calculate the end of the region */ + vaddr +=get_padding (&kaslr_regions[i]);/* -* Jump the region and add a minimum padding based on -* randomization alignment. +* KASLR trims the maximum possible size of the +* direct-map. Update the physmem_end boundary. +* No rounding required as the region starts +* PUD aligned and size is in units of TB. */ - vaddr +=get_padding (&kaslr_regions[i]); +if (kaslr_regions[i].end) + *kaslr_regions[i].end =__pa_nodebug (vaddr -1 ); + +/* Add a minimum padding based on randomization alignment. */ vaddr =round_up (vaddr +1 ,PUD_SIZE ); remain_entropy -= entropy; }
include/linux/mm.h +4 -0
@@ -95,6 +95,10 @@ extern const int mmap_rnd_compat_bits_maextern int mmap_rnd_compat_bits__read_mostly ;#endif +#ifndef PHYSMEM_END +# define PHYSMEM_END ((1ULL << MAX_PHYSMEM_BITS) - 1) +#endif +#include <asm/page.h> #include <asm/processor.h>
kernel/resource.c +2 -4
@@ -1778,8 +1778,7 @@ static resource_size_t gfr_start(structif (flags &GFR_DESCENDING ) {resource_size_t end; - end =min_t (resource_size_t, base->end, - (1ULL <<MAX_PHYSMEM_BITS ) -1 ); + end =min_t (resource_size_t, base->end,PHYSMEM_END );return end - size +1 ; }
@@ -1796,8 +1795,7 @@ static bool gfr_continue(struct resource* @size did not wrap 0. */ return addr > addr - size && - addr <=min_t (resource_size_t, base->end, - (1ULL <<MAX_PHYSMEM_BITS ) -1 ); + addr <=min_t (resource_size_t, base->end,PHYSMEM_END ); } static resource_size_t gfr_next(resource_size_t addr, resource_size_t size,
mm/memory_hotplug.c +1 -1
@@ -1610,7 +1610,7 @@ struct range __weak arch_get_mappable_rastruct range mhp_get_pluggable_range (bool need_mapping) { -const u64 max_phys = (1ULL <<MAX_PHYSMEM_BITS ) -1 ; +const u64 max_phys =PHYSMEM_END ;struct range mhp_range;if (need_mapping) {
mm/sparse.c +1 -1
@@ -129,7 +129,7 @@ static inline int sparse_early_nid(strucstatic void __meminit mminit_validate_memmodel_limits (unsigned long *start_pfn,unsigned long *end_pfn) { -unsigned long max_sparsemem_pfn =1UL << (MAX_PHYSMEM_BITS -PAGE_SHIFT ); +unsigned long max_sparsemem_pfn = (PHYSMEM_END +1 ) >>PAGE_SHIFT ;/* * Sanity checks - do not allow an architecture to pass
Greg Kroah-Hartman
maintainerPATCH 19/269 rtmutex: Drop rt_mutex::wait_lock before scheduling
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roland Xu <[email protected]>
commit d33d26036a0274b472299d7dcdaa5fb34329f91b upstream.
rt_mutex_handle_deadlock() is called with rt_mutex::wait_lock held. In the good case it returns with the lock held and in the deadlock case it emits a warning and goes into an endless scheduling loop with the lock held, which triggers the 'scheduling in atomic' warning.
Unlock rt_mutex::wait_lock in the dead lock case before issuing the warning and dropping into the schedule for ever loop.
[ tglx: Moved unlock before the WARN(), removed the pointless comment,
massaged changelog, added Fixes tag ]
--- kernel/locking/rtmutex.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
kernel/locking/rtmutex.c +5 -4
@@ -1624,6 +1624,7 @@ static int __sched rt_mutex_slowlock_blo } static void __sched rt_mutex_handle_deadlock(int res, int detect_deadlock, +struct rt_mutex_base *lock,struct rt_mutex_waiter *w) {/*
@@ -1636,10 +1637,10 @@ static void __sched rt_mutex_handle_deadif (build_ww_mutex () && w->ww_ctx)return ; -/* -* Yell loudly and stop the task right here. -*/ +raw_spin_unlock_irq (&lock->wait_lock); +WARN (1 ,"rtmutex deadlock detected\n" ); +while (1 ) {set_current_state (TASK_INTERRUPTIBLE );schedule ();
@@ -1693,7 +1694,7 @@ static int __sched __rt_mutex_slowlock(s }else {__set_current_state (TASK_RUNNING );remove_waiter (lock, waiter); -rt_mutex_handle_deadlock (ret, chwalk, waiter); +rt_mutex_handle_deadlock (ret, chwalk, lock, waiter); }/*
Greg Kroah-Hartman
maintainerPATCH 20/269 nvme-pci: Add sleep quirk for Samsung 990 Evo
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Georg Gottleuber <[email protected]>
commit 61aa894e7a2fda4ee026523b01d07e83ce2abb72 upstream.
On some TUXEDO platforms, a Samsung 990 Evo NVMe leads to a high power consumption in s2idle sleep (2-3 watts).
This patch applies 'Force No Simple Suspend' quirk to achieve a sleep with a lower power consumption, typically around 0.5 watts.
--- drivers/nvme/host/pci.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/nvme/host/pci.c +11 -0
@@ -2929,6 +2929,17 @@ static unsigned long check_vendor_combin dmi_match(DMI_BOARD_NAME, "NS5x_7xPU") || dmi_match(DMI_BOARD_NAME, "PH4PRX1_PH6PRX1"))return NVME_QUIRK_FORCE_NO_SIMPLE_SUSPEND ; + }else if (pdev->vendor ==0x144d && pdev->device ==0xa80d ) { +/* +* Exclude Samsung 990 Evo from NVME_QUIRK_SIMPLE_SUSPEND +* because of high power consumption (> 2 Watt) in s2idle +* sleep. Only some boards with Intel CPU are affected. +*/ +if (dmi_match (DMI_BOARD_NAME ,"GMxPXxx" ) || +dmi_match (DMI_BOARD_NAME ,"PH4PG31" ) || +dmi_match (DMI_BOARD_NAME ,"PH4PRX1_PH6PRX1" ) || +dmi_match (DMI_BOARD_NAME ,"PH6PG01_PH6PG71" )) +return NVME_QUIRK_FORCE_NO_SIMPLE_SUSPEND ; }/*
Greg Kroah-Hartman
maintainerPATCH 21/269 rust: types: Make Opaque::get const
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boqun Feng <[email protected]>
commit be2ca1e03965ffb214b6cbda0ffd84daeeb5f214 upstream.
To support a potential usage:
static foo: Opaque<Foo> = ..; // Or defined in an extern block.
...
fn bar() {
let ptr = foo.get();
}Opaque::get need to be const, otherwise compiler will complain because calls on statics are limited to const functions.
Also Opaque::get should be naturally const since it's a composition of two const functions: UnsafeCell::get and ptr::cast.
--- rust/kernel/types.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
rust/kernel/types.rs +1 -1
@@ -248,7 +248,7 @@ impl<T> Opaque<T> { }/// Returns a raw pointer to the opaque data. -pub fn get (&self) -> *mut T { +pub const fn get (&self) -> *mut T {UnsafeCell ::get (&self.value).cast ::<T >() }
Greg Kroah-Hartman
maintainerPATCH 22/269 rust: macros: provide correct provenance when constructing THIS_MODULE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boqun Feng <[email protected]>
commit a5a3c952e82c1ada12bf8c55b73af26f1a454bd2 upstream.
Currently while defining THIS_MODULE symbol in module!(), the pointer used to construct ThisModule is derived from an immutable reference of __this_module, which means the pointer doesn't have the provenance for writing, and that means any write to that pointer is UB regardless of data races or not. However, the usage of THIS_MODULE includes passing this pointer to functions that may write to it (probably in unsafe code), and this will create soundness issues.
One way to fix this is using addr_of_mut!() but that requires the unstable feature "const_mut_refs". So instead of addr_of_mut()!, an extern static Opaque is used here: since Opaque<T> is transparent to T, an extern static Opaque will just wrap the C symbol (defined in a C compile unit) in an Opaque, which provides a pointer with writable provenance via Opaque::get(). This fix the potential UBs because of pointer provenance unmatched.
--- rust/macros/module.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
rust/macros/module.rs +5 -1
@@ -203,7 +203,11 @@ pub(crate) fn module(ts: TokenStream) ->// freed until the module is unloaded. #[cfg( MODULE )] static THIS_MODULE : kernel::ThisModule =unsafe {{ - kernel::ThisModule ::from_ptr (&kernel::bindings::__this_moduleas *const _ as *mut _ ) + extern \"C\" {{ +static __this_module: kernel::types::Opaque <kernel::bindings::module >; + }} + + kernel::ThisModule ::from_ptr (__this_module.get ()) }};#[cfg(not( MODULE ))] static THIS_MODULE : kernel::ThisModule =unsafe {{
Greg Kroah-Hartman
maintainerPATCH 23/269 Revert "Bluetooth: MGMT/SMP: Fix address type when using SMP over BREDR/LE"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
commit 532f8bcd1c2c4e8112f62e1922fd1703bc0ffce0 upstream.
This reverts commit 59b047bc98084f8af2c41483e4d68a5adf2fa7f7 which breaks compatibility with commands like:
bluetoothd[46328]: @ MGMT Command: Load.. (0x0013) plen 74 {0x0001} [hci0]
Keys: 2
BR/EDR Address: C0:DC:DA:A5:E5:47 (Samsung Electronics Co.,Ltd)
Key type: Authenticated key from P-256 (0x03)
Central: 0x00
Encryption size: 16
Diversifier[2]: 0000
Randomizer[8]: 0000000000000000
Key[16]: 6ed96089bd9765be2f2c971b0b95f624
LE Address: D7:2A:DE:1E:73:A2 (Static)
Key type: Unauthenticated key from P-256 (0x02)
Central: 0x00
Encryption size: 16
Diversifier[2]: 0000
Randomizer[8]: 0000000000000000
Key[16]: 87dd2546ededda380ffcdc0a8faa4597
@ MGMT Event: Command Status (0x0002) plen 3 {0x0001} [hci0]
Load Long Term Keys (0x0013)
Status: Invalid Parameters (0x0d)--- include/net/bluetooth/hci_core.h | 5 ----- net/bluetooth/mgmt.c | 25 +++++++------------------ net/bluetooth/smp.c | 7 ------- 3 files changed, 7 insertions(+), 30 deletions(-)
include/net/bluetooth/hci_core.h +0 -5
@@ -188,7 +188,6 @@ struct blocked_key {struct smp_csrk {bdaddr_t bdaddr;u8 bdaddr_type; -u8 link_type;u8 type;u8 val[16 ]; };
@@ -198,7 +197,6 @@ struct smp_ltk {struct rcu_head rcu;bdaddr_t bdaddr;u8 bdaddr_type; -u8 link_type;u8 authenticated;u8 type;u8 enc_size;
@@ -213,7 +211,6 @@ struct smp_irk {bdaddr_t rpa;bdaddr_t bdaddr;u8 addr_type; -u8 link_type;u8 val[16 ]; };
@@ -221,8 +218,6 @@ struct link_key {struct list_head list;struct rcu_head rcu;bdaddr_t bdaddr; -u8 bdaddr_type; -u8 link_type;u8 type;u8 val[HCI_LINK_KEY_SIZE ];u8 pin_len;
net/bluetooth/mgmt.c +7 -18
@@ -2827,8 +2827,7 @@ static int load_link_keys(struct sock *sfor (i =0 ; i < key_count; i++) {struct mgmt_link_key_info *key = &cp->keys[i]; -/* Considering SMP over BREDR/LE, there is no need to check addr_type */ -if (key->type >0x08 ) +if (key->addr.type !=BDADDR_BREDR || key->type >0x08 )return mgmt_cmd_status (sk, hdev->id,MGMT_OP_LOAD_LINK_KEYS ,MGMT_STATUS_INVALID_PARAMS );
@@ -7065,7 +7064,6 @@ static int load_irks(struct sock *sk, stfor (i =0 ; i < irk_count; i++) {struct mgmt_irk_info *irk = &cp->irks[i]; -u8 addr_type =le_addr_type (irk->addr.type); if (hci_is_blocked_key(hdev, HCI_BLOCKED_KEY_TYPE_IRK,
@@ -7075,12 +7073,8 @@ static int load_irks(struct sock *sk, stcontinue ; } -/* When using SMP over BR/EDR, the addr type should be set to BREDR */ -if (irk->addr.type ==BDADDR_BREDR ) - addr_type =BDADDR_BREDR ; -hci_add_irk (hdev, &irk->addr.bdaddr, - addr_type, irk->val, +le_addr_type (irk->addr.type), irk->val,BDADDR_ANY ); }
@@ -7161,7 +7155,6 @@ static int load_long_term_keys(struct sofor (i =0 ; i < key_count; i++) {struct mgmt_ltk_info *key = &cp->keys[i];u8 type, authenticated; -u8 addr_type =le_addr_type (key->addr.type); if (hci_is_blocked_key(hdev, HCI_BLOCKED_KEY_TYPE_LTK,
@@ -7196,12 +7189,8 @@ static int load_long_term_keys(struct socontinue ; } -/* When using SMP over BR/EDR, the addr type should be set to BREDR */ -if (key->addr.type ==BDADDR_BREDR ) - addr_type =BDADDR_BREDR ; -hci_add_ltk (hdev, &key->addr.bdaddr, - addr_type, type, authenticated, +le_addr_type (key->addr.type), type, authenticated, key->val, key->enc_size, key->ediv, key->rand); }
@@ -9450,7 +9439,7 @@ void mgmt_new_link_key(struct hci_dev *h ev.store_hint = persistent;bacpy (&ev.key.addr.bdaddr, &key->bdaddr); - ev.key.addr.type =link_to_bdaddr (key->link_type, key->bdaddr_type); + ev.key.addr.type =BDADDR_BREDR ; ev.key.type = key->type;memcpy (ev.key.val, key->val,HCI_LINK_KEY_SIZE ); ev.key.pin_len = key->pin_len;
@@ -9501,7 +9490,7 @@ void mgmt_new_ltk(struct hci_dev *hdev, ev.store_hint = persistent;bacpy (&ev.key.addr.bdaddr, &key->bdaddr); - ev.key.addr.type =link_to_bdaddr (key->link_type, key->bdaddr_type); + ev.key.addr.type =link_to_bdaddr (LE_LINK , key->bdaddr_type); ev.key.type =mgmt_ltk_type (key); ev.key.enc_size = key->enc_size; ev.key.ediv = key->ediv;
@@ -9530,7 +9519,7 @@ void mgmt_new_irk(struct hci_dev *hdev,bacpy (&ev.rpa, &irk->rpa);bacpy (&ev.irk.addr.bdaddr, &irk->bdaddr); - ev.irk.addr.type =link_to_bdaddr (irk->link_type, irk->addr_type); + ev.irk.addr.type =link_to_bdaddr (LE_LINK , irk->addr_type);memcpy (ev.irk.val, irk->val,sizeof (irk->val));mgmt_event (MGMT_EV_NEW_IRK , hdev, &ev,sizeof (ev),NULL );
@@ -9559,7 +9548,7 @@ void mgmt_new_csrk(struct hci_dev *hdev, ev.store_hint = persistent;bacpy (&ev.key.addr.bdaddr, &csrk->bdaddr); - ev.key.addr.type =link_to_bdaddr (csrk->link_type, csrk->bdaddr_type); + ev.key.addr.type =link_to_bdaddr (LE_LINK , csrk->bdaddr_type); ev.key.type = csrk->type;memcpy (ev.key.val, csrk->val,sizeof (csrk->val));
net/bluetooth/smp.c +0 -7
@@ -1061,7 +1061,6 @@ static void smp_notify_keys(struct l2cap }if (smp->remote_irk) { - smp->remote_irk->link_type = hcon->type;mgmt_new_irk (hdev, smp->remote_irk, persistent);/* Now that user space can be considered to know the
@@ -1081,28 +1080,24 @@ static void smp_notify_keys(struct l2cap }if (smp->csrk) { - smp->csrk->link_type = hcon->type; smp->csrk->bdaddr_type = hcon->dst_type;bacpy (&smp->csrk->bdaddr, &hcon->dst);mgmt_new_csrk (hdev, smp->csrk, persistent); }if (smp->responder_csrk) { - smp->responder_csrk->link_type = hcon->type; smp->responder_csrk->bdaddr_type = hcon->dst_type;bacpy (&smp->responder_csrk->bdaddr, &hcon->dst);mgmt_new_csrk (hdev, smp->responder_csrk, persistent); }if (smp->ltk) { - smp->ltk->link_type = hcon->type; smp->ltk->bdaddr_type = hcon->dst_type;bacpy (&smp->ltk->bdaddr, &hcon->dst);mgmt_new_ltk (hdev, smp->ltk, persistent); }if (smp->responder_ltk) { - smp->responder_ltk->link_type = hcon->type; smp->responder_ltk->bdaddr_type = hcon->dst_type;bacpy (&smp->responder_ltk->bdaddr, &hcon->dst);mgmt_new_ltk (hdev, smp->responder_ltk, persistent);
@@ -1122,8 +1117,6 @@ static void smp_notify_keys(struct l2cap key =hci_add_link_key (hdev, smp->conn->hcon, &hcon->dst, smp->link_key, type,0 , &persistent);if (key) { - key->link_type = hcon->type; - key->bdaddr_type = hcon->dst_type;mgmt_new_link_key (hdev, key, persistent);/* Don't keep debug keys around if the relevant
Greg Kroah-Hartman
maintainerPATCH 24/269 Bluetooth: MGMT: Ignore keys being loaded with invalid type
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
commit 1e9683c9b6ca88cc9340cdca85edd6134c8cffe3 upstream.
Due to 59b047bc98084f8af2c41483e4d68a5adf2fa7f7 there could be keys stored with the wrong address type so this attempt to detect it and ignore them instead of just failing to load all keys.
--- net/bluetooth/mgmt.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-)
net/bluetooth/mgmt.c +19 -18
@@ -2824,15 +2824,6 @@ static int load_link_keys(struct sock *sbt_dev_dbg (hdev,"debug_keys %u key_count %u" , cp->debug_keys, key_count); -for (i =0 ; i < key_count; i++) { -struct mgmt_link_key_info *key = &cp->keys[i]; - -if (key->addr.type !=BDADDR_BREDR || key->type >0x08 ) -return mgmt_cmd_status (sk, hdev->id, -MGMT_OP_LOAD_LINK_KEYS , -MGMT_STATUS_INVALID_PARAMS ); - } -hci_dev_lock (hdev);hci_link_keys_clear (hdev);
@@ -2857,6 +2848,19 @@ static int load_link_keys(struct sock *scontinue ; } +if (key->addr.type !=BDADDR_BREDR ) { +bt_dev_warn (hdev, +"Invalid link address type %u for %pMR" , + key->addr.type, &key->addr.bdaddr); +continue ; + } + +if (key->type >0x08 ) { +bt_dev_warn (hdev,"Invalid link key type %u for %pMR" , + key->type, &key->addr.bdaddr); +continue ; + } +/* Always ignore debug keys and require a new pairing if * the user wants to use them. */
@@ -7139,15 +7143,6 @@ static int load_long_term_keys(struct sobt_dev_dbg (hdev,"key_count %u" , key_count); -for (i =0 ; i < key_count; i++) { -struct mgmt_ltk_info *key = &cp->keys[i]; - -if (!ltk_is_valid (key)) -return mgmt_cmd_status (sk, hdev->id, -MGMT_OP_LOAD_LONG_TERM_KEYS , -MGMT_STATUS_INVALID_PARAMS ); - } -hci_dev_lock (hdev);hci_smp_ltks_clear (hdev);
@@ -7163,6 +7158,12 @@ static int load_long_term_keys(struct so &key->addr.bdaddr);continue ; } + +if (!ltk_is_valid (key)) { +bt_dev_warn (hdev,"Invalid LTK for %pMR" , + &key->addr.bdaddr); +continue ; + }switch (key->type) {case MGMT_LTK_UNAUTHENTICATED :
Greg Kroah-Hartman
maintainerPATCH 25/269 mmc: core: apply SD quirks earlier during probe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Bell <[email protected]>
commit 469e5e4713989fdd5e3e502b922e7be0da2464b9 upstream.
Applying MMC_QUIRK_BROKEN_SD_CACHE is broken, as the card's SD quirks are referenced in sd_parse_ext_reg_perf() prior to the quirks being initialized in mmc_blk_probe().
To fix this problem, let's split out an SD-specific list of quirks and apply in mmc_sd_init_card() instead. In this way, sd_read_ext_regs() to has the available information for not assigning the SD_EXT_PERF_CACHE as one of the (un)supported features, which in turn allows mmc_sd_init_card() to properly skip execution of sd_enable_cache().
--- drivers/mmc/core/quirks.h | 22 +++++++++++++--------- drivers/mmc/core/sd.c | 4 ++++ 2 files changed, 17 insertions(+), 9 deletions(-)
drivers/mmc/core/quirks.h +13 -9
@@ -15,6 +15,19 @@#include "card.h" +static const struct mmc_fixup __maybe_unused mmc_sd_fixups[] = { +/* +* Kingston Canvas Go! Plus microSD cards never finish SD cache flush. +* This has so far only been observed on cards from 11/2019, while new +* cards from 2023/05 do not exhibit this behavior. +*/ +_FIXUP_EXT ("SD64G" ,CID_MANFID_KINGSTON_SD ,0x5449 ,2019 ,11 , +0 ,-1ull ,SDIO_ANY_ID ,SDIO_ANY_ID , add_quirk_sd, +MMC_QUIRK_BROKEN_SD_CACHE ,EXT_CSD_REV_ANY ), + +END_FIXUP +}; +static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = { #define INAND_CMD38_ARG_EXT_CSD 113 #define INAND_CMD38_ARG_ERASE 0x00
@@ -54,15 +67,6 @@ static const struct mmc_fixup __maybe_un MMC_QUIRK_BLK_NO_CMD23),/* -* Kingston Canvas Go! Plus microSD cards never finish SD cache flush. -* This has so far only been observed on cards from 11/2019, while new -* cards from 2023/05 do not exhibit this behavior. -*/ -_FIXUP_EXT ("SD64G" ,CID_MANFID_KINGSTON_SD ,0x5449 ,2019 ,11 , -0 ,-1ull ,SDIO_ANY_ID ,SDIO_ANY_ID , add_quirk_sd, -MMC_QUIRK_BROKEN_SD_CACHE ,EXT_CSD_REV_ANY ), - -/* * Some SD cards lockup while using CMD23 multiblock transfers. */ MMC_FIXUP("AF SD", CID_MANFID_ATP, CID_OEMID_ANY, add_quirk_sd,
drivers/mmc/core/sd.c +4 -0
@@ -26,6 +26,7 @@#include "host.h" #include "bus.h" #include "mmc_ops.h" +#include "quirks.h" #include "sd.h" #include "sd_ops.h"
@@ -1475,6 +1476,9 @@ retry: goto free_card; } +/* Apply quirks prior to card setup */ +mmc_fixup_device (card, mmc_sd_fixups); + err =mmc_sd_setup_card (host, card, oldcard !=NULL );if (err) goto free_card;
Greg Kroah-Hartman
maintainerPATCH 26/269 mmc: dw_mmc: Fix IDMAC operation with pages bigger than 4K
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sam Protsenko <[email protected]>
commit 8396c793ffdf28bb8aee7cfe0891080f8cab7890 upstream.
Commit 616f87661792 ("mmc: pass queue_limits to blk_mq_alloc_disk") [1] revealed the long living issue in dw_mmc.c driver, existing since the time when it was first introduced in commit f95f3850f7a9 ("mmc: dw_mmc:
Add Synopsys DesignWare mmc host driver."), also making kernel boot broken on platforms using dw_mmc driver with 16K or 64K pages enabled, with this message in dmesg:
mmcblk: probe of mmc0:0001 failed with error -22
That's happening because mmc_blk_probe() fails when it calls blk_validate_limits() consequently, which returns the error due to failed max_segment_size check in this code:
/*
* The maximum segment size has an odd historic 64k default that
* drivers probably should override. Just like the I/O size we
* require drivers to at least handle a full page per segment.
*/
...
if (WARN_ON_ONCE(lim->max_segment_size < PAGE_SIZE))
return -EINVAL;In case when IDMAC (Internal DMA Controller) is used, dw_mmc.c always sets .max_seg_size to 4 KiB:
mmc->max_seg_size = 0x1000;
The comment in the code above explains why it's incorrect. Arnd suggested setting .max_seg_size to .max_req_size to fix it, which is also what some other drivers are doing:
$ grep -rl 'max_seg_size.*=.*max_req_size' drivers/mmc/host/ | \
wc -l
18This change is not only fixing the boot with 16K/64K pages, but also leads to a better MMC performance. The linear write performance was tested on E850-96 board (eMMC only), before commit [1] (where it's possible to boot with 16K/64K pages without this fix, to be able to do a comparison). It was tested with this command:
# dd if=/dev/zero of=somefile bs=1M count=500 oflag=sync
Test results are as follows:
- 4K pages, .max_seg_size = 4 KiB: 94.2 MB/s
- 4K pages, .max_seg_size = .max_req_size = 512 KiB: 96.9 MB/s
- 16K pages, .max_seg_size = 4 KiB: 126 MB/s - 16K pages, .max_seg_size = .max_req_size = 2 MiB: 128 MB/s - 64K pages, .max_seg_size = 4 KiB: 138 MB/s - 64K pages, .max_seg_size = .max_req_size = 8 MiB: 138 MB/s
Unfortunately, SD card controller is not enabled in E850-96 yet, so it wasn't possible for me to run the test on some cheap SD cards to check this patch's impact on those. But it's possible that this change might also reduce the writes count, thus improving SD/eMMC longevity.
All credit for the analysis and the suggested solution goes to Arnd.
[1] https://lore.kernel.org/all/[email protected]/
--- drivers/mmc/host/dw_mmc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mmc/host/dw_mmc.c +2 -2
@@ -2952,8 +2952,8 @@ static int dw_mci_init_slot(struct dw_mcif (host->use_dma ==TRANS_MODE_IDMAC ) { mmc->max_segs = host->ring_size; mmc->max_blk_size =65535 ; - mmc->max_seg_size =0x1000 ; - mmc->max_req_size = mmc->max_seg_size * host->ring_size; + mmc->max_req_size =DW_MCI_DESC_DATA_LENGTH * host->ring_size; + mmc->max_seg_size = mmc->max_req_size; mmc->max_blk_count = mmc->max_req_size /512 ; }else if (host->use_dma ==TRANS_MODE_EDMAC ) { mmc->max_segs =64 ;
Greg Kroah-Hartman
maintainerPATCH 27/269 mmc: sdhci-of-aspeed: fix module autoloading
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liao Chen <[email protected]>
commit 6e540da4c1db7b840e347c4dfe48359b18b7e376 upstream.
Add MODULE_DEVICE_TABLE(), so modules could be properly autoloaded based on the alias from of_device_id table.
--- drivers/mmc/host/sdhci-of-aspeed.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/sdhci-of-aspeed.c +1 -0
@@ -510,6 +510,7 @@ static const struct of_device_id aspeed_ { .compatible = "aspeed,ast2600-sdhci", .data = &ast2600_sdhci_pdata, }, { } }; +MODULE_DEVICE_TABLE (of, aspeed_sdhci_of_match);static struct platform_driver aspeed_sdhci_driver = { .driver = {
Greg Kroah-Hartman
maintainerPATCH 28/269 mmc: cqhci: Fix checking of CQHCI_HALT state
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Seunghwan Baek <[email protected]>
commit aea62c744a9ae2a8247c54ec42138405216414da upstream.
To check if mmc cqe is in halt state, need to check set/clear of CQHCI_HALT bit. At this time, we need to check with &, not &&.
--- drivers/mmc/host/cqhci-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mmc/host/cqhci-core.c +1 -1
@@ -612,7 +612,7 @@ static int cqhci_request(struct mmc_hostcqhci_writel (cq_host,0 ,CQHCI_CTL ); mmc->cqe_on = true;pr_debug ("%s: cqhci: CQE on\n" ,mmc_hostname (mmc)); -if (cqhci_readl (cq_host,CQHCI_CTL ) &&CQHCI_HALT ) { +if (cqhci_readl (cq_host,CQHCI_CTL ) &CQHCI_HALT ) {pr_err ("%s: cqhci: CQE failed to exit halt state\n" ,mmc_hostname (mmc)); }
Greg Kroah-Hartman
maintainerPATCH 29/269 fuse: update stats for pages in dropped aux writeback list
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joanne Koong <[email protected]>
commit f7790d67785302b3116bbbfda62a5a44524601a3 upstream.
In the case where the aux writeback list is dropped (e.g. the pages have been truncated or the connection is broken), the stats for its pages and backing device info need to be updated as well.
--- fs/fuse/file.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
fs/fuse/file.c +7 -1
@@ -1735,10 +1735,16 @@ __acquires(fi->lock)fuse_writepage_finish (fm, wpa);spin_unlock (&fi->lock); -/* After fuse_writepage_finish() aux request list is private */ +/* After rb_erase() aux request list is private */ for (aux = wpa->next; aux; aux = next) { +struct backing_dev_info *bdi =inode_to_bdi (aux->inode); + next = aux->next; aux->next =NULL ; + +dec_wb_stat (&bdi->wb,WB_WRITEBACK ); +dec_node_page_state (aux->ia.ap.pages[0 ],NR_WRITEBACK_TEMP ); +wb_writeout_inc (&bdi->wb);fuse_writepage_free (aux); }
Greg Kroah-Hartman
maintainerPATCH 30/269 fuse: use unsigned type for getxattr/listxattr size truncation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jann Horn <[email protected]>
commit b18915248a15eae7d901262f108d6ff0ffb4ffc1 upstream.
The existing code uses min_t(ssize_t, outarg.size, XATTR_LIST_MAX) when parsing the FUSE daemon's response to a zero-length getxattr/listxattr request.
On 32-bit kernels, where ssize_t and outarg.size are the same size, this is
wrong: The min_t() will pass through any size values that are negative when interpreted as signed.fuse_listxattr() will then return this userspace-supplied negative value, which callers will treat as an error value.
This kind of bug pattern can lead to fairly bad security bugs because of how error codes are used in the Linux kernel. If a caller were to convert the numeric error into an error pointer, like so:
struct foo *func(...) {
int len = fuse_getxattr(..., NULL, 0);
if (len < 0)
return ERR_PTR(len);
...
}then it would end up returning this userspace-supplied negative value cast to a pointer - but the caller of this function wouldn't recognize it as an error pointer (IS_ERR_VALUE() only detects values in the narrow range in which legitimate errno values are), and so it would just be treated as a kernel pointer.
I think there is at least one theoretical codepath where this could happen, but that path would involve virtio-fs with submounts plus some weird SELinux configuration, so I think it's probably not a concern in practice.
--- fs/fuse/xattr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/fuse/xattr.c +2 -2
@@ -81,7 +81,7 @@ ssize_t fuse_getxattr(struct inode *inod } ret =fuse_simple_request (fm, &args);if (!ret && !size) - ret =min_t (ssize_t, outarg.size,XATTR_SIZE_MAX ); + ret =min_t (size_t, outarg.size,XATTR_SIZE_MAX );if (ret == -ENOSYS ) { fm->fc->no_getxattr =1 ; ret = -EOPNOTSUPP ;
@@ -143,7 +143,7 @@ ssize_t fuse_listxattr(struct dentry *en } ret =fuse_simple_request (fm, &args);if (!ret && !size) - ret =min_t (ssize_t, outarg.size,XATTR_LIST_MAX ); + ret =min_t (size_t, outarg.size,XATTR_LIST_MAX );if (ret >0 && size) ret =fuse_verify_xattr_list (list, ret);if (ret == -ENOSYS ) {
Greg Kroah-Hartman
maintainerPATCH 31/269 fuse: fix memory leak in fuse_create_open
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: yangyun <[email protected]>
commit 3002240d16494d798add0575e8ba1f284258ab34 upstream.
The memory of struct fuse_file is allocated but not freed when get_create_ext return error.
--- fs/fuse/dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/fuse/dir.c +1 -1
@@ -668,7 +668,7 @@ static int fuse_create_open(struct inode err =get_create_ext (&args, dir, entry, mode);if (err) - goto out_put_forget_req; + goto out_free_ff; err =fuse_simple_request (fm, &args);free_ext_value (&args);
Greg Kroah-Hartman
maintainerPATCH 32/269 clk: starfive: jh7110-sys: Add notifier for PLL0 clock
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xingyu Wu <[email protected]>
commit 538d5477b25289ac5d46ca37b9e5b4d685cbe019 upstream.
Add notifier function for PLL0 clock. In the function, the cpu_root clock should be operated by saving its current parent and setting a new safe parent (osc clock) before setting the PLL0 clock rate. After setting PLL0 rate, it should be switched back to the original parent clock.
--- .../clk/starfive/clk-starfive-jh7110-sys.c | 31 ++++++++++++++++++- drivers/clk/starfive/clk-starfive-jh71x0.h | 2 ++ 2 files changed, 32 insertions(+), 1 deletion(-)
drivers/clk/starfive/clk-starfive-jh7110-sys.c +30 -1
@@ -385,6 +385,32 @@ int jh7110_reset_controller_register(struct jh71x0_clk_priv *priv, }EXPORT_SYMBOL_GPL (jh7110_reset_controller_register); +/* +* This clock notifier is called when the rate of PLL0 clock is to be changed. +* The cpu_root clock should save the curent parent clock and switch its parent +* clock to osc before PLL0 rate will be changed. Then switch its parent clock +* back after the PLL0 rate is completed. +*/ +static int jh7110_pll0_clk_notifier_cb (struct notifier_block *nb, +unsigned long action,void *data) +{ + struct jh71x0_clk_priv *priv = container_of(nb, struct jh71x0_clk_priv, pll_clk_nb); +struct clk *cpu_root = priv->reg[JH7110_SYSCLK_CPU_ROOT ].hw.clk; +int ret =0 ; + +if (action ==PRE_RATE_CHANGE ) { +struct clk *osc =clk_get (priv->dev,"osc" ); + + priv->original_clk =clk_get_parent (cpu_root); + ret =clk_set_parent (cpu_root, osc); +clk_put (osc); + }else if (action ==POST_RATE_CHANGE ) { + ret =clk_set_parent (cpu_root, priv->original_clk); + } + +return notifier_from_errno (ret); +} +static int __init jh7110_syscrg_probe (struct platform_device *pdev) {struct jh71x0_clk_priv *priv;
@@ -413,7 +439,10 @@ static int __init jh7110_syscrg_probe(struct platform_device *pdev)if (IS_ERR (priv->pll[0 ]))return PTR_ERR (priv->pll[0 ]); }else { -clk_put (pllclk); + priv->pll_clk_nb.notifier_call = jh7110_pll0_clk_notifier_cb; + ret =clk_notifier_register (pllclk, &priv->pll_clk_nb); +if (ret) +return ret; priv->pll[0 ] =NULL ; }
drivers/clk/starfive/clk-starfive-jh71x0.h +2 -0
@@ -114,6 +114,8 @@ struct jh71x0_clk_priv {spinlock_t rmw_lock;struct device *dev;void __iomem *base; +struct clk *original_clk; +struct notifier_block pll_clk_nb;struct clk_hw *pll[3 ];struct jh71x0_clk reg[]; };
Signature · 1 line
2.46.0
Greg Kroah-Hartman
maintainerPATCH 33/269 clk: qcom: clk-alpha-pll: Fix the pll post div mask
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Satya Priya Kakitapalli <[email protected]>
commit 2c4553e6c485a96b5d86989eb9654bf20e51e6dd upstream.
The PLL_POST_DIV_MASK should be 0 to (width - 1) bits. Fix it.
--- drivers/clk/qcom/clk-alpha-pll.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/clk-alpha-pll.c +1 -1
@@ -40,7 +40,7 @@#define PLL_USER_CTL (p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL])# define PLL_POST_DIV_SHIFT 8 -# define PLL_POST_DIV_MASK (p) GENMASK((p)->width, 0) +# define PLL_POST_DIV_MASK (p) GENMASK((p)->width - 1, 0)# define PLL_ALPHA_EN BIT(24)# define PLL_ALPHA_MODE BIT(25)# define PLL_VCO_SHIFT 20
Greg Kroah-Hartman
maintainerPATCH 34/269 clk: qcom: clk-alpha-pll: Fix the trion pll postdiv set rate API
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Satya Priya Kakitapalli <[email protected]>
commit 4ad1ed6ef27cab94888bb3c740c14042d5c0dff2 upstream.
Correct the pll postdiv shift used in clk_trion_pll_postdiv_set_rate API. The shift value is not same for different types of plls and should be taken from the pll's .post_div_shift member.
--- drivers/clk/qcom/clk-alpha-pll.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/qcom/clk-alpha-pll.c +2 -2
@@ -1478,8 +1478,8 @@ clk_trion_pll_postdiv_set_rate(struct cl }return regmap_update_bits (regmap,PLL_USER_CTL (pll), -PLL_POST_DIV_MASK (pll) <<PLL_POST_DIV_SHIFT , - val <<PLL_POST_DIV_SHIFT ); +PLL_POST_DIV_MASK (pll) << pll->post_div_shift, + val << pll->post_div_shift); }const struct clk_ops clk_alpha_pll_postdiv_trion_ops = {
Greg Kroah-Hartman
maintainerPATCH 35/269 clk: qcom: clk-alpha-pll: Fix zonda set_rate failure when PLL is disabled
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Satya Priya Kakitapalli <[email protected]>
commit 85e8ee59dfde1a7b847fbed0778391392cd985cb upstream.
Currently, clk_zonda_pll_set_rate polls for the PLL to lock even if the PLL is disabled. However, if the PLL is disabled then LOCK_DET will never assert and we'll return an error. There is no reason to poll LOCK_DET if the PLL is already disabled, so skip polling in this case.
--- drivers/clk/qcom/clk-alpha-pll.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/clk/qcom/clk-alpha-pll.c +3 -0
@@ -2062,6 +2062,9 @@ static int clk_zonda_pll_set_rate(structregmap_write (pll->clkr.regmap,PLL_ALPHA_VAL (pll), a);regmap_write (pll->clkr.regmap,PLL_L_VAL (pll), l); +if (!clk_hw_is_enabled (hw)) +return 0 ; +/* Wait before polling for the frequency latch */ udelay (5 );
Greg Kroah-Hartman
maintainerPATCH 36/269 clk: qcom: clk-alpha-pll: Update set_rate for Zonda PLL
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Satya Priya Kakitapalli <[email protected]>
commit f4973130d255dd4811006f5822d4fa4d0de9d712 upstream.
The Zonda PLL has a 16 bit signed alpha and in the cases where the alpha value is greater than 0.5, the L value needs to be adjusted accordingly. Thus update the logic to handle the signed alpha val.
--- drivers/clk/qcom/clk-alpha-pll.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/clk/qcom/clk-alpha-pll.c +16 -0
@@ -41,6 +41,7 @@#define PLL_USER_CTL (p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL])# define PLL_POST_DIV_SHIFT 8# define PLL_POST_DIV_MASK (p) GENMASK((p)->width - 1, 0) +# define PLL_ALPHA_MSB BIT(15)# define PLL_ALPHA_EN BIT(24)# define PLL_ALPHA_MODE BIT(25)# define PLL_VCO_SHIFT 20
@@ -2043,6 +2044,18 @@ static void clk_zonda_pll_disable(structregmap_write (regmap,PLL_OPMODE (pll),0x0 ); } +static void zonda_pll_adjust_l_val (unsigned long rate,unsigned long prate,u32 *l) +{ +u64 remainder, quotient; + + quotient = rate; + remainder =do_div (quotient, prate); + *l = quotient; + +if ((remainder *2 ) / prate) + *l = *l +1 ; +} +static int clk_zonda_pll_set_rate (struct clk_hw *hw,unsigned long rate,unsigned long prate) {
@@ -2059,6 +2072,9 @@ static int clk_zonda_pll_set_rate(structif (ret <0 )return ret; +if (a &PLL_ALPHA_MSB ) +zonda_pll_adjust_l_val (rate, prate, &l); +regmap_write (pll->clkr.regmap,PLL_ALPHA_VAL (pll), a);regmap_write (pll->clkr.regmap,PLL_L_VAL (pll), l);
Greg Kroah-Hartman
maintainerPATCH 37/269 can: mcp251x: fix deadlock if an interrupt occurs during mcp251x_open
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Arlott <[email protected]>
commit 7dd9c26bd6cf679bcfdef01a8659791aa6487a29 upstream.
The mcp251x_hw_wake() function is called with the mpc_lock mutex held and disables the interrupt handler so that no interrupts can be processed while waking the device. If an interrupt has already occurred then waiting for the interrupt handler to complete will deadlock because it will be trying to acquire the same mutex.
CPU0 CPU1
---- ----mcp251x_open()
mutex_lock(&priv->mcp_lock)
request_threaded_irq()
<interrupt>
mcp251x_can_ist()
mutex_lock(&priv->mcp_lock) mcp251x_hw_wake()
disable_irq() <-- deadlock
Use disable_irq_nosync() instead because the interrupt handler does everything while holding the mutex so it doesn't matter if it's still running.
--- drivers/net/can/spi/mcp251x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/can/spi/mcp251x.c +1 -1
@@ -753,7 +753,7 @@ static int mcp251x_hw_wake(struct spi_deint ret;/* Force wakeup interrupt to wake device, but don't execute IST */ -disable_irq (spi->irq); +disable_irq_nosync (spi->irq);mcp251x_write_2regs (spi,CANINTE ,CANINTE_WAKIE ,CANINTF_WAKIF );/* Wait for oscillator startup timer after wake up */
Greg Kroah-Hartman
maintainerPATCH 38/269 kexec_file: fix elfcorehdr digest exclusion when CONFIG_CRASH_HOTPLUG=y
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Tesarik <[email protected]>
commit 6dacd79d28842ff01f18b4900d897741aac5999e upstream.
Fix the condition to exclude the elfcorehdr segment from the SHA digest calculation.
The j iterator is an index into the output sha_regions[] array, not into the input image->segment[] array. Once it reaches image->elfcorehdr_index, all subsequent segments are excluded. Besides, if the purgatory segment precedes the elfcorehdr segment, the elfcorehdr may be wrongly included in the calculation.
--- kernel/kexec_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/kexec_file.c +1 -1
@@ -728,7 +728,7 @@ static int kexec_calculate_store_digests#ifdef CONFIG_CRASH_HOTPLUG /* Exclude elfcorehdr segment to allow future changes via hotplug */ -if (j == image->elfcorehdr_index) +if (i == image->elfcorehdr_index)continue ;#endif
Greg Kroah-Hartman
maintainerPATCH 39/269 mm: vmalloc: ensure vmap_block is initialised before adding to queue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
commit 3e3de7947c751509027d26b679ecd243bc9db255 upstream.
Commit 8c61291fd850 ("mm: fix incorrect vbq reference in purge_fragmented_block") extended the 'vmap_block' structure to contain a 'cpu' field which is set at allocation time to the id of the initialising CPU.
When a new 'vmap_block' is being instantiated by new_vmap_block(), the partially initialised structure is added to the local 'vmap_block_queue' xarray before the 'cpu' field has been initialised. If another CPU is concurrently walking the xarray (e.g. via vm_unmap_aliases()), then it may perform an out-of-bounds access to the remote queue thanks to an uninitialised index.
This has been observed as UBSAN errors in Android:
| Internal error: UBSAN: array index out of bounds: 00000000f2005512 [#1] PREEMPT SMP | | Call trace: | purge_fragmented_block+0x204/0x21c | _vm_unmap_aliases+0x170/0x378 | vm_unmap_aliases+0x1c/0x28 | change_memory_common+0x1dc/0x26c | set_memory_ro+0x18/0x24 | module_enable_ro+0x98/0x238 | do_init_module+0x1b0/0x310
Move the initialisation of 'vb->cpu' in new_vmap_block() ahead of the addition to the xarray.
--- mm/vmalloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/vmalloc.c +1 -1
@@ -2066,6 +2066,7 @@ static void *new_vmap_block(unsigned int vb->dirty_max =0 ;bitmap_set (vb->used_map,0 , (1UL << order));INIT_LIST_HEAD (&vb->free_list); + vb->cpu =raw_smp_processor_id (); xa =addr_to_vb_xa (va->va_start); vb_idx =addr_to_vb_idx (va->va_start);
@@ -2082,7 +2083,6 @@ static void *new_vmap_block(unsigned int* integrity together with list_for_each_rcu from read * side. */ - vb->cpu =raw_smp_processor_id (); vbq =per_cpu_ptr (&vmap_block_queue, vb->cpu);spin_lock (&vbq->lock);list_add_tail_rcu (&vb->free_list, &vbq->free);
Greg Kroah-Hartman
maintainerPATCH 40/269 spi: rockchip: Resolve unbalanced runtime PM / system PM handling
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Norris <[email protected]>
commit be721b451affbecc4ba4eaac3b71cdbdcade1b1b upstream.
Commit e882575efc77 ("spi: rockchip: Suspend and resume the bus during NOIRQ_SYSTEM_SLEEP_PM ops") stopped respecting runtime PM status and simply disabled clocks unconditionally when suspending the system. This causes problems when the device is already runtime suspended when we go to sleep -- in which case we double-disable clocks and produce a WARNing.
Switch back to pm_runtime_force_{suspend,resume}(), because that still seems like the right thing to do, and the aforementioned commit makes no explanation why it stopped using it.
Also, refactor some of the resume() error handling, because it's not actually a good idea to re-disable clocks on failure.
--- drivers/spi/spi-rockchip.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-)
drivers/spi/spi-rockchip.c +7 -16
@@ -974,14 +974,16 @@ static int rockchip_spi_suspend(struct d {int ret;struct spi_controller *ctlr =dev_get_drvdata (dev); -struct rockchip_spi *rs =spi_controller_get_devdata (ctlr); ret =spi_controller_suspend (ctlr);if (ret <0 )return ret; -clk_disable_unprepare (rs->spiclk); -clk_disable_unprepare (rs->apb_pclk); + ret =pm_runtime_force_suspend (dev); +if (ret <0 ) { +spi_controller_resume (ctlr); +return ret; + }pinctrl_pm_select_sleep_state (dev);
@@ -992,25 +994,14 @@ static int rockchip_spi_resume(struct de {int ret;struct spi_controller *ctlr =dev_get_drvdata (dev); -struct rockchip_spi *rs =spi_controller_get_devdata (ctlr);pinctrl_pm_select_default_state (dev); - ret =clk_prepare_enable (rs->apb_pclk); + ret =pm_runtime_force_resume (dev);if (ret <0 )return ret; - ret =clk_prepare_enable (rs->spiclk); -if (ret <0 ) -clk_disable_unprepare (rs->apb_pclk); - - ret =spi_controller_resume (ctlr); -if (ret <0 ) { -clk_disable_unprepare (rs->spiclk); -clk_disable_unprepare (rs->apb_pclk); - } - -return 0 ; +return spi_controller_resume (ctlr); }#endif /* CONFIG_PM_SLEEP */
Greg Kroah-Hartman
maintainerPATCH 41/269 tracing/osnoise: Use a cpumask to know what threads are kthreads
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit 177e1cc2f41235c145041eed03ef5bab18f32328 upstream.
The start_kthread() and stop_thread() code was not always called with the interface_lock held. This means that the kthread variable could be unexpectedly changed causing the kthread_stop() to be called on it when it should not have been, leading to:
while true; do
rtla timerlat top -u -q & PID=$!;
sleep 5;
kill -INT $PID;
sleep 0.001;
kill -TERM $PID;
wait $PID;
done
Causing the following OOPS:
Oops: general protection fault, probably for non-canonical address 0xdffffc0000000002: 0000 [#1] PREEMPT SMP KASAN PTI KASAN: null-ptr-deref in range [0x0000000000000010-0x0000000000000017] CPU: 5 UID: 0 PID: 885 Comm: timerlatu/5 Not tainted 6.11.0-rc4-test-00002-gbc754cc76d1b-dirty #125 a533010b71dab205ad2f507188ce8c82203b0254 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 RIP: 0010:hrtimer_active+0x58/0x300 Code: 48 c1 ee 03 41 54 48 01 d1 48 01 d6 55 53 48 83 ec 20 80 39 00 0f 85 30 02 00 00 49 8b 6f 30 4c 8d 75 10 4c 89 f0 48 c1 e8 03 <0f> b6 3c 10 4c 89 f0 83 e0 07 83 c0 03 40 38 f8 7c 09 40 84 ff 0f RSP: 0018:ffff88811d97f940 EFLAGS: 00010202 RAX: 0000000000000002 RBX: ffff88823c6b5b28 RCX: ffffed10478d6b6b RDX: dffffc0000000000 RSI: ffffed10478d6b6c RDI: ffff88823c6b5b28 RBP: 0000000000000000 R08: ffff88823c6b5b58 R09: ffff88823c6b5b60 R10: ffff88811d97f957 R11: 0000000000000010 R12: 00000000000a801d R13: ffff88810d8b35d8 R14: 0000000000000010 R15: ffff88823c6b5b28 FS: 0000000000000000(0000) GS:ffff88823c680000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000561858ad7258 CR3: 000000007729e001 CR4: 0000000000170ef0 Call Trace: <TASK> ? die_addr+0x40/0xa0 ? exc_general_protection+0x154/0x230 ? asm_exc_general_protection+0x26/0x30 ? hrtimer_active+0x58/0x300 ? __pfx_mutex_lock+0x10/0x10 ? __pfx_locks_remove_file+0x10/0x10 hrtimer_cancel+0x15/0x40 timerlat_fd_release+0x8e/0x1f0 ? security_file_release+0x43/0x80 __fput+0x372/0xb10 task_work_run+0x11e/0x1f0 ? _raw_spin_lock+0x85/0xe0 ? __pfx_task_work_run+0x10/0x10 ? poison_slab_object+0x109/0x170 ? do_exit+0x7a0/0x24b0 do_exit+0x7bd/0x24b0 ? __pfx_migrate_enable+0x10/0x10 ? __pfx_do_exit+0x10/0x10 ? __pfx_read_tsc+0x10/0x10 ? ktime_get+0x64/0x140 ? _raw_spin_lock_irq+0x86/0xe0 do_group_exit+0xb0/0x220 get_signal+0x17ba/0x1b50 ? vfs_read+0x179/0xa40 ? timerlat_fd_read+0x30b/0x9d0 ? __pfx_get_signal+0x10/0x10 ? __pfx_timerlat_fd_read+0x10/0x10 arch_do_signal_or_restart+0x8c/0x570 ? __pfx_arch_do_signal_or_restart+0x10/0x10 ? vfs_read+0x179/0xa40 ? ksys_read+0xfe/0x1d0 ? __pfx_ksys_read+0x10/0x10 syscall_exit_to_user_mode+0xbc/0x130 do_syscall_64+0x74/0x110 ? __pfx___rseq_handle_notify_resume+0x10/0x10 ? __pfx_ksys_read+0x10/0x10 ? fpregs_restore_userregs+0xdb/0x1e0 ? fpregs_restore_userregs+0xdb/0x1e0 ? syscall_exit_to_user_mode+0x116/0x130 ? do_syscall_64+0x74/0x110 ? do_syscall_64+0x74/0x110 ? do_syscall_64+0x74/0x110 entry_SYSCALL_64_after_hwframe+0x71/0x79 RIP: 0033:0x7ff0070eca9c Code: Unable to access opcode bytes at 0x7ff0070eca72. RSP: 002b:00007ff006dff8c0 EFLAGS: 00000246 ORIG_RAX: 0000000000000000 RAX: 0000000000000000 RBX: 0000000000000005 RCX: 00007ff0070eca9c RDX: 0000000000000400 RSI: 00007ff006dff9a0 RDI: 0000000000000003 RBP: 00007ff006dffde0 R08: 0000000000000000 R09: 00007ff000000ba0 R10: 00007ff007004b08 R11: 0000000000000246 R12: 0000000000000003 R13: 00007ff006dff9a0 R14: 0000000000000007 R15: 0000000000000008 </TASK> Modules linked in: snd_hda_intel snd_intel_dspcfg snd_intel_sdw_acpi snd_hda_codec snd_hwdep snd_hda_core ---[ end trace 0000000000000000 ]---
This is because it would mistakenly call kthread_stop() on a user space thread making it "exit" before it actually exits.
Since kthreads are created based on global behavior, use a cpumask to know when kthreads are running and that they need to be shutdown before proceeding to do new work.
This was debugged by using the persistent ring buffer:
Note, locking was originally used to fix this, but that proved to cause too many deadlocks to work around:
https://lore.kernel.org/linux-trace-kernel/[email protected]/
--- kernel/trace/trace_osnoise.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
kernel/trace/trace_osnoise.c +15 -3
@@ -1612,6 +1612,7 @@ static int run_osnoise(void)static struct cpumask osnoise_cpumask;static struct cpumask save_cpumask; +static struct cpumask kthread_cpumask;/* * osnoise_sleep - sleep until the next period
@@ -1675,6 +1676,7 @@ static inline int osnoise_migration_pending(void)*/ mutex_lock (&interface_lock);this_cpu_osn_var ()->kthread =NULL ; +cpumask_clear_cpu (smp_processor_id (), &kthread_cpumask);mutex_unlock (&interface_lock);return 1 ;
@@ -1947,9 +1949,10 @@ static void stop_kthread(unsigned int cpu) kthread =per_cpu (per_cpu_osnoise_var, cpu).kthread;if (kthread) { -if (test_bit (OSN_WORKLOAD , &osnoise_options)) { +if (cpumask_test_and_clear_cpu (cpu, &kthread_cpumask) && + !WARN_ON (!test_bit (OSN_WORKLOAD , &osnoise_options))) {kthread_stop (kthread); - }else { + }else if (!WARN_ON (test_bit (OSN_WORKLOAD , &osnoise_options))) {/* * This is a user thread waiting on the timerlat_fd. We need * to close all users, and the best way to guarantee this is
@@ -2021,6 +2024,7 @@ static int start_kthread(unsigned int cpu) }per_cpu (per_cpu_osnoise_var, cpu).kthread = kthread; +cpumask_set_cpu (cpu, &kthread_cpumask);return 0 ; }
@@ -2048,8 +2052,16 @@ static int start_per_cpu_kthreads(void)*/ cpumask_and (current_mask, cpu_online_mask, &osnoise_cpumask); -for_each_possible_cpu (cpu) +for_each_possible_cpu (cpu) { +if (cpumask_test_and_clear_cpu (cpu, &kthread_cpumask)) { +struct task_struct *kthread; + + kthread =per_cpu (per_cpu_osnoise_var, cpu).kthread; +if (!WARN_ON (!kthread)) +kthread_stop (kthread); + }per_cpu (per_cpu_osnoise_var, cpu).kthread =NULL ; + }for_each_cpu (cpu, current_mask) { retval =start_kthread (cpu);
Signature · 1 line
2.46.0
Greg Kroah-Hartman
maintainerPATCH 42/269 tracing/timerlat: Only clear timer if a kthread exists
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit e6a53481da292d970d1edf0d8831121d1c5e2f0d upstream.
The timerlat tracer can use user space threads to check for osnoise and timer latency. If the program using this is killed via a SIGTERM, the threads are shutdown one at a time and another tracing instance can start up resetting the threads before they are fully closed. That causes the hrtimer assigned to the kthread to be shutdown and freed twice when the dying thread finally closes the file descriptors, causing a use-after-free bug.
Only cancel the hrtimer if the associated thread is still around. Also add the interface_lock around the resetting of the tlat_var->kthread.
Note, this is just a quick fix that can be backported to stable. A real fix is to have a better synchronization between the shutdown of old threads and the starting of new ones.
--- kernel/trace/trace_osnoise.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
kernel/trace/trace_osnoise.c +13 -6
@@ -252,6 +252,11 @@ static inline struct timerlat_variables *this_cpu_tmr_var(void)return this_cpu_ptr (&per_cpu_timerlat_var); } +/* +* Protect the interface. +*/ +static struct mutex interface_lock; +/* * tlat_var_reset - Reset the values of the given timerlat_variables */
@@ -259,14 +264,20 @@ static inline void tlat_var_reset(void) {struct timerlat_variables *tlat_var;int cpu; + +/* Synchronize with the timerlat interfaces */ +mutex_lock (&interface_lock);/* * So far, all the values are initialized as 0, so * zeroing the structure is perfect. */ for_each_cpu (cpu, cpu_online_mask) { tlat_var =per_cpu_ptr (&per_cpu_timerlat_var, cpu); +if (tlat_var->kthread) +hrtimer_cancel (&tlat_var->timer);memset (tlat_var,0 ,sizeof (*tlat_var)); } +mutex_unlock (&interface_lock); }#else /* CONFIG_TIMERLAT_TRACER */ #define tlat_var_reset () do {} while (0)
@@ -331,11 +342,6 @@ struct timerlat_sample { };#endif -/* -* Protect the interface. -*/ -static struct mutex interface_lock; -/* * Tracer data. */
@@ -2591,7 +2597,8 @@ static int timerlat_fd_release(struct inode *inode, struct file *file) osn_var =per_cpu_ptr (&per_cpu_osnoise_var, cpu); tlat_var =per_cpu_ptr (&per_cpu_timerlat_var, cpu); -hrtimer_cancel (&tlat_var->timer); +if (tlat_var->kthread) +hrtimer_cancel (&tlat_var->timer);memset (tlat_var,0 ,sizeof (*tlat_var)); osn_var->sampling =0 ;
Signature · 1 line
2.46.0
Greg Kroah-Hartman
maintainerPATCH 43/269 tracing: Avoid possible softlockup in tracing_iter_reset()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zheng Yejian <[email protected]>
commit 49aa8a1f4d6800721c7971ed383078257f12e8f9 upstream.
In __tracing_open(), when max latency tracers took place on the cpu, the time start of its buffer would be updated, then event entries with timestamps being earlier than start of the buffer would be skipped (see tracing_iter_reset()).
Softlockup will occur if the kernel is non-preemptible and too many entries were skipped in the loop that reset every cpu buffer, so add cond_resched() to avoid it.
--- kernel/trace/trace.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/trace/trace.c +2 -0
@@ -4156,6 +4156,8 @@ void tracing_iter_reset(struct trace_itebreak ; entries++;ring_buffer_iter_advance (buf_iter); +/* This could be a big loop */ +cond_resched (); }per_cpu_ptr (iter->array_buffer->data, cpu)->skipped_entries = entries;
Greg Kroah-Hartman
maintainerPATCH 44/269 tracing/timerlat: Add interface_lock around clearing of kthread in stop_kthread()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit 5bfbcd1ee57b607fd29e4645c7f350dd385dd9ad upstream.
The timerlat interface will get and put the task that is part of the "kthread" field of the osn_var to keep it around until all references are released. But here's a race in the "stop_kthread()" code that will call put_task_struct() on the kthread if it is not a kernel thread. This can race with the releasing of the references to that task struct and the put_task_struct() can be called twice when it should have been called just once.
Take the interface_lock() in stop_kthread() to synchronize this change. But to do so, the function stop_per_cpu_kthreads() needs to change the loop from for_each_online_cpu() to for_each_possible_cpu() and remove the cpu_read_lock(), as the interface_lock can not be taken while the cpu locks are held. The only side effect of this change is that it may do some extra work, as the per_cpu variables of the offline CPUs would not be set anyway, and would simply be skipped in the loop.
Remove unneeded "return;" in stop_kthread().
--- kernel/trace/trace_osnoise.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
kernel/trace/trace_osnoise.c +6 -7
@@ -1953,8 +1953,12 @@ static void stop_kthread(unsigned int cpu) {struct task_struct *kthread; +mutex_lock (&interface_lock); kthread =per_cpu (per_cpu_osnoise_var, cpu).kthread;if (kthread) { +per_cpu (per_cpu_osnoise_var, cpu).kthread =NULL ; +mutex_unlock (&interface_lock); +if (cpumask_test_and_clear_cpu (cpu, &kthread_cpumask) && !WARN_ON (!test_bit (OSN_WORKLOAD , &osnoise_options))) {kthread_stop (kthread);
@@ -1967,8 +1971,8 @@ static void stop_kthread(unsigned int cpu)kill_pid (kthread->thread_pid,SIGKILL ,1 );put_task_struct (kthread); } -per_cpu (per_cpu_osnoise_var, cpu).kthread =NULL ; }else { +mutex_unlock (&interface_lock);/* if no workload, just return */ if (!test_bit (OSN_WORKLOAD , &osnoise_options)) {/*
@@ -1976,7 +1980,6 @@ static void stop_kthread(unsigned int cpu)*/ per_cpu (per_cpu_osnoise_var, cpu).sampling = false;barrier (); -return ; } } }
@@ -1991,12 +1994,8 @@ static void stop_per_cpu_kthreads(void) {int cpu; -cpus_read_lock (); - -for_each_online_cpu (cpu) +for_each_possible_cpu (cpu)stop_kthread (cpu); - -cpus_read_unlock (); }/*
Signature · 1 line
2.46.0
Greg Kroah-Hartman
maintainerPATCH 45/269 userfaultfd: dont BUG_ON() if khugepaged yanks our page table
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jann Horn <[email protected]>
commit 4828d207dc5161dc7ddf9a4f6dcfd80c7dd7d20a upstream.
Since khugepaged was changed to allow retracting page tables in file mappings without holding the mmap lock, these BUG_ON()s are wrong - get rid of them.
We could also remove the preceding "if (unlikely(...))" block, but then we could reach pte_offset_map_lock() with transhuge pages not just for file mappings but also for anonymous mappings - which would probably be fine but I think is not necessarily expected.
--- mm/userfaultfd.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
mm/userfaultfd.c +4 -3
@@ -717,9 +717,10 @@ retry: err = -EFAULT ;break ; } - -BUG_ON (pmd_none (*dst_pmd)); -BUG_ON (pmd_trans_huge (*dst_pmd)); +/* +* For shmem mappings, khugepaged is allowed to remove page +* tables under us; pte_offset_map_lock() will deal with that. +*/ err =mfill_atomic_pte (dst_pmd, dst_vma, dst_addr, src_addr, flags, &folio);
Greg Kroah-Hartman
maintainerPATCH 46/269 userfaultfd: fix checks for huge PMDs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jann Horn <[email protected]>
commit 71c186efc1b2cf1aeabfeff3b9bd5ac4c5ac14d8 upstream.
Patch series "userfaultfd: fix races around pmd_trans_huge() check", v2.
The pmd_trans_huge() code in mfill_atomic() is wrong in three different ways depending on kernel version:
1. The pmd_trans_huge() check is racy and can lead to a BUG_ON() (if you hit the right two race windows) - I've tested this in a kernel build with some extra mdelay() calls. See the commit message for a description of the race scenario.
On older kernels (before 6.5), I think the same bug can even theoretically lead to accessing transhuge page contents as a page table if you hit the right 5 narrow race windows (I haven't tested this case).
2. As pointed out by Qi Zheng, pmd_trans_huge() is not sufficient for detecting PMDs that don't point to page tables.
On older kernels (before 6.5), you'd just have to win a single fairly wide race to hit this.
I've tested this on 6.1 stable by racing migration (with a mdelay() patched into try_to_migrate()) against UFFDIO_ZEROPAGE - on my x86 VM, that causes a kernel oops in ptlock_ptr().
3. On newer kernels (>=6.5), for shmem mappings, khugepaged is allowed to yank page tables out from under us (though I haven't tested that), so I think the BUG_ON() checks in mfill_atomic() are just wrong.
I decided to write two separate fixes for these (one fix for bugs 1+2, one fix for bug 3), so that the first fix can be backported to kernels affected by bugs 1+2.
This patch (of 2):
This fixes two issues.
I discovered that the following race can occur:
mfill_atomic other thread
============ ============
<zap PMD>
pmdp_get_lockless() [reads none pmd]
<bail if trans_huge>
<if none:>
<pagefault creates transhuge zeropage>
__pte_alloc [no-op]
<zap PMD>
<bail if pmd_trans_huge(*dst_pmd)> BUG_ON(pmd_none(*dst_pmd))
I have experimentally verified this in a kernel with extra mdelay() calls; the BUG_ON(pmd_none(*dst_pmd)) triggers.
On kernels newer than commit 0d940a9b270b ("mm/pgtable: allow pte_offset_map[_lock]() to fail"), this can't lead to anything worse than a BUG_ON(), since the page table access helpers are actually designed to deal with page tables concurrently disappearing; but on older kernels (<=6.4), I think we could probably theoretically race past the two BUG_ON() checks and end up treating a hugepage as a page table.
The second issue is that, as Qi Zheng pointed out, there are other types of huge PMDs that pmd_trans_huge() can't catch: devmap PMDs and swap PMDs (in particular, migration PMDs).
On <=6.4, this is worse than the first issue: If mfill_atomic() runs on a PMD that contains a migration entry (which just requires winning a single, fairly wide race), it will pass the PMD to pte_offset_map_lock(), which assumes that the PMD points to a page table.
Breakage follows: First, the kernel tries to take the PTE lock (which will crash or maybe worse if there is no "struct page" for the address bits in the migration entry PMD - I think at least on X86 there usually is no corresponding "struct page" thanks to the PTE inversion mitigation, amd64 looks different).
If that didn't crash, the kernel would next try to write a PTE into what it wrongly thinks is a page table.
As part of fixing these issues, get rid of the check for pmd_trans_huge() before __pte_alloc() - that's redundant, we're going to have to check for that after the __pte_alloc() anyway.
Backport note: pmdp_get_lockless() is pmd_read_atomic() in older kernels.
--- mm/userfaultfd.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
mm/userfaultfd.c +12 -10
@@ -699,21 +699,23 @@ retry: } dst_pmdval =pmdp_get_lockless (dst_pmd); -/* -* If the dst_pmd is mapped as THP don't -* override it and just be strict. -*/ -if (unlikely (pmd_trans_huge (dst_pmdval))) { - err = -EEXIST ; -break ; - }if (unlikely (pmd_none (dst_pmdval)) &&unlikely (__pte_alloc (dst_mm, dst_pmd))) { err = -ENOMEM ;break ; } -/* If an huge pmd materialized from under us fail */ -if (unlikely (pmd_trans_huge (*dst_pmd))) { + dst_pmdval =pmdp_get_lockless (dst_pmd); +/* +* If the dst_pmd is THP don't override it and just be strict. +* (This includes the case where the PMD used to be THP and +* changed back to none after __pte_alloc().) +*/ +if (unlikely (!pmd_present (dst_pmdval) ||pmd_trans_huge (dst_pmdval) || +pmd_devmap (dst_pmdval))) { + err = -EEXIST ; +break ; + } +if (unlikely (pmd_bad (dst_pmdval))) { err = -EFAULT ;break ; }
Greg Kroah-Hartman
maintainerPATCH 47/269 fscache: delete fscache_cookie_lru_timer when fscache exits to avoid UAF
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baokun Li <[email protected]>
commit 72a6e22c604c95ddb3b10b5d3bb85b6ff4dbc34f upstream.
The fscache_cookie_lru_timer is initialized when the fscache module is inserted, but is not deleted when the fscache module is removed. If timer_reduce() is called before removing the fscache module, the fscache_cookie_lru_timer will be added to the timer list of the current cpu. Afterwards, a use-after-free will be triggered in the softIRQ after removing the fscache module, as follows:
==================================================================
BUG: unable to handle page fault for address: fffffbfff803c9e9 PF: supervisor read access in kernel mode PF: error_code(0x0000) - not-present page PGD 21ffea067 P4D 21ffea067 PUD 21ffe6067 PMD 110a7c067 PTE 0 Oops: Oops: 0000 [#1] PREEMPT SMP KASAN PTI CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Tainted: G W 6.11.0-rc3 #855 Tainted: [W]=WARN RIP: 0010:__run_timer_base.part.0+0x254/0x8a0 Call Trace: <IRQ> tmigr_handle_remote_up+0x627/0x810 __walk_groups.isra.0+0x47/0x140 tmigr_handle_remote+0x1fa/0x2f0 handle_softirqs+0x180/0x590 irq_exit_rcu+0x84/0xb0 sysvec_apic_timer_interrupt+0x6e/0x90 </IRQ> <TASK> asm_sysvec_apic_timer_interrupt+0x1a/0x20 RIP: 0010:default_idle+0xf/0x20 default_idle_call+0x38/0x60 do_idle+0x2b5/0x300 cpu_startup_entry+0x54/0x60 start_secondary+0x20d/0x280 common_startup_64+0x13e/0x148 </TASK> Modules linked in: [last unloaded: netfs] ==================================================================
Therefore delete fscache_cookie_lru_timer when removing the fscahe module.
--- fs/fscache/main.c | 1 + 1 file changed, 1 insertion(+)
fs/fscache/main.c +1 -0
@@ -114,6 +114,7 @@ static void __exit fscache_exit(void)kmem_cache_destroy (fscache_cookie_jar);fscache_proc_cleanup (); +timer_shutdown_sync (&fscache_cookie_lru_timer);destroy_workqueue (fscache_wq);pr_notice ("Unloaded\n" ); }
Greg Kroah-Hartman
maintainerPATCH 48/269 eventfs: Use list_del_rcu() for SRCU protected list variable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit d2603279c7d645bf0d11fa253b23f1ab48fc8d3c upstream.
Chi Zhiling reported:
We found a null pointer accessing in tracefs[1], the reason is that the variable 'ei_child' is set to LIST_POISON1, that means the list was removed in eventfs_remove_rec. so when access the ei_child->is_freed, the panic triggered.
by the way, the following script can reproduce this panic
loop1 (){
while true
do
echo "p:kp submit_bio" > /sys/kernel/debug/tracing/kprobe_events
echo "" > /sys/kernel/debug/tracing/kprobe_events
done
}
loop2 (){
while true
do
tree /sys/kernel/debug/tracing/events/kprobes/
done
}
loop1 &
loop2[1]:
[ 1147.959632][T17331] Unable to handle kernel paging request at virtual address dead000000000150 [ 1147.968239][T17331] Mem abort info: [ 1147.971739][T17331] ESR = 0x0000000096000004 [ 1147.976172][T17331] EC = 0x25: DABT (current EL), IL = 32 bits [ 1147.982171][T17331] SET = 0, FnV = 0 [ 1147.985906][T17331] EA = 0, S1PTW = 0 [ 1147.989734][T17331] FSC = 0x04: level 0 translation fault [ 1147.995292][T17331] Data abort info: [ 1147.998858][T17331] ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000 [ 1148.005023][T17331] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 1148.010759][T17331] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 1148.016752][T17331] [dead000000000150] address between user and kernel address ranges [ 1148.024571][T17331] Internal error: Oops: 0000000096000004 [#1] SMP [ 1148.030825][T17331] Modules linked in: team_mode_loadbalance team nlmon act_gact cls_flower sch_ingress bonding tls macvlan dummy ib_core bridge stp llc veth amdgpu amdxcp mfd_core gpu_sched drm_exec drm_buddy radeon crct10dif_ce video drm_suballoc_helper ghash_ce drm_ttm_helper sha2_ce ttm sha256_arm64 i2c_algo_bit sha1_ce sbsa_gwdt cp210x drm_display_helper cec sr_mod cdrom drm_kms_helper binfmt_misc sg loop fuse drm dm_mod nfnetlink ip_tables autofs4 [last unloaded: tls] [ 1148.072808][T17331] CPU: 3 PID: 17331 Comm: ls Tainted: G W ------- ---- 6.6.43 #2 [ 1148.081751][T17331] Source Version: 21b3b386e948bedd29369af66f3e98ab01b1c650 [ 1148.088783][T17331] Hardware name: Greatwall GW-001M1A-FTF/GW-001M1A-FTF, BIOS KunLun BIOS V4.0 07/16/2020 [ 1148.098419][T17331] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 1148.106060][T17331] pc : eventfs_iterate+0x2c0/0x398 [ 1148.111017][T17331] lr : eventfs_iterate+0x2fc/0x398 [ 1148.115969][T17331] sp : ffff80008d56bbd0 [ 1148.119964][T17331] x29: ffff80008d56bbf0 x28: ffff001ff5be2600 x27: 0000000000000000 [ 1148.127781][T17331] x26: ffff001ff52ca4e0 x25: 0000000000009977 x24: dead000000000100 [ 1148.135598][T17331] x23: 0000000000000000 x22: 000000000000000b x21: ffff800082645f10 [ 1148.143415][T17331] x20: ffff001fddf87c70 x19: ffff80008d56bc90 x18: 0000000000000000 [ 1148.151231][T17331] x17: 0000000000000000 x16: 0000000000000000 x15: ffff001ff52ca4e0 [ 1148.159048][T17331] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 [ 1148.166864][T17331] x11: 0000000000000000 x10: 0000000000000000 x9 : ffff8000804391d0 [ 1148.174680][T17331] x8 : 0000000180000000 x7 : 0000000000000018 x6 : 0000aaab04b92862 [ 1148.182498][T17331] x5 : 0000aaab04b92862 x4 : 0000000080000000 x3 : 0000000000000068 [ 1148.190314][T17331] x2 : 000000000000000f x1 : 0000000000007ea8 x0 : 0000000000000001 [ 1148.198131][T17331] Call trace: [ 1148.201259][T17331] eventfs_iterate+0x2c0/0x398 [ 1148.205864][T17331] iterate_dir+0x98/0x188 [ 1148.210036][T17331] __arm64_sys_getdents64+0x78/0x160 [ 1148.215161][T17331] invoke_syscall+0x78/0x108 [ 1148.219593][T17331] el0_svc_common.constprop.0+0x48/0xf0 [ 1148.224977][T17331] do_el0_svc+0x24/0x38 [ 1148.228974][T17331] el0_svc+0x40/0x168 [ 1148.232798][T17331] el0t_64_sync_handler+0x120/0x130 [ 1148.237836][T17331] el0t_64_sync+0x1a4/0x1a8 [ 1148.242182][T17331] Code: 54ffff6c f9400676 910006d6 f9000676 (b9405300) [ 1148.248955][T17331] ---[ end trace 0000000000000000 ]---
The issue is that list_del() is used on an SRCU protected list variable before the synchronization occurs. This can poison the list pointers while there is a reader iterating the list.
This is simply fixed by using list_del_rcu() that is specifically made for this purpose.
--- fs/tracefs/event_inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/tracefs/event_inode.c +1 -1
@@ -935,7 +935,7 @@ static void eventfs_remove_rec(struct evlist_for_each_entry (ei_child, &ei->children, list)eventfs_remove_rec (ei_child, level +1 ); -list_del (&ei->list); +list_del_rcu (&ei->list);free_ei (ei); }
Greg Kroah-Hartman
maintainerPATCH 49/269 net: mana: Fix error handling in mana_create_txq/rxqs NAPI cleanup
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Souradeep Chakrabarti <[email protected]>
commit b6ecc662037694488bfff7c9fd21c405df8411f2 upstream.
Currently napi_disable() gets called during rxq and txq cleanup, even before napi is enabled and hrtimer is initialized. It causes kernel panic.
? page_fault_oops+0x136/0x2b0 ? page_counter_cancel+0x2e/0x80 ? do_user_addr_fault+0x2f2/0x640 ? refill_obj_stock+0xc4/0x110 ? exc_page_fault+0x71/0x160 ? asm_exc_page_fault+0x27/0x30 ? __mmdrop+0x10/0x180 ? __mmdrop+0xec/0x180 ? hrtimer_active+0xd/0x50 hrtimer_try_to_cancel+0x2c/0xf0 hrtimer_cancel+0x15/0x30 napi_disable+0x65/0x90 mana_destroy_rxq+0x4c/0x2f0 mana_create_rxq.isra.0+0x56c/0x6d0 ? mana_uncfg_vport+0x50/0x50 mana_alloc_queues+0x21b/0x320 ? skb_dequeue+0x5f/0x80
--- drivers/net/ethernet/microsoft/mana/mana_en.c | 22 +++++++++++++--------- include/net/mana/mana.h | 2 ++ 2 files changed, 15 insertions(+), 9 deletions(-)
drivers/net/ethernet/microsoft/mana/mana_en.c +13 -9
@@ -1858,10 +1858,12 @@ static void mana_destroy_txq(struct manafor (i =0 ; i < apc->num_queues; i++) { napi = &apc->tx_qp[i].tx_cq.napi; -napi_synchronize (napi); -napi_disable (napi); -netif_napi_del (napi); - +if (apc->tx_qp[i].txq.napi_initialized) { +napi_synchronize (napi); +napi_disable (napi); +netif_napi_del (napi); + apc->tx_qp[i].txq.napi_initialized = false; + }mana_destroy_wq_obj (apc,GDMA_SQ , apc->tx_qp[i].tx_object);mana_deinit_cq (apc, &apc->tx_qp[i].tx_cq);
@@ -1917,6 +1919,7 @@ static int mana_create_txq(struct mana_p txq->ndev = net; txq->net_txq =netdev_get_tx_queue (net, i); txq->vp_offset = apc->tx_vp_offset; + txq->napi_initialized = false;skb_queue_head_init (&txq->pending_skbs);memset (&spec,0 ,sizeof (spec));
@@ -1983,6 +1986,7 @@ static int mana_create_txq(struct mana_pnetif_napi_add_tx (net, &cq->napi, mana_poll);napi_enable (&cq->napi); + txq->napi_initialized = true;mana_gd_ring_cq (cq->gdma_cq,SET_ARM_BIT ); }
@@ -1994,7 +1998,7 @@ out: }static void mana_destroy_rxq (struct mana_port_context *apc, -struct mana_rxq *rxq,bool validate_state) +struct mana_rxq *rxq,bool napi_initialized) {struct gdma_context *gc = apc->ac->gdma_dev->gdma_context;
@@ -2009,15 +2013,15 @@ static void mana_destroy_rxq(struct mana napi = &rxq->rx_cq.napi; -if (validate_state) +if (napi_initialized) {napi_synchronize (napi); -napi_disable (napi); +napi_disable (napi); +netif_napi_del (napi); + }xdp_rxq_info_unreg (&rxq->xdp_rxq); -netif_napi_del (napi); -mana_destroy_wq_obj (apc,GDMA_RQ , rxq->rxobj);mana_deinit_cq (apc, &rxq->rx_cq);
include/net/mana/mana.h +2 -0
@@ -97,6 +97,8 @@ struct mana_txq {atomic_t pending_sends; +bool napi_initialized; +struct mana_stats_tx stats; };
Greg Kroah-Hartman
maintainerPATCH 50/269 net: mctp-serial: Fix missing escapes on transmit
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Johnston <[email protected]>
commit f962e8361adfa84e8252d3fc3e5e6bb879f029b1 upstream.
0x7d and 0x7e bytes are meant to be escaped in the data portion of frames, but this didn't occur since next_chunk_len() had an off-by-one error. That also resulted in the final byte of a payload being written as a separate tty write op.
The chunk prior to an escaped byte would be one byte short, and the next call would never test the txpos+1 case, which is where the escaped byte was located. That meant it never hit the escaping case in mctp_serial_tx_work().
Example Input: 01 00 08 c8 7e 80 02
Previous incorrect chunks from next_chunk_len():
01 00 08
c8 7e 80
02
With this fix:
01 00 08 c8
7e
80 02
--- drivers/net/mctp/mctp-serial.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/mctp/mctp-serial.c +2 -2
@@ -91,8 +91,8 @@ static int next_chunk_len(struct mctp_se* will be those non-escaped bytes, and does not include the escaped * byte. */ -for (i =1 ; i + dev->txpos +1 < dev->txlen; i++) { -if (needs_escape (dev->txbuf[dev->txpos + i +1 ])) +for (i =1 ; i + dev->txpos < dev->txlen; i++) { +if (needs_escape (dev->txbuf[dev->txpos + i]))break ; }
Greg Kroah-Hartman
maintainerPATCH 51/269 x86/fpu: Avoid writing LBR bit to IA32_XSS unless supported
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mitchell Levy <[email protected]>
commit 2848ff28d180bd63a95da8e5dcbcdd76c1beeb7b upstream.
There are two distinct CPU features related to the use of XSAVES and LBR:
whether LBR is itself supported and whether XSAVES supports LBR. The LBR subsystem correctly checks both in intel_pmu_arch_lbr_init(), but the XSTATE subsystem does not.
The LBR bit is only removed from xfeatures_mask_independent when LBR is not supported by the CPU, but there is no validation of XSTATE support.
If XSAVES does not support LBR the write to IA32_XSS causes a #GP fault, leaving the state of IA32_XSS unchanged, i.e. zero. The fault is handled with a warning and the boot continues.
Consequently the next XRSTORS which tries to restore supervisor state fails with #GP because the RFBM has zero for all supervisor features, which does not match the XCOMP_BV field.
As XFEATURE_MASK_FPSTATE includes supervisor features setting up the FPU causes a #GP, which ends up in fpu_reset_from_exception_fixup(). That fails due to the same problem resulting in recursive #GPs until the kernel runs out of stack space and double faults.
Prevent this by storing the supported independent features in fpu_kernel_cfg during XSTATE initialization and use that cached value for retrieving the independent feature bits to be written into IA32_XSS.
[ tglx: Massaged change log ]
--- arch/x86/include/asm/fpu/types.h | 7 +++++++ arch/x86/kernel/fpu/xstate.c | 3 +++ arch/x86/kernel/fpu/xstate.h | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-)
arch/x86/include/asm/fpu/types.h +7 -0
@@ -589,6 +589,13 @@ struct fpu_state_config {* even without XSAVE support, i.e. legacy features FP + SSE */ u64 legacy_features; +/* +* @independent_features: +* +* Features that are supported by XSAVES, but not managed as part of +* the FPU core, such as LBR +*/ +u64 independent_features; };/* FPU state configuration information */
arch/x86/kernel/fpu/xstate.c +3 -0
@@ -788,6 +788,9 @@ void __init fpu__init_system_xstate(unsi goto out_disable; } + fpu_kernel_cfg.independent_features = fpu_kernel_cfg.max_features & +XFEATURE_MASK_INDEPENDENT ; +/* * Clear XSAVE features that are disabled in the normal CPUID. */
arch/x86/kernel/fpu/xstate.h +2 -2
@@ -64,9 +64,9 @@ static inline u64 xfeatures_mask_supervistatic inline u64 xfeatures_mask_independent (void ) {if (!cpu_feature_enabled (X86_FEATURE_ARCH_LBR )) -return XFEATURE_MASK_INDEPENDENT & ~XFEATURE_MASK_LBR ; +return fpu_kernel_cfg.independent_features & ~XFEATURE_MASK_LBR ; -return XFEATURE_MASK_INDEPENDENT ; +return fpu_kernel_cfg.independent_features; }/* XSAVE/XRSTOR wrapper functions */
Greg Kroah-Hartman
maintainerPATCH 52/269 x86/apic: Make x2apic_disable() work correctly
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuntao Wang <[email protected]>
commit 0ecc5be200c84e67114f3640064ba2bae3ba2f5a upstream.
x2apic_disable() clears x2apic_state and x2apic_mode unconditionally, even when the state is X2APIC_ON_LOCKED, which prevents the kernel to disable it thereby creating inconsistent state.
Due to the early state check for X2APIC_ON, the code path which warns about a locked X2APIC cannot be reached.
Test for state < X2APIC_ON instead and move the clearing of the state and mode variables to the place which actually disables X2APIC.
[ tglx: Massaged change log. Added Fixes tag. Moved clearing so it's at the
right place for back ports ]
--- arch/x86/kernel/apic/apic.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
arch/x86/kernel/apic/apic.c +6 -5
@@ -1812,12 +1812,9 @@ static __init void apic_set_fixmap(boolstatic __init void x2apic_disable (void ) { -u32 x2apic_id, state = x2apic_state; +u32 x2apic_id; - x2apic_mode =0 ; - x2apic_state =X2APIC_DISABLED ; - -if (state !=X2APIC_ON ) +if (x2apic_state <X2APIC_ON )return ; x2apic_id =read_apic_id ();
@@ -1830,6 +1827,10 @@ static __init void x2apic_disable(void) }__x2apic_disable (); + + x2apic_mode =0 ; + x2apic_state =X2APIC_DISABLED ; +/* * Don't reread the APIC ID as it was already done from * check_x2apic() and the APIC driver still is a x2APIC variant,
Greg Kroah-Hartman
maintainerPATCH 53/269 Revert "drm/amdgpu: align pp_power_profile_mode with kernel docs"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 1a8d845470941f1b6de1b392227530c097dc5e0c upstream.
This reverts commit 8f614469de248a4bc55fb07e55d5f4c340c75b11.
This breaks some manual setting of the profile mode in certain cases.
--- drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +4 -2
@@ -1883,7 +1883,8 @@ static int smu_adjust_power_state_dynami smu_dpm_ctx->dpm_level = level; } -if (smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM ) { +if (smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_MANUAL && + smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM ) { index =fls (smu->workload_mask); index = index >0 && index <=WORKLOAD_POLICY_MAX ? index -1 :0 ; workload[0 ] = smu->workload_setting[index];
@@ -1962,7 +1963,8 @@ static int smu_switch_power_profile(void workload[0 ] = smu->workload_setting[index]; } -if (smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM ) +if (smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_MANUAL && + smu_dpm_ctx->dpm_level !=AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM )smu_bump_power_profile_mode (smu, workload,0 );return 0 ;
Greg Kroah-Hartman
maintainerPATCH 54/269 tcp_bpf: fix return value of tcp_bpf_sendmsg()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
commit fe1910f9337bd46a9343967b547ccab26b4b2c6e upstream.
When we cork messages in psock->cork, the last message triggers the flushing will result in sending a sk_msg larger than the current message size. In this case, in tcp_bpf_send_verdict(), 'copied' becomes negative at least in the following case:
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); // <==== HERE 473 return -EACCES;
Therefore, it could lead to the following BUG with a proper value of 'copied' (thanks to syzbot). We should not use negative 'copied' as a return value here.
------------[ cut here ]------------ kernel BUG at net/socket.c:733! Internal error: Oops - BUG: 00000000f2000800 [#1] PREEMPT SMP Modules linked in: CPU: 0 UID: 0 PID: 3265 Comm: syz-executor510 Not tainted 6.11.0-rc3-syzkaller-00060-gd07b43284ab3 #0 Hardware name: linux,dummy-virt (DT) pstate: 61400009 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--) pc : sock_sendmsg_nosec net/socket.c:733 [inline] pc : sock_sendmsg_nosec net/socket.c:728 [inline] pc : __sock_sendmsg+0x5c/0x60 net/socket.c:745 lr : sock_sendmsg_nosec net/socket.c:730 [inline] lr : __sock_sendmsg+0x54/0x60 net/socket.c:745 sp : ffff800088ea3b30 x29: ffff800088ea3b30 x28: fbf00000062bc900 x27: 0000000000000000 x26: ffff800088ea3bc0 x25: ffff800088ea3bc0 x24: 0000000000000000 x23: f9f00000048dc000 x22: 0000000000000000 x21: ffff800088ea3d90 x20: f9f00000048dc000 x19: ffff800088ea3d90 x18: 0000000000000001 x17: 0000000000000000 x16: 0000000000000000 x15: 000000002002ffaf x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: 0000000000000000 x10: ffff8000815849c0 x9 : ffff8000815b49c0 x8 : 0000000000000000 x7 : 000000000000003f x6 : 0000000000000000 x5 : 00000000000007e0 x4 : fff07ffffd239000 x3 : fbf00000062bc900 x2 : 0000000000000000 x1 : 0000000000000000 x0 : 00000000fffffdef Call trace: sock_sendmsg_nosec net/socket.c:733 [inline] __sock_sendmsg+0x5c/0x60 net/socket.c:745 ____sys_sendmsg+0x274/0x2ac net/socket.c:2597 ___sys_sendmsg+0xac/0x100 net/socket.c:2651 __sys_sendmsg+0x84/0xe0 net/socket.c:2680 __do_sys_sendmsg net/socket.c:2689 [inline] __se_sys_sendmsg net/socket.c:2687 [inline] __arm64_sys_sendmsg+0x24/0x30 net/socket.c:2687 __invoke_syscall arch/arm64/kernel/syscall.c:35 [inline] invoke_syscall+0x48/0x110 arch/arm64/kernel/syscall.c:49 el0_svc_common.constprop.0+0x40/0xe0 arch/arm64/kernel/syscall.c:132 do_el0_svc+0x1c/0x28 arch/arm64/kernel/syscall.c:151 el0_svc+0x34/0xec arch/arm64/kernel/entry-common.c:712 el0t_64_sync_handler+0x100/0x12c arch/arm64/kernel/entry-common.c:730 el0t_64_sync+0x19c/0x1a0 arch/arm64/kernel/entry.S:598 Code: f9404463 d63f0060 3108441f 54fffe81 (d4210000) ---[ end trace 0000000000000000 ]---
--- net/ipv4/tcp_bpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_bpf.c +1 -1
@@ -577,7 +577,7 @@ out_err: err =sk_stream_error (sk, msg->msg_flags, err);release_sock (sk);sk_psock_put (sk, psock); -return copied ? copied : err; +return copied >0 ? copied : err; }enum {
Greg Kroah-Hartman
maintainerPATCH 55/269 ila: call nf_unregister_net_hooks() sooner
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
commit 031ae72825cef43e4650140b800ad58bf7a6a466 upstream.
syzbot found an use-after-free Read in ila_nf_input [1]
Issue here is that ila_xlat_exit_net() frees the rhashtable, then call nf_unregister_net_hooks().
It should be done in the reverse way, with a synchronize_rcu().
This is a good match for a pre_exit() method.
[1]
BUG: KASAN: use-after-free in rht_key_hashfn include/linux/rhashtable.h:159 [inline]
BUG: KASAN: use-after-free in __rhashtable_lookup include/linux/rhashtable.h:604 [inline]
BUG: KASAN: use-after-free in rhashtable_lookup include/linux/rhashtable.h:646 [inline]
BUG: KASAN: use-after-free in rhashtable_lookup_fast+0x77a/0x9b0 include/linux/rhashtable.h:672
Read of size 4 at addr ffff888064620008 by task ksoftirqd/0/16
CPU: 0 UID: 0 PID: 16 Comm: ksoftirqd/0 Not tainted 6.11.0-rc4-syzkaller-00238-g2ad6d23f465a #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 08/06/2024
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:93 [inline]
dump_stack_lvl+0x241/0x360 lib/dump_stack.c:119
print_address_description mm/kasan/report.c:377 [inline]
print_report+0x169/0x550 mm/kasan/report.c:488
kasan_report+0x143/0x180 mm/kasan/report.c:601
rht_key_hashfn include/linux/rhashtable.h:159 [inline]
__rhashtable_lookup include/linux/rhashtable.h:604 [inline]
rhashtable_lookup include/linux/rhashtable.h:646 [inline]
rhashtable_lookup_fast+0x77a/0x9b0 include/linux/rhashtable.h:672
ila_lookup_wildcards net/ipv6/ila/ila_xlat.c:132 [inline]
ila_xlat_addr net/ipv6/ila/ila_xlat.c:652 [inline]
ila_nf_input+0x1fe/0x3c0 net/ipv6/ila/ila_xlat.c:190
nf_hook_entry_hookfn include/linux/netfilter.h:154 [inline]
nf_hook_slow+0xc3/0x220 net/netfilter/core.c:626
nf_hook include/linux/netfilter.h:269 [inline]
NF_HOOK+0x29e/0x450 include/linux/netfilter.h:312
__netif_receive_skb_one_core net/core/dev.c:5661 [inline]
__netif_receive_skb+0x1ea/0x650 net/core/dev.c:5775
process_backlog+0x662/0x15b0 net/core/dev.c:6108
__napi_poll+0xcb/0x490 net/core/dev.c:6772
napi_poll net/core/dev.c:6841 [inline]
net_rx_action+0x89b/0x1240 net/core/dev.c:6963
handle_softirqs+0x2c4/0x970 kernel/softirq.c:554
run_ksoftirqd+0xca/0x130 kernel/softirq.c:928
smpboot_thread_fn+0x544/0xa30 kernel/smpboot.c:164
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
</TASK>
The buggy address belongs to the physical page:
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x64620
flags: 0xfff00000000000(node=0|zone=1|lastcpupid=0x7ff)
page_type: 0xbfffffff(buddy)
raw: 00fff00000000000 ffffea0000959608 ffffea00019d9408 0000000000000000
raw: 0000000000000000 0000000000000003 00000000bfffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as freed
page last allocated via order 3, migratetype Unmovable, gfp_mask 0x52dc0(GFP_KERNEL|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_ZERO), pid 5242, tgid 5242 (syz-executor), ts 73611328570, free_ts 618981657187
set_page_owner include/linux/page_owner.h:32 [inline]
post_alloc_hook+0x1f3/0x230 mm/page_alloc.c:1493
prep_new_page mm/page_alloc.c:1501 [inline]
get_page_from_freelist+0x2e4c/0x2f10 mm/page_alloc.c:3439
__alloc_pages_noprof+0x256/0x6c0 mm/page_alloc.c:4695
__alloc_pages_node_noprof include/linux/gfp.h:269 [inline]
alloc_pages_node_noprof include/linux/gfp.h:296 [inline]
___kmalloc_large_node+0x8b/0x1d0 mm/slub.c:4103
__kmalloc_large_node_noprof+0x1a/0x80 mm/slub.c:4130
__do_kmalloc_node mm/slub.c:4146 [inline]
__kmalloc_node_noprof+0x2d2/0x440 mm/slub.c:4164
__kvmalloc_node_noprof+0x72/0x190 mm/util.c:650
bucket_table_alloc lib/rhashtable.c:186 [inline]
rhashtable_init_noprof+0x534/0xa60 lib/rhashtable.c:1071
ila_xlat_init_net+0xa0/0x110 net/ipv6/ila/ila_xlat.c:613
ops_init+0x359/0x610 net/core/net_namespace.c:139
setup_net+0x515/0xca0 net/core/net_namespace.c:343
copy_net_ns+0x4e2/0x7b0 net/core/net_namespace.c:508
create_new_namespaces+0x425/0x7b0 kernel/nsproxy.c:110
unshare_nsproxy_namespaces+0x124/0x180 kernel/nsproxy.c:228
ksys_unshare+0x619/0xc10 kernel/fork.c:3328
__do_sys_unshare kernel/fork.c:3399 [inline]
__se_sys_unshare kernel/fork.c:3397 [inline]
__x64_sys_unshare+0x38/0x40 kernel/fork.c:3397
page last free pid 11846 tgid 11846 stack trace:
reset_page_owner include/linux/page_owner.h:25 [inline]
free_pages_prepare mm/page_alloc.c:1094 [inline]
free_unref_page+0xd22/0xea0 mm/page_alloc.c:2612
__folio_put+0x2c8/0x440 mm/swap.c:128
folio_put include/linux/mm.h:1486 [inline]
free_large_kmalloc+0x105/0x1c0 mm/slub.c:4565
kfree+0x1c4/0x360 mm/slub.c:4588
rhashtable_free_and_destroy+0x7c6/0x920 lib/rhashtable.c:1169
ila_xlat_exit_net+0x55/0x110 net/ipv6/ila/ila_xlat.c:626
ops_exit_list net/core/net_namespace.c:173 [inline]
cleanup_net+0x802/0xcc0 net/core/net_namespace.c:640
process_one_work kernel/workqueue.c:3231 [inline]
process_scheduled_works+0xa2c/0x1830 kernel/workqueue.c:3312
worker_thread+0x86d/0xd40 kernel/workqueue.c:3390
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
Memory state around the buggy address:
ffff88806461ff00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff88806461ff80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>ffff888064620000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
^
ffff888064620080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ffff888064620100: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff--- net/ipv6/ila/ila.h | 1 + net/ipv6/ila/ila_main.c | 6 ++++++ net/ipv6/ila/ila_xlat.c | 13 +++++++++---- 3 files changed, 16 insertions(+), 4 deletions(-)
net/ipv6/ila/ila.h +1 -0
@@ -108,6 +108,7 @@ int ila_lwt_init(void);void ila_lwt_fini (void );int ila_xlat_init_net (struct net *net); +void ila_xlat_pre_exit_net (struct net *net);void ila_xlat_exit_net (struct net *net);int ila_xlat_nl_cmd_add_mapping (struct sk_buff *skb,struct genl_info *info);
net/ipv6/ila/ila_main.c +6 -0
@@ -71,6 +71,11 @@ ila_xlat_init_fail:return err; } +static __net_exit void ila_pre_exit_net(struct net *net) +{ +ila_xlat_pre_exit_net (net); +} + static __net_exit void ila_exit_net(struct net *net) {ila_xlat_exit_net (net);
@@ -78,6 +83,7 @@ static __net_exit void ila_exit_net(strustatic struct pernet_operations ila_net_ops = { .init = ila_init_net, + .pre_exit = ila_pre_exit_net, .exit = ila_exit_net, .id = &ila_net_id, .size =sizeof (struct ila_net ),
net/ipv6/ila/ila_xlat.c +9 -4
@@ -619,6 +619,15 @@ int ila_xlat_init_net(struct net *net)return 0 ; } +void ila_xlat_pre_exit_net (struct net *net) +{ +struct ila_net *ilan =net_generic (net, ila_net_id); + +if (ilan->xlat.hooks_registered) +nf_unregister_net_hooks (net, ila_nf_hook_ops, +ARRAY_SIZE (ila_nf_hook_ops)); +} +void ila_xlat_exit_net (struct net *net) {struct ila_net *ilan =net_generic (net, ila_net_id);
@@ -626,10 +635,6 @@ void ila_xlat_exit_net(struct net *net)rhashtable_free_and_destroy (&ilan->xlat.rhash_table, ila_free_cb,NULL );free_bucket_spinlocks (ilan->xlat.locks); - -if (ilan->xlat.hooks_registered) -nf_unregister_net_hooks (net, ila_nf_hook_ops, -ARRAY_SIZE (ila_nf_hook_ops)); }static int ila_xlat_addr (struct sk_buff *skb,bool sir2ila)
Greg Kroah-Hartman
maintainerPATCH 56/269 sched: sch_cake: fix bulk flow accounting logic for host fairness
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Toke Høiland-Jørgensen <[email protected]>
commit 546ea84d07e3e324644025e2aae2d12ea4c5896e upstream.
In sch_cake, we keep track of the count of active bulk flows per host, when running in dst/src host fairness mode, which is used as the round-robin weight when iterating through flows. The count of active bulk flows is updated whenever a flow changes state.
This has a peculiar interaction with the hash collision handling: when a hash collision occurs (after the set-associative hashing), the state of the hash bucket is simply updated to match the new packet that collided, and if host fairness is enabled, that also means assigning new per-host state to the flow. For this reason, the bulk flow counters of the host(s) assigned to the flow are decremented, before new state is assigned (and the counters, which may not belong to the same host anymore, are incremented again).
Back when this code was introduced, the host fairness mode was always enabled, so the decrement was unconditional. When the configuration flags were introduced the *increment* was made conditional, but the *decrement* was not. Which of course can lead to a spurious decrement (and associated wrap-around to U16_MAX).
AFAICT, when host fairness is disabled, the decrement and wrap-around happens as soon as a hash collision occurs (which is not that common in itself, due to the set-associative hashing). However, in most cases this is harmless, as the value is only used when host fairness mode is enabled. So in order to trigger an array overflow, sch_cake has to first be configured with host fairness disabled, and while running in this mode, a hash collision has to occur to cause the overflow. Then, the qdisc has to be reconfigured to enable host fairness, which leads to the array out-of-bounds because the wrapped-around value is retained and used as an array index. It seems that syzbot managed to trigger this, which is quite impressive in its own right.
This patch fixes the issue by introducing the same conditional check on decrement as is used on increment.
The original bug predates the upstreaming of cake, but the commit listed in the Fixes tag touched that code, meaning that this patch won't apply before that.
--- net/sched/sch_cake.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
net/sched/sch_cake.c +7 -4
@@ -786,12 +786,15 @@ skip_hash:* queue, accept the collision, update the host tags. */ q->way_collisions++; -if (q->flows[outer_hash + k].set ==CAKE_SET_BULK ) { - q->hosts[q->flows[reduced_hash].srchost].srchost_bulk_flow_count--; - q->hosts[q->flows[reduced_hash].dsthost].dsthost_bulk_flow_count--; - } allocate_src =cake_dsrc (flow_mode); allocate_dst =cake_ddst (flow_mode); + +if (q->flows[outer_hash + k].set ==CAKE_SET_BULK ) { +if (allocate_src) + q->hosts[q->flows[reduced_hash].srchost].srchost_bulk_flow_count--; +if (allocate_dst) + q->hosts[q->flows[reduced_hash].dsthost].dsthost_bulk_flow_count--; + } found:/* reserve queue for future packets in same flow */ reduced_hash = outer_hash + k;
Greg Kroah-Hartman
maintainerPATCH 57/269 nilfs2: fix missing cleanup on rollforward recovery error
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
commit 5787fcaab9eb5930f5378d6a1dd03d916d146622 upstream.
In an error injection test of a routine for mount-time recovery, KASAN found a use-after-free bug.
It turned out that if data recovery was performed using partial logs created by dsync writes, but an error occurred before starting the log writer to create a recovered checkpoint, the inodes whose data had been recovered were left in the ns_dirty_files list of the nilfs object and were not freed.
Fix this issue by cleaning up inodes that have read the recovery data if the recovery routine fails midway before the log writer starts.
--- fs/nilfs2/recovery.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-)
fs/nilfs2/recovery.c +33 -2
@@ -709,6 +709,33 @@ static void nilfs_finish_roll_forward(st }/** +* nilfs_abort_roll_forward - cleaning up after a failed rollforward recovery +* @nilfs: nilfs object +*/ +static void nilfs_abort_roll_forward (struct the_nilfs *nilfs) +{ +struct nilfs_inode_info *ii, *n; +LIST_HEAD (head); + +/* Abandon inodes that have read recovery data */ +spin_lock (&nilfs->ns_inode_lock); +list_splice_init (&nilfs->ns_dirty_files, &head); +spin_unlock (&nilfs->ns_inode_lock); +if (list_empty (&head)) +return ; + +set_nilfs_purging (nilfs); +list_for_each_entry_safe (ii, n, &head, i_dirty) { +spin_lock (&nilfs->ns_inode_lock); +list_del_init (&ii->i_dirty); +spin_unlock (&nilfs->ns_inode_lock); + +iput (&ii->vfs_inode); + } +clear_nilfs_purging (nilfs); +} + +/** * nilfs_salvage_orphan_logs - salvage logs written after the latest checkpoint * @nilfs: nilfs object * @sb: super block instance
@@ -766,15 +793,19 @@ int nilfs_salvage_orphan_logs(struct theif (unlikely (err)) {nilfs_err (sb,"error %d writing segment for recovery" , err); - goto failed; + goto put_root; }nilfs_finish_roll_forward (nilfs, ri); } - failed: +put_root:nilfs_put_root (root);return err; + +failed: +nilfs_abort_roll_forward (nilfs); + goto put_root; }/**
Greg Kroah-Hartman
maintainerPATCH 58/269 nilfs2: protect references to superblock parameters exposed in sysfs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
commit 683408258917541bdb294cd717c210a04381931e upstream.
The superblock buffers of nilfs2 can not only be overwritten at runtime for modifications/repairs, but they are also regularly swapped, replaced during resizing, and even abandoned when degrading to one side due to backing device issues. So, accessing them requires mutual exclusion using the reader/writer semaphore "nilfs->ns_sem".
Some sysfs attribute show methods read this superblock buffer without the necessary mutual exclusion, which can cause problems with pointer dereferencing and memory access, so fix it.
--- fs/nilfs2/sysfs.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-)
fs/nilfs2/sysfs.c +33 -10
@@ -836,9 +836,15 @@ ssize_t nilfs_dev_revision_show(struct nstruct the_nilfs *nilfs, char *buf) { - struct nilfs_super_block **sbp = nilfs->ns_sbp; -u32 major =le32_to_cpu (sbp[0 ]->s_rev_level); -u16 minor =le16_to_cpu (sbp[0 ]->s_minor_rev_level); + struct nilfs_super_block *raw_sb; +u32 major; +u16 minor; + +down_read (&nilfs->ns_sem); + raw_sb = nilfs->ns_sbp[0 ]; + major =le32_to_cpu (raw_sb->s_rev_level); + minor =le16_to_cpu (raw_sb->s_minor_rev_level); +up_read (&nilfs->ns_sem);return sysfs_emit (buf,"%d.%d\n" , major, minor); }
@@ -856,8 +862,13 @@ ssize_t nilfs_dev_device_size_show(strucstruct the_nilfs *nilfs, char *buf) { - struct nilfs_super_block **sbp = nilfs->ns_sbp; -u64 dev_size =le64_to_cpu (sbp[0 ]->s_dev_size); + struct nilfs_super_block *raw_sb; +u64 dev_size; + +down_read (&nilfs->ns_sem); + raw_sb = nilfs->ns_sbp[0 ]; + dev_size =le64_to_cpu (raw_sb->s_dev_size); +up_read (&nilfs->ns_sem);return sysfs_emit (buf,"%llu\n" , dev_size); }
@@ -879,9 +890,15 @@ ssize_t nilfs_dev_uuid_show(struct nilfsstruct the_nilfs *nilfs, char *buf) { - struct nilfs_super_block **sbp = nilfs->ns_sbp; + struct nilfs_super_block *raw_sb; +ssize_t len; + +down_read (&nilfs->ns_sem); + raw_sb = nilfs->ns_sbp[0 ]; + len =sysfs_emit (buf,"%pUb\n" , raw_sb->s_uuid); +up_read (&nilfs->ns_sem); -return sysfs_emit (buf,"%pUb\n" , sbp[0 ]->s_uuid); +return len; } static
@@ -889,10 +906,16 @@ ssize_t nilfs_dev_volume_name_show(strucstruct the_nilfs *nilfs, char *buf) { - struct nilfs_super_block **sbp = nilfs->ns_sbp; + struct nilfs_super_block *raw_sb; +ssize_t len; + +down_read (&nilfs->ns_sem); + raw_sb = nilfs->ns_sbp[0 ]; + len =scnprintf (buf,sizeof (raw_sb->s_volume_name),"%s\n" , + raw_sb->s_volume_name); +up_read (&nilfs->ns_sem); -return scnprintf (buf,sizeof (sbp[0 ]->s_volume_name),"%s\n" , - sbp[0 ]->s_volume_name); +return len; } static const char dev_readme_str[] =
Greg Kroah-Hartman
maintainerPATCH 59/269 nilfs2: fix state management in error path of log writing function
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
commit 6576dd6695f2afca3f4954029ac4a64f82ba60ab upstream.
After commit a694291a6211 ("nilfs2: separate wait function from nilfs_segctor_write") was applied, the log writing function nilfs_segctor_do_construct() was able to issue I/O requests continuously even if user data blocks were split into multiple logs across segments, but two potential flaws were introduced in its error handling.
First, if nilfs_segctor_begin_construction() fails while creating the second or subsequent logs, the log writing function returns without calling nilfs_segctor_abort_construction(), so the writeback flag set on pages/folios will remain uncleared. This causes page cache operations to hang waiting for the writeback flag. For example, truncate_inode_pages_final(), which is called via nilfs_evict_inode() when an inode is evicted from memory, will hang.
Second, the NILFS_I_COLLECTED flag set on normal inodes remain uncleared. As a result, if the next log write involves checkpoint creation, that's fine, but if a partial log write is performed that does not, inodes with NILFS_I_COLLECTED set are erroneously removed from the "sc_dirty_files" list, and their data and b-tree blocks may not be written to the device, corrupting the block mapping.
Fix these issues by uniformly calling nilfs_segctor_abort_construction() on failure of each step in the loop in nilfs_segctor_do_construct(), having it clean up logs and segment usages according to progress, and correcting the conditions for calling nilfs_redirty_inodes() to ensure that the NILFS_I_COLLECTED flag is cleared.
--- fs/nilfs2/segment.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
fs/nilfs2/segment.c +6 -4
@@ -1835,6 +1835,9 @@ static void nilfs_segctor_abort_construcnilfs_abort_logs (&logs, ret ? : err);list_splice_tail_init (&sci->sc_segbufs, &logs); +if (list_empty (&logs)) +return ;/* if the first segment buffer preparation failed */ +nilfs_cancel_segusage (&logs, nilfs->ns_sufile);nilfs_free_incomplete_logs (&logs, nilfs);
@@ -2079,7 +2082,7 @@ static int nilfs_segctor_do_construct(st err =nilfs_segctor_begin_construction (sci, nilfs);if (unlikely (err)) - goto out; + goto failed;/* Update time stamp */ sci->sc_seg_ctime =ktime_get_real_seconds ();
@@ -2142,10 +2145,9 @@ static int nilfs_segctor_do_construct(streturn err; failed_to_write: -if (sci->sc_stage.flags &NILFS_CF_IFILE_STARTED ) -nilfs_redirty_inodes (&sci->sc_dirty_files); - failed: +if (mode ==SC_LSEG_SR &&nilfs_sc_cstage_get (sci) >=NILFS_ST_IFILE ) +nilfs_redirty_inodes (&sci->sc_dirty_files);if (nilfs_doing_gc ())nilfs_redirty_inodes (&sci->sc_gc_inodes);nilfs_segctor_abort_construction (sci, nilfs, err);
Greg Kroah-Hartman
maintainerPATCH 60/269 drm/i915: Do not attempt to load the GSC multiple times
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniele Ceraolo Spurio <[email protected]>
commit 59d3cfdd7f9655a0400ac453bf92199204f8b2a1 upstream.
If the GSC FW fails to load the GSC HW hangs permanently; the only ways to recover it are FLR or D3cold entry, with the former only being supported on driver unload and the latter only on DGFX, for which we don't need to load the GSC. Therefore, if GSC fails to load there is no need to try again because the HW is stuck in the error state and the submission to load the FW would just hang the GSCCS.
Note that, due to wa_14015076503, on MTL the GuC escalates all GSCCS hangs to full GT resets, which would trigger a new attempt to load the GSC FW in the post-reset HW re-init; this issue is also fixed by not attempting to load the GSC FW after an error.
--- drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c | 2 +- drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.c +1 -1
@@ -304,7 +304,7 @@ void intel_gsc_uc_load_start(struct inte {struct intel_gt *gt =gsc_uc_to_gt (gsc); -if (!intel_uc_fw_is_loadable (&gsc->fw)) +if (!intel_uc_fw_is_loadable (&gsc->fw) ||intel_uc_fw_is_in_error (&gsc->fw))return ;if (intel_gsc_uc_fw_init_done (gsc))
drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h +5 -0
@@ -258,6 +258,11 @@ static inline bool intel_uc_fw_is_runninreturn __intel_uc_fw_status (uc_fw) ==INTEL_UC_FIRMWARE_RUNNING ; } +static inline bool intel_uc_fw_is_in_error (struct intel_uc_fw *uc_fw) +{ +return intel_uc_fw_status_to_error (__intel_uc_fw_status (uc_fw)) !=0 ; +} +static inline bool intel_uc_fw_is_overridden (const struct intel_uc_fw *uc_fw) {return uc_fw->user_overridden;
Greg Kroah-Hartman
maintainerPATCH 61/269 ALSA: control: Apply sanity check of input values for user elements
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 50ed081284fe2bfd1f25e8b92f4f6a4990e73c0a ]
Although we have already a mechanism for sanity checks of input values for control writes, it's not applied unless the kconfig CONFIG_SND_CTL_INPUT_VALIDATION is set due to the performance reason. Nevertheless, it still makes sense to apply the same check for user elements despite of its cost, as that's the only way to filter out the invalid values; the user controls are handled solely in ALSA core code, and there is no corresponding driver, after all.
This patch adds the same input value validation for user control elements at its put callback. The kselftest will be happier with this change, as the incorrect values will be bailed out now with errors.
For other normal controls, the check is applied still only when CONFIG_SND_CTL_INPUT_VALIDATION is set.
--- sound/core/control.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
sound/core/control.c +5 -1
@@ -1553,12 +1553,16 @@ static int snd_ctl_elem_user_get(struct snd_kcontrol *kcontrol,static int snd_ctl_elem_user_put (struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol) { -int change; +int err, change;struct user_element *ue = kcontrol->private_data;unsigned int size = ue->elem_data_size;char *dst = ue->elem_data +snd_ctl_get_ioff (kcontrol, &ucontrol->id) * size; + err =sanity_check_input_values (ue->card, ucontrol, &ue->info, false); +if (err <0 ) +return err; + change =memcmp (&ucontrol->value, dst, size) !=0 ;if (change)memcpy (dst, &ucontrol->value, size);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 62/269 ALSA: hda: Add input value sanity checks to HDMI channel map controls
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 6278056e42d953e207e2afd416be39d09ed2d496 ]
Add a simple sanity check to HD-audio HDMI Channel Map controls. Although the value might not be accepted for the actual connection, we can filter out some bogus values beforehand, and that should be enough for making kselftest happier.
--- sound/hda/hdmi_chmap.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
sound/hda/hdmi_chmap.c +18 -0
@@ -753,6 +753,20 @@ static int hdmi_chmap_ctl_get(struct snd_kcontrol *kcontrol,return 0 ; } +/* a simple sanity check for input values to chmap kcontrol */ +static int chmap_value_check (struct hdac_chmap *hchmap, +const struct snd_ctl_elem_value *ucontrol) +{ +int i; + +for (i =0 ; i < hchmap->channels_max; i++) { +if (ucontrol->value.integer.value[i] <0 || + ucontrol->value.integer.value[i] >SNDRV_CHMAP_LAST ) +return -EINVAL ; + } +return 0 ; +} +static int hdmi_chmap_ctl_put (struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol) {
@@ -764,6 +778,10 @@ static int hdmi_chmap_ctl_put(struct snd_kcontrol *kcontrol,unsigned char chmap[8 ], per_pin_chmap[8 ];int i, err, ca, prepared =0 ; + err =chmap_value_check (hchmap, ucontrol); +if (err <0 ) +return err; +/* No monitor is connected in dyn_pcm_assign. * It's invalid to setup the chmap */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 63/269 wifi: ath12k: fix uninitialize symbol error on ath12k_peer_assoc_h_he()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaradhana Sahu <[email protected]>
[ Upstream commit 19b77e7c656a3e125319cc3ef347b397cf042bf6 ]
Smatch throws following errors
drivers/net/wireless/ath/ath12k/mac.c:1922 ath12k_peer_assoc_h_he() error: uninitialized symbol 'rx_mcs_80'. drivers/net/wireless/ath/ath12k/mac.c:1922 ath12k_peer_assoc_h_he() error: uninitialized symbol 'rx_mcs_160'. drivers/net/wireless/ath/ath12k/mac.c:1924 ath12k_peer_assoc_h_he() error: uninitialized symbol 'rx_mcs_80'.
In ath12k_peer_assoc_h_he() rx_mcs_80 and rx_mcs_160 variables remain uninitialized in the following conditions:
1. Whenever the value of mcs_80 become equal to IEEE80211_HE_MCS_NOT_SUPPORTED then rx_mcs_80 remains uninitialized.
2. Whenever phy capability is not supported 160 channel width and value of mcs_160 become equal to IEEE80211_HE_MCS_NOT_SUPPORTED then rx_mcs_160 remains uninitialized.
Initialize these variables during declaration.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.1.1-00188-QCAHKSWPL_SILICONZ-1
--- drivers/net/wireless/ath/ath12k/mac.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath12k/mac.c +3 -1
@@ -1614,7 +1614,9 @@ static void ath12k_peer_assoc_h_he(struct ath12k *ar, {const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;int i; -u8 ampdu_factor, rx_mcs_80, rx_mcs_160, max_nss; +u8 ampdu_factor, max_nss; +u8 rx_mcs_80 =IEEE80211_HE_MCS_NOT_SUPPORTED ; +u8 rx_mcs_160 =IEEE80211_HE_MCS_NOT_SUPPORTED ;u16 mcs_160_map, mcs_80_map;bool support_160;u16 v;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 64/269 wifi: ath12k: fix firmware crash due to invalid peer nss
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ajith C <[email protected]>
[ Upstream commit db163a463bb93cd3e37e1e7b10b9726fb6f95857 ]
Currently, if the access point receives an association request containing an Extended HE Capabilities Information Element with an invalid MCS-NSS, it triggers a firmware crash.
This issue arises when EHT-PHY capabilities shows support for a bandwidth and MCS-NSS set for that particular bandwidth is filled by zeros and due to this, driver obtains peer_nss as 0 and sending this value to firmware causes crash.
Address this issue by implementing a validation step for the peer_nss value before passing it to the firmware. If the value is greater than zero, proceed with forwarding it to the firmware. However, if the value is invalid, reject the association request to prevent potential firmware crashes.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
--- drivers/net/wireless/ath/ath12k/mac.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/wireless/ath/ath12k/mac.c +5 -0
@@ -3357,6 +3357,11 @@ static int ath12k_station_assoc(struct ath12k *ar,ath12k_peer_assoc_prepare (ar, vif, sta, &peer_arg, reassoc); +if (peer_arg.peer_nss <1 ) { +ath12k_warn (ar->ab, +"invalid peer NSS %d\n" , peer_arg.peer_nss); +return -EINVAL ; + } ret =ath12k_wmi_send_peer_assoc_cmd (ar, &peer_arg);if (ret) { ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 65/269 smack: unix sockets: fix accept()ed socket label
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Andreev <[email protected]>
[ Upstream commit e86cac0acdb1a74f608bacefe702f2034133a047 ]
When a process accept()s connection from a unix socket (either stream or seqpacket)
it gets the socket with the label of the connecting process.
For example, if a connecting process has a label 'foo', the accept()ed socket will also have 'in' and 'out' labels 'foo', regardless of the label of the listener process.
This is because kernel creates unix child sockets
in the context of the connecting process.
I do not see any obvious way for the listener to abuse alien labels coming with the new socket, but,
to be on the safe side, it's better fix new socket labels.
--- security/smack/smack_lsm.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
security/smack/smack_lsm.c +9 -3
@@ -3769,12 +3769,18 @@ static int smack_unix_stream_connect(struct sock *sock, } } -/* -* Cross reference the peer labels for SO_PEERSEC. -*/ if (rc ==0 ) { +/* +* Cross reference the peer labels for SO_PEERSEC. +*/ nsp->smk_packet = ssp->smk_out; ssp->smk_packet = osp->smk_out; + +/* +* new/child/established socket must inherit listening socket labels +*/ + nsp->smk_out = osp->smk_out; + nsp->smk_in = osp->smk_in; }return rc;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 66/269 bpf, verifier: Correct tail_call_reachable for bpf prog
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Hwang <[email protected]>
[ Upstream commit 01793ed86b5d7df1e956520b5474940743eb7ed8 ]
It's confusing to inspect 'prog->aux->tail_call_reachable' with drgn[0], when bpf prog has tail call but 'tail_call_reachable' is false.
This patch corrects 'tail_call_reachable' when bpf prog has tail call.
--- kernel/bpf/verifier.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/bpf/verifier.c +3 -1
@@ -3064,8 +3064,10 @@ static int check_subprogs(struct bpf_verifier_env *env)if (code == (BPF_JMP |BPF_CALL ) && insn[i].src_reg ==0 && - insn[i].imm == BPF_FUNC_tail_call) + insn[i].imm == BPF_FUNC_tail_call) { subprog[cur_subprog].has_tail_call = true; + subprog[cur_subprog].tail_call_reachable = true; + }if (BPF_CLASS (code) ==BPF_LD && (BPF_MODE (code) ==BPF_ABS ||BPF_MODE (code) ==BPF_IND )) subprog[cur_subprog].has_ld_abs = true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 67/269 ELF: fix kernel.randomize_va_space double read
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Dobriyan <[email protected]>
[ Upstream commit 2a97388a807b6ab5538aa8f8537b2463c6988bd2 ]
ELF loader uses "randomize_va_space" twice. It is sysctl and can change at any moment, so 2 loads could see 2 different values in theory with unpredictable consequences.
Issue exactly one load for consistent value across one exec.
--- fs/binfmt_elf.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/binfmt_elf.c +3 -2
@@ -1008,7 +1008,8 @@ static int load_elf_binary(struct linux_binprm *bprm)if (elf_read_implies_exec (*elf_ex, executable_stack)) current->personality |=READ_IMPLIES_EXEC ; -if (!(current->personality &ADDR_NO_RANDOMIZE ) && randomize_va_space) +const int snapshot_randomize_va_space =READ_ONCE (randomize_va_space); +if (!(current->personality &ADDR_NO_RANDOMIZE ) && snapshot_randomize_va_space) current->flags |=PF_RANDOMIZE ;setup_new_exec (bprm);
@@ -1300,7 +1301,7 @@ static int load_elf_binary(struct linux_binprm *bprm) mm->end_data = end_data; mm->start_stack = bprm->p; -if ((current->flags &PF_RANDOMIZE ) && (randomize_va_space >1 )) { +if ((current->flags &PF_RANDOMIZE ) && (snapshot_randomize_va_space >1 )) {/* * For architectures with ELF randomization, when executing * a loader directly (i.e. no interpreter listed in ELF
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 68/269 accel/habanalabs/gaudi2: unsecure edma max outstanding register
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rakesh Ughreja <[email protected]>
[ Upstream commit 3309887c6ff8ca2ac05a74e1ee5d1c44829f63f2 ]
Netowrk EDMAs uses more outstanding transfers so this needs to be programmed by EDMA firmware.
--- drivers/accel/habanalabs/gaudi2/gaudi2_security.c | 1 + 1 file changed, 1 insertion(+)
drivers/accel/habanalabs/gaudi2/gaudi2_security.c +1 -0
@@ -479,6 +479,7 @@ static const u32 gaudi2_pb_dcr0_edma0_unsecured_regs[] = { mmDCORE0_EDMA0_CORE_CTX_TE_NUMROWS, mmDCORE0_EDMA0_CORE_CTX_IDX, mmDCORE0_EDMA0_CORE_CTX_IDX_INC, + mmDCORE0_EDMA0_CORE_WR_COMP_MAX_OUTSTAND, mmDCORE0_EDMA0_CORE_RD_LBW_RATE_LIM_CFG, mmDCORE0_EDMA0_QM_CQ_CFG0_0, mmDCORE0_EDMA0_QM_CQ_CFG0_1,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 69/269 irqchip/armada-370-xp: Do not allow mapping IRQ 0 and 1
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pali Rohár <[email protected]>
[ Upstream commit 3cef738208e5c3cb7084e208caf9bbf684f24feb ]
IRQs 0 (IPI) and 1 (MSI) are handled internally by this driver, generic_handle_domain_irq() is never called for these IRQs.
Disallow mapping these IRQs.
[ Marek: changed commit message ]
--- drivers/irqchip/irq-armada-370-xp.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/irqchip/irq-armada-370-xp.c +4 -0
@@ -566,6 +566,10 @@ static struct irq_chip armada_370_xp_irq_chip = {static int armada_370_xp_mpic_irq_map (struct irq_domain *h,unsigned int virq,irq_hw_number_t hw) { +/* IRQs 0 and 1 cannot be mapped, they are handled internally */ +if (hw <=1 ) +return -EINVAL ; +armada_370_xp_irq_mask (irq_get_irq_data (virq));if (!is_percpu_irq (hw)) writel(hw, per_cpu_int_base +
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 70/269 af_unix: Remove put_pid()/put_cred() in copy_peercred().
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit e4bd881d987121dbf1a288641491955a53d9f8f7 ]
When (AF_UNIX, SOCK_STREAM) socket connect()s to a listening socket, the listener's sk_peer_pid/sk_peer_cred are copied to the client in copy_peercred().
Then, the client's sk_peer_pid and sk_peer_cred are always NULL, so we need not call put_pid() and put_cred() there.
--- net/unix/af_unix.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
net/unix/af_unix.c +1 -8
@@ -693,9 +693,6 @@ static void init_peercred(struct sock *sk)static void copy_peercred (struct sock *sk,struct sock *peersk) { -const struct cred *old_cred; -struct pid *old_pid; -if (sk < peersk) {spin_lock (&sk->sk_peer_lock);spin_lock_nested (&peersk->sk_peer_lock,SINGLE_DEPTH_NESTING );
@@ -703,16 +700,12 @@ static void copy_peercred(struct sock *sk, struct sock *peersk)spin_lock (&peersk->sk_peer_lock);spin_lock_nested (&sk->sk_peer_lock,SINGLE_DEPTH_NESTING ); } - old_pid = sk->sk_peer_pid; - old_cred = sk->sk_peer_cred; + sk->sk_peer_pid =get_pid (peersk->sk_peer_pid); sk->sk_peer_cred =get_cred (peersk->sk_peer_cred);spin_unlock (&sk->sk_peer_lock);spin_unlock (&peersk->sk_peer_lock); - -put_pid (old_pid); -put_cred (old_cred); }static int unix_listen (struct socket *sock,int backlog)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 71/269 x86/kmsan: Fix hook for unaligned accesses
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Johannesmeyer <[email protected]>
[ Upstream commit bf6ab33d8487f5e2a0998ce75286eae65bb0a6d6 ]
When called with a 'from' that is not 4-byte-aligned, string_memcpy_fromio() calls the movs() macro to copy the first few bytes, so that 'from' becomes 4-byte-aligned before calling rep_movs(). This movs() macro modifies 'to', and the subsequent line modifies 'n'.
As a result, on unaligned accesses, kmsan_unpoison_memory() uses the updated (aligned) values of 'to' and 'n'. Hence, it does not unpoison the entire region.
Save the original values of 'to' and 'n', and pass those to kmsan_unpoison_memory(), so that the entire region is unpoisoned.
--- arch/x86/lib/iomem.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/x86/lib/iomem.c +4 -1
@@ -25,6 +25,9 @@ static __always_inline void rep_movs(void *to, const void *from, size_t n)static void string_memcpy_fromio (void *to,const volatile void __iomem *from,size_t n) { +const void *orig_to = to; +const size_t orig_n = n; +if (unlikely (!n))return ;
@@ -39,7 +42,7 @@ static void string_memcpy_fromio(void *to, const volatile void __iomem *from, si }rep_movs (to, (const void *)from, n);/* KMSAN must treat values read from devices as initialized. */ -kmsan_unpoison_memory (to, n); +kmsan_unpoison_memory (orig_to, orig_n); }static void string_memcpy_toio (volatile void __iomem *to,const void *from,size_t n)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 72/269 iommu: sun50i: clear bypass register
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jernej Skrabec <[email protected]>
[ Upstream commit 927c70c93d929f4c2dcaf72f51b31bb7d118a51a ]
The Allwinner H6 IOMMU has a bypass register, which allows to circumvent the page tables for each possible master. The reset value for this register is 0, which disables the bypass.
The Allwinner H616 IOMMU resets this register to 0x7f, which activates the bypass for all masters, which is not what we want.
Always clear this register to 0, to enforce the usage of page tables, and make this driver compatible with the H616 in this respect.
--- drivers/iommu/sun50i-iommu.c | 1 + 1 file changed, 1 insertion(+)
drivers/iommu/sun50i-iommu.c +1 -0
@@ -449,6 +449,7 @@ static int sun50i_iommu_enable(struct sun50i_iommu *iommu)IOMMU_TLB_PREFETCH_MASTER_ENABLE (3 ) |IOMMU_TLB_PREFETCH_MASTER_ENABLE (4 ) | IOMMU_TLB_PREFETCH_MASTER_ENABLE(5)); +iommu_write (iommu,IOMMU_BYPASS_REG ,0 );iommu_write (iommu,IOMMU_INT_ENABLE_REG ,IOMMU_INT_MASK ); iommu_write(iommu, IOMMU_DM_AUT_CTRL_REG(SUN50I_IOMMU_ACI_NONE), IOMMU_DM_AUT_CTRL_RD_UNAVAIL(SUN50I_IOMMU_ACI_NONE, 0) |
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 73/269 netfilter: nf_conncount: fix wrong variable type
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunjian Wang <[email protected]>
[ Upstream commit 0b88d1654d556264bcd24a9cb6383f0888e30131 ]
Now there is a issue is that code checks reports a warning: implicit narrowing conversion from type 'unsigned int' to small type 'u8' (the 'keylen' variable). Fix it by removing the 'keylen' variable.
--- net/netfilter/nf_conncount.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
net/netfilter/nf_conncount.c +3 -5
@@ -321,7 +321,6 @@ insert_tree(struct net *net,struct nf_conncount_rb *rbconn;struct nf_conncount_tuple *conn;unsigned int count =0 , gc_count =0 ; -u8 keylen = data->keylen;bool do_gc = true;spin_lock_bh (&nf_conncount_locks[hash]);
@@ -333,7 +332,7 @@ insert_tree(struct net *net, rbconn = rb_entry(*rbnode, struct nf_conncount_rb, node); parent = *rbnode; - diff =key_diff (key, rbconn->key, keylen); + diff =key_diff (key, rbconn->key, data->keylen);if (diff <0 ) { rbnode = &((*rbnode)->rb_left); }else if (diff >0 ) {
@@ -378,7 +377,7 @@ insert_tree(struct net *net, conn->tuple = *tuple; conn->zone = *zone; -memcpy (rbconn->key, key,sizeof (u32) * keylen); +memcpy (rbconn->key, key,sizeof (u32) * data->keylen);nf_conncount_list_init (&rbconn->list);list_add (&conn->node, &rbconn->list.head);
@@ -403,7 +402,6 @@ count_tree(struct net *net,struct rb_node *parent;struct nf_conncount_rb *rbconn;unsigned int hash; -u8 keylen = data->keylen; hash =jhash2 (key, data->keylen, conncount_rnd) %CONNCOUNT_SLOTS ; root = &data->root[hash];
@@ -414,7 +412,7 @@ count_tree(struct net *net, rbconn = rb_entry(parent, struct nf_conncount_rb, node); - diff =key_diff (key, rbconn->key, keylen); + diff =key_diff (key, rbconn->key, data->keylen);if (diff <0 ) { parent =rcu_dereference_raw (parent->rb_left); }else if (diff >0 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 74/269 wifi: iwlwifi: mvm: use IWL_FW_CHECK for link ID check
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 9215152677d4b321801a92b06f6d5248b2b4465f ]
The lookup function iwl_mvm_rcu_fw_link_id_to_link_conf() is normally called with input from the firmware, so it should use IWL_FW_CHECK() instead of WARN_ON().
--- drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +2 -1
@@ -1318,7 +1318,8 @@ iwl_mvm_rcu_dereference_vif_id(struct iwl_mvm *mvm, u8 vif_id, bool rcu)static inline struct ieee80211_bss_conf *iwl_mvm_rcu_fw_link_id_to_link_conf (struct iwl_mvm *mvm,u8 link_id,bool rcu) { -if (WARN_ON (link_id >=ARRAY_SIZE (mvm->link_id_to_link_conf))) +if (IWL_FW_CHECK (mvm, link_id >=ARRAY_SIZE (mvm->link_id_to_link_conf), +"erroneous FW link ID: %d\n" , link_id))return NULL ;if (rcu)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 75/269 udf: Avoid excessive partition lengths
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
[ Upstream commit ebbe26fd54a9621994bc16b14f2ba8f84c089693 ]
Avoid mounting filesystems where the partition would overflow the 32-bits used for block number. Also refuse to mount filesystems where the partition length is so large we cannot safely index bits in a block bitmap.
--- fs/udf/super.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
fs/udf/super.c +15 -0
@@ -1080,12 +1080,19 @@ static int udf_fill_partdesc_info(struct super_block *sb,struct udf_part_map *map;struct udf_sb_info *sbi =UDF_SB (sb);struct partitionHeaderDesc *phd; +u32 sum;int err; map = &sbi->s_partmaps[p_index]; map->s_partition_len =le32_to_cpu (p->partitionLength);/* blocks */ map->s_partition_root =le32_to_cpu (p->partitionStartingLocation); +if (check_add_overflow (map->s_partition_root, map->s_partition_len, + &sum)) { +udf_err (sb,"Partition %d has invalid location %u + %u\n" , + p_index, map->s_partition_root, map->s_partition_len); +return -EFSCORRUPTED ; + }if (p->accessType ==cpu_to_le32 (PD_ACCESS_TYPE_READ_ONLY )) map->s_partition_flags |=UDF_PART_FLAG_READ_ONLY ;
@@ -1141,6 +1148,14 @@ static int udf_fill_partdesc_info(struct super_block *sb, bitmap->s_extPosition =le32_to_cpu ( phd->unallocSpaceBitmap.extPosition); map->s_partition_flags |=UDF_PART_FLAG_UNALLOC_BITMAP ; +/* Check whether math over bitmap won't overflow. */ +if (check_add_overflow (map->s_partition_len, +sizeof (struct spaceBitmapDesc ) <<3 , + &sum)) { +udf_err (sb,"Partition %d is too long (%u)\n" , p_index, + map->s_partition_len); +return -EFSCORRUPTED ; + }udf_debug ("unallocSpaceBitmap (part %d) @ %u\n" , p_index, bitmap->s_extPosition); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 76/269 fs/ntfs3: One more reason to mark inode bad
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Komarov <[email protected]>
[ Upstream commit a0dde5d7a58b6bf9184ef3d8c6e62275c3645584 ]
In addition to returning an error, mark the node as bad.
--- fs/ntfs3/frecord.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/ntfs3/frecord.c +3 -1
@@ -1601,8 +1601,10 @@ int ni_delete_all(struct ntfs_inode *ni) asize =le32_to_cpu (attr->size); roff =le16_to_cpu (attr->nres.run_off); -if (roff > asize) +if (roff > asize) { +_ntfs_bad_inode (&ni->vfs_inode);return -EINVAL ; + }/* run==1 means unpack and deallocate. */ run_unpack_ex(RUN_DEALLOCATE, sbi, ni->mi.rno, svcn, evcn, svcn,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 77/269 riscv: kprobes: Use patch_text_nosync() for insn slots
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Samuel Holland <[email protected]>
[ Upstream commit b1756750a397f36ddc857989d31887c3f5081fb0 ]
These instructions are not yet visible to the rest of the system, so there is no need to do the whole stop_machine() dance.
--- arch/riscv/kernel/probes/kprobes.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/riscv/kernel/probes/kprobes.c +2 -3
@@ -28,9 +28,8 @@ static void __kprobes arch_prepare_ss_slot(struct kprobe *p) p->ainsn.api.restore = (unsigned long )p->addr + offset; -patch_text (p->ainsn.api.insn, &p->opcode,1 ); -patch_text ((void *)((unsigned long )(p->ainsn.api.insn) + offset), - &insn,1 ); +patch_text_nosync (p->ainsn.api.insn, &p->opcode,1 ); +patch_text_nosync (p->ainsn.api.insn + offset, &insn,1 ); }static void __kprobes arch_prepare_simulate (struct kprobe *p)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 78/269 media: vivid: fix wrong sizeimage value for mplane
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Verkuil <[email protected]>
[ Upstream commit 0fd7c0c2c156270dceb8c15fad3120cdce03e539 ]
In several places a division by fmt->vdownsampling[p] was missing in the sizeimage[p] calculation, causing incorrect behavior for multiplanar formats were some planes are smaller than the first plane.
Found by new v4l2-compliance tests.
--- drivers/media/test-drivers/vivid/vivid-vid-cap.c | 5 +++-- drivers/media/test-drivers/vivid/vivid-vid-out.c | 16 +++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-)
drivers/media/test-drivers/vivid/vivid-vid-cap.c +3 -2
@@ -106,8 +106,9 @@ static int vid_cap_queue_setup(struct vb2_queue *vq,if (*nplanes != buffers)return -EINVAL ;for (p =0 ; p < buffers; p++) { -if (sizes[p] <tpg_g_line_width (&dev->tpg, p) * h + - dev->fmt_cap->data_offset[p]) +if (sizes[p] <tpg_g_line_width (&dev->tpg, p) * h / + dev->fmt_cap->vdownsampling[p] + + dev->fmt_cap->data_offset[p])return -EINVAL ; } }else {
drivers/media/test-drivers/vivid/vivid-vid-out.c +9 -7
@@ -63,14 +63,16 @@ static int vid_out_queue_setup(struct vb2_queue *vq,if (sizes[0 ] < size)return -EINVAL ;for (p =1 ; p < planes; p++) { -if (sizes[p] < dev->bytesperline_out[p] * h + - vfmt->data_offset[p]) +if (sizes[p] < dev->bytesperline_out[p] * h / + vfmt->vdownsampling[p] + + vfmt->data_offset[p])return -EINVAL ; } }else {for (p =0 ; p < planes; p++) - sizes[p] = p ? dev->bytesperline_out[p] * h + - vfmt->data_offset[p] : size; + sizes[p] = p ? dev->bytesperline_out[p] * h / + vfmt->vdownsampling[p] + + vfmt->data_offset[p] : size; }if (vq->num_buffers + *nbuffers <2 )
@@ -127,7 +129,7 @@ static int vid_out_buf_prepare(struct vb2_buffer *vb)for (p =0 ; p < planes; p++) {if (p) - size = dev->bytesperline_out[p] * h; + size = dev->bytesperline_out[p] * h / vfmt->vdownsampling[p]; size += vb->planes[p].data_offset;if (vb2_get_plane_payload (vb, p) < size) {
@@ -334,8 +336,8 @@ int vivid_g_fmt_vid_out(struct file *file, void *priv,for (p =0 ; p < mp->num_planes; p++) { mp->plane_fmt[p].bytesperline = dev->bytesperline_out[p]; mp->plane_fmt[p].sizeimage = - mp->plane_fmt[p].bytesperline * mp->height + - fmt->data_offset[p]; + mp->plane_fmt[p].bytesperline * mp->height / + fmt->vdownsampling[p] + fmt->data_offset[p]; }for (p = fmt->buffers; p < fmt->planes; p++) {unsigned stride = dev->bytesperline_out[p];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 79/269 leds: spi-byte: Call of_node_put() on error path
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 7f9ab862e05c5bc755f65bf6db7edcffb3b49dfc ]
Add a missing call to of_node_put(np) on error.
--- drivers/leds/leds-spi-byte.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/leds/leds-spi-byte.c +5 -1
@@ -91,7 +91,6 @@ static int spi_byte_probe(struct spi_device *spi)dev_err (dev,"Device must have exactly one LED sub-node." );return -EINVAL ; } - child =of_get_next_available_child (dev_of_node (dev),NULL ); led =devm_kzalloc (dev,sizeof (*led),GFP_KERNEL );if (!led)
@@ -107,11 +106,13 @@ static int spi_byte_probe(struct spi_device *spi) led->ldev.max_brightness = led->cdef->max_value - led->cdef->off_value; led->ldev.brightness_set_blocking = spi_byte_brightness_set_blocking; + child =of_get_next_available_child (dev_of_node (dev),NULL ); state =of_get_property (child,"default-state" ,NULL );if (state) {if (!strcmp (state,"on" )) { led->ldev.brightness = led->ldev.max_brightness; }else if (strcmp (state,"off" )) { +of_node_put (child);/* all other cases except "off" */ dev_err (dev,"default-state can only be 'on' or 'off'" );return -EINVAL ;
@@ -122,9 +123,12 @@ static int spi_byte_probe(struct spi_device *spi) ret =devm_led_classdev_register (&spi->dev, &led->ldev);if (ret) { +of_node_put (child);mutex_destroy (&led->mutex);return ret; } + +of_node_put (child);spi_set_drvdata (spi, led);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 80/269 wifi: brcmsmac: advertise MFP_CAPABLE to enable WPA3
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arend van Spriel <[email protected]>
[ Upstream commit dbb5265a5d7cca1cdba7736dba313ab7d07bc19d ]
After being asked about support for WPA3 for BCM43224 chipset it was found that all it takes is setting the MFP_CAPABLE flag and mac80211 will take care of all that is needed [1].
--- drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +1 -0
@@ -1086,6 +1086,7 @@ static int ieee_hw_init(struct ieee80211_hw *hw)ieee80211_hw_set (hw,AMPDU_AGGREGATION );ieee80211_hw_set (hw,SIGNAL_DBM );ieee80211_hw_set (hw,REPORTS_TX_ACK_STATUS ); +ieee80211_hw_set (hw,MFP_CAPABLE ); hw->extra_tx_headroom =brcms_c_get_header_len (); hw->queues =N_TX_QUEUES ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 81/269 usb: uas: set host status byte on data completion error
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shantanu Goel <[email protected]>
[ Upstream commit 9d32685a251a754f1823d287df233716aa23bcb9 ]
Set the host status byte when a data completion error is encountered otherwise the upper layer may end up using the invalid zero'ed data. The following output was observed from scsi/sd.c prior to this fix.
[ 11.872824] sd 0:0:0:1: [sdf] tag#9 data cmplt err -75 uas-tag 1 inflight: [ 11.872826] sd 0:0:0:1: [sdf] tag#9 CDB: Read capacity(16) 9e 10 00 00 00 00 00 00 00 00 00 00 00 20 00 00 [ 11.872830] sd 0:0:0:1: [sdf] Sector size 0 reported, assuming 512.
--- drivers/usb/storage/uas.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/storage/uas.c +1 -0
@@ -422,6 +422,7 @@ static void uas_data_cmplt(struct urb *urb)uas_log_cmd_state (cmnd,"data cmplt err" , status);/* error: no data transfered */ scsi_set_resid (cmnd, sdb->length); +set_host_byte (cmnd,DID_ERROR ); }else {scsi_set_resid (cmnd, sdb->length - urb->actual_length); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 82/269 usb: gadget: aspeed_udc: validate endpoint index for ast udc
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
[ Upstream commit ee0d382feb44ec0f445e2ad63786cd7f3f6a8199 ]
We should verify the bound of the array to assure that host may not manipulate the index to point past endpoint array.
Found by static analysis.
--- drivers/usb/gadget/udc/aspeed_udc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/gadget/udc/aspeed_udc.c +2 -0
@@ -1009,6 +1009,8 @@ static void ast_udc_getstatus(struct ast_udc_dev *udc)break ;case USB_RECIP_ENDPOINT : epnum = crq.wIndex &USB_ENDPOINT_NUMBER_MASK ; +if (epnum >=AST_UDC_NUM_ENDPOINTS ) + goto stall; status = udc->ep[epnum].stopped;break ;default :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 83/269 drm/amd/display: Run DC_LOG_DC after checking link->link_enc
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Hung <[email protected]>
[ Upstream commit 3a82f62b0d9d7687eac47603bb6cd14a50fa718b ]
[WHAT]
The DC_LOG_DC should be run after link->link_enc is checked, not before.
This fixes 1 REVERSE_INULL issue reported by Coverity.
--- drivers/gpu/drm/amd/display/dc/link/link_factory.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/dc/link/link_factory.c +3 -3
@@ -629,14 +629,14 @@ static bool construct_phy(struct dc_link *link, link->link_enc = link->dc->res_pool->funcs->link_enc_create (dc_ctx, &enc_init_data); -DC_LOG_DC ("BIOS object table - DP_IS_USB_C: %d" , link->link_enc->features.flags.bits.DP_IS_USB_C); -DC_LOG_DC ("BIOS object table - IS_DP2_CAPABLE: %d" , link->link_enc->features.flags.bits.IS_DP2_CAPABLE); -if (!link->link_enc) {DC_ERROR ("Failed to create link encoder!\n" ); goto link_enc_create_fail; } +DC_LOG_DC ("BIOS object table - DP_IS_USB_C: %d" , link->link_enc->features.flags.bits.DP_IS_USB_C); +DC_LOG_DC ("BIOS object table - IS_DP2_CAPABLE: %d" , link->link_enc->features.flags.bits.IS_DP2_CAPABLE); +/* Update link encoder tracking variables. These are used for the dynamic * assignment of link encoders to streams. */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 84/269 drm/amd/display: Check HDCP returned status
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Hung <[email protected]>
[ Upstream commit 5d93060d430b359e16e7c555c8f151ead1ac614b ]
[WHAT & HOW]
Check mod_hdcp_execute_and_set() return values in authenticated_dp.
This fixes 3 CHECKED_RETURN issues reported by Coverity.
--- .../amd/display/modules/hdcp/hdcp1_execution.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_execution.c +9 -6
@@ -433,17 +433,20 @@ static enum mod_hdcp_status authenticated_dp(struct mod_hdcp *hdcp, }if (status ==MOD_HDCP_STATUS_SUCCESS ) -mod_hdcp_execute_and_set (mod_hdcp_read_bstatus, +if (!mod_hdcp_execute_and_set (mod_hdcp_read_bstatus, &input->bstatus_read, &status, - hdcp,"bstatus_read" ); + hdcp,"bstatus_read" )) + goto out;if (status ==MOD_HDCP_STATUS_SUCCESS ) -mod_hdcp_execute_and_set (check_link_integrity_dp, +if (!mod_hdcp_execute_and_set (check_link_integrity_dp, &input->link_integrity_check, &status, - hdcp,"link_integrity_check" ); + hdcp,"link_integrity_check" )) + goto out;if (status ==MOD_HDCP_STATUS_SUCCESS ) -mod_hdcp_execute_and_set (check_no_reauthentication_request_dp, +if (!mod_hdcp_execute_and_set (check_no_reauthentication_request_dp, &input->reauth_request_check, &status, - hdcp,"reauth_request_check" ); + hdcp,"reauth_request_check" )) + goto out; out:return status; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 85/269 drm/amdgpu: Fix smatch static checker warning
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hawking Zhang <[email protected]>
[ Upstream commit bdbdc7cecd00305dc844a361f9883d3a21022027 ]
adev->gfx.imu.funcs could be NULL
--- drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +4 -4
@@ -4269,11 +4269,11 @@ static int gfx_v11_0_hw_init(void *handle)/* RLC autoload sequence 1: Program rlc ram */ if (adev->gfx.imu.funcs->program_rlc_ram) adev->gfx.imu.funcs->program_rlc_ram (adev); +/* rlc autoload firmware */ + r =gfx_v11_0_rlc_backdoor_autoload_enable (adev); +if (r) +return r; } -/* rlc autoload firmware */ - r =gfx_v11_0_rlc_backdoor_autoload_enable (adev); -if (r) -return r; }else {if (adev->firmware.load_type ==AMDGPU_FW_LOAD_DIRECT ) {if (adev->gfx.imu.funcs && (amdgpu_dpm >0 )) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 86/269 drm/amdgpu: clear RB_OVERFLOW bit when enabling interrupts
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danijel Slivka <[email protected]>
[ Upstream commit afbf7955ff01e952dbdd465fa25a2ba92d00291c ]
Why:
Setting IH_RB_WPTR register to 0 will not clear the RB_OVERFLOW bit if RB_ENABLE is not set.
How to fix:
Set WPTR_OVERFLOW_CLEAR bit after RB_ENABLE bit is set. The RB_ENABLE bit is required to be set, together with WPTR_OVERFLOW_ENABLE bit so that setting WPTR_OVERFLOW_CLEAR bit would clear the RB_OVERFLOW.
--- drivers/gpu/drm/amd/amdgpu/ih_v6_0.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
drivers/gpu/drm/amd/amdgpu/ih_v6_0.c +28 -0
@@ -135,6 +135,34 @@ static int ih_v6_0_toggle_ring_interrupts(struct amdgpu_device *adev, tmp =RREG32 (ih_regs->ih_rb_cntl); tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,RB_ENABLE , (enable ?1 :0 )); + +if (enable) { +/* Unset the CLEAR_OVERFLOW bit to make sure the next step +* is switching the bit from 0 to 1 +*/ + tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,WPTR_OVERFLOW_CLEAR ,0 ); +if (amdgpu_sriov_vf (adev) &&amdgpu_sriov_reg_indirect_ih (adev)) { +if (psp_reg_program (&adev->psp, ih_regs->psp_reg_id, tmp)) +return -ETIMEDOUT ; + }else { +WREG32_NO_KIQ (ih_regs->ih_rb_cntl, tmp); + } + +/* Clear RB_OVERFLOW bit */ + tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,WPTR_OVERFLOW_CLEAR ,1 ); +if (amdgpu_sriov_vf (adev) &&amdgpu_sriov_reg_indirect_ih (adev)) { +if (psp_reg_program (&adev->psp, ih_regs->psp_reg_id, tmp)) +return -ETIMEDOUT ; + }else { +WREG32_NO_KIQ (ih_regs->ih_rb_cntl, tmp); + } + +/* Unset the CLEAR_OVERFLOW bit immediately so new overflows +* can be detected. +*/ + tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,WPTR_OVERFLOW_CLEAR ,0 ); + } +/* enable_intr field is only valid in ring0 */ if (ih == &adev->irq.ih) tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,ENABLE_INTR , (enable ?1 :0 ));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 87/269 media: vivid: dont set HDMI TX controls if there are no HDMI outputs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Verkuil <[email protected]>
[ Upstream commit 17763960b1784578e8fe915304b330922f646209 ]
When setting the EDID it would attempt to update two controls that are only present if there is an HDMI output configured.
If there isn't any (e.g. when the vivid module is loaded with node_types=1), then calling VIDIOC_S_EDID would crash.
Fix this by first checking if outputs are present.
--- drivers/media/test-drivers/vivid/vivid-vid-cap.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/media/test-drivers/vivid/vivid-vid-cap.c +8 -4
@@ -1557,8 +1557,10 @@ int vidioc_s_edid(struct file *file, void *_fh,return -EINVAL ;if (edid->blocks ==0 ) { dev->edid_blocks =0 ; -v4l2_ctrl_s_ctrl (dev->ctrl_tx_edid_present,0 ); -v4l2_ctrl_s_ctrl (dev->ctrl_tx_hotplug,0 ); +if (dev->num_outputs) { +v4l2_ctrl_s_ctrl (dev->ctrl_tx_edid_present,0 ); +v4l2_ctrl_s_ctrl (dev->ctrl_tx_hotplug,0 ); + } phys_addr =CEC_PHYS_ADDR_INVALID ; goto set_phys_addr; }
@@ -1582,8 +1584,10 @@ int vidioc_s_edid(struct file *file, void *_fh, display_present |= dev->display_present[i] << j++; -v4l2_ctrl_s_ctrl (dev->ctrl_tx_edid_present, display_present); -v4l2_ctrl_s_ctrl (dev->ctrl_tx_hotplug, display_present); +if (dev->num_outputs) { +v4l2_ctrl_s_ctrl (dev->ctrl_tx_edid_present, display_present); +v4l2_ctrl_s_ctrl (dev->ctrl_tx_hotplug, display_present); + } set_phys_addr:/* TODO: a proper hotplug detect cycle should be emulated here */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 88/269 vfio/spapr: Always clear TCEs before unsetting the window
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shivaprasad G Bhat <[email protected]>
[ Upstream commit 4ba2fdff2eb174114786784926d0efb6903c88a6 ]
The PAPR expects the TCE table to have no entries at the time of unset window(i.e. remove-pe). The TCE clear right now is done before freeing the iommu table. On pSeries, the unset window makes those entries inaccessible to the OS and the H_PUT/GET calls fail on them with H_CONSTRAINED.
On PowerNV, this has no side effect as the TCE clear can be done before the DMA window removal as well.
--- drivers/vfio/vfio_iommu_spapr_tce.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/vfio/vfio_iommu_spapr_tce.c +9 -4
@@ -364,7 +364,6 @@ static void tce_iommu_release(void *iommu_data)if (!tbl)continue ; -tce_iommu_clear (container, tbl, tbl->it_offset, tbl->it_size);tce_iommu_free_table (container, tbl); }
@@ -720,6 +719,8 @@ static long tce_iommu_remove_window(struct tce_container *container,BUG_ON (!tbl->it_size); +tce_iommu_clear (container, tbl, tbl->it_offset, tbl->it_size); +/* Detach groups from IOMMUs */ list_for_each_entry (tcegrp, &container->group_list, next) { table_group =iommu_group_get_iommudata (tcegrp->grp);
@@ -738,7 +739,6 @@ static long tce_iommu_remove_window(struct tce_container *container, }/* Free table */ -tce_iommu_clear (container, tbl, tbl->it_offset, tbl->it_size);tce_iommu_free_table (container, tbl); container->tables[num] =NULL ;
@@ -1197,9 +1197,14 @@ static void tce_iommu_release_ownership(struct tce_container *container,return ; } -for (i =0 ; i <IOMMU_TABLE_GROUP_MAX_TABLES ; ++i) -if (container->tables[i]) +for (i =0 ; i <IOMMU_TABLE_GROUP_MAX_TABLES ; ++i) { +if (container->tables[i]) { +tce_iommu_clear (container, container->tables[i], + container->tables[i]->it_offset, + container->tables[i]->it_size); table_group->ops->unset_window (table_group, i); + } + } } static long tce_iommu_take_ownership(struct tce_container *container,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 89/269 ice: Check all ice_vsi_rebuild() errors in function
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Joyner <[email protected]>
[ Upstream commit d47bf9a495cf424fad674321d943123dc12b926d ]
Check the return value from ice_vsi_rebuild() and prevent the usage of incorrectly configured VSI.
--- drivers/net/ethernet/intel/ice/ice_main.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/ice/ice_main.c +11 -2
@@ -3979,13 +3979,17 @@ int ice_vsi_recfg_qs(struct ice_vsi *vsi, int new_rx, int new_tx, bool locked)/* set for the next time the netdev is started */ if (!netif_running (vsi->netdev)) { -ice_vsi_rebuild (vsi,ICE_VSI_FLAG_NO_INIT ); + err =ice_vsi_rebuild (vsi,ICE_VSI_FLAG_NO_INIT ); +if (err) + goto rebuild_err;dev_dbg (ice_pf_to_dev (pf),"Link is down, queue count change happens when link is brought up\n" ); goto done; }ice_vsi_close (vsi); -ice_vsi_rebuild (vsi,ICE_VSI_FLAG_NO_INIT ); + err =ice_vsi_rebuild (vsi,ICE_VSI_FLAG_NO_INIT ); +if (err) + goto rebuild_err;ice_for_each_traffic_class (i) {if (vsi->tc_cfg.ena_tc &BIT (i))
@@ -3996,6 +4000,11 @@ int ice_vsi_recfg_qs(struct ice_vsi *vsi, int new_rx, int new_tx, bool locked) }ice_pf_dcb_recfg (pf, locked);ice_vsi_open (vsi); + goto done; + +rebuild_err: +dev_err (ice_pf_to_dev (pf),"Error during VSI rebuild: %d. Unload and reload the driver.\n" , + err); done:clear_bit (ICE_CFG_BUSY , pf->state);return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 90/269 PCI: keystone: Add workaround for Errata #i2037 (AM65x SR 1.0)
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kishon Vijay Abraham I <[email protected]>
[ Upstream commit 86f271f22bbb6391410a07e08d6ca3757fda01fa ]
Errata #i2037 in AM65x/DRA80xM Processors Silicon Revision 1.0 (SPRZ452D_July 2018_Revised December 2019 [1]) mentions when an inbound PCIe TLP spans more than two internal AXI 128-byte bursts, the bus may corrupt the packet payload and the corrupt data may cause associated applications or the processor to hang.
The workaround for Errata #i2037 is to limit the maximum read request size and maximum payload size to 128 bytes. Add workaround for Errata #i2037 here.
The errata and workaround is applicable only to AM65x SR 1.0 and later versions of the silicon will have this fixed.
[1] -> https://www.ti.com/lit/er/sprz452i/sprz452i.pdf
--- drivers/pci/controller/dwc/pci-keystone.c | 44 ++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-)
drivers/pci/controller/dwc/pci-keystone.c +43 -1
@@ -34,6 +34,11 @@#define PCIE_DEVICEID_SHIFT 16/* Application registers */ +#define PID 0x000 +#define RTL GENMASK(15, 11) +#define RTL_SHIFT 11 +#define AM6_PCI_PG1_RTL_VER 0x15 +#define CMD_STATUS 0x004#define LTSSM_EN_VAL BIT(0)#define OB_XLAT_EN_VAL BIT(1)
@@ -104,6 +109,8 @@#define to_keystone_pcie (x) dev_get_drvdata((x)->dev) +#define PCI_DEVICE_ID_TI_AM654X 0xb00c +struct ks_pcie_of_data {enum dw_pcie_device_mode mode;const struct dw_pcie_host_ops *host_ops;
@@ -518,7 +525,11 @@ static int ks_pcie_start_link(struct dw_pcie *pci)static void ks_pcie_quirk (struct pci_dev *dev) {struct pci_bus *bus = dev->bus; +struct keystone_pcie *ks_pcie; +struct device *bridge_dev;struct pci_dev *bridge; +u32 val; +static const struct pci_device_id rc_pci_devids[] = { {PCI_DEVICE (PCI_VENDOR_ID_TI ,PCIE_RC_K2HK ), .class =PCI_CLASS_BRIDGE_PCI_NORMAL , .class_mask = ~0 , },
@@ -530,6 +541,11 @@ static void ks_pcie_quirk(struct pci_dev *dev) .class = PCI_CLASS_BRIDGE_PCI_NORMAL, .class_mask = ~0, }, { 0, }, }; +static const struct pci_device_id am6_pci_devids[] = { + {PCI_DEVICE (PCI_VENDOR_ID_TI ,PCI_DEVICE_ID_TI_AM654X ), + .class =PCI_CLASS_BRIDGE_PCI <<8 , .class_mask = ~0 , }, + {0 , }, + };if (pci_is_root_bus (bus)) bridge = dev;
@@ -551,10 +567,36 @@ static void ks_pcie_quirk(struct pci_dev *dev)*/ if (pci_match_id (rc_pci_devids, bridge)) {if (pcie_get_readrq (dev) >256 ) { -dev_info (&dev->dev,"limiting MRRS to 256\n" ); +dev_info (&dev->dev,"limiting MRRS to 256 bytes\n" );pcie_set_readrq (dev,256 ); } } + +/* +* Memory transactions fail with PCI controller in AM654 PG1.0 +* when MRRS is set to more than 128 bytes. Force the MRRS to +* 128 bytes in all downstream devices. +*/ +if (pci_match_id (am6_pci_devids, bridge)) { + bridge_dev =pci_get_host_bridge_device (dev); +if (!bridge_dev && !bridge_dev->parent) +return ; + + ks_pcie =dev_get_drvdata (bridge_dev->parent); +if (!ks_pcie) +return ; + + val =ks_pcie_app_readl (ks_pcie,PID ); + val &=RTL ; + val >>=RTL_SHIFT ; +if (val !=AM6_PCI_PG1_RTL_VER ) +return ; + +if (pcie_get_readrq (dev) >128 ) { +dev_info (&dev->dev,"limiting MRRS to 128 bytes\n" ); +pcie_set_readrq (dev,128 ); + } + } }DECLARE_PCI_FIXUP_ENABLE (PCI_ANY_ID ,PCI_ANY_ID , ks_pcie_quirk);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 91/269 Input: ili210x - use kvmalloc() to allocate buffer for firmware update
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
[ Upstream commit 17f5eebf6780eee50f887542e1833fda95f53e4d ]
Allocating a contiguous buffer of 64K may fail if memory is sufficiently fragmented, and may cause OOM kill of an unrelated process. However we do not need to have contiguous memory. We also do not need to zero out the buffer since it will be overwritten with firmware data.
Switch to using kvmalloc() instead of kzalloc().
--- drivers/input/touchscreen/ili210x.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/input/touchscreen/ili210x.c +3 -3
@@ -597,7 +597,7 @@ static int ili251x_firmware_to_buffer(const struct firmware *fw,* once, copy them all into this buffer at the right locations, and then * do all operations on this linear buffer. */ - fw_buf =kzalloc (SZ_64K ,GFP_KERNEL ); + fw_buf =kvmalloc (SZ_64K ,GFP_KERNEL );if (!fw_buf)return -ENOMEM ;
@@ -627,7 +627,7 @@ static int ili251x_firmware_to_buffer(const struct firmware *fw,return 0 ; err_big: -kfree (fw_buf); +kvfree (fw_buf);return error; }
@@ -870,7 +870,7 @@ static ssize_t ili210x_firmware_update_store(struct device *dev,ili210x_hardware_reset (priv->reset_gpio);dev_dbg (dev,"Firmware update ended, error=%i\n" , error);enable_irq (client->irq); -kfree (fwbuf); +kvfree (fwbuf);return error; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 92/269 media: qcom: camss: Add check for v4l2_fwnode_endpoint_parse
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Ni <[email protected]>
[ Upstream commit 4caf6d93d9f2c11d6441c64e1c549c445fa322ed ]
Add check for the return value of v4l2_fwnode_endpoint_parse() and return the error if it fails in order to catch the error.
--- drivers/media/platform/qcom/camss/camss.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/media/platform/qcom/camss/camss.c +4 -1
@@ -1038,8 +1038,11 @@ static int camss_of_parse_endpoint_node(struct device *dev,struct v4l2_mbus_config_mipi_csi2 *mipi_csi2;struct v4l2_fwnode_endpoint vep = { {0 } };unsigned int i; +int ret; -v4l2_fwnode_endpoint_parse (of_fwnode_handle (node), &vep); + ret =v4l2_fwnode_endpoint_parse (of_fwnode_handle (node), &vep); +if (ret) +return ret; csd->interface.csiphy_id = vep.base.port;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 93/269 pcmcia: Use resource_size function on resource object
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jules Irenge <[email protected]>
[ Upstream commit 24a025497e7e883bd2adef5d0ece1e9b9268009f ]
Cocinnele reports a warning
WARNING: Suspicious code. resource_size is maybe missing with root
The root cause is the function resource_size is not used when needed
Use resource_size() on variable "root" of type resource
--- drivers/pcmcia/yenta_socket.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/pcmcia/yenta_socket.c +3 -3
@@ -638,11 +638,11 @@ static int yenta_search_one_res(struct resource *root, struct resource *res, start =PCIBIOS_MIN_CARDBUS_IO ; end = ~0U ; }else { -unsigned long avail = root->end - root->start; +unsigned long avail =resource_size (root);int i; size =BRIDGE_MEM_MAX ; -if (size > avail/8 ) { - size = (avail+1 )/8 ; +if (size > (avail -1 ) /8 ) { + size = avail /8 ;/* round size down to next power of 2 */ i =0 ;while ((size /=2 ) !=0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 94/269 drm/amd/display: Check denominator pbn_div before used
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Hung <[email protected]>
[ Upstream commit 116a678f3a9abc24f5c9d2525b7393d18d9eb58e ]
[WHAT & HOW]
A denominator cannot be 0, and is checked before used.
This fixes 1 DIVIDE_BY_ZERO issue reported by Coverity.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +1 -1
@@ -6937,7 +6937,7 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state, } } -if (j == dc_state->stream_count) +if (j == dc_state->stream_count || pbn_div ==0 )continue ; slot_num =DIV_ROUND_UP (pbn, pbn_div);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 95/269 drm/amdgpu: check for LINEAR_ALIGNED correctly in check_tiling_flags_gfx6
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Olšák <[email protected]>
[ Upstream commit 11317d2963fa79767cd7c6231a00a9d77f2e0f54 ]
Fix incorrect check.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +1 -2
@@ -909,8 +909,7 @@ static int check_tiling_flags_gfx6(struct amdgpu_framebuffer *afb) {u64 micro_tile_mode; -/* Zero swizzle mode means linear */ -if (AMDGPU_TILING_GET (afb->tiling_flags,SWIZZLE_MODE ) ==0 ) +if (AMDGPU_TILING_GET (afb->tiling_flags,ARRAY_MODE ) ==1 )/* LINEAR_ALIGNED */ return 0 ; micro_tile_mode =AMDGPU_TILING_GET (afb->tiling_flags,MICRO_TILE_MODE );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 96/269 can: bcm: Remove proc entry when dev is unregistered.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 76fe372ccb81b0c89b6cd2fec26e2f38c958be85 ]
syzkaller reported a warning in bcm_connect() below. [0]
The repro calls connect() to vxcan1, removes vxcan1, and calls connect() with ifindex == 0.
Calling connect() for a BCM socket allocates a proc entry. Then, bcm_sk(sk)->bound is set to 1 to prevent further connect().
However, removing the bound device resets bcm_sk(sk)->bound to 0 in bcm_notify().
The 2nd connect() tries to allocate a proc entry with the same name and sets NULL to bcm_sk(sk)->bcm_proc_read, leaking the original proc entry.
Since the proc entry is available only for connect()ed sockets, let's clean up the entry when the bound netdev is unregistered.
[0]:proc_dir_entry 'can-bcm/2456' already registered
WARNING: CPU: 1 PID: 394 at fs/proc/generic.c:376 proc_register+0x645/0x8f0 fs/proc/generic.c:375 Modules linked in: CPU: 1 PID: 394 Comm: syz-executor403 Not tainted 6.10.0-rc7-g852e42cc2dd4 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 RIP: 0010:proc_register+0x645/0x8f0 fs/proc/generic.c:375 Code: 00 00 00 00 00 48 85 ed 0f 85 97 02 00 00 4d 85 f6 0f 85 9f 02 00 00 48 c7 c7 9b cb cf 87 48 89 de 4c 89 fa e8 1c 6f eb fe 90 <0f> 0b 90 90 48 c7 c7 98 37 99 89 e8 cb 7e 22 05 bb 00 00 00 10 48 RSP: 0018:ffa0000000cd7c30 EFLAGS: 00010246 RAX: 9e129be1950f0200 RBX: ff1100011b51582c RCX: ff1100011857cd80 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000002 RBP: 0000000000000000 R08: ffd400000000000f R09: ff1100013e78cac0 R10: ffac800000cd7980 R11: ff1100013e12b1f0 R12: 0000000000000000 R13: 0000000000000000 R14: 0000000000000000 R15: ff1100011a99a2ec FS: 00007fbd7086f740(0000) GS:ff1100013fd00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000200071c0 CR3: 0000000118556004 CR4: 0000000000771ef0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <TASK> proc_create_net_single+0x144/0x210 fs/proc/proc_net.c:220 bcm_connect+0x472/0x840 net/can/bcm.c:1673 __sys_connect_file net/socket.c:2049 [inline] __sys_connect+0x5d2/0x690 net/socket.c:2066 __do_sys_connect net/socket.c:2076 [inline] __se_sys_connect net/socket.c:2073 [inline] __x64_sys_connect+0x8f/0x100 net/socket.c:2073 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xd9/0x1c0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x4b/0x53 RIP: 0033:0x7fbd708b0e5d Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 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 8b 0d 73 9f 1b 00 f7 d8 64 89 01 48 RSP: 002b:00007fff8cd33f08 EFLAGS: 00000246 ORIG_RAX: 000000000000002a RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 00007fbd708b0e5d RDX: 0000000000000010 RSI: 0000000020000040 RDI: 0000000000000003 RBP: 0000000000000000 R08: 0000000000000040 R09: 0000000000000040 R10: 0000000000000040 R11: 0000000000000246 R12: 00007fff8cd34098 R13: 0000000000401280 R14: 0000000000406de8 R15: 00007fbd70ab9000 </TASK>
remove_proc_entry: removing non-empty directory 'net/can-bcm', leaking at least '2456'
--- net/can/bcm.c | 4 ++++ 1 file changed, 4 insertions(+)
net/can/bcm.c +4 -0
@@ -1428,6 +1428,10 @@ static void bcm_notify(struct bcm_sock *bo, unsigned long msg,/* remove device reference, if this is our bound device */ if (bo->bound && bo->ifindex == dev->ifindex) { +#if IS_ENABLED (CONFIG_PROC_FS ) +if (sock_net (sk)->can.bcmproc_dir && bo->bcm_proc_read) +remove_proc_entry (bo->procname,sock_net (sk)->can.bcmproc_dir); +#endif bo->bound =0 ; bo->ifindex =0 ; notify_enodev =1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 97/269 can: m_can: Release irq on error in m_can_open
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Horman <[email protected]>
[ Upstream commit 06d4ef3056a7ac31be331281bb7a6302ef5a7f8a ]
It appears that the irq requested in m_can_open() may be leaked if an error subsequently occurs: if m_can_start() fails.
Address this by calling free_irq in the unwind path for such cases.
Flagged by Smatch.
Compile tested only.
--- drivers/net/can/m_can/m_can.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/can/m_can/m_can.c +4 -1
@@ -1871,7 +1871,7 @@ static int m_can_open(struct net_device *dev)/* start the m_can controller */ err =m_can_start (dev);if (err) - goto exit_irq_fail; + goto exit_start_fail;if (!cdev->is_peripheral)napi_enable (&cdev->napi);
@@ -1880,6 +1880,9 @@ static int m_can_open(struct net_device *dev)return 0 ; +exit_start_fail: +if (cdev->is_peripheral || dev->irq) +free_irq (dev->irq, dev); exit_irq_fail:if (cdev->is_peripheral)destroy_workqueue (cdev->tx_wq);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 98/269 can: mcp251xfd: fix ring configuration when switching from CAN-CC to CAN-FD mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit 50ea5449c56310d2d31c28ba91a59232116d3c1e ]
If the ring (rx, tx) and/or coalescing parameters (rx-frames-irq, tx-frames-irq) have been configured while the interface was in CAN-CC mode, but the interface is brought up in CAN-FD mode, the ring parameters might be too big.
Use the default CAN-FD values in this case.
--- drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.c | 11 +++++++++- .../net/can/spi/mcp251xfd/mcp251xfd-ring.c | 20 ++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-)
drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.c +10 -1
@@ -97,7 +97,16 @@ void can_ram_get_layout(struct can_ram_layout *layout,if (ring) {u8 num_rx_coalesce =0 , num_tx_coalesce =0 ; - num_rx =can_ram_rounddown_pow_of_two (config, &config->rx,0 , ring->rx_pending); +/* If the ring parameters have been configured in +* CAN-CC mode, but and we are in CAN-FD mode now, +* they might be to big. Use the default CAN-FD values +* in this case. +*/ + num_rx = ring->rx_pending; +if (num_rx > layout->max_rx) + num_rx = layout->default_rx; + + num_rx =can_ram_rounddown_pow_of_two (config, &config->rx,0 , num_rx);/* The ethtool doc says: * To disable coalescing, set usecs = 0 and max_frames = 1.
drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c +17 -3
@@ -468,11 +468,25 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)/* switching from CAN-2.0 to CAN-FD mode or vice versa */ if (fd_mode !=test_bit (MCP251XFD_FLAGS_FD_MODE , priv->flags)) { +const struct ethtool_ringparam ring = { + .rx_pending = priv->rx_obj_num, + .tx_pending = priv->tx->obj_num, + }; +const struct ethtool_coalesce ec = { + .rx_coalesce_usecs_irq = priv->rx_coalesce_usecs_irq, + .rx_max_coalesced_frames_irq = priv->rx_obj_num_coalesce_irq, + .tx_coalesce_usecs_irq = priv->tx_coalesce_usecs_irq, + .tx_max_coalesced_frames_irq = priv->tx_obj_num_coalesce_irq, + };struct can_ram_layout layout; -can_ram_get_layout (&layout, &mcp251xfd_ram_config,NULL ,NULL , fd_mode); - priv->rx_obj_num = layout.default_rx; - tx_ring->obj_num = layout.default_tx; +can_ram_get_layout (&layout, &mcp251xfd_ram_config, &ring, &ec, fd_mode); + + priv->rx_obj_num = layout.cur_rx; + priv->rx_obj_num_coalesce_irq = layout.rx_coalesce; + + tx_ring->obj_num = layout.cur_tx; + priv->tx_obj_num_coalesce_irq = layout.tx_coalesce; }if (fd_mode) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 99/269 rust: Use awk instead of recent xargs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Maurer <[email protected]>
[ Upstream commit 45f97e6385cad6d0e48a27ddcd08793bb4d35851 ]
awk is already required by the kernel build, and the xargs feature used in current Rust detection is not present in all xargs (notably, toybox based xargs, used in the Android kernel build).
Stable-dep-of: b8673d56935c ("rust: kbuild: fix export of bss symbols")
--- rust/Makefile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
rust/Makefile +1 -3
@@ -363,9 +363,7 @@ $(obj)/bindings/bindings_helpers_generated.rs: $(src)/helpers.c FORCE quiet_cmd_exports = EXPORTS $@ cmd_exports = \ $(NM) -p --defined-only $< \ - | grep -E ' (T|R|D) ' | cut -d ' ' -f 3 \ - | xargs -Isymbol \ - echo 'EXPORT_SYMBOL_RUST_GPL(symbol);' > $@ + | awk '/ (T|R|D) / {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@ $(obj)/exports_core_generated.h: $(obj)/core.o FORCE $(call if_changed,exports)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 100/269 rust: kbuild: fix export of bss symbols
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Hindborg <[email protected]>
[ Upstream commit b8673d56935c32a4e0a1a0b40951fdd313dbf340 ]
Symbols in the bss segment are not currently exported. This is a problem for Rust modules that link against statics, that are resident in the kernel image. Thus export symbols in the bss segment.
--- rust/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
rust/Makefile +1 -1
@@ -363,7 +363,7 @@ $(obj)/bindings/bindings_helpers_generated.rs: $(src)/helpers.c FORCE quiet_cmd_exports = EXPORTS $@ cmd_exports = \ $(NM) -p --defined-only $< \ - | awk '/ (T|R|D) / {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@ + | awk '/ (T|R|D|B) / {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@ $(obj)/exports_core_generated.h: $(obj)/core.o FORCE $(call if_changed,exports)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 101/269 cifs: Fix FALLOC_FL_ZERO_RANGE to preflush buffered part of target region
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 91d1dfae464987aaf6c79ff51d8674880fb3be77 ]
Under certain conditions, the range to be cleared by FALLOC_FL_ZERO_RANGE may only be buffered locally and not yet have been flushed to the server. For example:
xfs_io -f -t -c "pwrite -S 0x41 0 4k" \ -c "pwrite -S 0x42 4k 4k" \ -c "fzero 0 4k" \ -c "pread -v 0 8k" /xfstest.test/foo
will write two 4KiB blocks of data, which get buffered in the pagecache, and then fallocate() is used to clear the first 4KiB block on the server - but we don't flush the data first, which means the EOF position on the server is wrong, and so the FSCTL_SET_ZERO_DATA RPC fails (and xfs_io ignores the error), but then when we try to read it, we see the old data.
Fix this by preflushing any part of the target region that above the server's idea of the EOF position to force the server to update its EOF position.
Note, however, that we don't want to simply expand the file by moving the EOF before doing the FSCTL_SET_ZERO_DATA[*] because someone else might see the zeroed region or if the RPC fails we then have to try to clean it up or risk getting corruption.
[*] And we have to move the EOF first otherwise FSCTL_SET_ZERO_DATA won't do what we want.
This fixes the generic/008 xfstest.
[!] Note: A better way to do this might be to split the operation into two
parts: we only do FSCTL_SET_ZERO_DATA for the part of the range below the server's EOF and then, if that worked, invalidate the buffered pages for the part above the range.
--- fs/smb/client/smb2ops.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
fs/smb/client/smb2ops.c +14 -2
@@ -3186,13 +3186,15 @@ static long smb3_zero_data(struct file *file, struct cifs_tcon *tcon, }static long smb3_zero_range (struct file *file,struct cifs_tcon *tcon, -loff_t offset,loff_t len,bool keep_size) +unsigned long long offset,unsigned long long len, +bool keep_size) {struct cifs_ses *ses = tcon->ses;struct inode *inode =file_inode (file);struct cifsInodeInfo *cifsi =CIFS_I (inode);struct cifsFileInfo *cfile = file->private_data; -unsigned long long new_size; +struct netfs_inode *ictx =netfs_inode (inode); +unsigned long long i_size, new_size, remote_size;long rc;unsigned int xid;
@@ -3204,6 +3206,16 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,inode_lock (inode);filemap_invalidate_lock (inode->i_mapping); + i_size =i_size_read (inode); + remote_size = ictx->remote_i_size; +if (offset + len >= remote_size && offset < i_size) { +unsigned long long top =umin (offset + len, i_size); + + rc =filemap_write_and_wait_range (inode->i_mapping, offset, top -1 ); +if (rc <0 ) + goto zero_range_exit; + } +/* * We zero the range through ioctl, so we need remove the page caches * first, otherwise the data may be inconsistent with the server.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 102/269 igb: Fix not clearing TimeSync interrupts for 82580
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daiwei Li <[email protected]>
[ Upstream commit ba8cf80724dbc09825b52498e4efacb563935408 ]
82580 NICs have a hardware bug that makes it
necessary to write into the TSICR (TimeSync Interrupt Cause) register to clear it:
https://lore.kernel.org/all/CDCB8BE0.1EC2C%[email protected]/
Add a conditional so only for 82580 we write into the TSICR register, so we don't risk losing events for other models.
Without this change, when running ptp4l with an Intel 82580 card, I get the following output:
Quoted 3 lines
timed out while polling for tx timestamp increasing
tx_timestamp_timeoutor increasing kworker priority may correct this issue, but a driver bug likely causes it
This goes away with this change.
This (partially) reverts commit ee14cc9ea19b ("igb: Fix missing time sync events").
--- drivers/net/ethernet/intel/igb/igb_main.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/ethernet/intel/igb/igb_main.c +10 -0
@@ -6985,10 +6985,20 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)static void igb_tsync_interrupt (struct igb_adapter *adapter) { +const u32 mask = (TSINTR_SYS_WRAP |E1000_TSICR_TXTS | +TSINTR_TT0 |TSINTR_TT1 | +TSINTR_AUTT0 |TSINTR_AUTT1 );struct e1000_hw *hw = &adapter->hw;u32 tsicr =rd32 (E1000_TSICR );struct ptp_clock_event event; +if (hw->mac.type == e1000_82580) { +/* 82580 has a hardware bug that requires an explicit +* write to clear the TimeSync interrupt cause. +*/ +wr32 (E1000_TSICR , tsicr & mask); + } +if (tsicr &TSINTR_SYS_WRAP ) { event.type =PTP_CLOCK_PPS ;if (adapter->ptp_caps.pps)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 103/269 ice: Add netif_device_attach/detach into PF reset flow
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dawid Osuchowski <[email protected]>
[ Upstream commit d11a67634227f9f9da51938af085fb41a733848f ]
Ethtool callbacks can be executed while reset is in progress and try to access deleted resources, e.g. getting coalesce settings can result in a NULL pointer dereference seen below.
Reproduction steps:
Once the driver is fully initialized, trigger reset:
# echo 1 > /sys/class/net/<interface>/device/reset when reset is in progress try to get coalesce settings using ethtool: # ethtool -c <interface>
BUG: kernel NULL pointer dereference, address: 0000000000000020 PGD 0 P4D 0 Oops: Oops: 0000 [#1] PREEMPT SMP PTI CPU: 11 PID: 19713 Comm: ethtool Tainted: G S 6.10.0-rc7+ #7 RIP: 0010:ice_get_q_coalesce+0x2e/0xa0 [ice] RSP: 0018:ffffbab1e9bcf6a8 EFLAGS: 00010206 RAX: 000000000000000c RBX: ffff94512305b028 RCX: 0000000000000000 RDX: 0000000000000000 RSI: ffff9451c3f2e588 RDI: ffff9451c3f2e588 RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000 R10: ffff9451c3f2e580 R11: 000000000000001f R12: ffff945121fa9000 R13: ffffbab1e9bcf760 R14: 0000000000000013 R15: ffffffff9e65dd40 FS: 00007faee5fbe740(0000) GS:ffff94546fd80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000020 CR3: 0000000106c2e005 CR4: 00000000001706f0 Call Trace: <TASK> ice_get_coalesce+0x17/0x30 [ice] coalesce_prepare_data+0x61/0x80 ethnl_default_doit+0xde/0x340 genl_family_rcv_msg_doit+0xf2/0x150 genl_rcv_msg+0x1b3/0x2c0 netlink_rcv_skb+0x5b/0x110 genl_rcv+0x28/0x40 netlink_unicast+0x19c/0x290 netlink_sendmsg+0x222/0x490 __sys_sendto+0x1df/0x1f0 __x64_sys_sendto+0x24/0x30 do_syscall_64+0x82/0x160 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7faee60d8e27
Calling netif_device_detach() before reset makes the net core not call the driver when ethtool command is issued, the attempt to execute an ethtool command during reset will result in the following message:
netlink error: No such device
instead of NULL pointer dereference. Once reset is done and ice_rebuild() is executing, the netif_device_attach() is called to allow for ethtool operations to occur again in a safe manner.
--- drivers/net/ethernet/intel/ice/ice_main.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/ethernet/intel/ice/ice_main.c +7 -0
@@ -606,6 +606,9 @@ ice_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)memset (&vsi->mqprio_qopt,0 ,sizeof (vsi->mqprio_qopt)); } } + +if (vsi->netdev) +netif_device_detach (vsi->netdev); skip:/* clear SW filtering DB */
@@ -7295,6 +7298,7 @@ static void ice_update_pf_netdev_link(struct ice_pf *pf)*/ static void ice_rebuild (struct ice_pf *pf,enum ice_reset_req reset_type) { +struct ice_vsi *vsi =ice_get_main_vsi (pf);struct device *dev =ice_pf_to_dev (pf);struct ice_hw *hw = &pf->hw;bool dvm;
@@ -7447,6 +7451,9 @@ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)ice_rebuild_arfs (pf); } +if (vsi && vsi->netdev) +netif_device_attach (vsi->netdev); +ice_update_pf_netdev_link (pf);/* tell the firmware we are up */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 104/269 platform/x86: dell-smbios: Fix error path in dell_smbios_init()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksandr Mishin <[email protected]>
[ Upstream commit ffc17e1479e8e9459b7afa80e5d9d40d0dd78abb ]
In case of error in build_tokens_sysfs(), all the memory that has been allocated is freed at end of this function. But then free_group() is called which performs memory deallocation again.
Also, instead of free_group() call, there should be exit_dell_smbios_smm() and exit_dell_smbios_wmi() calls, since there is initialization, but there is no release of resources in case of an error.
Fix these issues by replacing free_group() call with exit_dell_smbios_wmi() and exit_dell_smbios_smm().
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/platform/x86/dell/dell-smbios-base.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/platform/x86/dell/dell-smbios-base.c +4 -1
@@ -590,7 +590,10 @@ static int __init dell_smbios_init(void)return 0 ; fail_sysfs: -free_group (platform_device); +if (!wmi) +exit_dell_smbios_wmi (); +if (!smm) +exit_dell_smbios_smm (); fail_create_group:platform_device_del (platform_device);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 105/269 regulator: core: Stub devm_regulator_bulk_get_const() if !CONFIG_REGULATOR
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Douglas Anderson <[email protected]>
[ Upstream commit 1a5caec7f80ca2e659c03f45378ee26915f4eda2 ]
When adding devm_regulator_bulk_get_const() I missed adding a stub for when CONFIG_REGULATOR is not enabled. Under certain conditions (like randconfig testing) this can cause the compiler to reports errors like:
error: implicit declaration of function 'devm_regulator_bulk_get_const'; did you mean 'devm_regulator_bulk_get_enable'?
Add the stub.
--- include/linux/regulator/consumer.h | 8 ++++++++ 1 file changed, 8 insertions(+)
include/linux/regulator/consumer.h +8 -0
@@ -489,6 +489,14 @@ static inline int of_regulator_bulk_get_all(struct device *dev, struct device_noreturn 0 ; } +static inline int devm_regulator_bulk_get_const ( +struct device *dev,int num_consumers, +const struct regulator_bulk_data *in_consumers, +struct regulator_bulk_data **out_consumers) +{ +return 0 ; +} +static inline int regulator_bulk_enable (int num_consumers,struct regulator_bulk_data *consumers) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 106/269 can: kvaser_pciefd: Skip redundant NULL pointer check in ISR
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Jocic <[email protected]>
[ Upstream commit ac765219c2c4e44f29063724c8d36435a3e61985 ]
This check is already done at the creation of the net devices in kvaser_pciefd_setup_can_ctrls called from kvaser_pciefd_probe.
If it fails, the driver won't load, so there should be no need to repeat the check inside the ISR. The number of channels is read from the FPGA and should be trusted.
Stable-dep-of: dd885d90c047 ("can: kvaser_pciefd: Use a single write when releasing RX buffers")
--- drivers/net/can/kvaser_pciefd.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/net/can/kvaser_pciefd.c +0 -6
@@ -1641,12 +1641,6 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)kvaser_pciefd_receive_irq (pcie);for (i =0 ; i < pcie->nr_channels; i++) { -if (!pcie->can[i]) { -dev_err (&pcie->pci->dev, -"IRQ mask points to unallocated controller\n" ); -break ; - } -/* Check that mask matches channel (i) IRQ mask */ if (board_irq & irq_mask->kcan_tx[i])kvaser_pciefd_transmit_irq (pcie->can[i]);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 107/269 can: kvaser_pciefd: Remove unnecessary comment
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Jocic <[email protected]>
[ Upstream commit 11d186697ceb10b68c6a1fd505635346b1ccd055 ]
The code speaks for itself.
Stable-dep-of: dd885d90c047 ("can: kvaser_pciefd: Use a single write when releasing RX buffers")
--- drivers/net/can/kvaser_pciefd.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/can/kvaser_pciefd.c +0 -1
@@ -1641,7 +1641,6 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)kvaser_pciefd_receive_irq (pcie);for (i =0 ; i < pcie->nr_channels; i++) { -/* Check that mask matches channel (i) IRQ mask */ if (board_irq & irq_mask->kcan_tx[i])kvaser_pciefd_transmit_irq (pcie->can[i]); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 108/269 can: kvaser_pciefd: Rename board_irq to pci_irq
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Jocic <[email protected]>
[ Upstream commit cbf88a6ba7bb6ce0d3131b119298f73bd7b18459 ]
Rename the variable name board_irq in the ISR to pci_irq to be more specific and to match the macro by which it is read.
Stable-dep-of: dd885d90c047 ("can: kvaser_pciefd: Use a single write when releasing RX buffers")
--- drivers/net/can/kvaser_pciefd.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/can/kvaser_pciefd.c +4 -4
@@ -1631,17 +1631,17 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev) {struct kvaser_pciefd *pcie = (struct kvaser_pciefd *)dev;const struct kvaser_pciefd_irq_mask *irq_mask = pcie->driver_data->irq_mask; -u32 board_irq =ioread32 (KVASER_PCIEFD_PCI_IRQ_ADDR (pcie)); +u32 pci_irq =ioread32 (KVASER_PCIEFD_PCI_IRQ_ADDR (pcie));int i; -if (!(board_irq & irq_mask->all)) +if (!(pci_irq & irq_mask->all))return IRQ_NONE ; -if (board_irq & irq_mask->kcan_rx0) +if (pci_irq & irq_mask->kcan_rx0)kvaser_pciefd_receive_irq (pcie);for (i =0 ; i < pcie->nr_channels; i++) { -if (board_irq & irq_mask->kcan_tx[i]) +if (pci_irq & irq_mask->kcan_tx[i])kvaser_pciefd_transmit_irq (pcie->can[i]); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 109/269 can: kvaser_pciefd: Move reset of DMA RX buffers to the end of the ISR
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Jocic <[email protected]>
[ Upstream commit 48f827d4f48f5243e37b9240029ce3f456d1f490 ]
A new interrupt is triggered by resetting the DMA RX buffers. Since MSI interrupts are faster than legacy interrupts, the reset of the DMA buffers must be moved to the very end of the ISR, otherwise a new MSI interrupt will be masked by the current one.
Stable-dep-of: dd885d90c047 ("can: kvaser_pciefd: Use a single write when releasing RX buffers")
--- drivers/net/can/kvaser_pciefd.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-)
drivers/net/can/kvaser_pciefd.c +18 -12
@@ -1580,23 +1580,15 @@ static int kvaser_pciefd_read_buffer(struct kvaser_pciefd *pcie, int dma_buf)return res; } -static void kvaser_pciefd_receive_irq (struct kvaser_pciefd *pcie) +static u32 kvaser_pciefd_receive_irq (struct kvaser_pciefd *pcie) {u32 irq =ioread32 (KVASER_PCIEFD_SRB_ADDR (pcie) +KVASER_PCIEFD_SRB_IRQ_REG ); -if (irq &KVASER_PCIEFD_SRB_IRQ_DPD0 ) { +if (irq &KVASER_PCIEFD_SRB_IRQ_DPD0 )kvaser_pciefd_read_buffer (pcie,0 ); -/* Reset DMA buffer 0 */ -iowrite32 (KVASER_PCIEFD_SRB_CMD_RDB0 , -KVASER_PCIEFD_SRB_ADDR (pcie) +KVASER_PCIEFD_SRB_CMD_REG ); - } -if (irq &KVASER_PCIEFD_SRB_IRQ_DPD1 ) { +if (irq &KVASER_PCIEFD_SRB_IRQ_DPD1 )kvaser_pciefd_read_buffer (pcie,1 ); -/* Reset DMA buffer 1 */ -iowrite32 (KVASER_PCIEFD_SRB_CMD_RDB1 , -KVASER_PCIEFD_SRB_ADDR (pcie) +KVASER_PCIEFD_SRB_CMD_REG ); - } if (irq & KVASER_PCIEFD_SRB_IRQ_DOF0 || irq & KVASER_PCIEFD_SRB_IRQ_DOF1 ||
@@ -1605,6 +1597,7 @@ static void kvaser_pciefd_receive_irq(struct kvaser_pciefd *pcie)dev_err (&pcie->pci->dev,"DMA IRQ error 0x%08X\n" , irq);iowrite32 (irq,KVASER_PCIEFD_SRB_ADDR (pcie) +KVASER_PCIEFD_SRB_IRQ_REG ); +return irq; }static void kvaser_pciefd_transmit_irq (struct kvaser_pciefd_can *can)
@@ -1632,19 +1625,32 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)struct kvaser_pciefd *pcie = (struct kvaser_pciefd *)dev;const struct kvaser_pciefd_irq_mask *irq_mask = pcie->driver_data->irq_mask;u32 pci_irq =ioread32 (KVASER_PCIEFD_PCI_IRQ_ADDR (pcie)); +u32 srb_irq =0 ;int i;if (!(pci_irq & irq_mask->all))return IRQ_NONE ;if (pci_irq & irq_mask->kcan_rx0) -kvaser_pciefd_receive_irq (pcie); + srb_irq =kvaser_pciefd_receive_irq (pcie);for (i =0 ; i < pcie->nr_channels; i++) {if (pci_irq & irq_mask->kcan_tx[i])kvaser_pciefd_transmit_irq (pcie->can[i]); } +if (srb_irq &KVASER_PCIEFD_SRB_IRQ_DPD0 ) { +/* Reset DMA buffer 0, may trigger new interrupt */ +iowrite32 (KVASER_PCIEFD_SRB_CMD_RDB0 , +KVASER_PCIEFD_SRB_ADDR (pcie) +KVASER_PCIEFD_SRB_CMD_REG ); + } + +if (srb_irq &KVASER_PCIEFD_SRB_IRQ_DPD1 ) { +/* Reset DMA buffer 1, may trigger new interrupt */ +iowrite32 (KVASER_PCIEFD_SRB_CMD_RDB1 , +KVASER_PCIEFD_SRB_ADDR (pcie) +KVASER_PCIEFD_SRB_CMD_REG ); + } +return IRQ_HANDLED ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 110/269 can: kvaser_pciefd: Use a single write when releasing RX buffers
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Jocic <[email protected]>
[ Upstream commit dd885d90c047dbdd2773c1d33954cbd8747d81e2 ]
Kvaser's PCIe cards uses the KCAN FPGA IP block which has dual 4K buffers for incoming messages shared by all (currently up to eight) channels. While the driver processes messages in one buffer, new incoming messages are stored in the other and so on.
The design of KCAN is such that a buffer must be fully read and then released. Releasing a buffer will make the FPGA switch buffers. If the other buffer contains at least one incoming message the FPGA will also instantly issue a new interrupt, if not the interrupt will be issued after receiving the first new message.
With IRQx interrupts, it takes a little time for the interrupt to happen, enough for any previous ISR call to do it's business and return, but MSI interrupts are way faster so this time is reduced to almost nothing.
So with MSI, releasing the buffer HAS to be the very last action of the ISR before returning, otherwise the new interrupt might be "masked" by the kernel because the previous ISR call hasn't returned. And the interrupts are edge-triggered so we cannot loose one, or the ping-pong reading process will stop.
This is why this patch modifies the driver to use a single write to the SRB_CMD register before returning.
--- drivers/net/can/kvaser_pciefd.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-)
drivers/net/can/kvaser_pciefd.c +8 -10
@@ -1626,6 +1626,7 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)const struct kvaser_pciefd_irq_mask *irq_mask = pcie->driver_data->irq_mask;u32 pci_irq =ioread32 (KVASER_PCIEFD_PCI_IRQ_ADDR (pcie));u32 srb_irq =0 ; +u32 srb_release =0 ;int i;if (!(pci_irq & irq_mask->all))
@@ -1639,17 +1640,14 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)kvaser_pciefd_transmit_irq (pcie->can[i]); } -if (srb_irq &KVASER_PCIEFD_SRB_IRQ_DPD0 ) { -/* Reset DMA buffer 0, may trigger new interrupt */ -iowrite32 (KVASER_PCIEFD_SRB_CMD_RDB0 , -KVASER_PCIEFD_SRB_ADDR (pcie) +KVASER_PCIEFD_SRB_CMD_REG ); - } +if (srb_irq &KVASER_PCIEFD_SRB_IRQ_DPD0 ) + srb_release |=KVASER_PCIEFD_SRB_CMD_RDB0 ; -if (srb_irq &KVASER_PCIEFD_SRB_IRQ_DPD1 ) { -/* Reset DMA buffer 1, may trigger new interrupt */ -iowrite32 (KVASER_PCIEFD_SRB_CMD_RDB1 , -KVASER_PCIEFD_SRB_ADDR (pcie) +KVASER_PCIEFD_SRB_CMD_REG ); - } +if (srb_irq &KVASER_PCIEFD_SRB_IRQ_DPD1 ) + srb_release |=KVASER_PCIEFD_SRB_CMD_RDB1 ; + +if (srb_release) +iowrite32 (srb_release,KVASER_PCIEFD_SRB_ADDR (pcie) +KVASER_PCIEFD_SRB_CMD_REG );return IRQ_HANDLED ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 111/269 Bluetooth: qca: If memdump doesnt work, re-enable IBS
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Douglas Anderson <[email protected]>
[ Upstream commit 8ae22de9d2eae3c432de64bf2b3a5a69cf1d1124 ]
On systems in the field, we are seeing this sometimes in the kernel logs:
Bluetooth: qca_controller_memdump() hci0: hci_devcd_init Return:-95
This means that _something_ decided that it wanted to get a memdump but then hci_devcd_init() returned -EOPNOTSUPP (AKA -95).
The cleanup code in qca_controller_memdump() when we get back an error from hci_devcd_init() undoes most things but forgets to clear QCA_IBS_DISABLED. One side effect of this is that, during the next suspend, qca_suspend() will always get a timeout.
Let's fix it so that we clear the bit.
--- drivers/bluetooth/hci_qca.c | 1 + 1 file changed, 1 insertion(+)
drivers/bluetooth/hci_qca.c +1 -0
@@ -1090,6 +1090,7 @@ static void qca_controller_memdump(struct work_struct *work) qca->memdump_state =QCA_MEMDUMP_COLLECTED ;cancel_delayed_work (&qca->ctrl_memdump_timeout);clear_bit (QCA_MEMDUMP_COLLECTION , &qca->flags); +clear_bit (QCA_IBS_DISABLED , &qca->flags);mutex_unlock (&qca->hci_memdump_lock);return ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 112/269 Bluetooth: hci_event: Use HCI error defines instead of magic values
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Dreßler <[email protected]>
[ Upstream commit 79c0868ad65a8fc7cdfaa5f2b77a4b70d0b0ea16 ]
We have error defines already, so let's use them.
Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
--- include/net/bluetooth/hci.h | 2 ++ net/bluetooth/hci_event.c | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-)
include/net/bluetooth/hci.h +2 -0
@@ -644,6 +644,7 @@ enum {#define HCI_ERROR_PIN_OR_KEY_MISSING 0x06#define HCI_ERROR_MEMORY_EXCEEDED 0x07#define HCI_ERROR_CONNECTION_TIMEOUT 0x08 +#define HCI_ERROR_COMMAND_DISALLOWED 0x0c#define HCI_ERROR_REJ_LIMITED_RESOURCES 0x0d#define HCI_ERROR_REJ_BAD_ADDR 0x0f#define HCI_ERROR_INVALID_PARAMETERS 0x12
@@ -652,6 +653,7 @@ enum {#define HCI_ERROR_REMOTE_POWER_OFF 0x15#define HCI_ERROR_LOCAL_HOST_TERM 0x16#define HCI_ERROR_PAIRING_NOT_ALLOWED 0x18 +#define HCI_ERROR_UNSUPPORTED_REMOTE_FEATURE 0x1e#define HCI_ERROR_INVALID_LL_PARAMS 0x1e#define HCI_ERROR_UNSPECIFIED 0x1f#define HCI_ERROR_ADVERTISING_TIMEOUT 0x3c
net/bluetooth/hci_event.c +4 -4
@@ -93,11 +93,11 @@ static u8 hci_cc_inquiry_cancel(struct hci_dev *hdev, void *data,/* It is possible that we receive Inquiry Complete event right * before we receive Inquiry Cancel Command Complete event, in * which case the latter event should have status of Command -* Disallowed (0x0c). This should not be treated as error, since +* Disallowed. This should not be treated as error, since * we actually achieve what Inquiry Cancel wants to achieve, * which is to end the last Inquiry session. */ -if (rp->status ==0x0c && !test_bit (HCI_INQUIRY , &hdev->flags)) { +if (rp->status ==HCI_ERROR_COMMAND_DISALLOWED && !test_bit (HCI_INQUIRY , &hdev->flags)) {bt_dev_warn (hdev,"Ignoring error of Inquiry Cancel command" ); rp->status =0x00 ; }
@@ -2285,7 +2285,7 @@ static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)if (status) {if (conn && conn->state ==BT_CONNECT ) { -if (status !=0x0c || conn->attempt >2 ) { +if (status !=HCI_ERROR_COMMAND_DISALLOWED || conn->attempt >2 ) { conn->state =BT_CLOSED ;hci_connect_cfm (conn, status);hci_conn_del (conn);
@@ -6430,7 +6430,7 @@ static void hci_le_remote_feat_complete_evt(struct hci_dev *hdev, void *data,* transition into connected state and mark it as * successful. */ -if (!conn->out && ev->status ==0x1a && +if (!conn->out && ev->status ==HCI_ERROR_UNSUPPORTED_REMOTE_FEATURE && (hdev->le_features[0 ] &HCI_LE_PERIPHERAL_FEATURES )) status =0x00 ;else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 113/269 Bluetooth: hci_conn: Only do ACL connections sequentially
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Dreßler <[email protected]>
[ Upstream commit 45340097ce6ea7e875674a5a7d24c95ecbc93ef9 ]
Pretty much all bluetooth chipsets only support paging a single device at a time, and if they don't reject a secondary "Create Connection" request while another is still ongoing, they'll most likely serialize those requests in the firware.
With commit 4c67bc74f016 ("[Bluetooth] Support concurrent connect requests") we started adding some serialization of our own in case the adapter returns "Command Disallowed" HCI error.
This commit was using the BT_CONNECT2 state for the serialization, this state is also used for a few more things (most notably to indicate we're waiting for an inquiry to cancel) and therefore a bit unreliable. Also not all BT firwares would respond with "Command Disallowed" on too many connection requests, some will also respond with "Hardware Failure" (BCM4378), and others will error out later and send a "Connect Complete" event with error "Rejected Limited Resources" (Marvell 88W8897).
We can clean things up a bit and also make the serialization more reliable by using our hci_sync machinery to always do "Create Connection" requests in a sequential manner.
This is very similar to what we're already doing for establishing LE connections, and it works well there.
Note that this causes a test failure in mgmt-tester (test "Pair Device
- Power off 1") because the hci_abort_conn_sync() changes the error we return on timeout of the "Create Connection". We'll fix this on the mgmt-tester side by adjusting the expected error for the test.
Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
--- include/net/bluetooth/hci.h | 1 + include/net/bluetooth/hci_sync.h | 3 ++ net/bluetooth/hci_conn.c | 69 ++++--------------------------- net/bluetooth/hci_sync.c | 70 ++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 60 deletions(-)
include/net/bluetooth/hci.h +1 -0
@@ -430,6 +430,7 @@ enum {#define HCI_NCMD_TIMEOUT msecs_to_jiffies(4000)/* 4 seconds */ #define HCI_ACL_TX_TIMEOUT msecs_to_jiffies(45000)/* 45 seconds */ #define HCI_AUTO_OFF_TIMEOUT msecs_to_jiffies(2000)/* 2 seconds */ +#define HCI_ACL_CONN_TIMEOUT msecs_to_jiffies(20000)/* 20 seconds */ #define HCI_LE_CONN_TIMEOUT msecs_to_jiffies(20000)/* 20 seconds */ #define HCI_LE_AUTOCONN_TIMEOUT msecs_to_jiffies(4000)/* 4 seconds */
include/net/bluetooth/hci_sync.h +3 -0
@@ -140,3 +140,6 @@ int hci_le_terminate_big_sync(struct hci_dev *hdev, u8 handle, u8 reason);int hci_le_big_terminate_sync (struct hci_dev *hdev,u8 handle);int hci_le_pa_terminate_sync (struct hci_dev *hdev,u16 handle); + +int hci_acl_create_connection_sync (struct hci_dev *hdev, +struct hci_conn *conn);
net/bluetooth/hci_conn.c +9 -60
90 lines not on this page · raw message
net/bluetooth/hci_sync.c +70 -0
73 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 114/269 Bluetooth: Remove pending ACL connection attempts
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Dreßler <[email protected]>
[ Upstream commit 4aa42119d971603dc9e4d8cf4f53d5fcf082ea7d ]
With the last commit we moved to using the hci_sync queue for "Create Connection" requests, removing the need for retrying the paging after finished/failed "Create Connection" requests and after the end of inquiries.
hci_conn_check_pending() was used to trigger this retry, we can remove it now.
Note that we can also remove the special handling for COMMAND_DISALLOWED errors in the completion handler of "Create Connection", because "Create Connection" requests are now always serialized.
This is somewhat reverting commit 4c67bc74f016 ("[Bluetooth] Support concurrent connect requests").
With this, the BT_CONNECT2 state of ACL hci_conn objects should now be back to meaning only one thing: That we received a "Connection Request" from another device (see hci_conn_request_evt), but the response to that is going to be deferred.
Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
--- include/net/bluetooth/hci_core.h | 1 - net/bluetooth/hci_conn.c | 16 ---------------- net/bluetooth/hci_event.c | 21 ++++----------------- 3 files changed, 4 insertions(+), 34 deletions(-)
include/net/bluetooth/hci_core.h +0 -1
@@ -1417,7 +1417,6 @@ struct hci_conn *hci_conn_add_unset(struct hci_dev *hdev, int type, bdaddr_t *dst, u8 role);void hci_conn_del (struct hci_conn *conn);void hci_conn_hash_flush (struct hci_dev *hdev); -void hci_conn_check_pending (struct hci_dev *hdev);struct hci_chan *hci_chan_create (struct hci_conn *conn);void hci_chan_del (struct hci_chan *chan);
net/bluetooth/hci_conn.c +0 -16
@@ -2565,22 +2565,6 @@ void hci_conn_hash_flush(struct hci_dev *hdev) } } -/* Check pending connect attempts */ -void hci_conn_check_pending (struct hci_dev *hdev) -{ -struct hci_conn *conn; - -BT_DBG ("hdev %s" , hdev->name); - -hci_dev_lock (hdev); - - conn =hci_conn_hash_lookup_state (hdev,ACL_LINK ,BT_CONNECT2 ); -if (conn) -hci_acl_create_connection_sync (hdev, conn); - -hci_dev_unlock (hdev); -} -static u32 get_link_mode (struct hci_conn *conn) {u32 link_mode =0 ;
net/bluetooth/hci_event.c +4 -17
@@ -118,8 +118,6 @@ static u8 hci_cc_inquiry_cancel(struct hci_dev *hdev, void *data,hci_discovery_set_state (hdev,DISCOVERY_STOPPED );hci_dev_unlock (hdev); -hci_conn_check_pending (hdev); -return rp->status; }
@@ -150,8 +148,6 @@ static u8 hci_cc_exit_periodic_inq(struct hci_dev *hdev, void *data,hci_dev_clear_flag (hdev,HCI_PERIODIC_INQ ); -hci_conn_check_pending (hdev); -return rp->status; }
@@ -2257,10 +2253,8 @@ static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status) {bt_dev_dbg (hdev,"status 0x%2.2x" , status); -if (status) { -hci_conn_check_pending (hdev); +if (status)return ; - }if (hci_sent_cmd_data (hdev,HCI_OP_INQUIRY ))set_bit (HCI_INQUIRY , &hdev->flags);
@@ -2285,12 +2279,9 @@ static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)if (status) {if (conn && conn->state ==BT_CONNECT ) { -if (status !=HCI_ERROR_COMMAND_DISALLOWED || conn->attempt >2 ) { - conn->state =BT_CLOSED ; -hci_connect_cfm (conn, status); -hci_conn_del (conn); - }else - conn->state =BT_CONNECT2 ; + conn->state =BT_CLOSED ; +hci_connect_cfm (conn, status); +hci_conn_del (conn); } }else {if (!conn) {
@@ -2980,8 +2971,6 @@ static void hci_inquiry_complete_evt(struct hci_dev *hdev, void *data,bt_dev_dbg (hdev,"status 0x%2.2x" , ev->status); -hci_conn_check_pending (hdev); -if (!test_and_clear_bit (HCI_INQUIRY , &hdev->flags))return ;
@@ -3228,8 +3217,6 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data, unlock:hci_dev_unlock (hdev); - -hci_conn_check_pending (hdev); }static void hci_reject_conn (struct hci_dev *hdev,bdaddr_t *bdaddr)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 115/269 Bluetooth: hci_conn: Fix UAF Write in __hci_acl_create_connection_sync
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 5f641f03abccddd1a37233ff1b8e774b9ff1f4e8 ]
This fixes the UAF on __hci_acl_create_connection_sync caused by connection abortion, it uses the same logic as to LE_LINK which uses hci_cmd_sync_cancel to prevent the callback to run if the connection is abort prematurely.
Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
--- include/net/bluetooth/hci_sync.h | 3 +-- net/bluetooth/hci_conn.c | 3 ++- net/bluetooth/hci_sync.c | 16 ++++++++++------ 3 files changed, 13 insertions(+), 9 deletions(-)
include/net/bluetooth/hci_sync.h +1 -2
@@ -141,5 +141,4 @@ int hci_le_big_terminate_sync(struct hci_dev *hdev, u8 handle);int hci_le_pa_terminate_sync (struct hci_dev *hdev,u16 handle); -int hci_acl_create_connection_sync (struct hci_dev *hdev, -struct hci_conn *conn); +int hci_connect_acl_sync (struct hci_dev *hdev,struct hci_conn *conn);
net/bluetooth/hci_conn.c +2 -1
@@ -1650,7 +1650,7 @@ struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst, acl->pending_sec_level = sec_level; acl->auth_type = auth_type; - err =hci_acl_create_connection_sync (hdev, acl); + err =hci_connect_acl_sync (hdev, acl);if (err) {hci_conn_del (acl);return ERR_PTR (err);
@@ -2913,6 +2913,7 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)*/ if (conn->state ==BT_CONNECT && hdev->req_status ==HCI_REQ_PEND ) {switch (hci_skb_event (hdev->sent_cmd)) { +case HCI_EV_CONN_COMPLETE :case HCI_EV_LE_CONN_COMPLETE :case HCI_EV_LE_ENHANCED_CONN_COMPLETE :case HCI_EVT_LE_CIS_ESTABLISHED :
net/bluetooth/hci_sync.c +10 -6
@@ -6578,13 +6578,18 @@ int hci_update_adv_data(struct hci_dev *hdev, u8 instance) UINT_PTR(instance), NULL); } -static int __hci_acl_create_connection_sync (struct hci_dev *hdev,void *data) +static int hci_acl_create_conn_sync (struct hci_dev *hdev,void *data) { -struct hci_conn *conn = data; +struct hci_conn *conn; +u16 handle =PTR_UINT (data);struct inquiry_entry *ie;struct hci_cp_create_conn cp;int err; + conn =hci_conn_hash_lookup_handle (hdev, handle); +if (!conn) +return 0 ; +/* Many controllers disallow HCI Create Connection while it is doing * HCI Inquiry. So we cancel the Inquiry first before issuing HCI Create * Connection. This may cause the MGMT discovering state to become false
@@ -6641,9 +6646,8 @@ static int __hci_acl_create_connection_sync(struct hci_dev *hdev, void *data)return err; } -int hci_acl_create_connection_sync (struct hci_dev *hdev, -struct hci_conn *conn) +int hci_connect_acl_sync (struct hci_dev *hdev,struct hci_conn *conn) { -return hci_cmd_sync_queue (hdev, __hci_acl_create_connection_sync, - conn,NULL ); +return hci_cmd_sync_queue (hdev, hci_acl_create_conn_sync, +UINT_PTR (conn->handle),NULL ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 116/269 Bluetooth: hci_sync: Add helper functions to manipulate cmd_sync queue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 505ea2b295929e7be2b4e1bc86ee31cb7862fb01 ]
This adds functions to queue, dequeue and lookup into the cmd_sync list.
Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
--- include/net/bluetooth/hci_sync.h | 12 +++ net/bluetooth/hci_sync.c | 132 +++++++++++++++++++++++++++++-- 2 files changed, 136 insertions(+), 8 deletions(-)
include/net/bluetooth/hci_sync.h +12 -0
@@ -50,6 +50,18 @@ int hci_cmd_sync_submit(struct hci_dev *hdev, hci_cmd_sync_work_func_t func, void *data, hci_cmd_sync_work_destroy_t destroy);int hci_cmd_sync_queue (struct hci_dev *hdev,hci_cmd_sync_work_func_t func,void *data,hci_cmd_sync_work_destroy_t destroy); +struct hci_cmd_sync_work_entry * +hci_cmd_sync_lookup_entry (struct hci_dev *hdev,hci_cmd_sync_work_func_t func, +void *data,hci_cmd_sync_work_destroy_t destroy); +int hci_cmd_sync_queue_once (struct hci_dev *hdev,hci_cmd_sync_work_func_t func, +void *data,hci_cmd_sync_work_destroy_t destroy); +void hci_cmd_sync_cancel_entry (struct hci_dev *hdev, +struct hci_cmd_sync_work_entry *entry); +bool hci_cmd_sync_dequeue (struct hci_dev *hdev,hci_cmd_sync_work_func_t func, +void *data,hci_cmd_sync_work_destroy_t destroy); +bool hci_cmd_sync_dequeue_once (struct hci_dev *hdev, +hci_cmd_sync_work_func_t func,void *data, +hci_cmd_sync_work_destroy_t destroy);int hci_update_eir_sync (struct hci_dev *hdev);int hci_update_class_sync (struct hci_dev *hdev);
net/bluetooth/hci_sync.c +124 -8
156 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 117/269 Bluetooth: hci_sync: Attempt to dequeue connection attempt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 881559af5f5c545f6828e7c74d79813eb886d523 ]
If connection is still queued/pending in the cmd_sync queue it means no command has been generated and it should be safe to just dequeue the callback when it is being aborted.
Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
--- include/net/bluetooth/hci_core.h | 19 ++++++++ include/net/bluetooth/hci_sync.h | 10 +++-- net/bluetooth/hci_conn.c | 70 ++++++------------------------ net/bluetooth/hci_sync.c | 74 ++++++++++++++++++++++++++++---- 4 files changed, 102 insertions(+), 71 deletions(-)
include/net/bluetooth/hci_core.h +19 -0
@@ -1041,6 +1041,24 @@ static inline unsigned int hci_conn_count(struct hci_dev *hdev)return c->acl_num + c->sco_num + c->le_num + c->iso_num; } +static inline bool hci_conn_valid (struct hci_dev *hdev,struct hci_conn *conn) +{ +struct hci_conn_hash *h = &hdev->conn_hash; +struct hci_conn *c; + +rcu_read_lock (); + +list_for_each_entry_rcu (c, &h->list, list) { +if (c == conn) { +rcu_read_unlock (); +return true; + } + } +rcu_read_unlock (); + +return false; +} +static inline __u8 hci_conn_lookup_type (struct hci_dev *hdev,__u16 handle) {struct hci_conn_hash *h = &hdev->conn_hash;
@@ -1430,6 +1448,7 @@ struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,struct hci_conn *hci_connect_le (struct hci_dev *hdev,bdaddr_t *dst,u8 dst_type,bool dst_resolved,u8 sec_level,u16 conn_timeout,u8 role); +void hci_connect_le_scan_cleanup (struct hci_conn *conn,u8 status);struct hci_conn *hci_connect_acl (struct hci_dev *hdev,bdaddr_t *dst,u8 sec_level,u8 auth_type,enum conn_reasons conn_reason);
include/net/bluetooth/hci_sync.h +6 -4
@@ -50,11 +50,11 @@ int hci_cmd_sync_submit(struct hci_dev *hdev, hci_cmd_sync_work_func_t func, void *data, hci_cmd_sync_work_destroy_t destroy);int hci_cmd_sync_queue (struct hci_dev *hdev,hci_cmd_sync_work_func_t func,void *data,hci_cmd_sync_work_destroy_t destroy); +int hci_cmd_sync_queue_once (struct hci_dev *hdev,hci_cmd_sync_work_func_t func, +void *data,hci_cmd_sync_work_destroy_t destroy);struct hci_cmd_sync_work_entry *hci_cmd_sync_lookup_entry (struct hci_dev *hdev,hci_cmd_sync_work_func_t func,void *data,hci_cmd_sync_work_destroy_t destroy); -int hci_cmd_sync_queue_once (struct hci_dev *hdev,hci_cmd_sync_work_func_t func, -void *data,hci_cmd_sync_work_destroy_t destroy);void hci_cmd_sync_cancel_entry (struct hci_dev *hdev,struct hci_cmd_sync_work_entry *entry); bool hci_cmd_sync_dequeue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
@@ -141,8 +141,6 @@ struct hci_conn;int hci_abort_conn_sync (struct hci_dev *hdev,struct hci_conn *conn,u8 reason); -int hci_le_create_conn_sync (struct hci_dev *hdev,struct hci_conn *conn); -int hci_le_create_cis_sync (struct hci_dev *hdev);int hci_le_remove_cig_sync (struct hci_dev *hdev,u8 handle);
@@ -154,3 +152,7 @@ int hci_le_big_terminate_sync(struct hci_dev *hdev, u8 handle);int hci_le_pa_terminate_sync (struct hci_dev *hdev,u16 handle);int hci_connect_acl_sync (struct hci_dev *hdev,struct hci_conn *conn); + +int hci_connect_le_sync (struct hci_dev *hdev,struct hci_conn *conn); + +int hci_cancel_connect_sync (struct hci_dev *hdev,struct hci_conn *conn);
net/bluetooth/hci_conn.c +12 -58
107 lines not on this page · raw message
net/bluetooth/hci_sync.c +65 -9
99 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 118/269 Bluetooth: hci_sync: Introduce hci_cmd_sync_run/hci_cmd_sync_run_once
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit c898f6d7b093bd71e66569cd6797c87d4056f44b ]
This introduces hci_cmd_sync_run/hci_cmd_sync_run_once which acts like hci_cmd_sync_queue/hci_cmd_sync_queue_once but runs immediately when already on hdev->cmd_sync_work context.
Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
--- include/net/bluetooth/hci_sync.h | 4 +++ net/bluetooth/hci_sync.c | 42 ++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 2 deletions(-)
include/net/bluetooth/hci_sync.h +4 -0
@@ -52,6 +52,10 @@ int hci_cmd_sync_queue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func, void *data, hci_cmd_sync_work_destroy_t destroy);int hci_cmd_sync_queue_once (struct hci_dev *hdev,hci_cmd_sync_work_func_t func,void *data,hci_cmd_sync_work_destroy_t destroy); +int hci_cmd_sync_run (struct hci_dev *hdev,hci_cmd_sync_work_func_t func, +void *data,hci_cmd_sync_work_destroy_t destroy); +int hci_cmd_sync_run_once (struct hci_dev *hdev,hci_cmd_sync_work_func_t func, +void *data,hci_cmd_sync_work_destroy_t destroy);struct hci_cmd_sync_work_entry *hci_cmd_sync_lookup_entry (struct hci_dev *hdev,hci_cmd_sync_work_func_t func,void *data,hci_cmd_sync_work_destroy_t destroy);
net/bluetooth/hci_sync.c +40 -2
60 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 119/269 Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 227a0cdf4a028a73dc256d0f5144b4808d718893 ]
MGMT_OP_DISCONNECT can be called while mgmt_device_connected has not been called yet, which will cause the connection procedure to be aborted, so mgmt_device_disconnected shall still respond with command complete to MGMT_OP_DISCONNECT and just not emit MGMT_EV_DEVICE_DISCONNECTED since MGMT_EV_DEVICE_CONNECTED was never sent.
To fix this MGMT_OP_DISCONNECT is changed to work similarly to other command which do use hci_cmd_sync_queue and then use hci_conn_abort to disconnect and returns the result, in order for hci_conn_abort to be used from hci_cmd_sync context it now uses hci_cmd_sync_run_once.
--- net/bluetooth/hci_conn.c | 6 ++- net/bluetooth/mgmt.c | 84 ++++++++++++++++++++-------------------- 2 files changed, 47 insertions(+), 43 deletions(-)
net/bluetooth/hci_conn.c +5 -1
@@ -2877,5 +2877,9 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)return 0 ; } -return hci_cmd_sync_queue_once (hdev, abort_conn_sync, conn,NULL ); +/* Run immediately if on cmd_sync_work since this may be called +* as a result to MGMT_OP_DISCONNECT/MGMT_OP_UNPAIR which does +* already queue its callback on cmd_sync_work. +*/ +return hci_cmd_sync_run_once (hdev, abort_conn_sync, conn,NULL ); }
net/bluetooth/mgmt.c +42 -42
133 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 120/269 igc: Unlock on error in igc_io_resume()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit ef4a99a0164e3972abb421cbb1b09ea6c61414df ]
Call rtnl_unlock() on this error path, before returning.
--- drivers/net/ethernet/intel/igc/igc_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/igc/igc_main.c +1 -0
@@ -7288,6 +7288,7 @@ static void igc_io_resume(struct pci_dev *pdev)rtnl_lock ();if (netif_running (netdev)) {if (igc_open (netdev)) { +rtnl_unlock ();netdev_err (netdev,"igc_open failed after reset\n" );return ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 121/269 hwmon: (hp-wmi-sensors) Check if WMI event data exists
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit a54da9df75cd1b4b5028f6c60f9a211532680585 ]
The BIOS can choose to return no event data in response to a WMI event, so the ACPI object passed to the WMI notify handler can be NULL.
Check for such a situation and ignore the event in such a case.
Message-ID: <[email protected]>
--- drivers/hwmon/hp-wmi-sensors.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/hwmon/hp-wmi-sensors.c +2 -0
@@ -1637,6 +1637,8 @@ static void hp_wmi_notify(u32 value, void *context) goto out_unlock; wobj = out.pointer; +if (!wobj) + goto out_unlock; err =populate_event_from_wobj (dev, &event, wobj);if (err) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 122/269 net: phy: Fix missing of_node_put() for leds
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 2560db6ede1aaf162a73b2df43e0b6c5ed8819f7 ]
The call of of_get_child_by_name() will cause refcount incremented for leds, if it succeeds, it should call of_node_put() to decrease it, fix it.
--- drivers/net/phy/phy_device.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/phy/phy_device.c +2 -0
@@ -3164,11 +3164,13 @@ static int of_phy_leds(struct phy_device *phydev) err =of_phy_led (phydev, led);if (err) {of_node_put (led); +of_node_put (leds);phy_leds_unregister (phydev);return err; } } +of_node_put (leds);return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 123/269 ice: protect XDP configuration with a mutex
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larysa Zaremba <[email protected]>
[ Upstream commit 2504b8405768a57a71e660dbfd5abd59f679a03f ]
The main threat to data consistency in ice_xdp() is a possible asynchronous PF reset. It can be triggered by a user or by TX timeout handler.
XDP setup and PF reset code access the same resources in the following sections:
* ice_vsi_close() in ice_prepare_for_reset() - already rtnl-locked
* ice_vsi_rebuild() for the PF VSI - not protected
* ice_vsi_open() - already rtnl-locked
With an unfortunate timing, such accesses can result in a crash such as the one below:
[ +1.999878] ice 0000:b1:00.0: Registered XDP mem model MEM_TYPE_XSK_BUFF_POOL on Rx ring 14
[ +2.002992] ice 0000:b1:00.0: Registered XDP mem model MEM_TYPE_XSK_BUFF_POOL on Rx ring 18
[Mar15 18:17] ice 0000:b1:00.0 ens801f0np0: NETDEV WATCHDOG: CPU: 38: transmit queue 14 timed out 80692736 ms [ +0.000093] ice 0000:b1:00.0 ens801f0np0: tx_timeout: VSI_num: 6, Q 14, NTC: 0x0, HW_HEAD: 0x0, NTU: 0x0, INT: 0x4000001 [ +0.000012] ice 0000:b1:00.0 ens801f0np0: tx_timeout recovery level 1, txqueue 14
[ +0.394718] ice 0000:b1:00.0: PTP reset successful
[ +0.006184] BUG: kernel NULL pointer dereference, address: 0000000000000098
[ +0.000045] #PF: supervisor read access in kernel mode
[ +0.000023] #PF: error_code(0x0000) - not-present page
[ +0.000023] PGD 0 P4D 0
[ +0.000018] Oops: 0000 [#1] PREEMPT SMP NOPTI
[ +0.000023] CPU: 38 PID: 7540 Comm: kworker/38:1 Not tainted 6.8.0-rc7 #1
[ +0.000031] Hardware name: Intel Corporation S2600WFT/S2600WFT, BIOS SE5C620.86B.02.01.0014.082620210524 08/26/2021 [ +0.000036] Workqueue: ice ice_service_task [ice]
[ +0.000183] RIP: 0010:ice_clean_tx_ring+0xa/0xd0 [ice]
[...]
[ +0.000013] Call Trace:
[ +0.000016] <TASK>
[ +0.000014] ? __die+0x1f/0x70
[ +0.000029] ? page_fault_oops+0x171/0x4f0
[ +0.000029] ? schedule+0x3b/0xd0
[ +0.000027] ? exc_page_fault+0x7b/0x180
[ +0.000022] ? asm_exc_page_fault+0x22/0x30
[ +0.000031] ? ice_clean_tx_ring+0xa/0xd0 [ice]
[ +0.000194] ice_free_tx_ring+0xe/0x60 [ice]
[ +0.000186] ice_destroy_xdp_rings+0x157/0x310 [ice]
[ +0.000151] ice_vsi_decfg+0x53/0xe0 [ice]
[ +0.000180] ice_vsi_rebuild+0x239/0x540 [ice]
[ +0.000186] ice_vsi_rebuild_by_type+0x76/0x180 [ice]
[ +0.000145] ice_rebuild+0x18c/0x840 [ice]
[ +0.000145] ? delay_tsc+0x4a/0xc0
[ +0.000022] ? delay_tsc+0x92/0xc0
[ +0.000020] ice_do_reset+0x140/0x180 [ice]
[ +0.000886] ice_service_task+0x404/0x1030 [ice]
[ +0.000824] process_one_work+0x171/0x340
[ +0.000685] worker_thread+0x277/0x3a0
[ +0.000675] ? preempt_count_add+0x6a/0xa0
[ +0.000677] ? _raw_spin_lock_irqsave+0x23/0x50
[ +0.000679] ? __pfx_worker_thread+0x10/0x10
[ +0.000653] kthread+0xf0/0x120
[ +0.000635] ? __pfx_kthread+0x10/0x10
[ +0.000616] ret_from_fork+0x2d/0x50
[ +0.000612] ? __pfx_kthread+0x10/0x10
[ +0.000604] ret_from_fork_asm+0x1b/0x30
[ +0.000604] </TASK>
The previous way of handling this through returning -EBUSY is not viable, particularly when destroying AF_XDP socket, because the kernel proceeds with removal anyway.
There is plenty of code between those calls and there is no need to create a large critical section that covers all of them, same as there is no need to protect ice_vsi_rebuild() with rtnl_lock().
Add xdp_state_lock mutex to protect ice_vsi_rebuild() and ice_xdp().
Leaving unprotected sections in between would result in two states that have to be considered:
1. when the VSI is closed, but not yet rebuild
2. when VSI is already rebuild, but not yet open
The latter case is actually already handled through !netif_running() case, we just need to adjust flag checking a little. The former one is not as trivial, because between ice_vsi_close() and ice_vsi_rebuild(), a lot of hardware interaction happens, this can make adding/deleting rings exit with an error. Luckily, VSI rebuild is pending and can apply new configuration for us in a managed fashion.
Therefore, add an additional VSI state flag ICE_VSI_REBUILD_PENDING to indicate that ice_xdp() can just hot-swap the program.
Also, as ice_vsi_rebuild() flow is touched in this patch, make it more consistent by deconfiguring VSI when coalesce allocation fails.
--- drivers/net/ethernet/intel/ice/ice.h | 2 ++ drivers/net/ethernet/intel/ice/ice_lib.c | 34 ++++++++++++++--------- drivers/net/ethernet/intel/ice/ice_main.c | 19 +++++++++---- drivers/net/ethernet/intel/ice/ice_xsk.c | 3 +- 4 files changed, 39 insertions(+), 19 deletions(-)
drivers/net/ethernet/intel/ice/ice.h +2 -0
@@ -313,6 +313,7 @@ enum ice_vsi_state {ICE_VSI_UMAC_FLTR_CHANGED ,ICE_VSI_MMAC_FLTR_CHANGED ,ICE_VSI_PROMISC_CHANGED , +ICE_VSI_REBUILD_PENDING , ICE_VSI_STATE_NBITS /* must be last */ };
@@ -409,6 +410,7 @@ struct ice_vsi {struct ice_tx_ring **xdp_rings;/* XDP ring array */ u16 num_xdp_txq;/* Used XDP queues */ u8 xdp_mapping_mode;/* ICE_MAP_MODE_[CONTIG|SCATTER] */ +struct mutex xdp_state_lock;struct net_device **target_netdevs;
drivers/net/ethernet/intel/ice/ice_lib.c +21 -13
@@ -459,6 +459,7 @@ static void ice_vsi_free(struct ice_vsi *vsi)ice_vsi_free_stats (vsi);ice_vsi_free_arrays (vsi); +mutex_destroy (&vsi->xdp_state_lock);mutex_unlock (&pf->sw_mutex);devm_kfree (dev, vsi); }
@@ -660,6 +661,8 @@ static struct ice_vsi *ice_vsi_alloc(struct ice_pf *pf) pf->next_vsi =ice_get_free_slot (pf->vsi, pf->num_alloc_vsi, pf->next_vsi); +mutex_init (&vsi->xdp_state_lock); + unlock_pf:mutex_unlock (&pf->sw_mutex);return vsi;
@@ -3164,19 +3167,23 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags)if (WARN_ON (vsi->type ==ICE_VSI_VF && !vsi->vf))return -EINVAL ; +mutex_lock (&vsi->xdp_state_lock); + ret =ice_vsi_realloc_stat_arrays (vsi);if (ret) - goto err_vsi_cfg; + goto unlock;ice_vsi_decfg (vsi); ret =ice_vsi_cfg_def (vsi, ¶ms);if (ret) - goto err_vsi_cfg; + goto unlock; coalesce =kcalloc (vsi->num_q_vectors,sizeof (struct ice_coalesce_stored ),GFP_KERNEL ); -if (!coalesce) -return -ENOMEM ; +if (!coalesce) { + ret = -ENOMEM ; + goto decfg; + } prev_num_q_vectors =ice_vsi_rebuild_get_coalesce (vsi, coalesce);
@@ -3184,22 +3191,23 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags)if (ret) {if (vsi_flags &ICE_VSI_FLAG_INIT ) { ret = -EIO ; - goto err_vsi_cfg_tc_lan; + goto free_coalesce; } -kfree (coalesce); -return ice_schedule_reset (pf,ICE_RESET_PFR ); + ret =ice_schedule_reset (pf,ICE_RESET_PFR ); + goto free_coalesce; }ice_vsi_rebuild_set_coalesce (vsi, coalesce, prev_num_q_vectors); -kfree (coalesce); +clear_bit (ICE_VSI_REBUILD_PENDING , vsi->state); -return 0 ; - -err_vsi_cfg_tc_lan: -ice_vsi_decfg (vsi); +free_coalesce:kfree (coalesce); -err_vsi_cfg: +decfg: +if (ret) +ice_vsi_decfg (vsi); +unlock: +mutex_unlock (&vsi->xdp_state_lock);return ret; }
drivers/net/ethernet/intel/ice/ice_main.c +14 -5
@@ -614,6 +614,7 @@ ice_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)/* clear SW filtering DB */ ice_clear_hw_tbls (hw);/* disable the VSIs and their queues that are not already DOWN */ +set_bit (ICE_VSI_REBUILD_PENDING ,ice_get_main_vsi (pf)->state);ice_pf_dis_all_vsi (pf, false);if (test_bit (ICE_FLAG_PTP_SUPPORTED , pf->flags))
@@ -2942,7 +2943,8 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog, }/* hot swap progs and avoid toggling link */ -if (ice_is_xdp_ena_vsi (vsi) == !!prog) { +if (ice_is_xdp_ena_vsi (vsi) == !!prog || +test_bit (ICE_VSI_REBUILD_PENDING , vsi->state)) {ice_vsi_assign_bpf_prog (vsi, prog);return 0 ; }
@@ -3014,21 +3016,28 @@ static int ice_xdp(struct net_device *dev, struct netdev_bpf *xdp) {struct ice_netdev_priv *np =netdev_priv (dev);struct ice_vsi *vsi = np->vsi; +int ret;if (vsi->type !=ICE_VSI_PF ) {NL_SET_ERR_MSG_MOD (xdp->extack,"XDP can be loaded only on PF VSI" );return -EINVAL ; } +mutex_lock (&vsi->xdp_state_lock); +switch (xdp->command) {case XDP_SETUP_PROG : -return ice_xdp_setup_prog (vsi, xdp->prog, xdp->extack); + ret =ice_xdp_setup_prog (vsi, xdp->prog, xdp->extack); +break ;case XDP_SETUP_XSK_POOL : -return ice_xsk_pool_setup (vsi, xdp->xsk.pool, - xdp->xsk.queue_id); + ret =ice_xsk_pool_setup (vsi, xdp->xsk.pool, xdp->xsk.queue_id); +break ;default : -return -EINVAL ; + ret = -EINVAL ; } + +mutex_unlock (&vsi->xdp_state_lock); +return ret; }/**
drivers/net/ethernet/intel/ice/ice_xsk.c +2 -1
@@ -396,7 +396,8 @@ int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid) goto failure; } - if_running =netif_running (vsi->netdev) &&ice_is_xdp_ena_vsi (vsi); + if_running = !test_bit (ICE_VSI_DOWN , vsi->state) && +ice_is_xdp_ena_vsi (vsi);if (if_running) {struct ice_rx_ring *rx_ring = vsi->rx_rings[qid];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 124/269 ice: do not bring the VSI up, if it was down before the XDP setup
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larysa Zaremba <[email protected]>
[ Upstream commit 04c7e14e5b0b6227e7b00d7a96ca2f2426ab9171 ]
After XDP configuration is completed, we bring the interface up unconditionally, regardless of its state before the call to .ndo_bpf().
Preserve the information whether the interface had to be brought down and later bring it up only in such case.
--- drivers/net/ethernet/intel/ice/ice_main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/ice/ice_main.c +5 -2
@@ -2931,8 +2931,8 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog, struct netlink_ext_ack *extack) {unsigned int frame_size = vsi->netdev->mtu +ICE_ETH_PKT_HDR_PAD ; -bool if_running =netif_running (vsi->netdev);int ret =0 , xdp_ring_err =0 ; +bool if_running;if (prog && !prog->aux->xdp_has_frags) {if (frame_size >ice_max_xdp_frame_size (vsi)) {
@@ -2949,8 +2949,11 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,return 0 ; } + if_running =netif_running (vsi->netdev) && + !test_and_set_bit (ICE_VSI_DOWN , vsi->state); +/* need to stop netdev while setting up the program for Rx rings */ -if (if_running && !test_and_set_bit (ICE_VSI_DOWN , vsi->state)) { +if (if_running) { ret =ice_down (vsi);if (ret) {NL_SET_ERR_MSG_MOD (extack,"Preparing device for XDP attach failed" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 125/269 usbnet: modern method to get random MAC
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
[ Upstream commit bab8eb0dd4cb995caa4a0529d5655531c2ec5e8e ]
The driver generates a random MAC once on load and uses it over and over, including on two devices needing a random MAC at the same time.
Jakub suggested revamping the driver to the modern API for setting a random MAC rather than fixing the old stuff.
The bug is as old as the driver.
--- drivers/net/usb/usbnet.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/net/usb/usbnet.c +3 -8
@@ -61,9 +61,6 @@/*-------------------------------------------------------------------------*/ -// randomly generated ethernet address -static u8 node_id [ETH_ALEN ]; -/* use ethtool to change the level for any given device */ static int msg_level =-1 ;module_param (msg_level, int,0 );
@@ -1731,7 +1728,6 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) dev->net = net;strscpy (net->name,"usb%d" ,sizeof (net->name)); -eth_hw_addr_set (net, node_id);/* rx and tx sides can use different message sizes; * bind() should set rx_urb_size in that case.
@@ -1805,9 +1801,9 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) goto out4; } -/* let userspace know we have a random address */ -if (ether_addr_equal (net->dev_addr, node_id)) - net->addr_assign_type =NET_ADDR_RANDOM ; +/* this flags the device for user space */ +if (!is_valid_ether_addr (net->dev_addr)) +eth_hw_addr_random (net);if ((dev->driver_info->flags &FLAG_WLAN ) !=0 )SET_NETDEV_DEVTYPE (net, &wlan_type);
@@ -2217,7 +2213,6 @@ static int __init usbnet_init(void) BUILD_BUG_ON( sizeof_field(struct sk_buff, cb) < sizeof(struct skb_data)); -eth_random_addr (node_id);return 0 ; }module_init (usbnet_init);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 126/269 bpf: Add sockptr support for getsockopt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit a615f67e1a426f35366b8398c11f31c148e7df48 ]
The whole network stack uses sockptr, and while it doesn't move to something more modern, let's use sockptr in getsockptr BPF hooks, so, it could be used by other callers.
The main motivation for this change is to use it in the io_uring {g,s}etsockopt(), which will use a userspace pointer for *optval, but, a kernel value for optlen.
Stable-dep-of: 33f339a1ba54 ("bpf, net: Fix a potential race in do_sock_getsockopt()")
--- include/linux/bpf-cgroup.h | 5 +++-- kernel/bpf/cgroup.c | 20 +++++++++++--------- net/socket.c | 5 +++-- 3 files changed, 17 insertions(+), 13 deletions(-)
include/linux/bpf-cgroup.h +3 -2
@@ -140,9 +140,10 @@ int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head,int __cgroup_bpf_run_filter_setsockopt (struct sock *sock,int *level,int *optname,char __user *optval,int *optlen,char **kernel_optval); +int __cgroup_bpf_run_filter_getsockopt (struct sock *sk,int level, -int optname,char __user *optval, -int __user *optlen,int max_optlen, +int optname,sockptr_t optval, +sockptr_t optlen,int max_optlen,int retval); int __cgroup_bpf_run_filter_getsockopt_kern(struct sock *sk, int level,
kernel/bpf/cgroup.c +11 -9
@@ -1889,8 +1889,8 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level, }int __cgroup_bpf_run_filter_getsockopt (struct sock *sk,int level, -int optname,char __user *optval, -int __user *optlen,int max_optlen, +int optname,sockptr_t optval, +sockptr_t optlen,int max_optlen,int retval) {struct cgroup *cgrp =sock_cgroup_ptr (&sk->sk_cgrp_data);
@@ -1917,8 +1917,8 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,* one that kernel returned as well to let * BPF programs inspect the value. */ - -if (get_user (ctx.optlen, optlen)) { +if (copy_from_sockptr (&ctx.optlen, optlen, +sizeof (ctx.optlen))) { ret = -EFAULT ; goto out; }
@@ -1929,8 +1929,8 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level, } orig_optlen = ctx.optlen; -if (copy_from_user (ctx.optval, optval, -min (ctx.optlen, max_optlen)) !=0 ) { +if (copy_from_sockptr (ctx.optval, optval, +min (ctx.optlen, max_optlen))) { ret = -EFAULT ; goto out; }
@@ -1944,7 +1944,8 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,if (ret <0 ) goto out; -if (optval && (ctx.optlen > max_optlen || ctx.optlen <0 )) { +if (!sockptr_is_null (optval) && + (ctx.optlen > max_optlen || ctx.optlen <0 )) {if (orig_optlen >PAGE_SIZE && ctx.optlen >=0 ) {pr_info_once ("bpf getsockopt: ignoring program buffer with optlen=%d (max_optlen=%d)\n" , ctx.optlen, max_optlen);
@@ -1956,11 +1957,12 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level, }if (ctx.optlen !=0 ) { -if (optval &©_to_user (optval, ctx.optval, ctx.optlen)) { +if (!sockptr_is_null (optval) && +copy_to_sockptr (optval, ctx.optval, ctx.optlen)) { ret = -EFAULT ; goto out; } -if (put_user (ctx.optlen, optlen)) { +if (copy_to_sockptr (optlen, &ctx.optlen,sizeof (ctx.optlen))) { ret = -EFAULT ; goto out; }
net/socket.c +3 -2
@@ -2375,8 +2375,9 @@ int __sys_getsockopt(int fd, int level, int optname, char __user *optval,if (!in_compat_syscall ()) err =BPF_CGROUP_RUN_PROG_GETSOCKOPT (sock->sk, level, optname, - optval, optlen, max_optlen, - err); +USER_SOCKPTR (optval), +USER_SOCKPTR (optlen), + max_optlen, err); out_put:fput_light (sock->file, fput_needed);return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 127/269 bpf: Add sockptr support for setsockopt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit 3f31e0d14d44ad491a81b7c1f83f32fbc300a867 ]
The whole network stack uses sockptr, and while it doesn't move to something more modern, let's use sockptr in setsockptr BPF hooks, so, it could be used by other callers.
The main motivation for this change is to use it in the io_uring {g,s}etsockopt(), which will use a userspace pointer for *optval, but, a kernel value for optlen.
Stable-dep-of: 33f339a1ba54 ("bpf, net: Fix a potential race in do_sock_getsockopt()")
--- include/linux/bpf-cgroup.h | 2 +- kernel/bpf/cgroup.c | 5 +++-- net/socket.c | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-)
include/linux/bpf-cgroup.h +1 -1
@@ -138,7 +138,7 @@ int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head, enum cgroup_bpf_attach_type atype);int __cgroup_bpf_run_filter_setsockopt (struct sock *sock,int *level, -int *optname,char __user *optval, +int *optname,sockptr_t optval,int *optlen,char **kernel_optval); int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,
kernel/bpf/cgroup.c +3 -2
@@ -1799,7 +1799,7 @@ static bool sockopt_buf_allocated(struct bpf_sockopt_kern *ctx, }int __cgroup_bpf_run_filter_setsockopt (struct sock *sk,int *level, -int *optname,char __user *optval, +int *optname,sockptr_t optval,int *optlen,char **kernel_optval) {struct cgroup *cgrp =sock_cgroup_ptr (&sk->sk_cgrp_data);
@@ -1822,7 +1822,8 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level, ctx.optlen = *optlen; -if (copy_from_user (ctx.optval, optval,min (*optlen, max_optlen)) !=0 ) { +if (copy_from_sockptr (ctx.optval, optval, +min (*optlen, max_optlen))) { ret = -EFAULT ; goto out; }
net/socket.c +1 -1
@@ -2307,7 +2307,7 @@ int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval,if (!in_compat_syscall ()) err =BPF_CGROUP_RUN_PROG_SETSOCKOPT (sock->sk, &level, &optname, - user_optval, &optlen, + optval, &optlen, &kernel_optval);if (err <0 ) goto out_put;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 128/269 net/socket: Break down __sys_setsockopt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit 1406245c29454ff84919736be83e14cdaba7fec1 ]
Split __sys_setsockopt() into two functions by removing the core logic into a sub-function (do_sock_setsockopt()). This will avoid code duplication when doing the same operation in other callers, for instance.
do_sock_setsockopt() will be called by io_uring setsockopt() command operation in the following patch.
Stable-dep-of: 33f339a1ba54 ("bpf, net: Fix a potential race in do_sock_getsockopt()")
--- include/net/sock.h | 2 ++ net/socket.c | 39 +++++++++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 14 deletions(-)
include/net/sock.h +2 -0
@@ -1875,6 +1875,8 @@ int sk_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval, unsigned int optlen);int sock_setsockopt (struct socket *sock,int level,int op,sockptr_t optval,unsigned int optlen); +int do_sock_setsockopt (struct socket *sock,bool compat,int level, +int optname,sockptr_t optval,int optlen);int sk_getsockopt (struct sock *sk,int level,int optname,sockptr_t optval,sockptr_t optlen);
net/socket.c +25 -14
@@ -2281,31 +2281,21 @@ static bool sock_use_custom_sol_socket(const struct socket *sock)return test_bit (SOCK_CUSTOM_SOCKOPT , &sock->flags); } -/* -* Set a socket option. Because we don't know the option lengths we have -* to pass the user mode parameter for the protocols to sort out. -*/ -int __sys_setsockopt (int fd,int level,int optname,char __user *user_optval, -int optlen) +int do_sock_setsockopt (struct socket *sock,bool compat,int level, +int optname,sockptr_t optval,int optlen) { -sockptr_t optval =USER_SOCKPTR (user_optval);const struct proto_ops *ops;char *kernel_optval =NULL ; -int err, fput_needed; -struct socket *sock; +int err;if (optlen <0 )return -EINVAL ; - sock =sockfd_lookup_light (fd, &err, &fput_needed); -if (!sock) -return err; - err =security_socket_setsockopt (sock, level, optname);if (err) goto out_put; -if (!in_compat_syscall ()) +if (!compat) err =BPF_CGROUP_RUN_PROG_SETSOCKOPT (sock->sk, &level, &optname, optval, &optlen, &kernel_optval);
@@ -2328,6 +2318,27 @@ int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval, optlen);kfree (kernel_optval); out_put: +return err; +} +EXPORT_SYMBOL (do_sock_setsockopt); + +/* Set a socket option. Because we don't know the option lengths we have +* to pass the user mode parameter for the protocols to sort out. +*/ +int __sys_setsockopt (int fd,int level,int optname,char __user *user_optval, +int optlen) +{ +sockptr_t optval =USER_SOCKPTR (user_optval); +bool compat =in_compat_syscall (); +int err, fput_needed; +struct socket *sock; + + sock =sockfd_lookup_light (fd, &err, &fput_needed); +if (!sock) +return err; + + err =do_sock_setsockopt (sock, compat, level, optname, optval, optlen); +fput_light (sock->file, fput_needed);return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 129/269 net/socket: Break down __sys_getsockopt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit 0b05b0cd78c92371fdde6333d006f39eaf9e0860 ]
Split __sys_getsockopt() into two functions by removing the core logic into a sub-function (do_sock_getsockopt()). This will avoid code duplication when doing the same operation in other callers, for instance.
do_sock_getsockopt() will be called by io_uring getsockopt() command operation in the following patch.
The same was done for the setsockopt pair.
Stable-dep-of: 33f339a1ba54 ("bpf, net: Fix a potential race in do_sock_getsockopt()")
--- include/linux/bpf-cgroup.h | 2 +- include/net/sock.h | 4 +-- net/core/sock.c | 8 ----- net/socket.c | 64 ++++++++++++++++++++++++-------------- 4 files changed, 44 insertions(+), 34 deletions(-)
include/linux/bpf-cgroup.h +1 -1
@@ -379,7 +379,7 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk, ({ \int __ret =0 ; \if (cgroup_bpf_enabled (CGROUP_GETSOCKOPT )) \ -get_user (__ret, optlen); \ +copy_from_sockptr (&__ret, optlen,sizeof (int )); \ __ret; \ })
include/net/sock.h +2 -2
@@ -1877,11 +1877,11 @@ int sock_setsockopt(struct socket *sock, int level, int op, sockptr_t optval, unsigned int optlen);int do_sock_setsockopt (struct socket *sock,bool compat,int level,int optname,sockptr_t optval,int optlen); +int do_sock_getsockopt (struct socket *sock,bool compat,int level, +int optname,sockptr_t optval,sockptr_t optlen);int sk_getsockopt (struct sock *sk,int level,int optname,sockptr_t optval,sockptr_t optlen); -int sock_getsockopt (struct socket *sock,int level,int op, -char __user *optval,int __user *optlen);int sock_gettstamp (struct socket *sock,void __user *userstamp,bool timeval,bool time32); struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
net/core/sock.c +0 -8
@@ -2019,14 +2019,6 @@ int sk_getsockopt(struct sock *sk, int level, int optname,return 0 ; } -int sock_getsockopt (struct socket *sock,int level,int optname, -char __user *optval,int __user *optlen) -{ -return sk_getsockopt (sock->sk, level, optname, -USER_SOCKPTR (optval), -USER_SOCKPTR (optlen)); -} -/* * Initialize an sk_lock. *
net/socket.c +41 -23
84 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 130/269 bpf, net: Fix a potential race in do_sock_getsockopt()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tze-nan Wu <[email protected]>
[ Upstream commit 33f339a1ba54e56bba57ee9a77c71e385ab4825c ]
There's a potential race when cgroup_bpf_enabled(CGROUP_GETSOCKOPT) is false during the execution of BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN, but becomes true when BPF_CGROUP_RUN_PROG_GETSOCKOPT is called. This inconsistency can lead to BPF_CGROUP_RUN_PROG_GETSOCKOPT receiving an "-EFAULT" from __cgroup_bpf_run_filter_getsockopt(max_optlen=0). Scenario shown as below:
process A process B
----------- ------------
BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN
enable CGROUP_GETSOCKOPT
BPF_CGROUP_RUN_PROG_GETSOCKOPT (-EFAULT)
To resolve this, remove the BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN macro and directly uses copy_from_sockptr to ensure that max_optlen is always set before BPF_CGROUP_RUN_PROG_GETSOCKOPT is invoked.
--- include/linux/bpf-cgroup.h | 9 --------- net/socket.c | 4 ++-- 2 files changed, 2 insertions(+), 11 deletions(-)
include/linux/bpf-cgroup.h +0 -9
@@ -375,14 +375,6 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk, __ret; \ }) -#define BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN (optlen) \ -({ \ - int __ret = 0; \ - if (cgroup_bpf_enabled(CGROUP_GETSOCKOPT)) \ - copy_from_sockptr(&__ret, optlen, sizeof(int)); \ - __ret; \ -}) -#define BPF_CGROUP_RUN_PROG_GETSOCKOPT (sock, level, optname, optval, optlen, \ max_optlen, retval) \ ({ \
@@ -500,7 +492,6 @@ static inline int bpf_percpu_cgroup_storage_update(struct bpf_map *map,#define BPF_CGROUP_RUN_PROG_SOCK_OPS (sock_ops) ({ 0; })#define BPF_CGROUP_RUN_PROG_DEVICE_CGROUP (atype, major, minor, access) ({ 0; })#define BPF_CGROUP_RUN_PROG_SYSCTL (head,table,write,buf,count,pos) ({ 0; }) -#define BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN (optlen) ({ 0; })#define BPF_CGROUP_RUN_PROG_GETSOCKOPT (sock, level, optname, optval, \ optlen, max_optlen, retval) ({ retval; }) #define BPF_CGROUP_RUN_PROG_GETSOCKOPT_KERN(sock, level, optname, optval, \
net/socket.c +2 -2
@@ -2355,7 +2355,7 @@ INDIRECT_CALLABLE_DECLARE(bool tcp_bpf_bypass_getsockopt(int level,int do_sock_getsockopt (struct socket *sock,bool compat,int level,int optname,sockptr_t optval,sockptr_t optlen) { -int max_optlen__maybe_unused ; +int max_optlen__maybe_unused =0 ;const struct proto_ops *ops;int err;
@@ -2364,7 +2364,7 @@ int do_sock_getsockopt(struct socket *sock, bool compat, int level,return err;if (!compat) - max_optlen =BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN (optlen); +copy_from_sockptr (&max_optlen, optlen,sizeof (int )); ops =READ_ONCE (sock->ops);if (level ==SOL_SOCKET ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 131/269 bareudp: Fix device stats updates.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guillaume Nault <[email protected]>
[ Upstream commit 4963d2343af81f493519f9c3ea9f2169eaa7353a ]
Bareudp devices update their stats concurrently.
Therefore they need proper atomic increments.
--- drivers/net/bareudp.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
drivers/net/bareudp.c +11 -11
@@ -82,7 +82,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)if (skb_copy_bits (skb,BAREUDP_BASE_HLEN , &ipversion,sizeof (ipversion))) { - bareudp->dev->stats.rx_dropped++; +DEV_STATS_INC (bareudp->dev, rx_dropped); goto drop; } ipversion >>=4 ;
@@ -92,7 +92,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb) }else if (ipversion ==6 && bareudp->multi_proto_mode) { proto =htons (ETH_P_IPV6 ); }else { - bareudp->dev->stats.rx_dropped++; +DEV_STATS_INC (bareudp->dev, rx_dropped); goto drop; } }else if (bareudp->ethertype ==htons (ETH_P_MPLS_UC )) {
@@ -106,7 +106,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb) ipv4_is_multicast(tunnel_hdr->daddr)) { proto = htons(ETH_P_MPLS_MC); } else { - bareudp->dev->stats.rx_dropped++; +DEV_STATS_INC (bareudp->dev, rx_dropped); goto drop; } }else {
@@ -122,7 +122,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb) (addr_type & IPV6_ADDR_MULTICAST)) { proto = htons(ETH_P_MPLS_MC); } else { - bareudp->dev->stats.rx_dropped++; +DEV_STATS_INC (bareudp->dev, rx_dropped); goto drop; } }
@@ -134,12 +134,12 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb) proto, !net_eq(bareudp->net, dev_net(bareudp->dev)))) { - bareudp->dev->stats.rx_dropped++; +DEV_STATS_INC (bareudp->dev, rx_dropped); goto drop; } tun_dst =udp_tun_rx_dst (skb, family,TUNNEL_KEY ,0 ,0 );if (!tun_dst) { - bareudp->dev->stats.rx_dropped++; +DEV_STATS_INC (bareudp->dev, rx_dropped); goto drop; }skb_dst_set (skb, &tun_dst->dst);
@@ -165,8 +165,8 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb) &((struct ipv6hdr *)oiph)->saddr); }if (err >1 ) { - ++bareudp->dev->stats.rx_frame_errors; - ++bareudp->dev->stats.rx_errors; +DEV_STATS_INC (bareudp->dev, rx_frame_errors); +DEV_STATS_INC (bareudp->dev, rx_errors); goto drop; } }
@@ -462,11 +462,11 @@ static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev)dev_kfree_skb (skb);if (err == -ELOOP ) - dev->stats.collisions++; +DEV_STATS_INC (dev, collisions);else if (err == -ENETUNREACH ) - dev->stats.tx_carrier_errors++; +DEV_STATS_INC (dev, tx_carrier_errors); - dev->stats.tx_errors++; +DEV_STATS_INC (dev, tx_errors);return NETDEV_TX_OK ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 132/269 fou: Fix null-ptr-deref in GRO.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 7e4196935069947d8b70b09c1660b67b067e75cb ]
We observed a null-ptr-deref in fou_gro_receive() while shutting down a host. [0]
The NULL pointer is sk->sk_user_data, and the offset 8 is of protocol in struct fou.
When fou_release() is called due to netns dismantle or explicit tunnel teardown, udp_tunnel_sock_release() sets NULL to sk->sk_user_data. Then, the tunnel socket is destroyed after a single RCU grace period.
So, in-flight udp4_gro_receive() could find the socket and execute the FOU GRO handler, where sk->sk_user_data could be NULL.
Let's use rcu_dereference_sk_user_data() in fou_from_sock() and add NULL checks in FOU GRO handlers.
[0]:
BUG: kernel NULL pointer dereference, address: 0000000000000008 PF: supervisor read access in kernel mode PF: error_code(0x0000) - not-present page PGD 80000001032f4067 P4D 80000001032f4067 PUD 103240067 PMD 0 SMP PTI CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.10.216-204.855.amzn2.x86_64 #1 Hardware name: Amazon EC2 c5.large/, BIOS 1.0 10/16/2017 RIP: 0010:fou_gro_receive (net/ipv4/fou.c:233) [fou] Code: 41 5f c3 cc cc cc cc e8 e7 2e 69 f4 0f 1f 80 00 00 00 00 0f 1f 44 00 00 49 89 f8 41 54 48 89 f7 48 89 d6 49 8b 80 88 02 00 00 <0f> b6 48 08 0f b7 42 4a 66 25 fd fd 80 cc 02 66 89 42 4a 0f b6 42 RSP: 0018:ffffa330c0003d08 EFLAGS: 00010297 RAX: 0000000000000000 RBX: ffff93d9e3a6b900 RCX: 0000000000000010 RDX: ffff93d9e3a6b900 RSI: ffff93d9e3a6b900 RDI: ffff93dac2e24d08 RBP: ffff93d9e3a6b900 R08: ffff93dacbce6400 R09: 0000000000000002 R10: 0000000000000000 R11: ffffffffb5f369b0 R12: ffff93dacbce6400 R13: ffff93dac2e24d08 R14: 0000000000000000 R15: ffffffffb4edd1c0 FS: 0000000000000000(0000) GS:ffff93daee800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000008 CR3: 0000000102140001 CR4: 00000000007706f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <IRQ> ? show_trace_log_lvl (arch/x86/kernel/dumpstack.c:259) ? __die_body.cold (arch/x86/kernel/dumpstack.c:478 arch/x86/kernel/dumpstack.c:420) ? no_context (arch/x86/mm/fault.c:752) ? exc_page_fault (arch/x86/include/asm/irqflags.h:49 arch/x86/include/asm/irqflags.h:89 arch/x86/mm/fault.c:1435 arch/x86/mm/fault.c:1483) ? asm_exc_page_fault (arch/x86/include/asm/idtentry.h:571) ? fou_gro_receive (net/ipv4/fou.c:233) [fou] udp_gro_receive (include/linux/netdevice.h:2552 net/ipv4/udp_offload.c:559) udp4_gro_receive (net/ipv4/udp_offload.c:604) inet_gro_receive (net/ipv4/af_inet.c:1549 (discriminator 7)) dev_gro_receive (net/core/dev.c:6035 (discriminator 4)) napi_gro_receive (net/core/dev.c:6170) ena_clean_rx_irq (drivers/amazon/net/ena/ena_netdev.c:1558) [ena] ena_io_poll (drivers/amazon/net/ena/ena_netdev.c:1742) [ena] napi_poll (net/core/dev.c:6847) net_rx_action (net/core/dev.c:6917) __do_softirq (arch/x86/include/asm/jump_label.h:25 include/linux/jump_label.h:200 include/trace/events/irq.h:142 kernel/softirq.c:299) asm_call_irq_on_stack (arch/x86/entry/entry_64.S:809) </IRQ> do_softirq_own_stack (arch/x86/include/asm/irq_stack.h:27 arch/x86/include/asm/irq_stack.h:77 arch/x86/kernel/irq_64.c:77) irq_exit_rcu (kernel/softirq.c:393 kernel/softirq.c:423 kernel/softirq.c:435) common_interrupt (arch/x86/kernel/irq.c:239) asm_common_interrupt (arch/x86/include/asm/idtentry.h:626) RIP: 0010:acpi_idle_do_entry (arch/x86/include/asm/irqflags.h:49 arch/x86/include/asm/irqflags.h:89 drivers/acpi/processor_idle.c:114 drivers/acpi/processor_idle.c:575) Code: 8b 15 d1 3c c4 02 ed c3 cc cc cc cc 65 48 8b 04 25 40 ef 01 00 48 8b 00 a8 08 75 eb 0f 1f 44 00 00 0f 00 2d d5 09 55 00 fb f4 <fa> c3 cc cc cc cc e9 be fc ff ff 66 66 2e 0f 1f 84 00 00 00 00 00 RSP: 0018:ffffffffb5603e58 EFLAGS: 00000246 RAX: 0000000000004000 RBX: ffff93dac0929c00 RCX: ffff93daee833900 RDX: ffff93daee800000 RSI: ffff93daee87dc00 RDI: ffff93daee87dc64 RBP: 0000000000000001 R08: ffffffffb5e7b6c0 R09: 0000000000000044 R10: ffff93daee831b04 R11: 00000000000001cd R12: 0000000000000001 R13: ffffffffb5e7b740 R14: 0000000000000001 R15: 0000000000000000 ? sched_clock_cpu (kernel/sched/clock.c:371) acpi_idle_enter (drivers/acpi/processor_idle.c:712 (discriminator 3)) cpuidle_enter_state (drivers/cpuidle/cpuidle.c:237) cpuidle_enter (drivers/cpuidle/cpuidle.c:353) cpuidle_idle_call (kernel/sched/idle.c:158 kernel/sched/idle.c:239) do_idle (kernel/sched/idle.c:302) cpu_startup_entry (kernel/sched/idle.c:395 (discriminator 1)) start_kernel (init/main.c:1048) secondary_startup_64_no_verify (arch/x86/kernel/head_64.S:310) Modules linked in: udp_diag tcp_diag inet_diag nft_nat ipip tunnel4 dummy fou ip_tunnel nft_masq nft_chain_nat nf_nat wireguard nft_ct curve25519_x86_64 libcurve25519_generic nf_conntrack libchacha20poly1305 nf_defrag_ipv6 nf_defrag_ipv4 nft_objref chacha_x86_64 nft_counter nf_tables nfnetlink poly1305_x86_64 ip6_udp_tunnel udp_tunnel libchacha crc32_pclmul ghash_clmulni_intel aesni_intel crypto_simd cryptd glue_helper mousedev psmouse button ena ptp pps_core crc32c_intel
CR2: 0000000000000008
--- net/ipv4/fou_core.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-)
net/ipv4/fou_core.c +24 -5
@@ -50,7 +50,7 @@ struct fou_net {static inline struct fou *fou_from_sock (struct sock *sk) { -return sk->sk_user_data; +return rcu_dereference_sk_user_data (sk); }static int fou_recv_pull (struct sk_buff *skb,struct fou *fou,size_t len)
@@ -233,9 +233,15 @@ static struct sk_buff *fou_gro_receive(struct sock *sk, struct sk_buff *skb) {const struct net_offload __rcu **offloads; -u8 proto =fou_from_sock (sk)->protocol; +struct fou *fou =fou_from_sock (sk);const struct net_offload *ops;struct sk_buff *pp =NULL ; +u8 proto; + +if (!fou) + goto out; + + proto = fou->protocol;/* We can clear the encap_mark for FOU as we are essentially doing * one of two possible things. We are either adding an L4 tunnel
@@ -263,14 +269,24 @@ static int fou_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff) {const struct net_offload __rcu **offloads; -u8 proto =fou_from_sock (sk)->protocol; +struct fou *fou =fou_from_sock (sk);const struct net_offload *ops; -int err = -ENOSYS ; +u8 proto; +int err; + +if (!fou) { + err = -ENOENT ; + goto out; + } + + proto = fou->protocol; offloads =NAPI_GRO_CB (skb)->is_ipv6 ? inet6_offloads : inet_offloads; ops =rcu_dereference (offloads[proto]); -if (WARN_ON (!ops || !ops->callbacks.gro_complete)) +if (WARN_ON (!ops || !ops->callbacks.gro_complete)) { + err = -ENOSYS ; goto out; + } err = ops->callbacks.gro_complete (skb, nhoff);
@@ -320,6 +336,9 @@ static struct sk_buff *gue_gro_receive(struct sock *sk,struct gro_remcsum grc;u8 proto; +if (!fou) + goto out; +skb_gro_remcsum_init (&grc); off =skb_gro_offset (skb);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 133/269 r8152: fix the firmware doesnt work
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hayes Wang <[email protected]>
[ Upstream commit 8487b4af59d4d7feda4b119dc2d92c67ca25c27e ]
generic_ocp_write() asks the parameter "size" must be 4 bytes align. Therefore, write the bp would fail, if the mac->bp_num is odd. Align the size to 4 for fixing it. The way may write an extra bp, but the rtl8152_is_fw_mac_ok() makes sure the value must be 0 for the bp whose index is more than mac->bp_num. That is, there is no influence for the firmware.
Besides, I check the return value of generic_ocp_write() to make sure everything is correct.
--- drivers/net/usb/r8152.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/net/usb/r8152.c +13 -4
@@ -5143,14 +5143,23 @@ static void rtl8152_fw_mac_apply(struct r8152 *tp, struct fw_mac *mac) data = (u8 *)mac; data +=__le16_to_cpu (mac->fw_offset); -generic_ocp_write (tp,__le16_to_cpu (mac->fw_reg),0xff , length, data, - type); +if (generic_ocp_write (tp,__le16_to_cpu (mac->fw_reg),0xff , length, + data, type) <0 ) { +dev_err (&tp->intf->dev,"Write %s fw fail\n" , + type ?"PLA" :"USB" ); +return ; + }ocp_write_word (tp, type,__le16_to_cpu (mac->bp_ba_addr),__le16_to_cpu (mac->bp_ba_value)); -generic_ocp_write (tp,__le16_to_cpu (mac->bp_start),BYTE_EN_DWORD , -__le16_to_cpu (mac->bp_num) <<1 , mac->bp, type); +if (generic_ocp_write (tp,__le16_to_cpu (mac->bp_start),BYTE_EN_DWORD , +ALIGN (__le16_to_cpu (mac->bp_num) <<1 ,4 ), + mac->bp, type) <0 ) { +dev_err (&tp->intf->dev,"Write %s bp fail\n" , + type ?"PLA" :"USB" ); +return ; + } bp_en_addr =__le16_to_cpu (mac->bp_en_addr);if (bp_en_addr)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 134/269 net: bridge: br_fdb_external_learn_add(): always set EXT_LEARN
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit bee2ef946d3184e99077be526567d791c473036f ]
When userspace wants to take over a fdb entry by setting it as EXTERN_LEARNED, we set both flags BR_FDB_ADDED_BY_EXT_LEARN and BR_FDB_ADDED_BY_USER in br_fdb_external_learn_add().
If the bridge updates the entry later because its port changed, we clear the BR_FDB_ADDED_BY_EXT_LEARN flag, but leave the BR_FDB_ADDED_BY_USER flag set.
If userspace then wants to take over the entry again, br_fdb_external_learn_add() sees that BR_FDB_ADDED_BY_USER and skips setting the BR_FDB_ADDED_BY_EXT_LEARN flags, thus silently ignores the update.
Fix this by always allowing to set BR_FDB_ADDED_BY_EXT_LEARN regardless if this was a user fdb entry or not.
--- net/bridge/br_fdb.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
net/bridge/br_fdb.c +2 -4
@@ -1425,12 +1425,10 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, modified = true; } -if (test_bit (BR_FDB_ADDED_BY_EXT_LEARN , &fdb->flags)) { +if (test_and_set_bit (BR_FDB_ADDED_BY_EXT_LEARN , &fdb->flags)) {/* Refresh entry */ fdb->used = jiffies; - }else if (!test_bit (BR_FDB_ADDED_BY_USER , &fdb->flags)) { -/* Take over SW learned entry */ -set_bit (BR_FDB_ADDED_BY_EXT_LEARN , &fdb->flags); + }else { modified = true; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 135/269 net: dsa: vsc73xx: fix possible subblocks range of CAPT block
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pawel Dembicki <[email protected]>
[ Upstream commit 8e69c96df771ab469cec278edb47009351de4da6 ]
CAPT block (CPU Capture Buffer) have 7 sublocks: 0-3, 4, 6, 7. Function 'vsc73xx_is_addr_valid' allows to use only block 0 at this moment.
This patch fix it.
--- drivers/net/dsa/vitesse-vsc73xx-core.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/net/dsa/vitesse-vsc73xx-core.c +8 -2
@@ -34,7 +34,7 @@#define VSC73XX_BLOCK_ANALYZER 0x2/* Only subblock 0 */ #define VSC73XX_BLOCK_MII 0x3/* Subblocks 0 and 1 */ #define VSC73XX_BLOCK_MEMINIT 0x3/* Only subblock 2 */ -#define VSC73XX_BLOCK_CAPTURE 0x4/* Only subblock 2 */ +#define VSC73XX_BLOCK_CAPTURE 0x4/* Subblocks 0-4, 6, 7 */ #define VSC73XX_BLOCK_ARBITER 0x5/* Only subblock 0 */ #define VSC73XX_BLOCK_SYSTEM 0x7/* Only subblock 0 */
@@ -370,13 +370,19 @@ int vsc73xx_is_addr_valid(u8 block, u8 subblock)break ;case VSC73XX_BLOCK_MII : -case VSC73XX_BLOCK_CAPTURE :case VSC73XX_BLOCK_ARBITER :switch (subblock) { case 0 ... 1:return 1 ; }break ; +case VSC73XX_BLOCK_CAPTURE : +switch (subblock) { + case 0 ... 4: + case 6 ... 7: +return 1 ; + } +break ; }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 136/269 selftests: net: enable bind tests
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jamie Bainbridge <[email protected]>
[ Upstream commit e4af74a53b7aa865e7fcc104630ebb7a9129b71f ]
bind_wildcard is compiled but not run, bind_timewait is not compiled.
These two tests complete in a very short time, use the test harness properly, and seem reasonable to enable.
The author of the tests confirmed via email that these were intended to be run.
Enable these two tests.
--- tools/testing/selftests/net/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/testing/selftests/net/Makefile +2 -1
@@ -85,7 +85,8 @@ TEST_GEN_FILES += csum TEST_GEN_FILES += nat6to4.o TEST_GEN_FILES += xdp_dummy.o TEST_GEN_FILES += ip_local_port_range -TEST_GEN_FILES += bind_wildcard +TEST_GEN_PROGS += bind_wildcard +TEST_GEN_PROGS += bind_timewait TEST_PROGS += test_vxlan_mdb.sh TEST_PROGS += test_bridge_neigh_suppress.sh TEST_PROGS += test_vxlan_nolocalbypass.sh
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 137/269 xen: privcmd: Fix possible access to a freed kirqfd instance
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
[ Upstream commit 611ff1b1ae989a7bcce3e2a8e132ee30e968c557 ]
Nothing prevents simultaneous ioctl calls to privcmd_irqfd_assign() and privcmd_irqfd_deassign(). If that happens, it is possible that a kirqfd created and added to the irqfds_list by privcmd_irqfd_assign() may get removed by another thread executing privcmd_irqfd_deassign(), while the former is still using it after dropping the locks.
This can lead to a situation where an already freed kirqfd instance may be accessed and cause kernel oops.
Use SRCU locking to prevent the same, as is done for the KVM implementation for irqfds.
--- drivers/xen/privcmd.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/xen/privcmd.c +9 -1
@@ -17,6 +17,7 @@#include <linux/poll.h> #include <linux/sched.h> #include <linux/slab.h> +#include <linux/srcu.h> #include <linux/string.h> #include <linux/workqueue.h> #include <linux/errno.h>
@@ -842,6 +843,7 @@ static long privcmd_ioctl_mmap_resource(struct file *file,/* Irqfd support */ static struct workqueue_struct *irqfd_cleanup_wq;static DEFINE_SPINLOCK (irqfds_lock); +DEFINE_STATIC_SRCU (irqfds_srcu);static LIST_HEAD (irqfds_list);struct privcmd_kernel_irqfd {
@@ -869,6 +871,9 @@ static void irqfd_shutdown(struct work_struct *work) container_of(work, struct privcmd_kernel_irqfd, shutdown);u64 cnt; +/* Make sure irqfd has been initialized in assign path */ +synchronize_srcu (&irqfds_srcu); +eventfd_ctx_remove_wait_queue (kirqfd->eventfd, &kirqfd->wait, &cnt);eventfd_ctx_put (kirqfd->eventfd);kfree (kirqfd);
@@ -931,7 +936,7 @@ static int privcmd_irqfd_assign(struct privcmd_irqfd *irqfd)__poll_t events;struct fd f;void *dm_op; -int ret; +int ret, idx; kirqfd =kzalloc (sizeof (*kirqfd) + irqfd->size,GFP_KERNEL );if (!kirqfd)
@@ -977,6 +982,7 @@ static int privcmd_irqfd_assign(struct privcmd_irqfd *irqfd) } } + idx =srcu_read_lock (&irqfds_srcu);list_add_tail (&kirqfd->list, &irqfds_list);spin_unlock_irqrestore (&irqfds_lock, flags);
@@ -988,6 +994,8 @@ static int privcmd_irqfd_assign(struct privcmd_irqfd *irqfd)if (events &EPOLLIN )irqfd_inject (kirqfd); +srcu_read_unlock (&irqfds_srcu, idx); +/* * Do not drop the file until the kirqfd is fully initialized, otherwise * we might race against the EPOLLHUP.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 138/269 firmware: cs_dsp: Dont allow writes to read-only controls
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Fitzgerald <[email protected]>
[ Upstream commit 62412a9357b16a4e39dc582deb2e2a682b92524c ]
Add a check to cs_dsp_coeff_write_ctrl() to abort if the control is not writeable.
The cs_dsp code originated as an ASoC driver (wm_adsp) where all controls were exported as ALSA controls. It relied on ALSA to enforce the read-only permission. Now that the code has been separated from ALSA/ASoC it must perform its own permission check.
This isn't currently causing any problems so there shouldn't be any need to backport this. If the client of cs_dsp exposes the control as an ALSA control, it should set permissions on that ALSA control to protect it. The few uses of cs_dsp_coeff_write_ctrl() inside drivers are for writable controls.
--- drivers/firmware/cirrus/cs_dsp.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/firmware/cirrus/cs_dsp.c +3 -0
@@ -796,6 +796,9 @@ int cs_dsp_coeff_write_ctrl(struct cs_dsp_coeff_ctl *ctl,lockdep_assert_held (&ctl->dsp->pwr_lock); +if (ctl->flags && !(ctl->flags &WMFW_CTL_FLAG_WRITEABLE )) +return -EPERM ; +if (len + off *sizeof (u32) > ctl->len)return -EINVAL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 139/269 phy: zynqmp: Take the phy mutex in xlate
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Anderson <[email protected]>
[ Upstream commit d79c6840917097285e03a49f709321f5fb972750 ]
Take the phy mutex in xlate to protect against concurrent modification/access to gtr_phy. This does not typically cause any issues, since in most systems the phys are only xlated once and thereafter accessed with the phy API (which takes the locks). However, we are about to allow userspace to access phys for debugging, so it's important to avoid any data races.
--- drivers/phy/xilinx/phy-zynqmp.c | 1 + 1 file changed, 1 insertion(+)
drivers/phy/xilinx/phy-zynqmp.c +1 -0
@@ -846,6 +846,7 @@ static struct phy *xpsgtr_xlate(struct device *dev, phy_type = args->args[1 ]; phy_instance = args->args[2 ]; +guard (mutex)(>r_phy->phy->mutex); ret =xpsgtr_set_lane_type (gtr_phy, phy_type, phy_instance);if (ret <0 ) {dev_err (gtr_dev->dev,"Invalid PHY type and/or instance\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 140/269 ASoC: topology: Properly initialize soc_enum values
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amadeusz Sławiński <[email protected]>
[ Upstream commit 8ec2a2643544ce352f012ad3d248163199d05dfc ]
soc_tplg_denum_create_values() should properly set its values field.
--- sound/soc/soc-topology.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/soc-topology.c +2 -0
@@ -851,6 +851,8 @@ static int soc_tplg_denum_create_values(struct soc_tplg *tplg, struct soc_enum * se->dobj.control.dvalues[i] =le32_to_cpu (ec->values[i]); } + se->items =le32_to_cpu (ec->items); + se->values = (const unsigned int *)se->dobj.control.dvalues;return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 141/269 dm init: Handle minors larger than 255
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Marzinski <[email protected]>
[ Upstream commit 140ce37fd78a629105377e17842465258a5459ef ]
dm_parse_device_entry() simply copies the minor number into dmi.dev, but the dev_t format splits the minor number between the lowest 8 bytes and highest 12 bytes. If the minor number is larger than 255, part of it will end up getting treated as the major number
Fix this by checking that the minor number is valid and then encoding it as a dev_t.
--- drivers/md/dm-init.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/md/dm-init.c +3 -1
@@ -212,8 +212,10 @@ static char __init *dm_parse_device_entry(struct dm_device *dev, char *str)strscpy (dev->dmi.uuid, field[1 ],sizeof (dev->dmi.uuid));/* minor */ if (strlen (field[2 ])) { -if (kstrtoull (field[2 ],0 , &dev->dmi.dev)) +if (kstrtoull (field[2 ],0 , &dev->dmi.dev) || + dev->dmi.dev >= (1 <<MINORBITS ))return ERR_PTR (-EINVAL ); + dev->dmi.dev =huge_encode_dev ((dev_t )dev->dmi.dev); dev->dmi.flags |=DM_PERSISTENT_DEV_FLAG ; }/* flags */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 142/269 iommu/vt-d: Handle volatile descriptor status read
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Pan <[email protected]>
[ Upstream commit b5e86a95541cea737394a1da967df4cd4d8f7182 ]
Queued invalidation wait descriptor status is volatile in that IOMMU hardware writes the data upon completion.
Use READ_ONCE() to prevent compiler optimizations which ensures memory reads every time. As a side effect, READ_ONCE() also enforces strict types and may add an extra instruction. But it should not have negative performance impact since we use cpu_relax anyway and the extra time(by adding an instruction) may allow IOMMU HW request cacheline ownership easier.
e.g. gcc 12.3
BEFORE:
81 38 ad de 00 00 cmpl $0x2,(%rax)
AFTER (with READ_ONCE())
772f: 8b 00 mov (%rax),%eax
7731: 3d ad de 00 00 cmp $0x2,%eax
//status data is 32 bit--- drivers/iommu/intel/dmar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iommu/intel/dmar.c +1 -1
@@ -1422,7 +1422,7 @@ int qi_submit_sync(struct intel_iommu *iommu, struct qi_desc *desc,*/ writel (qi->free_head << shift, iommu->reg +DMAR_IQT_REG ); -while (qi->desc_status[wait_index] !=QI_DONE ) { +while (READ_ONCE (qi->desc_status[wait_index]) !=QI_DONE ) {/* * We will leave the interrupts disabled, to prevent interrupt * context to queue another cmd while a cmd is already submitted
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 143/269 cgroup: Protect css->cgroup write under css_set_lock
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Waiman Long <[email protected]>
[ Upstream commit 57b56d16800e8961278ecff0dc755d46c4575092 ]
The writing of css->cgroup associated with the cgroup root in rebind_subsystems() is currently protected only by cgroup_mutex. However, the reading of css->cgroup in both proc_cpuset_show() and proc_cgroup_show() is protected just by css_set_lock. That makes the readers susceptible to racing problems like data tearing or caching. It is also a problem that can be reported by KCSAN.
This can be fixed by using READ_ONCE() and WRITE_ONCE() to access css->cgroup. Alternatively, the writing of css->cgroup can be moved under css_set_lock as well which is done by this patch.
--- kernel/cgroup/cgroup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/cgroup/cgroup.c +1 -1
@@ -1829,9 +1829,9 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask)RCU_INIT_POINTER (scgrp->subsys[ssid],NULL );rcu_assign_pointer (dcgrp->subsys[ssid], css); ss->root = dst_root; - css->cgroup = dcgrp;spin_lock_irq (&css_set_lock); + css->cgroup = dcgrp;WARN_ON (!list_empty (&dcgrp->e_csets[ss->id]));list_for_each_entry_safe (cset, cset_pos, &scgrp->e_csets[ss->id], e_cset_node[ss->id]) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 144/269 um: line: always fill *error_out in setup_one_line()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 824ac4a5edd3f7494ab1996826c4f47f8ef0f63d ]
The pointer isn't initialized by callers, but I have encountered cases where it's still printed; initialize it in all possible cases in setup_one_line().
--- arch/um/drivers/line.c | 2 ++ 1 file changed, 2 insertions(+)
arch/um/drivers/line.c +2 -0
@@ -383,6 +383,7 @@ int setup_one_line(struct line *lines, int n, char *init,parse_chan_pair (NULL , line, n, opts, error_out); err =0 ; } + *error_out ="configured as 'none'" ; }else {char *new =kstrdup (init,GFP_KERNEL );if (!new) {
@@ -406,6 +407,7 @@ int setup_one_line(struct line *lines, int n, char *init, } }if (err) { + *error_out ="failed to parse channel pair" ; line->init_str =NULL ; line->valid =0 ;kfree (new);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 145/269 devres: Initialize an uninitialized struct member
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijun Hu <[email protected]>
[ Upstream commit 56a20ad349b5c51909cf8810f7c79b288864ad33 ]
Initialize an uninitialized struct member for driver API devres_open_group().
--- drivers/base/devres.c | 1 + 1 file changed, 1 insertion(+)
drivers/base/devres.c +1 -0
@@ -567,6 +567,7 @@ void * devres_open_group(struct device *dev, void *id, gfp_t gfp) grp->id = grp;if (id) grp->id = id; + grp->color =0 ;spin_lock_irqsave (&dev->devres_lock, flags);add_dr (dev, &grp->node[0 ]);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 146/269 pci/hotplug/pnv_php: Fix hotplug driver crash on Powernv
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Kumar <[email protected]>
[ Upstream commit 335e35b748527f0c06ded9eebb65387f60647fda ]
The hotplug driver for powerpc (pci/hotplug/pnv_php.c) causes a kernel crash when we try to hot-unplug/disable the PCIe switch/bridge from the PHB.
The crash occurs because although the MSI data structure has been released during disable/hot-unplug path and it has been assigned with NULL, still during unregistration the code was again trying to explicitly disable the MSI which causes the NULL pointer dereference and kernel crash.
The patch fixes the check during unregistration path to prevent invoking pci_disable_msi/msix() since its data structure is already freed.
--- drivers/pci/hotplug/pnv_php.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/pci/hotplug/pnv_php.c +1 -2
@@ -39,7 +39,6 @@ static void pnv_php_disable_irq(struct pnv_php_slot *php_slot, bool disable_device) {struct pci_dev *pdev = php_slot->pdev; -int irq = php_slot->irq;u16 ctrl;if (php_slot->irq >0 ) {
@@ -58,7 +57,7 @@ static void pnv_php_disable_irq(struct pnv_php_slot *php_slot, php_slot->wq =NULL ; } -if (disable_device || irq >0 ) { +if (disable_device) {if (pdev->msix_enabled)pci_disable_msix (pdev);else if (pdev->msi_enabled)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 147/269 virtio_ring: fix KMSAN error for premapped mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xuan Zhuo <[email protected]>
[ Upstream commit 840b2d39a2dc1b96deb3f5c7fef76c9b24f08f51 ]
Add kmsan for virtqueue_dma_map_single_attrs to fix:
BUG: KMSAN: uninit-value in receive_buf+0x45ca/0x6990 receive_buf+0x45ca/0x6990 virtnet_poll+0x17e0/0x3130 net_rx_action+0x832/0x26e0 handle_softirqs+0x330/0x10f0 [...]
Uninit was created at:
__alloc_pages_noprof+0x62a/0xe60 alloc_pages_noprof+0x392/0x830 skb_page_frag_refill+0x21a/0x5c0 virtnet_rq_alloc+0x50/0x1500 try_fill_recv+0x372/0x54c0 virtnet_open+0x210/0xbe0 __dev_open+0x56e/0x920 __dev_change_flags+0x39c/0x2000 dev_change_flags+0xaa/0x200 do_setlink+0x197a/0x7420 rtnl_setlink+0x77c/0x860 [...]
Message-Id: <[email protected]>
--- drivers/virtio/virtio_ring.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/virtio/virtio_ring.c +3 -1
@@ -3126,8 +3126,10 @@ dma_addr_t virtqueue_dma_map_single_attrs(struct virtqueue *_vq, void *ptr, {struct vring_virtqueue *vq =to_vvq (_vq); -if (!vq->use_dma_api) +if (!vq->use_dma_api) { +kmsan_handle_dma (virt_to_page (ptr),offset_in_page (ptr), size, dir);return (dma_addr_t )virt_to_phys (ptr); + }return dma_map_single_attrs (vring_dma_dev (vq), ptr, size, dir, attrs); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 148/269 wifi: rtw88: usb: schedule rx work after everything is set up
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcin Ślusarz <[email protected]>
[ Upstream commit adc539784c98a7cc602cbf557debfc2e7b9be8b3 ]
Right now it's possible to hit NULL pointer dereference in rtw_rx_fill_rx_status on hw object and/or its fields because initialization routine can start getting USB replies before rtw_dev is fully setup.
The stack trace looks like this:
rtw_rx_fill_rx_statusrtw8821c_query_rx_descrtw_usb_rx_handler
...queue_workrtw_usb_read_port_complete
...usb_submit_urbrtw_usb_rx_resubmitrtw_usb_init_rxrtw_usb_probe
So while we do the async stuff rtw_usb_probe continues and calls rtw_register_hw, which does all kinds of initialization (e.g. via ieee80211_register_hw) that rtw_rx_fill_rx_status relies on.
Fix this by moving the first usb_submit_urb after everything is set up.
For me, this bug manifested as:
[ 8.893177] rtw_8821cu 1-1:1.2: band wrong, packet dropped [ 8.910904] rtw_8821cu 1-1:1.2: hw->conf.chandef.chan NULL in rtw_rx_fill_rx_status
because I'm using Larry's backport of rtw88 driver with the NULL checks in rtw_rx_fill_rx_status.
--- drivers/net/wireless/realtek/rtw88/usb.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw88/usb.c +10 -3
@@ -742,7 +742,6 @@ static struct rtw_hci_ops rtw_usb_ops = {static int rtw_usb_init_rx (struct rtw_dev *rtwdev) {struct rtw_usb *rtwusb =rtw_get_usb_priv (rtwdev); -int i; rtwusb->rxwq =create_singlethread_workqueue ("rtw88_usb: rx wq" );if (!rtwusb->rxwq) {
@@ -754,13 +753,19 @@ static int rtw_usb_init_rx(struct rtw_dev *rtwdev)INIT_WORK (&rtwusb->rx_work, rtw_usb_rx_handler); +return 0 ; +} + +static void rtw_usb_setup_rx (struct rtw_dev *rtwdev) +{ +struct rtw_usb *rtwusb =rtw_get_usb_priv (rtwdev); +int i; +for (i =0 ; i <RTW_USB_RXCB_NUM ; i++) {struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i];rtw_usb_rx_resubmit (rtwusb, rxcb); } - -return 0 ; }static void rtw_usb_deinit_rx (struct rtw_dev *rtwdev)
@@ -897,6 +902,8 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) goto err_destroy_rxwq; } +rtw_usb_setup_rx (rtwdev); +return 0 ; err_destroy_rxwq:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 149/269 scsi: ufs: core: Remove SCSI host only if added
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kyoungrul Kim <[email protected]>
[ Upstream commit 7cbff570dbe8907e23bba06f6414899a0fbb2fcc ]
If host tries to remove ufshcd driver from a UFS device it would cause a kernel panic if ufshcd_async_scan fails during ufshcd_probe_hba before adding a SCSI host with scsi_add_host and MCQ is enabled since SCSI host has been defered after MCQ configuration introduced by commit 0cab4023ec7b ("scsi: ufs: core: Defer adding host to SCSI if MCQ is supported").
To guarantee that SCSI host is removed only if it has been added, set the scsi_host_added flag to true after adding a SCSI host and check whether it is set or not before removing it.
--- drivers/ufs/core/ufshcd.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/ufs/core/ufshcd.c +5 -2
@@ -10130,7 +10130,8 @@ void ufshcd_remove(struct ufs_hba *hba)blk_mq_destroy_queue (hba->tmf_queue);blk_put_queue (hba->tmf_queue);blk_mq_free_tag_set (&hba->tmf_tag_set); -scsi_remove_host (hba->host); +if (hba->scsi_host_added) +scsi_remove_host (hba->host);/* disable interrupts */ ufshcd_disable_intr (hba, hba->intr_mask);ufshcd_hba_stop (hba);
@@ -10408,6 +10409,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)dev_err (hba->dev,"scsi_add_host failed\n" ); goto out_disable; } + hba->scsi_host_added = true; } hba->tmf_tag_set = (struct blk_mq_tag_set ) {
@@ -10489,7 +10491,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) free_tmf_tag_set:blk_mq_free_tag_set (&hba->tmf_tag_set); out_remove_scsi_host: -scsi_remove_host (hba->host); +if (hba->scsi_host_added) +scsi_remove_host (hba->host); out_disable: hba->is_irq_enabled = false;ufshcd_hba_exit (hba);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 150/269 scsi: pm80xx: Set phy->enable_completion only when we wait for it
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Igor Pylypiv <[email protected]>
[ Upstream commit e4f949ef1516c0d74745ee54a0f4882c1f6c7aea ]
pm8001_phy_control() populates the enable_completion pointer with a stack address, sends a PHY_LINK_RESET / PHY_HARD_RESET, waits 300 ms, and returns. The problem arises when a phy control response comes late. After 300 ms the pm8001_phy_control() function returns and the passed enable_completion stack address is no longer valid. Late phy control response invokes complete() on a dangling enable_completion pointer which leads to a kernel crash.
--- drivers/scsi/pm8001/pm8001_sas.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/pm8001/pm8001_sas.c +3 -1
@@ -166,7 +166,6 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,unsigned long flags; pm8001_ha = sas_phy->ha->lldd_ha; phy = &pm8001_ha->phy[phy_id]; - pm8001_ha->phy[phy_id].enable_completion = &completion;if (PM8001_CHIP_DISP ->fatal_errors (pm8001_ha)) {/*
@@ -190,6 +189,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, rates->maximum_linkrate; }if (pm8001_ha->phy[phy_id].phy_state ==PHY_LINK_DISABLE ) { + pm8001_ha->phy[phy_id].enable_completion = &completion;PM8001_CHIP_DISP ->phy_start_req (pm8001_ha, phy_id);wait_for_completion (&completion); }
@@ -198,6 +198,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,break ;case PHY_FUNC_HARD_RESET :if (pm8001_ha->phy[phy_id].phy_state ==PHY_LINK_DISABLE ) { + pm8001_ha->phy[phy_id].enable_completion = &completion;PM8001_CHIP_DISP ->phy_start_req (pm8001_ha, phy_id);wait_for_completion (&completion); }
@@ -206,6 +207,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,break ;case PHY_FUNC_LINK_RESET :if (pm8001_ha->phy[phy_id].phy_state ==PHY_LINK_DISABLE ) { + pm8001_ha->phy[phy_id].enable_completion = &completion;PM8001_CHIP_DISP ->phy_start_req (pm8001_ha, phy_id);wait_for_completion (&completion); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 151/269 crypto: qat - fix unintentional re-enabling of error interrupts
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hareshx Sankar Raj <[email protected]>
[ Upstream commit f0622894c59458fceb33c4197462bc2006f3fc6b ]
The logic that detects pending VF2PF interrupts unintentionally clears the section of the error mask register(s) not related to VF2PF. This might cause interrupts unrelated to VF2PF, reported through errsou3 and errsou5, to be reported again after the execution of the function disable_pending_vf2pf_interrupts() in dh895xcc and GEN2 devices.
Fix by updating only section of errmsk3 and errmsk5 related to VF2PF.
--- drivers/crypto/intel/qat/qat_common/adf_gen2_pfvf.c | 4 +++- .../crypto/intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-)
drivers/crypto/intel/qat/qat_common/adf_gen2_pfvf.c +3 -1
@@ -100,7 +100,9 @@ static u32 adf_gen2_disable_pending_vf2pf_interrupts(void __iomem *pmisc_addr) errmsk3 |=ADF_GEN2_ERR_MSK_VF2PF (ADF_GEN2_VF_MSK );ADF_CSR_WR (pmisc_addr,ADF_GEN2_ERRMSK3 , errmsk3); - errmsk3 &=ADF_GEN2_ERR_MSK_VF2PF (sources | disabled); +/* Update only section of errmsk3 related to VF2PF */ + errmsk3 &= ~ADF_GEN2_ERR_MSK_VF2PF (ADF_GEN2_VF_MSK ); + errmsk3 |=ADF_GEN2_ERR_MSK_VF2PF (sources | disabled);ADF_CSR_WR (pmisc_addr,ADF_GEN2_ERRMSK3 , errmsk3);/* Return the sources of the (new) interrupt(s) */
drivers/crypto/intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c +6 -2
@@ -191,8 +191,12 @@ static u32 disable_pending_vf2pf_interrupts(void __iomem *pmisc_addr)ADF_CSR_WR (pmisc_addr,ADF_GEN2_ERRMSK3 , errmsk3);ADF_CSR_WR (pmisc_addr,ADF_GEN2_ERRMSK5 , errmsk5); - errmsk3 &=ADF_DH895XCC_ERR_MSK_VF2PF_L (sources | disabled); - errmsk5 &=ADF_DH895XCC_ERR_MSK_VF2PF_U (sources | disabled); +/* Update only section of errmsk3 and errmsk5 related to VF2PF */ + errmsk3 &= ~ADF_DH895XCC_ERR_MSK_VF2PF_L (ADF_DH895XCC_VF_MSK ); + errmsk5 &= ~ADF_DH895XCC_ERR_MSK_VF2PF_U (ADF_DH895XCC_VF_MSK ); + + errmsk3 |=ADF_DH895XCC_ERR_MSK_VF2PF_L (sources | disabled); + errmsk5 |=ADF_DH895XCC_ERR_MSK_VF2PF_U (sources | disabled);ADF_CSR_WR (pmisc_addr,ADF_GEN2_ERRMSK3 , errmsk3);ADF_CSR_WR (pmisc_addr,ADF_GEN2_ERRMSK5 , errmsk5);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 152/269 hwmon: (adc128d818) Fix underflows seen when writing limit attributes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit 8cad724c8537fe3e0da8004646abc00290adae40 ]
DIV_ROUND_CLOSEST() after kstrtol() results in an underflow if a large negative number such as -9223372036854775808 is provided by the user. Fix it by reordering clamp_val() and DIV_ROUND_CLOSEST() operations.
--- drivers/hwmon/adc128d818.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hwmon/adc128d818.c +2 -2
@@ -176,7 +176,7 @@ static ssize_t adc128_in_store(struct device *dev,mutex_lock (&data->update_lock);/* 10 mV LSB on limit registers */ - regval =clamp_val (DIV_ROUND_CLOSEST (val,10 ),0 ,255 ); + regval =DIV_ROUND_CLOSEST (clamp_val (val,0 ,2550 ),10 ); data->in[index][nr] = regval <<4 ; reg = index ==1 ?ADC128_REG_IN_MIN (nr) :ADC128_REG_IN_MAX (nr);i2c_smbus_write_byte_data (data->client, reg, regval);
@@ -214,7 +214,7 @@ static ssize_t adc128_temp_store(struct device *dev,return err;mutex_lock (&data->update_lock); - regval =clamp_val (DIV_ROUND_CLOSEST (val,1000 ),-128 ,127 ); + regval =DIV_ROUND_CLOSEST (clamp_val (val,-128000 ,127000 ),1000 ); data->temp[index] = regval <<1 ; i2c_smbus_write_byte_data(data->client, index == 1 ? ADC128_REG_TEMP_MAX
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 153/269 hwmon: (lm95234) Fix underflows seen when writing limit attributes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit af64e3e1537896337405f880c1e9ac1f8c0c6198 ]
DIV_ROUND_CLOSEST() after kstrtol() results in an underflow if a large negative number such as -9223372036854775808 is provided by the user. Fix it by reordering clamp_val() and DIV_ROUND_CLOSEST() operations.
--- drivers/hwmon/lm95234.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/hwmon/lm95234.c +5 -4
@@ -301,7 +301,8 @@ static ssize_t tcrit2_store(struct device *dev, struct device_attribute *attr,if (ret <0 )return ret; - val =clamp_val (DIV_ROUND_CLOSEST (val,1000 ),0 , index ?255 :127 ); + val =DIV_ROUND_CLOSEST (clamp_val (val,0 , (index ?255 :127 ) *1000 ), +1000 );mutex_lock (&data->update_lock); data->tcrit2[index] = val;
@@ -350,7 +351,7 @@ static ssize_t tcrit1_store(struct device *dev, struct device_attribute *attr,if (ret <0 )return ret; - val =clamp_val (DIV_ROUND_CLOSEST (val,1000 ),0 ,255 ); + val =DIV_ROUND_CLOSEST (clamp_val (val,0 ,255000 ),1000 );mutex_lock (&data->update_lock); data->tcrit1[index] = val;
@@ -391,7 +392,7 @@ static ssize_t tcrit1_hyst_store(struct device *dev,if (ret <0 )return ret; - val =DIV_ROUND_CLOSEST (val,1000 ); + val =DIV_ROUND_CLOSEST (clamp_val (val,-255000 ,255000 ),1000 ); val =clamp_val ((int )data->tcrit1[index] - val,0 ,31 );mutex_lock (&data->update_lock);
@@ -431,7 +432,7 @@ static ssize_t offset_store(struct device *dev, struct device_attribute *attr,return ret;/* Accuracy is 1/2 degrees C */ - val =clamp_val (DIV_ROUND_CLOSEST (val,500 ),-128 ,127 ); + val =DIV_ROUND_CLOSEST (clamp_val (val,-64000 ,63500 ),500 );mutex_lock (&data->update_lock); data->toffset[index] = val;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 154/269 hwmon: (nct6775-core) Fix underflows seen when writing limit attributes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit 0403e10bf0824bf0ec2bb135d4cf1c0cc3bf4bf0 ]
DIV_ROUND_CLOSEST() after kstrtol() results in an underflow if a large negative number such as -9223372036854775808 is provided by the user. Fix it by reordering clamp_val() and DIV_ROUND_CLOSEST() operations.
--- drivers/hwmon/nct6775-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/nct6775-core.c +1 -1
@@ -2262,7 +2262,7 @@ store_temp_offset(struct device *dev, struct device_attribute *attr,if (err <0 )return err; - val =clamp_val (DIV_ROUND_CLOSEST (val,1000 ),-128 ,127 ); + val =DIV_ROUND_CLOSEST (clamp_val (val,-128000 ,127000 ),1000 );mutex_lock (&data->update_lock); data->temp_offset[nr] = val;
Signature · 1 line
2.43.0