6.6.30-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainercover 6.6.30-rc1 review
This is the start of the stable review cycle for the 6.6.30 release. There are 186 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 02 May 2024 10:30:27 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.30-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.6.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.6.30-rc1
Matthew Wilcox (Oracle) <[email protected]>
bounds: Use the right number of bits for power-of-two CONFIG_NR_CPUS
Rahul Rameshbabu <[email protected]>
net/mlx5e: Advertise mlx5 ethernet driver updates sk_buff md_dst for MACsec
Rahul Rameshbabu <[email protected]>
macsec: Detect if Rx skb is macsec-related for offloading devices that update md_dst
Rahul Rameshbabu <[email protected]>
macsec: Enable devices to advertise whether they update sk_buff md_dst during offloads
Mingzheng Xing <[email protected]>
Revert "riscv: kdump: fix crashkernel reserving problem on RISC-V"
Amir Goldstein <[email protected]>
ovl: fix memory leak in ovl_parse_param()
Johan Hovold <[email protected]>
phy: qcom: qmp-combo: fix VCO div offset on v5_5nm and v6
Wolfram Sang <[email protected]>
i2c: smbus: fix NULL function pointer dereference
Xuewen Yan <[email protected]>
sched/eevdf: Prevent vlag from going out of bounds in reweight_eevdf()
Tianchen Ding <[email protected]>
sched/eevdf: Fix miscalculation in reweight_entity() when se is not curr
Tianchen Ding <[email protected]>
sched/eevdf: Always update V if se->on_rq when reweighting
Hans de Goede <[email protected]>
phy: ti: tusb1210: Resolve charger-det crash if charger psy is unregistered
Samuel Holland <[email protected]>
riscv: Fix loading 64-bit NOMMU kernels past the start of RAM
Samuel Holland <[email protected]>
riscv: Fix TASK_SIZE on 64-bit NOMMU
Baoquan He <[email protected]>
riscv: fix VMALLOC_START definition
Fenghua Yu <[email protected]>
dmaengine: idxd: Fix oops during rmmod on single-CPU platforms
Sean Anderson <[email protected]>
dma: xilinx_dpdma: Fix locking
Rex Zhang <[email protected]>
dmaengine: idxd: Convert spinlock to mutex to lock evl workqueue
Gabor Juhos <[email protected]>
phy: qcom: m31: match requested regulator name with dt schema
Sebastian Reichel <[email protected]>
phy: rockchip: naneng-combphy: Fix mux on rk3588
Sebastian Reichel <[email protected]>
phy: rockchip-snps-pcie3: fix clearing PHP_GRF_PCIESEL_CON bits
Michal Tomek <[email protected]>
phy: rockchip-snps-pcie3: fix bifurcation on rk3588
Marcel Ziswiler <[email protected]>
phy: freescale: imx8m-pcie: fix pcie link-up instability
Mikhail Kobuk <[email protected]>
phy: marvell: a3700-comphy: Fix hardcoded array size
Mikhail Kobuk <[email protected]>
phy: marvell: a3700-comphy: Fix out of bounds read
Vijendar Mukunda <[email protected]>
soundwire: amd: fix for wake interrupt handling for clockstop mode
Andy Shevchenko <[email protected]>
idma64: Don't try to serve interrupts when device is powered off
Akhil R <[email protected]>
dmaengine: tegra186: Fix residual calculation
Arnd Bergmann <[email protected]>
dmaengine: owl: fix register access functions
Matthew Wilcox (Oracle) <[email protected]>
mm: turn folio_test_hugetlb into a PageType
Kirill A. Shutemov <[email protected]>
x86/tdx: Preserve shared bit on mprotect()
Stephen Boyd <[email protected]>
phy: qcom: qmp-combo: Fix VCO div offset on v3
Stephen Boyd <[email protected]>
phy: qcom: qmp-combo: Fix register base for QSERDES_DP_PHY_MODE
Arnd Bergmann <[email protected]>
mtd: diskonchip: work around ubsan link failure
Yick Xie <[email protected]>
udp: preserve the connected status if only UDP cmsg
Nam Cao <[email protected]>
fbdev: fix incorrect address computation in deferred IO
Andrey Ryabinin <[email protected]>
stackdepot: respect __GFP_NOLOCKDEP allocation flag
Peter Münster <[email protected]>
net: b44: set pause params only when interface is up
Rahul Rameshbabu <[email protected]>
ethernet: Add helper for assigning packet type when dest address does not match device address
Vanshidhar Konda <[email protected]>
ACPI: CPPC: Fix access width used for PCC registers
Jarred White <[email protected]>
ACPI: CPPC: Fix bit_offset shift in MASK_VAL() macro
Jarred White <[email protected]>
ACPI: CPPC: Use access_width over bit_width for system memory accesses
Guanrui Huang <[email protected]>
irqchip/gic-v3-its: Prevent double free on error
Mukul Joshi <[email protected]>
drm/amdgpu: Fix leak when GPU memory allocation fails
Lijo Lazar <[email protected]>
drm/amdgpu: Assign correct bits for SDMA HDP flush
Alex Deucher <[email protected]>
drm/amdgpu/sdma5.2: use legacy HDP flush for SDMA2/3
Iskander Amara <[email protected]>
arm64: dts: rockchip: enable internal pull-up for Q7_THRM# on RK3399 Puma
Manivannan Sadhasivam <[email protected]>
arm64: dts: qcom: sm8450: Fix the msi-map entries
Johan Hovold <[email protected]>
arm64: dts: qcom: sc8280xp: add missing PCIe minimum OPP
Jiantao Shan <[email protected]>
LoongArch: Fix access error when read fault on a write-only VMA
Huacai Chen <[email protected]>
LoongArch: Fix callchain parse error with kernel tracepoint events
Sean Christopherson <[email protected]>
cpu: Re-enable CPU mitigations by default for !X86 architectures
Johannes Thumshirn <[email protected]>
btrfs: fix information leak in btrfs_ioctl_logical_to_ino()
Naohiro Aota <[email protected]>
btrfs: scrub: run relocation repair when/only needed
Qu Wenruo <[email protected]>
btrfs: fix wrong block_start calculation for btrfs_drop_extent_map_range()
Sweet Tea Dorminy <[email protected]>
btrfs: fallback if compressed IO fails for ENOSPC
Nam Cao <[email protected]>
HID: i2c-hid: remove I2C_HID_READ_PENDING flag to prevent lock-up
Steve French <[email protected]>
smb3: fix lock ordering potential deadlock in cifs_sync_mid_result
Steve French <[email protected]>
smb3: missing lock when picking channel
Gustavo A. R. Silva <[email protected]>
smb: client: Fix struct_group() usage in __packed structs
Matthew Wilcox (Oracle) <[email protected]>
mm: support page_mapcount() on page_has_type() pages
Matthew Wilcox (Oracle) <[email protected]>
mm: create FOLIO_FLAG_FALSE and FOLIO_TYPE_OPS macros
Mantas Pucka <[email protected]>
mmc: sdhci-msm: pervent access to suspended controller
Peter Xu <[email protected]>
mm/hugetlb: fix missing hugetlb_lock for resv uncharge
Christian Marangi <[email protected]>
mtd: rawnand: qcom: Fix broken OP_RESET_DEVICE command in qcom_misc_cmd_type_exec()
Johan Hovold <[email protected]>
Bluetooth: qca: fix NULL-deref on non-serdev setup
Johan Hovold <[email protected]>
Bluetooth: qca: fix NULL-deref on non-serdev suspend
WangYuli <[email protected]>
Bluetooth: btusb: Add Realtek RTL8852BE support ID 0x0bda:0x4853
Nathan Chancellor <[email protected]>
Bluetooth: Fix type of len in {l2cap,sco}_sock_getsockopt_old()
Aswin Unnikrishnan <[email protected]>
rust: remove params from module macro example
Miguel Ojeda <[email protected]>
kbuild: rust: force alloc extern to allow "empty" Rust files
Miguel Ojeda <[email protected]>
kbuild: rust: remove unneeded @rustc_cfg to avoid ICE
Conor Dooley <[email protected]>
rust: make mutually exclusive with CFI_CLANG
Laine Taffin Altman <[email protected]>
rust: init: remove impl Zeroable for Infallible
Alice Ryhl <[email protected]>
rust: don't select CONSTRUCTORS
David Kaplan <[email protected]>
x86/cpu: Fix check for RDPKRU in __show_regs()
Miaohe Lin <[email protected]>
fork: defer linking file vma until vma is fully initialized
Terry Tritton <[email protected]>
selftests/seccomp: Handle EINVAL on unshare(CLONE_NEWPID)
Terry Tritton <[email protected]>
selftests/seccomp: Change the syscall used in KILL_THREAD test
Terry Tritton <[email protected]>
selftests/seccomp: user_notification_addfd check nextfd is available
Phillip Lougher <[email protected]>
Squashfs: check the inode number is not the invalid value of zero
Jeff Layton <[email protected]>
squashfs: convert to new timestamp accessors
Christian König <[email protected]>
drm/ttm: stop pooling cached NUMA pages v2
Kirill A. Shutemov <[email protected]>
mm, treewide: introduce NR_PAGE_ORDERS
Christian König <[email protected]>
drm/amdgpu: fix visible VRAM handling during faults
Alex Deucher <[email protected]>
drm/amdgpu: add shared fdinfo stats
Alex Deucher <[email protected]>
drm: add drm_gem_object_is_shared_for_memory_stats() helper
David Hildenbrand <[email protected]>
mm/madvise: make MADV_POPULATE_(READ|WRITE) handle VM_FAULT_RETRY properly
Lorenzo Stoakes <[email protected]>
mm/gup: explicitly define and check internal GUP flags, disallow FOLL_TOUCH
Sean Christopherson <[email protected]>
KVM: x86/pmu: Set enable bits for GP counters in PERF_GLOBAL_CTRL at "RESET"
Sean Christopherson <[email protected]>
KVM: x86/pmu: Zero out PMU metadata on AMD if PMU is disabled
Kuniyuki Iwashima <[email protected]>
af_unix: Suppress false-positive lockdep splat for spin_lock() in __unix_gc().
Sabrina Dubroca <[email protected]>
tls: fix lockless read of strp->msg_ready in ->poll
Jason Reeder <[email protected]>
net: ethernet: ti: am65-cpts: Fix PTPv1 message type on TX packets
Jacob Keller <[email protected]>
ice: fix LAG and VF lock dependency in ice_reset_vf()
Sudheer Mogilappagari <[email protected]>
iavf: Fix TC config comparison with existing adapter TC config
Erwan Velu <[email protected]>
i40e: Report MFS in decimal base instead of hex
Sindhu Devale <[email protected]>
i40e: Do not use WQ_MEM_RECLAIM flag for workqueue
Dan Carpenter <[email protected]>
net: ti: icssg-prueth: Fix signedness bug in prueth_init_rx_chns()
MD Danish Anwar <[email protected]>
net: phy: dp83869: Fix MII mode failure
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: honor table dormant flag from netdev release event path
Michael Heimpold <[email protected]>
ARM: dts: imx6ull-tarragon: fix USB over-current polarity
Jakub Kicinski <[email protected]>
eth: bnxt: fix counting packets discarded due to OOM and netpoll
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_tcam: Fix memory leak when canceling rehash work
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_tcam: Fix incorrect list API usage
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_tcam: Fix warning during rehash
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_tcam: Fix memory leak during rehash
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_tcam: Rate limit error message
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_tcam: Fix possible use-after-free during rehash
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_tcam: Fix possible use-after-free during activity update
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_tcam: Fix race during rehash delayed work
Ido Schimmel <[email protected]>
mlxsw: spectrum_acl_tcam: Fix race in region ID allocation
Amit Cohen <[email protected]>
mlxsw: Use refcount_t for reference counting
Hyunwoo Kim <[email protected]>
net: openvswitch: Fix Use-After-Free in ovs_ct_exit
Ismael Luceno <[email protected]>
ipvs: Fix checksumming on GSO of SCTP packets
Bartosz Golaszewski <[email protected]>
Bluetooth: qca: set power_ctrl_enabled on NULL returned by gpiod_get_optional()
Chun-Yi Lee <[email protected]>
Bluetooth: hci_sync: Using hci_cmd_sync_submit when removing Adv Monitor
Sean Wang <[email protected]>
Bluetooth: btusb: mediatek: Fix double free of skb in coredump
Luiz Augusto von Dentz <[email protected]>
Bluetooth: MGMT: Fix failing to MGMT_OP_ADD_UUID/MGMT_OP_REMOVE_UUID
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_event: Fix sending HCI_OP_READ_ENC_KEY_SIZE
Zijun Hu <[email protected]>
Bluetooth: btusb: Fix triggering coredump implementation for QCA
Prathamesh Shete <[email protected]>
gpio: tegra186: Fix tegra186_gpio_is_accessible() check
Daniel Golle <[email protected]>
net: phy: mediatek-ge-soc: follow netdev LED trigger semantics
Hyunwoo Kim <[email protected]>
net: gtp: Fix Use-After-Free in gtp_dellink
Eric Dumazet <[email protected]>
net: usb: ax88179_178a: stop lying about skb->truesize
Eric Dumazet <[email protected]>
ipv4: check for NULL idev in ip_route_use_hint()
Eric Dumazet <[email protected]>
net: fix sk_memory_allocated_{add|sub} vs softirqs
Adam Li <[email protected]>
net: make SK_MEMORY_PCPU_RESERV tunable
Jakub Kicinski <[email protected]>
tools: ynl: don't ignore errors in NLMSG_DONE messages
Duoming Zhou <[email protected]>
ax25: Fix netdev refcount issue
Paul Geurts <[email protected]>
NFC: trf7970a: disable all regulators on removal
Matthias Schiffer <[email protected]>
net: dsa: mv88e6xx: fix supported_interfaces setup in mv88e6250_phylink_get_caps()
Dan Williams <[email protected]>
cxl/core: Fix potential payload size confusion in cxl_mem_get_poison()
Vikas Gupta <[email protected]>
bnxt_en: Fix the PCI-AER routines
Vikas Gupta <[email protected]>
bnxt_en: refactor reset close code
Hangbin Liu <[email protected]>
bridge/br_netlink.c: no need to return void function
Eric Dumazet <[email protected]>
icmp: prevent possible NULL dereferences from icmp_build_probe()
Andrei Simion <[email protected]>
ARM: dts: microchip: at91-sama7g5ek: Replace regulator-suspend-voltage with the valid property
Ido Schimmel <[email protected]>
mlxsw: core_env: Fix driver initialization with old firmware
Ido Schimmel <[email protected]>
mlxsw: core: Unregister EMAD trap using FORWARD action
Justin Chen <[email protected]>
net: bcmasp: fix memory leak when bringing down interface
David Bauer <[email protected]>
vxlan: drop packets from invalid src-address
Duanqiang Wen <[email protected]>
net: libwx: fix alloc msix vectors failed
Johannes Berg <[email protected]>
wifi: mac80211: fix unaligned le16 access
Johannes Berg <[email protected]>
wifi: mac80211: remove link before AP
Johannes Berg <[email protected]>
wifi: mac80211_hwsim: init peer measurement result
Patrik Jakobsson <[email protected]>
drm/gma500: Remove lid code
Miri Korenblit <[email protected]>
wifi: iwlwifi: mvm: return uid from iwl_mvm_build_scan_cmd
Avraham Stern <[email protected]>
wifi: iwlwifi: mvm: remove old PASN station when adding a new one
Felix Fietkau <[email protected]>
wifi: mac80211: split mesh fast tx cache into local/proxied/forwarded
Colin Ian King <[email protected]>
wifi: mac80211: clean up assignments to pointer cache.
Alexey Brodkin <[email protected]>
ARC: [plat-hsdk]: Remove misplaced interrupt-cells property
Andy Shevchenko <[email protected]>
gpio: tangier: Use correct type for the IRQ chip data
Maximilian Luz <[email protected]>
arm64: dts: qcom: sc8180x: Fix ss_phy_irq for secondary USB controller
Jose Ignacio Tornos Martinez <[email protected]>
arm64: dts: rockchip: regulator for sd needs to be always on for BPI-R2Pro
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt2712: fix validation errors
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7986: prefix BPI-R3 cooling maps with "map-"
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7986: drop invalid thermal block clock
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7986: reorder nodes
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7986: drop "#reset-cells" from Ethernet controller
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7986: drop invalid properties from ethsys
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7986: reorder properties
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7622: drop "reset-names" from thermal block
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7622: fix ethernet controller "compatible"
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7622: fix IR nodename
Rafał Miłecki <[email protected]>
arm64: dts: mediatek: mt7622: fix clock controllers
Pin-yen Lin <[email protected]>
arm64: dts: mediatek: mt8183-kukui: Use default min voltage for MT6358
Pin-yen Lin <[email protected]>
arm64: dts: mediatek: mt8195-cherry: Update min voltage constraint for MT6315
Pin-yen Lin <[email protected]>
arm64: dts: mediatek: mt8192-asurada: Update min voltage constraint for MT6315
Nícolas F. R. A. Prado <[email protected]>
arm64: dts: mediatek: cherry: Describe CPU supplies
AngeloGioacchino Del Regno <[email protected]>
arm64: dts: mediatek: cherry: Add platform thermal configuration
Nícolas F. R. A. Prado <[email protected]>
arm64: dts: mediatek: mt8195: Add missing gce-client-reg to mutex1
Nícolas F. R. A. Prado <[email protected]>
arm64: dts: mediatek: mt8195: Add missing gce-client-reg to mutex
Nícolas F. R. A. Prado <[email protected]>
arm64: dts: mediatek: mt8195: Add missing gce-client-reg to vpp/vdosys
Nícolas F. R. A. Prado <[email protected]>
arm64: dts: mediatek: mt8192: Add missing gce-client-reg to mutex
Ikjoon Jang <[email protected]>
arm64: dts: mediatek: mt8183: Add power-domains properity to mfgcfg
Dragan Simic <[email protected]>
arm64: dts: rockchip: Remove unsupported node from the Pinebook Pro dts
Quentin Schulz <[email protected]>
arm64: dts: rockchip: enable internal pull-up on PCIE_WAKE# for RK3399 Puma
Iskander Amara <[email protected]>
arm64: dts: rockchip: fix alphabetical ordering RK3399 puma
Quentin Schulz <[email protected]>
arm64: dts: rockchip: enable internal pull-up on Q7_USB_ID for RK3399 Puma
Arınç ÜNAL <[email protected]>
arm64: dts: rockchip: set PHY address of MT7531 switch to 0x1f
Yaraslau Furman <[email protected]>
HID: logitech-dj: allow mice to use all types of reports
Zhang Lixu <[email protected]>
HID: intel-ish-hid: ipc: Fix dev_err usage with uninitialized dev->devc
Takayuki Nagata <[email protected]>
cifs: reinstate original behavior again for forceuid/forcegid
Paulo Alcantara <[email protected]>
smb: client: fix rename(2) regression against samba
David Howells <[email protected]>
cifs: Fix reacquisition of volume cookie on still-live connection
-------------
Diffstat:
Documentation/admin-guide/kdump/vmcoreinfo.rst | 6 +- Documentation/admin-guide/sysctl/net.rst | 5 + Makefile | 4 +- arch/Kconfig | 8 + arch/arc/boot/dts/hsdk.dts | 1 - arch/arm/boot/dts/microchip/at91-sama7g5ek.dts | 8 +- .../boot/dts/nxp/imx/imx6ull-tarragon-common.dtsi | 1 + arch/arm64/boot/dts/mediatek/mt2712-evb.dts | 8 +- arch/arm64/boot/dts/mediatek/mt2712e.dtsi | 3 +- arch/arm64/boot/dts/mediatek/mt7622.dtsi | 34 ++-- .../boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts | 6 +- arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 215 ++++++++++----------- arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 1 - arch/arm64/boot/dts/mediatek/mt8183.dtsi | 1 + arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi | 6 +- arch/arm64/boot/dts/mediatek/mt8192.dtsi | 1 + arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi | 141 +++++++++++++- arch/arm64/boot/dts/mediatek/mt8195.dtsi | 5 + arch/arm64/boot/dts/qcom/sc8180x.dtsi | 2 +- arch/arm64/boot/dts/qcom/sc8280xp.dtsi | 5 + arch/arm64/boot/dts/qcom/sm8450.dtsi | 16 +- .../boot/dts/rockchip/rk3399-pinebook-pro.dts | 1 - arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 31 ++- arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 6 +- arch/arm64/kvm/hyp/include/nvhe/gfp.h | 2 +- arch/loongarch/include/asm/perf_event.h | 8 + arch/loongarch/mm/fault.c | 4 +- arch/riscv/include/asm/page.h | 2 +- arch/riscv/include/asm/pgtable.h | 4 +- arch/riscv/kernel/setup.c | 13 ++ arch/riscv/mm/init.c | 2 +- arch/sparc/kernel/traps_64.c | 2 +- arch/x86/Kconfig | 11 +- arch/x86/include/asm/coco.h | 5 +- arch/x86/include/asm/pgtable_types.h | 3 +- arch/x86/kernel/process_64.c | 2 +- arch/x86/kvm/pmu.c | 30 ++- arch/x86/kvm/vmx/pmu_intel.c | 16 +- drivers/acpi/cppc_acpi.c | 72 +++++-- drivers/bluetooth/btmtk.c | 7 +- drivers/bluetooth/btusb.c | 11 +- drivers/bluetooth/hci_qca.c | 27 ++- drivers/cxl/core/mbox.c | 38 ++-- drivers/dma/idma64.c | 4 + drivers/dma/idxd/cdev.c | 5 +- drivers/dma/idxd/debugfs.c | 4 +- drivers/dma/idxd/device.c | 8 +- drivers/dma/idxd/idxd.h | 2 +- drivers/dma/idxd/init.c | 2 +- drivers/dma/idxd/irq.c | 4 +- drivers/dma/idxd/perfmon.c | 9 +- drivers/dma/owl-dma.c | 4 +- drivers/dma/tegra186-gpc-dma.c | 3 + drivers/dma/xilinx/xilinx_dpdma.c | 13 +- drivers/gpio/gpio-tangier.c | 9 +- drivers/gpio/gpio-tegra186.c | 20 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c | 4 + drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 33 ++-- drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 28 +-- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 73 ++++--- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 3 + drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 3 +- drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 24 ++- drivers/gpu/drm/gma500/Makefile | 1 - drivers/gpu/drm/gma500/psb_device.c | 5 +- drivers/gpu/drm/gma500/psb_drv.h | 9 - drivers/gpu/drm/gma500/psb_lid.c | 80 -------- drivers/gpu/drm/ttm/tests/ttm_device_test.c | 2 +- drivers/gpu/drm/ttm/ttm_pool.c | 54 ++++-- drivers/hid/hid-logitech-dj.c | 4 +- drivers/hid/i2c-hid/i2c-hid-core.c | 9 - drivers/hid/intel-ish-hid/ipc/ipc.c | 2 +- drivers/i2c/i2c-core-base.c | 12 +- drivers/irqchip/irq-gic-v3-its.c | 9 +- drivers/mmc/host/sdhci-msm.c | 16 +- drivers/mtd/nand/raw/diskonchip.c | 4 +- drivers/mtd/nand/raw/qcom_nandc.c | 7 +- drivers/net/dsa/mv88e6xxx/chip.c | 56 +++++- drivers/net/dsa/mv88e6xxx/port.h | 23 ++- drivers/net/ethernet/broadcom/asp2/bcmasp_intf.c | 21 +- drivers/net/ethernet/broadcom/b44.c | 14 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 80 ++++---- drivers/net/ethernet/intel/i40e/i40e_main.c | 6 +- drivers/net/ethernet/intel/iavf/iavf_main.c | 30 ++- drivers/net/ethernet/intel/ice/ice_vf_lib.c | 16 +- .../ethernet/mellanox/mlx5/core/en_accel/macsec.c | 1 + drivers/net/ethernet/mellanox/mlxsw/core.c | 2 +- .../mellanox/mlxsw/core_acl_flex_actions.c | 16 +- .../ethernet/mellanox/mlxsw/core_acl_flex_keys.c | 9 +- drivers/net/ethernet/mellanox/mlxsw/core_env.c | 20 +- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c | 11 +- .../ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 132 ++++++++----- .../ethernet/mellanox/mlxsw/spectrum_acl_tcam.h | 5 +- .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 15 +- .../ethernet/mellanox/mlxsw/spectrum_switchdev.c | 8 +- drivers/net/ethernet/ti/am65-cpts.c | 5 + drivers/net/ethernet/ti/icssg/icssg_prueth.c | 8 +- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 2 +- drivers/net/gtp.c | 3 +- drivers/net/macsec.c | 46 ++++- drivers/net/phy/dp83869.c | 3 +- drivers/net/phy/mediatek-ge-soc.c | 43 +++-- drivers/net/usb/ax88179_178a.c | 11 +- drivers/net/vxlan/vxlan_core.c | 4 + .../net/wireless/intel/iwlwifi/mvm/ftm-initiator.c | 2 + drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 3 +- drivers/net/wireless/virtual/mac80211_hwsim.c | 2 +- drivers/nfc/trf7970a.c | 42 ++-- drivers/phy/freescale/phy-fsl-imx8m-pcie.c | 6 +- drivers/phy/marvell/phy-mvebu-a3700-comphy.c | 9 +- drivers/phy/qualcomm/phy-qcom-m31.c | 2 +- drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 12 +- drivers/phy/qualcomm/phy-qcom-qmp.h | 2 + drivers/phy/rockchip/phy-rockchip-naneng-combphy.c | 36 +++- drivers/phy/rockchip/phy-rockchip-snps-pcie3.c | 31 ++- drivers/phy/ti/phy-tusb1210.c | 23 +-- drivers/soundwire/amd_manager.c | 15 ++ drivers/soundwire/amd_manager.h | 3 +- drivers/video/fbdev/core/fb_defio.c | 2 +- fs/btrfs/backref.c | 12 +- fs/btrfs/extent_map.c | 2 +- fs/btrfs/inode.c | 13 +- fs/btrfs/scrub.c | 18 +- fs/btrfs/tests/extent-map-tests.c | 5 + fs/overlayfs/params.c | 11 +- fs/proc/page.c | 7 +- fs/smb/client/cifsfs.c | 1 + fs/smb/client/cifsglob.h | 2 + fs/smb/client/cifspdu.h | 4 +- fs/smb/client/fs_context.c | 12 ++ fs/smb/client/fs_context.h | 2 + fs/smb/client/fscache.c | 13 ++ fs/smb/client/misc.c | 3 + fs/smb/client/smb2pdu.h | 2 +- fs/smb/client/transport.c | 7 +- fs/squashfs/inode.c | 11 +- include/drm/drm_gem.h | 13 ++ include/drm/ttm/ttm_pool.h | 2 +- include/linux/etherdevice.h | 25 +++ include/linux/mm.h | 8 +- include/linux/mmzone.h | 6 +- include/linux/page-flags.h | 146 ++++++++------ include/net/af_unix.h | 3 + include/net/bluetooth/hci_core.h | 4 + include/net/macsec.h | 1 + include/net/sock.h | 41 ++-- include/net/tls.h | 3 +- include/trace/events/mmflags.h | 1 + init/Kconfig | 2 +- kernel/bounds.c | 2 +- kernel/cpu.c | 4 +- kernel/crash_core.c | 7 +- kernel/fork.c | 18 +- kernel/sched/fair.c | 34 ++-- lib/stackdepot.c | 4 +- lib/test_meminit.c | 2 +- mm/compaction.c | 2 +- mm/gup.c | 59 +++--- mm/hugetlb.c | 27 +-- mm/internal.h | 11 +- mm/kmsan/init.c | 2 +- mm/madvise.c | 17 +- mm/page_alloc.c | 13 +- mm/page_reporting.c | 2 +- mm/show_mem.c | 8 +- mm/vmstat.c | 12 +- net/ax25/af_ax25.c | 2 +- net/bluetooth/hci_event.c | 5 +- net/bluetooth/l2cap_sock.c | 7 +- net/bluetooth/mgmt.c | 24 ++- net/bluetooth/sco.c | 7 +- net/bridge/br_netlink.c | 2 +- net/core/sock.c | 1 + net/core/sysctl_net_core.c | 9 + net/ethernet/eth.c | 12 +- net/ipv4/icmp.c | 12 +- net/ipv4/route.c | 3 + net/ipv4/udp.c | 5 +- net/ipv6/udp.c | 5 +- net/mac80211/mesh.c | 8 +- net/mac80211/mesh.h | 36 +++- net/mac80211/mesh_pathtbl.c | 37 ++-- net/mac80211/mlme.c | 9 +- net/mac80211/rx.c | 13 +- net/netfilter/ipvs/ip_vs_proto_sctp.c | 6 +- net/netfilter/nft_chain_filter.c | 4 +- net/openvswitch/conntrack.c | 4 +- net/tls/tls.h | 2 +- net/tls/tls_strp.c | 6 +- net/unix/garbage.c | 2 +- rust/Makefile | 1 - rust/kernel/init.rs | 11 +- rust/macros/lib.rs | 12 -- scripts/Makefile.build | 2 +- tools/net/ynl/lib/ynl.py | 1 + tools/testing/selftests/seccomp/seccomp_bpf.c | 41 +++- 198 files changed, 1787 insertions(+), 1132 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/186 cifs: Fix reacquisition of volume cookie on still-live connection
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit dad80c6bff770d25f67ec25fe011730e4a463008 ]
During mount, cifs_mount_get_tcon() gets a tcon resource connection record and then attaches an fscache volume cookie to it. However, it does this irrespective of whether or not the tcon returned from cifs_get_tcon() is a new record or one that's already in use. This leads to a warning about a volume cookie collision and a leaked volume cookie because tcon->fscache gets reset.
Fix this be adding a mutex and a "we've already tried this" flag and only doing it once for the lifetime of the tcon.
[!] Note: Looking at cifs_mount_get_tcon(), a more general solution may actually be required. Reacquiring the volume cookie isn't the only thing that function does: it also partially reinitialises the tcon record without any locking - which may cause live filesystem ops already using the tcon through a previous mount to malfunction.
This can be reproduced simply by something like:
mount //example.com/test /xfstest.test -o user=shares,pass=xxx,fsc mount //example.com/test /mnt -o user=shares,pass=xxx,fsc
--- fs/smb/client/cifsglob.h | 2 ++ fs/smb/client/fscache.c | 13 +++++++++++++ fs/smb/client/misc.c | 3 +++ 3 files changed, 18 insertions(+)
fs/smb/client/cifsglob.h +2 -0
@@ -1247,7 +1247,9 @@ struct cifs_tcon {__u32 max_cached_dirs;#ifdef CONFIG_CIFS_FSCACHE u64 resource_id;/* server resource id */ +bool fscache_acquired;/* T if we've tried acquiring a cookie */ struct fscache_volume *fscache;/* cookie for share */ +struct mutex fscache_lock;/* Prevent regetting a cookie */ #endif struct list_head pending_opens;/* list of incomplete opens */ struct cached_fids *cfids;
fs/smb/client/fscache.c +13 -0
@@ -43,12 +43,23 @@ int cifs_fscache_get_super_cookie(struct cifs_tcon *tcon)char *key;int ret = -ENOMEM ; +if (tcon->fscache_acquired) +return 0 ; + +mutex_lock (&tcon->fscache_lock); +if (tcon->fscache_acquired) { +mutex_unlock (&tcon->fscache_lock); +return 0 ; + } + tcon->fscache_acquired = true; + tcon->fscache =NULL ;switch (sa->sa_family) {case AF_INET :case AF_INET6 :break ;default : +mutex_unlock (&tcon->fscache_lock);cifs_dbg (VFS ,"Unknown network family '%d'\n" , sa->sa_family);return -EINVAL ; }
@@ -57,6 +68,7 @@ int cifs_fscache_get_super_cookie(struct cifs_tcon *tcon) sharename =extract_sharename (tcon->tree_name);if (IS_ERR (sharename)) { +mutex_unlock (&tcon->fscache_lock);cifs_dbg (FYI ,"%s: couldn't extract sharename\n" , __func__);return PTR_ERR (sharename); }
@@ -90,6 +102,7 @@ int cifs_fscache_get_super_cookie(struct cifs_tcon *tcon)kfree (key); out:kfree (sharename); +mutex_unlock (&tcon->fscache_lock);return ret; }
fs/smb/client/misc.c +3 -0
@@ -141,6 +141,9 @@ tcon_info_alloc(bool dir_leases_enabled)atomic_set (&ret_buf->num_local_opens,0 );atomic_set (&ret_buf->num_remote_opens,0 ); ret_buf->stats_from_time =ktime_get_real_seconds (); +#ifdef CONFIG_CIFS_FSCACHE +mutex_init (&ret_buf->fscache_lock); +#endif return ret_buf; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 2/186 smb: client: fix rename(2) regression against samba
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
[ Upstream commit 18d86965e31f9be4d477da0744a7cdc9815858de ]
After commit 2c7d399e551c ("smb: client: reuse file lease key in compound operations") the client started reusing lease keys for rename, unlink and set path size operations to prevent it from breaking its own leases and thus causing unnecessary lease breaks to same connection.
The implementation relies on positive dentries and cifsInodeInfo::lease_granted to decide whether reusing lease keys for the compound requests. cifsInodeInfo::lease_granted was introduced by commit 0ab95c2510b6 ("Defer close only when lease is enabled.") to indicate whether lease caching is granted for a specific file, but that can only happen until file is open, so cifsInodeInfo::lease_granted was left uninitialised in ->alloc_inode and then client started sending random lease keys for files that hadn't any leases.
This fixes the following test case against samba:
mount.cifs //srv/share /mnt/1 -o ...,nosharesock
mount.cifs //srv/share /mnt/2 -o ...,nosharesock
touch /mnt/1/foo; tail -f /mnt/1/foo & pid=$!
mv /mnt/2/foo /mnt/2/bar # fails with -EIO
kill $pid
--- fs/smb/client/cifsfs.c | 1 + 1 file changed, 1 insertion(+)
fs/smb/client/cifsfs.c +1 -0
@@ -392,6 +392,7 @@ cifs_alloc_inode(struct super_block *sb)* server, can not assume caching of file data or metadata. */ cifs_set_oplock_level (cifs_inode,0 ); + cifs_inode->lease_granted = false; cifs_inode->flags =0 ;spin_lock_init (&cifs_inode->writers_lock); cifs_inode->writers =0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 3/186 cifs: reinstate original behavior again for forceuid/forcegid
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takayuki Nagata <[email protected]>
[ Upstream commit 77d8aa79ecfb209308e0644c02f655122b31def7 ]
forceuid/forcegid should be enabled by default when uid=/gid= options are specified, but commit 24e0a1eff9e2 ("cifs: switch to new mount api") changed the behavior. Due to the change, a mounted share does not show intentional uid/gid for files and directories even though uid=/gid= options are specified since forceuid/forcegid are not enabled.
This patch reinstates original behavior that overrides uid/gid with specified uid/gid by the options.
--- fs/smb/client/fs_context.c | 12 ++++++++++++ fs/smb/client/fs_context.h | 2 ++ 2 files changed, 14 insertions(+)
fs/smb/client/fs_context.c +12 -0
@@ -714,6 +714,16 @@ static int smb3_fs_context_validate(struct fs_context *fc)/* set the port that we got earlier */ cifs_set_port ((struct sockaddr *)&ctx->dstaddr, ctx->port); +if (ctx->uid_specified && !ctx->forceuid_specified) { + ctx->override_uid =1 ; +pr_notice ("enabling forceuid mount option implicitly because uid= option is specified\n" ); + } + +if (ctx->gid_specified && !ctx->forcegid_specified) { + ctx->override_gid =1 ; +pr_notice ("enabling forcegid mount option implicitly because gid= option is specified\n" ); + } +if (ctx->override_uid && !ctx->uid_specified) { ctx->override_uid =0 ;pr_notice ("ignoring forceuid mount option specified with no uid= option\n" );
@@ -983,12 +993,14 @@ static int smb3_fs_context_parse_param(struct fs_context *fc, ctx->override_uid =0 ; else ctx->override_uid = 1; + ctx->forceuid_specified = true;break ;case Opt_forcegid:if (result.negated) ctx->override_gid =0 ;else ctx->override_gid =1 ; + ctx->forcegid_specified = true;break ;case Opt_perm:if (result.negated)
fs/smb/client/fs_context.h +2 -0
@@ -155,6 +155,8 @@ enum cifs_param { };struct smb3_fs_context { +bool forceuid_specified; +bool forcegid_specified;bool uid_specified;bool cruid_specified;bool gid_specified;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 4/186 HID: intel-ish-hid: ipc: Fix dev_err usage with uninitialized dev->devc
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Lixu <[email protected]>
[ Upstream commit 92826905ae340b7f2b25759a06c8c60bfc476b9f ]
The variable dev->devc in ish_dev_init was utilized by dev_err before it was properly assigned. To rectify this, the assignment of dev->devc has been moved to immediately follow memory allocation.
Without this change "(NULL device *)" is printed for device information.
--- drivers/hid/intel-ish-hid/ipc/ipc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hid/intel-ish-hid/ipc/ipc.c +1 -1
@@ -948,6 +948,7 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev)if (!dev)return NULL ; + dev->devc = &pdev->dev;ishtp_device_init (dev);init_waitqueue_head (&dev->wait_hw_ready);
@@ -983,7 +984,6 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev) } dev->ops = &ish_hw_ops; - dev->devc = &pdev->dev; dev->mtu =IPC_PAYLOAD_SIZE -sizeof (struct ishtp_msg_hdr );return dev; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 5/186 HID: logitech-dj: allow mice to use all types of reports
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yaraslau Furman <[email protected]>
[ Upstream commit 21f28a7eb78dea6c59be6b0a5e0b47bf3d25fcbb ]
You can bind whatever action you want to the mouse's reprogrammable buttons using Windows application. Allow Linux to receive multimedia keycodes.
--- drivers/hid/hid-logitech-dj.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/hid/hid-logitech-dj.c +1 -3
@@ -965,9 +965,7 @@ static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev, }break ;case REPORT_TYPE_MOUSE : - workitem->reports_supported |=STD_MOUSE |HIDPP ; -if (djrcv_dev->type == recvr_type_mouse_only) - workitem->reports_supported |=MULTIMEDIA ; + workitem->reports_supported |=STD_MOUSE |HIDPP |MULTIMEDIA ;break ; } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 6/186 arm64: dts: rockchip: set PHY address of MT7531 switch to 0x1f
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arınç ÜNAL <[email protected]>
[ Upstream commit a2ac2a1b02590a22a236c43c455f421cdede45f5 ]
The MT7531 switch listens on PHY address 0x1f on an MDIO bus. I've got two findings that support this. There's no bootstrapping option to change the PHY address of the switch. The Linux driver hardcodes 0x1f as the PHY address of the switch. So the reg property on the device tree is currently ignored by the Linux driver.
Therefore, describe the correct PHY address on Banana Pi BPI-R2 Pro that has this switch.
--- arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +2 -2
@@ -525,9 +525,9 @@ #address-cells = <1>; #size-cells = <0>; - switch@0 { + switch@1f { compatible = "mediatek,mt7531"; - reg = <0>; + reg = <0x1f>; ports { #address-cells = <1>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 7/186 arm64: dts: rockchip: enable internal pull-up on Q7_USB_ID for RK3399 Puma
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Quentin Schulz <[email protected]>
[ Upstream commit e6b1168f37e3f86d9966276c5a3fff9eb0df3e5f ]
The Q7_USB_ID has a diode used as a level-shifter, and is used as an input pin. The SoC default for this pin is a pull-up, which is correct but the pinconf in the introducing commit missed that, so let's fix this oversight.
--- arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi +1 -1
@@ -443,7 +443,7 @@ usb3 { usb3_id: usb3-id { rockchip,pins = - <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; + <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_up>; }; }; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 8/186 arm64: dts: rockchip: fix alphabetical ordering RK3399 puma
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Iskander Amara <[email protected]>
[ Upstream commit f0abb4b2c7acf3c3e4130dc3f54cd90cf2ae62bc ]
Nodes overridden by their reference should be ordered alphabetically to make it easier to read the DTS. pinctrl node is defined in the wrong location so let's reorder it.
Stable-dep-of: 945a7c857091 ("arm64: dts: rockchip: enable internal pull-up on PCIE_WAKE# for RK3399 Puma")
--- arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi +9 -9
@@ -401,15 +401,6 @@ gpio1830-supply = <&vcc_1v8>; }; -&pmu_io_domains { - status = "okay"; - pmu1830-supply = <&vcc_1v8>; -}; - -&pwm2 { - status = "okay"; -}; - &pinctrl { i2c8 { i2c8_xfer_a: i2c8-xfer {
@@ -448,6 +439,15 @@ }; }; +&pmu_io_domains { + status = "okay"; + pmu1830-supply = <&vcc_1v8>; +}; + +&pwm2 { + status = "okay"; +}; + &sdhci { /* * Signal integrity isn't great at 200MHz but 100MHz has proven stable
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 9/186 arm64: dts: rockchip: enable internal pull-up on PCIE_WAKE# for RK3399 Puma
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Quentin Schulz <[email protected]>
[ Upstream commit 945a7c8570916650a415757d15d83e0fa856a686 ]
The PCIE_WAKE# has a diode used as a level-shifter, and is used as an input pin. While the SoC default is to enable the pull-up, the core rk3399 pinconf for this pin opted for pull-none. So as to not disturb the behaviour of other boards which may rely on pull-none instead of pull-up, set the needed pull-up only for RK3399 Puma.
--- arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 5 +++++ 1 file changed, 5 insertions(+)
arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi +5 -0
@@ -401,6 +401,11 @@ gpio1830-supply = <&vcc_1v8>; }; +&pcie_clkreqn_cpm { + rockchip,pins = + <2 RK_PD2 RK_FUNC_GPIO &pcfg_pull_up>; +}; + &pinctrl { i2c8 { i2c8_xfer_a: i2c8-xfer {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 10/186 arm64: dts: rockchip: Remove unsupported node from the Pinebook Pro dts
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragan Simic <[email protected]>
[ Upstream commit 43853e843aa6c3d47ff2b0cce898318839483d05 ]
Remove a redundant node from the Pine64 Pinebook Pro dts, which is intended to provide a value for the delay in PCI Express enumeration, but that isn't supported without additional out-of-tree kernel patches.
There were already efforts to upstream those kernel patches, because they reportedly make some PCI Express cards (such as LSI SAS HBAs) usable in Pine64 RockPro64 (which is also based on the RK3399); otherwise, those PCI Express cards fail to enumerate. However, providing the required background and explanations proved to be a tough nut to crack, which is the reason why those patches remain outside of the kernel mainline for now.
If those out-of-tree patches eventually become upstreamed, the resulting device-tree changes will almost surely belong to the RK3399 SoC dtsi. Also, the above-mentioned unusable-without-out-of-tree-patches PCI Express devices are in all fairness not usable in a Pinebook Pro without some extensive hardware modifications, which is another reason to delete this redundant node. When it comes to the Pinebook Pro, only M.2 NVMe SSDs can be installed out of the box (using an additional passive adapter PCB sold separately by Pine64), which reportedly works fine with no additional patches.
--- arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts | 1 - 1 file changed, 1 deletion(-)
arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts +0 -1
@@ -779,7 +779,6 @@ }; &pcie0 { - bus-scan-delay-ms = <1000>; ep-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>; num-lanes = <4>; pinctrl-names = "default";
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 11/186 arm64: dts: mediatek: mt8183: Add power-domains properity to mfgcfg
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ikjoon Jang <[email protected]>
[ Upstream commit 1781f2c461804c0123f59afc7350e520a88edffb ]
mfgcfg clock is under MFG_ASYNC power domain.
--- arch/arm64/boot/dts/mediatek/mt8183.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/mediatek/mt8183.dtsi +1 -0
@@ -1628,6 +1628,7 @@ compatible = "mediatek,mt8183-mfgcfg", "syscon"; reg = <0 0x13000000 0 0x1000>; #clock-cells = <1>; + power-domains = <&spm MT8183_POWER_DOMAIN_MFG_ASYNC>; }; gpu: gpu@13040000 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 12/186 arm64: dts: mediatek: mt8192: Add missing gce-client-reg to mutex
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nícolas F. R. A. Prado <[email protected]>
[ Upstream commit 00bcc8810d9dd69d3899a4189e2f3964f263a600 ]
Add the missing mediatek,gce-client-reg property to the mutex node to allow it to use the GCE. This prevents the "can't parse gce-client-reg property" error from being printed and should result in better performance.
--- arch/arm64/boot/dts/mediatek/mt8192.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/mediatek/mt8192.dtsi +1 -0
@@ -1412,6 +1412,7 @@ reg = <0 0x14001000 0 0x1000>; interrupts = <GIC_SPI 252 IRQ_TYPE_LEVEL_HIGH 0>; clocks = <&mmsys CLK_MM_DISP_MUTEX0>; + mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x1000 0x1000>; mediatek,gce-events = <CMDQ_EVENT_DISP_STREAM_DONE_ENG_EVENT_0>, <CMDQ_EVENT_DISP_STREAM_DONE_ENG_EVENT_1>; power-domains = <&spm MT8192_POWER_DOMAIN_DISP>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 13/186 arm64: dts: mediatek: mt8195: Add missing gce-client-reg to vpp/vdosys
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nícolas F. R. A. Prado <[email protected]>
[ Upstream commit 96b0c1528ef41fe754f5d1378b1db6c098a2e33f ]
Add the missing mediatek,gce-client-reg property to the vppsys and vdosys nodes to allow them to use the GCE. This prevents the "can't parse gce-client-reg property" error from being printed and should result in better performance.
--- arch/arm64/boot/dts/mediatek/mt8195.dtsi | 3 +++ 1 file changed, 3 insertions(+)
arch/arm64/boot/dts/mediatek/mt8195.dtsi +3 -0
@@ -1963,6 +1963,7 @@ compatible = "mediatek,mt8195-vppsys0", "syscon"; reg = <0 0x14000000 0 0x1000>; #clock-cells = <1>; + mediatek,gce-client-reg = <&gce1 SUBSYS_1400XXXX 0 0x1000>; }; mutex@1400f000 {
@@ -2077,6 +2078,7 @@ compatible = "mediatek,mt8195-vppsys1", "syscon"; reg = <0 0x14f00000 0 0x1000>; #clock-cells = <1>; + mediatek,gce-client-reg = <&gce1 SUBSYS_14f0XXXX 0 0x1000>; }; mutex@14f01000 {
@@ -2623,6 +2625,7 @@ reg = <0 0x1c01a000 0 0x1000>; mboxes = <&gce0 0 CMDQ_THR_PRIO_4>; #clock-cells = <1>; + mediatek,gce-client-reg = <&gce0 SUBSYS_1c01XXXX 0xa000 0x1000>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 14/186 arm64: dts: mediatek: mt8195: Add missing gce-client-reg to mutex
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nícolas F. R. A. Prado <[email protected]>
[ Upstream commit 3b129949184a1251e6a42db714f6d68b75fabedd ]
Add the missing mediatek,gce-client-reg property to the mutex node to allow it to use the GCE. This prevents the "can't parse gce-client-reg property" error from being printed and should result in better performance.
--- arch/arm64/boot/dts/mediatek/mt8195.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/mediatek/mt8195.dtsi +1 -0
@@ -2779,6 +2779,7 @@ interrupts = <GIC_SPI 658 IRQ_TYPE_LEVEL_HIGH 0>; power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS0>; clocks = <&vdosys0 CLK_VDO0_DISP_MUTEX0>; + mediatek,gce-client-reg = <&gce0 SUBSYS_1c01XXXX 0x6000 0x1000>; mediatek,gce-events = <CMDQ_EVENT_VDO0_DISP_STREAM_DONE_0>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 15/186 arm64: dts: mediatek: mt8195: Add missing gce-client-reg to mutex1
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nícolas F. R. A. Prado <[email protected]>
[ Upstream commit 58f126296c3c52d02bf3fad1f68c331d718c4a9b ]
Add the missing mediatek,gce-client-reg property to the mutex1 node to allow it to use the GCE. This prevents the "can't parse gce-client-reg property" error from being printed and should result in better performance.
--- arch/arm64/boot/dts/mediatek/mt8195.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/mediatek/mt8195.dtsi +1 -0
@@ -2850,6 +2850,7 @@ power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>; clocks = <&vdosys1 CLK_VDO1_DISP_MUTEX>; clock-names = "vdo1_mutex"; + mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0x1000 0x1000>; mediatek,gce-events = <CMDQ_EVENT_VDO1_STREAM_DONE_ENG_0>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 16/186 arm64: dts: mediatek: cherry: Add platform thermal configuration
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit 729f30eac8bce6783f889cf8390ea869d03407e6 ]
This platform has three auxiliary NTC thermistors, connected to the SoC's ADC pins. Enable the auxadc in order to be able to read the ADC values, add a generic-adc-thermal LUT for each and finally assign them to the SoC's thermal zones.
Stable-dep-of: 17b33dd9e4a3 ("arm64: dts: mediatek: cherry: Describe CPU supplies")
--- .../boot/dts/mediatek/mt8195-cherry.dtsi | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+)
arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi +105 -0
@@ -114,6 +114,77 @@ regulator-boot-on; }; + /* Murata NCP03WF104F05RL */ + tboard_thermistor1: thermal-sensor-t1 { + compatible = "generic-adc-thermal"; + #thermal-sensor-cells = <0>; + io-channels = <&auxadc 0>; + io-channel-names = "sensor-channel"; + temperature-lookup-table = < (-10000) 1553 + (-5000) 1485 + 0 1406 + 5000 1317 + 10000 1219 + 15000 1115 + 20000 1007 + 25000 900 + 30000 796 + 35000 697 + 40000 605 + 45000 523 + 50000 449 + 55000 384 + 60000 327 + 65000 279 + 70000 237 + 75000 202 + 80000 172 + 85000 147 + 90000 125 + 95000 107 + 100000 92 + 105000 79 + 110000 68 + 115000 59 + 120000 51 + 125000 44>; + }; + + tboard_thermistor2: thermal-sensor-t2 { + compatible = "generic-adc-thermal"; + #thermal-sensor-cells = <0>; + io-channels = <&auxadc 1>; + io-channel-names = "sensor-channel"; + temperature-lookup-table = < (-10000) 1553 + (-5000) 1485 + 0 1406 + 5000 1317 + 10000 1219 + 15000 1115 + 20000 1007 + 25000 900 + 30000 796 + 35000 697 + 40000 605 + 45000 523 + 50000 449 + 55000 384 + 60000 327 + 65000 279 + 70000 237 + 75000 202 + 80000 172 + 85000 147 + 90000 125 + 95000 107 + 100000 92 + 105000 79 + 110000 68 + 115000 59 + 120000 51 + 125000 44>; + }; + usb_vbus: regulator-5v0-usb-vbus { compatible = "regulator-fixed"; regulator-name = "usb-vbus";
@@ -176,6 +247,10 @@ memory-region = <&afe_mem>; }; +&auxadc { + status = "okay"; +}; + &dp_intf0 { status = "okay";
@@ -1127,6 +1202,36 @@ }; }; +&thermal_zones { + soc-area-thermal { + polling-delay = <1000>; + polling-delay-passive = <250>; + thermal-sensors = <&tboard_thermistor1>; + + trips { + trip-crit { + temperature = <84000>; + hysteresis = <1000>; + type = "critical"; + }; + }; + }; + + pmic-area-thermal { + polling-delay = <1000>; + polling-delay-passive = <0>; + thermal-sensors = <&tboard_thermistor2>; + + trips { + trip-crit { + temperature = <84000>; + hysteresis = <1000>; + type = "critical"; + }; + }; + }; +}; + &u3phy0 { status = "okay"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 17/186 arm64: dts: mediatek: cherry: Describe CPU supplies
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nícolas F. R. A. Prado <[email protected]>
[ Upstream commit 17b33dd9e4a38fbaca87c68e532b52f9d0492ba7 ]
Describe in each CPU node the regulator supplying it.
--- .../boot/dts/mediatek/mt8195-cherry.dtsi | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+)
arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi +32 -0
@@ -251,6 +251,38 @@ status = "okay"; }; +&cpu0 { + cpu-supply = <&mt6359_vcore_buck_reg>; +}; + +&cpu1 { + cpu-supply = <&mt6359_vcore_buck_reg>; +}; + +&cpu2 { + cpu-supply = <&mt6359_vcore_buck_reg>; +}; + +&cpu3 { + cpu-supply = <&mt6359_vcore_buck_reg>; +}; + +&cpu4 { + cpu-supply = <&mt6315_6_vbuck1>; +}; + +&cpu5 { + cpu-supply = <&mt6315_6_vbuck1>; +}; + +&cpu6 { + cpu-supply = <&mt6315_6_vbuck1>; +}; + +&cpu7 { + cpu-supply = <&mt6315_6_vbuck1>; +}; + &dp_intf0 { status = "okay";
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 18/186 arm64: dts: mediatek: mt8192-asurada: Update min voltage constraint for MT6315
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pin-yen Lin <[email protected]>
[ Upstream commit 374a7c6400e314458178255a63c37d6347845092 ]
Update the minimum voltage from 300000 uV to 400000 uV so it matches the MT6315 datasheet.
Also update the minimum voltage for Vgpu regulator from 606250 uV to 400000 uV because the requested voltage could be lower than the minimum voltage on the GPU OPP table when the MTK Smart Voltage Scaling (SVS) driver is enabled.
--- arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi +3 -3
@@ -1392,7 +1392,7 @@ mt6315_6_vbuck1: vbuck1 { regulator-compatible = "vbuck1"; regulator-name = "Vbcpu"; - regulator-min-microvolt = <300000>; + regulator-min-microvolt = <400000>; regulator-max-microvolt = <1193750>; regulator-enable-ramp-delay = <256>; regulator-allowed-modes = <0 1 2>;
@@ -1402,7 +1402,7 @@ mt6315_6_vbuck3: vbuck3 { regulator-compatible = "vbuck3"; regulator-name = "Vlcpu"; - regulator-min-microvolt = <300000>; + regulator-min-microvolt = <400000>; regulator-max-microvolt = <1193750>; regulator-enable-ramp-delay = <256>; regulator-allowed-modes = <0 1 2>;
@@ -1419,7 +1419,7 @@ mt6315_7_vbuck1: vbuck1 { regulator-compatible = "vbuck1"; regulator-name = "Vgpu"; - regulator-min-microvolt = <606250>; + regulator-min-microvolt = <400000>; regulator-max-microvolt = <800000>; regulator-enable-ramp-delay = <256>; regulator-allowed-modes = <0 1 2>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 19/186 arm64: dts: mediatek: mt8195-cherry: Update min voltage constraint for MT6315
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pin-yen Lin <[email protected]>
[ Upstream commit e9a6b8b5c61350535c7eb5ea9b2dde0d5745bd1b ]
Update the minimum voltage from 300000 uV to 400000 uV so it matches the MT6315 datasheet.
Also update the minimum voltage for Vgpu regulator from 625000 uV to 400000 uV because the requested voltage could be lower than the minimum voltage on the GPU OPP table when the MTK Smart Voltage Scaling (SVS) driver is enabled.
--- arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi +2 -2
@@ -1205,7 +1205,7 @@ mt6315_6_vbuck1: vbuck1 { regulator-compatible = "vbuck1"; regulator-name = "Vbcpu"; - regulator-min-microvolt = <300000>; + regulator-min-microvolt = <400000>; regulator-max-microvolt = <1193750>; regulator-enable-ramp-delay = <256>; regulator-ramp-delay = <6250>;
@@ -1223,7 +1223,7 @@ mt6315_7_vbuck1: vbuck1 { regulator-compatible = "vbuck1"; regulator-name = "Vgpu"; - regulator-min-microvolt = <625000>; + regulator-min-microvolt = <400000>; regulator-max-microvolt = <1193750>; regulator-enable-ramp-delay = <256>; regulator-ramp-delay = <6250>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 20/186 arm64: dts: mediatek: mt8183-kukui: Use default min voltage for MT6358
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pin-yen Lin <[email protected]>
[ Upstream commit 296118a8dc297de47d9b3a364b9743f8446bd612 ]
The requested voltage could be lower than the minimum voltage on the GPU OPP table when the MTK Smart Voltage Scaling (SVS) driver is enabled, so removing the definition in mt8183-kukui to use the default minimum voltage (500000 uV) defined in mt6358.dtsi.
--- arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 1 - 1 file changed, 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +0 -1
@@ -405,7 +405,6 @@ }; &mt6358_vgpu_reg { - regulator-min-microvolt = <625000>; regulator-max-microvolt = <900000>; regulator-coupled-with = <&mt6358_vsram_gpu_reg>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 21/186 arm64: dts: mediatek: mt7622: fix clock controllers
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 3ba5a61594347ab46e7c2cff6cd63ea0f1282efb ]
1. Drop unneeded "syscon"s (bindings were updated recently)
2. Use "clock-controller" in nodenames
3. Add missing "#clock-cells"
--- arch/arm64/boot/dts/mediatek/mt7622.dtsi | 27 +++++++++++------------- 1 file changed, 12 insertions(+), 15 deletions(-)
arch/arm64/boot/dts/mediatek/mt7622.dtsi +12 -15
@@ -283,16 +283,14 @@ }; }; - apmixedsys: apmixedsys@10209000 { - compatible = "mediatek,mt7622-apmixedsys", - "syscon"; + apmixedsys: clock-controller@10209000 { + compatible = "mediatek,mt7622-apmixedsys"; reg = <0 0x10209000 0 0x1000>; #clock-cells = <1>; }; - topckgen: topckgen@10210000 { - compatible = "mediatek,mt7622-topckgen", - "syscon"; + topckgen: clock-controller@10210000 { + compatible = "mediatek,mt7622-topckgen"; reg = <0 0x10210000 0 0x1000>; #clock-cells = <1>; };
@@ -734,9 +732,8 @@ power-domains = <&scpsys MT7622_POWER_DOMAIN_WB>; }; - ssusbsys: ssusbsys@1a000000 { - compatible = "mediatek,mt7622-ssusbsys", - "syscon"; + ssusbsys: clock-controller@1a000000 { + compatible = "mediatek,mt7622-ssusbsys"; reg = <0 0x1a000000 0 0x1000>; #clock-cells = <1>; #reset-cells = <1>;
@@ -793,9 +790,8 @@ }; }; - pciesys: pciesys@1a100800 { - compatible = "mediatek,mt7622-pciesys", - "syscon"; + pciesys: clock-controller@1a100800 { + compatible = "mediatek,mt7622-pciesys"; reg = <0 0x1a100800 0 0x1000>; #clock-cells = <1>; #reset-cells = <1>;
@@ -921,12 +917,13 @@ }; }; - hifsys: syscon@1af00000 { - compatible = "mediatek,mt7622-hifsys", "syscon"; + hifsys: clock-controller@1af00000 { + compatible = "mediatek,mt7622-hifsys"; reg = <0 0x1af00000 0 0x70>; + #clock-cells = <1>; }; - ethsys: syscon@1b000000 { + ethsys: clock-controller@1b000000 { compatible = "mediatek,mt7622-ethsys", "syscon"; reg = <0 0x1b000000 0 0x1000>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 22/186 arm64: dts: mediatek: mt7622: fix IR nodename
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 800dc93c3941e372c94278bf4059e6e82f60bd66 ]
Fix following validation error:arch/arm64/boot/dts/mediatek/mt7622-rfb1.dtb: cir@10009000: $nodename:0: 'cir@10009000' does not match '^ir(-receiver)?(@[a-f0-9]+)?$'
from schema $id: http://devicetree.org/schemas/media/mediatek,mt7622-cir.yaml#
--- arch/arm64/boot/dts/mediatek/mt7622.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt7622.dtsi +1 -1
@@ -252,7 +252,7 @@ clock-names = "hif_sel"; }; - cir: cir@10009000 { + cir: ir-receiver@10009000 { compatible = "mediatek,mt7622-cir"; reg = <0 0x10009000 0 0x1000>; interrupts = <GIC_SPI 175 IRQ_TYPE_LEVEL_LOW>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 23/186 arm64: dts: mediatek: mt7622: fix ethernet controller "compatible"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 208add29ce5b7291f6c466e4dfd9cbf61c72888e ]
Fix following validation error:arch/arm64/boot/dts/mediatek/mt7622-rfb1.dtb: ethernet@1b100000: compatible: ['mediatek,mt7622-eth', 'mediatek,mt2701-eth', 'syscon'] is too long
from schema $id: http://devicetree.org/schemas/net/mediatek,net.yaml#
(and other complains about wrong clocks).
--- arch/arm64/boot/dts/mediatek/mt7622.dtsi | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
arch/arm64/boot/dts/mediatek/mt7622.dtsi +1 -3
@@ -963,9 +963,7 @@ }; eth: ethernet@1b100000 { - compatible = "mediatek,mt7622-eth", - "mediatek,mt2701-eth", - "syscon"; + compatible = "mediatek,mt7622-eth"; reg = <0 0x1b100000 0 0x20000>; interrupts = <GIC_SPI 223 IRQ_TYPE_LEVEL_LOW>, <GIC_SPI 224 IRQ_TYPE_LEVEL_LOW>,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 24/186 arm64: dts: mediatek: mt7622: drop "reset-names" from thermal block
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit ecb5b0034f5bcc35003b4b965cf50c6e98316e79 ]
Binding doesn't specify "reset-names" property and Linux driver also doesn't use it.
Fix following validation error:arch/arm64/boot/dts/mediatek/mt7622-rfb1.dtb: thermal@1100b000: Unevaluated properties are not allowed ('reset-names' was unexpected)
from schema $id: http://devicetree.org/schemas/thermal/mediatek,thermal.yaml#
--- arch/arm64/boot/dts/mediatek/mt7622.dtsi | 1 - 1 file changed, 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt7622.dtsi +0 -1
@@ -513,7 +513,6 @@ <&pericfg CLK_PERI_AUXADC_PD>; clock-names = "therm", "auxadc"; resets = <&pericfg MT7622_PERI_THERM_SW_RST>; - reset-names = "therm"; mediatek,auxadc = <&auxadc>; mediatek,apmixedsys = <&apmixedsys>; nvmem-cells = <&thermal_calibration>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 25/186 arm64: dts: mediatek: mt7986: reorder properties
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 7eb133c99fbebc6adb1cbd22c926d42d2bbca648 ]
Use order described as preferred in DTS Coding Style. Mostly just move "compatible", "reg" and "ranges" properties. In two nodes also move vendor-prefixed props down.
Stable-dep-of: 3b449bfd2ff6 ("arm64: dts: mediatek: mt7986: drop invalid properties from ethsys")
--- arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 67 ++++++++++++----------- 1 file changed, 34 insertions(+), 33 deletions(-)
arch/arm64/boot/dts/mediatek/mt7986a.dtsi +34 -33
@@ -27,34 +27,34 @@ #address-cells = <1>; #size-cells = <0>; cpu0: cpu@0 { - device_type = "cpu"; compatible = "arm,cortex-a53"; - enable-method = "psci"; reg = <0x0>; + device_type = "cpu"; + enable-method = "psci"; #cooling-cells = <2>; }; cpu1: cpu@1 { - device_type = "cpu"; compatible = "arm,cortex-a53"; - enable-method = "psci"; reg = <0x1>; + device_type = "cpu"; + enable-method = "psci"; #cooling-cells = <2>; }; cpu2: cpu@2 { - device_type = "cpu"; compatible = "arm,cortex-a53"; - enable-method = "psci"; reg = <0x2>; + device_type = "cpu"; + enable-method = "psci"; #cooling-cells = <2>; }; cpu3: cpu@3 { - device_type = "cpu"; - enable-method = "psci"; compatible = "arm,cortex-a53"; reg = <0x3>; + device_type = "cpu"; + enable-method = "psci"; #cooling-cells = <2>; }; };
@@ -131,22 +131,22 @@ }; soc { - #address-cells = <2>; - #size-cells = <2>; compatible = "simple-bus"; ranges; + #address-cells = <2>; + #size-cells = <2>; gic: interrupt-controller@c000000 { compatible = "arm,gic-v3"; - #interrupt-cells = <3>; - interrupt-parent = <&gic>; - interrupt-controller; reg = <0 0x0c000000 0 0x10000>, /* GICD */ <0 0x0c080000 0 0x80000>, /* GICR */ <0 0x0c400000 0 0x2000>, /* GICC */ <0 0x0c410000 0 0x1000>, /* GICH */ <0 0x0c420000 0 0x2000>; /* GICV */ + interrupt-parent = <&gic>; interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>; + interrupt-controller; + #interrupt-cells = <3>; }; infracfg: infracfg@10001000 {
@@ -310,9 +310,9 @@ spi0: spi@1100a000 { compatible = "mediatek,mt7986-spi-ipm", "mediatek,spi-ipm"; + reg = <0 0x1100a000 0 0x100>; #address-cells = <1>; #size-cells = <0>; - reg = <0 0x1100a000 0 0x100>; interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>; clocks = <&topckgen CLK_TOP_MPLL_D2>, <&topckgen CLK_TOP_SPI_SEL>,
@@ -324,9 +324,9 @@ spi1: spi@1100b000 { compatible = "mediatek,mt7986-spi-ipm", "mediatek,spi-ipm"; + reg = <0 0x1100b000 0 0x100>; #address-cells = <1>; #size-cells = <0>; - reg = <0 0x1100b000 0 0x100>; interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>; clocks = <&topckgen CLK_TOP_MPLL_D2>, <&topckgen CLK_TOP_SPIM_MST_SEL>,
@@ -388,7 +388,6 @@ }; thermal: thermal@1100c800 { - #thermal-sensor-cells = <1>; compatible = "mediatek,mt7986-thermal"; reg = <0 0x1100c800 0 0x800>; interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
@@ -396,30 +395,30 @@ <&infracfg CLK_INFRA_ADC_26M_CK>, <&infracfg CLK_INFRA_ADC_FRC_CK>; clock-names = "therm", "auxadc", "adc_32k"; - mediatek,auxadc = <&auxadc>; - mediatek,apmixedsys = <&apmixedsys>; nvmem-cells = <&thermal_calibration>; nvmem-cell-names = "calibration-data"; + #thermal-sensor-cells = <1>; + mediatek,auxadc = <&auxadc>; + mediatek,apmixedsys = <&apmixedsys>; }; pcie: pcie@11280000 { compatible = "mediatek,mt7986-pcie", "mediatek,mt8192-pcie"; + reg = <0x00 0x11280000 0x00 0x4000>; + reg-names = "pcie-mac"; + ranges = <0x82000000 0x00 0x20000000 0x00 + 0x20000000 0x00 0x10000000>; device_type = "pci"; #address-cells = <3>; #size-cells = <2>; - reg = <0x00 0x11280000 0x00 0x4000>; - reg-names = "pcie-mac"; interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>; bus-range = <0x00 0xff>; - ranges = <0x82000000 0x00 0x20000000 0x00 - 0x20000000 0x00 0x10000000>; clocks = <&infracfg CLK_INFRA_IPCIE_PIPE_CK>, <&infracfg CLK_INFRA_IPCIE_CK>, <&infracfg CLK_INFRA_IPCIER_CK>, <&infracfg CLK_INFRA_IPCIEB_CK>; clock-names = "pl_250m", "tl_26m", "peri_26m", "top_133m"; - status = "disabled"; phys = <&pcie_port PHY_TYPE_PCIE>; phy-names = "pcie-phy";
@@ -430,6 +429,8 @@ <0 0 0 2 &pcie_intc 1>, <0 0 0 3 &pcie_intc 2>, <0 0 0 4 &pcie_intc 3>; + status = "disabled"; + pcie_intc: interrupt-controller { #address-cells = <0>; #interrupt-cells = <1>;
@@ -440,9 +441,9 @@ pcie_phy: t-phy { compatible = "mediatek,mt7986-tphy", "mediatek,generic-tphy-v2"; + ranges; #address-cells = <2>; #size-cells = <2>; - ranges; status = "disabled"; pcie_port: pcie-phy@11c00000 {
@@ -467,9 +468,9 @@ usb_phy: t-phy@11e10000 { compatible = "mediatek,mt7986-tphy", "mediatek,generic-tphy-v2"; + ranges = <0 0 0x11e10000 0x1700>; #address-cells = <1>; #size-cells = <1>; - ranges = <0 0 0x11e10000 0x1700>; status = "disabled"; u2port0: usb-phy@0 {
@@ -497,11 +498,11 @@ }; ethsys: syscon@15000000 { - #address-cells = <1>; - #size-cells = <1>; compatible = "mediatek,mt7986-ethsys", "syscon"; reg = <0 0x15000000 0 0x1000>; + #address-cells = <1>; + #size-cells = <1>; #clock-cells = <1>; #reset-cells = <1>; };
@@ -578,26 +579,26 @@ <&topckgen CLK_TOP_SGM_325M_SEL>; assigned-clock-parents = <&apmixedsys CLK_APMIXED_NET2PLL>, <&apmixedsys CLK_APMIXED_SGMPLL>; + #reset-cells = <1>; + #address-cells = <1>; + #size-cells = <0>; mediatek,ethsys = <ðsys>; mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>; mediatek,wed-pcie = <&wed_pcie>; mediatek,wed = <&wed0>, <&wed1>; - #reset-cells = <1>; - #address-cells = <1>; - #size-cells = <0>; status = "disabled"; }; wifi: wifi@18000000 { compatible = "mediatek,mt7986-wmac"; + reg = <0 0x18000000 0 0x1000000>, + <0 0x10003000 0 0x1000>, + <0 0x11d10000 0 0x1000>; resets = <&watchdog MT7986_TOPRGU_CONSYS_SW_RST>; reset-names = "consys"; clocks = <&topckgen CLK_TOP_CONN_MCUSYS_SEL>, <&topckgen CLK_TOP_AP2CNN_HOST_SEL>; clock-names = "mcu", "ap2conn"; - reg = <0 0x18000000 0 0x1000000>, - <0 0x10003000 0 0x1000>, - <0 0x11d10000 0 0x1000>; interrupts = <GIC_SPI 213 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 214 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 26/186 arm64: dts: mediatek: mt7986: drop invalid properties from ethsys
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 3b449bfd2ff6c5d3ceecfcb18528ff8e1b4ac2fd ]
Mediatek ethsys controller / syscon binding doesn't allow any subnodes so "#address-cells" and "#size-cells" are redundant (actually:
disallowed).
This fixes:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dtb: syscon@15000000: '#address-cells', '#size-cells' do not match any of the regexes: 'pinctrl-[0-9]+'
from schema $id: http://devicetree.org/schemas/clock/mediatek,ethsys.yaml#
--- arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 2 -- 1 file changed, 2 deletions(-)
arch/arm64/boot/dts/mediatek/mt7986a.dtsi +0 -2
@@ -501,8 +501,6 @@ compatible = "mediatek,mt7986-ethsys", "syscon"; reg = <0 0x15000000 0 0x1000>; - #address-cells = <1>; - #size-cells = <1>; #clock-cells = <1>; #reset-cells = <1>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 27/186 arm64: dts: mediatek: mt7986: drop "#reset-cells" from Ethernet controller
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 9bd88afc94c3570289a0f1c696578b3e1f4e3169 ]
Ethernet block doesn't include or act as a reset controller. Documentation also doesn't document "#reset-cells" for it.
This fixes:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dtb: ethernet@15100000: Unevaluated properties are not allowed ('#reset-cells' was unexpected)
from schema $id: http://devicetree.org/schemas/net/mediatek,net.yaml#
--- arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 1 - 1 file changed, 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt7986a.dtsi +0 -1
@@ -577,7 +577,6 @@ <&topckgen CLK_TOP_SGM_325M_SEL>; assigned-clock-parents = <&apmixedsys CLK_APMIXED_NET2PLL>, <&apmixedsys CLK_APMIXED_SGMPLL>; - #reset-cells = <1>; #address-cells = <1>; #size-cells = <0>; mediatek,ethsys = <ðsys>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 28/186 arm64: dts: mediatek: mt7986: reorder nodes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 3f79e8f3364499750d7442767b101b7bc5864ddf ]
Use order described as preferred in DTS Coding Style:
1. Sort bus nodes by unit address
2. Use alpha-numerical order for the rest
Stable-dep-of: 970f8b01bd77 ("arm64: dts: mediatek: mt7986: drop invalid thermal block clock")
--- arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 116 +++++++++++----------- 1 file changed, 58 insertions(+), 58 deletions(-)
arch/arm64/boot/dts/mediatek/mt7986a.dtsi +58 -58
@@ -16,13 +16,6 @@ #address-cells = <2>; #size-cells = <2>; - clk40m: oscillator-40m { - compatible = "fixed-clock"; - clock-frequency = <40000000>; - #clock-cells = <0>; - clock-output-names = "clkxtal"; - }; - cpus { #address-cells = <1>; #size-cells = <0>;
@@ -59,6 +52,13 @@ }; }; + clk40m: oscillator-40m { + compatible = "fixed-clock"; + clock-frequency = <40000000>; + #clock-cells = <0>; + clock-output-names = "clkxtal"; + }; + psci { compatible = "arm,psci-0.2"; method = "smc";
@@ -121,15 +121,6 @@ }; - timer { - compatible = "arm,armv8-timer"; - interrupt-parent = <&gic>; - interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_LOW>, - <GIC_PPI 14 IRQ_TYPE_LEVEL_LOW>, - <GIC_PPI 11 IRQ_TYPE_LEVEL_LOW>, - <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>; - }; - soc { compatible = "simple-bus"; ranges;
@@ -203,6 +194,19 @@ #interrupt-cells = <2>; }; + pwm: pwm@10048000 { + compatible = "mediatek,mt7986-pwm"; + reg = <0 0x10048000 0 0x1000>; + #pwm-cells = <2>; + interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&topckgen CLK_TOP_PWM_SEL>, + <&infracfg CLK_INFRA_PWM_STA>, + <&infracfg CLK_INFRA_PWM1_CK>, + <&infracfg CLK_INFRA_PWM2_CK>; + clock-names = "top", "main", "pwm1", "pwm2"; + status = "disabled"; + }; + sgmiisys0: syscon@10060000 { compatible = "mediatek,mt7986-sgmiisys_0", "syscon";
@@ -240,19 +244,6 @@ status = "disabled"; }; - pwm: pwm@10048000 { - compatible = "mediatek,mt7986-pwm"; - reg = <0 0x10048000 0 0x1000>; - #pwm-cells = <2>; - interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&topckgen CLK_TOP_PWM_SEL>, - <&infracfg CLK_INFRA_PWM_STA>, - <&infracfg CLK_INFRA_PWM1_CK>, - <&infracfg CLK_INFRA_PWM2_CK>; - clock-names = "top", "main", "pwm1", "pwm2"; - status = "disabled"; - }; - uart0: serial@11002000 { compatible = "mediatek,mt7986-uart", "mediatek,mt6577-uart";
@@ -336,6 +327,21 @@ status = "disabled"; }; + thermal: thermal@1100c800 { + compatible = "mediatek,mt7986-thermal"; + reg = <0 0x1100c800 0 0x800>; + interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&infracfg CLK_INFRA_THERM_CK>, + <&infracfg CLK_INFRA_ADC_26M_CK>, + <&infracfg CLK_INFRA_ADC_FRC_CK>; + clock-names = "therm", "auxadc", "adc_32k"; + nvmem-cells = <&thermal_calibration>; + nvmem-cell-names = "calibration-data"; + #thermal-sensor-cells = <1>; + mediatek,auxadc = <&auxadc>; + mediatek,apmixedsys = <&apmixedsys>; + }; + auxadc: adc@1100d000 { compatible = "mediatek,mt7986-auxadc"; reg = <0 0x1100d000 0 0x1000>;
@@ -387,21 +393,6 @@ status = "disabled"; }; - thermal: thermal@1100c800 { - compatible = "mediatek,mt7986-thermal"; - reg = <0 0x1100c800 0 0x800>; - interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&infracfg CLK_INFRA_THERM_CK>, - <&infracfg CLK_INFRA_ADC_26M_CK>, - <&infracfg CLK_INFRA_ADC_FRC_CK>; - clock-names = "therm", "auxadc", "adc_32k"; - nvmem-cells = <&thermal_calibration>; - nvmem-cell-names = "calibration-data"; - #thermal-sensor-cells = <1>; - mediatek,auxadc = <&auxadc>; - mediatek,apmixedsys = <&apmixedsys>; - }; - pcie: pcie@11280000 { compatible = "mediatek,mt7986-pcie", "mediatek,mt8192-pcie";
@@ -531,20 +522,6 @@ mediatek,wo-ccif = <&wo_ccif1>; }; - wo_ccif0: syscon@151a5000 { - compatible = "mediatek,mt7986-wo-ccif", "syscon"; - reg = <0 0x151a5000 0 0x1000>; - interrupt-parent = <&gic>; - interrupts = <GIC_SPI 211 IRQ_TYPE_LEVEL_HIGH>; - }; - - wo_ccif1: syscon@151ad000 { - compatible = "mediatek,mt7986-wo-ccif", "syscon"; - reg = <0 0x151ad000 0 0x1000>; - interrupt-parent = <&gic>; - interrupts = <GIC_SPI 212 IRQ_TYPE_LEVEL_HIGH>; - }; - eth: ethernet@15100000 { compatible = "mediatek,mt7986-eth"; reg = <0 0x15100000 0 0x80000>;
@@ -586,6 +563,20 @@ status = "disabled"; }; + wo_ccif0: syscon@151a5000 { + compatible = "mediatek,mt7986-wo-ccif", "syscon"; + reg = <0 0x151a5000 0 0x1000>; + interrupt-parent = <&gic>; + interrupts = <GIC_SPI 211 IRQ_TYPE_LEVEL_HIGH>; + }; + + wo_ccif1: syscon@151ad000 { + compatible = "mediatek,mt7986-wo-ccif", "syscon"; + reg = <0 0x151ad000 0 0x1000>; + interrupt-parent = <&gic>; + interrupts = <GIC_SPI 212 IRQ_TYPE_LEVEL_HIGH>; + }; + wifi: wifi@18000000 { compatible = "mediatek,mt7986-wmac"; reg = <0 0x18000000 0 0x1000000>,
@@ -643,4 +634,13 @@ }; }; }; + + timer { + compatible = "arm,armv8-timer"; + interrupt-parent = <&gic>; + interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_LOW>, + <GIC_PPI 14 IRQ_TYPE_LEVEL_LOW>, + <GIC_PPI 11 IRQ_TYPE_LEVEL_LOW>, + <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>; + }; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 29/186 arm64: dts: mediatek: mt7986: drop invalid thermal block clock
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 970f8b01bd7719a22e577ba6c78e27f9ccf22783 ]
Thermal block uses only two clocks. Its binding doesn't document or allow "adc_32k". Also Linux driver doesn't support it.
It has been additionally verified by Angelo by his detailed research on MT7981 / MT7986 clocks (thanks!).
This fixes:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dtb: thermal@1100c800: clocks: [[4, 27], [4, 44], [4, 45]] is too long
from schema $id: http://devicetree.org/schemas/thermal/mediatek,thermal.yaml#arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dtb: thermal@1100c800: clock-names: ['therm', 'auxadc', 'adc_32k'] is too long
from schema $id: http://devicetree.org/schemas/thermal/mediatek,thermal.yaml#
--- arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/mediatek/mt7986a.dtsi +2 -3
@@ -332,9 +332,8 @@ reg = <0 0x1100c800 0 0x800>; interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>; clocks = <&infracfg CLK_INFRA_THERM_CK>, - <&infracfg CLK_INFRA_ADC_26M_CK>, - <&infracfg CLK_INFRA_ADC_FRC_CK>; - clock-names = "therm", "auxadc", "adc_32k"; + <&infracfg CLK_INFRA_ADC_26M_CK>; + clock-names = "therm", "auxadc"; nvmem-cells = <&thermal_calibration>; nvmem-cell-names = "calibration-data"; #thermal-sensor-cells = <1>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 30/186 arm64: dts: mediatek: mt7986: prefix BPI-R3 cooling maps with "map-"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit f8c65a5e4560781f2ea175d8f26cd75ac98e8d78 ]
This fixes:arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dtb: thermal-zones: cpu-thermal:cooling-maps: 'cpu-active-high', 'cpu-active-low', 'cpu-active-med' do not match any of the regexes: '^map[-a-zA-Z0-9]*$', 'pinctrl-[0-9]+'
from schema $id: http://devicetree.org/schemas/thermal/thermal-zones.yaml#
--- arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts +3 -3
@@ -146,19 +146,19 @@ &cpu_thermal { cooling-maps { - cpu-active-high { + map-cpu-active-high { /* active: set fan to cooling level 2 */ cooling-device = <&fan 2 2>; trip = <&cpu_trip_active_high>; }; - cpu-active-med { + map-cpu-active-med { /* active: set fan to cooling level 1 */ cooling-device = <&fan 1 1>; trip = <&cpu_trip_active_med>; }; - cpu-active-low { + map-cpu-active-low { /* active: set fan to cooling level 0 */ cooling-device = <&fan 0 0>; trip = <&cpu_trip_active_low>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 31/186 arm64: dts: mediatek: mt2712: fix validation errors
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 3baac7291effb501c4d52df7019ebf52011e5772 ]
1. Fixup infracfg clock controller binding
It also acts as reset controller so #reset-cells is required.
2. Use -pins suffix for pinctrl
This fixes:arch/arm64/boot/dts/mediatek/mt2712-evb.dtb: syscon@10001000: '#reset-cells' is a required property
from schema $id: http://devicetree.org/schemas/arm/mediatek/mediatek,infracfg.yaml#arch/arm64/boot/dts/mediatek/mt2712-evb.dtb: pinctrl@1000b000: 'eth_default', 'eth_sleep', 'usb0_iddig', 'usb1_iddig' do not match any of the regexes: 'pinctrl-[0-9]+', 'pins$'
from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml#
--- arch/arm64/boot/dts/mediatek/mt2712-evb.dts | 8 ++++---- arch/arm64/boot/dts/mediatek/mt2712e.dtsi | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-)
arch/arm64/boot/dts/mediatek/mt2712-evb.dts +4 -4
@@ -129,7 +129,7 @@ }; &pio { - eth_default: eth_default { + eth_default: eth-default-pins { tx_pins { pinmux = <MT2712_PIN_71_GBE_TXD3__FUNC_GBE_TXD3>, <MT2712_PIN_72_GBE_TXD2__FUNC_GBE_TXD2>,
@@ -156,7 +156,7 @@ }; }; - eth_sleep: eth_sleep { + eth_sleep: eth-sleep-pins { tx_pins { pinmux = <MT2712_PIN_71_GBE_TXD3__FUNC_GPIO71>, <MT2712_PIN_72_GBE_TXD2__FUNC_GPIO72>,
@@ -182,14 +182,14 @@ }; }; - usb0_id_pins_float: usb0_iddig { + usb0_id_pins_float: usb0-iddig-pins { pins_iddig { pinmux = <MT2712_PIN_12_IDDIG_P0__FUNC_IDDIG_A>; bias-pull-up; }; }; - usb1_id_pins_float: usb1_iddig { + usb1_id_pins_float: usb1-iddig-pins { pins_iddig { pinmux = <MT2712_PIN_14_IDDIG_P1__FUNC_IDDIG_B>; bias-pull-up;
arch/arm64/boot/dts/mediatek/mt2712e.dtsi +2 -1
@@ -249,10 +249,11 @@ #clock-cells = <1>; }; - infracfg: syscon@10001000 { + infracfg: clock-controller@10001000 { compatible = "mediatek,mt2712-infracfg", "syscon"; reg = <0 0x10001000 0 0x1000>; #clock-cells = <1>; + #reset-cells = <1>; }; pericfg: syscon@10003000 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 32/186 arm64: dts: rockchip: regulator for sd needs to be always on for BPI-R2Pro
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jose Ignacio Tornos Martinez <[email protected]>
[ Upstream commit 433d54818f64a2fe0562f8c04c7a81f562368515 ]
With default dts configuration for BPI-R2Pro, the regulator for sd card is powered off when reboot is commanded, and the only solution to detect the sd card again, and therefore, allow rebooting from there, is to do a hardware reset.
Configure the regulator for sd to be always on for BPI-R2Pro in order to avoid this issue.
--- arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +2 -0
@@ -416,6 +416,8 @@ vccio_sd: LDO_REG5 { regulator-name = "vccio_sd"; + regulator-always-on; + regulator-boot-on; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 33/186 arm64: dts: qcom: sc8180x: Fix ss_phy_irq for secondary USB controller
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maximilian Luz <[email protected]>
[ Upstream commit ecda8309098402f878c96184f29a1b7ec682d772 ]
The ACPI DSDT of the Surface Pro X (SQ2) specifies the interrupts for the secondary UBS controller as
Name (_CRS, ResourceTemplate ()
{
Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
{
0x000000AA,
}
Interrupt (ResourceConsumer, Level, ActiveHigh, SharedAndWake, ,, )
{
0x000000A7, // hs_phy_irq: &intc GIC_SPI 136
}
Interrupt (ResourceConsumer, Level, ActiveHigh, SharedAndWake, ,, )
{
0x00000228, // ss_phy_irq: &pdc 40
}
Interrupt (ResourceConsumer, Edge, ActiveHigh, SharedAndWake, ,, )
{
0x0000020A, // dm_hs_phy_irq: &pdc 10
}
Interrupt (ResourceConsumer, Edge, ActiveHigh, SharedAndWake, ,, )
{
0x0000020B, // dp_hs_phy_irq: &pdc 11
}
})Generally, the interrupts above 0x200 map to the PDC interrupts (as used in the devicetree) as ACPI_NUMBER - 0x200. Note that this lines up with dm_hs_phy_irq and dp_hs_phy_irq (as well as the interrupts for the primary USB controller).
Based on the snippet above, ss_phy_irq should therefore be PDC 40 (= 0x28) and not PDC 7. The latter is according to ACPI instead used as ss_phy_irq for port 0 of the multiport USB controller). Fix this by setting ss_phy_irq to '&pdc 40'.
--- arch/arm64/boot/dts/qcom/sc8180x.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/sc8180x.dtsi +1 -1
@@ -2644,7 +2644,7 @@ resets = <&gcc GCC_USB30_SEC_BCR>; power-domains = <&gcc USB30_SEC_GDSC>; interrupts-extended = <&intc GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>, - <&pdc 7 IRQ_TYPE_LEVEL_HIGH>, + <&pdc 40 IRQ_TYPE_LEVEL_HIGH>, <&pdc 10 IRQ_TYPE_EDGE_BOTH>, <&pdc 11 IRQ_TYPE_EDGE_BOTH>; interrupt-names = "hs_phy_irq", "ss_phy_irq",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 34/186 gpio: tangier: Use correct type for the IRQ chip data
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 7d045025a24b6336d444d359bd4312f351d017f9 ]
IRQ chip data contains a pointer to the GPIO chip. Luckily we have the pointers the same, but strictly speaking it's not guaranteed. Even though, still better to fix this.
--- drivers/gpio/gpio-tangier.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/gpio/gpio-tangier.c +6 -3
@@ -205,7 +205,8 @@ static int tng_gpio_set_config(struct gpio_chip *chip, unsigned int offset,static void tng_irq_ack (struct irq_data *d) { -struct tng_gpio *priv =irq_data_get_irq_chip_data (d); +struct gpio_chip *gc =irq_data_get_irq_chip_data (d); +struct tng_gpio *priv =gpiochip_get_data (gc);irq_hw_number_t gpio =irqd_to_hwirq (d);unsigned long flags;void __iomem *gisr;
@@ -241,7 +242,8 @@ static void tng_irq_unmask_mask(struct tng_gpio *priv, u32 gpio, bool unmask)static void tng_irq_mask (struct irq_data *d) { -struct tng_gpio *priv =irq_data_get_irq_chip_data (d); +struct gpio_chip *gc =irq_data_get_irq_chip_data (d); +struct tng_gpio *priv =gpiochip_get_data (gc);irq_hw_number_t gpio =irqd_to_hwirq (d);tng_irq_unmask_mask (priv, gpio, false);
@@ -250,7 +252,8 @@ static void tng_irq_mask(struct irq_data *d)static void tng_irq_unmask (struct irq_data *d) { -struct tng_gpio *priv =irq_data_get_irq_chip_data (d); +struct gpio_chip *gc =irq_data_get_irq_chip_data (d); +struct tng_gpio *priv =gpiochip_get_data (gc);irq_hw_number_t gpio =irqd_to_hwirq (d);gpiochip_enable_irq (&priv->chip, gpio);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 35/186 ARC: [plat-hsdk]: Remove misplaced interrupt-cells property
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Brodkin <[email protected]>
[ Upstream commit 61231eb8113ce47991f35024f9c20810b37996bf ]
"gmac" node stands for just an ordinary Ethernet controller, which is by no means a provider of interrupts, i.e. it doesn't serve as an interrupt controller, thus "#interrupt-cells" property doesn't belong to it and so we remove it.
Fixes:
------------>8------------
DTC arch/arc/boot/dts/hsdk.dtb
arch/arc/boot/dts/hsdk.dts:207.23-235.5: Warning (interrupt_provider): /soc/ethernet@8000: '#interrupt-cells' found, but node is not an interrupt provider arch/arc/boot/dts/hsdk.dtb: Warning (interrupt_map): Failed prerequisite 'interrupt_provider'
------------>8------------
--- arch/arc/boot/dts/hsdk.dts | 1 - 1 file changed, 1 deletion(-)
arch/arc/boot/dts/hsdk.dts +0 -1
@@ -205,7 +205,6 @@ }; gmac: ethernet@8000 { - #interrupt-cells = <1>; compatible = "snps,dwmac"; reg = <0x8000 0x2000>; interrupts = <10>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 36/186 wifi: mac80211: clean up assignments to pointer cache.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
[ Upstream commit ba4b1fa3128b2fbf14e167230315cbd9074b629b ]
The assignment to pointer cache in function mesh_fast_tx_gc can be made at the declaration time rather than a later assignment. There are also 3 functions where pointer cache is being initialized at declaration time and later re-assigned again with the same value, these are redundant and can be removed.
Cleans up code and three clang scan build warnings:
warning: Value stored to 'cache' during its initialization is never read [deadcode.DeadStores]
Stable-dep-of: 8c75cdcdf869 ("wifi: mac80211: split mesh fast tx cache into local/proxied/forwarded")
--- net/mac80211/mesh_pathtbl.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
net/mac80211/mesh_pathtbl.c +1 -5
@@ -595,11 +595,10 @@ void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata,void mesh_fast_tx_gc (struct ieee80211_sub_if_data *sdata) {unsigned long timeout =msecs_to_jiffies (MESH_FAST_TX_CACHE_TIMEOUT ); -struct mesh_tx_cache *cache; +struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache;struct ieee80211_mesh_fast_tx *entry;struct hlist_node *n; - cache = &sdata->u.mesh.tx_cache;if (atomic_read (&cache->rht.nelems) <MESH_FAST_TX_CACHE_THRESHOLD_SIZE )return ;
@@ -617,7 +616,6 @@ void mesh_fast_tx_flush_mpath(struct mesh_path *mpath)struct ieee80211_mesh_fast_tx *entry;struct hlist_node *n; - cache = &sdata->u.mesh.tx_cache;spin_lock_bh (&cache->walk_lock);hlist_for_each_entry_safe (entry, n, &cache->walk_head, walk_list)if (entry->mpath == mpath)
@@ -632,7 +630,6 @@ void mesh_fast_tx_flush_sta(struct ieee80211_sub_if_data *sdata,struct ieee80211_mesh_fast_tx *entry;struct hlist_node *n; - cache = &sdata->u.mesh.tx_cache;spin_lock_bh (&cache->walk_lock);hlist_for_each_entry_safe (entry, n, &cache->walk_head, walk_list)if (rcu_access_pointer (entry->mpath->next_hop) == sta)
@@ -646,7 +643,6 @@ void mesh_fast_tx_flush_addr(struct ieee80211_sub_if_data *sdata,struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache;struct ieee80211_mesh_fast_tx *entry; - cache = &sdata->u.mesh.tx_cache;spin_lock_bh (&cache->walk_lock); entry =rhashtable_lookup_fast (&cache->rht, addr, fast_tx_rht_params);if (entry)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 37/186 wifi: mac80211: split mesh fast tx cache into local/proxied/forwarded
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit 8c75cdcdf869acabfdc7858827099dcde9f24e6c ]
Depending on the origin of the packets (and their SA), 802.11 + mesh headers could be filled in differently. In order to properly deal with that, add a new field to the lookup key, indicating the type (local, proxied or forwarded). This can fix spurious packet drop issues that depend on the order in which nodes/hosts communicate with each other.
--- net/mac80211/mesh.c | 8 +++++++- net/mac80211/mesh.h | 36 +++++++++++++++++++++++++++++++++--- net/mac80211/mesh_pathtbl.c | 31 ++++++++++++++++++++++--------- net/mac80211/rx.c | 13 ++++++++++--- 4 files changed, 72 insertions(+), 16 deletions(-)
net/mac80211/mesh.c +7 -1
@@ -765,6 +765,9 @@ bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, u32 ctrl_flags) {struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; +struct ieee80211_mesh_fast_tx_key key = { + .type =MESH_FAST_TX_TYPE_LOCAL + };struct ieee80211_mesh_fast_tx *entry;struct ieee80211s_hdr *meshhdr;u8 sa[ETH_ALEN ]__aligned(2) ;
@@ -800,7 +803,10 @@ bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata,return false; } - entry =mesh_fast_tx_get (sdata, skb->data); +ether_addr_copy (key.addr, skb->data); +if (!ether_addr_equal (skb->data +ETH_ALEN , sdata->vif.addr)) + key.type =MESH_FAST_TX_TYPE_PROXIED ; + entry =mesh_fast_tx_get (sdata, &key);if (!entry)return false;
net/mac80211/mesh.h +33 -3
@@ -133,10 +133,39 @@ struct mesh_path {#define MESH_FAST_TX_CACHE_THRESHOLD_SIZE 384#define MESH_FAST_TX_CACHE_TIMEOUT 8000/* msecs */ +/** +* enum ieee80211_mesh_fast_tx_type - cached mesh fast tx entry type +* +* @MESH_FAST_TX_TYPE_LOCAL: tx from the local vif address as SA +* @MESH_FAST_TX_TYPE_PROXIED: local tx with a different SA (e.g. bridged) +* @MESH_FAST_TX_TYPE_FORWARDED: forwarded from a different mesh point +* @NUM_MESH_FAST_TX_TYPE: number of entry types +*/ +enum ieee80211_mesh_fast_tx_type { +MESH_FAST_TX_TYPE_LOCAL , +MESH_FAST_TX_TYPE_PROXIED , +MESH_FAST_TX_TYPE_FORWARDED , + +/* must be last */ +NUM_MESH_FAST_TX_TYPE +}; + + +/** +* struct ieee80211_mesh_fast_tx_key - cached mesh fast tx entry key +* +* @addr: The Ethernet DA for this entry +* @type: cache entry type +*/ +struct ieee80211_mesh_fast_tx_key { +u8 addr[ETH_ALEN ]__aligned(2) ; +u16 type; +}; +/** * struct ieee80211_mesh_fast_tx - cached mesh fast tx entry * @rhash: rhashtable pointer -* @addr_key: The Ethernet DA which is the key for this entry +* @key: the lookup key for this cache entry * @fast_tx: base fast_tx data * @hdr: cached mesh and rfc1042 headers * @hdrlen: length of mesh + rfc1042
@@ -147,7 +176,7 @@ struct mesh_path {*/ struct ieee80211_mesh_fast_tx {struct rhash_head rhash; -u8 addr_key[ETH_ALEN ]__aligned(2) ; +struct ieee80211_mesh_fast_tx_key key;struct ieee80211_fast_tx fast_tx;u8 hdr[sizeof (struct ieee80211s_hdr ) +sizeof (rfc1042_header)];
@@ -333,7 +362,8 @@ void mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata);bool mesh_action_is_path_sel (struct ieee80211_mgmt *mgmt);struct ieee80211_mesh_fast_tx * -mesh_fast_tx_get (struct ieee80211_sub_if_data *sdata,const u8 *addr); +mesh_fast_tx_get (struct ieee80211_sub_if_data *sdata, +struct ieee80211_mesh_fast_tx_key *key);bool ieee80211_mesh_xmit_fast (struct ieee80211_sub_if_data *sdata,struct sk_buff *skb,u32 ctrl_flags); void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata,
net/mac80211/mesh_pathtbl.c +22 -9
@@ -36,8 +36,8 @@ static const struct rhashtable_params mesh_rht_params = {static const struct rhashtable_params fast_tx_rht_params = { .nelem_hint =10 , .automatic_shrinking = true, - .key_len =ETH_ALEN , - .key_offset = offsetof(struct ieee80211_mesh_fast_tx , addr_key), + .key_len = sizeof_field(struct ieee80211_mesh_fast_tx, key), + .key_offset = offsetof(struct ieee80211_mesh_fast_tx , key), .head_offset = offsetof(struct ieee80211_mesh_fast_tx , rhash), .hashfn = mesh_table_hash, };
@@ -426,20 +426,21 @@ static void mesh_fast_tx_entry_free(struct mesh_tx_cache *cache, }struct ieee80211_mesh_fast_tx * -mesh_fast_tx_get (struct ieee80211_sub_if_data *sdata,const u8 *addr) +mesh_fast_tx_get (struct ieee80211_sub_if_data *sdata, +struct ieee80211_mesh_fast_tx_key *key) {struct ieee80211_mesh_fast_tx *entry;struct mesh_tx_cache *cache; cache = &sdata->u.mesh.tx_cache; - entry =rhashtable_lookup (&cache->rht, addr, fast_tx_rht_params); + entry =rhashtable_lookup (&cache->rht, key, fast_tx_rht_params);if (!entry)return NULL ;if (!(entry->mpath->flags &MESH_PATH_ACTIVE ) ||mpath_expired (entry->mpath)) {spin_lock_bh (&cache->walk_lock); - entry =rhashtable_lookup (&cache->rht, addr, fast_tx_rht_params); + entry =rhashtable_lookup (&cache->rht, key, fast_tx_rht_params);if (entry)mesh_fast_tx_entry_free (cache, entry);spin_unlock_bh (&cache->walk_lock);
@@ -484,18 +485,24 @@ void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata,if (!sta)return ; + build.key.type =MESH_FAST_TX_TYPE_LOCAL ;if ((meshhdr->flags &MESH_FLAGS_AE ) ==MESH_FLAGS_AE_A5_A6 ) {/* This is required to keep the mppath alive */ mppath =mpp_path_lookup (sdata, meshhdr->eaddr1);if (!mppath)return ; build.mppath = mppath; +if (!ether_addr_equal (meshhdr->eaddr2, sdata->vif.addr)) + build.key.type =MESH_FAST_TX_TYPE_PROXIED ; }else if (ieee80211_has_a4 (hdr->frame_control)) { mppath = mpath; }else {return ; } +if (!ether_addr_equal (hdr->addr4, sdata->vif.addr)) + build.key.type =MESH_FAST_TX_TYPE_FORWARDED ; +/* rate limit, in case fast xmit can't be enabled */ if (mppath->fast_tx_check == jiffies)return ;
@@ -542,7 +549,7 @@ void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata, } } -memcpy (build.addr_key, mppath->dst,ETH_ALEN ); +memcpy (build.key.addr, mppath->dst,ETH_ALEN ); build.timestamp = jiffies; build.fast_tx.band = info->band; build.fast_tx.da_offs = offsetof(struct ieee80211_hdr , addr3);
@@ -641,12 +648,18 @@ void mesh_fast_tx_flush_addr(struct ieee80211_sub_if_data *sdata, const u8 *addr) {struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache; +struct ieee80211_mesh_fast_tx_key key = {};struct ieee80211_mesh_fast_tx *entry; +int i; +ether_addr_copy (key.addr, addr);spin_lock_bh (&cache->walk_lock); - entry =rhashtable_lookup_fast (&cache->rht, addr, fast_tx_rht_params); -if (entry) -mesh_fast_tx_entry_free (cache, entry); +for (i =0 ; i <NUM_MESH_FAST_TX_TYPE ; i++) { + key.type = i; + entry =rhashtable_lookup_fast (&cache->rht, &key, fast_tx_rht_params); +if (entry) +mesh_fast_tx_entry_free (cache, entry); + }spin_unlock_bh (&cache->walk_lock); }
net/mac80211/rx.c +10 -3
@@ -2726,7 +2726,10 @@ ieee80211_rx_mesh_fast_forward(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, int hdrlen) {struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; -struct ieee80211_mesh_fast_tx *entry =NULL ; +struct ieee80211_mesh_fast_tx_key key = { + .type =MESH_FAST_TX_TYPE_FORWARDED + }; +struct ieee80211_mesh_fast_tx *entry;struct ieee80211s_hdr *mesh_hdr;struct tid_ampdu_tx *tid_tx;struct sta_info *sta;
@@ -2735,9 +2738,13 @@ ieee80211_rx_mesh_fast_forward(struct ieee80211_sub_if_data *sdata, mesh_hdr = (struct ieee80211s_hdr *)(skb->data +sizeof (eth));if ((mesh_hdr->flags &MESH_FLAGS_AE ) ==MESH_FLAGS_AE_A5_A6 ) - entry =mesh_fast_tx_get (sdata, mesh_hdr->eaddr1); +ether_addr_copy (key.addr, mesh_hdr->eaddr1);else if (!(mesh_hdr->flags &MESH_FLAGS_AE )) - entry =mesh_fast_tx_get (sdata, skb->data); +ether_addr_copy (key.addr, skb->data); +else +return false; + + entry =mesh_fast_tx_get (sdata, &key);if (!entry)return false;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 38/186 wifi: iwlwifi: mvm: remove old PASN station when adding a new one
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avraham Stern <[email protected]>
[ Upstream commit dbfff5bf9292714f02ace002fea8ce6599ea1145 ]
If a PASN station is added, and an old PASN station already exists for the same mac address, remove the old station before adding the new one. Keeping the old station caueses old security context to be used in measurements.
--- drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c +2 -0
@@ -53,6 +53,8 @@ int iwl_mvm_ftm_add_pasn_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,if (!pasn)return -ENOBUFS ; +iwl_mvm_ftm_remove_pasn_sta (mvm, addr); + pasn->cipher =iwl_mvm_cipher_to_location_cipher (cipher);switch (pasn->cipher) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 39/186 wifi: iwlwifi: mvm: return uid from iwl_mvm_build_scan_cmd
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit bada85a3f584763deadd201147778c3e791d279c ]
This function is supposed to return a uid on success, and an errno in failure.
But it currently returns the return value of the specific cmd version handler, which in turn returns 0 on success and errno otherwise. This means that on success, iwl_mvm_build_scan_cmd will return 0 regardless if the actual uid.
Fix this by returning the uid if the handler succeeded.
--- drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/mvm/scan.c +2 -1
@@ -2819,7 +2819,8 @@ static int iwl_mvm_build_scan_cmd(struct iwl_mvm *mvm,if (ver_handler->version != scan_ver)continue ; -return ver_handler->handler (mvm, vif, params, type, uid); + err = ver_handler->handler (mvm, vif, params, type, uid); +return err ? : uid; } err =iwl_mvm_scan_umac (mvm, vif, params, type, uid);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 40/186 drm/gma500: Remove lid code
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patrik Jakobsson <[email protected]>
[ Upstream commit 6aff4c26ed677b1f464f721fbd3e7767f24a684d ]
Due to a change in the order of initialization, the lid timer got started before proper setup was made. This resulted in a crash during boot.
The lid switch is handled by gma500 through a timer that periodically polls the opregion for changes. These types of ACPI events shouldn't be handled by the graphics driver so let's get rid of the lid code. This fixes the crash during boot.
--- drivers/gpu/drm/gma500/Makefile | 1 - drivers/gpu/drm/gma500/psb_device.c | 5 +- drivers/gpu/drm/gma500/psb_drv.h | 9 ---- drivers/gpu/drm/gma500/psb_lid.c | 80 ----------------------------- 4 files changed, 1 insertion(+), 94 deletions(-) delete mode 100644 drivers/gpu/drm/gma500/psb_lid.c
drivers/gpu/drm/gma500/Makefile +0 -1
@@ -34,7 +34,6 @@ gma500_gfx-y += \ psb_intel_lvds.o \ psb_intel_modes.o \ psb_intel_sdvo.o \ - psb_lid.o \ psb_irq.o gma500_gfx-$(CONFIG_ACPI) += opregion.o
drivers/gpu/drm/gma500/psb_device.c +1 -4
@@ -73,8 +73,7 @@ static int psb_backlight_setup(struct drm_device *dev) }psb_intel_lvds_set_brightness (dev,PSB_MAX_BRIGHTNESS ); -/* This must occur after the backlight is properly initialised */ -psb_lid_timer_init (dev_priv); +return 0 ; }
@@ -259,8 +258,6 @@ static int psb_chip_setup(struct drm_device *dev)static void psb_chip_teardown (struct drm_device *dev) { -struct drm_psb_private *dev_priv =to_drm_psb_private (dev); -psb_lid_timer_takedown (dev_priv);gma_intel_teardown_gmbus (dev); }
drivers/gpu/drm/gma500/psb_drv.h +0 -9
@@ -170,7 +170,6 @@#define PSB_NUM_VBLANKS 2#define PSB_WATCHDOG_DELAY (HZ * 2) -#define PSB_LID_DELAY (HZ / 10)#define PSB_MAX_BRIGHTNESS 100
@@ -499,11 +498,7 @@ struct drm_psb_private {/* Hotplug handling */ struct work_struct hotplug_work; -/* LID-Switch */ -spinlock_t lid_lock; -struct timer_list lid_timer;struct psb_intel_opregion opregion; -u32 lid_last_state;/* Watchdog */ uint32_t apm_reg;
@@ -599,10 +594,6 @@ struct psb_ops {int i2c_bus;/* I2C bus identifier for Moorestown */ }; -/* psb_lid.c */ -extern void psb_lid_timer_init (struct drm_psb_private *dev_priv); -extern void psb_lid_timer_takedown (struct drm_psb_private *dev_priv); -/* modesetting */ extern void psb_modeset_init (struct drm_device *dev);extern void psb_modeset_cleanup (struct drm_device *dev);
drivers/gpu/drm/gma500/psb_lid.c deleted +0 -80
80 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 41/186 wifi: mac80211_hwsim: init peer measurement result
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 2a4e01e5270b9fa9f6e6e0a4c24ac51a758636f9 ]
If we don't get all the values here, we might pass them to cfg80211 uninitialized. Fix that, even if the input might then not make much sense.
--- drivers/net/wireless/virtual/mac80211_hwsim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/virtual/mac80211_hwsim.c +1 -1
@@ -3795,7 +3795,7 @@ static int hwsim_pmsr_report_nl(struct sk_buff *msg, struct genl_info *info) }nla_for_each_nested (peer, peers, rem) { -struct cfg80211_pmsr_result result; +struct cfg80211_pmsr_result result = {}; err =mac80211_hwsim_parse_pmsr_result (peer, &result, info);if (err)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 42/186 wifi: mac80211: remove link before AP
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit cb55e08dba3526796e35d24a6d5db4ed6dcb8a4b ]
If the AP removal timer is long, we don't really want to remove the link immediately. However, we really should do it _before_ the AP removes it (which happens at or after count reaches 0), so subtract 1 from the countdown when scheduling the timer. This causes the link removal work to run just after the beacon with value 1 is received. If the counter is already zero, do it immediately.
This fixes an issue where we do the removal too late and receive a beacon from the AP that's no longer associated with the MLD, but thus removed EHT and ML elements, and then we disconnect instead from the whole MLD, since one of the associated APs changed mode from EHT to HE.
--- net/mac80211/mlme.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/mac80211/mlme.c +5 -2
@@ -5884,8 +5884,11 @@ static void ieee80211_ml_reconfiguration(struct ieee80211_sub_if_data *sdata,continue ; } - link_delay = link_conf->beacon_int * - link_removal_timeout[link_id]; +if (link_removal_timeout[link_id] <1 ) + link_delay =0 ; +else + link_delay = link_conf->beacon_int * + (link_removal_timeout[link_id] -1 );if (!delay) delay = link_delay;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 43/186 wifi: mac80211: fix unaligned le16 access
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit c53d8a59351e4347452e263e2e5d7446ec93da83 ]
The AP removal timer field need not be aligned, so the code shouldn't access it directly, but use unaligned loads. Use get_unaligned_le16(), which even is shorter than the current code since it doesn't need a cast.
--- net/mac80211/mlme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac80211/mlme.c +1 -1
@@ -5859,7 +5859,7 @@ static void ieee80211_ml_reconfiguration(struct ieee80211_sub_if_data *sdata,*/ if (control &IEEE80211_MLE_STA_RECONF_CONTROL_AP_REM_TIMER_PRESENT ) - link_removal_timeout[link_id] =le16_to_cpu (*(__le16 *)pos); + link_removal_timeout[link_id] =get_unaligned_le16 (pos); } removed_links &= sdata->vif.valid_links;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 44/186 net: libwx: fix alloc msix vectors failed
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duanqiang Wen <[email protected]>
[ Upstream commit 69197dfc64007b5292cc960581548f41ccd44828 ]
driver needs queue msix vectors and one misc irq vector, but only queue vectors need irq affinity.
when num_online_cpus is less than chip max msix vectors, driver will acquire (num_online_cpus + 1) vecotrs, and call pci_alloc_irq_vectors_affinity functions with affinity params without setting pre_vectors or post_vectors, it will cause return error code -ENOSPC.
Misc irq vector is vector 0, driver need to set affinity params .pre_vectors = 1.
--- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/wangxun/libwx/wx_lib.c +1 -1
@@ -1585,7 +1585,7 @@ static void wx_set_num_queues(struct wx *wx)*/ static int wx_acquire_msix_vectors (struct wx *wx) { -struct irq_affinity affd = {0 , }; +struct irq_affinity affd = { .pre_vectors =1 };int nvecs, i; nvecs =min_t (int,num_online_cpus (), wx->mac.max_msix_vectors);
Signature · 1 line
2.43.0
答复: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed
Quoted 10 lines
-----邮件原件-----
发件人: Greg Kroah-Hartman <[email protected]>
发送时间: 2024年4月30日 18:38
收件人: [email protected]
抄送: Greg Kroah-Hartman <[email protected]>; [email protected]; Duanqiang Wen <[email protected]>; David S. Miller <[email protected]>; Sasha Levin <[email protected]> 主题: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed6.6-stable review patch. If anyone has any objections, please let me
know.
Quoted 8 lines
------------------
From: Duanqiang Wen <[email protected]>
[ Upstream commit
69197dfc64007b5292cc960581548f41ccd44828]driver needs queue msix vectors and one misc irq vector, but only queue
vectors
Quoted 2 lines
need irq affinity.
whennum_online_cpusis less than chip max msix vectors, driver will
acquire
Quoted 1 line
(
num_online_cpus+ 1) vecotrs, and callpci_alloc_irq_vectors_affinity
functions
Quoted 1 line
with affinity params without setting
pre_vectorsorpost_vectors, it will
cause
Quoted 2 lines
return error code
-ENOSPC.
Misc irq vector is vector 0, driver need to set affinity params
.pre_vectors = 1.
Quoted 23 lines
Fixes 3f703186113f ("net: libwx: Add irq flow functions")Signed-off-by Duanqiang Wen <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/net/ethernet/wangxun/libwx/wx_lib.c +1
-2@@ -1585,7 +1585,7 @@ static void wx_set_num_queues(struct wx *wx)*/ static int wx_acquire_msix_vectors (struct wx *wx) { -struct irq_affinity affd = {0 , }; +struct irq_affinity affd = { .pre_vectors =1 };int nvecs, i; nvecs =min_t (int,num_online_cpus (), wx->mac.max_msix_vectors); --
Quoted 3 lines
2.43.0
This patch in kernel-6.6 and kernel 6.7 will cause problems. In kernel-6.6 and kernel 6.7,
Wangxun txgbe & ngbe driver adjust misc irq to vector 0 not yet. How to revert it in
kernel-6.6 and kernel-6.7 stable?
Quoted 1 line
RE: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed
In reply to Greg Kroah-HartmanQuoted 10 lines
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: 2024年4月30日 18:38
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Duanqiang Wen <[email protected]>; David S. Miller <[email protected]>; Sasha Levin <[email protected]>
Subject: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed6.6-stable review patch. If anyone has any objections, please let me
know.
Quoted 10 lines
------------------
From: Duanqiang Wen <[email protected]>
[ Upstream commit
69197dfc64007b5292cc960581548f41ccd44828]driver needs queue msix vectors and one misc irq vector, but only queue vectors need irq affinity.
whennum_online_cpusis less than chip max msix vectors, driver will
acquire
Quoted 2 lines
(
num_online_cpus+ 1) vecotrs, and callpci_alloc_irq_vectors_affinityfunctions with affinity params without settingpre_vectorsor
post_vectors, it
Quoted 2 lines
will cause return error code
-ENOSPC.
Misc irq vector is vector 0, driver need to set affinity params
.pre_vectors = 1.
Quoted 23 lines
Fixes 3f703186113f ("net: libwx: Add irq flow functions")Signed-off-by Duanqiang Wen <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/net/ethernet/wangxun/libwx/wx_lib.c +1
-2@@ -1585,7 +1585,7 @@ static void wx_set_num_queues(struct wx *wx)*/ static int wx_acquire_msix_vectors (struct wx *wx) { -struct irq_affinity affd = {0 , }; +struct irq_affinity affd = { .pre_vectors =1 };int nvecs, i; nvecs =min_t (int,num_online_cpus (), wx->mac.max_msix_vectors); --
Quoted 2 lines
2.43.0
This patch in kernel-6.6 and kernel 6.7 will cause problems. In kernel-6.6 and kernel 6.7,
Wangxun txgbe & ngbe driver adjust misc irq to vector 0 not yet. How to revert it in
kernel-6.6 and kernel-6.7 stable?>
Quoted 1 line
'Greg Kroah-Hartman'
maintainerRe: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed
Quoted 49 lines · On Fri, Sep 27, 2024 at 10:02:14AM +0800, [email protected] wrote:
Quoted 10 lines
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: 2024年4月30日 18:38
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Duanqiang Wen <[email protected]>; David S. Miller <[email protected]>; Sasha Levin <[email protected]>
Subject: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed6.6-stable review patch. If anyone has any objections, please let me
know.
Quoted 10 lines
------------------
From: Duanqiang Wen <[email protected]>
[ Upstream commit
69197dfc64007b5292cc960581548f41ccd44828]driver needs queue msix vectors and one misc irq vector, but only queue vectors need irq affinity.
whennum_online_cpusis less than chip max msix vectors, driver willacquire
Quoted 2 lines
(
num_online_cpus+ 1) vecotrs, and callpci_alloc_irq_vectors_affinityfunctions with affinity params without settingpre_vectorsor
post_vectors, itQuoted 2 lines
will cause return error code
-ENOSPC.
Misc irq vector is vector 0, driver need to set affinity params.pre_vectors = 1.
Quoted 21 lines
Fixes 3f703186113f ("net: libwx: Add irq flow functions")Signed-off-by Duanqiang Wen <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/net/ethernet/wangxun/libwx/wx_lib.c +1
-1@@ -1585,7 +1585,7 @@ static void wx_set_num_queues(struct wx *wx)*/ static int wx_acquire_msix_vectors (struct wx *wx) { -struct irq_affinity affd = {0 , }; +struct irq_affinity affd = { .pre_vectors =1 };int nvecs, i;
Quoted 9 lines
Quoted 4 lines
drivers/net/ethernet/wangxun/libwx/wx_lib.c +0
-1nvecs =min_t (int,num_online_cpus (), wx->mac.max_msix_vectors); --2.43.0
This patch in kernel-6.6 and kernel 6.7 will cause problems. In kernel-6.6 and kernel 6.7,
Wangxun txgbe & ngbe driver adjust misc irq to vector 0 not yet. How to revert it in
kernel-6.6 and kernel-6.7 stable?>
Please send a revert.
thanks,
greg k-h
RE: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed
Quoted 73 lines
-----Original Message-----
From: 'Greg Kroah-Hartman' <[email protected]>
Sent: 2024年9月27日 14:53
To: [email protected]
Cc: [email protected]; [email protected]; 'David S. Miller' <[email protected]>; 'Sasha Levin' <[email protected]>
Subject: Re: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failedQuoted 6 lines · On Fri, Sep 27, 2024 at 10:02:14AM +0800, [email protected] wrote:
Quoted 6 lines
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: 2024年4月30日 18:38
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Duanqiang Wen <duanqiangwen@net-swift.com>;
Quoted 47 lines
Quoted 7 lines
David S. Miller <[email protected]>; Sasha Levin <[email protected]>
Subject: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed6.6-stable review patch. If anyone has any objections, please let me
know.
Quoted 10 lines
------------------
From: Duanqiang Wen <[email protected]>
[ Upstream commit
69197dfc64007b5292cc960581548f41ccd44828]driver needs queue msix vectors and one misc irq vector, but only queue vectors need irq affinity.
whennum_online_cpusis less than chip max msix vectors, driver willacquire
Quoted 3 lines
(
num_online_cpus+ 1) vecotrs, and callpci_alloc_irq_vectors_affinityfunctions with affinity params without settingpre_vectorsor
post_vectors, itQuoted 2 lines
will cause return error code
-ENOSPC.
Misc irq vector is vector 0, driver need to set affinity params.pre_vectors = 1.
Quoted 21 lines
Fixes 3f703186113f ("net: libwx: Add irq flow functions")Signed-off-by Duanqiang Wen <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/net/ethernet/wangxun/libwx/wx_lib.c +1
-1@@ -1585,7 +1585,7 @@ static void wx_set_num_queues(struct wx *wx)*/ static int wx_acquire_msix_vectors (struct wx *wx) { -struct irq_affinity affd = {0 , }; +struct irq_affinity affd = { .pre_vectors =1 };int nvecs, i;Quoted 8 lines
Quoted 4 lines
drivers/net/ethernet/wangxun/libwx/wx_lib.c +0
-1nvecs =min_t (int,num_online_cpus (), wx->mac.max_msix_vectors); --2.43.0
This patch in kernel-6.6 and kernel 6.7 will cause problems. In kernel-6.6 and kernel 6.7, Wangxun txgbe & ngbe driver adjust misc irq to vector 0 not yet. How to revert it in
kernel-6.6 and kernel-6.7 stable?>
Quoted 6 lines
Please send a revert.
thanks,
greg k-h
Should I send revert to stable/master repo? I only wan't to revert it in 6.6.y and 6.7.y. How maintainer recognize this revert should be applied in different tags?
'Greg Kroah-Hartman'
maintainerRe: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed
Quoted 73 lines · On Fri, Sep 27, 2024 at 02:59:42PM +0800, [email protected] wrote:
Quoted 73 lines
-----Original Message-----
From: 'Greg Kroah-Hartman' <[email protected]>
Sent: 2024年9月27日 14:53
To: [email protected]
Cc: [email protected]; [email protected]; 'David S. Miller' <[email protected]>; 'Sasha Levin' <[email protected]>
Subject: Re: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failedQuoted 6 lines · On Fri, Sep 27, 2024 at 10:02:14AM +0800, [email protected] wrote:
Quoted 6 lines
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: 2024年4月30日 18:38
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Duanqiang Wen <duanqiangwen@net-swift.com>;
Quoted 55 lines
Quoted 7 lines
David S. Miller <[email protected]>; Sasha Levin <[email protected]>
Subject: [PATCH 6.6 044/186] net: libwx: fix alloc msix vectors failed6.6-stable review patch. If anyone has any objections, please let me
know.
Quoted 10 lines
------------------
From: Duanqiang Wen <[email protected]>
[ Upstream commit
69197dfc64007b5292cc960581548f41ccd44828]driver needs queue msix vectors and one misc irq vector, but only queue vectors need irq affinity.
whennum_online_cpusis less than chip max msix vectors, driver willacquire
Quoted 3 lines
(
num_online_cpus+ 1) vecotrs, and callpci_alloc_irq_vectors_affinityfunctions with affinity params without settingpre_vectorsor
post_vectors, itQuoted 2 lines
will cause return error code
-ENOSPC.
Misc irq vector is vector 0, driver need to set affinity params.pre_vectors = 1.
Quoted 23 lines
Fixes 3f703186113f ("net: libwx: Add irq flow functions")Signed-off-by Duanqiang Wen <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/net/ethernet/wangxun/libwx/wx_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/net/ethernet/wangxun/libwx/wx_lib.c +1
-2@@ -1585,7 +1585,7 @@ static void wx_set_num_queues(struct wx *wx)*/ static int wx_acquire_msix_vectors (struct wx *wx) { -struct irq_affinity affd = {0 , }; +struct irq_affinity affd = { .pre_vectors =1 };int nvecs, i; nvecs =min_t (int,num_online_cpus (), wx->mac.max_msix_vectors); --Quoted 2 lines
2.43.0
This patch in kernel-6.6 and kernel 6.7 will cause problems. In kernel-6.6 and kernel 6.7, Wangxun txgbe & ngbe driver adjust misc irq to vector 0 not yet. How to revert it in
kernel-6.6 and kernel-6.7 stable?>
Quoted 7 lines
Quoted 6 lines
Please send a revert.
thanks,
greg k-h
Should I send revert to stable/master repo? I only wan't to revert it in 6.6.y and 6.7.y.
6.7 is no longer being maintained, please see the front page of kernel.org for the listed versions that are.
Quoted 1 line
How maintainer recognize this revert should be applied in different tags?
Explain in the changelog why this is only relevant for one branch and not all the others.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 45/186 vxlan: drop packets from invalid src-address
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Bauer <[email protected]>
[ Upstream commit f58f45c1e5b92975e91754f5407250085a6ae7cf ]
The VXLAN driver currently does not check if the inner layer2 source-address is valid.
In case source-address snooping/learning is enabled, a entry in the FDB for the invalid address is created with the layer3 address of the tunnel endpoint.
If the frame happens to have a non-unicast address set, all this non-unicast traffic is subsequently not flooded to the tunnel network but sent to the learnt host in the FDB. To make matters worse, this FDB entry does not expire.
Apply the same filtering for packets as it is done for bridges. This not only drops these invalid packets but avoids them from being learnt into the FDB.
--- drivers/net/vxlan/vxlan_core.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/vxlan/vxlan_core.c +4 -0
@@ -1615,6 +1615,10 @@ static bool vxlan_set_mac(struct vxlan_dev *vxlan,if (ether_addr_equal (eth_hdr (skb)->h_source, vxlan->dev->dev_addr))return false; +/* Ignore packets from invalid src-address */ +if (!is_valid_ether_addr (eth_hdr (skb)->h_source)) +return false; +/* Get address from the outer IP header */ if (vxlan_get_sk_family (vs) ==AF_INET ) { saddr.sin.sin_addr.s_addr =ip_hdr (skb)->saddr;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 46/186 net: bcmasp: fix memory leak when bringing down interface
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Chen <[email protected]>
[ Upstream commit 9f898fc2c31fbf0ac5ecd289f528a716464cb005 ]
When bringing down the TX rings we flush the rings but forget to reclaimed the flushed packets. This leads to a memory leak since we do not free the dma mapped buffers. This also leads to tx control block corruption when bringing down the interface for power management.
--- .../net/ethernet/broadcom/asp2/bcmasp_intf.c | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
drivers/net/ethernet/broadcom/asp2/bcmasp_intf.c +14 -7
@@ -435,10 +435,8 @@ static void umac_init(struct bcmasp_intf *intf)umac_wl (intf,0x800 ,UMC_RX_MAX_PKT_SZ ); } -static int bcmasp_tx_poll (struct napi_struct *napi,int budget) +static int bcmasp_tx_reclaim (struct bcmasp_intf *intf) { -struct bcmasp_intf *intf = - container_of(napi, struct bcmasp_intf, tx_napi);struct bcmasp_intf_stats64 *stats = &intf->stats64;struct device *kdev = &intf->parent->pdev->dev;unsigned long read, released =0 ;
@@ -481,10 +479,16 @@ static int bcmasp_tx_poll(struct napi_struct *napi, int budget) DESC_RING_COUNT); } -/* Ensure all descriptors have been written to DRAM for the hardware -* to see updated contents. -*/ -wmb (); +return released; +} + +static int bcmasp_tx_poll (struct napi_struct *napi,int budget) +{ +struct bcmasp_intf *intf = + container_of(napi, struct bcmasp_intf, tx_napi); +int released =0 ; + + released =bcmasp_tx_reclaim (intf);napi_complete (&intf->tx_napi);
@@ -794,6 +798,7 @@ static int bcmasp_init_tx(struct bcmasp_intf *intf) intf->tx_spb_index =0 ; intf->tx_spb_clean_index =0 ; +memset (intf->tx_cbs,0 ,sizeof (struct bcmasp_tx_cb ) *DESC_RING_COUNT );netif_napi_add_tx (intf->ndev, &intf->tx_napi, bcmasp_tx_poll);
@@ -904,6 +909,8 @@ static void bcmasp_netif_deinit(struct net_device *dev) }while (timeout-- >0 );tx_spb_dma_wl (intf,0x0 ,TX_SPB_DMA_FIFO_CTRL ); +bcmasp_tx_reclaim (intf); +umac_enable_set (intf,UMC_CMD_TX_EN ,0 );phy_stop (dev->phydev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 47/186 mlxsw: core: Unregister EMAD trap using FORWARD action
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 976c44af48141cd8595601c0af2a19a43c5b228b ]
The device's manual (PRM - Programmer's Reference Manual) classifies the trap that is used to deliver EMAD responses as an "event trap". Among other things, it means that the only actions that can be associated with the trap are TRAP and FORWARD (NOP).
Currently, during driver de-initialization the driver unregisters the trap by setting its action to DISCARD, which violates the above guideline. Future firmware versions will prevent such misuses by returning an error. This does not prevent the driver from working, but an error will be printed to the kernel log during module removal / devlink reload:
mlxsw_spectrum 0000:03:00.0: Reg cmd access status failed (status=7(bad parameter)) mlxsw_spectrum 0000:03:00.0: Reg cmd access failed (reg_id=7003(hpkt),type=write)
Suppress the error message by aligning the driver to the manual and use a FORWARD (NOP) action when unregistering the trap.
--- drivers/net/ethernet/mellanox/mlxsw/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/core.c +1 -1
@@ -835,7 +835,7 @@ static void mlxsw_emad_rx_listener_func(struct sk_buff *skb, u16 local_port,static const struct mlxsw_listener mlxsw_emad_rx_listener =MLXSW_RXL (mlxsw_emad_rx_listener_func,ETHEMAD ,TRAP_TO_CPU , false, -EMAD ,DISCARD ); +EMAD ,FORWARD );static int mlxsw_emad_tlv_enable (struct mlxsw_core *mlxsw_core) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 48/186 mlxsw: core_env: Fix driver initialization with old firmware
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 7e2050a8366315aeaf0316b3d362e67cf58f3ea8 ]
The driver queries the Management Capabilities Mask (MCAM) register during initialization to understand if it can read up to 128 bytes from transceiver modules.
However, not all firmware versions support this register, leading to the driver failing to load.
Fix by treating an error in the register query as an indication that the feature is not supported.
--- .../net/ethernet/mellanox/mlxsw/core_env.c | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/core_env.c +6 -14
@@ -1357,24 +1357,20 @@ static struct mlxsw_linecards_event_ops mlxsw_env_event_ops = { .got_inactive = mlxsw_env_got_inactive, }; -static int mlxsw_env_max_module_eeprom_len_query (struct mlxsw_env *mlxsw_env) +static void mlxsw_env_max_module_eeprom_len_query (struct mlxsw_env *mlxsw_env) {char mcam_pl[MLXSW_REG_MCAM_LEN ]; -bool mcia_128b_supported; +bool mcia_128b_supported = false;int err;mlxsw_reg_mcam_pack (mcam_pl,MLXSW_REG_MCAM_FEATURE_GROUP_ENHANCED_FEATURES ); err =mlxsw_reg_query (mlxsw_env->core,MLXSW_REG (mcam), mcam_pl); -if (err) -return err; - -mlxsw_reg_mcam_unpack (mcam_pl,MLXSW_REG_MCAM_MCIA_128B , - &mcia_128b_supported); +if (!err) +mlxsw_reg_mcam_unpack (mcam_pl,MLXSW_REG_MCAM_MCIA_128B , + &mcia_128b_supported); mlxsw_env->max_eeprom_len = mcia_128b_supported ?128 :48 ; - -return 0 ; } int mlxsw_env_init(struct mlxsw_core *mlxsw_core,
@@ -1445,15 +1441,11 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core,if (err) goto err_type_set; - err =mlxsw_env_max_module_eeprom_len_query (env); -if (err) - goto err_eeprom_len_query; - +mlxsw_env_max_module_eeprom_len_query (env); env->line_cards[0 ]->active = true;return 0 ; -err_eeprom_len_query: err_type_set:mlxsw_env_module_event_disable (env,0 ); err_mlxsw_env_module_event_enable:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 49/186 ARM: dts: microchip: at91-sama7g5ek: Replace regulator-suspend-voltage with the valid property
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrei Simion <[email protected]>
[ Upstream commit e027b71762e84ee9d4ba9ad5401b956b9e83ed2a ]
By checking the pmic node with microchip,mcp16502.yaml# 'regulator-suspend-voltage' does not match any of the regexes 'pinctrl-[0-9]+' from schema microchip,mcp16502.yaml# which inherits regulator.yaml#. So replace regulator-suspend-voltage with regulator-suspend-microvolt to avoid the inconsitency.
[claudiu.beznea: added a dot before starting the last sentence in commit
description]
--- arch/arm/boot/dts/microchip/at91-sama7g5ek.dts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/arm/boot/dts/microchip/at91-sama7g5ek.dts +4 -4
@@ -293,7 +293,7 @@ regulator-state-standby { regulator-on-in-suspend; - regulator-suspend-voltage = <1150000>; + regulator-suspend-microvolt = <1150000>; regulator-mode = <4>; };
@@ -314,7 +314,7 @@ regulator-state-standby { regulator-on-in-suspend; - regulator-suspend-voltage = <1050000>; + regulator-suspend-microvolt = <1050000>; regulator-mode = <4>; };
@@ -331,7 +331,7 @@ regulator-always-on; regulator-state-standby { - regulator-suspend-voltage = <1800000>; + regulator-suspend-microvolt = <1800000>; regulator-on-in-suspend; };
@@ -346,7 +346,7 @@ regulator-max-microvolt = <3700000>; regulator-state-standby { - regulator-suspend-voltage = <1800000>; + regulator-suspend-microvolt = <1800000>; regulator-on-in-suspend; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 50/186 icmp: prevent possible NULL dereferences from icmp_build_probe()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit c58e88d49097bd12dfcfef4f075b43f5d5830941 ]
First problem is a double call to __in_dev_get_rcu(), because the second one could return NULL.
if (__in_dev_get_rcu(dev) && __in_dev_get_rcu(dev)->ifa_list)
Second problem is a read from dev->ip6_ptr with no NULL check:
if (!list_empty(&rcu_dereference(dev->ip6_ptr)->addr_list))
Use the correct RCU API to fix these.
v2: add missing include <net/addrconf.h>
--- net/ipv4/icmp.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
net/ipv4/icmp.c +10 -2
@@ -92,6 +92,7 @@#include <net/inet_common.h> #include <net/ip_fib.h> #include <net/l3mdev.h> +#include <net/addrconf.h> /* * Build xmit assembly blocks
@@ -1032,6 +1033,8 @@ bool icmp_build_probe(struct sk_buff *skb, struct icmphdr *icmphdr)struct icmp_ext_hdr *ext_hdr, _ext_hdr;struct icmp_ext_echo_iio *iio, _iio;struct net *net =dev_net (skb->dev); +struct inet6_dev *in6_dev; +struct in_device *in_dev;struct net_device *dev;char buff[IFNAMSIZ ];u16 ident_len;
@@ -1115,10 +1118,15 @@ bool icmp_build_probe(struct sk_buff *skb, struct icmphdr *icmphdr)/* Fill bits in reply message */ if (dev->flags &IFF_UP ) status |=ICMP_EXT_ECHOREPLY_ACTIVE ; -if (__in_dev_get_rcu (dev) &&__in_dev_get_rcu (dev)->ifa_list) + + in_dev =__in_dev_get_rcu (dev); +if (in_dev &&rcu_access_pointer (in_dev->ifa_list)) status |=ICMP_EXT_ECHOREPLY_IPV4 ; -if (!list_empty (&rcu_dereference (dev->ip6_ptr)->addr_list)) + + in6_dev =__in6_dev_get (dev); +if (in6_dev && !list_empty (&in6_dev->addr_list)) status |=ICMP_EXT_ECHOREPLY_IPV6 ; +dev_put (dev); icmphdr->un.echo.sequence |=htons (status);return true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 51/186 bridge/br_netlink.c: no need to return void function
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hangbin Liu <[email protected]>
[ Upstream commit 4fd1edcdf13c0d234543ecf502092be65c5177db ]
br_info_notify is a void function. There is no need to return.
--- net/bridge/br_netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bridge/br_netlink.c +1 -1
@@ -666,7 +666,7 @@ void br_ifinfo_notify(int event, const struct net_bridge *br, {u32 filter =RTEXT_FILTER_BRVLAN_COMPRESSED ; -return br_info_notify (event, br, port, filter); +br_info_notify (event, br, port, filter); }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 52/186 bnxt_en: refactor reset close code
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vikas Gupta <[email protected]>
[ Upstream commit 7474b1c82be3780692d537d331f9aa7fc1e5a368 ]
Introduce bnxt_fw_fatal_close() API which can be used to stop data path and disable device when firmware is in fatal state.
Stable-dep-of: a1acdc226bae ("bnxt_en: Fix the PCI-AER routines")
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +11 -6
@@ -11807,6 +11807,16 @@ static void bnxt_rx_ring_reset(struct bnxt *bp)bnxt_rtnl_unlock_sp (bp); } +static void bnxt_fw_fatal_close (struct bnxt *bp) +{ +bnxt_tx_disable (bp); +bnxt_disable_napi (bp); +bnxt_disable_int_sync (bp); +bnxt_free_irq (bp); +bnxt_clear_int_mode (bp); +pci_disable_device (bp->pdev); +} +static void bnxt_fw_reset_close (struct bnxt *bp) {bnxt_ulp_stop (bp);
@@ -11820,12 +11830,7 @@ static void bnxt_fw_reset_close(struct bnxt *bp)pci_read_config_word (bp->pdev,PCI_SUBSYSTEM_ID , &val);if (val ==0xffff ) bp->fw_reset_min_dsecs =0 ; -bnxt_tx_disable (bp); -bnxt_disable_napi (bp); -bnxt_disable_int_sync (bp); -bnxt_free_irq (bp); -bnxt_clear_int_mode (bp); -pci_disable_device (bp->pdev); +bnxt_fw_fatal_close (bp); }__bnxt_close_nic (bp, true, false);bnxt_vf_reps_free (bp);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 53/186 bnxt_en: Fix the PCI-AER routines
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vikas Gupta <[email protected]>
[ Upstream commit a1acdc226baec331512f815d6ac9dd6f8435cc7f ]
We do not support two simultaneous recoveries so check for reset flag, BNXT_STATE_IN_FW_RESET, and do not proceed with AER further. When the pci channel state is pci_channel_io_frozen, the PCIe link can not be trusted so we disable the traffic immediately and stop BAR access by calling bnxt_fw_fatal_close(). BAR access after AER fatal error can cause an NMI.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +16 -3
@@ -13972,6 +13972,7 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev, {struct net_device *netdev =pci_get_drvdata (pdev);struct bnxt *bp =netdev_priv (netdev); +bool abort = false;netdev_info (netdev,"PCI I/O error detected\n" );
@@ -13980,16 +13981,27 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,bnxt_ulp_stop (bp); -if (state == pci_channel_io_perm_failure) { +if (test_and_set_bit (BNXT_STATE_IN_FW_RESET , &bp->state)) { +netdev_err (bp->dev,"Firmware reset already in progress\n" ); + abort = true; + } + +if (abort || state == pci_channel_io_perm_failure) {rtnl_unlock ();return PCI_ERS_RESULT_DISCONNECT ; } -if (state == pci_channel_io_frozen) +/* Link is not reliable anymore if state is pci_channel_io_frozen +* so we disable bus master to prevent any potential bad DMAs before +* freeing kernel memory. +*/ +if (state == pci_channel_io_frozen) {set_bit (BNXT_STATE_PCI_CHANNEL_IO_FROZEN , &bp->state); +bnxt_fw_fatal_close (bp); + }if (netif_running (netdev)) -bnxt_close (netdev); +__bnxt_close_nic (bp, true, true);if (pci_is_enabled (pdev))pci_disable_device (pdev);
@@ -14075,6 +14087,7 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev) } reset_exit: +clear_bit (BNXT_STATE_IN_FW_RESET , &bp->state);bnxt_clear_reservations (bp, true);rtnl_unlock ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 54/186 cxl/core: Fix potential payload size confusion in cxl_mem_get_poison()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
[ Upstream commit 4b759dd5765503bd466defac7d93aca14c23a15d ]
A recent change to cxl_mem_get_records_log() [1] highlighted a subtle nuance of looping calls to cxl_internal_send_cmd(), i.e. that cxl_internal_send_cmd() modifies the 'size_out' member of the @mbox_cmd argument. That mechanism is useful for communicating underflow, but it is unwanted when reusing @mbox_cmd for a subsequent submission. It turns out that cxl_xfer_log() avoids this scenario by always redefining @mbox_cmd each iteration.
Update cxl_mem_get_records_log() and cxl_mem_get_poison() to follow the same style as cxl_xfer_log(), i.e. re-define @mbox_cmd each iteration. The cxl_mem_get_records_log() change is just a style fixup, but the cxl_mem_get_poison() change is a potential fix, per Alison [2]:
Poison list retrieval can hit this case if the MORE flag is set and a follow on read of the list delivers more records than the previous read. ie. device gives one record, sets the _MORE flag, then gives 5.
Not an urgent fix since this behavior has not been seen in the wild, but worth tracking as a fix.
--- drivers/cxl/core/mbox.c | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-)
drivers/cxl/core/mbox.c +17 -21
@@ -959,25 +959,22 @@ static void cxl_mem_get_records_log(struct cxl_memdev_state *mds,struct cxl_memdev *cxlmd = mds->cxlds.cxlmd;struct device *dev = mds->cxlds.dev;struct cxl_get_event_payload *payload; -struct cxl_mbox_cmd mbox_cmd;u8 log_type = type;u16 nr_rec;mutex_lock (&mds->event.log_lock); payload = mds->event.buf; - mbox_cmd = (struct cxl_mbox_cmd ) { - .opcode =CXL_MBOX_OP_GET_EVENT_RECORD , - .payload_in = &log_type, - .size_in =sizeof (log_type), - .payload_out = payload, - .min_out =struct_size (payload, records,0 ), - }; - do { int rc, i; - - mbox_cmd.size_out = mds->payload_size; + struct cxl_mbox_cmd mbox_cmd = (struct cxl_mbox_cmd) { + .opcode = CXL_MBOX_OP_GET_EVENT_RECORD, + .payload_in = &log_type, + .size_in = sizeof(log_type), + .payload_out = payload, + .size_out = mds->payload_size, + .min_out = struct_size(payload, records, 0), + }; rc = cxl_internal_send_cmd(mds, &mbox_cmd); if (rc) {
@@ -1311,7 +1308,6 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len,struct cxl_memdev_state *mds =to_cxl_memdev_state (cxlmd->cxlds);struct cxl_mbox_poison_out *po;struct cxl_mbox_poison_in pi; -struct cxl_mbox_cmd mbox_cmd;int nr_records =0 ;int rc;
@@ -1323,16 +1319,16 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len, pi.offset =cpu_to_le64 (offset); pi.length =cpu_to_le64 (len /CXL_POISON_LEN_MULT ); - mbox_cmd = (struct cxl_mbox_cmd ) { - .opcode =CXL_MBOX_OP_GET_POISON , - .size_in =sizeof (pi), - .payload_in = &pi, - .size_out = mds->payload_size, - .payload_out = po, - .min_out =struct_size (po, record,0 ), - }; - do { + struct cxl_mbox_cmd mbox_cmd = (struct cxl_mbox_cmd){ + .opcode = CXL_MBOX_OP_GET_POISON, + .size_in = sizeof(pi), + .payload_in = &pi, + .size_out = mds->payload_size, + .payload_out = po, + .min_out = struct_size(po, record, 0), + }; + rc = cxl_internal_send_cmd(mds, &mbox_cmd); if (rc) break;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 55/186 net: dsa: mv88e6xx: fix supported_interfaces setup in mv88e6250_phylink_get_caps()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthias Schiffer <[email protected]>
[ Upstream commit a4e3899065ffa87d49dc20e8c17501edbc189692 ]
With the recent PHYLINK changes requiring supported_interfaces to be set, MV88E6250 family switches like the 88E6020 fail to probe - cmode is never initialized on these devices, so mv88e6250_phylink_get_caps() does not set any supported_interfaces flags.
Instead of a cmode, on 88E6250 we have a read-only port mode value that encodes similar information. There is no reason to bother mapping port mode to the cmodes of other switch models; instead we introduce a mv88e6250_setup_supported_interfaces() that is called directly from mv88e6250_phylink_get_caps().
--- drivers/net/dsa/mv88e6xxx/chip.c | 56 +++++++++++++++++++++++++++++--- drivers/net/dsa/mv88e6xxx/port.h | 23 ++++++++++--- 2 files changed, 71 insertions(+), 8 deletions(-)
drivers/net/dsa/mv88e6xxx/chip.c +52 -4
@@ -566,13 +566,61 @@ static void mv88e6xxx_translate_cmode(u8 cmode, unsigned long *supported)phy_interface_set_rgmii (supported); } -static void mv88e6250_phylink_get_caps (struct mv88e6xxx_chip *chip,int port, -struct phylink_config *config) +static void +mv88e6250_setup_supported_interfaces (struct mv88e6xxx_chip *chip,int port, +struct phylink_config *config) {unsigned long *supported = config->supported_interfaces; +int err; +u16 reg; -/* Translate the default cmode */ -mv88e6xxx_translate_cmode (chip->ports[port].cmode, supported); + err =mv88e6xxx_port_read (chip, port,MV88E6XXX_PORT_STS , ®); +if (err) { +dev_err (chip->dev,"p%d: failed to read port status\n" , port); +return ; + } + +switch (reg &MV88E6250_PORT_STS_PORTMODE_MASK ) { +case MV88E6250_PORT_STS_PORTMODE_MII_10_HALF_PHY : +case MV88E6250_PORT_STS_PORTMODE_MII_100_HALF_PHY : +case MV88E6250_PORT_STS_PORTMODE_MII_10_FULL_PHY : +case MV88E6250_PORT_STS_PORTMODE_MII_100_FULL_PHY : +__set_bit (PHY_INTERFACE_MODE_REVMII , supported); +break ; + +case MV88E6250_PORT_STS_PORTMODE_MII_HALF : +case MV88E6250_PORT_STS_PORTMODE_MII_FULL : +__set_bit (PHY_INTERFACE_MODE_MII , supported); +break ; + +case MV88E6250_PORT_STS_PORTMODE_MII_DUAL_100_RMII_FULL_PHY : +case MV88E6250_PORT_STS_PORTMODE_MII_200_RMII_FULL_PHY : +case MV88E6250_PORT_STS_PORTMODE_MII_10_100_RMII_HALF_PHY : +case MV88E6250_PORT_STS_PORTMODE_MII_10_100_RMII_FULL_PHY : +__set_bit (PHY_INTERFACE_MODE_REVRMII , supported); +break ; + +case MV88E6250_PORT_STS_PORTMODE_MII_DUAL_100_RMII_FULL : +case MV88E6250_PORT_STS_PORTMODE_MII_10_100_RMII_FULL : +__set_bit (PHY_INTERFACE_MODE_RMII , supported); +break ; + +case MV88E6250_PORT_STS_PORTMODE_MII_100_RGMII : +__set_bit (PHY_INTERFACE_MODE_RGMII , supported); +break ; + +default : +dev_err (chip->dev, +"p%d: invalid port mode in status register: %04x\n" , + port, reg); + } +} + +static void mv88e6250_phylink_get_caps (struct mv88e6xxx_chip *chip,int port, +struct phylink_config *config) +{ +if (!mv88e6xxx_phy_is_internal (chip, port)) +mv88e6250_setup_supported_interfaces (chip, port, config); config->mac_capabilities =MAC_SYM_PAUSE |MAC_10 |MAC_100 ; }
drivers/net/dsa/mv88e6xxx/port.h +19 -4
@@ -25,10 +25,25 @@#define MV88E6250_PORT_STS_PORTMODE_PHY_100_HALF 0x0900#define MV88E6250_PORT_STS_PORTMODE_PHY_10_FULL 0x0a00#define MV88E6250_PORT_STS_PORTMODE_PHY_100_FULL 0x0b00 -#define MV88E6250_PORT_STS_PORTMODE_MII_10_HALF 0x0c00 -#define MV88E6250_PORT_STS_PORTMODE_MII_100_HALF 0x0d00 -#define MV88E6250_PORT_STS_PORTMODE_MII_10_FULL 0x0e00 -#define MV88E6250_PORT_STS_PORTMODE_MII_100_FULL 0x0f00 +/* - Modes with PHY suffix use output instead of input clock +* - Modes without RMII or RGMII use MII +* - Modes without speed do not have a fixed speed specified in the manual +* ("DC to x MHz" - variable clock support?) +*/ +#define MV88E6250_PORT_STS_PORTMODE_MII_DISABLED 0x0000 +#define MV88E6250_PORT_STS_PORTMODE_MII_100_RGMII 0x0100 +#define MV88E6250_PORT_STS_PORTMODE_MII_DUAL_100_RMII_FULL_PHY 0x0200 +#define MV88E6250_PORT_STS_PORTMODE_MII_200_RMII_FULL_PHY 0x0400 +#define MV88E6250_PORT_STS_PORTMODE_MII_DUAL_100_RMII_FULL 0x0600 +#define MV88E6250_PORT_STS_PORTMODE_MII_10_100_RMII_FULL 0x0700 +#define MV88E6250_PORT_STS_PORTMODE_MII_HALF 0x0800 +#define MV88E6250_PORT_STS_PORTMODE_MII_10_100_RMII_HALF_PHY 0x0900 +#define MV88E6250_PORT_STS_PORTMODE_MII_FULL 0x0a00 +#define MV88E6250_PORT_STS_PORTMODE_MII_10_100_RMII_FULL_PHY 0x0b00 +#define MV88E6250_PORT_STS_PORTMODE_MII_10_HALF_PHY 0x0c00 +#define MV88E6250_PORT_STS_PORTMODE_MII_100_HALF_PHY 0x0d00 +#define MV88E6250_PORT_STS_PORTMODE_MII_10_FULL_PHY 0x0e00 +#define MV88E6250_PORT_STS_PORTMODE_MII_100_FULL_PHY 0x0f00#define MV88E6XXX_PORT_STS_LINK 0x0800#define MV88E6XXX_PORT_STS_DUPLEX 0x0400#define MV88E6XXX_PORT_STS_SPEED_MASK 0x0300
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 56/186 NFC: trf7970a: disable all regulators on removal
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Geurts <[email protected]>
[ Upstream commit 6bea4f03c6a4e973ef369e15aac88f37981db49e ]
During module probe, regulator 'vin' and 'vdd-io' are used and enabled, but the vdd-io regulator overwrites the 'vin' regulator pointer. During remove, only the vdd-io is disabled, as the vin regulator pointer is not available anymore. When regulator_put() is called during resource cleanup a kernel warning is given, as the regulator is still enabled.
Store the two regulators in separate pointers and disable both the regulators on module remove.
--- drivers/nfc/trf7970a.c | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-)
drivers/nfc/trf7970a.c +23 -19
@@ -424,7 +424,8 @@ struct trf7970a {enum trf7970a_state state;struct device *dev;struct spi_device *spi; -struct regulator *regulator; +struct regulator *vin_regulator; +struct regulator *vddio_regulator;struct nfc_digital_dev *ddev;u32 quirks;bool is_initiator;
@@ -1883,7 +1884,7 @@ static int trf7970a_power_up(struct trf7970a *trf)if (trf->state !=TRF7970A_ST_PWR_OFF )return 0 ; - ret =regulator_enable (trf->regulator); + ret =regulator_enable (trf->vin_regulator);if (ret) {dev_err (trf->dev,"%s - Can't enable VIN: %d\n" , __func__, ret);return ret;
@@ -1926,7 +1927,7 @@ static int trf7970a_power_down(struct trf7970a *trf)if (trf->en2_gpiod && !(trf->quirks &TRF7970A_QUIRK_EN2_MUST_STAY_LOW ))gpiod_set_value_cansleep (trf->en2_gpiod,0 ); - ret =regulator_disable (trf->regulator); + ret =regulator_disable (trf->vin_regulator);if (ret)dev_err (trf->dev,"%s - Can't disable VIN: %d\n" , __func__, ret);
@@ -2065,37 +2066,37 @@ static int trf7970a_probe(struct spi_device *spi)mutex_init (&trf->lock);INIT_DELAYED_WORK (&trf->timeout_work, trf7970a_timeout_work_handler); - trf->regulator =devm_regulator_get (&spi->dev,"vin" ); -if (IS_ERR (trf->regulator)) { - ret =PTR_ERR (trf->regulator); + trf->vin_regulator =devm_regulator_get (&spi->dev,"vin" ); +if (IS_ERR (trf->vin_regulator)) { + ret =PTR_ERR (trf->vin_regulator);dev_err (trf->dev,"Can't get VIN regulator: %d\n" , ret); goto err_destroy_lock; } - ret =regulator_enable (trf->regulator); + ret =regulator_enable (trf->vin_regulator);if (ret) {dev_err (trf->dev,"Can't enable VIN: %d\n" , ret); goto err_destroy_lock; } - uvolts =regulator_get_voltage (trf->regulator); + uvolts =regulator_get_voltage (trf->vin_regulator);if (uvolts >4000000 ) trf->chip_status_ctrl =TRF7970A_CHIP_STATUS_VRS5_3 ; - trf->regulator =devm_regulator_get (&spi->dev,"vdd-io" ); -if (IS_ERR (trf->regulator)) { - ret =PTR_ERR (trf->regulator); + trf->vddio_regulator =devm_regulator_get (&spi->dev,"vdd-io" ); +if (IS_ERR (trf->vddio_regulator)) { + ret =PTR_ERR (trf->vddio_regulator);dev_err (trf->dev,"Can't get VDD_IO regulator: %d\n" , ret); - goto err_destroy_lock; + goto err_disable_vin_regulator; } - ret =regulator_enable (trf->regulator); + ret =regulator_enable (trf->vddio_regulator);if (ret) {dev_err (trf->dev,"Can't enable VDD_IO: %d\n" , ret); - goto err_destroy_lock; + goto err_disable_vin_regulator; } -if (regulator_get_voltage (trf->regulator) ==1800000 ) { +if (regulator_get_voltage (trf->vddio_regulator) ==1800000 ) { trf->io_ctrl =TRF7970A_REG_IO_CTRL_IO_LOW ;dev_dbg (trf->dev,"trf7970a config vdd_io to 1.8V\n" ); }
@@ -2108,7 +2109,7 @@ static int trf7970a_probe(struct spi_device *spi)if (!trf->ddev) {dev_err (trf->dev,"Can't allocate NFC digital device\n" ); ret = -ENOMEM ; - goto err_disable_regulator; + goto err_disable_vddio_regulator; }nfc_digital_set_parent_dev (trf->ddev, trf->dev);
@@ -2137,8 +2138,10 @@ static int trf7970a_probe(struct spi_device *spi)trf7970a_shutdown (trf); err_free_ddev:nfc_digital_free_device (trf->ddev); -err_disable_regulator: -regulator_disable (trf->regulator); +err_disable_vddio_regulator: +regulator_disable (trf->vddio_regulator); +err_disable_vin_regulator: +regulator_disable (trf->vin_regulator); err_destroy_lock:mutex_destroy (&trf->lock);return ret;
@@ -2157,7 +2160,8 @@ static void trf7970a_remove(struct spi_device *spi)nfc_digital_unregister_device (trf->ddev);nfc_digital_free_device (trf->ddev); -regulator_disable (trf->regulator); +regulator_disable (trf->vddio_regulator); +regulator_disable (trf->vin_regulator);mutex_destroy (&trf->lock); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 57/186 ax25: Fix netdev refcount issue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
[ Upstream commit 467324bcfe1a31ec65d0cf4aa59421d6b7a7d52b ]
The dev_tracker is added to ax25_cb in ax25_bind(). When the ax25 device is detaching, the dev_tracker of ax25_cb should be deallocated in ax25_kill_by_device() instead of the dev_tracker of ax25_dev. The log reported by ref_tracker is shown below:
[ 80.884935] ref_tracker: reference already released. [ 80.885150] ref_tracker: allocated in: [ 80.885349] ax25_dev_device_up+0x105/0x540 [ 80.885730] ax25_device_event+0xa4/0x420 [ 80.885730] notifier_call_chain+0xc9/0x1e0 [ 80.885730] __dev_notify_flags+0x138/0x280 [ 80.885730] dev_change_flags+0xd7/0x180 [ 80.885730] dev_ifsioc+0x6a9/0xa30 [ 80.885730] dev_ioctl+0x4d8/0xd90 [ 80.885730] sock_do_ioctl+0x1c2/0x2d0 [ 80.885730] sock_ioctl+0x38b/0x4f0 [ 80.885730] __se_sys_ioctl+0xad/0xf0 [ 80.885730] do_syscall_64+0xc4/0x1b0 [ 80.885730] entry_SYSCALL_64_after_hwframe+0x67/0x6f [ 80.885730] ref_tracker: freed in: [ 80.885730] ax25_device_event+0x272/0x420 [ 80.885730] notifier_call_chain+0xc9/0x1e0 [ 80.885730] dev_close_many+0x272/0x370 [ 80.885730] unregister_netdevice_many_notify+0x3b5/0x1180 [ 80.885730] unregister_netdev+0xcf/0x120 [ 80.885730] sixpack_close+0x11f/0x1b0 [ 80.885730] tty_ldisc_kill+0xcb/0x190 [ 80.885730] tty_ldisc_hangup+0x338/0x3d0 [ 80.885730] __tty_hangup+0x504/0x740 [ 80.885730] tty_release+0x46e/0xd80 [ 80.885730] __fput+0x37f/0x770 [ 80.885730] __x64_sys_close+0x7b/0xb0 [ 80.885730] do_syscall_64+0xc4/0x1b0 [ 80.885730] entry_SYSCALL_64_after_hwframe+0x67/0x6f [ 80.893739] ------------[ cut here ]------------ [ 80.894030] WARNING: CPU: 2 PID: 140 at lib/ref_tracker.c:255 ref_tracker_free+0x47b/0x6b0 [ 80.894297] Modules linked in: [ 80.894929] CPU: 2 PID: 140 Comm: ax25_conn_rel_6 Not tainted 6.9.0-rc4-g8cd26fd90c1a #11 [ 80.895190] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qem4 [ 80.895514] RIP: 0010:ref_tracker_free+0x47b/0x6b0 [ 80.895808] Code: 83 c5 18 4c 89 eb 48 c1 eb 03 8a 04 13 84 c0 0f 85 df 01 00 00 41 83 7d 00 00 75 4b 4c 89 ff 9 [ 80.896171] RSP: 0018:ffff888009edf8c0 EFLAGS: 00000286 [ 80.896339] RAX: 1ffff1100141ac00 RBX: 1ffff1100149463b RCX: dffffc0000000000 [ 80.896502] RDX: 0000000000000001 RSI: 0000000000000246 RDI: ffff88800a0d6518 [ 80.896925] RBP: ffff888009edf9b0 R08: ffff88806d3288d3 R09: 1ffff1100da6511a [ 80.897212] R10: dffffc0000000000 R11: ffffed100da6511b R12: ffff88800a4a31d4 [ 80.897859] R13: ffff88800a4a31d8 R14: dffffc0000000000 R15: ffff88800a0d6518 [ 80.898279] FS: 00007fd88b7fe700(0000) GS:ffff88806d300000(0000) knlGS:0000000000000000 [ 80.899436] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 80.900181] CR2: 00007fd88c001d48 CR3: 000000000993e000 CR4: 00000000000006f0 ... [ 80.935774] ref_tracker: sp%d@000000000bb9df3d has 1/1 users at [ 80.935774] ax25_bind+0x424/0x4e0 [ 80.935774] __sys_bind+0x1d9/0x270 [ 80.935774] __x64_sys_bind+0x75/0x80 [ 80.935774] do_syscall_64+0xc4/0x1b0 [ 80.935774] entry_SYSCALL_64_after_hwframe+0x67/0x6f
Change ax25_dev->dev_tracker to the dev_tracker of ax25_cb in order to mitigate the bug.
--- net/ax25/af_ax25.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ax25/af_ax25.c +1 -1
@@ -103,7 +103,7 @@ static void ax25_kill_by_device(struct net_device *dev) s->ax25_dev =NULL ;if (sk->sk_socket) {netdev_put (ax25_dev->dev, - &ax25_dev->dev_tracker); + &s->dev_tracker);ax25_dev_put (ax25_dev); }ax25_cb_del (s);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 58/186 tools: ynl: dont ignore errors in NLMSG_DONE messages
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit a44f2eb106a46f2275a79de54ce0ea63e4f3d8c8 ]
NLMSG_DONE contains an error code, it has to be extracted. Prior to this change all dumps will end in success, and in case of failure the result is silently truncated.
--- tools/net/ynl/lib/ynl.py | 1 + 1 file changed, 1 insertion(+)
tools/net/ynl/lib/ynl.py +1 -0
@@ -201,6 +201,7 @@ class NlMsg: self.done = 1 extack_off = 20 elif self.nl_type == Netlink.NLMSG_DONE: + self.error = struct.unpack("i", self.raw[0:4])[0] self.done = 1 extack_off = 4
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 59/186 net: make SK_MEMORY_PCPU_RESERV tunable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Li <[email protected]>
[ Upstream commit 12a686c2e761f1f1f6e6e2117a9ab9c6de2ac8a7 ]
This patch adds /proc/sys/net/core/mem_pcpu_rsv sysctl file, to make SK_MEMORY_PCPU_RESERV tunable.
Commit 3cd3399dd7a8 ("net: implement per-cpu reserves for memory_allocated") introduced per-cpu forward alloc cache:
"Implement a per-cpu cache of +1/-1 MB, to reduce number of changes to sk->sk_prot->memory_allocated, which would otherwise be cause of false sharing."
sk_prot->memory_allocated points to global atomic variable:atomic_long_t tcp_memory_allocated ____cacheline_aligned_in_smp;
If increasing the per-cpu cache size from 1MB to e.g. 16MB, changes to sk->sk_prot->memory_allocated can be further reduced. Performance may be improved on system with many cores.
Stable-dep-of: 3584718cf2ec ("net: fix sk_memory_allocated_{add|sub} vs softirqs")
--- Documentation/admin-guide/sysctl/net.rst | 5 +++++ include/net/sock.h | 5 +++-- net/core/sock.c | 1 + net/core/sysctl_net_core.c | 9 +++++++++ 4 files changed, 18 insertions(+), 2 deletions(-)
Documentation/admin-guide/sysctl/net.rst +5 -0
@@ -205,6 +205,11 @@ Will increase power usage. Default: 0 (off) +mem_pcpu_rsv +------------ + +Per-cpu reserved forward alloc cache size in page units. Default 1MB per CPU. + rmem_default ------------
include/net/sock.h +3 -2
@@ -1458,6 +1458,7 @@ sk_memory_allocated(const struct sock *sk)/* 1 MB per cpu, in page units */ #define SK_MEMORY_PCPU_RESERVE (1 << (20 - PAGE_SHIFT)) +extern int sysctl_mem_pcpu_rsv;static inline void sk_memory_allocated_add (struct sock *sk,int amt)
@@ -1466,7 +1467,7 @@ sk_memory_allocated_add(struct sock *sk, int amt)preempt_disable (); local_reserve =__this_cpu_add_return (*sk->sk_prot->per_cpu_fw_alloc, amt); -if (local_reserve >=SK_MEMORY_PCPU_RESERVE ) { +if (local_reserve >=READ_ONCE (sysctl_mem_pcpu_rsv)) {__this_cpu_sub (*sk->sk_prot->per_cpu_fw_alloc, local_reserve);atomic_long_add (local_reserve, sk->sk_prot->memory_allocated); }
@@ -1480,7 +1481,7 @@ sk_memory_allocated_sub(struct sock *sk, int amt)preempt_disable (); local_reserve =__this_cpu_sub_return (*sk->sk_prot->per_cpu_fw_alloc, amt); -if (local_reserve <= -SK_MEMORY_PCPU_RESERVE ) { +if (local_reserve <= -READ_ONCE (sysctl_mem_pcpu_rsv)) {__this_cpu_sub (*sk->sk_prot->per_cpu_fw_alloc, local_reserve);atomic_long_add (local_reserve, sk->sk_prot->memory_allocated); }
net/core/sock.c +1 -0
@@ -283,6 +283,7 @@ __u32 sysctl_rmem_max __read_mostly = SK_RMEM_MAX;EXPORT_SYMBOL (sysctl_rmem_max);__u32 sysctl_wmem_default__read_mostly =SK_WMEM_MAX ;__u32 sysctl_rmem_default__read_mostly =SK_RMEM_MAX ; +int sysctl_mem_pcpu_rsv__read_mostly =SK_MEMORY_PCPU_RESERVE ;/* Maximal space eaten by iovec or ancillary data plus some space */ int sysctl_optmem_max__read_mostly =sizeof (unsigned long )*(2 *UIO_MAXIOV +512 );
net/core/sysctl_net_core.c +9 -0
@@ -30,6 +30,7 @@ static int int_3600 = 3600;static int min_sndbuf =SOCK_MIN_SNDBUF ;static int min_rcvbuf =SOCK_MIN_RCVBUF ;static int max_skb_frags =MAX_SKB_FRAGS ; +static int min_mem_pcpu_rsv =SK_MEMORY_PCPU_RESERVE ;static int net_msg_warn;/* Unused, but still a sysctl */
@@ -407,6 +408,14 @@ static struct ctl_table net_core_table[] = { .proc_handler = proc_dointvec_minmax, .extra1 = &min_rcvbuf, }, + { + .procname = "mem_pcpu_rsv", + .data = &sysctl_mem_pcpu_rsv, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &min_mem_pcpu_rsv, + }, { .procname = "dev_weight", .data = &weight_p,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 60/186 net: fix sk_memory_allocated_{add|sub} vs softirqs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 3584718cf2ec7e79b6814f2596dcf398c5fb2eca ]
Jonathan Heathcote reported a regression caused by blamed commit on aarch64 architecture.
x86 happens to have irq-safe __this_cpu_add_return() and __this_cpu_sub(), but this is not generic.
I think my confusion came from "struct sock" argument, because these helpers are called with a locked socket. But the memory accounting is per-proto (and per-cpu after the blamed commit). We might cleanup these helpers later to directly accept a "struct proto *proto" argument.
Switch to this_cpu_add_return() and this_cpu_xchg() operations, and get rid of preempt_disable()/preempt_enable() pairs.
Fast path becomes a bit faster as a result :)
Many thanks to Jonathan Heathcote for his awesome report and investigations.
--- include/net/sock.h | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-)
include/net/sock.h +20 -18
@@ -1460,32 +1460,34 @@ sk_memory_allocated(const struct sock *sk)#define SK_MEMORY_PCPU_RESERVE (1 << (20 - PAGE_SHIFT))extern int sysctl_mem_pcpu_rsv; +static inline void proto_memory_pcpu_drain (struct proto *proto) +{ +int val =this_cpu_xchg (*proto->per_cpu_fw_alloc,0 ); + +if (val) +atomic_long_add (val, proto->memory_allocated); +} +static inline void -sk_memory_allocated_add (struct sock *sk,int amt) +sk_memory_allocated_add (const struct sock *sk,int val) { -int local_reserve; +struct proto *proto = sk->sk_prot; -preempt_disable (); - local_reserve =__this_cpu_add_return (*sk->sk_prot->per_cpu_fw_alloc, amt); -if (local_reserve >=READ_ONCE (sysctl_mem_pcpu_rsv)) { -__this_cpu_sub (*sk->sk_prot->per_cpu_fw_alloc, local_reserve); -atomic_long_add (local_reserve, sk->sk_prot->memory_allocated); - } -preempt_enable (); + val =this_cpu_add_return (*proto->per_cpu_fw_alloc, val); + +if (unlikely (val >=READ_ONCE (sysctl_mem_pcpu_rsv))) +proto_memory_pcpu_drain (proto); }static inline void -sk_memory_allocated_sub (struct sock *sk,int amt) +sk_memory_allocated_sub (const struct sock *sk,int val) { -int local_reserve; +struct proto *proto = sk->sk_prot; -preempt_disable (); - local_reserve =__this_cpu_sub_return (*sk->sk_prot->per_cpu_fw_alloc, amt); -if (local_reserve <= -READ_ONCE (sysctl_mem_pcpu_rsv)) { -__this_cpu_sub (*sk->sk_prot->per_cpu_fw_alloc, local_reserve); -atomic_long_add (local_reserve, sk->sk_prot->memory_allocated); - } -preempt_enable (); + val =this_cpu_sub_return (*proto->per_cpu_fw_alloc, val); + +if (unlikely (val <= -READ_ONCE (sysctl_mem_pcpu_rsv))) +proto_memory_pcpu_drain (proto); }#define SK_ALLOC_PERCPU_COUNTER_BATCH 16
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 61/186 ipv4: check for NULL idev in ip_route_use_hint()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 58a4c9b1e5a3e53c9148e80b90e1e43897ce77d1 ]
syzbot was able to trigger a NULL deref in fib_validate_source() in an old tree [1].
It appears the bug exists in latest trees.
All calls to __in_dev_get_rcu() must be checked for a NULL result.
[1]
general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] SMP KASAN KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] CPU: 2 PID: 3257 Comm: syz-executor.3 Not tainted 5.10.0-syzkaller #0 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 RIP: 0010:fib_validate_source+0xbf/0x15a0 net/ipv4/fib_frontend.c:425 Code: 18 f2 f2 f2 f2 42 c7 44 20 23 f3 f3 f3 f3 48 89 44 24 78 42 c6 44 20 27 f3 e8 5d 88 48 fc 4c 89 e8 48 c1 e8 03 48 89 44 24 18 <42> 80 3c 20 00 74 08 4c 89 ef e8 d2 15 98 fc 48 89 5c 24 10 41 bf RSP: 0018:ffffc900015fee40 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffff88800f7a4000 RCX: ffff88800f4f90c0 RDX: 0000000000000000 RSI: 0000000004001eac RDI: ffff8880160c64c0 RBP: ffffc900015ff060 R08: 0000000000000000 R09: ffff88800f7a4000 R10: 0000000000000002 R11: ffff88800f4f90c0 R12: dffffc0000000000 R13: 0000000000000000 R14: 0000000000000000 R15: ffff88800f7a4000 FS: 00007f938acfe6c0(0000) GS:ffff888058c00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f938acddd58 CR3: 000000001248e000 CR4: 0000000000352ef0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: ip_route_use_hint+0x410/0x9b0 net/ipv4/route.c:2231 ip_rcv_finish_core+0x2c4/0x1a30 net/ipv4/ip_input.c:327 ip_list_rcv_finish net/ipv4/ip_input.c:612 [inline] ip_sublist_rcv+0x3ed/0xe50 net/ipv4/ip_input.c:638 ip_list_rcv+0x422/0x470 net/ipv4/ip_input.c:673 __netif_receive_skb_list_ptype net/core/dev.c:5572 [inline] __netif_receive_skb_list_core+0x6b1/0x890 net/core/dev.c:5620 __netif_receive_skb_list net/core/dev.c:5672 [inline] netif_receive_skb_list_internal+0x9f9/0xdc0 net/core/dev.c:5764 netif_receive_skb_list+0x55/0x3e0 net/core/dev.c:5816 xdp_recv_frames net/bpf/test_run.c:257 [inline] xdp_test_run_batch net/bpf/test_run.c:335 [inline] bpf_test_run_xdp_live+0x1818/0x1d00 net/bpf/test_run.c:363 bpf_prog_test_run_xdp+0x81f/0x1170 net/bpf/test_run.c:1376 bpf_prog_test_run+0x349/0x3c0 kernel/bpf/syscall.c:3736 __sys_bpf+0x45c/0x710 kernel/bpf/syscall.c:5115 __do_sys_bpf kernel/bpf/syscall.c:5201 [inline] __se_sys_bpf kernel/bpf/syscall.c:5199 [inline] __x64_sys_bpf+0x7c/0x90 kernel/bpf/syscall.c:5199
--- net/ipv4/route.c | 3 +++ 1 file changed, 3 insertions(+)
net/ipv4/route.c +3 -0
@@ -2166,6 +2166,9 @@ int ip_route_use_hint(struct sk_buff *skb, __be32 daddr, __be32 saddr,int err = -EINVAL ;u32 tag =0 ; +if (!in_dev) +return -EINVAL ; +if (ipv4_is_multicast (saddr) ||ipv4_is_lbcast (saddr)) goto martian_source;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 62/186 net: usb: ax88179_178a: stop lying about skb->truesize
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 4ce62d5b2f7aecd4900e7d6115588ad7f9acccca ]
Some usb drivers try to set small skb->truesize and break core networking stacks.
In this patch, I removed one of the skb->truesize overide.
I also replaced one skb_clone() by an allocation of a fresh and small skb, to get minimally sized skbs, like we did in commit 1e2c61172342 ("net: cdc_ncm: reduce skb truesize in rx path")
--- drivers/net/usb/ax88179_178a.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/net/usb/ax88179_178a.c +3 -8
@@ -1456,21 +1456,16 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)/* Skip IP alignment pseudo header */ skb_pull (skb,2 ); - skb->truesize =SKB_TRUESIZE (pkt_len_plus_padd);ax88179_rx_checksum (skb, pkt_hdr);return 1 ; } - ax_skb =skb_clone (skb,GFP_ATOMIC ); + ax_skb =netdev_alloc_skb_ip_align (dev->net, pkt_len);if (!ax_skb)return 0 ; -skb_trim (ax_skb, pkt_len); +skb_put (ax_skb, pkt_len); +memcpy (ax_skb->data, skb->data +2 , pkt_len); -/* Skip IP alignment pseudo header */ -skb_pull (ax_skb,2 ); - - skb->truesize = pkt_len_plus_padd + -SKB_DATA_ALIGN (sizeof (struct sk_buff ));ax88179_rx_checksum (ax_skb, pkt_hdr);usbnet_skb_return (dev, ax_skb);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 63/186 net: gtp: Fix Use-After-Free in gtp_dellink
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hyunwoo Kim <[email protected]>
[ Upstream commit f2a904107ee2b647bb7794a1a82b67740d7c8a64 ]
Since call_rcu, which is called in the hlist_for_each_entry_rcu traversal of gtp_dellink, is not part of the RCU read critical section, it is possible that the RCU grace period will pass during the traversal and the key will be free.
To prevent this, it should be changed to hlist_for_each_entry_safe.
--- drivers/net/gtp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/gtp.c +2 -1
@@ -1111,11 +1111,12 @@ static int gtp_newlink(struct net *src_net, struct net_device *dev,static void gtp_dellink (struct net_device *dev,struct list_head *head) {struct gtp_dev *gtp =netdev_priv (dev); +struct hlist_node *next;struct pdp_ctx *pctx;int i;for (i =0 ; i < gtp->hash_size; i++) -hlist_for_each_entry_rcu (pctx, >p->tid_hash[i], hlist_tid) +hlist_for_each_entry_safe (pctx, next, >p->tid_hash[i], hlist_tid)pdp_context_delete (pctx);list_del_rcu (>p->list);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 64/186 net: phy: mediatek-ge-soc: follow netdev LED trigger semantics
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Golle <[email protected]>
[ Upstream commit 5b5f724b05c550e10693a53a81cadca901aefd16 ]
Only blink if the link is up on a LED which is programmed to also indicate link-status.
Otherwise, if both LEDs are in use to indicate different speeds, the resulting blinking being inverted on LEDs which aren't switched on at a specific speed is quite counter-intuitive.
Also make sure that state left behind by reset or the bootloader is recognized correctly including the half-duplex and full-duplex bits as well as the (unsupported by Linux netdev trigger semantics) link-down bit.
--- drivers/net/phy/mediatek-ge-soc.c | 43 +++++++++++++++++++------------ 1 file changed, 26 insertions(+), 17 deletions(-)
drivers/net/phy/mediatek-ge-soc.c +26 -17
@@ -216,6 +216,9 @@#define MTK_PHY_LED_ON_LINK1000 BIT(0)#define MTK_PHY_LED_ON_LINK100 BIT(1)#define MTK_PHY_LED_ON_LINK10 BIT(2) +#define MTK_PHY_LED_ON_LINK (MTK_PHY_LED_ON_LINK10 |\ + MTK_PHY_LED_ON_LINK100 |\ + MTK_PHY_LED_ON_LINK1000)#define MTK_PHY_LED_ON_LINKDOWN BIT(3)#define MTK_PHY_LED_ON_FDX BIT(4)/* Full duplex */ #define MTK_PHY_LED_ON_HDX BIT(5)/* Half duplex */
@@ -231,6 +234,12 @@#define MTK_PHY_LED_BLINK_100RX BIT(3)#define MTK_PHY_LED_BLINK_10TX BIT(4)#define MTK_PHY_LED_BLINK_10RX BIT(5) +#define MTK_PHY_LED_BLINK_RX (MTK_PHY_LED_BLINK_10RX |\ + MTK_PHY_LED_BLINK_100RX |\ + MTK_PHY_LED_BLINK_1000RX) +#define MTK_PHY_LED_BLINK_TX (MTK_PHY_LED_BLINK_10TX |\ + MTK_PHY_LED_BLINK_100TX |\ + MTK_PHY_LED_BLINK_1000TX)#define MTK_PHY_LED_BLINK_COLLISION BIT(6)#define MTK_PHY_LED_BLINK_RX_CRC_ERR BIT(7)#define MTK_PHY_LED_BLINK_RX_IDLE_ERR BIT(8)
@@ -1247,11 +1256,9 @@ static int mt798x_phy_led_hw_control_get(struct phy_device *phydev, u8 index,if (blink <0 )return -EIO ; -if ((on & (MTK_PHY_LED_ON_LINK1000 |MTK_PHY_LED_ON_LINK100 | -MTK_PHY_LED_ON_LINK10 )) || - (blink & (MTK_PHY_LED_BLINK_1000RX |MTK_PHY_LED_BLINK_100RX | -MTK_PHY_LED_BLINK_10RX |MTK_PHY_LED_BLINK_1000TX | -MTK_PHY_LED_BLINK_100TX |MTK_PHY_LED_BLINK_10TX ))) +if ((on & (MTK_PHY_LED_ON_LINK |MTK_PHY_LED_ON_FDX |MTK_PHY_LED_ON_HDX | +MTK_PHY_LED_ON_LINKDOWN )) || + (blink & (MTK_PHY_LED_BLINK_RX |MTK_PHY_LED_BLINK_TX )))set_bit (bit_netdev, &priv->led_state);else clear_bit (bit_netdev, &priv->led_state);
@@ -1269,7 +1276,7 @@ static int mt798x_phy_led_hw_control_get(struct phy_device *phydev, u8 index,if (!rules)return 0 ; -if (on & (MTK_PHY_LED_ON_LINK1000 |MTK_PHY_LED_ON_LINK100 |MTK_PHY_LED_ON_LINK10 )) +if (on &MTK_PHY_LED_ON_LINK ) *rules |=BIT (TRIGGER_NETDEV_LINK );if (on &MTK_PHY_LED_ON_LINK10 )
@@ -1287,10 +1294,10 @@ static int mt798x_phy_led_hw_control_get(struct phy_device *phydev, u8 index,if (on &MTK_PHY_LED_ON_HDX ) *rules |=BIT (TRIGGER_NETDEV_HALF_DUPLEX ); -if (blink & (MTK_PHY_LED_BLINK_1000RX |MTK_PHY_LED_BLINK_100RX |MTK_PHY_LED_BLINK_10RX )) +if (blink &MTK_PHY_LED_BLINK_RX ) *rules |=BIT (TRIGGER_NETDEV_RX ); -if (blink & (MTK_PHY_LED_BLINK_1000TX |MTK_PHY_LED_BLINK_100TX |MTK_PHY_LED_BLINK_10TX )) +if (blink &MTK_PHY_LED_BLINK_TX ) *rules |=BIT (TRIGGER_NETDEV_TX );return 0 ;
@@ -1323,15 +1330,19 @@ static int mt798x_phy_led_hw_control_set(struct phy_device *phydev, u8 index, on |=MTK_PHY_LED_ON_LINK1000 ;if (rules &BIT (TRIGGER_NETDEV_RX )) { - blink |=MTK_PHY_LED_BLINK_10RX | -MTK_PHY_LED_BLINK_100RX | -MTK_PHY_LED_BLINK_1000RX ; + blink |= (on &MTK_PHY_LED_ON_LINK ) ? + (((on &MTK_PHY_LED_ON_LINK10 ) ?MTK_PHY_LED_BLINK_10RX :0 ) | + ((on &MTK_PHY_LED_ON_LINK100 ) ?MTK_PHY_LED_BLINK_100RX :0 ) | + ((on &MTK_PHY_LED_ON_LINK1000 ) ?MTK_PHY_LED_BLINK_1000RX :0 )) : +MTK_PHY_LED_BLINK_RX ; }if (rules &BIT (TRIGGER_NETDEV_TX )) { - blink |=MTK_PHY_LED_BLINK_10TX | -MTK_PHY_LED_BLINK_100TX | -MTK_PHY_LED_BLINK_1000TX ; + blink |= (on &MTK_PHY_LED_ON_LINK ) ? + (((on &MTK_PHY_LED_ON_LINK10 ) ?MTK_PHY_LED_BLINK_10TX :0 ) | + ((on &MTK_PHY_LED_ON_LINK100 ) ?MTK_PHY_LED_BLINK_100TX :0 ) | + ((on &MTK_PHY_LED_ON_LINK1000 ) ?MTK_PHY_LED_BLINK_1000TX :0 )) : +MTK_PHY_LED_BLINK_TX ; }if (blink || on)
@@ -1344,9 +1355,7 @@ static int mt798x_phy_led_hw_control_set(struct phy_device *phydev, u8 index,MTK_PHY_LED0_ON_CTRL ,MTK_PHY_LED_ON_FDX |MTK_PHY_LED_ON_HDX | -MTK_PHY_LED_ON_LINK10 | -MTK_PHY_LED_ON_LINK100 | -MTK_PHY_LED_ON_LINK1000 , +MTK_PHY_LED_ON_LINK , on);if (ret)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 65/186 gpio: tegra186: Fix tegra186_gpio_is_accessible() check
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Prathamesh Shete <[email protected]>
[ Upstream commit d806f474a9a7993648a2c70642ee129316d8deff ]
The controller has several register bits describing access control information for a given GPIO pin. When SCR_SEC_[R|W]EN is unset, it means we have full read/write access to all the registers for given GPIO pin. When SCR_SEC[R|W]EN is set, it means we need to further check the accompanying SCR_SEC_G1[R|W] bit to determine read/write access to all the registers for given GPIO pin.
This check was previously declaring that a GPIO pin was accessible only if either of the following conditions were met:
- SCR_SEC_REN + SCR_SEC_WEN both set
or
- SCR_SEC_REN + SCR_SEC_WEN both set and
SCR_SEC_G1R + SCR_SEC_G1W both set
Update the check to properly handle cases where only one of SCR_SEC_REN or SCR_SEC_WEN is set.
--- drivers/gpio/gpio-tegra186.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
drivers/gpio/gpio-tegra186.c +11 -9
@@ -36,12 +36,6 @@#define TEGRA186_GPIO_SCR_SEC_REN BIT(27)#define TEGRA186_GPIO_SCR_SEC_G1W BIT(9)#define TEGRA186_GPIO_SCR_SEC_G1R BIT(1) -#define TEGRA186_GPIO_FULL_ACCESS (TEGRA186_GPIO_SCR_SEC_WEN | \ - TEGRA186_GPIO_SCR_SEC_REN | \ - TEGRA186_GPIO_SCR_SEC_G1R | \ - TEGRA186_GPIO_SCR_SEC_G1W) -#define TEGRA186_GPIO_SCR_SEC_ENABLE (TEGRA186_GPIO_SCR_SEC_WEN | \ - TEGRA186_GPIO_SCR_SEC_REN)/* control registers */ #define TEGRA186_GPIO_ENABLE_CONFIG 0x00
@@ -177,10 +171,18 @@ static inline bool tegra186_gpio_is_accessible(struct tegra_gpio *gpio, unsigned value =__raw_readl (secure +TEGRA186_GPIO_SCR ); -if ((value &TEGRA186_GPIO_SCR_SEC_ENABLE ) ==0 ) -return true; +/* +* When SCR_SEC_[R|W]EN is unset, then we have full read/write access to all the +* registers for given GPIO pin. +* When SCR_SEC[R|W]EN is set, then there is need to further check the accompanying +* SCR_SEC_G1[R|W] bit to determine read/write access to all the registers for given +* GPIO pin. +*/ -if ((value &TEGRA186_GPIO_FULL_ACCESS ) ==TEGRA186_GPIO_FULL_ACCESS ) +if (((value &TEGRA186_GPIO_SCR_SEC_REN ) ==0 || + ((value &TEGRA186_GPIO_SCR_SEC_REN ) && (value &TEGRA186_GPIO_SCR_SEC_G1R ))) && + ((value &TEGRA186_GPIO_SCR_SEC_WEN ) ==0 || + ((value &TEGRA186_GPIO_SCR_SEC_WEN ) && (value &TEGRA186_GPIO_SCR_SEC_G1W ))))return true;return false;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 66/186 Bluetooth: btusb: Fix triggering coredump implementation for QCA
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijun Hu <[email protected]>
[ Upstream commit b23d98d46d2858dcc0fd016caff165cbdc24e70a ]
btusb_coredump_qca() uses __hci_cmd_sync() to send a vendor-specific command to trigger firmware coredump, but the command does not have any event as its sync response, so it is not suitable to use __hci_cmd_sync(), fixed by using __hci_cmd_send().
--- drivers/bluetooth/btusb.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/bluetooth/btusb.c +4 -5
@@ -3457,13 +3457,12 @@ static void btusb_dump_hdr_qca(struct hci_dev *hdev, struct sk_buff *skb)static void btusb_coredump_qca (struct hci_dev *hdev) { +int err;static const u8 param[] = {0x26 }; -struct sk_buff *skb; - skb =__hci_cmd_sync (hdev,0xfc0c ,1 , param,HCI_CMD_TIMEOUT ); -if (IS_ERR (skb)) -bt_dev_err (hdev,"%s: triggle crash failed (%ld)" , __func__,PTR_ERR (skb)); -kfree_skb (skb); + err =__hci_cmd_send (hdev,0xfc0c ,1 , param); +if (err <0 ) +bt_dev_err (hdev,"%s: triggle crash failed (%d)" , __func__, err); }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 67/186 Bluetooth: hci_event: Fix sending HCI_OP_READ_ENC_KEY_SIZE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit a9a830a676a9a93c5020f5c61236166931fa4266 ]
The code shall always check if HCI_QUIRK_BROKEN_READ_ENC_KEY_SIZE has been set before attempting to use HCI_OP_READ_ENC_KEY_SIZE.
--- include/net/bluetooth/hci_core.h | 4 ++++ net/bluetooth/hci_event.c | 5 ++--- 2 files changed, 6 insertions(+), 3 deletions(-)
include/net/bluetooth/hci_core.h +4 -0
@@ -1865,6 +1865,10 @@ void hci_conn_del_sysfs(struct hci_conn *conn);#define privacy_mode_capable (dev) (use_ll_privacy(dev) && \ (hdev->commands[39] & 0x04)) +#define read_key_size_capable (dev) \ + ((dev)->commands[20] & 0x10 && \ + !test_bit(HCI_QUIRK_BROKEN_READ_ENC_KEY_SIZE, &hdev->quirks)) +/* Use enhanced synchronous connection if command is supported and its quirk * has not been set. */
net/bluetooth/hci_event.c +2 -3
@@ -3229,7 +3229,7 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data,if (key) {set_bit (HCI_CONN_ENCRYPT , &conn->flags); -if (!(hdev->commands[20 ] &0x10 )) { +if (!read_key_size_capable (hdev)) { conn->enc_key_size =HCI_LINK_KEY_SIZE ; }else { cp.handle =cpu_to_le16 (conn->handle);
@@ -3679,8 +3679,7 @@ static void hci_encrypt_change_evt(struct hci_dev *hdev, void *data,* controller really supports it. If it doesn't, assume * the default size (16). */ -if (!(hdev->commands[20 ] &0x10 ) || -test_bit (HCI_QUIRK_BROKEN_READ_ENC_KEY_SIZE , &hdev->quirks)) { +if (!read_key_size_capable (hdev)) { conn->enc_key_size =HCI_LINK_KEY_SIZE ; goto notify; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 68/186 Bluetooth: MGMT: Fix failing to MGMT_OP_ADD_UUID/MGMT_OP_REMOVE_UUID
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 6eb5fcc416f127f220b9177a5c9ae751cac1cda8 ]
These commands don't require the adapter to be up and running so don't use hci_cmd_sync_queue which would check that flag, instead use hci_cmd_sync_submit which would ensure mgmt_class_complete is set properly regardless if any command was actually run or not.
--- net/bluetooth/mgmt.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
net/bluetooth/mgmt.c +15 -5
@@ -2616,7 +2616,11 @@ static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) goto failed; } - err =hci_cmd_sync_queue (hdev, add_uuid_sync, cmd, mgmt_class_complete); +/* MGMT_OP_ADD_UUID don't require adapter the UP/Running so use +* hci_cmd_sync_submit instead of hci_cmd_sync_queue. +*/ + err =hci_cmd_sync_submit (hdev, add_uuid_sync, cmd, + mgmt_class_complete);if (err <0 ) {mgmt_pending_free (cmd); goto failed;
@@ -2710,8 +2714,11 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data, goto unlock; } - err =hci_cmd_sync_queue (hdev, remove_uuid_sync, cmd, - mgmt_class_complete); +/* MGMT_OP_REMOVE_UUID don't require adapter the UP/Running so use +* hci_cmd_sync_submit instead of hci_cmd_sync_queue. +*/ + err =hci_cmd_sync_submit (hdev, remove_uuid_sync, cmd, + mgmt_class_complete);if (err <0 )mgmt_pending_free (cmd);
@@ -2777,8 +2784,11 @@ static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data, goto unlock; } - err =hci_cmd_sync_queue (hdev, set_class_sync, cmd, - mgmt_class_complete); +/* MGMT_OP_SET_DEV_CLASS don't require adapter the UP/Running so use +* hci_cmd_sync_submit instead of hci_cmd_sync_queue. +*/ + err =hci_cmd_sync_submit (hdev, set_class_sync, cmd, + mgmt_class_complete);if (err <0 )mgmt_pending_free (cmd);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 69/186 Bluetooth: btusb: mediatek: Fix double free of skb in coredump
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Wang <[email protected]>
[ Upstream commit 18bdb386a1a30e7a3d7732a98e45e69cf6b5710d ]
hci_devcd_append() would free the skb on error so the caller don't have to free it again otherwise it would cause the double free of skb.
--- drivers/bluetooth/btmtk.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/bluetooth/btmtk.c +3 -4
@@ -380,8 +380,10 @@ int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb)switch (data->cd_info.state) {case HCI_DEVCOREDUMP_IDLE : err =hci_devcd_init (hdev,MTK_COREDUMP_SIZE ); -if (err <0 ) +if (err <0 ) { +kfree_skb (skb);break ; + } data->cd_info.cnt =0 ;/* It is supposed coredump can be done within 5 seconds */
@@ -407,9 +409,6 @@ int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb)break ; } -if (err <0 ) -kfree_skb (skb); -return err; }EXPORT_SYMBOL_GPL (btmtk_process_coredump);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 70/186 Bluetooth: hci_sync: Using hci_cmd_sync_submit when removing Adv Monitor
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chun-Yi Lee <[email protected]>
[ Upstream commit 88cd6e6b2d327faa13e4505b07f1e380e51b21ff ]
Since the d883a4669a1de be introduced in v6.4, bluetooth daemon got the following failed message of MGMT_OP_REMOVE_ADV_MONITOR command when controller is power-off:
bluetoothd[20976]:
src/adapter.c:reset_adv_monitors_complete() Failed to reset Adv
Monitors: Failed>
Normally this situation is happened when the bluetoothd deamon be started manually after system booting. Which means that bluetoothd received MGMT_EV_INDEX_ADDED event after kernel runs hci_power_off().
Base on doc/mgmt-api.txt, the MGMT_OP_REMOVE_ADV_MONITOR command can be used when the controller is not powered. This patch changes the code in remove_adv_monitor() to use hci_cmd_sync_submit() instead of hci_cmd_sync_queue().
--- net/bluetooth/mgmt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/bluetooth/mgmt.c +2 -2
@@ -5477,8 +5477,8 @@ static int remove_adv_monitor(struct sock *sk, struct hci_dev *hdev, goto unlock; } - err =hci_cmd_sync_queue (hdev, mgmt_remove_adv_monitor_sync, cmd, - mgmt_remove_adv_monitor_complete); + err =hci_cmd_sync_submit (hdev, mgmt_remove_adv_monitor_sync, cmd, + mgmt_remove_adv_monitor_complete);if (err) {mgmt_pending_remove (cmd);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 71/186 Bluetooth: qca: set power_ctrl_enabled on NULL returned by gpiod_get_optional()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bartosz Golaszewski <[email protected]>
[ Upstream commit 3d05fc82237aa97162d0d7dc300b55bb34e91d02 ]
Any return value from gpiod_get_optional() other than a pointer to a GPIO descriptor or a NULL-pointer is an error and the driver should abort probing. That being said: commit 56d074d26c58 ("Bluetooth: hci_qca:
don't use IS_ERR_OR_NULL() with gpiod_get_optional()") no longer sets power_ctrl_enabled on NULL-pointer returned by devm_gpiod_get_optional(). Restore this behavior but bail-out on errors. While at it: also bail-out on error returned when trying to get the "swctrl" GPIO.
--- drivers/bluetooth/hci_qca.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/bluetooth/hci_qca.c +13 -5
@@ -2298,16 +2298,21 @@ static int qca_serdev_probe(struct serdev_device *serdev) (data->soc_type == QCA_WCN6750 || data->soc_type == QCA_WCN6855)) {dev_err (&serdev->dev,"failed to acquire BT_EN gpio\n" ); - power_ctrl_enabled = false; +return PTR_ERR (qcadev->bt_en); } +if (!qcadev->bt_en) + power_ctrl_enabled = false; + qcadev->sw_ctrl =devm_gpiod_get_optional (&serdev->dev,"swctrl" ,GPIOD_IN );if (IS_ERR (qcadev->sw_ctrl) && (data->soc_type ==QCA_WCN6750 || data->soc_type ==QCA_WCN6855 || - data->soc_type ==QCA_WCN7850 )) -dev_warn (&serdev->dev,"failed to acquire SW_CTRL gpio\n" ); + data->soc_type ==QCA_WCN7850 )) { +dev_err (&serdev->dev,"failed to acquire SW_CTRL gpio\n" ); +return PTR_ERR (qcadev->sw_ctrl); + } qcadev->susclk =devm_clk_get_optional (&serdev->dev,NULL );if (IS_ERR (qcadev->susclk)) {
@@ -2326,10 +2331,13 @@ static int qca_serdev_probe(struct serdev_device *serdev) qcadev->bt_en =devm_gpiod_get_optional (&serdev->dev,"enable" ,GPIOD_OUT_LOW );if (IS_ERR (qcadev->bt_en)) { -dev_warn (&serdev->dev,"failed to acquire enable gpio\n" ); - power_ctrl_enabled = false; +dev_err (&serdev->dev,"failed to acquire enable gpio\n" ); +return PTR_ERR (qcadev->bt_en); } +if (!qcadev->bt_en) + power_ctrl_enabled = false; + qcadev->susclk =devm_clk_get_optional (&serdev->dev,NULL );if (IS_ERR (qcadev->susclk)) {dev_warn (&serdev->dev,"failed to acquire clk\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 72/186 ipvs: Fix checksumming on GSO of SCTP packets
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ismael Luceno <[email protected]>
[ Upstream commit e10d3ba4d434ed172914617ed8d74bd411421193 ]
It was observed in the wild that pairs of consecutive packets would leave the IPVS with the same wrong checksum, and the issue only went away when disabling GSO.
IPVS needs to avoid computing the SCTP checksum when using GSO.
--- net/netfilter/ipvs/ip_vs_proto_sctp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/netfilter/ipvs/ip_vs_proto_sctp.c +4 -2
@@ -126,7 +126,8 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,if (sctph->source != cp->vport || payload_csum || skb->ip_summed ==CHECKSUM_PARTIAL ) { sctph->source = cp->vport; -sctp_nat_csum (skb, sctph, sctphoff); +if (!skb_is_gso (skb) || !skb_is_gso_sctp (skb)) +sctp_nat_csum (skb, sctph, sctphoff); }else { skb->ip_summed =CHECKSUM_UNNECESSARY ; }
@@ -174,7 +175,8 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, (skb->ip_summed == CHECKSUM_PARTIAL && !(skb_dst(skb)->dev->features & NETIF_F_SCTP_CRC))) { sctph->dest = cp->dport; -sctp_nat_csum (skb, sctph, sctphoff); +if (!skb_is_gso (skb) || !skb_is_gso_sctp (skb)) +sctp_nat_csum (skb, sctph, sctphoff); } else if (skb->ip_summed != CHECKSUM_PARTIAL) { skb->ip_summed =CHECKSUM_UNNECESSARY ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 73/186 net: openvswitch: Fix Use-After-Free in ovs_ct_exit
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hyunwoo Kim <[email protected]>
[ Upstream commit 5ea7b72d4fac2fdbc0425cd8f2ea33abe95235b2 ]
Since kfree_rcu, which is called in the hlist_for_each_entry_rcu traversal of ovs_ct_limit_exit, is not part of the RCU read critical section, it is possible that the RCU grace period will pass during the traversal and the key will be free.
To prevent this, it should be changed to hlist_for_each_entry_safe.
--- net/openvswitch/conntrack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/openvswitch/conntrack.c +2 -2
@@ -1593,9 +1593,9 @@ static void ovs_ct_limit_exit(struct net *net, struct ovs_net *ovs_net)for (i =0 ; i <CT_LIMIT_HASH_BUCKETS ; ++i) {struct hlist_head *head = &info->limits[i];struct ovs_ct_limit *ct_limit; +struct hlist_node *next; -hlist_for_each_entry_rcu (ct_limit, head, hlist_node, -lockdep_ovsl_is_held ()) +hlist_for_each_entry_safe (ct_limit, next, head, hlist_node)kfree_rcu (ct_limit, rcu); }kfree (info->limits);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 74/186 mlxsw: Use refcount_t for reference counting
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amit Cohen <[email protected]>
[ Upstream commit 1267f7223bec186dc26ef4e6075496c6217355de ]
mlxsw driver uses 'unsigned int' for reference counters in several structures. Instead, use refcount_t type which allows us to catch overflow and underflow issues. Change the type of the counters and use the appropriate API.
Stable-dep-of: 627f9c1bb882 ("mlxsw: spectrum_acl_tcam: Fix race in region ID allocation")
--- .../mellanox/mlxsw/core_acl_flex_actions.c | 16 ++++++++-------- .../mellanox/mlxsw/core_acl_flex_keys.c | 9 +++++---- .../net/ethernet/mellanox/mlxsw/spectrum_acl.c | 11 ++++++----- .../ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 17 +++++++++-------- .../ethernet/mellanox/mlxsw/spectrum_router.c | 15 ++++++++------- .../mellanox/mlxsw/spectrum_switchdev.c | 8 ++++---- 6 files changed, 40 insertions(+), 36 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.c +8 -8
@@ -95,7 +95,7 @@ struct mlxsw_afa_set {*/ has_trap:1 , has_police:1; -unsigned int ref_count; +refcount_t ref_count;struct mlxsw_afa_set *next;/* Pointer to the next set. */ struct mlxsw_afa_set *prev;/* Pointer to the previous set, * note that set may have multiple
@@ -120,7 +120,7 @@ struct mlxsw_afa_fwd_entry {struct rhash_head ht_node;struct mlxsw_afa_fwd_entry_ht_key ht_key;u32 kvdl_index; -unsigned int ref_count; +refcount_t ref_count; };static const struct rhashtable_params mlxsw_afa_fwd_entry_ht_params = {
@@ -282,7 +282,7 @@ static struct mlxsw_afa_set *mlxsw_afa_set_create(bool is_first)/* Need to initialize the set to pass by default */ mlxsw_afa_set_goto_set (set,MLXSW_AFA_SET_GOTO_BINDING_CMD_TERM ,0 ); set->ht_key.is_first = is_first; - set->ref_count =1 ; +refcount_set (&set->ref_count,1 );return set; }
@@ -330,7 +330,7 @@ static void mlxsw_afa_set_unshare(struct mlxsw_afa *mlxsw_afa,static void mlxsw_afa_set_put (struct mlxsw_afa *mlxsw_afa,struct mlxsw_afa_set *set) { -if (--set->ref_count) +if (!refcount_dec_and_test (&set->ref_count))return ;if (set->shared)mlxsw_afa_set_unshare (mlxsw_afa, set);
@@ -350,7 +350,7 @@ static struct mlxsw_afa_set *mlxsw_afa_set_get(struct mlxsw_afa *mlxsw_afa, set =rhashtable_lookup_fast (&mlxsw_afa->set_ht, &orig_set->ht_key, mlxsw_afa_set_ht_params);if (set) { - set->ref_count++; +refcount_inc (&set->ref_count);mlxsw_afa_set_put (mlxsw_afa, orig_set); }else { set = orig_set;
@@ -564,7 +564,7 @@ mlxsw_afa_fwd_entry_create(struct mlxsw_afa *mlxsw_afa, u16 local_port)if (!fwd_entry)return ERR_PTR (-ENOMEM ); fwd_entry->ht_key.local_port = local_port; - fwd_entry->ref_count =1 ; +refcount_set (&fwd_entry->ref_count,1 ); err = rhashtable_insert_fast(&mlxsw_afa->fwd_entry_ht, &fwd_entry->ht_node,
@@ -607,7 +607,7 @@ mlxsw_afa_fwd_entry_get(struct mlxsw_afa *mlxsw_afa, u16 local_port) fwd_entry =rhashtable_lookup_fast (&mlxsw_afa->fwd_entry_ht, &ht_key, mlxsw_afa_fwd_entry_ht_params);if (fwd_entry) { - fwd_entry->ref_count++; +refcount_inc (&fwd_entry->ref_count);return fwd_entry; }return mlxsw_afa_fwd_entry_create (mlxsw_afa, local_port);
@@ -616,7 +616,7 @@ mlxsw_afa_fwd_entry_get(struct mlxsw_afa *mlxsw_afa, u16 local_port)static void mlxsw_afa_fwd_entry_put (struct mlxsw_afa *mlxsw_afa,struct mlxsw_afa_fwd_entry *fwd_entry) { -if (--fwd_entry->ref_count) +if (!refcount_dec_and_test (&fwd_entry->ref_count))return ;mlxsw_afa_fwd_entry_destroy (mlxsw_afa, fwd_entry); }
drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c +5 -4
@@ -5,6 +5,7 @@#include <linux/slab.h> #include <linux/list.h> #include <linux/errno.h> +#include <linux/refcount.h> #include "item.h" #include "core_acl_flex_keys.h"
@@ -105,7 +106,7 @@ EXPORT_SYMBOL(mlxsw_afk_destroy);struct mlxsw_afk_key_info {struct list_head list; -unsigned int ref_count; +refcount_t ref_count;unsigned int blocks_count;int element_to_block[MLXSW_AFK_ELEMENT_MAX ];/* index is element, value * is index inside "blocks"
@@ -282,7 +283,7 @@ mlxsw_afk_key_info_create(struct mlxsw_afk *mlxsw_afk,if (err) goto err_picker;list_add (&key_info->list, &mlxsw_afk->key_info_list); - key_info->ref_count =1 ; +refcount_set (&key_info->ref_count,1 );return key_info; err_picker:
@@ -304,7 +305,7 @@ mlxsw_afk_key_info_get(struct mlxsw_afk *mlxsw_afk, key_info =mlxsw_afk_key_info_find (mlxsw_afk, elusage);if (key_info) { - key_info->ref_count++; +refcount_inc (&key_info->ref_count);return key_info; }return mlxsw_afk_key_info_create (mlxsw_afk, elusage);
@@ -313,7 +314,7 @@ EXPORT_SYMBOL(mlxsw_afk_key_info_get);void mlxsw_afk_key_info_put (struct mlxsw_afk_key_info *key_info) { -if (--key_info->ref_count) +if (!refcount_dec_and_test (&key_info->ref_count))return ;mlxsw_afk_key_info_destroy (key_info); }
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c +6 -5
@@ -9,6 +9,7 @@#include <linux/rhashtable.h> #include <linux/netdevice.h> #include <linux/mutex.h> +#include <linux/refcount.h> #include <net/net_namespace.h> #include <net/tc_act/tc_vlan.h>
@@ -55,7 +56,7 @@ struct mlxsw_sp_acl_ruleset {struct rhash_head ht_node;/* Member of acl HT */ struct mlxsw_sp_acl_ruleset_ht_key ht_key;struct rhashtable rule_ht; -unsigned int ref_count; +refcount_t ref_count;unsigned int min_prio;unsigned int max_prio;unsigned long priv[];
@@ -99,7 +100,7 @@ static bool mlxsw_sp_acl_ruleset_is_singular(const struct mlxsw_sp_acl_ruleset *ruleset) {/* We hold a reference on ruleset ourselves */ -return ruleset->ref_count ==2 ; +return refcount_read (&ruleset->ref_count) ==2 ; } int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp,
@@ -176,7 +177,7 @@ mlxsw_sp_acl_ruleset_create(struct mlxsw_sp *mlxsw_sp, ruleset =kzalloc (alloc_size,GFP_KERNEL );if (!ruleset)return ERR_PTR (-ENOMEM ); - ruleset->ref_count =1 ; +refcount_set (&ruleset->ref_count,1 ); ruleset->ht_key.block = block; ruleset->ht_key.chain_index = chain_index; ruleset->ht_key.ops = ops;
@@ -222,13 +223,13 @@ static void mlxsw_sp_acl_ruleset_destroy(struct mlxsw_sp *mlxsw_sp,static void mlxsw_sp_acl_ruleset_ref_inc (struct mlxsw_sp_acl_ruleset *ruleset) { - ruleset->ref_count++; +refcount_inc (&ruleset->ref_count); }static void mlxsw_sp_acl_ruleset_ref_dec (struct mlxsw_sp *mlxsw_sp,struct mlxsw_sp_acl_ruleset *ruleset) { -if (--ruleset->ref_count) +if (!refcount_dec_and_test (&ruleset->ref_count))return ;mlxsw_sp_acl_ruleset_destroy (mlxsw_sp, ruleset); }
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +9 -8
@@ -9,6 +9,7 @@#include <linux/rhashtable.h> #include <linux/netdevice.h> #include <linux/mutex.h> +#include <linux/refcount.h> #include <net/devlink.h> #include <trace/events/mlxsw.h>
@@ -155,7 +156,7 @@ struct mlxsw_sp_acl_tcam_vregion {struct mlxsw_sp_acl_tcam_rehash_ctx ctx; } rehash;struct mlxsw_sp *mlxsw_sp; -unsigned int ref_count; +refcount_t ref_count; };struct mlxsw_sp_acl_tcam_vchunk ;
@@ -176,7 +177,7 @@ struct mlxsw_sp_acl_tcam_vchunk {unsigned int priority;/* Priority within the vregion and group */ struct mlxsw_sp_acl_tcam_vgroup *vgroup;struct mlxsw_sp_acl_tcam_vregion *vregion; -unsigned int ref_count; +refcount_t ref_count; };struct mlxsw_sp_acl_tcam_entry {
@@ -769,7 +770,7 @@ mlxsw_sp_acl_tcam_vregion_create(struct mlxsw_sp *mlxsw_sp, vregion->tcam = tcam; vregion->mlxsw_sp = mlxsw_sp; vregion->vgroup = vgroup; - vregion->ref_count =1 ; +refcount_set (&vregion->ref_count,1 ); vregion->key_info =mlxsw_afk_key_info_get (afk, elusage);if (IS_ERR (vregion->key_info)) {
@@ -856,7 +857,7 @@ mlxsw_sp_acl_tcam_vregion_get(struct mlxsw_sp *mlxsw_sp,*/ return ERR_PTR (-EOPNOTSUPP ); } - vregion->ref_count++; +refcount_inc (&vregion->ref_count);return vregion; }
@@ -871,7 +872,7 @@ static void mlxsw_sp_acl_tcam_vregion_put(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_acl_tcam_vregion *vregion) { -if (--vregion->ref_count) +if (!refcount_dec_and_test (&vregion->ref_count))return ;mlxsw_sp_acl_tcam_vregion_destroy (mlxsw_sp, vregion); }
@@ -924,7 +925,7 @@ mlxsw_sp_acl_tcam_vchunk_create(struct mlxsw_sp *mlxsw_sp,INIT_LIST_HEAD (&vchunk->ventry_list); vchunk->priority = priority; vchunk->vgroup = vgroup; - vchunk->ref_count =1 ; +refcount_set (&vchunk->ref_count,1 ); vregion =mlxsw_sp_acl_tcam_vregion_get (mlxsw_sp, vgroup, priority, elusage);
@@ -1008,7 +1009,7 @@ mlxsw_sp_acl_tcam_vchunk_get(struct mlxsw_sp *mlxsw_sp,if (WARN_ON (!mlxsw_afk_key_info_subset (vchunk->vregion->key_info, elusage)))return ERR_PTR (-EINVAL ); - vchunk->ref_count++; +refcount_inc (&vchunk->ref_count);return vchunk; } return mlxsw_sp_acl_tcam_vchunk_create(mlxsw_sp, vgroup,
@@ -1019,7 +1020,7 @@ static void mlxsw_sp_acl_tcam_vchunk_put(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_acl_tcam_vchunk *vchunk) { -if (--vchunk->ref_count) +if (!refcount_dec_and_test (&vchunk->ref_count))return ;mlxsw_sp_acl_tcam_vchunk_destroy (mlxsw_sp, vchunk); }
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +8 -7
@@ -501,7 +501,7 @@ struct mlxsw_sp_rt6 {struct mlxsw_sp_lpm_tree {u8 id;/* tree ID */ -unsigned int ref_count; +refcount_t ref_count;enum mlxsw_sp_l3proto proto;unsigned long prefix_ref_count[MLXSW_SP_PREFIX_COUNT ];struct mlxsw_sp_prefix_usage prefix_usage;
@@ -578,7 +578,7 @@ mlxsw_sp_lpm_tree_find_unused(struct mlxsw_sp *mlxsw_sp)for (i =0 ; i < mlxsw_sp->router->lpm.tree_count; i++) { lpm_tree = &mlxsw_sp->router->lpm.trees[i]; -if (lpm_tree->ref_count ==0 ) +if (refcount_read (&lpm_tree->ref_count) ==0 )return lpm_tree; }return NULL ;
@@ -654,7 +654,7 @@ mlxsw_sp_lpm_tree_create(struct mlxsw_sp *mlxsw_sp, sizeof(lpm_tree->prefix_usage));memset (&lpm_tree->prefix_ref_count,0 ,sizeof (lpm_tree->prefix_ref_count)); - lpm_tree->ref_count =1 ; +refcount_set (&lpm_tree->ref_count,1 );return lpm_tree; err_left_struct_set:
@@ -678,7 +678,7 @@ mlxsw_sp_lpm_tree_get(struct mlxsw_sp *mlxsw_sp,for (i =0 ; i < mlxsw_sp->router->lpm.tree_count; i++) { lpm_tree = &mlxsw_sp->router->lpm.trees[i]; -if (lpm_tree->ref_count !=0 && +if (refcount_read (&lpm_tree->ref_count) && lpm_tree->proto == proto &&mlxsw_sp_prefix_usage_eq (&lpm_tree->prefix_usage, prefix_usage)) {
@@ -691,14 +691,15 @@ mlxsw_sp_lpm_tree_get(struct mlxsw_sp *mlxsw_sp,static void mlxsw_sp_lpm_tree_hold (struct mlxsw_sp_lpm_tree *lpm_tree) { - lpm_tree->ref_count++; +refcount_inc (&lpm_tree->ref_count); }static void mlxsw_sp_lpm_tree_put (struct mlxsw_sp *mlxsw_sp,struct mlxsw_sp_lpm_tree *lpm_tree) { -if (--lpm_tree->ref_count ==0 ) -mlxsw_sp_lpm_tree_destroy (mlxsw_sp, lpm_tree); +if (!refcount_dec_and_test (&lpm_tree->ref_count)) +return ; +mlxsw_sp_lpm_tree_destroy (mlxsw_sp, lpm_tree); }#define MLXSW_SP_LPM_TREE_MIN 1/* tree 0 is reserved */
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +4 -4
@@ -61,7 +61,7 @@ struct mlxsw_sp_bridge_port {struct mlxsw_sp_bridge_device *bridge_device;struct list_head list;struct list_head vlans_list; -unsigned int ref_count; +refcount_t ref_count;u8 stp_state;unsigned long flags;bool mrouter;
@@ -495,7 +495,7 @@ mlxsw_sp_bridge_port_create(struct mlxsw_sp_bridge_device *bridge_device,BR_MCAST_FLOOD ;INIT_LIST_HEAD (&bridge_port->vlans_list);list_add (&bridge_port->list, &bridge_device->ports_list); - bridge_port->ref_count =1 ; +refcount_set (&bridge_port->ref_count,1 ); err =switchdev_bridge_port_offload (brport_dev, mlxsw_sp_port->dev,NULL ,NULL ,NULL , false, extack);
@@ -531,7 +531,7 @@ mlxsw_sp_bridge_port_get(struct mlxsw_sp_bridge *bridge, bridge_port =mlxsw_sp_bridge_port_find (bridge, brport_dev);if (bridge_port) { - bridge_port->ref_count++; +refcount_inc (&bridge_port->ref_count);return bridge_port; }
@@ -558,7 +558,7 @@ static void mlxsw_sp_bridge_port_put(struct mlxsw_sp_bridge *bridge, {struct mlxsw_sp_bridge_device *bridge_device; -if (--bridge_port->ref_count !=0 ) +if (!refcount_dec_and_test (&bridge_port->ref_count))return ; bridge_device = bridge_port->bridge_device;mlxsw_sp_bridge_port_destroy (bridge_port);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 75/186 mlxsw: spectrum_acl_tcam: Fix race in region ID allocation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 627f9c1bb882765a84aa78015abbacd783d429be ]
Region identifiers can be allocated both when user space tries to insert a new tc filter and when filters are migrated from one region to another as part of the rehash delayed work.
There is no lock protecting the bitmap from which these identifiers are allocated from, which is racy and leads to bad parameter errors from the device's firmware.
Fix by converting the bitmap to IDA which handles its own locking. For consistency, do the same for the group identifiers that are part of the same structure.
--- .../mellanox/mlxsw/spectrum_acl_tcam.c | 61 ++++++++----------- .../mellanox/mlxsw/spectrum_acl_tcam.h | 5 +- 2 files changed, 30 insertions(+), 36 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +27 -34
@@ -10,6 +10,7 @@#include <linux/netdevice.h> #include <linux/mutex.h> #include <linux/refcount.h> +#include <linux/idr.h> #include <net/devlink.h> #include <trace/events/mlxsw.h>
@@ -58,41 +59,43 @@ int mlxsw_sp_acl_tcam_priority_get(struct mlxsw_sp *mlxsw_sp,static int mlxsw_sp_acl_tcam_region_id_get (struct mlxsw_sp_acl_tcam *tcam,u16 *p_id) { -u16 id; +int id; - id =find_first_zero_bit (tcam->used_regions, tcam->max_regions); -if (id < tcam->max_regions) { -__set_bit (id, tcam->used_regions); - *p_id = id; -return 0 ; - } -return -ENOBUFS ; + id =ida_alloc_max (&tcam->used_regions, tcam->max_regions -1 , +GFP_KERNEL ); +if (id <0 ) +return id; + + *p_id = id; + +return 0 ; }static void mlxsw_sp_acl_tcam_region_id_put (struct mlxsw_sp_acl_tcam *tcam,u16 id) { -__clear_bit (id, tcam->used_regions); +ida_free (&tcam->used_regions, id); }static int mlxsw_sp_acl_tcam_group_id_get (struct mlxsw_sp_acl_tcam *tcam,u16 *p_id) { -u16 id; +int id; - id =find_first_zero_bit (tcam->used_groups, tcam->max_groups); -if (id < tcam->max_groups) { -__set_bit (id, tcam->used_groups); - *p_id = id; -return 0 ; - } -return -ENOBUFS ; + id =ida_alloc_max (&tcam->used_groups, tcam->max_groups -1 , +GFP_KERNEL ); +if (id <0 ) +return id; + + *p_id = id; + +return 0 ; }static void mlxsw_sp_acl_tcam_group_id_put (struct mlxsw_sp_acl_tcam *tcam,u16 id) { -__clear_bit (id, tcam->used_groups); +ida_free (&tcam->used_groups, id); }struct mlxsw_sp_acl_tcam_pattern {
@@ -1549,19 +1552,11 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp,if (max_tcam_regions < max_regions) max_regions = max_tcam_regions; - tcam->used_regions =bitmap_zalloc (max_regions,GFP_KERNEL ); -if (!tcam->used_regions) { - err = -ENOMEM ; - goto err_alloc_used_regions; - } +ida_init (&tcam->used_regions); tcam->max_regions = max_regions; max_groups =MLXSW_CORE_RES_GET (mlxsw_sp->core,ACL_MAX_GROUPS ); - tcam->used_groups =bitmap_zalloc (max_groups,GFP_KERNEL ); -if (!tcam->used_groups) { - err = -ENOMEM ; - goto err_alloc_used_groups; - } +ida_init (&tcam->used_groups); tcam->max_groups = max_groups; tcam->max_group_size =MLXSW_CORE_RES_GET (mlxsw_sp->core,ACL_MAX_GROUP_SIZE );
@@ -1575,10 +1570,8 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp,return 0 ; err_tcam_init: -bitmap_free (tcam->used_groups); -err_alloc_used_groups: -bitmap_free (tcam->used_regions); -err_alloc_used_regions: +ida_destroy (&tcam->used_groups); +ida_destroy (&tcam->used_regions);mlxsw_sp_acl_tcam_rehash_params_unregister (mlxsw_sp); err_rehash_params_register:mutex_destroy (&tcam->lock);
@@ -1591,8 +1584,8 @@ void mlxsw_sp_acl_tcam_fini(struct mlxsw_sp *mlxsw_sp,const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops; ops->fini (mlxsw_sp, tcam->priv); -bitmap_free (tcam->used_groups); -bitmap_free (tcam->used_regions); +ida_destroy (&tcam->used_groups); +ida_destroy (&tcam->used_regions);mlxsw_sp_acl_tcam_rehash_params_unregister (mlxsw_sp);mutex_destroy (&tcam->lock); }
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h +3 -2
@@ -6,15 +6,16 @@#include <linux/list.h> #include <linux/parman.h> +#include <linux/idr.h> #include "reg.h" #include "spectrum.h" #include "core_acl_flex_keys.h" struct mlxsw_sp_acl_tcam { -unsigned long *used_regions;/* bit array */ +struct ida used_regions;unsigned int max_regions; -unsigned long *used_groups;/* bit array */ +struct ida used_groups;unsigned int max_groups;unsigned int max_group_size;struct mutex lock;/* guards vregion list */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 76/186 mlxsw: spectrum_acl_tcam: Fix race during rehash delayed work
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit d90cfe20562407d9f080d24123078d666d730707 ]
The purpose of the rehash delayed work is to reduce the number of masks (eRPs) used by an ACL region as the eRP bank is a global and limited resource.
This is done in three steps:
1. Creating a new set of masks and a new ACL region which will use the new masks and to which the existing filters will be migrated to. The new region is assigned to 'vregion->region' and the region from which the filters are migrated from is assigned to 'vregion->region2'.
2. Migrating all the filters from the old region to the new region.
3. Destroying the old region and setting 'vregion->region2' to NULL.
Only the second steps is performed under the 'vregion->lock' mutex although its comments says that among other things it "Protects consistency of region, region2 pointers".
This is problematic as the first step can race with filter insertion from user space that uses 'vregion->region', but under the mutex.
Fix by holding the mutex across the entirety of the delayed work and not only during the second step.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +2 -2
@@ -718,7 +718,9 @@ static void mlxsw_sp_acl_tcam_vregion_rehash_work(struct work_struct *work) rehash.dw.work);int credits =MLXSW_SP_ACL_TCAM_VREGION_REHASH_CREDITS ; +mutex_lock (&vregion->lock);mlxsw_sp_acl_tcam_vregion_rehash (vregion->mlxsw_sp, vregion, &credits); +mutex_unlock (&vregion->lock);if (credits <0 )/* Rehash gone out of credits so it was interrupted. * Schedule the work as soon as possible to continue.
@@ -1323,7 +1325,6 @@ mlxsw_sp_acl_tcam_vregion_migrate(struct mlxsw_sp *mlxsw_sp,int err, err2;trace_mlxsw_sp_acl_tcam_vregion_migrate (mlxsw_sp, vregion); -mutex_lock (&vregion->lock); err =mlxsw_sp_acl_tcam_vchunk_migrate_all (mlxsw_sp, vregion, ctx, credits);if (err) {
@@ -1343,7 +1344,6 @@ mlxsw_sp_acl_tcam_vregion_migrate(struct mlxsw_sp *mlxsw_sp,/* Let the rollback to be continued later on. */ } } -mutex_unlock (&vregion->lock);trace_mlxsw_sp_acl_tcam_vregion_migrate_end (mlxsw_sp, vregion);return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 77/186 mlxsw: spectrum_acl_tcam: Fix possible use-after-free during activity update
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 79b5b4b18bc85b19d3a518483f9abbbe6d7b3ba4 ]
The rule activity update delayed work periodically traverses the list of configured rules and queries their activity from the device.
As part of this task it accesses the entry pointed by 'ventry->entry', but this entry can be changed concurrently by the rehash delayed work, leading to a use-after-free [1].
Fix by closing the race and perform the activity query under the 'vregion->lock' mutex.
[1]
BUG: KASAN: slab-use-after-free in mlxsw_sp_acl_tcam_flower_rule_activity_get+0x121/0x140 Read of size 8 at addr ffff8881054ed808 by task kworker/0:18/181 CPU: 0 PID: 181 Comm: kworker/0:18 Not tainted 6.9.0-rc2-custom-00781-gd5ab772d32f7 #2 Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 Workqueue: mlxsw_core mlxsw_sp_acl_rule_activity_update_work Call Trace: <TASK> dump_stack_lvl+0xc6/0x120 print_report+0xce/0x670 kasan_report+0xd7/0x110 mlxsw_sp_acl_tcam_flower_rule_activity_get+0x121/0x140 mlxsw_sp_acl_rule_activity_update_work+0x219/0x400 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30 </TASK> Allocated by task 1039: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 __kasan_kmalloc+0x8f/0xa0 __kmalloc+0x19c/0x360 mlxsw_sp_acl_tcam_entry_create+0x7b/0x1f0 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x30d/0xb50 mlxsw_sp_acl_tcam_vregion_rehash_work+0x157/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30 Freed by task 1039: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x60 poison_slab_object+0x102/0x170 __kasan_slab_free+0x14/0x30 kfree+0xc1/0x290 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x3d7/0xb50 mlxsw_sp_acl_tcam_vregion_rehash_work+0x157/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30
--- .../net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +8 -2
@@ -1159,8 +1159,14 @@ mlxsw_sp_acl_tcam_ventry_activity_get(struct mlxsw_sp *mlxsw_sp,struct mlxsw_sp_acl_tcam_ventry *ventry, bool *activity) { - return mlxsw_sp_acl_tcam_entry_activity_get(mlxsw_sp, - ventry->entry, activity); + struct mlxsw_sp_acl_tcam_vregion *vregion = ventry->vchunk->vregion; +int err; + +mutex_lock (&vregion->lock); + err =mlxsw_sp_acl_tcam_entry_activity_get (mlxsw_sp, ventry->entry, + activity); +mutex_unlock (&vregion->lock); +return err; } static int
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 78/186 mlxsw: spectrum_acl_tcam: Fix possible use-after-free during rehash
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 54225988889931467a9b55fdbef534079b665519 ]
The rehash delayed work migrates filters from one region to another according to the number of available credits.
The migrated from region is destroyed at the end of the work if the number of credits is non-negative as the assumption is that this is indicative of migration being complete. This assumption is incorrect as a non-negative number of credits can also be the result of a failed migration.
The destruction of a region that still has filters referencing it can result in a use-after-free [1].
Fix by not destroying the region if migration failed.
[1]
BUG: KASAN: slab-use-after-free in mlxsw_sp_acl_ctcam_region_entry_remove+0x21d/0x230 Read of size 8 at addr ffff8881735319e8 by task kworker/0:31/3858 CPU: 0 PID: 3858 Comm: kworker/0:31 Tainted: G W 6.9.0-rc2-custom-00782-gf2275c2157d8 #5 Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work Call Trace: <TASK> dump_stack_lvl+0xc6/0x120 print_report+0xce/0x670 kasan_report+0xd7/0x110 mlxsw_sp_acl_ctcam_region_entry_remove+0x21d/0x230 mlxsw_sp_acl_ctcam_entry_del+0x2e/0x70 mlxsw_sp_acl_atcam_entry_del+0x81/0x210 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x3cd/0xb50 mlxsw_sp_acl_tcam_vregion_rehash_work+0x157/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30 </TASK> Allocated by task 174: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 __kasan_kmalloc+0x8f/0xa0 __kmalloc+0x19c/0x360 mlxsw_sp_acl_tcam_region_create+0xdf/0x9c0 mlxsw_sp_acl_tcam_vregion_rehash_work+0x954/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30 Freed by task 7: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x60 poison_slab_object+0x102/0x170 __kasan_slab_free+0x14/0x30 kfree+0xc1/0x290 mlxsw_sp_acl_tcam_region_destroy+0x272/0x310 mlxsw_sp_acl_tcam_vregion_rehash_work+0x731/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +1 -0
@@ -1451,6 +1451,7 @@ mlxsw_sp_acl_tcam_vregion_rehash(struct mlxsw_sp *mlxsw_sp, ctx, credits);if (err) {dev_err (mlxsw_sp->bus_info->dev,"Failed to migrate vregion\n" ); +return ; }if (*credits >=0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 79/186 mlxsw: spectrum_acl_tcam: Rate limit error message
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 5bcf925587e9b5d36420d572a0b4d131c90fb306 ]
In the rare cases when the device resources are exhausted it is likely that the rehash delayed work will fail. An error message will be printed whenever this happens which can be overwhelming considering the fact that the work is per-region and that there can be hundreds of regions.
Fix by rate limiting the error message.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +1 -1
@@ -1450,7 +1450,7 @@ mlxsw_sp_acl_tcam_vregion_rehash(struct mlxsw_sp *mlxsw_sp, err =mlxsw_sp_acl_tcam_vregion_migrate (mlxsw_sp, vregion, ctx, credits);if (err) { -dev_err (mlxsw_sp->bus_info->dev,"Failed to migrate vregion\n" ); +dev_err_ratelimited (mlxsw_sp->bus_info->dev,"Failed to migrate vregion\n" );return ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 80/186 mlxsw: spectrum_acl_tcam: Fix memory leak during rehash
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 8ca3f7a7b61393804c46f170743c3b839df13977 ]
The rehash delayed work migrates filters from one region to another. This is done by iterating over all chunks (all the filters with the same priority) in the region and in each chunk iterating over all the filters.
If the migration fails, the code tries to migrate the filters back to the old region. However, the rollback itself can also fail in which case another migration will be erroneously performed. Besides the fact that this ping pong is not a very good idea, it also creates a problem.
Each virtual chunk references two chunks: The currently used one ('vchunk->chunk') and a backup ('vchunk->chunk2'). During migration the first holds the chunk we want to migrate filters to and the second holds the chunk we are migrating filters from.
The code currently assumes - but does not verify - that the backup chunk does not exist (NULL) if the currently used chunk does not reference the target region. This assumption breaks when we are trying to rollback a rollback, resulting in the backup chunk being overwritten and leaked [1].
Fix by not rolling back a failed rollback and add a warning to avoid future cases.
[1]
WARNING: CPU: 5 PID: 1063 at lib/parman.c:291 parman_destroy+0x17/0x20 Modules linked in: CPU: 5 PID: 1063 Comm: kworker/5:11 Tainted: G W 6.9.0-rc2-custom-00784-gc6a05c468a0b #14 Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work RIP: 0010:parman_destroy+0x17/0x20 [...] Call Trace: <TASK> mlxsw_sp_acl_atcam_region_fini+0x19/0x60 mlxsw_sp_acl_tcam_region_destroy+0x49/0xf0 mlxsw_sp_acl_tcam_vregion_rehash_work+0x1f1/0x470 process_one_work+0x151/0x370 worker_thread+0x2cb/0x3e0 kthread+0xd0/0x100 ret_from_fork+0x34/0x50 ret_from_fork_asm+0x1a/0x30 </TASK>
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +4 -0
@@ -1200,6 +1200,8 @@ mlxsw_sp_acl_tcam_vchunk_migrate_start(struct mlxsw_sp *mlxsw_sp, {struct mlxsw_sp_acl_tcam_chunk *new_chunk; +WARN_ON (vchunk->chunk2); + new_chunk =mlxsw_sp_acl_tcam_chunk_create (mlxsw_sp, vchunk, region);if (IS_ERR (new_chunk))return PTR_ERR (new_chunk);
@@ -1334,6 +1336,8 @@ mlxsw_sp_acl_tcam_vregion_migrate(struct mlxsw_sp *mlxsw_sp, err =mlxsw_sp_acl_tcam_vchunk_migrate_all (mlxsw_sp, vregion, ctx, credits);if (err) { +if (ctx->this_is_rollback) +return err;/* In case migration was not successful, we need to swap * so the original region pointer is assigned again * to vregion->region.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 81/186 mlxsw: spectrum_acl_tcam: Fix warning during rehash
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 743edc8547a92b6192aa1f1b6bb78233fa21dc9b ]
As previously explained, the rehash delayed work migrates filters from one region to another. This is done by iterating over all chunks (all the filters with the same priority) in the region and in each chunk iterating over all the filters.
When the work runs out of credits it stores the current chunk and entry as markers in the per-work context so that it would know where to resume the migration from the next time the work is scheduled.
Upon error, the chunk marker is reset to NULL, but without resetting the entry markers despite being relative to it. This can result in migration being resumed from an entry that does not belong to the chunk being migrated. In turn, this will eventually lead to a chunk being iterated over as if it is an entry. Because of how the two structures happen to be defined, this does not lead to KASAN splats, but to warnings such as [1].
Fix by creating a helper that resets all the markers and call it from all the places the currently only reset the chunk marker. For good measures also call it when starting a completely new rehash. Add a warning to avoid future cases.
[1]
WARNING: CPU: 7 PID: 1076 at drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c:407 mlxsw_afk_encode+0x242/0x2f0 Modules linked in: CPU: 7 PID: 1076 Comm: kworker/7:24 Tainted: G W 6.9.0-rc3-custom-00880-g29e61d91b77b #29 Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work RIP: 0010:mlxsw_afk_encode+0x242/0x2f0 [...] Call Trace: <TASK> mlxsw_sp_acl_atcam_entry_add+0xd9/0x3c0 mlxsw_sp_acl_tcam_entry_create+0x5e/0xa0 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x109/0x290 mlxsw_sp_acl_tcam_vregion_rehash_work+0x6c/0x470 process_one_work+0x151/0x370 worker_thread+0x2cb/0x3e0 kthread+0xd0/0x100 ret_from_fork+0x34/0x50 </TASK>
--- .../mellanox/mlxsw/spectrum_acl_tcam.c | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +17 -3
@@ -730,6 +730,17 @@ static void mlxsw_sp_acl_tcam_vregion_rehash_work(struct work_struct *work)mlxsw_sp_acl_tcam_vregion_rehash_work_schedule (vregion); } +static void +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (struct mlxsw_sp_acl_tcam_rehash_ctx *ctx) +{ +/* The entry markers are relative to the current chunk and therefore +* needs to be reset together with the chunk marker. +*/ + ctx->current_vchunk =NULL ; + ctx->start_ventry =NULL ; + ctx->stop_ventry =NULL ; +} +static void mlxsw_sp_acl_tcam_rehash_ctx_vchunk_changed (struct mlxsw_sp_acl_tcam_vchunk *vchunk) {
@@ -752,7 +763,7 @@ mlxsw_sp_acl_tcam_rehash_ctx_vregion_changed(struct mlxsw_sp_acl_tcam_vregion *v* the current chunk pointer to make sure all chunks * are properly migrated. */ - vregion->rehash.ctx.current_vchunk =NULL ; +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (&vregion->rehash.ctx); } static struct mlxsw_sp_acl_tcam_vregion *
@@ -1220,7 +1231,7 @@ mlxsw_sp_acl_tcam_vchunk_migrate_end(struct mlxsw_sp *mlxsw_sp, {mlxsw_sp_acl_tcam_chunk_destroy (mlxsw_sp, vchunk->chunk2); vchunk->chunk2 =NULL ; - ctx->current_vchunk =NULL ; +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (ctx); } static int
@@ -1252,6 +1263,8 @@ mlxsw_sp_acl_tcam_vchunk_migrate_one(struct mlxsw_sp *mlxsw_sp, ventry =list_first_entry (&vchunk->ventry_list,typeof (*ventry), list); +WARN_ON (ventry->vchunk != vchunk); +list_for_each_entry_from (ventry, &vchunk->ventry_list, list) {/* During rollback, once we reach the ventry that failed * to migrate, we are done.
@@ -1343,7 +1356,7 @@ mlxsw_sp_acl_tcam_vregion_migrate(struct mlxsw_sp *mlxsw_sp,* to vregion->region. */ swap (vregion->region, vregion->region2); - ctx->current_vchunk =NULL ; +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (ctx); ctx->this_is_rollback = true; err2 =mlxsw_sp_acl_tcam_vchunk_migrate_all (mlxsw_sp, vregion, ctx, credits);
@@ -1402,6 +1415,7 @@ mlxsw_sp_acl_tcam_vregion_rehash_start(struct mlxsw_sp *mlxsw_sp, ctx->hints_priv = hints_priv; ctx->this_is_rollback = false; +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (ctx);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 82/186 mlxsw: spectrum_acl_tcam: Fix incorrect list API usage
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit b377add0f0117409c418ddd6504bd682ebe0bf79 ]
Both the function that migrates all the chunks within a region and the function that migrates all the entries within a chunk call list_first_entry() on the respective lists without checking that the lists are not empty. This is incorrect usage of the API, which leads to the following warning [1].
Fix by returning if the lists are empty as there is nothing to migrate in this case.
[1]
WARNING: CPU: 0 PID: 6437 at drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c:1266 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x1f1/0> Modules linked in: CPU: 0 PID: 6437 Comm: kworker/0:37 Not tainted 6.9.0-rc3-custom-00883-g94a65f079ef6 #39 Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work RIP: 0010:mlxsw_sp_acl_tcam_vchunk_migrate_all+0x1f1/0x2c0 [...] Call Trace: <TASK> mlxsw_sp_acl_tcam_vregion_rehash_work+0x6c/0x4a0 process_one_work+0x151/0x370 worker_thread+0x2cb/0x3e0 kthread+0xd0/0x100 ret_from_fork+0x34/0x50 ret_from_fork_asm+0x1a/0x30 </TASK>
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +7 -0
@@ -1254,6 +1254,9 @@ mlxsw_sp_acl_tcam_vchunk_migrate_one(struct mlxsw_sp *mlxsw_sp,return 0 ; } +if (list_empty (&vchunk->ventry_list)) + goto out; +/* If the migration got interrupted, we have the ventry to start from * stored in context. */
@@ -1305,6 +1308,7 @@ mlxsw_sp_acl_tcam_vchunk_migrate_one(struct mlxsw_sp *mlxsw_sp, } } +out:mlxsw_sp_acl_tcam_vchunk_migrate_end (mlxsw_sp, vchunk, ctx);return 0 ; }
@@ -1318,6 +1322,9 @@ mlxsw_sp_acl_tcam_vchunk_migrate_all(struct mlxsw_sp *mlxsw_sp,struct mlxsw_sp_acl_tcam_vchunk *vchunk;int err; +if (list_empty (&vregion->vchunk_list)) +return 0 ; +/* If the migration got interrupted, we have the vchunk * we are working on stored in context. */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 83/186 mlxsw: spectrum_acl_tcam: Fix memory leak when canceling rehash work
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit fb4e2b70a7194b209fc7320bbf33b375f7114bd5 ]
The rehash delayed work is rescheduled with a delay if the number of credits at end of the work is not negative as supposedly it means that the migration ended. Otherwise, it is rescheduled immediately.
After "mlxsw: spectrum_acl_tcam: Fix possible use-after-free during rehash" the above is no longer accurate as a non-negative number of credits is no longer indicative of the migration being done. It can also happen if the work encountered an error in which case the migration will resume the next time the work is scheduled.
The significance of the above is that it is possible for the work to be pending and associated with hints that were allocated when the migration started. This leads to the hints being leaked [1] when the work is canceled while pending as part of ACL region dismantle.
Fix by freeing the hints if hints are associated with a work that was canceled while pending.
Blame the original commit since the reliance on not having a pending work associated with hints is fragile.
[1]
unreferenced object 0xffff88810e7c3000 (size 256):
comm "kworker/0:16", pid 176, jiffies 4295460353 hex dump (first 32 bytes):
00 30 95 11 81 88 ff ff 61 00 00 00 00 00 00 80 .0......a.......
00 00 61 00 40 00 00 00 00 00 00 00 04 00 00 00 ..a.@...........
backtrace (crc 2544ddb9):
[<00000000cf8cfab3>] kmalloc_trace+0x23f/0x2a0
[<000000004d9a1ad9>] objagg_hints_get+0x42/0x390
[<000000000b143cf3>] mlxsw_sp_acl_erp_rehash_hints_get+0xca/0x400
[<0000000059bdb60a>] mlxsw_sp_acl_tcam_vregion_rehash_work+0x868/0x1160
[<00000000e81fd734>] process_one_work+0x59c/0xf20
[<00000000ceee9e81>] worker_thread+0x799/0x12c0
[<00000000bda6fe39>] kthread+0x246/0x300
[<0000000070056d23>] ret_from_fork+0x34/0x70
[<00000000dea2b93e>] ret_from_fork_asm+0x1a/0x30--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +5 -1
@@ -836,10 +836,14 @@ mlxsw_sp_acl_tcam_vregion_destroy(struct mlxsw_sp *mlxsw_sp,struct mlxsw_sp_acl_tcam *tcam = vregion->tcam;if (vgroup->vregion_rehash_enabled && ops->region_rehash_hints_get) { +struct mlxsw_sp_acl_tcam_rehash_ctx *ctx = &vregion->rehash.ctx; +mutex_lock (&tcam->lock);list_del (&vregion->tlist);mutex_unlock (&tcam->lock); -cancel_delayed_work_sync (&vregion->rehash.dw); +if (cancel_delayed_work_sync (&vregion->rehash.dw) && + ctx->hints_priv) + ops->region_rehash_hints_put (ctx->hints_priv); }mlxsw_sp_acl_tcam_vgroup_vregion_detach (mlxsw_sp, vregion);if (vregion->region2)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 84/186 eth: bnxt: fix counting packets discarded due to OOM and netpoll
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 730117730709992c9f6535dd7b47638ee561ec45 ]
I added OOM and netpoll discard counters, naively assuming that the cpr pointer is pointing to a common completion ring. Turns out that is usually *a* completion ring but not *the* completion ring which bnapi->cp_ring points to. bnapi->cp_ring is where the stats are read from, so we end up reporting 0 thru ethtool -S and qstat even though the drop events have happened. Make 100% sure we're recording statistics in the correct structure.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 44 ++++++++++------------- 1 file changed, 18 insertions(+), 26 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +18 -26
@@ -1659,7 +1659,7 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp, skb =bnxt_copy_skb (bnapi, data_ptr, len, mapping);if (!skb) {bnxt_abort_tpa (cpr, idx, agg_bufs); - cpr->sw_stats.rx.rx_oom_discards +=1 ; + cpr->bnapi->cp_ring.sw_stats.rx.rx_oom_discards +=1 ;return NULL ; } }else {
@@ -1669,7 +1669,7 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp, new_data =__bnxt_alloc_rx_frag (bp, &new_mapping,GFP_ATOMIC );if (!new_data) {bnxt_abort_tpa (cpr, idx, agg_bufs); - cpr->sw_stats.rx.rx_oom_discards +=1 ; + cpr->bnapi->cp_ring.sw_stats.rx.rx_oom_discards +=1 ;return NULL ; }
@@ -1685,7 +1685,7 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp,if (!skb) {skb_free_frag (data);bnxt_abort_tpa (cpr, idx, agg_bufs); - cpr->sw_stats.rx.rx_oom_discards +=1 ; + cpr->bnapi->cp_ring.sw_stats.rx.rx_oom_discards +=1 ;return NULL ; }skb_reserve (skb, bp->rx_offset);
@@ -1696,7 +1696,7 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp, skb =bnxt_rx_agg_pages_skb (bp, cpr, skb, idx, agg_bufs, true);if (!skb) {/* Page reuse already handled by bnxt_rx_pages(). */ - cpr->sw_stats.rx.rx_oom_discards +=1 ; + cpr->bnapi->cp_ring.sw_stats.rx.rx_oom_discards +=1 ;return NULL ; } }
@@ -1914,11 +1914,8 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,u32 frag_len =bnxt_rx_agg_pages_xdp (bp, cpr, &xdp, cp_cons, agg_bufs, false); -if (!frag_len) { - cpr->sw_stats.rx.rx_oom_discards +=1 ; - rc = -ENOMEM ; - goto next_rx; - } +if (!frag_len) + goto oom_next_rx; } xdp_active = true; }
@@ -1941,9 +1938,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,else bnxt_xdp_buff_frags_free (rxr, &xdp); } - cpr->sw_stats.rx.rx_oom_discards +=1 ; - rc = -ENOMEM ; - goto next_rx; + goto oom_next_rx; } }else {u32 payload;
@@ -1954,29 +1949,21 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, payload =0 ; skb = bp->rx_skb_func (bp, rxr, cons, data, data_ptr, dma_addr, payload | len); -if (!skb) { - cpr->sw_stats.rx.rx_oom_discards +=1 ; - rc = -ENOMEM ; - goto next_rx; - } +if (!skb) + goto oom_next_rx; }if (agg_bufs) {if (!xdp_active) { skb =bnxt_rx_agg_pages_skb (bp, cpr, skb, cp_cons, agg_bufs, false); -if (!skb) { - cpr->sw_stats.rx.rx_oom_discards +=1 ; - rc = -ENOMEM ; - goto next_rx; - } +if (!skb) + goto oom_next_rx; }else { skb =bnxt_xdp_build_skb (bp, skb, agg_bufs, rxr->page_pool, &xdp, rxcmp1);if (!skb) {/* we should be able to free the old skb here */ bnxt_xdp_buff_frags_free (rxr, &xdp); - cpr->sw_stats.rx.rx_oom_discards +=1 ; - rc = -ENOMEM ; - goto next_rx; + goto oom_next_rx; } } }
@@ -2054,6 +2041,11 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, *raw_cons = tmp_raw_cons;return rc; + +oom_next_rx: + cpr->bnapi->cp_ring.sw_stats.rx.rx_oom_discards +=1 ; + rc = -ENOMEM ; + goto next_rx; }/* In netpoll mode, if we are using a combined completion ring, we need to
@@ -2099,7 +2091,7 @@ static int bnxt_force_rx_discard(struct bnxt *bp, } rc =bnxt_rx_pkt (bp, cpr, raw_cons, event);if (rc && rc != -EBUSY ) - cpr->sw_stats.rx.rx_netpoll_discards +=1 ; + cpr->bnapi->cp_ring.sw_stats.rx.rx_netpoll_discards +=1 ;return rc; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 85/186 ARM: dts: imx6ull-tarragon: fix USB over-current polarity
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Heimpold <[email protected]>
[ Upstream commit d7f3040a565214a30e2f07dc9b91566d316e2d36 ]
Our Tarragon platform uses a active-low signal to inform the i.MX6ULL about the over-current detection.
--- arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-common.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-common.dtsi +1 -0
@@ -805,6 +805,7 @@ &pinctrl_usb_pwr>; dr_mode = "host"; power-active-high; + over-current-active-low; disable-over-current; status = "okay"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 86/186 netfilter: nf_tables: honor table dormant flag from netdev release event path
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 8e30abc9ace4f0add4cd761dfdbfaebae5632dd2 ]
Check for table dormant flag otherwise netdev release event path tries to unregister an already unregistered hook.
[524854.857999] ------------[ cut here ]------------ [524854.858010] WARNING: CPU: 0 PID: 3386599 at net/netfilter/core.c:501 __nf_unregister_net_hook+0x21a/0x260 [...] [524854.858848] CPU: 0 PID: 3386599 Comm: kworker/u32:2 Not tainted 6.9.0-rc3+ #365 [524854.858869] Workqueue: netns cleanup_net [524854.858886] RIP: 0010:__nf_unregister_net_hook+0x21a/0x260 [524854.858903] Code: 24 e8 aa 73 83 ff 48 63 43 1c 83 f8 01 0f 85 3d ff ff ff e8 98 d1 f0 ff 48 8b 3c 24 e8 8f 73 83 ff 48 63 43 1c e9 26 ff ff ff <0f> 0b 48 83 c4 18 48 c7 c7 00 68 e9 82 5b 5d 41 5c 41 5d 41 5e 41 [524854.858914] RSP: 0018:ffff8881e36d79e0 EFLAGS: 00010246 [524854.858926] RAX: 0000000000000000 RBX: ffff8881339ae790 RCX: ffffffff81ba524a [524854.858936] RDX: dffffc0000000000 RSI: 0000000000000008 RDI: ffff8881c8a16438 [524854.858945] RBP: ffff8881c8a16438 R08: 0000000000000001 R09: ffffed103c6daf34 [524854.858954] R10: ffff8881e36d79a7 R11: 0000000000000000 R12: 0000000000000005 [524854.858962] R13: ffff8881c8a16000 R14: 0000000000000000 R15: ffff8881351b5a00 [524854.858971] FS: 0000000000000000(0000) GS:ffff888390800000(0000) knlGS:0000000000000000 [524854.858982] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [524854.858991] CR2: 00007fc9be0f16f4 CR3: 00000001437cc004 CR4: 00000000001706f0 [524854.859000] Call Trace: [524854.859006] <TASK> [524854.859013] ? __warn+0x9f/0x1a0 [524854.859027] ? __nf_unregister_net_hook+0x21a/0x260 [524854.859044] ? report_bug+0x1b1/0x1e0 [524854.859060] ? handle_bug+0x3c/0x70 [524854.859071] ? exc_invalid_op+0x17/0x40 [524854.859083] ? asm_exc_invalid_op+0x1a/0x20 [524854.859100] ? __nf_unregister_net_hook+0x6a/0x260 [524854.859116] ? __nf_unregister_net_hook+0x21a/0x260 [524854.859135] nf_tables_netdev_event+0x337/0x390 [nf_tables] [524854.859304] ? __pfx_nf_tables_netdev_event+0x10/0x10 [nf_tables] [524854.859461] ? packet_notifier+0xb3/0x360 [524854.859476] ? _raw_spin_unlock_irqrestore+0x11/0x40 [524854.859489] ? dcbnl_netdevice_event+0x35/0x140 [524854.859507] ? __pfx_nf_tables_netdev_event+0x10/0x10 [nf_tables] [524854.859661] notifier_call_chain+0x7d/0x140 [524854.859677] unregister_netdevice_many_notify+0x5e1/0xae0
--- net/netfilter/nft_chain_filter.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/netfilter/nft_chain_filter.c +3 -1
@@ -338,7 +338,9 @@ static void nft_netdev_event(unsigned long event, struct net_device *dev,return ;if (n >1 ) { -nf_unregister_net_hook (ctx->net, &found->ops); +if (!(ctx->chain->table->flags &NFT_TABLE_F_DORMANT )) +nf_unregister_net_hook (ctx->net, &found->ops); +list_del_rcu (&found->list);kfree_rcu (found, rcu);return ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 87/186 net: phy: dp83869: Fix MII mode failure
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: MD Danish Anwar <[email protected]>
[ Upstream commit 6c9cd59dbcb09a2122b5ce0dfc07c74e6fc00dc0 ]
The DP83869 driver sets the MII bit (needed for PHY to work in MII mode) only if the op-mode is either DP83869_100M_MEDIA_CONVERT or DP83869_RGMII_100_BASE.
Some drivers i.e. ICSSG support MII mode with op-mode as DP83869_RGMII_COPPER_ETHERNET for which the MII bit is not set in dp83869 driver. As a result MII mode on ICSSG doesn't work and below log is seen.
TI DP83869 300b2400.mdio:0f: selected op-mode is not valid with MII mode icssg-prueth icssg1-eth: couldn't connect to phy ethernet-phy@0 icssg-prueth icssg1-eth: can't phy connect port MII0
Fix this by setting MII bit for DP83869_RGMII_COPPER_ETHERNET op-mode as well.
--- drivers/net/phy/dp83869.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/phy/dp83869.c +2 -1
@@ -695,7 +695,8 @@ static int dp83869_configure_mode(struct phy_device *phydev, phy_ctrl_val = dp83869->mode;if (phydev->interface ==PHY_INTERFACE_MODE_MII ) {if (dp83869->mode ==DP83869_100M_MEDIA_CONVERT || - dp83869->mode ==DP83869_RGMII_100_BASE ) { + dp83869->mode ==DP83869_RGMII_100_BASE || + dp83869->mode ==DP83869_RGMII_COPPER_ETHERNET ) { phy_ctrl_val |=DP83869_OP_MODE_MII ; }else {phydev_err (phydev,"selected op-mode is not valid with MII mode\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 88/186 net: ti: icssg-prueth: Fix signedness bug in prueth_init_rx_chns()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 4dcd0e83ea1d1df9b2e0174a6d3e795b3477d64e ]
The rx_chn->irq[] array is unsigned int but it should be signed for the error handling to work. Also if k3_udma_glue_rx_get_irq() returns zero then we should return -ENXIO instead of success.
--- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/ethernet/ti/icssg/icssg_prueth.c +5 -3
@@ -421,12 +421,14 @@ static int prueth_init_rx_chns(struct prueth_emac *emac,if (!i) fdqring_id =k3_udma_glue_rx_flow_get_fdq_id (rx_chn->rx_chn, i); - rx_chn->irq[i] =k3_udma_glue_rx_get_irq (rx_chn->rx_chn, i); -if (rx_chn->irq[i] <=0 ) { - ret = rx_chn->irq[i]; + ret =k3_udma_glue_rx_get_irq (rx_chn->rx_chn, i); +if (ret <=0 ) { +if (!ret) + ret = -ENXIO ;netdev_err (ndev,"Failed to get rx dma irq" ); goto fail; } + rx_chn->irq[i] = ret; }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 89/186 i40e: Do not use WQ_MEM_RECLAIM flag for workqueue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sindhu Devale <[email protected]>
[ Upstream commit 2cc7d150550cc981aceedf008f5459193282425c ]
Issue reported by customer during SRIOV testing, call trace:
When both i40e and the i40iw driver are loaded, a warning in check_flush_dependency is being triggered. This seems to be because of the i40e driver workqueue is allocated with the WQ_MEM_RECLAIM flag, and the i40iw one is not.
Similar error was encountered on ice too and it was fixed by removing the flag. Do the same for i40e too.
[Feb 9 09:08] ------------[ cut here ]------------
[ +0.000004] workqueue: WQ_MEM_RECLAIM i40e:i40e_service_task [i40e] is flushing !WQ_MEM_RECLAIM infiniband:0x0
[ +0.000060] WARNING: CPU: 0 PID: 937 at kernel/workqueue.c:2966 check_flush_dependency+0x10b/0x120
[ +0.000007] Modules linked in: snd_seq_dummy snd_hrtimer snd_seq snd_timer snd_seq_device snd soundcore nls_utf8 cifs cifs_arc4 nls_ucs2_utils rdma_cm iw_cm ib_cm cifs_md4 dns_resolver netfs qrtr rfkill sunrpc vfat fat intel_rapl_msr intel_rapl_common irdma intel_uncore_frequency intel_uncore_frequency_common ice ipmi_ssif isst_if_common skx_edac nfit libnvdimm x86_pkg_temp_thermal intel_powerclamp gnss coretemp ib_uverbs rapl intel_cstate ib_core iTCO_wdt iTCO_vendor_support acpi_ipmi mei_me ipmi_si intel_uncore ioatdma i2c_i801 joydev pcspkr mei ipmi_devintf lpc_ich intel_pch_thermal i2c_smbus ipmi_msghandler acpi_power_meter acpi_pad xfs libcrc32c ast sd_mod drm_shmem_helper t10_pi drm_kms_helper sg ixgbe drm i40e ahci crct10dif_pclmul libahci crc32_pclmul igb crc32c_intel libata ghash_clmulni_intel i2c_algo_bit mdio dca wmi dm_mirror dm_region_hash dm_log dm_mod fuse
[ +0.000050] CPU: 0 PID: 937 Comm: kworker/0:3 Kdump: loaded Not tainted 6.8.0-rc2-Feb-net_dev-Qiueue-00279-gbd43c5687e05 #1 [ +0.000003] Hardware name: Intel Corporation S2600BPB/S2600BPB, BIOS SE5C620.86B.02.01.0013.121520200651 12/15/2020
[ +0.000001] Workqueue: i40e i40e_service_task [i40e] [ +0.000024] RIP: 0010:check_flush_dependency+0x10b/0x120 [ +0.000003] Code: ff 49 8b 54 24 18 48 8d 8b b0 00 00 00 49 89 e8 48
81 c6 b0 00 00 00 48 c7 c7 b0 97 fa 9f c6 05 8a cc 1f 02 01 e8 35 b3 fd ff <0f> 0b e9 10 ff ff ff 80 3d 78 cc 1f 02 00 75 94 e9 46 ff ff ff 90 [ +0.000002] RSP: 0018:ffffbd294976bcf8 EFLAGS: 00010282
[ +0.000002] RAX: 0000000000000000 RBX: ffff94d4c483c000 RCX:
0000000000000027
[ +0.000001] RDX: ffff94d47f620bc8 RSI: 0000000000000001 RDI:ffff94d47f620bc0
[ +0.000001] RBP: 0000000000000000 R08: 0000000000000000 R09:00000000ffff7fff
[ +0.000001] R10: ffffbd294976bb98 R11: ffffffffa0be65e8 R12:ffff94c5451ea180
[ +0.000001] R13: ffff94c5ab5e8000 R14: ffff94c5c20b6e05 R15:ffff94c5f1330ab0
[ +0.000001] FS: 0000000000000000(0000) GS:ffff94d47f600000(0000) knlGS:0000000000000000
[ +0.000002] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ +0.000001] CR2: 00007f9e6f1fca70 CR3: 0000000038e20004 CR4:00000000007706f0
[ +0.000000] DR0: 0000000000000000 DR1: 0000000000000000 DR2:
0000000000000000
[ +0.000001] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7:
0000000000000400
[ +0.000001] PKRU: 55555554 [ +0.000001] Call Trace: [ +0.000001] <TASK> [ +0.000002] ? __warn+0x80/0x130 [ +0.000003] ? check_flush_dependency+0x10b/0x120 [ +0.000002] ? report_bug+0x195/0x1a0 [ +0.000005] ? handle_bug+0x3c/0x70 [ +0.000003] ? exc_invalid_op+0x14/0x70 [ +0.000002] ? asm_exc_invalid_op+0x16/0x20 [ +0.000006] ? check_flush_dependency+0x10b/0x120 [ +0.000002] ? check_flush_dependency+0x10b/0x120 [ +0.000002] __flush_workqueue+0x126/0x3f0 [ +0.000015] ib_cache_cleanup_one+0x1c/0xe0 [ib_core] [ +0.000056] __ib_unregister_device+0x6a/0xb0 [ib_core] [ +0.000023] ib_unregister_device_and_put+0x34/0x50 [ib_core] [ +0.000020] i40iw_close+0x4b/0x90 [irdma] [ +0.000022] i40e_notify_client_of_netdev_close+0x54/0xc0 [i40e] [ +0.000035] i40e_service_task+0x126/0x190 [i40e] [ +0.000024] process_one_work+0x174/0x340 [ +0.000003] worker_thread+0x27e/0x390 [ +0.000001] ? __pfx_worker_thread+0x10/0x10 [ +0.000002] kthread+0xdf/0x110 [ +0.000002] ? __pfx_kthread+0x10/0x10 [ +0.000002] ret_from_fork+0x2d/0x50 [ +0.000003] ? __pfx_kthread+0x10/0x10 [ +0.000001] ret_from_fork_asm+0x1b/0x30 [ +0.000004] </TASK> [ +0.000001] ---[ end trace 0000000000000000 ]---
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -16778,7 +16778,7 @@ static int __init i40e_init_module(void)* since we need to be able to guarantee forward progress even under * memory pressure. */ - i40e_wq =alloc_workqueue ("%s" ,WQ_MEM_RECLAIM ,0 , i40e_driver_name); + i40e_wq =alloc_workqueue ("%s" ,0 ,0 , i40e_driver_name);if (!i40e_wq) {pr_err ("%s: Failed to create workqueue\n" , i40e_driver_name);return -ENOMEM ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 90/186 i40e: Report MFS in decimal base instead of hex
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Erwan Velu <[email protected]>
[ Upstream commit ef3c313119ea448c22da10366faa26b5b4b1a18e ]
If the MFS is set below the default (0x2600), a warning message is reported like the following :
MFS for port 1 has been set below the default: 600
This message is a bit confusing as the number shown here (600) is in fact an hexa number: 0x600 = 1536
Without any explicit "0x" prefix, this message is read like the MFS is set to 600 bytes.
MFS, as per MTUs, are usually expressed in decimal base.
This commit reports both current and default MFS values in decimal so it's less confusing for end-users.
A typical warning message looks like the following :
MFS for port 1 (1536) has been set below the default (9728)
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +2 -2
@@ -16237,8 +16237,8 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) val = (rd32 (&pf->hw,I40E_PRTGL_SAH ) &I40E_PRTGL_SAH_MFS_MASK ) >>I40E_PRTGL_SAH_MFS_SHIFT ;if (val <MAX_FRAME_SIZE_DEFAULT ) -dev_warn (&pdev->dev,"MFS for port %x has been set below the default: %x\n" , - pf->hw.port, val); +dev_warn (&pdev->dev,"MFS for port %x (%d) has been set below the default (%d)\n" , + pf->hw.port, val,MAX_FRAME_SIZE_DEFAULT );/* Add a filter to drop all Flow control frames from any VSI from being * transmitted. By doing so we stop a malicious VF from sending out
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 91/186 iavf: Fix TC config comparison with existing adapter TC config
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudheer Mogilappagari <[email protected]>
[ Upstream commit 54976cf58d6168b8d15cebb395069f23b2f34b31 ]
Same number of TCs doesn't imply that underlying TC configs are same. The config could be different due to difference in number of queues in each TC. Add utility function to determine if TC configs are same.
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 30 ++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +29 -1
@@ -3574,6 +3574,34 @@ static void iavf_del_all_cloud_filters(struct iavf_adapter *adapter)spin_unlock_bh (&adapter->cloud_filter_list_lock); } +/** +* iavf_is_tc_config_same - Compare the mqprio TC config with the +* TC config already configured on this adapter. +* @adapter: board private structure +* @mqprio_qopt: TC config received from kernel. +* +* This function compares the TC config received from the kernel +* with the config already configured on the adapter. +* +* Return: True if configuration is same, false otherwise. +**/ +static bool iavf_is_tc_config_same (struct iavf_adapter *adapter, +struct tc_mqprio_qopt *mqprio_qopt) +{ +struct virtchnl_channel_info *ch = &adapter->ch_config.ch_info[0 ]; +int i; + +if (adapter->num_tc != mqprio_qopt->num_tc) +return false; + +for (i =0 ; i < adapter->num_tc; i++) { +if (ch[i].count != mqprio_qopt->count[i] || + ch[i].offset != mqprio_qopt->offset[i]) +return false; + } +return true; +} +/** * __iavf_setup_tc - configure multiple traffic classes * @netdev: network interface device structure
@@ -3631,7 +3659,7 @@ static int __iavf_setup_tc(struct net_device *netdev, void *type_data)if (ret)return ret;/* Return if same TC config is requested */ -if (adapter->num_tc == num_tc) +if (iavf_is_tc_config_same (adapter, &mqprio_qopt->qopt))return 0 ; adapter->num_tc = num_tc;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 92/186 ice: fix LAG and VF lock dependency in ice_reset_vf()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Keller <[email protected]>
[ Upstream commit 96fdd1f6b4ed72a741fb0eb705c0e13049b8721f ]
9f74a3dfcf83 ("ice: Fix VF Reset paths when interface in a failed over aggregate"), the ice driver has acquired the LAG mutex in ice_reset_vf(). The commit placed this lock acquisition just prior to the acquisition of the VF configuration lock.
If ice_reset_vf() acquires the configuration lock via the ICE_VF_RESET_LOCK flag, this could deadlock with ice_vc_cfg_qs_msg() because it always acquires the locks in the order of the VF configuration lock and then the LAG mutex.
Lockdep reports this violation almost immediately on creating and then removing 2 VF:
======================================================
WARNING: possible circular locking dependency detected
6.8.0-rc6 #54 Tainted: G W O
------------------------------------------------------
kworker/60:3/6771 is trying to acquire lock:ff40d43e099380a0 (&vf->cfg_lock){+.+.}-{3:3}, at: ice_reset_vf+0x22f/0x4d0 [ice]
but task is already holding lock:ff40d43ea1961210 (&pf->lag_mutex){+.+.}-{3:3}, at: ice_reset_vf+0xb7/0x4d0 [ice]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&pf->lag_mutex){+.+.}-{3:3}:
__lock_acquire+0x4f8/0xb40
lock_acquire+0xd4/0x2d0
__mutex_lock+0x9b/0xbf0
ice_vc_cfg_qs_msg+0x45/0x690 [ice]
ice_vc_process_vf_msg+0x4f5/0x870 [ice]
__ice_clean_ctrlq+0x2b5/0x600 [ice]
ice_service_task+0x2c9/0x480 [ice]
process_one_work+0x1e9/0x4d0
worker_thread+0x1e1/0x3d0
kthread+0x104/0x140
ret_from_fork+0x31/0x50
ret_from_fork_asm+0x1b/0x30-> #0 (&vf->cfg_lock){+.+.}-{3:3}:
check_prev_add+0xe2/0xc50
validate_chain+0x558/0x800
__lock_acquire+0x4f8/0xb40
lock_acquire+0xd4/0x2d0
__mutex_lock+0x9b/0xbf0
ice_reset_vf+0x22f/0x4d0 [ice]
ice_process_vflr_event+0x98/0xd0 [ice]
ice_service_task+0x1cc/0x480 [ice]
process_one_work+0x1e9/0x4d0
worker_thread+0x1e1/0x3d0
kthread+0x104/0x140
ret_from_fork+0x31/0x50
ret_from_fork_asm+0x1b/0x30other info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&pf->lag_mutex);
lock(&vf->cfg_lock);
lock(&pf->lag_mutex);
lock(&vf->cfg_lock); *** DEADLOCK ***
4 locks held by kworker/60:3/6771:
#0: ff40d43e05428b38 ((wq_completion)ice){+.+.}-{0:0}, at: process_one_work+0x176/0x4d0 #1: ff50d06e05197e58 ((work_completion)(&pf->serv_task)){+.+.}-{0:0}, at: process_one_work+0x176/0x4d0 #2: ff40d43ea1960e50 (&pf->vfs.table_lock){+.+.}-{3:3}, at: ice_process_vflr_event+0x48/0xd0 [ice] #3: ff40d43ea1961210 (&pf->lag_mutex){+.+.}-{3:3}, at: ice_reset_vf+0xb7/0x4d0 [ice]
stack backtrace: CPU: 60 PID: 6771 Comm: kworker/60:3 Tainted: G W O 6.8.0-rc6 #54 Hardware name: Workqueue: ice ice_service_task [ice] Call Trace: <TASK> dump_stack_lvl+0x4a/0x80 check_noncircular+0x12d/0x150 check_prev_add+0xe2/0xc50 ? save_trace+0x59/0x230 ? add_chain_cache+0x109/0x450 validate_chain+0x558/0x800 __lock_acquire+0x4f8/0xb40 ? lockdep_hardirqs_on+0x7d/0x100 lock_acquire+0xd4/0x2d0 ? ice_reset_vf+0x22f/0x4d0 [ice] ? lock_is_held_type+0xc7/0x120 __mutex_lock+0x9b/0xbf0 ? ice_reset_vf+0x22f/0x4d0 [ice] ? ice_reset_vf+0x22f/0x4d0 [ice] ? rcu_is_watching+0x11/0x50 ? ice_reset_vf+0x22f/0x4d0 [ice] ice_reset_vf+0x22f/0x4d0 [ice] ? process_one_work+0x176/0x4d0 ice_process_vflr_event+0x98/0xd0 [ice] ice_service_task+0x1cc/0x480 [ice] process_one_work+0x1e9/0x4d0 worker_thread+0x1e1/0x3d0 ? __pfx_worker_thread+0x10/0x10 kthread+0x104/0x140 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x31/0x50 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1b/0x30 </TASK>
To avoid deadlock, we must acquire the LAG mutex only after acquiring the VF configuration lock. Fix the ice_reset_vf() to acquire the LAG mutex only after we either acquire or check that the VF configuration lock is held.
--- drivers/net/ethernet/intel/ice/ice_vf_lib.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/net/ethernet/intel/ice/ice_vf_lib.c +8 -8
@@ -847,6 +847,11 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags)return 0 ; } +if (flags &ICE_VF_RESET_LOCK ) +mutex_lock (&vf->cfg_lock); +else +lockdep_assert_held (&vf->cfg_lock); + lag = pf->lag;mutex_lock (&pf->lag_mutex);if (lag && lag->bonded && lag->primary) {
@@ -858,11 +863,6 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags) act_prt =ICE_LAG_INVALID_PORT ; } -if (flags &ICE_VF_RESET_LOCK ) -mutex_lock (&vf->cfg_lock); -else -lockdep_assert_held (&vf->cfg_lock); -if (ice_is_vf_disabled (vf)) { vsi =ice_get_vf_vsi (vf);if (!vsi) {
@@ -947,14 +947,14 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags)ice_mbx_clear_malvf (&vf->mbx_info); out_unlock: -if (flags &ICE_VF_RESET_LOCK ) -mutex_unlock (&vf->cfg_lock); -if (lag && lag->bonded && lag->primary && act_prt !=ICE_LAG_INVALID_PORT )ice_lag_move_vf_nodes_cfg (lag, pri_prt, act_prt);mutex_unlock (&pf->lag_mutex); +if (flags &ICE_VF_RESET_LOCK ) +mutex_unlock (&vf->cfg_lock); +return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 93/186 net: ethernet: ti: am65-cpts: Fix PTPv1 message type on TX packets
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Reeder <[email protected]>
[ Upstream commit 1b9e743e923b256e353a9a644195372285e5a6c0 ]
The CPTS, by design, captures the messageType (Sync, Delay_Req, etc.) field from the second nibble of the PTP header which is defined in the PTPv2 (1588-2008) specification. In the PTPv1 (1588-2002) specification the first two bytes of the PTP header are defined as the versionType which is always 0x0001. This means that any PTPv1 packets that are tagged for TX timestamping by the CPTS will have their messageType set to 0x0 which corresponds to a Sync message type. This causes issues when a PTPv1 stack is expecting a Delay_Req (messageType: 0x1) timestamp that never appears.
Fix this by checking if the ptp_class of the timestamped TX packet is PTP_CLASS_V1 and then matching the PTP sequence ID to the stored sequence ID in the skb->cb data structure. If the sequence IDs match and the packet is of type PTPv1 then there is a chance that the messageType has been incorrectly stored by the CPTS so overwrite the messageType stored by the CPTS with the messageType from the skb->cb data structure. This allows the PTPv1 stack to receive TX timestamps for Delay_Req packets which are necessary to lock onto a PTP Leader.
--- drivers/net/ethernet/ti/am65-cpts.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/ti/am65-cpts.c +5 -0
@@ -784,6 +784,11 @@ static bool am65_cpts_match_tx_ts(struct am65_cpts *cpts,struct am65_cpts_skb_cb_data *skb_cb = (struct am65_cpts_skb_cb_data *)skb->cb; +if ((ptp_classify_raw (skb) &PTP_CLASS_V1 ) && + ((mtype_seqid &AM65_CPTS_EVENT_1_SEQUENCE_ID_MASK ) == + (skb_cb->skb_mtype_seqid &AM65_CPTS_EVENT_1_SEQUENCE_ID_MASK ))) + mtype_seqid = skb_cb->skb_mtype_seqid; +if (mtype_seqid == skb_cb->skb_mtype_seqid) {u64 ns = event->timestamp;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 94/186 tls: fix lockless read of strp->msg_ready in ->poll
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sabrina Dubroca <[email protected]>
[ Upstream commit 0844370f8945086eb9335739d10205dcea8d707b ]
tls_sk_poll is called without locking the socket, and needs to read strp->msg_ready (via tls_strp_msg_ready). Convert msg_ready to a bool and use READ_ONCE/WRITE_ONCE where needed. The remaining reads are only performed when the socket is locked.
--- include/net/tls.h | 3 ++- net/tls/tls.h | 2 +- net/tls/tls_strp.c | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-)
include/net/tls.h +2 -1
@@ -110,7 +110,8 @@ struct tls_strparser { u32 stopped : 1; u32 copy_mode : 1; u32 mixed_decrypted : 1; - u32 msg_ready : 1; + +bool msg_ready;struct strp_msg stm;
net/tls/tls.h +1 -1
@@ -212,7 +212,7 @@ static inline struct sk_buff *tls_strp_msg(struct tls_sw_context_rx *ctx)static inline bool tls_strp_msg_ready (struct tls_sw_context_rx *ctx) { -return ctx->strp.msg_ready; +return READ_ONCE (ctx->strp.msg_ready); }static inline bool tls_strp_msg_mixed_decrypted (struct tls_sw_context_rx *ctx)
net/tls/tls_strp.c +3 -3
@@ -360,7 +360,7 @@ static int tls_strp_copyin(read_descriptor_t *desc, struct sk_buff *in_skb,if (strp->stm.full_len && strp->stm.full_len == skb->len) { desc->count =0 ; - strp->msg_ready =1 ; +WRITE_ONCE (strp->msg_ready,1 );tls_rx_msg_ready (strp); }
@@ -528,7 +528,7 @@ static int tls_strp_read_sock(struct tls_strparser *strp)if (!tls_strp_check_queue_ok (strp))return tls_strp_read_copy (strp, false); - strp->msg_ready =1 ; +WRITE_ONCE (strp->msg_ready,1 );tls_rx_msg_ready (strp);return 0 ;
@@ -580,7 +580,7 @@ void tls_strp_msg_done(struct tls_strparser *strp)else tls_strp_flush_anchor_copy (strp); - strp->msg_ready =0 ; +WRITE_ONCE (strp->msg_ready,0 );memset (&strp->stm,0 ,sizeof (strp->stm));tls_strp_check_rcv (strp);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 95/186 af_unix: Suppress false-positive lockdep splat for spin_lock() in __unix_gc().
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 1971d13ffa84a551d29a81fdf5b5ec5be166ac83 ]
syzbot reported a lockdep splat regarding unix_gc_lock and unix_state_lock().
One is called from recvmsg() for a connected socket, and another is called from GC for TCP_LISTEN socket.
So, the splat is false-positive.
Let's add a dedicated lock class for the latter to suppress the splat.
Note that this change is not necessary for net-next.git as the issue is only applied to the old GC impl.
[0]:
WARNING: possible circular locking dependency detected 6.9.0-rc5-syzkaller-00007-g4d2008430ce8 #0 Not tainted
-----------------------------------------------------
kworker/u8:1/11 is trying to acquire lock:ffff88807cea4e70 (&u->lock){+.+.}-{2:2}, at: spin_lock include/linux/spinlock.h:351 [inline] ffff88807cea4e70 (&u->lock){+.+.}-{2:2}, at: __unix_gc+0x40e/0xf70 net/unix/garbage.c:302
but task is already holding lock:ffffffff8f6ab638 (unix_gc_lock){+.+.}-{2:2}, at: spin_lock include/linux/spinlock.h:351 [inline] ffffffff8f6ab638 (unix_gc_lock){+.+.}-{2:2}, at: __unix_gc+0x117/0xf70 net/unix/garbage.c:261
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (unix_gc_lock){+.+.}-{2:2}:
lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5754
__raw_spin_lock include/linux/spinlock_api_smp.h:133 [inline]
_raw_spin_lock+0x2e/0x40 kernel/locking/spinlock.c:154
spin_lock include/linux/spinlock.h:351 [inline]
unix_notinflight+0x13d/0x390 net/unix/garbage.c:140
unix_detach_fds net/unix/af_unix.c:1819 [inline]
unix_destruct_scm+0x221/0x350 net/unix/af_unix.c:1876
skb_release_head_state+0x100/0x250 net/core/skbuff.c:1188
skb_release_all net/core/skbuff.c:1200 [inline]
__kfree_skb net/core/skbuff.c:1216 [inline]
kfree_skb_reason+0x16d/0x3b0 net/core/skbuff.c:1252
kfree_skb include/linux/skbuff.h:1262 [inline]
manage_oob net/unix/af_unix.c:2672 [inline]
unix_stream_read_generic+0x1125/0x2700 net/unix/af_unix.c:2749
unix_stream_splice_read+0x239/0x320 net/unix/af_unix.c:2981
do_splice_read fs/splice.c:985 [inline]
splice_file_to_pipe+0x299/0x500 fs/splice.c:1295
do_splice+0xf2d/0x1880 fs/splice.c:1379
__do_splice fs/splice.c:1436 [inline]
__do_sys_splice fs/splice.c:1652 [inline]
__se_sys_splice+0x331/0x4a0 fs/splice.c:1634
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf5/0x240 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x77/0x7f-> #0 (&u->lock){+.+.}-{2:2}:
check_prev_add kernel/locking/lockdep.c:3134 [inline]
check_prevs_add kernel/locking/lockdep.c:3253 [inline]
validate_chain+0x18cb/0x58e0 kernel/locking/lockdep.c:3869
__lock_acquire+0x1346/0x1fd0 kernel/locking/lockdep.c:5137
lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5754
__raw_spin_lock include/linux/spinlock_api_smp.h:133 [inline]
_raw_spin_lock+0x2e/0x40 kernel/locking/spinlock.c:154
spin_lock include/linux/spinlock.h:351 [inline]
__unix_gc+0x40e/0xf70 net/unix/garbage.c:302
process_one_work kernel/workqueue.c:3254 [inline]
process_scheduled_works+0xa10/0x17c0 kernel/workqueue.c:3335
worker_thread+0x86d/0xd70 kernel/workqueue.c:3416
kthread+0x2f0/0x390 kernel/kthread.c:388
ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244other info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(unix_gc_lock);
lock(&u->lock);
lock(unix_gc_lock); lock(&u->lock);
*** DEADLOCK ***
3 locks held by kworker/u8:1/11:
#0: ffff888015089148 ((wq_completion)events_unbound){+.+.}-{0:0}, at: process_one_work kernel/workqueue.c:3229 [inline] #0: ffff888015089148 ((wq_completion)events_unbound){+.+.}-{0:0}, at: process_scheduled_works+0x8e0/0x17c0 kernel/workqueue.c:3335 #1: ffffc90000107d00 (unix_gc_work){+.+.}-{0:0}, at: process_one_work kernel/workqueue.c:3230 [inline]
#1: ffffc90000107d00 (unix_gc_work){+.+.}-{0:0}, at: process_scheduled_works+0x91b/0x17c0 kernel/workqueue.c:3335 #2: ffffffff8f6ab638 (unix_gc_lock){+.+.}-{2:2}, at: spin_lock include/linux/spinlock.h:351 [inline]
#2: ffffffff8f6ab638 (unix_gc_lock){+.+.}-{2:2}, at: __unix_gc+0x117/0xf70 net/unix/garbage.c:261
stack backtrace: CPU: 0 PID: 11 Comm: kworker/u8:1 Not tainted 6.9.0-rc5-syzkaller-00007-g4d2008430ce8 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/27/2024 Workqueue: events_unbound __unix_gc Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:114 check_noncircular+0x36a/0x4a0 kernel/locking/lockdep.c:2187 check_prev_add kernel/locking/lockdep.c:3134 [inline] check_prevs_add kernel/locking/lockdep.c:3253 [inline] validate_chain+0x18cb/0x58e0 kernel/locking/lockdep.c:3869 __lock_acquire+0x1346/0x1fd0 kernel/locking/lockdep.c:5137 lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5754 __raw_spin_lock include/linux/spinlock_api_smp.h:133 [inline] _raw_spin_lock+0x2e/0x40 kernel/locking/spinlock.c:154 spin_lock include/linux/spinlock.h:351 [inline] __unix_gc+0x40e/0xf70 net/unix/garbage.c:302 process_one_work kernel/workqueue.c:3254 [inline] process_scheduled_works+0xa10/0x17c0 kernel/workqueue.c:3335 worker_thread+0x86d/0xd70 kernel/workqueue.c:3416 kthread+0x2f0/0x390 kernel/kthread.c:388 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244 </TASK>
--- include/net/af_unix.h | 3 +++ net/unix/garbage.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-)
include/net/af_unix.h +3 -0
@@ -77,6 +77,9 @@ enum unix_socket_lock_class {U_LOCK_NORMAL ,U_LOCK_SECOND ,/* for double locking, see unix_state_double_lock(). */ U_LOCK_DIAG ,/* used while dumping icons, see sk_diag_dump_icons(). */ + U_LOCK_GC_LISTENER, /* used for listening socket while determining gc + * candidates to close a small race window. + */ }; static inline void unix_state_lock_nested(struct sock *sk,
net/unix/garbage.c +1 -1
@@ -260,7 +260,7 @@ void unix_gc(void)__set_bit (UNIX_GC_MAYBE_CYCLE , &u->gc_flags);if (sk->sk_state ==TCP_LISTEN ) { -unix_state_lock (sk); +unix_state_lock_nested (sk,U_LOCK_GC_LISTENER );unix_state_unlock (sk); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 96/186 KVM: x86/pmu: Zero out PMU metadata on AMD if PMU is disabled
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
[ Upstream commit f933b88e20150f15787390e2a1754a7e412754ed ]
Move the purging of common PMU metadata from intel_pmu_refresh() to kvm_pmu_refresh(), and invoke the vendor refresh() hook if and only if the VM is supposed to have a vPMU.
KVM already denies access to the PMU based on kvm->arch.enable_pmu, as get_gp_pmc_amd() returns NULL for all PMCs in that case, i.e. KVM already violates AMD's architecture by not virtualizing a PMU (kernels have long since learned to not panic when the PMU is unavailable). But configuring the PMU as if it were enabled causes unwanted side effects, e.g. calls to kvm_pmu_trigger_event() waste an absurd number of cycles due to the all_valid_pmc_idx bitmap being non-zero.
Stable-dep-of: de120e1d692d ("KVM: x86/pmu: Set enable bits for GP counters in PERF_GLOBAL_CTRL at "RESET"")
--- arch/x86/kvm/pmu.c | 20 ++++++++++++++++++-- arch/x86/kvm/vmx/pmu_intel.c | 16 ++-------------- 2 files changed, 20 insertions(+), 16 deletions(-)
arch/x86/kvm/pmu.c +18 -2
@@ -691,6 +691,8 @@ void kvm_pmu_reset(struct kvm_vcpu *vcpu)*/ void kvm_pmu_refresh (struct kvm_vcpu *vcpu) { +struct kvm_pmu *pmu =vcpu_to_pmu (vcpu); +if (KVM_BUG_ON (kvm_vcpu_has_run (vcpu), vcpu->kvm))return ;
@@ -700,8 +702,22 @@ void kvm_pmu_refresh(struct kvm_vcpu *vcpu)*/ kvm_pmu_reset (vcpu); -bitmap_zero (vcpu_to_pmu (vcpu)->all_valid_pmc_idx,X86_PMC_IDX_MAX ); -static_call (kvm_x86_pmu_refresh)(vcpu); + pmu->version =0 ; + pmu->nr_arch_gp_counters =0 ; + pmu->nr_arch_fixed_counters =0 ; + pmu->counter_bitmask[KVM_PMC_GP ] =0 ; + pmu->counter_bitmask[KVM_PMC_FIXED ] =0 ; + pmu->reserved_bits =0xffffffff00200000ull ; + pmu->raw_event_mask =X86_RAW_EVENT_MASK ; + pmu->global_ctrl_mask = ~0ull ; + pmu->global_status_mask = ~0ull ; + pmu->fixed_ctr_ctrl_mask = ~0ull ; + pmu->pebs_enable_mask = ~0ull ; + pmu->pebs_data_cfg_mask = ~0ull ; +bitmap_zero (pmu->all_valid_pmc_idx,X86_PMC_IDX_MAX ); + +if (vcpu->kvm->arch.enable_pmu) +static_call (kvm_x86_pmu_refresh)(vcpu); }void kvm_pmu_init (struct kvm_vcpu *vcpu)
arch/x86/kvm/vmx/pmu_intel.c +2 -14
@@ -493,19 +493,6 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)u64 counter_mask;int i; - pmu->nr_arch_gp_counters =0 ; - pmu->nr_arch_fixed_counters =0 ; - pmu->counter_bitmask[KVM_PMC_GP ] =0 ; - pmu->counter_bitmask[KVM_PMC_FIXED ] =0 ; - pmu->version =0 ; - pmu->reserved_bits =0xffffffff00200000ull ; - pmu->raw_event_mask =X86_RAW_EVENT_MASK ; - pmu->global_ctrl_mask = ~0ull ; - pmu->global_status_mask = ~0ull ; - pmu->fixed_ctr_ctrl_mask = ~0ull ; - pmu->pebs_enable_mask = ~0ull ; - pmu->pebs_data_cfg_mask = ~0ull ; -memset (&lbr_desc->records,0 ,sizeof (lbr_desc->records));/*
@@ -517,8 +504,9 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)return ; entry =kvm_find_cpuid_entry (vcpu,0xa ); -if (!entry || !vcpu->kvm->arch.enable_pmu) +if (!entry)return ; + eax.full = entry->eax; edx.full = entry->edx;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 97/186 KVM: x86/pmu: Set enable bits for GP counters in PERF_GLOBAL_CTRL at "RESET"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
[ Upstream commit de120e1d692d73c7eefa3278837b1eb68f90728a ]
Set the enable bits for general purpose counters in IA32_PERF_GLOBAL_CTRL when refreshing the PMU to emulate the MSR's architecturally defined post-RESET behavior. Per Intel's SDM:
IA32_PERF_GLOBAL_CTRL: Sets bits n-1:0 and clears the upper bits.
and
Where "n" is the number of general-purpose counters available in the processor.
AMD also documents this behavior for PerfMonV2 CPUs in one of AMD's many PPRs.
Do not set any PERF_GLOBAL_CTRL bits if there are no general purpose counters, although a literal reading of the SDM would require the CPU to set either bits 63:0 or 31:0. The intent of the behavior is to globally enable all GP counters; honor the intent, if not the letter of the law.
Leaving PERF_GLOBAL_CTRL '0' effectively breaks PMU usage in guests that haven't been updated to work with PMUs that support PERF_GLOBAL_CTRL. This bug was recently exposed when KVM added supported for AMD's PerfMonV2, i.e. when KVM started exposing a vPMU with PERF_GLOBAL_CTRL to guest software that only knew how to program v1 PMUs (that don't support PERF_GLOBAL_CTRL).
Failure to emulate the post-RESET behavior results in such guests unknowingly leaving all general purpose counters globally disabled (the entire reason the post-RESET value sets the GP counter enable bits is to maintain backwards compatibility).
The bug has likely gone unnoticed because PERF_GLOBAL_CTRL has been supported on Intel CPUs for as long as KVM has existed, i.e. hardly anyone is running guest software that isn't aware of PERF_GLOBAL_CTRL on Intel PMUs. And because up until v6.0, KVM _did_ emulate the behavior for Intel CPUs, although the old behavior was likely dumb luck.
Because (a) that old code was also broken in its own way (the history of this code is a comedy of errors), and (b) PERF_GLOBAL_CTRL was documented as having a value of '0' post-RESET in all SDMs before March 2023.
Initial vPMU support in commit f5132b01386b ("KVM: Expose a version 2 architectural PMU to a guests") *almost* got it right (again likely by dumb luck), but for some reason only set the bits if the guest PMU was advertised as v1:
if (pmu->version == 1) {
pmu->global_ctrl = (1 << pmu->nr_arch_gp_counters) - 1;
return;
}Commit f19a0c2c2e6a ("KVM: PMU emulation: GLOBAL_CTRL MSR should be enabled on reset") then tried to remedy that goof, presumably because guest PMUs were leaving PERF_GLOBAL_CTRL '0', i.e. weren't enabling counters.
pmu->global_ctrl = ((1 << pmu->nr_arch_gp_counters) - 1) |
(((1ull << pmu->nr_arch_fixed_counters) - 1) << X86_PMC_IDX_FIXED);
pmu->global_ctrl_mask = ~pmu->global_ctrl;That was KVM's behavior up until commit c49467a45fe0 ("KVM: x86/pmu:
Don't overwrite the pmu->global_ctrl when refreshing") removed *everything*. However, it did so based on the behavior defined by the SDM , which at the time stated that "Global Perf Counter Controls" is '0' at Power-Up and RESET.
But then the March 2023 SDM (325462-079US), stealthily changed its "IA-32 and Intel 64 Processor States Following Power-up, Reset, or INIT" table to say:
IA32_PERF_GLOBAL_CTRL: Sets bits n-1:0 and clears the upper bits.
Note, kvm_pmu_refresh() can be invoked multiple times, i.e. it's not a "pure" RESET flow. But it can only be called prior to the first KVM_RUN, i.e. the guest will only ever observe the final value.
Note #2, KVM has always cleared global_ctrl during refresh (see commit f5132b01386b ("KVM: Expose a version 2 architectural PMU to a guests")), i.e. there is no danger of breaking existing setups by clobbering a value set by userspace.
--- arch/x86/kvm/pmu.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
arch/x86/kvm/pmu.c +14 -2
@@ -716,8 +716,20 @@ void kvm_pmu_refresh(struct kvm_vcpu *vcpu) pmu->pebs_data_cfg_mask = ~0ull ;bitmap_zero (pmu->all_valid_pmc_idx,X86_PMC_IDX_MAX ); -if (vcpu->kvm->arch.enable_pmu) -static_call (kvm_x86_pmu_refresh)(vcpu); +if (!vcpu->kvm->arch.enable_pmu) +return ; + +static_call (kvm_x86_pmu_refresh)(vcpu); + +/* +* At RESET, both Intel and AMD CPUs set all enable bits for general +* purpose counters in IA32_PERF_GLOBAL_CTRL (so that software that +* was written for v1 PMUs don't unknowingly leave GP counters disabled +* in the global controls). Emulate that behavior when refreshing the +* PMU so that userspace doesn't need to manually set PERF_GLOBAL_CTRL. +*/ +if (kvm_pmu_has_perf_global_ctrl (pmu) && pmu->nr_arch_gp_counters) + pmu->global_ctrl =GENMASK_ULL (pmu->nr_arch_gp_counters -1 ,0 ); }void kvm_pmu_init (struct kvm_vcpu *vcpu)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 98/186 mm/gup: explicitly define and check internal GUP flags, disallow FOLL_TOUCH
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Stoakes <[email protected]>
[ Upstream commit 0f20bba1688bdf3b32df0162511a67d4eda15790 ]
Rather than open-coding a list of internal GUP flags in is_valid_gup_args(), define which ones are internal.
In addition, explicitly check to see if the user passed in FOLL_TOUCH somehow, as this appears to have been accidentally excluded.
Stable-dep-of: 631426ba1d45 ("mm/madvise: make MADV_POPULATE_(READ|WRITE) handle VM_FAULT_RETRY properly")
--- mm/gup.c | 5 ++--- mm/internal.h | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-)
mm/gup.c +2 -3
@@ -2227,12 +2227,11 @@ static bool is_valid_gup_args(struct page **pages, int *locked,/* * These flags not allowed to be specified externally to the gup * interfaces: -* - FOLL_PIN/FOLL_TRIED/FOLL_FAST_ONLY are internal only +* - FOLL_TOUCH/FOLL_PIN/FOLL_TRIED/FOLL_FAST_ONLY are internal only * - FOLL_REMOTE is internal only and used on follow_page() * - FOLL_UNLOCKABLE is internal only and used if locked is !NULL */ -if (WARN_ON_ONCE (gup_flags & (FOLL_PIN |FOLL_TRIED |FOLL_UNLOCKABLE | -FOLL_REMOTE |FOLL_FAST_ONLY ))) +if (WARN_ON_ONCE (gup_flags &INTERNAL_GUP_FLAGS ))return false; gup_flags |= to_set;
mm/internal.h +3 -0
@@ -964,6 +964,9 @@ enum { FOLL_UNLOCKABLE = 1 << 21, }; +#define INTERNAL_GUP_FLAGS (FOLL_TOUCH | FOLL_TRIED | FOLL_REMOTE | FOLL_PIN | \ + FOLL_FAST_ONLY | FOLL_UNLOCKABLE) +/* * Indicates for which pages that are write-protected in the page table, * whether GUP has to trigger unsharing via FAULT_FLAG_UNSHARE such that the
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 99/186 mm/madvise: make MADV_POPULATE_(READ|WRITE) handle VM_FAULT_RETRY properly
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
[ Upstream commit 631426ba1d45a8672b177ee85ad4cabe760dd131 ]
Darrick reports that in some cases where pread() would fail with -EIO and mmap()+access would generate a SIGBUS signal, MADV_POPULATE_READ / MADV_POPULATE_WRITE will keep retrying forever and not fail with -EFAULT.
While the madvise() call can be interrupted by a signal, this is not the desired behavior. MADV_POPULATE_READ / MADV_POPULATE_WRITE should behave like page faults in that case: fail and not retry forever.
A reproducer can be found at [1].
The reason is that __get_user_pages(), as called by faultin_vma_page_range(), will not handle VM_FAULT_RETRY in a proper way:
it will simply return 0 when VM_FAULT_RETRY happened, making madvise_populate()->faultin_vma_page_range() retry again and again, never setting FOLL_TRIED->FAULT_FLAG_TRIED for __get_user_pages().
__get_user_pages_locked() does what we want, but duplicating that logic in faultin_vma_page_range() feels wrong.
So let's use __get_user_pages_locked() instead, that will detect VM_FAULT_RETRY and set FOLL_TRIED when retrying, making the fault handler return VM_FAULT_SIGBUS (VM_FAULT_ERROR) at some point, propagating -EFAULT from faultin_page() to __get_user_pages(), all the way to madvise_populate().
But, there is an issue: __get_user_pages_locked() will end up re-taking the MM lock and then __get_user_pages() will do another VMA lookup. In the meantime, the VMA layout could have changed and we'd fail with different error codes than we'd want to.
As __get_user_pages() will currently do a new VMA lookup either way, let it do the VMA handling in a different way, controlled by a new FOLL_MADV_POPULATE flag, effectively moving these checks from madvise_populate() + faultin_page_range() in there.
With this change, Darricks reproducer properly fails with -EFAULT, as documented for MADV_POPULATE_READ / MADV_POPULATE_WRITE.
[1] https://lore.kernel.org/all/20240313171936.GN1927156@frogsfrogsfrogs/
--- mm/gup.c | 54 ++++++++++++++++++++++++++++++--------------------- mm/internal.h | 10 ++++++---- mm/madvise.c | 17 ++-------------- 3 files changed, 40 insertions(+), 41 deletions(-)
mm/gup.c +32 -22
@@ -1204,6 +1204,22 @@ static long __get_user_pages(struct mm_struct *mm,/* first iteration or cross vma bound */ if (!vma || start >= vma->vm_end) { +/* +* MADV_POPULATE_(READ|WRITE) wants to handle VMA +* lookups+error reporting differently. +*/ +if (gup_flags &FOLL_MADV_POPULATE ) { + vma =vma_lookup (mm, start); +if (!vma) { + ret = -ENOMEM ; + goto out; + } +if (check_vma_flags (vma, gup_flags)) { + ret = -EINVAL ; + goto out; + } + goto retry; + } vma =gup_vma_lookup (mm, start);if (!vma &&in_gate_area (mm, start)) { ret = get_gate_page(mm, start & PAGE_MASK,
@@ -1670,35 +1686,35 @@ long populate_vma_page_range(struct vm_area_struct *vma, }/* -* faultin_vma_page_range() - populate (prefault) page tables inside the -* given VMA range readable/writable +* faultin_page_range() - populate (prefault) page tables inside the +* given range readable/writable * * This takes care of mlocking the pages, too, if VM_LOCKED is set. * -* @vma: target vma +* @mm: the mm to populate page tables in * @start: start address * @end: end address * @write: whether to prefault readable or writable * @locked: whether the mmap_lock is still held * -* Returns either number of processed pages in the vma, or a negative error -* code on error (see __get_user_pages()). +* Returns either number of processed pages in the MM, or a negative error +* code on error (see __get_user_pages()). Note that this function reports +* errors related to VMAs, such as incompatible mappings, as expected by +* MADV_POPULATE_(READ|WRITE). * -* vma->vm_mm->mmap_lock must be held. The range must be page-aligned and -* covered by the VMA. If it's released, *@locked will be set to 0. +* The range must be page-aligned. +* +* mm->mmap_lock must be held. If it's released, *@locked will be set to 0. */ -long faultin_vma_page_range (struct vm_area_struct *vma,unsigned long start, -unsigned long end,bool write,int *locked) +long faultin_page_range (struct mm_struct *mm,unsigned long start, +unsigned long end,bool write,int *locked) { -struct mm_struct *mm = vma->vm_mm;unsigned long nr_pages = (end - start) /PAGE_SIZE ;int gup_flags;long ret;VM_BUG_ON (!PAGE_ALIGNED (start));VM_BUG_ON (!PAGE_ALIGNED (end)); -VM_BUG_ON_VMA (start < vma->vm_start, vma); -VM_BUG_ON_VMA (end > vma->vm_end, vma);mmap_assert_locked (mm);/*
@@ -1710,19 +1726,13 @@ long faultin_vma_page_range(struct vm_area_struct *vma, unsigned long start,* a poisoned page. * !FOLL_FORCE: Require proper access permissions. */ - gup_flags =FOLL_TOUCH |FOLL_HWPOISON |FOLL_UNLOCKABLE ; + gup_flags =FOLL_TOUCH |FOLL_HWPOISON |FOLL_UNLOCKABLE | +FOLL_MADV_POPULATE ;if (write) gup_flags |=FOLL_WRITE ; -/* -* We want to report -EINVAL instead of -EFAULT for any permission -* problems or incompatible mappings. -*/ -if (check_vma_flags (vma, gup_flags)) -return -EINVAL ; - - ret =__get_user_pages (mm, start, nr_pages, gup_flags, -NULL , locked); + ret =__get_user_pages_locked (mm, start, nr_pages,NULL , locked, + gup_flags);lru_add_drain ();return ret; }
mm/internal.h +6 -4
@@ -581,9 +581,8 @@ struct anon_vma *folio_anon_vma(struct folio *folio);void unmap_mapping_folio (struct folio *folio);extern long populate_vma_page_range (struct vm_area_struct *vma,unsigned long start,unsigned long end,int *locked); -extern long faultin_vma_page_range (struct vm_area_struct *vma, -unsigned long start,unsigned long end, -bool write,int *locked); +extern long faultin_page_range (struct mm_struct *mm,unsigned long start, +unsigned long end,bool write,int *locked);extern bool mlock_future_ok (struct mm_struct *mm,unsigned long flags,unsigned long bytes);/*
@@ -962,10 +961,13 @@ enum {FOLL_FAST_ONLY =1 <<20 ,/* allow unlocking the mmap lock */ FOLL_UNLOCKABLE =1 <<21 , +/* VMA lookup+checks compatible with MADV_POPULATE_(READ|WRITE) */ + FOLL_MADV_POPULATE = 1 << 22, };#define INTERNAL_GUP_FLAGS (FOLL_TOUCH | FOLL_TRIED | FOLL_REMOTE | FOLL_PIN | \ - FOLL_FAST_ONLY | FOLL_UNLOCKABLE) + FOLL_FAST_ONLY | FOLL_UNLOCKABLE | \ + FOLL_MADV_POPULATE)/* * Indicates for which pages that are write-protected in the page table,
mm/madvise.c +2 -15
@@ -917,27 +917,14 @@ static long madvise_populate(struct vm_area_struct *vma, {const bool write = behavior ==MADV_POPULATE_WRITE ;struct mm_struct *mm = vma->vm_mm; -unsigned long tmp_end;int locked =1 ;long pages; *prev = vma;while (start < end) { -/* -* We might have temporarily dropped the lock. For example, -* our VMA might have been split. -*/ -if (!vma || start >= vma->vm_end) { - vma =vma_lookup (mm, start); -if (!vma) -return -ENOMEM ; - } - - tmp_end = min_t(unsigned long, end, vma->vm_end);/* Populate (prefault) page tables readable/writable. */ - pages =faultin_vma_page_range (vma, start, tmp_end, write, - &locked); + pages =faultin_page_range (mm, start, end, write, &locked);if (!locked) {mmap_read_lock (mm); locked =1 ;
@@ -958,7 +945,7 @@ static long madvise_populate(struct vm_area_struct *vma,pr_warn_once ("%s: unhandled return value: %ld\n" , __func__, pages); fallthrough; -case -ENOMEM : +case -ENOMEM :/* No VMA or out of memory. */ return -ENOMEM ; } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 100/186 drm: add drm_gem_object_is_shared_for_memory_stats() helper
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit b31f5eba32ae8cc28e7cfa5a55ec8670d8c718e2 ]
Add a helper so that drm drivers can consistently report shared status via the fdinfo shared memory stats interface.
In addition to handle count, show buffers as shared if they are shared via dma-buf as well (e.g., shared with v4l or some other subsystem).
v2: switch to inline function
Stable-dep-of: a6ff969fe9cb ("drm/amdgpu: fix visible VRAM handling during faults")
--- include/drm/drm_gem.h | 13 +++++++++++++ 1 file changed, 13 insertions(+)
include/drm/drm_gem.h +13 -0
@@ -544,6 +544,19 @@ unsigned long drm_gem_lru_scan(struct drm_gem_lru *lru,int drm_gem_evict (struct drm_gem_object *obj); +/** +* drm_gem_object_is_shared_for_memory_stats - helper for shared memory stats +* +* This helper should only be used for fdinfo shared memory stats to determine +* if a GEM object is shared. +* +* @obj: obj in question +*/ +static inline bool drm_gem_object_is_shared_for_memory_stats (struct drm_gem_object *obj) +{ +return (obj->handle_count >1 ) || obj->dma_buf; +} +#ifdef CONFIG_LOCKDEP /** * drm_gem_gpuva_set_lock() - Set the lock protecting accesses to the gpuva list.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 101/186 drm/amdgpu: add shared fdinfo stats
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit ba1a58d5b907bdf1814f8f57434aebc86233430f ]
Add shared stats. Useful for seeing shared memory.
v2: take dma-buf into account as well
v3: use the new gem helper
Stable-dep-of: a6ff969fe9cb ("drm/amdgpu: fix visible VRAM handling during faults")
--- drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c | 4 ++++ drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 11 +++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 6 ++++++ 3 files changed, 21 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c +4 -0
@@ -105,6 +105,10 @@ void amdgpu_show_fdinfo(struct drm_printer *p, struct drm_file *file) stats.requested_visible_vram/1024UL);drm_printf (p,"amd-requested-gtt:\t%llu KiB\n" , stats.requested_gtt/1024UL ); +drm_printf (p,"drm-shared-vram:\t%llu KiB\n" , stats.vram_shared/1024UL ); +drm_printf (p,"drm-shared-gtt:\t%llu KiB\n" , stats.gtt_shared/1024UL ); +drm_printf (p,"drm-shared-cpu:\t%llu KiB\n" , stats.cpu_shared/1024UL ); +for (hw_ip =0 ; hw_ip <AMDGPU_HW_IP_NUM ; ++hw_ip) {if (!usage[hw_ip])continue ;
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +11 -0
@@ -1281,25 +1281,36 @@ void amdgpu_bo_get_memory(struct amdgpu_bo *bo, struct amdgpu_mem_stats *stats) {uint64_t size =amdgpu_bo_size (bo); +struct drm_gem_object *obj;unsigned int domain; +bool shared;/* Abort if the BO doesn't currently have a backing store */ if (!bo->tbo.resource)return ; + obj = &bo->tbo.base; + shared =drm_gem_object_is_shared_for_memory_stats (obj); + domain =amdgpu_mem_type_to_domain (bo->tbo.resource->mem_type);switch (domain) {case AMDGPU_GEM_DOMAIN_VRAM : stats->vram += size;if (amdgpu_bo_in_cpu_visible_vram (bo)) stats->visible_vram += size; +if (shared) + stats->vram_shared += size;break ;case AMDGPU_GEM_DOMAIN_GTT : stats->gtt += size; +if (shared) + stats->gtt_shared += size;break ;case AMDGPU_GEM_DOMAIN_CPU :default : stats->cpu += size; +if (shared) + stats->cpu_shared += size;break ; }
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +6 -0
@@ -138,12 +138,18 @@ struct amdgpu_bo_vm {struct amdgpu_mem_stats {/* current VRAM usage, includes visible VRAM */ uint64_t vram; +/* current shared VRAM usage, includes visible VRAM */ +uint64_t vram_shared;/* current visible VRAM usage */ uint64_t visible_vram;/* current GTT usage */ uint64_t gtt; +/* current shared GTT usage */ +uint64_t gtt_shared;/* current system memory usage */ uint64_t cpu; +/* current shared system memory usage */ +uint64_t cpu_shared;/* sum of evicted buffers, includes visible VRAM */ uint64_t evicted_vram;/* sum of evicted buffers due to CPU access */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 102/186 drm/amdgpu: fix visible VRAM handling during faults
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian König <[email protected]>
[ Upstream commit a6ff969fe9cbf369e3cd0ac54261fec1122682ec ]
When we removed the hacky start code check we actually didn't took into account that *all* VRAM pages needs to be CPU accessible.
Clean up the code and unify the handling into a single helper which checks if the whole resource is CPU accessible.
The only place where a partial check would make sense is during eviction, but that is neglitible.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 22 ++++---- drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 22 -------- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 61 ++++++++++++++-------- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 3 ++ 5 files changed, 53 insertions(+), 57 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +1 -1
@@ -819,7 +819,7 @@ static int amdgpu_cs_bo_validate(void *param, struct amdgpu_bo *bo) p->bytes_moved += ctx.bytes_moved;if (!amdgpu_gmc_vram_full_visible (&adev->gmc) && -amdgpu_bo_in_cpu_visible_vram (bo)) +amdgpu_res_cpu_visible (adev, bo->tbo.resource)) p->bytes_moved_vis += ctx.bytes_moved;if (unlikely (r == -ENOMEM ) && domain != bo->allowed_domains) {
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +11 -11
@@ -625,8 +625,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,return r;if (!amdgpu_gmc_vram_full_visible (&adev->gmc) && - bo->tbo.resource->mem_type ==TTM_PL_VRAM && -amdgpu_bo_in_cpu_visible_vram (bo)) +amdgpu_res_cpu_visible (adev, bo->tbo.resource))amdgpu_cs_report_moved_bytes (adev, ctx.bytes_moved, ctx.bytes_moved);else
@@ -1280,23 +1279,25 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict)void amdgpu_bo_get_memory (struct amdgpu_bo *bo,struct amdgpu_mem_stats *stats) { +struct amdgpu_device *adev =amdgpu_ttm_adev (bo->tbo.bdev); +struct ttm_resource *res = bo->tbo.resource;uint64_t size =amdgpu_bo_size (bo);struct drm_gem_object *obj;unsigned int domain;bool shared;/* Abort if the BO doesn't currently have a backing store */ -if (!bo->tbo.resource) +if (!res)return ; obj = &bo->tbo.base; shared =drm_gem_object_is_shared_for_memory_stats (obj); - domain =amdgpu_mem_type_to_domain (bo->tbo.resource->mem_type); + domain =amdgpu_mem_type_to_domain (res->mem_type);switch (domain) {case AMDGPU_GEM_DOMAIN_VRAM : stats->vram += size; -if (amdgpu_bo_in_cpu_visible_vram (bo)) +if (amdgpu_res_cpu_visible (adev, bo->tbo.resource)) stats->visible_vram += size;if (shared) stats->vram_shared += size;
@@ -1395,10 +1396,7 @@ vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)/* Remember that this BO was accessed by the CPU */ abo->flags |=AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED ; -if (bo->resource->mem_type !=TTM_PL_VRAM ) -return 0 ; - -if (amdgpu_bo_in_cpu_visible_vram (abo)) +if (amdgpu_res_cpu_visible (adev, bo->resource))return 0 ;/* Can't move a pinned BO to visible VRAM */
@@ -1422,7 +1420,7 @@ vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)/* this should never happen */ if (bo->resource->mem_type ==TTM_PL_VRAM && - !amdgpu_bo_in_cpu_visible_vram (abo)) + !amdgpu_res_cpu_visible (adev, bo->resource))return VM_FAULT_SIGBUS ;ttm_bo_move_to_lru_tail_unlocked (bo);
@@ -1582,6 +1580,7 @@ uint32_t amdgpu_bo_get_preferred_domain(struct amdgpu_device *adev,*/ u64 amdgpu_bo_print_info (int id,struct amdgpu_bo *bo,struct seq_file *m) { +struct amdgpu_device *adev =amdgpu_ttm_adev (bo->tbo.bdev);struct dma_buf_attachment *attachment;struct dma_buf *dma_buf;const char *placement;
@@ -1590,10 +1589,11 @@ u64 amdgpu_bo_print_info(int id, struct amdgpu_bo *bo, struct seq_file *m)if (dma_resv_trylock (bo->tbo.base.resv)) {unsigned int domain; + domain =amdgpu_mem_type_to_domain (bo->tbo.resource->mem_type);switch (domain) {case AMDGPU_GEM_DOMAIN_VRAM : -if (amdgpu_bo_in_cpu_visible_vram (bo)) +if (amdgpu_res_cpu_visible (adev, bo->tbo.resource)) placement ="VRAM VISIBLE" ;else placement ="VRAM" ;
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +0 -22
@@ -250,28 +250,6 @@ static inline u64 amdgpu_bo_mmap_offset(struct amdgpu_bo *bo)return drm_vma_node_offset_addr (&bo->tbo.base.vma_node); } -/** -* amdgpu_bo_in_cpu_visible_vram - check if BO is (partly) in visible VRAM -*/ -static inline bool amdgpu_bo_in_cpu_visible_vram (struct amdgpu_bo *bo) -{ -struct amdgpu_device *adev =amdgpu_ttm_adev (bo->tbo.bdev); -struct amdgpu_res_cursor cursor; - -if (!bo->tbo.resource || bo->tbo.resource->mem_type !=TTM_PL_VRAM ) -return false; - -amdgpu_res_first (bo->tbo.resource,0 ,amdgpu_bo_size (bo), &cursor); -while (cursor.remaining) { -if (cursor.start < adev->gmc.visible_vram_size) -return true; - -amdgpu_res_next (&cursor, cursor.size); - } - -return false; -} -/** * amdgpu_bo_explicit_sync - return whether the bo is explicitly synced */
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +38 -23
93 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +3 -0
@@ -139,6 +139,9 @@ int amdgpu_vram_mgr_reserve_range(struct amdgpu_vram_mgr *mgr,int amdgpu_vram_mgr_query_page_status (struct amdgpu_vram_mgr *mgr,uint64_t start); +bool amdgpu_res_cpu_visible (struct amdgpu_device *adev, +struct ttm_resource *res); +int amdgpu_ttm_init (struct amdgpu_device *adev);void amdgpu_ttm_fini (struct amdgpu_device *adev); void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 103/186 mm, treewide: introduce NR_PAGE_ORDERS
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill A. Shutemov <[email protected]>
[ Upstream commit fd37721803c6e73619108f76ad2e12a9aa5fafaf ]
NR_PAGE_ORDERS defines the number of page orders supported by the page allocator, ranging from 0 to MAX_ORDER, MAX_ORDER + 1 in total.
NR_PAGE_ORDERS assists in defining arrays of page orders and allows for more natural iteration over them.
Stable-dep-of: b6976f323a86 ("drm/ttm: stop pooling cached NUMA pages v2")
--- .../admin-guide/kdump/vmcoreinfo.rst | 6 +++--- arch/arm64/kvm/hyp/include/nvhe/gfp.h | 2 +- arch/sparc/kernel/traps_64.c | 2 +- drivers/gpu/drm/ttm/tests/ttm_device_test.c | 2 +- drivers/gpu/drm/ttm/ttm_pool.c | 20 +++++++++---------- include/drm/ttm/ttm_pool.h | 2 +- include/linux/mmzone.h | 6 ++++-- kernel/crash_core.c | 2 +- lib/test_meminit.c | 2 +- mm/compaction.c | 2 +- mm/kmsan/init.c | 2 +- mm/page_alloc.c | 13 ++++++------ mm/page_reporting.c | 2 +- mm/show_mem.c | 8 ++++---- mm/vmstat.c | 12 +++++------ 15 files changed, 42 insertions(+), 41 deletions(-)
Documentation/admin-guide/kdump/vmcoreinfo.rst +3 -3
@@ -172,7 +172,7 @@ variables. Offset of the free_list's member. This value is used to compute the number of free pages. -Each zone has a free_area structure array called free_area[MAX_ORDER + 1]. +Each zone has a free_area structure array called free_area[NR_PAGE_ORDERS]. The free_list represents a linked list of free page blocks. (list_head, next|prev)
@@ -189,8 +189,8 @@ Offsets of the vmap_area's members. They carry vmalloc-specific information. Makedumpfile gets the start address of the vmalloc region from this. -(zone.free_area, MAX_ORDER + 1) -------------------------------- +(zone.free_area, NR_PAGE_ORDERS) +-------------------------------- Free areas descriptor. User-space tools use this value to iterate the free_area ranges. MAX_ORDER is used by the zone buddy allocator.
arch/arm64/kvm/hyp/include/nvhe/gfp.h +1 -1
@@ -16,7 +16,7 @@ struct hyp_pool {* API at EL2. */ hyp_spinlock_t lock; -struct list_head free_area[MAX_ORDER +1 ]; +struct list_head free_area[NR_PAGE_ORDERS ];phys_addr_t range_start;phys_addr_t range_end;unsigned short max_order;
arch/sparc/kernel/traps_64.c +1 -1
@@ -897,7 +897,7 @@ void __init cheetah_ecache_flush_init(void)/* Now allocate error trap reporting scoreboard. */ sz =NR_CPUS * (2 *sizeof (struct cheetah_err_info )); -for (order =0 ; order <=MAX_ORDER ; order++) { +for (order =0 ; order <NR_PAGE_ORDERS ; order++) {if ((PAGE_SIZE << order) >= sz)break ; }
drivers/gpu/drm/ttm/tests/ttm_device_test.c +1 -1
@@ -175,7 +175,7 @@ static void ttm_device_init_pools(struct kunit *test)if (params->pools_init_expected) {for (int i =0 ; i <TTM_NUM_CACHING_TYPES ; ++i) { -for (int j =0 ; j <=MAX_ORDER ; ++j) { +for (int j =0 ; j <NR_PAGE_ORDERS ; ++j) { pt = pool->caching[i].orders[j];KUNIT_EXPECT_PTR_EQ (test, pt.pool, pool);KUNIT_EXPECT_EQ (test, pt.caching, i);
drivers/gpu/drm/ttm/ttm_pool.c +10 -10
@@ -65,11 +65,11 @@ module_param(page_pool_size, ulong, 0644);static atomic_long_t allocated_pages; -static struct ttm_pool_type global_write_combined[MAX_ORDER +1 ]; -static struct ttm_pool_type global_uncached[MAX_ORDER +1 ]; +static struct ttm_pool_type global_write_combined[NR_PAGE_ORDERS ]; +static struct ttm_pool_type global_uncached[NR_PAGE_ORDERS ]; -static struct ttm_pool_type global_dma32_write_combined[MAX_ORDER +1 ]; -static struct ttm_pool_type global_dma32_uncached[MAX_ORDER +1 ]; +static struct ttm_pool_type global_dma32_write_combined[NR_PAGE_ORDERS ]; +static struct ttm_pool_type global_dma32_uncached[NR_PAGE_ORDERS ];static spinlock_t shrinker_lock;static struct list_head shrinker_list;
@@ -565,7 +565,7 @@ void ttm_pool_init(struct ttm_pool *pool, struct device *dev,if (use_dma_alloc || nid !=NUMA_NO_NODE ) {for (i =0 ; i <TTM_NUM_CACHING_TYPES ; ++i) -for (j =0 ; j <=MAX_ORDER ; ++j) +for (j =0 ; j <NR_PAGE_ORDERS ; ++j)ttm_pool_type_init (&pool->caching[i].orders[j], pool, i, j); }
@@ -586,7 +586,7 @@ void ttm_pool_fini(struct ttm_pool *pool)if (pool->use_dma_alloc || pool->nid !=NUMA_NO_NODE ) {for (i =0 ; i <TTM_NUM_CACHING_TYPES ; ++i) -for (j =0 ; j <=MAX_ORDER ; ++j) +for (j =0 ; j <NR_PAGE_ORDERS ; ++j)ttm_pool_type_fini (&pool->caching[i].orders[j]); }
@@ -641,7 +641,7 @@ static void ttm_pool_debugfs_header(struct seq_file *m)unsigned int i;seq_puts (m,"\t " ); -for (i =0 ; i <=MAX_ORDER ; ++i) +for (i =0 ; i <NR_PAGE_ORDERS ; ++i)seq_printf (m," ---%2u---" , i);seq_puts (m,"\n" ); }
@@ -652,7 +652,7 @@ static void ttm_pool_debugfs_orders(struct ttm_pool_type *pt, {unsigned int i; -for (i =0 ; i <=MAX_ORDER ; ++i) +for (i =0 ; i <NR_PAGE_ORDERS ; ++i)seq_printf (m," %8u" ,ttm_pool_type_count (&pt[i]));seq_puts (m,"\n" ); }
@@ -761,7 +761,7 @@ int ttm_pool_mgr_init(unsigned long num_pages)spin_lock_init (&shrinker_lock);INIT_LIST_HEAD (&shrinker_list); -for (i =0 ; i <=MAX_ORDER ; ++i) { +for (i =0 ; i <NR_PAGE_ORDERS ; ++i) {ttm_pool_type_init (&global_write_combined[i],NULL , ttm_write_combined, i);ttm_pool_type_init (&global_uncached[i],NULL , ttm_uncached, i);
@@ -794,7 +794,7 @@ void ttm_pool_mgr_fini(void) {unsigned int i; -for (i =0 ; i <=MAX_ORDER ; ++i) { +for (i =0 ; i <NR_PAGE_ORDERS ; ++i) {ttm_pool_type_fini (&global_write_combined[i]);ttm_pool_type_fini (&global_uncached[i]);
include/drm/ttm/ttm_pool.h +1 -1
@@ -74,7 +74,7 @@ struct ttm_pool {bool use_dma32;struct { -struct ttm_pool_type orders[MAX_ORDER +1 ]; +struct ttm_pool_type orders[NR_PAGE_ORDERS ]; } caching[TTM_NUM_CACHING_TYPES ]; };
include/linux/mmzone.h +4 -2
@@ -34,6 +34,8 @@#define IS_MAX_ORDER_ALIGNED (pfn) IS_ALIGNED(pfn, MAX_ORDER_NR_PAGES) +#define NR_PAGE_ORDERS (MAX_ORDER + 1) +/* * PAGE_ALLOC_COSTLY_ORDER is the order at which allocations are deemed * costly to service. That is between allocation orders which should
@@ -95,7 +97,7 @@ static inline bool migratetype_is_mergeable(int mt) }#define for_each_migratetype_order (order, type) \ - for (order = 0; order <= MAX_ORDER; order++) \ + for (order = 0; order < NR_PAGE_ORDERS; order++) \ for (type = 0; type < MIGRATE_TYPES; type++)extern int page_group_by_mobility_disabled;
@@ -929,7 +931,7 @@ struct zone {CACHELINE_PADDING (_pad1_);/* free areas of different sizes */ -struct free_area free_area[MAX_ORDER +1 ]; +struct free_area free_area[NR_PAGE_ORDERS ];#ifdef CONFIG_UNACCEPTED_MEMORY /* Pages to be accepted. All pages on the list are MAX_ORDER */
kernel/crash_core.c +1 -1
@@ -660,7 +660,7 @@ static int __init crash_save_vmcoreinfo_init(void)VMCOREINFO_OFFSET (list_head, prev);VMCOREINFO_OFFSET (vmap_area, va_start);VMCOREINFO_OFFSET (vmap_area, list); -VMCOREINFO_LENGTH (zone.free_area,MAX_ORDER +1 ); +VMCOREINFO_LENGTH (zone.free_area,NR_PAGE_ORDERS );log_buf_vmcoreinfo_setup ();VMCOREINFO_LENGTH (free_area.free_list,MIGRATE_TYPES );VMCOREINFO_NUMBER (NR_FREE_PAGES );
lib/test_meminit.c +1 -1
@@ -93,7 +93,7 @@ static int __init test_pages(int *total_failures)int failures =0 , num_tests =0 ;int i; -for (i =0 ; i <=MAX_ORDER ; i++) +for (i =0 ; i <NR_PAGE_ORDERS ; i++) num_tests +=do_alloc_pages_order (i, &failures);REPORT_FAILURES_IN_FN ();
mm/compaction.c +1 -1
@@ -2225,7 +2225,7 @@ static enum compact_result __compact_finished(struct compact_control *cc)/* Direct compactor: Is a suitable page free? */ ret =COMPACT_NO_SUITABLE_PAGE ; -for (order = cc->order; order <=MAX_ORDER ; order++) { +for (order = cc->order; order <NR_PAGE_ORDERS ; order++) {struct free_area *area = &cc->zone->free_area[order];bool can_steal;
mm/kmsan/init.c +1 -1
@@ -96,7 +96,7 @@ void __init kmsan_init_shadow(void)struct metadata_page_pair {struct page *shadow, *origin; }; -static struct metadata_page_pair held_back[MAX_ORDER +1 ]__initdata ; +static struct metadata_page_pair held_back[NR_PAGE_ORDERS ]__initdata ;/* * Eager metadata allocation. When the memblock allocator is freeing pages to
mm/page_alloc.c +6 -7
@@ -1570,7 +1570,7 @@ struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,struct page *page;/* Find a page of the appropriate size in the preferred list */ -for (current_order = order; current_order <=MAX_ORDER ; ++current_order) { +for (current_order = order; current_order <NR_PAGE_ORDERS ; ++current_order) { area = &(zone->free_area[current_order]); page =get_page_from_free_area (area, migratetype);if (!page)
@@ -1940,7 +1940,7 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,continue ;spin_lock_irqsave (&zone->lock, flags); -for (order =0 ; order <=MAX_ORDER ; order++) { +for (order =0 ; order <NR_PAGE_ORDERS ; order++) {struct free_area *area = &(zone->free_area[order]); page =get_page_from_free_area (area,MIGRATE_HIGHATOMIC );
@@ -2050,8 +2050,7 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype,return false; find_smallest: -for (current_order = order; current_order <=MAX_ORDER ; - current_order++) { +for (current_order = order; current_order <NR_PAGE_ORDERS ; current_order++) { area = &(zone->free_area[current_order]); fallback_mt =find_suitable_fallback (area, current_order, start_migratetype, false, &can_steal);
@@ -2884,7 +2883,7 @@ bool __zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,return true;/* For a high-order request, check at least one suitable page is free */ -for (o = order; o <=MAX_ORDER ; o++) { +for (o = order; o <NR_PAGE_ORDERS ; o++) {struct free_area *area = &z->free_area[o];int mt;
@@ -6442,7 +6441,7 @@ bool is_free_buddy_page(struct page *page)unsigned long pfn =page_to_pfn (page);unsigned int order; -for (order =0 ; order <=MAX_ORDER ; order++) { +for (order =0 ; order <NR_PAGE_ORDERS ; order++) {struct page *page_head = page - (pfn & ((1 << order) -1 )); if (PageBuddy(page_head) &&
@@ -6501,7 +6500,7 @@ bool take_page_off_buddy(struct page *page)bool ret = false;spin_lock_irqsave (&zone->lock, flags); -for (order =0 ; order <=MAX_ORDER ; order++) { +for (order =0 ; order <NR_PAGE_ORDERS ; order++) {struct page *page_head = page - (pfn & ((1 << order) -1 ));int page_order =buddy_order (page_head);
mm/page_reporting.c +1 -1
@@ -276,7 +276,7 @@ page_reporting_process_zone(struct page_reporting_dev_info *prdev,return err;/* Process each free list starting from lowest order/mt */ -for (order = page_reporting_order; order <=MAX_ORDER ; order++) { +for (order = page_reporting_order; order <NR_PAGE_ORDERS ; order++) {for (mt =0 ; mt <MIGRATE_TYPES ; mt++) {/* We do not pull pages from the isolate free list */ if (is_migrate_isolate (mt))
mm/show_mem.c +4 -4
@@ -355,8 +355,8 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_zfor_each_populated_zone (zone) {unsigned int order; -unsigned long nr[MAX_ORDER +1 ], flags, total =0 ; -unsigned char types[MAX_ORDER +1 ]; +unsigned long nr[NR_PAGE_ORDERS ], flags, total =0 ; +unsigned char types[NR_PAGE_ORDERS ];if (zone_idx (zone) > max_zone_idx)continue ;
@@ -366,7 +366,7 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_zprintk (KERN_CONT "%s: " , zone->name);spin_lock_irqsave (&zone->lock, flags); -for (order =0 ; order <=MAX_ORDER ; order++) { +for (order =0 ; order <NR_PAGE_ORDERS ; order++) {struct free_area *area = &zone->free_area[order];int type;
@@ -380,7 +380,7 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z } }spin_unlock_irqrestore (&zone->lock, flags); -for (order =0 ; order <=MAX_ORDER ; order++) { +for (order =0 ; order <NR_PAGE_ORDERS ; order++) {printk (KERN_CONT "%lu*%lukB " , nr[order],K (1UL ) << order);if (nr[order])
mm/vmstat.c +6 -6
@@ -1055,7 +1055,7 @@ static void fill_contig_page_info(struct zone *zone, info->free_blocks_total =0 ; info->free_blocks_suitable =0 ; -for (order =0 ; order <=MAX_ORDER ; order++) { +for (order =0 ; order <NR_PAGE_ORDERS ; order++) {unsigned long blocks;/*
@@ -1471,7 +1471,7 @@ static void frag_show_print(struct seq_file *m, pg_data_t *pgdat,int order;seq_printf (m,"Node %d, zone %8s " , pgdat->node_id, zone->name); -for (order =0 ; order <=MAX_ORDER ; ++order) +for (order =0 ; order <NR_PAGE_ORDERS ; ++order)/* * Access to nr_free is lockless as nr_free is used only for * printing purposes. Use data_race to avoid KCSAN warning.
@@ -1500,7 +1500,7 @@ static void pagetypeinfo_showfree_print(struct seq_file *m, pgdat->node_id, zone->name, migratetype_names[mtype]); -for (order =0 ; order <=MAX_ORDER ; ++order) { +for (order =0 ; order <NR_PAGE_ORDERS ; ++order) {unsigned long freecount =0 ;struct free_area *area;struct list_head *curr;
@@ -1540,7 +1540,7 @@ static void pagetypeinfo_showfree(struct seq_file *m, void *arg)/* Print header */ seq_printf (m,"%-43s " ,"Free pages count per migrate type at order" ); -for (order =0 ; order <=MAX_ORDER ; ++order) +for (order =0 ; order <NR_PAGE_ORDERS ; ++order)seq_printf (m,"%6d " , order);seq_putc (m,'\n' );
@@ -2176,7 +2176,7 @@ static void unusable_show_print(struct seq_file *m,seq_printf (m,"Node %d, zone %8s " , pgdat->node_id, zone->name); -for (order =0 ; order <=MAX_ORDER ; ++order) { +for (order =0 ; order <NR_PAGE_ORDERS ; ++order) {fill_contig_page_info (zone, order, &info); index =unusable_free_index (order, &info);seq_printf (m,"%d.%03d " , index /1000 , index %1000 );
@@ -2228,7 +2228,7 @@ static void extfrag_show_print(struct seq_file *m,seq_printf (m,"Node %d, zone %8s " , pgdat->node_id, zone->name); -for (order =0 ; order <=MAX_ORDER ; ++order) { +for (order =0 ; order <NR_PAGE_ORDERS ; ++order) {fill_contig_page_info (zone, order, &info); index =__fragmentation_index (order, &info);seq_printf (m,"%2d.%03d " , index /1000 , index %1000 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 104/186 drm/ttm: stop pooling cached NUMA pages v2
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian König <[email protected]>
[ Upstream commit b6976f323a8687cc0d55bc92c2086fd934324ed5 ]
We only pool write combined and uncached allocations because they require extra overhead on allocation and release.
If we also pool cached NUMA it not only means some extra unnecessary overhead, but also that under memory pressure it can happen that pages from the wrong NUMA node enters the pool and are re-used over and over again.
This can lead to performance reduction after running into memory pressure.
v2: restructure and cleanup the code a bit from the internal hack to
test this.
--- drivers/gpu/drm/ttm/ttm_pool.c | 38 +++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-)
drivers/gpu/drm/ttm/ttm_pool.c +28 -10
@@ -287,17 +287,23 @@ static struct ttm_pool_type *ttm_pool_select_type(struct ttm_pool *pool, enum ttm_caching caching, unsigned int order) { - if (pool->use_dma_alloc || pool->nid != NUMA_NO_NODE) + if (pool->use_dma_alloc) return &pool->caching[caching].orders[order]; #ifdef CONFIG_X86 switch (caching) { case ttm_write_combined: + if (pool->nid != NUMA_NO_NODE) + return &pool->caching[caching].orders[order]; + if (pool->use_dma32) return &global_dma32_write_combined[order]; return &global_write_combined[order]; case ttm_uncached: + if (pool->nid != NUMA_NO_NODE) + return &pool->caching[caching].orders[order]; + if (pool->use_dma32) return &global_dma32_uncached[order];
@@ -563,11 +569,17 @@ void ttm_pool_init(struct ttm_pool *pool, struct device *dev, pool->use_dma_alloc = use_dma_alloc; pool->use_dma32 = use_dma32; -if (use_dma_alloc || nid !=NUMA_NO_NODE ) { -for (i =0 ; i <TTM_NUM_CACHING_TYPES ; ++i) -for (j =0 ; j <NR_PAGE_ORDERS ; ++j) -ttm_pool_type_init (&pool->caching[i].orders[j], - pool, i, j); +for (i =0 ; i <TTM_NUM_CACHING_TYPES ; ++i) { +for (j =0 ; j <NR_PAGE_ORDERS ; ++j) { +struct ttm_pool_type *pt; + +/* Initialize only pool types which are actually used */ + pt =ttm_pool_select_type (pool, i, j); +if (pt != &pool->caching[i].orders[j]) +continue ; + +ttm_pool_type_init (pt, pool, i, j); + } } }EXPORT_SYMBOL (ttm_pool_init);
@@ -584,10 +596,16 @@ void ttm_pool_fini(struct ttm_pool *pool) {unsigned int i, j; -if (pool->use_dma_alloc || pool->nid !=NUMA_NO_NODE ) { -for (i =0 ; i <TTM_NUM_CACHING_TYPES ; ++i) -for (j =0 ; j <NR_PAGE_ORDERS ; ++j) -ttm_pool_type_fini (&pool->caching[i].orders[j]); +for (i =0 ; i <TTM_NUM_CACHING_TYPES ; ++i) { +for (j =0 ; j <NR_PAGE_ORDERS ; ++j) { +struct ttm_pool_type *pt; + + pt =ttm_pool_select_type (pool, i, j); +if (pt != &pool->caching[i].orders[j]) +continue ; + +ttm_pool_type_fini (pt); + } }/* We removed the pool types from the LRU, but we need to also make sure
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 105/186 squashfs: convert to new timestamp accessors
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
[ Upstream commit a1f13ed8c74893ed31d41c5bca156a623b0e9a86 ]
Convert to using the new inode timestamp accessor functions.
Stable-dep-of: 9253c54e01b6 ("Squashfs: check the inode number is not the invalid value of zero")
--- fs/squashfs/inode.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
fs/squashfs/inode.c +3 -3
@@ -59,9 +59,9 @@ static int squashfs_new_inode(struct super_block *sb, struct inode *inode,i_uid_write (inode, i_uid);i_gid_write (inode, i_gid); inode->i_ino =le32_to_cpu (sqsh_ino->inode_number); - inode->i_mtime.tv_sec =le32_to_cpu (sqsh_ino->mtime); - inode->i_atime.tv_sec = inode->i_mtime.tv_sec; -inode_set_ctime (inode, inode->i_mtime.tv_sec,0 ); +inode_set_mtime (inode,le32_to_cpu (sqsh_ino->mtime),0 ); +inode_set_atime (inode,inode_get_mtime_sec (inode),0 ); +inode_set_ctime (inode,inode_get_mtime_sec (inode),0 ); inode->i_mode =le16_to_cpu (sqsh_ino->mode); inode->i_size =0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 106/186 Squashfs: check the inode number is not the invalid value of zero
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phillip Lougher <[email protected]>
[ Upstream commit 9253c54e01b6505d348afbc02abaa4d9f8a01395 ]
Syskiller has produced an out of bounds access in fill_meta_index().
That out of bounds access is ultimately caused because the inode has an inode number with the invalid value of zero, which was not checked.
The reason this causes the out of bounds access is due to following sequence of events:
1. Fill_meta_index() is called to allocate (via empty_meta_index()) and fill a metadata index. It however suffers a data read error and aborts, invalidating the newly returned empty metadata index. It does this by setting the inode number of the index to zero, which means unused (zero is not a valid inode number).
2. When fill_meta_index() is subsequently called again on another read operation, locate_meta_index() returns the previous index because it matches the inode number of 0. Because this index has been returned it is expected to have been filled, and because it hasn't been, an out of bounds access is performed.
This patch adds a sanity check which checks that the inode number is not zero when the inode is created and returns -EINVAL if it is.
--- fs/squashfs/inode.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/squashfs/inode.c +4 -1
@@ -48,6 +48,10 @@ static int squashfs_new_inode(struct super_block *sb, struct inode *inode,gid_t i_gid;int err; + inode->i_ino =le32_to_cpu (sqsh_ino->inode_number); +if (inode->i_ino ==0 ) +return -EINVAL ; + err =squashfs_get_id (sb,le16_to_cpu (sqsh_ino->uid), &i_uid);if (err)return err;
@@ -58,7 +62,6 @@ static int squashfs_new_inode(struct super_block *sb, struct inode *inode,i_uid_write (inode, i_uid);i_gid_write (inode, i_gid); - inode->i_ino =le32_to_cpu (sqsh_ino->inode_number);inode_set_mtime (inode,le32_to_cpu (sqsh_ino->mtime),0 );inode_set_atime (inode,inode_get_mtime_sec (inode),0 );inode_set_ctime (inode,inode_get_mtime_sec (inode),0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 107/186 selftests/seccomp: user_notification_addfd check nextfd is available
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Terry Tritton <[email protected]>
commit 8e3c9f9f3a0742cd12b682a1766674253b33fcf0 upstream.
Currently the user_notification_addfd test checks what the next expected file descriptor will be by incrementing a variable nextfd. This does not account for file descriptors that may already be open before the test is started and will cause the test to fail if any exist.
Replace nextfd++ with a function get_next_fd which will check and return the next available file descriptor.
--- tools/testing/selftests/seccomp/seccomp_bpf.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-)
tools/testing/selftests/seccomp/seccomp_bpf.c +19 -5
@@ -4037,6 +4037,16 @@ TEST(user_notification_filter_empty_threEXPECT_GT ((pollfd.revents &POLLHUP ) ?:0 ,0 ); } + +int get_next_fd (int prev_fd) +{ +for (int i = prev_fd +1 ; i <FD_SETSIZE ; ++i) { +if (fcntl (i,F_GETFD ) ==-1 ) +return i; + } +_exit (EXIT_FAILURE ); +} +TEST (user_notification_addfd) {pid_t pid;
@@ -4053,7 +4063,7 @@ TEST(user_notification_addfd)/* There may be arbitrary already-open fds at test start. */ memfd =memfd_create ("test" ,0 );ASSERT_GE (memfd,0 ); - nextfd = memfd +1 ; + nextfd =get_next_fd (memfd); ret =prctl (PR_SET_NO_NEW_PRIVS ,1 ,0 ,0 ,0 ); ASSERT_EQ(0, ret) {
@@ -4064,7 +4074,8 @@ TEST(user_notification_addfd)/* Check that the basic notification machinery works */ listener =user_notif_syscall (__NR_getppid,SECCOMP_FILTER_FLAG_NEW_LISTENER ); -ASSERT_EQ (listener, nextfd++); +ASSERT_EQ (listener, nextfd); + nextfd =get_next_fd (nextfd); pid =fork ();ASSERT_GE (pid,0 );
@@ -4119,14 +4130,16 @@ TEST(user_notification_addfd)/* Verify we can set an arbitrary remote fd */ fd =ioctl (listener,SECCOMP_IOCTL_NOTIF_ADDFD , &addfd); -EXPECT_EQ (fd, nextfd++); +EXPECT_EQ (fd, nextfd); + nextfd =get_next_fd (nextfd);EXPECT_EQ (filecmp (getpid (), pid, memfd, fd),0 );/* Verify we can set an arbitrary remote fd with large size */ memset (&big,0x0 ,sizeof (big)); big.addfd = addfd; fd =ioctl (listener,SECCOMP_IOCTL_NOTIF_ADDFD_BIG , &big); -EXPECT_EQ (fd, nextfd++); +EXPECT_EQ (fd, nextfd); + nextfd =get_next_fd (nextfd);/* Verify we can set a specific remote fd */ addfd.newfd =42 ;
@@ -4164,7 +4177,8 @@ TEST(user_notification_addfd)* Child has earlier "low" fds and now 42, so we expect the next * lowest available fd to be assigned here. */ -EXPECT_EQ (fd, nextfd++); +EXPECT_EQ (fd, nextfd); + nextfd =get_next_fd (nextfd);ASSERT_EQ (filecmp (getpid (), pid, memfd, fd),0 );/*
Greg Kroah-Hartman
maintainerPATCH 108/186 selftests/seccomp: Change the syscall used in KILL_THREAD test
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Terry Tritton <[email protected]>
commit 471dbc547612adeaa769e48498ef591c6c95a57a upstream.
The Bionic version of pthread_create used on Android calls the prctl function to give the stack and thread local storage a useful name. This will cause the KILL_THREAD test to fail as it will kill the thread as soon as it is created.
change the test to use getpid instead of prctl.
--- tools/testing/selftests/seccomp/seccomp_bpf.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/testing/selftests/seccomp/seccomp_bpf.c +4 -4
@@ -784,7 +784,7 @@ void *kill_thread(void *data)bool die = (bool )data;if (die) { -prctl (PR_GET_SECCOMP ,0 ,0 ,0 ,0 ); +syscall (__NR_getpid);return (void *)SIBLING_EXIT_FAILURE ; }
@@ -803,11 +803,11 @@ void kill_thread_or_group(struct __test_ {pthread_t thread;void *status; -/* Kill only when calling __NR_prctl. */ +/* Kill only when calling __NR_getpid. */ struct sock_filter filter_thread[] = {BPF_STMT (BPF_LD |BPF_W |BPF_ABS , offsetof(struct seccomp_data , nr)), -BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_prctl,0 ,1 ), +BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_getpid,0 ,1 ),BPF_STMT (BPF_RET |BPF_K ,SECCOMP_RET_KILL_THREAD ),BPF_STMT (BPF_RET |BPF_K ,SECCOMP_RET_ALLOW ), };
@@ -819,7 +819,7 @@ void kill_thread_or_group(struct __test_struct sock_filter filter_process[] = {BPF_STMT (BPF_LD |BPF_W |BPF_ABS , offsetof(struct seccomp_data , nr)), -BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_prctl,0 ,1 ), +BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_getpid,0 ,1 ),BPF_STMT (BPF_RET |BPF_K , kill),BPF_STMT (BPF_RET |BPF_K ,SECCOMP_RET_ALLOW ), };
Greg Kroah-Hartman
maintainerPATCH 109/186 selftests/seccomp: Handle EINVAL on unshare(CLONE_NEWPID)
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Terry Tritton <[email protected]>
commit ecaaa55c9fa5e8058445a8b891070b12208cdb6d upstream.
unshare(CLONE_NEWPID) can return EINVAL if the kernel does not have the CONFIG_PID_NS option enabled.
Add a check on these calls to skip the test if we receive EINVAL.
--- tools/testing/selftests/seccomp/seccomp_bpf.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
tools/testing/selftests/seccomp/seccomp_bpf.c +8 -1
@@ -3709,7 +3709,12 @@ TEST(user_notification_sibling_pid_ns)ASSERT_GE (pid,0 );if (pid ==0 ) { -ASSERT_EQ (unshare (CLONE_NEWPID ),0 ); + ASSERT_EQ(unshare(CLONE_NEWPID), 0) { +if (errno ==EPERM ) +SKIP (return,"CLONE_NEWPID requires CAP_SYS_ADMIN" ); +else if (errno ==EINVAL ) +SKIP (return,"CLONE_NEWPID is invalid (missing CONFIG_PID_NS?)" ); + } pid2 =fork ();ASSERT_GE (pid2,0 );
@@ -3727,6 +3732,8 @@ TEST(user_notification_sibling_pid_ns) ASSERT_EQ(unshare(CLONE_NEWPID), 0) {if (errno ==EPERM )SKIP (return,"CLONE_NEWPID requires CAP_SYS_ADMIN" ); +else if (errno ==EINVAL ) +SKIP (return,"CLONE_NEWPID is invalid (missing CONFIG_PID_NS?)" ); }ASSERT_EQ (errno,0 );
Greg Kroah-Hartman
maintainerPATCH 110/186 fork: defer linking file vma until vma is fully initialized
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miaohe Lin <[email protected]>
commit 35e351780fa9d8240dd6f7e4f245f9ea37e96c19 upstream.
Thorvald reported a WARNING [1]. And the root cause is below race:
CPU 1 CPU 2
fork hugetlbfs_fallocate
dup_mmap hugetlbfs_punch_hole
i_mmap_lock_write(mapping);
vma_interval_tree_insert_after -- Child vma is visible through i_mmap tree. i_mmap_unlock_write(mapping);
hugetlb_dup_vma_private -- Clear vma_lock outside i_mmap_rwsem!
i_mmap_lock_write(mapping); hugetlb_vmdelete_list vma_interval_tree_foreach hugetlb_vma_trylock_write -- Vma_lock is cleared. tmp->vm_ops->open -- Alloc new vma_lock outside i_mmap_rwsem! hugetlb_vma_unlock_write -- Vma_lock is assigned!!! i_mmap_unlock_write(mapping);
hugetlb_dup_vma_private() and hugetlb_vm_op_open() are called outside i_mmap_rwsem lock while vma lock can be used in the same time. Fix this by deferring linking file vma until vma is fully initialized. Those vmas should be initialized first before they can be used.
--- kernel/fork.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
kernel/fork.c +9 -9
@@ -727,6 +727,15 @@ static __latent_entropy int dup_mmap(str }else if (anon_vma_fork (tmp, mpnt)) goto fail_nomem_anon_vma_fork;vm_flags_clear (tmp,VM_LOCKED_MASK ); +/* +* Copy/update hugetlb private vma information. +*/ +if (is_vm_hugetlb_page (tmp)) +hugetlb_dup_vma_private (tmp); + +if (tmp->vm_ops && tmp->vm_ops->open) + tmp->vm_ops->open (tmp); + file = tmp->vm_file;if (file) {struct address_space *mapping = file->f_mapping;
@@ -743,12 +752,6 @@ static __latent_entropy int dup_mmap(stri_mmap_unlock_write (mapping); } -/* -* Copy/update hugetlb private vma information. -*/ -if (is_vm_hugetlb_page (tmp)) -hugetlb_dup_vma_private (tmp); -/* Link the vma into the MT */ if (vma_iter_bulk_store (&vmi, tmp)) goto fail_nomem_vmi_store;
@@ -757,9 +760,6 @@ static __latent_entropy int dup_mmap(strif (!(tmp->vm_flags &VM_WIPEONFORK )) retval =copy_page_range (tmp, mpnt); -if (tmp->vm_ops && tmp->vm_ops->open) - tmp->vm_ops->open (tmp); -if (retval) goto loop_out; }
Greg Kroah-Hartman
maintainerPATCH 111/186 x86/cpu: Fix check for RDPKRU in __show_regs()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Kaplan <[email protected]>
commit b53c6bd5d271d023857174b8fd3e32f98ae51372 upstream.
cpu_feature_enabled(X86_FEATURE_OSPKE) does not necessarily reflect whether CR4.PKE is set on the CPU. In particular, they may differ on non-BSP CPUs before setup_pku() is executed. In this scenario, RDPKRU will #UD causing the system to hang.
Fix by checking CR4 for PKE enablement which is always correct for the current CPU.
The scenario happens by inserting a WARN* before setup_pku() in identiy_cpu() or some other diagnostic which would lead to calling __show_regs().
[ bp: Massage commit message. ]
--- arch/x86/kernel/process_64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/process_64.c +1 -1
@@ -138,7 +138,7 @@ void __show_regs(struct pt_regs *regs, e log_lvl, d3, d6, d7); } -if (cpu_feature_enabled (X86_FEATURE_OSPKE )) +if (cr4 &X86_CR4_PKE )printk ("%sPKRU: %08x\n" , log_lvl,read_pkru ()); }
Greg Kroah-Hartman
maintainerPATCH 112/186 rust: dont select CONSTRUCTORS
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice Ryhl <[email protected]>
commit 7d49f53af4b988b188d3932deac2c9c80fd7d9ce upstream.
This was originally part of commit 4b9a68f2e59a0 ("rust: add support for static synchronisation primitives") from the old Rust branch, which used module constructors to initialize globals containing various synchronisation primitives with pin-init. That commit has never been upstreamed, but the select CONSTRUCTORS statement ended up being included in the patch that initially added Rust support to the Linux Kernel.
We are not using module constructors, so let's remove the select.
--- init/Kconfig | 1 - 1 file changed, 1 deletion(-)
init/Kconfig +0 -1
@@ -1898,7 +1898,6 @@ config RUST depends on !GCC_PLUGINS depends on !RANDSTRUCT depends on !DEBUG_INFO_BTF || PAHOLE_HAS_LANG_EXCLUDE - select CONSTRUCTORS help Enables Rust support in the kernel.
Greg Kroah-Hartman
maintainerPATCH 113/186 rust: init: remove impl Zeroable for Infallible
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laine Taffin Altman <[email protected]>
commit 49ceae68a0df9a92617a61e9ce8a0efcf6419585 upstream.
In Rust, producing an invalid value of any type is immediate undefined behavior (UB); this includes via zeroing memory. Therefore, since an uninhabited type has no valid values, producing any values at all for it is UB.
The Rust standard library type core::convert::Infallible is uninhabited, by virtue of having been declared as an enum with no cases, which always produces uninhabited types in Rust.
The current kernel code allows this UB to be triggered, for example by code like Box::<core::convert::Infallible>::init(kernel::init::zeroed()).
Thus, remove the implementation of Zeroable for Infallible, thereby avoiding the unsoundness (potential for future UB).
--- rust/kernel/init.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
rust/kernel/init.rs +9 -2
@@ -1292,8 +1292,15 @@ impl_zeroable! { i8, i16, i32, i64, i128, isize, f32, f64, -// SAFETY: These are ZSTs, there is nothing to zero. - {<T: ?Sized>} PhantomData<T>, core::marker::PhantomPinned, Infallible, (), +// Note: do not add uninhabited types (such as `!` or `core::convert::Infallible`) to this list; +// creating an instance of an uninhabited type is immediate undefined behavior. For more on +// uninhabited/empty types, consult The Rustonomicon: +// <https://doc.rust-lang.org/stable/nomicon/exotic-sizes.html#empty-types>. The Rust Reference +// also has information on undefined behavior: +// <https://doc.rust-lang.org/stable/reference/behavior-considered-undefined.html>. +// +// SAFETY: These are inhabited ZSTs; there is nothing to zero and a valid value exists. + {<T: ?Sized>} PhantomData<T>, core::marker::PhantomPinned, (),// SAFETY: Type is allowed to take any value, including all zeros. {<T>} MaybeUninit<T>,
Greg Kroah-Hartman
maintainerPATCH 114/186 rust: make mutually exclusive with CFI_CLANG
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Conor Dooley <[email protected]>
commit 8933cf4651e02853ca679be7b2d978dfcdcc5e0c upstream.
On RISC-V and arm64, and presumably x86, if CFI_CLANG is enabled, loading a rust module will trigger a kernel panic. Support for sanitisers, including kcfi (CFI_CLANG), is in the works, but for now they're nightly-only options in rustc. Make RUST depend on !CFI_CLANG to prevent configuring a kernel without symmetrical support for kfi.
[ Matthew Maurer writes [1]:
This patch is fine by me - the last patch needed for KCFI to be functional in Rust just landed upstream last night, so we should revisit this (in the form of enabling it) once we move to rustc-1.79.0 or later.
Ramon de C Valle also gave feedback [2] on the status of KCFI for
Rust and created a tracking issue [3] in upstream Rust. - Miguel ]
--- init/Kconfig | 1 + 1 file changed, 1 insertion(+)
init/Kconfig +1 -0
@@ -1894,6 +1894,7 @@ config RUST bool "Rust support" depends on HAVE_RUST depends on RUST_IS_AVAILABLE + depends on !CFI_CLANG depends on !MODVERSIONS depends on !GCC_PLUGINS depends on !RANDSTRUCT
Greg Kroah-Hartman
maintainerPATCH 115/186 kbuild: rust: remove unneeded `@rustc_cfg` to avoid ICE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miguel Ojeda <[email protected]>
commit 50cfe93b01475ba36878b65d35d812e1bb48ac71 upstream.
When KUnit tests are enabled, under very big kernel configurations (e.g. allyesconfig), we can trigger a rustdoc ICE [1]:
RUSTDOC TK rust/kernel/lib.rs
error: the compiler unexpectedly panicked. this is a bug.
The reason is that this build step has a duplicated @rustc_cfg argument, which contains the kernel configuration, and thus a lot of arguments. The factor 2 happens to be enough to reach the ICE.
Thus remove the unneeded @rustc_cfg. By doing so, we clean up the command and workaround the ICE.
The ICE has been fixed in the upcoming Rust 1.79 [2].
--- rust/Makefile | 1 - 1 file changed, 1 deletion(-)
rust/Makefile +0 -1
@@ -173,7 +173,6 @@ quiet_cmd_rustdoc_test_kernel = RUSTDOC mkdir -p $(objtree)/$(obj)/test/doctests/kernel; \ OBJTREE=$(abspath $(objtree)) \ $(RUSTDOC) --test $(rust_flags) \ - @$(objtree)/include/generated/rustc_cfg \ -L$(objtree)/$(obj) --extern alloc --extern kernel \ --extern build_error --extern macros \ --extern bindings --extern uapi \
Greg Kroah-Hartman
maintainerPATCH 116/186 kbuild: rust: force `alloc` extern to allow "empty" Rust files
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miguel Ojeda <[email protected]>
commit ded103c7eb23753f22597afa500a7c1ad34116ba upstream.
If one attempts to build an essentially empty file somewhere in the kernel tree, it leads to a build error because the compiler does not recognize the new_uninit unstable feature:
error[E0635]: unknown feature `new_uninit`
--> <crate attribute>:1:9
|
1 | feature(new_uninit)
| ^^^^^^^^^^The reason is that we pass -Zcrate-attr='feature(new_uninit)' (together with -Zallow-features=new_uninit) to let non-rust/ code use that unstable feature.
However, the compiler only recognizes the feature if the alloc crate is resolved (the feature is an alloc one). --extern alloc, which we pass, is not enough to resolve the crate.
Introducing a reference like use alloc; or extern crate alloc; solves the issue, thus this is not seen in normal files. For instance, useing the kernel prelude introduces such a reference, since alloc is used inside.
While normal use of the build system is not impacted by this, it can still be fairly confusing for kernel developers [1], thus use the unstable force option of --extern [2] (added in Rust 1.71 [3]) to force the compiler to resolve alloc.
This new unstable feature is only needed meanwhile we use the other unstable feature, since then we will not need -Zcrate-attr.
--- scripts/Makefile.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/Makefile.build +1 -1
@@ -272,7 +272,7 @@ rust_common_cmd = \ -Zallow-features=$(rust_allowed_features) \ -Zcrate-attr=no_std \ -Zcrate-attr='feature($(rust_allowed_features))' \ - --extern alloc --extern kernel \ + -Zunstable-options --extern force:alloc --extern kernel \ --crate-type rlib -L $(objtree)/rust/ \ --crate-name $(basename $(notdir $@)) \ --out-dir $(dir $@) --emit=dep-info=$(depfile)
Greg Kroah-Hartman
maintainerPATCH 117/186 rust: remove `params` from `module` macro example
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aswin Unnikrishnan <[email protected]>
commit 19843452dca40e28d6d3f4793d998b681d505c7f upstream.
Remove argument params from the module macro example, because the macro does not currently support module parameters since it was not sent with the initial merge.
--- rust/macros/lib.rs | 12 ------------ 1 file changed, 12 deletions(-)
rust/macros/lib.rs +0 -12
@@ -35,18 +35,6 @@ use proc_macro::TokenStream;/// author: "Rust for Linux Contributors", /// description: "My very own kernel module!", /// license: "GPL", -/// params: { -/// my_i32: i32 { -/// default: 42, -/// permissions: 0o000, -/// description: "Example of i32", -/// }, -/// writeable_i32: i32 { -/// default: 42, -/// permissions: 0o644, -/// description: "Example of i32", -/// }, -/// }, /// } /// /// struct MyModule;
Greg Kroah-Hartman
maintainerPATCH 118/186 Bluetooth: Fix type of len in {l2cap,sco}_sock_getsockopt_old()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nathan Chancellor <[email protected]>
commit 9bf4e919ccad613b3596eebf1ff37b05b6405307 upstream.
After an innocuous optimization change in LLVM main (19.0.0), x86_64 allmodconfig (which enables CONFIG_KCSAN / -fsanitize=thread) fails to build due to the checks in check_copy_size():
In file included from net/bluetooth/sco.c:27:
In file included from include/linux/module.h:13:
In file included from include/linux/stat.h:19:
In file included from include/linux/time.h:60:
In file included from include/linux/time32.h:13:
In file included from include/linux/timex.h:67:
In file included from arch/x86/include/asm/timex.h:6:
In file included from arch/x86/include/asm/tsc.h:10:
In file included from arch/x86/include/asm/msr.h:15:
In file included from include/linux/percpu.h:7:
In file included from include/linux/smp.h:118:
include/linux/thread_info.h:244:4: error: call to '__bad_copy_from' declared with 'error' attribute: copy source size is too small
244 | __bad_copy_from();
| ^The same exact error occurs in l2cap_sock.c. The copy_to_user() statements that are failing come from l2cap_sock_getsockopt_old() and sco_sock_getsockopt_old(). This does not occur with GCC with or without KCSAN or Clang without KCSAN enabled.
len is defined as an 'int' because it is assigned from '__user int *optlen'. However, it is clamped against the result of sizeof(), which has a type of 'size_t' ('unsigned long' for 64-bit platforms). This is done with min_t() because min() requires compatible types, which results in both len and the result of sizeof() being casted to 'unsigned int', meaning len changes signs and the result of sizeof() is truncated. From there, len is passed to copy_to_user(), which has a third parameter type of 'unsigned long', so it is widened and changes signs again. This excessive casting in combination with the KCSAN instrumentation causes LLVM to fail to eliminate the __bad_copy_from() call, failing the build.
The official recommendation from LLVM developers is to consistently use long types for all size variables to avoid the unnecessary casting in the first place. Change the type of len to size_t in both l2cap_sock_getsockopt_old() and sco_sock_getsockopt_old(). This clears up the error while allowing min_t() to be replaced with min(), resulting in simpler code with no casts and fewer implicit conversions. While len is a different type than optlen now, it should result in no functional change because the result of sizeof() will clamp all values of optlen in the same manner as before.
--- net/bluetooth/l2cap_sock.c | 7 ++++--- net/bluetooth/sco.c | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-)
net/bluetooth/l2cap_sock.c +4 -3
@@ -438,7 +438,8 @@ static int l2cap_sock_getsockopt_old(strstruct l2cap_chan *chan =l2cap_pi (sk)->chan;struct l2cap_options opts;struct l2cap_conninfo cinfo; -int len, err =0 ; +int err =0 ; +size_t len;u32 opt;BT_DBG ("sk %p" , sk);
@@ -485,7 +486,7 @@ static int l2cap_sock_getsockopt_old(strBT_DBG ("mode 0x%2.2x" , chan->mode); - len = min_t(unsigned int, len, sizeof(opts)); + len =min (len,sizeof (opts));if (copy_to_user (optval, (char *) &opts, len)) err = -EFAULT ;
@@ -535,7 +536,7 @@ static int l2cap_sock_getsockopt_old(str cinfo.hci_handle = chan->conn->hcon->handle;memcpy (cinfo.dev_class, chan->conn->hcon->dev_class,3 ); - len = min_t(unsigned int, len, sizeof(cinfo)); + len =min (len,sizeof (cinfo));if (copy_to_user (optval, (char *) &cinfo, len)) err = -EFAULT ;
net/bluetooth/sco.c +4 -3
@@ -963,7 +963,8 @@ static int sco_sock_getsockopt_old(strucstruct sock *sk = sock->sk;struct sco_options opts;struct sco_conninfo cinfo; -int len, err =0 ; +int err =0 ; +size_t len;BT_DBG ("sk %p" , sk);
@@ -985,7 +986,7 @@ static int sco_sock_getsockopt_old(strucBT_DBG ("mtu %u" , opts.mtu); - len = min_t(unsigned int, len, sizeof(opts)); + len =min (len,sizeof (opts));if (copy_to_user (optval, (char *)&opts, len)) err = -EFAULT ;
@@ -1003,7 +1004,7 @@ static int sco_sock_getsockopt_old(struc cinfo.hci_handle =sco_pi (sk)->conn->hcon->handle;memcpy (cinfo.dev_class,sco_pi (sk)->conn->hcon->dev_class,3 ); - len = min_t(unsigned int, len, sizeof(cinfo)); + len =min (len,sizeof (cinfo));if (copy_to_user (optval, (char *)&cinfo, len)) err = -EFAULT ;
Greg Kroah-Hartman
maintainerPATCH 119/186 Bluetooth: btusb: Add Realtek RTL8852BE support ID 0x0bda:0x4853
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: WangYuli <[email protected]>
commit d1a5a7eede2977da3d2002d5ea3b519019cc1a98 upstream.
Add the support ID(0x0bda, 0x4853) to usb_device_id table for Realtek RTL8852BE.
Without this change the device utilizes an obsolete version of the firmware that is encoded in it rather than the updated Realtek firmware and config files from the firmware directory. The latter files implement many new features.
The device table is as follows:
T: Bus=03 Lev=01 Prnt=01 Port=09 Cnt=03 Dev#= 4 Spd=12 MxCh= 0
D: Ver= 1.00 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=0bda ProdID=4853 Rev= 0.00
S: Manufacturer=Realtek
S: Product=Bluetooth Radio
S: SerialNumber=00e04c000001
C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms
I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms
I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms
I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms
I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms
I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -541,6 +541,8 @@ static const struct usb_device_id quirks/* Realtek 8852BE Bluetooth devices */ { USB_DEVICE(0x0cb8, 0xc559), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x0bda, 0x4853), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0bda, 0x887b), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0bda, 0xb85b), .driver_info = BTUSB_REALTEK |
Greg Kroah-Hartman
maintainerPATCH 120/186 Bluetooth: qca: fix NULL-deref on non-serdev suspend
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 73e87c0a49fda31d7b589edccf4c72e924411371 upstream.
Qualcomm ROME controllers can be registered from the Bluetooth line discipline and in this case the HCI UART serdev pointer is NULL.
Add the missing sanity check to prevent a NULL-pointer dereference when wakeup() is called for a non-serdev controller during suspend.
Just return true for now to restore the original behaviour and address the crash with pre-6.2 kernels, which do not have commit e9b3e5b8c657 ("Bluetooth: hci_qca: only assign wakeup with serial port support") that causes the crash to happen already at setup() time.
--- drivers/bluetooth/hci_qca.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/bluetooth/hci_qca.c +3 -0
@@ -1672,6 +1672,9 @@ static bool qca_wakeup(struct hci_dev *hstruct hci_uart *hu =hci_get_drvdata (hdev);bool wakeup; +if (!hu->serdev) +return true; +/* BT SoC attached through the serial bus is handled by the serdev driver. * So we need to use the device handle of the serdev driver to get the * status of device may wakeup.
Greg Kroah-Hartman
maintainerPATCH 121/186 Bluetooth: qca: fix NULL-deref on non-serdev setup
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 7ddb9de6af0f1c71147785b12fd7c8ec3f06cc86 upstream.
Qualcomm ROME controllers can be registered from the Bluetooth line discipline and in this case the HCI UART serdev pointer is NULL.
Add the missing sanity check to prevent a NULL-pointer dereference when setup() is called for a non-serdev controller.
--- drivers/bluetooth/hci_qca.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/bluetooth/hci_qca.c +4 -2
@@ -1938,8 +1938,10 @@ retry:qca_debugfs_init (hdev); hu->hdev->hw_error = qca_hw_error; hu->hdev->cmd_timeout = qca_cmd_timeout; -if (device_can_wakeup (hu->serdev->ctrl->dev.parent)) - hu->hdev->wakeup = qca_wakeup; +if (hu->serdev) { +if (device_can_wakeup (hu->serdev->ctrl->dev.parent)) + hu->hdev->wakeup = qca_wakeup; + } }else if (ret == -ENOENT ) {/* No patch/nvm-config found, run with original fw/config */ set_bit (QCA_ROM_FW , &qca->flags);
Greg Kroah-Hartman
maintainerPATCH 122/186 mtd: rawnand: qcom: Fix broken OP_RESET_DEVICE command in qcom_misc_cmd_type_exec()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Marangi <[email protected]>
commit b61bb5bc2c1cd00bb53db42f705735db6e8700f0 upstream.
While migrating to exec_ops in commit a82990c8a409 ("mtd: rawnand: qcom:
Add read/read_start ops in exec_op path"), OP_RESET_DEVICE command handling got broken unintentionally. Right now for the OP_RESET_DEVICE command, qcom_misc_cmd_type_exec() will simply return 0 without handling it. Even, if that gets fixed, an unnecessary FLASH_STATUS read descriptor command is being added in the middle and that seems to be causing the command to fail on IPQ806x devices.
So let's fix the above two issues to make OP_RESET_DEVICE command working again.
--- drivers/mtd/nand/raw/qcom_nandc.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/mtd/nand/raw/qcom_nandc.c +3 -4
@@ -2815,7 +2815,7 @@ static int qcom_misc_cmd_type_exec(struct nand_chip *chip, const struct nand_sub host->cfg0_raw & ~(7 << CW_PER_PAGE));nandc_set_reg (chip,NAND_DEV0_CFG1 , host->cfg1_raw); instrs =3 ; - }else { + }else if (q_op.cmd_reg !=OP_RESET_DEVICE ) {return 0 ; }
@@ -2830,9 +2830,8 @@ static int qcom_misc_cmd_type_exec(struct nand_chip *chip, const struct nand_subnandc_set_reg (chip,NAND_EXEC_CMD ,1 );write_reg_dma (nandc,NAND_FLASH_CMD , instrs,NAND_BAM_NEXT_SGL ); - (q_op.cmd_reg ==OP_BLOCK_ERASE ) ?write_reg_dma (nandc,NAND_DEV0_CFG0 , -2 ,NAND_BAM_NEXT_SGL ) :read_reg_dma (nandc, -NAND_FLASH_STATUS ,1 ,NAND_BAM_NEXT_SGL ); +if (q_op.cmd_reg ==OP_BLOCK_ERASE ) +write_reg_dma (nandc,NAND_DEV0_CFG0 ,2 ,NAND_BAM_NEXT_SGL );write_reg_dma (nandc,NAND_EXEC_CMD ,1 ,NAND_BAM_NEXT_SGL );read_reg_dma (nandc,NAND_FLASH_STATUS ,1 ,NAND_BAM_NEXT_SGL );
Signature · 1 line
2.44.0
Greg Kroah-Hartman
maintainerPATCH 123/186 mm/hugetlb: fix missing hugetlb_lock for resv uncharge
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Xu <[email protected]>
commit b76b46902c2d0395488c8412e1116c2486cdfcb2 upstream.
There is a recent report on UFFDIO_COPY over hugetlb:
https://lore.kernel.org/all/[email protected]/
350: lockdep_assert_held(&hugetlb_lock);
Should be an issue in hugetlb but triggered in an userfault context, where it goes into the unlikely path where two threads modifying the resv map together. Mike has a fix in that path for resv uncharge but it looks like the locking criteria was overlooked: hugetlb_cgroup_uncharge_folio_rsvd() will update the cgroup pointer, so it requires to be called with the lock held.
--- mm/hugetlb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
mm/hugetlb.c +4 -1
@@ -3153,9 +3153,12 @@ struct folio *alloc_hugetlb_folio(struct rsv_adjust =hugepage_subpool_put_pages (spool,1 );hugetlb_acct_memory (h, -rsv_adjust); -if (deferred_reserve) +if (deferred_reserve) { +spin_lock_irq (&hugetlb_lock);hugetlb_cgroup_uncharge_folio_rsvd (hstate_index (h),pages_per_huge_page (h), folio); +spin_unlock_irq (&hugetlb_lock); + } }return folio;
Greg Kroah-Hartman
maintainerPATCH 124/186 mmc: sdhci-msm: pervent access to suspended controller
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mantas Pucka <[email protected]>
commit f8def10f73a516b771051a2f70f2f0446902cb4f upstream.
Generic sdhci code registers LED device and uses host->runtime_suspended flag to protect access to it. The sdhci-msm driver doesn't set this flag, which causes a crash when LED is accessed while controller is runtime suspended. Fix this by setting the flag correctly.
--- drivers/mmc/host/sdhci-msm.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
drivers/mmc/host/sdhci-msm.c +15 -1
@@ -2694,6 +2694,11 @@ static __maybe_unused int sdhci_msm_runtstruct sdhci_host *host =dev_get_drvdata (dev);struct sdhci_pltfm_host *pltfm_host =sdhci_priv (host);struct sdhci_msm_host *msm_host =sdhci_pltfm_priv (pltfm_host); +unsigned long flags; + +spin_lock_irqsave (&host->lock, flags); + host->runtime_suspended = true; +spin_unlock_irqrestore (&host->lock, flags);/* Drop the performance vote */ dev_pm_opp_set_rate (dev,0 );
@@ -2708,6 +2713,7 @@ static __maybe_unused int sdhci_msm_runtstruct sdhci_host *host =dev_get_drvdata (dev);struct sdhci_pltfm_host *pltfm_host =sdhci_priv (host);struct sdhci_msm_host *msm_host =sdhci_pltfm_priv (pltfm_host); +unsigned long flags;int ret; ret = clk_bulk_prepare_enable(ARRAY_SIZE(msm_host->bulk_clks),
@@ -2726,7 +2732,15 @@ static __maybe_unused int sdhci_msm_runtdev_pm_opp_set_rate (dev, msm_host->clk_rate); -return sdhci_msm_ice_resume (msm_host); + ret =sdhci_msm_ice_resume (msm_host); +if (ret) +return ret; + +spin_lock_irqsave (&host->lock, flags); + host->runtime_suspended = false; +spin_unlock_irqrestore (&host->lock, flags); + +return ret; }static const struct dev_pm_ops sdhci_msm_pm_ops = {
Greg Kroah-Hartman
maintainerPATCH 125/186 mm: create FOLIO_FLAG_FALSE and FOLIO_TYPE_OPS macros
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox (Oracle) <[email protected]>
commit 12bbaae7635a56049779db3bef6e7140d9aa5f67 upstream.
Following the separation of FOLIO_FLAGS from PAGEFLAGS, separate FOLIO_FLAG_FALSE from PAGEFLAG_FALSE and FOLIO_TYPE_OPS from PAGE_TYPE_OPS.
--- include/linux/page-flags.h | 70 ++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 23 deletions(-)
include/linux/page-flags.h +47 -23
@@ -432,30 +432,51 @@ static __always_inline int TestClearPage TESTSETFLAG(uname, lname, policy) \ TESTCLEARFLAG(uname, lname, policy) +#define FOLIO_TEST_FLAG_FALSE (name) \ +static inline bool folio_test_##name(const struct folio *folio) \ +{ return false; } +#define FOLIO_SET_FLAG_NOOP (name) \ +static inline void folio_set_##name(struct folio *folio) { } +#define FOLIO_CLEAR_FLAG_NOOP (name) \ +static inline void folio_clear_##name(struct folio *folio) { } +#define __FOLIO_SET_FLAG_NOOP (name) \ +static inline void __folio_set_##name(struct folio *folio) { } +#define __FOLIO_CLEAR_FLAG_NOOP (name) \ +static inline void __folio_clear_##name(struct folio *folio) { } +#define FOLIO_TEST_SET_FLAG_FALSE (name) \ +static inline bool folio_test_set_##name(struct folio *folio) \ +{ return false; } +#define FOLIO_TEST_CLEAR_FLAG_FALSE (name) \ +static inline bool folio_test_clear_##name(struct folio *folio) \ +{ return false; } + +#define FOLIO_FLAG_FALSE (name) \ +FOLIO_TEST_FLAG_FALSE(name) \ +FOLIO_SET_FLAG_NOOP(name) \ +FOLIO_CLEAR_FLAG_NOOP(name) +#define TESTPAGEFLAG_FALSE (uname, lname) \ -static inline bool folio_test_##lname(const struct folio *folio) { return false; } \ +FOLIO_TEST_FLAG_FALSE(lname) \ static inline int Page##uname(const struct page *page) { return 0; }#define SETPAGEFLAG_NOOP (uname, lname) \ -static inline void folio_set_##lname(struct folio *folio) { } \ +FOLIO_SET_FLAG_NOOP(lname) \ static inline void SetPage##uname(struct page *page) { }#define CLEARPAGEFLAG_NOOP (uname, lname) \ -static inline void folio_clear_##lname(struct folio *folio) { } \ +FOLIO_CLEAR_FLAG_NOOP(lname) \ static inline void ClearPage##uname(struct page *page) { }#define __CLEARPAGEFLAG_NOOP (uname, lname) \ -static inline void __folio_clear_##lname(struct folio *folio) { } \ +__FOLIO_CLEAR_FLAG_NOOP(lname) \ static inline void __ClearPage##uname(struct page *page) { }#define TESTSETFLAG_FALSE (uname, lname) \ -static inline bool folio_test_set_##lname(struct folio *folio) \ -{ return 0; } \ +FOLIO_TEST_SET_FLAG_FALSE(lname) \ static inline int TestSetPage##uname(struct page *page) { return 0; }#define TESTCLEARFLAG_FALSE (uname, lname) \ -static inline bool folio_test_clear_##lname(struct folio *folio) \ -{ return 0; } \ +FOLIO_TEST_CLEAR_FLAG_FALSE(lname) \ static inline int TestClearPage##uname(struct page *page) { return 0; }#define PAGEFLAG_FALSE (uname, lname) TESTPAGEFLAG_FALSE(uname, lname) \
@@ -937,35 +958,38 @@ static inline int page_has_type(struct preturn page_type_has_type (page->page_type); } +#define FOLIO_TYPE_OPS (lname, fname) \ +static __always_inline bool folio_test_##fname(const struct folio *folio)\ +{ \ + return folio_test_type(folio, PG_##lname); \ +} \ +static __always_inline void __folio_set_##fname(struct folio *folio) \ +{ \ + VM_BUG_ON_FOLIO(!folio_test_type(folio, 0), folio); \ + folio->page.page_type &= ~PG_##lname; \ +} \ +static __always_inline void __folio_clear_##fname(struct folio *folio) \ +{ \ + VM_BUG_ON_FOLIO(!folio_test_##fname(folio), folio); \ + folio->page.page_type |= PG_##lname; \ +} +#define PAGE_TYPE_OPS (uname, lname, fname) \ +FOLIO_TYPE_OPS(lname, fname) \ static __always_inline int Page##uname(const struct page *page) \ { \ return PageType(page, PG_##lname); \ } \ -static __always_inline int folio_test_##fname(const struct folio *folio)\ -{ \ - return folio_test_type(folio, PG_##lname); \ -} \ static __always_inline void __SetPage##uname(struct page *page) \ { \ VM_BUG_ON_PAGE(!PageType(page, 0), page); \ page->page_type &= ~PG_##lname; \ } \ -static __always_inline void __folio_set_##fname(struct folio *folio) \ -{ \ - VM_BUG_ON_FOLIO(!folio_test_type(folio, 0), folio); \ - folio->page.page_type &= ~PG_##lname; \ -} \ static __always_inline void __ClearPage##uname(struct page *page) \ { \ VM_BUG_ON_PAGE(!Page##uname(page), page); \ page->page_type |= PG_##lname; \ -} \ -static __always_inline void __folio_clear_##fname(struct folio *folio) \ -{ \ - VM_BUG_ON_FOLIO(!folio_test_##fname(folio), folio); \ - folio->page.page_type |= PG_##lname; \ -} \ +}/* * PageBuddy() indicates that the page is free and in the buddy system
Greg Kroah-Hartman
maintainerPATCH 126/186 mm: support page_mapcount() on page_has_type() pages
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox (Oracle) <[email protected]>
commit fd1a745ce03e37945674c14833870a9af0882e2d upstream.
Return 0 for pages which can't be mapped. This matches how page_mapped() works. It is more convenient for users to not have to filter out these pages.
--- fs/proc/page.c | 7 ++----- include/linux/mm.h | 8 +++++--- include/linux/page-flags.h | 4 ++-- 3 files changed, 9 insertions(+), 10 deletions(-)
fs/proc/page.c +2 -5
@@ -67,7 +67,7 @@ static ssize_t kpagecount_read(struct fi*/ ppage =pfn_to_online_page (pfn); -if (!ppage ||PageSlab (ppage) ||page_has_type (ppage)) +if (!ppage) pcount =0 ;else pcount =page_mapcount (ppage);
@@ -124,11 +124,8 @@ u64 stable_page_flags(struct page *page)/* * pseudo flags for the well known (anonymous) memory mapped pages -* -* Note that page->_mapcount is overloaded in SLAB, so the -* simple test in page_mapped() is not enough. */ -if (!PageSlab (page) &&page_mapped (page)) +if (page_mapped (page)) u |=1 <<KPF_MMAP ;if (PageAnon (page)) u |=1 <<KPF_ANON ;
include/linux/mm.h +5 -3
@@ -1184,14 +1184,16 @@ static inline void page_mapcount_reset(s* a large folio, it includes the number of times this page is mapped * as part of that folio. * -* The result is undefined for pages which cannot be mapped into userspace. -* For example SLAB or special types of pages. See function page_has_type(). -* They use this field in struct page differently. +* Will report 0 for pages which cannot be mapped into userspace, eg +* slab, page tables and similar. */ static inline int page_mapcount (struct page *page) {int mapcount =atomic_read (&page->_mapcount) +1 ; +/* Handle page_has_type() pages */ +if (mapcount <0 ) + mapcount =0 ;if (unlikely (PageCompound (page))) mapcount +=folio_entire_mapcount (page_folio (page));
include/linux/page-flags.h +2 -2
@@ -931,12 +931,12 @@ static inline bool is_page_hwpoison(stru* page_type may be used. Because it is initialised to -1, we invert the * sense of the bit, so __SetPageFoo *clears* the bit used for PageFoo, and * __ClearPageFoo *sets* the bit used for PageFoo. We reserve a few high and -* low bits so that an underflow or overflow of page_mapcount() won't be +* low bits so that an underflow or overflow of _mapcount won't be * mistaken for a page type value. */ #define PAGE_TYPE_BASE 0xf0000000 -/* Reserve 0x0000007f to catch underflows of page_mapcount */ +/* Reserve 0x0000007f to catch underflows of _mapcount */ #define PAGE_MAPCOUNT_RESERVE -128#define PG_buddy 0x00000080#define PG_offline 0x00000100
Greg Kroah-Hartman
maintainerPATCH 127/186 smb: client: Fix struct_group() usage in __packed structs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
commit 9a1f1d04f63c59550a5364858b46eeffdf03e8d6 upstream.
Use struct_group_attr() in __packed structs, instead of struct_group().
Below you can see the pahole output before/after changes:
pahole -C smb2_file_network_open_info fs/smb/client/smb2ops.o struct smb2_file_network_open_info {
union {
struct {
__le64 CreationTime; /* 0 8 */
__le64 LastAccessTime; /* 8 8 */
__le64 LastWriteTime; /* 16 8 */
__le64 ChangeTime; /* 24 8 */
__le64 AllocationSize; /* 32 8 */
__le64 EndOfFile; /* 40 8 */
__le32 Attributes; /* 48 4 */
}; /* 0 56 */
struct {
__le64 CreationTime; /* 0 8 */
__le64 LastAccessTime; /* 8 8 */
__le64 LastWriteTime; /* 16 8 */
__le64 ChangeTime; /* 24 8 */
__le64 AllocationSize; /* 32 8 */
__le64 EndOfFile; /* 40 8 */
__le32 Attributes; /* 48 4 */
} network_open_info; /* 0 56 */
}; /* 0 56 */
__le32 Reserved; /* 56 4 */
/* size: 60, cachelines: 1, members: 2 */ /* last cacheline: 60 bytes */
} __attribute__((__packed__));
pahole -C smb2_file_network_open_info fs/smb/client/smb2ops.o struct smb2_file_network_open_info {
union {
struct {
__le64 CreationTime; /* 0 8 */
__le64 LastAccessTime; /* 8 8 */
__le64 LastWriteTime; /* 16 8 */
__le64 ChangeTime; /* 24 8 */
__le64 AllocationSize; /* 32 8 */
__le64 EndOfFile; /* 40 8 */
__le32 Attributes; /* 48 4 */
} __attribute__((__packed__)); /* 0 52 */
struct {
__le64 CreationTime; /* 0 8 */
__le64 LastAccessTime; /* 8 8 */
__le64 LastWriteTime; /* 16 8 */
__le64 ChangeTime; /* 24 8 */
__le64 AllocationSize; /* 32 8 */
__le64 EndOfFile; /* 40 8 */
__le32 Attributes; /* 48 4 */
} __attribute__((__packed__)) network_open_info; /* 0 52 */
}; /* 0 52 */
__le32 Reserved; /* 52 4 */
/* size: 56, cachelines: 1, members: 2 */ /* last cacheline: 56 bytes */
};
pahole -C smb_com_open_rsp fs/smb/client/cifssmb.o
struct smb_com_open_rsp {
...
union {
struct {
__le64 CreationTime; /* 48 8 */
__le64 LastAccessTime; /* 56 8 */
/* --- cacheline 1 boundary (64 bytes) --- */
__le64 LastWriteTime; /* 64 8 */
__le64 ChangeTime; /* 72 8 */
__le32 FileAttributes; /* 80 4 */
}; /* 48 40 */
struct {
__le64 CreationTime; /* 48 8 */
__le64 LastAccessTime; /* 56 8 */
/* --- cacheline 1 boundary (64 bytes) --- */
__le64 LastWriteTime; /* 64 8 */
__le64 ChangeTime; /* 72 8 */
__le32 FileAttributes; /* 80 4 */
} common_attributes; /* 48 40 */
}; /* 48 40 */
...
/* size: 111, cachelines: 2, members: 14 */
/* last cacheline: 47 bytes */
} __attribute__((__packed__));pahole -C smb_com_open_rsp fs/smb/client/cifssmb.o
struct smb_com_open_rsp {
...
union {
struct {
__le64 CreationTime; /* 48 8 */
__le64 LastAccessTime; /* 56 8 */
/* --- cacheline 1 boundary (64 bytes) --- */
__le64 LastWriteTime; /* 64 8 */
__le64 ChangeTime; /* 72 8 */
__le32 FileAttributes; /* 80 4 */
} __attribute__((__packed__)); /* 48 36 */
struct {
__le64 CreationTime; /* 48 8 */
__le64 LastAccessTime; /* 56 8 */
/* --- cacheline 1 boundary (64 bytes) --- */
__le64 LastWriteTime; /* 64 8 */
__le64 ChangeTime; /* 72 8 */
__le32 FileAttributes; /* 80 4 */
} __attribute__((__packed__)) common_attributes; /* 48 36 */
}; /* 48 36 */
...
/* size: 107, cachelines: 2, members: 14 */
/* last cacheline: 43 bytes */
} __attribute__((__packed__));pahole -C FILE_ALL_INFO fs/smb/client/cifssmb.o typedef struct {
union {
struct {
__le64 CreationTime; /* 0 8 */
__le64 LastAccessTime; /* 8 8 */
__le64 LastWriteTime; /* 16 8 */
__le64 ChangeTime; /* 24 8 */
__le32 Attributes; /* 32 4 */
}; /* 0 40 */
struct {
__le64 CreationTime; /* 0 8 */
__le64 LastAccessTime; /* 8 8 */
__le64 LastWriteTime; /* 16 8 */
__le64 ChangeTime; /* 24 8 */
__le32 Attributes; /* 32 4 */
} common_attributes; /* 0 40 */
}; /* 0 40 */
...
/* size: 113, cachelines: 2, members: 17 */ /* last cacheline: 49 bytes */
} __attribute__((__packed__)) FILE_ALL_INFO;
pahole -C FILE_ALL_INFO fs/smb/client/cifssmb.o typedef struct {
union {
struct {
__le64 CreationTime; /* 0 8 */
__le64 LastAccessTime; /* 8 8 */
__le64 LastWriteTime; /* 16 8 */
__le64 ChangeTime; /* 24 8 */
__le32 Attributes; /* 32 4 */
} __attribute__((__packed__)); /* 0 36 */
struct {
__le64 CreationTime; /* 0 8 */
__le64 LastAccessTime; /* 8 8 */
__le64 LastWriteTime; /* 16 8 */
__le64 ChangeTime; /* 24 8 */
__le32 Attributes; /* 32 4 */
} __attribute__((__packed__)) common_attributes; /* 0 36 */
}; /* 0 36 */
...
/* size: 109, cachelines: 2, members: 17 */ /* last cacheline: 45 bytes */
} __attribute__((__packed__)) FILE_ALL_INFO;
--- fs/smb/client/cifspdu.h | 4 ++-- fs/smb/client/smb2pdu.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
fs/smb/client/cifspdu.h +2 -2
@@ -882,7 +882,7 @@ typedef struct smb_com_open_rsp {__u8 OplockLevel;__u16 Fid;__le32 CreateAction; - struct_group(common_attributes, + struct_group_attr(common_attributes, __packed, __le64 CreationTime; __le64 LastAccessTime; __le64 LastWriteTime;
@@ -2266,7 +2266,7 @@ typedef struct {/* QueryFileInfo/QueryPathinfo (also for SetPath/SetFile) data buffer formats */ /******************************************************************************/ typedef struct { /* data block encoding of response to level 263 QPathInfo */ - struct_group(common_attributes, + struct_group_attr(common_attributes, __packed, __le64 CreationTime; __le64 LastAccessTime; __le64 LastWriteTime;
fs/smb/client/smb2pdu.h +1 -1
@@ -319,7 +319,7 @@ struct smb2_file_reparse_point_info { } __packed;struct smb2_file_network_open_info { - struct_group(network_open_info, + struct_group_attr(network_open_info, __packed, __le64 CreationTime;__le64 LastAccessTime;__le64 LastWriteTime;
Greg Kroah-Hartman
maintainerPATCH 128/186 smb3: missing lock when picking channel
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steve French <[email protected]>
commit 8094a600245e9b28eb36a13036f202ad67c1f887 upstream.
Coverity spotted a place where we should have been holding the channel lock when accessing the ses channel index.
Addresses-Coverity: 1582039 ("Data race condition (MISSING_LOCK)")
--- fs/smb/client/transport.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/smb/client/transport.c +3 -1
@@ -1057,9 +1057,11 @@ struct TCP_Server_Info *cifs_pick_channe index = (uint )atomic_inc_return (&ses->chan_seq); index %= ses->chan_count; } + + server = ses->chans[index].server;spin_unlock (&ses->chan_lock); -return ses->chans[index].server; +return server; }int
Greg Kroah-Hartman
maintainerPATCH 129/186 smb3: fix lock ordering potential deadlock in cifs_sync_mid_result
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steve French <[email protected]>
commit 8861fd5180476f45f9e8853db154600469a0284f upstream.
Coverity spotted that the cifs_sync_mid_result function could deadlock
"Thread deadlock (ORDER_REVERSAL) lock_order: Calling spin_lock acquires lock TCP_Server_Info.srv_lock while holding lock TCP_Server_Info.mid_lock"
Addresses-Coverity: 1590401 ("Thread deadlock (ORDER_REVERSAL)")
--- fs/smb/client/transport.c | 3 +++ 1 file changed, 3 insertions(+)
fs/smb/client/transport.c +3 -0
@@ -909,12 +909,15 @@ cifs_sync_mid_result(struct mid_q_entrylist_del_init (&mid->qhead); mid->mid_flags |=MID_DELETED ; } +spin_unlock (&server->mid_lock);cifs_server_dbg (VFS ,"%s: invalid mid state mid=%llu state=%d\n" , __func__, mid->mid, mid->mid_state); rc = -EIO ; + goto sync_mid_done; }spin_unlock (&server->mid_lock); +sync_mid_done:release_mid (mid);return rc; }
Greg Kroah-Hartman
maintainerPATCH 130/186 HID: i2c-hid: remove I2C_HID_READ_PENDING flag to prevent lock-up
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nam Cao <[email protected]>
commit 9c0f59e47a90c54d0153f8ddc0f80d7a36207d0e upstream.
The flag I2C_HID_READ_PENDING is used to serialize I2C operations. However, this is not necessary, because I2C core already has its own locking for that.
More importantly, this flag can cause a lock-up: if the flag is set in i2c_hid_xfer() and an interrupt happens, the interrupt handler (i2c_hid_irq) will check this flag and return immediately without doing anything, then the interrupt handler will be invoked again in an infinite loop.
Since interrupt handler is an RT task, it takes over the CPU and the flag-clearing task never gets scheduled, thus we have a lock-up.
Delete this unnecessary flag.
--- drivers/hid/i2c-hid/i2c-hid-core.c | 9 --------- 1 file changed, 9 deletions(-)
drivers/hid/i2c-hid/i2c-hid-core.c +0 -9
@@ -64,7 +64,6 @@/* flags */ #define I2C_HID_STARTED 0#define I2C_HID_RESET_PENDING 1 -#define I2C_HID_READ_PENDING 2#define I2C_HID_PWR_ON 0x00#define I2C_HID_PWR_SLEEP 0x01
@@ -190,15 +189,10 @@ static int i2c_hid_xfer(struct i2c_hid * msgs[n].len = recv_len; msgs[n].buf = recv_buf; n++; - -set_bit (I2C_HID_READ_PENDING , &ihid->flags); } ret =i2c_transfer (client->adapter, msgs, n); -if (recv_len) -clear_bit (I2C_HID_READ_PENDING , &ihid->flags); -if (ret != n)return ret <0 ? ret : -EIO ;
@@ -566,9 +560,6 @@ static irqreturn_t i2c_hid_irq(int irq, {struct i2c_hid *ihid = dev_id; -if (test_bit (I2C_HID_READ_PENDING , &ihid->flags)) -return IRQ_HANDLED ; -i2c_hid_get_input (ihid);return IRQ_HANDLED ;
Greg Kroah-Hartman
maintainerPATCH 131/186 btrfs: fallback if compressed IO fails for ENOSPC
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sweet Tea Dorminy <[email protected]>
commit 131a821a243f89be312ced9e62ccc37b2cf3846c upstream.
In commit b4ccace878f4 ("btrfs: refactor submit_compressed_extents()"), if an async extent compressed but failed to find enough space, we changed from falling back to an uncompressed write to just failing the write altogether. The principle was that if there's not enough space to write the compressed version of the data, there can't possibly be enough space to write the larger, uncompressed version of the data.
However, this isn't necessarily true: due to fragmentation, there could be enough discontiguous free blocks to write the uncompressed version, but not enough contiguous free blocks to write the smaller but unsplittable compressed version.
This has occurred to an internal workload which relied on write()'s return value indicating there was space. While rare, it has happened a few times.
Thus, in order to prevent early ENOSPC, re-add a fallback to uncompressed writing.
--- fs/btrfs/inode.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
fs/btrfs/inode.c +6 -7
@@ -1134,13 +1134,13 @@ static void submit_one_async_extent(stru 0, *alloc_hint, &ins, 1, 1);if (ret) {/* -* Here we used to try again by going back to non-compressed -* path for ENOSPC. But we can't reserve space even for -* compressed size, how could it work for uncompressed size -* which requires larger size? So here we directly go error -* path. +* We can't reserve contiguous space for the compressed size. +* Unlikely, but it's possible that we could have enough +* non-contiguous space for the uncompressed size instead. So +* fall back to uncompressed. */ - goto out_free; +submit_uncompressed_range (inode, async_extent, locked_page); + goto done; }/* Here we're doing allocation and writeback of the compressed pages */
@@ -1192,7 +1192,6 @@ done: out_free_reserve:btrfs_dec_block_group_reservations (fs_info, ins.objectid);btrfs_free_reserved_extent (fs_info, ins.objectid, ins.offset,1 ); -out_free:mapping_set_error (inode->vfs_inode.i_mapping, -EIO ); extent_clear_unlock_delalloc(inode, start, end, NULL, EXTENT_LOCKED | EXTENT_DELALLOC |