6.14.6-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 6.14.6-rc1 review
This is the start of the stable review cycle for the 6.14.6 release. There are 183 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 Fri, 09 May 2025 18:37:41 +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.14.6-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.14.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.14.6-rc1
Kent Overstreet <[email protected]>
bcachefs: Change btree_insert_node() assertion to error
Chris Bainbridge <[email protected]>
drm/amd/display: Fix slab-use-after-free in hdcp
Mario Limonciello <[email protected]>
drm/amd/display: Add scoped mutexes for amdgpu_dm_dhcp
Penglei Jiang <[email protected]>
btrfs: fix the inode leak in btrfs_iget()
David Sterba <[email protected]>
btrfs: pass struct btrfs_inode to btrfs_iget_locked()
David Sterba <[email protected]>
btrfs: pass struct btrfs_inode to btrfs_read_locked_inode()
Qu Wenruo <[email protected]>
btrfs: expose per-inode stable writes flag
Shyam Saini <[email protected]>
drivers: base: handle module_kobject creation
Shyam Saini <[email protected]>
kernel: globalize lookup_or_create_module_kobject()
Shyam Saini <[email protected]>
kernel: param: rename locate_module_kobject
Naohiro Aota <[email protected]>
btrfs: zoned: skip reporting zone for new block group
Naohiro Aota <[email protected]>
block: introduce zone capacity helper
Christian Bruel <[email protected]>
arm64: dts: st: Use 128kB size for aliased GIC400 register access on stm32mp25 SoCs
Christian Bruel <[email protected]>
arm64: dts: st: Adjust interrupt-controller for stm32mp25 SoCs
Sébastien Szymanski <[email protected]>
ARM: dts: opos6ul: add ksz8081 phy properties
Richard Zhu <[email protected]>
arm64: dts: imx95: Correct the range of PCIe app-reg region
Sudeep Holla <[email protected]>
firmware: arm_ffa: Skip Rx buffer ownership release if not acquired
Cristian Marussi <[email protected]>
firmware: arm_scmi: Balance device refcount when destroying devices
Cong Wang <[email protected]>
sch_ets: make est_qlen_notify() idempotent
Cong Wang <[email protected]>
sch_qfq: make qfq_qlen_notify() idempotent
Cong Wang <[email protected]>
sch_hfsc: make hfsc_qlen_notify() idempotent
Cong Wang <[email protected]>
sch_drr: make drr_qlen_notify() idempotent
Cong Wang <[email protected]>
sch_htb: make htb_qlen_notify() idempotent
Ming Lei <[email protected]>
ublk: fix race between io_uring_cmd_complete_in_task and ublk_cancel_cmd
Ming Lei <[email protected]>
ublk: simplify aborting ublk request
Ming Lei <[email protected]>
ublk: remove __ublk_quiesce_dev()
Uday Shankar <[email protected]>
ublk: improve detection and handling of ublk server exit
Ming Lei <[email protected]>
ublk: move device reset into ublk_ch_release()
Uday Shankar <[email protected]>
ublk: properly serialize all FETCH_REQs
Ming Lei <[email protected]>
ublk: add helper of ublk_need_map_io()
Kurt Borja <[email protected]>
platform/x86: alienware-wmi-wmax: Add support for Alienware m15 R7
Kenneth Graunke <[email protected]>
drm/xe: Invalidate L3 read-only cachelines for geometry streams too
Karol Wachowski <[email protected]>
accel/ivpu: Add handling of VPU_JSM_STATUS_MVNCI_CONTEXT_VIOLATION_HW
Karol Wachowski <[email protected]>
accel/ivpu: Fix locking order in ivpu_job_submit
Karol Wachowski <[email protected]>
accel/ivpu: Abort all jobs after command queue unregister
Zhenhua Huang <[email protected]>
mm, slab: clean up slab->obj_exts always
Stefan Wahren <[email protected]>
net: vertexcom: mse102x: Fix RX error handling
Stefan Wahren <[email protected]>
net: vertexcom: mse102x: Add range check for CMD_RTS
Stefan Wahren <[email protected]>
net: vertexcom: mse102x: Fix LEN_MASK
Stefan Wahren <[email protected]>
net: vertexcom: mse102x: Fix possible stuck of SPI interrupt
Jian Shen <[email protected]>
net: hns3: defer calling ptp_clock_register()
Hao Lan <[email protected]>
net: hns3: fixed debugfs tm_qset size
Yonglong Liu <[email protected]>
net: hns3: fix an interrupt residual problem
Jian Shen <[email protected]>
net: hns3: store rx VLAN tag offload state for VF
Sathesh B Edara <[email protected]>
octeon_ep: Fix host hang issue during device reboot
Mattias Barthel <[email protected]>
net: fec: ERR007885 Workaround for conventional TX
Thangaraj Samynathan <[email protected]>
net: lan743x: Fix memleak issue when GSO enabled
Sagi Maimon <[email protected]>
ptp: ocp: Fix NULL dereference in Adva board SMA sysfs operations
Jibin Zhang <[email protected]>
net: use sock_gen_put() when sk_state is TCP_TIME_WAIT
Vadim Fedorenko <[email protected]>
bnxt_en: fix module unload sequence
Alexander Stein <[email protected]>
ASoC: simple-card-utils: Fix pointer check in graph_util_parse_link_direction
Olivier Moysan <[email protected]>
ASoC: stm32: sai: add a check on minimal kernel frequency
Olivier Moysan <[email protected]>
ASoC: stm32: sai: skip useless iterations on kernel rate loop
Alistair Francis <[email protected]>
nvmet-tcp: select CONFIG_TLS from CONFIG_NVME_TARGET_TCP_TLS
Alistair Francis <[email protected]>
nvme-tcp: select CONFIG_TLS from CONFIG_NVME_TCP_TLS
Michael Liang <[email protected]>
nvme-tcp: fix premature queue removal and I/O failover
Michael Chan <[email protected]>
bnxt_en: Fix ethtool -d byte order for 32-bit values
Shruti Parab <[email protected]>
bnxt_en: Fix out-of-bound memcpy() during ethtool -w
Shruti Parab <[email protected]>
bnxt_en: Fix coredump logic to free allocated buffer
Kashyap Desai <[email protected]>
bnxt_en: call pci_alloc_irq_vectors() after bnxt_reserve_rings()
Somnath Kotur <[email protected]>
bnxt_en: Add missing skb_mark_for_recycle() in bnxt_rx_vlan()
Kalesh AP <[email protected]>
bnxt_en: Fix ethtool selftest output in one of the failure cases
Shravya KN <[email protected]>
bnxt_en: Fix error handling path in bnxt_init_chip()
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Fix built-mic regression on other ASUS models
Felix Fietkau <[email protected]>
net: ipv6: fix UDPv6 GSO segmentation with NAT
Vladimir Oltean <[email protected]>
net: dsa: felix: fix broken taprio gate states after clock jump
Chad Monroe <[email protected]>
net: ethernet: mtk_eth_soc: fix SER panic with 4GB+ RAM
Jacob Keller <[email protected]>
igc: fix lock order in igc_ptp_reset
Larysa Zaremba <[email protected]>
idpf: protect shutdown from reset
Michal Swiatkowski <[email protected]>
idpf: fix potential memory leak on kcalloc() failure
Da Xue <[email protected]>
net: mdio: mux-meson-gxl: set reversed bit when using internal phy
Simon Horman <[email protected]>
net: dlink: Correct endianness handling of led_mode
Russell Cloran <[email protected]>
drm/mipi-dbi: Fix blanking for non-16 bit formats
Maxime Ripard <[email protected]>
drm/tests: shmem: Fix memleak
Keith Busch <[email protected]>
nvme-pci: fix queue unquiesce check on slot_reset
Takashi Iwai <[email protected]>
ALSA: ump: Fix buffer overflow at UMP SysEx message conversion
Maulik Shah <[email protected]>
pinctrl: qcom: Fix PINGROUP definition for sm8750
John Harrison <[email protected]>
drm/xe/guc: Fix capture of steering registers
Keoseong Park <[email protected]>
scsi: ufs: core: Remove redundant query_complete trace
Madhu Chittim <[email protected]>
idpf: fix offloads support for encapsulated packets
Xuanqiang Luo <[email protected]>
ice: Check VF VSI Pointer Value in ice_vc_add_fdir_fltr()
Paul Greenwalt <[email protected]>
ice: fix Get Tx Topology AQ command error on E830
Karol Kolacinski <[email protected]>
ice: Remove unnecessary ice_is_e8xx() functions
Karol Kolacinski <[email protected]>
ice: Don't check device type when checking GNSS presence
Victor Nogueira <[email protected]>
net_sched: qfq: Fix double list add in class with netem as child qdisc
Victor Nogueira <[email protected]>
net_sched: ets: Fix double list add in class with netem as child qdisc
Victor Nogueira <[email protected]>
net_sched: hfsc: Fix a UAF vulnerability in class with netem as child qdisc
Victor Nogueira <[email protected]>
net_sched: drr: Fix double list add in class with netem as child qdisc
Shannon Nelson <[email protected]>
pds_core: remove write-after-free of client_id
Shannon Nelson <[email protected]>
pds_core: specify auxiliary_device to be created
Shannon Nelson <[email protected]>
pds_core: make pdsc_auxbus_dev_del() void
Daniel Golle <[email protected]>
net: ethernet: mtk_eth_soc: sync mtk_clks_source_name array
Louis-Alexis Eyraud <[email protected]>
net: ethernet: mtk-star-emac: rearm interrupts in rx_poll only when advised
Louis-Alexis Eyraud <[email protected]>
net: ethernet: mtk-star-emac: fix spinlock recursion issues on rx/tx poll
Justin Lai <[email protected]>
rtase: Modify the condition used to detect overflow in rtase_calc_time_mitigation
Vadim Fedorenko <[email protected]>
bnxt_en: improve TX timestamping FIFO configuration
Sathesh B Edara <[email protected]>
octeon_ep_vf: Resolve netdevice usage count issue
Vladimir Oltean <[email protected]>
net: mscc: ocelot: delete PVID VLAN when readding it as non-PVID
Pauli Virtanen <[email protected]>
Bluetooth: L2CAP: copy RX timestamp to new fragments
Kiran K <[email protected]>
Bluetooth: btintel_pcie: Add additional to checks to clear TX/RX paths
En-Wei Wu <[email protected]>
Bluetooth: btusb: avoid NULL pointer dereference in skb_dequeue()
Kiran K <[email protected]>
Bluetooth: btintel_pcie: Avoid redundant buffer allocation
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_conn: Fix not setting timeout for BIG Create Sync
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_conn: Fix not setting conn_timeout for Broadcast Receiver
Viresh Kumar <[email protected]>
cpufreq: ACPI: Re-sync CPU boost state on system resume
Viresh Kumar <[email protected]>
cpufreq: acpi: Set policy->boost_supported
Viresh Kumar <[email protected]>
cpufreq: Introduce policy->boost_supported flag
Venkata Prasad Potturu <[email protected]>
ASoC: amd: acp: Fix NULL pointer deref in acp_i2s_set_tdm_slot
Raju Rangoju <[email protected]>
spi: spi-mem: Add fix to avoid divide error
Karol Wachowski <[email protected]>
accel/ivpu: Correct DCT interrupt handling
Chris Mi <[email protected]>
net/mlx5: E-switch, Fix error handling for enabling roce
Cosmin Ratiu <[email protected]>
net/mlx5e: Fix lock order in mlx5e_tx_reporter_ptpsq_unhealthy_recover
Jianbo Liu <[email protected]>
net/mlx5e: TC, Continue the attr process even if encap entry is invalid
Maor Gottlieb <[email protected]>
net/mlx5: E-Switch, Initialize MAC Address for Default GID
Vlad Dogaru <[email protected]>
net/mlx5e: Use custom tunnel header for vxlan gbp
e.kubanski <[email protected]>
xsk: Fix offset calculation in unaligned mode
e.kubanski <[email protected]>
xsk: Fix race condition in AF_XDP generic RX path
Ido Schimmel <[email protected]>
vxlan: vnifilter: Fix unlocked deletion of default FDB entry
Madhavan Srinivasan <[email protected]>
powerpc/boot: Fix dash warning
Murad Masimov <[email protected]>
wifi: plfxlc: Remove erroneous assert in plfxlc_mac_release
Emmanuel Grumbach <[email protected]>
wifi: iwlwifi: fix the check for the SCRATCH register upon resume
Emmanuel Grumbach <[email protected]>
wifi: iwlwifi: don't warn if the NIC is gone in resume
Johannes Berg <[email protected]>
wifi: iwlwifi: back off on continuous errors
Chen Linxuan <[email protected]>
drm/i915/pxp: fix undefined reference to `intel_pxp_gsccs_is_ready_for_sessions'
Kailang Yang <[email protected]>
ALSA: hda/realtek - Enable speaker for HP platform
Aneesh Kumar K.V (Arm) <[email protected]>
iommu/arm-smmu-v3: Add missing S2FWB feature detection
Chenyuan Yang <[email protected]>
ASoC: Intel: sof_sdw: Add NULL check in asoc_sdw_rt_dmic_rtd_init()
Madhavan Srinivasan <[email protected]>
powerpc/boot: Check for ld-option support
Hui Wang <[email protected]>
pinctrl: imx: Return NULL if no group is matched and found
Anthony Iliopoulos <[email protected]>
powerpc64/ftrace: fix module loading without patchable function entries
Donet Tom <[email protected]>
book3s64/radix : Align section vmemmap start address to PAGE_SIZE
Sheetal <[email protected]>
ASoC: soc-pcm: Fix hw_params() and DAPM widget sequence
Nico Pache <[email protected]>
firmware: cs_dsp: tests: Depend on FW_CS_DSP rather then enabling it
Richard Fitzgerald <[email protected]>
ASoC: cs-amp-lib-test: Don't select SND_SOC_CS_AMP_LIB
Geert Uytterhoeven <[email protected]>
ASoC: soc-core: Stop using of_property_read_bool() for non-boolean properties
Leo Li <[email protected]>
drm/amd/display: Default IPS to RCG_IN_ACTIVE_IPS2_IN_OFF
Alan Huang <[email protected]>
bcachefs: Remove incorrect __counted_by annotation
Jeongjun Park <[email protected]>
tracing: Fix oob write in trace_seq_to_buffer()
Rafael J. Wysocki <[email protected]>
cpufreq: Fix setting policy limits when frequency tables are used
Rafael J. Wysocki <[email protected]>
cpufreq: Avoid using inconsistent policy->min and policy->max
Jethro Donaldson <[email protected]>
smb: client: fix zero length for mkdir POSIX create context
Sean Heelan <[email protected]>
ksmbd: fix use-after-free in session logoff
Sean Heelan <[email protected]>
ksmbd: fix use-after-free in kerberos authentication
Namjae Jeon <[email protected]>
ksmbd: fix use-after-free in ksmbd_session_rpc_open
Shouye Liu <[email protected]>
platform/x86/intel-uncore-freq: Fix missing uncore sysfs during CPU hotplug
Mario Limonciello <[email protected]>
platform/x86/amd: pmc: Require at least 2.5 seconds between HW sleep cycles
Nicolin Chen <[email protected]>
iommu: Fix two issues in iommu_copy_struct_from_user()
Mingcong Bai <[email protected]>
iommu/vt-d: Apply quirk_iommu_igfx for 8086:0044 (QM57/QS57)
Balbir Singh <[email protected]>
iommu/arm-smmu-v3: Fix pgsize_bit for sva domains
Nicolin Chen <[email protected]>
iommu/arm-smmu-v3: Fix iommu_device_probe bug due to duplicated stream ids
Pavel Paklov <[email protected]>
iommu/amd: Fix potential buffer overflow in parse_ivrs_acpihid
Janne Grunau <[email protected]>
drm: Select DRM_KMS_HELPER from DRM_DEBUG_DP_MST_TOPOLOGY_REFS
Lijo Lazar <[email protected]>
drm/amdgpu: Fix offset for HDP remap in nbio v7.11
Benjamin Marzinski <[email protected]>
dm: always update the array size in realloc_argv on success
Mikulas Patocka <[email protected]>
dm-integrity: fix a warning on invalid table line
LongPing Wei <[email protected]>
dm-bufio: don't schedule in atomic context
Ard Biesheuvel <[email protected]>
x86/boot/sev: Support memory acceptance in the EFI stub under SVSM
Wentao Liang <[email protected]>
wifi: brcm80211: fmac: Add error handling for brcmf_usb_dl_writeimage()
Steven Rostedt <[email protected]>
tracing: Do not take trace_event_sem in print_event_fields()
Aaron Kling <[email protected]>
spi: tegra114: Don't fail set_cs_timing when delays are zero
Ruslan Piasetskyi <[email protected]>
mmc: renesas_sdhi: Fix error handling in renesas_sdhi_probe
Wei Yang <[email protected]>
mm/memblock: repeat setting reserved region nid if array is doubled
Wei Yang <[email protected]>
mm/memblock: pass size instead of end to memblock_set_node()
Stephan Gerhold <[email protected]>
irqchip/qcom-mpm: Prevent crash when trying to handle non-wake GPIOs
Vishal Badole <[email protected]>
amd-xgbe: Fix to ensure dependent features are toggled with RX checksum offload
Sean Christopherson <[email protected]>
perf/x86/intel: KVM: Mask PEBS_ENABLE loaded for guest with vCPU's value.
Kan Liang <[email protected]>
perf/x86/intel: Only check the group flag for X86 leader
Christian Marangi <[email protected]>
pinctrl: airoha: fix wrong PHY LED mapping and PHY2 LED defines
Helge Deller <[email protected]>
parisc: Fix double SIGFPE crash
Will Deacon <[email protected]>
arm64: errata: Add missing sentinels to Spectre-BHB MIDR arrays
Clark Wang <[email protected]>
i2c: imx-lpi2c: Fix clock count when probe defers
Niravkumar L Rabara <[email protected]>
EDAC/altera: Set DDR and SDMMC interrupt mask before registration
Niravkumar L Rabara <[email protected]>
EDAC/altera: Test the correct error reg offset
Philipp Stanner <[email protected]>
drm/nouveau: Fix WARN_ON in nouveau_fence_context_kill()
Tvrtko Ursulin <[email protected]>
drm/fdinfo: Protect against driver unbind
Srinivas Pandruvada <[email protected]>
cpufreq: intel_pstate: Unchecked MSR aceess in legacy mode
Dave Chen <[email protected]>
btrfs: fix COW handling in run_delalloc_nocow()
Josef Bacik <[email protected]>
btrfs: adjust subpage bit start based on sectorsize
Claudiu Beznea <[email protected]>
ASoC: renesas: rz-ssi: Use NOIRQ_SYSTEM_SLEEP_PM_OPS()
Joachim Priesner <[email protected]>
ALSA: usb-audio: Add second USB ID for Jabra Evolve 65 headset
Geoffrey D. Bennett <[email protected]>
ALSA: usb-audio: Add retry on -EPROTO from usb_set_interface()
Chris Chiu <[email protected]>
ALSA: hda/realtek - Add more HP laptops which need mute led fixup
Christian Heusel <[email protected]>
Revert "rndis_host: Flag RNDIS modems as WWAN devices"
-------------
Diffstat:
Makefile | 4 +- .../boot/dts/nxp/imx/imx6ul-imx6ull-opos6ul.dtsi | 3 + arch/arm64/boot/dts/freescale/imx95.dtsi | 8 +- arch/arm64/boot/dts/st/stm32mp251.dtsi | 9 +- arch/arm64/kernel/proton-pack.c | 2 + arch/parisc/math-emu/driver.c | 16 +- arch/powerpc/boot/wrapper | 6 +- arch/powerpc/kernel/module_64.c | 4 - arch/powerpc/mm/book3s64/radix_pgtable.c | 17 +- arch/x86/boot/compressed/mem.c | 5 +- arch/x86/boot/compressed/sev.c | 40 ++ arch/x86/boot/compressed/sev.h | 2 + arch/x86/events/core.c | 2 +- arch/x86/events/intel/core.c | 2 +- arch/x86/events/perf_event.h | 9 +- drivers/accel/ivpu/ivpu_drv.c | 32 +- drivers/accel/ivpu/ivpu_drv.h | 2 + drivers/accel/ivpu/ivpu_hw_btrs.h | 2 +- drivers/accel/ivpu/ivpu_job.c | 111 ++++- drivers/accel/ivpu/ivpu_job.h | 1 + drivers/accel/ivpu/ivpu_mmu.c | 3 +- drivers/accel/ivpu/ivpu_pm.c | 18 +- drivers/accel/ivpu/ivpu_sysfs.c | 5 +- drivers/base/module.c | 13 +- drivers/block/ublk_drv.c | 552 +++++++++++---------- drivers/bluetooth/btintel_pcie.c | 57 ++- drivers/bluetooth/btusb.c | 101 ++-- drivers/cpufreq/acpi-cpufreq.c | 14 + drivers/cpufreq/cpufreq.c | 42 +- drivers/cpufreq/cpufreq_ondemand.c | 3 +- drivers/cpufreq/freq_table.c | 10 +- drivers/cpufreq/intel_pstate.c | 3 + drivers/edac/altera_edac.c | 9 +- drivers/edac/altera_edac.h | 2 + drivers/firmware/arm_ffa/driver.c | 3 +- drivers/firmware/arm_scmi/bus.c | 3 + drivers/firmware/cirrus/Kconfig | 5 +- drivers/gpu/drm/Kconfig | 2 +- drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c | 2 +- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 - .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c | 56 +-- drivers/gpu/drm/drm_file.c | 6 + drivers/gpu/drm/drm_mipi_dbi.c | 6 +- drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.h | 8 +- drivers/gpu/drm/nouveau/nouveau_fence.c | 2 +- drivers/gpu/drm/tests/drm_gem_shmem_test.c | 3 + drivers/gpu/drm/xe/instructions/xe_gpu_commands.h | 1 + drivers/gpu/drm/xe/xe_guc_capture.c | 2 +- drivers/gpu/drm/xe/xe_ring_ops.c | 13 +- drivers/i2c/busses/i2c-imx-lpi2c.c | 4 +- drivers/iommu/amd/init.c | 8 + drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 6 + drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 21 +- drivers/iommu/intel/iommu.c | 4 +- drivers/irqchip/irq-qcom-mpm.c | 3 + drivers/md/dm-bufio.c | 9 +- drivers/md/dm-integrity.c | 2 +- drivers/md/dm-table.c | 5 +- drivers/mmc/host/renesas_sdhi_core.c | 10 +- drivers/net/dsa/ocelot/felix_vsc9959.c | 5 +- drivers/net/ethernet/amd/pds_core/auxbus.c | 39 +- drivers/net/ethernet/amd/pds_core/core.h | 7 +- drivers/net/ethernet/amd/pds_core/devlink.c | 7 +- drivers/net/ethernet/amd/pds_core/main.c | 11 +- drivers/net/ethernet/amd/xgbe/xgbe-desc.c | 9 +- drivers/net/ethernet/amd/xgbe/xgbe-dev.c | 24 +- drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 11 +- drivers/net/ethernet/amd/xgbe/xgbe.h | 4 + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 18 +- drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c | 30 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 38 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 29 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h | 1 + drivers/net/ethernet/dlink/dl2k.c | 2 +- drivers/net/ethernet/dlink/dl2k.h | 2 +- drivers/net/ethernet/freescale/fec_main.c | 7 +- drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | 2 +- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 82 ++- .../net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | 13 +- .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 25 +- .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | 1 + drivers/net/ethernet/intel/ice/ice.h | 5 - drivers/net/ethernet/intel/ice/ice_common.c | 208 ++++---- drivers/net/ethernet/intel/ice/ice_common.h | 7 +- drivers/net/ethernet/intel/ice/ice_ddp.c | 10 +- drivers/net/ethernet/intel/ice/ice_gnss.c | 31 +- drivers/net/ethernet/intel/ice/ice_gnss.h | 4 +- drivers/net/ethernet/intel/ice/ice_lib.c | 2 +- drivers/net/ethernet/intel/ice/ice_ptp.c | 137 ++--- drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 235 +++------ drivers/net/ethernet/intel/ice/ice_ptp_hw.h | 11 +- drivers/net/ethernet/intel/ice/ice_type.h | 9 - drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c | 5 + drivers/net/ethernet/intel/idpf/idpf.h | 18 +- drivers/net/ethernet/intel/idpf/idpf_lib.c | 76 ++- drivers/net/ethernet/intel/idpf/idpf_main.c | 1 + drivers/net/ethernet/intel/igc/igc_ptp.c | 6 +- .../net/ethernet/marvell/octeon_ep/octep_main.c | 2 +- .../ethernet/marvell/octeon_ep_vf/octep_vf_main.c | 4 +- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 18 +- drivers/net/ethernet/mediatek/mtk_star_emac.c | 13 +- .../ethernet/mellanox/mlx5/core/en/reporter_tx.c | 6 +- .../ethernet/mellanox/mlx5/core/en/tc_tun_vxlan.c | 32 +- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 5 +- .../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 5 +- drivers/net/ethernet/mellanox/mlx5/core/rdma.c | 11 +- drivers/net/ethernet/mellanox/mlx5/core/rdma.h | 4 +- drivers/net/ethernet/microchip/lan743x_main.c | 8 +- drivers/net/ethernet/microchip/lan743x_main.h | 1 + drivers/net/ethernet/mscc/ocelot.c | 6 + drivers/net/ethernet/realtek/rtase/rtase_main.c | 4 +- drivers/net/ethernet/vertexcom/mse102x.c | 36 +- drivers/net/mdio/mdio-mux-meson-gxl.c | 3 +- drivers/net/usb/rndis_host.c | 16 +- drivers/net/vxlan/vxlan_vnifilter.c | 8 +- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 6 +- drivers/net/wireless/intel/iwlwifi/iwl-csr.h | 1 + drivers/net/wireless/intel/iwlwifi/iwl-trans.c | 28 +- drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 7 +- drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 24 +- drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 9 +- drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 16 +- drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 2 +- drivers/net/wireless/purelifi/plfxlc/mac.c | 1 - drivers/nvme/host/Kconfig | 1 + drivers/nvme/host/pci.c | 2 +- drivers/nvme/host/tcp.c | 31 +- drivers/nvme/target/Kconfig | 1 + drivers/pinctrl/freescale/pinctrl-imx.c | 6 +- drivers/pinctrl/mediatek/pinctrl-airoha.c | 159 +++--- drivers/pinctrl/qcom/pinctrl-sm8750.c | 4 +- drivers/platform/x86/amd/pmc/pmc.c | 7 +- drivers/platform/x86/dell/alienware-wmi.c | 9 + .../x86/intel/uncore-frequency/uncore-frequency.c | 13 +- drivers/ptp/ptp_ocp.c | 52 +- drivers/spi/spi-mem.c | 6 +- drivers/spi/spi-tegra114.c | 6 +- drivers/ufs/core/ufshcd.c | 2 - fs/bcachefs/btree_update_interior.c | 17 +- fs/bcachefs/error.c | 8 + fs/bcachefs/error.h | 2 + fs/bcachefs/xattr_format.h | 8 +- fs/btrfs/btrfs_inode.h | 8 + fs/btrfs/extent_io.c | 2 +- fs/btrfs/file.c | 1 - fs/btrfs/inode.c | 152 +++--- fs/btrfs/ioctl.c | 1 + fs/btrfs/zoned.c | 18 +- fs/smb/client/smb2pdu.c | 1 + fs/smb/server/auth.c | 14 +- fs/smb/server/mgmt/user_session.c | 20 +- fs/smb/server/mgmt/user_session.h | 1 + fs/smb/server/smb2pdu.c | 9 - include/linux/blkdev.h | 67 ++- include/linux/cpufreq.h | 86 ++-- include/linux/iommu.h | 8 +- include/linux/module.h | 2 + include/net/bluetooth/hci.h | 4 +- include/net/bluetooth/hci_core.h | 20 +- include/net/bluetooth/hci_sync.h | 3 + include/net/xdp_sock.h | 3 - include/net/xsk_buff_pool.h | 4 +- include/sound/ump_convert.h | 2 +- kernel/params.c | 6 +- kernel/trace/trace.c | 5 +- kernel/trace/trace_output.c | 4 +- mm/memblock.c | 12 +- mm/slub.c | 27 +- net/bluetooth/hci_conn.c | 181 +------ net/bluetooth/hci_event.c | 15 +- net/bluetooth/hci_sync.c | 150 +++++- net/bluetooth/iso.c | 26 +- net/bluetooth/l2cap_core.c | 3 + net/ipv4/tcp_offload.c | 2 +- net/ipv4/udp_offload.c | 61 ++- net/ipv6/tcpv6_offload.c | 2 +- net/sched/sch_drr.c | 16 +- net/sched/sch_ets.c | 17 +- net/sched/sch_hfsc.c | 10 +- net/sched/sch_htb.c | 2 + net/sched/sch_qfq.c | 18 +- net/xdp/xsk.c | 6 +- net/xdp/xsk_buff_pool.c | 1 + sound/pci/hda/patch_realtek.c | 23 +- sound/soc/amd/acp/acp-i2s.c | 2 +- sound/soc/codecs/Kconfig | 5 +- sound/soc/generic/simple-card-utils.c | 4 +- sound/soc/renesas/rz-ssi.c | 2 +- sound/soc/sdw_utils/soc_sdw_rt_dmic.c | 2 + sound/soc/soc-core.c | 32 +- sound/soc/soc-pcm.c | 5 +- sound/soc/stm/stm32_sai_sub.c | 16 +- sound/usb/endpoint.c | 7 + sound/usb/format.c | 3 +- 194 files changed, 2373 insertions(+), 1773 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/183 Revert "rndis_host: Flag RNDIS modems as WWAN devices"
6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Heusel <[email protected]>
commit 765f253e28909f161b0211f85cf0431cfee7d6df upstream.
This reverts commit 67d1a8956d2d62fe6b4c13ebabb57806098511d8. Since this commit has been proven to be problematic for the setup of USB-tethered ethernet connections and the related breakage is very noticeable for users it should be reverted until a fixed version of the change can be rolled out.
--- drivers/net/usb/rndis_host.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-)
drivers/net/usb/rndis_host.c +2 -14
@@ -630,16 +630,6 @@ static const struct driver_info zte_rndi .tx_fixup = rndis_tx_fixup, }; -static const struct driver_info wwan_rndis_info = { - .description ="Mobile Broadband RNDIS device" , - .flags =FLAG_WWAN |FLAG_POINTTOPOINT |FLAG_FRAMING_RN |FLAG_NO_SETINT , - .bind = rndis_bind, - .unbind = rndis_unbind, - .status = rndis_status, - .rx_fixup = rndis_rx_fixup, - .tx_fixup = rndis_tx_fixup, -}; -/*-------------------------------------------------------------------------*/ static const struct usb_device_id products [] = {
@@ -676,11 +666,9 @@ static const struct usb_device_id produc USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3), .driver_info = (unsigned long) &rndis_info, }, { -/* Mobile Broadband Modem, seen in Novatel Verizon USB730L and -* Telit FN990A (RNDIS) -*/ +/* Novatel Verizon USB730L */ USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1), - .driver_info = (unsigned long)&wwan_rndis_info, + .driver_info = (unsigned long) &rndis_info, }, { }, // END };
Greg Kroah-Hartman
maintainerPATCH 2/183 ALSA: hda/realtek - Add more HP laptops which need mute led fixup
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Chiu <[email protected]>
commit 63f5235e0291152a2ac2c4ef3c1196cb6dfb3ef7 upstream.
More HP EliteBook with Realtek HDA codec ALC3247 and combined CS35L56 Amplifiers need quirk ALC236_FIXUP_HP_GPIO_LED to fix the micmute LED.
--- sound/pci/hda/patch_realtek.c | 3 +++ 1 file changed, 3 insertions(+)
sound/pci/hda/patch_realtek.c +3 -0
@@ -10732,8 +10732,11 @@ static const struct hda_quirk alc269_fixSND_PCI_QUIRK (0x103c ,0x8de8 ,"HP Gemtree" ,ALC245_FIXUP_TAS2781_SPI_2 ),SND_PCI_QUIRK (0x103c ,0x8de9 ,"HP Gemtree" ,ALC245_FIXUP_TAS2781_SPI_2 ),SND_PCI_QUIRK (0x103c ,0x8dec ,"HP EliteBook 640 G12" ,ALC236_FIXUP_HP_GPIO_LED ), +SND_PCI_QUIRK (0x103c ,0x8ded ,"HP EliteBook 640 G12" ,ALC236_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8dee ,"HP EliteBook 660 G12" ,ALC236_FIXUP_HP_GPIO_LED ), +SND_PCI_QUIRK (0x103c ,0x8def ,"HP EliteBook 660 G12" ,ALC236_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8df0 ,"HP EliteBook 630 G12" ,ALC236_FIXUP_HP_GPIO_LED ), +SND_PCI_QUIRK (0x103c ,0x8df1 ,"HP EliteBook 630 G12" ,ALC236_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8dfc ,"HP EliteBook 645 G12" ,ALC236_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8dfe ,"HP EliteBook 665 G12" ,ALC236_FIXUP_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x8e14, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED),
Greg Kroah-Hartman
maintainerPATCH 3/183 ALSA: usb-audio: Add retry on -EPROTO from usb_set_interface()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
commit f406005e162b660dc405b4f18bf7bcb93a515608 upstream.
During initialisation of Focusrite USB audio interfaces, -EPROTO is sometimes returned from usb_set_interface(), which sometimes prevents the device from working: subsequent usb_set_interface() and uac_clock_source_is_valid() calls fail.
This patch adds up to 5 retries in endpoint_set_interface(), with a delay starting at 5ms and doubling each time. 5 retries was chosen to allow for longer than expected waits for the interface to start responding correctly; in testing, a single 5ms delay was sufficient to fix the issue.
--- sound/usb/endpoint.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/usb/endpoint.c +7 -0
@@ -926,6 +926,8 @@ static int endpoint_set_interface(struct {int altset = set ? ep->altsetting :0 ;int err; +int retries =0 ; +const int max_retries =5 ;if (ep->iface_ref->altset == altset)return 0 ;
@@ -935,8 +937,13 @@ static int endpoint_set_interface(structusb_audio_dbg (chip,"Setting usb interface %d:%d for EP 0x%x\n" , ep->iface, altset, ep->ep_num); +retry: err =usb_set_interface (chip->dev, ep->iface, altset);if (err <0 ) { +if (err == -EPROTO && ++retries <= max_retries) { +msleep (5 * (1 << (retries -1 ))); + goto retry; + }usb_audio_err_ratelimited ( chip,"%d:%d: usb_set_interface failed (%d)\n" , ep->iface, altset, err);
Greg Kroah-Hartman
maintainerPATCH 4/183 ALSA: usb-audio: Add second USB ID for Jabra Evolve 65 headset
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joachim Priesner <[email protected]>
commit 1149719442d28c96dc63cad432b5a6db7c300e1a upstream.
There seem to be multiple USB device IDs used for these; the one I have reports as 0b0e:030c when powered on. (When powered off, it reports as 0b0e:0311.)
--- sound/usb/format.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/usb/format.c +2 -1
@@ -260,7 +260,8 @@ static int parse_audio_format_rates_v1(s }/* Jabra Evolve 65 headset */ -if (chip->usb_id ==USB_ID (0x0b0e ,0x030b )) { +if (chip->usb_id ==USB_ID (0x0b0e ,0x030b ) || + chip->usb_id ==USB_ID (0x0b0e ,0x030c )) {/* only 48kHz for playback while keeping 16kHz for capture */ if (fp->nr_rates !=1 )return set_fixed_rate (fp,48000 ,SNDRV_PCM_RATE_48000 );
Greg Kroah-Hartman
maintainerPATCH 5/183 ASoC: renesas: rz-ssi: Use NOIRQ_SYSTEM_SLEEP_PM_OPS()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
commit c1b0f5183a4488b6b7790f834ce3a786725b3583 upstream.
In the latest kernel versions system crashes were noticed occasionally during suspend/resume. This occurs because the RZ SSI suspend trigger (called from snd_soc_suspend()) is executed after rz_ssi_pm_ops->suspend() and it accesses IP registers. After the rz_ssi_pm_ops->suspend() is executed the IP clocks are disabled and its reset line is asserted.
Since snd_soc_suspend() is invoked through snd_soc_pm_ops->suspend(), snd_soc_pm_ops is associated with soc_driver (defined in sound/soc/soc-core.c), and there is no parent-child relationship between soc_driver and rz_ssi_driver the power management subsystem does not enforce a specific suspend/resume order between the RZ SSI platform driver and soc_driver.
To ensure that the suspend/resume function of rz-ssi is executed after snd_soc_suspend(), use NOIRQ_SYSTEM_SLEEP_PM_OPS().
--- sound/soc/renesas/rz-ssi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/renesas/rz-ssi.c +1 -1
@@ -1244,7 +1244,7 @@ static int rz_ssi_runtime_resume(structstatic const struct dev_pm_ops rz_ssi_pm_ops = { RUNTIME_PM_OPS(rz_ssi_runtime_suspend, rz_ssi_runtime_resume, NULL) -SYSTEM_SLEEP_PM_OPS (pm_runtime_force_suspend, pm_runtime_force_resume) +NOIRQ_SYSTEM_SLEEP_PM_OPS (pm_runtime_force_suspend, pm_runtime_force_resume) };static struct platform_driver rz_ssi_driver = {
Greg Kroah-Hartman
maintainerPATCH 6/183 btrfs: adjust subpage bit start based on sectorsize
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josef Bacik <[email protected]>
commit e08e49d986f82c30f42ad0ed43ebbede1e1e3739 upstream.
When running machines with 64k page size and a 16k nodesize we started seeing tree log corruption in production. This turned out to be because we were not writing out dirty blocks sometimes, so this in fact affects all metadata writes.
When writing out a subpage EB we scan the subpage bitmap for a dirty range. If the range isn't dirty we do
bit_start++;
to move onto the next bit. The problem is the bitmap is based on the number of sectors that an EB has. So in this case, we have a 64k pagesize, 16k nodesize, but a 4k sectorsize. This means our bitmap is 4 bits for every node. With a 64k page size we end up with 4 nodes per page.
To make this easier this is how everything looks
[0 16k 32k 48k ] logical address [0 4 8 12 ] radix tree offset [ 64k page ] folio
[ 16k eb ][ 16k eb ][ 16k eb ][ 16k eb ] extent buffers
[ | | | | | | | | | | | | | | | | ] bitmap
Now we use all of our addressing based on fs_info->sectorsize_bits, so as you can see the above our 16k eb->start turns into radix entry 4.
When we find a dirty range for our eb, we correctly do bit_start += sectors_per_node, because if we start at bit 0, the next bit for the next eb is 4, to correspond to eb->start 16k.
However if our range is clean, we will do bit_start++, which will now put us offset from our radix tree entries.
In our case, assume that the first time we check the bitmap the block is not dirty, we increment bit_start so now it == 1, and then we loop around and check again. This time it is dirty, and we go to find that start using the following equation
start = folio_start + bit_start * fs_info->sectorsize;
so in the case above, eb->start 0 is now dirty, and we calculate start as
0 + 1 * fs_info->sectorsize = 4096 4096 >> 12 = 1
Now we're looking up the radix tree for 1, and we won't find an eb. What's worse is now we're using bit_start == 1, so we do bit_start += sectors_per_node, which is now 5. If that eb is dirty we will run into the same thing, we will look at an offset that is not populated in the radix tree, and now we're skipping the writeout of dirty extent buffers.
The best fix for this is to not use sectorsize_bits to address nodes, but that's a larger change. Since this is a fs corruption problem fix it simply by always using sectors_per_node to increment the start bit.
--- fs/btrfs/extent_io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/extent_io.c +1 -1
@@ -1871,7 +1871,7 @@ static int submit_eb_subpage(struct foli subpage->bitmaps)) {spin_unlock_irqrestore (&subpage->lock, flags);spin_unlock (&folio->mapping->i_private_lock); - bit_start++; + bit_start += sectors_per_node;continue ; }
Greg Kroah-Hartman
maintainerPATCH 7/183 btrfs: fix COW handling in run_delalloc_nocow()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Chen <[email protected]>
commit be3f1938d3e6ea8186f0de3dd95245dda4f22c1e upstream.
In run_delalloc_nocow(), when the found btrfs_key's offset > cur_offset, it indicates a gap between the current processing region and the next file extent. The original code would directly jump to the "must_cow" label, which increments the slot and forces a fallback to COW. This behavior might skip an extent item and result in an overestimated COW fallback range.
This patch modifies the logic so that when a gap is detected:
- If no COW range is already being recorded (cow_start is unset), cow_start is set to cur_offset.
- cur_offset is then advanced to the beginning of the next extent.
- Instead of jumping to "must_cow", control flows directly to "next_slot" so that the same extent item can be reexamined properly.
The change ensures that we accurately account for the extent gap and avoid accidentally extending the range that needs to fallback to COW.
--- fs/btrfs/inode.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
fs/btrfs/inode.c +5 -4
@@ -2083,12 +2083,13 @@ next_slot:/* * If the found extent starts after requested offset, then -* adjust extent_end to be right before this extent begins +* adjust cur_offset to be right before this extent begins. */ if (found_key.offset > cur_offset) { - extent_end = found_key.offset; - extent_type =0 ; - goto must_cow; +if (cow_start == (u64)-1 ) + cow_start = cur_offset; + cur_offset = found_key.offset; + goto next_slot; }/*
Greg Kroah-Hartman
maintainerPATCH 8/183 cpufreq: intel_pstate: Unchecked MSR aceess in legacy mode
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Pandruvada <[email protected]>
commit ac4e04d9e378f5aa826c2406ad7871ae1b6a6fb9 upstream.
When turbo mode is unavailable on a Skylake-X system, executing the command:
# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
results in an unchecked MSR access error:
WRMSR to 0x199 (attempted to write 0x0000000100001300).
This issue was reproduced on an OEM (Original Equipment Manufacturer) system and is not a common problem across all Skylake-X systems.
This error occurs because the MSR 0x199 Turbo Engage Bit (bit 32) is set when turbo mode is disabled. The issue arises when intel_pstate fails to detect that turbo mode is disabled. Here intel_pstate relies on MSR_IA32_MISC_ENABLE bit 38 to determine the status of turbo mode. However, on this system, bit 38 is not set even when turbo mode is disabled.
According to the Intel Software Developer's Manual (SDM), the BIOS sets this bit during platform initialization to enable or disable opportunistic processor performance operations. Logically, this bit should be set in such cases. However, the SDM also specifies that "OS and applications must use CPUID leaf 06H to detect processors with opportunistic processor performance operations enabled."
Therefore, in addition to checking MSR_IA32_MISC_ENABLE bit 38, verify that CPUID.06H:EAX[1] is 0 to accurately determine if turbo mode is disabled.
--- drivers/cpufreq/intel_pstate.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/cpufreq/intel_pstate.c +3 -0
@@ -598,6 +598,9 @@ static bool turbo_is_disabled(void) {u64 misc_en; +if (!cpu_feature_enabled (X86_FEATURE_IDA )) +return true; +rdmsrl (MSR_IA32_MISC_ENABLE , misc_en);return !!(misc_en &MSR_IA32_MISC_ENABLE_TURBO_DISABLE );
Greg Kroah-Hartman
maintainerPATCH 9/183 drm/fdinfo: Protect against driver unbind
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
commit 5b1834d6202f86180e451ad1a2a8a193a1da18fc upstream.
If we unbind a driver from the PCI device with an active DRM client, subsequent read of the fdinfo data associated with the file descriptor in question will not end well.
Protect the path with a drm_dev_enter/exit() pair.
--- drivers/gpu/drm/drm_file.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/drm_file.c +6 -0
@@ -964,6 +964,10 @@ void drm_show_fdinfo(struct seq_file *m,struct drm_file *file = f->private_data;struct drm_device *dev = file->minor->dev;struct drm_printer p =drm_seq_file_printer (m); +int idx; + +if (!drm_dev_enter (dev, &idx)) +return ;drm_printf (&p,"drm-driver:\t%s\n" , dev->driver->name);drm_printf (&p,"drm-client-id:\t%llu\n" , file->client_id);
@@ -983,6 +987,8 @@ void drm_show_fdinfo(struct seq_file *m,if (dev->driver->show_fdinfo) dev->driver->show_fdinfo (&p, file); + +drm_dev_exit (idx); }EXPORT_SYMBOL (drm_show_fdinfo);
Greg Kroah-Hartman
maintainerPATCH 10/183 drm/nouveau: Fix WARN_ON in nouveau_fence_context_kill()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philipp Stanner <[email protected]>
commit bbe5679f30d7690a9b6838a583b9690ea73fe0e9 upstream.
Nouveau is mostly designed in a way that it's expected that fences only ever get signaled through nouveau_fence_signal(). However, in at least one other place, nouveau_fence_done(), can signal fences, too. If that happens (race) a signaled fence remains in the pending list for a while, until it gets removed by nouveau_fence_update().
Should nouveau_fence_context_kill() run in the meantime, this would be a bug because the function would attempt to set an error code on an already signaled fence.
Have nouveau_fence_context_kill() check for a fence being signaled.
--- drivers/gpu/drm/nouveau/nouveau_fence.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nouveau_fence.c +1 -1
@@ -90,7 +90,7 @@ nouveau_fence_context_kill(struct nouveawhile (!list_empty (&fctx->pending)) { fence =list_entry (fctx->pending.next,typeof (*fence), head); -if (error) +if (error && !dma_fence_is_signaled_locked (&fence->base))dma_fence_set_error (&fence->base, error);if (nouveau_fence_signal (fence))
Greg Kroah-Hartman
maintainerPATCH 11/183 EDAC/altera: Test the correct error reg offset
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niravkumar L Rabara <[email protected]>
commit 4fb7b8fceb0beebbe00712c3daf49ade0386076a upstream.
Test correct structure member, ecc_cecnt_offset, before using it.
[ bp: Massage commit message. ]
--- drivers/edac/altera_edac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/edac/altera_edac.c +1 -1
@@ -99,7 +99,7 @@ static irqreturn_t altr_sdram_mc_err_hanif (status & priv->ecc_stat_ce_mask) {regmap_read (drvdata->mc_vbase, priv->ecc_saddr_offset, &err_addr); -if (priv->ecc_uecnt_offset) +if (priv->ecc_cecnt_offset)regmap_read (drvdata->mc_vbase, priv->ecc_cecnt_offset, &err_count); edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, err_count,
Greg Kroah-Hartman
maintainerPATCH 12/183 EDAC/altera: Set DDR and SDMMC interrupt mask before registration
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niravkumar L Rabara <[email protected]>
commit 6dbe3c5418c4368e824bff6ae4889257dd544892 upstream.
Mask DDR and SDMMC in probe function to avoid spurious interrupts before registration. Removed invalid register write to system manager.
--- drivers/edac/altera_edac.c | 7 ++++--- drivers/edac/altera_edac.h | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-)
drivers/edac/altera_edac.c +4 -3
@@ -1005,9 +1005,6 @@ altr_init_a10_ecc_block(struct device_no } } -/* Interrupt mode set to every SBERR */ -regmap_write (ecc_mgr_map,ALTR_A10_ECC_INTMODE_OFST , -ALTR_A10_ECC_INTMODE );/* Enable ECC */ ecc_set_bits (ecc_ctrl_en_mask, (ecc_block_base +ALTR_A10_ECC_CTRL_OFST ));
@@ -2127,6 +2124,10 @@ static int altr_edac_a10_probe(struct plreturn PTR_ERR (edac->ecc_mgr_map); } +/* Set irq mask for DDR SBE to avoid any pending irq before registration */ +regmap_write (edac->ecc_mgr_map,A10_SYSMGR_ECC_INTMASK_SET_OFST , + (A10_SYSMGR_ECC_INTMASK_SDMMCB |A10_SYSMGR_ECC_INTMASK_DDR0 )); + edac->irq_chip.name = pdev->dev.of_node->name; edac->irq_chip.irq_mask = a10_eccmgr_irq_mask; edac->irq_chip.irq_unmask = a10_eccmgr_irq_unmask;
drivers/edac/altera_edac.h +2 -0
@@ -249,6 +249,8 @@ struct altr_sdram_mc_data {#define A10_SYSMGR_ECC_INTMASK_SET_OFST 0x94#define A10_SYSMGR_ECC_INTMASK_CLR_OFST 0x98#define A10_SYSMGR_ECC_INTMASK_OCRAM BIT(1) +#define A10_SYSMGR_ECC_INTMASK_SDMMCB BIT(16) +#define A10_SYSMGR_ECC_INTMASK_DDR0 BIT(17)#define A10_SYSMGR_ECC_INTSTAT_SERR_OFST 0x9C#define A10_SYSMGR_ECC_INTSTAT_DERR_OFST 0xA0
Greg Kroah-Hartman
maintainerPATCH 13/183 i2c: imx-lpi2c: Fix clock count when probe defers
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clark Wang <[email protected]>
commit b1852c5de2f2a37dd4462f7837c9e3e678f9e546 upstream.
Deferred probe with pm_runtime_put() may delay clock disable, causing incorrect clock usage count. Use pm_runtime_put_sync() to ensure the clock is disabled immediately.
--- drivers/i2c/busses/i2c-imx-lpi2c.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-imx-lpi2c.c +2 -2
@@ -1380,9 +1380,9 @@ static int lpi2c_imx_probe(struct platforeturn 0 ; rpm_disable: -pm_runtime_put (&pdev->dev); -pm_runtime_disable (&pdev->dev);pm_runtime_dont_use_autosuspend (&pdev->dev); +pm_runtime_put_sync (&pdev->dev); +pm_runtime_disable (&pdev->dev);return ret; }
Greg Kroah-Hartman
maintainerPATCH 14/183 arm64: errata: Add missing sentinels to Spectre-BHB MIDR arrays
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
commit fee4d171451c1ad9e8aaf65fc0ab7d143a33bd72 upstream.
Commit a5951389e58d ("arm64: errata: Add newer ARM cores to the spectre_bhb_loop_affected() lists") added some additional CPUs to the Spectre-BHB workaround, including some new arrays for designs that require new 'k' values for the workaround to be effective.
Unfortunately, the new arrays omitted the sentinel entry and so is_midr_in_range_list() will walk off the end when it doesn't find a match. With UBSAN enabled, this leads to a crash during boot when is_midr_in_range_list() is inlined (which was more common prior to c8c2647e69be ("arm64: Make _midr_in_range_list() an exported function")):
| Internal error: aarch64 BRK: 00000000f2000001 [#1] PREEMPT SMP | pstate: 804000c5 (Nzcv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--) | pc : spectre_bhb_loop_affected+0x28/0x30 | lr : is_spectre_bhb_affected+0x170/0x190 | [...] | Call trace: | spectre_bhb_loop_affected+0x28/0x30 | update_cpu_capabilities+0xc0/0x184 | init_cpu_features+0x188/0x1a4 | cpuinfo_store_boot_cpu+0x4c/0x60 | smp_prepare_boot_cpu+0x38/0x54 | start_kernel+0x8c/0x478 | __primary_switched+0xc8/0xd4 | Code: 6b09011f 54000061 52801080 d65f03c0 (d4200020) | ---[ end trace 0000000000000000 ]--- | Kernel panic - not syncing: aarch64 BRK: Fatal exception
Add the missing sentinel entries.
--- arch/arm64/kernel/proton-pack.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/kernel/proton-pack.c +2 -0
@@ -879,10 +879,12 @@ static u8 spectre_bhb_loop_affected(voidstatic const struct midr_range spectre_bhb_k132_list[] = {MIDR_ALL_VERSIONS (MIDR_CORTEX_X3 ),MIDR_ALL_VERSIONS (MIDR_NEOVERSE_V2 ), + {}, };static const struct midr_range spectre_bhb_k38_list[] = {MIDR_ALL_VERSIONS (MIDR_CORTEX_A715 ),MIDR_ALL_VERSIONS (MIDR_CORTEX_A720 ), + {}, };static const struct midr_range spectre_bhb_k32_list[] = {MIDR_ALL_VERSIONS (MIDR_CORTEX_A78 ),
Greg Kroah-Hartman
maintainerPATCH 15/183 parisc: Fix double SIGFPE crash
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
commit de3629baf5a33af1919dec7136d643b0662e85ef upstream.
Camm noticed that on parisc a SIGFPE exception will crash an application with a second SIGFPE in the signal handler. Dave analyzed it, and it happens because glibc uses a double-word floating-point store to atomically update function descriptors. As a result of lazy binding, we hit a floating-point store in fpe_func almost immediately.
When the T bit is set, an assist exception trap occurs when when the co-processor encounters *any* floating-point instruction except for a double store of register %fr0. The latter cancels all pending traps. Let's fix this by clearing the Trap (T) bit in the FP status register before returning to the signal handler in userspace.
The issue can be reproduced with this test program:
root@parisc:~# cat fpe.c
static void fpe_func(int sig, siginfo_t *i, void *v) {
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGFPE);
sigprocmask(SIG_UNBLOCK, &set, NULL);
printf("GOT signal %d with si_code %ld\n", sig, i->si_code);
}int main() {
struct sigaction action = {
.sa_sigaction = fpe_func,
.sa_flags = SA_RESTART|SA_SIGINFO };
sigaction(SIGFPE, &action, 0);
feenableexcept(FE_OVERFLOW);
return printf("%lf\n",1.7976931348623158E308*1.7976931348623158E308);
}root@parisc:~# gcc fpe.c -lm root@parisc:~# ./a.out Floating point exception
root@parisc:~# strace -f ./a.out
execve("./a.out", ["./a.out"], 0xf9ac7034 /* 20 vars */) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
...
rt_sigaction(SIGFPE, {sa_handler=0x1110a, sa_mask=[], sa_flags=SA_RESTART|SA_SIGINFO}, NULL, 8) = 0
--- SIGFPE {si_signo=SIGFPE, si_code=FPE_FLTOVF, si_addr=0x1078f} ---
--- SIGFPE {si_signo=SIGFPE, si_code=FPE_FLTOVF, si_addr=0xf8f21237} ---
+++ killed by SIGFPE +++
Floating point exception--- arch/parisc/math-emu/driver.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
arch/parisc/math-emu/driver.c +13 -3
@@ -97,9 +97,19 @@ handle_fpe(struct pt_regs *regs)memcpy (regs->fr, frcopy,sizeof regs->fr);if (signalcode !=0 ) { -force_sig_fault (signalcode >>24 , signalcode &0xffffff , - (void __user *) regs->iaoq[0 ]); -return -1 ; +int sig = signalcode >>24 ; + +if (sig ==SIGFPE ) { +/* +* Clear floating point trap bit to avoid trapping +* again on the first floating-point instruction in +* the userspace signal handler. +*/ + regs->fr[0 ] &= ~(1ULL <<38 ); + } +force_sig_fault (sig, signalcode &0xffffff , + (void __user *) regs->iaoq[0 ]); +return -1 ; }return signalcode ?-1 :0 ;
Greg Kroah-Hartman
maintainerPATCH 16/183 pinctrl: airoha: fix wrong PHY LED mapping and PHY2 LED defines
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Marangi <[email protected]>
commit 457d9772e8a5cdae64f66b5f7d5b0247365191ec upstream.
The current PHY2 LED define are wrong and actually set BITs outside the related mask. Fix it and set the correct value. While at it, also use FIELD_PREP_CONST macro to make it simple to understand what values are actually applied for the mask.
Also fix wrong PHY LED mapping. The SoC Switch supports up to 4 port but the register define mapping for 5 PHY port, starting from 0. The mapping was wrongly defined starting from PHY1. Reorder the function group to start from PHY0. PHY4 is actually never supported as we don't have a GPIO pin to assign.
--- drivers/pinctrl/mediatek/pinctrl-airoha.c | 159 +++++++++++++----------------- 1 file changed, 70 insertions(+), 89 deletions(-)
drivers/pinctrl/mediatek/pinctrl-airoha.c +70 -89
@@ -6,6 +6,7 @@*/ #include <dt-bindings/pinctrl/mt65xx.h> +#include <linux/bitfield.h> #include <linux/bits.h> #include <linux/cleanup.h> #include <linux/gpio/driver.h>
@@ -112,39 +113,19 @@#define REG_LAN_LED1_MAPPING 0x0280#define LAN4_LED_MAPPING_MASK GENMASK(18, 16) -#define LAN4_PHY4_LED_MAP BIT(18) -#define LAN4_PHY2_LED_MAP BIT(17) -#define LAN4_PHY1_LED_MAP BIT(16) -#define LAN4_PHY0_LED_MAP 0 -#define LAN4_PHY3_LED_MAP GENMASK(17, 16) +#define LAN4_PHY_LED_MAP (_n) FIELD_PREP_CONST(LAN4_LED_MAPPING_MASK, (_n))#define LAN3_LED_MAPPING_MASK GENMASK(14, 12) -#define LAN3_PHY4_LED_MAP BIT(14) -#define LAN3_PHY2_LED_MAP BIT(13) -#define LAN3_PHY1_LED_MAP BIT(12) -#define LAN3_PHY0_LED_MAP 0 -#define LAN3_PHY3_LED_MAP GENMASK(13, 12) +#define LAN3_PHY_LED_MAP (_n) FIELD_PREP_CONST(LAN3_LED_MAPPING_MASK, (_n))#define LAN2_LED_MAPPING_MASK GENMASK(10, 8) -#define LAN2_PHY4_LED_MAP BIT(12) -#define LAN2_PHY2_LED_MAP BIT(11) -#define LAN2_PHY1_LED_MAP BIT(10) -#define LAN2_PHY0_LED_MAP 0 -#define LAN2_PHY3_LED_MAP GENMASK(11, 10) +#define LAN2_PHY_LED_MAP (_n) FIELD_PREP_CONST(LAN2_LED_MAPPING_MASK, (_n))#define LAN1_LED_MAPPING_MASK GENMASK(6, 4) -#define LAN1_PHY4_LED_MAP BIT(6) -#define LAN1_PHY2_LED_MAP BIT(5) -#define LAN1_PHY1_LED_MAP BIT(4) -#define LAN1_PHY0_LED_MAP 0 -#define LAN1_PHY3_LED_MAP GENMASK(5, 4) +#define LAN1_PHY_LED_MAP (_n) FIELD_PREP_CONST(LAN1_LED_MAPPING_MASK, (_n))#define LAN0_LED_MAPPING_MASK GENMASK(2, 0) -#define LAN0_PHY4_LED_MAP BIT(3) -#define LAN0_PHY2_LED_MAP BIT(2) -#define LAN0_PHY1_LED_MAP BIT(1) -#define LAN0_PHY0_LED_MAP 0 -#define LAN0_PHY3_LED_MAP GENMASK(2, 1) +#define LAN0_PHY_LED_MAP (_n) FIELD_PREP_CONST(LAN0_LED_MAPPING_MASK, (_n))/* CONF */ #define REG_I2C_SDA_E2 0x001c
@@ -1476,8 +1457,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN1_LED_MAPPING_MASK , -LAN1_PHY1_LED_MAP +LAN0_LED_MAPPING_MASK , +LAN0_PHY_LED_MAP (0 ) }, .regmap_size = 2, }, {
@@ -1491,8 +1472,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN2_LED_MAPPING_MASK , -LAN2_PHY1_LED_MAP +LAN1_LED_MAPPING_MASK , +LAN1_PHY_LED_MAP (0 ) }, .regmap_size = 2, }, {
@@ -1506,8 +1487,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN3_LED_MAPPING_MASK , -LAN3_PHY1_LED_MAP +LAN2_LED_MAPPING_MASK , +LAN2_PHY_LED_MAP (0 ) }, .regmap_size = 2, }, {
@@ -1521,8 +1502,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN4_LED_MAPPING_MASK , -LAN4_PHY1_LED_MAP +LAN3_LED_MAPPING_MASK , +LAN3_PHY_LED_MAP (0 ) }, .regmap_size = 2, },
@@ -1540,8 +1521,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN1_LED_MAPPING_MASK , -LAN1_PHY2_LED_MAP +LAN0_LED_MAPPING_MASK , +LAN0_PHY_LED_MAP (1 ) }, .regmap_size = 2, }, {
@@ -1555,8 +1536,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN2_LED_MAPPING_MASK , -LAN2_PHY2_LED_MAP +LAN1_LED_MAPPING_MASK , +LAN1_PHY_LED_MAP (1 ) }, .regmap_size = 2, }, {
@@ -1570,8 +1551,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN3_LED_MAPPING_MASK , -LAN3_PHY2_LED_MAP +LAN2_LED_MAPPING_MASK , +LAN2_PHY_LED_MAP (1 ) }, .regmap_size = 2, }, {
@@ -1585,8 +1566,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN4_LED_MAPPING_MASK , -LAN4_PHY2_LED_MAP +LAN3_LED_MAPPING_MASK , +LAN3_PHY_LED_MAP (1 ) }, .regmap_size = 2, },
@@ -1604,8 +1585,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN1_LED_MAPPING_MASK , -LAN1_PHY3_LED_MAP +LAN0_LED_MAPPING_MASK , +LAN0_PHY_LED_MAP (2 ) }, .regmap_size = 2, }, {
@@ -1619,8 +1600,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN2_LED_MAPPING_MASK , -LAN2_PHY3_LED_MAP +LAN1_LED_MAPPING_MASK , +LAN1_PHY_LED_MAP (2 ) }, .regmap_size = 2, }, {
@@ -1634,8 +1615,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN3_LED_MAPPING_MASK , -LAN3_PHY3_LED_MAP +LAN2_LED_MAPPING_MASK , +LAN2_PHY_LED_MAP (2 ) }, .regmap_size = 2, }, {
@@ -1649,8 +1630,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN4_LED_MAPPING_MASK , -LAN4_PHY3_LED_MAP +LAN3_LED_MAPPING_MASK , +LAN3_PHY_LED_MAP (2 ) }, .regmap_size = 2, },
@@ -1668,8 +1649,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN1_LED_MAPPING_MASK , -LAN1_PHY4_LED_MAP +LAN0_LED_MAPPING_MASK , +LAN0_PHY_LED_MAP (3 ) }, .regmap_size = 2, }, {
@@ -1683,8 +1664,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN2_LED_MAPPING_MASK , -LAN2_PHY4_LED_MAP +LAN1_LED_MAPPING_MASK , +LAN1_PHY_LED_MAP (3 ) }, .regmap_size = 2, }, {
@@ -1698,8 +1679,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN3_LED_MAPPING_MASK , -LAN3_PHY4_LED_MAP +LAN2_LED_MAPPING_MASK , +LAN2_PHY_LED_MAP (3 ) }, .regmap_size = 2, }, {
@@ -1713,8 +1694,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED0_MAPPING , -LAN4_LED_MAPPING_MASK , -LAN4_PHY4_LED_MAP +LAN3_LED_MAPPING_MASK , +LAN3_PHY_LED_MAP (3 ) }, .regmap_size = 2, },
@@ -1732,8 +1713,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN1_LED_MAPPING_MASK , -LAN1_PHY1_LED_MAP +LAN0_LED_MAPPING_MASK , +LAN0_PHY_LED_MAP (0 ) }, .regmap_size = 2, }, {
@@ -1747,8 +1728,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN2_LED_MAPPING_MASK , -LAN2_PHY1_LED_MAP +LAN1_LED_MAPPING_MASK , +LAN1_PHY_LED_MAP (0 ) }, .regmap_size = 2, }, {
@@ -1762,8 +1743,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN3_LED_MAPPING_MASK , -LAN3_PHY1_LED_MAP +LAN2_LED_MAPPING_MASK , +LAN2_PHY_LED_MAP (0 ) }, .regmap_size = 2, }, {
@@ -1777,8 +1758,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN4_LED_MAPPING_MASK , -LAN4_PHY1_LED_MAP +LAN3_LED_MAPPING_MASK , +LAN3_PHY_LED_MAP (0 ) }, .regmap_size = 2, },
@@ -1796,8 +1777,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN1_LED_MAPPING_MASK , -LAN1_PHY2_LED_MAP +LAN0_LED_MAPPING_MASK , +LAN0_PHY_LED_MAP (1 ) }, .regmap_size = 2, }, {
@@ -1811,8 +1792,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN2_LED_MAPPING_MASK , -LAN2_PHY2_LED_MAP +LAN1_LED_MAPPING_MASK , +LAN1_PHY_LED_MAP (1 ) }, .regmap_size = 2, }, {
@@ -1826,8 +1807,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN3_LED_MAPPING_MASK , -LAN3_PHY2_LED_MAP +LAN2_LED_MAPPING_MASK , +LAN2_PHY_LED_MAP (1 ) }, .regmap_size = 2, }, {
@@ -1841,8 +1822,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN4_LED_MAPPING_MASK , -LAN4_PHY2_LED_MAP +LAN3_LED_MAPPING_MASK , +LAN3_PHY_LED_MAP (1 ) }, .regmap_size = 2, },
@@ -1860,8 +1841,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN1_LED_MAPPING_MASK , -LAN1_PHY3_LED_MAP +LAN0_LED_MAPPING_MASK , +LAN0_PHY_LED_MAP (2 ) }, .regmap_size = 2, }, {
@@ -1875,8 +1856,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN2_LED_MAPPING_MASK , -LAN2_PHY3_LED_MAP +LAN1_LED_MAPPING_MASK , +LAN1_PHY_LED_MAP (2 ) }, .regmap_size = 2, }, {
@@ -1890,8 +1871,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN3_LED_MAPPING_MASK , -LAN3_PHY3_LED_MAP +LAN2_LED_MAPPING_MASK , +LAN2_PHY_LED_MAP (2 ) }, .regmap_size = 2, }, {
@@ -1905,8 +1886,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN4_LED_MAPPING_MASK , -LAN4_PHY3_LED_MAP +LAN3_LED_MAPPING_MASK , +LAN3_PHY_LED_MAP (2 ) }, .regmap_size = 2, },
@@ -1924,8 +1905,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN1_LED_MAPPING_MASK , -LAN1_PHY4_LED_MAP +LAN0_LED_MAPPING_MASK , +LAN0_PHY_LED_MAP (3 ) }, .regmap_size = 2, }, {
@@ -1939,8 +1920,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN2_LED_MAPPING_MASK , -LAN2_PHY4_LED_MAP +LAN1_LED_MAPPING_MASK , +LAN1_PHY_LED_MAP (3 ) }, .regmap_size = 2, }, {
@@ -1954,8 +1935,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN3_LED_MAPPING_MASK , -LAN3_PHY4_LED_MAP +LAN2_LED_MAPPING_MASK , +LAN2_PHY_LED_MAP (3 ) }, .regmap_size = 2, }, {
@@ -1969,8 +1950,8 @@ static const struct airoha_pinctrl_func_ .regmap[1] = {AIROHA_FUNC_MUX ,REG_LAN_LED1_MAPPING , -LAN4_LED_MAPPING_MASK , -LAN4_PHY4_LED_MAP +LAN3_LED_MAPPING_MASK , +LAN3_PHY_LED_MAP (3 ) }, .regmap_size = 2, },
Greg Kroah-Hartman
maintainerPATCH 17/183 perf/x86/intel: Only check the group flag for X86 leader
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kan Liang <[email protected]>
commit 75aea4b0656ead0facd13d2aae4cb77326e53d2f upstream.
A warning in intel_pmu_lbr_counters_reorder() may be triggered by below perf command.
perf record -e "{cpu-clock,cycles/call-graph="lbr"/}" -- sleep 1
It's because the group is mistakenly treated as a branch counter group.
The hw.flags of the leader are used to determine whether a group is a branch counters group. However, the hw.flags is only available for a hardware event. The field to store the flags is a union type. For a software event, it's a hrtimer. The corresponding bit may be set if the leader is a software event.
For a branch counter group and other groups that have a group flag (e.g., topdown, PEBS counters snapshotting, and ACR), the leader must be a X86 event. Check the X86 event before checking the flag. The patch only fixes the issue for the branch counter group. The following patch will fix the other groups.
There may be an alternative way to fix the issue by moving the hw.flags out of the union type. It should work for now. But it's still possible that the flags will be used by other types of events later. As long as that type of event is used as a leader, a similar issue will be triggered. So the alternative way is dropped.
--- arch/x86/events/core.c | 2 +- arch/x86/events/perf_event.h | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-)
arch/x86/events/core.c +1 -1
@@ -753,7 +753,7 @@ void x86_pmu_enable_all(int added) } } -static inline int is_x86_event (struct perf_event *event) +int is_x86_event (struct perf_event *event) {int i;
arch/x86/events/perf_event.h +8 -1
@@ -110,9 +110,16 @@ static inline bool is_topdown_event(strureturn is_metric_event (event) ||is_slots_event (event); } +int is_x86_event (struct perf_event *event); + +static inline bool check_leader_group (struct perf_event *leader,int flags) +{ +return is_x86_event (leader) ? !!(leader->hw.flags & flags) : false; +} +static inline bool is_branch_counters_group (struct perf_event *event) { -return event->group_leader->hw.flags &PERF_X86_EVENT_BRANCH_COUNTERS ; +return check_leader_group (event->group_leader,PERF_X86_EVENT_BRANCH_COUNTERS ); }struct amd_nb {
Greg Kroah-Hartman
maintainerPATCH 18/183 perf/x86/intel: KVM: Mask PEBS_ENABLE loaded for guest with vCPUs value.
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit 58f6217e5d0132a9f14e401e62796916aa055c1b upstream.
When generating the MSR_IA32_PEBS_ENABLE value that will be loaded on VM-Entry to a KVM guest, mask the value with the vCPU's desired PEBS_ENABLE value. Consulting only the host kernel's host vs. guest masks results in running the guest with PEBS enabled even when the guest doesn't want to use PEBS. Because KVM uses perf events to proxy the guest virtual PMU, simply looking at exclude_host can't differentiate between events created by host userspace, and events created by KVM on behalf of the guest.
Running the guest with PEBS unexpectedly enabled typically manifests as crashes due to a near-infinite stream of #PFs. E.g. if the guest hasn't written MSR_IA32_DS_AREA, the CPU will hit page faults on address '0' when trying to record PEBS events.
The issue is most easily reproduced by running perf kvm top from before commit 7b100989b4f6 ("perf evlist: Remove __evlist__add_default") (after
which, perf kvm top effectively stopped using PEBS). The userspace side
of perf creates a guest-only PEBS event, which intel_guest_get_msrs() misconstrues a guest-*owned* PEBS event.
Arguably, this is a userspace bug, as enabling PEBS on guest-only events simply cannot work, and userspace can kill VMs in many other ways (there is no danger to the host). However, even if this is considered to be bad userspace behavior, there's zero downside to perf/KVM restricting PEBS to guest-owned events.
Note, commit 854250329c02 ("KVM: x86/pmu: Disable guest PEBS temporarily in two rare situations") fixed the case where host userspace is profiling KVM *and* userspace, but missed the case where userspace is profiling only KVM.
--- arch/x86/events/intel/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/events/intel/core.c +1 -1
@@ -4341,7 +4341,7 @@ static struct perf_guest_switch_msr *int arr[pebs_enable] = (struct perf_guest_switch_msr ){ .msr =MSR_IA32_PEBS_ENABLE , .host = cpuc->pebs_enabled & ~cpuc->intel_ctrl_guest_mask, - .guest = pebs_mask & ~cpuc->intel_ctrl_host_mask, + .guest = pebs_mask & ~cpuc->intel_ctrl_host_mask & kvm_pmu->pebs_enable, };if (arr[pebs_enable].host) {
Greg Kroah-Hartman
maintainerPATCH 19/183 amd-xgbe: Fix to ensure dependent features are toggled with RX checksum offload
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vishal Badole <[email protected]>
commit f04dd30f1bef1ed2e74a4050af6e5e5e3869bac3 upstream.
According to the XGMAC specification, enabling features such as Layer 3 and Layer 4 Packet Filtering, Split Header and Virtualized Network support automatically selects the IPC Full Checksum Offload Engine on the receive side.
When RX checksum offload is disabled, these dependent features must also be disabled to prevent abnormal behavior caused by mismatched feature dependencies.
Ensure that toggling RX checksum offload (disabling or enabling) properly disables or enables all dependent features, maintaining consistent and expected behavior in the network device.
--- drivers/net/ethernet/amd/xgbe/xgbe-desc.c | 9 +++++++-- drivers/net/ethernet/amd/xgbe/xgbe-dev.c | 24 ++++++++++++++++++++++-- drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 11 +++++++++-- drivers/net/ethernet/amd/xgbe/xgbe.h | 4 ++++ 4 files changed, 42 insertions(+), 6 deletions(-)
drivers/net/ethernet/amd/xgbe/xgbe-desc.c +7 -2
@@ -373,8 +373,13 @@ static int xgbe_map_rx_buffer(struct xgb }/* Set up the header page info */ -xgbe_set_buffer_data (&rdata->rx.hdr, &ring->rx_hdr_pa, -XGBE_SKB_ALLOC_SIZE ); +if (pdata->netdev->features &NETIF_F_RXCSUM ) { +xgbe_set_buffer_data (&rdata->rx.hdr, &ring->rx_hdr_pa, +XGBE_SKB_ALLOC_SIZE ); + }else { +xgbe_set_buffer_data (&rdata->rx.hdr, &ring->rx_hdr_pa, + pdata->rx_buf_size); + }/* Set up the buffer page info */ xgbe_set_buffer_data(&rdata->rx.buf, &ring->rx_buf_pa,
drivers/net/ethernet/amd/xgbe/xgbe-dev.c +22 -2
@@ -320,6 +320,18 @@ static void xgbe_config_sph_mode(structXGMAC_IOWRITE_BITS (pdata,MAC_RCR ,HDSMS ,XGBE_SPH_HDSMS_SIZE ); } +static void xgbe_disable_sph_mode (struct xgbe_prv_data *pdata) +{ +unsigned int i; + +for (i =0 ; i < pdata->channel_count; i++) { +if (!pdata->channel[i]->rx_ring) +break ; + +XGMAC_DMA_IOWRITE_BITS (pdata->channel[i],DMA_CH_CR ,SPH ,0 ); + } +} +static int xgbe_write_rss_reg (struct xgbe_prv_data *pdata,unsigned int type,unsigned int index,unsigned int val) {
@@ -3545,8 +3557,12 @@ static int xgbe_init(struct xgbe_prv_datxgbe_config_tx_coalesce (pdata);xgbe_config_rx_buffer_size (pdata);xgbe_config_tso_mode (pdata); -xgbe_config_sph_mode (pdata); -xgbe_config_rss (pdata); + +if (pdata->netdev->features &NETIF_F_RXCSUM ) { +xgbe_config_sph_mode (pdata); +xgbe_config_rss (pdata); + } + desc_if->wrapper_tx_desc_init (pdata); desc_if->wrapper_rx_desc_init (pdata);xgbe_enable_dma_interrupts (pdata);
@@ -3702,5 +3718,9 @@ void xgbe_init_function_ptrs_dev(struct hw_if->disable_vxlan = xgbe_disable_vxlan; hw_if->set_vxlan_id = xgbe_set_vxlan_id; +/* For Split Header*/ + hw_if->enable_sph = xgbe_config_sph_mode; + hw_if->disable_sph = xgbe_disable_sph_mode; +DBGPR ("<--xgbe_init_function_ptrs\n" ); }
drivers/net/ethernet/amd/xgbe/xgbe-drv.c +9 -2
@@ -2257,10 +2257,17 @@ static int xgbe_set_features(struct net_if (ret)return ret; -if ((features &NETIF_F_RXCSUM ) && !rxcsum) +if ((features &NETIF_F_RXCSUM ) && !rxcsum) { + hw_if->enable_sph (pdata); + hw_if->enable_vxlan (pdata); hw_if->enable_rx_csum (pdata); -else if (!(features &NETIF_F_RXCSUM ) && rxcsum) +schedule_work (&pdata->restart_work); + }else if (!(features &NETIF_F_RXCSUM ) && rxcsum) { + hw_if->disable_sph (pdata); + hw_if->disable_vxlan (pdata); hw_if->disable_rx_csum (pdata); +schedule_work (&pdata->restart_work); + }if ((features &NETIF_F_HW_VLAN_CTAG_RX ) && !rxvlan) hw_if->enable_rx_vlan_stripping (pdata);
drivers/net/ethernet/amd/xgbe/xgbe.h +4 -0
@@ -865,6 +865,10 @@ struct xgbe_hw_if {void (*enable_vxlan)(struct xgbe_prv_data *);void (*disable_vxlan)(struct xgbe_prv_data *);void (*set_vxlan_id)(struct xgbe_prv_data *); + +/* For Split Header */ +void (*enable_sph)(struct xgbe_prv_data *pdata); +void (*disable_sph)(struct xgbe_prv_data *pdata); };/* This structure represents implementation specific routines for an
Greg Kroah-Hartman
maintainerPATCH 20/183 irqchip/qcom-mpm: Prevent crash when trying to handle non-wake GPIOs
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephan Gerhold <[email protected]>
commit 38a05c0b87833f5b188ae43b428b1f792df2b384 upstream.
On Qualcomm chipsets not all GPIOs are wakeup capable. Those GPIOs do not have a corresponding MPM pin and should not be handled inside the MPM driver. The IRQ domain hierarchy is always applied, so it's required to explicitly disconnect the hierarchy for those. The pinctrl-msm driver marks these with GPIO_NO_WAKE_IRQ. qcom-pdc has a check for this, but irq-qcom-mpm is currently missing the check. This is causing crashes when setting up interrupts for non-wake GPIOs:
root@rb1:~# gpiomon -c gpiochip1 10
irq: IRQ159: trimming hierarchy from :soc@0:interrupt-controller@f200000-1
Unable to handle kernel paging request at virtual address ffff8000a1dc3820
Hardware name: Qualcomm Technologies, Inc. Robotics RB1 (DT)
pc : mpm_set_type+0x80/0xcc
lr : mpm_set_type+0x5c/0xcc
Call trace:
mpm_set_type+0x80/0xcc (P)
qcom_mpm_set_type+0x64/0x158
irq_chip_set_type_parent+0x20/0x38
msm_gpio_irq_set_type+0x50/0x530
__irq_set_trigger+0x60/0x184
__setup_irq+0x304/0x6bc
request_threaded_irq+0xc8/0x19c
edge_detector_setup+0x260/0x364
linereq_create+0x420/0x5a8
gpio_ioctl+0x2d4/0x6c0Fix this by copying the check for GPIO_NO_WAKE_IRQ from qcom-pdc.c, so that MPM is removed entirely from the hierarchy for non-wake GPIOs.
--- drivers/irqchip/irq-qcom-mpm.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/irqchip/irq-qcom-mpm.c +3 -0
@@ -227,6 +227,9 @@ static int qcom_mpm_alloc(struct irq_domif (ret)return ret; +if (pin ==GPIO_NO_WAKE_IRQ ) +return irq_domain_disconnect_hierarchy (domain, virq); + ret =irq_domain_set_hwirq_and_chip (domain, virq, pin, &qcom_mpm_chip, priv);if (ret)
Greg Kroah-Hartman
maintainerPATCH 21/183 mm/memblock: pass size instead of end to memblock_set_node()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yang <[email protected]>
commit 06eaa824fd239edd1eab2754f29b2d03da313003 upstream.
The second parameter of memblock_set_node() is size instead of end.
Since it iterates from lower address to higher address, finally the node id is correct. But during the process, some of them are wrong.
Pass size instead of end.
--- mm/memblock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/memblock.c +1 -1
@@ -2193,7 +2193,7 @@ static void __init memmap_init_reserved_if (memblock_is_nomap (region))reserve_bootmem_region (start, end, nid); -memblock_set_node (start, end, &memblock.reserved, nid); +memblock_set_node (start, region->size, &memblock.reserved, nid); }/*
Greg Kroah-Hartman
maintainerPATCH 22/183 mm/memblock: repeat setting reserved region nid if array is doubled
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yang <[email protected]>
commit eac8ea8736ccc09513152d970eb2a42ed78e87e8 upstream.
Commit 61167ad5fecd ("mm: pass nid to reserve_bootmem_region()") introduce a way to set nid to all reserved region.
But there is a corner case it will leave some region with invalid nid. When memblock_set_node() doubles the array of memblock.reserved, it may lead to a new reserved region before current position. The new region will be left with an invalid node id.
Repeat the process when detecting it.
--- mm/memblock.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
mm/memblock.c +10 -0
@@ -2180,11 +2180,14 @@ static void __init memmap_init_reserved_struct memblock_region *region;phys_addr_t start, end;int nid; +unsigned long max_reserved;/* * set nid on all reserved pages and also treat struct * pages for the NOMAP regions as PageReserved */ +repeat: + max_reserved = memblock.reserved.max;for_each_mem_region (region) { nid =memblock_get_region_node (region); start = region->base;
@@ -2195,6 +2198,13 @@ static void __init memmap_init_reserved_memblock_set_node (start, region->size, &memblock.reserved, nid); } +/* +* 'max' is changed means memblock.reserved has been doubled its +* array, which may result a new reserved region before current +* 'start'. Now we should repeat the procedure to set its node id. +*/ +if (max_reserved != memblock.reserved.max) + goto repeat;/* * initialize struct pages for reserved regions that don't have
Greg Kroah-Hartman
maintainerPATCH 23/183 mmc: renesas_sdhi: Fix error handling in renesas_sdhi_probe
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ruslan Piasetskyi <[email protected]>
commit 649b50a82f09fa44c2f7a65618e4584072145ab7 upstream.
After moving tmio_mmc_host_probe down, error handling has to be adjusted.
--- drivers/mmc/host/renesas_sdhi_core.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/mmc/host/renesas_sdhi_core.c +4 -6
@@ -1112,26 +1112,26 @@ int renesas_sdhi_probe(struct platform_d num_irqs =platform_irq_count (pdev);if (num_irqs <0 ) { ret = num_irqs; - goto eirq; + goto edisclk; }/* There must be at least one IRQ source */ if (!num_irqs) { ret = -ENXIO ; - goto eirq; + goto edisclk; }for (i =0 ; i < num_irqs; i++) { irq =platform_get_irq (pdev, i);if (irq <0 ) { ret = irq; - goto eirq; + goto edisclk; } ret =devm_request_irq (&pdev->dev, irq, tmio_mmc_irq,0 ,dev_name (&pdev->dev), host);if (ret) - goto eirq; + goto edisclk; } ret =tmio_mmc_host_probe (host);
@@ -1143,8 +1143,6 @@ int renesas_sdhi_probe(struct platform_dreturn ret; -eirq: -tmio_mmc_host_remove (host); edisclk:renesas_sdhi_clk_disable (host); efree:
Greg Kroah-Hartman
maintainerPATCH 24/183 spi: tegra114: Dont fail set_cs_timing when delays are zero
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaron Kling <[email protected]>
commit 4426e6b4ecf632bb75d973051e1179b8bfac2320 upstream.
The original code would skip null delay pointers, but when the pointers were converted to point within the spi_device struct, the check was not updated to skip delays of zero. Hence all spi devices that didn't set delays would fail to probe.
--- drivers/spi/spi-tegra114.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/spi/spi-tegra114.c +3 -3
@@ -728,9 +728,9 @@ static int tegra_spi_set_hw_cs_timing(stu32 inactive_cycles;u8 cs_state; -if (setup->unit !=SPI_DELAY_UNIT_SCK || - hold->unit !=SPI_DELAY_UNIT_SCK || - inactive->unit !=SPI_DELAY_UNIT_SCK ) { +if ((setup->unit && setup->unit !=SPI_DELAY_UNIT_SCK ) || + (hold->unit && hold->unit !=SPI_DELAY_UNIT_SCK ) || + (inactive->unit && inactive->unit !=SPI_DELAY_UNIT_SCK )) {dev_err (&spi->dev,"Invalid delay unit %d, should be SPI_DELAY_UNIT_SCK\n" ,SPI_DELAY_UNIT_SCK );
Greg Kroah-Hartman
maintainerPATCH 25/183 tracing: Do not take trace_event_sem in print_event_fields()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit 0a8f11f8569e7ed16cbcedeb28c4350f6378fea6 upstream.
On some paths in print_event_fields() it takes the trace_event_sem for read, even though it should always be held when the function is called.
Remove the taking of that mutex and add a lockdep_assert_held_read() to make sure the trace_event_sem is held when print_event_fields() is called.
--- kernel/trace/trace_output.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/trace/trace_output.c +2 -2
@@ -961,11 +961,12 @@ enum print_line_t print_event_fields(strstruct trace_event_call *call;struct list_head *head; +lockdep_assert_held_read (&trace_event_sem); +/* ftrace defined events have separate call structures */ if (event->type <= __TRACE_LAST_TYPE) {bool found = false; -down_read (&trace_event_sem);list_for_each_entry (call, &ftrace_events, list) {if (call->event.type == event->type) { found = true;
@@ -975,7 +976,6 @@ enum print_line_t print_event_fields(strif (call->event.type > __TRACE_LAST_TYPE)break ; } -up_read (&trace_event_sem);if (!found) {trace_seq_printf (&iter->seq,"UNKNOWN TYPE %d\n" , event->type); goto out;
Greg Kroah-Hartman
maintainerPATCH 26/183 wifi: brcm80211: fmac: Add error handling for brcmf_usb_dl_writeimage()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wentao Liang <[email protected]>
commit 8e089e7b585d95122c8122d732d1d5ef8f879396 upstream.
The function brcmf_usb_dl_writeimage() calls the function brcmf_usb_dl_cmd() but dose not check its return value. The 'state.state' and the 'state.bytes' are uninitialized if the function brcmf_usb_dl_cmd() fails. It is dangerous to use uninitialized variables in the conditions.
Add error handling for brcmf_usb_dl_cmd() to jump to error handling path if the brcmf_usb_dl_cmd() fails and the 'state.state' and the 'state.bytes' are uninitialized.
Improve the error message to report more detailed error information.
--- drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +4 -2
@@ -896,14 +896,16 @@ brcmf_usb_dl_writeimage(struct brcmf_usb }/* 1) Prepare USB boot loader for runtime image */ -brcmf_usb_dl_cmd (devinfo,DL_START , &state,sizeof (state)); + err =brcmf_usb_dl_cmd (devinfo,DL_START , &state,sizeof (state)); +if (err) + goto fail; rdlstate =le32_to_cpu (state.state); rdlbytes =le32_to_cpu (state.bytes);/* 2) Check we are in the Waiting state */ if (rdlstate !=DL_WAITING ) { -brcmf_err ("Failed to DL_START\n" ); +brcmf_err ("Invalid DL state: %u\n" , rdlstate); err = -EINVAL ; goto fail; }
Greg Kroah-Hartman
maintainerPATCH 27/183 x86/boot/sev: Support memory acceptance in the EFI stub under SVSM
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit 8ed12ab1319b2d8e4a529504777aacacf71371e4 upstream.
Commit:
d54d610243a4 ("x86/boot/sev: Avoid shared GHCB page for early memory acceptance")
provided a fix for SEV-SNP memory acceptance from the EFI stub when running at VMPL #0. However, that fix was insufficient for SVSM SEV-SNP guests running at VMPL >0, as those rely on a SVSM calling area, which is a shared buffer whose address is programmed into a SEV-SNP MSR, and the SEV init code that sets up this calling area executes much later during the boot.
Given that booting via the EFI stub at VMPL >0 implies that the firmware has configured this calling area already, reuse it for performing memory acceptance in the EFI stub.
--- arch/x86/boot/compressed/mem.c | 5 +---- arch/x86/boot/compressed/sev.c | 40 ++++++++++++++++++++++++++++++++++++++++ arch/x86/boot/compressed/sev.h | 2 ++ 3 files changed, 43 insertions(+), 4 deletions(-)
arch/x86/boot/compressed/mem.c +1 -4
@@ -34,14 +34,11 @@ static bool early_is_tdx_guest(void)void arch_accept_memory (phys_addr_t start,phys_addr_t end) { -static bool sevsnp; -/* Platform-specific memory-acceptance call goes here */ if (early_is_tdx_guest ()) {if (!tdx_accept_memory (start, end))panic ("TDX: Failed to accept memory\n" ); - }else if (sevsnp || (sev_get_status () &MSR_AMD64_SEV_SNP_ENABLED )) { - sevsnp = true; + }else if (early_is_sevsnp_guest ()) {snp_accept_memory (start, end); }else {error ("Cannot accept memory: unknown platform\n" );
arch/x86/boot/compressed/sev.c +40 -0
@@ -645,3 +645,43 @@ void sev_prep_identity_maps(unsigned lonsev_verify_cbit (top_level_pgt); } + +bool early_is_sevsnp_guest (void ) +{ +static bool sevsnp; + +if (sevsnp) +return true; + +if (!(sev_get_status () &MSR_AMD64_SEV_SNP_ENABLED )) +return false; + + sevsnp = true; + +if (!snp_vmpl) { +unsigned int eax, ebx, ecx, edx; + +/* +* CPUID Fn8000_001F_EAX[28] - SVSM support +*/ + eax =0x8000001f ; + ecx =0 ; +native_cpuid (&eax, &ebx, &ecx, &edx); +if (eax &BIT (28 )) { +struct msr m; + +/* Obtain the address of the calling area to use */ +boot_rdmsr (MSR_SVSM_CAA , &m); + boot_svsm_caa = (void *)m.q; + boot_svsm_caa_pa = m.q; + +/* +* The real VMPL level cannot be discovered, but the +* memory acceptance routines make no use of that so +* any non-zero value suffices here. +*/ + snp_vmpl =U8_MAX ; + } + } +return true; +}
arch/x86/boot/compressed/sev.h +2 -0
@@ -13,12 +13,14 @@bool sev_snp_enabled (void );void snp_accept_memory (phys_addr_t start,phys_addr_t end);u64 sev_get_status (void ); +bool early_is_sevsnp_guest (void );#else static inline bool sev_snp_enabled (void ) {return false; }static inline void snp_accept_memory (phys_addr_t start,phys_addr_t end) { }static inline u64 sev_get_status (void ) {return 0 ; } +static inline bool early_is_sevsnp_guest (void ) {return false; }#endif
Greg Kroah-Hartman
maintainerPATCH 28/183 dm-bufio: dont schedule in atomic context
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: LongPing Wei <[email protected]>
commit a3d8f0a7f5e8b193db509c7191fefeed3533fc44 upstream.
A BUG was reported as below when CONFIG_DEBUG_ATOMIC_SLEEP and try_verify_in_tasklet are enabled.
[ 129.444685][ T934] BUG: sleeping function called from invalid context at drivers/md/dm-bufio.c:2421 [ 129.444723][ T934] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 934, name: kworker/1:4 [ 129.444740][ T934] preempt_count: 201, expected: 0 [ 129.444756][ T934] RCU nest depth: 0, expected: 0 [ 129.444781][ T934] Preemption disabled at: [ 129.444789][ T934] [<ffffffd816231900>] shrink_work+0x21c/0x248 [ 129.445167][ T934] kernel BUG at kernel/sched/walt/walt_debug.c:16! [ 129.445183][ T934] Internal error: Oops - BUG: 00000000f2000800 [#1] PREEMPT SMP [ 129.445204][ T934] Skip md ftrace buffer dump for: 0x1609e0 [ 129.447348][ T934] CPU: 1 PID: 934 Comm: kworker/1:4 Tainted: G W OE 6.6.56-android15-8-o-g6f82312b30b9-debug #1 1400000003000000474e5500b3187743670464e8 [ 129.447362][ T934] Hardware name: Qualcomm Technologies, Inc. Parrot QRD, Alpha-M (DT) [ 129.447373][ T934] Workqueue: dm_bufio_cache shrink_work [ 129.447394][ T934] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 129.447406][ T934] pc : android_rvh_schedule_bug+0x0/0x8 [sched_walt_debug] [ 129.447435][ T934] lr : __traceiter_android_rvh_schedule_bug+0x44/0x6c [ 129.447451][ T934] sp : ffffffc0843dbc90 [ 129.447459][ T934] x29: ffffffc0843dbc90 x28: ffffffffffffffff x27: 0000000000000c8b [ 129.447479][ T934] x26: 0000000000000040 x25: ffffff804b3d6260 x24: ffffffd816232b68 [ 129.447497][ T934] x23: ffffff805171c5b4 x22: 0000000000000000 x21: ffffffd816231900 [ 129.447517][ T934] x20: ffffff80306ba898 x19: 0000000000000000 x18: ffffffc084159030 [ 129.447535][ T934] x17: 00000000d2b5dd1f x16: 00000000d2b5dd1f x15: ffffffd816720358 [ 129.447554][ T934] x14: 0000000000000004 x13: ffffff89ef978000 x12: 0000000000000003 [ 129.447572][ T934] x11: ffffffd817a823c4 x10: 0000000000000202 x9 : 7e779c5735de9400 [ 129.447591][ T934] x8 : ffffffd81560d004 x7 : 205b5d3938373434 x6 : ffffffd8167397c8 [ 129.447610][ T934] x5 : 0000000000000000 x4 : 0000000000000001 x3 : ffffffc0843db9e0 [ 129.447629][ T934] x2 : 0000000000002f15 x1 : 0000000000000000 x0 : 0000000000000000 [ 129.447647][ T934] Call trace: [ 129.447655][ T934] android_rvh_schedule_bug+0x0/0x8 [sched_walt_debug 1400000003000000474e550080cce8a8a78606b6] [ 129.447681][ T934] __might_resched+0x190/0x1a8 [ 129.447694][ T934] shrink_work+0x180/0x248 [ 129.447706][ T934] process_one_work+0x260/0x624 [ 129.447718][ T934] worker_thread+0x28c/0x454 [ 129.447729][ T934] kthread+0x118/0x158 [ 129.447742][ T934] ret_from_fork+0x10/0x20 [ 129.447761][ T934] Code: ???????? ???????? ???????? d2b5dd1f (d4210000) [ 129.447772][ T934] ---[ end trace 0000000000000000 ]---
dm_bufio_lock will call spin_lock_bh when try_verify_in_tasklet is enabled, and __scan will be called in atomic context.
--- drivers/md/dm-bufio.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/md/dm-bufio.c +8 -1
@@ -68,6 +68,8 @@#define LIST_DIRTY 1#define LIST_SIZE 2 +#define SCAN_RESCHED_CYCLE 16 +/*--------------------------------------------------------------*/ /*
@@ -2426,7 +2428,12 @@ static void __scan(struct dm_bufio_clienatomic_long_dec (&c->need_shrink); freed++; -cond_resched (); + +if (unlikely (freed %SCAN_RESCHED_CYCLE ==0 )) { +dm_bufio_unlock (c); +cond_resched (); +dm_bufio_lock (c); + } } } }
Greg Kroah-Hartman
maintainerPATCH 29/183 dm-integrity: fix a warning on invalid table line
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 0a533c3e4246c29d502a7e0fba0e86d80a906b04 upstream.
If we use the 'B' mode and we have an invalit table line, cancel_delayed_work_sync would trigger a warning. This commit avoids the warning.
--- drivers/md/dm-integrity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/dm-integrity.c +1 -1
@@ -5176,7 +5176,7 @@ static void dm_integrity_dtr(struct dm_tBUG_ON (!RB_EMPTY_ROOT (&ic->in_progress));BUG_ON (!list_empty (&ic->wait_list)); -if (ic->mode =='B' ) +if (ic->mode =='B' && ic->bitmap_flush_work.work.func)cancel_delayed_work_sync (&ic->bitmap_flush_work);if (ic->metadata_wq)destroy_workqueue (ic->metadata_wq);
Greg Kroah-Hartman
maintainerPATCH 30/183 dm: always update the array size in realloc_argv on success
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Marzinski <[email protected]>
commit 5a2a6c428190f945c5cbf5791f72dbea83e97f66 upstream.
realloc_argv() was only updating the array size if it was called with old_argv already allocated. The first time it was called to create an argv array, it would allocate the array but return the array size as zero. dm_split_args() would think that it couldn't store any arguments in the array and would call realloc_argv() again, causing it to reallocate the initial slots (this time using GPF_KERNEL) and finally return a size. Aside from being wasteful, this could cause deadlocks on targets that need to process messages without starting new IO. Instead, realloc_argv should always update the allocated array size on success.
--- drivers/md/dm-table.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/md/dm-table.c +3 -2
@@ -523,9 +523,10 @@ static char **realloc_argv(unsigned int gfp =GFP_NOIO ; } argv =kmalloc_array (new_size,sizeof (*argv), gfp); -if (argv && old_argv) { -memcpy (argv, old_argv, *size *sizeof (*argv)); +if (argv) { *size = new_size; +if (old_argv) +memcpy (argv, old_argv, *size *sizeof (*argv)); }kfree (old_argv);
Re: [PATCH 6.14 030/183] dm: always update the array size in realloc_argv on success
Hi
I'd like to ask you to also backport f1aff4bc199cb92c055668caed65505e3b4d2656 ("dm: fix copying after src array boundaries") to all stable branches because it fixes a bug introduced in the commit 5a2a6c428190f945c5cbf5791f72dbea83e97f66.
Mikulas
Quoted 44 lines · Greg Kroah-Hartman
6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Marzinski <[email protected]>
commit
5a2a6c428190f945c5cbf5791f72dbea83e97f66upstream.
realloc_argv()was only updating the array size if it was called withold_argvalready allocated. The first time it was called to create an argv array, it would allocate the array but return the array size as zero.dm_split_args()would think that it couldn't store any arguments in the array and would callrealloc_argv()again, causing it to reallocate the initial slots (this time usingGPF_KERNEL) and finally return a size. Aside from being wasteful, this could cause deadlocks on targets that need to process messages without starting new IO. Instead,realloc_argvshould always update the allocated array size on success.Fixes a0651926553c ("dm table: don't copy from a NULL pointer in realloc_argv()")Signed-off-by Benjamin Marzinski <[email protected]>Signed-off-by Mikulas Patocka <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/md/dm-table.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)drivers/md/dm-table.c +3
-2@@ -523,9 +523,10 @@ static char **realloc_argv(unsigned int gfp =GFP_NOIO ; } argv =kmalloc_array (new_size,sizeof (*argv), gfp); -if (argv && old_argv) { -memcpy (argv, old_argv, *size *sizeof (*argv)); +if (argv) { *size = new_size; +if (old_argv) +memcpy (argv, old_argv, *size *sizeof (*argv)); }kfree (old_argv);
Greg Kroah-Hartman
maintainerRe: [PATCH 6.14 030/183] dm: always update the array size in realloc_argv on success
Quoted 6 lines · Mikulas Patocka
Hi
I'd like to ask you to also backport
f1aff4bc199cb92c055668caed65505e3b4d2656("dm: fix copying after src array boundaries") to all stable branches because it fixes a bug introduced in the commit5a2a6c428190f945c5cbf5791f72dbea83e97f66.
Now added. Sorry we had not caught that, but as it's not in a -rc release yet, our tools don't know to look for it.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 31/183 drm/amdgpu: Fix offset for HDP remap in nbio v7.11
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lijo Lazar <[email protected]>
commit 79af0604eb80ca1f86a1f265a0b1f9d4fccbc18f upstream.
APUs in passthrough mode use HDP flush. 0x7F000 offset used for remapping HDP flush is mapped to VPE space which could get power gated. Use another unused offset in BIF space.
--- drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c +1 -1
@@ -361,7 +361,7 @@ static void nbio_v7_11_get_clockgating_s *flags |=AMD_CG_SUPPORT_BIF_LS ; } -#define MMIO_REG_HOLE_OFFSET (0x80000 - PAGE_SIZE) +#define MMIO_REG_HOLE_OFFSET 0x44000static void nbio_v7_11_set_reg_remap (struct amdgpu_device *adev) {
Greg Kroah-Hartman
maintainerPATCH 32/183 drm: Select DRM_KMS_HELPER from DRM_DEBUG_DP_MST_TOPOLOGY_REFS
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Janne Grunau <[email protected]>
commit 32dce6b1949a696dc7abddc04de8cbe35c260217 upstream.
Using "depends on" and "select" for the same Kconfig symbol is known to cause circular dependencies (cmp. "Kconfig recursive dependency limitations" in Documentation/kbuild/kconfig-language.rst. DRM drivers are selecting drm helpers so do the same for DRM_DEBUG_DP_MST_TOPOLOGY_REFS.
Fixes following circular dependency reported on x86 for the downstream Asahi Linux tree:
error: recursive dependency detected!
symbol DRM_KMS_HELPER is selected by DRM_GEM_SHMEM_HELPER
symbol DRM_GEM_SHMEM_HELPER is selected by RUST_DRM_GEM_SHMEM_HELPER symbol RUST_DRM_GEM_SHMEM_HELPER is selected by DRM_ASAHI
symbol DRM_ASAHI depends on RUST
symbol RUST depends on CALL_PADDING
symbol CALL_PADDING depends on OBJTOOL
symbol OBJTOOL is selected by STACK_VALIDATION
symbol STACK_VALIDATION depends on UNWINDER_FRAME_POINTER
symbol UNWINDER_FRAME_POINTER is part of choice block at arch/x86/Kconfig.debug:224 symbol <choice> unknown is visible depending on UNWINDER_GUESS
symbol UNWINDER_GUESS prompt is visible depending on STACKDEPOT symbol STACKDEPOT is selected by DRM_DEBUG_DP_MST_TOPOLOGY_REFS symbol DRM_DEBUG_DP_MST_TOPOLOGY_REFS depends on DRM_KMS_HELPER
--- drivers/gpu/drm/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/Kconfig +1 -1
@@ -188,7 +188,7 @@ config DRM_DEBUG_DP_MST_TOPOLOGY_REFS bool "Enable refcount backtrace history in the DP MST helpers" depends on STACKTRACE_SUPPORT select STACKDEPOT - depends on DRM_KMS_HELPER + select DRM_KMS_HELPER depends on DEBUG_KERNEL depends on EXPERT help
Greg Kroah-Hartman
maintainerPATCH 33/183 iommu/amd: Fix potential buffer overflow in parse_ivrs_acpihid
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pavel Paklov <[email protected]>
commit 8dee308e4c01dea48fc104d37f92d5b58c50b96c upstream.
There is a string parsing logic error which can lead to an overflow of hid or uid buffers. Comparing ACPIID_LEN against a total string length doesn't take into account the lengths of individual hid and uid buffers so the check is insufficient in some cases. For example if the length of hid string is 4 and the length of the uid string is 260, the length of str will be equal to ACPIID_LEN + 1 but uid string will overflow uid buffer which size is 256.
The same applies to the hid string with length 13 and uid string with length 250.
Check the length of hid and uid strings separately to prevent buffer overflow.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/iommu/amd/init.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/iommu/amd/init.c +8 -0
@@ -3677,6 +3677,14 @@ found:while (*uid =='0' && *(uid +1 )) uid++; +if (strlen (hid) >=ACPIHID_HID_LEN ) { +pr_err ("Invalid command line: hid is too long\n" ); +return 1 ; + }else if (strlen (uid) >=ACPIHID_UID_LEN ) { +pr_err ("Invalid command line: uid is too long\n" ); +return 1 ; + } + i = early_acpihid_map_size++;memcpy (early_acpihid_map[i].hid, hid,strlen (hid));memcpy (early_acpihid_map[i].uid, uid,strlen (uid));
Greg Kroah-Hartman
maintainerPATCH 34/183 iommu/arm-smmu-v3: Fix iommu_device_probe bug due to duplicated stream ids
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolin Chen <[email protected]>
commit b00d24997a11c10d3e420614f0873b83ce358a34 upstream.
ASPEED VGA card has two built-in devices:
0008:06:00.0 PCI bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge (rev 06) 0008:07:00.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 52)
Its toplogy looks like this:
+-[0008:00]---00.0-[01-09]--+-00.0-[02-09]--+-00.0-[03]----00.0 Sandisk Corp Device 5017
| +-01.0-[04]--
| +-02.0-[05]----00.0 NVIDIA Corporation Device
| +-03.0-[06-07]----00.0-[07]----00.0 ASPEED Technology, Inc. ASPEED Graphics Family
| +-04.0-[08]----00.0 Renesas Technology Corp. uPD720201 USB 3.0 Host Controller
| \-05.0-[09]----00.0 Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
\-00.1 PMC-Sierra Inc. Device 4028The IORT logic populaties two identical IDs into the fwspec->ids array via DMA aliasing in iort_pci_iommu_init() called by pci_for_each_dma_alias().
Though the SMMU driver had been able to handle this situation since commit 563b5cbe334e ("iommu/arm-smmu-v3: Cope with duplicated Stream IDs"), that got broken by the later commit cdf315f907d4 ("iommu/arm-smmu-v3: Maintain a SID->device structure"), which ended up with allocating separate streams with the same stuffing.
On a kernel prior to v6.15-rc1, there has been an overlooked warning:
pci 0008:07:00.0: vgaarb: setting as boot VGA device
pci 0008:07:00.0: vgaarb: bridge control possible
pci 0008:07:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none pcieport 0008:06:00.0: Adding to iommu group 14
ast 0008:07:00.0: stream 67328 already in tree <===== WARNING
ast 0008:07:00.0: enabling device (0002 -> 0003)
ast 0008:07:00.0: Using default configuration
ast 0008:07:00.0: AST 2600 detected
ast 0008:07:00.0: [drm] Using analog VGA
ast 0008:07:00.0: [drm] dram MCLK=396 Mhz type=1 bus_width=16 [drm] Initialized ast 0.1.0 for 0008:07:00.0 on minor 0
ast 0008:07:00.0: [drm] fb0: astdrmfb frame buffer device
With v6.15-rc, since the commit bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path"), the error returned with the warning is moved to the SMMU device probe flow:
arm_smmu_probe_device+0x15c/0x4c0 __iommu_probe_device+0x150/0x4f8 probe_iommu_group+0x44/0x80 bus_for_each_dev+0x7c/0x100 bus_iommu_probe+0x48/0x1a8 iommu_device_register+0xb8/0x178 arm_smmu_device_probe+0x1350/0x1db0
which then fails the entire SMMU driver probe:
pci 0008:06:00.0: Adding to iommu group 21
pci 0008:07:00.0: stream 67328 already in tree
arm-smmu-v3 arm-smmu-v3.9.auto: Failed to register iommu
arm-smmu-v3 arm-smmu-v3.9.auto: probe with driver arm-smmu-v3 failed with error -22
Since SMMU driver had been already expecting a potential duplicated Stream ID in arm_smmu_install_ste_for_dev(), change the arm_smmu_insert_master() routine to ignore a duplicated ID from the fwspec->sids array as well.
Note: this has been failing the iommu_device_probe() since 2021, although a recent iommu commit in v6.15-rc1 that moves iommu_device_probe() started to fail the SMMU driver probe. Since nobody has cared about DMA Alias support, leave that as it was but fix the fundamental iommu_device_probe() breakage.
--- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +15 -4
@@ -3364,6 +3364,7 @@ static int arm_smmu_insert_master(structmutex_lock (&smmu->streams_mutex);for (i =0 ; i < fwspec->num_ids; i++) {struct arm_smmu_stream *new_stream = &master->streams[i]; +struct rb_node *existing;u32 sid = fwspec->ids[i]; new_stream->id = sid;
@@ -3374,10 +3375,20 @@ static int arm_smmu_insert_master(structbreak ;/* Insert into SID tree */ -if (rb_find_add (&new_stream->node, &smmu->streams, - arm_smmu_streams_cmp_node)) { -dev_warn (master->dev,"stream %u already in tree\n" , - sid); + existing =rb_find_add (&new_stream->node, &smmu->streams, + arm_smmu_streams_cmp_node); +if (existing) { +struct arm_smmu_master *existing_master = + rb_entry(existing, struct arm_smmu_stream, node) + ->master; + +/* Bridged PCI devices may end up with duplicated IDs */ +if (existing_master == master) +continue ; + +dev_warn (master->dev, +"stream %u already in tree from dev %s\n" , sid, +dev_name (existing_master->dev)); ret = -EINVAL ;break ; }
Greg Kroah-Hartman
maintainerPATCH 35/183 iommu/arm-smmu-v3: Fix pgsize_bit for sva domains
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Balbir Singh <[email protected]>
commit 12f78021973ae422564b234136c702a305932d73 upstream.
UBSan caught a bug with IOMMU SVA domains, where the reported exponent value in __arm_smmu_tlb_inv_range() was >= 64. __arm_smmu_tlb_inv_range() uses the domain's pgsize_bitmap to compute the number of pages to invalidate and the invalidation range. Currently arm_smmu_sva_domain_alloc() does not setup the iommu domain's pgsize_bitmap. This leads to __ffs() on the value returning 64 and that leads to undefined behaviour w.r.t. shift operations
Fix this by initializing the iommu_domain's pgsize_bitmap to PAGE_SIZE. Effectively the code needs to use the smallest page size for invalidation
--- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +6 -0
@@ -411,6 +411,12 @@ struct iommu_domain *arm_smmu_sva_domainreturn ERR_CAST (smmu_domain); smmu_domain->domain.type =IOMMU_DOMAIN_SVA ; smmu_domain->domain.ops = &arm_smmu_sva_domain_ops; + +/* +* Choose page_size as the leaf page size for invalidation when +* ARM_SMMU_FEAT_RANGE_INV is present +*/ + smmu_domain->domain.pgsize_bitmap =PAGE_SIZE ; smmu_domain->smmu = smmu; ret = xa_alloc(&arm_smmu_asid_xa, &asid, smmu_domain,
Greg Kroah-Hartman
maintainerPATCH 36/183 iommu/vt-d: Apply quirk_iommu_igfx for 8086:0044 (QM57/QS57)
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mingcong Bai <[email protected]>
commit 2c8a7c66c90832432496616a9a3c07293f1364f3 upstream.
On the Lenovo ThinkPad X201, when Intel VT-d is enabled in the BIOS, the kernel boots with errors related to DMAR, the graphical interface appeared quite choppy, and the system resets erratically within a minute after it booted:
DMAR: DRHD: handling fault status reg 3
DMAR: [DMA Write NO_PASID] Request device [00:02.0] fault addr 0xb97ff000 [fault reason 0x05] PTE Write access is not set
Upon comparing boot logs with VT-d on/off, I found that the Intel Calpella quirk (`quirk_calpella_no_shadow_gtt()') correctly applied the igfx IOMMU disable/quirk correctly:
pci 0000:00:00.0: DMAR: BIOS has allocated no shadow GTT; disabling IOMMU for graphics
Whereas with VT-d on, it went into the "else" branch, which then triggered the DMAR handling fault above:
... else if (!disable_igfx_iommu) {
/* we have to ensure the gfx device is idle before we flush */
pci_info(dev, "Disabling batched IOTLB flush on Ironlake\n");
iommu_set_dma_strict();
}Now, this is not exactly scientific, but moving 0x0044 to quirk_iommu_igfx seems to have fixed the aforementioned issue. Running a few `git blame' runs on the function, I have found that the quirk was originally introduced as a fix specific to ThinkPad X201:
commit 9eecabcb9a92 ("intel-iommu: Abort IOMMU setup for igfx if BIOS gave no shadow GTT space")
Which was later revised twice to the "else" branch we saw above:
- 2011: commit 6fbcfb3e467a ("intel-iommu: Workaround IOTLB hang on Ironlake GPU")
- 2024: commit ba00196ca41c ("iommu/vt-d: Decouple igfx_off from graphic identity mapping")
I'm uncertain whether further testings on this particular laptops were done in 2011 and (honestly I'm not sure) 2024, but I would be happy to do some distro-specific testing if that's what would be required to verify this patch.
P.S., I also see IDs 0x0040, 0x0062, and 0x006a listed under the same `quirk_calpella_no_shadow_gtt()' quirk, but I'm not sure how similar these chipsets are (if they share the same issue with VT-d or even, indeed, if this issue is specific to a bug in the Lenovo BIOS). With regards to 0x0062, it seems to be a Centrino wireless card, but not a chipset?
I have also listed a couple (distro and kernel) bug reports below as references (some of them are from 7-8 years ago!), as they seem to be similar issue found on different Westmere/Ironlake, Haswell, and Broadwell hardware setups.
--- drivers/iommu/intel/iommu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/iommu/intel/iommu.c +3 -1
@@ -4504,6 +4504,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IDECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2e40 , quirk_iommu_igfx);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2e90 , quirk_iommu_igfx); +/* QM57/QS57 integrated gfx malfunctions with dmar */ +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x0044 , quirk_iommu_igfx); +/* Broadwell igfx malfunctions with dmar */ DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x1606 , quirk_iommu_igfx);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x160B , quirk_iommu_igfx);
@@ -4581,7 +4584,6 @@ static void quirk_calpella_no_shadow_gtt } }DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x0040 , quirk_calpella_no_shadow_gtt); -DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x0044 , quirk_calpella_no_shadow_gtt);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x0062 , quirk_calpella_no_shadow_gtt);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x006a , quirk_calpella_no_shadow_gtt);
Greg Kroah-Hartman
maintainerPATCH 37/183 iommu: Fix two issues in iommu_copy_struct_from_user()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolin Chen <[email protected]>
commit 30a3f2f3e4bd6335b727c83c08a982d969752bc1 upstream.
In the review for iommu_copy_struct_to_user() helper, Matt pointed out that a NULL pointer should be rejected prior to dereferencing it:
https://lore.kernel.org/all/[email protected]
And Alok pointed out a typo at the same time:
https://lore.kernel.org/all/[email protected]
Since both issues were copied from iommu_copy_struct_from_user(), fix them first in the current header.
--- include/linux/iommu.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
include/linux/iommu.h +4 -4
@@ -425,10 +425,10 @@ static inline int __iommu_copy_struct_fr void *dst_data, const struct iommu_user_data *src_data, unsigned int data_type, size_t data_len, size_t min_len) { - if (src_data->type != data_type) - return -EINVAL; if (WARN_ON(!dst_data || !src_data)) return -EINVAL; +if (src_data->type != data_type) +return -EINVAL ;if (src_data->len < min_len || data_len < src_data->len)return -EINVAL ; return copy_struct_from_user(dst_data, data_len, src_data->uptr,
@@ -441,8 +441,8 @@ static inline int __iommu_copy_struct_fr* include/uapi/linux/iommufd.h * @user_data: Pointer to a struct iommu_user_data for user space data info * @data_type: The data type of the @kdst. Must match with @user_data->type -* @min_last: The last memember of the data structure @kdst points in the -* initial version. +* @min_last: The last member of the data structure @kdst points in the initial +* version. * Return 0 for success, otherwise -error. */ #define iommu_copy_struct_from_user (kdst, user_data, data_type, min_last) \
Greg Kroah-Hartman
maintainerPATCH 38/183 platform/x86/amd: pmc: Require at least 2.5 seconds between HW sleep cycles
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
commit 9f5595d5f03fd4dc640607a71e89a1daa68fd19d upstream.
When an APU exits HW sleep with no active wake sources the Linux kernel will rapidly assert that the APU can enter back into HW sleep. This happens in a few ms. Contrasting this to Windows, Windows can take 10s of seconds to enter back into the resiliency phase for Modern Standby.
For some situations this can be problematic because it can cause leakage from VDDCR_SOC to VDD_MISC and force VDD_MISC outside of the electrical design guide specifications. On some designs this will trip the over voltage protection feature (OVP) of the voltage regulator module, but it could cause APU damage as well.
To prevent this risk, add an explicit sleep call so that future attempts to enter into HW sleep will have enough time to settle. This will occur while the screen is dark and only on cases that the APU should enter HW sleep again, so it shouldn't be noticeable to any user.
--- drivers/platform/x86/amd/pmc/pmc.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/platform/x86/amd/pmc/pmc.c +3 -4
@@ -724,10 +724,9 @@ static void amd_pmc_s2idle_check(void)struct smu_metrics table;int rc; -/* CZN: Ensure that future s0i3 entry attempts at least 10ms passed */ -if (pdev->cpu_id ==AMD_CPU_ID_CZN && !get_metrics_table (pdev, &table) && - table.s0i3_last_entry_status) -usleep_range (10000 ,20000 ); +/* Avoid triggering OVP */ +if (!get_metrics_table (pdev, &table) && table.s0i3_last_entry_status) +msleep (2500 );/* Dump the IdleMask before we add to the STB */ amd_pmc_idlemask_read (pdev, pdev->dev,NULL );
Greg Kroah-Hartman
maintainerPATCH 39/183 platform/x86/intel-uncore-freq: Fix missing uncore sysfs during CPU hotplug
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shouye Liu <[email protected]>
commit 8d6955ed76e8a47115f2ea1d9c263ee6f505d737 upstream.
In certain situations, the sysfs for uncore may not be present when all CPUs in a package are offlined and then brought back online after boot.
This issue can occur if there is an error in adding the sysfs entry due to a memory allocation failure. Retrying to bring the CPUs online will not resolve the issue, as the uncore_cpu_mask is already set for the package before the failure condition occurs.
This issue does not occur if the failure happens during module initialization, as the module will fail to load in the event of any error.
To address this, ensure that the uncore_cpu_mask is not set until the successful return of uncore_freq_add_entry().
--- drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c | 13 ++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c +9 -4
@@ -146,15 +146,13 @@ static int uncore_event_cpu_online(unsig {struct uncore_data *data;int target; +int ret;/* Check if there is an online cpu in the package for uncore MSR */ target =cpumask_any_and (&uncore_cpu_mask,topology_die_cpumask (cpu));if (target < nr_cpu_ids)return 0 ; -/* Use this CPU on this die as a control CPU */ -cpumask_set_cpu (cpu, &uncore_cpu_mask); - data =uncore_get_instance (cpu);if (!data)return 0 ;
@@ -163,7 +161,14 @@ static int uncore_event_cpu_online(unsig data->die_id =topology_die_id (cpu); data->domain_id =UNCORE_DOMAIN_ID_INVALID ; -return uncore_freq_add_entry (data, cpu); + ret =uncore_freq_add_entry (data, cpu); +if (ret) +return ret; + +/* Use this CPU on this die as a control CPU */ +cpumask_set_cpu (cpu, &uncore_cpu_mask); + +return 0 ; }static int uncore_event_cpu_offline (unsigned int cpu)
Greg Kroah-Hartman
maintainerPATCH 40/183 ksmbd: fix use-after-free in ksmbd_session_rpc_open
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
commit a1f46c99d9ea411f9bf30025b912d881d36fc709 upstream.
A UAF issue can occur due to a race condition between ksmbd_session_rpc_open() and __session_rpc_close(). Add rpc_lock to the session to protect it.
--- fs/smb/server/mgmt/user_session.c | 20 ++++++++++++++------ fs/smb/server/mgmt/user_session.h | 1 + 2 files changed, 15 insertions(+), 6 deletions(-)
fs/smb/server/mgmt/user_session.c +14 -6
@@ -59,10 +59,12 @@ static void ksmbd_session_rpc_clear_liststruct ksmbd_session_rpc *entry;long index; +down_write (&sess->rpc_lock);xa_for_each (&sess->rpc_handle_list, index, entry) {xa_erase (&sess->rpc_handle_list, index);__session_rpc_close (sess, entry); } +up_write (&sess->rpc_lock);xa_destroy (&sess->rpc_handle_list); }
@@ -92,7 +94,7 @@ int ksmbd_session_rpc_open(struct ksmbd_ {struct ksmbd_session_rpc *entry, *old;struct ksmbd_rpc_command *resp; -int method; +int method, id; method =__rpc_method (rpc_name);if (!method)
@@ -102,26 +104,29 @@ int ksmbd_session_rpc_open(struct ksmbd_if (!entry)return -ENOMEM ; +down_read (&sess->rpc_lock); entry->method = method; - entry->id =ksmbd_ipc_id_alloc (); -if (entry->id <0 ) + entry->id = id =ksmbd_ipc_id_alloc (); +if (id <0 ) goto free_entry; - old =xa_store (&sess->rpc_handle_list, entry->id, entry,KSMBD_DEFAULT_GFP ); + old =xa_store (&sess->rpc_handle_list, id, entry,KSMBD_DEFAULT_GFP );if (xa_is_err (old)) goto free_id; - resp =ksmbd_rpc_open (sess, entry->id); + resp =ksmbd_rpc_open (sess, id);if (!resp) goto erase_xa; +up_read (&sess->rpc_lock);kvfree (resp); -return entry->id; +return id; erase_xa:xa_erase (&sess->rpc_handle_list, entry->id); free_id:ksmbd_rpc_id_free (entry->id); free_entry:kfree (entry); +up_read (&sess->rpc_lock);return -EINVAL ; }
@@ -129,9 +134,11 @@ void ksmbd_session_rpc_close(struct ksmb {struct ksmbd_session_rpc *entry; +down_write (&sess->rpc_lock); entry =xa_erase (&sess->rpc_handle_list, id);if (entry)__session_rpc_close (sess, entry); +up_write (&sess->rpc_lock); }int ksmbd_session_rpc_method (struct ksmbd_session *sess,int id)
@@ -439,6 +446,7 @@ static struct ksmbd_session *__session_c sess->sequence_number =1 ;rwlock_init (&sess->tree_conns_lock);atomic_set (&sess->refcnt,2 ); +init_rwsem (&sess->rpc_lock); ret =__init_smb2_session (sess);if (ret)
fs/smb/server/mgmt/user_session.h +1 -0
@@ -63,6 +63,7 @@ struct ksmbd_session {rwlock_t tree_conns_lock;atomic_t refcnt; +struct rw_semaphore rpc_lock; };static inline int test_session_flag (struct ksmbd_session *sess,int bit)
Greg Kroah-Hartman
maintainerPATCH 41/183 ksmbd: fix use-after-free in kerberos authentication
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Heelan <[email protected]>
commit e86e9134e1d1c90a960dd57f59ce574d27b9a124 upstream.
Setting sess->user = NULL was introduced to fix the dangling pointer created by ksmbd_free_user. However, it is possible another thread could be operating on the session and make use of sess->user after it has been passed to ksmbd_free_user but before sess->user is set to NULL.
--- fs/smb/server/auth.c | 14 +++++++++++++- fs/smb/server/smb2pdu.c | 5 ----- 2 files changed, 13 insertions(+), 6 deletions(-)
fs/smb/server/auth.c +13 -1
@@ -550,7 +550,19 @@ int ksmbd_krb5_authenticate(struct ksmbd retval = -ENOMEM ; goto out; } - sess->user = user; + +if (!sess->user) { +/* First successful authentication */ + sess->user = user; + }else { +if (!ksmbd_compare_user (sess->user, user)) { +ksmbd_debug (AUTH ,"different user tried to reuse session\n" ); + retval = -EPERM ; +ksmbd_free_user (user); + goto out; + } +ksmbd_free_user (user); + }memcpy (sess->sess_key, resp->payload, resp->session_key_len); memcpy(out_blob, resp->payload + resp->session_key_len,
fs/smb/server/smb2pdu.c +0 -5
@@ -1602,11 +1602,6 @@ static int krb5_authenticate(struct ksmbif (prev_sess_id && prev_sess_id != sess->id)destroy_previous_session (conn, sess->user, prev_sess_id); -if (sess->state ==SMB2_SESSION_VALID ) { -ksmbd_free_user (sess->user); - sess->user =NULL ; - } - retval =ksmbd_krb5_authenticate (sess, in_blob, in_len, out_blob, &out_len);if (retval) {
Greg Kroah-Hartman
maintainerPATCH 42/183 ksmbd: fix use-after-free in session logoff
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Heelan <[email protected]>
commit 2fc9feff45d92a92cd5f96487655d5be23fb7e2b upstream.
The sess->user object can currently be in use by another thread, for example if another connection has sent a session setup request to bind to the session being free'd. The handler for that connection could be in the smb2_sess_setup function which makes use of sess->user.
--- fs/smb/server/smb2pdu.c | 4 ---- 1 file changed, 4 deletions(-)
fs/smb/server/smb2pdu.c +0 -4
@@ -2244,10 +2244,6 @@ int smb2_session_logoff(struct ksmbd_wor sess->state =SMB2_SESSION_EXPIRED ;up_write (&conn->session_lock); -if (sess->user) { -ksmbd_free_user (sess->user); - sess->user =NULL ; - }ksmbd_all_conn_set_status (sess_id,KSMBD_SESS_NEED_SETUP ); rsp->StructureSize =cpu_to_le16 (4 );
Greg Kroah-Hartman
maintainerPATCH 43/183 smb: client: fix zero length for mkdir POSIX create context
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jethro Donaldson <[email protected]>
commit 74c72419ec8da5cbc9c49410d3c44bb954538bdd upstream.
SMB create requests issued via smb311_posix_mkdir() have an incorrect length of zero bytes for the POSIX create context data. ksmbd server rejects such requests and logs "cli req too short" causing mkdir to fail with "invalid argument" on the client side. It also causes subsequent rmmod to crash in cifs_destroy_request_bufs()
Inspection of packets sent by cifs.ko using wireshark show valid data for the SMB2_POSIX_CREATE_CONTEXT is appended with the correct offset, but with an incorrect length of zero bytes. Fails with ksmbd+cifs.ko only as Windows server/client does not use POSIX extensions.
Fix smb311_posix_mkdir() to set req->CreateContextsLength as part of appending the POSIX creation context to the request.
--- fs/smb/client/smb2pdu.c | 1 + 1 file changed, 1 insertion(+)
fs/smb/client/smb2pdu.c +1 -0
@@ -2920,6 +2920,7 @@ replay_again: req->CreateContextsOffset =cpu_to_le32 (sizeof (struct smb2_create_req ) + iov[1 ].iov_len); +le32_add_cpu (&req->CreateContextsLength, iov[n_iov-1 ].iov_len); pc_buf = iov[n_iov-1 ].iov_base; }
Greg Kroah-Hartman
maintainerPATCH 44/183 cpufreq: Avoid using inconsistent policy->min and policy->max
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
commit 7491cdf46b5cbdf123fc84fbe0a07e9e3d7b7620 upstream.
Since cpufreq_driver_resolve_freq() can run in parallel with cpufreq_set_policy() and there is no synchronization between them, the former may access policy->min and policy->max while the latter is updating them and it may see intermediate values of them due to the way the update is carried out. Also the compiler is free to apply any optimizations it wants both to the stores in cpufreq_set_policy() and to the loads in cpufreq_driver_resolve_freq() which may result in additional inconsistencies.
To address this, use WRITE_ONCE() when updating policy->min and policy->max in cpufreq_set_policy() and use READ_ONCE() for reading them in cpufreq_driver_resolve_freq(). Moreover, rearrange the update in cpufreq_set_policy() to avoid storing intermediate values in policy->min and policy->max with the help of the observation that their new values are expected to be properly ordered upfront.
Also modify cpufreq_driver_resolve_freq() to take the possible reverse ordering of policy->min and policy->max, which may happen depending on the ordering of operations when this function and cpufreq_set_policy() run concurrently, into account by always honoring the max when it turns out to be less than the min (in case it comes from thermal throttling or similar).
--- drivers/cpufreq/cpufreq.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-)
drivers/cpufreq/cpufreq.c +25 -7
@@ -539,8 +539,6 @@ static unsigned int __resolve_freq(struc {unsigned int idx; - target_freq =clamp_val (target_freq, policy->min, policy->max); -if (!policy->freq_table)return target_freq;
@@ -564,7 +562,22 @@ static unsigned int __resolve_freq(strucunsigned int cpufreq_driver_resolve_freq (struct cpufreq_policy *policy,unsigned int target_freq) { -return __resolve_freq (policy, target_freq,CPUFREQ_RELATION_LE ); +unsigned int min =READ_ONCE (policy->min); +unsigned int max =READ_ONCE (policy->max); + +/* +* If this function runs in parallel with cpufreq_set_policy(), it may +* read policy->min before the update and policy->max after the update +* or the other way around, so there is no ordering guarantee. +* +* Resolve this by always honoring the max (in case it comes from +* thermal throttling or similar). +*/ +if (unlikely (min > max)) + min = max; + +return __resolve_freq (policy,clamp_val (target_freq, min, max), +CPUFREQ_RELATION_LE ); }EXPORT_SYMBOL_GPL (cpufreq_driver_resolve_freq);
@@ -2337,6 +2350,7 @@ int __cpufreq_driver_target(struct cpufrif (cpufreq_disabled ())return -ENODEV ; + target_freq =clamp_val (target_freq, policy->min, policy->max); target_freq =__resolve_freq (policy, target_freq, relation); pr_debug("target for CPU %u: %u kHz, relation %u, requested %u kHz\n",
@@ -2661,11 +2675,15 @@ static int cpufreq_set_policy(struct cpu* Resolve policy min/max to available frequencies. It ensures * no frequency resolution will neither overshoot the requested maximum * nor undershoot the requested minimum. +* +* Avoid storing intermediate values in policy->max or policy->min and +* compiler optimizations around them because they may be accessed +* concurrently by cpufreq_driver_resolve_freq() during the update. */ - policy->min = new_data.min; - policy->max = new_data.max; - policy->min =__resolve_freq (policy, policy->min,CPUFREQ_RELATION_L ); - policy->max =__resolve_freq (policy, policy->max,CPUFREQ_RELATION_H ); +WRITE_ONCE (policy->max,__resolve_freq (policy, new_data.max,CPUFREQ_RELATION_H )); + new_data.min =__resolve_freq (policy, new_data.min,CPUFREQ_RELATION_L ); +WRITE_ONCE (policy->min, new_data.min > policy->max ? policy->max : new_data.min); +trace_cpu_frequency_limits (policy);cpufreq_update_pressure (policy);
Greg Kroah-Hartman
maintainerPATCH 45/183 cpufreq: Fix setting policy limits when frequency tables are used
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
commit b79028039f440e7d2c4df6ab243060c4e3803e84 upstream.
Commit 7491cdf46b5c ("cpufreq: Avoid using inconsistent policy->min and policy->max") overlooked the fact that policy->min and policy->max were accessed directly in cpufreq_frequency_table_target() and in the functions called by it. Consequently, the changes made by that commit led to problems with setting policy limits.
Address this by passing the target frequency limits to __resolve_freq() and cpufreq_frequency_table_target() and propagating them to the functions called by the latter.
--- drivers/cpufreq/cpufreq.c | 22 ++++++--- drivers/cpufreq/cpufreq_ondemand.c | 3 - drivers/cpufreq/freq_table.c | 6 +- include/linux/cpufreq.h | 83 ++++++++++++++++++++++++------------- 4 files changed, 73 insertions(+), 41 deletions(-)
drivers/cpufreq/cpufreq.c +14 -8
@@ -535,14 +535,18 @@ void cpufreq_disable_fast_switch(structEXPORT_SYMBOL_GPL (cpufreq_disable_fast_switch);static unsigned int __resolve_freq (struct cpufreq_policy *policy, -unsigned int target_freq,unsigned int relation) +unsigned int target_freq, +unsigned int min,unsigned int max, +unsigned int relation) {unsigned int idx; + target_freq =clamp_val (target_freq, min, max); +if (!policy->freq_table)return target_freq; - idx =cpufreq_frequency_table_target (policy, target_freq, relation); + idx =cpufreq_frequency_table_target (policy, target_freq, min, max, relation); policy->cached_resolved_idx = idx; policy->cached_target_freq = target_freq;return policy->freq_table[idx].frequency;
@@ -576,8 +580,7 @@ unsigned int cpufreq_driver_resolve_freqif (unlikely (min > max)) min = max; -return __resolve_freq (policy,clamp_val (target_freq, min, max), -CPUFREQ_RELATION_LE ); +return __resolve_freq (policy, target_freq, min, max,CPUFREQ_RELATION_LE ); }EXPORT_SYMBOL_GPL (cpufreq_driver_resolve_freq);
@@ -2350,8 +2353,8 @@ int __cpufreq_driver_target(struct cpufrif (cpufreq_disabled ())return -ENODEV ; - target_freq =clamp_val (target_freq, policy->min, policy->max); - target_freq =__resolve_freq (policy, target_freq, relation); + target_freq =__resolve_freq (policy, target_freq, policy->min, + policy->max, relation);pr_debug ("target for CPU %u: %u kHz, relation %u, requested %u kHz\n" , policy->cpu, target_freq, relation, old_target_freq);
@@ -2680,8 +2683,11 @@ static int cpufreq_set_policy(struct cpu* compiler optimizations around them because they may be accessed * concurrently by cpufreq_driver_resolve_freq() during the update. */ -WRITE_ONCE (policy->max,__resolve_freq (policy, new_data.max,CPUFREQ_RELATION_H )); - new_data.min =__resolve_freq (policy, new_data.min,CPUFREQ_RELATION_L ); +WRITE_ONCE (policy->max,__resolve_freq (policy, new_data.max, + new_data.min, new_data.max, +CPUFREQ_RELATION_H )); + new_data.min =__resolve_freq (policy, new_data.min, new_data.min, + new_data.max,CPUFREQ_RELATION_L );WRITE_ONCE (policy->min, new_data.min > policy->max ? policy->max : new_data.min);trace_cpu_frequency_limits (policy);
drivers/cpufreq/cpufreq_ondemand.c +2 -1
@@ -76,7 +76,8 @@ static unsigned int generic_powersave_bireturn freq_next; } - index =cpufreq_frequency_table_target (policy, freq_next, relation); + index =cpufreq_frequency_table_target (policy, freq_next, policy->min, + policy->max, relation); freq_req = freq_table[index].frequency; freq_reduc = freq_req * od_tuners->powersave_bias /1000 ; freq_avg = freq_req - freq_reduc;
drivers/cpufreq/freq_table.c +3 -3
@@ -116,8 +116,8 @@ int cpufreq_generic_frequency_table_veriEXPORT_SYMBOL_GPL (cpufreq_generic_frequency_table_verify);int cpufreq_table_index_unsorted (struct cpufreq_policy *policy, -unsigned int target_freq, -unsigned int relation) +unsigned int target_freq,unsigned int min, +unsigned int max,unsigned int relation) {struct cpufreq_frequency_table optimal = { .driver_data = ~0 ,
@@ -148,7 +148,7 @@ int cpufreq_table_index_unsorted(structcpufreq_for_each_valid_entry_idx (pos, table, i) { freq = pos->frequency; -if ((freq < policy->min) || (freq > policy->max)) +if (freq < min || freq > max)continue ;if (freq == target_freq) { optimal.driver_data = i;
include/linux/cpufreq.h +54 -29
157 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 46/183 tracing: Fix oob write in trace_seq_to_buffer()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeongjun Park <[email protected]>
commit f5178c41bb43444a6008150fe6094497135d07cb upstream.
syzbot reported this bug:
==================================================================
BUG: KASAN: slab-out-of-bounds in trace_seq_to_buffer kernel/trace/trace.c:1830 [inline] BUG: KASAN: slab-out-of-bounds in tracing_splice_read_pipe+0x6be/0xdd0 kernel/trace/trace.c:6822 Write of size 4507 at addr ffff888032b6b000 by task syz.2.320/7260 CPU: 1 UID: 0 PID: 7260 Comm: syz.2.320 Not tainted 6.15.0-rc1-syzkaller-00301-g3bde70a2c827 #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 02/12/2025 Call Trace: <TASK> __dump_stack lib/dump_stack.c:94 [inline] dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:408 [inline] print_report+0xc3/0x670 mm/kasan/report.c:521 kasan_report+0xe0/0x110 mm/kasan/report.c:634 check_region_inline mm/kasan/generic.c:183 [inline] kasan_check_range+0xef/0x1a0 mm/kasan/generic.c:189 __asan_memcpy+0x3c/0x60 mm/kasan/shadow.c:106 trace_seq_to_buffer kernel/trace/trace.c:1830 [inline] tracing_splice_read_pipe+0x6be/0xdd0 kernel/trace/trace.c:6822 .... ==================================================================
It has been reported that trace_seq_to_buffer() tries to copy more data than PAGE_SIZE to buf. Therefore, to prevent this, we should use the smaller of trace_seq_used(&iter->seq) and PAGE_SIZE as an argument.
--- kernel/trace/trace.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/trace/trace.c +3 -2
@@ -6682,13 +6682,14 @@ static ssize_t tracing_splice_read_pipe(/* Copy the data into the page, so we can start over. */ ret =trace_seq_to_buffer (&iter->seq,page_address (spd.pages[i]), -trace_seq_used (&iter->seq)); +min ((size_t )trace_seq_used (&iter->seq), +PAGE_SIZE ));if (ret <0 ) {__free_page (spd.pages[i]);break ; } spd.partial[i].offset =0 ; - spd.partial[i].len =trace_seq_used (&iter->seq); + spd.partial[i].len = ret;trace_seq_init (&iter->seq); }
Greg Kroah-Hartman
maintainerPATCH 47/183 bcachefs: Remove incorrect __counted_by annotation
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Huang <[email protected]>
commit 6846100b00d97d3d6f05766ae86a0d821d849e78 upstream.
This actually reverts 86e92eeeb237 ("bcachefs: Annotate struct bch_xattr with __counted_by()").
After the x_name, there is a value. According to the disscussion[1], __counted_by assumes that the flexible array member contains exactly the amount of elements that are specified. Now there are users came across a false positive detection of an out of bounds write caused by the __counted_by here[2], so revert that.
[1] https://lore.kernel.org/lkml/Zv8VDKWN1GzLRT-_@archlinux/T/#m0ce9541c5070146320efd4f928cc1ff8de69e9b2
[2] https://privatebin.net/?a0d4e97d590d71e1#9bLmp2Kb5NU6X6cZEucchDcu88HzUQwHUah8okKPReEt
--- fs/bcachefs/xattr_format.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
fs/bcachefs/xattr_format.h +7 -1
@@ -13,7 +13,13 @@ struct bch_xattr {__u8 x_type;__u8 x_name_len;__le16 x_val_len; - __u8 x_name[] __counted_by(x_name_len); +/* +* x_name contains the name and value counted by +* x_name_len + x_val_len. The introduction of +* __counted_by(x_name_len) caused a false positive +* detection of an out of bounds write. +*/ + __u8 x_name[]; } __packed__aligned(8) ;#endif /* _BCACHEFS_XATTR_FORMAT_H */
Greg Kroah-Hartman
maintainerPATCH 48/183 drm/amd/display: Default IPS to RCG_IN_ACTIVE_IPS2_IN_OFF
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leo Li <[email protected]>
commit 6ed0dc3fd39558f48119daf8f99f835deb7d68da upstream.
[Why]
Recent findings show negligible power savings between IPS2 and RCG during static desktop. In fact, DCN related clocks are higher when IPS2 is enabled vs RCG.
RCG_IN_ACTIVE is also the default policy for another OS supported by DC, and it has faster entry/exit.
[How]
Remove previous logic that checked for IPS2 support, and just default to DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 -------------------- 1 file changed, 20 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +0 -20
@@ -1912,26 +1912,6 @@ static enum dmub_ips_disable_type dm_getswitch (amdgpu_ip_version (adev,DCE_HWIP ,0 )) {case IP_VERSION (3 ,5 ,0 ): -/* -* On DCN35 systems with Z8 enabled, it's possible for IPS2 + Z8 to -* cause a hard hang. A fix exists for newer PMFW. -* -* As a workaround, for non-fixed PMFW, force IPS1+RCG as the deepest -* IPS state in all cases, except for s0ix and all displays off (DPMS), -* where IPS2 is allowed. -* -* When checking pmfw version, use the major and minor only. -*/ -if ((adev->pm.fw_version &0x00FFFF00 ) <0x005D6300 ) - ret =DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF ; -else if (amdgpu_ip_version (adev,GC_HWIP ,0 ) >IP_VERSION (11 ,5 ,0 )) -/* -* Other ASICs with DCN35 that have residency issues with -* IPS2 in idle. -* We want them to use IPS2 only in display off cases. -*/ - ret =DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF ; -break ;case IP_VERSION (3 ,5 ,1 ): ret =DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF ;break ;
Greg Kroah-Hartman
maintainerPATCH 49/183 ASoC: soc-core: Stop using of_property_read_bool() for non-boolean properties
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit 6eab7034579917f207ca6d8e3f4e11e85e0ab7d5 upstream.
On R-Car:
OF: /sound: Read of boolean property 'simple-audio-card,bitclock-master' with a value.
OF: /sound: Read of boolean property 'simple-audio-card,frame-master' with a value.
or:
OF: /soc/sound@ec500000/ports/port@0/endpoint: Read of boolean property 'bitclock-master' with a value.
OF: /soc/sound@ec500000/ports/port@0/endpoint: Read of boolean property 'frame-master' with a value.
The use of of_property_read_bool() for non-boolean properties is deprecated in favor of of_property_present() when testing for property presence.
Replace testing for presence before calling of_property_read_u32() by testing for an -EINVAL return value from the latter, to simplify the code.
--- sound/soc/soc-core.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-)
sound/soc/soc-core.c +13 -19
@@ -3046,7 +3046,7 @@ int snd_soc_of_parse_pin_switches(structunsigned int i, nb_controls;int ret; -if (!of_property_read_bool (dev->of_node, prop)) +if (!of_property_present (dev->of_node, prop))return 0 ; strings = devm_kcalloc(dev, nb_controls_max,
@@ -3120,23 +3120,17 @@ int snd_soc_of_parse_tdm_slot(struct devif (rx_mask)snd_soc_of_get_slot_mask (np,"dai-tdm-slot-rx-mask" , rx_mask); -if (of_property_read_bool (np,"dai-tdm-slot-num" )) { - ret =of_property_read_u32 (np,"dai-tdm-slot-num" , &val); -if (ret) -return ret; - -if (slots) - *slots = val; - } - -if (of_property_read_bool (np,"dai-tdm-slot-width" )) { - ret =of_property_read_u32 (np,"dai-tdm-slot-width" , &val); -if (ret) -return ret; + ret =of_property_read_u32 (np,"dai-tdm-slot-num" , &val); +if (ret && ret != -EINVAL ) +return ret; +if (!ret && slots) + *slots = val; -if (slot_width) - *slot_width = val; - } + ret =of_property_read_u32 (np,"dai-tdm-slot-width" , &val); +if (ret && ret != -EINVAL ) +return ret; +if (!ret && slot_width) + *slot_width = val;return 0 ; }
@@ -3403,12 +3397,12 @@ unsigned int snd_soc_daifmt_parse_clock_* check "[prefix]frame-master" */ snprintf (prop,sizeof (prop),"%sbitclock-master" , prefix); - bit =of_property_read_bool (np, prop); + bit =of_property_present (np, prop);if (bit && bitclkmaster) *bitclkmaster =of_parse_phandle (np, prop,0 );snprintf (prop,sizeof (prop),"%sframe-master" , prefix); - frame =of_property_read_bool (np, prop); + frame =of_property_present (np, prop);if (frame && framemaster) *framemaster =of_parse_phandle (np, prop,0 );
Greg Kroah-Hartman
maintainerPATCH 50/183 ASoC: cs-amp-lib-test: Dont select SND_SOC_CS_AMP_LIB
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Fitzgerald <[email protected]>
[ Upstream commit 96014d91cffb335d3b396771524ff2aba3549865 ]
Depend on SND_SOC_CS_AMP_LIB instead of selecting it.
KUNIT_ALL_TESTS should only build tests for components that are already being built, it should not cause other stuff to be added to the build.
--- sound/soc/codecs/Kconfig | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
sound/soc/codecs/Kconfig +2 -3
@@ -763,10 +763,9 @@ config SND_SOC_CS_AMP_LIB tristate config SND_SOC_CS_AMP_LIB_TEST - tristate "KUnit test for Cirrus Logic cs-amp-lib" - depends on KUNIT + tristate "KUnit test for Cirrus Logic cs-amp-lib" if !KUNIT_ALL_TESTS + depends on SND_SOC_CS_AMP_LIB && KUNIT default KUNIT_ALL_TESTS - select SND_SOC_CS_AMP_LIB help This builds KUnit tests for the Cirrus Logic common amplifier library.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 51/183 firmware: cs_dsp: tests: Depend on FW_CS_DSP rather then enabling it
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nico Pache <[email protected]>
[ Upstream commit a0b887f6eb9a0d1be3c57d00b0f3ba8408d3018a ]
FW_CS_DSP gets enabled if KUNIT is enabled. The test should rather depend on if the feature is enabled. Fix this by moving FW_CS_DSP to the depends on clause.
--- drivers/firmware/cirrus/Kconfig | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/firmware/cirrus/Kconfig +1 -4
@@ -6,14 +6,11 @@ config FW_CS_DSP config FW_CS_DSP_KUNIT_TEST_UTILS tristate - depends on KUNIT && REGMAP - select FW_CS_DSP config FW_CS_DSP_KUNIT_TEST tristate "KUnit tests for Cirrus Logic cs_dsp" if !KUNIT_ALL_TESTS - depends on KUNIT && REGMAP + depends on KUNIT && REGMAP && FW_CS_DSP default KUNIT_ALL_TESTS - select FW_CS_DSP select FW_CS_DSP_KUNIT_TEST_UTILS help This builds KUnit tests for cs_dsp.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 52/183 ASoC: soc-pcm: Fix hw_params() and DAPM widget sequence
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sheetal <[email protected]>
[ Upstream commit 9aff2e8df240e84a36f2607f98a0a9924a24e65d ]
Issue:
When multiple audio streams share a common BE DAI, the BE DAI widget can be powered up before its hardware parameters are configured. This incorrect sequence leads to intermittent pcm_write errors.
For example, the below Tegra use-case throws an error:
aplay(2 streams) -> AMX(mux) -> ADX(demux) -> arecord(2 streams), here, 'AMX TX' and 'ADX RX' are common BE DAIs.
For above usecase when failure happens below sequence is observed:
aplay(1) FE open()
- BE DAI callbacks added to the list
- BE DAI state = SND_SOC_DPCM_STATE_OPEN
aplay(2) FE open()
- BE DAI callbacks are not added to the list as the state is already SND_SOC_DPCM_STATE_OPEN during aplay(1) FE open().
aplay(2) FE hw_params()
- BE DAI hw_params() callback ignored
aplay(2) FE prepare()
- Widget is powered ON without BE DAI hw_params() call
aplay(1) FE hw_params()
- BE DAI hw_params() is now called
Fix:
Add BE DAIs in the list if its state is either SND_SOC_DPCM_STATE_OPEN or SND_SOC_DPCM_STATE_HW_PARAMS as well.
It ensures the widget is powered ON after BE DAI hw_params() callback.
--- sound/soc/soc-pcm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
sound/soc/soc-pcm.c +4 -1
@@ -1618,10 +1618,13 @@ static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream,/* * Filter for systems with 'component_chaining' enabled. * This helps to avoid unnecessary re-configuration of an -* already active BE on such systems. +* already active BE on such systems and ensures the BE DAI +* widget is powered ON after hw_params() BE DAI callback. */ if (fe->card->component_chaining && (be->dpcm[stream].state !=SND_SOC_DPCM_STATE_NEW ) && + (be->dpcm[stream].state !=SND_SOC_DPCM_STATE_OPEN ) && + (be->dpcm[stream].state !=SND_SOC_DPCM_STATE_HW_PARAMS ) && (be->dpcm[stream].state !=SND_SOC_DPCM_STATE_CLOSE ))continue ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 53/183 book3s64/radix : Align section vmemmap start address to PAGE_SIZE
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Donet Tom <[email protected]>
[ Upstream commit 9cf7e13fecbab0894f6986fc6986ab2eba8de52e ]
A vmemmap altmap is a device-provided region used to provide backing storage for struct pages. For each namespace, the altmap should belong to that same namespace. If the namespaces are created unaligned, there is a chance that the section vmemmap start address could also be unaligned. If the section vmemmap start address is unaligned, the altmap page allocated from the current namespace might be used by the previous namespace also. During the free operation, since the altmap is shared between two namespaces, the previous namespace may detect that the page does not belong to its altmap and incorrectly assume that the page is a normal page. It then attempts to free the normal page, which leads to a kernel crash.
Kernel attempted to read user page (18) - exploit attempt? (uid: 0)
BUG: Kernel NULL pointer dereference on read at 0x00000018 Faulting instruction address: 0xc000000000530c7c Oops: Kernel access of bad area, sig: 11 [#1] LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA pSeries CPU: 32 PID: 2104 Comm: ndctl Kdump: loaded Tainted: G W NIP: c000000000530c7c LR: c000000000530e00 CTR: 0000000000007ffe REGS: c000000015e57040 TRAP: 0300 Tainted: G W MSR: 800000000280b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE> CR: 84482404 CFAR: c000000000530dfc DAR: 0000000000000018 DSISR: 40000000 IRQMASK: 0
GPR00: c000000000530e00 c000000015e572e0 c000000002c5cb00 c00c000101008040
GPR04: 0000000000000000 0000000000000007 0000000000000001 000000000000001f
GPR08: 0000000000000005 0000000000000000 0000000000000018 0000000000002000
GPR12: c0000000001d2fb0 c0000060de6b0080 0000000000000000 c0000060dbf90020
GPR16: c00c000101008000 0000000000000001 0000000000000000 c000000125b20f00
GPR20: 0000000000000001 0000000000000000 ffffffffffffffff c00c000101007fff
GPR24: 0000000000000001 0000000000000000 0000000000000000 0000000000000000
GPR28: 0000000004040201 0000000000000001 0000000000000000 c00c000101008040 NIP [c000000000530c7c] get_pfnblock_flags_mask+0x7c/0xd0
LR [c000000000530e00] free_unref_page_prepare+0x130/0x4f0
Call Trace: free_unref_page+0x50/0x1e0 free_reserved_page+0x40/0x68 free_vmemmap_pages+0x98/0xe0 remove_pte_table+0x164/0x1e8 remove_pmd_table+0x204/0x2c8 remove_pud_table+0x1c4/0x288 remove_pagetable+0x1c8/0x310 vmemmap_free+0x24/0x50 section_deactivate+0x28c/0x2a0 __remove_pages+0x84/0x110 arch_remove_memory+0x38/0x60 memunmap_pages+0x18c/0x3d0 devm_action_release+0x30/0x50 release_nodes+0x68/0x140 devres_release_group+0x100/0x190 dax_pmem_compat_release+0x44/0x80 [dax_pmem_compat] device_for_each_child+0x8c/0x100 [dax_pmem_compat_remove+0x2c/0x50 [dax_pmem_compat] nvdimm_bus_remove+0x78/0x140 [libnvdimm] device_remove+0x70/0xd0
Another issue is that if there is no altmap, a PMD-sized vmemmap page will be allocated from RAM, regardless of the alignment of the section start address. If the section start address is not aligned to the PMD size, a VM_BUG_ON will be triggered when setting the PMD-sized page to page table.
In this patch, we are aligning the section vmemmap start address to PAGE_SIZE. After alignment, the start address will not be part of the current namespace, and a normal page will be allocated for the vmemmap mapping of the current section. For the remaining sections, altmaps will be allocated. During the free operation, the normal page will be correctly freed.
In the same way, a PMD_SIZE vmemmap page will be allocated only if the section start address is PMD_SIZE-aligned; otherwise, it will fall back to a PAGE-sized vmemmap allocation.
Without this patch
==================
NS1 start NS2 start
_________________________________________________________
| NS1 | NS2 |
---------------------------------------------------------
| Altmap| Altmap | .....|Altmap| Altmap | ........... | NS1 | NS1 | | NS2 | NS2 |
In the above scenario, NS1 and NS2 are two namespaces. The vmemmap for NS1 comes from Altmap NS1, which belongs to NS1, and the vmemmap for NS2 comes from Altmap NS2, which belongs to NS2.
The vmemmap start for NS2 is not aligned, so Altmap NS2 is shared by both NS1 and NS2. During the free operation in NS1, Altmap NS2 is not part of NS1's altmap, causing it to attempt to free an invalid page.
With this patch
===============
NS1 start NS2 start
_________________________________________________________
| NS1 | NS2 |
---------------------------------------------------------
| Altmap| Altmap | .....| Normal | Altmap | Altmap |....... | NS1 | NS1 | | Page | NS2 | NS2 |
If the vmemmap start for NS2 is not aligned then we are allocating a normal page. NS1 and NS2 vmemmap will be freed correctly.
--- arch/powerpc/mm/book3s64/radix_pgtable.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
arch/powerpc/mm/book3s64/radix_pgtable.c +15 -2
@@ -1120,6 +1120,19 @@ int __meminit radix__vmemmap_populate(unsigned long start, unsigned long end, inpmd_t *pmd;pte_t *pte; +/* +* Make sure we align the start vmemmap addr so that we calculate +* the correct start_pfn in altmap boundary check to decided whether +* we should use altmap or RAM based backing memory allocation. Also +* the address need to be aligned for set_pte operation. + +* If the start addr is already PMD_SIZE aligned we will try to use +* a pmd mapping. We don't want to be too aggressive here beacause +* that will cause more allocations in RAM. So only if the namespace +* vmemmap start addr is PMD_SIZE aligned we will use PMD mapping. +*/ + + start =ALIGN_DOWN (start,PAGE_SIZE );for (addr = start; addr < end; addr = next) { next =pmd_addr_end (addr, end);
@@ -1145,8 +1158,8 @@ int __meminit radix__vmemmap_populate(unsigned long start, unsigned long end, in* in altmap block allocation failures, in which case * we fallback to RAM for vmemmap allocation. */ -if (altmap && (!IS_ALIGNED (addr,PMD_SIZE ) || -altmap_cross_boundary (altmap, addr,PMD_SIZE ))) { +if (!IS_ALIGNED (addr,PMD_SIZE ) || (altmap && +altmap_cross_boundary (altmap, addr,PMD_SIZE ))) {/* * make sure we don't create altmap mappings * covering things outside the device.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 54/183 powerpc64/ftrace: fix module loading without patchable function entries
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anthony Iliopoulos <[email protected]>
[ Upstream commit 534f5a8ba27863141e29766467a3e1f61bcb47ac ]
get_stubs_size assumes that there must always be at least one patchable function entry, which is not always the case (modules that export data but no code), otherwise it returns -ENOEXEC and thus the section header sh_size is set to that value. During module_memory_alloc() the size is passed to execmem_alloc() after being page-aligned and thus set to zero which will cause it to fail the allocation (and thus module loading) as __vmalloc_node_range() checks for zero-sized allocs and returns null:
[ 115.466896] module_64: cast_common: doesn't contain __patchable_function_entries. [ 115.469189] ------------[ cut here ]------------ [ 115.469496] WARNING: CPU: 0 PID: 274 at mm/vmalloc.c:3778 __vmalloc_node_range_noprof+0x8b4/0x8f0 ... [ 115.478574] ---[ end trace 0000000000000000 ]--- [ 115.479545] execmem: unable to allocate memory
Fix this by removing the check completely, since it is anyway not helpful to propagate this as an error upwards.
--- arch/powerpc/kernel/module_64.c | 4 ---- 1 file changed, 4 deletions(-)
arch/powerpc/kernel/module_64.c +0 -4
@@ -258,10 +258,6 @@ static unsigned long get_stubs_size(const Elf64_Ehdr *hdr, break; } } -if (i == hdr->e_shnum) { -pr_err ("%s: doesn't contain __patchable_function_entries.\n" , me->name); -return -ENOEXEC ; - }#endif pr_debug ("Looks like a total of %lu stubs, max\n" , relocs);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 55/183 pinctrl: imx: Return NULL if no group is matched and found
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Wang <[email protected]>
[ Upstream commit e64c0ff0d5d85791fbcd126ee558100a06a24a97 ]
Currently if no group is matched and found, this function will return the last grp to the caller, this is not expected, it is supposed to return NULL in this case.
--- drivers/pinctrl/freescale/pinctrl-imx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/pinctrl/freescale/pinctrl-imx.c +3 -3
@@ -37,16 +37,16 @@ static inline const struct group_desc *imx_pinctrl_find_group_by_name(struct pinctrl_dev *pctldev, const char *name) { - const struct group_desc *grp = NULL; + const struct group_desc *grp;int i;for (i =0 ; i < pctldev->num_groups; i++) { grp =pinctrl_generic_get_group (pctldev, i);if (grp && !strcmp (grp->grp.name, name)) -break ; +return grp; } -return grp; +return NULL ; } static void imx_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 56/183 powerpc/boot: Check for ld-option support
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Madhavan Srinivasan <[email protected]>
[ Upstream commit b2accfe7ca5bc9f9af28e603b79bdd5ad8df5c0b ]
Commit 579aee9fc594 ("powerpc: suppress some linker warnings in recent linker versions") enabled support to add linker option "--no-warn-rwx-segments",
if the version is greater than 2.39. Similar build warning were
reported recently from linker version 2.35.2.
ld: warning: arch/powerpc/boot/zImage.epapr has a LOAD segment with RWX permissions
ld: warning: arch/powerpc/boot/zImage.pseries has a LOAD segment with RWX permissions
Fix the warning by checking for "--no-warn-rwx-segments" option support in linker to enable it, instead of checking for the version range.
--- arch/powerpc/boot/wrapper | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
arch/powerpc/boot/wrapper +2 -4
@@ -234,10 +234,8 @@ fi # suppress some warnings in recent ld versions nowarn="-z noexecstack" -if ! ld_is_lld; then - if [ "$LD_VERSION" -ge "$(echo 2.39 | ld_version)" ]; then - nowarn="$nowarn --no-warn-rwx-segments" - fi +if [ $(${CROSS}ld -v --no-warn-rwx-segments &>/dev/null; echo $?) -eq 0 ]; then + nowarn="$nowarn --no-warn-rwx-segments" fi platformo=$object/"$platform".o
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 57/183 ASoC: Intel: sof_sdw: Add NULL check in asoc_sdw_rt_dmic_rtd_init()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chenyuan Yang <[email protected]>
[ Upstream commit 68715cb5c0e00284d93f976c6368809f64131b0b ]
mic_name returned by devm_kasprintf() could be NULL. Add a check for it.
--- sound/soc/sdw_utils/soc_sdw_rt_dmic.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/sdw_utils/soc_sdw_rt_dmic.c +2 -0
@@ -29,6 +29,8 @@ int asoc_sdw_rt_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_da mic_name =devm_kasprintf (card->dev,GFP_KERNEL ,"rt715-sdca" ); else mic_name =devm_kasprintf (card->dev,GFP_KERNEL ,"%s" , component->name_prefix); +if (!mic_name) +return -ENOMEM ; card->components = devm_kasprintf(card->dev, GFP_KERNEL, "%s mic:%s", card->components,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 58/183 iommu/arm-smmu-v3: Add missing S2FWB feature detection
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aneesh Kumar K.V (Arm) <[email protected]>
[ Upstream commit 45e00e36718902d81bdaebb37b3a8244e685bc48 ]
Commit 67e4fe398513 ("iommu/arm-smmu-v3: Use S2FWB for NESTED domains") introduced S2FWB usage but omitted the corresponding feature detection. As a result, vIOMMU allocation fails on FVP in arm_vsmmu_alloc(), due to the following check:
if (!arm_smmu_master_canwbs(master) && !(smmu->features & ARM_SMMU_FEAT_S2FWB)) return ERR_PTR(-EOPNOTSUPP);
This patch adds the missing detection logic to prevent allocation failure when S2FWB is supported.
--- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +2 -0
@@ -4416,6 +4416,8 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu) reg =readl_relaxed (smmu->base +ARM_SMMU_IDR3 );if (FIELD_GET (IDR3_RIL , reg)) smmu->features |=ARM_SMMU_FEAT_RANGE_INV ; +if (FIELD_GET (IDR3_FWB , reg)) + smmu->features |=ARM_SMMU_FEAT_S2FWB ;/* IDR5 */ reg =readl_relaxed (smmu->base +ARM_SMMU_IDR5 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 59/183 ALSA: hda/realtek - Enable speaker for HP platform
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
[ Upstream commit 494d0939b1bda4d4ddca7d52a6ce6f808ff2c9a5 ]
The speaker doesn't mute when plugged headphone. This platform support 4ch speakers.
The speaker pin 0x14 wasn't fill verb table. After assigned model ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX. The speaker can mute when headphone was plugged.
--- sound/pci/hda/patch_realtek.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
sound/pci/hda/patch_realtek.c +6 -6
@@ -440,6 +440,10 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)alc_update_coef_idx (codec,0x67 ,0xf000 ,0x3000 ); fallthrough;case 0x10ec0215 : +case 0x10ec0236 : +case 0x10ec0245 : +case 0x10ec0256 : +case 0x10ec0257 :case 0x10ec0285 :case 0x10ec0289 :alc_update_coef_idx (codec,0x36 ,1 <<13 ,0 );
@@ -447,12 +451,8 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)case 0x10ec0230 :case 0x10ec0233 :case 0x10ec0235 : -case 0x10ec0236 : -case 0x10ec0245 :case 0x10ec0255 : -case 0x10ec0256 :case 0x19e58326 : -case 0x10ec0257 :case 0x10ec0282 :case 0x10ec0283 :case 0x10ec0286 :
@@ -10713,8 +10713,8 @@ static const struct hda_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x103c ,0x8ca7 ,"HP ZBook Fury" ,ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8caf ,"HP Elite mt645 G8 Mobile Thin Client" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ),SND_PCI_QUIRK (0x103c ,0x8cbd ,"HP Pavilion Aero Laptop 13-bg0xxx" ,ALC245_FIXUP_HP_X360_MUTE_LEDS ), -SND_PCI_QUIRK (0x103c ,0x8cdd ,"HP Spectre" ,ALC287_FIXUP_CS35L41_I2C_2 ), -SND_PCI_QUIRK (0x103c ,0x8cde ,"HP Spectre" ,ALC287_FIXUP_CS35L41_I2C_2 ), +SND_PCI_QUIRK (0x103c ,0x8cdd ,"HP Spectre" ,ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX ), +SND_PCI_QUIRK (0x103c ,0x8cde ,"HP OmniBook Ultra Flip Laptop 14t" ,ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX ),SND_PCI_QUIRK (0x103c ,0x8cdf ,"HP SnowWhite" ,ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8ce0 ,"HP SnowWhite" ,ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 60/183 drm/i915/pxp: fix undefined reference to `intel_pxp_gsccs_is_ready_for_sessions
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Linxuan <[email protected]>
[ Upstream commit 7e21ea8149a0e41c3666ee52cc063a6f797a7a2a ]
On x86_64 with gcc version 13.3.0, I compile kernel with:
make defconfig
./scripts/kconfig/merge_config.sh .config <(
echo CONFIG_COMPILE_TEST=y
)
make KCFLAGS="-fno-inline-functions -fno-inline-small-functions -fno-inline-functions-called-once"
Then I get a linker error:
ld: vmlinux.o: in function `pxp_fw_dependencies_completed':
kintel_pxp.c:(.text+0x95728f): undefined reference to `intel_pxp_gsccs_is_ready_for_sessions'
This is caused by not having a intel_pxp_gsccs_is_ready_for_sessions() header stub for CONFIG_DRM_I915_PXP=n. Add it.
--- drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.h +6 -2
@@ -23,6 +23,7 @@ int intel_pxp_gsccs_init(struct intel_pxp *pxp);int intel_pxp_gsccs_create_session (struct intel_pxp *pxp,int arb_session_id);void intel_pxp_gsccs_end_arb_fw_session (struct intel_pxp *pxp,u32 arb_session_id); +bool intel_pxp_gsccs_is_ready_for_sessions (struct intel_pxp *pxp);#else static inline void intel_pxp_gsccs_fini (struct intel_pxp *pxp)
@@ -34,8 +35,11 @@ static inline int intel_pxp_gsccs_init(struct intel_pxp *pxp)return 0 ; } -#endif +static inline bool intel_pxp_gsccs_is_ready_for_sessions (struct intel_pxp *pxp) +{ +return false; +} -bool intel_pxp_gsccs_is_ready_for_sessions (struct intel_pxp *pxp); +#endif #endif /*__INTEL_PXP_GSCCS_H__ */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 61/183 wifi: iwlwifi: back off on continuous errors
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit d49437a6afc707951e5767ef70c9726b6c05da08 ]
When errors occur repeatedly, the driver shouldn't go into a tight loop trying to reset the device. Implement the backoff I had already defined IWL_TRANS_RESET_DELAY for, but clearly forgotten the implementation of.
--- .../net/wireless/intel/iwlwifi/iwl-trans.c | 27 ++++++++++++++----- .../net/wireless/intel/iwlwifi/iwl-trans.h | 7 +++-- .../net/wireless/intel/iwlwifi/pcie/trans.c | 3 ++- 3 files changed, 28 insertions(+), 9 deletions(-)
drivers/net/wireless/intel/iwlwifi/iwl-trans.c +21 -6
@@ -21,6 +21,7 @@ struct iwl_trans_dev_restart_data {struct list_head list;unsigned int restart_count;time64_t last_error; +bool backoff;char name[]; };
@@ -125,13 +126,20 @@ iwl_trans_determine_restart_mode(struct iwl_trans *trans)if (!data)return at_least; -if (ktime_get_boottime_seconds () - data->last_error >= +if (!data->backoff && +ktime_get_boottime_seconds () - data->last_error >=IWL_TRANS_RESET_OK_TIME ) data->restart_count =0 ; index = data->restart_count; -if (index >=ARRAY_SIZE (escalation_list)) +if (index >=ARRAY_SIZE (escalation_list)) { index =ARRAY_SIZE (escalation_list) -1 ; +if (!data->backoff) { + data->backoff = true; +return IWL_RESET_MODE_BACKOFF ; + } + data->backoff = false; + }return max (at_least, escalation_list[index]); }
@@ -140,7 +148,8 @@ iwl_trans_determine_restart_mode(struct iwl_trans *trans)static void iwl_trans_restart_wk (struct work_struct *wk) { -struct iwl_trans *trans =container_of (wk,typeof (*trans), restart.wk); +struct iwl_trans *trans =container_of (wk,typeof (*trans), + restart.wk.work);struct iwl_trans_reprobe *reprobe;enum iwl_reset_mode mode;
@@ -168,6 +177,12 @@ static void iwl_trans_restart_wk(struct work_struct *wk)return ; mode =iwl_trans_determine_restart_mode (trans); +if (mode ==IWL_RESET_MODE_BACKOFF ) { +IWL_ERR (trans,"Too many device errors - delay next reset\n" ); +queue_delayed_work (system_unbound_wq, &trans->restart.wk, +IWL_TRANS_RESET_DELAY ); +return ; + }iwl_trans_inc_restart_count (trans->dev);
@@ -227,7 +242,7 @@ struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, trans->dev = dev; trans->num_rx_queues =1 ; -INIT_WORK (&trans->restart.wk, iwl_trans_restart_wk); +INIT_DELAYED_WORK (&trans->restart.wk, iwl_trans_restart_wk);return trans; }
@@ -271,7 +286,7 @@ int iwl_trans_init(struct iwl_trans *trans)void iwl_trans_free (struct iwl_trans *trans) { -cancel_work_sync (&trans->restart.wk); +cancel_delayed_work_sync (&trans->restart.wk);kmem_cache_destroy (trans->dev_cmd_pool); }
@@ -403,7 +418,7 @@ void iwl_trans_op_mode_leave(struct iwl_trans *trans)iwl_trans_pcie_op_mode_leave (trans); -cancel_work_sync (&trans->restart.wk); +cancel_delayed_work_sync (&trans->restart.wk); trans->op_mode =NULL ;
drivers/net/wireless/intel/iwlwifi/iwl-trans.h +5 -2
@@ -958,7 +958,7 @@ struct iwl_trans {struct iwl_dma_ptr invalid_tx_cmd;struct { -struct work_struct wk; +struct delayed_work wk;struct iwl_fw_error_dump_mode mode;bool during_reset; } restart;
@@ -1159,7 +1159,7 @@ static inline void iwl_trans_schedule_reset(struct iwl_trans *trans,*/ trans->restart.during_reset =test_bit (STATUS_IN_SW_RESET , &trans->status); -queue_work (system_unbound_wq, &trans->restart.wk); +queue_delayed_work (system_unbound_wq, &trans->restart.wk,0 ); } static inline void iwl_trans_fw_error(struct iwl_trans *trans,
@@ -1258,6 +1258,9 @@ enum iwl_reset_mode {IWL_RESET_MODE_RESCAN ,IWL_RESET_MODE_FUNC_RESET ,IWL_RESET_MODE_PROD_RESET , + +/* keep last - special backoff value */ + IWL_RESET_MODE_BACKOFF, };void iwl_trans_pcie_reset (struct iwl_trans *trans,enum iwl_reset_mode mode);
drivers/net/wireless/intel/iwlwifi/pcie/trans.c +2 -1
@@ -2351,7 +2351,8 @@ void iwl_trans_pcie_reset(struct iwl_trans *trans, enum iwl_reset_mode mode)struct iwl_trans_pcie_removal *removal;char _msg =0 , *msg = &_msg; -if (WARN_ON (mode <IWL_RESET_MODE_REMOVE_ONLY )) +if (WARN_ON (mode <IWL_RESET_MODE_REMOVE_ONLY || + mode ==IWL_RESET_MODE_BACKOFF ))return ;if (test_bit (STATUS_TRANS_DEAD , &trans->status))
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 62/183 wifi: iwlwifi: dont warn if the NIC is gone in resume
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
[ Upstream commit 15220a257319ffe3bf95796326dfe0aacdbeb1c4 ]
Some BIOSes decide to power gate the WLAN device during S3. Since iwlwifi doesn't expect this, it gets very noisy reporting that the device is no longer available. Wifi is still available because iwlwifi recovers, but it spews scary prints in the log.
Fix that by failing gracefully.
--- .../net/wireless/intel/iwlwifi/iwl-trans.c | 1 - drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 20 ++++++++++++++++--- .../wireless/intel/iwlwifi/pcie/internal.h | 9 +++++---- .../net/wireless/intel/iwlwifi/pcie/trans.c | 13 +++++++++--- drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 2 +- 5 files changed, 33 insertions(+), 12 deletions(-)
drivers/net/wireless/intel/iwlwifi/iwl-trans.c +0 -1
@@ -555,7 +555,6 @@ void __releases(nic_access) iwl_trans_release_nic_access(struct iwl_trans *trans) {iwl_trans_pcie_release_nic_access (trans); -__release (nic_access); }IWL_EXPORT_SYMBOL (iwl_trans_release_nic_access);
drivers/net/wireless/intel/iwlwifi/pcie/drv.c +17 -3
@@ -1703,10 +1703,24 @@ static int _iwl_pci_resume(struct device *device, bool restore)* need to reset it completely. * Note: MAC (bits 0:7) will be cleared upon suspend even with wowlan, * so assume that any bits there mean that the device is usable. +* For older devices, just try silently to grab the NIC. */ -if (trans->trans_cfg->device_family >=IWL_DEVICE_FAMILY_BZ && - !iwl_read32 (trans,CSR_FUNC_SCRATCH )) - device_was_powered_off = true; +if (trans->trans_cfg->device_family >=IWL_DEVICE_FAMILY_BZ ) { +if (!iwl_read32 (trans,CSR_FUNC_SCRATCH )) + device_was_powered_off = true; + }else { +/* +* bh are re-enabled by iwl_trans_pcie_release_nic_access, +* so re-enable them if _iwl_trans_pcie_grab_nic_access fails. +*/ +local_bh_disable (); +if (_iwl_trans_pcie_grab_nic_access (trans, true)) { +iwl_trans_pcie_release_nic_access (trans); + }else { + device_was_powered_off = true; +local_bh_enable (); + } + }if (restore || device_was_powered_off) { trans->state =IWL_TRANS_NO_FW ;
drivers/net/wireless/intel/iwlwifi/pcie/internal.h +5 -4
@@ -558,10 +558,10 @@ void iwl_trans_pcie_free(struct iwl_trans *trans);void iwl_trans_pcie_free_pnvm_dram_regions (struct iwl_dram_regions *dram_regions,struct device *dev); -bool __iwl_trans_pcie_grab_nic_access (struct iwl_trans *trans); -#define _iwl_trans_pcie_grab_nic_access (trans) \ +bool __iwl_trans_pcie_grab_nic_access (struct iwl_trans *trans,bool silent); +#define _iwl_trans_pcie_grab_nic_access (trans, silent) \ __cond_lock(nic_access_nobh, \ - likely(__iwl_trans_pcie_grab_nic_access(trans))) + likely(__iwl_trans_pcie_grab_nic_access(trans, silent)))void iwl_trans_pcie_check_product_reset_status (struct pci_dev *pdev);void iwl_trans_pcie_check_product_reset_mode (struct pci_dev *pdev);
@@ -1105,7 +1105,8 @@ void iwl_trans_pcie_set_bits_mask(struct iwl_trans *trans, u32 reg,int iwl_trans_pcie_read_config32 (struct iwl_trans *trans,u32 ofs,u32 *val);bool iwl_trans_pcie_grab_nic_access (struct iwl_trans *trans); -void iwl_trans_pcie_release_nic_access (struct iwl_trans *trans); +void __releases(nic_access_nobh) +iwl_trans_pcie_release_nic_access(struct iwl_trans *trans); /* transport gen 1 exported functions */ void iwl_trans_pcie_fw_alive(struct iwl_trans *trans, u32 scd_addr);
drivers/net/wireless/intel/iwlwifi/pcie/trans.c +10 -3
@@ -2406,7 +2406,7 @@ EXPORT_SYMBOL(iwl_trans_pcie_reset);* This version doesn't disable BHs but rather assumes they're * already disabled. */ -bool __iwl_trans_pcie_grab_nic_access (struct iwl_trans *trans) +bool __iwl_trans_pcie_grab_nic_access (struct iwl_trans *trans,bool silent) {int ret;struct iwl_trans_pcie *trans_pcie =IWL_TRANS_GET_PCIE_TRANS (trans);
@@ -2458,6 +2458,11 @@ bool __iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans)if (unlikely (ret <0 )) {u32 cntrl =iwl_read32 (trans,CSR_GP_CNTRL ); +if (silent) { +spin_unlock (&trans_pcie->reg_lock); +return false; + } +WARN_ONCE (1 ,"Timeout waiting for hardware access (CSR_GP_CNTRL 0x%08x)\n" , cntrl);
@@ -2489,7 +2494,7 @@ bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans)bool ret;local_bh_disable (); - ret =__iwl_trans_pcie_grab_nic_access (trans); + ret =__iwl_trans_pcie_grab_nic_access (trans, false);if (ret) {/* keep BHs disabled until iwl_trans_pcie_release_nic_access */ return ret;
@@ -2498,7 +2503,8 @@ bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans)return false; } -void iwl_trans_pcie_release_nic_access (struct iwl_trans *trans) +void __releases(nic_access_nobh) +iwl_trans_pcie_release_nic_access(struct iwl_trans *trans) {struct iwl_trans_pcie *trans_pcie =IWL_TRANS_GET_PCIE_TRANS (trans);
@@ -2525,6 +2531,7 @@ void iwl_trans_pcie_release_nic_access(struct iwl_trans *trans)* scheduled on different CPUs (after we drop reg_lock). */ out: +__release (nic_access_nobh);spin_unlock_bh (&trans_pcie->reg_lock); }
drivers/net/wireless/intel/iwlwifi/pcie/tx.c +1 -1
@@ -1021,7 +1021,7 @@ static int iwl_pcie_set_cmd_in_flight(struct iwl_trans *trans,* returned. This needs to be done only on NICs that have * apmg_wake_up_wa set (see above.) */ -if (!_iwl_trans_pcie_grab_nic_access (trans)) +if (!_iwl_trans_pcie_grab_nic_access (trans, false))return -EIO ;/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 63/183 wifi: iwlwifi: fix the check for the SCRATCH register upon resume
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
[ Upstream commit a17821321a9b42f26e77335cd525fee72dc1cd63 ]
We can't rely on the SCRATCH register being 0 on platform that power gate the NIC in S3. Even in those platforms, the SCRATCH register is still returning 0x1010000.
Make sure that we understand that those platforms have powered off the device.
--- drivers/net/wireless/intel/iwlwifi/iwl-csr.h | 1 + drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-)
drivers/net/wireless/intel/iwlwifi/iwl-csr.h +1 -0
@@ -148,6 +148,7 @@* during a error FW error. */ #define CSR_FUNC_SCRATCH_INIT_VALUE (0x01010101) +#define CSR_FUNC_SCRATCH_POWER_OFF_MASK 0xFFFF/* Bits for CSR_HW_IF_CONFIG_REG */ #define CSR_HW_IF_CONFIG_REG_MSK_MAC_STEP_DASH (0x0000000F)
drivers/net/wireless/intel/iwlwifi/pcie/drv.c +4 -2
@@ -1702,11 +1702,13 @@ static int _iwl_pci_resume(struct device *device, bool restore)* Scratch value was altered, this means the device was powered off, we * need to reset it completely. * Note: MAC (bits 0:7) will be cleared upon suspend even with wowlan, -* so assume that any bits there mean that the device is usable. +* but not bits [15:8]. So if we have bits set in lower word, assume +* the device is alive. * For older devices, just try silently to grab the NIC. */ if (trans->trans_cfg->device_family >=IWL_DEVICE_FAMILY_BZ ) { -if (!iwl_read32 (trans,CSR_FUNC_SCRATCH )) +if (!(iwl_read32 (trans,CSR_FUNC_SCRATCH ) & +CSR_FUNC_SCRATCH_POWER_OFF_MASK )) device_was_powered_off = true; }else {/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 64/183 wifi: plfxlc: Remove erroneous assert in plfxlc_mac_release
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Murad Masimov <[email protected]>
[ Upstream commit 0fb15ae3b0a9221be01715dac0335647c79f3362 ]
plfxlc_mac_release() asserts that mac->lock is held. This assertion is incorrect, because even if it was possible, it would not be the valid behaviour. The function is used when probe fails or after the device is disconnected. In both cases mac->lock can not be held as the driver is not working with the device at the moment. All functions that use mac->lock unlock it just after it was held. There is also no need to hold mac->lock for plfxlc_mac_release() itself, as mac data is not affected, except for mac->flags, which is modified atomically.
This bug leads to the following warning:
================================================================
WARNING: CPU: 0 PID: 127 at drivers/net/wireless/purelifi/plfxlc/mac.c:106 plfxlc_mac_release+0x7d/0xa0 Modules linked in: CPU: 0 PID: 127 Comm: kworker/0:2 Not tainted 6.1.124-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 Workqueue: usb_hub_wq hub_event RIP: 0010:plfxlc_mac_release+0x7d/0xa0 drivers/net/wireless/purelifi/plfxlc/mac.c:106 Call Trace: <TASK> probe+0x941/0xbd0 drivers/net/wireless/purelifi/plfxlc/usb.c:694 usb_probe_interface+0x5c0/0xaf0 drivers/usb/core/driver.c:396 really_probe+0x2ab/0xcb0 drivers/base/dd.c:639 __driver_probe_device+0x1a2/0x3d0 drivers/base/dd.c:785 driver_probe_device+0x50/0x420 drivers/base/dd.c:815 __device_attach_driver+0x2cf/0x510 drivers/base/dd.c:943 bus_for_each_drv+0x183/0x200 drivers/base/bus.c:429 __device_attach+0x359/0x570 drivers/base/dd.c:1015 bus_probe_device+0xba/0x1e0 drivers/base/bus.c:489 device_add+0xb48/0xfd0 drivers/base/core.c:3696 usb_set_configuration+0x19dd/0x2020 drivers/usb/core/message.c:2165 usb_generic_driver_probe+0x84/0x140 drivers/usb/core/generic.c:238 usb_probe_device+0x130/0x260 drivers/usb/core/driver.c:293 really_probe+0x2ab/0xcb0 drivers/base/dd.c:639 __driver_probe_device+0x1a2/0x3d0 drivers/base/dd.c:785 driver_probe_device+0x50/0x420 drivers/base/dd.c:815 __device_attach_driver+0x2cf/0x510 drivers/base/dd.c:943 bus_for_each_drv+0x183/0x200 drivers/base/bus.c:429 __device_attach+0x359/0x570 drivers/base/dd.c:1015 bus_probe_device+0xba/0x1e0 drivers/base/bus.c:489 device_add+0xb48/0xfd0 drivers/base/core.c:3696 usb_new_device+0xbdd/0x18f0 drivers/usb/core/hub.c:2620 hub_port_connect drivers/usb/core/hub.c:5477 [inline] hub_port_connect_change drivers/usb/core/hub.c:5617 [inline] port_event drivers/usb/core/hub.c:5773 [inline] hub_event+0x2efe/0x5730 drivers/usb/core/hub.c:5855 process_one_work+0x8a9/0x11d0 kernel/workqueue.c:2292 worker_thread+0xa47/0x1200 kernel/workqueue.c:2439 kthread+0x28d/0x320 kernel/kthread.c:376 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295 </TASK> ================================================================
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
--- drivers/net/wireless/purelifi/plfxlc/mac.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/wireless/purelifi/plfxlc/mac.c +0 -1
@@ -102,7 +102,6 @@ int plfxlc_mac_init_hw(struct ieee80211_hw *hw)void plfxlc_mac_release (struct plfxlc_mac *mac) {plfxlc_chip_release (&mac->chip); -lockdep_assert_held (&mac->lock); }int plfxlc_op_start (struct ieee80211_hw *hw)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 65/183 powerpc/boot: Fix dash warning
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Madhavan Srinivasan <[email protected]>
[ Upstream commit e3f506b78d921e48a00d005bea5c45ec36a99240 ]
'commit b2accfe7ca5b ("powerpc/boot: Check for ld-option support")' suppressed linker warnings, but the expressed used did not go well with POSIX shell (dash) resulting with this warning
arch/powerpc/boot/wrapper: 237: [: 0: unexpected operator
ld: warning: arch/powerpc/boot/zImage.epapr has a LOAD segment with RWX permissions
Fix the check to handle the reported warning. Patch also fixes couple of shellcheck reported errors for the same line.
In arch/powerpc/boot/wrapper line 237:
if [ $(${CROSS}ld -v --no-warn-rwx-segments &>/dev/null; echo $?) -eq 0 ]; then
^-- SC2046 (warning): Quote this to prevent word splitting.
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
^---------^ SC3020 (warning): In POSIX sh, &> is undefined.
--- arch/powerpc/boot/wrapper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/boot/wrapper +1 -1
@@ -234,7 +234,7 @@ fi # suppress some warnings in recent ld versions nowarn="-z noexecstack" -if [ $(${CROSS}ld -v --no-warn-rwx-segments &>/dev/null; echo $?) -eq 0 ]; then +if "${CROSS}ld" -v --no-warn-rwx-segments >/dev/null 2>&1; then nowarn="$nowarn --no-warn-rwx-segments" fi
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 66/183 vxlan: vnifilter: Fix unlocked deletion of default FDB entry
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 087a9eb9e5978e3ba362e1163691e41097e8ca20 ]
When a VNI is deleted from a VXLAN device in 'vnifilter' mode, the FDB entry associated with the default remote (assuming one was configured) is deleted without holding the hash lock. This is wrong and will result in a warning [1] being generated by the lockdep annotation that was added by commit ebe642067455 ("vxlan: Create wrappers for FDB lookup").
Reproducer:
# ip link add vx0 up type vxlan dstport 4789 external vnifilter local 192.0.2.1 # bridge vni add vni 10010 remote 198.51.100.1 dev vx0 # bridge vni del vni 10010 dev vx0
Fix by acquiring the hash lock before the deletion and releasing it afterwards. Blame the original commit that introduced the issue rather than the one that exposed it.
[1]
WARNING: CPU: 3 PID: 392 at drivers/net/vxlan/vxlan_core.c:417 vxlan_find_mac+0x17f/0x1a0 [...] RIP: 0010:vxlan_find_mac+0x17f/0x1a0 [...] Call Trace: <TASK> __vxlan_fdb_delete+0xbe/0x560 vxlan_vni_delete_group+0x2ba/0x940 vxlan_vni_del.isra.0+0x15f/0x580 vxlan_process_vni_filter+0x38b/0x7b0 vxlan_vnifilter_process+0x3bb/0x510 rtnetlink_rcv_msg+0x2f7/0xb70 netlink_rcv_skb+0x131/0x360 netlink_unicast+0x426/0x710 netlink_sendmsg+0x75a/0xc20 __sock_sendmsg+0xc1/0x150 ____sys_sendmsg+0x5aa/0x7b0 ___sys_sendmsg+0xfc/0x180 __sys_sendmsg+0x121/0x1b0 do_syscall_64+0xbb/0x1d0 entry_SYSCALL_64_after_hwframe+0x4b/0x53
--- drivers/net/vxlan/vxlan_vnifilter.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/net/vxlan/vxlan_vnifilter.c +7 -1
@@ -627,7 +627,11 @@ static void vxlan_vni_delete_group(struct vxlan_dev *vxlan,* default dst remote_ip previously added for this vni */ if (!vxlan_addr_any (&vninode->remote_ip) || - !vxlan_addr_any (&dst->remote_ip)) + !vxlan_addr_any (&dst->remote_ip)) { +u32 hash_index =fdb_head_index (vxlan, all_zeros_mac, + vninode->vni); + +spin_lock_bh (&vxlan->hash_lock[hash_index]); __vxlan_fdb_delete(vxlan, all_zeros_mac, (vxlan_addr_any(&vninode->remote_ip) ? dst->remote_ip : vninode->remote_ip),
@@ -635,6 +639,8 @@ static void vxlan_vni_delete_group(struct vxlan_dev *vxlan, vninode->vni, vninode->vni, dst->remote_ifindex, true); +spin_unlock_bh (&vxlan->hash_lock[hash_index]); + }if (vxlan->dev->flags &IFF_UP ) { if (vxlan_addr_multicast(&vninode->remote_ip) &&
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 67/183 xsk: Fix race condition in AF_XDP generic RX path
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: e.kubanski <[email protected]>
[ Upstream commit a1356ac7749cafc4e27aa62c0c4604b5dca4983e ]
Move rx_lock from xsk_socket to xsk_buff_pool.
Fix synchronization for shared umem mode in
generic RX path where multiple sockets share
single xsk_buff_pool.
RX queue is exclusive to xsk_socket, while FILL
queue can be shared between multiple sockets.
This could result in race condition where two
CPU cores access RX path of two different sockets
sharing the same umem.
Protect both queues by acquiring spinlock in shared xsk_buff_pool.
Lock contention may be minimized in the future by some per-thread FQ buffering.
It's safe and necessary to move spin_lock_bh(rx_lock) after xsk_rcv_check():
* xs->pool and spinlock_init is synchronized by xsk_bind() -> xsk_is_bound() memory barriers.
* xsk_rcv_check() may return true at the moment of xsk_release() or xsk_unbind_dev(), however this will not cause any data races or race conditions. xsk_unbind_dev() removes xdp socket from all maps and waits for completion of all outstanding rx operations. Packets in RX path will either complete safely or drop.
--- include/net/xdp_sock.h | 3 --- include/net/xsk_buff_pool.h | 2 ++ net/xdp/xsk.c | 6 +++--- net/xdp/xsk_buff_pool.c | 1 + 4 files changed, 6 insertions(+), 6 deletions(-)
include/net/xdp_sock.h +0 -3
@@ -71,9 +71,6 @@ struct xdp_sock {*/ u32 tx_budget_spent; -/* Protects generic receive. */ -spinlock_t rx_lock; -/* Statistics */ u64 rx_dropped;u64 rx_queue_full;
include/net/xsk_buff_pool.h +2 -0
@@ -53,6 +53,8 @@ struct xsk_buff_pool {refcount_t users;struct xdp_umem *umem;struct work_struct work; +/* Protects generic receive in shared and non-shared umem mode. */ +spinlock_t rx_lock;struct list_head free_list;struct list_head xskb_list;u32 heads_cnt;
net/xdp/xsk.c +3 -3
@@ -337,13 +337,14 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)u32 len =xdp_get_buff_len (xdp);int err; -spin_lock_bh (&xs->rx_lock); err =xsk_rcv_check (xs, xdp, len);if (!err) { +spin_lock_bh (&xs->pool->rx_lock); err =__xsk_rcv (xs, xdp, len);xsk_flush (xs); +spin_unlock_bh (&xs->pool->rx_lock); } -spin_unlock_bh (&xs->rx_lock); +return err; }
@@ -1730,7 +1731,6 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol, xs =xdp_sk (sk); xs->state =XSK_READY ;mutex_init (&xs->mutex); -spin_lock_init (&xs->rx_lock);INIT_LIST_HEAD (&xs->map_list);spin_lock_init (&xs->map_list_lock);
net/xdp/xsk_buff_pool.c +1 -0
@@ -87,6 +87,7 @@ struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs, pool->addrs = umem->addrs; pool->tx_metadata_len = umem->tx_metadata_len; pool->tx_sw_csum = umem->flags &XDP_UMEM_TX_SW_CSUM ; +spin_lock_init (&pool->rx_lock);INIT_LIST_HEAD (&pool->free_list);INIT_LIST_HEAD (&pool->xskb_list);INIT_LIST_HEAD (&pool->xsk_tx_list);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 68/183 xsk: Fix offset calculation in unaligned mode
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: e.kubanski <[email protected]>
[ Upstream commit bf20af07909925ec0ae6cd4f3b7be0279dfa8768 ]
Bring back previous offset calculation behaviour
in AF_XDP unaligned umem mode.
In unaligned mode, upper 16 bits should contain
data offset, lower 48 bits should contain
only specific chunk location without offset.
Remove pool->headroom duplication into 48bit address.
--- include/net/xsk_buff_pool.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/xsk_buff_pool.h +1 -1
@@ -232,8 +232,8 @@ static inline u64 xp_get_handle(struct xdp_buff_xsk *xskb,return orig_addr; offset = xskb->xdp.data - xskb->xdp.data_hard_start; - orig_addr -= offset; offset += pool->headroom; + orig_addr -= offset;return orig_addr + (offset <<XSK_UNALIGNED_BUF_OFFSET_SHIFT ); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 69/183 net/mlx5e: Use custom tunnel header for vxlan gbp
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Dogaru <[email protected]>
[ Upstream commit eacc77a73275895eca0e3655dc6c671853500e2e ]
Symbolic (e.g. "vxlan") and custom (e.g. "tunnel_header_0") tunnels cannot be combined, but the match params interface does not have fields for matching on vxlan gbp. To match vxlan bgp, the tc_tun layer uses tunnel_header_0.
Allow matching on both VNI and GBP by matching the VNI with a custom tunnel header instead of the symbolic field name.
Matching solely on the VNI continues to use the symbolic field name.
--- .../mellanox/mlx5/core/en/tc_tun_vxlan.c | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_vxlan.c +29 -3
@@ -165,9 +165,6 @@ static int mlx5e_tc_tun_parse_vxlan(struct mlx5e_priv *priv,struct flow_match_enc_keyid enc_keyid;void *misc_c, *misc_v; - misc_c =MLX5_ADDR_OF (fte_match_param, spec->match_criteria, misc_parameters); - misc_v =MLX5_ADDR_OF (fte_match_param, spec->match_value, misc_parameters); -if (!flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_ENC_KEYID ))return 0 ;
@@ -182,6 +179,30 @@ static int mlx5e_tc_tun_parse_vxlan(struct mlx5e_priv *priv, err =mlx5e_tc_tun_parse_vxlan_gbp_option (priv, spec, f);if (err)return err; + +/* We can't mix custom tunnel headers with symbolic ones and we +* don't have a symbolic field name for GBP, so we use custom +* tunnel headers in this case. We need hardware support to +* match on custom tunnel headers, but we already know it's +* supported because the previous call successfully checked for +* that. +*/ + misc_c =MLX5_ADDR_OF (fte_match_param, spec->match_criteria, + misc_parameters_5); + misc_v =MLX5_ADDR_OF (fte_match_param, spec->match_value, + misc_parameters_5); + +/* Shift by 8 to account for the reserved bits in the vxlan +* header after the VNI. +*/ +MLX5_SET (fte_match_set_misc5, misc_c, tunnel_header_1, +be32_to_cpu (enc_keyid.mask->keyid) <<8 ); +MLX5_SET (fte_match_set_misc5, misc_v, tunnel_header_1, +be32_to_cpu (enc_keyid.key->keyid) <<8 ); + + spec->match_criteria_enable |=MLX5_MATCH_MISC_PARAMETERS_5 ; + +return 0 ; }/* match on VNI is required */
@@ -195,6 +216,11 @@ static int mlx5e_tc_tun_parse_vxlan(struct mlx5e_priv *priv,return -EOPNOTSUPP ; } + misc_c =MLX5_ADDR_OF (fte_match_param, spec->match_criteria, + misc_parameters); + misc_v =MLX5_ADDR_OF (fte_match_param, spec->match_value, + misc_parameters); +MLX5_SET (fte_match_set_misc, misc_c, vxlan_vni,be32_to_cpu (enc_keyid.mask->keyid)); MLX5_SET(fte_match_set_misc, misc_v, vxlan_vni,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 70/183 net/mlx5: E-Switch, Initialize MAC Address for Default GID
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maor Gottlieb <[email protected]>
[ Upstream commit 5d1a04f347e6cbf5ffe74da409a5d71fbe8c5f19 ]
Initialize the source MAC address when creating the default GID entry. Since this entry is used only for loopback traffic, it only needs to be a unicast address. A zeroed-out MAC address is sufficient for this purpose.
Without this fix, random bits would be assigned as the source address. If these bits formed a multicast address, the firmware would return an error, preventing the user from switching to switchdev mode:
Error: mlx5_core: Failed setting eswitch to offloads. kernel answers: Invalid argument
--- drivers/net/ethernet/mellanox/mlx5/core/rdma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/rdma.c +1 -1
@@ -118,8 +118,8 @@ static void mlx5_rdma_make_default_gid(struct mlx5_core_dev *dev, union ib_gid *static int mlx5_rdma_add_roce_addr (struct mlx5_core_dev *dev) { +u8 mac[ETH_ALEN ] = {};union ib_gid gid; -u8 mac[ETH_ALEN ];mlx5_rdma_make_default_gid (dev, &gid); return mlx5_core_roce_gid_set(dev, 0,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 71/183 net/mlx5e: TC, Continue the attr process even if encap entry is invalid
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jianbo Liu <[email protected]>
[ Upstream commit 172c034264c894518c012387f2de2f9d6443505d ]
Previously the offload of the rule with header rewrite and mirror to both internal and external destinations is skipped if the encap entry is not valid. But it shouldn't because driver will try to offload it again if neighbor is updated and encap entry is valid, to replace the old FTE added for slow path. But the extra split attr doesn't exist at that time as the process is skipped, driver then fails to offload it. To fix this issue, remove the checking and continue the attr process if encap entry is invalid.
--- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +1 -4
@@ -1750,9 +1750,6 @@ extra_split_attr_dests_needed(struct mlx5e_tc_flow *flow, struct mlx5_flow_attr !list_is_first(&attr->list, &flow->attrs))return 0 ; -if (flow_flag_test (flow,SLOW )) -return 0 ; - esw_attr = attr->esw_attr;if (!esw_attr->split_count || esw_attr->split_count == esw_attr->out_count -1 )
@@ -1766,7 +1763,7 @@ extra_split_attr_dests_needed(struct mlx5e_tc_flow *flow, struct mlx5_flow_attrfor (i = esw_attr->split_count; i < esw_attr->out_count; i++) {/* external dest with encap is considered as internal by firmware */ if (esw_attr->dests[i].vport ==MLX5_VPORT_UPLINK && - !(esw_attr->dests[i].flags &MLX5_ESW_DEST_ENCAP_VALID )) + !(esw_attr->dests[i].flags &MLX5_ESW_DEST_ENCAP )) ext_dest = true;else int_dest = true;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 72/183 net/mlx5e: Fix lock order in mlx5e_tx_reporter_ptpsq_unhealthy_recover
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cosmin Ratiu <[email protected]>
[ Upstream commit 1c2940ec0ddf51c689ee9ab85ead85c11b77809d ]
RTNL needs to be acquired before state_lock.
--- drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c +2 -4
@@ -177,6 +177,7 @@ static int mlx5e_tx_reporter_ptpsq_unhealthy_recover(void *ctx) priv = ptpsq->txqsq.priv; +rtnl_lock ();mutex_lock (&priv->state_lock); chs = &priv->channels; netdev = priv->netdev;
@@ -184,22 +185,19 @@ static int mlx5e_tx_reporter_ptpsq_unhealthy_recover(void *ctx) carrier_ok =netif_carrier_ok (netdev);netif_carrier_off (netdev); -rtnl_lock ();mlx5e_deactivate_priv_channels (priv); -rtnl_unlock ();mlx5e_ptp_close (chs->ptp); err =mlx5e_ptp_open (priv, &chs->params, chs->c[0 ]->lag_port, &chs->ptp); -rtnl_lock ();mlx5e_activate_priv_channels (priv); -rtnl_unlock ();/* return carrier back if needed */ if (carrier_ok)netif_carrier_on (netdev);mutex_unlock (&priv->state_lock); +rtnl_unlock ();return err; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 73/183 net/mlx5: E-switch, Fix error handling for enabling roce
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mi <[email protected]>
[ Upstream commit 90538d23278a981e344d364e923162fce752afeb ]
The cited commit assumes enabling roce always succeeds. But it is not true. Add error handling for it.
--- .../net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 5 ++++- drivers/net/ethernet/mellanox/mlx5/core/rdma.c | 9 +++++---- drivers/net/ethernet/mellanox/mlx5/core/rdma.h | 4 ++-- 3 files changed, 11 insertions(+), 7 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +4 -1
@@ -3532,7 +3532,9 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)int err;mutex_init (&esw->offloads.termtbl_mutex); -mlx5_rdma_enable_roce (esw->dev); + err =mlx5_rdma_enable_roce (esw->dev); +if (err) + goto err_roce; err =mlx5_esw_host_number_init (esw);if (err)
@@ -3593,6 +3595,7 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)esw_offloads_metadata_uninit (esw); err_metadata:mlx5_rdma_disable_roce (esw->dev); +err_roce:mutex_destroy (&esw->offloads.termtbl_mutex);return err; }
drivers/net/ethernet/mellanox/mlx5/core/rdma.c +5 -4
@@ -140,17 +140,17 @@ void mlx5_rdma_disable_roce(struct mlx5_core_dev *dev)mlx5_nic_vport_disable_roce (dev); } -void mlx5_rdma_enable_roce (struct mlx5_core_dev *dev) +int mlx5_rdma_enable_roce (struct mlx5_core_dev *dev) {int err;if (!MLX5_CAP_GEN (dev, roce)) -return ; +return 0 ; err =mlx5_nic_vport_enable_roce (dev);if (err) {mlx5_core_err (dev,"Failed to enable RoCE: %d\n" , err); -return ; +return err; } err =mlx5_rdma_add_roce_addr (dev);
@@ -165,10 +165,11 @@ void mlx5_rdma_enable_roce(struct mlx5_core_dev *dev) goto del_roce_addr; } -return ; +return err; del_roce_addr:mlx5_rdma_del_roce_addr (dev); disable_roce:mlx5_nic_vport_disable_roce (dev); +return err; }
drivers/net/ethernet/mellanox/mlx5/core/rdma.h +2 -2
@@ -8,12 +8,12 @@#ifdef CONFIG_MLX5_ESWITCH -void mlx5_rdma_enable_roce (struct mlx5_core_dev *dev); +int mlx5_rdma_enable_roce (struct mlx5_core_dev *dev);void mlx5_rdma_disable_roce (struct mlx5_core_dev *dev);#else /* CONFIG_MLX5_ESWITCH */ -static inline void mlx5_rdma_enable_roce (struct mlx5_core_dev *dev) {} +static inline int mlx5_rdma_enable_roce (struct mlx5_core_dev *dev) {return 0 ; }static inline void mlx5_rdma_disable_roce (struct mlx5_core_dev *dev) {}#endif /* CONFIG_MLX5_ESWITCH */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 74/183 accel/ivpu: Correct DCT interrupt handling
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karol Wachowski <[email protected]>
[ Upstream commit e53e004e346062e15df9511bd4b5a19e34701384 ]
Fix improper use of dct_active_percent field in DCT interrupt handler causing DCT to never get enabled. Set dct_active_percent internally before IPC to ensure correct driver value even if IPC fails.
Set default DCT value to 30 accordingly to HW architecture specification.
--- drivers/accel/ivpu/ivpu_hw_btrs.h | 2 +- drivers/accel/ivpu/ivpu_pm.c | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-)
drivers/accel/ivpu/ivpu_hw_btrs.h +1 -1
@@ -14,7 +14,7 @@#define PLL_PROFILING_FREQ_DEFAULT 38400000#define PLL_PROFILING_FREQ_HIGH 400000000 -#define DCT_DEFAULT_ACTIVE_PERCENT 15u +#define DCT_DEFAULT_ACTIVE_PERCENT 30u#define DCT_PERIOD_US 35300uint ivpu_hw_btrs_info_init (struct ivpu_device *vdev);
drivers/accel/ivpu/ivpu_pm.c +10 -8
@@ -433,16 +433,17 @@ int ivpu_pm_dct_enable(struct ivpu_device *vdev, u8 active_percent) active_us = (DCT_PERIOD_US * active_percent) /100 ; inactive_us =DCT_PERIOD_US - active_us; + vdev->pm->dct_active_percent = active_percent; + +ivpu_dbg (vdev,PM ,"DCT requested %u%% (D0: %uus, D0i2: %uus)\n" , + active_percent, active_us, inactive_us); + ret =ivpu_jsm_dct_enable (vdev, active_us, inactive_us);if (ret) {ivpu_err_ratelimited (vdev,"Failed to enable DCT: %d\n" , ret);return ret; } - vdev->pm->dct_active_percent = active_percent; - -ivpu_dbg (vdev,PM ,"DCT set to %u%% (D0: %uus, D0i2: %uus)\n" , - active_percent, active_us, inactive_us);return 0 ; }
@@ -450,15 +451,16 @@ int ivpu_pm_dct_disable(struct ivpu_device *vdev) {int ret; + vdev->pm->dct_active_percent =0 ; + +ivpu_dbg (vdev,PM ,"DCT requested to be disabled\n" ); + ret =ivpu_jsm_dct_disable (vdev);if (ret) {ivpu_err_ratelimited (vdev,"Failed to disable DCT: %d\n" , ret);return ret; } - vdev->pm->dct_active_percent =0 ; - -ivpu_dbg (vdev,PM ,"DCT disabled\n" );return 0 ; }
@@ -470,7 +472,7 @@ void ivpu_pm_dct_irq_thread_handler(struct ivpu_device *vdev)if (ivpu_hw_btrs_dct_get_request (vdev, &enable))return ; -if (vdev->pm->dct_active_percent) +if (enable) ret =ivpu_pm_dct_enable (vdev,DCT_DEFAULT_ACTIVE_PERCENT );else ret =ivpu_pm_dct_disable (vdev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 75/183 spi: spi-mem: Add fix to avoid divide error
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Raju Rangoju <[email protected]>
[ Upstream commit 8e4d3d8a5e51e07bd0d6cdd81b5e4af79f796927 ]
For some SPI flash memory operations, dummy bytes are not mandatory. For example, in Winbond SPINAND flash memory devices, the write_cache and update_cache operation variants have zero dummy bytes. Calculating the duration for SPI memory operations with zero dummy bytes causes a divide error when ncycles is calculated in the spi_mem_calc_op_duration().
Add changes to skip the 'ncylcles' calculation for zero dummy bytes.
Following divide error is fixed by this change:
Oops: divide error: 0000 [#1] PREEMPT SMP NOPTI
...
? do_trap+0xdb/0x100 ? do_error_trap+0x75/0xb0 ? spi_mem_calc_op_duration+0x56/0xb0 ? exc_divide_error+0x3b/0x70 ? spi_mem_calc_op_duration+0x56/0xb0 ? asm_exc_divide_error+0x1b/0x20 ? spi_mem_calc_op_duration+0x56/0xb0 ? spinand_select_op_variant+0xee/0x190 [spinand] spinand_match_and_init+0x13e/0x1a0 [spinand] spinand_manufacturer_match+0x6e/0xa0 [spinand] spinand_probe+0x357/0x7f0 [spinand] ? kernfs_activate+0x87/0xd0 spi_mem_probe+0x7a/0xb0 spi_probe+0x7d/0x130
--- drivers/spi/spi-mem.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/spi/spi-mem.c +5 -1
@@ -585,7 +585,11 @@ u64 spi_mem_calc_op_duration(struct spi_mem_op *op) ns_per_cycles =1000000000 / op->max_freq; ncycles += ((op->cmd.nbytes *8 ) / op->cmd.buswidth) / (op->cmd.dtr ?2 :1 ); ncycles += ((op->addr.nbytes *8 ) / op->addr.buswidth) / (op->addr.dtr ?2 :1 ); - ncycles += ((op->dummy.nbytes *8 ) / op->dummy.buswidth) / (op->dummy.dtr ?2 :1 ); + +/* Dummy bytes are optional for some SPI flash memory operations */ +if (op->dummy.nbytes) + ncycles += ((op->dummy.nbytes *8 ) / op->dummy.buswidth) / (op->dummy.dtr ?2 :1 ); + ncycles += ((op->data.nbytes *8 ) / op->data.buswidth) / (op->data.dtr ?2 :1 );return ncycles * ns_per_cycles;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 76/183 ASoC: amd: acp: Fix NULL pointer deref in acp_i2s_set_tdm_slot
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Venkata Prasad Potturu <[email protected]>
[ Upstream commit 6d9b64156d849e358cb49b6b899fb0b7d262bda8 ]
Update chip data using dev_get_drvdata(dev->parent) to fix NULL pointer deref in acp_i2s_set_tdm_slot.
--- sound/soc/amd/acp/acp-i2s.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/amd/acp/acp-i2s.c +1 -1
@@ -101,7 +101,7 @@ static int acp_i2s_set_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, u32 rx_masstruct acp_stream *stream;int slot_len, no_of_slots; - chip =dev_get_platdata (dev); + chip =dev_get_drvdata (dev->parent);switch (slot_width) {case SLOT_WIDTH_8 : slot_len =8 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 77/183 cpufreq: Introduce policy->boost_supported flag
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
[ Upstream commit 1f7d1bab50e6ae517f8b6699e56d709d61ae13e5 ]
It is possible to have a scenario where not all cpufreq policies support boost frequencies. And letting sysfs (or other parts of the kernel) enable boost feature for that policy isn't correct.
Add a new flag, boost_supported, which will be set to true by the cpufreq core only if the freq table contains valid boost frequencies.
Some cpufreq drivers though don't have boost frequencies in the freq-table, they can set this flag from their ->init() callbacks.
Once all the drivers are updated to set the flag correctly, we can check it before enabling boost feature for a policy.
Stable-dep-of: 3d59224947b0 ("cpufreq: ACPI: Re-sync CPU boost state on system resume")
--- drivers/cpufreq/freq_table.c | 4 ++++ include/linux/cpufreq.h | 3 +++ 2 files changed, 7 insertions(+)
drivers/cpufreq/freq_table.c +4 -0
@@ -367,6 +367,10 @@ int cpufreq_table_validate_and_sort(struct cpufreq_policy *policy)if (ret)return ret; +/* Driver's may have set this field already */ +if (policy_has_boost_freq (policy)) + policy->boost_supported = true; +return set_freq_table_sorted (policy); }
include/linux/cpufreq.h +3 -0
@@ -144,6 +144,9 @@ struct cpufreq_policy {/* Per policy boost enabled flag. */ bool boost_enabled; +/* Per policy boost supported flag. */ +bool boost_supported; +/* Cached frequency lookup from cpufreq_driver_resolve_freq. */ unsigned int cached_target_freq;unsigned int cached_resolved_idx;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 78/183 cpufreq: acpi: Set policy->boost_supported
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
[ Upstream commit be6b8681a0e4c1477a2c1cb155f7b9188aa88acb ]
With a later commit, the cpufreq core will call the ->set_boost() callback only if the policy supports boost frequency. The boost_supported flag is set by the cpufreq core if policy->freq_table is set and one or more boost frequencies are present.
For other drivers, the flag must be set explicitly.
Stable-dep-of: 3d59224947b0 ("cpufreq: ACPI: Re-sync CPU boost state on system resume")
--- drivers/cpufreq/acpi-cpufreq.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/cpufreq/acpi-cpufreq.c +3 -0
@@ -909,6 +909,9 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)if (perf->states[0 ].core_frequency *1000 != freq_table[0 ].frequency)pr_warn (FW_WARN "P-state 0 is not max freq\n" ); +if (acpi_cpufreq_driver.set_boost) + policy->boost_supported = true; +return result; err_unreg:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 79/183 cpufreq: ACPI: Re-sync CPU boost state on system resume
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
[ Upstream commit 3d59224947b024c9b2aa6e149a1537d449adb828 ]
During CPU hotunplug events (such as those occurring during suspend/resume cycles), platform firmware may modify the CPU boost state.
If boost was disabled prior to CPU removal, it correctly remains disabled upon re-plug. However, if firmware re-enables boost while the CPU is offline, the CPU may return with boost enabled—even if it was originally disabled—once it is hotplugged back in. This leads to inconsistent behavior and violates user or kernel policy expectations.
To maintain consistency, ensure the boost state is re-synchronized with the kernel policy when a CPU is hotplugged back in.
Note: This re-synchronization is not necessary during the initial call to ->init() for a CPU, as the cpufreq core handles it via cpufreq_online(). At that point, acpi_cpufreq_driver.boost_enabled is initialized to the value returned by boost_state(0).
--- drivers/cpufreq/acpi-cpufreq.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
drivers/cpufreq/acpi-cpufreq.c +13 -2
@@ -909,8 +909,19 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)if (perf->states[0 ].core_frequency *1000 != freq_table[0 ].frequency)pr_warn (FW_WARN "P-state 0 is not max freq\n" ); -if (acpi_cpufreq_driver.set_boost) - policy->boost_supported = true; +if (acpi_cpufreq_driver.set_boost) { +if (policy->boost_supported) { +/* +* The firmware may have altered boost state while the +* CPU was offline (for example during a suspend-resume +* cycle). +*/ +if (policy->boost_enabled !=boost_state (cpu)) +set_boost (policy, policy->boost_enabled); + }else { + policy->boost_supported = true; + } + }return result;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 80/183 Bluetooth: hci_conn: Fix not setting conn_timeout for Broadcast Receiver
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 6d0417e4e1cf66fd917f06f0454958362714ef7d ]
Broadcast Receiver requires creating PA sync but the command just generates a status so this makes use of __hci_cmd_sync_status_sk to wait for HCI_EV_LE_PA_SYNC_ESTABLISHED, also because of this chance it is not longer necessary to use a custom method to serialize the process of creating the PA sync since the cmd_work_sync itself ensures only one command would be pending which now awaits for HCI_EV_LE_PA_SYNC_ESTABLISHED before proceeding to next connection.
--- include/net/bluetooth/hci.h | 2 + include/net/bluetooth/hci_core.h | 13 +++-- include/net/bluetooth/hci_sync.h | 2 + net/bluetooth/hci_conn.c | 92 +------------------------------- net/bluetooth/hci_event.c | 6 +-- net/bluetooth/hci_sync.c | 87 ++++++++++++++++++++++++++++-- 6 files changed, 95 insertions(+), 107 deletions(-)
include/net/bluetooth/hci.h +2 -0
@@ -1931,6 +1931,8 @@ struct hci_cp_le_pa_create_sync {__u8 sync_cte_type; } __packed; +#define HCI_OP_LE_PA_CREATE_SYNC_CANCEL 0x2045 +#define HCI_OP_LE_PA_TERM_SYNC 0x2046struct hci_cp_le_pa_term_sync {__le16 handle;
include/net/bluetooth/hci_core.h +6 -7
@@ -1105,10 +1105,8 @@ static inline struct hci_conn *hci_conn_hash_lookup_bis(struct hci_dev *hdev,return NULL ; } -static inline struct hci_conn *hci_conn_hash_lookup_sid (struct hci_dev *hdev, -__u8 sid, -bdaddr_t *dst, -__u8 dst_type) +static inline struct hci_conn * +hci_conn_hash_lookup_create_pa_sync (struct hci_dev *hdev) {struct hci_conn_hash *h = &hdev->conn_hash;struct hci_conn *c;
@@ -1116,8 +1114,10 @@ static inline struct hci_conn *hci_conn_hash_lookup_sid(struct hci_dev *hdev,rcu_read_lock ();list_for_each_entry_rcu (c, &h->list, list) { -if (c->type !=ISO_LINK ||bacmp (&c->dst, dst) || - c->dst_type != dst_type || c->sid != sid) +if (c->type !=ISO_LINK ) +continue ; + +if (!test_bit (HCI_CONN_CREATE_PA_SYNC , &c->flags))continue ;rcu_read_unlock ();
@@ -1516,7 +1516,6 @@ bool hci_setup_sync(struct hci_conn *conn, __u16 handle);void hci_sco_setup (struct hci_conn *conn,__u8 status);bool hci_iso_setup_path (struct hci_conn *conn);int hci_le_create_cis_pending (struct hci_dev *hdev); -int hci_pa_create_sync_pending (struct hci_dev *hdev);int hci_le_big_create_sync_pending (struct hci_dev *hdev);int hci_conn_check_create_cis (struct hci_conn *conn);
include/net/bluetooth/hci_sync.h +2 -0
@@ -185,3 +185,5 @@ 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);int hci_le_conn_update_sync (struct hci_dev *hdev,struct hci_conn *conn,struct hci_conn_params *params); + +int hci_connect_pa_sync (struct hci_dev *hdev,struct hci_conn *conn);
net/bluetooth/hci_conn.c +2 -90
107 lines not on this page · raw message
net/bluetooth/hci_event.c +1 -5
@@ -6371,8 +6371,7 @@ static void hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data,hci_dev_clear_flag (hdev,HCI_PA_SYNC ); - conn =hci_conn_hash_lookup_sid (hdev, ev->sid, &ev->bdaddr, - ev->bdaddr_type); + conn =hci_conn_hash_lookup_create_pa_sync (hdev);if (!conn) { bt_dev_err(hdev, "Unable to find connection for dst %pMR sid 0x%2.2x",
@@ -6411,9 +6410,6 @@ static void hci_le_pa_sync_estabilished_evt(struct hci_dev *hdev, void *data, } unlock: -/* Handle any other pending PA sync command */ -hci_pa_create_sync_pending (hdev); -hci_dev_unlock (hdev); }
net/bluetooth/hci_sync.c +82 -5
101 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 81/183 Bluetooth: hci_conn: Fix not setting timeout for BIG Create Sync
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 024421cf39923927ab2b5fe895d1d922b9abe67f ]
BIG Create Sync requires the command to just generates a status so this makes use of __hci_cmd_sync_status_sk to wait for HCI_EVT_LE_BIG_SYNC_ESTABLISHED, also because of this chance it is not longer necessary to use a custom method to serialize the process of creating the BIG sync since the cmd_work_sync itself ensures only one command would be pending which now awaits for HCI_EVT_LE_BIG_SYNC_ESTABLISHED before proceeding to next connection.
--- include/net/bluetooth/hci.h | 2 +- include/net/bluetooth/hci_core.h | 7 ++- include/net/bluetooth/hci_sync.h | 1 + net/bluetooth/hci_conn.c | 89 ++------------------------------ net/bluetooth/hci_event.c | 9 ++-- net/bluetooth/hci_sync.c | 63 ++++++++++++++++++++++ net/bluetooth/iso.c | 26 +++++----- 7 files changed, 88 insertions(+), 109 deletions(-)
include/net/bluetooth/hci.h +1 -1
@@ -2832,7 +2832,7 @@ struct hci_evt_le_create_big_complete {__le16 bis_handle[]; } __packed; -#define HCI_EVT_LE_BIG_SYNC_ESTABILISHED 0x1d +#define HCI_EVT_LE_BIG_SYNC_ESTABLISHED 0x1dstruct hci_evt_le_big_sync_estabilished {__u8 status;__u8 handle;
include/net/bluetooth/hci_core.h +3 -4
@@ -1516,7 +1516,6 @@ bool hci_setup_sync(struct hci_conn *conn, __u16 handle);void hci_sco_setup (struct hci_conn *conn,__u8 status);bool hci_iso_setup_path (struct hci_conn *conn);int hci_le_create_cis_pending (struct hci_dev *hdev); -int hci_le_big_create_sync_pending (struct hci_dev *hdev);int hci_conn_check_create_cis (struct hci_conn *conn); struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst,
@@ -1557,9 +1556,9 @@ struct hci_conn *hci_connect_bis(struct hci_dev *hdev, bdaddr_t *dst, __u8 data_len, __u8 *data);struct hci_conn *hci_pa_create_sync (struct hci_dev *hdev,bdaddr_t *dst,__u8 dst_type,__u8 sid,struct bt_iso_qos *qos); -int hci_le_big_create_sync (struct hci_dev *hdev,struct hci_conn *hcon, -struct bt_iso_qos *qos, -__u16 sync_handle,__u8 num_bis,__u8 bis[]); +int hci_conn_big_create_sync (struct hci_dev *hdev,struct hci_conn *hcon, +struct bt_iso_qos *qos,__u16 sync_handle, +__u8 num_bis,__u8 bis[]);int hci_conn_check_link_mode (struct hci_conn *conn);int hci_conn_check_secure (struct hci_conn *conn,__u8 sec_level); int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type,
include/net/bluetooth/hci_sync.h +1 -0
@@ -187,3 +187,4 @@ int hci_le_conn_update_sync(struct hci_dev *hdev, struct hci_conn *conn, struct hci_conn_params *params);int hci_connect_pa_sync (struct hci_dev *hdev,struct hci_conn *conn); +int hci_connect_big_sync (struct hci_dev *hdev,struct hci_conn *conn);
net/bluetooth/hci_conn.c +5 -84
103 lines not on this page · raw message
net/bluetooth/hci_event.c +3 -6
@@ -6921,7 +6921,7 @@ static void hci_le_big_sync_established_evt(struct hci_dev *hdev, void *data,bt_dev_dbg (hdev,"status 0x%2.2x" , ev->status); -if (!hci_le_ev_skb_pull (hdev, skb,HCI_EVT_LE_BIG_SYNC_ESTABILISHED , +if (!hci_le_ev_skb_pull (hdev, skb,HCI_EVT_LE_BIG_SYNC_ESTABLISHED ,flex_array_size (ev, bis, ev->num_bis)))return ;
@@ -6992,9 +6992,6 @@ static void hci_le_big_sync_established_evt(struct hci_dev *hdev, void *data, } unlock: -/* Handle any other pending BIG sync command */ -hci_le_big_create_sync_pending (hdev); -hci_dev_unlock (hdev); }
@@ -7116,8 +7113,8 @@ static const struct hci_le_ev { hci_le_create_big_complete_evt, sizeof(struct hci_evt_le_create_big_complete), HCI_MAX_EVENT_SIZE), -/* [0x1d = HCI_EV_LE_BIG_SYNC_ESTABILISHED] */ -HCI_LE_EV_VL (HCI_EVT_LE_BIG_SYNC_ESTABILISHED , +/* [0x1d = HCI_EV_LE_BIG_SYNC_ESTABLISHED] */ +HCI_LE_EV_VL (HCI_EVT_LE_BIG_SYNC_ESTABLISHED ,hci_le_big_sync_established_evt , sizeof(struct hci_evt_le_big_sync_estabilished), HCI_MAX_EVENT_SIZE),
net/bluetooth/hci_sync.c +63 -0
66 lines not on this page · raw message
net/bluetooth/iso.c +12 -14
@@ -1450,14 +1450,13 @@ static void iso_conn_big_sync(struct sock *sk)lock_sock (sk);if (!test_and_set_bit (BT_SK_BIG_SYNC , &iso_pi (sk)->flags)) { - err =hci_le_big_create_sync (hdev,iso_pi (sk)->conn->hcon, - &iso_pi (sk)->qos, -iso_pi (sk)->sync_handle, -iso_pi (sk)->bc_num_bis, -iso_pi (sk)->bc_bis); + err =hci_conn_big_create_sync (hdev,iso_pi (sk)->conn->hcon, + &iso_pi (sk)->qos, +iso_pi (sk)->sync_handle, +iso_pi (sk)->bc_num_bis, +iso_pi (sk)->bc_bis);if (err) -bt_dev_err (hdev,"hci_le_big_create_sync: %d" , - err); +bt_dev_err (hdev,"hci_big_create_sync: %d" , err); }release_sock (sk);
@@ -1906,7 +1905,7 @@ static void iso_conn_ready(struct iso_conn *conn) hcon); }else if (test_bit (HCI_CONN_BIG_SYNC_FAILED , &hcon->flags)) { ev =hci_recv_event_data (hcon->hdev, -HCI_EVT_LE_BIG_SYNC_ESTABILISHED ); +HCI_EVT_LE_BIG_SYNC_ESTABLISHED );/* Get reference to PA sync parent socket, if it exists */ parent = iso_get_sock(&hcon->src, &hcon->dst,
@@ -2097,12 +2096,11 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)if (!test_bit (BT_SK_DEFER_SETUP , &bt_sk (sk)->flags) && !test_and_set_bit (BT_SK_BIG_SYNC , &iso_pi (sk)->flags)) { - err =hci_le_big_create_sync (hdev, - hcon, - &iso_pi (sk)->qos, -iso_pi (sk)->sync_handle, -iso_pi (sk)->bc_num_bis, -iso_pi (sk)->bc_bis); + err =hci_conn_big_create_sync (hdev, hcon, + &iso_pi (sk)->qos, +iso_pi (sk)->sync_handle, +iso_pi (sk)->bc_num_bis, +iso_pi (sk)->bc_bis);if (err) {bt_dev_err (hdev,"hci_le_big_create_sync: %d" , err);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 82/183 Bluetooth: btintel_pcie: Avoid redundant buffer allocation
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kiran K <[email protected]>
[ Upstream commit d1af1f02ef8653dea4573e444136c8331189cd59 ]
Reuse the skb buffer provided by the PCIe driver to pass it onto the stack, instead of copying it to a new skb.
--- drivers/bluetooth/btintel_pcie.c | 33 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 21 deletions(-)
drivers/bluetooth/btintel_pcie.c +12 -21
@@ -595,8 +595,10 @@ static int btintel_pcie_recv_event(struct hci_dev *hdev, struct sk_buff *skb)/* This is a debug event that comes from IML and OP image when it * starts execution. There is no need pass this event to stack. */ -if (skb->data[2 ] ==0x97 ) +if (skb->data[2 ] ==0x97 ) { +hci_recv_diag (hdev, skb);return 0 ; + } }return hci_recv_frame (hdev, skb);
@@ -612,7 +614,6 @@ static int btintel_pcie_recv_frame(struct btintel_pcie_data *data,u8 pkt_type;u16 plen;u32 pcie_pkt_type; -struct sk_buff *new_skb;void *pdata;struct hci_dev *hdev = data->hdev;
@@ -689,24 +690,20 @@ static int btintel_pcie_recv_frame(struct btintel_pcie_data *data,bt_dev_dbg (hdev,"pkt_type: 0x%2.2x len: %u" , pkt_type, plen); - new_skb =bt_skb_alloc (plen,GFP_ATOMIC ); -if (!new_skb) { -bt_dev_err (hdev,"Failed to allocate memory for skb of len: %u" , - skb->len); - ret = -ENOMEM ; - goto exit_error; - } - -hci_skb_pkt_type (new_skb) = pkt_type; -skb_put_data (new_skb, skb->data, plen); +hci_skb_pkt_type (skb) = pkt_type; hdev->stat.byte_rx += plen; +skb_trim (skb, plen);if (pcie_pkt_type ==BTINTEL_PCIE_HCI_EVT_PKT ) - ret =btintel_pcie_recv_event (hdev, new_skb); + ret =btintel_pcie_recv_event (hdev, skb);else - ret =hci_recv_frame (hdev, new_skb); + ret =hci_recv_frame (hdev, skb); + skb =NULL ;/* skb is freed in the callee */ exit_error: +if (skb) +kfree_skb (skb); +if (ret) hdev->stat.err_rx++;
@@ -720,16 +717,10 @@ static void btintel_pcie_rx_work(struct work_struct *work)struct btintel_pcie_data *data =container_of (work, struct btintel_pcie_data, rx_work);struct sk_buff *skb; -int err; -struct hci_dev *hdev = data->hdev;/* Process the sk_buf in queue and send to the HCI layer */ while ((skb =skb_dequeue (&data->rx_skb_q))) { - err =btintel_pcie_recv_frame (data, skb); -if (err) -bt_dev_err (hdev,"Failed to send received frame: %d" , - err); -kfree_skb (skb); +btintel_pcie_recv_frame (data, skb); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 83/183 Bluetooth: btusb: avoid NULL pointer dereference in skb_dequeue()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: En-Wei Wu <[email protected]>
[ Upstream commit 0317b033abcd1d8dd2798f0e2de5e84543d0bd22 ]
A NULL pointer dereference can occur in skb_dequeue() when processing a QCA firmware crash dump on WCN7851 (0489:e0f3).
[ 93.672166] Bluetooth: hci0: ACL memdump size(589824)
[ 93.672475] BUG: kernel NULL pointer dereference, address: 0000000000000008 [ 93.672517] Workqueue: hci0 hci_devcd_rx [bluetooth] [ 93.672598] RIP: 0010:skb_dequeue+0x50/0x80
The issue stems from handle_dump_pkt_qca() returning 0 even when a dump packet is successfully processed. This is because it incorrectly forwards the return value of hci_devcd_init() (which returns 0 on success). As a result, the caller (btusb_recv_acl_qca() or btusb_recv_evt_qca()) assumes the packet was not handled and passes it to hci_recv_frame(), leading to premature kfree() of the skb.
Later, hci_devcd_rx() attempts to dequeue the same skb from the dump queue, resulting in a NULL pointer dereference.
Fix this by:
1. Making handle_dump_pkt_qca() return 0 on success and negative errno on failure, consistent with kernel conventions.
2. Splitting dump packet detection into separate functions for ACL and event packets for better structure and readability.
This ensures dump packets are properly identified and consumed, avoiding double handling and preventing NULL pointer access.
--- drivers/bluetooth/btusb.c | 101 +++++++++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 28 deletions(-)
drivers/bluetooth/btusb.c +73 -28
@@ -3010,22 +3010,16 @@ static void btusb_coredump_qca(struct hci_dev *hdev)bt_dev_err (hdev,"%s: triggle crash failed (%d)" , __func__, err); } -/* -* ==0: not a dump pkt. -* < 0: fails to handle a dump pkt -* > 0: otherwise. -*/ +/* Return: 0 on success, negative errno on failure. */ static int handle_dump_pkt_qca (struct hci_dev *hdev,struct sk_buff *skb) { -int ret =1 ; +int ret =0 ;u8 pkt_type;u8 *sk_ptr;unsigned int sk_len;u16 seqno;u32 dump_size; -struct hci_event_hdr *event_hdr; -struct hci_acl_hdr *acl_hdr;struct qca_dump_hdr *dump_hdr;struct btusb_data *btdata =hci_get_drvdata (hdev);struct usb_device *udev = btdata->udev;
@@ -3035,30 +3029,14 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb) sk_len = skb->len;if (pkt_type ==HCI_ACLDATA_PKT ) { - acl_hdr =hci_acl_hdr (skb); -if (le16_to_cpu (acl_hdr->handle) !=QCA_MEMDUMP_ACL_HANDLE ) -return 0 ; sk_ptr +=HCI_ACL_HDR_SIZE ; sk_len -=HCI_ACL_HDR_SIZE ; - event_hdr = (struct hci_event_hdr *)sk_ptr; - }else { - event_hdr =hci_event_hdr (skb); } -if ((event_hdr->evt !=HCI_VENDOR_PKT ) - || (event_hdr->plen != (sk_len -HCI_EVENT_HDR_SIZE ))) -return 0 ; - sk_ptr +=HCI_EVENT_HDR_SIZE ; sk_len -=HCI_EVENT_HDR_SIZE ; dump_hdr = (struct qca_dump_hdr *)sk_ptr; -if ((sk_len < offsetof(struct qca_dump_hdr , data)) - || (dump_hdr->vse_class !=QCA_MEMDUMP_VSE_CLASS ) - || (dump_hdr->msg_type !=QCA_MEMDUMP_MSG_TYPE )) -return 0 ; - -/*it is dump pkt now*/ seqno =le16_to_cpu (dump_hdr->seqno);if (seqno ==0 ) {set_bit (BTUSB_HW_SSR_ACTIVE , &btdata->flags);
@@ -3132,17 +3110,84 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb)return ret; } +/* Return: true if the ACL packet is a dump packet, false otherwise. */ +static bool acl_pkt_is_dump_qca (struct hci_dev *hdev,struct sk_buff *skb) +{ +u8 *sk_ptr; +unsigned int sk_len; + +struct hci_event_hdr *event_hdr; +struct hci_acl_hdr *acl_hdr; +struct qca_dump_hdr *dump_hdr; + + sk_ptr = skb->data; + sk_len = skb->len; + + acl_hdr =hci_acl_hdr (skb); +if (le16_to_cpu (acl_hdr->handle) !=QCA_MEMDUMP_ACL_HANDLE ) +return false; + + sk_ptr +=HCI_ACL_HDR_SIZE ; + sk_len -=HCI_ACL_HDR_SIZE ; + event_hdr = (struct hci_event_hdr *)sk_ptr; + +if ((event_hdr->evt !=HCI_VENDOR_PKT ) || + (event_hdr->plen != (sk_len -HCI_EVENT_HDR_SIZE ))) +return false; + + sk_ptr +=HCI_EVENT_HDR_SIZE ; + sk_len -=HCI_EVENT_HDR_SIZE ; + + dump_hdr = (struct qca_dump_hdr *)sk_ptr; +if ((sk_len < offsetof(struct qca_dump_hdr , data)) || + (dump_hdr->vse_class !=QCA_MEMDUMP_VSE_CLASS ) || + (dump_hdr->msg_type !=QCA_MEMDUMP_MSG_TYPE )) +return false; + +return true; +} + +/* Return: true if the event packet is a dump packet, false otherwise. */ +static bool evt_pkt_is_dump_qca (struct hci_dev *hdev,struct sk_buff *skb) +{ +u8 *sk_ptr; +unsigned int sk_len; + +struct hci_event_hdr *event_hdr; +struct qca_dump_hdr *dump_hdr; + + sk_ptr = skb->data; + sk_len = skb->len; + + event_hdr =hci_event_hdr (skb); + +if ((event_hdr->evt !=HCI_VENDOR_PKT ) + || (event_hdr->plen != (sk_len -HCI_EVENT_HDR_SIZE ))) +return false; + + sk_ptr +=HCI_EVENT_HDR_SIZE ; + sk_len -=HCI_EVENT_HDR_SIZE ; + + dump_hdr = (struct qca_dump_hdr *)sk_ptr; +if ((sk_len < offsetof(struct qca_dump_hdr , data)) || + (dump_hdr->vse_class !=QCA_MEMDUMP_VSE_CLASS ) || + (dump_hdr->msg_type !=QCA_MEMDUMP_MSG_TYPE )) +return false; + +return true; +} +static int btusb_recv_acl_qca (struct hci_dev *hdev,struct sk_buff *skb) { -if (handle_dump_pkt_qca (hdev, skb)) -return 0 ; +if (acl_pkt_is_dump_qca (hdev, skb)) +return handle_dump_pkt_qca (hdev, skb);return hci_recv_frame (hdev, skb); }static int btusb_recv_evt_qca (struct hci_dev *hdev,struct sk_buff *skb) { -if (handle_dump_pkt_qca (hdev, skb)) -return 0 ; +if (evt_pkt_is_dump_qca (hdev, skb)) +return handle_dump_pkt_qca (hdev, skb);return hci_recv_frame (hdev, skb); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 84/183 Bluetooth: btintel_pcie: Add additional to checks to clear TX/RX paths
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kiran K <[email protected]>
[ Upstream commit 1c7664957e4edb234c69de2db4be1f740d2df564 ]
Due to a hardware issue, there is a possibility that the driver may miss an MSIx interrupt on the RX/TX data path. Since the TX and RX paths are independent, when a TX MSIx interrupt occurs, the driver can check the RX queue for any pending data and process it if present. The same approach applies to the RX path.
--- drivers/bluetooth/btintel_pcie.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-)
drivers/bluetooth/btintel_pcie.c +19 -5
@@ -773,10 +773,8 @@ static void btintel_pcie_msix_rx_handle(struct btintel_pcie_data *data)bt_dev_dbg (hdev,"RXQ: cr_hia: %u cr_tia: %u" , cr_hia, cr_tia);/* Check CR_TIA and CR_HIA for change */ -if (cr_tia == cr_hia) { -bt_dev_warn (hdev,"RXQ: no new CD found" ); +if (cr_tia == cr_hia)return ; - } rxq = &data->rxq;
@@ -812,6 +810,16 @@ static irqreturn_t btintel_pcie_msix_isr(int irq, void *data)return IRQ_WAKE_THREAD ; } +static inline bool btintel_pcie_is_rxq_empty (struct btintel_pcie_data *data) +{ +return data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM ] == data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM ]; +} + +static inline bool btintel_pcie_is_txackq_empty (struct btintel_pcie_data *data) +{ +return data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM ] == data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM ]; +} +static irqreturn_t btintel_pcie_irq_msix_handler (int irq,void *dev_id) {struct msix_entry *entry = dev_id;
@@ -839,12 +847,18 @@ static irqreturn_t btintel_pcie_irq_msix_handler(int irq, void *dev_id)btintel_pcie_msix_gp0_handler (data);/* For TX */ -if (intr_fh &BTINTEL_PCIE_MSIX_FH_INT_CAUSES_0 ) +if (intr_fh &BTINTEL_PCIE_MSIX_FH_INT_CAUSES_0 ) {btintel_pcie_msix_tx_handle (data); +if (!btintel_pcie_is_rxq_empty (data)) +btintel_pcie_msix_rx_handle (data); + }/* For RX */ -if (intr_fh &BTINTEL_PCIE_MSIX_FH_INT_CAUSES_1 ) +if (intr_fh &BTINTEL_PCIE_MSIX_FH_INT_CAUSES_1 ) {btintel_pcie_msix_rx_handle (data); +if (!btintel_pcie_is_txackq_empty (data)) +btintel_pcie_msix_tx_handle (data); + }/* * Before sending the interrupt the HW disables it to prevent a nested
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 85/183 Bluetooth: L2CAP: copy RX timestamp to new fragments
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pauli Virtanen <[email protected]>
[ Upstream commit 3908feb1bd7f319a10e18d84369a48163264cc7d ]
Copy timestamp too when allocating new skb for received fragment. Fixes missing RX timestamps with fragmentation.
--- net/bluetooth/l2cap_core.c | 3 +++ 1 file changed, 3 insertions(+)
net/bluetooth/l2cap_core.c +3 -0
@@ -7380,6 +7380,9 @@ static int l2cap_recv_frag(struct l2cap_conn *conn, struct sk_buff *skb,return -ENOMEM ;/* Init rx_len */ conn->rx_len = len; + +skb_set_delivery_time (conn->rx_skb, skb->tstamp, + skb->tstamp_type); }/* Copy as much as the rx_skb can hold */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 86/183 net: mscc: ocelot: delete PVID VLAN when readding it as non-PVID
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit 5ec6d7d737a491256cd37e33910f7ac1978db591 ]
The following set of commands:
ip link add br0 type bridge vlan_filtering 1 # vlan_default_pvid 1 is implicit ip link set swp0 master br0
bridge vlan add dev swp0 vid 1
should result in the dropping of untagged and 802.1p-tagged traffic, but we see that it continues to be accepted. Whereas, had we deleted VID 1 instead, the aforementioned dropping would have worked
This is because the ANA_PORT_DROP_CFG update logic doesn't run, because ocelot_vlan_add() only calls ocelot_port_set_pvid() if the new VLAN has the BRIDGE_VLAN_INFO_PVID flag.
Similar to other drivers like mt7530_port_vlan_add() which handle this case correctly, we need to test whether the VLAN we're changing used to have the BRIDGE_VLAN_INFO_PVID flag, but lost it now. That amounts to a PVID deletion and should be treated as such.
Regarding blame attribution: this never worked properly since the introduction of bridge VLAN filtering in commit 7142529f1688 ("net:
mscc: ocelot: add VLAN filtering"). However, there was a significant paradigm shift which aligned the ANA_PORT_DROP_CFG register with the PVID concept rather than with the native VLAN concept, and that change wasn't targeted for 'stable'. Realistically, that is as far as this fix needs to be propagated to.
--- drivers/net/ethernet/mscc/ocelot.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/ethernet/mscc/ocelot.c +6 -0
@@ -830,6 +830,7 @@ EXPORT_SYMBOL(ocelot_vlan_prepare);int ocelot_vlan_add (struct ocelot *ocelot,int port,u16 vid,bool pvid,bool untagged) { +struct ocelot_port *ocelot_port = ocelot->ports[port];int err;/* Ignore VID 0 added to our RX filter by the 8021q module, since
@@ -849,6 +850,11 @@ int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid, ocelot_bridge_vlan_find(ocelot, vid));if (err)return err; + }else if (ocelot_port->pvid_vlan && +ocelot_bridge_vlan_find (ocelot, vid) == ocelot_port->pvid_vlan) { + err =ocelot_port_set_pvid (ocelot, port,NULL ); +if (err) +return err; }/* Untagged egress vlan clasification */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 87/183 octeon_ep_vf: Resolve netdevice usage count issue
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sathesh B Edara <[email protected]>
[ Upstream commit 8548c84c004be3da4ffbe35ed0589041a4050c03 ]
The netdevice usage count increases during transmit queue timeouts because netdev_hold is called in ndo_tx_timeout, scheduling a task to reinitialize the card. Although netdev_put is called at the end of the scheduled work, rtnl_unlock checks the reference count during cleanup. This could cause issues if transmit timeout is called on multiple queues.
--- drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_main.c +3 -1
@@ -835,7 +835,9 @@ static void octep_vf_tx_timeout(struct net_device *netdev, unsigned int txqueue)struct octep_vf_device *oct =netdev_priv (netdev);netdev_hold (netdev,NULL ,GFP_ATOMIC ); -schedule_work (&oct->tx_timeout_task); +if (!schedule_work (&oct->tx_timeout_task)) +netdev_put (netdev,NULL ); + }static int octep_vf_set_mac (struct net_device *netdev,void *p)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 88/183 bnxt_en: improve TX timestamping FIFO configuration
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vadim Fedorenko <[email protected]>
[ Upstream commit 8f7ae5a85137b913cb97e2d24409d36548d0bab1 ]
Reconfiguration of netdev may trigger close/open procedure which can break FIFO status by adjusting the amount of empty slots for TX timestamps. But it is not really needed because timestamps for the packets sent over the wire still can be retrieved. On the other side, during netdev close procedure any skbs waiting for TX timestamps can be leaked because there is no cleaning procedure called. Free skbs waiting for TX timestamps when closing netdev.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 ++-- drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 29 ++++++++++++++----- drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h | 1 + 3 files changed, 25 insertions(+), 10 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +3 -2
@@ -3403,6 +3403,9 @@ static void bnxt_free_tx_skbs(struct bnxt *bp) }netdev_tx_reset_queue (netdev_get_tx_queue (bp->dev, i)); } + +if (bp->ptp_cfg && !(bp->fw_cap &BNXT_FW_CAP_TX_TS_CMP )) +bnxt_ptp_free_txts_skbs (bp->ptp_cfg); }static void bnxt_free_one_rx_ring (struct bnxt *bp,struct bnxt_rx_ring_info *rxr)
@@ -12570,8 +12573,6 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)/* VF-reps may need to be re-opened after the PF is re-opened */ if (BNXT_PF (bp))bnxt_vf_reps_open (bp); -if (bp->ptp_cfg && !(bp->fw_cap &BNXT_FW_CAP_TX_TS_CMP )) -WRITE_ONCE (bp->ptp_cfg->tx_avail,BNXT_MAX_TX_TS );bnxt_ptp_init_rtc (bp, true);bnxt_ptp_cfg_tstamp_filters (bp);if (BNXT_SUPPORTS_MULTI_RSS_CTX (bp))
drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c +21 -8
@@ -794,6 +794,27 @@ static long bnxt_ptp_ts_aux_work(struct ptp_clock_info *ptp_info)return HZ ; } +void bnxt_ptp_free_txts_skbs (struct bnxt_ptp_cfg *ptp) +{ +struct bnxt_ptp_tx_req *txts_req; +u16 cons = ptp->txts_cons; + +/* make sure ptp aux worker finished with +* possible BNXT_STATE_OPEN set +*/ +ptp_cancel_worker_sync (ptp->ptp_clock); + + ptp->tx_avail =BNXT_MAX_TX_TS ; +while (cons != ptp->txts_prod) { + txts_req = &ptp->txts_req[cons]; +if (!IS_ERR_OR_NULL (txts_req->tx_skb)) +dev_kfree_skb_any (txts_req->tx_skb); + cons =NEXT_TXTS (cons); + } + ptp->txts_cons = cons; +ptp_schedule_worker (ptp->ptp_clock,0 ); +} +int bnxt_ptp_get_txts_prod (struct bnxt_ptp_cfg *ptp,u16 *prod) {spin_lock_bh (&ptp->ptp_tx_lock);
@@ -1105,7 +1126,6 @@ int bnxt_ptp_init(struct bnxt *bp)void bnxt_ptp_clear (struct bnxt *bp) {struct bnxt_ptp_cfg *ptp = bp->ptp_cfg; -int i;if (!ptp)return ;
@@ -1117,12 +1137,5 @@ void bnxt_ptp_clear(struct bnxt *bp)kfree (ptp->ptp_info.pin_config); ptp->ptp_info.pin_config =NULL ; -for (i =0 ; i <BNXT_MAX_TX_TS ; i++) { -if (ptp->txts_req[i].tx_skb) { -dev_kfree_skb_any (ptp->txts_req[i].tx_skb); - ptp->txts_req[i].tx_skb =NULL ; - } - } -bnxt_unmap_ptp_regs (bp); }
drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h +1 -0
@@ -162,6 +162,7 @@ int bnxt_ptp_cfg_tstamp_filters(struct bnxt *bp);void bnxt_ptp_reapply_pps (struct bnxt *bp);int bnxt_hwtstamp_set (struct net_device *dev,struct ifreq *ifr);int bnxt_hwtstamp_get (struct net_device *dev,struct ifreq *ifr); +void bnxt_ptp_free_txts_skbs (struct bnxt_ptp_cfg *ptp);int bnxt_ptp_get_txts_prod (struct bnxt_ptp_cfg *ptp,u16 *prod);void bnxt_get_tx_ts_p5 (struct bnxt *bp,struct sk_buff *skb,u16 prod);int bnxt_get_rx_ts_p5 (struct bnxt *bp,u64 *ts,u32 pkt_ts);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 89/183 rtase: Modify the condition used to detect overflow in rtase_calc_time_mitigation
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Lai <[email protected]>
[ Upstream commit 68f9d8974b545668e1be2422240b25a92e304b14 ]
Fix the following compile error reported by the kernel test robot by modifying the condition used to detect overflow in rtase_calc_time_mitigation.
In file included from include/linux/mdio.h:10:0,
from drivers/net/ethernet/realtek/rtase/rtase_main.c:58:
In function 'u16_encode_bits',
inlined from 'rtase_calc_time_mitigation.constprop' at drivers/net/ ethernet/realtek/rtase/rtase_main.c:1915:13,
inlined from 'rtase_init_software_variable.isra.41' at drivers/net/ ethernet/realtek/rtase/rtase_main.c:1961:13,
inlined from 'rtase_init_one' at drivers/net/ethernet/realtek/ rtase/rtase_main.c:2111:2:
Quoted 1 line
Quoted 1 line
include/linux/bitfield.h:178:3: error: call to '__field_overflow'
declared with attribute error: value doesn't fit into mask
__field_overflow(); \
^~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:198:2: note: in expansion of macro '____MAKE_OP'
____MAKE_OP(u##size,u##size,,)
^~~~~~~~~~~
include/linux/bitfield.h:200:1: note: in expansion of macro '__MAKE_OP'
__MAKE_OP(16)
^~~~~~~~~
--- drivers/net/ethernet/realtek/rtase/rtase_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/realtek/rtase/rtase_main.c +2 -2
@@ -1925,8 +1925,8 @@ static u16 rtase_calc_time_mitigation(u32 time_us) time_us =min_t (int, time_us,RTASE_MITI_MAX_TIME ); - msb =fls (time_us); -if (msb >=RTASE_MITI_COUNT_BIT_NUM ) { +if (time_us >RTASE_MITI_TIME_COUNT_MASK ) { + msb =fls (time_us); time_unit = msb -RTASE_MITI_COUNT_BIT_NUM ; time_count = time_us >> (msb -RTASE_MITI_COUNT_BIT_NUM ); }else {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 90/183 net: ethernet: mtk-star-emac: fix spinlock recursion issues on rx/tx poll
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Louis-Alexis Eyraud <[email protected]>
[ Upstream commit 6fe0866014486736cc3ba1c6fd4606d3dbe55c9c ]
Use spin_lock_irqsave and spin_unlock_irqrestore instead of spin_lock and spin_unlock in mtk_star_emac driver to avoid spinlock recursion occurrence that can happen when enabling the DMA interrupts again in rx/tx poll.
```
BUG: spinlock recursion on CPU#0, swapper/0/0
lock: 0xffff00000db9cf20, .magic: dead4ead, .owner: swapper/0/0,
.owner_cpu: 0
CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted
6.15.0-rc2-next-20250417-00001-gf6a27738686c-dirty #28 PREEMPT
Hardware name: MediaTek MT8365 Open Platform EVK (DT)
Call trace:
show_stack+0x18/0x24 (C)
dump_stack_lvl+0x60/0x80
dump_stack+0x18/0x24
spin_dump+0x78/0x88
do_raw_spin_lock+0x11c/0x120
_raw_spin_lock+0x20/0x2c
mtk_star_handle_irq+0xc0/0x22c [mtk_star_emac]
__handle_irq_event_percpu+0x48/0x140
handle_irq_event+0x4c/0xb0
handle_fasteoi_irq+0xa0/0x1bc
handle_irq_desc+0x34/0x58
generic_handle_domain_irq+0x1c/0x28
gic_handle_irq+0x4c/0x120
do_interrupt_handler+0x50/0x84
el1_interrupt+0x34/0x68
el1h_64_irq_handler+0x18/0x24
el1h_64_irq+0x6c/0x70
regmap_mmio_read32le+0xc/0x20 (P)
_regmap_bus_reg_read+0x6c/0xac
_regmap_read+0x60/0xdc
regmap_read+0x4c/0x80
mtk_star_rx_poll+0x2f4/0x39c [mtk_star_emac]
__napi_poll+0x38/0x188
net_rx_action+0x164/0x2c0
handle_softirqs+0x100/0x244
__do_softirq+0x14/0x20
____do_softirq+0x10/0x20
call_on_irq_stack+0x24/0x64
do_softirq_own_stack+0x1c/0x40
__irq_exit_rcu+0xd4/0x10c
irq_exit_rcu+0x10/0x1c
el1_interrupt+0x38/0x68
el1h_64_irq_handler+0x18/0x24
el1h_64_irq+0x6c/0x70
cpuidle_enter_state+0xac/0x320 (P)
cpuidle_enter+0x38/0x50
do_idle+0x1e4/0x260
cpu_startup_entry+0x34/0x3c
rest_init+0xdc/0xe0
console_on_rootfs+0x0/0x6c
__primary_switched+0x88/0x90
```--- drivers/net/ethernet/mediatek/mtk_star_emac.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/net/ethernet/mediatek/mtk_star_emac.c +6 -4
@@ -1163,6 +1163,7 @@ static int mtk_star_tx_poll(struct napi_struct *napi, int budget)struct net_device *ndev = priv->ndev;unsigned int head = ring->head;unsigned int entry = ring->tail; +unsigned long flags;while (entry != head && count < (MTK_STAR_RING_NUM_DESCS -1 )) { ret =mtk_star_tx_complete_one (priv);
@@ -1182,9 +1183,9 @@ static int mtk_star_tx_poll(struct napi_struct *napi, int budget)netif_wake_queue (ndev);if (napi_complete (napi)) { -spin_lock (&priv->lock); +spin_lock_irqsave (&priv->lock, flags);mtk_star_enable_dma_irq (priv, false, true); -spin_unlock (&priv->lock); +spin_unlock_irqrestore (&priv->lock, flags); }return 0 ;
@@ -1341,6 +1342,7 @@ static int mtk_star_rx(struct mtk_star_priv *priv, int budget)static int mtk_star_rx_poll (struct napi_struct *napi,int budget) {struct mtk_star_priv *priv; +unsigned long flags;int work_done =0 ; priv = container_of(napi, struct mtk_star_priv, rx_napi);
@@ -1348,9 +1350,9 @@ static int mtk_star_rx_poll(struct napi_struct *napi, int budget) work_done =mtk_star_rx (priv, budget);if (work_done < budget) {napi_complete_done (napi, work_done); -spin_lock (&priv->lock); +spin_lock_irqsave (&priv->lock, flags);mtk_star_enable_dma_irq (priv, true, false); -spin_unlock (&priv->lock); +spin_unlock_irqrestore (&priv->lock, flags); }return work_done;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 91/183 net: ethernet: mtk-star-emac: rearm interrupts in rx_poll only when advised
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Louis-Alexis Eyraud <[email protected]>
[ Upstream commit e54b4db35e201a9173da9cb7abc8377e12abaf87 ]
In mtk_star_rx_poll function, on event processing completion, the mtk_star_emac driver calls napi_complete_done but ignores its return code and enable RX DMA interrupts inconditionally. This return code gives the info if a device should avoid rearming its interrupts or not, so fix this behaviour by taking it into account.
--- drivers/net/ethernet/mediatek/mtk_star_emac.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/mediatek/mtk_star_emac.c +1 -2
@@ -1348,8 +1348,7 @@ static int mtk_star_rx_poll(struct napi_struct *napi, int budget) priv = container_of(napi, struct mtk_star_priv, rx_napi); work_done =mtk_star_rx (priv, budget); -if (work_done < budget) { -napi_complete_done (napi, work_done); +if (work_done < budget &&napi_complete_done (napi, work_done)) {spin_lock_irqsave (&priv->lock, flags);mtk_star_enable_dma_irq (priv, true, false);spin_unlock_irqrestore (&priv->lock, flags);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 92/183 net: ethernet: mtk_eth_soc: sync mtk_clks_source_name array
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Golle <[email protected]>
[ Upstream commit 8c47d5753a119f1c986bc3ed92e9178d2624e1e8 ]
When removing the clock bits for clocks which aren't used by the Ethernet driver their names should also have been removed from the mtk_clks_source_name array.
Remove them now as enum mtk_clks_map needs to match the mtk_clks_source_name array so the driver can make sure that all required clocks are present and correctly name missing clocks.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +0 -4
@@ -269,12 +269,8 @@ static const char * const mtk_clks_source_name[] = {"ethwarp_wocpu2" ,"ethwarp_wocpu1" ,"ethwarp_wocpu0" , -"top_usxgmii0_sel" , -"top_usxgmii1_sel" ,"top_sgm0_sel" ,"top_sgm1_sel" , -"top_xfi_phy0_xtal_sel" , -"top_xfi_phy1_xtal_sel" ,"top_eth_gmii_sel" ,"top_eth_refck_50m_sel" , "top_eth_sys_200m_sel",
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 93/183 pds_core: make pdsc_auxbus_dev_del() void
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shannon Nelson <[email protected]>
[ Upstream commit e8562da829432d04a0de1830146984c89844f35e ]
Since there really is no useful return, advertising a return value is rather misleading. Make pdsc_auxbus_dev_del() a void function.
Stable-dep-of: dfd76010f8e8 ("pds_core: remove write-after-free of client_id")
--- drivers/net/ethernet/amd/pds_core/auxbus.c | 7 +------ drivers/net/ethernet/amd/pds_core/core.h | 2 +- drivers/net/ethernet/amd/pds_core/devlink.c | 6 ++++-- 3 files changed, 6 insertions(+), 9 deletions(-)
drivers/net/ethernet/amd/pds_core/auxbus.c +1 -6
@@ -172,13 +172,9 @@ static struct pds_auxiliary_dev *pdsc_auxbus_dev_register(struct pdsc *cf,return padev; } -int pdsc_auxbus_dev_del (struct pdsc *cf,struct pdsc *pf) +void pdsc_auxbus_dev_del (struct pdsc *cf,struct pdsc *pf) {struct pds_auxiliary_dev *padev; -int err =0 ; - -if (!cf) -return -ENODEV ;mutex_lock (&pf->config_lock);
@@ -192,7 +188,6 @@ int pdsc_auxbus_dev_del(struct pdsc *cf, struct pdsc *pf) pf->vfs[cf->vf_id].padev =NULL ;mutex_unlock (&pf->config_lock); -return err; }int pdsc_auxbus_dev_add (struct pdsc *cf,struct pdsc *pf)
drivers/net/ethernet/amd/pds_core/core.h +1 -1
@@ -304,7 +304,7 @@ int pdsc_register_notify(struct notifier_block *nb);void pdsc_unregister_notify (struct notifier_block *nb);void pdsc_notify (unsigned long event,void *data);int pdsc_auxbus_dev_add (struct pdsc *cf,struct pdsc *pf); -int pdsc_auxbus_dev_del (struct pdsc *cf,struct pdsc *pf); +void pdsc_auxbus_dev_del (struct pdsc *cf,struct pdsc *pf);void pdsc_process_adminq (struct pdsc_qcq *qcq);void pdsc_work_thread (struct work_struct *work);
drivers/net/ethernet/amd/pds_core/devlink.c +4 -2
@@ -56,8 +56,10 @@ int pdsc_dl_enable_set(struct devlink *dl, u32 id,for (vf_id =0 ; vf_id < pdsc->num_vfs; vf_id++) {struct pdsc *vf = pdsc->vfs[vf_id].vf; - err = ctx->val.vbool ?pdsc_auxbus_dev_add (vf, pdsc) : -pdsc_auxbus_dev_del (vf, pdsc); +if (ctx->val.vbool) + err =pdsc_auxbus_dev_add (vf, pdsc); +else +pdsc_auxbus_dev_del (vf, pdsc); }return err;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 94/183 pds_core: specify auxiliary_device to be created
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shannon Nelson <[email protected]>
[ Upstream commit b699bdc720c0255d1bb76cecba7382c1f2107af5 ]
In preparation for adding a new auxiliary_device for the PF, make the vif type an argument to pdsc_auxbus_dev_add(). Pass in the address of the padev pointer so that the caller can specify where to save it and keep the mutex usage within the function.
Stable-dep-of: dfd76010f8e8 ("pds_core: remove write-after-free of client_id")
--- drivers/net/ethernet/amd/pds_core/auxbus.c | 37 ++++++++++----------- drivers/net/ethernet/amd/pds_core/core.h | 7 ++-- drivers/net/ethernet/amd/pds_core/devlink.c | 5 +-- drivers/net/ethernet/amd/pds_core/main.c | 11 +++--- 4 files changed, 33 insertions(+), 27 deletions(-)
drivers/net/ethernet/amd/pds_core/auxbus.c +18 -19
@@ -172,29 +172,32 @@ static struct pds_auxiliary_dev *pdsc_auxbus_dev_register(struct pdsc *cf,return padev; } -void pdsc_auxbus_dev_del (struct pdsc *cf,struct pdsc *pf) +void pdsc_auxbus_dev_del (struct pdsc *cf,struct pdsc *pf, +struct pds_auxiliary_dev **pd_ptr) {struct pds_auxiliary_dev *padev; +if (!*pd_ptr) +return ; +mutex_lock (&pf->config_lock); - padev = pf->vfs[cf->vf_id].padev; -if (padev) { -pds_client_unregister (pf, padev->client_id); -auxiliary_device_delete (&padev->aux_dev); -auxiliary_device_uninit (&padev->aux_dev); - padev->client_id =0 ; - } - pf->vfs[cf->vf_id].padev =NULL ; + padev = *pd_ptr; +pds_client_unregister (pf, padev->client_id); +auxiliary_device_delete (&padev->aux_dev); +auxiliary_device_uninit (&padev->aux_dev); + padev->client_id =0 ; + *pd_ptr =NULL ;mutex_unlock (&pf->config_lock); } -int pdsc_auxbus_dev_add (struct pdsc *cf,struct pdsc *pf) +int pdsc_auxbus_dev_add (struct pdsc *cf,struct pdsc *pf, +enum pds_core_vif_types vt, +struct pds_auxiliary_dev **pd_ptr) {struct pds_auxiliary_dev *padev;char devname[PDS_DEVNAME_LEN ]; -enum pds_core_vif_types vt;unsigned long mask;u16 vt_support;int client_id;
@@ -203,6 +206,9 @@ int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf)if (!cf)return -ENODEV ; +if (vt >=PDS_DEV_TYPE_MAX ) +return -EINVAL ; +mutex_lock (&pf->config_lock); mask = BIT_ULL(PDSC_S_FW_DEAD) |
@@ -214,17 +220,10 @@ int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf) goto out_unlock; } -/* We only support vDPA so far, so it is the only one to -* be verified that it is available in the Core device and -* enabled in the devlink param. In the future this might -* become a loop for several VIF types. -*/ -/* Verify that the type is supported and enabled. It is not * an error if there is no auxbus device support for this * VF, it just means something else needs to happen with it. */ - vt =PDS_DEV_TYPE_VDPA ; vt_support = !!le16_to_cpu (pf->dev_ident.vif_types[vt]); if (!(vt_support && pf->viftype_status[vt].supported &&
@@ -250,7 +249,7 @@ int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf) err =PTR_ERR (padev); goto out_unlock; } - pf->vfs[cf->vf_id].padev = padev; + *pd_ptr = padev; out_unlock:mutex_unlock (&pf->config_lock);
drivers/net/ethernet/amd/pds_core/core.h +5 -2
@@ -303,8 +303,11 @@ void pdsc_health_thread(struct work_struct *work);int pdsc_register_notify (struct notifier_block *nb);void pdsc_unregister_notify (struct notifier_block *nb);void pdsc_notify (unsigned long event,void *data); -int pdsc_auxbus_dev_add (struct pdsc *cf,struct pdsc *pf); -void pdsc_auxbus_dev_del (struct pdsc *cf,struct pdsc *pf); +int pdsc_auxbus_dev_add (struct pdsc *cf,struct pdsc *pf, +enum pds_core_vif_types vt, +struct pds_auxiliary_dev **pd_ptr); +void pdsc_auxbus_dev_del (struct pdsc *cf,struct pdsc *pf, +struct pds_auxiliary_dev **pd_ptr);void pdsc_process_adminq (struct pdsc_qcq *qcq);void pdsc_work_thread (struct work_struct *work);
drivers/net/ethernet/amd/pds_core/devlink.c +3 -2
@@ -57,9 +57,10 @@ int pdsc_dl_enable_set(struct devlink *dl, u32 id,struct pdsc *vf = pdsc->vfs[vf_id].vf;if (ctx->val.vbool) - err =pdsc_auxbus_dev_add (vf, pdsc); + err =pdsc_auxbus_dev_add (vf, pdsc, vt_entry->vif_id, + &pdsc->vfs[vf_id].padev);else -pdsc_auxbus_dev_del (vf, pdsc); +pdsc_auxbus_dev_del (vf, pdsc, &pdsc->vfs[vf_id].padev); }return err;
drivers/net/ethernet/amd/pds_core/main.c +7 -4
@@ -190,7 +190,8 @@ static int pdsc_init_vf(struct pdsc *vf)devl_unlock (dl); pf->vfs[vf->vf_id].vf = vf; - err =pdsc_auxbus_dev_add (vf, pf); + err =pdsc_auxbus_dev_add (vf, pf,PDS_DEV_TYPE_VDPA , + &pf->vfs[vf->vf_id].padev);if (err) {devl_lock (dl);devl_unregister (dl);
@@ -417,7 +418,7 @@ static void pdsc_remove(struct pci_dev *pdev) pf =pdsc_get_pf_struct (pdsc->pdev);if (!IS_ERR (pf)) { -pdsc_auxbus_dev_del (pdsc, pf); +pdsc_auxbus_dev_del (pdsc, pf, &pf->vfs[pdsc->vf_id].padev); pf->vfs[pdsc->vf_id].vf =NULL ; } }else {
@@ -482,7 +483,8 @@ static void pdsc_reset_prepare(struct pci_dev *pdev) pf =pdsc_get_pf_struct (pdsc->pdev);if (!IS_ERR (pf)) -pdsc_auxbus_dev_del (pdsc, pf); +pdsc_auxbus_dev_del (pdsc, pf, + &pf->vfs[pdsc->vf_id].padev); }pdsc_unmap_bars (pdsc);
@@ -527,7 +529,8 @@ static void pdsc_reset_done(struct pci_dev *pdev) pf =pdsc_get_pf_struct (pdsc->pdev);if (!IS_ERR (pf)) -pdsc_auxbus_dev_add (pdsc, pf); +pdsc_auxbus_dev_add (pdsc, pf,PDS_DEV_TYPE_VDPA , + &pf->vfs[pdsc->vf_id].padev); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 95/183 pds_core: remove write-after-free of client_id
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shannon Nelson <[email protected]>
[ Upstream commit dfd76010f8e821b66116dec3c7d90dd2403d1396 ]
A use-after-free error popped up in stress testing:
[Mon Apr 21 21:21:33 2025] BUG: KFENCE: use-after-free write in pdsc_auxbus_dev_del+0xef/0x160 [pds_core] [Mon Apr 21 21:21:33 2025] Use-after-free write at 0x000000007013ecd1 (in kfence-#47): [Mon Apr 21 21:21:33 2025] pdsc_auxbus_dev_del+0xef/0x160 [pds_core] [Mon Apr 21 21:21:33 2025] pdsc_remove+0xc0/0x1b0 [pds_core] [Mon Apr 21 21:21:33 2025] pci_device_remove+0x24/0x70 [Mon Apr 21 21:21:33 2025] device_release_driver_internal+0x11f/0x180 [Mon Apr 21 21:21:33 2025] driver_detach+0x45/0x80 [Mon Apr 21 21:21:33 2025] bus_remove_driver+0x83/0xe0 [Mon Apr 21 21:21:33 2025] pci_unregister_driver+0x1a/0x80
The actual device uninit usually happens on a separate thread scheduled after this code runs, but there is no guarantee of order of thread execution, so this could be a problem. There's no actual need to clear the client_id at this point, so simply remove the offending code.
--- drivers/net/ethernet/amd/pds_core/auxbus.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/ethernet/amd/pds_core/auxbus.c +0 -1
@@ -186,7 +186,6 @@ void pdsc_auxbus_dev_del(struct pdsc *cf, struct pdsc *pf,pds_client_unregister (pf, padev->client_id);auxiliary_device_delete (&padev->aux_dev);auxiliary_device_uninit (&padev->aux_dev); - padev->client_id =0 ; *pd_ptr =NULL ;mutex_unlock (&pf->config_lock);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 96/183 net_sched: drr: Fix double list add in class with netem as child qdisc
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Victor Nogueira <[email protected]>
[ Upstream commit f99a3fbf023e20b626be4b0f042463d598050c9a ]
As described in Gerrard's report [1], there are use cases where a netem child qdisc will make the parent qdisc's enqueue callback reentrant. In the case of drr, there won't be a UAF, but the code will add the same classifier to the list twice, which will cause memory corruption.
In addition to checking for qlen being zero, this patch checks whether the class was already added to the active_list (cl_is_active) before adding to the list to cover for the reentrant case.
[1] https://lore.kernel.org/netdev/CAHcdcOm+03OD2j6R0=YHKqmy=VgJ8xEOKuP6c7mSgnp-TEJJbw@mail.gmail.com/
--- net/sched/sch_drr.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
net/sched/sch_drr.c +6 -3
@@ -35,6 +35,11 @@ struct drr_sched {struct Qdisc_class_hash clhash; }; +static bool cl_is_active (struct drr_class *cl) +{ +return !list_empty (&cl->alist); +} +static struct drr_class *drr_find_class (struct Qdisc *sch,u32 classid) {struct drr_sched *q =qdisc_priv (sch);
@@ -336,7 +341,6 @@ static int drr_enqueue(struct sk_buff *skb, struct Qdisc *sch,struct drr_sched *q =qdisc_priv (sch);struct drr_class *cl;int err =0 ; -bool first; cl =drr_classify (skb, sch, &err);if (cl ==NULL ) {
@@ -346,7 +350,6 @@ static int drr_enqueue(struct sk_buff *skb, struct Qdisc *sch,return err; } - first = !cl->qdisc->q.qlen; err =qdisc_enqueue (skb, cl->qdisc, to_free);if (unlikely (err !=NET_XMIT_SUCCESS )) {if (net_xmit_drop_count (err)) {
@@ -356,7 +359,7 @@ static int drr_enqueue(struct sk_buff *skb, struct Qdisc *sch,return err; } -if (first) { +if (!cl_is_active (cl)) {list_add_tail (&cl->alist, &q->active); cl->deficit = cl->quantum; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 97/183 net_sched: hfsc: Fix a UAF vulnerability in class with netem as child qdisc
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Victor Nogueira <[email protected]>
[ Upstream commit 141d34391abbb315d68556b7c67ad97885407547 ]
As described in Gerrard's report [1], we have a UAF case when an hfsc class has a netem child qdisc. The crux of the issue is that hfsc is assuming that checking for cl->qdisc->q.qlen == 0 guarantees that it hasn't inserted the class in the vttree or eltree (which is not true for the netem duplicate case).
This patch checks the n_active class variable to make sure that the code won't insert the class in the vttree or eltree twice, catering for the reentrant case.
[1] https://lore.kernel.org/netdev/CAHcdcOm+03OD2j6R0=YHKqmy=VgJ8xEOKuP6c7mSgnp-TEJJbw@mail.gmail.com/
--- net/sched/sch_hfsc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/sch_hfsc.c +1 -1
@@ -1565,7 +1565,7 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free)return err; } -if (first) { +if (first && !cl->cl_nactive) {if (cl->cl_flags &HFSC_RSC )init_ed (cl, len);if (cl->cl_flags &HFSC_FSC )
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 98/183 net_sched: ets: Fix double list add in class with netem as child qdisc
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Victor Nogueira <[email protected]>
[ Upstream commit 1a6d0c00fa07972384b0c308c72db091d49988b6 ]
As described in Gerrard's report [1], there are use cases where a netem child qdisc will make the parent qdisc's enqueue callback reentrant. In the case of ets, there won't be a UAF, but the code will add the same classifier to the list twice, which will cause memory corruption.
In addition to checking for qlen being zero, this patch checks whether the class was already added to the active_list (cl_is_active) before doing the addition to cater for the reentrant case.
[1] https://lore.kernel.org/netdev/CAHcdcOm+03OD2j6R0=YHKqmy=VgJ8xEOKuP6c7mSgnp-TEJJbw@mail.gmail.com/
--- net/sched/sch_ets.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
net/sched/sch_ets.c +6 -3
@@ -74,6 +74,11 @@ static const struct nla_policy ets_class_policy[TCA_ETS_MAX + 1] = { [TCA_ETS_QUANTA_BAND] = { .type = NLA_U32 }, }; +static bool cl_is_active (struct ets_class *cl) +{ +return !list_empty (&cl->alist); +} +static int ets_quantum_parse (struct Qdisc *sch,const struct nlattr *attr,unsigned int *quantum,struct netlink_ext_ack *extack)
@@ -416,7 +421,6 @@ static int ets_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,struct ets_sched *q =qdisc_priv (sch);struct ets_class *cl;int err =0 ; -bool first; cl =ets_classify (skb, sch, &err);if (!cl) {
@@ -426,7 +430,6 @@ static int ets_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,return err; } - first = !cl->qdisc->q.qlen; err =qdisc_enqueue (skb, cl->qdisc, to_free);if (unlikely (err !=NET_XMIT_SUCCESS )) {if (net_xmit_drop_count (err)) {
@@ -436,7 +439,7 @@ static int ets_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,return err; } -if (first && !ets_class_is_strict (q, cl)) { +if (!cl_is_active (cl) && !ets_class_is_strict (q, cl)) {list_add_tail (&cl->alist, &q->active); cl->deficit = cl->quantum; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 99/183 net_sched: qfq: Fix double list add in class with netem as child qdisc
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Victor Nogueira <[email protected]>
[ Upstream commit f139f37dcdf34b67f5bf92bc8e0f7f6b3ac63aa4 ]
As described in Gerrard's report [1], there are use cases where a netem child qdisc will make the parent qdisc's enqueue callback reentrant. In the case of qfq, there won't be a UAF, but the code will add the same classifier to the list twice, which will cause memory corruption.
This patch checks whether the class was already added to the agg->active list (cl_is_active) before doing the addition to cater for the reentrant case.
[1] https://lore.kernel.org/netdev/CAHcdcOm+03OD2j6R0=YHKqmy=VgJ8xEOKuP6c7mSgnp-TEJJbw@mail.gmail.com/
--- net/sched/sch_qfq.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
net/sched/sch_qfq.c +7 -4
@@ -202,6 +202,11 @@ struct qfq_sched {*/ enum update_reason {enqueue, requeue}; +static bool cl_is_active (struct qfq_class *cl) +{ +return !list_empty (&cl->alist); +} +static struct qfq_class *qfq_find_class (struct Qdisc *sch,u32 classid) {struct qfq_sched *q =qdisc_priv (sch);
@@ -1214,7 +1219,6 @@ static int qfq_enqueue(struct sk_buff *skb, struct Qdisc *sch,struct qfq_class *cl;struct qfq_aggregate *agg;int err =0 ; -bool first; cl =qfq_classify (skb, sch, &err);if (cl ==NULL ) {
@@ -1236,7 +1240,6 @@ static int qfq_enqueue(struct sk_buff *skb, struct Qdisc *sch, } gso_segs =skb_is_gso (skb) ?skb_shinfo (skb)->gso_segs :1 ; - first = !cl->qdisc->q.qlen; err =qdisc_enqueue (skb, cl->qdisc, to_free);if (unlikely (err !=NET_XMIT_SUCCESS )) {pr_debug ("qfq_enqueue: enqueue failed %d\n" , err);
@@ -1252,8 +1255,8 @@ static int qfq_enqueue(struct sk_buff *skb, struct Qdisc *sch, ++sch->q.qlen; agg = cl->agg; -/* if the queue was not empty, then done here */ -if (!first) { +/* if the class is active, then done here */ +if (cl_is_active (cl)) {if (unlikely (skb == cl->qdisc->ops->peek (cl->qdisc)) && list_first_entry(&agg->active, struct qfq_class, alist) == cl && cl->deficit < len)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 100/183 ice: Dont check device type when checking GNSS presence
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karol Kolacinski <[email protected]>
[ Upstream commit e2c6737e6e82e9991646cd5389391bb6d3572a68 ]
Don't check if the device type is E810T as non-E810T devices can support GNSS too and PCA9575 check is enough to determine if GNSS is present or not.
Rename ice_gnss_is_gps_present() to ice_gnss_is_module_present() because GNSS module supports multiple GNSS providers, not only GPS.
Move functions related to PCA9575 from ice_ptp_hw.c to ice_common.c to be able to access them when PTP is disabled in the kernel, but GNSS is enabled.
Remove logical AND with ICE_AQC_LINK_TOPO_NODE_TYPE_M in ice_get_pca9575_handle(), which has no effect, and reorder device type checks to check the device_id first, then set other variables.
Stable-dep-of: 3ffcd7b657c9 ("ice: fix Get Tx Topology AQ command error on E830")
--- drivers/net/ethernet/intel/ice/ice_common.c | 90 ++++++++++++++++++++ drivers/net/ethernet/intel/ice/ice_common.h | 2 + drivers/net/ethernet/intel/ice/ice_gnss.c | 29 +++---- drivers/net/ethernet/intel/ice/ice_gnss.h | 4 +- drivers/net/ethernet/intel/ice/ice_lib.c | 2 +- drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 93 --------------------- drivers/net/ethernet/intel/ice/ice_ptp_hw.h | 1 - 7 files changed, 105 insertions(+), 116 deletions(-)
drivers/net/ethernet/intel/ice/ice_common.c +90 -0
@@ -5765,6 +5765,96 @@ ice_aq_write_i2c(struct ice_hw *hw, struct ice_aqc_link_topo_addr topo_addr,return ice_aq_send_cmd (hw, &desc,NULL ,0 , cd); } +/** +* ice_get_pca9575_handle - find and return the PCA9575 controller +* @hw: pointer to the hw struct +* @pca9575_handle: GPIO controller's handle +* +* Find and return the GPIO controller's handle in the netlist. +* When found - the value will be cached in the hw structure and following calls +* will return cached value. +* +* Return: 0 on success, -ENXIO when there's no PCA9575 present. +*/ +int ice_get_pca9575_handle (struct ice_hw *hw,u16 *pca9575_handle) +{ +struct ice_aqc_get_link_topo *cmd; +struct ice_aq_desc desc; +int err; +u8 idx; + +/* If handle was read previously return cached value */ +if (hw->io_expander_handle) { + *pca9575_handle = hw->io_expander_handle; +return 0 ; + } + +#define SW_PCA9575_SFP_TOPO_IDX 2 +#define SW_PCA9575_QSFP_TOPO_IDX 1 + +/* Check if the SW IO expander controlling SMA exists in the netlist. */ +if (hw->device_id ==ICE_DEV_ID_E810C_SFP ) + idx =SW_PCA9575_SFP_TOPO_IDX ; +else if (hw->device_id ==ICE_DEV_ID_E810C_QSFP ) + idx =SW_PCA9575_QSFP_TOPO_IDX ; +else +return -ENXIO ; + +/* If handle was not detected read it from the netlist */ +ice_fill_dflt_direct_cmd_desc (&desc, ice_aqc_opc_get_link_topo); + cmd = &desc.params.get_link_topo; + cmd->addr.topo_params.node_type_ctx = +ICE_AQC_LINK_TOPO_NODE_TYPE_GPIO_CTRL ; + cmd->addr.topo_params.index = idx; + + err =ice_aq_send_cmd (hw, &desc,NULL ,0 ,NULL ); +if (err) +return -ENXIO ; + +/* Verify if we found the right IO expander type */ +if (desc.params.get_link_topo.node_part_num != +ICE_AQC_GET_LINK_TOPO_NODE_NR_PCA9575 ) +return -ENXIO ; + +/* If present save the handle and return it */ + hw->io_expander_handle = +le16_to_cpu (desc.params.get_link_topo.addr.handle); + *pca9575_handle = hw->io_expander_handle; + +return 0 ; +} + +/** +* ice_read_pca9575_reg - read the register from the PCA9575 controller +* @hw: pointer to the hw struct +* @offset: GPIO controller register offset +* @data: pointer to data to be read from the GPIO controller +* +* Return: 0 on success, negative error code otherwise. +*/ +int ice_read_pca9575_reg (struct ice_hw *hw,u8 offset,u8 *data) +{ +struct ice_aqc_link_topo_addr link_topo; +__le16 addr; +u16 handle; +int err; + +memset (&link_topo,0 ,sizeof (link_topo)); + + err =ice_get_pca9575_handle (hw, &handle); +if (err) +return err; + + link_topo.handle =cpu_to_le16 (handle); + link_topo.topo_params.node_type_ctx = +FIELD_PREP (ICE_AQC_LINK_TOPO_NODE_CTX_M , +ICE_AQC_LINK_TOPO_NODE_CTX_PROVIDED ); + + addr =cpu_to_le16 ((u16 )offset); + +return ice_aq_read_i2c (hw, link_topo,0 , addr,1 , data,NULL ); +} +/** * ice_aq_set_gpio * @hw: pointer to the hw struct
drivers/net/ethernet/intel/ice/ice_common.h +2 -0
@@ -306,5 +306,7 @@ int ice_aq_write_i2c(struct ice_hw *hw, struct ice_aqc_link_topo_addr topo_addr, u16 bus_addr, __le16 addr, u8 params, const u8 *data, struct ice_sq_cd *cd); +int ice_get_pca9575_handle (struct ice_hw *hw,u16 *pca9575_handle); +int ice_read_pca9575_reg (struct ice_hw *hw,u8 offset,u8 *data);bool ice_fw_supports_report_dflt_cfg (struct ice_hw *hw);#endif /* _ICE_COMMON_H_ */
drivers/net/ethernet/intel/ice/ice_gnss.c +10 -19
@@ -381,32 +381,23 @@ void ice_gnss_exit(struct ice_pf *pf) }/** -* ice_gnss_is_gps_present - Check if GPS HW is present +* ice_gnss_is_module_present - Check if GNSS HW is present * @hw: pointer to HW struct +* +* Return: true when GNSS is present, false otherwise. */ -bool ice_gnss_is_gps_present (struct ice_hw *hw) +bool ice_gnss_is_module_present (struct ice_hw *hw) { -if (!hw->func_caps.ts_func_info.src_tmr_owned) -return false; +int err; +u8 data; -if (!ice_is_gps_in_netlist (hw)) +if (!hw->func_caps.ts_func_info.src_tmr_owned || + !ice_is_gps_in_netlist (hw))return false; -#if IS_ENABLED (CONFIG_PTP_1588_CLOCK ) -if (ice_is_e810t (hw)) { -int err; -u8 data; - - err =ice_read_pca9575_reg (hw,ICE_PCA9575_P0_IN , &data); -if (err || !!(data &ICE_P0_GNSS_PRSNT_N )) -return false; - }else { -return false; - } -#else -if (!ice_is_e810t (hw)) + err =ice_read_pca9575_reg (hw,ICE_PCA9575_P0_IN , &data); +if (err || !!(data &ICE_P0_GNSS_PRSNT_N ))return false; -#endif /* IS_ENABLED(CONFIG_PTP_1588_CLOCK) */ return true; }
drivers/net/ethernet/intel/ice/ice_gnss.h +2 -2
@@ -37,11 +37,11 @@ struct gnss_serial {#if IS_ENABLED (CONFIG_GNSS )void ice_gnss_init (struct ice_pf *pf);void ice_gnss_exit (struct ice_pf *pf); -bool ice_gnss_is_gps_present (struct ice_hw *hw); +bool ice_gnss_is_module_present (struct ice_hw *hw);#else static inline void ice_gnss_init (struct ice_pf *pf) { }static inline void ice_gnss_exit (struct ice_pf *pf) { } -static inline bool ice_gnss_is_gps_present (struct ice_hw *hw) +static inline bool ice_gnss_is_module_present (struct ice_hw *hw) {return false; }
drivers/net/ethernet/intel/ice/ice_lib.c +1 -1
@@ -3882,7 +3882,7 @@ void ice_init_feature_support(struct ice_pf *pf)ice_set_feature_support (pf,ICE_F_CGU );if (ice_is_clock_mux_in_netlist (&pf->hw))ice_set_feature_support (pf,ICE_F_SMA_CTRL ); -if (ice_gnss_is_gps_present (&pf->hw)) +if (ice_gnss_is_module_present (&pf->hw))ice_set_feature_support (pf,ICE_F_GNSS );break ;default :
drivers/net/ethernet/intel/ice/ice_ptp_hw.c +0 -93
105 lines not on this page · raw message
drivers/net/ethernet/intel/ice/ice_ptp_hw.h +0 -1
@@ -395,7 +395,6 @@ int ice_phy_cfg_intr_e82x(struct ice_hw *hw, u8 quad, bool ena, u8 threshold);/* E810 family functions */ int ice_read_sma_ctrl (struct ice_hw *hw,u8 *data);int ice_write_sma_ctrl (struct ice_hw *hw,u8 data); -int ice_read_pca9575_reg (struct ice_hw *hw,u8 offset,u8 *data);int ice_ptp_read_sdp_ac (struct ice_hw *hw,__le16 *entries,uint *num_entries);int ice_cgu_get_num_pins (struct ice_hw *hw,bool input);enum dpll_pin_type ice_cgu_get_pin_type (struct ice_hw *hw,u8 pin,bool input);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 101/183 ice: Remove unnecessary ice_is_e8xx() functions
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karol Kolacinski <[email protected]>
[ Upstream commit 9973ac9f23a79285d70365c72e98bffdb94a429d ]
Remove unnecessary ice_is_e8xx() functions and PHY model. Instead, use MAC type where applicable.
Don't check device type in ice_ptp_maybe_trigger_tx_interrupt(), because in reality it depends on the ready bitmap, which only E810 does not have.
Call ice_ptp_cfg_phy_interrupt() unconditionally, because all further function calls check the MAC type anyway and this allows simpler code in the future with addition of the new MAC types.
Reorder ICE_MAC_* cases in switches in ice_ptp* as in enum ice_mac_type.
Stable-dep-of: 3ffcd7b657c9 ("ice: fix Get Tx Topology AQ command error on E830")
--- drivers/net/ethernet/intel/ice/ice.h | 5 - drivers/net/ethernet/intel/ice/ice_common.c | 118 +--------------- drivers/net/ethernet/intel/ice/ice_common.h | 5 - drivers/net/ethernet/intel/ice/ice_ddp.c | 4 +- drivers/net/ethernet/intel/ice/ice_ptp.c | 133 +++++++++--------- drivers/net/ethernet/intel/ice/ice_ptp_hw.c | 142 ++++++++++---------- drivers/net/ethernet/intel/ice/ice_ptp_hw.h | 10 +- drivers/net/ethernet/intel/ice/ice_type.h | 9 -- 8 files changed, 147 insertions(+), 279 deletions(-)
drivers/net/ethernet/intel/ice/ice.h +0 -5
@@ -1047,10 +1047,5 @@ static inline void ice_clear_rdma_cap(struct ice_pf *pf) clear_bit(ICE_FLAG_RDMA_ENA, pf->flags); } -static inline enum ice_phy_model ice_get_phy_model (const struct ice_hw *hw) -{ -return hw->ptp.phy_model; -} -extern const struct xdp_metadata_ops ice_xdp_md_ops;#endif /* _ICE_H_ */
drivers/net/ethernet/intel/ice/ice_common.c +2 -116
136 lines not on this page · raw message
drivers/net/ethernet/intel/ice/ice_common.h +0 -5
@@ -131,7 +131,6 @@ int ice_aq_manage_mac_write(struct ice_hw *hw, const u8 *mac_addr, u8 flags, struct ice_sq_cd *cd);bool ice_is_generic_mac (struct ice_hw *hw); -bool ice_is_e810 (struct ice_hw *hw);int ice_clear_pf_cfg (struct ice_hw *hw); int ice_aq_set_phy_cfg(struct ice_hw *hw, struct ice_port_info *pi,
@@ -276,10 +275,6 @@ ice_stat_update40(struct ice_hw *hw, u32 reg, bool prev_stat_loaded,void ice_stat_update32 (struct ice_hw *hw,u32 reg,bool prev_stat_loaded,u64 *prev_stat,u64 *cur_stat); -bool ice_is_e810t (struct ice_hw *hw); -bool ice_is_e822 (struct ice_hw *hw); -bool ice_is_e823 (struct ice_hw *hw); -bool ice_is_e825c (struct ice_hw *hw);int ice_sched_query_elem (struct ice_hw *hw,u32 node_teid,struct ice_aqc_txsched_elem_data *buf);
drivers/net/ethernet/intel/ice/ice_ddp.c +2 -2
@@ -2345,14 +2345,14 @@ ice_get_set_tx_topo(struct ice_hw *hw, u8 *buf, u16 buf_size, cmd->set_flags |=ICE_AQC_TX_TOPO_FLAGS_SRC_RAM |ICE_AQC_TX_TOPO_FLAGS_LOAD_NEW ; -if (ice_is_e825c (hw)) +if (hw->mac_type ==ICE_MAC_GENERIC_3K_E825 ) desc.flags |=cpu_to_le16 (ICE_AQ_FLAG_RD ); }else {ice_fill_dflt_direct_cmd_desc (&desc, ice_aqc_opc_get_tx_topo); cmd->get_flags =ICE_AQC_TX_TOPO_GET_RAM ; } -if (!ice_is_e825c (hw)) +if (hw->mac_type !=ICE_MAC_GENERIC_3K_E825 ) desc.flags |=cpu_to_le16 (ICE_AQ_FLAG_RD ); status =ice_aq_send_cmd (hw, &desc, buf, buf_size, cd);
drivers/net/ethernet/intel/ice/ice_ptp.c +69 -64
286 lines not on this page · raw message
drivers/net/ethernet/intel/ice/ice_ptp_hw.c +69 -73
284 lines not on this page · raw message
drivers/net/ethernet/intel/ice/ice_ptp_hw.h +5 -5
@@ -430,13 +430,13 @@ int ice_phy_cfg_ptp_1step_eth56g(struct ice_hw *hw, u8 port);*/ static inline u64 ice_get_base_incval (struct ice_hw *hw) { -switch (hw->ptp.phy_model) { -case ICE_PHY_ETH56G : -return ICE_ETH56G_NOMINAL_INCVAL ; -case ICE_PHY_E810 : +switch (hw->mac_type) { +case ICE_MAC_E810 :return ICE_PTP_NOMINAL_INCVAL_E810 ; -case ICE_PHY_E82X : +case ICE_MAC_GENERIC :return ice_e82x_nominal_incval (ice_e82x_time_ref (hw)); +case ICE_MAC_GENERIC_3K_E825 : +return ICE_ETH56G_NOMINAL_INCVAL ;default :return 0 ; }
drivers/net/ethernet/intel/ice/ice_type.h +0 -9
@@ -871,14 +871,6 @@ union ice_phy_params {struct ice_eth56g_params eth56g; }; -/* PHY model */ -enum ice_phy_model { -ICE_PHY_UNSUP =-1 , -ICE_PHY_E810 =1 , -ICE_PHY_E82X , -ICE_PHY_ETH56G , -}; -/* Global Link Topology */ enum ice_global_link_topo {ICE_LINK_TOPO_UP_TO_2_LINKS ,
@@ -888,7 +880,6 @@ enum ice_global_link_topo { };struct ice_ptp_hw { -enum ice_phy_model phy_model;union ice_phy_params phy;u8 num_lports;u8 ports_per_phy;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 102/183 ice: fix Get Tx Topology AQ command error on E830
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Greenwalt <[email protected]>
[ Upstream commit 3ffcd7b657c9d96eb3ffe174449b4248dd7fc6a9 ]
The Get Tx Topology AQ command (opcode 0x0418) has different read flag requirements depending on the hardware/firmware. For E810, E822, and E823 firmware the read flag must be set, and for newer hardware (E825 and E830) it must not be set.
This results in failure to configure Tx topology and the following warning message during probe:
DDP package does not support Tx scheduling layers switching feature - please update to the latest DDP package and try again
The current implementation only handles E825-C but not E830. It is confusing as we first check ice_is_e825c() and then set the flag in the set case. Finally, we check ice_is_e825c() again and set the flag for all other hardware in both the set and get case.
Instead, notice that we always need the read flag for set, but only need the read flag for get on E810, E822, and E823 firmware. Fix the logic to check the MAC type and set the read flag in get only on the older devices which require it.
--- drivers/net/ethernet/intel/ice/ice_ddp.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/net/ethernet/intel/ice/ice_ddp.c +5 -5
@@ -2345,15 +2345,15 @@ ice_get_set_tx_topo(struct ice_hw *hw, u8 *buf, u16 buf_size, cmd->set_flags |=ICE_AQC_TX_TOPO_FLAGS_SRC_RAM |ICE_AQC_TX_TOPO_FLAGS_LOAD_NEW ; -if (hw->mac_type ==ICE_MAC_GENERIC_3K_E825 ) - desc.flags |=cpu_to_le16 (ICE_AQ_FLAG_RD ); + desc.flags |=cpu_to_le16 (ICE_AQ_FLAG_RD ); }else {ice_fill_dflt_direct_cmd_desc (&desc, ice_aqc_opc_get_tx_topo); cmd->get_flags =ICE_AQC_TX_TOPO_GET_RAM ; - } -if (hw->mac_type !=ICE_MAC_GENERIC_3K_E825 ) - desc.flags |=cpu_to_le16 (ICE_AQ_FLAG_RD ); +if (hw->mac_type ==ICE_MAC_E810 || + hw->mac_type ==ICE_MAC_GENERIC ) + desc.flags |=cpu_to_le16 (ICE_AQ_FLAG_RD ); + } status =ice_aq_send_cmd (hw, &desc, buf, buf_size, cd);if (status)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 103/183 ice: Check VF VSI Pointer Value in ice_vc_add_fdir_fltr()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xuanqiang Luo <[email protected]>
[ Upstream commit 425c5f266b2edeee0ce16fedd8466410cdcfcfe3 ]
As mentioned in the commit baeb705fd6a7 ("ice: always check VF VSI pointer values"), we need to perform a null pointer check on the return value of ice_get_vf_vsi() before using it.
--- drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c +5 -0
@@ -2097,6 +2097,11 @@ int ice_vc_add_fdir_fltr(struct ice_vf *vf, u8 *msg) pf = vf->pf; dev =ice_pf_to_dev (pf); vf_vsi =ice_get_vf_vsi (vf); +if (!vf_vsi) { +dev_err (dev,"Can not get FDIR vf_vsi for VF %u\n" , vf->vf_id); + v_ret =VIRTCHNL_STATUS_ERR_PARAM ; + goto err_exit; + }#define ICE_VF_MAX_FDIR_FILTERS 128 if (!ice_fdir_num_avail_fltr(&pf->hw, vf_vsi) ||
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 104/183 idpf: fix offloads support for encapsulated packets
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Madhu Chittim <[email protected]>
[ Upstream commit 713dd6c2deca88cba0596b1e2576f7b7a8e5c59e ]
Split offloads into csum, tso and other offloads so that tunneled packets do not by default have all the offloads enabled.
Stateless offloads for encapsulated packets are not yet supported in firmware/software but in the driver we were setting the features same as non encapsulated features.
Fixed naming to clarify CSUM bits are being checked for Tx.
Inherit netdev features to VLAN interfaces as well.
--- drivers/net/ethernet/intel/idpf/idpf.h | 18 +++---- drivers/net/ethernet/intel/idpf/idpf_lib.c | 57 ++++++++-------------- 2 files changed, 27 insertions(+), 48 deletions(-)
drivers/net/ethernet/intel/idpf/idpf.h +8 -10
@@ -629,13 +629,13 @@ bool idpf_is_capability_ena(struct idpf_adapter *adapter, bool all, VIRTCHNL2_CAP_RX_HSPLIT_AT_L4V4 |\ VIRTCHNL2_CAP_RX_HSPLIT_AT_L4V6) -#define IDPF_CAP_RX_CSUM_L4V4 (\ - VIRTCHNL2_CAP_RX_CSUM_L4_IPV4_TCP |\ - VIRTCHNL2_CAP_RX_CSUM_L4_IPV4_UDP) +#define IDPF_CAP_TX_CSUM_L4V4 (\ + VIRTCHNL2_CAP_TX_CSUM_L4_IPV4_TCP |\ + VIRTCHNL2_CAP_TX_CSUM_L4_IPV4_UDP) -#define IDPF_CAP_RX_CSUM_L4V6 (\ - VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_TCP |\ - VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_UDP) +#define IDPF_CAP_TX_CSUM_L4V6 (\ + VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_TCP |\ + VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_UDP)#define IDPF_CAP_RX_CSUM (\ VIRTCHNL2_CAP_RX_CSUM_L3_IPV4 |\
@@ -644,11 +644,9 @@ bool idpf_is_capability_ena(struct idpf_adapter *adapter, bool all, VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_TCP |\ VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_UDP) -#define IDPF_CAP_SCTP_CSUM (\ +#define IDPF_CAP_TX_SCTP_CSUM (\ VIRTCHNL2_CAP_TX_CSUM_L4_IPV4_SCTP |\ - VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_SCTP |\ - VIRTCHNL2_CAP_RX_CSUM_L4_IPV4_SCTP |\ - VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_SCTP) + VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_SCTP)#define IDPF_CAP_TUNNEL_TX_CSUM (\ VIRTCHNL2_CAP_TX_CSUM_L3_SINGLE_TUNNEL |\
drivers/net/ethernet/intel/idpf/idpf_lib.c +19 -38
80 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 105/183 scsi: ufs: core: Remove redundant query_complete trace
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keoseong Park <[email protected]>
[ Upstream commit 0e9693b97a0eee1df7bae33aec207c975fbcbdb8 ]
The query_complete trace was not removed after ufshcd_issue_dev_cmd() was called from the bsg path, resulting in duplicate output.
Below is an example of the trace:
ufs-utils-773 [000] ..... 218.176933: ufshcd_upiu: query_send: 0000:00:04.0: HDR:16 00 00 1f 00 01 00 00 00 00 00 00, OSF:03 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ufs-utils-773 [000] ..... 218.177145: ufshcd_upiu: query_complete: 0000:00:04.0: HDR:36 00 00 1f 00 01 00 00 00 00 00 00, OSF:03 07 00 00 00 00 00 00 00 00 00 08 00 00 00 00 ufs-utils-773 [000] ..... 218.177146: ufshcd_upiu: query_complete: 0000:00:04.0: HDR:36 00 00 1f 00 01 00 00 00 00 00 00, OSF:03 07 00 00 00 00 00 00 00 00 00 08 00 00 00 00
Remove the redundant trace call in the bsg path, preventing duplication.
--- drivers/ufs/core/ufshcd.c | 2 -- 1 file changed, 2 deletions(-)
drivers/ufs/core/ufshcd.c +0 -2
@@ -7201,8 +7201,6 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba, err = -EINVAL ; } } -ufshcd_add_query_upiu_trace (hba, err ?UFS_QUERY_ERR :UFS_QUERY_COMP , - (struct utp_upiu_req *)lrbp->ucd_rsp_ptr);return err; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 106/183 drm/xe/guc: Fix capture of steering registers
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Harrison <[email protected]>
[ Upstream commit 5e639707ddb8f080fbde805a1bfa6668a1b45298 ]
The list of registers to capture on a GPU hang includes some that require steering. Unfortunately, the flag to say this was being wiped to due a missing OR on the assignment of the next flag field.
Fix that.
--- drivers/gpu/drm/xe/xe_guc_capture.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_guc_capture.c +1 -1
@@ -359,7 +359,7 @@ static void __fill_ext_reg(struct __guc_mmio_reg_descr *ext, ext->reg =XE_REG (extlist->reg.__reg.addr); ext->flags =FIELD_PREP (GUC_REGSET_STEERING_NEEDED ,1 ); - ext->flags =FIELD_PREP (GUC_REGSET_STEERING_GROUP , slice_id); + ext->flags |=FIELD_PREP (GUC_REGSET_STEERING_GROUP , slice_id); ext->flags |=FIELD_PREP (GUC_REGSET_STEERING_INSTANCE , subslice_id); ext->regname = extlist->name; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 107/183 pinctrl: qcom: Fix PINGROUP definition for sm8750
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maulik Shah <[email protected]>
[ Upstream commit 12b8a672d2aa053064151659f49e7310674d42d3 ]
On newer SoCs intr_target_bit position is at 8 instead of 5. Fix it.
Also add missing intr_wakeup_present_bit and intr_wakeup_enable_bit which enables forwarding of GPIO interrupts to parent PDC interrupt controller.
--- drivers/pinctrl/qcom/pinctrl-sm8750.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/pinctrl/qcom/pinctrl-sm8750.c +3 -1
@@ -46,7 +46,9 @@ .out_bit = 1, \ .intr_enable_bit = 0, \ .intr_status_bit = 0, \ - .intr_target_bit = 5, \ + .intr_wakeup_present_bit = 6, \ + .intr_wakeup_enable_bit = 7, \ + .intr_target_bit = 8, \ .intr_target_kpss_val = 3, \ .intr_raw_status_bit = 4, \ .intr_polarity_bit = 1, \
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 108/183 ALSA: ump: Fix buffer overflow at UMP SysEx message conversion
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 56f1f30e6795b890463d9b20b11e576adf5a2f77 ]
The conversion function from MIDI 1.0 to UMP packet contains an internal buffer to keep the incoming MIDI bytes, and its size is 4, as it was supposed to be the max size for a MIDI1 UMP packet data. However, the implementation overlooked that SysEx is handled in a different format, and it can be up to 6 bytes, as found in do_convert_to_ump(). It leads eventually to a buffer overflow, and may corrupt the memory when a longer SysEx message is received.
The fix is simply to extend the buffer size to 6 to fit with the SysEx UMP message.
--- include/sound/ump_convert.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/sound/ump_convert.h +1 -1
@@ -19,7 +19,7 @@ struct ump_cvt_to_ump_bank {/* context for converting from MIDI1 byte stream to UMP packet */ struct ump_cvt_to_ump {/* MIDI1 intermediate buffer */ -unsigned char buf[4 ]; +unsigned char buf[6 ];/* up to 6 bytes for SysEx */ int len;int cmd_bytes;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 109/183 nvme-pci: fix queue unquiesce check on slot_reset
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keith Busch <[email protected]>
[ Upstream commit a75401227eeb827b1a162df1aa9d5b33da921c43 ]
A zero return means the reset was successfully scheduled. We don't want to unquiesce the queues while the reset_work is pending, as that will just flush out requeued requests to a failed completion.
--- drivers/nvme/host/pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/pci.c +1 -1
@@ -3578,7 +3578,7 @@ static pci_ers_result_t nvme_slot_reset(struct pci_dev *pdev)dev_info (dev->ctrl.device,"restart after slot reset\n" );pci_restore_state (pdev); -if (!nvme_try_sched_reset (&dev->ctrl)) +if (nvme_try_sched_reset (&dev->ctrl))nvme_unquiesce_io_queues (&dev->ctrl);return PCI_ERS_RESULT_RECOVERED ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 110/183 drm/tests: shmem: Fix memleak
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Ripard <[email protected]>
[ Upstream commit 48ccf21fa8dc595c8aa4f1d347b593dcae0727d0 ]
The drm_gem_shmem_test_get_pages_sgt() gets a scatter-gather table using the drm_gem_shmem_get_sg_table() function and rightfully calls sg_free_table() on it. However, it's also supposed to kfree() the returned sg_table, but doesn't.
This leads to a memory leak, reported by kmemleak. Fix it by adding a kunit action to kfree the sgt when the test ends.
--- drivers/gpu/drm/tests/drm_gem_shmem_test.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/tests/drm_gem_shmem_test.c +3 -0
@@ -216,6 +216,9 @@ static void drm_gem_shmem_test_get_pages_sgt(struct kunit *test)KUNIT_ASSERT_NOT_ERR_OR_NULL (test, sgt);KUNIT_EXPECT_NULL (test, shmem->sgt); + ret =kunit_add_action_or_reset (test, kfree_wrapper, sgt); +KUNIT_ASSERT_EQ (test, ret,0 ); + ret =kunit_add_action_or_reset (test, sg_free_table_wrapper, sgt);KUNIT_ASSERT_EQ (test, ret,0 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 111/183 drm/mipi-dbi: Fix blanking for non-16 bit formats
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Russell Cloran <[email protected]>
[ Upstream commit 1a8bc0fe8039e1e57f68c4a588f0403d98bfeb1f ]
On r6x2b6x2g6x2 displays not enough blank data is sent to blank the entire screen. When support for these displays was added, the dirty function was updated to handle the different amount of data, but blanking was not, and remained hardcoded as 2 bytes per pixel.
This change applies almost the same algorithm used in the dirty function to the blank function, but there is no fb available at that point, and no concern about having to transform any data, so the dbidev pixel format is always used for calculating the length.
--- drivers/gpu/drm/drm_mipi_dbi.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_mipi_dbi.c +5 -1
@@ -404,12 +404,16 @@ static void mipi_dbi_blank(struct mipi_dbi_dev *dbidev)u16 height = drm->mode_config.min_height;u16 width = drm->mode_config.min_width;struct mipi_dbi *dbi = &dbidev->dbi; -size_t len = width * height *2 ; +const struct drm_format_info *dst_format; +size_t len;int idx;if (!drm_dev_enter (drm, &idx))return ; + dst_format =drm_format_info (dbidev->pixel_format); + len =drm_format_info_min_pitch (dst_format,0 , width) * height; +memset (dbidev->tx_buf,0 , len);mipi_dbi_set_window_address (dbidev,0 , width -1 ,0 , height -1 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 112/183 net: dlink: Correct endianness handling of led_mode
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Horman <[email protected]>
[ Upstream commit e7e5ae71831c44d58627a991e603845a2fed2cab ]
As it's name suggests, parse_eeprom() parses EEPROM data.
This is done by reading data, 16 bits at a time as follows:
for (i = 0; i < 128; i++)
((__le16 *) sromdata)[i] = cpu_to_le16(read_eeprom(np, i));sromdata is at the same memory location as psrom. And the type of psrom is a pointer to struct t_SROM.
As can be seen in the loop above, data is stored in sromdata, and thus psrom, as 16-bit little-endian values.
However, the integer fields of t_SROM are host byte order integers. And in the case of led_mode this leads to a little endian value being incorrectly treated as host byte order.
Looking at rio_set_led_mode, this does appear to be a bug as that code masks led_mode with 0x1, 0x2 and 0x8. Logic that would be effected by a reversed byte order.
This problem would only manifest on big endian hosts.
Found by inspection while investigating a sparse warning regarding the crc field of t_SROM.
I believe that warning is a false positive. And although I plan to send a follow-up to use little-endian types for other the integer fields of PSROM_t I do not believe that will involve any bug fixes.
Compile tested only.
--- drivers/net/ethernet/dlink/dl2k.c | 2 +- drivers/net/ethernet/dlink/dl2k.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/dlink/dl2k.c +1 -1
@@ -352,7 +352,7 @@ parse_eeprom (struct net_device *dev)eth_hw_addr_set (dev, psrom->mac_addr);if (np->chip_id ==CHIP_IP1000A ) { - np->led_mode = psrom->led_mode; + np->led_mode =le16_to_cpu (psrom->led_mode);return 0 ; }
drivers/net/ethernet/dlink/dl2k.h +1 -1
@@ -335,7 +335,7 @@ typedef struct t_SROM {u16 sub_system_id;/* 0x06 */ u16 pci_base_1;/* 0x08 (IP1000A only) */ u16 pci_base_2;/* 0x0a (IP1000A only) */ -u16 led_mode;/* 0x0c (IP1000A only) */ +__le16 led_mode;/* 0x0c (IP1000A only) */ u16 reserved1[9 ];/* 0x0e-0x1f */ u8 mac_addr[6 ];/* 0x20-0x25 */ u8 reserved2[10 ];/* 0x26-0x2f */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 113/183 net: mdio: mux-meson-gxl: set reversed bit when using internal phy
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Da Xue <[email protected]>
[ Upstream commit b23285e93bef729e67519a5209d5b7fde3b4af50 ]
This bit is necessary to receive packets from the internal PHY. Without this bit set, no activity occurs on the interface.
Normally u-boot sets this bit, but if u-boot is compiled without net support, the interface will be up but without any activity. If bit is set once, it will work until the IP is powered down or reset.
The vendor SDK sets this bit along with the PHY_ID bits.
--- drivers/net/mdio/mdio-mux-meson-gxl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/mdio/mdio-mux-meson-gxl.c +2 -1
@@ -17,6 +17,7 @@#define REG2_LEDACT GENMASK(23, 22)#define REG2_LEDLINK GENMASK(25, 24)#define REG2_DIV4SEL BIT(27) +#define REG2_REVERSED BIT(28)#define REG2_ADCBYPASS BIT(30)#define REG2_CLKINSEL BIT(31)#define ETH_REG3 0x4
@@ -65,7 +66,7 @@ static void gxl_enable_internal_mdio(struct gxl_mdio_mux *priv)* The only constraint is that it must match the one in * drivers/net/phy/meson-gxl.c to properly match the PHY. */ -writel (FIELD_PREP (REG2_PHYID ,EPHY_GXL_ID ), +writel (REG2_REVERSED |FIELD_PREP (REG2_PHYID ,EPHY_GXL_ID ), priv->regs +ETH_REG2 );/* Enable the internal phy */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 114/183 idpf: fix potential memory leak on kcalloc() failure
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Swiatkowski <[email protected]>
[ Upstream commit 8a558cbda51bef09773c72bf74a32047479110c7 ]
In case of failing on rss_data->rss_key allocation the function is freeing vport without freeing earlier allocated q_vector_idxs. Fix it.
Move from freeing in error branch to goto scheme.
--- drivers/net/ethernet/intel/idpf/idpf_lib.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/net/ethernet/intel/idpf/idpf_lib.c +11 -8
@@ -1112,11 +1112,9 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter, num_max_q =max (max_q->max_txq, max_q->max_rxq); vport->q_vector_idxs =kcalloc (num_max_q,sizeof (u16),GFP_KERNEL ); -if (!vport->q_vector_idxs) { -kfree (vport); +if (!vport->q_vector_idxs) + goto free_vport; -return NULL ; - }idpf_vport_init (vport, max_q);/* This alloc is done separate from the LUT because it's not strictly
@@ -1126,11 +1124,9 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter,*/ rss_data = &adapter->vport_config[idx]->user_config.rss_data; rss_data->rss_key =kzalloc (rss_data->rss_key_size,GFP_KERNEL ); -if (!rss_data->rss_key) { -kfree (vport); +if (!rss_data->rss_key) + goto free_vector_idxs; -return NULL ; - }/* Initialize default rss key */ netdev_rss_key_fill ((void *)rss_data->rss_key, rss_data->rss_key_size);
@@ -1143,6 +1139,13 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter, adapter->next_vport =idpf_get_free_slot (adapter);return vport; + +free_vector_idxs: +kfree (vport->q_vector_idxs); +free_vport: +kfree (vport); + +return NULL ; }/**
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 115/183 idpf: protect shutdown from reset
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larysa Zaremba <[email protected]>
[ Upstream commit ed375b182140eeb9c73609b17939c8a29b27489e ]
Before the referenced commit, the shutdown just called idpf_remove(), this way IDPF_REMOVE_IN_PROG was protecting us from the serv_task rescheduling reset. Without this flag set the shutdown process is vulnerable to HW reset or any other triggering conditions (such as default mailbox being destroyed).
When one of conditions checked in idpf_service_task becomes true, vc_event_task can be rescheduled during shutdown, this leads to accessing freed memory e.g. idpf_req_rel_vector_indexes() trying to read vport->q_vector_idxs. This in turn causes the system to become defunct during e.g. systemctl kexec.
Considering using IDPF_REMOVE_IN_PROG would lead to more heavy shutdown process, instead just cancel the serv_task before cancelling adapter->serv_task before cancelling adapter->vc_event_task to ensure that reset will not be scheduled while we are doing a shutdown.
--- drivers/net/ethernet/intel/idpf/idpf_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/idpf/idpf_main.c +1 -0
@@ -89,6 +89,7 @@ static void idpf_shutdown(struct pci_dev *pdev) {struct idpf_adapter *adapter =pci_get_drvdata (pdev); +cancel_delayed_work_sync (&adapter->serv_task);cancel_delayed_work_sync (&adapter->vc_event_task);idpf_vc_core_deinit (adapter);idpf_deinit_dflt_mbx (adapter);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 116/183 igc: fix lock order in igc_ptp_reset
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Keller <[email protected]>
[ Upstream commit c7d6cb96d5c33b5148f3dc76fcd30a9b8cd9e973 ]
Commit 1a931c4f5e68 ("igc: add lock preventing multiple simultaneous PTM transactions") added a new mutex to protect concurrent PTM transactions. This lock is acquired in igc_ptp_reset() in order to ensure the PTM registers are properly disabled after a device reset.
The flow where the lock is acquired already holds a spinlock, so acquiring a mutex leads to a sleep-while-locking bug, reported both by smatch, and the kernel test robot.
The critical section in igc_ptp_reset() does correctly use the readx_poll_timeout_atomic variants, but the standard PTM flow uses regular sleeping variants. This makes converting the mutex to a spinlock a bit tricky.
Instead, re-order the locking in igc_ptp_reset. Acquire the mutex first, and then the tmreg_lock spinlock. This is safe because there is no other ordering dependency on these locks, as this is the only place where both locks were acquired simultaneously. Indeed, any other flow acquiring locks in that order would be wrong regardless.
--- drivers/net/ethernet/intel/igc/igc_ptp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/igc/igc_ptp.c +4 -2
@@ -1290,6 +1290,8 @@ void igc_ptp_reset(struct igc_adapter *adapter)/* reset the tstamp_config */ igc_ptp_set_timestamp_mode (adapter, &adapter->tstamp_config); +mutex_lock (&adapter->ptm_lock); +spin_lock_irqsave (&adapter->tmreg_lock, flags);switch (adapter->hw.mac.type) {
@@ -1308,7 +1310,6 @@ void igc_ptp_reset(struct igc_adapter *adapter)if (!igc_is_crosststamp_supported (adapter))break ; -mutex_lock (&adapter->ptm_lock);wr32 (IGC_PCIE_DIG_DELAY ,IGC_PCIE_DIG_DELAY_DEFAULT );wr32 (IGC_PCIE_PHY_DELAY ,IGC_PCIE_PHY_DELAY_DEFAULT );
@@ -1332,7 +1333,6 @@ void igc_ptp_reset(struct igc_adapter *adapter)netdev_err (adapter->netdev,"Timeout reading IGC_PTM_STAT register\n" );igc_ptm_reset (hw); -mutex_unlock (&adapter->ptm_lock);break ;default :/* No work to do. */
@@ -1349,5 +1349,7 @@ void igc_ptp_reset(struct igc_adapter *adapter) out:spin_unlock_irqrestore (&adapter->tmreg_lock, flags); +mutex_unlock (&adapter->ptm_lock); +wrfl (); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 117/183 net: ethernet: mtk_eth_soc: fix SER panic with 4GB+ RAM
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chad Monroe <[email protected]>
[ Upstream commit 6e0490fc36cdac696f96e57b61d93b9ae32e0f4c ]
If the mtk_poll_rx() function detects the MTK_RESETTING flag, it will jump to release_desc and refill the high word of the SDP on the 4GB RFB. Subsequently, mtk_rx_clean will process an incorrect SDP, leading to a panic.
Add patch from MediaTek's SDK to resolve this.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +9 -5
@@ -2202,14 +2202,18 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, ring->data[idx] = new_data; rxd->rxd1 = (unsigned int )dma_addr; release_desc: +if (MTK_HAS_CAPS (eth->soc->caps,MTK_36BIT_DMA )) { +if (unlikely (dma_addr ==DMA_MAPPING_ERROR )) + addr64 =FIELD_GET (RX_DMA_ADDR64_MASK , + rxd->rxd2); +else + addr64 =RX_DMA_PREP_ADDR64 (dma_addr); + } +if (MTK_HAS_CAPS (eth->soc->caps,MTK_SOC_MT7628 )) rxd->rxd2 =RX_DMA_LSO ;else - rxd->rxd2 =RX_DMA_PREP_PLEN0 (ring->buf_size); - -if (MTK_HAS_CAPS (eth->soc->caps,MTK_36BIT_DMA ) && -likely (dma_addr !=DMA_MAPPING_ERROR )) - rxd->rxd2 |=RX_DMA_PREP_ADDR64 (dma_addr); + rxd->rxd2 =RX_DMA_PREP_PLEN0 (ring->buf_size) | addr64; ring->calc_idx = idx; done++;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 118/183 net: dsa: felix: fix broken taprio gate states after clock jump
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit 426d487bca38b34f39c483edfc6313a036446b33 ]
Simplest setup to reproduce the issue: connect 2 ports of the LS1028A-RDB together (eno0 with swp0) and run:
$ ip link set eno0 up && ip link set swp0 up $ tc qdisc replace dev swp0 parent root handle 100 taprio num_tc 8 \ queues 1@0 1@1 1@2 1@3 1@4 1@5 1@6 1@7 map 0 1 2 3 4 5 6 7 \ base-time 0 sched-entry S 20 300000 sched-entry S 10 200000 \ sched-entry S 20 300000 sched-entry S 48 200000 \ sched-entry S 20 300000 sched-entry S 83 200000 \ sched-entry S 40 300000 sched-entry S 00 200000 flags 2 $ ptp4l -i eno0 -f /etc/linuxptp/configs/gPTP.cfg -m & $ ptp4l -i swp0 -f /etc/linuxptp/configs/gPTP.cfg -m
One will observe that the PTP state machine on swp0 starts synchronizing, then it attempts to do a clock step, and after that, it never fails to recover from the condition below.
ptp4l[82.427]: selected best master clock 00049f.fffe.05f627
ptp4l[82.428]: port 1 (swp0): MASTER to UNCALIBRATED on RS_SLAVE
ptp4l[83.252]: port 1 (swp0): UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[83.886]: rms 4537731277 max 9075462553 freq -18518 +/- 11467 delay 818 +/- 0
ptp4l[84.170]: timed out while polling for tx timestamp
ptp4l[84.171]: increasing tx_timestamp_timeout or increasing kworker priority may correct this issue, but a driver bug likely causes it ptp4l[84.172]: port 1 (swp0): send peer delay request failed
ptp4l[84.173]: port 1 (swp0): clearing fault immediately
ptp4l[84.269]: port 1 (swp0): SLAVE to LISTENING on INIT_COMPLETE
ptp4l[85.303]: timed out while polling for tx timestamp
ptp4l[84.171]: increasing tx_timestamp_timeout or increasing kworker priority may correct this issue, but a driver bug likely causes it ptp4l[84.172]: port 1 (swp0): send peer delay request failed
ptp4l[84.173]: port 1 (swp0): clearing fault immediately
ptp4l[84.269]: port 1 (swp0): SLAVE to LISTENING on INIT_COMPLETE
ptp4l[85.303]: timed out while polling for tx timestamp
ptp4l[85.304]: increasing tx_timestamp_timeout or increasing kworker priority may correct this issue, but a driver bug likely causes it ptp4l[85.305]: port 1 (swp0): send peer delay response failed
ptp4l[85.306]: port 1 (swp0): clearing fault immediately
ptp4l[86.304]: timed out while polling for tx timestamp
A hint is given by the non-zero statistics for dropped packets which were expecting hardware TX timestamps:
$ ethtool --include-statistics -T swp0 (...) Statistics: tx_pkts: 30 tx_lost: 11 tx_err: 0
We know that when PTP clock stepping takes place (from ocelot_ptp_settime64() or from ocelot_ptp_adjtime()), vsc9959_tas_clock_adjust() is called.
Another interesting hint is that placing an early return in vsc9959_tas_clock_adjust(), so as to neutralize this function, fixes the issue and TX timestamps are no longer dropped.
The debugging function written by me and included below is intended to read the GCL RAM, after the admin schedule became operational, through the two status registers available for this purpose:QSYS_GCL_STATUS_REG_1 and QSYS_GCL_STATUS_REG_2.
static void vsc9959_print_tas_gcl(struct ocelot *ocelot)
{
u32 val, list_length, interval, gate_state;
int i, err;
err = read_poll_timeout(ocelot_read, val,
!(val & QSYS_PARAM_STATUS_REG_8_CONFIG_PENDING),
10, 100000, false, ocelot, QSYS_PARAM_STATUS_REG_8);
if (err) {
dev_err(ocelot->dev,
"Failed to wait for TAS config pending bit to clear: %pe\n",
ERR_PTR(err));
return;
}
val = ocelot_read(ocelot, QSYS_PARAM_STATUS_REG_3);
list_length = QSYS_PARAM_STATUS_REG_3_LIST_LENGTH_X(val);
dev_info(ocelot->dev, "GCL length: %u\n", list_length);
for (i = 0; i < list_length; i++) {
ocelot_rmw(ocelot,
QSYS_GCL_STATUS_REG_1_GCL_ENTRY_NUM(i),
QSYS_GCL_STATUS_REG_1_GCL_ENTRY_NUM_M,
QSYS_GCL_STATUS_REG_1);
interval = ocelot_read(ocelot, QSYS_GCL_STATUS_REG_2);
val = ocelot_read(ocelot, QSYS_GCL_STATUS_REG_1);
gate_state = QSYS_GCL_STATUS_REG_1_GATE_STATE_X(val);
dev_info(ocelot->dev, "GCL entry %d: states 0x%x interval %u\n",
i, gate_state, interval);
}
}Calling it from two places: after the initial QSYS_TAS_PARAM_CFG_CTRL_CONFIG_CHANGE performed by vsc9959_qos_port_tas_set(), and after the one done by vsc9959_tas_clock_adjust(), I notice the following difference.
Quoted 1 line
From the tc-taprio process context, where the schedule was initially
configured, the GCL looks like this:
mscc_felix 0000:00:00.5: GCL length: 8mscc_felix 0000:00:00.5: GCL entry 0: states 0x20 interval 300000 mscc_felix 0000:00:00.5: GCL entry 1: states 0x10 interval 200000 mscc_felix 0000:00:00.5: GCL entry 2: states 0x20 interval 300000 mscc_felix 0000:00:00.5: GCL entry 3: states 0x48 interval 200000 mscc_felix 0000:00:00.5: GCL entry 4: states 0x20 interval 300000 mscc_felix 0000:00:00.5: GCL entry 5: states 0x83 interval 200000 mscc_felix 0000:00:00.5: GCL entry 6: states 0x40 interval 300000 mscc_felix 0000:00:00.5: GCL entry 7: states 0x0 interval 200000
But from the ptp4l clock stepping process context, when the vsc9959_tas_clock_adjust() hook is called, the GCL RAM of the operational schedule now looks like this:
mscc_felix 0000:00:00.5: GCL length: 8mscc_felix 0000:00:00.5: GCL entry 0: states 0x0 interval 0 mscc_felix 0000:00:00.5: GCL entry 1: states 0x0 interval 0 mscc_felix 0000:00:00.5: GCL entry 2: states 0x0 interval 0 mscc_felix 0000:00:00.5: GCL entry 3: states 0x0 interval 0 mscc_felix 0000:00:00.5: GCL entry 4: states 0x0 interval 0 mscc_felix 0000:00:00.5: GCL entry 5: states 0x0 interval 0 mscc_felix 0000:00:00.5: GCL entry 6: states 0x0 interval 0 mscc_felix 0000:00:00.5: GCL entry 7: states 0x0 interval 0
I do not have a formal explanation, just experimental conclusions. It appears that after triggering QSYS_TAS_PARAM_CFG_CTRL_CONFIG_CHANGE for a port's TAS, the GCL entry RAM is updated anyway, despite what the documentation claims: "Specify the time interval in QSYS::GCL_CFG_REG_2.TIME_INTERVAL. This triggers the actual RAM write with the gate state and the time interval for the entry number specified". We don't touch that register (through vsc9959_tas_gcl_set()) from vsc9959_tas_clock_adjust(), yet the GCL RAM is updated anyway.
It seems to be updated with effectively stale memory, which in my testing can hold a variety of things, including even pieces of the previously applied schedule, for particular schedule lengths.
As such, in most circumstances it is very difficult to pinpoint this issue, because the newly updated schedule would "behave strangely", but ultimately might still pass traffic to some extent, due to some gate entries still being present in the stale GCL entry RAM. It is easy to miss.
With the particular schedule given at the beginning, the GCL RAM "happens" to be reproducibly rewritten with all zeroes, and this is consistent with what we see: when the time-aware shaper has gate entries with all gates closed, traffic is dropped on TX, no wonder we can't retrieve TX timestamps.
Rewriting the GCL entry RAM when reapplying the new base time fixes the observed issue.
--- drivers/net/dsa/ocelot/felix_vsc9959.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/dsa/ocelot/felix_vsc9959.c +4 -1
@@ -1543,7 +1543,7 @@ static void vsc9959_tas_clock_adjust(struct ocelot *ocelot)struct tc_taprio_qopt_offload *taprio;struct ocelot_port *ocelot_port;struct timespec64 base_ts; -int port; +int i, port;u32 val;mutex_lock (&ocelot->fwd_domain_lock);
@@ -1575,6 +1575,9 @@ static void vsc9959_tas_clock_adjust(struct ocelot *ocelot)QSYS_PARAM_CFG_REG_3_BASE_TIME_SEC_MSB_M , QSYS_PARAM_CFG_REG_3); +for (i =0 ; i < taprio->num_entries; i++) +vsc9959_tas_gcl_set (ocelot, i, &taprio->entries[i]); +ocelot_rmw (ocelot,QSYS_TAS_PARAM_CFG_CTRL_CONFIG_CHANGE ,QSYS_TAS_PARAM_CFG_CTRL_CONFIG_CHANGE ,QSYS_TAS_PARAM_CFG_CTRL );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 119/183 net: ipv6: fix UDPv6 GSO segmentation with NAT
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit b936a9b8d4a585ccb6d454921c36286bfe63e01d ]
If any address or port is changed, update it in all packets and recalculate checksum.
--- net/ipv4/udp_offload.c | 61 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-)
net/ipv4/udp_offload.c +60 -1
@@ -247,6 +247,62 @@ static struct sk_buff *__udpv4_gso_segment_list_csum(struct sk_buff *segs)return segs; } +static void __udpv6_gso_segment_csum (struct sk_buff *seg, +struct in6_addr *oldip, +const struct in6_addr *newip, +__be16 *oldport,__be16 newport) +{ +struct udphdr *uh =udp_hdr (seg); + +if (ipv6_addr_equal (oldip, newip) && *oldport == newport) +return ; + +if (uh->check) { +inet_proto_csum_replace16 (&uh->check, seg, oldip->s6_addr32, + newip->s6_addr32, true); + +inet_proto_csum_replace2 (&uh->check, seg, *oldport, newport, + false); +if (!uh->check) + uh->check =CSUM_MANGLED_0 ; + } + + *oldip = *newip; + *oldport = newport; +} + +static struct sk_buff *__udpv6_gso_segment_list_csum (struct sk_buff *segs) +{ +const struct ipv6hdr *iph; +const struct udphdr *uh; +struct ipv6hdr *iph2; +struct sk_buff *seg; +struct udphdr *uh2; + + seg = segs; + uh =udp_hdr (seg); + iph =ipv6_hdr (seg); + uh2 =udp_hdr (seg->next); + iph2 =ipv6_hdr (seg->next); + +if (!(*(const u32 *)&uh->source ^ *(const u32 *)&uh2->source) && +ipv6_addr_equal (&iph->saddr, &iph2->saddr) && +ipv6_addr_equal (&iph->daddr, &iph2->daddr)) +return segs; + +while ((seg = seg->next)) { + uh2 =udp_hdr (seg); + iph2 =ipv6_hdr (seg); + +__udpv6_gso_segment_csum (seg, &iph2->saddr, &iph->saddr, + &uh2->source, uh->source); +__udpv6_gso_segment_csum (seg, &iph2->daddr, &iph->daddr, + &uh2->dest, uh->dest); + } + +return segs; +} +static struct sk_buff *__udp_gso_segment_list (struct sk_buff *skb,netdev_features_t features,bool is_ipv6)
@@ -259,7 +315,10 @@ static struct sk_buff *__udp_gso_segment_list(struct sk_buff *skb,udp_hdr (skb)->len =htons (sizeof (struct udphdr ) + mss); -return is_ipv6 ? skb :__udpv4_gso_segment_list_csum (skb); +if (is_ipv6) +return __udpv6_gso_segment_list_csum (skb); +else +return __udpv4_gso_segment_list_csum (skb); } struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 120/183 ALSA: hda/realtek: Fix built-mic regression on other ASUS models
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 4d5b71b487291da9f92e352c0a7e39f256d60db8 ]
A few ASUS models use the ALC256_FIXUP_ASUS_HEADSET_MODE although they have no built-in mic pin on NID 0x13, as found in the commit c1732ede5e80 ("ALSA: hda/realtek - Fix headset and mic on several Asus laptops with ALC256"). This was relatively harmless in the past as NID 0x13 was assigned as the secondary mic. But since the fix for the pin sort order, this pin became the primary one, hence user started noticing the broken input, and we've fixed already for a few ASUS models to switch to ALC256_FIXUP_ASUS_MIC_NO_PRESENCE.
This patch corrects the other ASUS models to use the right quirk entry for fixing the built-in mic regression. Here we cover X541SA (1043:12e0), X541UV (1043:12f0), Z550SA (1043:13bf0) and X555UB (1043:1ccd).
--- sound/pci/hda/patch_realtek.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
sound/pci/hda/patch_realtek.c +4 -4
@@ -10774,10 +10774,10 @@ static const struct hda_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1043 ,0x12a3 ,"Asus N7691ZM" ,ALC269_FIXUP_ASUS_N7601ZM ),SND_PCI_QUIRK (0x1043 ,0x12af ,"ASUS UX582ZS" ,ALC245_FIXUP_CS35L41_SPI_2 ),SND_PCI_QUIRK (0x1043 ,0x12b4 ,"ASUS B3405CCA / P3405CCA" ,ALC294_FIXUP_ASUS_CS35L41_SPI_2 ), -SND_PCI_QUIRK (0x1043 ,0x12e0 ,"ASUS X541SA" ,ALC256_FIXUP_ASUS_MIC ), -SND_PCI_QUIRK (0x1043 ,0x12f0 ,"ASUS X541UV" ,ALC256_FIXUP_ASUS_MIC ), +SND_PCI_QUIRK (0x1043 ,0x12e0 ,"ASUS X541SA" ,ALC256_FIXUP_ASUS_MIC_NO_PRESENCE ), +SND_PCI_QUIRK (0x1043 ,0x12f0 ,"ASUS X541UV" ,ALC256_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1313 ,"Asus K42JZ" ,ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE ), -SND_PCI_QUIRK (0x1043 ,0x13b0 ,"ASUS Z550SA" ,ALC256_FIXUP_ASUS_MIC ), +SND_PCI_QUIRK (0x1043 ,0x13b0 ,"ASUS Z550SA" ,ALC256_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1427 ,"Asus Zenbook UX31E" ,ALC269VB_FIXUP_ASUS_ZENBOOK ),SND_PCI_QUIRK (0x1043 ,0x1433 ,"ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV" ,ALC285_FIXUP_ASUS_I2C_HEADSET_MIC ), SND_PCI_QUIRK(0x1043, 0x1460, "Asus VivoBook 15", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
@@ -10831,7 +10831,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1043 ,0x1c92 ,"ASUS ROG Strix G15" ,ALC285_FIXUP_ASUS_G533Z_PINS ),SND_PCI_QUIRK (0x1043 ,0x1c9f ,"ASUS G614JU/JV/JI" ,ALC285_FIXUP_ASUS_HEADSET_MIC ),SND_PCI_QUIRK (0x1043 ,0x1caf ,"ASUS G634JY/JZ/JI/JG" ,ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS ), -SND_PCI_QUIRK (0x1043 ,0x1ccd ,"ASUS X555UB" ,ALC256_FIXUP_ASUS_MIC ), +SND_PCI_QUIRK (0x1043 ,0x1ccd ,"ASUS X555UB" ,ALC256_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1ccf ,"ASUS G814JU/JV/JI" ,ALC245_FIXUP_CS35L41_SPI_2 ),SND_PCI_QUIRK (0x1043 ,0x1cdf ,"ASUS G814JY/JZ/JG" ,ALC245_FIXUP_CS35L41_SPI_2 ), SND_PCI_QUIRK(0x1043, 0x1cef, "ASUS G834JY/JZ/JI/JG", ALC285_FIXUP_ASUS_HEADSET_MIC),
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 121/183 bnxt_en: Fix error handling path in bnxt_init_chip()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shravya KN <[email protected]>
[ Upstream commit 9ab7a709c926c16b4433cf02d04fcbcf35aaab2b ]
WARN_ON() is triggered in __flush_work() if bnxt_init_chip() fails because we call cancel_work_sync() on dim work that has not been initialized.
WARNING: CPU: 37 PID: 5223 at kernel/workqueue.c:4201 __flush_work.isra.0+0x212/0x230
The driver relies on the BNXT_STATE_NAPI_DISABLED bit to check if dim work has already been cancelled. But in the bnxt_open() path, BNXT_STATE_NAPI_DISABLED is not set and this causes the error path to think that it needs to cancel the uninitalized dim work. Fix it by setting BNXT_STATE_NAPI_DISABLED during initialization. The bit will be cleared when we enable NAPI and initialize dim work.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +3 -0
@@ -11379,6 +11379,9 @@ static void bnxt_init_napi(struct bnxt *bp) poll_fn = bnxt_poll_p5; else if (BNXT_CHIP_TYPE_NITRO_A0(bp)) cp_nr_rings--; + + set_bit(BNXT_STATE_NAPI_DISABLED, &bp->state); +for (i =0 ; i < cp_nr_rings; i++) { bnapi = bp->bnapi[i]; netif_napi_add_config(bp->dev, &bnapi->napi, poll_fn,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 122/183 bnxt_en: Fix ethtool selftest output in one of the failure cases
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalesh AP <[email protected]>
[ Upstream commit 8e6cc9045380f3f0c48ebda2bda5e1abe263388d ]
When RDMA driver is loaded, running offline self test is not supported and driver returns failure early. But it is not clearing the input buffer and hence the application prints some junk characters for individual test results.
Fix it by clearing the buffer before returning.
--- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +1 -1
@@ -4922,6 +4922,7 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,if (!bp->num_tests || !BNXT_PF (bp))return ; +memset (buf,0 ,sizeof (u64) * bp->num_tests);if (etest->flags Ð_TEST_FL_OFFLINE &&bnxt_ulp_registered (bp->edev)) { etest->flags |=ETH_TEST_FL_FAILED ;
@@ -4929,7 +4930,6 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,return ; } -memset (buf,0 ,sizeof (u64) * bp->num_tests);if (!netif_running (dev)) { etest->flags |=ETH_TEST_FL_FAILED ;return ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 123/183 bnxt_en: Add missing skb_mark_for_recycle() in bnxt_rx_vlan()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Somnath Kotur <[email protected]>
[ Upstream commit a63db07e4ecd45b027718168faf7d798bb47bf58 ]
If bnxt_rx_vlan() fails because the VLAN protocol ID is invalid, the SKB is freed but we're missing the call to recycle it. This may cause the warning:
"page_pool_release_retry() stalled pool shutdown"
Add the missing skb_mark_for_recycle() in bnxt_rx_vlan().
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +1 -0
@@ -2011,6 +2011,7 @@ static struct sk_buff *bnxt_rx_vlan(struct sk_buff *skb, u8 cmp_type, }return skb; vlan_err: +skb_mark_for_recycle (skb);dev_kfree_skb (skb);return NULL ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 124/183 bnxt_en: call pci_alloc_irq_vectors() after bnxt_reserve_rings()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kashyap Desai <[email protected]>
[ Upstream commit 1ae04e489dd757e1e61999362f33e7c554c3b9e3 ]
On some architectures (e.g. ARM), calling pci_alloc_irq_vectors() will immediately cause the MSIX table to be written. This will not work if we haven't called bnxt_reserve_rings() to properly map the MSIX table to the MSIX vectors reserved by FW.
Fix the FW error recovery path to delay the bnxt_init_int_mode() -> pci_alloc_irq_vectors() call by removing it from bnxt_hwrm_if_change(). bnxt_request_irq() later in the code path will call it and by then the MSIX table is properly mapped.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +1 -6
@@ -12172,13 +12172,8 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)set_bit (BNXT_STATE_ABORT_ERR , &bp->state);return rc; } +/* IRQ will be initialized later in bnxt_request_irq()*/ bnxt_clear_int_mode (bp); - rc =bnxt_init_int_mode (bp); -if (rc) { -clear_bit (BNXT_STATE_FW_RESET_DET , &bp->state); -netdev_err (bp->dev,"init int mode failed\n" ); -return rc; - } } rc =bnxt_cancel_reservations (bp, fw_reset); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 125/183 bnxt_en: Fix coredump logic to free allocated buffer
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shruti Parab <[email protected]>
[ Upstream commit ea9376cf68230e05492f22ca45d329f16e262c7b ]
When handling HWRM_DBG_COREDUMP_LIST FW command in bnxt_hwrm_dbg_dma_data(), the allocated buffer info->dest_buf is not freed in the error path. In the normal path, info->dest_buf is assigned to coredump->data and it will eventually be freed after the coredump is collected.
Free info->dest_buf immediately inside bnxt_hwrm_dbg_dma_data() in the error path.
--- drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c +5 -0
@@ -116,6 +116,11 @@ static int bnxt_hwrm_dbg_dma_data(struct bnxt *bp, void *msg,memcpy (info->dest_buf + off, dma_buf, len); }else { rc = -ENOBUFS ; +if (cmn_req->req_type == +cpu_to_le16 (HWRM_DBG_COREDUMP_LIST )) { +kfree (info->dest_buf); + info->dest_buf =NULL ; + }break ; } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 126/183 bnxt_en: Fix out-of-bound memcpy() during ethtool -w
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shruti Parab <[email protected]>
[ Upstream commit 6b87bd94f34370bbf1dfa59352bed8efab5bf419 ]
When retrieving the FW coredump using ethtool, it can sometimes cause memory corruption:
BUG: KFENCE: memory corruption in __bnxt_get_coredump+0x3ef/0x670 [bnxt_en] Corrupted memory at 0x000000008f0f30e8 [ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ] (in kfence-#45): __bnxt_get_coredump+0x3ef/0x670 [bnxt_en] ethtool_get_dump_data+0xdc/0x1a0 __dev_ethtool+0xa1e/0x1af0 dev_ethtool+0xa8/0x170 dev_ioctl+0x1b5/0x580 sock_do_ioctl+0xab/0xf0 sock_ioctl+0x1ce/0x2e0 __x64_sys_ioctl+0x87/0xc0 do_syscall_64+0x5c/0xf0 entry_SYSCALL_64_after_hwframe+0x78/0x80
...
This happens when copying the coredump segment list in bnxt_hwrm_dbg_dma_data() with the HWRM_DBG_COREDUMP_LIST FW command. The info->dest_buf buffer is allocated based on the number of coredump segments returned by the FW. The segment list is then DMA'ed by the FW and the length of the DMA is returned by FW. The driver then copies this DMA'ed segment list to info->dest_buf.
In some cases, this DMA length may exceed the info->dest_buf length and cause the above BUG condition. Fix it by capping the copy length to not exceed the length of info->dest_buf. The extra DMA data contains no useful information.
This code path is shared for the HWRM_DBG_COREDUMP_LIST and the HWRM_DBG_COREDUMP_RETRIEVE FW commands. The buffering is different for these 2 FW commands. To simplify the logic, we need to move the line to adjust the buffer length for HWRM_DBG_COREDUMP_RETRIEVE up, so that the new check to cap the copy length will work for both commands.
--- .../net/ethernet/broadcom/bnxt/bnxt_coredump.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c +10 -5
@@ -110,10 +110,19 @@ static int bnxt_hwrm_dbg_dma_data(struct bnxt *bp, void *msg, } } +if (cmn_req->req_type == +cpu_to_le16 (HWRM_DBG_COREDUMP_RETRIEVE )) + info->dest_buf_size += len; +if (info->dest_buf) {if ((info->seg_start + off + len) <=BNXT_COREDUMP_BUF_LEN (info->buf_len)) { -memcpy (info->dest_buf + off, dma_buf, len); +u16 copylen =min_t (u16, len, + info->dest_buf_size - off); + +memcpy (info->dest_buf + off, dma_buf, copylen); +if (copylen < len) +break ; }else { rc = -ENOBUFS ; if (cmn_req->req_type ==
@@ -125,10 +134,6 @@ static int bnxt_hwrm_dbg_dma_data(struct bnxt *bp, void *msg, } } -if (cmn_req->req_type == -cpu_to_le16 (HWRM_DBG_COREDUMP_RETRIEVE )) - info->dest_buf_size += len; -if (!(cmn_resp->flags &HWRM_DBG_CMN_FLAGS_MORE ))break ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 127/183 bnxt_en: Fix ethtool -d byte order for 32-bit values
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Chan <[email protected]>
[ Upstream commit 02e8be5a032cae0f4ca33c6053c44d83cf4acc93 ]
For version 1 register dump that includes the PCIe stats, the existing code incorrectly assumes that all PCIe stats are 64-bit values. Fix it by using an array containing the starting and ending index of the 32-bit values. The loop in bnxt_get_regs() will use the array to do proper endian swap for the 32-bit values.
--- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +32 -6
@@ -2062,6 +2062,17 @@ static int bnxt_get_regs_len(struct net_device *dev)return reg_len; } +#define BNXT_PCIE_32B_ENTRY (start, end) \ + { offsetof(struct pcie_ctx_hw_stats, start), \ + offsetof(struct pcie_ctx_hw_stats, end) } + +static const struct { +u16 start; +u16 end; +} bnxt_pcie_32b_entries[] = { +BNXT_PCIE_32B_ENTRY (pcie_ltssm_histogram[0 ], pcie_ltssm_histogram[3 ]), +}; +static void bnxt_get_regs (struct net_device *dev,struct ethtool_regs *regs,void *_p) {
@@ -2094,12 +2105,27 @@ static void bnxt_get_regs(struct net_device *dev, struct ethtool_regs *regs, req->pcie_stat_host_addr =cpu_to_le64 (hw_pcie_stats_addr); rc =hwrm_req_send (bp, req);if (!rc) { -__le64 *src = (__le64 *)hw_pcie_stats; -u64 *dst = (u64 *)(_p +BNXT_PXP_REG_LEN ); -int i; - -for (i =0 ; i <sizeof (*hw_pcie_stats) /sizeof (__le64); i++) - dst[i] =le64_to_cpu (src[i]); +u8 *dst = (u8 *)(_p +BNXT_PXP_REG_LEN ); +u8 *src = (u8 *)hw_pcie_stats; +int i, j; + +for (i =0 , j =0 ; i <sizeof (*hw_pcie_stats); ) { +if (i >= bnxt_pcie_32b_entries[j].start && + i <= bnxt_pcie_32b_entries[j].end) { +u32 *dst32 = (u32 *)(dst + i); + + *dst32 =le32_to_cpu (*(__le32 *)(src + i)); + i +=4 ; +if (i > bnxt_pcie_32b_entries[j].end && + j <ARRAY_SIZE (bnxt_pcie_32b_entries) -1 ) + j++; + }else { +u64 *dst64 = (u64 *)(dst + i); + + *dst64 =le64_to_cpu (*(__le64 *)(src + i)); + i +=8 ; + } + } }hwrm_req_drop (bp, req); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 128/183 nvme-tcp: fix premature queue removal and I/O failover
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Liang <[email protected]>
[ Upstream commit 77e40bbce93059658aee02786a32c5c98a240a8a ]
This patch addresses a data corruption issue observed in nvme-tcp during testing.
In an NVMe native multipath setup, when an I/O timeout occurs, all inflight I/Os are canceled almost immediately after the kernel socket is shut down. These canceled I/Os are reported as host path errors, triggering a failover that succeeds on a different path.
However, at this point, the original I/O may still be outstanding in the host's network transmission path (e.g., the NIC’s TX queue). From the user-space app's perspective, the buffer associated with the I/O is considered completed since they're acked on the different path and may be reused for new I/O requests.
Because nvme-tcp enables zero-copy by default in the transmission path, this can lead to corrupted data being sent to the original target, ultimately causing data corruption.
We can reproduce this data corruption by injecting delay on one path and triggering i/o timeout.
To prevent this issue, this change ensures that all inflight transmissions are fully completed from host's perspective before returning from queue stop. To handle concurrent I/O timeout from multiple namespaces under the same controller, always wait in queue stop regardless of queue's state.
This aligns with the behavior of queue stopping in other NVMe fabric transports.
--- drivers/nvme/host/tcp.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-)
drivers/nvme/host/tcp.c +29 -2
@@ -1944,7 +1944,7 @@ static void __nvme_tcp_stop_queue(struct nvme_tcp_queue *queue)cancel_work_sync (&queue->io_work); } -static void nvme_tcp_stop_queue (struct nvme_ctrl *nctrl,int qid) +static void nvme_tcp_stop_queue_nowait (struct nvme_ctrl *nctrl,int qid) {struct nvme_tcp_ctrl *ctrl =to_tcp_ctrl (nctrl);struct nvme_tcp_queue *queue = &ctrl->queues[qid];
@@ -1963,6 +1963,31 @@ static void nvme_tcp_stop_queue(struct nvme_ctrl *nctrl, int qid)mutex_unlock (&queue->queue_lock); } +static void nvme_tcp_wait_queue (struct nvme_ctrl *nctrl,int qid) +{ +struct nvme_tcp_ctrl *ctrl =to_tcp_ctrl (nctrl); +struct nvme_tcp_queue *queue = &ctrl->queues[qid]; +int timeout =100 ; + +while (timeout >0 ) { +if (!test_bit (NVME_TCP_Q_ALLOCATED , &queue->flags) || + !sk_wmem_alloc_get (queue->sock->sk)) +return ; +msleep (2 ); + timeout -=2 ; + } +dev_warn (nctrl->device, +"qid %d: timeout draining sock wmem allocation expired\n" , + qid); +} + +static void nvme_tcp_stop_queue (struct nvme_ctrl *nctrl,int qid) +{ +nvme_tcp_stop_queue_nowait (nctrl, qid); +nvme_tcp_wait_queue (nctrl, qid); +} + +static void nvme_tcp_setup_sock_ops (struct nvme_tcp_queue *queue) {write_lock_bh (&queue->sock->sk->sk_callback_lock);
@@ -2030,7 +2055,9 @@ static void nvme_tcp_stop_io_queues(struct nvme_ctrl *ctrl)int i;for (i =1 ; i < ctrl->queue_count; i++) -nvme_tcp_stop_queue (ctrl, i); +nvme_tcp_stop_queue_nowait (ctrl, i); +for (i =1 ; i < ctrl->queue_count; i++) +nvme_tcp_wait_queue (ctrl, i); } static int nvme_tcp_start_io_queues(struct nvme_ctrl *ctrl,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 129/183 nvme-tcp: select CONFIG_TLS from CONFIG_NVME_TCP_TLS
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alistair Francis <[email protected]>
[ Upstream commit 521987940ad4fd37fe3d0340ec6f39c4e8e91e36 ]
Ensure that TLS support is enabled in the kernel when CONFIG_NVME_TCP_TLS is enabled. Without this the code compiles, but does not actually work unless something else enables CONFIG_TLS.
--- drivers/nvme/host/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/nvme/host/Kconfig +1 -0
@@ -97,6 +97,7 @@ config NVME_TCP_TLS depends on NVME_TCP select NET_HANDSHAKE select KEYS + select TLS help Enables TLS encryption for NVMe TCP using the netlink handshake API.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 130/183 nvmet-tcp: select CONFIG_TLS from CONFIG_NVME_TARGET_TCP_TLS
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alistair Francis <[email protected]>
[ Upstream commit ac38b7ef704c0659568fd4b2c7e6c1255fc51798 ]
Ensure that TLS support is enabled in the kernel when CONFIG_NVME_TARGET_TCP_TLS is enabled. Without this the code compiles, but does not actually work unless something else enables CONFIG_TLS.
--- drivers/nvme/target/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/nvme/target/Kconfig +1 -0
@@ -98,6 +98,7 @@ config NVME_TARGET_TCP_TLS bool "NVMe over Fabrics TCP target TLS encryption support" depends on NVME_TARGET_TCP select NET_HANDSHAKE + select TLS help Enables TLS encryption for the NVMe TCP target using the netlink handshake API.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 131/183 ASoC: stm32: sai: skip useless iterations on kernel rate loop
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Olivier Moysan <[email protected]>
[ Upstream commit edea92770a3b6454dc796fc5436a3315bb402181 ]
the frequency of the kernel clock must be greater than or equal to the bitclock rate. When searching for a convenient kernel clock rate in stm32_sai_set_parent_rate() function, it is useless to continue the loop below bitclock rate, as it will result in a invalid kernel clock rate. Change the loop output condition.
--- sound/soc/stm/stm32_sai_sub.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
sound/soc/stm/stm32_sai_sub.c +7 -4
@@ -409,11 +409,11 @@ static int stm32_sai_set_parent_rate(struct stm32_sai_sub_data *sai, unsigned int rate) {struct platform_device *pdev = sai->pdev; -unsigned int sai_ck_rate, sai_ck_max_rate, sai_curr_rate, sai_new_rate; +unsigned int sai_ck_rate, sai_ck_max_rate, sai_ck_min_rate, sai_curr_rate, sai_new_rate;int div, ret;/* -* Set maximum expected kernel clock frequency +* Set minimum and maximum expected kernel clock frequency * - mclk on or spdif: * f_sai_ck = MCKDIV * mclk-fs * fs * Here typical 256 ratio is assumed for mclk-fs
@@ -423,13 +423,16 @@ static int stm32_sai_set_parent_rate(struct stm32_sai_sub_data *sai,* Set constraint MCKDIV * FRL <= 256, to ensure MCKDIV is in available range * f_sai_ck = sai_ck_max_rate * pow_of_two(FRL) / 256 */ + sai_ck_min_rate = rate *256 ;if (!(rate %SAI_RATE_11K )) sai_ck_max_rate =SAI_MAX_SAMPLE_RATE_11K *256 ;else sai_ck_max_rate =SAI_MAX_SAMPLE_RATE_8K *256 ; -if (!sai->sai_mclk && !STM_SAI_PROTOCOL_IS_SPDIF (sai)) +if (!sai->sai_mclk && !STM_SAI_PROTOCOL_IS_SPDIF (sai)) { + sai_ck_min_rate = rate * sai->fs_length; sai_ck_max_rate /=DIV_ROUND_CLOSEST (256 ,roundup_pow_of_two (sai->fs_length)); + }/* * Request exclusivity, as the clock is shared by SAI sub-blocks and by
@@ -472,7 +475,7 @@ static int stm32_sai_set_parent_rate(struct stm32_sai_sub_data *sai,/* Try a lower frequency */ div++; sai_ck_rate = sai_ck_max_rate / div; - }while (sai_ck_rate > rate); + }while (sai_ck_rate >= sai_ck_min_rate);/* No accurate rate found */ dev_err (&pdev->dev,"Failed to find an accurate rate" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 132/183 ASoC: stm32: sai: add a check on minimal kernel frequency
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Olivier Moysan <[email protected]>
[ Upstream commit cce34d113e2a592806abcdc02c7f8513775d8b20 ]
On MP2 SoCs SAI kernel clock rate is managed through stm32_sai_set_parent_rate() function.
If the kernel clock rate was set previously to a low frequency, this frequency may be too low to support the newly requested audio stream rate. However the stm32_sai_rate_accurate() will only check accuracy against the maximum kernel clock rate. The function will return leaving the kernel clock rate unchanged.
Add a check on minimal frequency requirement, to avoid this.
--- sound/soc/stm/stm32_sai_sub.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
sound/soc/stm/stm32_sai_sub.c +4 -1
@@ -447,7 +447,10 @@ static int stm32_sai_set_parent_rate(struct stm32_sai_sub_data *sai,* return immediately. */ sai_curr_rate =clk_get_rate (sai->sai_ck); -if (stm32_sai_rate_accurate (sai_ck_max_rate, sai_curr_rate)) +dev_dbg (&pdev->dev,"kernel clock rate: min [%u], max [%u], current [%u]" , + sai_ck_min_rate, sai_ck_max_rate, sai_curr_rate); +if (stm32_sai_rate_accurate (sai_ck_max_rate, sai_curr_rate) && + sai_curr_rate >= sai_ck_min_rate)return 0 ;/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 133/183 ASoC: simple-card-utils: Fix pointer check in graph_util_parse_link_direction
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Stein <[email protected]>
[ Upstream commit 3cc393d2232ec770b5f79bf0673d67702a3536c3 ]
Actually check if the passed pointers are valid, before writing to them. This also fixes a USBAN warning:
UBSAN: invalid-load in ../sound/soc/fsl/imx-card.c:687:25
load of value 255 is not a valid value for type '_Bool'
This is because playback_only is uninitialized and is not written to, as the playback-only property is absent.
--- sound/soc/generic/simple-card-utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/generic/simple-card-utils.c +2 -2
@@ -1146,9 +1146,9 @@ void graph_util_parse_link_direction(struct device_node *np,bool is_playback_only =of_property_read_bool (np,"playback-only" );bool is_capture_only =of_property_read_bool (np,"capture-only" ); -if (is_playback_only) +if (playback_only) *playback_only = is_playback_only; -if (is_capture_only) +if (capture_only) *capture_only = is_capture_only; }EXPORT_SYMBOL_GPL (graph_util_parse_link_direction);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 134/183 bnxt_en: fix module unload sequence
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vadim Fedorenko <[email protected]>
[ Upstream commit 927069d5c40c1cfa7b2d13cfc6d7d58bc6f85c50 ]
Recent updates to the PTP part of bnxt changed the way PTP FIFO is cleared, skbs waiting for TX timestamps are now cleared during ndo_close() call. To do clearing procedure, the ptp structure must exist and point to a valid address. Module destroy sequence had ptp clear code running before netdev close causing invalid memory access and kernel crash. Change the sequence to destroy ptp structure after device close.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +1 -1
@@ -15731,8 +15731,8 @@ static void bnxt_remove_one(struct pci_dev *pdev)bnxt_rdma_aux_device_del (bp); -bnxt_ptp_clear (bp);unregister_netdev (dev); +bnxt_ptp_clear (bp);bnxt_rdma_aux_device_uninit (bp);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 135/183 net: use sock_gen_put() when sk_state is TCP_TIME_WAIT
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jibin Zhang <[email protected]>
[ Upstream commit f920436a44295ca791ebb6dae3f4190142eec703 ]
It is possible for a pointer of type struct inet_timewait_sock to be returned from the functions __inet_lookup_established() and __inet6_lookup_established(). This can cause a crash when the returned pointer is of type struct inet_timewait_sock and sock_put() is called on it. The following is a crash call stack that shows sk->sk_wmem_alloc being accessed in sk_free() during the call to sock_put() on a struct inet_timewait_sock pointer. To avoid this issue, use sock_gen_put() instead of sock_put() when sk->sk_state is TCP_TIME_WAIT.
mrdump.ko ipanic() + 120 vmlinux notifier_call_chain(nr_to_call=-1, nr_calls=0) + 132 vmlinux atomic_notifier_call_chain(val=0) + 56 vmlinux panic() + 344 vmlinux add_taint() + 164 vmlinux end_report() + 136 vmlinux kasan_report(size=0) + 236 vmlinux report_tag_fault() + 16 vmlinux do_tag_recovery() + 16 vmlinux __do_kernel_fault() + 88 vmlinux do_bad_area() + 28 vmlinux do_tag_check_fault() + 60 vmlinux do_mem_abort() + 80 vmlinux el1_abort() + 56 vmlinux el1h_64_sync_handler() + 124 vmlinux > 0xFFFFFFC080011294() vmlinux __lse_atomic_fetch_add_release(v=0xF2FFFF82A896087C) vmlinux __lse_atomic_fetch_sub_release(v=0xF2FFFF82A896087C) vmlinux arch_atomic_fetch_sub_release(i=1, v=0xF2FFFF82A896087C)
+ 8
vmlinux raw_atomic_fetch_sub_release(i=1, v=0xF2FFFF82A896087C)
+ 8
vmlinux atomic_fetch_sub_release(i=1, v=0xF2FFFF82A896087C) + 8
vmlinux __refcount_sub_and_test(i=1, r=0xF2FFFF82A896087C,
oldp=0) + 8
vmlinux __refcount_dec_and_test(r=0xF2FFFF82A896087C, oldp=0) + 8 vmlinux refcount_dec_and_test(r=0xF2FFFF82A896087C) + 8 vmlinux sk_free(sk=0xF2FFFF82A8960700) + 28 vmlinux sock_put() + 48 vmlinux tcp6_check_fraglist_gro() + 236 vmlinux tcp6_gro_receive() + 624 vmlinux ipv6_gro_receive() + 912 vmlinux dev_gro_receive() + 1116 vmlinux napi_gro_receive() + 196 ccmni.ko ccmni_rx_callback() + 208 ccmni.ko ccmni_queue_recv_skb() + 388 ccci_dpmaif.ko dpmaif_rxq_push_thread() + 1088 vmlinux kthread() + 268 vmlinux 0xFFFFFFC08001F30C()
--- net/ipv4/tcp_offload.c | 2 +- net/ipv6/tcpv6_offload.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp_offload.c +1 -1
@@ -435,7 +435,7 @@ static void tcp4_check_fraglist_gro(struct list_head *head, struct sk_buff *skb, iif, sdif);NAPI_GRO_CB (skb)->is_flist = !sk;if (sk) -sock_put (sk); +sock_gen_put (sk); }INDIRECT_CALLABLE_SCOPE
net/ipv6/tcpv6_offload.c +1 -1
@@ -42,7 +42,7 @@ static void tcp6_check_fraglist_gro(struct list_head *head, struct sk_buff *skb, iif, sdif);NAPI_GRO_CB (skb)->is_flist = !sk;if (sk) -sock_put (sk); +sock_gen_put (sk);#endif /* IS_ENABLED(CONFIG_IPV6) */ }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 136/183 ptp: ocp: Fix NULL dereference in Adva board SMA sysfs operations
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sagi Maimon <[email protected]>
[ Upstream commit e98386d79a23c57cf179fe4138322e277aa3aa74 ]
On Adva boards, SMA sysfs store/get operations can call __handle_signal_outputs() or __handle_signal_inputs() while the irig and dcf pointers are uninitialized, leading to a NULL pointer dereference in __handle_signal() and causing a kernel crash. Adva boards don't use irig or dcf functionality, so add Adva-specific callbacks ptp_ocp_sma_adva_set_outputs() and ptp_ocp_sma_adva_set_inputs() that avoid invoking irig or dcf input/output routines.
--- drivers/ptp/ptp_ocp.c | 52 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-)
drivers/ptp/ptp_ocp.c +50 -2
@@ -2578,12 +2578,60 @@ static const struct ocp_sma_op ocp_fb_sma_op = { .set_output = ptp_ocp_sma_fb_set_output, }; +static int +ptp_ocp_sma_adva_set_output (struct ptp_ocp *bp,int sma_nr,u32 val) +{ +u32 reg, mask, shift; +unsigned long flags; +u32 __iomem *gpio; + + gpio = sma_nr >2 ? &bp->sma_map1->gpio2 : &bp->sma_map2->gpio2; + shift = sma_nr &1 ?0 :16 ; + + mask =0xffff << (16 - shift); + +spin_lock_irqsave (&bp->lock, flags); + + reg =ioread32 (gpio); + reg = (reg & mask) | (val << shift); + +iowrite32 (reg, gpio); + +spin_unlock_irqrestore (&bp->lock, flags); + +return 0 ; +} + +static int +ptp_ocp_sma_adva_set_inputs (struct ptp_ocp *bp,int sma_nr,u32 val) +{ +u32 reg, mask, shift; +unsigned long flags; +u32 __iomem *gpio; + + gpio = sma_nr >2 ? &bp->sma_map2->gpio1 : &bp->sma_map1->gpio1; + shift = sma_nr &1 ?0 :16 ; + + mask =0xffff << (16 - shift); + +spin_lock_irqsave (&bp->lock, flags); + + reg =ioread32 (gpio); + reg = (reg & mask) | (val << shift); + +iowrite32 (reg, gpio); + +spin_unlock_irqrestore (&bp->lock, flags); + +return 0 ; +} +static const struct ocp_sma_op ocp_adva_sma_op = { .tbl = { ptp_ocp_adva_sma_in, ptp_ocp_adva_sma_out }, .init = ptp_ocp_sma_fb_init, .get = ptp_ocp_sma_fb_get, - .set_inputs = ptp_ocp_sma_fb_set_inputs, - .set_output = ptp_ocp_sma_fb_set_output, + .set_inputs = ptp_ocp_sma_adva_set_inputs, + .set_output = ptp_ocp_sma_adva_set_output, }; static int
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 137/183 net: lan743x: Fix memleak issue when GSO enabled
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thangaraj Samynathan <[email protected]>
[ Upstream commit 2d52e2e38b85c8b7bc00dca55c2499f46f8c8198 ]
Always map the skb to the LS descriptor. Previously skb was mapped to EXT descriptor when the number of fragments is zero with GSO enabled. Mapping the skb to EXT descriptor prevents it from being freed, leading to a memory leak
--- drivers/net/ethernet/microchip/lan743x_main.c | 8 ++++++-- drivers/net/ethernet/microchip/lan743x_main.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-)
drivers/net/ethernet/microchip/lan743x_main.c +6 -2
@@ -1815,6 +1815,7 @@ static void lan743x_tx_frame_add_lso(struct lan743x_tx *tx,if (nr_frags <=0 ) { tx->frame_data0 |=TX_DESC_DATA0_LS_ ; tx->frame_data0 |=TX_DESC_DATA0_IOC_ ; + tx->frame_last = tx->frame_first; } tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; tx_descriptor->data0 =cpu_to_le32 (tx->frame_data0);
@@ -1884,6 +1885,7 @@ static int lan743x_tx_frame_add_fragment(struct lan743x_tx *tx, tx->frame_first =0 ; tx->frame_data0 =0 ; tx->frame_tail =0 ; + tx->frame_last =0 ;return -ENOMEM ; }
@@ -1924,16 +1926,18 @@ static void lan743x_tx_frame_end(struct lan743x_tx *tx, TX_DESC_DATA0_DTYPE_DATA_) { tx->frame_data0 |=TX_DESC_DATA0_LS_ ; tx->frame_data0 |=TX_DESC_DATA0_IOC_ ; + tx->frame_last = tx->frame_tail; } - tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; - buffer_info = &tx->buffer_info[tx->frame_tail]; + tx_descriptor = &tx->ring_cpu_ptr[tx->frame_last]; + buffer_info = &tx->buffer_info[tx->frame_last]; buffer_info->skb = skb;if (time_stamp) buffer_info->flags |=TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED ;if (ignore_sync) buffer_info->flags |=TX_BUFFER_INFO_FLAG_IGNORE_SYNC ; + tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; tx_descriptor->data0 =cpu_to_le32 (tx->frame_data0); tx->frame_tail =lan743x_tx_next_index (tx, tx->frame_tail); tx->last_tail = tx->frame_tail;
drivers/net/ethernet/microchip/lan743x_main.h +1 -0
@@ -980,6 +980,7 @@ struct lan743x_tx {u32 frame_first;u32 frame_data0;u32 frame_tail; +u32 frame_last;struct lan743x_tx_buffer_info *buffer_info;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 138/183 net: fec: ERR007885 Workaround for conventional TX
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mattias Barthel <[email protected]>
[ Upstream commit a179aad12badc43201cbf45d1e8ed2c1383c76b9 ]
Activate TX hang workaround also in fec_enet_txq_submit_skb() when TSO is not enabled.
Errata: ERR007885
Symptoms: NETDEV WATCHDOG: eth0 (fec): transmit queue 0 timed out
commit 37d6017b84f7 ("net: fec: Workaround for imx6sx enet tx hang when enable three queues") There is a TDAR race condition for mutliQ when the software sets TDAR
and the UDMA clears TDAR simultaneously or in a small window (2-4 cycles). This will cause the udma_tx and udma_tx_arbiter state machines to hang.
So, the Workaround is checking TDAR status four time, if TDAR cleared by
hardware and then write TDAR, otherwise don't set TDAR.
--- drivers/net/ethernet/freescale/fec_main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/ethernet/freescale/fec_main.c +6 -1
@@ -714,7 +714,12 @@ static int fec_enet_txq_submit_skb(struct fec_enet_priv_tx_q *txq, txq->bd.cur = bdp;/* Trigger transmission start */ -writel (0 , txq->bd.reg_desc_active); +if (!(fep->quirks &FEC_QUIRK_ERR007885 ) || + !readl (txq->bd.reg_desc_active) || + !readl (txq->bd.reg_desc_active) || + !readl (txq->bd.reg_desc_active) || + !readl (txq->bd.reg_desc_active)) +writel (0 , txq->bd.reg_desc_active);return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 139/183 octeon_ep: Fix host hang issue during device reboot
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sathesh B Edara <[email protected]>
[ Upstream commit 34f42736b325287a7b2ce37e415838f539767bda ]
When the host loses heartbeat messages from the device, the driver calls the device-specific ndo_stop function, which frees the resources. If the driver is unloaded in this scenario, it calls ndo_stop again, attempting to free resources that have already been freed, leading to a host hang issue. To resolve this, dev_close should be called instead of the device-specific stop function.dev_close internally calls ndo_stop to stop the network interface and performs additional cleanup tasks. During the driver unload process, if the device is already down, ndo_stop is not called.
--- drivers/net/ethernet/marvell/octeon_ep/octep_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/marvell/octeon_ep/octep_main.c +1 -1
@@ -1223,7 +1223,7 @@ static void octep_hb_timeout_task(struct work_struct *work) miss_cnt);rtnl_lock ();if (netif_running (oct->netdev)) -octep_stop (oct->netdev); +dev_close (oct->netdev);rtnl_unlock (); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 140/183 net: hns3: store rx VLAN tag offload state for VF
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian Shen <[email protected]>
[ Upstream commit ef2383d078edcbe3055032436b16cdf206f26de2 ]
The VF driver missed to store the rx VLAN tag strip state when user change the rx VLAN tag offload state. And it will default to enable the rx vlan tag strip when re-init VF device after reset. So if user disable rx VLAN tag offload, and trig reset, then the HW will still strip the VLAN tag from packet nad fill into RX BD, but the VF driver will ignore it for rx VLAN tag offload disabled. It may cause the rx VLAN tag dropped.
--- .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++++----- .../hisilicon/hns3/hns3vf/hclgevf_main.h | 1 + 2 files changed, 20 insertions(+), 6 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +19 -6
@@ -1292,9 +1292,8 @@ static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev)rtnl_unlock (); } -static int hclgevf_en_hw_strip_rxvtag (struct hnae3_handle *handle,bool enable) +static int hclgevf_en_hw_strip_rxvtag_cmd (struct hclgevf_dev *hdev,bool enable) { -struct hclgevf_dev *hdev =hclgevf_ae_get_hdev (handle);struct hclge_vf_to_pf_msg send_msg; hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,
@@ -1303,6 +1302,19 @@ static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)return hclgevf_send_mbx_msg (hdev, &send_msg, false,NULL ,0 ); } +static int hclgevf_en_hw_strip_rxvtag (struct hnae3_handle *handle,bool enable) +{ +struct hclgevf_dev *hdev =hclgevf_ae_get_hdev (handle); +int ret; + + ret =hclgevf_en_hw_strip_rxvtag_cmd (hdev, enable); +if (ret) +return ret; + + hdev->rxvtag_strip_en = enable; +return 0 ; +} +static int hclgevf_reset_tqp (struct hnae3_handle *handle) {#define HCLGEVF_RESET_ALL_QUEUE_DONE 1U
@@ -2204,12 +2216,13 @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev) tc_valid, tc_size); } -static int hclgevf_init_vlan_config (struct hclgevf_dev *hdev) +static int hclgevf_init_vlan_config (struct hclgevf_dev *hdev, +bool rxvtag_strip_en) {struct hnae3_handle *nic = &hdev->nic;int ret; - ret =hclgevf_en_hw_strip_rxvtag (nic, true); + ret =hclgevf_en_hw_strip_rxvtag (nic, rxvtag_strip_en);if (ret) {dev_err (&hdev->pdev->dev,"failed to enable rx vlan offload, ret = %d\n" , ret);
@@ -2879,7 +2892,7 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)if (ret)return ret; - ret =hclgevf_init_vlan_config (hdev); + ret =hclgevf_init_vlan_config (hdev, hdev->rxvtag_strip_en);if (ret) {dev_err (&hdev->pdev->dev,"failed(%d) to initialize VLAN config\n" , ret);
@@ -2994,7 +3007,7 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) goto err_config; } - ret =hclgevf_init_vlan_config (hdev); + ret =hclgevf_init_vlan_config (hdev, true);if (ret) {dev_err (&hdev->pdev->dev,"failed(%d) to initialize VLAN config\n" , ret);
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h +1 -0
@@ -253,6 +253,7 @@ struct hclgevf_dev {int *vector_irq;bool gro_en; +bool rxvtag_strip_en;unsigned long vlan_del_fail_bmap[BITS_TO_LONGS (VLAN_N_VID )];
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 141/183 net: hns3: fix an interrupt residual problem
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonglong Liu <[email protected]>
[ Upstream commit 8e6b9c6ea5a55045eed6526d8ee49e93192d1a58 ]
When a VF is passthrough to a VM, and the VM is killed, the reported interrupt may not been handled, it will remain, and won't be clear by the nic engine even with a flr or tqp reset. When the VM restart, the interrupt of the first vector may be dropped by the second enable_irq in vfio, see the issue below:
https://gitlab.com/qemu-project/qemu/-/issues/2884#note_2423361621
We notice that the vfio has always behaved this way, and the interrupt is a residue of the nic engine, so we fix the problem by moving the vector enable process out of the enable_irq loop.
--- .../net/ethernet/hisilicon/hns3/hns3_enet.c | 82 +++++++++---------- 1 file changed, 39 insertions(+), 43 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +39 -43
@@ -473,20 +473,14 @@ static void hns3_mask_vector_irq(struct hns3_enet_tqp_vector *tqp_vector,writel (mask_en, tqp_vector->mask_addr); } -static void hns3_vector_enable (struct hns3_enet_tqp_vector *tqp_vector) +static void hns3_irq_enable (struct hns3_enet_tqp_vector *tqp_vector) {napi_enable (&tqp_vector->napi);enable_irq (tqp_vector->vector_irq); - -/* enable vector */ -hns3_mask_vector_irq (tqp_vector,1 ); } -static void hns3_vector_disable (struct hns3_enet_tqp_vector *tqp_vector) +static void hns3_irq_disable (struct hns3_enet_tqp_vector *tqp_vector) { -/* disable vector */ -hns3_mask_vector_irq (tqp_vector,0 ); -disable_irq (tqp_vector->vector_irq);napi_disable (&tqp_vector->napi);cancel_work_sync (&tqp_vector->rx_group.dim.work);
@@ -707,11 +701,42 @@ static int hns3_set_rx_cpu_rmap(struct net_device *netdev)return 0 ; } +static void hns3_enable_irqs_and_tqps (struct net_device *netdev) +{ +struct hns3_nic_priv *priv =netdev_priv (netdev); +struct hnae3_handle *h = priv->ae_handle; +u16 i; + +for (i =0 ; i < priv->vector_num; i++) +hns3_irq_enable (&priv->tqp_vector[i]); + +for (i =0 ; i < priv->vector_num; i++) +hns3_mask_vector_irq (&priv->tqp_vector[i],1 ); + +for (i =0 ; i < h->kinfo.num_tqps; i++) +hns3_tqp_enable (h->kinfo.tqp[i]); +} + +static void hns3_disable_irqs_and_tqps (struct net_device *netdev) +{ +struct hns3_nic_priv *priv =netdev_priv (netdev); +struct hnae3_handle *h = priv->ae_handle; +u16 i; + +for (i =0 ; i < h->kinfo.num_tqps; i++) +hns3_tqp_disable (h->kinfo.tqp[i]); + +for (i =0 ; i < priv->vector_num; i++) +hns3_mask_vector_irq (&priv->tqp_vector[i],0 ); + +for (i =0 ; i < priv->vector_num; i++) +hns3_irq_disable (&priv->tqp_vector[i]); +} +static int hns3_nic_net_up (struct net_device *netdev) {struct hns3_nic_priv *priv =netdev_priv (netdev);struct hnae3_handle *h = priv->ae_handle; -int i, j;int ret; ret =hns3_nic_reset_all_ring (h);
@@ -720,23 +745,13 @@ static int hns3_nic_net_up(struct net_device *netdev)clear_bit (HNS3_NIC_STATE_DOWN , &priv->state); -/* enable the vectors */ -for (i =0 ; i < priv->vector_num; i++) -hns3_vector_enable (&priv->tqp_vector[i]); - -/* enable rcb */ -for (j =0 ; j < h->kinfo.num_tqps; j++) -hns3_tqp_enable (h->kinfo.tqp[j]); +hns3_enable_irqs_and_tqps (netdev);/* start the ae_dev */ ret = h->ae_algo->ops->start ? h->ae_algo->ops->start (h) :0 ;if (ret) {set_bit (HNS3_NIC_STATE_DOWN , &priv->state); -while (j--) -hns3_tqp_disable (h->kinfo.tqp[j]); - -for (j = i -1 ; j >=0 ; j--) -hns3_vector_disable (&priv->tqp_vector[j]); +hns3_disable_irqs_and_tqps (netdev); }return ret;
@@ -823,17 +838,9 @@ static void hns3_reset_tx_queue(struct hnae3_handle *h)static void hns3_nic_net_down (struct net_device *netdev) {struct hns3_nic_priv *priv =netdev_priv (netdev); -struct hnae3_handle *h =hns3_get_handle (netdev);const struct hnae3_ae_ops *ops; -int i; -/* disable vectors */ -for (i =0 ; i < priv->vector_num; i++) -hns3_vector_disable (&priv->tqp_vector[i]); - -/* disable rcb */ -for (i =0 ; i < h->kinfo.num_tqps; i++) -hns3_tqp_disable (h->kinfo.tqp[i]); +hns3_disable_irqs_and_tqps (netdev);/* stop ae_dev */ ops = priv->ae_handle->ae_algo->ops;
@@ -5864,8 +5871,6 @@ int hns3_set_channels(struct net_device *netdev,void hns3_external_lb_prepare (struct net_device *ndev,bool if_running) {struct hns3_nic_priv *priv =netdev_priv (ndev); -struct hnae3_handle *h = priv->ae_handle; -int i;if (!if_running)return ;
@@ -5876,11 +5881,7 @@ void hns3_external_lb_prepare(struct net_device *ndev, bool if_running)netif_carrier_off (ndev);netif_tx_disable (ndev); -for (i =0 ; i < priv->vector_num; i++) -hns3_vector_disable (&priv->tqp_vector[i]); - -for (i =0 ; i < h->kinfo.num_tqps; i++) -hns3_tqp_disable (h->kinfo.tqp[i]); +hns3_disable_irqs_and_tqps (ndev);/* delay ring buffer clearing to hns3_reset_notify_uninit_enet * during reset process, because driver may not be able
@@ -5896,7 +5897,6 @@ void hns3_external_lb_restore(struct net_device *ndev, bool if_running) {struct hns3_nic_priv *priv =netdev_priv (ndev);struct hnae3_handle *h = priv->ae_handle; -int i;if (!if_running)return ;
@@ -5912,11 +5912,7 @@ void hns3_external_lb_restore(struct net_device *ndev, bool if_running)clear_bit (HNS3_NIC_STATE_DOWN , &priv->state); -for (i =0 ; i < priv->vector_num; i++) -hns3_vector_enable (&priv->tqp_vector[i]); - -for (i =0 ; i < h->kinfo.num_tqps; i++) -hns3_tqp_enable (h->kinfo.tqp[i]); +hns3_enable_irqs_and_tqps (ndev);netif_tx_wake_all_queues (ndev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 142/183 net: hns3: fixed debugfs tm_qset size
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hao Lan <[email protected]>
[ Upstream commit e317aebeefcb3b0c71f2305af3c22871ca6b3833 ]
The size of the tm_qset file of debugfs is limited to 64 KB, which is too small in the scenario with 1280 qsets. The size needs to be expanded to 1 MB.
--- drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c +1 -1
@@ -60,7 +60,7 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = { .name = "tm_qset", .cmd = HNAE3_DBG_CMD_TM_QSET, .dentry = HNS3_DBG_DENTRY_TM, - .buf_len = HNS3_DBG_READ_LEN, + .buf_len = HNS3_DBG_READ_LEN_1MB, .init = hns3_dbg_common_file_init, }, {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 143/183 net: hns3: defer calling ptp_clock_register()
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian Shen <[email protected]>
[ Upstream commit 4971394d9d624f91689d766f31ce668d169d9959 ]
Currently the ptp_clock_register() is called before relative ptp resource ready. It may cause unexpected result when upper layer called the ptp API during the timewindow. Fix it by moving the ptp_clock_register() to the function end.
--- .../net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c +7 -6
@@ -439,6 +439,13 @@ static int hclge_ptp_create_clock(struct hclge_dev *hdev) ptp->info.settime64 = hclge_ptp_settime; ptp->info.n_alarm =0 ; + +spin_lock_init (&ptp->lock); + ptp->io_base = hdev->hw.hw.io_base +HCLGE_PTP_REG_OFFSET ; + ptp->ts_cfg.rx_filter =HWTSTAMP_FILTER_NONE ; + ptp->ts_cfg.tx_type =HWTSTAMP_TX_OFF ; + hdev->ptp = ptp; + ptp->clock =ptp_clock_register (&ptp->info, &hdev->pdev->dev);if (IS_ERR (ptp->clock)) { dev_err(&hdev->pdev->dev,
@@ -450,12 +457,6 @@ static int hclge_ptp_create_clock(struct hclge_dev *hdev)return -ENODEV ; } -spin_lock_init (&ptp->lock); - ptp->io_base = hdev->hw.hw.io_base +HCLGE_PTP_REG_OFFSET ; - ptp->ts_cfg.rx_filter =HWTSTAMP_FILTER_NONE ; - ptp->ts_cfg.tx_type =HWTSTAMP_TX_OFF ; - hdev->ptp = ptp; -return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 144/183 net: vertexcom: mse102x: Fix possible stuck of SPI interrupt
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
[ Upstream commit 55f362885951b2d00fd7fbb02ef0227deea572c2 ]
The MSE102x doesn't provide any SPI commands for interrupt handling. So in case the interrupt fired before the driver requests the IRQ, the interrupt will never fire again. In order to fix this always poll for pending packets after opening the interface.
--- drivers/net/ethernet/vertexcom/mse102x.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/ethernet/vertexcom/mse102x.c +8 -0
@@ -509,6 +509,7 @@ static irqreturn_t mse102x_irq(int irq, void *_mse)static int mse102x_net_open (struct net_device *ndev) {struct mse102x_net *mse =netdev_priv (ndev); +struct mse102x_net_spi *mses =to_mse102x_spi (mse);int ret; ret = request_threaded_irq(ndev->irq, NULL, mse102x_irq, IRQF_ONESHOT,
@@ -524,6 +525,13 @@ static int mse102x_net_open(struct net_device *ndev)netif_carrier_on (ndev); +/* The SPI interrupt can stuck in case of pending packet(s). +* So poll for possible packet(s) to re-arm the interrupt. +*/ +mutex_lock (&mses->lock); +mse102x_rx_pkt_spi (mse); +mutex_unlock (&mses->lock); +netif_dbg (mse, ifup, ndev,"network device up\n" );return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 145/183 net: vertexcom: mse102x: Fix LEN_MASK
In reply to Greg Kroah-Hartman6.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
[ Upstream commit 74987089ec678b4018dba0a609e9f4bf6ef7f4ad ]
The LEN_MASK for CMD_RTS doesn't cover the whole parameter mask. The Bit 11 is reserved, so adjust LEN_MASK accordingly.
--- drivers/net/ethernet/vertexcom/mse102x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/vertexcom/mse102x.c +1 -1
@@ -33,7 +33,7 @@#define CMD_CTR (0x2 << CMD_SHIFT)#define CMD_MASK GENMASK(15, CMD_SHIFT) -#define LEN_MASK GENMASK(CMD_SHIFT - 1, 0) +#define LEN_MASK GENMASK(CMD_SHIFT - 2, 0)#define DET_CMD_LEN 4#define DET_SOF_LEN 2
Signature · 1 line
2.39.5