5.10.82-rc1 review
Subsystems (8)
Greg Kroah-Hartman
maintainercover 5.10.82-rc1 review
This is the start of the stable review cycle for the 5.10.82 release. There are 154 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 26 Nov 2021 11:56:36 +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/v5.x/stable-review/patch-5.10.82-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-5.10.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.10.82-rc1
Randy Dunlap <[email protected]>
x86/Kconfig: Fix an unused variable error in dell-smm-hwmon
Josef Bacik <[email protected]>
btrfs: update device path inode time instead of bd_inode
Josef Bacik <[email protected]>
fs: export an inode_update_time helper
Leon Romanovsky <[email protected]>
ice: Delete always true check of PF pointer
Uwe Kleine-König <[email protected]>
usb: max-3421: Use driver data instead of maintaining a list of bound devices
Takashi Iwai <[email protected]>
ASoC: DAPM: Cover regression by kctl change notification fix
Ondrej Mosnacek <[email protected]>
selinux: fix NULL-pointer dereference when hashtab allocation fails
Leon Romanovsky <[email protected]>
RDMA/netlink: Add __maybe_unused to static inline in C file
Nadav Amit <[email protected]>
hugetlbfs: flush TLBs correctly after huge_pmd_unshare
Adrian Hunter <[email protected]>
scsi: ufs: core: Fix task management completion timeout race
Adrian Hunter <[email protected]>
scsi: ufs: core: Fix task management completion
hongao <[email protected]>
drm/amdgpu: fix set scaling mode Full/Full aspect/Center not works on vga and dvi connectors
Imre Deak <[email protected]>
drm/i915/dp: Ensure sink rate values are always valid
Jeremy Cline <[email protected]>
drm/nouveau: clean up all clients on device removal
Jeremy Cline <[email protected]>
drm/nouveau: use drm_dev_unplug() during device removal
Jeremy Cline <[email protected]>
drm/nouveau: Add a dedicated mutex for the clients list
Johan Hovold <[email protected]>
drm/udl: fix control-message timeout
Alvin Lee <[email protected]>
drm/amd/display: Update swizzle mode enums
Nguyen Dinh Phi <[email protected]>
cfg80211: call cfg80211_stop_ap when switch from P2P_GO type
Sven Schnelle <[email protected]>
parisc/sticon: fix reverse colors
Nikolay Borisov <[email protected]>
btrfs: fix memory ordering between normal and ordered work functions
Meng Li <[email protected]>
net: stmmac: socfpga: add runtime suspend/resume callback for stratix10 platform
Jan Kara <[email protected]>
udf: Fix crash after seekdir
Maxim Levitsky <[email protected]>
KVM: nVMX: don't use vcpu->arch.efer when checking host state on nested state load
Alistair Delva <[email protected]>
block: Check ADMIN before NICE for IOPRIO_CLASS_RT
Baoquan He <[email protected]>
s390/kexec: fix memory leak of ipl report buffer
Ewan D. Milne <[email protected]>
scsi: qla2xxx: Fix mailbox direction flags in qla2xxx_get_adapter_id()
Christophe Leroy <[email protected]>
powerpc/8xx: Fix pinned TLBs with CONFIG_STRICT_KERNEL_RWX
Sean Christopherson <[email protected]>
x86/hyperv: Fix NULL deref in set_hv_tscchange_cb() if Hyper-V setup fails
Rustam Kovhaev <[email protected]>
mm: kmemleak: slob: respect SLAB_NOLEAKTRACE flag
Alexander Mikhalitsyn <[email protected]>
ipc: WARN if trying to remove ipc object which is absent
Tadeusz Struk <[email protected]>
tipc: check for null after calling kmemdup
Nathan Chancellor <[email protected]>
hexagon: clean up timer-regs.h
Nathan Chancellor <[email protected]>
hexagon: export raw I/O routines for modules
Nicolas Dichtel <[email protected]>
tun: fix bonding active backup with arp monitoring
Nick Desaulniers <[email protected]>
arm64: vdso32: suppress error message for 'make mrproper'
Punit Agrawal <[email protected]>
net: stmmac: dwmac-rk: Fix ethernet on rk3399 based devices
Heiko Carstens <[email protected]>
s390/kexec: fix return code handling
Alexander Antonov <[email protected]>
perf/x86/intel/uncore: Fix IIO event constraints for Skylake Server
Alexander Antonov <[email protected]>
perf/x86/intel/uncore: Fix filter_tid mask for CHA events on Skylake Server
Bjorn Andersson <[email protected]>
pinctrl: qcom: sdm845: Enable dual edge errata
Michael Ellerman <[email protected]>
KVM: PPC: Book3S HV: Use GLOBAL_TOC for kvmppc_h_set_dabr/xdabr()
Sohaib Mohamed <[email protected]>
perf bench: Fix two memory leaks detected with ASan
Jesse Brandeburg <[email protected]>
e100: fix device suspend/resume
Lin Ma <[email protected]>
NFC: add NCI_UNREG flag to eliminate the race
Bongsu Jeon <[email protected]>
net: nfc: nci: Change the NCI close sequence
Lin Ma <[email protected]>
NFC: reorder the logic in nfc_{un,}register_device
Lin Ma <[email protected]>
NFC: reorganize the functions in nci_request
Grzegorz Szczurek <[email protected]>
i40e: Fix display error code in dmesg
Jedrzej Jagielski <[email protected]>
i40e: Fix creation of first queue by omitting it if is not power of two
Karen Sornek <[email protected]>
i40e: Fix warning message and call stack during rmmod i40e driver
Eryk Rybak <[email protected]>
i40e: Fix ping is lost after configuring ADq on VF
Eryk Rybak <[email protected]>
i40e: Fix changing previously set num_queue_pairs for PFs
Michal Maloszewski <[email protected]>
i40e: Fix NULL ptr dereference on VSI filter sync
Eryk Rybak <[email protected]>
i40e: Fix correct max_pkt_size on VF RX queue
Jonathan Davies <[email protected]>
net: virtio_net_hdr_to_skb: count transport header in UFO
Pavel Skripkin <[email protected]>
net: dpaa2-eth: fix use-after-free in dpaa2_eth_remove
Xin Long <[email protected]>
net: sched: act_mirred: drop dst for the direction from egress to ingress
Mike Christie <[email protected]>
scsi: core: sysfs: Fix hang when device state is set via sysfs
Raed Salem <[email protected]>
net/mlx5: E-Switch, return error if encap isn't supported
Roi Dayan <[email protected]>
net/mlx5: E-Switch, Change mode lock from mutex to rw semaphore
Maher Sanalla <[email protected]>
net/mlx5: Lag, update tracker when state change event received
Valentine Fatiev <[email protected]>
net/mlx5e: nullify cq->dbg pointer in mlx5_debug_cq_remove()
Christophe JAILLET <[email protected]>
platform/x86: hp_accel: Fix an error handling path in 'lis3lv02d_probe()'
Randy Dunlap <[email protected]>
mips: lantiq: add support for clk_get_parent()
Randy Dunlap <[email protected]>
mips: bcm63xx: add support for clk_get_parent()
Colin Ian King <[email protected]>
MIPS: generic/yamon-dt: fix uninitialized variable error
Grzegorz Szczurek <[email protected]>
iavf: Fix for setting queues to 0
Surabhi Boob <[email protected]>
iavf: Fix for the false positive ASQ/ARQ errors while issuing VF reset
Mitch Williams <[email protected]>
iavf: validate pointers
Jacob Keller <[email protected]>
iavf: prevent accidental free of filter structure
Piotr Marczak <[email protected]>
iavf: Fix failure to exit out from last all-multicast mode
Nicholas Nunley <[email protected]>
iavf: free q_vectors before queues in iavf_disable_vf
Nicholas Nunley <[email protected]>
iavf: check for null in iavf_fix_features
Mateusz Palczewski <[email protected]>
iavf: Fix return of set the new channel count
Wen Gu <[email protected]>
net/smc: Make sure the link_id is unique
Tetsuo Handa <[email protected]>
sock: fix /proc/net/sockstat underflow in sk_clone_lock()
Eric Dumazet <[email protected]>
net: reduce indentation level in sk_clone_lock()
Xin Long <[email protected]>
tipc: only accept encrypted MSG_CRYPTO msgs
Sriharsha Basavapatna <[email protected]>
bnxt_en: reject indirect blk offload when hw-tc-offload is off
Pavel Skripkin <[email protected]>
net: bnx2x: fix variable dereferenced before check
Alex Elder <[email protected]>
net: ipa: disable HOLB drop when updating timer
Steven Rostedt (VMware) <[email protected]>
tracing: Add length protection to histogram string copies
Arjun Roy <[email protected]>
tcp: Fix uninitialized access in skb frags array for Rx 0cp.
Arjun Roy <[email protected]>
net-zerocopy: Refactor skb frag fast-forward op.
Arjun Roy <[email protected]>
net-zerocopy: Copy straggler unaligned data for TCP Rx. zerocopy.
Hans Verkuil <[email protected]>
drm/nouveau: hdmigv100.c: fix corrupted HDMI Vendor InfoFrame
James Clark <[email protected]>
perf tests: Remove bash construct from record+zstd_comp_decomp.sh
Sohaib Mohamed <[email protected]>
perf bench futex: Fix memory leak of perf_cpu_map__new()
Ian Rogers <[email protected]>
perf bpf: Avoid memory leak from perf_env__insert_btf()
Masami Hiramatsu <[email protected]>
tracing/histogram: Do not copy the fixed-size char array field over the field size
Laibin Qiu <[email protected]>
blkcg: Remove extra blkcg_bio_issue_init
Like Xu <[email protected]>
perf/x86/vlbr: Add c->flags to vlbr event constraints
Vincent Donnefort <[email protected]>
sched/core: Mitigate race cpus_share_cache()/update_top_cache_domain()
Randy Dunlap <[email protected]>
mips: BCM63XX: ensure that CPU_SUPPORTS_32BIT_KERNEL is set
Dmitry Baryshkov <[email protected]>
clk: qcom: gcc-msm8996: Drop (again) gcc_aggre1_pnoc_ahb_clk
Joel Stanley <[email protected]>
clk/ast2600: Fix soc revision for AHB
Paul Cercueil <[email protected]>
clk: ingenic: Fix bugs with divided dividers
Chao Yu <[email protected]>
f2fs: fix incorrect return value in f2fs_sanity_check_ckpt()
Hyeong-Jun Kim <[email protected]>
f2fs: compress: disallow disabling compress on non-empty compressed file
Randy Dunlap <[email protected]>
sh: define __BIG_ENDIAN for math-emu
Randy Dunlap <[email protected]>
sh: math-emu: drop unused functions
Randy Dunlap <[email protected]>
sh: fix kconfig unmet dependency warning for FRAME_POINTER
Keoseong Park <[email protected]>
f2fs: fix to use WHINT_MODE
Gao Xiang <[email protected]>
f2fs: fix up f2fs_lookup tracepoints
Lu Wei <[email protected]>
maple: fix wrong return value of maple_bus_init().
Nick Desaulniers <[email protected]>
sh: check return code of request_irq
Christophe Leroy <[email protected]>
powerpc/8xx: Fix Oops with STRICT_KERNEL_RWX without DEBUG_RODATA_TEST
Michael Ellerman <[email protected]>
powerpc/dcr: Use cmplwi instead of 3-argument cmpli
Chengfeng Ye <[email protected]>
ALSA: gus: fix null pointer dereference on pointer block
David Heidelberg <[email protected]>
ARM: dts: qcom: fix memory and mdio nodes naming for RB3011
Anatolij Gustschin <[email protected]>
powerpc/5200: dts: fix memory node unit name
Teng Qi <[email protected]>
iio: imu: st_lsm6dsx: Avoid potential array overflow in st_lsm6dsx_set_odr()
Mike Christie <[email protected]>
scsi: target: Fix alua_tg_pt_gps_count tracking
Mike Christie <[email protected]>
scsi: target: Fix ordered tag handling
Ye Bin <[email protected]>
scsi: scsi_debug: Fix out-of-bound read in resp_report_tgtpgs()
Ye Bin <[email protected]>
scsi: scsi_debug: Fix out-of-bound read in resp_readcap16()
Bart Van Assche <[email protected]>
MIPS: sni: Fix the build
Guanghui Feng <[email protected]>
tty: tty_buffer: Fix the softlockup issue in flush_to_ldisc
Randy Dunlap <[email protected]>
ALSA: ISA: not for M68K
Li Yang <[email protected]>
ARM: dts: ls1021a-tsn: use generic "jedec,spi-nor" compatible for flash
Li Yang <[email protected]>
ARM: dts: ls1021a: move thermal-zones node out of soc/
Yang Yingliang <[email protected]>
usb: host: ohci-tmio: check return value after calling platform_get_resource()
Roger Quadros <[email protected]>
ARM: dts: omap: fix gpmc,mux-add-data type
Dmitry Osipenko <[email protected]>
cpuidle: tegra: Check whether PMC is ready
Luis Chamberlain <[email protected]>
firmware_loader: fix pre-allocated buf built-in firmware use
Pierre-Louis Bossart <[email protected]>
ASoC: Intel: sof_sdw: add missing quirk for Dell SKU 0A45
Pierre-Louis Bossart <[email protected]>
ALSA: intel-dsp-config: add quirk for APL/GLK/TGL devices based on ES8336 codec
Guo Zhi <[email protected]>
scsi: advansys: Fix kernel pointer leak
Hans de Goede <[email protected]>
ASoC: nau8824: Add DMI quirk mechanism for active-high jack-detect
Stefan Riedmueller <[email protected]>
clk: imx: imx6ul: Move csi_sel mux to correct base register
Pierre-Louis Bossart <[email protected]>
ASoC: SOF: Intel: hda-dai: fix potential locking issue
Michael Walle <[email protected]>
arm64: dts: freescale: fix arm,sp805 compatible string
Stephan Gerhold <[email protected]>
arm64: dts: qcom: msm8916: Add unit name for /soc node
Shawn Guo <[email protected]>
arm64: dts: qcom: ipq6018: Fix qcom,controlled-remotely property
AngeloGioacchino Del Regno <[email protected]>
arm64: dts: qcom: msm8998: Fix CPU/L2 idle state latency and residency
Christian Lamparter <[email protected]>
ARM: BCM53016: Specify switch ports for Meraki MR32
Fabio Aiuto <[email protected]>
staging: rtl8723bs: remove possible deadlock when disconnect (v2)
Linus Walleij <[email protected]>
ARM: dts: ux500: Skomer regulator fixes
Sven Peter <[email protected]>
usb: typec: tipd: Remove WARN_ON in tps6598x_block_read
Yang Yingliang <[email protected]>
usb: musb: tusb6010: check return value after calling platform_get_resource()
Tony Lindgren <[email protected]>
bus: ti-sysc: Use context lost quirk for otg
Tony Lindgren <[email protected]>
bus: ti-sysc: Add quirk handling for reinit on context lost
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Check if the vlan is valid before reporting
Michael Walle <[email protected]>
arm64: dts: hisilicon: fix arm,sp805 compatible string
Matthias Brugger <[email protected]>
arm64: dts: rockchip: Disable CDN DP on Pinebook Pro
James Smart <[email protected]>
scsi: lpfc: Fix list_add() corruption in lpfc_drain_txq()
Matthew Hagan <[email protected]>
ARM: dts: NSP: Fix mpcore, mmc node names
Jérôme Pouiller <[email protected]>
staging: wfx: ensure IRQ is ready before enabling it
Maxime Ripard <[email protected]>
arm64: dts: allwinner: a100: Fix thermal zone node name
Maxime Ripard <[email protected]>
arm64: dts: allwinner: h5: Fix GPU thermal zone node name
Maxime Ripard <[email protected]>
ARM: dts: sunxi: Fix OPPs node name
Michal Simek <[email protected]>
arm64: zynqmp: Fix serial compatible string
Amit Kumar Mahapatra <[email protected]>
arm64: zynqmp: Do not duplicate flash partition label property
-------------
Diffstat:
Makefile | 4 +- arch/arm/boot/dts/bcm-nsp.dtsi | 4 +- arch/arm/boot/dts/bcm53016-meraki-mr32.dts | 22 +++ arch/arm/boot/dts/ls1021a-tsn.dts | 2 +- arch/arm/boot/dts/ls1021a.dtsi | 66 +++---- arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi | 2 +- arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi | 2 +- arch/arm/boot/dts/qcom-ipq8064-rb3011.dts | 6 +- arch/arm/boot/dts/ste-ux500-samsung-skomer.dts | 8 +- arch/arm/boot/dts/sun8i-a33.dtsi | 4 +- arch/arm/boot/dts/sun8i-a83t.dtsi | 4 +- arch/arm/boot/dts/sun8i-h3.dtsi | 4 +- arch/arm64/boot/dts/allwinner/sun50i-a100.dtsi | 6 +- .../boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi | 2 +- .../boot/dts/allwinner/sun50i-h5-cpu-opp.dtsi | 2 +- arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | 2 +- .../boot/dts/allwinner/sun50i-h6-cpu-opp.dtsi | 2 +- arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi | 16 +- arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi | 16 +- arch/arm64/boot/dts/hisilicon/hi3660.dtsi | 4 +- arch/arm64/boot/dts/hisilicon/hi6220.dtsi | 2 +- arch/arm64/boot/dts/qcom/ipq6018.dtsi | 2 +- arch/arm64/boot/dts/qcom/msm8916.dtsi | 2 +- arch/arm64/boot/dts/qcom/msm8998.dtsi | 20 ++- .../boot/dts/rockchip/rk3399-pinebook-pro.dts | 4 - .../boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts | 4 +- arch/arm64/boot/dts/xilinx/zynqmp.dtsi | 4 +- arch/arm64/kernel/vdso32/Makefile | 3 +- arch/hexagon/include/asm/timer-regs.h | 26 --- arch/hexagon/include/asm/timex.h | 3 +- arch/hexagon/kernel/time.c | 12 +- arch/hexagon/lib/io.c | 4 + arch/mips/Kconfig | 3 + arch/mips/bcm63xx/clk.c | 6 + arch/mips/generic/yamon-dt.c | 2 +- arch/mips/lantiq/clk.c | 6 + arch/mips/sni/time.c | 4 +- arch/powerpc/boot/dts/charon.dts | 2 +- arch/powerpc/boot/dts/digsy_mtc.dts | 2 +- arch/powerpc/boot/dts/lite5200.dts | 2 +- arch/powerpc/boot/dts/lite5200b.dts | 2 +- arch/powerpc/boot/dts/media5200.dts | 2 +- arch/powerpc/boot/dts/mpc5200b.dtsi | 2 +- arch/powerpc/boot/dts/o2d.dts | 2 +- arch/powerpc/boot/dts/o2d.dtsi | 2 +- arch/powerpc/boot/dts/o2dnt2.dts | 2 +- arch/powerpc/boot/dts/o3dnt.dts | 2 +- arch/powerpc/boot/dts/pcm032.dts | 2 +- arch/powerpc/boot/dts/tqm5200.dts | 2 +- arch/powerpc/kernel/head_8xx.S | 13 +- arch/powerpc/kvm/book3s_hv_rmhandlers.S | 4 +- arch/powerpc/sysdev/dcr-low.S | 2 +- arch/s390/include/asm/kexec.h | 6 + arch/s390/kernel/ipl.c | 3 +- arch/s390/kernel/machine_kexec_file.c | 18 +- arch/sh/Kconfig.debug | 1 + arch/sh/include/asm/sfp-machine.h | 8 + arch/sh/kernel/cpu/sh4a/smp-shx3.c | 5 +- arch/sh/math-emu/math.c | 103 ----------- arch/x86/Kconfig | 3 +- arch/x86/events/intel/core.c | 4 +- arch/x86/events/intel/uncore_snbep.c | 4 + arch/x86/hyperv/hv_init.c | 3 + arch/x86/kvm/vmx/nested.c | 22 ++- block/blk-core.c | 4 +- block/ioprio.c | 9 +- drivers/base/firmware_loader/main.c | 13 +- drivers/bus/ti-sysc.c | 110 +++++++++++- drivers/clk/clk-ast2600.c | 12 +- drivers/clk/imx/clk-imx6ul.c | 2 +- drivers/clk/ingenic/cgu.c | 6 +- drivers/clk/qcom/gcc-msm8996.c | 15 -- drivers/cpuidle/cpuidle-tegra.c | 3 + drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 1 + .../gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 4 +- .../drm/amd/display/dc/dml/display_mode_enums.h | 4 +- drivers/gpu/drm/i915/display/intel_dp.c | 11 ++ drivers/gpu/drm/nouveau/nouveau_drm.c | 42 ++++- drivers/gpu/drm/nouveau/nouveau_drv.h | 5 + .../gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c | 1 - drivers/gpu/drm/udl/udl_connector.c | 2 +- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 6 +- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 12 +- .../net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h | 4 +- drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 2 +- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 4 +- drivers/net/ethernet/intel/e100.c | 18 +- drivers/net/ethernet/intel/i40e/i40e.h | 2 + drivers/net/ethernet/intel/i40e/i40e_main.c | 160 +++++++++++------ drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 121 +++++-------- drivers/net/ethernet/intel/iavf/iavf_ethtool.c | 30 +++- drivers/net/ethernet/intel/iavf/iavf_main.c | 14 +- drivers/net/ethernet/intel/ice/ice_main.c | 3 - drivers/net/ethernet/mellanox/mlx5/core/cq.c | 5 +- drivers/net/ethernet/mellanox/mlx5/core/debugfs.c | 4 +- drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 11 +- drivers/net/ethernet/mellanox/mlx5/core/eswitch.h | 2 +- .../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 28 +-- drivers/net/ethernet/mellanox/mlx5/core/lag.c | 28 ++- drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 5 + .../net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 24 ++- drivers/net/ipa/ipa_endpoint.c | 2 + drivers/net/tun.c | 5 + drivers/pinctrl/qcom/pinctrl-sdm845.c | 1 + drivers/platform/x86/hp_accel.c | 2 + drivers/scsi/advansys.c | 4 +- drivers/scsi/lpfc/lpfc_sli.c | 1 + drivers/scsi/qla2xxx/qla_mbx.c | 6 +- drivers/scsi/scsi_debug.c | 11 +- drivers/scsi/scsi_sysfs.c | 30 ++-- drivers/scsi/ufs/ufshcd.c | 57 +++---- drivers/scsi/ufs/ufshcd.h | 1 + drivers/sh/maple/maple.c | 5 +- drivers/staging/rtl8723bs/core/rtw_mlme_ext.c | 7 +- drivers/staging/rtl8723bs/core/rtw_recv.c | 10 +- drivers/staging/rtl8723bs/core/rtw_sta_mgt.c | 22 +-- drivers/staging/rtl8723bs/core/rtw_xmit.c | 16 +- drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c | 2 - drivers/staging/wfx/bus_sdio.c | 17 +- drivers/target/target_core_alua.c | 1 - drivers/target/target_core_device.c | 2 + drivers/target/target_core_internal.h | 1 + drivers/target/target_core_transport.c | 76 ++++++--- drivers/tty/tty_buffer.c | 3 + drivers/usb/host/max3421-hcd.c | 25 +-- drivers/usb/host/ohci-tmio.c | 2 +- drivers/usb/musb/tusb6010.c | 5 + drivers/usb/typec/tps6598x.c | 2 +- drivers/video/console/sticon.c | 12 +- fs/btrfs/async-thread.c | 14 ++ fs/btrfs/volumes.c | 21 ++- fs/f2fs/f2fs.h | 3 +- fs/f2fs/super.c | 4 +- fs/inode.c | 7 +- fs/udf/dir.c | 32 +++- fs/udf/namei.c | 3 + fs/udf/super.c | 2 + include/linux/fs.h | 2 + include/linux/platform_data/ti-sysc.h | 1 + include/linux/trace_events.h | 2 +- include/linux/virtio_net.h | 7 +- include/net/nfc/nci_core.h | 1 + include/rdma/rdma_netlink.h | 2 +- include/target/target_core_base.h | 6 +- include/trace/events/f2fs.h | 12 +- include/uapi/linux/tcp.h | 2 + ipc/util.c | 6 +- kernel/sched/core.c | 3 + kernel/trace/trace_events_hist.c | 14 +- mm/hugetlb.c | 23 ++- mm/slab.h | 2 +- net/core/sock.c | 189 ++++++++++----------- net/ipv4/tcp.c | 122 ++++++++++--- net/nfc/core.c | 32 ++-- net/nfc/nci/core.c | 34 +++- net/sched/act_mirred.c | 11 +- net/smc/smc_core.c | 3 +- net/tipc/crypto.c | 4 + net/tipc/link.c | 7 +- net/wireless/util.c | 1 + security/selinux/ss/hashtab.c | 17 +- sound/core/Makefile | 2 + sound/hda/intel-dsp-config.c | 22 ++- sound/isa/Kconfig | 2 +- sound/isa/gus/gus_dma.c | 2 + sound/pci/Kconfig | 1 + sound/soc/codecs/nau8824.c | 40 +++++ sound/soc/intel/boards/sof_sdw.c | 10 ++ sound/soc/soc-dapm.c | 29 +++- sound/soc/sof/intel/hda-dai.c | 7 +- tools/perf/bench/futex-lock-pi.c | 1 + tools/perf/bench/futex-requeue.c | 1 + tools/perf/bench/futex-wake-parallel.c | 1 + tools/perf/bench/futex-wake.c | 1 + tools/perf/bench/sched-messaging.c | 4 + tools/perf/tests/shell/record+zstd_comp_decomp.sh | 2 +- tools/perf/util/bpf-event.c | 6 +- tools/perf/util/env.c | 5 +- tools/perf/util/env.h | 2 +- 179 files changed, 1406 insertions(+), 884 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/154 arm64: zynqmp: Do not duplicate flash partition label property
From: Amit Kumar Mahapatra <[email protected]>
[ Upstream commit 167721a5909f867f8c18c8e78ea58e705ad9bbd4 ]
In kernel 5.4, support has been added for reading MTD devices via the nvmem API.
For this the mtd devices are registered as read-only NVMEM providers under sysfs with the same name as the flash partition label property.
So if flash partition label property of multiple flash devices are identical then the second mtd device fails to get registered as a NVMEM provider.
This patch fixes the issue by having different label property for different flashes.
--- arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts +2 -2
@@ -131,7 +131,7 @@ reg = <0>; partition@0 { - label = "data"; + label = "spi0-data"; reg = <0x0 0x100000>; }; };
@@ -149,7 +149,7 @@ reg = <0>; partition@0 { - label = "data"; + label = "spi1-data"; reg = <0x0 0x84000>; }; };
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 2/154 arm64: zynqmp: Fix serial compatible string
In reply to Greg Kroah-HartmanFrom: Michal Simek <[email protected]>
[ Upstream commit 812fa2f0e9d33564bd0131a69750e0d165f4c82a ]
Based on commit 65a2c14d4f00 ("dt-bindings: serial: convert Cadence UART bindings to YAML") compatible string should look like differently that's why fix it to be aligned with dt binding.
--- arch/arm64/boot/dts/xilinx/zynqmp.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/xilinx/zynqmp.dtsi +2 -2
@@ -688,7 +688,7 @@ }; uart0: serial@ff000000 { - compatible = "cdns,uart-r1p12", "xlnx,xuartps"; + compatible = "xlnx,zynqmp-uart", "cdns,uart-r1p12"; status = "disabled"; interrupt-parent = <&gic>; interrupts = <0 21 4>;
@@ -698,7 +698,7 @@ }; uart1: serial@ff010000 { - compatible = "cdns,uart-r1p12", "xlnx,xuartps"; + compatible = "xlnx,zynqmp-uart", "cdns,uart-r1p12"; status = "disabled"; interrupt-parent = <&gic>; interrupts = <0 22 4>;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 3/154 ARM: dts: sunxi: Fix OPPs node name
In reply to Greg Kroah-HartmanFrom: Maxime Ripard <[email protected]>
[ Upstream commit ffbe853a3f5a37fa0a511265b21abf097ffdbe45 ]
The operating-points-v2 nodes are named inconsistently, but mostly either opp_table0 or gpu-opp-table. However, the underscore is an invalid character for a node name and the thermal zone binding explicitly requires that zones are called opp-table-*. Let's fix it.
--- arch/arm/boot/dts/sun8i-a33.dtsi | 4 ++-- arch/arm/boot/dts/sun8i-a83t.dtsi | 4 ++-- arch/arm/boot/dts/sun8i-h3.dtsi | 4 ++-- arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi | 2 +- arch/arm64/boot/dts/allwinner/sun50i-h5-cpu-opp.dtsi | 2 +- arch/arm64/boot/dts/allwinner/sun50i-h6-cpu-opp.dtsi | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-)
arch/arm/boot/dts/sun8i-a33.dtsi +2 -2
@@ -46,7 +46,7 @@ #include <dt-bindings/thermal/thermal.h> / { - cpu0_opp_table: opp_table0 { + cpu0_opp_table: opp-table-cpu { compatible = "operating-points-v2"; opp-shared;
@@ -164,7 +164,7 @@ io-channels = <&ths>; }; - mali_opp_table: gpu-opp-table { + mali_opp_table: opp-table-gpu { compatible = "operating-points-v2"; opp-144000000 {
arch/arm/boot/dts/sun8i-a83t.dtsi +2 -2
@@ -200,7 +200,7 @@ status = "disabled"; }; - cpu0_opp_table: opp_table0 { + cpu0_opp_table: opp-table-cluster0 { compatible = "operating-points-v2"; opp-shared;
@@ -253,7 +253,7 @@ }; }; - cpu1_opp_table: opp_table1 { + cpu1_opp_table: opp-table-cluster1 { compatible = "operating-points-v2"; opp-shared;
arch/arm/boot/dts/sun8i-h3.dtsi +2 -2
@@ -44,7 +44,7 @@ #include <dt-bindings/thermal/thermal.h> / { - cpu0_opp_table: opp_table0 { + cpu0_opp_table: opp-table-cpu { compatible = "operating-points-v2"; opp-shared;
@@ -112,7 +112,7 @@ }; }; - gpu_opp_table: gpu-opp-table { + gpu_opp_table: opp-table-gpu { compatible = "operating-points-v2"; opp-120000000 {
arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi +1 -1
@@ -4,7 +4,7 @@ */ / { - cpu0_opp_table: opp_table0 { + cpu0_opp_table: opp-table-cpu { compatible = "operating-points-v2"; opp-shared;
arch/arm64/boot/dts/allwinner/sun50i-h5-cpu-opp.dtsi +1 -1
@@ -2,7 +2,7 @@ // Copyright (C) 2020 Chen-Yu Tsai <[email protected]> / { - cpu_opp_table: cpu-opp-table { + cpu_opp_table: opp-table-cpu { compatible = "operating-points-v2"; opp-shared;
arch/arm64/boot/dts/allwinner/sun50i-h6-cpu-opp.dtsi +1 -1
@@ -3,7 +3,7 @@ // Copyright (C) 2020 Clément Péron <[email protected]> / { - cpu_opp_table: cpu-opp-table { + cpu_opp_table: opp-table-cpu { compatible = "allwinner,sun50i-h6-operating-points"; nvmem-cells = <&cpu_speed_grade>; opp-shared;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 4/154 arm64: dts: allwinner: h5: Fix GPU thermal zone node name
In reply to Greg Kroah-HartmanFrom: Maxime Ripard <[email protected]>
[ Upstream commit 94a0f2b0e4e0953d8adf319c44244ef7a57de32c ]
The GPU thermal zone is named gpu_thermal. However, the underscore is an invalid character for a node name and the thermal zone binding explicitly requires that zones are called *-thermal. Let's fix it.
--- arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi +1 -1
@@ -204,7 +204,7 @@ }; }; - gpu_thermal { + gpu-thermal { polling-delay-passive = <0>; polling-delay = <0>; thermal-sensors = <&ths 1>;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 5/154 arm64: dts: allwinner: a100: Fix thermal zone node name
In reply to Greg Kroah-HartmanFrom: Maxime Ripard <[email protected]>
[ Upstream commit 5c34c4e46e601554bfa370b23c8ae3c3c734e9f7 ]
The thermal zones one the A100 are called $device-thermal-zone.
However, the thermal zone binding explicitly requires that zones are called *-thermal. Let's fix it.
--- arch/arm64/boot/dts/allwinner/sun50i-a100.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/allwinner/sun50i-a100.dtsi +3 -3
@@ -343,19 +343,19 @@ }; thermal-zones { - cpu-thermal-zone { + cpu-thermal { polling-delay-passive = <0>; polling-delay = <0>; thermal-sensors = <&ths 0>; }; - ddr-thermal-zone { + ddr-thermal { polling-delay-passive = <0>; polling-delay = <0>; thermal-sensors = <&ths 2>; }; - gpu-thermal-zone { + gpu-thermal { polling-delay-passive = <0>; polling-delay = <0>; thermal-sensors = <&ths 1>;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 6/154 staging: wfx: ensure IRQ is ready before enabling it
In reply to Greg Kroah-HartmanFrom: Jérôme Pouiller <[email protected]>
[ Upstream commit 5e57c668dc097c6c27c973504706edec53f79281 ]
Since commit 5561770f80b1 ("staging: wfx: repair external IRQ for SDIO"), wfx_sdio_irq_subscribe() enforce the device to use IRQs. However, there is currently a race in this code. An IRQ may happen before the IRQ has been registered.
The problem has observed during debug session when the device crashes before the IRQ set up:
[ 1.546] wfx-sdio mmc0:0001:1: started firmware 3.12.2 "WF200_ASIC_WFM_(Jenkins)_FW3.12.2" (API: 3.7, keyset: C0, caps: 0x00000002)
[ 2.559] wfx-sdio mmc0:0001:1: time out while polling control register
[ 3.565] wfx-sdio mmc0:0001:1: chip is abnormally long to answer
[ 6.563] wfx-sdio mmc0:0001:1: chip did not answer
[ 6.568] wfx-sdio mmc0:0001:1: hardware request CONFIGURATION (0x09) on vif 2 returned error -110
[ 6.577] wfx-sdio mmc0:0001:1: PDS bytes 0 to 12: chip didn't reply (corrupted file?)
[ 6.585] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 6.592] pgd = c0004000
[ 6.595] [00000000] *pgd=00000000
[ 6.598] Internal error: Oops - BUG: 17 [#1] THUMB2
[ 6.603] Modules linked in:
[ 6.606] CPU: 0 PID: 23 Comm: kworker/u2:1 Not tainted 3.18.19 #78
[ 6.612] Workqueue: kmmcd mmc_rescan
[ 6.616] task: c176d100 ti: c0e50000 task.ti: c0e50000
[ 6.621] PC is at wake_up_process+0xa/0x14
[ 6.625] LR is at sdio_irq+0x61/0x250
[ 6.629] pc : [<c001e8ae>] lr : [<c00ec5bd>] psr: 600001b3
[ 6.629] sp : c0e51bd8 ip : c0e51cc8 fp : 00000001
[ 6.640] r10: 00000003 r9 : 00000000 r8 : c0003c34
[ 6.644] r7 : c0e51bd8 r6 : c0003c30 r5 : 00000001 r4 : c0e78c00
[ 6.651] r3 : 00000000 r2 : 00000000 r1 : 00000003 r0 : 00000000
[ 6.657] Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA Thumb Segment kernel
[ 6.664] Control: 50c53c7d Table: 11fd8059 DAC: 00000015
[ 6.670] Process kworker/u2:1 (pid: 23, stack limit = 0xc0e501b0)
[ 6.676] Stack: (0xc0e51bd8 to 0xc0e52000)
[...]
[ 6.949] [<c001e8ae>] (wake_up_process) from [<c00ec5bd>] (sdio_irq+0x61/0x250)
[ 6.956] [<c00ec5bd>] (sdio_irq) from [<c0025099>] (handle_irq_event_percpu+0x17/0x92)
[ 6.964] [<c0025099>] (handle_irq_event_percpu) from [<c002512f>] (handle_irq_event+0x1b/0x24)
[ 6.973] [<c002512f>] (handle_irq_event) from [<c0026577>] (handle_level_irq+0x5d/0x76)
[ 6.981] [<c0026577>] (handle_level_irq) from [<c0024cc3>] (generic_handle_irq+0x13/0x1c)
[ 6.989] [<c0024cc3>] (generic_handle_irq) from [<c0024dd9>] (__handle_domain_irq+0x31/0x48)
[ 6.997] [<c0024dd9>] (__handle_domain_irq) from [<c0008359>] (ov_handle_irq+0x31/0xe0)
[ 7.005] [<c0008359>] (ov_handle_irq) from [<c000af5b>] (__irq_svc+0x3b/0x5c)
[ 7.013] Exception stack(0xc0e51c68 to 0xc0e51cb0)
[...]
[ 7.038] [<c000af5b>] (__irq_svc) from [<c01775aa>] (wait_for_common+0x9e/0xc4)
[ 7.045] [<c01775aa>] (wait_for_common) from [<c00e1dc3>] (mmc_wait_for_req+0x4b/0xdc)
[ 7.053] [<c00e1dc3>] (mmc_wait_for_req) from [<c00e1e83>] (mmc_wait_for_cmd+0x2f/0x34)
[ 7.061] [<c00e1e83>] (mmc_wait_for_cmd) from [<c00e7b2b>] (mmc_io_rw_direct_host+0x71/0xac)
[ 7.070] [<c00e7b2b>] (mmc_io_rw_direct_host) from [<c00e8f79>] (sdio_claim_irq+0x6b/0x116)
[ 7.078] [<c00e8f79>] (sdio_claim_irq) from [<c00d8415>] (wfx_sdio_irq_subscribe+0x19/0x94)
[ 7.086] [<c00d8415>] (wfx_sdio_irq_subscribe) from [<c00d5229>] (wfx_probe+0x189/0x2ac)
[ 7.095] [<c00d5229>] (wfx_probe) from [<c00d83bf>] (wfx_sdio_probe+0x8f/0xcc)
[ 7.102] [<c00d83bf>] (wfx_sdio_probe) from [<c00e7fbb>] (sdio_bus_probe+0x5f/0xa8)
[ 7.109] [<c00e7fbb>] (sdio_bus_probe) from [<c00be229>] (driver_probe_device+0x59/0x134)
[ 7.118] [<c00be229>] (driver_probe_device) from [<c00bd4d7>] (bus_for_each_drv+0x3f/0x4a)
[ 7.126] [<c00bd4d7>] (bus_for_each_drv) from [<c00be1a5>] (device_attach+0x3b/0x52)
[ 7.134] [<c00be1a5>] (device_attach) from [<c00bdc2b>] (bus_probe_device+0x17/0x4c)
[ 7.141] [<c00bdc2b>] (bus_probe_device) from [<c00bcd69>] (device_add+0x2c5/0x334)
[ 7.149] [<c00bcd69>] (device_add) from [<c00e80bf>] (sdio_add_func+0x23/0x44)
[ 7.156] [<c00e80bf>] (sdio_add_func) from [<c00e79eb>] (mmc_attach_sdio+0x187/0x1ec)
[ 7.164] [<c00e79eb>] (mmc_attach_sdio) from [<c00e31bd>] (mmc_rescan+0x18d/0x1fc)
[ 7.172] [<c00e31bd>] (mmc_rescan) from [<c001a14f>] (process_one_work+0xd7/0x170)
[ 7.179] [<c001a14f>] (process_one_work) from [<c001a59b>] (worker_thread+0x103/0x1bc)
[ 7.187] [<c001a59b>] (worker_thread) from [<c001c731>] (kthread+0x7d/0x90)
[ 7.194] [<c001c731>] (kthread) from [<c0008ce1>] (ret_from_fork+0x11/0x30)
[ 7.201] Code: 2103 b580 2200 af00 (681b) 46bd
[ 7.206] ---[ end trace 3ab50aced42eedb4 ]------ drivers/staging/wfx/bus_sdio.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/staging/wfx/bus_sdio.c +10 -7
@@ -120,19 +120,22 @@ static int wfx_sdio_irq_subscribe(void *priv)return ret; } + flags =irq_get_trigger_type (bus->of_irq); +if (!flags) + flags =IRQF_TRIGGER_HIGH ; + flags |=IRQF_ONESHOT ; + ret =devm_request_threaded_irq (&bus->func->dev, bus->of_irq,NULL , + wfx_sdio_irq_handler_ext, flags, +"wfx" , bus); +if (ret) +return ret;sdio_claim_host (bus->func); cccr =sdio_f0_readb (bus->func, SDIO_CCCR_IENx,NULL ); cccr |=BIT (0 ); cccr |=BIT (bus->func->num);sdio_f0_writeb (bus->func, cccr, SDIO_CCCR_IENx,NULL );sdio_release_host (bus->func); - flags =irq_get_trigger_type (bus->of_irq); -if (!flags) - flags =IRQF_TRIGGER_HIGH ; - flags |=IRQF_ONESHOT ; -return devm_request_threaded_irq (&bus->func->dev, bus->of_irq,NULL , - wfx_sdio_irq_handler_ext, flags, -"wfx" , bus); +return 0 ; }static int wfx_sdio_irq_unsubscribe (void *priv)
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 7/154 ARM: dts: NSP: Fix mpcore, mmc node names
In reply to Greg Kroah-HartmanFrom: Matthew Hagan <[email protected]>
[ Upstream commit 15a563d008ef9d04df525f0c476cd7d7127bb883 ]
Running dtbs_check yielded the issues with bcm-nsp.dtsi.
Firstly this patch fixes the following message by appending "-bus" to
the mpcore node name:
mpcore@19000000: $nodename:0: 'mpcore@19000000' does not match '^([a-z][a-z0-9\\-]+-bus|bus|soc|axi|ahb|apb)(@[0-9a-f]+)?$'
Secondly mmc node name. The label name can remain as is. sdhci@21000: $nodename:0: 'sdhci@21000' does not match '^mmc(@.*)?$'
--- arch/arm/boot/dts/bcm-nsp.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/bcm-nsp.dtsi +2 -2
@@ -77,7 +77,7 @@ interrupt-affinity = <&cpu0>, <&cpu1>; }; - mpcore@19000000 { + mpcore-bus@19000000 { compatible = "simple-bus"; ranges = <0x00000000 0x19000000 0x00023000>; #address-cells = <1>;
@@ -219,7 +219,7 @@ status = "disabled"; }; - sdio: sdhci@21000 { + sdio: mmc@21000 { compatible = "brcm,sdhci-iproc-cygnus"; reg = <0x21000 0x100>; interrupts = <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 8/154 scsi: lpfc: Fix list_add() corruption in lpfc_drain_txq()
In reply to Greg Kroah-HartmanFrom: James Smart <[email protected]>
[ Upstream commit 99154581b05c8fb22607afb7c3d66c1bace6aa5d ]
When parsing the txq list in lpfc_drain_txq(), the driver attempts to pass the requests to the adapter. If such an attempt fails, a local "fail_msg" string is set and a log message output. The job is then added to a completions list for cancellation.
Processing of any further jobs from the txq list continues, but since "fail_msg" remains set, jobs are added to the completions list regardless of whether a wqe was passed to the adapter. If successfully added to txcmplq, jobs are added to both lists resulting in list corruption.
Fix by clearing the fail_msg string after adding a job to the completions list. This stops the subsequent jobs from being added to the completions list unless they had an appropriate failure.
--- drivers/scsi/lpfc/lpfc_sli.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/lpfc/lpfc_sli.c +1 -0
@@ -20080,6 +20080,7 @@ lpfc_drain_txq(struct lpfc_hba *phba) fail_msg, piocbq->iotag, piocbq->sli4_xritag);list_add_tail (&piocbq->list, &completions); + fail_msg =NULL ; }spin_unlock_irqrestore (&pring->ring_lock, iflags); }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 9/154 arm64: dts: rockchip: Disable CDN DP on Pinebook Pro
In reply to Greg Kroah-HartmanFrom: Matthias Brugger <[email protected]>
[ Upstream commit 2513fa5c25d42f55ca5f0f0ab247af7c9fbfa3b1 ]
The CDN DP needs a PHY and a extcon to work correctly. But no extcon is provided by the device-tree, which leads to an error:
cdn-dp fec00000.dp: [drm:cdn_dp_probe [rockchipdrm]] *ERROR* missing extcon or phy
cdn-dp: probe of fec00000.dp failed with error -22
Disable the CDN DP to make graphic work on the Pinebook Pro.
--- arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts | 4 ---- 1 file changed, 4 deletions(-)
arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts +0 -4
@@ -379,10 +379,6 @@ }; }; -&cdn_dp { - status = "okay"; -}; - &cpu_b0 { cpu-supply = <&vdd_cpu_b>; };
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 10/154 arm64: dts: hisilicon: fix arm,sp805 compatible string
In reply to Greg Kroah-HartmanFrom: Michael Walle <[email protected]>
[ Upstream commit 894d4f1f77d0e88f1f81af2e1e37333c1c41b631 ]
According to Documentation/devicetree/bindings/watchdog/arm,sp805.yaml the compatible is:
compatible = "arm,sp805", "arm,primecell";
The current compatible string doesn't exist at all. Fix it.
--- arch/arm64/boot/dts/hisilicon/hi3660.dtsi | 4 ++-- arch/arm64/boot/dts/hisilicon/hi6220.dtsi | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/hisilicon/hi3660.dtsi +2 -2
@@ -1086,7 +1086,7 @@ }; watchdog0: watchdog@e8a06000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xe8a06000 0x0 0x1000>; interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>; clocks = <&crg_ctrl HI3660_OSC32K>,
@@ -1095,7 +1095,7 @@ }; watchdog1: watchdog@e8a07000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xe8a07000 0x0 0x1000>; interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>; clocks = <&crg_ctrl HI3660_OSC32K>,
arch/arm64/boot/dts/hisilicon/hi6220.dtsi +1 -1
@@ -840,7 +840,7 @@ }; watchdog0: watchdog@f8005000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xf8005000 0x0 0x1000>; interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>; clocks = <&ao_ctrl HI6220_WDT0_PCLK>,
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 11/154 RDMA/bnxt_re: Check if the vlan is valid before reporting
In reply to Greg Kroah-HartmanFrom: Selvin Xavier <[email protected]>
[ Upstream commit 6bda39149d4b8920fdb8744090653aca3daa792d ]
When VF is configured with default vlan, HW strips the vlan from the packet and driver receives it in Rx completion. VLAN needs to be reported for UD work completion only if the vlan is configured on the host. Add a check for valid vlan in the UD receive path.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +9 -3
@@ -3368,8 +3368,11 @@ static void bnxt_re_process_res_ud_wc(struct bnxt_re_qp *qp,struct ib_wc *wc, struct bnxt_qplib_cqe *cqe) { + struct bnxt_re_dev *rdev; +u16 vlan_id =0 ;u8 nw_type; + rdev = qp->rdev; wc->opcode =IB_WC_RECV ; wc->status =__rc_to_ib_wc_status (cqe->status);
@@ -3381,9 +3384,12 @@ static void bnxt_re_process_res_ud_wc(struct bnxt_re_qp *qp,memcpy (wc->smac, cqe->smac,ETH_ALEN ); wc->wc_flags |=IB_WC_WITH_SMAC ;if (cqe->flags &CQ_RES_UD_FLAGS_META_FORMAT_VLAN ) { - wc->vlan_id = (cqe->cfa_meta &0xFFF ); -if (wc->vlan_id <0x1000 ) - wc->wc_flags |=IB_WC_WITH_VLAN ; + vlan_id = (cqe->cfa_meta &0xFFF ); + } +/* Mark only if vlan_id is non zero */ +if (vlan_id &&bnxt_re_check_if_vlan_valid (rdev, vlan_id)) { + wc->vlan_id = vlan_id; + wc->wc_flags |=IB_WC_WITH_VLAN ; } nw_type = (cqe->flags &CQ_RES_UD_FLAGS_ROCE_IP_VER_MASK ) >>CQ_RES_UD_FLAGS_ROCE_IP_VER_SFT ;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 12/154 bus: ti-sysc: Add quirk handling for reinit on context lost
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 9d881361206ebcf6285c2ec2ef275aff80875347 ]
Some interconnect target modules such as otg and gpmc on am335x need a re-init after resume. As we also have PM runtime cases where the context may be lost, let's handle these all with cpu_pm.
For the am335x resume path, we already have cpu_pm_resume() call cpu_pm_cluster_exit().
--- drivers/bus/ti-sysc.c | 108 ++++++++++++++++++++++++-- include/linux/platform_data/ti-sysc.h | 1 + 2 files changed, 103 insertions(+), 6 deletions(-)
drivers/bus/ti-sysc.c +102 -6
@@ -6,6 +6,7 @@#include <linux/io.h> #include <linux/clk.h> #include <linux/clkdev.h> +#include <linux/cpu_pm.h> #include <linux/delay.h> #include <linux/list.h> #include <linux/module.h>
@@ -52,11 +53,18 @@ struct sysc_address {struct list_head node; }; +struct sysc_module { +struct sysc *ddata; +struct list_head node; +}; +struct sysc_soc_info {unsigned long general_purpose:1 ;enum sysc_soc soc; -struct mutex list_lock;/* disabled modules list lock */ +struct mutex list_lock;/* disabled and restored modules list lock */ struct list_head disabled_modules; +struct list_head restored_modules; +struct notifier_block nb; };enum sysc_clocks {
@@ -2429,6 +2437,79 @@ static struct dev_pm_domain sysc_child_pm_domain = { } }; +/* Caller needs to take list_lock if ever used outside of cpu_pm */ +static void sysc_reinit_modules (struct sysc_soc_info *soc) +{ +struct sysc_module *module; +struct list_head *pos; +struct sysc *ddata; +int error =0 ; + +list_for_each (pos, &sysc_soc->restored_modules) { + module = list_entry(pos, struct sysc_module, node); + ddata = module->ddata; + error =sysc_reinit_module (ddata, ddata->enabled); + } +} + +/** +* sysc_context_notifier - optionally reset and restore module after idle +* @nb: notifier block +* @cmd: unused +* @v: unused +* +* Some interconnect target modules need to be restored, or reset and restored +* on CPU_PM CPU_PM_CLUSTER_EXIT notifier. This is needed at least for am335x +* OTG and GPMC target modules even if the modules are unused. +*/ +static int sysc_context_notifier (struct notifier_block *nb,unsigned long cmd, +void *v) +{ +struct sysc_soc_info *soc; + + soc = container_of(nb, struct sysc_soc_info, nb); + +switch (cmd) { +case CPU_CLUSTER_PM_ENTER : +break ; +case CPU_CLUSTER_PM_ENTER_FAILED :/* No need to restore context */ +break ; +case CPU_CLUSTER_PM_EXIT : +sysc_reinit_modules (soc); +break ; + } + +return NOTIFY_OK ; +} + +/** +* sysc_add_restored - optionally add reset and restore quirk hanlling +* @ddata: device data +*/ +static void sysc_add_restored (struct sysc *ddata) +{ +struct sysc_module *restored_module; + + restored_module =kzalloc (sizeof (*restored_module),GFP_KERNEL ); +if (!restored_module) +return ; + + restored_module->ddata = ddata; + +mutex_lock (&sysc_soc->list_lock); + +list_add (&restored_module->node, &sysc_soc->restored_modules); + +if (sysc_soc->nb.notifier_call) + goto out_unlock; + + sysc_soc->nb.notifier_call = sysc_context_notifier; +cpu_pm_register_notifier (&sysc_soc->nb); + +out_unlock: +mutex_unlock (&sysc_soc->list_lock); +} +/** * sysc_legacy_idle_quirk - handle children in omap_device compatible way * @ddata: device driver data
@@ -2928,12 +3009,14 @@ static int sysc_add_disabled(unsigned long base) }/* -* One time init to detect the booted SoC and disable unavailable features. +* One time init to detect the booted SoC, disable unavailable features +* and initialize list for optional cpu_pm notifier. +* * Note that we initialize static data shared across all ti-sysc instances * so ddata is only used for SoC type. This can be called from module_init * once we no longer need to rely on platform data. */ -static int sysc_init_soc (struct sysc *ddata) +static int sysc_init_static_data (struct sysc *ddata) {const struct soc_device_attribute *match;struct ti_sysc_platform_data *pdata;
@@ -2948,6 +3031,7 @@ static int sysc_init_soc(struct sysc *ddata)mutex_init (&sysc_soc->list_lock);INIT_LIST_HEAD (&sysc_soc->disabled_modules); +INIT_LIST_HEAD (&sysc_soc->restored_modules); sysc_soc->general_purpose = true; pdata =dev_get_platdata (ddata->dev);
@@ -2994,15 +3078,24 @@ static int sysc_init_soc(struct sysc *ddata)return 0 ; } -static void sysc_cleanup_soc (void ) +static void sysc_cleanup_static_data (void ) { +struct sysc_module *restored_module;struct sysc_address *disabled_module;struct list_head *pos, *tmp;if (!sysc_soc)return ; +if (sysc_soc->nb.notifier_call) +cpu_pm_unregister_notifier (&sysc_soc->nb); +mutex_lock (&sysc_soc->list_lock); +list_for_each_safe (pos, tmp, &sysc_soc->restored_modules) { + restored_module = list_entry(pos, struct sysc_module, node); +list_del (pos); +kfree (restored_module); + }list_for_each_safe (pos, tmp, &sysc_soc->disabled_modules) { disabled_module = list_entry(pos, struct sysc_address, node);list_del (pos);
@@ -3067,7 +3160,7 @@ static int sysc_probe(struct platform_device *pdev) ddata->dev = &pdev->dev;platform_set_drvdata (pdev, ddata); - error =sysc_init_soc (ddata); + error =sysc_init_static_data (ddata);if (error)return error;
@@ -3166,6 +3259,9 @@ static int sysc_probe(struct platform_device *pdev)pm_runtime_put (&pdev->dev); } +if (ddata->cfg.quirks &SYSC_QUIRK_REINIT_ON_CTX_LOST ) +sysc_add_restored (ddata); +return 0 ; err:
@@ -3248,7 +3344,7 @@ static void __exit sysc_exit(void) {bus_unregister_notifier (&platform_bus_type, &sysc_nb);platform_driver_unregister (&sysc_driver); -sysc_cleanup_soc (); +sysc_cleanup_static_data (); }module_exit (sysc_exit);
include/linux/platform_data/ti-sysc.h +1 -0
@@ -50,6 +50,7 @@ struct sysc_regbits {s8 emufree_shift; }; +#define SYSC_QUIRK_REINIT_ON_CTX_LOST BIT(28)#define SYSC_QUIRK_REINIT_ON_RESUME BIT(27)#define SYSC_QUIRK_GPMC_DEBUG BIT(26)#define SYSC_MODULE_QUIRK_ENA_RESETDONE BIT(25)
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 13/154 bus: ti-sysc: Use context lost quirk for otg
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 9067839ff45a528bcb015cc2f24f656126b91e3f ]
Let's use SYSC_QUIRK_REINIT_ON_CTX_LOST quirk for am335x otg instead of SYSC_QUIRK_REINIT_ON_RESUME quirk as we can now handle the context loss in a more generic way.
--- drivers/bus/ti-sysc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/bus/ti-sysc.c +1 -1
@@ -1563,7 +1563,7 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = { 0xffffffff, SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),SYSC_QUIRK ("usb_otg_hs" ,0 ,0 ,0x10 , -ENODEV ,0x4ea2080d ,0xffffffff ,SYSC_QUIRK_SWSUP_SIDLE |SYSC_QUIRK_SWSUP_MSTANDBY | -SYSC_QUIRK_REINIT_ON_RESUME ), +SYSC_QUIRK_REINIT_ON_CTX_LOST ),SYSC_QUIRK ("wdt" ,0 ,0 ,0x10 ,0x14 ,0x502a0500 ,0xfffff0f0 , SYSC_MODULE_QUIRK_WDT),/* PRUSS on am3, am4 and am5 */
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 14/154 usb: musb: tusb6010: check return value after calling platform_get_resource()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 14651496a3de6807a17c310f63c894ea0c5d858e ]
It will cause null-ptr-deref if platform_get_resource() returns NULL, we need check the return value.
--- drivers/usb/musb/tusb6010.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/musb/tusb6010.c +5 -0
@@ -1103,6 +1103,11 @@ static int tusb_musb_init(struct musb *musb)/* dma address for async dma */ mem =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); +if (!mem) { +pr_debug ("no async dma resource?\n" ); + ret = -ENODEV ; + goto done; + } musb->async = mem->start;/* dma address for sync dma */
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 15/154 usb: typec: tipd: Remove WARN_ON in tps6598x_block_read
In reply to Greg Kroah-HartmanFrom: Sven Peter <[email protected]>
[ Upstream commit b7a0a63f3fed57d413bb857de164ea9c3984bc4e ]
Calling tps6598x_block_read with a higher than allowed len can be handled by just returning an error. There's no need to crash systems with panic-on-warn enabled.
--- drivers/usb/typec/tps6598x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/typec/tps6598x.c +1 -1
@@ -109,7 +109,7 @@ tps6598x_block_read(struct tps6598x *tps, u8 reg, void *val, size_t len)u8 data[TPS_MAX_LEN +1 ];int ret; -if (WARN_ON (len +1 >sizeof (data))) +if (len +1 >sizeof (data))return -EINVAL ;if (!tps->i2c_protocol)
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 16/154 ARM: dts: ux500: Skomer regulator fixes
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit 7aee0288beab72cdfa35af51f62e94373fca595d ]
AUX2 has slightly wrong voltage and AUX5 doesn't need to be always on.
--- arch/arm/boot/dts/ste-ux500-samsung-skomer.dts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/arm/boot/dts/ste-ux500-samsung-skomer.dts +4 -4
@@ -262,10 +262,10 @@ }; ab8500_ldo_aux2 { - /* Supplies the Cypress TMA140 touchscreen only with 3.3V */ + /* Supplies the Cypress TMA140 touchscreen only with 3.0V */ regulator-name = "AUX2"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; }; ab8500_ldo_aux3 {
@@ -284,9 +284,9 @@ ab8500_ldo_aux5 { regulator-name = "AUX5"; + /* Intended for 1V8 for touchscreen but actually left unused */ regulator-min-microvolt = <1050000>; regulator-max-microvolt = <2790000>; - regulator-always-on; }; ab8500_ldo_aux6 {
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 17/154 staging: rtl8723bs: remove possible deadlock when disconnect (v2)
In reply to Greg Kroah-HartmanFrom: Fabio Aiuto <[email protected]>
[ Upstream commit 54659ca026e586bbb33a7e60daa6443a3ac6b5df ]
when turning off a connection, lockdep complains with the following warning (a modprobe has been done but the same happens with a disconnection from NetworkManager, it's enough to trigger a cfg80211_disconnect call):
[ 682.855867] ======================================================
[ 682.855877] WARNING: possible circular locking dependency detected
[ 682.855887] 5.14.0-rc6+ #16 Tainted: G C OE
[ 682.855898] ------------------------------------------------------
[ 682.855906] modprobe/1770 is trying to acquire lock:
[ 682.855916] ffffb6d000332b00 (&pxmitpriv->lock){+.-.}-{2:2},
at: rtw_free_stainfo+0x52/0x4a0 [r8723bs]
[ 682.856073]
but task is already holding lock:
[ 682.856081] ffffb6d0003336a8 (&pstapriv->sta_hash_lock){+.-.}-{2:2},
at: rtw_free_assoc_resources+0x48/0x110 [r8723bs]
[ 682.856207]
which lock already depends on the new lock.[ 682.856215]
the existing dependency chain (in reverse order) is:
[ 682.856223]
-> #1 (&pstapriv->sta_hash_lock){+.-.}-{2:2}:
[ 682.856247] _raw_spin_lock_bh+0x34/0x40
[ 682.856265] rtw_get_stainfo+0x9a/0x110 [r8723bs]
[ 682.856389] rtw_xmit_classifier+0x27/0x130 [r8723bs]
[ 682.856515] rtw_xmitframe_enqueue+0xa/0x20 [r8723bs]
[ 682.856642] rtl8723bs_hal_xmit+0x3b/0xb0 [r8723bs]
[ 682.856752] rtw_xmit+0x4ef/0x890 [r8723bs]
[ 682.856879] _rtw_xmit_entry+0xba/0x350 [r8723bs]
[ 682.856981] dev_hard_start_xmit+0xee/0x320
[ 682.856999] sch_direct_xmit+0x8c/0x330
[ 682.857014] __dev_queue_xmit+0xba5/0xf00
[ 682.857030] packet_sendmsg+0x981/0x1b80
[ 682.857047] sock_sendmsg+0x5b/0x60
[ 682.857060] __sys_sendto+0xf1/0x160
[ 682.857073] __x64_sys_sendto+0x24/0x30
[ 682.857087] do_syscall_64+0x3a/0x80
[ 682.857102] entry_SYSCALL_64_after_hwframe+0x44/0xae
[ 682.857117]
-> #0 (&pxmitpriv->lock){+.-.}-{2:2}:
[ 682.857142] __lock_acquire+0xfd9/0x1b50
[ 682.857158] lock_acquire+0xb4/0x2c0
[ 682.857172] _raw_spin_lock_bh+0x34/0x40
[ 682.857185] rtw_free_stainfo+0x52/0x4a0 [r8723bs]
[ 682.857308] rtw_free_assoc_resources+0x53/0x110 [r8723bs]
[ 682.857415] cfg80211_rtw_disconnect+0x4b/0x70 [r8723bs]
[ 682.857522] cfg80211_disconnect+0x12e/0x2f0 [cfg80211]
[ 682.857759] cfg80211_leave+0x2b/0x40 [cfg80211]
[ 682.857961] cfg80211_netdev_notifier_call+0xa9/0x560 [cfg80211]
[ 682.858163] raw_notifier_call_chain+0x41/0x50
[ 682.858180] __dev_close_many+0x62/0x100
[ 682.858195] dev_close_many+0x7d/0x120
[ 682.858209] unregister_netdevice_many+0x416/0x680
[ 682.858225] unregister_netdevice_queue+0xab/0xf0
[ 682.858240] unregister_netdev+0x18/0x20
[ 682.858255] rtw_unregister_netdevs+0x28/0x40 [r8723bs]
[ 682.858360] rtw_dev_remove+0x24/0xd0 [r8723bs]
[ 682.858463] sdio_bus_remove+0x31/0xd0 [mmc_core]
[ 682.858532] device_release_driver_internal+0xf7/0x1d0
[ 682.858550] driver_detach+0x47/0x90
[ 682.858564] bus_remove_driver+0x77/0xd0
[ 682.858579] rtw_drv_halt+0xc/0x678 [r8723bs]
[ 682.858685] __x64_sys_delete_module+0x13f/0x250
[ 682.858699] do_syscall_64+0x3a/0x80
[ 682.858715] entry_SYSCALL_64_after_hwframe+0x44/0xae
[ 682.858729]
other info that might help us debug this:[ 682.858737] Possible unsafe locking scenario:
[ 682.858744] CPU0 CPU1
[ 682.858751] ---- ----
[ 682.858758] lock(&pstapriv->sta_hash_lock);
[ 682.858772] lock(&pxmitpriv->lock);
[ 682.858786] lock(&pstapriv->sta_hash_lock);
[ 682.858799] lock(&pxmitpriv->lock);
[ 682.858812]
*** DEADLOCK ***[ 682.858820] 5 locks held by modprobe/1770:
[ 682.858831] #0: ffff8d870697d980 (&dev->mutex){....}-{3:3},
at: device_release_driver_internal+0x1a/0x1d0
[ 682.858869] #1: ffffffffbdbbf1c8 (rtnl_mutex){+.+.}-{3:3},
at: unregister_netdev+0xe/0x20
[ 682.858906] #2: ffff8d87054ee5e8 (&rdev->wiphy.mtx){+.+.}-{3:3},
at: cfg80211_netdev_notifier_call+0x9e/0x560 [cfg80211]
[ 682.859131] #3: ffff8d870f2bc8f0 (&wdev->mtx){+.+.}-{3:3},
at: cfg80211_leave+0x20/0x40 [cfg80211]
[ 682.859354] #4: ffffb6d0003336a8 (&pstapriv->sta_hash_lock){+.-.}-{2:2},
at: rtw_free_assoc_resources+0x48/0x110 [r8723bs]
[ 682.859482]
stack backtrace:
[ 682.859491] CPU: 1 PID: 1770 Comm: modprobe Tainted: G
C OE 5.14.0-rc6+ #16
[ 682.859507] Hardware name: LENOVO 80NR/Madrid, BIOS DACN25WW 08/20/2015
[ 682.859517] Call Trace:
[ 682.859531] dump_stack_lvl+0x56/0x6f
[ 682.859551] check_noncircular+0xdb/0xf0
[ 682.859579] __lock_acquire+0xfd9/0x1b50
[ 682.859606] lock_acquire+0xb4/0x2c0
[ 682.859623] ? rtw_free_stainfo+0x52/0x4a0 [r8723bs]
[ 682.859752] ? mark_held_locks+0x48/0x70
[ 682.859769] ? rtw_free_stainfo+0x4a/0x4a0 [r8723bs]
[ 682.859898] _raw_spin_lock_bh+0x34/0x40
[ 682.859914] ? rtw_free_stainfo+0x52/0x4a0 [r8723bs]
[ 682.860039] rtw_free_stainfo+0x52/0x4a0 [r8723bs]
[ 682.860171] rtw_free_assoc_resources+0x53/0x110 [r8723bs]
[ 682.860286] cfg80211_rtw_disconnect+0x4b/0x70 [r8723bs]
[ 682.860397] cfg80211_disconnect+0x12e/0x2f0 [cfg80211]
[ 682.860629] cfg80211_leave+0x2b/0x40 [cfg80211]
[ 682.860836] cfg80211_netdev_notifier_call+0xa9/0x560 [cfg80211]
[ 682.861048] ? __lock_acquire+0x4dc/0x1b50
[ 682.861070] ? lock_is_held_type+0xa8/0x110
[ 682.861089] ? lock_is_held_type+0xa8/0x110
[ 682.861104] ? find_held_lock+0x2d/0x90
[ 682.861120] ? packet_notifier+0x173/0x300
[ 682.861141] ? lock_release+0xb3/0x250
[ 682.861160] ? packet_notifier+0x192/0x300
[ 682.861184] raw_notifier_call_chain+0x41/0x50
[ 682.861205] __dev_close_many+0x62/0x100
[ 682.861224] dev_close_many+0x7d/0x120
[ 682.861245] unregister_netdevice_many+0x416/0x680
[ 682.861264] ? find_held_lock+0x2d/0x90
[ 682.861284] unregister_netdevice_queue+0xab/0xf0
[ 682.861306] unregister_netdev+0x18/0x20
[ 682.861325] rtw_unregister_netdevs+0x28/0x40 [r8723bs]
[ 682.861434] rtw_dev_remove+0x24/0xd0 [r8723bs]
[ 682.861542] sdio_bus_remove+0x31/0xd0 [mmc_core]
[ 682.861615] device_release_driver_internal+0xf7/0x1d0
[ 682.861637] driver_detach+0x47/0x90
[ 682.861656] bus_remove_driver+0x77/0xd0
[ 682.861674] rtw_drv_halt+0xc/0x678 [r8723bs]
[ 682.861782] __x64_sys_delete_module+0x13f/0x250
[ 682.861801] ? lockdep_hardirqs_on_prepare+0xf3/0x170
[ 682.861817] ? syscall_enter_from_user_mode+0x20/0x70
[ 682.861836] do_syscall_64+0x3a/0x80
[ 682.861855] entry_SYSCALL_64_after_hwframe+0x44/0xae
[ 682.861873] RIP: 0033:0x7f6dbe85400b
[ 682.861890] Code: 73 01 c3 48 8b 0d 6d 1e 0c 00 f7 d8 64 89
01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa
b8 b0 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 3d
1e 0c 00 f7 d8 64 89 01 48
[ 682.861906] RSP: 002b:00007ffe7a82f538 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0
[ 682.861923] RAX: ffffffffffffffda RBX: 000055a64693bd20 RCX: 00007f6dbe85400b
[ 682.861935] RDX: 0000000000000000 RSI: 0000000000000800 RDI: 000055a64693bd88
[ 682.861946] RBP: 000055a64693bd20 R08: 0000000000000000 R09: 0000000000000000
[ 682.861957] R10: 00007f6dbe8c7ac0 R11: 0000000000000206 R12: 000055a64693bd88
[ 682.861967] R13: 0000000000000000 R14: 000055a64693bd88 R15: 00007ffe7a831848This happens because when we enqueue a frame for transmission we do it under xmit_priv lock, then calling rtw_get_stainfo (needed for enqueuing) takes sta_hash_lock and this leads to the following lock dependency:
xmit_priv->lock -> sta_hash_lock
Turning off a connection will bring to callrtw_free_assoc_resources which will set up
the inverse dependency:
sta_hash_lock -> xmit_priv_lock
This could lead to a deadlock as lockdep complains.
Fix it by removing the xmit_priv->lock around rtw_xmitframe_enqueue call inside rtl8723bs_hal_xmit and put it in a smaller critical section inside rtw_xmit_classifier, the only place where xmit_priv data are actually accessed.
Replace spin_{lock,unlock}_bh(pxmitpriv->lock) in other tx paths leading to rtw_xmitframe_enqueue call with spin_{lock,unlock}_bh(psta->sleep_q.lock)
- it's not clear why accessing a sleep_q was protected by a spinlock on xmitpriv->lock.
This way is avoided the same faulty lock nesting
order.
Extra changes in v2 by Hans de Goede:
-Lift the taking of the struct __queue.lock spinlock out of
rtw_free_xmitframe_queue() into the callers this allows also protecting a bunch of related state in rtw_free_stainfo():
-Protect psta->sleepq_len on rtw_free_xmitframe_queue(&psta->sleep_q); -Protect struct tx_servq.tx_pending and tx_servq.qcnt when
calling rtw_free_xmitframe_queue(&tx_servq.sta_pending)
-This also allows moving the spin_lock_bh(&pxmitpriv->lock); to below
the sleep_q free-ing code, avoiding another ABBA locking issue
Tested-on: Lenovo Ideapad MiiX 300-10IBY
--- drivers/staging/rtl8723bs/core/rtw_mlme_ext.c | 7 ++---- drivers/staging/rtl8723bs/core/rtw_recv.c | 10 +++------ drivers/staging/rtl8723bs/core/rtw_sta_mgt.c | 22 ++++++++++--------- drivers/staging/rtl8723bs/core/rtw_xmit.c | 16 ++++++-------- .../staging/rtl8723bs/hal/rtl8723bs_xmit.c | 2 -- 5 files changed, 24 insertions(+), 33 deletions(-)
drivers/staging/rtl8723bs/core/rtw_mlme_ext.c +2 -5
@@ -6679,7 +6679,6 @@ u8 chk_bmc_sleepq_hdl(struct adapter *padapter, unsigned char *pbuf)struct sta_info *psta_bmc;struct list_head *xmitframe_plist, *xmitframe_phead;struct xmit_frame *pxmitframe =NULL ; -struct xmit_priv *pxmitpriv = &padapter->xmitpriv;struct sta_priv *pstapriv = &padapter->stapriv;/* for BC/MC Frames */
@@ -6690,8 +6689,7 @@ u8 chk_bmc_sleepq_hdl(struct adapter *padapter, unsigned char *pbuf)if ((pstapriv->tim_bitmap&BIT (0 )) && (psta_bmc->sleepq_len >0 )) {msleep (10 );/* 10ms, ATIM(HIQ) Windows */ -/* spin_lock_bh(&psta_bmc->sleep_q.lock); */ -spin_lock_bh (&pxmitpriv->lock); +spin_lock_bh (&psta_bmc->sleep_q.lock); xmitframe_phead =get_list_head (&psta_bmc->sleep_q); xmitframe_plist =get_next (xmitframe_phead);
@@ -6717,8 +6715,7 @@ u8 chk_bmc_sleepq_hdl(struct adapter *padapter, unsigned char *pbuf)rtw_hal_xmitframe_enqueue (padapter, pxmitframe); } -/* spin_unlock_bh(&psta_bmc->sleep_q.lock); */ -spin_unlock_bh (&pxmitpriv->lock); +spin_unlock_bh (&psta_bmc->sleep_q.lock);/* check hi queue and bmc_sleepq */ rtw_chk_hi_queue_cmd (padapter);
drivers/staging/rtl8723bs/core/rtw_recv.c +3 -7
@@ -1144,10 +1144,8 @@ sint validate_recv_ctrl_frame(struct adapter *padapter, union recv_frame *precv_if ((psta->state&WIFI_SLEEP_STATE ) && (pstapriv->sta_dz_bitmap&BIT (psta->aid))) {struct list_head *xmitframe_plist, *xmitframe_phead;struct xmit_frame *pxmitframe =NULL ; -struct xmit_priv *pxmitpriv = &padapter->xmitpriv; -/* spin_lock_bh(&psta->sleep_q.lock); */ -spin_lock_bh (&pxmitpriv->lock); +spin_lock_bh (&psta->sleep_q.lock); xmitframe_phead =get_list_head (&psta->sleep_q); xmitframe_plist =get_next (xmitframe_phead);
@@ -1182,12 +1180,10 @@ sint validate_recv_ctrl_frame(struct adapter *padapter, union recv_frame *precv_update_beacon (padapter, _TIM_IE_,NULL , true); } -/* spin_unlock_bh(&psta->sleep_q.lock); */ -spin_unlock_bh (&pxmitpriv->lock); +spin_unlock_bh (&psta->sleep_q.lock); }else { -/* spin_unlock_bh(&psta->sleep_q.lock); */ -spin_unlock_bh (&pxmitpriv->lock); +spin_unlock_bh (&psta->sleep_q.lock);/* DBG_871X("no buffered packets to xmit\n"); */ if (pstapriv->tim_bitmap&BIT (psta->aid)) {
drivers/staging/rtl8723bs/core/rtw_sta_mgt.c +12 -10
@@ -330,46 +330,48 @@ u32 rtw_free_stainfo(struct adapter *padapter, struct sta_info *psta)/* list_del_init(&psta->wakeup_list); */ -spin_lock_bh (&pxmitpriv->lock); - +spin_lock_bh (&psta->sleep_q.lock);rtw_free_xmitframe_queue (pxmitpriv, &psta->sleep_q); psta->sleepq_len =0 ; +spin_unlock_bh (&psta->sleep_q.lock); + +spin_lock_bh (&pxmitpriv->lock);/* vo */ -/* spin_lock_bh(&(pxmitpriv->vo_pending.lock)); */ +spin_lock_bh (&pstaxmitpriv->vo_q.sta_pending.lock);rtw_free_xmitframe_queue (pxmitpriv, &pstaxmitpriv->vo_q.sta_pending);list_del_init (&(pstaxmitpriv->vo_q.tx_pending)); phwxmit = pxmitpriv->hwxmits; phwxmit->accnt -= pstaxmitpriv->vo_q.qcnt; pstaxmitpriv->vo_q.qcnt =0 ; -/* spin_unlock_bh(&(pxmitpriv->vo_pending.lock)); */ +spin_unlock_bh (&pstaxmitpriv->vo_q.sta_pending.lock);/* vi */ -/* spin_lock_bh(&(pxmitpriv->vi_pending.lock)); */ +spin_lock_bh (&pstaxmitpriv->vi_q.sta_pending.lock);rtw_free_xmitframe_queue (pxmitpriv, &pstaxmitpriv->vi_q.sta_pending);list_del_init (&(pstaxmitpriv->vi_q.tx_pending)); phwxmit = pxmitpriv->hwxmits+1 ; phwxmit->accnt -= pstaxmitpriv->vi_q.qcnt; pstaxmitpriv->vi_q.qcnt =0 ; -/* spin_unlock_bh(&(pxmitpriv->vi_pending.lock)); */ +spin_unlock_bh (&pstaxmitpriv->vi_q.sta_pending.lock);/* be */ -/* spin_lock_bh(&(pxmitpriv->be_pending.lock)); */ +spin_lock_bh (&pstaxmitpriv->be_q.sta_pending.lock);rtw_free_xmitframe_queue (pxmitpriv, &pstaxmitpriv->be_q.sta_pending);list_del_init (&(pstaxmitpriv->be_q.tx_pending)); phwxmit = pxmitpriv->hwxmits+2 ; phwxmit->accnt -= pstaxmitpriv->be_q.qcnt; pstaxmitpriv->be_q.qcnt =0 ; -/* spin_unlock_bh(&(pxmitpriv->be_pending.lock)); */ +spin_unlock_bh (&pstaxmitpriv->be_q.sta_pending.lock);/* bk */ -/* spin_lock_bh(&(pxmitpriv->bk_pending.lock)); */ +spin_lock_bh (&pstaxmitpriv->bk_q.sta_pending.lock);rtw_free_xmitframe_queue (pxmitpriv, &pstaxmitpriv->bk_q.sta_pending);list_del_init (&(pstaxmitpriv->bk_q.tx_pending)); phwxmit = pxmitpriv->hwxmits+3 ; phwxmit->accnt -= pstaxmitpriv->bk_q.qcnt; pstaxmitpriv->bk_q.qcnt =0 ; -/* spin_unlock_bh(&(pxmitpriv->bk_pending.lock)); */ +spin_unlock_bh (&pstaxmitpriv->bk_q.sta_pending.lock);spin_unlock_bh (&pxmitpriv->lock);
drivers/staging/rtl8723bs/core/rtw_xmit.c +7 -9
@@ -1871,8 +1871,6 @@ void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, struct __queue *pframstruct list_head *plist, *phead;struct xmit_frame *pxmitframe; -spin_lock_bh (&pframequeue->lock); - phead =get_list_head (pframequeue); plist =get_next (phead);
@@ -1883,7 +1881,6 @@ void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, struct __queue *pframrtw_free_xmitframe (pxmitpriv, pxmitframe); } -spin_unlock_bh (&pframequeue->lock); }s32 rtw_xmitframe_enqueue (struct adapter *padapter,struct xmit_frame *pxmitframe)
@@ -1946,6 +1943,7 @@ s32 rtw_xmit_classifier(struct adapter *padapter, struct xmit_frame *pxmitframe)struct sta_info *psta;struct tx_servq *ptxservq;struct pkt_attrib *pattrib = &pxmitframe->attrib; +struct xmit_priv *xmit_priv = &padapter->xmitpriv;struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;sint res = _SUCCESS;
@@ -1974,12 +1972,14 @@ s32 rtw_xmit_classifier(struct adapter *padapter, struct xmit_frame *pxmitframe) ptxservq =rtw_get_sta_pending (padapter, psta, pattrib->priority, (u8 *)(&ac_index)); +spin_lock_bh (&xmit_priv->lock);if (list_empty (&ptxservq->tx_pending))list_add_tail (&ptxservq->tx_pending,get_list_head (phwxmits[ac_index].sta_queue));list_add_tail (&pxmitframe->list,get_list_head (&ptxservq->sta_pending)); ptxservq->qcnt++; phwxmits[ac_index].accnt++; +spin_unlock_bh (&xmit_priv->lock); exit:
@@ -2397,11 +2397,10 @@ void wakeup_sta_to_xmit(struct adapter *padapter, struct sta_info *psta)struct list_head *xmitframe_plist, *xmitframe_phead;struct xmit_frame *pxmitframe =NULL ;struct sta_priv *pstapriv = &padapter->stapriv; -struct xmit_priv *pxmitpriv = &padapter->xmitpriv; psta_bmc =rtw_get_bcmc_stainfo (padapter); -spin_lock_bh (&pxmitpriv->lock); +spin_lock_bh (&psta->sleep_q.lock); xmitframe_phead =get_list_head (&psta->sleep_q); xmitframe_plist =get_next (xmitframe_phead);
@@ -2509,7 +2508,7 @@ void wakeup_sta_to_xmit(struct adapter *padapter, struct sta_info *psta) _exit: -spin_unlock_bh (&pxmitpriv->lock); +spin_unlock_bh (&psta->sleep_q.lock);if (update_mask)update_beacon (padapter, _TIM_IE_,NULL , true);
@@ -2521,9 +2520,8 @@ void xmit_delivery_enabled_frames(struct adapter *padapter, struct sta_info *pststruct list_head *xmitframe_plist, *xmitframe_phead;struct xmit_frame *pxmitframe =NULL ;struct sta_priv *pstapriv = &padapter->stapriv; -struct xmit_priv *pxmitpriv = &padapter->xmitpriv; -spin_lock_bh (&pxmitpriv->lock); +spin_lock_bh (&psta->sleep_q.lock); xmitframe_phead =get_list_head (&psta->sleep_q); xmitframe_plist =get_next (xmitframe_phead);
@@ -2579,7 +2577,7 @@ void xmit_delivery_enabled_frames(struct adapter *padapter, struct sta_info *pst } } -spin_unlock_bh (&pxmitpriv->lock); +spin_unlock_bh (&psta->sleep_q.lock); } void enqueue_pending_xmitbuf(
drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c +0 -2
@@ -572,9 +572,7 @@ s32 rtl8723bs_hal_xmit(rtw_issue_addbareq_cmd (padapter, pxmitframe); } -spin_lock_bh (&pxmitpriv->lock); err =rtw_xmitframe_enqueue (padapter, pxmitframe); -spin_unlock_bh (&pxmitpriv->lock);if (err != _SUCCESS) {RT_TRACE (_module_hal_xmit_c_, _drv_err_, ("rtl8723bs_hal_xmit: enqueue xmitframe fail\n" ));rtw_free_xmitframe (pxmitpriv, pxmitframe);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 18/154 ARM: BCM53016: Specify switch ports for Meraki MR32
In reply to Greg Kroah-HartmanFrom: Christian Lamparter <[email protected]>
[ Upstream commit 6abc4ca5a28070945e0d68cb4160b309bfbf4b8b ]
the switch identifies itself as a BCM53012 (rev 5)... This patch has been tested & verified on OpenWrt's snapshot with Linux 5.10 (didn't test any older kernels). The MR32 is able to "talk to the network" as before with OpenWrt's SWITCHDEV b53 driver.
| b53-srab-switch 18007000.ethernet-switch: found switch: BCM53012, rev 5 | libphy: dsa slave smi: probed | b53-srab-switch 18007000.ethernet-switch poe (uninitialized): | PHY [dsa-0.0:00] driver [Generic PHY] (irq=POLL) | b53-srab-switch 18007000.ethernet-switch: Using legacy PHYLIB callbacks. | Please migrate to PHYLINK! | DSA: tree 0 setup
--- arch/arm/boot/dts/bcm53016-meraki-mr32.dts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
arch/arm/boot/dts/bcm53016-meraki-mr32.dts +22 -0
@@ -195,3 +195,25 @@ }; }; }; + +&srab { + status = "okay"; + + ports { + port@0 { + reg = <0>; + label = "poe"; + }; + + port@5 { + reg = <5>; + label = "cpu"; + ethernet = <&gmac0>; + + fixed-link { + speed = <1000>; + duplex-full; + }; + }; + }; +};
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 19/154 arm64: dts: qcom: msm8998: Fix CPU/L2 idle state latency and residency
In reply to Greg Kroah-HartmanFrom: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit 3f1dcaff642e75c1d2ad03f783fa8a3b1f56dd50 ]
The entry/exit latency and minimum residency in state for the idle states of MSM8998 were ..bad: first of all, for all of them the timings were written for CPU sleep but the min-residency-us param was miscalculated (supposedly, while porting this from downstream); Then, the power collapse states are setting PC on both the CPU cluster *and* the L2 cache, which have different timings: in the specific case of L2 the times are higher so these ones should be taken into account instead of the CPU ones.
This parameter misconfiguration was not giving particular issues because on MSM8998 there was no CPU scaling at all, so cluster/L2 power collapse was rarely (if ever) hit.
When CPU scaling is enabled, though, the wrong timings will produce SoC unstability shown to the user as random, apparently error-less, sudden reboots and/or lockups.
This set of parameters are stabilizing the SoC when CPU scaling is ON and when power collapse is frequently hit.
--- arch/arm64/boot/dts/qcom/msm8998.dtsi | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
arch/arm64/boot/dts/qcom/msm8998.dtsi +12 -8
@@ -300,38 +300,42 @@ LITTLE_CPU_SLEEP_0: cpu-sleep-0-0 { compatible = "arm,idle-state"; idle-state-name = "little-retention"; + /* CPU Retention (C2D), L2 Active */ arm,psci-suspend-param = <0x00000002>; entry-latency-us = <81>; exit-latency-us = <86>; - min-residency-us = <200>; + min-residency-us = <504>; }; LITTLE_CPU_SLEEP_1: cpu-sleep-0-1 { compatible = "arm,idle-state"; idle-state-name = "little-power-collapse"; + /* CPU + L2 Power Collapse (C3, D4) */ arm,psci-suspend-param = <0x40000003>; - entry-latency-us = <273>; - exit-latency-us = <612>; - min-residency-us = <1000>; + entry-latency-us = <814>; + exit-latency-us = <4562>; + min-residency-us = <9183>; local-timer-stop; }; BIG_CPU_SLEEP_0: cpu-sleep-1-0 { compatible = "arm,idle-state"; idle-state-name = "big-retention"; + /* CPU Retention (C2D), L2 Active */ arm,psci-suspend-param = <0x00000002>; entry-latency-us = <79>; exit-latency-us = <82>; - min-residency-us = <200>; + min-residency-us = <1302>; }; BIG_CPU_SLEEP_1: cpu-sleep-1-1 { compatible = "arm,idle-state"; idle-state-name = "big-power-collapse"; + /* CPU + L2 Power Collapse (C3, D4) */ arm,psci-suspend-param = <0x40000003>; - entry-latency-us = <336>; - exit-latency-us = <525>; - min-residency-us = <1000>; + entry-latency-us = <724>; + exit-latency-us = <2027>; + min-residency-us = <9419>; local-timer-stop; }; };
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 20/154 arm64: dts: qcom: ipq6018: Fix qcom,controlled-remotely property
In reply to Greg Kroah-HartmanFrom: Shawn Guo <[email protected]>
[ Upstream commit 3509de752ea14c7e5781b3a56a4a0bf832f5723a ]
Property qcom,controlled-remotely should be boolean. Fix it.
--- arch/arm64/boot/dts/qcom/ipq6018.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/ipq6018.dtsi +1 -1
@@ -200,7 +200,7 @@ clock-names = "bam_clk"; #dma-cells = <1>; qcom,ee = <1>; - qcom,controlled-remotely = <1>; + qcom,controlled-remotely; qcom,config-pipe-trust-reg = <0>; };
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 21/154 arm64: dts: qcom: msm8916: Add unit name for /soc node
In reply to Greg Kroah-HartmanFrom: Stephan Gerhold <[email protected]>
[ Upstream commit 7a62bfebc8c94bdb6eb8f54f49889dc6b5b79601 ]
This fixes the following warning when building with W=1:
Warning (unit_address_vs_reg): /soc: node has a reg or ranges property, but no unit name
--- arch/arm64/boot/dts/qcom/msm8916.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/msm8916.dtsi +1 -1
@@ -384,7 +384,7 @@ }; }; - soc: soc { + soc: soc@0 { #address-cells = <1>; #size-cells = <1>; ranges = <0 0 0 0xffffffff>;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 22/154 arm64: dts: freescale: fix arm,sp805 compatible string
In reply to Greg Kroah-HartmanFrom: Michael Walle <[email protected]>
[ Upstream commit 99a7cacc66cae92db40139b57689be2af75fc6b8 ]
According to Documentation/devicetree/bindings/watchdog/arm,sp805.yaml the compatible is:
compatible = "arm,sp805", "arm,primecell";
The current compatible string doesn't exist at all. Fix it.
--- arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi | 16 ++++++++-------- arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-)
arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi +8 -8
@@ -673,56 +673,56 @@ }; cluster1_core0_watchdog: wdt@c000000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc000000 0x0 0x1000>; clocks = <&clockgen 4 15>, <&clockgen 4 15>; clock-names = "wdog_clk", "apb_pclk"; }; cluster1_core1_watchdog: wdt@c010000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc010000 0x0 0x1000>; clocks = <&clockgen 4 15>, <&clockgen 4 15>; clock-names = "wdog_clk", "apb_pclk"; }; cluster1_core2_watchdog: wdt@c020000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc020000 0x0 0x1000>; clocks = <&clockgen 4 15>, <&clockgen 4 15>; clock-names = "wdog_clk", "apb_pclk"; }; cluster1_core3_watchdog: wdt@c030000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc030000 0x0 0x1000>; clocks = <&clockgen 4 15>, <&clockgen 4 15>; clock-names = "wdog_clk", "apb_pclk"; }; cluster2_core0_watchdog: wdt@c100000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc100000 0x0 0x1000>; clocks = <&clockgen 4 15>, <&clockgen 4 15>; clock-names = "wdog_clk", "apb_pclk"; }; cluster2_core1_watchdog: wdt@c110000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc110000 0x0 0x1000>; clocks = <&clockgen 4 15>, <&clockgen 4 15>; clock-names = "wdog_clk", "apb_pclk"; }; cluster2_core2_watchdog: wdt@c120000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc120000 0x0 0x1000>; clocks = <&clockgen 4 15>, <&clockgen 4 15>; clock-names = "wdog_clk", "apb_pclk"; }; cluster2_core3_watchdog: wdt@c130000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc130000 0x0 0x1000>; clocks = <&clockgen 4 15>, <&clockgen 4 15>; clock-names = "wdog_clk", "apb_pclk";
arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi +8 -8
@@ -351,56 +351,56 @@ }; cluster1_core0_watchdog: wdt@c000000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc000000 0x0 0x1000>; clocks = <&clockgen 4 3>, <&clockgen 4 3>; clock-names = "wdog_clk", "apb_pclk"; }; cluster1_core1_watchdog: wdt@c010000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc010000 0x0 0x1000>; clocks = <&clockgen 4 3>, <&clockgen 4 3>; clock-names = "wdog_clk", "apb_pclk"; }; cluster2_core0_watchdog: wdt@c100000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc100000 0x0 0x1000>; clocks = <&clockgen 4 3>, <&clockgen 4 3>; clock-names = "wdog_clk", "apb_pclk"; }; cluster2_core1_watchdog: wdt@c110000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc110000 0x0 0x1000>; clocks = <&clockgen 4 3>, <&clockgen 4 3>; clock-names = "wdog_clk", "apb_pclk"; }; cluster3_core0_watchdog: wdt@c200000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc200000 0x0 0x1000>; clocks = <&clockgen 4 3>, <&clockgen 4 3>; clock-names = "wdog_clk", "apb_pclk"; }; cluster3_core1_watchdog: wdt@c210000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc210000 0x0 0x1000>; clocks = <&clockgen 4 3>, <&clockgen 4 3>; clock-names = "wdog_clk", "apb_pclk"; }; cluster4_core0_watchdog: wdt@c300000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc300000 0x0 0x1000>; clocks = <&clockgen 4 3>, <&clockgen 4 3>; clock-names = "wdog_clk", "apb_pclk"; }; cluster4_core1_watchdog: wdt@c310000 { - compatible = "arm,sp805-wdt", "arm,primecell"; + compatible = "arm,sp805", "arm,primecell"; reg = <0x0 0xc310000 0x0 0x1000>; clocks = <&clockgen 4 3>, <&clockgen 4 3>; clock-names = "wdog_clk", "apb_pclk";
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 23/154 ASoC: SOF: Intel: hda-dai: fix potential locking issue
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit a20f3b10de61add5e14b6ce4df982f4df2a4cbbc ]
The initial hdac_stream code was adapted a third time with the same locking issues. Move the spin_lock outside the loops and make sure the fields are protected on read/write.
--- sound/soc/sof/intel/hda-dai.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
sound/soc/sof/intel/hda-dai.c +4 -3
@@ -68,6 +68,7 @@ static struct hdac_ext_stream *return NULL ; } +spin_lock_irq (&bus->reg_lock);list_for_each_entry (stream, &bus->stream_list, list) {struct hdac_ext_stream *hstream =stream_to_hdac_ext_stream (stream);
@@ -107,12 +108,12 @@ static struct hdac_ext_stream ** is updated in snd_hdac_ext_stream_decouple(). */ if (!res->decoupled) -snd_hdac_ext_stream_decouple (bus, res, true); -spin_lock_irq (&bus->reg_lock); +snd_hdac_ext_stream_decouple_locked (bus, res, true); + res->link_locked =1 ; res->link_substream = substream; -spin_unlock_irq (&bus->reg_lock); } +spin_unlock_irq (&bus->reg_lock);return res; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 24/154 clk: imx: imx6ul: Move csi_sel mux to correct base register
In reply to Greg Kroah-HartmanFrom: Stefan Riedmueller <[email protected]>
[ Upstream commit 2f9d61869640f732599ec36b984c2b5c46067519 ]
The csi_sel mux register is located in the CCM register base and not the CCM_ANALOG register base. So move it to the correct position in code.
Otherwise changing the parent of the csi clock can lead to a complete system failure due to the CCM_ANALOG_PLL_SYS_TOG register being falsely modified.
Also remove the SET_RATE_PARENT flag since one possible supply for the csi_sel mux is the system PLL which we don't want to modify.
--- drivers/clk/imx/clk-imx6ul.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/imx/clk-imx6ul.c +1 -1
@@ -161,7 +161,6 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node) hws[IMX6UL_PLL5_BYPASS ] =imx_clk_hw_mux_flags ("pll5_bypass" , base +0xa0 ,16 ,1 , pll5_bypass_sels,ARRAY_SIZE (pll5_bypass_sels),CLK_SET_RATE_PARENT ); hws[IMX6UL_PLL6_BYPASS ] =imx_clk_hw_mux_flags ("pll6_bypass" , base +0xe0 ,16 ,1 , pll6_bypass_sels,ARRAY_SIZE (pll6_bypass_sels),CLK_SET_RATE_PARENT ); hws[IMX6UL_PLL7_BYPASS ] =imx_clk_hw_mux_flags ("pll7_bypass" , base +0x20 ,16 ,1 , pll7_bypass_sels,ARRAY_SIZE (pll7_bypass_sels),CLK_SET_RATE_PARENT ); - hws[IMX6UL_CLK_CSI_SEL ] =imx_clk_hw_mux_flags ("csi_sel" , base +0x3c ,9 ,2 , csi_sels,ARRAY_SIZE (csi_sels),CLK_SET_RATE_PARENT );/* Do not bypass PLLs initially */ clk_set_parent (hws[IMX6UL_PLL1_BYPASS ]->clk, hws[IMX6UL_CLK_PLL1 ]->clk);
@@ -270,6 +269,7 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node) hws[IMX6UL_CLK_ECSPI_SEL ] =imx_clk_hw_mux ("ecspi_sel" , base +0x38 ,18 ,1 , ecspi_sels,ARRAY_SIZE (ecspi_sels)); hws[IMX6UL_CLK_LCDIF_PRE_SEL ] =imx_clk_hw_mux_flags ("lcdif_pre_sel" , base +0x38 ,15 ,3 , lcdif_pre_sels,ARRAY_SIZE (lcdif_pre_sels),CLK_SET_RATE_PARENT ); hws[IMX6UL_CLK_LCDIF_SEL ] =imx_clk_hw_mux ("lcdif_sel" , base +0x38 ,9 ,3 , lcdif_sels,ARRAY_SIZE (lcdif_sels)); + hws[IMX6UL_CLK_CSI_SEL ] =imx_clk_hw_mux ("csi_sel" , base +0x3c ,9 ,2 , csi_sels,ARRAY_SIZE (csi_sels)); hws[IMX6UL_CLK_LDB_DI0_DIV_SEL ] =imx_clk_hw_mux ("ldb_di0" , base +0x20 ,10 ,1 , ldb_di0_div_sels,ARRAY_SIZE (ldb_di0_div_sels)); hws[IMX6UL_CLK_LDB_DI1_DIV_SEL ] =imx_clk_hw_mux ("ldb_di1" , base +0x20 ,11 ,1 , ldb_di1_div_sels,ARRAY_SIZE (ldb_di1_div_sels));
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 25/154 ASoC: nau8824: Add DMI quirk mechanism for active-high jack-detect
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 92d3360108f1839ca40451bad20ff67dd24a1964 ]
Add a quirk mechanism to allow specifying that active-high jack-detection should be used on platforms where this info is not available in devicetree.
And add an entry for the Cyberbook T116 tablet to the DMI table, so that jack-detection will work properly on this tablet.
--- sound/soc/codecs/nau8824.c | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
sound/soc/codecs/nau8824.c +40 -0
@@ -8,6 +8,7 @@#include <linux/module.h> #include <linux/delay.h> +#include <linux/dmi.h> #include <linux/init.h> #include <linux/i2c.h> #include <linux/regmap.h>
@@ -27,6 +28,12 @@#include "nau8824.h" +#define NAU8824_JD_ACTIVE_HIGH BIT(0) + +static int nau8824_quirk; +static int quirk_override =-1 ; +module_param_named (quirk, quirk_override, uint,0444 ); +MODULE_PARM_DESC (quirk,"Board-specific quirk override" );static int nau8824_config_sysclk (struct nau8824 *nau8824,int clk_id,unsigned int freq);
@@ -1875,6 +1882,34 @@ static int nau8824_read_device_properties(struct device *dev,return 0 ; } +/* Please keep this list alphabetically sorted */ +static const struct dmi_system_id nau8824_quirk_table[] = { + { +/* Cyberbook T116 rugged tablet */ + .matches = { +DMI_EXACT_MATCH (DMI_BOARD_VENDOR ,"Default string" ), +DMI_EXACT_MATCH (DMI_BOARD_NAME ,"Cherry Trail CR" ), +DMI_EXACT_MATCH (DMI_PRODUCT_SKU ,"20170531" ), + }, + .driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH ), + }, + {} +}; + +static void nau8824_check_quirks (void ) +{ +const struct dmi_system_id *dmi_id; + +if (quirk_override !=-1 ) { + nau8824_quirk = quirk_override; +return ; + } + + dmi_id =dmi_first_match (nau8824_quirk_table); +if (dmi_id) + nau8824_quirk = (unsigned long )dmi_id->driver_data; +} +static int nau8824_i2c_probe (struct i2c_client *i2c,const struct i2c_device_id *id) {
@@ -1899,6 +1934,11 @@ static int nau8824_i2c_probe(struct i2c_client *i2c, nau8824->irq = i2c->irq;sema_init (&nau8824->jd_sem,1 ); +nau8824_check_quirks (); + +if (nau8824_quirk &NAU8824_JD_ACTIVE_HIGH ) + nau8824->jkdet_polarity =0 ; +nau8824_print_device_properties (nau8824); ret =regmap_read (nau8824->regmap,NAU8824_REG_I2C_DEVICE_ID , &value);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 26/154 scsi: advansys: Fix kernel pointer leak
In reply to Greg Kroah-HartmanFrom: Guo Zhi <[email protected]>
[ Upstream commit d4996c6eac4c81b8872043e9391563f67f13e406 ]
Pointers should be printed with %p or %px rather than cast to 'unsigned long' and printed with %lx.
Change %lx to %p to print the hashed pointer.
--- drivers/scsi/advansys.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/advansys.c +2 -2
@@ -3366,8 +3366,8 @@ static void asc_prt_adv_board_info(struct seq_file *m, struct Scsi_Host *shost) shost->host_no);seq_printf (m, -" iop_base 0x%lx, cable_detect: %X, err_code %u\n" , - (unsigned long )v->iop_base, +" iop_base 0x%p, cable_detect: %X, err_code %u\n" , + v->iop_base,AdvReadWordRegister (iop_base,IOPW_SCSI_CFG1 ) &CABLE_DETECT , v->err_code);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 27/154 ALSA: intel-dsp-config: add quirk for APL/GLK/TGL devices based on ES8336 codec
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 9d36ceab94151f07cf3fcb067213ac87937adf12 ]
These devices are based on an I2C/I2S device, we need to force the use of the SOF driver otherwise the legacy HDaudio driver will be loaded - only HDMI will be supported.
--- sound/hda/intel-dsp-config.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-)
sound/hda/intel-dsp-config.c +20 -2
@@ -30,6 +30,7 @@ struct config_entry {u32 flags;u16 device;const struct dmi_system_id *dmi_table; +u8 codec_hid[ACPI_ID_LEN ]; };/*
@@ -55,7 +56,7 @@ static const struct config_entry config_table[] = {/* * Apollolake (Broxton-P) * the legacy HDAudio driver is used except on Up Squared (SOF) and -* Chromebooks (SST) +* Chromebooks (SST), as well as devices based on the ES8336 codec */ #if IS_ENABLED (CONFIG_SND_SOC_SOF_APOLLOLAKE ) {
@@ -72,6 +73,11 @@ static const struct config_entry config_table[] = { {} } }, + { + .flags = FLAG_SOF, + .device = 0x5a98, + .codec_hid = "ESSX8336", + }, #endif#if IS_ENABLED (CONFIG_SND_SOC_INTEL_APL ) {
@@ -136,7 +142,7 @@ static const struct config_entry config_table[] = {/* * Geminilake uses legacy HDAudio driver except for Google -* Chromebooks +* Chromebooks and devices based on the ES8336 codec */ /* Geminilake */ #if IS_ENABLED (CONFIG_SND_SOC_SOF_GEMINILAKE )
@@ -153,6 +159,11 @@ static const struct config_entry config_table[] = { {} } }, + { + .flags = FLAG_SOF, + .device = 0x3198, + .codec_hid = "ESSX8336", + }, #endif/*
@@ -310,6 +321,11 @@ static const struct config_entry config_table[] = { .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, .device = 0x43c8, }, + { + .flags = FLAG_SOF, + .device = 0xa0c8, + .codec_hid = "ESSX8336", + },#endif /* Elkhart Lake */
@@ -337,6 +353,8 @@ static const struct config_entry *snd_intel_dsp_find_configcontinue ;if (table->dmi_table && !dmi_check_system (table->dmi_table))continue ; +if (table->codec_hid[0 ] && !acpi_dev_present (table->codec_hid,NULL ,-1 )) +continue ;return table; }return NULL ;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 28/154 ASoC: Intel: sof_sdw: add missing quirk for Dell SKU 0A45
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 64ba6d2ce72ffde70dc5a1794917bf1573203716 ]
This device is based on SDCA codecs but with a single amplifier instead of two.
--- sound/soc/intel/boards/sof_sdw.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
sound/soc/intel/boards/sof_sdw.c +10 -0
@@ -187,6 +187,16 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {SOF_RT715_DAI_ID_FIX | SOF_SDW_FOUR_SPK), }, + { + .callback = sof_sdw_quirk_cb, + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc" ), +DMI_EXACT_MATCH (DMI_PRODUCT_SKU ,"0A45" ) + }, + .driver_data = (void *)(SOF_SDW_TGL_HDMI | +RT711_JD2 | + SOF_RT715_DAI_ID_FIX), + }, /* AlderLake devices */ { .callback = sof_sdw_quirk_cb,
Signature · 1 line
2.33.0
Re: [PATCH 5.10 028/154] ASoC: Intel: sof_sdw: add missing quirk for Dell SKU 0A45
Hi Greg,
Quoted 29 lines · Greg Kroah-Hartman
From: Pierre-Louis Bossart <[email protected]>
[ Upstream commit
64ba6d2ce72ffde70dc5a1794917bf1573203716]This device is based on SDCA codecs but with a single amplifier instead of two.
Signed-off-by Pierre-Louis Bossart <[email protected]>Reviewed-by Rander Wang <[email protected]>Reviewed-by Bard Liao <[email protected]>Signed-off-by Mark Brown <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- sound/soc/intel/boards/sof_sdw.c | 10 ++++++++++ 1 file changed, 10 insertions(+)sound/soc/intel/boards/sof_sdw.c +3
-0@@ -187,6 +187,16 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {SOF_RT715_DAI_ID_FIX | SOF_SDW_FOUR_SPK), }, + { + .callback = sof_sdw_quirk_cb, + .matches = {
sound/soc/intel/boards/sof_sdw.c static const struct dmi_system_id sof_sdw_quirk_table[] = { · line 202
Quoted 10 lines
sound/soc/intel/boards/sof_sdw.c +7
-0+DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc" ), +DMI_EXACT_MATCH (DMI_PRODUCT_SKU ,"0A45" ) + }, + .driver_data = (void *)(SOF_SDW_TGL_HDMI | +RT711_JD2 | + SOF_RT715_DAI_ID_FIX), + }, /* AlderLake devices */ { .callback = sof_sdw_quirk_cb,
This one causes a build failure:
sound/soc/intel/boards/sof_sdw.c:197:41: error: ‘RT711_JD2’ undeclared here (not in a function)
197 | RT711_JD2 |
| ^~~~~~~~~ CC lib/mpi/mpicoder.o
make[7]: *** [scripts/Makefile.build:280: sound/soc/intel/boards/sof_sdw.o] Error 1 make[6]: *** [scripts/Makefile.build:497: sound/soc/intel/boards] Error 2 make[5]: *** [scripts/Makefile.build:497: sound/soc/intel] Error 2 make[4]: *** [scripts/Makefile.build:497: sound/soc] Error 2
make[3]: *** [Makefile:1822: sound] Error 2
We do not have for instance 8e6c00f1fdea ("ASoC: Intel: sof_sdw: include rt711.h for RT711 JD mode") for stable series.
Regards,
Salvatore
Re: [PATCH 5.10 028/154] ASoC: Intel: sof_sdw: add missing quirk for Dell SKU 0A45
Quoted 55 lines · Salvatore Bonaccorso
Hi Greg,
Quoted 29 lines · Greg Kroah-Hartman
From: Pierre-Louis Bossart <[email protected]>
[ Upstream commit
64ba6d2ce72ffde70dc5a1794917bf1573203716]This device is based on SDCA codecs but with a single amplifier instead of two.
Signed-off-by Pierre-Louis Bossart <[email protected]>Reviewed-by Rander Wang <[email protected]>Reviewed-by Bard Liao <[email protected]>Signed-off-by Mark Brown <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- sound/soc/intel/boards/sof_sdw.c | 10 ++++++++++ 1 file changed, 10 insertions(+)sound/soc/intel/boards/sof_sdw.c +3
-0@@ -187,6 +187,16 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {SOF_RT715_DAI_ID_FIX | SOF_SDW_FOUR_SPK), }, + { + .callback = sof_sdw_quirk_cb, + .matches = {sound/soc/intel/boards/sof_sdw.c static const struct dmi_system_id sof_sdw_quirk_table[] = { · line 202
Quoted 10 lines
sound/soc/intel/boards/sof_sdw.c +7
-0+DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc" ), +DMI_EXACT_MATCH (DMI_PRODUCT_SKU ,"0A45" ) + }, + .driver_data = (void *)(SOF_SDW_TGL_HDMI | +RT711_JD2 | + SOF_RT715_DAI_ID_FIX), + }, /* AlderLake devices */ { .callback = sof_sdw_quirk_cb,This one causes a build failure:
sound/soc/intel/boards/sof_sdw.c:197:41: error: ‘RT711_JD2’ undeclared here (not in a function)197 | RT711_JD2 | | ^~~~~~~~~CC
lib/mpi/mpicoder.o
make[7]: *** [scripts/Makefile.build:280:sound/soc/intel/boards/sof_sdw.o] Error 1 make[6]: *** [scripts/Makefile.build:497:sound/soc/intel/boards] Error 2 make[5]: *** [scripts/Makefile.build:497:sound/soc/intel] Error 2 make[4]: *** [scripts/Makefile.build:497:sound/soc] Error 2
make[3]: *** [Makefile:1822: sound] Error 2
Quoted 2 lines
We do not have for instance
8e6c00f1fdea("ASoC: Intel:sof_sdw: includert711.hfor RT711 JD mode") for stable series.
Should have added: [...] before 5.15-rc1.
Regards,
Salvatore
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 028/154] ASoC: Intel: sof_sdw: add missing quirk for Dell SKU 0A45
Quoted 56 lines · Salvatore Bonaccorso
Quoted 55 lines · Salvatore Bonaccorso
Hi Greg,
Quoted 29 lines · Greg Kroah-Hartman
From: Pierre-Louis Bossart <[email protected]>
[ Upstream commit
64ba6d2ce72ffde70dc5a1794917bf1573203716]This device is based on SDCA codecs but with a single amplifier instead of two.
Signed-off-by Pierre-Louis Bossart <[email protected]>Reviewed-by Rander Wang <[email protected]>Reviewed-by Bard Liao <[email protected]>Signed-off-by Mark Brown <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- sound/soc/intel/boards/sof_sdw.c | 10 ++++++++++ 1 file changed, 10 insertions(+)sound/soc/intel/boards/sof_sdw.c +3
-0@@ -187,6 +187,16 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {SOF_RT715_DAI_ID_FIX | SOF_SDW_FOUR_SPK), }, + { + .callback = sof_sdw_quirk_cb, + .matches = {sound/soc/intel/boards/sof_sdw.c static const struct dmi_system_id sof_sdw_quirk_table[] = { · line 202
Quoted 10 lines
sound/soc/intel/boards/sof_sdw.c +7
-0+DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc" ), +DMI_EXACT_MATCH (DMI_PRODUCT_SKU ,"0A45" ) + }, + .driver_data = (void *)(SOF_SDW_TGL_HDMI | +RT711_JD2 | + SOF_RT715_DAI_ID_FIX), + }, /* AlderLake devices */ { .callback = sof_sdw_quirk_cb,This one causes a build failure:
sound/soc/intel/boards/sof_sdw.c:197:41: error: ‘RT711_JD2’ undeclared here (not in a function)197 | RT711_JD2 | | ^~~~~~~~~CC
lib/mpi/mpicoder.o
make[7]: *** [scripts/Makefile.build:280:sound/soc/intel/boards/sof_sdw.o] Error 1 make[6]: *** [scripts/Makefile.build:497:sound/soc/intel/boards] Error 2 make[5]: *** [scripts/Makefile.build:497:sound/soc/intel] Error 2 make[4]: *** [scripts/Makefile.build:497:sound/soc] Error 2
make[3]: *** [Makefile:1822: sound] Error 2
Quoted 4 lines
Quoted 2 lines
We do not have for instance
8e6c00f1fdea("ASoC: Intel:sof_sdw: includert711.hfor RT711 JD mode") for stable series.Should have added: [...] before 5.15-rc1.
Thanks, I'll go drop the commit for now, if someone needs/wants it, I'll take a working backport :)
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 29/154 firmware_loader: fix pre-allocated buf built-in firmware use
In reply to Greg Kroah-HartmanFrom: Luis Chamberlain <[email protected]>
[ Upstream commit f7a07f7b96033df7709042ff38e998720a3f7119 ]
The firmware_loader can be used with a pre-allocated buffer through the use of the API calls:
o request_firmware_into_buf()
o request_partial_firmware_into_buf()
If the firmware was built-in and present, our current check for if the built-in firmware fits into the pre-allocated buffer does not return any errors, and we proceed to tell the caller that everything worked fine. It's a lie and no firmware would end up being copied into the pre-allocated buffer. So if the caller trust the result it may end up writing a bunch of 0's to a device!
Fix this by making the function that checks for the pre-allocated buffer return non-void. Since the typical use case is when no pre-allocated buffer is provided make this return successfully for that case. If the built-in firmware does *not* fit into the pre-allocated buffer size return a failure as we should have been doing before.
I'm not aware of users of the built-in firmware using the API calls with a pre-allocated buffer, as such I doubt this fixes any real life issue. But you never know... perhaps some oddball private tree might use it.
In so far as upstream is concerned this just fixes our code for correctness.
--- drivers/base/firmware_loader/main.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/base/firmware_loader/main.c +7 -6
@@ -99,12 +99,15 @@ static struct firmware_cache fw_cache;extern struct builtin_fw __start_builtin_fw[];extern struct builtin_fw __end_builtin_fw[]; -static void fw_copy_to_prealloc_buf (struct firmware *fw, +static bool fw_copy_to_prealloc_buf (struct firmware *fw,void *buf,size_t size) { -if (!buf || size < fw->size) -return ; +if (!buf) +return true; +if (size < fw->size) +return false;memcpy (buf, fw->data, fw->size); +return true; } static bool fw_get_builtin_firmware(struct firmware *fw, const char *name,
@@ -116,9 +119,7 @@ static bool fw_get_builtin_firmware(struct firmware *fw, const char *name,if (strcmp (name, b_fw->name) ==0 ) { fw->size = b_fw->size; fw->data = b_fw->data; -fw_copy_to_prealloc_buf (fw, buf, size); - -return true; +return fw_copy_to_prealloc_buf (fw, buf, size); } }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 30/154 cpuidle: tegra: Check whether PMC is ready
In reply to Greg Kroah-HartmanFrom: Dmitry Osipenko <[email protected]>
[ Upstream commit bdb1ffdad3b73e4d0538098fc02e2ea87a6b27cd ]
Check whether PMC is ready before proceeding with the cpuidle registration. This fixes racing with the PMC driver probe order, which results in a disabled deepest CC6 idling state if cpuidle driver is probed before the PMC.
--- drivers/cpuidle/cpuidle-tegra.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/cpuidle/cpuidle-tegra.c +3 -0
@@ -346,6 +346,9 @@ static void tegra_cpuidle_setup_tegra114_c7_state(void)static int tegra_cpuidle_probe (struct platform_device *pdev) { +if (tegra_pmc_get_suspend_mode () ==TEGRA_SUSPEND_NOT_READY ) +return -EPROBE_DEFER ; +/* LP2 could be disabled in device-tree */ if (tegra_pmc_get_suspend_mode () <TEGRA_SUSPEND_LP2 )tegra_cpuidle_disable_state (TEGRA_CC6 );
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 31/154 ARM: dts: omap: fix gpmc,mux-add-data type
In reply to Greg Kroah-HartmanFrom: Roger Quadros <[email protected]>
[ Upstream commit 51b9e22ffd3c4c56cbb7caae9750f70e55ffa603 ]
gpmc,mux-add-data is not boolean.
Fixes the below errors flagged by dtbs_check.
"ethernet@4,0:gpmc,mux-add-data: True is not of type 'array'"
--- arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi | 2 +- arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi +1 -1
@@ -29,7 +29,7 @@ compatible = "smsc,lan9221","smsc,lan9115"; bank-width = <2>; - gpmc,mux-add-data; + gpmc,mux-add-data = <0>; gpmc,cs-on-ns = <0>; gpmc,cs-rd-off-ns = <42>; gpmc,cs-wr-off-ns = <36>;
arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi +1 -1
@@ -22,7 +22,7 @@ compatible = "smsc,lan9221","smsc,lan9115"; bank-width = <2>; - gpmc,mux-add-data; + gpmc,mux-add-data = <0>; gpmc,cs-on-ns = <0>; gpmc,cs-rd-off-ns = <42>; gpmc,cs-wr-off-ns = <36>;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 32/154 usb: host: ohci-tmio: check return value after calling platform_get_resource()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 9eff2b2e59fda25051ab36cd1cb5014661df657b ]
It will cause null-ptr-deref if platform_get_resource() returns NULL, we need check the return value.
--- drivers/usb/host/ohci-tmio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/ohci-tmio.c +1 -1
@@ -199,7 +199,7 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)if (usb_disabled ())return -ENODEV ; -if (!cell) +if (!cell || !regs || !config || !sram)return -EINVAL ;if (irq <0 )
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 33/154 ARM: dts: ls1021a: move thermal-zones node out of soc/
In reply to Greg Kroah-HartmanFrom: Li Yang <[email protected]>
[ Upstream commit 1ee1500ef717eefb5d9bdaf97905cb81b4e69aa4 ]
This fixes dtbs-check error from simple-bus schema:
soc: thermal-zones: {'type': 'object'} is not allowed for {'cpu-thermal': ..... }
From schema: /home/leo/.local/lib/python3.8/site-packages/dtschema/schemas/simple-bus.yaml
--- arch/arm/boot/dts/ls1021a.dtsi | 66 +++++++++++++++++----------------- 1 file changed, 33 insertions(+), 33 deletions(-)
arch/arm/boot/dts/ls1021a.dtsi +33 -33
@@ -331,39 +331,6 @@ #thermal-sensor-cells = <1>; }; - thermal-zones { - cpu_thermal: cpu-thermal { - polling-delay-passive = <1000>; - polling-delay = <5000>; - - thermal-sensors = <&tmu 0>; - - trips { - cpu_alert: cpu-alert { - temperature = <85000>; - hysteresis = <2000>; - type = "passive"; - }; - cpu_crit: cpu-crit { - temperature = <95000>; - hysteresis = <2000>; - type = "critical"; - }; - }; - - cooling-maps { - map0 { - trip = <&cpu_alert>; - cooling-device = - <&cpu0 THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu1 THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>; - }; - }; - }; - }; - dspi0: spi@2100000 { compatible = "fsl,ls1021a-v1.0-dspi"; #address-cells = <1>;
@@ -1018,4 +985,37 @@ big-endian; }; }; + + thermal-zones { + cpu_thermal: cpu-thermal { + polling-delay-passive = <1000>; + polling-delay = <5000>; + + thermal-sensors = <&tmu 0>; + + trips { + cpu_alert: cpu-alert { + temperature = <85000>; + hysteresis = <2000>; + type = "passive"; + }; + cpu_crit: cpu-crit { + temperature = <95000>; + hysteresis = <2000>; + type = "critical"; + }; + }; + + cooling-maps { + map0 { + trip = <&cpu_alert>; + cooling-device = + <&cpu0 THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu1 THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>; + }; + }; + }; + }; };
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 34/154 ARM: dts: ls1021a-tsn: use generic "jedec,spi-nor" compatible for flash
In reply to Greg Kroah-HartmanFrom: Li Yang <[email protected]>
[ Upstream commit 05e63b48b20fa70726be505a7660d1a07bc1cffb ]
We cannot list all the possible chips used in different board revisions, just use the generic "jedec,spi-nor" compatible instead. This also fixes dtbs_check error:
['jedec,spi-nor', 's25fl256s1', 's25fl512s'] is too long
--- arch/arm/boot/dts/ls1021a-tsn.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/ls1021a-tsn.dts +1 -1
@@ -251,7 +251,7 @@ flash@0 { /* Rev. A uses 64MB flash, Rev. B & C use 32MB flash */ - compatible = "jedec,spi-nor", "s25fl256s1", "s25fl512s"; + compatible = "jedec,spi-nor"; spi-max-frequency = <20000000>; #address-cells = <1>; #size-cells = <1>;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 35/154 ALSA: ISA: not for M68K
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit 3c05f1477e62ea5a0a8797ba6a545b1dc751fb31 ]
On m68k, compiling drivers under SND_ISA causes build errors:
../sound/core/isadma.c: In function 'snd_dma_program':../sound/core/isadma.c:33:17: error: implicit declaration of function 'claim_dma_lock' [-Werror=implicit-function-declaration]
33 | flags = claim_dma_lock();
| ^~~~~~~~~~~~~~
../sound/core/isadma.c:41:9: error: implicit declaration of function 'release_dma_lock' [-Werror=implicit-function-declaration]
41 | release_dma_lock(flags);
| ^~~~~~~~~~~~~~~~../sound/isa/sb/sb16_main.c: In function 'snd_sb16_playback_prepare':../sound/isa/sb/sb16_main.c:253:72: error: 'DMA_AUTOINIT' undeclared (first use in this function)
253 | snd_dma_program(dma, runtime->dma_addr, size, DMA_MODE_WRITE | DMA_AUTOINIT);
| ^~~~~~~~~~~~../sound/isa/sb/sb16_main.c:253:72: note: each undeclared identifier is reported only once for each function it appears in ../sound/isa/sb/sb16_main.c: In function 'snd_sb16_capture_prepare':../sound/isa/sb/sb16_main.c:322:71: error: 'DMA_AUTOINIT' undeclared (first use in this function)
322 | snd_dma_program(dma, runtime->dma_addr, size, DMA_MODE_READ | DMA_AUTOINIT);
| ^~~~~~~~~~~~
and more...
--- sound/core/Makefile | 2 ++ sound/isa/Kconfig | 2 +- sound/pci/Kconfig | 1 + 3 files changed, 4 insertions(+), 1 deletion(-)
sound/core/Makefile +2 -0
@@ -9,7 +9,9 @@ ifneq ($(CONFIG_SND_PROC_FS),) snd-y += info.o snd-$(CONFIG_SND_OSSEMUL) += info_oss.o endif +ifneq ($(CONFIG_M68K),y) snd-$(CONFIG_ISA_DMA_API) += isadma.o +endif snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o snd-$(CONFIG_SND_VMASTER) += vmaster.o snd-$(CONFIG_SND_JACK) += ctljack.o jack.o
sound/isa/Kconfig +1 -1
@@ -22,7 +22,7 @@ config SND_SB16_DSP menuconfig SND_ISA bool "ISA sound devices" depends on ISA || COMPILE_TEST - depends on ISA_DMA_API + depends on ISA_DMA_API && !M68K default y help Support for sound devices connected via the ISA bus.
sound/pci/Kconfig +1 -0
@@ -279,6 +279,7 @@ config SND_CS46XX_NEW_DSP config SND_CS5530 tristate "CS5530 Audio" depends on ISA_DMA_API && (X86_32 || COMPILE_TEST) + depends on !M68K select SND_SB16_DSP help Say Y here to include support for audio on Cyrix/NatSemi CS5530 chips.
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 36/154 tty: tty_buffer: Fix the softlockup issue in flush_to_ldisc
In reply to Greg Kroah-HartmanFrom: Guanghui Feng <[email protected]>
[ Upstream commit 3968ddcf05fb4b9409cd1859feb06a5b0550a1c1 ]
When running ltp testcase(ltp/testcases/kernel/pty/pty04.c) with arm64, there is a soft lockup, which look like this one:
Workqueue: events_unbound flush_to_ldisc Call trace: dump_backtrace+0x0/0x1ec show_stack+0x24/0x30 dump_stack+0xd0/0x128 panic+0x15c/0x374 watchdog_timer_fn+0x2b8/0x304 __run_hrtimer+0x88/0x2c0 __hrtimer_run_queues+0xa4/0x120 hrtimer_interrupt+0xfc/0x270 arch_timer_handler_phys+0x40/0x50 handle_percpu_devid_irq+0x94/0x220 __handle_domain_irq+0x88/0xf0 gic_handle_irq+0x84/0xfc el1_irq+0xc8/0x180 slip_unesc+0x80/0x214 [slip] tty_ldisc_receive_buf+0x64/0x80 tty_port_default_receive_buf+0x50/0x90 flush_to_ldisc+0xbc/0x110 process_one_work+0x1d4/0x4b0 worker_thread+0x180/0x430 kthread+0x11c/0x120
In the testcase pty04, The first process call the write syscall to send data to the pty master. At the same time, the workqueue will do the flush_to_ldisc to pop data in a loop until there is no more data left. When the sender and workqueue running in different core, the sender sends data fastly in full time which will result in workqueue doing work in loop for a long time and occuring softlockup in flush_to_ldisc with kernel configured without preempt. So I add need_resched check and cond_resched in the flush_to_ldisc loop to avoid it.
--- drivers/tty/tty_buffer.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/tty/tty_buffer.c +3 -0
@@ -534,6 +534,9 @@ static void flush_to_ldisc(struct work_struct *work)if (!count)break ; head->read += count; + +if (need_resched ()) +cond_resched (); }mutex_unlock (&buf->lock);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 37/154 MIPS: sni: Fix the build
In reply to Greg Kroah-HartmanFrom: Bart Van Assche <[email protected]>
[ Upstream commit c91cf42f61dc77b289784ea7b15a8531defa41c0 ]
This patch fixes the following gcc 10 build error:
arch/mips/sni/time.c: In function ‘a20r_set_periodic’:arch/mips/sni/time.c:15:26: error: unsigned conversion from ‘int’ to ‘u8’ {aka ‘volatile unsigned char’} changes value from ‘576’ to ‘64’ [-Werror=overflow]
15 | #define SNI_COUNTER0_DIV ((SNI_CLOCK_TICK_RATE / SNI_COUNTER2_DIV) / HZ)
| ^arch/mips/sni/time.c:21:45: note: in expansion of macro ‘SNI_COUNTER0_DIV’
21 | *(volatile u8 *)(A20R_PT_CLOCK_BASE + 0) = SNI_COUNTER0_DIV;
| ^~~~~~~~~~~~~~~~--- arch/mips/sni/time.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/mips/sni/time.c +2 -2
@@ -18,14 +18,14 @@ static int a20r_set_periodic(struct clock_event_device *evt) { *(volatile u8 *)(A20R_PT_CLOCK_BASE +12 ) =0x34 ;wmb (); - *(volatile u8 *)(A20R_PT_CLOCK_BASE +0 ) =SNI_COUNTER0_DIV ; + *(volatile u8 *)(A20R_PT_CLOCK_BASE +0 ) =SNI_COUNTER0_DIV &0xff ;wmb (); *(volatile u8 *)(A20R_PT_CLOCK_BASE +0 ) =SNI_COUNTER0_DIV >>8 ;wmb (); *(volatile u8 *)(A20R_PT_CLOCK_BASE +12 ) =0xb4 ;wmb (); - *(volatile u8 *)(A20R_PT_CLOCK_BASE +8 ) =SNI_COUNTER2_DIV ; + *(volatile u8 *)(A20R_PT_CLOCK_BASE +8 ) =SNI_COUNTER2_DIV &0xff ;wmb (); *(volatile u8 *)(A20R_PT_CLOCK_BASE +8 ) =SNI_COUNTER2_DIV >>8 ;wmb ();
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 38/154 scsi: scsi_debug: Fix out-of-bound read in resp_readcap16()
In reply to Greg Kroah-HartmanFrom: Ye Bin <[email protected]>
[ Upstream commit 4e3ace0051e7e504b55d239daab8789dd89b863c ]
The following warning was observed running syzkaller:
[ 3813.830724] sg_write: data in/out 65466/242 bytes for SCSI command 0x9e-- guessing data in; [ 3813.830724] program syz-executor not setting count and/or reply_len properly [ 3813.836956] ================================================================== [ 3813.839465] BUG: KASAN: stack-out-of-bounds in sg_copy_buffer+0x157/0x1e0 [ 3813.841773] Read of size 4096 at addr ffff8883cf80f540 by task syz-executor/1549 [ 3813.846612] Call Trace: [ 3813.846995] dump_stack+0x108/0x15f [ 3813.847524] print_address_description+0xa5/0x372 [ 3813.848243] kasan_report.cold+0x236/0x2a8 [ 3813.849439] check_memory_region+0x240/0x270 [ 3813.850094] memcpy+0x30/0x80 [ 3813.850553] sg_copy_buffer+0x157/0x1e0 [ 3813.853032] sg_copy_from_buffer+0x13/0x20 [ 3813.853660] fill_from_dev_buffer+0x135/0x370 [ 3813.854329] resp_readcap16+0x1ac/0x280 [ 3813.856917] schedule_resp+0x41f/0x1630 [ 3813.858203] scsi_debug_queuecommand+0xb32/0x17e0 [ 3813.862699] scsi_dispatch_cmd+0x330/0x950 [ 3813.863329] scsi_request_fn+0xd8e/0x1710 [ 3813.863946] __blk_run_queue+0x10b/0x230 [ 3813.864544] blk_execute_rq_nowait+0x1d8/0x400 [ 3813.865220] sg_common_write.isra.0+0xe61/0x2420 [ 3813.871637] sg_write+0x6c8/0xef0 [ 3813.878853] __vfs_write+0xe4/0x800 [ 3813.883487] vfs_write+0x17b/0x530 [ 3813.884008] ksys_write+0x103/0x270 [ 3813.886268] __x64_sys_write+0x77/0xc0 [ 3813.886841] do_syscall_64+0x106/0x360 [ 3813.887415] entry_SYSCALL_64_after_hwframe+0x44/0xa9
This issue can be reproduced with the following syzkaller log:
r0 = openat(0xffffffffffffff9c, &(0x7f0000000040)='./file0\x00', 0x26e1, 0x0)
r1 = syz_open_procfs(0xffffffffffffffff, &(0x7f0000000000)='fd/3\x00')open_by_handle_at(r1, &(0x7f00000003c0)=ANY=[@ANYRESHEX], 0x602000)
r2 = syz_open_dev$sg(&(0x7f0000000000), 0x0, 0x40782)
write$binfmt_aout(r2, &(0x7f0000000340)=ANY=[@ANYBLOB="00000000deff000000000000000000000000000000000000000000000000000047f007af9e107a41ec395f1bded7be24277a1501ff6196a83366f4e6362bc0ff2b247f68a972989b094b2da4fb3607fcf611a22dd04310d28c75039d"], 0x126)
In resp_readcap16() we get "int alloc_len" value -1104926854, and then pass the huge arr_len to fill_from_dev_buffer(), but arr is only 32 bytes. This leads to OOB in sg_copy_buffer().
To solve this issue, define alloc_len as u32.
--- drivers/scsi/scsi_debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/scsi_debug.c +2 -2
@@ -1855,7 +1855,7 @@ static int resp_readcap16(struct scsi_cmnd *scp, {unsigned char *cmd = scp->cmnd;unsigned char arr[SDEBUG_READCAP16_ARR_SZ ]; -int alloc_len; +u32 alloc_len; alloc_len =get_unaligned_be32 (cmd +10 );/* following just in case virtual_gb changed */
@@ -1884,7 +1884,7 @@ static int resp_readcap16(struct scsi_cmnd *scp, }return fill_from_dev_buffer (scp, arr, -min_t (int, alloc_len,SDEBUG_READCAP16_ARR_SZ )); +min_t (u32, alloc_len,SDEBUG_READCAP16_ARR_SZ )); }#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 39/154 scsi: scsi_debug: Fix out-of-bound read in resp_report_tgtpgs()
In reply to Greg Kroah-HartmanFrom: Ye Bin <[email protected]>
[ Upstream commit f347c26836c270199de1599c3cd466bb7747caa9 ]
The following issue was observed running syzkaller:
BUG: KASAN: slab-out-of-bounds in memcpy include/linux/string.h:377 [inline] BUG: KASAN: slab-out-of-bounds in sg_copy_buffer+0x150/0x1c0 lib/scatterlist.c:831 Read of size 2132 at addr ffff8880aea95dc8 by task syz-executor.0/9815 CPU: 0 PID: 9815 Comm: syz-executor.0 Not tainted 4.19.202-00874-gfc0fe04215a9 #2 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0xe4/0x14a lib/dump_stack.c:118 print_address_description+0x73/0x280 mm/kasan/report.c:253 kasan_report_error mm/kasan/report.c:352 [inline] kasan_report+0x272/0x370 mm/kasan/report.c:410 memcpy+0x1f/0x50 mm/kasan/kasan.c:302 memcpy include/linux/string.h:377 [inline] sg_copy_buffer+0x150/0x1c0 lib/scatterlist.c:831 fill_from_dev_buffer+0x14f/0x340 drivers/scsi/scsi_debug.c:1021 resp_report_tgtpgs+0x5aa/0x770 drivers/scsi/scsi_debug.c:1772 schedule_resp+0x464/0x12f0 drivers/scsi/scsi_debug.c:4429 scsi_debug_queuecommand+0x467/0x1390 drivers/scsi/scsi_debug.c:5835 scsi_dispatch_cmd+0x3fc/0x9b0 drivers/scsi/scsi_lib.c:1896 scsi_request_fn+0x1042/0x1810 drivers/scsi/scsi_lib.c:2034 __blk_run_queue_uncond block/blk-core.c:464 [inline] __blk_run_queue+0x1a4/0x380 block/blk-core.c:484 blk_execute_rq_nowait+0x1c2/0x2d0 block/blk-exec.c:78 sg_common_write.isra.19+0xd74/0x1dc0 drivers/scsi/sg.c:847 sg_write.part.23+0x6e0/0xd00 drivers/scsi/sg.c:716 sg_write+0x64/0xa0 drivers/scsi/sg.c:622 __vfs_write+0xed/0x690 fs/read_write.c:485 kill_bdev:block_device:00000000e138492c vfs_write+0x184/0x4c0 fs/read_write.c:549 ksys_write+0x107/0x240 fs/read_write.c:599 do_syscall_64+0xc2/0x560 arch/x86/entry/common.c:293 entry_SYSCALL_64_after_hwframe+0x49/0xbe
We get 'alen' from command its type is int. If userspace passes a large length we will get a negative 'alen'.
Switch n, alen, and rlen to u32.
--- drivers/scsi/scsi_debug.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/scsi/scsi_debug.c +4 -3
@@ -1895,8 +1895,9 @@ static int resp_report_tgtpgs(struct scsi_cmnd *scp,unsigned char *cmd = scp->cmnd;unsigned char *arr;int host_no = devip->sdbg_host->shost->host_no; -int n, ret, alen, rlen;int port_group_a, port_group_b, port_a, port_b; +u32 alen, n, rlen; +int ret; alen =get_unaligned_be32 (cmd +6 ); arr =kzalloc (SDEBUG_MAX_TGTPGS_ARR_SZ ,GFP_ATOMIC );
@@ -1958,9 +1959,9 @@ static int resp_report_tgtpgs(struct scsi_cmnd *scp,* - The constructed command length * - The maximum array size */ - rlen =min_t (int, alen, n); + rlen =min (alen, n); ret =fill_from_dev_buffer (scp, arr, -min_t (int, rlen,SDEBUG_MAX_TGTPGS_ARR_SZ )); +min_t (u32, rlen,SDEBUG_MAX_TGTPGS_ARR_SZ ));kfree (arr);return ret; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 40/154 scsi: target: Fix ordered tag handling
In reply to Greg Kroah-HartmanFrom: Mike Christie <[email protected]>
[ Upstream commit ed1227e080990ffec5bf39006ec8a57358e6689a ]
This patch fixes the following bugs:
1. If there are multiple ordered cmds queued and multiple simple cmds completing, target_restart_delayed_cmds() could be called on different CPUs and each instance could start a ordered cmd. They could then run in different orders than they were queued.
2. target_restart_delayed_cmds() and target_handle_task_attr() can race where:
1. target_handle_task_attr() has passed the simple_cmds == 0 check.
2. transport_complete_task_attr() then decrements simple_cmds to 0.
3. transport_complete_task_attr() runs target_restart_delayed_cmds() and it does not see any cmds on the delayed_cmd_list.
4. target_handle_task_attr() adds the cmd to the delayed_cmd_list.
The cmd will then end up timing out.
3. If we are sent > 1 ordered cmds and simple_cmds == 0, we can execute them out of order, because target_handle_task_attr() will hit that simple_cmds check first and return false for all ordered cmds sent.
4. We run target_restart_delayed_cmds() after every cmd completion, so if there is more than 1 simple cmd running, we start executing ordered cmds after that first cmd instead of waiting for all of them to complete.
5. Ordered cmds are not supposed to start until HEAD OF QUEUE and all older cmds have completed, and not just simple.
6. It's not a bug but it doesn't make sense to take the delayed_cmd_lock for every cmd completion when ordered cmds are almost never used. Just replacing that lock with an atomic increases IOPs by up to 10% when completions are spread over multiple CPUs and there are multiple sessions/ mqs/thread accessing the same device.
This patch moves the queued delayed handling to a per device work to serialze the cmd executions for each device and adds a new counter to track HEAD_OF_QUEUE and SIMPLE cmds. We can then check the new counter to determine when to run the work on the completion path.
--- drivers/target/target_core_device.c | 2 + drivers/target/target_core_internal.h | 1 + drivers/target/target_core_transport.c | 76 ++++++++++++++++++-------- include/target/target_core_base.h | 6 +- 4 files changed, 61 insertions(+), 24 deletions(-)
drivers/target/target_core_device.c +2 -0
@@ -758,6 +758,8 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)INIT_LIST_HEAD (&dev->t10_alua.lba_map_list);spin_lock_init (&dev->t10_alua.lba_map_lock); +INIT_WORK (&dev->delayed_cmd_work, target_do_delayed_work); + dev->t10_wwn.t10_dev = dev; dev->t10_alua.t10_dev = dev;
drivers/target/target_core_internal.h +1 -0
@@ -150,6 +150,7 @@ int transport_dump_vpd_ident(struct t10_vpd *, unsigned char *, int);void transport_clear_lun_ref (struct se_lun *);sense_reason_t target_cmd_size_check (struct se_cmd *cmd,unsigned int size);void target_qf_do_work (struct work_struct *work); +void target_do_delayed_work (struct work_struct *work);bool target_check_wce (struct se_device *dev);bool target_check_fua (struct se_device *dev);void __target_execute_cmd (struct se_cmd *,bool );
drivers/target/target_core_transport.c +54 -22
142 lines not on this page · raw message
include/target/target_core_base.h +4 -2
@@ -788,8 +788,9 @@ struct se_device {atomic_long_t read_bytes;atomic_long_t write_bytes;/* Active commands on this virtual SE device */ -atomic_t simple_cmds; -atomic_t dev_ordered_sync; +atomic_t non_ordered; +bool ordered_sync_in_progress; +atomic_t delayed_cmd_count;atomic_t dev_qf_count;u32 export_count;spinlock_t delayed_cmd_lock;
@@ -811,6 +812,7 @@ struct se_device {struct list_head dev_sep_list;struct list_head dev_tmr_list;struct work_struct qf_work_queue; +struct work_struct delayed_cmd_work;struct list_head delayed_cmd_list;struct list_head state_list;struct list_head qf_cmd_list;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 41/154 scsi: target: Fix alua_tg_pt_gps_count tracking
In reply to Greg Kroah-HartmanFrom: Mike Christie <[email protected]>
[ Upstream commit 1283c0d1a32bb924324481586b5d6e8e76f676ba ]
We can't free the tg_pt_gp in core_alua_set_tg_pt_gp_id() because it's still accessed via configfs. Its release must go through the normal configfs/refcount process.
The max alua_tg_pt_gps_count check should probably have been done in core_alua_allocate_tg_pt_gp(), but with the current code userspace could have created 0x0000ffff + 1 groups, but only set the id for 0x0000ffff. Then it could have deleted a group with an ID set, and then set the ID for that extra group and it would work ok.
It's unlikely, but just in case this patch continues to allow that type of behavior, and just fixes the kfree() while in use bug.
--- drivers/target/target_core_alua.c | 1 - 1 file changed, 1 deletion(-)
drivers/target/target_core_alua.c +0 -1
@@ -1702,7 +1702,6 @@ int core_alua_set_tg_pt_gp_id(pr_err ("Maximum ALUA alua_tg_pt_gps_count:" " 0x0000ffff reached\n" );spin_unlock (&dev->t10_alua.tg_pt_gps_lock); -kmem_cache_free (t10_alua_tg_pt_gp_cache, tg_pt_gp);return -ENOSPC ; } again:
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 42/154 iio: imu: st_lsm6dsx: Avoid potential array overflow in st_lsm6dsx_set_odr()
In reply to Greg Kroah-HartmanFrom: Teng Qi <[email protected]>
[ Upstream commit 94be878c882d8d784ff44c639bf55f3b029f85af ]
The length of hw->settings->odr_table is 2 and ref_sensor->id is an enum variable whose value is between 0 and 5.
However, the value ST_LSM6DSX_ID_MAX (i.e. 5) is not caught properly in
switch (sensor->id) {
If ref_sensor->id is ST_LSM6DSX_ID_MAX, an array overflow will ocurrs in function st_lsm6dsx_check_odr():
odr_table = &sensor->hw->settings->odr_table[sensor->id];
and in function st_lsm6dsx_set_odr():
reg = &hw->settings->odr_table[ref_sensor->id].reg;
To avoid this array overflow, handle ST_LSM6DSX_ID_GYRO explicitly and return -EINVAL for the default case.
The enum value ST_LSM6DSX_ID_MAX is only present as an easy way to check the limit and as such is never used, however this is not locally obvious.
--- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +4 -2
@@ -1465,6 +1465,8 @@ st_lsm6dsx_set_odr(struct st_lsm6dsx_sensor *sensor, u32 req_odr)int err;switch (sensor->id) { +case ST_LSM6DSX_ID_GYRO : +break ;case ST_LSM6DSX_ID_EXT0 :case ST_LSM6DSX_ID_EXT1 :case ST_LSM6DSX_ID_EXT2 :
@@ -1490,8 +1492,8 @@ st_lsm6dsx_set_odr(struct st_lsm6dsx_sensor *sensor, u32 req_odr) }break ; } -default : -break ; +default :/* should never occur */ +return -EINVAL ; }if (req_odr >0 ) {
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 43/154 powerpc/5200: dts: fix memory node unit name
In reply to Greg Kroah-HartmanFrom: Anatolij Gustschin <[email protected]>
[ Upstream commit aed2886a5e9ffc8269a4220bff1e9e030d3d2eb1 ]
Fixes build warnings:
Warning (unit_address_vs_reg): /memory: node has a reg or ranges property, but no unit name
--- arch/powerpc/boot/dts/charon.dts | 2 +- arch/powerpc/boot/dts/digsy_mtc.dts | 2 +- arch/powerpc/boot/dts/lite5200.dts | 2 +- arch/powerpc/boot/dts/lite5200b.dts | 2 +- arch/powerpc/boot/dts/media5200.dts | 2 +- arch/powerpc/boot/dts/mpc5200b.dtsi | 2 +- arch/powerpc/boot/dts/o2d.dts | 2 +- arch/powerpc/boot/dts/o2d.dtsi | 2 +- arch/powerpc/boot/dts/o2dnt2.dts | 2 +- arch/powerpc/boot/dts/o3dnt.dts | 2 +- arch/powerpc/boot/dts/pcm032.dts | 2 +- arch/powerpc/boot/dts/tqm5200.dts | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-)
arch/powerpc/boot/dts/charon.dts +1 -1
@@ -35,7 +35,7 @@ }; }; - memory { + memory@0 { device_type = "memory"; reg = <0x00000000 0x08000000>; // 128MB };
arch/powerpc/boot/dts/digsy_mtc.dts +1 -1
@@ -16,7 +16,7 @@ model = "intercontrol,digsy-mtc"; compatible = "intercontrol,digsy-mtc"; - memory { + memory@0 { reg = <0x00000000 0x02000000>; // 32MB };
arch/powerpc/boot/dts/lite5200.dts +1 -1
@@ -32,7 +32,7 @@ }; }; - memory { + memory@0 { device_type = "memory"; reg = <0x00000000 0x04000000>; // 64MB };
arch/powerpc/boot/dts/lite5200b.dts +1 -1
@@ -31,7 +31,7 @@ led4 { gpios = <&gpio_simple 2 1>; }; }; - memory { + memory@0 { reg = <0x00000000 0x10000000>; // 256MB };
arch/powerpc/boot/dts/media5200.dts +1 -1
@@ -32,7 +32,7 @@ }; }; - memory { + memory@0 { reg = <0x00000000 0x08000000>; // 128MB RAM };
arch/powerpc/boot/dts/mpc5200b.dtsi +1 -1
@@ -33,7 +33,7 @@ }; }; - memory: memory { + memory: memory@0 { device_type = "memory"; reg = <0x00000000 0x04000000>; // 64MB };
arch/powerpc/boot/dts/o2d.dts +1 -1
@@ -12,7 +12,7 @@ model = "ifm,o2d"; compatible = "ifm,o2d"; - memory { + memory@0 { reg = <0x00000000 0x08000000>; // 128MB };
arch/powerpc/boot/dts/o2d.dtsi +1 -1
@@ -19,7 +19,7 @@ model = "ifm,o2d"; compatible = "ifm,o2d"; - memory { + memory@0 { reg = <0x00000000 0x04000000>; // 64MB };
arch/powerpc/boot/dts/o2dnt2.dts +1 -1
@@ -12,7 +12,7 @@ model = "ifm,o2dnt2"; compatible = "ifm,o2d"; - memory { + memory@0 { reg = <0x00000000 0x08000000>; // 128MB };
arch/powerpc/boot/dts/o3dnt.dts +1 -1
@@ -12,7 +12,7 @@ model = "ifm,o3dnt"; compatible = "ifm,o2d"; - memory { + memory@0 { reg = <0x00000000 0x04000000>; // 64MB };
arch/powerpc/boot/dts/pcm032.dts +1 -1
@@ -20,7 +20,7 @@ model = "phytec,pcm032"; compatible = "phytec,pcm032"; - memory { + memory@0 { reg = <0x00000000 0x08000000>; // 128MB };
arch/powerpc/boot/dts/tqm5200.dts +1 -1
@@ -32,7 +32,7 @@ }; }; - memory { + memory@0 { device_type = "memory"; reg = <0x00000000 0x04000000>; // 64MB };
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 44/154 ARM: dts: qcom: fix memory and mdio nodes naming for RB3011
In reply to Greg Kroah-HartmanFrom: David Heidelberg <[email protected]>
[ Upstream commit 14a1f6c9d8017ffbf388e82e1a1f023196d98612 ]
Fixes warnings regarding to memory and mdio nodes and apply new naming following dt-schema.
--- arch/arm/boot/dts/qcom-ipq8064-rb3011.dts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm/boot/dts/qcom-ipq8064-rb3011.dts +3 -3
@@ -19,12 +19,12 @@ stdout-path = "serial0:115200n8"; }; - memory@0 { + memory@42000000 { reg = <0x42000000 0x3e000000>; device_type = "memory"; }; - mdio0: mdio@0 { + mdio0: mdio-0 { status = "okay"; compatible = "virtual,mdio-gpio"; gpios = <&qcom_pinmux 1 GPIO_ACTIVE_HIGH>,
@@ -91,7 +91,7 @@ }; }; - mdio1: mdio@1 { + mdio1: mdio-1 { status = "okay"; compatible = "virtual,mdio-gpio"; gpios = <&qcom_pinmux 11 GPIO_ACTIVE_HIGH>,
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 45/154 ALSA: gus: fix null pointer dereference on pointer block
In reply to Greg Kroah-HartmanFrom: Chengfeng Ye <[email protected]>
[ Upstream commit a0d21bb3279476c777434c40d969ea88ca64f9aa ]
The pointer block return from snd_gf1_dma_next_block could be null, so there is a potential null pointer dereference issue. Fix this by adding a null check before dereference.
--- sound/isa/gus/gus_dma.c | 2 ++ 1 file changed, 2 insertions(+)
sound/isa/gus/gus_dma.c +2 -0
@@ -126,6 +126,8 @@ static void snd_gf1_dma_interrupt(struct snd_gus_card * gus) } block =snd_gf1_dma_next_block (gus);spin_unlock (&gus->dma_lock); +if (!block) +return ;snd_gf1_dma_program (gus, block->addr, block->buf_addr, block->count, (unsigned short ) block->cmd);kfree (block);#if 0
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 46/154 powerpc/dcr: Use cmplwi instead of 3-argument cmpli
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit fef071be57dc43679a32d5b0e6ee176d6f12e9f2 ]
In dcr-low.S we use cmpli with three arguments, instead of four arguments as defined in the ISA:
cmpli cr0,r3,1024
This appears to be a PPC440-ism, looking at the "PPC440x5 CPU Core User’s Manual" it shows cmpli having no L field, but implied to be 0 due to the core being 32-bit. It mentions that the ISA defines four arguments and recommends using cmplwi.
It also corresponds to the old POWER instruction set, which had no L field there, a reserved bit instead.
dcr-low.S is only built 32-bit, because it is only built when DCR_NATIVE=y, which is only selected by 40x and 44x. Looking at the generated code (with gcc/gas) we see cmplwi as expected.
Although gas is happy with the 3-argument version when building for 32-bit, the LLVM assembler is not and errors out with:
arch/powerpc/sysdev/dcr-low.S:27:10: error: invalid operand for instruction
cmpli 0,%r3,1024; ...
^
Switch to the cmplwi extended opcode, which avoids any confusion when reading the ISA, fixes the issue with the LLVM assembler, and also means the code could be built 64-bit in future (though that's very unlikely).
--- arch/powerpc/sysdev/dcr-low.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/sysdev/dcr-low.S +1 -1
@@ -11,7 +11,7 @@ #include <asm/export.h> #define DCR_ACCESS_PROLOG(table) \ - cmpli cr0,r3,1024; \ + cmplwi cr0,r3,1024; \ rlwinm r3,r3,4,18,27; \ lis r5,table@h; \ ori r5,r5,table@l; \
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 47/154 powerpc/8xx: Fix Oops with STRICT_KERNEL_RWX without DEBUG_RODATA_TEST
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
[ Upstream commit c12ab8dbc492b992e1ea717db933cee568780c47 ]
Until now, all tests involving CONFIG_STRICT_KERNEL_RWX were done with DEBUG_RODATA_TEST to check the result. But now that CONFIG_STRICT_KERNEL_RWX is selected by default, it came without CONFIG_DEBUG_RODATA_TEST and led to the following Oops
[ 6.830908] Freeing unused kernel image (initmem) memory: 352K [ 6.840077] BUG: Unable to handle kernel data access on write at 0xc1285200 [ 6.846836] Faulting instruction address: 0xc0004b6c [ 6.851745] Oops: Kernel access of bad area, sig: 11 [#1] [ 6.857075] BE PAGE_SIZE=16K PREEMPT CMPC885 [ 6.861348] SAF3000 DIE NOTIFICATION [ 6.864830] CPU: 0 PID: 1 Comm: swapper Not tainted 5.15.0-rc5-s3k-dev-02255-g2747d7b7916f #451 [ 6.873429] NIP: c0004b6c LR: c0004b60 CTR: 00000000 [ 6.878419] REGS: c902be60 TRAP: 0300 Not tainted (5.15.0-rc5-s3k-dev-02255-g2747d7b7916f) [ 6.886852] MSR: 00009032 <EE,ME,IR,DR,RI> CR: 53000335 XER: 8000ff40 [ 6.893564] DAR: c1285200 DSISR: 82000000 [ 6.893564] GPR00: 0c000000 c902bf20 c20f4000 08000000 00000001 04001f00 c1800000 00000035 [ 6.893564] GPR08: ff0001ff c1280000 00000002 c0004b60 00001000 00000000 c0004b1c 00000000 [ 6.893564] GPR16: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 6.893564] GPR24: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 c1060000 [ 6.932034] NIP [c0004b6c] kernel_init+0x50/0x138 [ 6.936682] LR [c0004b60] kernel_init+0x44/0x138 [ 6.941245] Call Trace: [ 6.943653] [c902bf20] [c0004b60] kernel_init+0x44/0x138 (unreliable) [ 6.950022] [c902bf30] [c001122c] ret_from_kernel_thread+0x5c/0x64 [ 6.956135] Instruction dump: [ 6.959060] 48ffc521 48045469 4800d8cd 3d20c086 89295fa0 2c090000 41820058 480796c9 [ 6.966890] 4800e48d 3d20c128 39400002 3fe0c106 <91495200> 3bff8000 4806fa1d 481f7d75 [ 6.974902] ---[ end trace 1e397bacba4aa610 ]---
0xc1285200 corresponds to 'system_state' global var that the kernel is trying to set to SYSTEM_RUNNING. This var is above the RO/RW limit so it shouldn't Oops.
It oopses because the dirty bit is missing.
--- arch/powerpc/kernel/head_8xx.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kernel/head_8xx.S +1 -1
@@ -788,7 +788,7 @@ _GLOBAL(mmu_pin_tlb) cmplw r6, r9 bdnzt lt, 2b -4: LOAD_REG_IMMEDIATE(r8, 0xf0 | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT) +4: LOAD_REG_IMMEDIATE(r8, 0xf0 | _PAGE_DIRTY | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT) 2: ori r0, r6, MD_EVALID mtspr SPRN_MD_CTR, r5 mtspr SPRN_MD_EPN, r0
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 48/154 sh: check return code of request_irq
In reply to Greg Kroah-HartmanFrom: Nick Desaulniers <[email protected]>
[ Upstream commit 0e38225c92c7964482a8bb6b3e37fde4319e965c ]
request_irq is marked __must_check, but the call in shx3_prepare_cpus has a void return type, so it can't propagate failure to the caller. Follow cues from hexagon and just print an error.
--- arch/sh/kernel/cpu/sh4a/smp-shx3.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/sh/kernel/cpu/sh4a/smp-shx3.c +3 -2
@@ -73,8 +73,9 @@ static void shx3_prepare_cpus(unsigned int max_cpus)BUILD_BUG_ON (SMP_MSG_NR >=8 );for (i =0 ; i <SMP_MSG_NR ; i++) -request_irq (104 + i, ipi_interrupt_handler, -IRQF_PERCPU ,"IPI" , (void *)(long )i); +if (request_irq (104 + i, ipi_interrupt_handler, +IRQF_PERCPU ,"IPI" , (void *)(long )i)) +pr_err ("Failed to request irq %d\n" , i);for (i =0 ; i < max_cpus; i++)set_cpu_present (i, true);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 49/154 maple: fix wrong return value of maple_bus_init().
In reply to Greg Kroah-HartmanFrom: Lu Wei <[email protected]>
[ Upstream commit bde82ee391fa6d3ad054313c4aa7b726d32515ce ]
If KMEM_CACHE or maple_alloc_dev failed, the maple_bus_init() will return 0 rather than error, because the retval is not changed after KMEM_CACHE or maple_alloc_dev failed.
--- drivers/sh/maple/maple.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/sh/maple/maple.c +4 -1
@@ -835,8 +835,10 @@ static int __init maple_bus_init(void) maple_queue_cache =KMEM_CACHE (maple_buffer,SLAB_HWCACHE_ALIGN ); -if (!maple_queue_cache) +if (!maple_queue_cache) { + retval = -ENOMEM ; goto cleanup_bothirqs; + }INIT_LIST_HEAD (&maple_waitq);INIT_LIST_HEAD (&maple_sentq);
@@ -849,6 +851,7 @@ static int __init maple_bus_init(void)if (!mdev[i]) {while (i-- >0 )maple_free_dev (mdev[i]); + retval = -ENOMEM ; goto cleanup_cache; } baseunits[i] = mdev[i];
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 50/154 f2fs: fix up f2fs_lookup tracepoints
In reply to Greg Kroah-HartmanFrom: Gao Xiang <[email protected]>
[ Upstream commit 70a9ac36ffd807ac506ed0b849f3e8ce3c6623f2 ]
Fix up a misuse that the filename pointer isn't always valid in the ring buffer, and we should copy the content instead.
--- include/trace/events/f2fs.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
include/trace/events/f2fs.h +6 -6
@@ -807,20 +807,20 @@ TRACE_EVENT(f2fs_lookup_start,TP_STRUCT__entry (__field (dev_t ,dev )__field (ino_t, ino) - __field(const char *, name) + __string(name, dentry->d_name.name) __field(unsigned int, flags) ),TP_fast_assign ( __entry->dev = dir->i_sb->s_dev; __entry->ino = dir->i_ino; - __entry->name = dentry->d_name.name; +__assign_str (name, dentry->d_name.name); __entry->flags = flags; ),TP_printk ("dev = (%d,%d), pino = %lu, name:%s, flags:%u" ,show_dev_ino (__entry), - __entry->name, +__get_str (name), __entry->flags) );
@@ -834,7 +834,7 @@ TRACE_EVENT(f2fs_lookup_end,TP_STRUCT__entry (__field (dev_t ,dev )__field (ino_t, ino) - __field(const char *, name) + __string(name, dentry->d_name.name)__field (nid_t, cino)__field (int, err) ),
@@ -842,14 +842,14 @@ TRACE_EVENT(f2fs_lookup_end,TP_fast_assign ( __entry->dev = dir->i_sb->s_dev; __entry->ino = dir->i_ino; - __entry->name = dentry->d_name.name; +__assign_str (name, dentry->d_name.name); __entry->cino = ino; __entry->err = err; ),TP_printk ("dev = (%d,%d), pino = %lu, name:%s, ino:%u, err:%d" ,show_dev_ino (__entry), - __entry->name, +__get_str (name), __entry->cino, __entry->err) );
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 51/154 f2fs: fix to use WHINT_MODE
In reply to Greg Kroah-HartmanFrom: Keoseong Park <[email protected]>
[ Upstream commit 011e0868e0cf1237675b22e36fffa958fb08f46e ]
Since active_logs can be set to 2 or 4 or NR_CURSEG_PERSIST_TYPE(6), it cannot be set to NR_CURSEG_TYPE(8).
That is, whint_mode is always off.
Therefore, the condition is changed from NR_CURSEG_TYPE to NR_CURSEG_PERSIST_TYPE.
--- fs/f2fs/super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/super.c +1 -1
@@ -1020,7 +1020,7 @@ static int parse_options(struct super_block *sb, char *options, bool is_remount)/* Not pass down write hints if the number of active logs is lesser * than NR_CURSEG_PERSIST_TYPE. */ -if (F2FS_OPTION (sbi).active_logs !=NR_CURSEG_TYPE ) +if (F2FS_OPTION (sbi).active_logs !=NR_CURSEG_PERSIST_TYPE )F2FS_OPTION (sbi).whint_mode =WHINT_MODE_OFF ;return 0 ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 52/154 sh: fix kconfig unmet dependency warning for FRAME_POINTER
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit fda1bc533094a7db68b11e7503d2c6c73993d12a ]
FRAME_POINTER depends on DEBUG_KERNEL so DWARF_UNWINDER should depend on DEBUG_KERNEL before selecting FRAME_POINTER.
WARNING: unmet direct dependencies detected for FRAME_POINTER
Depends on [n]: DEBUG_KERNEL [=n] && (M68K || UML || SUPERH [=y]) || ARCH_WANT_FRAME_POINTERS [=n] Selected by [y]:
- DWARF_UNWINDER [=y]
--- arch/sh/Kconfig.debug | 1 + 1 file changed, 1 insertion(+)
arch/sh/Kconfig.debug +1 -0
@@ -57,6 +57,7 @@ config DUMP_CODE config DWARF_UNWINDER bool "Enable the DWARF unwinder for stacktraces" + depends on DEBUG_KERNEL select FRAME_POINTER default n help
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 53/154 sh: math-emu: drop unused functions
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit e25c252a9b033523c626f039d4b9a304f12f6775 ]
Delete ieee_fpe_handler() since it is not used. After that is done, delete denormal_to_double() since it is not used:
.../arch/sh/math-emu/math.c:505:12: error: 'ieee_fpe_handler' defined but not used [-Werror=unused-function]
505 | static int ieee_fpe_handler(struct pt_regs *regs)
.../arch/sh/math-emu/math.c:477:13: error: 'denormal_to_double' defined but not used [-Werror=unused-function]
477 | static void denormal_to_double(struct sh_fpu_soft_struct *fpu, int n)
--- arch/sh/math-emu/math.c | 103 ---------------------------------------- 1 file changed, 103 deletions(-)
arch/sh/math-emu/math.c +0 -103
@@ -467,109 +467,6 @@ static int fpu_emulate(u16 code, struct sh_fpu_soft_struct *fregs, struct pt_regreturn id_sys (fregs, regs, code); } -/** -* denormal_to_double - Given denormalized float number, -* store double float -* -* @fpu: Pointer to sh_fpu_soft structure -* @n: Index to FP register -*/ -static void denormal_to_double (struct sh_fpu_soft_struct *fpu,int n) -{ -unsigned long du, dl; -unsigned long x = fpu->fpul; -int exp =1023 -126 ; - -if (x !=0 && (x &0x7f800000 ) ==0 ) { - du = (x &0x80000000 ); -while ((x &0x00800000 ) ==0 ) { - x <<=1 ; - exp--; - } - x &=0x007fffff ; - du |= (exp <<20 ) | (x >>3 ); - dl = x <<29 ; - - fpu->fp_regs[n] = du; - fpu->fp_regs[n+1 ] = dl; - } -} - -/** -* ieee_fpe_handler - Handle denormalized number exception -* -* @regs: Pointer to register structure -* -* Returns 1 when it's handled (should not cause exception). -*/ -static int ieee_fpe_handler (struct pt_regs *regs) -{ -unsigned short insn = *(unsigned short *)regs->pc; -unsigned short finsn; -unsigned long nextpc; -int nib[4 ] = { - (insn >>12 ) &0xf , - (insn >>8 ) &0xf , - (insn >>4 ) &0xf , - insn &0xf }; - -if (nib[0 ] ==0xb || - (nib[0 ] ==0x4 && nib[2 ] ==0x0 && nib[3 ] ==0xb ))/* bsr & jsr */ - regs->pr = regs->pc +4 ; - -if (nib[0 ] ==0xa || nib[0 ] ==0xb ) {/* bra & bsr */ - nextpc = regs->pc +4 + ((short ) ((insn &0xfff ) <<4 ) >>3 ); - finsn = *(unsigned short *) (regs->pc +2 ); - }else if (nib[0 ] ==0x8 && nib[1 ] ==0xd ) {/* bt/s */ -if (regs->sr &1 ) - nextpc = regs->pc +4 + ((char ) (insn &0xff ) <<1 ); -else - nextpc = regs->pc +4 ; - finsn = *(unsigned short *) (regs->pc +2 ); - }else if (nib[0 ] ==0x8 && nib[1 ] ==0xf ) {/* bf/s */ -if (regs->sr &1 ) - nextpc = regs->pc +4 ; -else - nextpc = regs->pc +4 + ((char ) (insn &0xff ) <<1 ); - finsn = *(unsigned short *) (regs->pc +2 ); - }else if (nib[0 ] ==0x4 && nib[3 ] ==0xb && - (nib[2 ] ==0x0 || nib[2 ] ==0x2 )) {/* jmp & jsr */ - nextpc = regs->regs[nib[1 ]]; - finsn = *(unsigned short *) (regs->pc +2 ); - }else if (nib[0 ] ==0x0 && nib[3 ] ==0x3 && - (nib[2 ] ==0x0 || nib[2 ] ==0x2 )) {/* braf & bsrf */ - nextpc = regs->pc +4 + regs->regs[nib[1 ]]; - finsn = *(unsigned short *) (regs->pc +2 ); - }else if (insn ==0x000b ) {/* rts */ - nextpc = regs->pr; - finsn = *(unsigned short *) (regs->pc +2 ); - }else { - nextpc = regs->pc +2 ; - finsn = insn; - } - -if ((finsn &0xf1ff ) ==0xf0ad ) {/* fcnvsd */ -struct task_struct *tsk = current; - -if ((tsk->thread.xstate->softfpu.fpscr & (1 <<17 ))) { -/* FPU error */ -denormal_to_double (&tsk->thread.xstate->softfpu, - (finsn >>8 ) &0xf ); - tsk->thread.xstate->softfpu.fpscr &= - ~(FPSCR_CAUSE_MASK |FPSCR_FLAG_MASK ); -task_thread_info (tsk)->status |=TS_USEDFPU ; - }else { -force_sig_fault (SIGFPE ,FPE_FLTINV , - (void __user *)regs->pc); - } - - regs->pc = nextpc; -return 1 ; - } - -return 0 ; -} -/** * fpu_init - Initialize FPU registers * @fpu: Pointer to software emulated FPU registers.
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 54/154 sh: define __BIG_ENDIAN for math-emu
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit b929926f01f2d14635345d22eafcf60feed1085e ]
Fix this by defining both ENDIAN macros in <asm/sfp-machine.h> so that they can be utilized in <math-emu/soft-fp.h> according to the latter's comment:
/* Allow sfp-machine to have its own byte order definitions. */
(This is what is done in arch/nds32/include/asm/sfp-machine.h.)
This placates these build warnings:
In file included from ../arch/sh/math-emu/math.c:23:.../include/math-emu/single.h:50:21: warning: "__BIG_ENDIAN" is not defined, evaluates to 0 [-Wundef]
50 | #if __BYTE_ORDER == __BIG_ENDIAN
In file included from ../arch/sh/math-emu/math.c:24:.../include/math-emu/double.h:59:21: warning: "__BIG_ENDIAN" is not defined, evaluates to 0 [-Wundef]
59 | #if __BYTE_ORDER == __BIG_ENDIAN
--- arch/sh/include/asm/sfp-machine.h | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/sh/include/asm/sfp-machine.h +8 -0
@@ -13,6 +13,14 @@#ifndef _SFP_MACHINE_H#define _SFP_MACHINE_H +#ifdef __BIG_ENDIAN__ +#define __BYTE_ORDER __BIG_ENDIAN +#define __LITTLE_ENDIAN 0 +#else +#define __BYTE_ORDER __LITTLE_ENDIAN +#define __BIG_ENDIAN 0 +#endif +#define _FP_W_TYPE_SIZE 32#define _FP_W_TYPE unsigned long#define _FP_WS_TYPE signed long
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 55/154 f2fs: compress: disallow disabling compress on non-empty compressed file
In reply to Greg Kroah-HartmanFrom: Hyeong-Jun Kim <[email protected]>
[ Upstream commit 02d58cd253d7536c412993573fc6b3b4454960eb ]
Compresse file and normal file has differ in i_addr addressing, specifically addrs per inode/block. So, we will face data loss, if we disable the compression flag on non-empty files. Therefore we should disallow not only enabling but disabling the compression flag on non-empty files.
--- fs/f2fs/f2fs.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/f2fs/f2fs.h +1 -2
@@ -3908,8 +3908,7 @@ static inline bool f2fs_disable_compressed_file(struct inode *inode)if (!f2fs_compressed_file (inode))return true; -if (S_ISREG (inode->i_mode) && - (get_dirty_pages (inode) ||atomic_read (&fi->i_compr_blocks))) +if (S_ISREG (inode->i_mode) &&F2FS_HAS_BLOCKS (inode))return false; fi->i_flags &= ~F2FS_COMPR_FL ;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 56/154 f2fs: fix incorrect return value in f2fs_sanity_check_ckpt()
In reply to Greg Kroah-HartmanFrom: Chao Yu <[email protected]>
[ Upstream commit ca98d72141dd81f42893a9a43d7ededab3355fba ]
As Pavel Machek reported in [1]
This code looks quite confused: part of function returns 1 on corruption, part returns -errno. The problem is not stable-specific.
[1] https://lkml.org/lkml/2021/9/19/207
Let's fix to make 'insane cp_payload case' to return 1 rater than EFSCORRUPTED, so that return value can be kept consistent for all error cases, it can avoid confusion of code logic.
--- fs/f2fs/super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/super.c +1 -1
@@ -3081,7 +3081,7 @@ int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi) NR_CURSEG_PERSIST_TYPE + nat_bits_blocks >= blocks_per_seg)) {f2fs_warn (sbi,"Insane cp_payload: %u, nat_bits_blocks: %u)" , cp_payload, nat_bits_blocks); -return -EFSCORRUPTED ; +return 1 ; }if (unlikely (f2fs_cp_error (sbi))) {
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 57/154 clk: ingenic: Fix bugs with divided dividers
In reply to Greg Kroah-HartmanFrom: Paul Cercueil <[email protected]>
[ Upstream commit ed84ef1cd7eddf933d4ffce2caa8161d6f947245 ]
Two fixes in one:
- In the "impose hardware constraints" block, the "logical" divider value (aka. not translated to the hardware) was clamped to fit in the register area, but this totally ignored the fact that the divider value can itself have a fixed divider.
- The code that made sure that the divider value returned by the function was a multiple of its own fixed divider could result in a wrong value being calculated, because it was rounded down instead of rounded up.
--- drivers/clk/ingenic/cgu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/clk/ingenic/cgu.c +3 -3
@@ -425,15 +425,15 @@ ingenic_clk_calc_div(const struct ingenic_cgu_clk_info *clk_info, }/* Impose hardware constraints */ - div =min_t (unsigned, div,1 << clk_info->div.bits); - div =max_t (unsigned, div,1 ); + div = clamp_t(unsigned int, div, clk_info->div.div, + clk_info->div.div << clk_info->div.bits);/* * If the divider value itself must be divided before being written to * the divider register, we must ensure we don't have any bits set that * would be lost as a result of doing so. */ - div /= clk_info->div.div; + div =DIV_ROUND_UP (div, clk_info->div.div); div *= clk_info->div.div;return div;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 58/154 clk/ast2600: Fix soc revision for AHB
In reply to Greg Kroah-HartmanFrom: Joel Stanley <[email protected]>
[ Upstream commit f45c5b1c27293f834682e89003f88b3512329ab4 ]
Move the soc revision parsing to the initial probe, saving the driver from parsing the register multiple times.
Use this variable to select the correct divisor table for the AHB clock. Before this fix the A2 would have used the A0 table.
--- drivers/clk/clk-ast2600.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/clk/clk-ast2600.c +7 -5
@@ -51,6 +51,8 @@ static DEFINE_SPINLOCK(aspeed_g6_clk_lock);static struct clk_hw_onecell_data *aspeed_g6_clk_data;static void __iomem *scu_g6_base; +/* AST2600 revision: A0, A1, A2, etc */ +static u8 soc_rev;/* * Clocks marked with CLK_IS_CRITICAL:
@@ -191,9 +193,8 @@ static struct clk_hw *ast2600_calc_pll(const char *name, u32 val)static struct clk_hw *ast2600_calc_apll (const char *name,u32 val) {unsigned int mult, div; -u32 chip_id =readl (scu_g6_base +ASPEED_G6_SILICON_REV ); -if (((chip_id &CHIP_REVISION_ID ) >>16 ) >=2 ) { +if (soc_rev >=2 ) {if (val &BIT (24 )) {/* Pass through mode */ mult = div =1 ;
@@ -707,7 +708,7 @@ static const u32 ast2600_a1_axi_ahb200_tbl[] = {static void __init aspeed_g6_cc (struct regmap *map) {struct clk_hw *hw; -u32 val, div, divbits, chip_id, axi_div, ahb_div; +u32 val, div, divbits, axi_div, ahb_div;clk_hw_register_fixed_rate (NULL ,"clkin" ,NULL ,0 ,25000000 );
@@ -738,8 +739,7 @@ static void __init aspeed_g6_cc(struct regmap *map) axi_div =2 ; divbits = (val >>11 ) &0x3 ; -regmap_read (map,ASPEED_G6_SILICON_REV , &chip_id); -if (chip_id &BIT (16 )) { +if (soc_rev >=1 ) {if (!divbits) { ahb_div = ast2600_a1_axi_ahb200_tbl[(val >>8 ) &0x3 ];if (val &BIT (16 ))
@@ -784,6 +784,8 @@ static void __init aspeed_g6_cc_init(struct device_node *np)if (!scu_g6_base)return ; + soc_rev = (readl (scu_g6_base +ASPEED_G6_SILICON_REV ) &CHIP_REVISION_ID ) >>16 ; + aspeed_g6_clk_data =kzalloc (struct_size (aspeed_g6_clk_data, hws,ASPEED_G6_NUM_CLKS ),GFP_KERNEL );if (!aspeed_g6_clk_data)
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 59/154 clk: qcom: gcc-msm8996: Drop (again) gcc_aggre1_pnoc_ahb_clk
In reply to Greg Kroah-HartmanFrom: Dmitry Baryshkov <[email protected]>
[ Upstream commit 05cf3ec00d460b50088d421fb878a0f83f57e262 ]
The gcc_aggre1_pnoc_ahb_clk is crucial for the proper MSM8996/APQ8096 functioning. If it gets disabled, several subsytems will stop working (including eMMC/SDCC and USB). There are no in-kernel users of this clock, so it is much simpler to remove from the kernel.
The clock was first removed in the commit 9e60de1cf270 ("clk: qcom:
Remove gcc_aggre1_pnoc_ahb_clk from msm8996") by Stephen Boyd, but got added back in the commit b567752144e3 ("clk: qcom: Add some missing gcc clks for msm8996") by Rajendra Nayak.
Let's remove it again in hope that nobody adds it back.
--- drivers/clk/qcom/gcc-msm8996.c | 15 --------------- 1 file changed, 15 deletions(-)
drivers/clk/qcom/gcc-msm8996.c +0 -15
@@ -2937,20 +2937,6 @@ static struct clk_branch gcc_smmu_aggre0_ahb_clk = { }, }; -static struct clk_branch gcc_aggre1_pnoc_ahb_clk = { - .halt_reg =0x82014 , - .clkr = { - .enable_reg =0x82014 , - .enable_mask =BIT (0 ), - .hw.init = &(struct clk_init_data ){ - .name ="gcc_aggre1_pnoc_ahb_clk" , - .parent_names = (const char *[]){"periph_noc_clk_src" }, - .num_parents =1 , - .ops = &clk_branch2_ops, - }, - }, -}; -static struct clk_branch gcc_aggre2_ufs_axi_clk = { .halt_reg =0x83014 , .clkr = {
@@ -3474,7 +3460,6 @@ static struct clk_regmap *gcc_msm8996_clocks[] = { [GCC_AGGRE0_CNOC_AHB_CLK] = &gcc_aggre0_cnoc_ahb_clk.clkr, [GCC_SMMU_AGGRE0_AXI_CLK] = &gcc_smmu_aggre0_axi_clk.clkr, [GCC_SMMU_AGGRE0_AHB_CLK] = &gcc_smmu_aggre0_ahb_clk.clkr, - [GCC_AGGRE1_PNOC_AHB_CLK] = &gcc_aggre1_pnoc_ahb_clk.clkr, [GCC_AGGRE2_UFS_AXI_CLK] = &gcc_aggre2_ufs_axi_clk.clkr, [GCC_AGGRE2_USB3_AXI_CLK] = &gcc_aggre2_usb3_axi_clk.clkr, [GCC_QSPI_AHB_CLK] = &gcc_qspi_ahb_clk.clkr,
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 60/154 mips: BCM63XX: ensure that CPU_SUPPORTS_32BIT_KERNEL is set
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit 5eeaafc8d69373c095e461bdb39e5c9b62228ac5 ]
Several header files need info on CONFIG_32BIT or CONFIG_64BIT, but kconfig symbol BCM63XX does not provide that info. This leads to many build errors, e.g.:
arch/mips/include/asm/page.h:196:13: error: use of undeclared identifier 'CAC_BASE'
return x - PAGE_OFFSET + PHYS_OFFSET;
arch/mips/include/asm/mach-generic/spaces.h:91:23: note: expanded from macro 'PAGE_OFFSET'
#define PAGE_OFFSET (CAC_BASE + PHYS_OFFSET)
arch/mips/include/asm/io.h:134:28: error: use of undeclared identifier 'CAC_BASE'
return (void *)(address + PAGE_OFFSET - PHYS_OFFSET);
arch/mips/include/asm/mach-generic/spaces.h:91:23: note: expanded from macro 'PAGE_OFFSET'
#define PAGE_OFFSET (CAC_BASE + PHYS_OFFSET)arch/mips/include/asm/uaccess.h:82:10: error: use of undeclared identifier '__UA_LIMIT'
return (__UA_LIMIT & (addr | (addr + size) | __ua_size(size))) == 0;
Selecting the SYS_HAS_CPU_BMIPS* symbols causes SYS_HAS_CPU_BMIPS to be set, which then selects CPU_SUPPORT_32BIT_KERNEL, which causes CONFIG_32BIT to be set. (a bit more indirect than v1 [RFC].)
--- arch/mips/Kconfig | 3 +++ 1 file changed, 3 insertions(+)
arch/mips/Kconfig +3 -0
@@ -320,6 +320,9 @@ config BCM63XX select SYS_SUPPORTS_32BIT_KERNEL select SYS_SUPPORTS_BIG_ENDIAN select SYS_HAS_EARLY_PRINTK + select SYS_HAS_CPU_BMIPS32_3300 + select SYS_HAS_CPU_BMIPS4350 + select SYS_HAS_CPU_BMIPS4380 select SWAP_IO_SPACE select GPIOLIB select MIPS_L1_CACHE_SHIFT_4
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 61/154 sched/core: Mitigate race cpus_share_cache()/update_top_cache_domain()
In reply to Greg Kroah-HartmanFrom: Vincent Donnefort <[email protected]>
[ Upstream commit 42dc938a590c96eeb429e1830123fef2366d9c80 ]
Nothing protects the access to the per_cpu variable sd_llc_id. When testing the same CPU (i.e. this_cpu == that_cpu), a race condition exists with update_top_cache_domain(). One scenario being:
CPU1 CPU2
==================================================================
per_cpu(sd_llc_id, CPUX) => 0
partition_sched_domains_locked()
detach_destroy_domains()
cpus_share_cache(CPUX, CPUX) update_top_cache_domain(CPUX)
per_cpu(sd_llc_id, CPUX) => 0
per_cpu(sd_llc_id, CPUX) = CPUX
per_cpu(sd_llc_id, CPUX) => CPUX
return false
ttwu_queue_cond() wouldn't catch smp_processor_id() == cpu and the result is a warning triggered from ttwu_queue_wakelist().
Avoid a such race in cpus_share_cache() by always returning true when this_cpu == that_cpu.
--- kernel/sched/core.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/sched/core.c +3 -0
@@ -2650,6 +2650,9 @@ out:bool cpus_share_cache (int this_cpu,int that_cpu) { +if (this_cpu == that_cpu) +return true; +return per_cpu (sd_llc_id, this_cpu) ==per_cpu (sd_llc_id, that_cpu); }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 62/154 perf/x86/vlbr: Add c->flags to vlbr event constraints
In reply to Greg Kroah-HartmanFrom: Like Xu <[email protected]>
[ Upstream commit 5863702561e625903ec678551cb056a4b19e0b8a ]
Just like what we do in the x86_get_event_constraints(), the PERF_X86_EVENT_LBR_SELECT flag should also be propagated to event->hw.flags so that the host lbr driver can save/restore MSR_LBR_SELECT for the special vlbr event created by KVM or BPF.
--- arch/x86/events/intel/core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/x86/events/intel/core.c +3 -1
@@ -2879,8 +2879,10 @@ intel_vlbr_constraints(struct perf_event *event) {struct event_constraint *c = &vlbr_constraint; -if (unlikely (constraint_match (c, event->hw.config))) +if (unlikely (constraint_match (c, event->hw.config))) { + event->hw.flags |= c->flags;return c; + }return NULL ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 63/154 blkcg: Remove extra blkcg_bio_issue_init
In reply to Greg Kroah-HartmanFrom: Laibin Qiu <[email protected]>
[ Upstream commit b781d8db580c058ecd54ed7d5dde7f8270b25f5b ]
KASAN reports a use-after-free report when doing block test:
==================================================================
[10050.967049] BUG: KASAN: use-after-free in
submit_bio_checks+0x1539/0x1550
[10050.977638] Call Trace: [10050.978190] dump_stack+0x9b/0xce [10050.979674] print_address_description.constprop.6+0x3e/0x60 [10050.983510] kasan_report.cold.9+0x22/0x3a [10050.986089] submit_bio_checks+0x1539/0x1550 [10050.989576] submit_bio_noacct+0x83/0xc80 [10050.993714] submit_bio+0xa7/0x330 [10050.994435] mpage_readahead+0x380/0x500 [10050.998009] read_pages+0x1c1/0xbf0 [10051.002057] page_cache_ra_unbounded+0x4c2/0x6f0 [10051.007413] do_page_cache_ra+0xda/0x110 [10051.008207] force_page_cache_ra+0x23d/0x3d0 [10051.009087] page_cache_sync_ra+0xca/0x300 [10051.009970] generic_file_buffered_read+0xbea/0x2130 [10051.012685] generic_file_read_iter+0x315/0x490 [10051.014472] blkdev_read_iter+0x113/0x1b0 [10051.015300] aio_read+0x2ad/0x450 [10051.023786] io_submit_one+0xc8e/0x1d60 [10051.029855] __se_sys_io_submit+0x125/0x350 [10051.033442] do_syscall_64+0x2d/0x40 [10051.034156] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[10051.048733] Allocated by task 18598: [10051.049482] kasan_save_stack+0x19/0x40 [10051.050263] __kasan_kmalloc.constprop.1+0xc1/0xd0 [10051.051230] kmem_cache_alloc+0x146/0x440 [10051.052060] mempool_alloc+0x125/0x2f0 [10051.052818] bio_alloc_bioset+0x353/0x590 [10051.053658] mpage_alloc+0x3b/0x240 [10051.054382] do_mpage_readpage+0xddf/0x1ef0 [10051.055250] mpage_readahead+0x264/0x500 [10051.056060] read_pages+0x1c1/0xbf0 [10051.056758] page_cache_ra_unbounded+0x4c2/0x6f0 [10051.057702] do_page_cache_ra+0xda/0x110 [10051.058511] force_page_cache_ra+0x23d/0x3d0 [10051.059373] page_cache_sync_ra+0xca/0x300 [10051.060198] generic_file_buffered_read+0xbea/0x2130 [10051.061195] generic_file_read_iter+0x315/0x490 [10051.062189] blkdev_read_iter+0x113/0x1b0 [10051.063015] aio_read+0x2ad/0x450 [10051.063686] io_submit_one+0xc8e/0x1d60 [10051.064467] __se_sys_io_submit+0x125/0x350 [10051.065318] do_syscall_64+0x2d/0x40 [10051.066082] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[10051.067455] Freed by task 13307: [10051.068136] kasan_save_stack+0x19/0x40 [10051.068931] kasan_set_track+0x1c/0x30 [10051.069726] kasan_set_free_info+0x1b/0x30 [10051.070621] __kasan_slab_free+0x111/0x160 [10051.071480] kmem_cache_free+0x94/0x460 [10051.072256] mempool_free+0xd6/0x320 [10051.072985] bio_free+0xe0/0x130 [10051.073630] bio_put+0xab/0xe0 [10051.074252] bio_endio+0x3a6/0x5d0 [10051.074984] blk_update_request+0x590/0x1370 [10051.075870] scsi_end_request+0x7d/0x400 [10051.076667] scsi_io_completion+0x1aa/0xe50 [10051.077503] scsi_softirq_done+0x11b/0x240 [10051.078344] blk_mq_complete_request+0xd4/0x120 [10051.079275] scsi_mq_done+0xf0/0x200 [10051.080036] virtscsi_vq_done+0xbc/0x150 [10051.080850] vring_interrupt+0x179/0x390 [10051.081650] __handle_irq_event_percpu+0xf7/0x490 [10051.082626] handle_irq_event_percpu+0x7b/0x160 [10051.083527] handle_irq_event+0xcc/0x170 [10051.084297] handle_edge_irq+0x215/0xb20 [10051.085122] asm_call_irq_on_stack+0xf/0x20 [10051.085986] common_interrupt+0xae/0x120 [10051.086830] asm_common_interrupt+0x1e/0x40
==================================================================
Bio will be checked at beginning of submit_bio_noacct(). If bio needs to be throttled, it will start the timer and stop submit bio directly. Bio will submit in blk_throtl_dispatch_work_fn() when the timer expires. But in the current process, if bio is throttled, it will still set bio issue->value by blkcg_bio_issue_init(). This is redundant and may cause the above use-after-free.
CPU0 CPU1submit_biosubmit_bio_noacct
submit_bio_checks
blk_throtl_bio()
<=mod_timer(&sq->pending_timer
blk_throtl_dispatch_work_fn
submit_bio_noacct() <= bio have throttle tag, will throw directly and bio issue->value will be set here
bio_endio() bio_put() bio_free() <= free this bio
blkcg_bio_issue_init(bio)
<= bio has been freed and
will lead to UAF
return BLK_QC_T_NONE
Fix this by remove extra blkcg_bio_issue_init.
--- block/blk-core.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
block/blk-core.c +1 -3
@@ -897,10 +897,8 @@ static noinline_for_stack bool submit_bio_checks(struct bio *bio)if (unlikely (!current->io_context))create_task_io_context (current,GFP_ATOMIC , q->node); -if (blk_throtl_bio (bio)) { -blkcg_bio_issue_init (bio); +if (blk_throtl_bio (bio))return false; - }blk_cgroup_bio_start (bio);blkcg_bio_issue_init (bio);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 64/154 tracing/histogram: Do not copy the fixed-size char array field over the field size
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit 63f84ae6b82bb4dff672f76f30c6fd7b9d3766bc ]
Do not copy the fixed-size char array field of the events over the field size. The histogram treats char array as a string and there are 2 types of char array in the event, fixed-size and dynamic string. The dynamic string (__data_loc) field must be null terminated, but the fixed-size char array field may not be null terminated (not a string, but just a data). In that case, histogram can copy the data after the field. This uses the original field size for fixed-size char array field to restrict the histogram not to access over the original field size.
--- kernel/trace/trace_events_hist.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
kernel/trace/trace_events_hist.c +5 -4
@@ -1684,9 +1684,10 @@ static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data,if (!hist_field->type) goto free; -if (field->filter_type ==FILTER_STATIC_STRING ) +if (field->filter_type ==FILTER_STATIC_STRING ) { hist_field->fn = hist_field_string; -else if (field->filter_type ==FILTER_DYN_STRING ) + hist_field->size = field->size; + }else if (field->filter_type ==FILTER_DYN_STRING ) hist_field->fn = hist_field_dynstring;else hist_field->fn = hist_field_pstring;
@@ -2624,7 +2625,7 @@ static inline void __update_field_vars(struct tracing_map_elt *elt,char *str = elt_data->field_var_str[j++];char *val_str = (char *)(uintptr_t )var_val; -strscpy (str, val_str,STR_VAR_LEN_MAX ); +strscpy (str, val_str, val->size); var_val = (u64 )(uintptr_t )str; }tracing_map_set_var (elt, var_idx, var_val);
@@ -4472,7 +4473,7 @@ static void hist_trigger_elt_update(struct hist_trigger_data *hist_data, str = elt_data->field_var_str[idx]; val_str = (char *)(uintptr_t )hist_val; -strscpy (str, val_str,STR_VAR_LEN_MAX ); +strscpy (str, val_str, hist_field->size); hist_val = (u64 )(uintptr_t )str; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 65/154 perf bpf: Avoid memory leak from perf_env__insert_btf()
In reply to Greg Kroah-HartmanFrom: Ian Rogers <[email protected]>
[ Upstream commit 4924b1f7c46711762fd0e65c135ccfbcfd6ded1f ]
perf_env__insert_btf() doesn't insert if a duplicate BTF id is encountered and this causes a memory leak. Modify the function to return a success/error value and then free the memory if insertion didn't happen.
v2. Adds a return -1 when the insertion error occurs in
perf_env__fetch_btf. This doesn't affect anything as the result is never checked.
--- tools/perf/util/bpf-event.c | 6 +++++- tools/perf/util/env.c | 5 ++++- tools/perf/util/env.h | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-)
tools/perf/util/bpf-event.c +5 -1
@@ -109,7 +109,11 @@ static int perf_env__fetch_btf(struct perf_env *env, node->data_size = data_size;memcpy (node->data, data, data_size); -perf_env__insert_btf (env, node); +if (!perf_env__insert_btf (env, node)) { +/* Insertion failed because of a duplicate. */ +free (node); +return -1 ; + }return 0 ; }
tools/perf/util/env.c +4 -1
@@ -71,12 +71,13 @@ out:return node; } -void perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node) +bool perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node) {struct rb_node *parent =NULL ;__u32 btf_id = btf_node->id;struct btf_node *node;struct rb_node **p; +bool ret = true;down_write (&env->bpf_progs.lock); p = &env->bpf_progs.btfs.rb_node;
@@ -90,6 +91,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) p = &(*p)->rb_right; }else {pr_debug ("duplicated btf %u\n" , btf_id); + ret = false; goto out; } }
@@ -99,6 +101,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) env->bpf_progs.btfs_cnt++; out:up_write (&env->bpf_progs.lock); +return ret; }struct btf_node *perf_env__find_btf (struct perf_env *env,__u32 btf_id)
tools/perf/util/env.h +1 -1
@@ -143,7 +143,7 @@ void perf_env__insert_bpf_prog_info(struct perf_env *env, struct bpf_prog_info_node *info_node);struct bpf_prog_info_node *perf_env__find_bpf_prog_info (struct perf_env *env,__u32 prog_id); -void perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node); +bool perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node);struct btf_node *perf_env__find_btf (struct perf_env *env,__u32 btf_id);int perf_env__numa_node (struct perf_env *env,int cpu);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 66/154 perf bench futex: Fix memory leak of perf_cpu_map__new()
In reply to Greg Kroah-HartmanFrom: Sohaib Mohamed <[email protected]>
[ Upstream commit 88e48238d53682281c9de2a0b65d24d3b64542a0 ]
ASan reports memory leaks while running:
$ sudo ./perf bench futex all
The leaks are caused by perf_cpu_map__new not being freed. This patch adds the missing perf_cpu_map__put since it calls cpu_map_delete implicitly.
--- tools/perf/bench/futex-lock-pi.c | 1 + tools/perf/bench/futex-requeue.c | 1 + tools/perf/bench/futex-wake-parallel.c | 1 + tools/perf/bench/futex-wake.c | 1 + 4 files changed, 4 insertions(+)
tools/perf/bench/futex-lock-pi.c +1 -0
@@ -226,6 +226,7 @@ int bench_futex_lock_pi(int argc, const char **argv)print_summary ();free (worker); +perf_cpu_map__put (cpu);return ret; err:usage_with_options (bench_futex_lock_pi_usage, options);
tools/perf/bench/futex-requeue.c +1 -0
@@ -216,6 +216,7 @@ int bench_futex_requeue(int argc, const char **argv)print_summary ();free (worker); +perf_cpu_map__put (cpu);return ret; err:usage_with_options (bench_futex_requeue_usage, options);
tools/perf/bench/futex-wake-parallel.c +1 -0
@@ -320,6 +320,7 @@ int bench_futex_wake_parallel(int argc, const char **argv)print_summary ();free (blocked_worker); +perf_cpu_map__put (cpu); return ret; }#endif /* HAVE_PTHREAD_BARRIER */
tools/perf/bench/futex-wake.c +1 -0
@@ -210,5 +210,6 @@ int bench_futex_wake(int argc, const char **argv)print_summary ();free (worker); +perf_cpu_map__put (cpu);return ret; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 67/154 perf tests: Remove bash construct from record+zstd_comp_decomp.sh
In reply to Greg Kroah-HartmanFrom: James Clark <[email protected]>
[ Upstream commit a9cdc1c5e3700a5200e5ca1f90b6958b6483845b ]
Commit 463538a383a2 ("perf tests: Fix test 68 zstd compression for s390") inadvertently removed the -g flag from all platforms rather than just s390, because the [[ ]] construct fails in sh. Changing to single brackets restores testing of call graphs and removes the following error from the output:
$ ./perf test -v 85 85: Zstd perf.data compression/decompression : --- start --- test child forked, pid 50643 Collecting compressed record file: ./tests/shell/record+zstd_comp_decomp.sh: 15: [[: not found
--- tools/perf/tests/shell/record+zstd_comp_decomp.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/tests/shell/record+zstd_comp_decomp.sh +1 -1
@@ -12,7 +12,7 @@ skip_if_no_z_record() { collect_z_record() { echo "Collecting compressed record file:" - [[ "$(uname -m)" != s390x ]] && gflag='-g' + [ "$(uname -m)" != s390x ] && gflag='-g' $perf_tool record -o $trace_file $gflag -z -F 5000 -- \ dd count=500 if=/dev/urandom of=/dev/null }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 68/154 drm/nouveau: hdmigv100.c: fix corrupted HDMI Vendor InfoFrame
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
[ Upstream commit 3cc1ae1fa70ab369e4645e38ce335a19438093ad ]
gv100_hdmi_ctrl() writes vendor_infoframe.subpack0_high to 0x6f0110, and then overwrites it with 0. Just drop the overwrite with 0, that's clearly a mistake.
Because of this issue the HDMI VIC is 0 instead of 1 in the HDMI Vendor InfoFrame when transmitting 4kp30.
--- drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c | 1 - 1 file changed, 1 deletion(-)
drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c +0 -1
@@ -62,7 +62,6 @@ gv100_hdmi_ctrl(struct nvkm_ior *ior, int head, bool enable, u8 max_ac_packet,nvkm_wr32 (device,0x6f0108 + hdmi, vendor_infoframe.header);nvkm_wr32 (device,0x6f010c + hdmi, vendor_infoframe.subpack0_low);nvkm_wr32 (device,0x6f0110 + hdmi, vendor_infoframe.subpack0_high); -nvkm_wr32 (device,0x6f0110 + hdmi,0x00000000 );nvkm_wr32 (device,0x6f0114 + hdmi,0x00000000 );nvkm_wr32 (device,0x6f0118 + hdmi,0x00000000 );nvkm_wr32 (device,0x6f011c + hdmi,0x00000000 );
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 69/154 net-zerocopy: Copy straggler unaligned data for TCP Rx. zerocopy.
In reply to Greg Kroah-HartmanFrom: Arjun Roy <[email protected]>
[ Upstream commit 18fb76ed53865c1b5d5f0157b1b825704590beb5 ]
When TCP receive zerocopy does not successfully map the entire requested space, it outputs a 'hint' that the caller should recvmsg().
Augment zerocopy to accept a user buffer that it tries to copy this hint into - if it is possible to copy the entire hint, it will do so. This elides a recvmsg() call for received traffic that isn't exactly page-aligned in size.
This was tested with RPC-style traffic of arbitrary sizes. Normally, each received message required at least one getsockopt() call, and one recvmsg() call for the remaining unaligned data.
With this change, almost all of the recvmsg() calls are eliminated, leading to a savings of about 25%-50% in number of system calls for RPC-style workloads.
--- include/uapi/linux/tcp.h | 2 + net/ipv4/tcp.c | 84 ++++++++++++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 16 deletions(-)
include/uapi/linux/tcp.h +2 -0
@@ -349,5 +349,7 @@ struct tcp_zerocopy_receive {__u32 recv_skip_hint;/* out: amount of bytes to skip */ __u32 inq;/* out: amount of bytes in read queue */ __s32 err;/* out: socket error */ +__u64 copybuf_address;/* in: copybuf address (small reads) */ + __s32 copybuf_len; /* in/out: copybuf bytes avail/used or error */ };#endif /* _UAPI_LINUX_TCP_H */
net/ipv4/tcp.c +68 -16
130 lines not on this page · raw message
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 70/154 net-zerocopy: Refactor skb frag fast-forward op.
In reply to Greg Kroah-HartmanFrom: Arjun Roy <[email protected]>
[ Upstream commit 7fba5309efe24e4f0284ef4b8663cdf401035e72 ]
Refactor skb frag fast-forwarding for tcp receive zerocopy. This is part of a patch set that introduces short-circuited hybrid copies for small receive operations, which results in roughly 33% fewer syscalls for small RPC scenarios.
skb_advance_to_frag(), given a skb and an offset into the skb, iterates from the first frag for the skb until we're at the frag specified by the offset. Assuming the offset provided refers to how many bytes in the skb are already read, the returned frag points to the next frag we may read from, while offset_frag is set to the number of bytes from this frag that we have already read.
If frag is not null and offset_frag is equal to 0, then we may be able to map this frag's page into the process address space with vm_insert_page(). However, if offset_frag is not equal to 0, then we cannot do so.
--- net/ipv4/tcp.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-)
net/ipv4/tcp.c +26 -9
@@ -1746,6 +1746,28 @@ int tcp_mmap(struct file *file, struct socket *sock, }EXPORT_SYMBOL (tcp_mmap); +static skb_frag_t *skb_advance_to_frag (struct sk_buff *skb,u32 offset_skb, +u32 *offset_frag) +{ +skb_frag_t *frag; + + offset_skb -=skb_headlen (skb); +if ((int )offset_skb <0 ||skb_has_frag_list (skb)) +return NULL ; + + frag =skb_shinfo (skb)->frags; +while (offset_skb) { +if (skb_frag_size (frag) > offset_skb) { + *offset_frag = offset_skb; +return frag; + } + offset_skb -=skb_frag_size (frag); + ++frag; + } + *offset_frag =0 ; +return frag; +} +static int tcp_copy_straggler_data (struct tcp_zerocopy_receive *zc,struct sk_buff *skb,u32 copylen,u32 *offset,u32 *seq)
@@ -1872,6 +1894,8 @@ static int tcp_zerocopy_receive(struct sock *sk, curr_addr = address;while (length +PAGE_SIZE <= zc->length) {if (zc->recv_skip_hint <PAGE_SIZE ) { +u32 offset_frag; +/* If we're here, finish the current batch. */ if (pg_idx) { ret = tcp_zerocopy_vm_insert_batch(vma, pages,
@@ -1892,16 +1916,9 @@ static int tcp_zerocopy_receive(struct sock *sk, skb =tcp_recv_skb (sk, seq, &offset); } zc->recv_skip_hint = skb->len - offset; - offset -=skb_headlen (skb); -if ((int )offset <0 ||skb_has_frag_list (skb)) + frags =skb_advance_to_frag (skb, offset, &offset_frag); +if (!frags || offset_frag)break ; - frags =skb_shinfo (skb)->frags; -while (offset) { -if (skb_frag_size (frags) > offset) - goto out; - offset -=skb_frag_size (frags); - frags++; - } }if (skb_frag_size (frags) !=PAGE_SIZE ||skb_frag_off (frags)) {int remaining = zc->recv_skip_hint;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 71/154 tcp: Fix uninitialized access in skb frags array for Rx 0cp.
In reply to Greg Kroah-HartmanFrom: Arjun Roy <[email protected]>
[ Upstream commit 70701b83e208767f2720d8cd3e6a62cddafb3a30 ]
TCP Receive zerocopy iterates through the SKB queue via tcp_recv_skb(), acquiring a pointer to an SKB and an offset within that SKB to read from. From there, it iterates the SKB frags array to determine which offset to start remapping pages from.
However, this is built on the assumption that the offset read so far within the SKB is smaller than the SKB length. If this assumption is violated, we can attempt to read an invalid frags array element, which would cause a fault.
tcp_recv_skb() can cause such an SKB to be returned when the TCP FIN flag is set. Therefore, we must guard against this occurrence inside skb_advance_frag().
One way that we can reproduce this error follows:
1) In a receiver program, call getsockopt(TCP_ZEROCOPY_RECEIVE) with:
char some_array[32 * 1024];
struct tcp_zerocopy_receive zc = {
.copybuf_address = (__u64) &some_array[0],
.copybuf_len = 32 * 1024,
};
2) In a sender program, after a TCP handshake, send the following sequence of packets:
i) Seq = [X, X+4000]
ii) Seq = [X+4000, X+5000]
iii) Seq = [X+4000, X+5000], Flags = FIN | URG, urgptr=1000
(This can happen without URG, if we have a signal pending, but URG is a convenient way to reproduce the behaviour).
In this case, the following event sequence will occur on the receiver:
tcp_zerocopy_receive():
-> receive_fallback_to_copy() // copybuf_len >= inq
-> tcp_recvmsg_locked() // reads 5000 bytes, then breaks due to URG -> tcp_recv_skb() // yields skb with skb->len == offset -> tcp_zerocopy_set_hint_for_skb()
-> skb_advance_to_frag() // will returns a frags ptr. >= nr_frags -> find_next_mappable_frag() // will dereference this bad frags ptr.
With this patch, skb_advance_to_frag() will no longer return an invalid frags pointer, and will return NULL instead, fixing the issue.
--- net/ipv4/tcp.c | 3 +++ 1 file changed, 3 insertions(+)
net/ipv4/tcp.c +3 -0
@@ -1751,6 +1751,9 @@ static skb_frag_t *skb_advance_to_frag(struct sk_buff *skb, u32 offset_skb, {skb_frag_t *frag; +if (unlikely (offset_skb >= skb->len)) +return NULL ; + offset_skb -=skb_headlen (skb);if ((int )offset_skb <0 ||skb_has_frag_list (skb))return NULL ;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 72/154 tracing: Add length protection to histogram string copies
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (VMware) <[email protected]>
[ Upstream commit 938aa33f14657c9ed9deea348b7d6f14b6d69cb7 ]
The string copies to the histogram storage has a max size of 256 bytes (defined by MAX_FILTER_STR_VAL). Only the string size of the event field needs to be copied to the event storage, but no more than what is in the event storage. Although nothing should be bigger than 256 bytes, there's no protection against overwriting of the storage if one day there is.
Copy no more than the destination size, and enforce it.
Also had to turn MAX_FILTER_STR_VAL into an unsigned int, to keep the min() comparison of the string sizes of comparable types.
--- include/linux/trace_events.h | 2 +- kernel/trace/trace_events_hist.c | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-)
include/linux/trace_events.h +1 -1
@@ -571,7 +571,7 @@ struct trace_event_file {#define PERF_MAX_TRACE_SIZE 2048 -#define MAX_FILTER_STR_VAL 256/* Should handle KSYM_SYMBOL_LEN */ +#define MAX_FILTER_STR_VAL 256U/* Should handle KSYM_SYMBOL_LEN */ enum event_trigger_type {ETT_NONE = (0 ),
kernel/trace/trace_events_hist.c +7 -2
@@ -2624,8 +2624,10 @@ static inline void __update_field_vars(struct tracing_map_elt *elt,if (val->flags &HIST_FIELD_FL_STRING ) {char *str = elt_data->field_var_str[j++];char *val_str = (char *)(uintptr_t )var_val; +unsigned int size; -strscpy (str, val_str, val->size); + size =min (val->size,STR_VAR_LEN_MAX ); +strscpy (str, val_str, size); var_val = (u64 )(uintptr_t )str; }tracing_map_set_var (elt, var_idx, var_val);
@@ -4465,6 +4467,7 @@ static void hist_trigger_elt_update(struct hist_trigger_data *hist_data,if (hist_field->flags &HIST_FIELD_FL_STRING ) {unsigned int str_start, var_str_idx, idx;char *str, *val_str; +unsigned int size; str_start = hist_data->n_field_var_str + hist_data->n_save_var_str;
@@ -4473,7 +4476,9 @@ static void hist_trigger_elt_update(struct hist_trigger_data *hist_data, str = elt_data->field_var_str[idx]; val_str = (char *)(uintptr_t )hist_val; -strscpy (str, val_str, hist_field->size); + + size =min (hist_field->size,STR_VAR_LEN_MAX ); +strscpy (str, val_str, size); hist_val = (u64 )(uintptr_t )str; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 73/154 net: ipa: disable HOLB drop when updating timer
In reply to Greg Kroah-HartmanFrom: Alex Elder <[email protected]>
[ Upstream commit 816316cacad2b5abd5b41423cf04e4845239abd4 ]
The head-of-line blocking timer should only be modified when head-of-line drop is disabled.
One of the steps in recovering from a modem crash is to enable dropping of packets with timeout of 0 (immediate). We don't know how the modem configured its endpoints, so before we program the timer, we need to ensure HOL_BLOCK is disabled.
--- drivers/net/ipa/ipa_endpoint.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ipa/ipa_endpoint.c +2 -0
@@ -703,6 +703,7 @@ static void ipa_endpoint_init_hol_block_u32 offset;u32 val; +/* This should only be changed when HOL_BLOCK_EN is disabled */ offset =IPA_REG_ENDP_INIT_HOL_BLOCK_TIMER_N_OFFSET (endpoint_id); val =ipa_reg_init_hol_block_timer_val (ipa, microseconds);iowrite32 (val, ipa->reg_virt + offset);
@@ -730,6 +731,7 @@ void ipa_endpoint_modem_hol_block_clear_if (endpoint->toward_ipa || endpoint->ee_id !=GSI_EE_MODEM )continue ; +ipa_endpoint_init_hol_block_enable (endpoint, false);ipa_endpoint_init_hol_block_timer (endpoint,0 );ipa_endpoint_init_hol_block_enable (endpoint, true); }
Greg Kroah-Hartman
maintainerPATCH 74/154 net: bnx2x: fix variable dereferenced before check
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
[ Upstream commit f8885ac89ce310570e5391fe0bf0ec9c7c9b4fdc ]
Smatch says:
bnx2x_init_ops.h:640 bnx2x_ilt_client_mem_op() warn: variable dereferenced before check 'ilt' (see line 638)
Move ilt_cli variable initialization _after_ ilt validation, because it's unsafe to deref the pointer before validation check.
--- drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h +3 -1
@@ -635,11 +635,13 @@ static int bnx2x_ilt_client_mem_op(struct bnx2x *bp, int cli_num, {int i, rc;struct bnx2x_ilt *ilt =BP_ILT (bp); -struct ilt_client_info *ilt_cli = &ilt->clients[cli_num]; +struct ilt_client_info *ilt_cli;if (!ilt || !ilt->lines)return -1 ; + ilt_cli = &ilt->clients[cli_num]; +if (ilt_cli->flags & (ILT_CLIENT_SKIP_INIT |ILT_CLIENT_SKIP_MEM ))return 0 ;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 75/154 bnxt_en: reject indirect blk offload when hw-tc-offload is off
In reply to Greg Kroah-HartmanFrom: Sriharsha Basavapatna <[email protected]>
[ Upstream commit b0757491a118ae5727cf9f1c3a11544397d46596 ]
The driver does not check if hw-tc-offload is enabled for the device before offloading a flow in the context of indirect block callback. Fix this by checking NETIF_F_HW_TC in the features flag and rejecting the offload request. This will avoid unnecessary dmesg error logs when hw-tc-offload is disabled, such as these:
bnxt_en 0000:19:00.1 eno2np1: dev(ifindex=294) not on same switchbnxt_en 0000:19:00.1 eno2np1: Error: bnxt_tc_add_flow: cookie=0xffff8dace1c88000 error=-22 bnxt_en 0000:19:00.0 eno1np0: dev(ifindex=294) not on same switchbnxt_en 0000:19:00.0 eno1np0: Error: bnxt_tc_add_flow: cookie=0xffff8dace1c88000 error=-22
--- drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c +1 -1
@@ -1854,7 +1854,7 @@ static int bnxt_tc_setup_indr_block_cb(enum tc_setup_type type,struct flow_cls_offload *flower = type_data;struct bnxt *bp = priv->bp; -if (flower->common.chain_index) +if (!tc_cls_can_offload_and_chain0 (bp->dev, type_data))return -EOPNOTSUPP ;switch (type) {
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 76/154 tipc: only accept encrypted MSG_CRYPTO msgs
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit 271351d255b09e39c7f6437738cba595f9b235be ]
The MSG_CRYPTO msgs are always encrypted and sent to other nodes for keys' deployment. But when receiving in peers, if those nodes do not validate it and make sure it's encrypted, one could craft a malicious MSG_CRYPTO msg to deploy its key with no need to know other nodes' keys.
This patch is to do that by checking TIPC_SKB_CB(skb)->decrypted and discard it if this packet never got decrypted.
Note that this is also a supplementary fix to CVE-2021-43267 that can be triggered by an unencrypted malicious MSG_CRYPTO msg.
--- net/tipc/link.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/tipc/link.c +5 -2
@@ -1258,8 +1258,11 @@ static bool tipc_data_input(struct tipc_link *l, struct sk_buff *skb,return false;#ifdef CONFIG_TIPC_CRYPTO case MSG_CRYPTO : -tipc_crypto_msg_rcv (l->net, skb); -return true; +if (TIPC_SKB_CB (skb)->decrypted) { +tipc_crypto_msg_rcv (l->net, skb); +return true; + } + fallthrough;#endif default :pr_warn ("Dropping received illegal msg type\n" );
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 77/154 net: reduce indentation level in sk_clone_lock()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit bbc20b70424aeb3c84f833860f6340adda5141fc ]
Rework initial test to jump over init code
if memory allocation has failed.
--- net/core/sock.c | 189 ++++++++++++++++++++++++------------------------ 1 file changed, 93 insertions(+), 96 deletions(-)
net/core/sock.c +93 -96
@@ -1883,123 +1883,120 @@ static void sk_init_common(struct sock *sk)struct sock *sk_clone_lock (const struct sock *sk,const gfp_t priority) {struct proto *prot =READ_ONCE (sk->sk_prot); -struct sock *newsk; +struct sk_filter *filter;bool is_charged = true; +struct sock *newsk; newsk =sk_prot_alloc (prot, priority, sk->sk_family); -if (newsk !=NULL ) { -struct sk_filter *filter; +if (!newsk) + goto out; -sock_copy (newsk, sk); +sock_copy (newsk, sk); - newsk->sk_prot_creator = prot; + newsk->sk_prot_creator = prot; -/* SANITY */ -if (likely (newsk->sk_net_refcnt)) -get_net (sock_net (newsk)); -sk_node_init (&newsk->sk_node); -sock_lock_init (newsk); -bh_lock_sock (newsk); - newsk->sk_backlog.head = newsk->sk_backlog.tail =NULL ; - newsk->sk_backlog.len =0 ; +/* SANITY */ +if (likely (newsk->sk_net_refcnt)) +get_net (sock_net (newsk)); +sk_node_init (&newsk->sk_node); +sock_lock_init (newsk); +bh_lock_sock (newsk); + newsk->sk_backlog.head = newsk->sk_backlog.tail =NULL ; + newsk->sk_backlog.len =0 ; -atomic_set (&newsk->sk_rmem_alloc,0 ); -/* -* sk_wmem_alloc set to one (see sk_free() and sock_wfree()) -*/ -refcount_set (&newsk->sk_wmem_alloc,1 ); -atomic_set (&newsk->sk_omem_alloc,0 ); -sk_init_common (newsk); +atomic_set (&newsk->sk_rmem_alloc,0 ); - newsk->sk_dst_cache =NULL ; - newsk->sk_dst_pending_confirm =0 ; - newsk->sk_wmem_queued =0 ; - newsk->sk_forward_alloc =0 ; -atomic_set (&newsk->sk_drops,0 ); - newsk->sk_send_head =NULL ; - newsk->sk_userlocks = sk->sk_userlocks & ~SOCK_BINDPORT_LOCK ; -atomic_set (&newsk->sk_zckey,0 ); +/* sk_wmem_alloc set to one (see sk_free() and sock_wfree()) */ +refcount_set (&newsk->sk_wmem_alloc,1 ); -sock_reset_flag (newsk,SOCK_DONE ); +atomic_set (&newsk->sk_omem_alloc,0 ); +sk_init_common (newsk); -/* sk->sk_memcg will be populated at accept() time */ - newsk->sk_memcg =NULL ; + newsk->sk_dst_cache =NULL ; + newsk->sk_dst_pending_confirm =0 ; + newsk->sk_wmem_queued =0 ; + newsk->sk_forward_alloc =0 ; +atomic_set (&newsk->sk_drops,0 ); + newsk->sk_send_head =NULL ; + newsk->sk_userlocks = sk->sk_userlocks & ~SOCK_BINDPORT_LOCK ; +atomic_set (&newsk->sk_zckey,0 ); -cgroup_sk_clone (&newsk->sk_cgrp_data); +sock_reset_flag (newsk,SOCK_DONE ); -rcu_read_lock (); - filter =rcu_dereference (sk->sk_filter); -if (filter !=NULL ) -/* though it's an empty new sock, the charging may fail -* if sysctl_optmem_max was changed between creation of -* original socket and cloning -*/ - is_charged =sk_filter_charge (newsk, filter); -RCU_INIT_POINTER (newsk->sk_filter, filter); -rcu_read_unlock (); +/* sk->sk_memcg will be populated at accept() time */ + newsk->sk_memcg =NULL ; -if (unlikely (!is_charged ||xfrm_sk_clone_policy (newsk, sk))) { -/* We need to make sure that we don't uncharge the new -* socket if we couldn't charge it in the first place -* as otherwise we uncharge the parent's filter. -*/ -if (!is_charged) -RCU_INIT_POINTER (newsk->sk_filter,NULL ); -sk_free_unlock_clone (newsk); - newsk =NULL ; - goto out; - } -RCU_INIT_POINTER (newsk->sk_reuseport_cb,NULL ); +cgroup_sk_clone (&newsk->sk_cgrp_data); -if (bpf_sk_storage_clone (sk, newsk)) { -sk_free_unlock_clone (newsk); - newsk =NULL ; - goto out; - } +rcu_read_lock (); + filter =rcu_dereference (sk->sk_filter); +if (filter !=NULL ) +/* though it's an empty new sock, the charging may fail +* if sysctl_optmem_max was changed between creation of +* original socket and cloning +*/ + is_charged =sk_filter_charge (newsk, filter); +RCU_INIT_POINTER (newsk->sk_filter, filter); +rcu_read_unlock (); -/* Clear sk_user_data if parent had the pointer tagged -* as not suitable for copying when cloning. +if (unlikely (!is_charged ||xfrm_sk_clone_policy (newsk, sk))) { +/* We need to make sure that we don't uncharge the new +* socket if we couldn't charge it in the first place +* as otherwise we uncharge the parent's filter. */ -if (sk_user_data_is_nocopy (newsk)) - newsk->sk_user_data =NULL ; +if (!is_charged) +RCU_INIT_POINTER (newsk->sk_filter,NULL ); +sk_free_unlock_clone (newsk); + newsk =NULL ; + goto out; + } +RCU_INIT_POINTER (newsk->sk_reuseport_cb,NULL ); - newsk->sk_err =0 ; - newsk->sk_err_soft =0 ; - newsk->sk_priority =0 ; - newsk->sk_incoming_cpu =raw_smp_processor_id (); -if (likely (newsk->sk_net_refcnt)) -sock_inuse_add (sock_net (newsk),1 ); +if (bpf_sk_storage_clone (sk, newsk)) { +sk_free_unlock_clone (newsk); + newsk =NULL ; + goto out; + } -/* -* Before updating sk_refcnt, we must commit prior changes to memory -* (Documentation/RCU/rculist_nulls.rst for details) -*/ -smp_wmb (); -refcount_set (&newsk->sk_refcnt,2 ); +/* Clear sk_user_data if parent had the pointer tagged +* as not suitable for copying when cloning. +*/ +if (sk_user_data_is_nocopy (newsk)) + newsk->sk_user_data =NULL ; -/* -* Increment the counter in the same struct proto as the master -* sock (sk_refcnt_debug_inc uses newsk->sk_prot->socks, that -* is the same as sk->sk_prot->socks, as this field was copied -* with memcpy). -* -* This _changes_ the previous behaviour, where -* tcp_create_openreq_child always was incrementing the -* equivalent to tcp_prot->socks (inet_sock_nr), so this have -* to be taken into account in all callers. -acme -*/ -sk_refcnt_debug_inc (newsk); -sk_set_socket (newsk,NULL ); -sk_tx_queue_clear (newsk); -RCU_INIT_POINTER (newsk->sk_wq,NULL ); + newsk->sk_err =0 ; + newsk->sk_err_soft =0 ; + newsk->sk_priority =0 ; + newsk->sk_incoming_cpu =raw_smp_processor_id (); +if (likely (newsk->sk_net_refcnt)) +sock_inuse_add (sock_net (newsk),1 ); -if (newsk->sk_prot->sockets_allocated) -sk_sockets_allocated_inc (newsk); +/* Before updating sk_refcnt, we must commit prior changes to memory +* (Documentation/RCU/rculist_nulls.rst for details) +*/ +smp_wmb (); +refcount_set (&newsk->sk_refcnt,2 ); -if (sock_needs_netstamp (sk) && - newsk->sk_flags &SK_FLAGS_TIMESTAMP ) -net_enable_timestamp (); - } +/* Increment the counter in the same struct proto as the master +* sock (sk_refcnt_debug_inc uses newsk->sk_prot->socks, that +* is the same as sk->sk_prot->socks, as this field was copied +* with memcpy). +* +* This _changes_ the previous behaviour, where +* tcp_create_openreq_child always was incrementing the +* equivalent to tcp_prot->socks (inet_sock_nr), so this have +* to be taken into account in all callers. -acme +*/ +sk_refcnt_debug_inc (newsk); +sk_set_socket (newsk,NULL ); +sk_tx_queue_clear (newsk); +RCU_INIT_POINTER (newsk->sk_wq,NULL ); + +if (newsk->sk_prot->sockets_allocated) +sk_sockets_allocated_inc (newsk); + +if (sock_needs_netstamp (sk) && newsk->sk_flags &SK_FLAGS_TIMESTAMP ) +net_enable_timestamp (); out:return newsk; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 78/154 sock: fix /proc/net/sockstat underflow in sk_clone_lock()
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
[ Upstream commit 938cca9e4109b30ee1d476904538225a825e54eb ]
sk_clone_lock() needs to call sock_inuse_add(1) before entering the sk_free_unlock_clone() error path, for __sk_free() from sk_free() from sk_free_unlock_clone() calls sock_inuse_add(-1).
--- net/core/sock.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/core/sock.c +3 -3
@@ -1896,8 +1896,10 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) newsk->sk_prot_creator = prot;/* SANITY */ -if (likely (newsk->sk_net_refcnt)) +if (likely (newsk->sk_net_refcnt)) {get_net (sock_net (newsk)); +sock_inuse_add (sock_net (newsk),1 ); + }sk_node_init (&newsk->sk_node);sock_lock_init (newsk);bh_lock_sock (newsk);
@@ -1968,8 +1970,6 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) newsk->sk_err_soft =0 ; newsk->sk_priority =0 ; newsk->sk_incoming_cpu =raw_smp_processor_id (); -if (likely (newsk->sk_net_refcnt)) -sock_inuse_add (sock_net (newsk),1 );/* Before updating sk_refcnt, we must commit prior changes to memory * (Documentation/RCU/rculist_nulls.rst for details)
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 79/154 net/smc: Make sure the link_id is unique
In reply to Greg Kroah-HartmanFrom: Wen Gu <[email protected]>
[ Upstream commit cf4f5530bb55ef7d5a91036b26676643b80b1616 ]
The link_id is supposed to be unique, but smcr_next_link_id() doesn't skip the used link_id as expected. So the patch fixes this.
--- net/smc/smc_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/smc/smc_core.c +2 -1
@@ -287,13 +287,14 @@ static u8 smcr_next_link_id(struct smc_link_group *lgr)int i;while (1 ) { +again: link_id = ++lgr->next_link_id;if (!link_id)/* skip zero as link_id */ link_id = ++lgr->next_link_id;for (i =0 ; i <SMC_LINKS_PER_LGR_MAX ; i++) {if (smc_link_usable (&lgr->lnk[i]) && lgr->lnk[i].link_id == link_id) -continue ; + goto again; }break ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 80/154 iavf: Fix return of set the new channel count
In reply to Greg Kroah-HartmanFrom: Mateusz Palczewski <[email protected]>
[ Upstream commit 4e5e6b5d9d1334d3490326b6922a2daaf56a867f ]
Fixed return correct code from set the new channel count. Implemented by check if reset is done in appropriate time. This solution give a extra time to pf for reset vf in case when user want set new channel count for all vfs. Without this patch it is possible to return misleading output code to user and vf reset not to be correctly performed by pf.
--- drivers/net/ethernet/intel/iavf/iavf_ethtool.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
drivers/net/ethernet/intel/iavf/iavf_ethtool.c +15 -0
@@ -892,6 +892,7 @@ static int iavf_set_channels(struct net_device *netdev, {struct iavf_adapter *adapter =netdev_priv (netdev);u32 num_req = ch->combined_count; +int i;if ((adapter->vf_res->vf_cap_flags &VIRTCHNL_VF_OFFLOAD_ADQ ) && adapter->num_tc) {
@@ -914,6 +915,20 @@ static int iavf_set_channels(struct net_device *netdev, adapter->num_req_queues = num_req; adapter->flags |=IAVF_FLAG_REINIT_ITR_NEEDED ;iavf_schedule_reset (adapter); + +/* wait for the reset is done */ +for (i =0 ; i <IAVF_RESET_WAIT_COMPLETE_COUNT ; i++) { +msleep (IAVF_RESET_WAIT_MS ); +if (adapter->flags &IAVF_FLAG_RESET_PENDING ) +continue ; +break ; + } +if (i ==IAVF_RESET_WAIT_COMPLETE_COUNT ) { + adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED ; + adapter->num_active_queues = num_req; +return -EOPNOTSUPP ; + } +return 0 ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 81/154 iavf: check for null in iavf_fix_features
In reply to Greg Kroah-HartmanFrom: Nicholas Nunley <[email protected]>
[ Upstream commit 8a4a126f4be88eb8b5f00a165ab58c35edf4ef76 ]
If the driver has lost contact with the PF then it enters a disabled state and frees adapter->vf_res. However, ndo_fix_features can still be called on the interface, so we need to check for this condition first. Since we have no information on the features at this time simply leave them unmodified and return.
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +2 -1
@@ -3419,7 +3419,8 @@ static netdev_features_t iavf_fix_features(struct net_device *netdev, {struct iavf_adapter *adapter =netdev_priv (netdev); -if (!(adapter->vf_res->vf_cap_flags &VIRTCHNL_VF_OFFLOAD_VLAN )) +if (adapter->vf_res && + !(adapter->vf_res->vf_cap_flags &VIRTCHNL_VF_OFFLOAD_VLAN )) features &= ~(NETIF_F_HW_VLAN_CTAG_TX |NETIF_F_HW_VLAN_CTAG_RX |NETIF_F_HW_VLAN_CTAG_FILTER );
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 82/154 iavf: free q_vectors before queues in iavf_disable_vf
In reply to Greg Kroah-HartmanFrom: Nicholas Nunley <[email protected]>
[ Upstream commit 89f22f129696ab53cfbc608e0a2184d0fea46ac1 ]
iavf_free_queues() clears adapter->num_active_queues, which iavf_free_q_vectors() relies on, so swap the order of these two function calls in iavf_disable_vf(). This resolves a panic encountered when the interface is disabled and then later brought up again after PF communication is restored.
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +1 -1
@@ -2047,8 +2047,8 @@ static void iavf_disable_vf(struct iavf_adapter *adapter)iavf_free_misc_irq (adapter);iavf_reset_interrupt_capability (adapter); -iavf_free_queues (adapter);iavf_free_q_vectors (adapter); +iavf_free_queues (adapter);memset (adapter->vf_res,0 ,IAVF_VIRTCHNL_VF_RESOURCE_SIZE );iavf_shutdown_adminq (&adapter->hw); adapter->netdev->flags &= ~IFF_UP ;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 83/154 iavf: Fix failure to exit out from last all-multicast mode
In reply to Greg Kroah-HartmanFrom: Piotr Marczak <[email protected]>
[ Upstream commit 8905072a192fffe9389255489db250c73ecab008 ]
The driver could only quit allmulti when allmulti and promisc modes are turn on at the same time. If promisc had been off there was no way to turn off allmulti mode.
The patch corrects this behavior. Switching allmulti does not depends on promisc state mode anymore
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +1 -2
@@ -1616,8 +1616,7 @@ static int iavf_process_aq_command(struct iavf_adapter *adapter)iavf_set_promiscuous (adapter,FLAG_VF_MULTICAST_PROMISC );return 0 ; } - -if ((adapter->aq_required &IAVF_FLAG_AQ_RELEASE_PROMISC ) && +if ((adapter->aq_required &IAVF_FLAG_AQ_RELEASE_PROMISC ) || (adapter->aq_required &IAVF_FLAG_AQ_RELEASE_ALLMULTI )) {iavf_set_promiscuous (adapter,0 );return 0 ;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 84/154 iavf: prevent accidental free of filter structure
In reply to Greg Kroah-HartmanFrom: Jacob Keller <[email protected]>
[ Upstream commit 4f0400803818f2642f066d3eacaf013f23554cc7 ]
In iavf_config_clsflower, the filter structure could be accidentally released at the end, if iavf_parse_cls_flower or iavf_handle_tclass ever return a non-zero but positive value.
In this case, the function continues through to the end, and will call kfree() on the filter structure even though it has been added to the linked list.
This can actually happen because iavf_parse_cls_flower will return a positive IAVF_ERR_CONFIG value instead of the traditional negative error codes.
Fix this by ensuring that the kfree() check and error checks are similar. Use the more idiomatic "if (err)" to catch all non-zero error codes.
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +2 -2
@@ -3027,11 +3027,11 @@ static int iavf_configure_clsflower(struct iavf_adapter *adapter,/* start out with flow type and eth type IPv4 to begin with */ filter->f.flow_type =VIRTCHNL_TCP_V4_FLOW ; err =iavf_parse_cls_flower (adapter, cls_flower, filter); -if (err <0 ) +if (err) goto err; err =iavf_handle_tclass (adapter, tc, filter); -if (err <0 ) +if (err) goto err;/* add filter to the list */
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 85/154 iavf: validate pointers
In reply to Greg Kroah-HartmanFrom: Mitch Williams <[email protected]>
[ Upstream commit 131b0edc4028bb88bb472456b1ddba526cfb7036 ]
In some cases, the ethtool get_rxfh handler may be called with a null key or indir parameter. So check these pointers, or you will have a very bad day.
--- drivers/net/ethernet/intel/iavf/iavf_ethtool.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/net/ethernet/intel/iavf/iavf_ethtool.c +6 -7
@@ -975,14 +975,13 @@ static int iavf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,if (hfunc) *hfunc =ETH_RSS_HASH_TOP ; -if (!indir) -return 0 ; - -memcpy (key, adapter->rss_key, adapter->rss_key_size); +if (key) +memcpy (key, adapter->rss_key, adapter->rss_key_size); -/* Each 32 bits pointed by 'indir' is stored with a lut entry */ -for (i =0 ; i < adapter->rss_lut_size; i++) - indir[i] = (u32 )adapter->rss_lut[i]; +if (indir) +/* Each 32 bits pointed by 'indir' is stored with a lut entry */ +for (i =0 ; i < adapter->rss_lut_size; i++) + indir[i] = (u32 )adapter->rss_lut[i];return 0 ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 86/154 iavf: Fix for the false positive ASQ/ARQ errors while issuing VF reset
In reply to Greg Kroah-HartmanFrom: Surabhi Boob <[email protected]>
[ Upstream commit 321421b57a12e933f92b228e0e6d0b2c6541f41d ]
While issuing VF Reset from the guest OS, the VF driver prints logs about critical / Overflow error detection. This is not an actual error since the VF_MBX_ARQLEN register is set to all FF's for a short period of time and the VF would catch the bits set if it was reading the register during that spike of time. This patch introduces an additional check to ignore this condition since the VF is in reset.
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +1 -1
@@ -2329,7 +2329,7 @@ static void iavf_adminq_task(struct work_struct *work)/* check for error indications */ val =rd32 (hw, hw->aq.arq.len); -if (val ==0xdeadbeef )/* indicates device in reset */ +if (val ==0xdeadbeef || val ==0xffffffff )/* device in reset */ goto freedom; oldval = val;if (val &IAVF_VF_ARQLEN1_ARQVFE_MASK ) {
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 87/154 iavf: Fix for setting queues to 0
In reply to Greg Kroah-HartmanFrom: Grzegorz Szczurek <[email protected]>
[ Upstream commit 9a6e9e483a9684a34573fd9f9e30ecfb047cb8cb ]
Now setting combine to 0 will be rejected with the appropriate error code.
This has been implemented by adding a condition that checks the value of combine equal to zero.
Without this patch, when the user requested it, no error was returned and combine was set to the default value for VF.
--- drivers/net/ethernet/intel/iavf/iavf_ethtool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/iavf/iavf_ethtool.c +1 -1
@@ -903,7 +903,7 @@ static int iavf_set_channels(struct net_device *netdev,/* All of these should have already been checked by ethtool before this * even gets to us, but just to be sure. */ -if (num_req > adapter->vsi_res->num_queue_pairs) +if (num_req ==0 || num_req > adapter->vsi_res->num_queue_pairs)return -EINVAL ;if (num_req == adapter->num_active_queues)
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 88/154 MIPS: generic/yamon-dt: fix uninitialized variable error
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 255e51da15baed47531beefd02f222e4dc01f1c1 ]
In the case where fw_getenv returns an error when fetching values for ememsizea and memsize then variable phys_memsize is not assigned a variable and will be uninitialized on a zero check of phys_memsize. Fix this by initializing phys_memsize to zero.
Cleans up cppcheck error:arch/mips/generic/yamon-dt.c:100:7: error: Uninitialized variable: phys_memsize [uninitvar]
--- arch/mips/generic/yamon-dt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/generic/yamon-dt.c +1 -1
@@ -75,7 +75,7 @@ static unsigned int __init gen_fdt_mem_array(__init int yamon_dt_append_memory (void *fdt,const struct yamon_mem_region *regions) { -unsigned long phys_memsize, memsize; +unsigned long phys_memsize =0 , memsize;__be32 mem_array[2 *MAX_MEM_ARRAY_ENTRIES ];unsigned int mem_entries;int i, err, mem_off;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 89/154 mips: bcm63xx: add support for clk_get_parent()
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit e8f67482e5a4bc8d0b65d606d08cb60ee123b468 ]
BCM63XX selects HAVE_LEGACY_CLK but does not provide/support clk_get_parent(), so add a simple implementation of that function so that callers of it will build without errors.
Fixes these build errors:
mips-linux-ld: drivers/iio/adc/ingenic-adc.o: in function `jz4770_adc_init_clk_div':
ingenic-adc.c:(.text+0xe4): undefined reference to `clk_get_parent'
mips-linux-ld: drivers/iio/adc/ingenic-adc.o: in function `jz4725b_adc_init_clk_div':
ingenic-adc.c:(.text+0x1b8): undefined reference to `clk_get_parent'
--- arch/mips/bcm63xx/clk.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/mips/bcm63xx/clk.c +6 -0
@@ -381,6 +381,12 @@ void clk_disable(struct clk *clk)EXPORT_SYMBOL (clk_disable); +struct clk *clk_get_parent (struct clk *clk) +{ +return NULL ; +} +EXPORT_SYMBOL (clk_get_parent); +unsigned long clk_get_rate (struct clk *clk) {if (!clk)
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 90/154 mips: lantiq: add support for clk_get_parent()
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit fc1aabb088860d6cf9dd03612b7a6f0de91ccac2 ]
Provide a simple implementation of clk_get_parent() in the lantiq subarch so that callers of it will build without errors.
Fixes this build error:
ERROR: modpost: "clk_get_parent" [drivers/iio/adc/ingenic-adc.ko] undefined!
--- arch/mips/lantiq/clk.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/mips/lantiq/clk.c +6 -0
@@ -158,6 +158,12 @@ void clk_deactivate(struct clk *clk) }EXPORT_SYMBOL (clk_deactivate); +struct clk *clk_get_parent (struct clk *clk) +{ +return NULL ; +} +EXPORT_SYMBOL (clk_get_parent); +static inline u32 get_counter_resolution (void ) {u32 res;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 91/154 platform/x86: hp_accel: Fix an error handling path in lis3lv02d_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit c961a7d2aa23ae19e0099fbcdf1040fb760eea83 ]
If 'led_classdev_register()' fails, some additional resources should be released.
Add the missing 'i8042_remove_filter()' and 'lis3lv02d_remove_fs()' calls that are already in the remove function but are missing here.
--- drivers/platform/x86/hp_accel.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/platform/x86/hp_accel.c +2 -0
@@ -372,9 +372,11 @@ static int lis3lv02d_add(struct acpi_device *device)INIT_WORK (&hpled_led.work, delayed_set_status_worker); ret =led_classdev_register (NULL , &hpled_led.led_classdev);if (ret) { +i8042_remove_filter (hp_accel_i8042_filter);lis3lv02d_joystick_disable (&lis3_dev);lis3lv02d_poweroff (&lis3_dev);flush_work (&hpled_led.work); +lis3lv02d_remove_fs (&lis3_dev);return ret; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 92/154 net/mlx5e: nullify cq->dbg pointer in mlx5_debug_cq_remove()
In reply to Greg Kroah-HartmanFrom: Valentine Fatiev <[email protected]>
[ Upstream commit 76ded29d3fcda4928da8849ffc446ea46871c1c2 ]
Prior to this patch in case mlx5_core_destroy_cq() failed it proceeds to rest of destroy operations. mlx5_core_destroy_cq() could be called again by user and cause additional call of mlx5_debug_cq_remove(). cq->dbg was not nullify in previous call and cause the crash.
Fix it by nullify cq->dbg pointer after removal.
Also proceed to destroy operations only if FW return 0 for MLX5_CMD_OP_DESTROY_CQ command.
general protection fault, probably for non-canonical address 0x2000300004058: 0000 [#1] SMP PTI CPU: 5 PID: 1228 Comm: python Not tainted 5.15.0-rc5_for_upstream_min_debug_2021_10_14_11_06 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:lockref_get+0x1/0x60 Code: 5d e9 53 ff ff ff 48 8d 7f 70 e8 0a 2e 48 00 c7 85 d0 00 00 00 02 00 00 00 c6 45 70 00 fb 5d c3 c3 cc cc cc cc cc cc cc cc 53 <48> 8b 17 48 89 fb 85 d2 75 3d 48 89 d0 bf 64 00 00 00 48 89 c1 48 RSP: 0018:ffff888137dd7a38 EFLAGS: 00010206 RAX: 0000000000000000 RBX: ffff888107d5f458 RCX: 00000000fffffffe RDX: 000000000002c2b0 RSI: ffffffff8155e2e0 RDI: 0002000300004058 RBP: ffff888137dd7a88 R08: 0002000300004058 R09: ffff8881144a9f88 R10: 0000000000000000 R11: 0000000000000000 R12: ffff8881141d4000 R13: ffff888137dd7c68 R14: ffff888137dd7d58 R15: ffff888137dd7cc0 FS: 00007f4644f2a4c0(0000) GS:ffff8887a2d40000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000055b4500f4380 CR3: 0000000114f7a003 CR4: 0000000000170ea0 Call Trace: simple_recursive_removal+0x33/0x2e0 ? debugfs_remove+0x60/0x60 debugfs_remove+0x40/0x60 mlx5_debug_cq_remove+0x32/0x70 [mlx5_core] mlx5_core_destroy_cq+0x41/0x1d0 [mlx5_core] devx_obj_cleanup+0x151/0x330 [mlx5_ib] ? __pollwait+0xd0/0xd0 ? xas_load+0x5/0x70 ? xa_load+0x62/0xa0 destroy_hw_idr_uobject+0x20/0x80 [ib_uverbs] uverbs_destroy_uobject+0x3b/0x360 [ib_uverbs] uobj_destroy+0x54/0xa0 [ib_uverbs] ib_uverbs_cmd_verbs+0xaf2/0x1160 [ib_uverbs] ? uverbs_finalize_object+0xd0/0xd0 [ib_uverbs] ib_uverbs_ioctl+0xc4/0x1b0 [ib_uverbs] __x64_sys_ioctl+0x3e4/0x8e0
--- drivers/net/ethernet/mellanox/mlx5/core/cq.c | 5 +++-- drivers/net/ethernet/mellanox/mlx5/core/debugfs.c | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/cq.c +3 -2
@@ -163,13 +163,14 @@ int mlx5_core_destroy_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq)MLX5_SET (destroy_cq_in, in, cqn, cq->cqn);MLX5_SET (destroy_cq_in, in, uid, cq->uid); err =mlx5_cmd_exec_in (dev, destroy_cq, in); +if (err) +return err;synchronize_irq (cq->irqn); -mlx5_cq_put (cq);wait_for_completion (&cq->free); -return err; +return 0 ; }EXPORT_SYMBOL (mlx5_core_destroy_cq);
drivers/net/ethernet/mellanox/mlx5/core/debugfs.c +3 -1
@@ -507,6 +507,8 @@ void mlx5_debug_cq_remove(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq)if (!mlx5_debugfs_root)return ; -if (cq->dbg) +if (cq->dbg) {rem_res_tree (cq->dbg); + cq->dbg =NULL ; + } }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 93/154 net/mlx5: Lag, update tracker when state change event received
In reply to Greg Kroah-HartmanFrom: Maher Sanalla <[email protected]>
[ Upstream commit ae396d85c01c7bdc9eeceecde1f493d03f793465 ]
Currently, In NETDEV_CHANGELOWERSTATE/NETDEV_CHANGEUPPERSTATE events handling, tracking is not fully completed if the LAG device is not ready at the time the events occur. But, we must keep track of the upper and lower states after receiving the events because RoCE needs this info in mlx5_lag_get_roce_netdev() - in order to return the corresponding port that its running on. Returning the wrong (not most recent) port will lead to gids table being incorrect.
For example: If during the attachment of a slave to the bond, the other non-attached port performs pci_reload, then the LAG device is not ready, but that should not result in dismissing attached slave tracker update automatically (which is performed in mlx5_handle_changelowerstate()), Since these events might not come later, which can lead to both bond ports having tx_enabled=0 - which is not a valid state of LAG bond.
--- drivers/net/ethernet/mellanox/mlx5/core/lag.c | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/lag.c +13 -15
@@ -365,6 +365,7 @@ static int mlx5_handle_changeupper_event(struct mlx5_lag *ldev,bool is_bonded, is_in_lag, mode_supported;int bond_status =0 ;int num_slaves =0 ; +int changed =0 ;int idx;if (!netif_is_lag_master (upper))
@@ -401,27 +402,27 @@ static int mlx5_handle_changeupper_event(struct mlx5_lag *ldev,*/ is_in_lag = num_slaves ==MLX5_MAX_PORTS && bond_status ==0x3 ; -if (!mlx5_lag_is_ready (ldev) && is_in_lag) { -NL_SET_ERR_MSG_MOD (info->info.extack, -"Can't activate LAG offload, PF is configured with more than 64 VFs" ); -return 0 ; - } -/* Lag mode must be activebackup or hash. */ mode_supported = tracker->tx_type ==NETDEV_LAG_TX_TYPE_ACTIVEBACKUP || tracker->tx_type ==NETDEV_LAG_TX_TYPE_HASH ; -if (is_in_lag && !mode_supported) -NL_SET_ERR_MSG_MOD (info->info.extack, -"Can't activate LAG offload, TX type isn't supported" ); - is_bonded = is_in_lag && mode_supported;if (tracker->is_bonded != is_bonded) { tracker->is_bonded = is_bonded; -return 1 ; + changed =1 ; } -return 0 ; +if (!is_in_lag) +return changed; + +if (!mlx5_lag_is_ready (ldev)) +NL_SET_ERR_MSG_MOD (info->info.extack, +"Can't activate LAG offload, PF is configured with more than 64 VFs" ); +else if (!mode_supported) +NL_SET_ERR_MSG_MOD (info->info.extack, +"Can't activate LAG offload, TX type isn't supported" ); + +return changed; } static int mlx5_handle_changelowerstate_event(struct mlx5_lag *ldev,
@@ -464,9 +465,6 @@ static int mlx5_lag_netdev_event(struct notifier_block *this, ldev = container_of(this, struct mlx5_lag, nb); -if (!mlx5_lag_is_ready (ldev) && event ==NETDEV_CHANGELOWERSTATE ) -return NOTIFY_DONE ; - tracker = ldev->tracker;switch (event) {
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 94/154 net/mlx5: E-Switch, Change mode lock from mutex to rw semaphore
In reply to Greg Kroah-HartmanFrom: Roi Dayan <[email protected]>
[ Upstream commit c55479d0cb6a28029844d0e90730704a0fb5efd3 ]
E-Switch mode change routine will take the write lock to prevent any consumer to access the E-Switch resources while E-Switch is going through a mode change.
In the next patch
E-Switch consumers (e.g vport representors) will take read_lock prior to accessing E-Switch resources to prevent E-Switch mode changing in the middle of the operation.
--- .../net/ethernet/mellanox/mlx5/core/eswitch.c | 11 ++++---- .../net/ethernet/mellanox/mlx5/core/eswitch.h | 2 +- .../mellanox/mlx5/core/eswitch_offloads.c | 26 +++++++++---------- 3 files changed, 19 insertions(+), 20 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +5 -6
@@ -1663,7 +1663,7 @@ int mlx5_eswitch_enable(struct mlx5_eswitch *esw, int num_vfs)if (!ESW_ALLOWED (esw))return 0 ; -mutex_lock (&esw->mode_lock); +down_write (&esw->mode_lock);if (esw->mode ==MLX5_ESWITCH_NONE ) { ret =mlx5_eswitch_enable_locked (esw,MLX5_ESWITCH_LEGACY , num_vfs); }else {
@@ -1675,7 +1675,7 @@ int mlx5_eswitch_enable(struct mlx5_eswitch *esw, int num_vfs)if (!ret) esw->esw_funcs.num_vfs = num_vfs; } -mutex_unlock (&esw->mode_lock); +up_write (&esw->mode_lock);return ret; }
@@ -1719,10 +1719,10 @@ void mlx5_eswitch_disable(struct mlx5_eswitch *esw, bool clear_vf)if (!ESW_ALLOWED (esw))return ; -mutex_lock (&esw->mode_lock); +down_write (&esw->mode_lock);mlx5_eswitch_disable_locked (esw, clear_vf); esw->esw_funcs.num_vfs =0 ; -mutex_unlock (&esw->mode_lock); +up_write (&esw->mode_lock); }int mlx5_eswitch_init (struct mlx5_core_dev *dev)
@@ -1778,7 +1778,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)atomic64_set (&esw->offloads.num_flows,0 );ida_init (&esw->offloads.vport_metadata_ida);mutex_init (&esw->state_lock); -mutex_init (&esw->mode_lock); +init_rwsem (&esw->mode_lock); mlx5_esw_for_all_vports(esw, i, vport) { vport->vport =mlx5_eswitch_index_to_vport_num (esw, i);
@@ -1813,7 +1813,6 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw) esw->dev->priv.eswitch =NULL ;destroy_workqueue (esw->work_queue);esw_offloads_cleanup_reps (esw); -mutex_destroy (&esw->mode_lock);mutex_destroy (&esw->state_lock);ida_destroy (&esw->offloads.vport_metadata_ida);mlx5e_mod_hdr_tbl_destroy (&esw->offloads.mod_hdr);
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +1 -1
@@ -262,7 +262,7 @@ struct mlx5_eswitch {/* Protects eswitch mode change that occurs via one or more * user commands, i.e. sriov state change, devlink commands. */ -struct mutex mode_lock; +struct rw_semaphore mode_lock;struct {bool enabled;
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +13 -13
@@ -2508,7 +2508,7 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,if (esw_mode_from_devlink (mode, &mlx5_mode))return -EINVAL ; -mutex_lock (&esw->mode_lock); +down_write (&esw->mode_lock); cur_mlx5_mode = esw->mode;if (cur_mlx5_mode == mlx5_mode) goto unlock;
@@ -2521,7 +2521,7 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode, err = -EINVAL ; unlock: -mutex_unlock (&esw->mode_lock); +up_write (&esw->mode_lock);return err; }
@@ -2534,14 +2534,14 @@ int mlx5_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode)if (IS_ERR (esw))return PTR_ERR (esw); -mutex_lock (&esw->mode_lock); +down_write (&esw->mode_lock); err =eswitch_devlink_esw_mode_check (esw);if (err) goto unlock; err =esw_mode_to_devlink (esw->mode, mode); unlock: -mutex_unlock (&esw->mode_lock); +up_write (&esw->mode_lock);return err; }
@@ -2557,7 +2557,7 @@ int mlx5_devlink_eswitch_inline_mode_set(struct devlink *devlink, u8 mode,if (IS_ERR (esw))return PTR_ERR (esw); -mutex_lock (&esw->mode_lock); +down_write (&esw->mode_lock); err =eswitch_devlink_esw_mode_check (esw);if (err) goto out;
@@ -2599,7 +2599,7 @@ int mlx5_devlink_eswitch_inline_mode_set(struct devlink *devlink, u8 mode, } esw->offloads.inline_mode = mlx5_mode; -mutex_unlock (&esw->mode_lock); +up_write (&esw->mode_lock);return 0 ; revert_inline_mode:
@@ -2609,7 +2609,7 @@ revert_inline_mode: vport, esw->offloads.inline_mode); out: -mutex_unlock (&esw->mode_lock); +up_write (&esw->mode_lock);return err; }
@@ -2622,14 +2622,14 @@ int mlx5_devlink_eswitch_inline_mode_get(struct devlink *devlink, u8 *mode)if (IS_ERR (esw))return PTR_ERR (esw); -mutex_lock (&esw->mode_lock); +down_write (&esw->mode_lock); err =eswitch_devlink_esw_mode_check (esw);if (err) goto unlock; err =esw_inline_mode_to_devlink (esw->offloads.inline_mode, mode); unlock: -mutex_unlock (&esw->mode_lock); +up_write (&esw->mode_lock);return err; }
@@ -2645,7 +2645,7 @@ int mlx5_devlink_eswitch_encap_mode_set(struct devlink *devlink,if (IS_ERR (esw))return PTR_ERR (esw); -mutex_lock (&esw->mode_lock); +down_write (&esw->mode_lock); err =eswitch_devlink_esw_mode_check (esw);if (err) goto unlock;
@@ -2691,7 +2691,7 @@ int mlx5_devlink_eswitch_encap_mode_set(struct devlink *devlink, } unlock: -mutex_unlock (&esw->mode_lock); +up_write (&esw->mode_lock);return err; }
@@ -2706,14 +2706,14 @@ int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink,return PTR_ERR (esw); -mutex_lock (&esw->mode_lock); +down_write (&esw->mode_lock); err =eswitch_devlink_esw_mode_check (esw);if (err) goto unlock; *encap = esw->offloads.encap; unlock: -mutex_unlock (&esw->mode_lock); +up_write (&esw->mode_lock);return 0 ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 95/154 net/mlx5: E-Switch, return error if encap isnt supported
In reply to Greg Kroah-HartmanFrom: Raed Salem <[email protected]>
[ Upstream commit c4c3176739dfa6efcc5b1d1de4b3fd2b51b048c7 ]
On regular ConnectX HCAs getting encap mode isn't supported when the E-Switch is in NONE mode. Current code would return no error code when trying to get encap mode in such case which is wrong.
Fix by returning error value to indicate failure to caller in such case.
--- drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +1 -1
@@ -2714,7 +2714,7 @@ int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink, *encap = esw->offloads.encap; unlock:up_write (&esw->mode_lock); -return 0 ; +return err; } static bool
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 96/154 scsi: core: sysfs: Fix hang when device state is set via sysfs
In reply to Greg Kroah-HartmanFrom: Mike Christie <[email protected]>
[ Upstream commit 4edd8cd4e86dd3047e5294bbefcc0a08f66a430f ]
This fixes a regression added with:
commit f0f82e2476f6 ("scsi: core: Fix capacity set to zero after offlinining device")
The problem is that after iSCSI recovery, iscsid will call into the kernel to set the dev's state to running, and with that patch we now call scsi_rescan_device() with the state_mutex held. If the SCSI error handler thread is just starting to test the device in scsi_send_eh_cmnd() then it's going to try to grab the state_mutex.
We are then stuck, because when scsi_rescan_device() tries to send its I/O scsi_queue_rq() calls -> scsi_host_queue_ready() -> scsi_host_in_recovery() which will return true (the host state is still in recovery) and I/O will just be requeued. scsi_send_eh_cmnd() will then never be able to grab the state_mutex to finish error handling.
To prevent the deadlock move the rescan-related code to after we drop the state_mutex.
This also adds a check for if we are already in the running state. This prevents extra scans and helps the iscsid case where if the transport class has already onlined the device during its recovery process then we don't need userspace to do it again plus possibly block that daemon.
--- drivers/scsi/scsi_sysfs.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-)
drivers/scsi/scsi_sysfs.c +19 -11
@@ -796,6 +796,7 @@ store_state_field(struct device *dev, struct device_attribute *attr,int i, ret;struct scsi_device *sdev =to_scsi_device (dev);enum scsi_device_state state =0 ; +bool rescan_dev = false;for (i =0 ; i <ARRAY_SIZE (sdev_states); i++) {const int len =strlen (sdev_states[i].name);
@@ -814,20 +815,27 @@ store_state_field(struct device *dev, struct device_attribute *attr, }mutex_lock (&sdev->state_mutex); - ret =scsi_device_set_state (sdev, state); -/* -* If the device state changes to SDEV_RUNNING, we need to -* run the queue to avoid I/O hang, and rescan the device -* to revalidate it. Running the queue first is necessary -* because another thread may be waiting inside -* blk_mq_freeze_queue_wait() and because that call may be -* waiting for pending I/O to finish. -*/ -if (ret ==0 && state ==SDEV_RUNNING ) { +if (sdev->sdev_state ==SDEV_RUNNING && state ==SDEV_RUNNING ) { + ret = count; + }else { + ret =scsi_device_set_state (sdev, state); +if (ret ==0 && state ==SDEV_RUNNING ) + rescan_dev = true; + } +mutex_unlock (&sdev->state_mutex); + +if (rescan_dev) { +/* +* If the device state changes to SDEV_RUNNING, we need to +* run the queue to avoid I/O hang, and rescan the device +* to revalidate it. Running the queue first is necessary +* because another thread may be waiting inside +* blk_mq_freeze_queue_wait() and because that call may be +* waiting for pending I/O to finish. +*/ blk_mq_run_hw_queues (sdev->request_queue, true);scsi_rescan_device (dev); } -mutex_unlock (&sdev->state_mutex);return ret ==0 ? count : -EINVAL ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 97/154 net: sched: act_mirred: drop dst for the direction from egress to ingress
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit f799ada6bf2397c351220088b9b0980125c77280 ]
Without dropping dst, the packets sent from local mirred/redirected to ingress will may still use the old dst. ip_rcv() will drop it as the old dst is for output and its .input is dst_discard.
This patch is to fix by also dropping dst for those packets that are mirred or redirected from egress to ingress in act_mirred.
Note that we don't drop it for the direction change from ingress to egress, as on which there might be a user case attaching a metadata dst by act_tunnel_key that would be used later.
--- net/sched/act_mirred.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
net/sched/act_mirred.c +8 -3
@@ -19,6 +19,7 @@#include <linux/if_arp.h> #include <net/net_namespace.h> #include <net/netlink.h> +#include <net/dst.h> #include <net/pkt_sched.h> #include <net/pkt_cls.h> #include <linux/tc_act/tc_mirred.h>
@@ -218,6 +219,7 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a,bool want_ingress;bool is_redirect;bool expects_nh; +bool at_ingress;int m_eaction;int mac_len;bool at_nh;
@@ -253,7 +255,8 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a,* ingress - that covers the TC S/W datapath. */ is_redirect =tcf_mirred_is_act_redirect (m_eaction); - use_reinsert =skb_at_tc_ingress (skb) && is_redirect && + at_ingress =skb_at_tc_ingress (skb); + use_reinsert = at_ingress && is_redirect &&tcf_mirred_can_reinsert (retval);if (!use_reinsert) { skb2 =skb_clone (skb,GFP_ATOMIC );
@@ -261,10 +264,12 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a, goto out; } + want_ingress =tcf_mirred_act_wants_ingress (m_eaction); +/* All mirred/redirected skbs should clear previous ct info */ nf_reset_ct (skb2); - - want_ingress =tcf_mirred_act_wants_ingress (m_eaction); +if (want_ingress && !at_ingress)/* drop dst for egress -> ingress */ +skb_dst_drop (skb2); expects_nh = want_ingress || !m_mac_header_xmit; at_nh = skb->data ==skb_network_header (skb);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 98/154 net: dpaa2-eth: fix use-after-free in dpaa2_eth_remove
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
[ Upstream commit 9b5a333272a48c2f8b30add7a874e46e8b26129c ]
Access to netdev after free_netdev() will cause use-after-free bug. Move debug log before free_netdev() call to avoid it.
--- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +2 -2
@@ -4432,10 +4432,10 @@ static int dpaa2_eth_remove(struct fsl_mc_device *ls_dev)fsl_mc_portal_free (priv->mc_io); -free_netdev (net_dev); -dev_dbg (net_dev->dev.parent,"Removed interface %s\n" , net_dev->name); +free_netdev (net_dev); +return 0 ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 99/154 net: virtio_net_hdr_to_skb: count transport header in UFO
In reply to Greg Kroah-HartmanFrom: Jonathan Davies <[email protected]>
[ Upstream commit cf9acc90c80ecbee00334aa85d92f4e74014bcff ]
virtio_net_hdr_to_skb does not set the skb's gso_size and gso_type correctly for UFO packets received via virtio-net that are a little over the GSO size. This can lead to problems elsewhere in the networking stack, e.g. ovs_vport_send dropping over-sized packets if gso_size is not set.
This is due to the comparison
if (skb->len - p_off > gso_size)
not properly accounting for the transport layer header.
p_off includes the size of the transport layer header (thlen), so skb->len - p_off is the size of the TCP/UDP payload.
gso_size is read from the virtio-net header. For UFO, fragmentation happens at the IP level so does not need to include the UDP header.
Hence the calculation could be comparing a TCP/UDP payload length with an IP payload length, causing legitimate virtio-net packets to have lack gso_type/gso_size information.
Example: a UDP packet with payload size 1473 has IP payload size 1481. If the guest used UFO, it is not fragmented and the virtio-net header's flags indicate that it is a GSO frame (VIRTIO_NET_HDR_GSO_UDP), with gso_size = 1480 for an MTU of 1500. skb->len will be 1515 and p_off will be 42, so skb->len - p_off = 1473. Hence the comparison fails, and shinfo->gso_size and gso_type are not set as they should be.
Instead, add the UDP header length before comparing to gso_size when using UFO. In this way, it is the size of the IP payload that is compared to gso_size.
--- include/linux/virtio_net.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
include/linux/virtio_net.h +6 -1
@@ -120,10 +120,15 @@ retry:if (hdr->gso_type !=VIRTIO_NET_HDR_GSO_NONE ) {u16 gso_size =__virtio16_to_cpu (little_endian, hdr->gso_size); +unsigned int nh_off = p_off;struct skb_shared_info *shinfo =skb_shinfo (skb); +/* UFO may not include transport header in gso_size. */ +if (gso_type &SKB_GSO_UDP ) + nh_off -= thlen; +/* Too small packets are not really GSO ones. */ -if (skb->len - p_off > gso_size) { +if (skb->len - nh_off > gso_size) { shinfo->gso_size = gso_size; shinfo->gso_type = gso_type;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 100/154 i40e: Fix correct max_pkt_size on VF RX queue
In reply to Greg Kroah-HartmanFrom: Eryk Rybak <[email protected]>
[ Upstream commit 6afbd7b3c53cb7417189f476e99d431daccb85b0 ]
Setting VLAN port increasing RX queue max_pkt_size by 4 bytes to take VLAN tag into account. Trigger the VF reset when setting port VLAN for VF to renegotiate its capabilities and reinitialize.
--- .../ethernet/intel/i40e/i40e_virtchnl_pf.c | 53 ++++--------------- 1 file changed, 9 insertions(+), 44 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +9 -44
@@ -621,14 +621,13 @@ static int i40e_config_vsi_rx_queue(struct i40e_vf *vf, u16 vsi_id,u16 vsi_queue_id, struct virtchnl_rxq_info *info) { + u16 pf_queue_id = i40e_vc_get_pf_queue_id(vf, vsi_id, vsi_queue_id);struct i40e_pf *pf = vf->pf; +struct i40e_vsi *vsi = pf->vsi[vf->lan_vsi_idx];struct i40e_hw *hw = &pf->hw;struct i40e_hmc_obj_rxq rx_ctx; -u16 pf_queue_id;int ret =0 ; - pf_queue_id =i40e_vc_get_pf_queue_id (vf, vsi_id, vsi_queue_id); -/* clear the context structure first */ memset (&rx_ctx,0 ,sizeof (struct i40e_hmc_obj_rxq ));
@@ -666,6 +665,10 @@ static int i40e_config_vsi_rx_queue(struct i40e_vf *vf, u16 vsi_id, } rx_ctx.rxmax = info->max_pkt_size; +/* if port VLAN is configured increase the max packet size */ +if (vsi->info.pvid) + rx_ctx.rxmax +=VLAN_HLEN ; +/* enable 32bytes desc always */ rx_ctx.dsize =1 ;
@@ -4133,34 +4136,6 @@ error_param:return ret; } -/** -* i40e_vsi_has_vlans - True if VSI has configured VLANs -* @vsi: pointer to the vsi -* -* Check if a VSI has configured any VLANs. False if we have a port VLAN or if -* we have no configured VLANs. Do not call while holding the -* mac_filter_hash_lock. -*/ -static bool i40e_vsi_has_vlans (struct i40e_vsi *vsi) -{ -bool have_vlans; - -/* If we have a port VLAN, then the VSI cannot have any VLANs -* configured, as all MAC/VLAN filters will be assigned to the PVID. -*/ -if (vsi->info.pvid) -return false; - -/* Since we don't have a PVID, we know that if the device is in VLAN -* mode it must be because of a VLAN filter configured on this VSI. -*/ -spin_lock_bh (&vsi->mac_filter_hash_lock); - have_vlans =i40e_is_vsi_in_vlan (vsi); -spin_unlock_bh (&vsi->mac_filter_hash_lock); - -return have_vlans; -} -/** * i40e_ndo_set_vf_port_vlan * @netdev: network interface device structure
@@ -4217,19 +4192,9 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id,/* duplicate request, so just return success */ goto error_pvid; -if (i40e_vsi_has_vlans (vsi)) { -dev_err (&pf->pdev->dev, -"VF %d has already configured VLAN filters and the administrator is requesting a port VLAN override.\nPlease unload and reload the VF driver for this change to take effect.\n" , - vf_id); -/* Administrator Error - knock the VF offline until he does -* the right thing by reconfiguring his network correctly -* and then reloading the VF driver. -*/ -i40e_vc_disable_vf (vf); -/* During reset the VF got a new VSI, so refresh the pointer. */ - vsi = pf->vsi[vf->lan_vsi_idx]; - } - +i40e_vc_disable_vf (vf); +/* During reset the VF got a new VSI, so refresh a pointer. */ + vsi = pf->vsi[vf->lan_vsi_idx];/* Locked once because multiple functions below iterate list */ spin_lock_bh (&vsi->mac_filter_hash_lock);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 101/154 i40e: Fix NULL ptr dereference on VSI filter sync
In reply to Greg Kroah-HartmanFrom: Michal Maloszewski <[email protected]>
[ Upstream commit 37d9e304acd903a445df8208b8a13d707902dea6 ]
Remove the reason of null pointer dereference in sync VSI filters. Added new I40E_VSI_RELEASING flag to signalize deleting and releasing of VSI resources to sync this thread with sync filters subtask. Without this patch it is possible to start update the VSI filter list after VSI is removed, that's causing a kernel oops.
--- drivers/net/ethernet/intel/i40e/i40e.h | 1 + drivers/net/ethernet/intel/i40e/i40e_main.c | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e.h +1 -0
@@ -159,6 +159,7 @@ enum i40e_vsi_state_t { __I40E_VSI_OVERFLOW_PROMISC, __I40E_VSI_REINIT_REQUESTED, __I40E_VSI_DOWN_REQUESTED, + __I40E_VSI_RELEASING,/* This must be last as it determines the size of the BITMAP */ __I40E_VSI_STATE_SIZE__, };
drivers/net/ethernet/intel/i40e/i40e_main.c +3 -2
@@ -2622,7 +2622,8 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf)for (v =0 ; v < pf->num_alloc_vsi; v++) {if (pf->vsi[v] && - (pf->vsi[v]->flags &I40E_VSI_FLAG_FILTER_CHANGED )) { + (pf->vsi[v]->flags &I40E_VSI_FLAG_FILTER_CHANGED ) && + !test_bit (__I40E_VSI_RELEASING, pf->vsi[v]->state)) {int ret =i40e_sync_vsi_filters (pf->vsi[v]);if (ret) {
@@ -13308,7 +13309,7 @@ int i40e_vsi_release(struct i40e_vsi *vsi)dev_info (&pf->pdev->dev,"Can't remove PF VSI\n" );return -ENODEV ; } - +set_bit (__I40E_VSI_RELEASING, vsi->state); uplink_seid = vsi->uplink_seid;if (vsi->type !=I40E_VSI_SRIOV ) {if (vsi->netdev_registered) {
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 102/154 i40e: Fix changing previously set num_queue_pairs for PFs
In reply to Greg Kroah-HartmanFrom: Eryk Rybak <[email protected]>
[ Upstream commit d2a69fefd75683004ffe87166de5635b3267ee07 ]
Currently, the i40e_vsi_setup_queue_map is basing the count of queues in TCs on a VSI's alloc_queue_pairs member which is not changed throughout any user's action (for example via ethtool's set_channels callback).
This implies that vsi->tc_config.tc_info[n].qcount value that is given to the kernel via netdev_set_tc_queue() that notifies about the count of queues per particular traffic class is constant even if user has changed the total count of queues.
This in turn caused the kernel warning after setting the queue count to the lower value than the initial one:
$ ethtool -l ens801f0 Channel parameters for ens801f0: Pre-set maximums: RX: 0 TX: 0 Other: 1 Combined: 64 Current hardware settings: RX: 0 TX: 0 Other: 1 Combined: 64
$ ethtool -L ens801f0 combined 40
[dmesg]
Number of in use tx queues changed invalidating tc mappings. Priority traffic classification disabled!
Reason was that vsi->alloc_queue_pairs stayed at 64 value which was used to set the qcount on TC0 (by default only TC0 exists so all of the existing queues are assigned to TC0). we update the offset/qcount via netdev_set_tc_queue() back to the old value but then the netif_set_real_num_tx_queues() is using the vsi->num_queue_pairs as a value which got set to 40.
Fix it by using vsi->req_queue_pairs as a queue count that will be distributed across TCs. Do it only for non-zero values, which implies that user actually requested the new count of queues.
For VSIs other than main, stay with the vsi->alloc_queue_pairs as we only allow manipulating the queue count on main VSI.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 35 ++++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +23 -12
@@ -1789,6 +1789,7 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi, bool is_add) {struct i40e_pf *pf = vsi->back; +u16 num_tc_qps =0 ;u16 sections =0 ;u8 netdev_tc =0 ;u16 numtc =1 ;
@@ -1796,13 +1797,29 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,u8 offset;u16 qmap;int i; -u16 num_tc_qps =0 ; sections =I40E_AQ_VSI_PROP_QUEUE_MAP_VALID ; offset =0 ; +if (vsi->type ==I40E_VSI_MAIN ) { +/* This code helps add more queue to the VSI if we have +* more cores than RSS can support, the higher cores will +* be served by ATR or other filters. Furthermore, the +* non-zero req_queue_pairs says that user requested a new +* queue count via ethtool's set_channels, so use this +* value for queues distribution across traffic classes +*/ +if (vsi->req_queue_pairs >0 ) + vsi->num_queue_pairs = vsi->req_queue_pairs; +else if (pf->flags &I40E_FLAG_MSIX_ENABLED ) + vsi->num_queue_pairs = pf->num_lan_msix; + } +/* Number of queues per enabled TC */ - num_tc_qps = vsi->alloc_queue_pairs; +if (vsi->type ==I40E_VSI_MAIN ) + num_tc_qps = vsi->num_queue_pairs; +else + num_tc_qps = vsi->alloc_queue_pairs;if (enabled_tc && (vsi->back->flags &I40E_FLAG_DCB_ENABLED )) {/* Find numtc from enabled TC bitmap */ for (i =0 , numtc =0 ; i <I40E_MAX_TRAFFIC_CLASS ; i++) {
@@ -1880,16 +1897,10 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi, } ctxt->info.tc_mapping[i] =cpu_to_le16 (qmap); } - -/* Set actual Tx/Rx queue pairs */ - vsi->num_queue_pairs = offset; -if ((vsi->type ==I40E_VSI_MAIN ) && (numtc ==1 )) { -if (vsi->req_queue_pairs >0 ) - vsi->num_queue_pairs = vsi->req_queue_pairs; -else if (pf->flags &I40E_FLAG_MSIX_ENABLED ) - vsi->num_queue_pairs = pf->num_lan_msix; - } - +/* Do not change previously set num_queue_pairs for PFs */ +if ((vsi->type ==I40E_VSI_MAIN && numtc !=1 ) || + vsi->type !=I40E_VSI_MAIN ) + vsi->num_queue_pairs = offset;/* Scheduler section valid can only be set for ADD VSI */ if (is_add) { sections |=I40E_AQ_VSI_PROP_SCHED_VALID ;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 103/154 i40e: Fix ping is lost after configuring ADq on VF
In reply to Greg Kroah-HartmanFrom: Eryk Rybak <[email protected]>
[ Upstream commit 9e0a603cb7dce2a19d98116d42de84b6db26d716 ]
Properly reconfigure VF VSIs after VF request ADQ.
Created new function to update queue mapping and queue pairs per TC with AQ update VSI. This sets proper RSS size on NIC.
VFs num_queue_pairs should not be changed during setup of queue maps. Previously, VF main VSI in ADQ had configured too many queues and had wrong RSS size, which lead to packets not being consumed and drops in connectivity.
--- drivers/net/ethernet/intel/i40e/i40e.h | 1 + drivers/net/ethernet/intel/i40e/i40e_main.c | 64 ++++++++++++++++++- .../ethernet/intel/i40e/i40e_virtchnl_pf.c | 17 +++-- 3 files changed, 74 insertions(+), 8 deletions(-)
drivers/net/ethernet/intel/i40e/i40e.h +1 -0
@@ -1145,6 +1145,7 @@ void i40e_ptp_save_hw_time(struct i40e_pf *pf);void i40e_ptp_restore_hw_time (struct i40e_pf *pf);void i40e_ptp_init (struct i40e_pf *pf);void i40e_ptp_stop (struct i40e_pf *pf); +int i40e_update_adq_vsi_queues (struct i40e_vsi *vsi,int vsi_offset);int i40e_is_vsi_uplink_mode_veb (struct i40e_vsi *vsi);i40e_status i40e_get_partition_bw_setting (struct i40e_pf *pf);i40e_status i40e_set_partition_bw_setting (struct i40e_pf *pf);
drivers/net/ethernet/intel/i40e/i40e_main.c +61 -3
93 lines not on this page · raw message
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +12 -5
@@ -2166,11 +2166,12 @@ static int i40e_vc_config_queues_msg(struct i40e_vf *vf, u8 *msg)struct virtchnl_vsi_queue_config_info *qci = (struct virtchnl_vsi_queue_config_info *)msg;struct virtchnl_queue_pair_info *qpi; -struct i40e_pf *pf = vf->pf;u16 vsi_id, vsi_queue_id =0 ; -u16 num_qps_all =0 ; +struct i40e_pf *pf = vf->pf;i40e_status aq_ret =0 ;int i, j =0 , idx =0 ; +struct i40e_vsi *vsi; +u16 num_qps_all =0 ;if (!test_bit (I40E_VF_STATE_ACTIVE , &vf->vf_states)) { aq_ret =I40E_ERR_PARAM ;
@@ -2259,9 +2260,15 @@ static int i40e_vc_config_queues_msg(struct i40e_vf *vf, u8 *msg) pf->vsi[vf->lan_vsi_idx]->num_queue_pairs = qci->num_queue_pairs; }else { -for (i =0 ; i < vf->num_tc; i++) - pf->vsi[vf->ch[i].vsi_idx]->num_queue_pairs = - vf->ch[i].num_qps; +for (i =0 ; i < vf->num_tc; i++) { + vsi = pf->vsi[vf->ch[i].vsi_idx]; + vsi->num_queue_pairs = vf->ch[i].num_qps; + +if (i40e_update_adq_vsi_queues (vsi, i)) { + aq_ret =I40E_ERR_CONFIG ; + goto error_param; + } + } } error_param:
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 104/154 i40e: Fix warning message and call stack during rmmod i40e driver
In reply to Greg Kroah-HartmanFrom: Karen Sornek <[email protected]>
[ Upstream commit 3a3b311e3881172fc8e019b6508f04bc40c92d9d ]
Restore part of reset functionality used when reset is called from the VF to reset itself. Without this fix warning message is displayed when VF is being removed via sysfs.
Fix the crash of the VF during reset by ensuring that the PF receives the reset message successfully. Refactor code to use one function instead of two.
--- .../ethernet/intel/i40e/i40e_virtchnl_pf.c | 53 ++++++++----------- 1 file changed, 21 insertions(+), 32 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +21 -32
@@ -130,17 +130,18 @@ void i40e_vc_notify_vf_reset(struct i40e_vf *vf)/***********************misc routines*****************************/ /** -* i40e_vc_disable_vf +* i40e_vc_reset_vf * @vf: pointer to the VF info -* -* Disable the VF through a SW reset. +* @notify_vf: notify vf about reset or not +* Reset VF handler. **/ -static inline void i40e_vc_disable_vf (struct i40e_vf *vf) +static void i40e_vc_reset_vf (struct i40e_vf *vf,bool notify_vf) {struct i40e_pf *pf = vf->pf;int i; -i40e_vc_notify_vf_reset (vf); +if (notify_vf) +i40e_vc_notify_vf_reset (vf);/* We want to ensure that an actual reset occurs initiated after this * function was called. However, we do not want to wait forever, so
@@ -158,9 +159,14 @@ static inline void i40e_vc_disable_vf(struct i40e_vf *vf)usleep_range (10000 ,20000 ); } -dev_warn (&vf->pf->pdev->dev, -"Failed to initiate reset for VF %d after 200 milliseconds\n" , - vf->vf_id); +if (notify_vf) +dev_warn (&vf->pf->pdev->dev, +"Failed to initiate reset for VF %d after 200 milliseconds\n" , + vf->vf_id); +else +dev_dbg (&vf->pf->pdev->dev, +"Failed to initiate reset for VF %d after 200 milliseconds\n" , + vf->vf_id); }/**
@@ -2054,20 +2060,6 @@ err:return ret; } -/** -* i40e_vc_reset_vf_msg -* @vf: pointer to the VF info -* -* called from the VF to reset itself, -* unlike other virtchnl messages, PF driver -* doesn't send the response back to the VF -**/ -static void i40e_vc_reset_vf_msg (struct i40e_vf *vf) -{ -if (test_bit (I40E_VF_STATE_ACTIVE , &vf->vf_states)) -i40e_reset_vf (vf, false); -} -/** * i40e_vc_config_promiscuous_mode_msg * @vf: pointer to the VF info
@@ -2563,8 +2555,7 @@ static int i40e_vc_request_queues_msg(struct i40e_vf *vf, u8 *msg) }else {/* successful request */ vf->num_req_queues = req_pairs; -i40e_vc_notify_vf_reset (vf); -i40e_reset_vf (vf, false); +i40e_vc_reset_vf (vf, true);return 0 ; }
@@ -3777,8 +3768,7 @@ static int i40e_vc_add_qch_msg(struct i40e_vf *vf, u8 *msg) vf->num_req_queues =0 ;/* reset the VF in order to allocate resources */ -i40e_vc_notify_vf_reset (vf); -i40e_reset_vf (vf, false); +i40e_vc_reset_vf (vf, true);return I40E_SUCCESS ;
@@ -3818,8 +3808,7 @@ static int i40e_vc_del_qch_msg(struct i40e_vf *vf, u8 *msg) }/* reset the VF in order to allocate resources */ -i40e_vc_notify_vf_reset (vf); -i40e_reset_vf (vf, false); +i40e_vc_reset_vf (vf, true);return I40E_SUCCESS ;
@@ -3881,7 +3870,7 @@ int i40e_vc_process_vf_msg(struct i40e_pf *pf, s16 vf_id, u32 v_opcode,i40e_vc_notify_vf_link_state (vf);break ;case VIRTCHNL_OP_RESET_VF : -i40e_vc_reset_vf_msg (vf); +i40e_vc_reset_vf (vf, false); ret =0 ;break ;case VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE :
@@ -4135,7 +4124,7 @@ int i40e_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)/* Force the VF interface down so it has to bring up with new MAC * address */ -i40e_vc_disable_vf (vf); +i40e_vc_reset_vf (vf, true);dev_info (&pf->pdev->dev,"Bring down and up the VF interface to make this change effective.\n" ); error_param:
@@ -4199,7 +4188,7 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id,/* duplicate request, so just return success */ goto error_pvid; -i40e_vc_disable_vf (vf); +i40e_vc_reset_vf (vf, true);/* During reset the VF got a new VSI, so refresh a pointer. */ vsi = pf->vsi[vf->lan_vsi_idx];/* Locked once because multiple functions below iterate list */
@@ -4582,7 +4571,7 @@ int i40e_ndo_set_vf_trust(struct net_device *netdev, int vf_id, bool setting) goto out; vf->trusted = setting; -i40e_vc_disable_vf (vf); +i40e_vc_reset_vf (vf, true);dev_info (&pf->pdev->dev,"VF %u is now %strusted\n" , vf_id, setting ?"" :"un" );
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 105/154 i40e: Fix creation of first queue by omitting it if is not power of two
In reply to Greg Kroah-HartmanFrom: Jedrzej Jagielski <[email protected]>
[ Upstream commit 2e6d218c1ec6fb9cd70693b78134cbc35ae0b5a9 ]
Reject TCs creation with proper message if the first queue assignment is not equal to the power of two.
The first queue number was checked too late in the second queue iteration, if second queue was configured at all. Now if first queue value is not a power of two, then trying to create qdisc will be rejected.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 59 +++++++-------------- 1 file changed, 19 insertions(+), 40 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +19 -40
@@ -5753,24 +5753,6 @@ static void i40e_remove_queue_channels(struct i40e_vsi *vsi)INIT_LIST_HEAD (&vsi->ch_list); } -/** -* i40e_is_any_channel - channel exist or not -* @vsi: ptr to VSI to which channels are associated with -* -* Returns true or false if channel(s) exist for associated VSI or not -**/ -static bool i40e_is_any_channel (struct i40e_vsi *vsi) -{ -struct i40e_channel *ch, *ch_tmp; - -list_for_each_entry_safe (ch, ch_tmp, &vsi->ch_list, list) { -if (ch->initialized) -return true; - } - -return false; -} -/** * i40e_get_max_queues_for_channel * @vsi: ptr to VSI to which channels are associated with
@@ -6276,26 +6258,15 @@ int i40e_create_queue_channel(struct i40e_vsi *vsi,/* By default we are in VEPA mode, if this is the first VF/VMDq * VSI to be added switch to VEB mode. */ -if ((!(pf->flags &I40E_FLAG_VEB_MODE_ENABLED )) || - (!i40e_is_any_channel (vsi))) { -if (!is_power_of_2 (vsi->tc_config.tc_info[0 ].qcount)) { -dev_dbg (&pf->pdev->dev, -"Failed to create channel. Override queues (%u) not power of 2\n" , - vsi->tc_config.tc_info[0 ].qcount); -return -EINVAL ; - } -if (!(pf->flags &I40E_FLAG_VEB_MODE_ENABLED )) { - pf->flags |=I40E_FLAG_VEB_MODE_ENABLED ; +if (!(pf->flags &I40E_FLAG_VEB_MODE_ENABLED )) { + pf->flags |=I40E_FLAG_VEB_MODE_ENABLED ; -if (vsi->type ==I40E_VSI_MAIN ) { -if (pf->flags &I40E_FLAG_TC_MQPRIO ) -i40e_do_reset (pf,I40E_PF_RESET_FLAG , - true); -else -i40e_do_reset_safe (pf, -I40E_PF_RESET_FLAG ); - } +if (vsi->type ==I40E_VSI_MAIN ) { +if (pf->flags &I40E_FLAG_TC_MQPRIO ) +i40e_do_reset (pf,I40E_PF_RESET_FLAG , true); +else +i40e_do_reset_safe (pf,I40E_PF_RESET_FLAG ); }/* now onwards for main VSI, number of queues will be value * of TC0's queue count
@@ -7622,12 +7593,20 @@ config_tc: vsi->seid); need_reset = true; goto exit; - }else { -dev_info (&vsi->back->pdev->dev, -"Setup channel (id:%u) utilizing num_queues %d\n" , - vsi->seid, vsi->tc_config.tc_info[0 ].qcount); + }else if (enabled_tc && + (!is_power_of_2 (vsi->tc_config.tc_info[0 ].qcount))) { +netdev_info (netdev, +"Failed to create channel. Override queues (%u) not power of 2\n" , + vsi->tc_config.tc_info[0 ].qcount); + ret = -EINVAL ; + need_reset = true; + goto exit; } +dev_info (&vsi->back->pdev->dev, +"Setup channel (id:%u) utilizing num_queues %d\n" , + vsi->seid, vsi->tc_config.tc_info[0 ].qcount); +if (pf->flags &I40E_FLAG_TC_MQPRIO ) {if (vsi->mqprio_qopt.max_rate[0 ]) {u64 max_tx_rate = vsi->mqprio_qopt.max_rate[0 ];
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 106/154 i40e: Fix display error code in dmesg
In reply to Greg Kroah-HartmanFrom: Grzegorz Szczurek <[email protected]>
[ Upstream commit 5aff430d4e33a0b48a6b3d5beb06f79da23f9916 ]
Fix misleading display error in dmesg if tc filter return fail. Only i40e status error code should be converted to string, not linux error code. Otherwise, we return false information about the error.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +2 -3
@@ -8171,9 +8171,8 @@ static int i40e_configure_clsflower(struct i40e_vsi *vsi, err =i40e_add_del_cloud_filter (vsi, filter, true);if (err) { -dev_err (&pf->pdev->dev, -"Failed to add cloud filter, err %s\n" , -i40e_stat_str (&pf->hw, err)); +dev_err (&pf->pdev->dev,"Failed to add cloud filter, err %d\n" , + err); goto err; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 107/154 NFC: reorganize the functions in nci_request
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit 86cdf8e38792545161dbe3350a7eced558ba4d15 ]
There is a possible data race as shown below:
thread-A in nci_request() | thread-B in nci_close_device()
| mutex_lock(&ndev->req_lock);
test_bit(NCI_UP, &ndev->flags); |
... | test_and_clear_bit(NCI_UP, &ndev->flags)
mutex_lock(&ndev->req_lock); |
|This race will allow __nci_request() to be awaked while the device is getting removed.
Similar to commit e2cb6b891ad2 ("bluetooth: eliminate the potential race condition when removing the HCI controller"). this patch alters the function sequence in nci_request() to prevent the data races between the nci_close_device().
--- net/nfc/nci/core.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
net/nfc/nci/core.c +7 -4
@@ -144,12 +144,15 @@ inline int nci_request(struct nci_dev *ndev, {int rc; -if (!test_bit (NCI_UP , &ndev->flags)) -return -ENETDOWN ; -/* Serialize all requests */ mutex_lock (&ndev->req_lock); - rc =__nci_request (ndev, req, opt, timeout); +/* check the state after obtaing the lock against any races +* from nci_close_device when the device gets removed. +*/ +if (test_bit (NCI_UP , &ndev->flags)) + rc =__nci_request (ndev, req, opt, timeout); +else + rc = -ENETDOWN ;mutex_unlock (&ndev->req_lock);return rc;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 108/154 NFC: reorder the logic in nfc_{un,}register_device
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit 3e3b5dfcd16a3e254aab61bd1e8c417dd4503102 ]
There is a potential UAF between the unregistration routine and the NFC netlink operations.
The race that cause that UAF can be shown as below:
(FREE) | (USE)
nfcmrvl_nci_unregister_dev | nfc_genl_dev_up
nci_close_device |
nci_unregister_device | nfc_get_device
nfc_unregister_device | nfc_dev_up
rfkill_destory |
device_del | rfkill_blocked
... | ...The root cause for this race is concluded below:
1. The rfkill_blocked (USE) in nfc_dev_up is supposed to be placed after the device_is_registered check.
2. Since the netlink operations are possible just after the device_add in nfc_register_device, the nfc_dev_up() can happen anywhere during the rfkill creation process, which leads to data race.
This patch reorder these actions to permit
1. Once device_del is finished, the nfc_dev_up cannot dereference the rfkill object.
2. The rfkill_register need to be placed after the device_add of nfc_dev because the parent device need to be created first. So this patch keeps the order but inject device_lock to prevent the data race.
--- net/nfc/core.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-)
net/nfc/core.c +18 -14
@@ -94,13 +94,13 @@ int nfc_dev_up(struct nfc_dev *dev)device_lock (&dev->dev); -if (dev->rfkill &&rfkill_blocked (dev->rfkill)) { - rc = -ERFKILL ; +if (!device_is_registered (&dev->dev)) { + rc = -ENODEV ; goto error; } -if (!device_is_registered (&dev->dev)) { - rc = -ENODEV ; +if (dev->rfkill &&rfkill_blocked (dev->rfkill)) { + rc = -ERFKILL ; goto error; }
@@ -1117,11 +1117,7 @@ int nfc_register_device(struct nfc_dev *dev)if (rc)pr_err ("Could not register llcp device\n" ); - rc =nfc_genl_device_added (dev); -if (rc) -pr_debug ("The userspace won't be notified that the device %s was added\n" , -dev_name (&dev->dev)); - +device_lock (&dev->dev); dev->rfkill =rfkill_alloc (dev_name (&dev->dev), &dev->dev,RFKILL_TYPE_NFC , &nfc_rfkill_ops, dev);if (dev->rfkill) {
@@ -1130,6 +1126,12 @@ int nfc_register_device(struct nfc_dev *dev) dev->rfkill =NULL ; } } +device_unlock (&dev->dev); + + rc =nfc_genl_device_added (dev); +if (rc) +pr_debug ("The userspace won't be notified that the device %s was added\n" , +dev_name (&dev->dev));return 0 ; }
@@ -1146,10 +1148,17 @@ void nfc_unregister_device(struct nfc_dev *dev)pr_debug ("dev_name=%s\n" ,dev_name (&dev->dev)); + rc =nfc_genl_device_removed (dev); +if (rc) +pr_debug ("The userspace won't be notified that the device %s " +"was removed\n" ,dev_name (&dev->dev)); + +device_lock (&dev->dev);if (dev->rfkill) {rfkill_unregister (dev->rfkill);rfkill_destroy (dev->rfkill); } +device_unlock (&dev->dev);if (dev->ops->check_presence) {device_lock (&dev->dev);
@@ -1159,11 +1168,6 @@ void nfc_unregister_device(struct nfc_dev *dev)cancel_work_sync (&dev->check_pres_work); } - rc =nfc_genl_device_removed (dev); -if (rc) -pr_debug ("The userspace won't be notified that the device %s " -"was removed\n" ,dev_name (&dev->dev)); -nfc_llcp_unregister_device (dev);mutex_lock (&nfc_devlist_mutex);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 109/154 net: nfc: nci: Change the NCI close sequence
In reply to Greg Kroah-HartmanFrom: Bongsu Jeon <[email protected]>
[ Upstream commit f011539e723c737b74876ac47345e40270a3c384 ]
If there is a NCI command in work queue after closing the NCI device at nci_unregister_device, The NCI command timer starts at flush_workqueue function and then NCI command timeout handler would be called 5 second after flushing the NCI command work queue and destroying the queue. At that time, the timeout handler would try to use NCI command work queue that is destroyed already. it will causes the problem. To avoid this abnormal situation, change the sequence to prevent the NCI command timeout handler from being called after destroying the NCI command work queue.
--- net/nfc/nci/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/nfc/nci/core.c +2 -2
@@ -568,11 +568,11 @@ static int nci_close_device(struct nci_dev *ndev)clear_bit (NCI_INIT , &ndev->flags); -del_timer_sync (&ndev->cmd_timer); -/* Flush cmd wq */ flush_workqueue (ndev->cmd_wq); +del_timer_sync (&ndev->cmd_timer); +/* Clear flags */ ndev->flags =0 ;
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 110/154 NFC: add NCI_UNREG flag to eliminate the race
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit 48b71a9e66c2eab60564b1b1c85f4928ed04e406 ]
There are two sites that calls queue_work() after the destroy_workqueue() and lead to possible UAF.
The first site is nci_send_cmd(), which can happen after the nci_close_device as below
nfcmrvl_nci_unregister_dev | nfc_genl_dev_up
nci_close_device |
flush_workqueue |
del_timer_sync |
nci_unregister_device | nfc_get_device
destroy_workqueue | nfc_dev_up
nfc_unregister_device | nci_dev_up
device_del | nci_open_device
| __nci_request
| nci_send_cmd
| queue_work !!!Another site is nci_cmd_timer, awaked by the nci_cmd_work from the nci_send_cmd.
... | ...
nci_unregister_device | queue_work
destroy_workqueue |
nfc_unregister_device | ...
device_del | nci_cmd_work
| mod_timer
| ...
| nci_cmd_timer
| queue_work !!!For the above two UAF, the root cause is that the nfc_dev_up can race between the nci_unregister_device routine. Therefore, this patch introduce NCI_UNREG flag to easily eliminate the possible race. In addition, the mutex_lock in nci_close_device can act as a barrier.
--- include/net/nfc/nci_core.h | 1 + net/nfc/nci/core.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-)
include/net/nfc/nci_core.h +1 -0
@@ -30,6 +30,7 @@ enum nci_flag {NCI_UP ,NCI_DATA_EXCHANGE ,NCI_DATA_EXCHANGE_TO , + NCI_UNREG, };/* NCI device states */
net/nfc/nci/core.c +17 -2
@@ -473,6 +473,11 @@ static int nci_open_device(struct nci_dev *ndev)mutex_lock (&ndev->req_lock); +if (test_bit (NCI_UNREG , &ndev->flags)) { + rc = -ENODEV ; + goto done; + } +if (test_bit (NCI_UP , &ndev->flags)) { rc = -EALREADY ; goto done;
@@ -536,6 +541,10 @@ done:static int nci_close_device (struct nci_dev *ndev) {nci_req_cancel (ndev,ENODEV ); + +/* This mutex needs to be held as a barrier for +* caller nci_unregister_device +*/ mutex_lock (&ndev->req_lock);if (!test_and_clear_bit (NCI_UP , &ndev->flags)) {
@@ -573,8 +582,8 @@ static int nci_close_device(struct nci_dev *ndev)del_timer_sync (&ndev->cmd_timer); -/* Clear flags */ - ndev->flags =0 ; +/* Clear flags except NCI_UNREG */ + ndev->flags &=BIT (NCI_UNREG );mutex_unlock (&ndev->req_lock);
@@ -1259,6 +1268,12 @@ void nci_unregister_device(struct nci_dev *ndev) {struct nci_conn_info *conn_info, *n; +/* This set_bit is not protected with specialized barrier, +* However, it is fine because the mutex_lock(&ndev->req_lock); +* in nci_close_device() will help to emit one. +*/ +set_bit (NCI_UNREG , &ndev->flags); +nci_close_device (ndev);destroy_workqueue (ndev->cmd_wq);
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 111/154 e100: fix device suspend/resume
In reply to Greg Kroah-HartmanFrom: Jesse Brandeburg <[email protected]>
[ Upstream commit 5d2ca2e12dfb2aff3388ca57b06f570fa6206ced ]
As reported in [1], e100 was no longer working for suspend/resume cycles. The previous commit mentioned in the fixes appears to have broken things and this attempts to practice best known methods for device power management and keep wake-up working while allowing suspend/resume to work. To do this, I reorder a little bit of code and fix the resume path to make sure the device is enabled.
[1] https://bugzilla.kernel.org/show_bug.cgi?id=214933
--- drivers/net/ethernet/intel/e100.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/net/ethernet/intel/e100.c +13 -5
@@ -2997,9 +2997,10 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake)struct net_device *netdev =pci_get_drvdata (pdev);struct nic *nic =netdev_priv (netdev); +netif_device_detach (netdev); +if (netif_running (netdev))e100_down (nic); -netif_device_detach (netdev);if ((nic->flags & wol_magic) |e100_asf (nic)) {/* enable reverse auto-negotiation */
@@ -3016,7 +3017,7 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake) *enable_wake = false; } -pci_clear_master (pdev); +pci_disable_device (pdev); }static int __e100_power_off (struct pci_dev *pdev,bool wake)
@@ -3036,8 +3037,6 @@ static int __maybe_unused e100_suspend(struct device *dev_d)__e100_shutdown (to_pci_dev (dev_d), &wake); -device_wakeup_disable (dev_d); -return 0 ; }
@@ -3045,6 +3044,14 @@ static int __maybe_unused e100_resume(struct device *dev_d) {struct net_device *netdev =dev_get_drvdata (dev_d);struct nic *nic =netdev_priv (netdev); +int err; + + err =pci_enable_device (to_pci_dev (dev_d)); +if (err) { +netdev_err (netdev,"Resume cannot enable PCI device, aborting\n" ); +return err; + } +pci_set_master (to_pci_dev (dev_d));/* disable reverse auto-negotiation */ if (nic->phy == phy_82552_v) {
@@ -3056,10 +3063,11 @@ static int __maybe_unused e100_resume(struct device *dev_d) smartspeed & ~(E100_82552_REV_ANEG)); } -netif_device_attach (netdev);if (netif_running (netdev))e100_up (nic); +netif_device_attach (netdev); +return 0 ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 112/154 perf bench: Fix two memory leaks detected with ASan
In reply to Greg Kroah-HartmanFrom: Sohaib Mohamed <[email protected]>
[ Upstream commit 92723ea0f11d92496687db8c9725248e9d1e5e1d ]
ASan reports memory leaks while running:
$ perf bench sched all
--- tools/perf/bench/sched-messaging.c | 4 ++++ 1 file changed, 4 insertions(+)
tools/perf/bench/sched-messaging.c +4 -0
@@ -223,6 +223,8 @@ static unsigned int group(pthread_t *pth, snd_ctx->out_fds[i] = fds[1 ];if (!thread_mode)close (fds[0 ]); + +free (ctx); }/* Now we have all the fds, fork the senders */
@@ -239,6 +241,8 @@ static unsigned int group(pthread_t *pth,for (i =0 ; i < num_fds; i++)close (snd_ctx->out_fds[i]); +free (snd_ctx); +/* Return number of children to reap */ return num_fds *2 ; }
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 113/154 KVM: PPC: Book3S HV: Use GLOBAL_TOC for kvmppc_h_set_dabr/xdabr()
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit dae581864609d36fb58855fd59880b4941ce9d14 ]
kvmppc_h_set_dabr(), and kvmppc_h_set_xdabr() which jumps into it, need to use _GLOBAL_TOC to setup the kernel TOC pointer, because kvmppc_h_set_dabr() uses LOAD_REG_ADDR() to load dawr_force_enable.
When called from hcall_try_real_mode() we have the kernel TOC in r2, established near the start of kvmppc_interrupt_hv(), so there is no issue.
But they can also be called from kvmppc_pseries_do_hcall() which is module code, so the access ends up happening with the kvm-hv module's r2, which will not point at dawr_force_enable and could even cause a fault.
With the current code layout and compilers we haven't observed a fault in practice, the load hits somewhere in kvm-hv.ko and silently returns some bogus value.
Note that we we expect p8/p9 guests to use the DAWR, but SLOF uses h_set_dabr() to test if sc1 works correctly, see SLOF's lib/libhvcall/brokensc1.c.
--- arch/powerpc/kvm/book3s_hv_rmhandlers.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/kvm/book3s_hv_rmhandlers.S +2 -2
@@ -2539,7 +2539,7 @@ hcall_real_table: .globl hcall_real_table_end hcall_real_table_end: -_GLOBAL(kvmppc_h_set_xdabr) +_GLOBAL_TOC(kvmppc_h_set_xdabr) EXPORT_SYMBOL_GPL(kvmppc_h_set_xdabr) andi. r0, r5, DABRX_USER | DABRX_KERNEL beq 6f
@@ -2549,7 +2549,7 @@ EXPORT_SYMBOL_GPL(kvmppc_h_set_xdabr) 6: li r3, H_PARAMETER blr -_GLOBAL(kvmppc_h_set_dabr) +_GLOBAL_TOC(kvmppc_h_set_dabr) EXPORT_SYMBOL_GPL(kvmppc_h_set_dabr) li r5, DABRX_USER | DABRX_KERNEL 3:
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 114/154 pinctrl: qcom: sdm845: Enable dual edge errata
In reply to Greg Kroah-HartmanFrom: Bjorn Andersson <[email protected]>
[ Upstream commit 3a3a100473d2f6ebf9bdfe6efedd7e18de724388 ]
It has been observed that dual edge triggered wakeirq GPIOs on SDM845 doesn't trigger interrupts on the falling edge.
Enabling wakeirq_dual_edge_errata for SDM845 indicates that the PDC in SDM845 suffers from the same problem described, and worked around, by Doug in 'c3c0c2e18d94 ("pinctrl: qcom: Handle broken/missing PDC dual edge IRQs on sc7180")', so enable the workaround for SDM845 as well.
The specific problem seen without this is that gpio-keys does not detect the falling edge of the LID gpio on the Lenovo Yoga C630 and as such consistently reports the LID as closed.
--- drivers/pinctrl/qcom/pinctrl-sdm845.c | 1 + 1 file changed, 1 insertion(+)
drivers/pinctrl/qcom/pinctrl-sdm845.c +1 -0
@@ -1310,6 +1310,7 @@ static const struct msm_pinctrl_soc_data sdm845_pinctrl = { .ngpios = 151, .wakeirq_map = sdm845_pdc_map, .nwakeirq_map = ARRAY_SIZE(sdm845_pdc_map), + .wakeirq_dual_edge_errata = true, };static const struct msm_pinctrl_soc_data sdm845_acpi_pinctrl = {
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 115/154 perf/x86/intel/uncore: Fix filter_tid mask for CHA events on Skylake Server
In reply to Greg Kroah-HartmanFrom: Alexander Antonov <[email protected]>
[ Upstream commit e324234e0aa881b7841c7c713306403e12b069ff ]
According Uncore Reference Manual: any of the CHA events may be filtered by Thread/Core-ID by using tid modifier in CHA Filter 0 Register. Update skx_cha_hw_config() to follow Uncore Guide.
--- arch/x86/events/intel/uncore_snbep.c | 3 +++ 1 file changed, 3 insertions(+)
arch/x86/events/intel/uncore_snbep.c +3 -0
@@ -3545,6 +3545,9 @@ static int skx_cha_hw_config(struct intel_uncore_box *box, struct perf_event *evstruct hw_perf_event_extra *reg1 = &event->hw.extra_reg;struct extra_reg *er;int idx =0 ; +/* Any of the CHA events may be filtered by Thread/Core-ID.*/ +if (event->hw.config &SNBEP_CBO_PMON_CTL_TID_EN ) + idx =SKX_CHA_MSR_PMON_BOX_FILTER_TID ;for (er = skx_uncore_cha_extra_regs; er->msr; er++) {if (er->event != (event->hw.config & er->config_mask))
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 116/154 perf/x86/intel/uncore: Fix IIO event constraints for Skylake Server
In reply to Greg Kroah-HartmanFrom: Alexander Antonov <[email protected]>
[ Upstream commit 3866ae319c846a612109c008f43cba80b8c15e86 ]
According to the latest uncore document, COMP_BUF_OCCUPANCY (0xd5) event can be collected on 2-3 counters. Update uncore IIO event constraints for Skylake Server.
--- arch/x86/events/intel/uncore_snbep.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/events/intel/uncore_snbep.c +1 -0
@@ -3615,6 +3615,7 @@ static struct event_constraint skx_uncore_iio_constraints[] = {UNCORE_EVENT_CONSTRAINT (0xc0 ,0xc ),UNCORE_EVENT_CONSTRAINT (0xc5 ,0xc ),UNCORE_EVENT_CONSTRAINT (0xd4 ,0xc ), +UNCORE_EVENT_CONSTRAINT (0xd5 ,0xc ), EVENT_CONSTRAINT_END };
Signature · 1 line
2.33.0
Greg Kroah-Hartman
maintainerPATCH 117/154 s390/kexec: fix return code handling
In reply to Greg Kroah-HartmanFrom: Heiko Carstens <[email protected]>
[ Upstream commit 20c76e242e7025bd355619ba67beb243ba1a1e95 ]
kexec_file_add_ipl_report ignores that ipl_report_finish may fail and can return an error pointer instead of a valid pointer. Fix this and simplify by returning NULL in case of an error and let the only caller handle this case.
--- arch/s390/kernel/ipl.c | 3 ++- arch/s390/kernel/machine_kexec_file.c | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-)
arch/s390/kernel/ipl.c +2 -1
@@ -2156,7 +2156,7 @@ void *ipl_report_finish(struct ipl_repor buf =vzalloc (report->size);if (!buf) -return ERR_PTR (-ENOMEM ); + goto out; ptr = buf;memcpy (ptr, report->ipib, report->ipib->hdr.len);
@@ -2195,6 +2195,7 @@ void *ipl_report_finish(struct ipl_repor }BUG_ON (ptr > buf + report->size); +out:return buf; }
arch/s390/kernel/machine_kexec_file.c +7 -1
@@ -170,6 +170,7 @@ static int kexec_file_add_ipl_report(strstruct kexec_buf buf;unsigned long addr;void *ptr, *end; +int ret; buf.image = image;
@@ -199,7 +200,10 @@ static int kexec_file_add_ipl_report(str ptr += len; } + ret = -ENOMEM ; buf.buffer =ipl_report_finish (data->report); +if (!buf.buffer) + goto out; buf.bufsz = data->report->size; buf.memsz = buf.bufsz;
@@ -209,7 +213,9 @@ static int kexec_file_add_ipl_report(str data->kernel_buf + offsetof(struct lowcore , ipl_parmblock_ptr); *lc_ipl_parmblock_ptr = (__u32 )buf.mem; -return kexec_add_buffer (&buf); + ret =kexec_add_buffer (&buf); +out: +return ret; } void *kexec_file_add_components(struct kimage *image,
Greg Kroah-Hartman
maintainerPATCH 118/154 net: stmmac: dwmac-rk: Fix ethernet on rk3399 based devices
In reply to Greg Kroah-HartmanFrom: Punit Agrawal <[email protected]>
commit aec3f415f7244b7747a7952596971adb0df2f568 upstream.
Commit 2d26f6e39afb ("net: stmmac: dwmac-rk: fix unbalanced pm_runtime_enable warnings") while getting rid of a runtime PM warning ended up breaking ethernet
on rk3399 based devices. By dropping an extra reference to the device,
the commit ends up enabling suspend / resume of the ethernet device - which appears to be broken.
While the issue with runtime pm is being investigated, partially revert commit 2d26f6e39afb to restore the network on rk3399.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c +5 -0
@@ -21,6 +21,7 @@#include <linux/delay.h> #include <linux/mfd/syscon.h> #include <linux/regmap.h> +#include <linux/pm_runtime.h> #include "stmmac_platform.h"
@@ -1335,6 +1336,8 @@ static int rk_gmac_powerup(struct rk_prireturn ret; } +pm_runtime_get_sync (dev); +if (bsp_priv->integrated_phy)rk_gmac_integrated_phy_powerup (bsp_priv);
@@ -1346,6 +1349,8 @@ static void rk_gmac_powerdown(struct rk_if (gmac->integrated_phy)rk_gmac_integrated_phy_powerdown (gmac); +pm_runtime_put_sync (&gmac->pdev->dev); +phy_power_on (gmac, false);gmac_clk_enable (gmac, false); }
Greg Kroah-Hartman
maintainerPATCH 119/154 arm64: vdso32: suppress error message for make mrproper
In reply to Greg Kroah-HartmanFrom: Nick Desaulniers <[email protected]>
commit 14831fad73f5ac30ac61760487d95a538e6ab3cb upstream.
When running the following command without arm-linux-gnueabi-gcc in one's $PATH, the following warning is observed:
$ ARCH=arm64 CROSS_COMPILE_COMPAT=arm-linux-gnueabi- make -j72 LLVM=1 mrproper make[1]: arm-linux-gnueabi-gcc: No such file or directory
This is because KCONFIG is not run for mrproper, so CONFIG_CC_IS_CLANG is not set, and we end up eagerly evaluating various variables that try to invoke CC_COMPAT.
This is a similar problem to what was observed in
commit dc960bfeedb0 ("h8300: suppress error messages for 'make clean'")
--- arch/arm64/kernel/vdso32/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/kernel/vdso32/Makefile +2 -1
@@ -48,7 +48,8 @@ cc32-as-instr = $(call try-run,\ # As a result we set our own flags here. # KBUILD_CPPFLAGS and NOSTDINC_FLAGS from top-level Makefile -VDSO_CPPFLAGS := -D__KERNEL__ -nostdinc -isystem $(shell $(CC_COMPAT) -print-file-name=include) +VDSO_CPPFLAGS := -D__KERNEL__ -nostdinc +VDSO_CPPFLAGS += -isystem $(shell $(CC_COMPAT) -print-file-name=include 2>/dev/null) VDSO_CPPFLAGS += $(LINUXINCLUDE) # Common C and assembly flags
Greg Kroah-Hartman
maintainerPATCH 120/154 tun: fix bonding active backup with arp monitoring
In reply to Greg Kroah-HartmanFrom: Nicolas Dichtel <[email protected]>
commit a31d27fbed5d518734cb60956303eb15089a7634 upstream.
As stated in the bonding doc, trans_start must be set manually for drivers using NETIF_F_LLTX:
Drivers that use NETIF_F_LLTX flag must also update netdev_queue->trans_start. If they do not, then the ARP monitor will immediately fail any slaves using that driver, and those slaves will stay down.
--- drivers/net/tun.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/tun.c +5 -0
@@ -1021,6 +1021,7 @@ static netdev_tx_t tun_net_xmit(struct s {struct tun_struct *tun =netdev_priv (dev);int txq = skb->queue_mapping; +struct netdev_queue *queue;struct tun_file *tfile;int len = skb->len;
@@ -1065,6 +1066,10 @@ static netdev_tx_t tun_net_xmit(struct sif (ptr_ring_produce (&tfile->tx_ring, skb)) goto drop; +/* NETIF_F_LLTX requires to do our own update of trans_start */ + queue =netdev_get_tx_queue (dev, txq); + queue->trans_start = jiffies; +/* Notify and wake up reader process */ if (tfile->flags &TUN_FASYNC )kill_fasync (&tfile->fasync,SIGIO ,POLL_IN );
Greg Kroah-Hartman
maintainerPATCH 121/154 hexagon: export raw I/O routines for modules
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
commit ffb92ce826fd801acb0f4e15b75e4ddf0d189bde upstream.
Patch series "Fixes for ARCH=hexagon allmodconfig", v2.
This series fixes some issues noticed with ARCH=hexagon allmodconfig.
This patch (of 3):
When building ARCH=hexagon allmodconfig, the following errors occur:
ERROR: modpost: "__raw_readsl" [drivers/i3c/master/svc-i3c-master.ko] undefined!
ERROR: modpost: "__raw_writesl" [drivers/i3c/master/dw-i3c-master.ko] undefined!
ERROR: modpost: "__raw_readsl" [drivers/i3c/master/dw-i3c-master.ko] undefined!
ERROR: modpost: "__raw_writesl" [drivers/i3c/master/i3c-master-cdns.ko] undefined!
ERROR: modpost: "__raw_readsl" [drivers/i3c/master/i3c-master-cdns.ko] undefined!
Export these symbols so that modules can use them without any errors.
--- arch/hexagon/lib/io.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/hexagon/lib/io.c +4 -0
@@ -27,6 +27,7 @@ void __raw_readsw(const void __iomem *ad *dst++ = *src; } +EXPORT_SYMBOL (__raw_readsw);/* * __raw_writesw - read words a short at a time
@@ -47,6 +48,7 @@ void __raw_writesw(void __iomem *addr, c } +EXPORT_SYMBOL (__raw_writesw);/* Pretty sure len is pre-adjusted for the length of the access already */ void __raw_readsl (const void __iomem *addr,void *data,int len)
@@ -62,6 +64,7 @@ void __raw_readsl(const void __iomem *ad } +EXPORT_SYMBOL (__raw_readsl);void __raw_writesl (void __iomem *addr,const void *data,int len) {
@@ -76,3 +79,4 @@ void __raw_writesl(void __iomem *addr, c } +EXPORT_SYMBOL (__raw_writesl);
Greg Kroah-Hartman
maintainerPATCH 122/154 hexagon: clean up timer-regs.h
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
commit 51f2ec593441d3d1ebc0d478fac3ea329c7c93ac upstream.
When building allmodconfig, there is a warning about TIMER_ENABLE being redefined:
drivers/clocksource/timer-oxnas-rps.c:39:9: error: 'TIMER_ENABLE' macro redefined [-Werror,-Wmacro-redefined]
#define TIMER_ENABLE BIT(7)
^
arch/hexagon/include/asm/timer-regs.h:13:9: note: previous definition is here
#define TIMER_ENABLE 0
^
1 error generated.The values in this header are only used in one file each, if they are used at all. Remove the header and sink all of the constants into their respective files.
TCX0_CLK_RATE is only used in arch/hexagon/include/asm/timex.h
TIMER_ENABLE, RTOS_TIMER_INT, RTOS_TIMER_REGS_ADDR are only used in arch/hexagon/kernel/time.c.
SLEEP_CLK_RATE and TIMER_CLR_ON_MATCH have both been unused since the file's introduction in commit 71e4a47f32f4 ("Hexagon: Add time and timer functions").
TIMER_ENABLE is redefined as BIT(0) so the shift is moved into the definition, rather than its use.
--- arch/hexagon/include/asm/timer-regs.h | 26 -------------------------- arch/hexagon/include/asm/timex.h | 3 +-- arch/hexagon/kernel/time.c | 12 ++++++++++-- 3 files changed, 11 insertions(+), 30 deletions(-) delete mode 100644 arch/hexagon/include/asm/timer-regs.h
arch/hexagon/include/asm/timer-regs.h deleted +0 -26
@@ -1,26 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -* Timer support for Hexagon -* -* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. -*/ - -#ifndef _ASM_TIMER_REGS_H -#define _ASM_TIMER_REGS_H - -/* This stuff should go into a platform specific file */ -#define TCX0_CLK_RATE 19200 -#define TIMER_ENABLE 0 -#define TIMER_CLR_ON_MATCH 1 - -/* -* 8x50 HDD Specs 5-8. Simulator co-sim not fixed until -* release 1.1, and then it's "adjustable" and probably not defaulted. -*/ -#define RTOS_TIMER_INT 3 -#ifdef CONFIG_HEXAGON_COMET -#define RTOS_TIMER_REGS_ADDR 0xAB000000UL -#endif -#define SLEEP_CLK_RATE 32000 - -#endif
arch/hexagon/include/asm/timex.h +1 -2
@@ -7,11 +7,10 @@#define _ASM_TIMEX_H#include <asm-generic/timex.h> -#include <asm/timer-regs.h> #include <asm/hexagon_vm.h> /* Using TCX0 as our clock. CLOCK_TICK_RATE scheduled to be removed. */ -#define CLOCK_TICK_RATE TCX0_CLK_RATE +#define CLOCK_TICK_RATE 19200#define ARCH_HAS_READ_CURRENT_TIMER
arch/hexagon/kernel/time.c +10 -2
@@ -17,9 +17,10 @@#include <linux/of_irq.h> #include <linux/module.h> -#include <asm/timer-regs.h> #include <asm/hexagon_vm.h> +#define TIMER_ENABLE BIT(0) +/* * For the clocksource we need: * pcycle frequency (600MHz)
@@ -33,6 +34,13 @@ cycles_t pcycle_freq_mhz;cycles_t thread_freq_mhz;cycles_t sleep_clk_freq; +/* +* 8x50 HDD Specs 5-8. Simulator co-sim not fixed until +* release 1.1, and then it's "adjustable" and probably not defaulted. +*/ +#define RTOS_TIMER_INT 3 +#define RTOS_TIMER_REGS_ADDR 0xAB000000UL +static struct resource rtos_timer_resources[] = { { .start =RTOS_TIMER_REGS_ADDR ,
@@ -80,7 +88,7 @@ static int set_next_event(unsigned longiowrite32 (0 , &rtos_timer->clear);iowrite32 (delta, &rtos_timer->match); -iowrite32 (1 <<TIMER_ENABLE , &rtos_timer->enable); +iowrite32 (TIMER_ENABLE , &rtos_timer->enable);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 123/154 tipc: check for null after calling kmemdup
In reply to Greg Kroah-HartmanFrom: Tadeusz Struk <[email protected]>
commit 3e6db079751afd527bf3db32314ae938dc571916 upstream.
kmemdup can return a null pointer so need to check for it, otherwise the null key will be dereferenced later in tipc_crypto_key_xmit as can be seen in the trace [1].
[1] https://syzkaller.appspot.com/bug?id=bca180abb29567b189efdbdb34cbf7ba851c2a58
--- net/tipc/crypto.c | 4 ++++ 1 file changed, 4 insertions(+)
net/tipc/crypto.c +4 -0
@@ -590,6 +590,10 @@ static int tipc_aead_init(struct tipc_ae tmp->cloned =NULL ; tmp->authsize =TIPC_AES_GCM_TAG_SIZE ; tmp->key =kmemdup (ukey,tipc_aead_key_size (ukey),GFP_KERNEL ); +if (!tmp->key) { +tipc_aead_free (&tmp->rcu); +return -ENOMEM ; + }memcpy (&tmp->salt, ukey->key + keylen,TIPC_AES_GCM_SALT_SIZE );atomic_set (&tmp->users,0 );atomic64_set (&tmp->seqno,0 );
Greg Kroah-Hartman
maintainerPATCH 124/154 ipc: WARN if trying to remove ipc object which is absent
In reply to Greg Kroah-HartmanFrom: Alexander Mikhalitsyn <[email protected]>
commit 126e8bee943e9926238c891e2df5b5573aee76bc upstream.
Patch series "shm: shm_rmid_forced feature fixes".
Some time ago I met kernel crash after CRIU restore procedure, fortunately, it was CRIU restore, so, I had dump files and could do restore many times and crash reproduced easily. After some investigation I've constructed the minimal reproducer. It was found that it's use-after-free and it happens only if sysctl kernel.shm_rmid_forced = 1.
The key of the problem is that the exit_shm() function not handles shp's object destroy when task->sysvshm.shm_clist contains items from different IPC namespaces. In most cases this list will contain only items from one IPC namespace.
How can this list contain object from different namespaces? The exit_shm() function is designed to clean up this list always when process leaves IPC namespace. But we made a mistake a long time ago and did not add a exit_shm() call into the setns() syscall procedures.
The first idea was just to add this call to setns() syscall but it obviously changes semantics of setns() syscall and that's userspace-visible change. So, I gave up on this idea.
The first real attempt to address the issue was just to omit forced destroy if we meet shp object not from current task IPC namespace [1]. But that was not the best idea because task->sysvshm.shm_clist was protected by rwsem which belongs to current task IPC namespace. It means that list corruption may occur.
Second approach is just extend exit_shm() to properly handle shp's from different IPC namespaces [2]. This is really non-trivial thing, I've put a lot of effort into that but not believed that it's possible to make it fully safe, clean and clear.
Thanks to the efforts of Manfred Spraul working an elegant solution was designed. Thanks a lot, Manfred!
Eric also suggested the way to address the issue in ("[RFC][PATCH] shm:
In shm_exit destroy all created and never attached segments") Eric's idea was to maintain a list of shm_clists one per IPC namespace, use lock-less lists. But there is some extra memory consumption-related concerns.
An alternative solution which was suggested by me was implemented in ("shm: reset shm_clist on setns but omit forced shm destroy"). The idea is pretty simple, we add exit_shm() syscall to setns() but DO NOT destroy shm segments even if sysctl kernel.shm_rmid_forced = 1, we just clean up the task->sysvshm.shm_clist list.
This chages semantics of setns() syscall a little bit but in comparision to the "naive" solution when we just add exit_shm() without any special exclusions this looks like a safer option.
[1] https://lkml.org/lkml/2021/7/6/1108
[2] https://lkml.org/lkml/2021/7/14/736
This patch (of 2):
Let's produce a warning if we trying to remove non-existing IPC object from IPC namespace kht/idr structures.
This allows us to catch possible bugs when the ipc_rmid() function was called with inconsistent struct ipc_ids*, struct kern_ipc_perm* arguments.
--- ipc/util.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
ipc/util.c +3 -3
@@ -446,8 +446,8 @@ static int ipcget_public(struct ipc_namestatic void ipc_kht_remove (struct ipc_ids *ids,struct kern_ipc_perm *ipcp) {if (ipcp->key !=IPC_PRIVATE ) -rhashtable_remove_fast (&ids->key_ht, &ipcp->khtnode, - ipc_kht_params); +WARN_ON_ONCE (rhashtable_remove_fast (&ids->key_ht, &ipcp->khtnode, + ipc_kht_params)); }/**
@@ -462,7 +462,7 @@ void ipc_rmid(struct ipc_ids *ids, struc {int idx =ipcid_to_idx (ipcp->id); -idr_remove (&ids->ipcs_idr, idx); +WARN_ON_ONCE (idr_remove (&ids->ipcs_idr, idx) != ipcp);ipc_kht_remove (ids, ipcp); ids->in_use--; ipcp->deleted = true;
Greg Kroah-Hartman
maintainerPATCH 125/154 mm: kmemleak: slob: respect SLAB_NOLEAKTRACE flag
In reply to Greg Kroah-HartmanFrom: Rustam Kovhaev <[email protected]>
commit 34dbc3aaf5d9e89ba6cc5e24add9458c21ab1950 upstream.
When kmemleak is enabled for SLOB, system does not boot and does not print anything to the console. At the very early stage in the boot process we hit infinite recursion from kmemleak_init() and eventually kernel crashes.
kmemleak_init() specifies SLAB_NOLEAKTRACE for KMEM_CACHE(), but kmem_cache_create_usercopy() removes it because CACHE_CREATE_MASK is not valid for SLOB.
Let's fix CACHE_CREATE_MASK and make kmemleak work with SLOB
--- mm/slab.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/slab.h +1 -1
@@ -147,7 +147,7 @@ static inline slab_flags_t kmem_cache_fl#define SLAB_CACHE_FLAGS (SLAB_NOLEAKTRACE | SLAB_RECLAIM_ACCOUNT | \ SLAB_TEMPORARY | SLAB_ACCOUNT)#else -#define SLAB_CACHE_FLAGS (0) +#define SLAB_CACHE_FLAGS (SLAB_NOLEAKTRACE)#endif /* Common flags available with current configuration */
Greg Kroah-Hartman
maintainerPATCH 126/154 x86/hyperv: Fix NULL deref in set_hv_tscchange_cb() if Hyper-V setup fails
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit daf972118c517b91f74ff1731417feb4270625a4 upstream.
Check for a valid hv_vp_index array prior to derefencing hv_vp_index when setting Hyper-V's TSC change callback. If Hyper-V setup failed in hyperv_init(), the kernel will still report that it's running under Hyper-V, but will have silently disabled nearly all functionality.
BUG: kernel NULL pointer dereference, address: 0000000000000010 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] SMP CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.15.0-rc2+ #75 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 RIP: 0010:set_hv_tscchange_cb+0x15/0xa0 Code: <8b> 04 82 8b 15 12 17 85 01 48 c1 e0 20 48 0d ee 00 01 00 f6 c6 08 ... Call Trace: kvm_arch_init+0x17c/0x280 kvm_init+0x31/0x330 vmx_init+0xba/0x13a do_one_initcall+0x41/0x1c0 kernel_init_freeable+0x1f2/0x23b kernel_init+0x16/0x120 ret_from_fork+0x22/0x30
--- arch/x86/hyperv/hv_init.c | 3 +++ 1 file changed, 3 insertions(+)
arch/x86/hyperv/hv_init.c +3 -0
@@ -176,6 +176,9 @@ void set_hv_tscchange_cb(void (*cb)(voidreturn ; } +if (!hv_vp_index) +return ; + hv_reenlightenment_cb = cb;/* Make sure callback is registered before we write to MSRs */
Greg Kroah-Hartman
maintainerPATCH 127/154 powerpc/8xx: Fix pinned TLBs with CONFIG_STRICT_KERNEL_RWX
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
commit 1e35eba4055149c578baf0318d2f2f89ea3c44a0 upstream.
As spotted and explained in commit c12ab8dbc492 ("powerpc/8xx: Fix Oops with STRICT_KERNEL_RWX without DEBUG_RODATA_TEST"), the selection of STRICT_KERNEL_RWX without selecting DEBUG_RODATA_TEST has spotted the lack of the DIRTY bit in the pinned kernel data TLBs.
This problem should have been detected a lot earlier if things had been working as expected. But due to an incredible level of chance or mishap, this went undetected because of a set of bugs: In fact the DTLBs were not pinned, because instead of setting the reserve bit in MD_CTR, it was set in MI_CTR that is the register for ITLBs.
But then, another huge bug was there: the physical address was reset to 0 at the boundary between RO and RW areas, leading to the same physical space being mapped at both 0xc0000000 and 0xc8000000. This had by miracle no consequence until now because the entry was not really pinned so it was overwritten soon enough to go undetected.
Of course, now that we really pin the DTLBs, it must be fixed as well.
Depends-on: c12ab8dbc492 ("powerpc/8xx: Fix Oops with STRICT_KERNEL_RWX without DEBUG_RODATA_TEST")
--- arch/powerpc/kernel/head_8xx.S | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
arch/powerpc/kernel/head_8xx.S +7 -6
@@ -766,6 +766,7 @@ _GLOBAL(mmu_pin_tlb) #ifdef CONFIG_PIN_TLB_DATA LOAD_REG_IMMEDIATE(r6, PAGE_OFFSET) LOAD_REG_IMMEDIATE(r7, MI_SVALID | MI_PS8MEG | _PMD_ACCESSED) + li r8, 0 #ifdef CONFIG_PIN_TLB_IMMR li r0, 3 #else
@@ -774,26 +775,26 @@ _GLOBAL(mmu_pin_tlb) mtctr r0 cmpwi r4, 0 beq 4f - LOAD_REG_IMMEDIATE(r8, 0xf0 | _PAGE_RO | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT) LOAD_REG_ADDR(r9, _sinittext) 2: ori r0, r6, MD_EVALID + ori r12, r8, 0xf0 | _PAGE_RO | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT mtspr SPRN_MD_CTR, r5 mtspr SPRN_MD_EPN, r0 mtspr SPRN_MD_TWC, r7 - mtspr SPRN_MD_RPN, r8 + mtspr SPRN_MD_RPN, r12 addi r5, r5, 0x100 addis r6, r6, SZ_8M@h addis r8, r8, SZ_8M@h cmplw r6, r9 bdnzt lt, 2b - -4: LOAD_REG_IMMEDIATE(r8, 0xf0 | _PAGE_DIRTY | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT) +4: 2: ori r0, r6, MD_EVALID + ori r12, r8, 0xf0 | _PAGE_DIRTY | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT mtspr SPRN_MD_CTR, r5 mtspr SPRN_MD_EPN, r0 mtspr SPRN_MD_TWC, r7 - mtspr SPRN_MD_RPN, r8 + mtspr SPRN_MD_RPN, r12 addi r5, r5, 0x100 addis r6, r6, SZ_8M@h addis r8, r8, SZ_8M@h
@@ -814,7 +815,7 @@ _GLOBAL(mmu_pin_tlb) #endif #if defined(CONFIG_PIN_TLB_IMMR) || defined(CONFIG_PIN_TLB_DATA) lis r0, (MD_RSV4I | MD_TWAM)@h - mtspr SPRN_MI_CTR, r0 + mtspr SPRN_MD_CTR, r0 #endif mtspr SPRN_SRR1, r10 mtspr SPRN_SRR0, r11
Greg Kroah-Hartman
maintainerPATCH 128/154 scsi: qla2xxx: Fix mailbox direction flags in qla2xxx_get_adapter_id()
In reply to Greg Kroah-HartmanFrom: Ewan D. Milne <[email protected]>
commit 392006871bb26166bcfafa56faf49431c2cfaaa8 upstream.
The SCM changes set the flags in mcp->out_mb instead of mcp->in_mb so the data was not actually being read into the mcp->mb[] array from the adapter.
--- drivers/scsi/qla2xxx/qla_mbx.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/scsi/qla2xxx/qla_mbx.c +2 -4
@@ -1650,10 +1650,8 @@ qla2x00_get_adapter_id(scsi_qla_host_t * mcp->in_mb |=MBX_13 |MBX_12 |MBX_11 |MBX_10 ;if (IS_FWI2_CAPABLE (vha->hw)) mcp->in_mb |=MBX_19 |MBX_18 |MBX_17 |MBX_16 ; -if (IS_QLA27XX (vha->hw) ||IS_QLA28XX (vha->hw)) { - mcp->in_mb |=MBX_15 ; - mcp->out_mb |=MBX_7 |MBX_21 |MBX_22 |MBX_23 ; - } +if (IS_QLA27XX (vha->hw) ||IS_QLA28XX (vha->hw)) + mcp->in_mb |=MBX_15 |MBX_21 |MBX_22 |MBX_23 ; mcp->tov =MBX_TOV_SECONDS ; mcp->flags =0 ;
Greg Kroah-Hartman
maintainerPATCH 129/154 s390/kexec: fix memory leak of ipl report buffer
In reply to Greg Kroah-HartmanFrom: Baoquan He <[email protected]>
commit 4aa9340584e37debef06fa99b56d064beb723891 upstream.
unreferenced object 0x38000195000 (size 4096):
comm "kexec", pid 8548, jiffies 4294953647 (age 32443.270s) hex dump (first 32 bytes):
00 00 00 c8 20 00 00 00 00 00 00 c0 02 80 00 00 .... ...........
40 40 40 40 40 40 40 40 00 00 00 00 00 00 00 00 @@@@@@@@........
backtrace:
[<0000000011a2f199>] __vmalloc_node_range+0xc0/0x140
[<0000000081fa2752>] vzalloc+0x5a/0x70
[<0000000063a4c92d>] ipl_report_finish+0x2c/0x180
[<00000000553304da>] kexec_file_add_ipl_report+0xf4/0x150
[<00000000862d033f>] kexec_file_add_components+0x124/0x160
[<000000000d2717bb>] arch_kexec_kernel_image_load+0x62/0x90
[<000000002e0373b6>] kimage_file_alloc_init+0x1aa/0x2e0
[<0000000060f2d14f>] __do_sys_kexec_file_load+0x17c/0x2c0
[<000000008c86fe5a>] __s390x_sys_kexec_file_load+0x40/0x50
[<000000001fdb9dac>] __do_syscall+0x1bc/0x1f0
[<000000003ee4258d>] system_call+0x78/0xa0--- arch/s390/include/asm/kexec.h | 6 ++++++ arch/s390/kernel/machine_kexec_file.c | 10 ++++++++++ 2 files changed, 16 insertions(+)
arch/s390/include/asm/kexec.h +6 -0
@@ -74,6 +74,12 @@ void *kexec_file_add_components(struct kint arch_kexec_do_relocs (int r_type,void *loc,unsigned long val,unsigned long addr); +#define ARCH_HAS_KIMAGE_ARCH + +struct kimage_arch { +void *ipl_buf; +}; +extern const struct kexec_file_ops s390_kexec_image_ops;extern const struct kexec_file_ops s390_kexec_elf_ops;
arch/s390/kernel/machine_kexec_file.c +10 -0
@@ -12,6 +12,7 @@#include <linux/kexec.h> #include <linux/module_signature.h> #include <linux/verification.h> +#include <linux/vmalloc.h> #include <asm/boot_data.h> #include <asm/ipl.h> #include <asm/setup.h>
@@ -206,6 +207,7 @@ static int kexec_file_add_ipl_report(str goto out; buf.bufsz = data->report->size; buf.memsz = buf.bufsz; + image->arch.ipl_buf = buf.buffer; data->memsz += buf.memsz;
@@ -327,3 +329,11 @@ int arch_kexec_kernel_image_probe(structreturn kexec_image_probe_default (image, buf, buf_len); } + +int arch_kimage_file_post_load_cleanup (struct kimage *image) +{ +vfree (image->arch.ipl_buf); + image->arch.ipl_buf =NULL ; + +return kexec_image_post_load_cleanup_default (image); +}
Greg Kroah-Hartman
maintainerPATCH 130/154 block: Check ADMIN before NICE for IOPRIO_CLASS_RT
In reply to Greg Kroah-HartmanFrom: Alistair Delva <[email protected]>
commit 94c4b4fd25e6c3763941bdec3ad54f2204afa992 upstream.
Booting to Android userspace on 5.14 or newer triggers the following SELinux denial:
avc: denied { sys_nice } for comm="init" capability=23
scontext=u:r:init:s0 tcontext=u:r:init:s0 tclass=capability permissive=0
Init is PID 0 running as root, so it already has CAP_SYS_ADMIN. For better compatibility with older SEPolicy, check ADMIN before NICE.
--- block/ioprio.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
block/ioprio.c +8 -1
@@ -69,7 +69,14 @@ int ioprio_check_cap(int ioprio)switch (class) {case IOPRIO_CLASS_RT : -if (!capable (CAP_SYS_NICE ) && !capable (CAP_SYS_ADMIN )) +/* +* Originally this only checked for CAP_SYS_ADMIN, +* which was implicitly allowed for pid 0 by security +* modules such as SELinux. Make sure we check +* CAP_SYS_ADMIN first to avoid a denial/avc for +* possibly missing CAP_SYS_NICE permission. +*/ +if (!capable (CAP_SYS_ADMIN ) && !capable (CAP_SYS_NICE ))return -EPERM ; fallthrough;/* rt has prio field too */
Re: [PATCH 5.10 130/154] block: Check ADMIN before NICE for IOPRIO_CLASS_RT
Quoted 3 lines · Greg Kroah-Hartman
From: Alistair Delva <[email protected]>
commit
94c4b4fd25e6c3763941bdec3ad54f2204afa992upstream.
[SNIP]
Quoted 8 lines
block/ioprio.c +1
-1@@ -69,7 +69,14 @@ int ioprio_check_cap(int ioprio)switch (class) {case IOPRIO_CLASS_RT : -if (!capable (CAP_SYS_NICE ) && !capable (CAP_SYS_ADMIN )) +/*
block/ioprio.c int ioprio_check_cap(int ioprio) · line 82
Quoted 10 lines
block/ioprio.c +7
-0+* Originally this only checked for CAP_SYS_ADMIN, +* which was implicitly allowed for pid 0 by security +* modules such as SELinux. Make sure we check +* CAP_SYS_ADMIN first to avoid a denial/avc for +* possibly missing CAP_SYS_NICE permission. +*/ +if (!capable (CAP_SYS_ADMIN ) && !capable (CAP_SYS_NICE ))return -EPERM ; fallthrough;/* rt has prio field too */
What exactly is above patch trying to fix?
It does not change control flow at all, and added comment is misleading.
Signature · 1 line
Jari Ruusu 4096R/8132F189 12D6 4C3A DCDA 0AA4 27BD ACDF F073 3C80 8132 F189
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 130/154] block: Check ADMIN before NICE for IOPRIO_CLASS_RT
Quoted 18 lines · Jari Ruusu
Quoted 3 lines · Greg Kroah-Hartman
From: Alistair Delva <[email protected]>
commit
94c4b4fd25e6c3763941bdec3ad54f2204afa992upstream.[SNIP]
Quoted 13 lines
block/ioprio.c +6
-1@@ -69,7 +69,14 @@ int ioprio_check_cap(int ioprio)switch (class) {case IOPRIO_CLASS_RT : -if (!capable (CAP_SYS_NICE ) && !capable (CAP_SYS_ADMIN )) +/* +* Originally this only checked for CAP_SYS_ADMIN, +* which was implicitly allowed for pid 0 by security +* modules such as SELinux. Make sure we check +* CAP_SYS_ADMIN first to avoid a denial/avc for +* possibly missing CAP_SYS_NICE permission.
Quoted 8 lines
block/ioprio.c int ioprio_check_cap(int ioprio) · line 82
Quoted 5 lines
block/ioprio.c +2
-0+*/ +if (!capable (CAP_SYS_ADMIN ) && !capable (CAP_SYS_NICE ))return -EPERM ; fallthrough;/* rt has prio field too */ What exactly is above patch trying to fix?
It does not change control flow at all, and added comment is misleading.
See the thread on the mailing list for what it does and why it is needed.
It does change the result when selinux is enabled.
thanks,
greg k-h
Serge E. Hallyn
maintainerRe: [PATCH 5.10 130/154] block: Check ADMIN before NICE for IOPRIO_CLASS_RT
Quoted 28 lines · Greg Kroah-Hartman
Quoted 18 lines · Jari Ruusu
Quoted 3 lines · Greg Kroah-Hartman
From: Alistair Delva <[email protected]>
commit
94c4b4fd25e6c3763941bdec3ad54f2204afa992upstream.[SNIP]
Quoted 13 lines
block/ioprio.c +6
-1@@ -69,7 +69,14 @@ int ioprio_check_cap(int ioprio)switch (class) {case IOPRIO_CLASS_RT : -if (!capable (CAP_SYS_NICE ) && !capable (CAP_SYS_ADMIN )) +/* +* Originally this only checked for CAP_SYS_ADMIN, +* which was implicitly allowed for pid 0 by security +* modules such as SELinux. Make sure we check +* CAP_SYS_ADMIN first to avoid a denial/avc for +* possibly missing CAP_SYS_NICE permission. Quoted 8 lines
block/ioprio.c int ioprio_check_cap(int ioprio) · line 82
Quoted 5 lines
block/ioprio.c +2
-0+*/ +if (!capable (CAP_SYS_ADMIN ) && !capable (CAP_SYS_NICE ))return -EPERM ; fallthrough;/* rt has prio field too */ What exactly is above patch trying to fix?
It does not change control flow at all, and added comment is misleading.
Quoted 8 lines
See the thread on the mailing list for what it does and why it is needed.
It does change the result when selinux is enabled.
thanks,
greg k-h
The case where we create a newer more fine grained capability which is a sub-cap of a broader capability like CAP_SYS_ADMIN is analogous. See check_syslog_permissions() for instance.
So I think a helper like
int capable_either_or(int cap1, int cap2) {
if (has_capability_noaudit(current, cap1))
return 0;
return capable(cap2);
}might be worthwhile.
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 130/154] block: Check ADMIN before NICE for IOPRIO_CLASS_RT
Quoted 44 lines · Serge E. Hallyn
Quoted 28 lines · Greg Kroah-Hartman
Quoted 18 lines · Jari Ruusu
Quoted 3 lines · Greg Kroah-Hartman
From: Alistair Delva <[email protected]>
commit
94c4b4fd25e6c3763941bdec3ad54f2204afa992upstream.[SNIP]
Quoted 13 lines
block/ioprio.c +6
-1@@ -69,7 +69,14 @@ int ioprio_check_cap(int ioprio)switch (class) {case IOPRIO_CLASS_RT : -if (!capable (CAP_SYS_NICE ) && !capable (CAP_SYS_ADMIN )) +/* +* Originally this only checked for CAP_SYS_ADMIN, +* which was implicitly allowed for pid 0 by security +* modules such as SELinux. Make sure we check +* CAP_SYS_ADMIN first to avoid a denial/avc for +* possibly missing CAP_SYS_NICE permission. Quoted 8 lines
block/ioprio.c int ioprio_check_cap(int ioprio) · line 82
Quoted 5 lines
block/ioprio.c +2
-0+*/ +if (!capable (CAP_SYS_ADMIN ) && !capable (CAP_SYS_NICE ))return -EPERM ; fallthrough;/* rt has prio field too */ What exactly is above patch trying to fix?
It does not change control flow at all, and added comment is misleading.Quoted 8 lines
See the thread on the mailing list for what it does and why it is needed.
It does change the result when selinux is enabled.
thanks,
greg k-h
The case where we create a newer more fine grained capability which is a sub-cap of a broader capability like
CAP_SYS_ADMINis analogous. Seecheck_syslog_permissions()for instance.So I think a helper like
Quoted 7 lines
int capable_either_or(int cap1, int cap2) { if (has_capability_noaudit(current, cap1)) return 0; return capable(cap2); }might be worthwhile.
Sure, feel free to work on that and submit it, but for now, this change is needed.
thanks,
greg k-h
Re: [PATCH 5.10 130/154] block: Check ADMIN before NICE for IOPRIO_CLASS_RT
Quoted 46 lines · Greg Kroah-Hartman
Quoted 44 lines · Serge E. Hallyn
Quoted 28 lines · Greg Kroah-Hartman
Quoted 18 lines · Jari Ruusu
Quoted 3 lines · Greg Kroah-Hartman
From: Alistair Delva <[email protected]>
commit
94c4b4fd25e6c3763941bdec3ad54f2204afa992upstream.[SNIP]
Quoted 13 lines
block/ioprio.c +6
-1@@ -69,7 +69,14 @@ int ioprio_check_cap(int ioprio)switch (class) {case IOPRIO_CLASS_RT : -if (!capable (CAP_SYS_NICE ) && !capable (CAP_SYS_ADMIN )) +/* +* Originally this only checked for CAP_SYS_ADMIN, +* which was implicitly allowed for pid 0 by security +* modules such as SELinux. Make sure we check +* CAP_SYS_ADMIN first to avoid a denial/avc for +* possibly missing CAP_SYS_NICE permission. Quoted 8 lines
block/ioprio.c int ioprio_check_cap(int ioprio) · line 82
Quoted 5 lines
block/ioprio.c +2
-0+*/ +if (!capable (CAP_SYS_ADMIN ) && !capable (CAP_SYS_NICE ))return -EPERM ; fallthrough;/* rt has prio field too */ What exactly is above patch trying to fix?
It does not change control flow at all, and added comment is misleading.Quoted 8 lines
See the thread on the mailing list for what it does and why it is needed.
It does change the result when selinux is enabled.
thanks,
greg k-h
The case where we create a newer more fine grained capability which is a sub-cap of a broader capability like
CAP_SYS_ADMINis analogous. Seecheck_syslog_permissions()for instance.So I think a helper like
Quoted 8 lines
Quoted 7 lines
int capable_either_or(int cap1, int cap2) { if (has_capability_noaudit(current, cap1)) return 0; return capable(cap2); }might be worthwhile.
I proposed an early prototype at
https://patchwork.kernel.org/project/selinux/patch/[email protected]/
Quoted 3 lines
Sure, feel free to work on that and submit it, but for now, this change is needed.
I would argue this change is not necessary since the actual syscall still succeeds as this is only an informative avc denial message about a failed capability check. But this ship has sailed...
Quoted 3 lines
thanks,
greg k-h
Serge E. Hallyn
maintainerRe: [PATCH 5.10 130/154] block: Check ADMIN before NICE for IOPRIO_CLASS_RT
Quoted 54 lines · Christian Göttsche
Quoted 52 lines · Greg Kroah-Hartman
Quoted 50 lines · Serge E. Hallyn
Quoted 28 lines · Greg Kroah-Hartman
Quoted 18 lines · Jari Ruusu
Quoted 3 lines · Greg Kroah-Hartman
From: Alistair Delva <[email protected]>
commit
94c4b4fd25e6c3763941bdec3ad54f2204afa992upstream.[SNIP]
Quoted 13 lines
block/ioprio.c +6
-1@@ -69,7 +69,14 @@ int ioprio_check_cap(int ioprio)switch (class) {case IOPRIO_CLASS_RT : -if (!capable (CAP_SYS_NICE ) && !capable (CAP_SYS_ADMIN )) +/* +* Originally this only checked for CAP_SYS_ADMIN, +* which was implicitly allowed for pid 0 by security +* modules such as SELinux. Make sure we check +* CAP_SYS_ADMIN first to avoid a denial/avc for +* possibly missing CAP_SYS_NICE permission. Quoted 8 lines
block/ioprio.c int ioprio_check_cap(int ioprio) · line 82
Quoted 5 lines
block/ioprio.c +2
-0+*/ +if (!capable (CAP_SYS_ADMIN ) && !capable (CAP_SYS_NICE ))return -EPERM ; fallthrough;/* rt has prio field too */ What exactly is above patch trying to fix?
It does not change control flow at all, and added comment is misleading.Quoted 8 lines
See the thread on the mailing list for what it does and why it is needed.
It does change the result when selinux is enabled.
thanks,
greg k-h
The case where we create a newer more fine grained capability which is a sub-cap of a broader capability like
CAP_SYS_ADMINis analogous. Seecheck_syslog_permissions()for instance.So I think a helper like
int capable_either_or(int cap1, int cap2) { if (has_capability_noaudit(current, cap1)) return 0; return capable(cap2); }
Quoted 5 lines
Quoted 2 lines
Quoted 1 line
might be worthwhile.
I proposed an early prototype at
https://patchwork.kernel.org/project/selinux/patch/[email protected]/
I never saw this. Would you mind resending as a standalone patch?
(I do have comments, but this thread seems the wrong place)
Serge E. Hallyn
maintainerRe: [PATCH 5.10 130/154] block: Check ADMIN before NICE for IOPRIO_CLASS_RT
In reply to Greg Kroah-HartmanQuoted 51 lines · Greg Kroah-Hartman
Quoted 50 lines · Serge E. Hallyn
Quoted 28 lines · Greg Kroah-Hartman
Quoted 18 lines · Jari Ruusu
Quoted 3 lines · Greg Kroah-Hartman
From: Alistair Delva <[email protected]>
commit
94c4b4fd25e6c3763941bdec3ad54f2204afa992upstream.[SNIP]
Quoted 13 lines
block/ioprio.c +6
-1@@ -69,7 +69,14 @@ int ioprio_check_cap(int ioprio)switch (class) {case IOPRIO_CLASS_RT : -if (!capable (CAP_SYS_NICE ) && !capable (CAP_SYS_ADMIN )) +/* +* Originally this only checked for CAP_SYS_ADMIN, +* which was implicitly allowed for pid 0 by security +* modules such as SELinux. Make sure we check +* CAP_SYS_ADMIN first to avoid a denial/avc for +* possibly missing CAP_SYS_NICE permission. Quoted 8 lines
block/ioprio.c int ioprio_check_cap(int ioprio) · line 82
Quoted 5 lines
block/ioprio.c +2
-0+*/ +if (!capable (CAP_SYS_ADMIN ) && !capable (CAP_SYS_NICE ))return -EPERM ; fallthrough;/* rt has prio field too */ What exactly is above patch trying to fix?
It does not change control flow at all, and added comment is misleading.Quoted 8 lines
See the thread on the mailing list for what it does and why it is needed.
It does change the result when selinux is enabled.
thanks,
greg k-h
The case where we create a newer more fine grained capability which is a sub-cap of a broader capability like
CAP_SYS_ADMINis analogous. Seecheck_syslog_permissions()for instance.So I think a helper like
int capable_either_or(int cap1, int cap2) { if (has_capability_noaudit(current, cap1)) return 0; return capable(cap2); }
Quoted 4 lines
Quoted 1 line
might be worthwhile.
Sure, feel free to work on that and submit it, but for now, this change is needed.
Sorry I misread the subject and thought this was just a resubmission.
FWIW I had acked an earlier version of this.
-serge
Greg Kroah-Hartman
maintainerPATCH 131/154 KVM: nVMX: dont use vcpu->arch.efer when checking host state on nested state load
In reply to Greg Kroah-HartmanFrom: Maxim Levitsky <[email protected]>
commit af957eebfcc17433ee83ab85b1195a933ab5049c upstream.
When loading nested state, don't use check vcpu->arch.efer to get the L1 host's 64-bit vs. 32-bit state and don't check it for consistency with respect to VM_EXIT_HOST_ADDR_SPACE_SIZE, as register state in vCPU may be stale when KVM_SET_NESTED_STATE is called---and architecturally does not exist. When restoring L2 state in KVM, the CPU is placed in non-root where nested VMX code has no snapshot of L1 host state: VMX (conditionally) loads host state fields loaded on VM-exit, but they need not correspond to the state before entry. A simple case occurs in KVM itself, where the host RIP field points to vmx_vmexit rather than the instruction following vmlaunch/vmresume.
However, for the particular case of L1 being in 32- or 64-bit mode on entry, the exit controls can be treated instead as the source of truth regarding the state of L1 on entry, and can be used to check that vmcs12.VM_EXIT_HOST_ADDR_SPACE_SIZE matches vmcs12.HOST_EFER if vmcs12.VM_EXIT_LOAD_IA32_EFER is set. The consistency check on CPU EFER vs. vmcs12.VM_EXIT_HOST_ADDR_SPACE_SIZE, instead, happens only on VM-Enter. That's because, again, there's conceptually no "current" L1 EFER to check on KVM_SET_NESTED_STATE.
Message-Id: <[email protected]>
--- arch/x86/kvm/vmx/nested.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
arch/x86/kvm/vmx/nested.c +17 -5
@@ -2851,6 +2851,17 @@ static int nested_vmx_check_controls(strreturn 0 ; } +static int nested_vmx_check_address_space_size (struct kvm_vcpu *vcpu, +struct vmcs12 *vmcs12) +{ +#ifdef CONFIG_X86_64 +if (CC (!!(vmcs12->vm_exit_controls &VM_EXIT_HOST_ADDR_SPACE_SIZE ) != + !!(vcpu->arch.efer &EFER_LMA ))) +return -EINVAL ; +#endif +return 0 ; +} +static int nested_vmx_check_host_state (struct kvm_vcpu *vcpu,struct vmcs12 *vmcs12) {
@@ -2875,18 +2886,16 @@ static int nested_vmx_check_host_state(sreturn -EINVAL ;#ifdef CONFIG_X86_64 - ia32e = !!(vcpu->arch.efer &EFER_LMA ); + ia32e = !!(vmcs12->vm_exit_controls &VM_EXIT_HOST_ADDR_SPACE_SIZE );#else ia32e = false;#endif if (ia32e) { -if (CC (!(vmcs12->vm_exit_controls &VM_EXIT_HOST_ADDR_SPACE_SIZE )) || -CC (!(vmcs12->host_cr4 &X86_CR4_PAE ))) +if (CC (!(vmcs12->host_cr4 &X86_CR4_PAE )))return -EINVAL ; }else { -if (CC (vmcs12->vm_exit_controls &VM_EXIT_HOST_ADDR_SPACE_SIZE ) || -CC (vmcs12->vm_entry_controls &VM_ENTRY_IA32E_MODE ) || +if (CC (vmcs12->vm_entry_controls &VM_ENTRY_IA32E_MODE ) ||CC (vmcs12->host_cr4 &X86_CR4_PCIDE ) ||CC ((vmcs12->host_rip) >>32 ))return -EINVAL ;
@@ -3555,6 +3564,9 @@ static int nested_vmx_run(struct kvm_vcpif (nested_vmx_check_controls (vcpu, vmcs12))return nested_vmx_fail (vcpu,VMXERR_ENTRY_INVALID_CONTROL_FIELD ); +if (nested_vmx_check_address_space_size (vcpu, vmcs12)) +return nested_vmx_fail (vcpu,VMXERR_ENTRY_INVALID_HOST_STATE_FIELD ); +if (nested_vmx_check_host_state (vcpu, vmcs12))return nested_vmx_fail (vcpu,VMXERR_ENTRY_INVALID_HOST_STATE_FIELD );
Greg Kroah-Hartman
maintainerPATCH 132/154 udf: Fix crash after seekdir
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
commit a48fc69fe6588b48d878d69de223b91a386a7cb4 upstream.
udf_readdir() didn't validate the directory position it should start reading from. Thus when user uses lseek(2) on directory file descriptor it can trick udf_readdir() into reading from a position in the middle of directory entry which then upsets directory parsing code resulting in errors or even possible kernel crashes. Similarly when the directory is modified between two readdir calls, the directory position need not be valid anymore.
Add code to validate current offset in the directory. This is actually rather expensive for UDF as we need to read from the beginning of the directory and parse all directory entries. This is because in UDF a directory is just a stream of data containing directory entries and since file names are fully under user's control we cannot depend on detecting magic numbers and checksums in the header of directory entry as a malicious attacker could fake them. We skip this step if we detect that nothing changed since the last readdir call.
--- fs/udf/dir.c | 32 ++++++++++++++++++++++++++++++-- fs/udf/namei.c | 3 +++ fs/udf/super.c | 2 ++ 3 files changed, 35 insertions(+), 2 deletions(-)
fs/udf/dir.c +30 -2
@@ -31,6 +31,7 @@#include <linux/mm.h> #include <linux/slab.h> #include <linux/bio.h> +#include <linux/iversion.h> #include "udf_i.h" #include "udf_sb.h"
@@ -44,7 +45,7 @@ static int udf_readdir(struct file *filestruct fileIdentDesc *fi =NULL ;struct fileIdentDesc cfi;udf_pblk_t block, iblock; -loff_t nf_pos; +loff_t nf_pos, emit_pos =0 ;int flen;unsigned char *fname =NULL , *copy_name =NULL ;unsigned char *nameptr;
@@ -58,6 +59,7 @@ static int udf_readdir(struct file *fileint i, num, ret =0 ;struct extent_position epos = {NULL ,0 , {0 ,0 } };struct super_block *sb = dir->i_sb; +bool pos_valid = false;if (ctx->pos ==0 ) {if (!dir_emit_dot (file, ctx))
@@ -68,6 +70,21 @@ static int udf_readdir(struct file *fileif (nf_pos >= size) goto out; +/* +* Something changed since last readdir (either lseek was called or dir +* changed)? We need to verify the position correctly points at the +* beginning of some dir entry so that the directory parsing code does +* not get confused. Since UDF does not have any reliable way of +* identifying beginning of dir entry (names are under user control), +* we need to scan the directory from the beginning. +*/ +if (!inode_eq_iversion (dir, file->f_version)) { + emit_pos = nf_pos; + nf_pos =0 ; + }else { + pos_valid = true; + } + fname =kmalloc (UDF_NAME_LEN ,GFP_NOFS );if (!fname) { ret = -ENOMEM ;
@@ -123,13 +140,21 @@ static int udf_readdir(struct file *filewhile (nf_pos < size) {struct kernel_lb_addr tloc; +loff_t cur_pos = nf_pos; - ctx->pos = (nf_pos >>2 ) +1 ; +/* Update file position only if we got past the current one */ +if (nf_pos >= emit_pos) { + ctx->pos = (nf_pos >>2 ) +1 ; + pos_valid = true; + } fi =udf_fileident_read (dir, &nf_pos, &fibh, &cfi, &epos, &eloc, &elen, &offset);if (!fi) goto out; +/* Still not at offset where user asked us to read from? */ +if (cur_pos < emit_pos) +continue ; liu =le16_to_cpu (cfi.lengthOfImpUse); lfi = cfi.lengthFileIdent;
@@ -187,8 +212,11 @@ static int udf_readdir(struct file *file }/* end while */ ctx->pos = (nf_pos >>2 ) +1 ; + pos_valid = true; out: +if (pos_valid) + file->f_version =inode_query_iversion (dir);if (fibh.sbh != fibh.ebh)brelse (fibh.ebh);brelse (fibh.sbh);
fs/udf/namei.c +3 -0
@@ -30,6 +30,7 @@#include <linux/sched.h> #include <linux/crc-itu-t.h> #include <linux/exportfs.h> +#include <linux/iversion.h> static inline int udf_match (int len1,const unsigned char *name1,int len2,const unsigned char *name2)
@@ -135,6 +136,8 @@ int udf_write_fi(struct inode *inode, stmark_buffer_dirty_inode (fibh->ebh, inode);mark_buffer_dirty_inode (fibh->sbh, inode); } +inode_inc_iversion (inode); +return 0 ; }
fs/udf/super.c +2 -0
@@ -57,6 +57,7 @@#include <linux/crc-itu-t.h> #include <linux/log2.h> #include <asm/byteorder.h> +#include <linux/iversion.h> #include "udf_sb.h" #include "udf_i.h"
@@ -149,6 +150,7 @@ static struct inode *udf_alloc_inode(strinit_rwsem (&ei->i_data_sem); ei->cached_extent.lstart =-1 ;spin_lock_init (&ei->i_extent_cache_lock); +inode_set_iversion (&ei->vfs_inode,1 );return &ei->vfs_inode; }
Greg Kroah-Hartman
maintainerPATCH 133/154 net: stmmac: socfpga: add runtime suspend/resume callback for stratix10 platform
In reply to Greg Kroah-HartmanFrom: Meng Li <[email protected]>
commit 9119570039481d56350af1c636f040fb300b8cf3 upstream.
According to upstream commit 5ec55823438e("net: stmmac:
add clocks management for gmac driver"), it improve clocks management for stmmac driver. So, it is necessary to implement the runtime callback in dwmac-socfpga driver because it doesn't use the common stmmac_pltfr_pm_ops instance. Otherwise, clocks are not disabled when system enters suspend status.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 24 ++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c +22 -2
@@ -485,8 +485,28 @@ static int socfpga_dwmac_resume(struct d }#endif /* CONFIG_PM_SLEEP */ -static SIMPLE_DEV_PM_OPS(socfpga_dwmac_pm_ops, stmmac_suspend, - socfpga_dwmac_resume); +static int __maybe_unused socfpga_dwmac_runtime_suspend (struct device *dev) +{ +struct net_device *ndev =dev_get_drvdata (dev); +struct stmmac_priv *priv =netdev_priv (ndev); + +stmmac_bus_clks_config (priv, false); + +return 0 ; +} + +static int __maybe_unused socfpga_dwmac_runtime_resume (struct device *dev) +{ +struct net_device *ndev =dev_get_drvdata (dev); +struct stmmac_priv *priv =netdev_priv (ndev); + +return stmmac_bus_clks_config (priv, true); +} + +static const struct dev_pm_ops socfpga_dwmac_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(stmmac_suspend, socfpga_dwmac_resume) +SET_RUNTIME_PM_OPS (socfpga_dwmac_runtime_suspend, socfpga_dwmac_runtime_resume,NULL ) +};static const struct socfpga_dwmac_ops socfpga_gen5_ops = { .set_phy_mode = socfpga_gen5_set_phy_mode,
Greg Kroah-Hartman
maintainerPATCH 134/154 btrfs: fix memory ordering between normal and ordered work functions
In reply to Greg Kroah-HartmanFrom: Nikolay Borisov <[email protected]>
commit 45da9c1767ac31857df572f0a909fbe88fd5a7e9 upstream.
Ordered work functions aren't guaranteed to be handled by the same thread which executed the normal work functions. The only way execution between normal/ordered functions is synchronized is via the WORK_DONE_BIT, unfortunately the used bitops don't guarantee any ordering whatsoever.
This manifested as seemingly inexplicable crashes on ARM64, where async_chunk::inode is seen as non-null in async_cow_submit which causes submit_compressed_extents to be called and crash occurs because async_chunk::inode suddenly became NULL. The call trace was similar to:
pc : submit_compressed_extents+0x38/0x3d0
lr : async_cow_submit+0x50/0xd0
sp : ffff800015d4bc20 <registers omitted for brevity>
Call trace:
submit_compressed_extents+0x38/0x3d0
async_cow_submit+0x50/0xd0
run_ordered_work+0xc8/0x280
btrfs_work_helper+0x98/0x250
process_one_work+0x1f0/0x4ac
worker_thread+0x188/0x504
kthread+0x110/0x114
ret_from_fork+0x10/0x18Fix this by adding respective barrier calls which ensure that all accesses preceding setting of WORK_DONE_BIT are strictly ordered before setting the flag. At the same time add a read barrier after reading of WORK_DONE_BIT in run_ordered_work which ensures all subsequent loads would be strictly ordered after reading the bit. This in turn ensures are all accesses before WORK_DONE_BIT are going to be strictly ordered before any access that can occur in ordered_func.
--- fs/btrfs/async-thread.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
fs/btrfs/async-thread.c +14 -0
@@ -234,6 +234,13 @@ static void run_ordered_work(struct __bt ordered_list);if (!test_bit (WORK_DONE_BIT , &work->flags))break ; +/* +* Orders all subsequent loads after reading WORK_DONE_BIT, +* paired with the smp_mb__before_atomic in btrfs_work_helper +* this guarantees that the ordered function will see all +* updates from ordinary work function. +*/ +smp_rmb ();/* * we are going to call the ordered done function, but
@@ -317,6 +324,13 @@ static void btrfs_work_helper(struct worthresh_exec_hook (wq); work->func (work);if (need_order) { +/* +* Ensures all memory accesses done in the work function are +* ordered before setting the WORK_DONE_BIT. Ensuring the thread +* which is going to executed the ordered work sees them. +* Pairs with the smp_rmb in run_ordered_work. +*/ +smp_mb__before_atomic ();set_bit (WORK_DONE_BIT , &work->flags);run_ordered_work (wq, work); }else {
Greg Kroah-Hartman
maintainerPATCH 135/154 parisc/sticon: fix reverse colors
In reply to Greg Kroah-HartmanFrom: Sven Schnelle <[email protected]>
commit bec05f33ebc1006899c6d3e59a00c58881fe7626 upstream.
sticon_build_attr() checked the reverse argument and flipped background and foreground color, but returned the non-reverse value afterwards. Fix this and also add two local variables for foreground and background color to make the code easier to read.
--- drivers/video/console/sticon.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/video/console/sticon.c +6 -6
@@ -332,13 +332,13 @@ static u8 sticon_build_attr(struct vc_da bool blink, bool underline, bool reverse, bool italic) { - u8 attr = ((color & 0x70) >> 1) | ((color & 7)); + u8 fg = color & 7; +u8 bg = (color &0x70 ) >>4 ; -if (reverse) { - color = ((color >>3 ) &0x7 ) | ((color &0x7 ) <<3 ); - } - -return attr; +if (reverse) +return (fg <<3 ) | bg; +else +return (bg <<3 ) | fg; }static void sticon_invert_region (struct vc_data *conp,u16 *p,int count)
Greg Kroah-Hartman
maintainerPATCH 136/154 cfg80211: call cfg80211_stop_ap when switch from P2P_GO type
In reply to Greg Kroah-HartmanFrom: Nguyen Dinh Phi <[email protected]>
commit 563fbefed46ae4c1f70cffb8eb54c02df480b2c2 upstream.
If the userspace tools switch from NL80211_IFTYPE_P2P_GO to NL80211_IFTYPE_ADHOC via send_msg(NL80211_CMD_SET_INTERFACE), it does not call the cleanup cfg80211_stop_ap(), this leads to the initialization of in-use data. For example, this path re-init the sdata->assigned_chanctx_list while it is still an element of assigned_vifs list, and makes that linked list corrupt.
--- net/wireless/util.c | 1 + 1 file changed, 1 insertion(+)
net/wireless/util.c +1 -0
@@ -1044,6 +1044,7 @@ int cfg80211_change_iface(struct cfg8021switch (otype) {case NL80211_IFTYPE_AP : +case NL80211_IFTYPE_P2P_GO :cfg80211_stop_ap (rdev, dev, true);break ;case NL80211_IFTYPE_ADHOC :
Greg Kroah-Hartman
maintainerPATCH 137/154 drm/amd/display: Update swizzle mode enums
In reply to Greg Kroah-HartmanFrom: Alvin Lee <[email protected]>
commit 58065a1e524de30df9a2d8214661d5d7eed0a2d9 upstream.
[Why]
Swizzle mode enum for DC_SW_VAR_R_X was existing, but not mapped correctly.
[How]
Update mapping and conversion for DC_SW_VAR_R_X.
--- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 4 +++- drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +3 -1
@@ -1852,7 +1852,9 @@ static void swizzle_to_dml_params(case DC_SW_VAR_D_X : *sw_mode = dm_sw_var_d_x;break ; - +case DC_SW_VAR_R_X : + *sw_mode = dm_sw_var_r_x; +break ;default :ASSERT (0 );/* Not supported */ break ;
drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h +2 -2
@@ -80,11 +80,11 @@ enum dm_swizzle_mode { dm_sw_SPARE_13 =24 , dm_sw_64kb_s_x =25 , dm_sw_64kb_d_x =26 , - dm_sw_SPARE_14 =27 , + dm_sw_64kb_r_x =27 , dm_sw_SPARE_15 =28 , dm_sw_var_s_x =29 , dm_sw_var_d_x =30 , - dm_sw_64kb_r_x, + dm_sw_var_r_x =31 , dm_sw_gfx7_2d_thin_l_vp, dm_sw_gfx7_2d_thin_gl, };
Greg Kroah-Hartman
maintainerPATCH 138/154 drm/udl: fix control-message timeout
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
commit 5591c8f79db1729d9c5ac7f5b4d3a5c26e262d93 upstream.
USB control-message timeouts are specified in milliseconds and should specifically not vary with CONFIG_HZ.
--- drivers/gpu/drm/udl/udl_connector.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/udl/udl_connector.c +1 -1
@@ -30,7 +30,7 @@ static int udl_get_edid_block(void *data ret =usb_control_msg (udl->udev,usb_rcvctrlpipe (udl->udev,0 ), (0x02 ), (0x80 | (0x02 <<5 )), bval, -0xA1 , read_buff,2 ,HZ ); +0xA1 , read_buff,2 ,1000 );if (ret <1 ) {DRM_ERROR ("Read EDID byte %d failed err %x\n" , i, ret);kfree (read_buff);
Greg Kroah-Hartman
maintainerPATCH 139/154 drm/nouveau: Add a dedicated mutex for the clients list
In reply to Greg Kroah-HartmanFrom: Jeremy Cline <[email protected]>
commit abae9164a421bc4a41a3769f01ebcd1f9d955e0e upstream.
Rather than protecting the nouveau_drm clients list with the lock within the "client" nouveau_cli, add a dedicated lock to serialize access to the list. This is both clearer and necessary to avoid lockdep being upset with us when we need to iterate through all the clients in the list and potentially lock their mutex, which is the same class as the lock protecting the entire list.
--- drivers/gpu/drm/nouveau/nouveau_drm.c | 10 ++++++---- drivers/gpu/drm/nouveau/nouveau_drv.h | 5 +++++ 2 files changed, 11 insertions(+), 4 deletions(-)
drivers/gpu/drm/nouveau/nouveau_drm.c +6 -4
@@ -557,6 +557,7 @@ nouveau_drm_device_init(struct drm_devicnvkm_dbgopt (nouveau_debug,"DRM" );INIT_LIST_HEAD (&drm->clients); +mutex_init (&drm->clients_lock);spin_lock_init (&drm->tile.lock);/* workaround an odd issue on nvc1 by disabling the device's
@@ -654,6 +655,7 @@ nouveau_drm_device_fini(struct drm_devicnouveau_cli_fini (&drm->client);nouveau_cli_fini (&drm->master);nvif_parent_dtor (&drm->parent); +mutex_destroy (&drm->clients_lock);kfree (drm); }
@@ -1086,9 +1088,9 @@ nouveau_drm_open(struct drm_device *dev, fpriv->driver_priv = cli; -mutex_lock (&drm->client.mutex); +mutex_lock (&drm->clients_lock);list_add (&cli->head, &drm->clients); -mutex_unlock (&drm->client.mutex); +mutex_unlock (&drm->clients_lock); done:if (ret && cli) {
@@ -1114,9 +1116,9 @@ nouveau_drm_postclose(struct drm_devicenouveau_abi16_fini (cli->abi16);mutex_unlock (&cli->mutex); -mutex_lock (&drm->client.mutex); +mutex_lock (&drm->clients_lock);list_del (&cli->head); -mutex_unlock (&drm->client.mutex); +mutex_unlock (&drm->clients_lock);nouveau_cli_fini (cli);kfree (cli);
drivers/gpu/drm/nouveau/nouveau_drv.h +5 -0
@@ -142,6 +142,11 @@ struct nouveau_drm {struct list_head clients; +/** +* @clients_lock: Protects access to the @clients list of &struct nouveau_cli. +*/ +struct mutex clients_lock; +u8 old_pm_cap;struct {
Greg Kroah-Hartman
maintainerPATCH 140/154 drm/nouveau: use drm_dev_unplug() during device removal
In reply to Greg Kroah-HartmanFrom: Jeremy Cline <[email protected]>
commit aff2299e0d81b26304ccc6a1ec0170e437f38efc upstream.
Nouveau does not currently support hot-unplugging, but it still makes sense to switch from drm_dev_unregister() to drm_dev_unplug(). drm_dev_unplug() calls drm_dev_unregister() after marking the device as unplugged, but only after any device critical sections are finished.
Since nouveau isn't using drm_dev_enter() and drm_dev_exit(), there are no critical sections so this is nearly functionally equivalent. However, the DRM layer does check to see if the device is unplugged, and if it is returns appropriate error codes.
In the future nouveau can add critical sections in order to truly support hot-unplugging.
--- drivers/gpu/drm/nouveau/nouveau_drm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nouveau_drm.c +1 -1
@@ -794,7 +794,7 @@ nouveau_drm_device_remove(struct drm_devstruct nvkm_client *client;struct nvkm_device *device; -drm_dev_unregister (dev); +drm_dev_unplug (dev); dev->irq_enabled = false; client =nvxx_client (&drm->client.base);
Greg Kroah-Hartman
maintainerPATCH 141/154 drm/nouveau: clean up all clients on device removal
In reply to Greg Kroah-HartmanFrom: Jeremy Cline <[email protected]>
commit f55aaf63bde0d0336c3823bb3713bd4a464abbcf upstream.
The postclose handler can run after the device has been removed (or the driver has been unbound) since userspace clients are free to hold the file open as long as they want. Because the device removal callback frees the entire nouveau_drm structure, any reference to it in the postclose handler will result in a use-after-free.
To reproduce this, one must simply open the device file, unbind the driver (or physically remove the device), and then close the device file. This was found and can be reproduced easily with the IGT core_hotunplug tests.
To avoid this, all clients are cleaned up in the device finalization rather than deferring it to the postclose handler, and the postclose handler is protected by a critical section which ensures the drm_dev_unplug() and the postclose handler won't race.
This is not an ideal fix, since as I understand the proposed plan for the kernel<->userspace interface for hotplug support, destroying the client before the file is closed will cause problems. However, I believe to properly fix this issue, the lifetime of the nouveau_drm structure needs to be extended to match the drm_device, and this proved to be a rather invasive change. Thus, I've broken this out so the fix can be easily backported.
This fixes with the two previous commits CVE-2020-27820 (Karol).
--- drivers/gpu/drm/nouveau/nouveau_drm.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
drivers/gpu/drm/nouveau/nouveau_drm.c +30 -0
@@ -628,6 +628,7 @@ fail_alloc:static void nouveau_drm_device_fini (struct drm_device *dev) { +struct nouveau_cli *cli, *temp_cli;struct nouveau_drm *drm =nouveau_drm (dev);if (nouveau_pmops_runtime ()) {
@@ -652,6 +653,24 @@ nouveau_drm_device_fini(struct drm_devicnouveau_ttm_fini (drm);nouveau_vga_fini (drm); +/* +* There may be existing clients from as-yet unclosed files. For now, +* clean them up here rather than deferring until the file is closed, +* but this likely not correct if we want to support hot-unplugging +* properly. +*/ +mutex_lock (&drm->clients_lock); +list_for_each_entry_safe (cli, temp_cli, &drm->clients, head) { +list_del (&cli->head); +mutex_lock (&cli->mutex); +if (cli->abi16) +nouveau_abi16_fini (cli->abi16); +mutex_unlock (&cli->mutex); +nouveau_cli_fini (cli); +kfree (cli); + } +mutex_unlock (&drm->clients_lock); +nouveau_cli_fini (&drm->client);nouveau_cli_fini (&drm->master);nvif_parent_dtor (&drm->parent);
@@ -1108,6 +1127,16 @@ nouveau_drm_postclose(struct drm_device {struct nouveau_cli *cli =nouveau_cli (fpriv);struct nouveau_drm *drm =nouveau_drm (dev); +int dev_index; + +/* +* The device is gone, and as it currently stands all clients are +* cleaned up in the removal codepath. In the future this may change +* so that we can support hot-unplugging, but for now we immediately +* return to avoid a double-free situation. +*/ +if (!drm_dev_enter (dev, &dev_index)) +return ;pm_runtime_get_sync (dev->dev);
@@ -1124,6 +1153,7 @@ nouveau_drm_postclose(struct drm_devicekfree (cli);pm_runtime_mark_last_busy (dev->dev);pm_runtime_put_autosuspend (dev->dev); +drm_dev_exit (dev_index); } static const struct drm_ioctl_desc
Greg Kroah-Hartman
maintainerPATCH 142/154 drm/i915/dp: Ensure sink rate values are always valid
In reply to Greg Kroah-HartmanFrom: Imre Deak <[email protected]>
commit 6c34bd4532a3f39952952ddc102737595729afc4 upstream.
Atm, there are no sink rate values set for DP (vs. eDP) sinks until the DPCD capabilities are successfully read from the sink. During this time intel_dp->num_common_rates is 0 which can lead to a
intel_dp->common_rates[-1] (*)
access, which is an undefined behaviour, in the following cases:
- In intel_dp_sync_state(), if the encoder is enabled without a sink connected to the encoder's connector (BIOS enabled a monitor, but the user unplugged the monitor until the driver loaded).
- In intel_dp_sync_state() if the encoder is enabled with a sink connected, but for some reason the DPCD read has failed.
- In intel_dp_compute_link_config() if modesetting a connector without a sink connected on it.
- In intel_dp_compute_link_config() if modesetting a connector with a a sink connected on it, but before probing the connector first.
To avoid the (*) access in all the above cases, make sure that the sink rate table - and hence the common rate table - is always valid, by setting a default minimum sink rate when registering the connector before anything could use it.
I also considered setting all the DP link rates by default, so that modesetting with higher resolution modes also succeeds in the last two cases above. However in case a sink is not connected that would stop working after the first modeset, due to the LT fallback logic. So this would need more work, beyond the scope of this fix.
As I mentioned in the previous patch, I don't think the issue this patch fixes is user visible, however it is an undefined behaviour by definition and triggers a BUG() in CONFIG_UBSAN builds, hence CC:stable.
v2: Clear the default sink rates, before initializing these for eDP.
--- drivers/gpu/drm/i915/display/intel_dp.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/gpu/drm/i915/display/intel_dp.c +11 -0
@@ -154,6 +154,12 @@ static void vlv_steal_power_sequencer(st enum pipe pipe);static void intel_dp_unset_edid (struct intel_dp *intel_dp); +static void intel_dp_set_default_sink_rates (struct intel_dp *intel_dp) +{ + intel_dp->sink_rates[0 ] =162000 ; + intel_dp->num_sink_rates =1 ; +} +/* update sink rates from dpcd */ static void intel_dp_set_sink_rates (struct intel_dp *intel_dp) {
@@ -4678,6 +4684,9 @@ intel_edp_init_dpcd(struct intel_dp *int*/ intel_psr_init_dpcd (intel_dp); +/* Clear the default sink rates */ + intel_dp->num_sink_rates =0 ; +/* Read the eDP 1.4+ supported link rates. */ if (intel_dp->edp_dpcd[0 ] >=DP_EDP_14 ) {__le16 sink_rates[DP_MAX_SUPPORTED_RATES ];
@@ -7779,6 +7788,8 @@ intel_dp_init_connector(struct intel_digreturn false;intel_dp_set_source_rates (intel_dp); +intel_dp_set_default_sink_rates (intel_dp); +intel_dp_set_common_rates (intel_dp); intel_dp->reset_link_params = true; intel_dp->pps_pipe =INVALID_PIPE ;
Greg Kroah-Hartman
maintainerPATCH 143/154 drm/amdgpu: fix set scaling mode Full/Full aspect/Center not works on vga and dvi connectors
In reply to Greg Kroah-HartmanFrom: hongao <[email protected]>
commit bf552083916a7f8800477b5986940d1c9a31b953 upstream.
amdgpu_connector_vga_get_modes missed function amdgpu_get_native_mode which assign amdgpu_encoder->native_mode with *preferred_mode result in amdgpu_encoder->native_mode.clock always be 0. That will cause amdgpu_connector_set_property returned early on:
if ((rmx_type != DRM_MODE_SCALE_NONE) &&
(amdgpu_encoder->native_mode.clock == 0))
when we try to set scaling mode Full/Full aspect/Center.
Add the missing function to amdgpu_connector_vga_get_mode can fix this. It also works on dvi connectors because amdgpu_connector_dvi_helper_funcs.get_mode use the same method.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +1 -0
@@ -827,6 +827,7 @@ static int amdgpu_connector_vga_get_modeamdgpu_connector_get_edid (connector); ret =amdgpu_connector_ddc_get_modes (connector); +amdgpu_get_native_mode (connector);return ret; }
Greg Kroah-Hartman
maintainerPATCH 144/154 scsi: ufs: core: Fix task management completion
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit f5ef336fd2e4c36dedae4e7ca66cf5349d6fda62 upstream.
The UFS driver uses blk_mq_tagset_busy_iter() when identifying task management requests to complete, however blk_mq_tagset_busy_iter() doesn't work.
blk_mq_tagset_busy_iter() only iterates requests dispatched by the block layer. That appears as if it might have started since commit 37f4a24c2469 ("blk-mq: centralise related handling into blk_mq_get_driver_tag") which removed 'data->hctx->tags->rqs[rq->tag] = rq' from blk_mq_rq_ctx_init() which gets called:
blk_get_request
blk_mq_alloc_request
__blk_mq_alloc_request
blk_mq_rq_ctx_init
Since UFS task management requests are not dispatched by the block layer, hctx->tags->rqs[rq->tag] remains NULL, and since blk_mq_tagset_busy_iter() relies on finding requests using hctx->tags->rqs[rq->tag], UFS task management requests are never found by blk_mq_tagset_busy_iter().
By using blk_mq_tagset_busy_iter(), the UFS driver was relying on internal details of the block layer, which was fragile and subsequently got broken. Fix by removing the use of blk_mq_tagset_busy_iter() and having the driver keep track of task management requests.
--- drivers/scsi/ufs/ufshcd.c | 52 ++++++++++++++++++++-------------------------- drivers/scsi/ufs/ufshcd.h | 1 2 files changed, 24 insertions(+), 29 deletions(-)
drivers/scsi/ufs/ufshcd.c +23 -29
@@ -6099,27 +6099,6 @@ static irqreturn_t ufshcd_check_errors(sreturn retval; } -struct ctm_info { -struct ufs_hba *hba; -unsigned long pending; -unsigned int ncpl; -}; - -static bool ufshcd_compl_tm (struct request *req,void *priv,bool reserved) -{ -struct ctm_info *const ci = priv; -struct completion *c; - -WARN_ON_ONCE (reserved); -if (test_bit (req->tag, &ci->pending)) -return true; - ci->ncpl++; - c = req->end_io_data; -if (c) -complete (c); -return true; -} -/** * ufshcd_tmc_handler - handle task management function completion * @hba: per adapter instance
@@ -6130,14 +6109,22 @@ static bool ufshcd_compl_tm(struct reque*/ static irqreturn_t ufshcd_tmc_handler (struct ufs_hba *hba) { -struct request_queue *q = hba->tmf_queue; -struct ctm_info ci = { - .hba = hba, - .pending =ufshcd_readl (hba,REG_UTP_TASK_REQ_DOOR_BELL ), - }; +unsigned long pending, issued; +irqreturn_t ret =IRQ_NONE ; +int tag; + + pending =ufshcd_readl (hba,REG_UTP_TASK_REQ_DOOR_BELL ); + + issued = hba->outstanding_tasks & ~pending; +for_each_set_bit (tag, &issued, hba->nutmrs) { +struct request *req = hba->tmf_rqs[tag]; +struct completion *c = req->end_io_data; -blk_mq_tagset_busy_iter (q->tag_set, ufshcd_compl_tm, &ci); -return ci.ncpl ?IRQ_HANDLED :IRQ_NONE ; +complete (c); + ret =IRQ_HANDLED ; + } + +return ret; }/**
@@ -6267,9 +6254,9 @@ static int __ufshcd_issue_tm_cmd(structufshcd_hold (hba, false);spin_lock_irqsave (host->host_lock, flags); -blk_mq_start_request (req); task_tag = req->tag; + hba->tmf_rqs[req->tag] = req; treq->req_header.dword_0 |=cpu_to_be32 (task_tag);memcpy (hba->utmrdl_base_addr + task_tag, treq,sizeof (*treq));
@@ -6313,6 +6300,7 @@ static int __ufshcd_issue_tm_cmd(struct }spin_lock_irqsave (hba->host->host_lock, flags); + hba->tmf_rqs[req->tag] =NULL ;__clear_bit (task_tag, &hba->outstanding_tasks);spin_unlock_irqrestore (hba->host->host_lock, flags);
@@ -9235,6 +9223,12 @@ int ufshcd_init(struct ufs_hba *hba, voi err =PTR_ERR (hba->tmf_queue); goto free_tmf_tag_set; } + hba->tmf_rqs =devm_kcalloc (hba->dev, hba->nutmrs, +sizeof (*hba->tmf_rqs),GFP_KERNEL ); +if (!hba->tmf_rqs) { + err = -ENOMEM ; + goto free_tmf_queue; + }/* Reset the attached device */ ufshcd_vops_device_reset (hba);
drivers/scsi/ufs/ufshcd.h +1 -0
@@ -734,6 +734,7 @@ struct ufs_hba {struct blk_mq_tag_set tmf_tag_set;struct request_queue *tmf_queue; +struct request **tmf_rqs;struct uic_command *active_uic_cmd;struct mutex uic_cmd_mutex;
Greg Kroah-Hartman
maintainerPATCH 145/154 scsi: ufs: core: Fix task management completion timeout race
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit 886fe2915cce6658b0fc19e64b82879325de61ea upstream.
__ufshcd_issue_tm_cmd() clears req->end_io_data after timing out, which races with the completion function ufshcd_tmc_handler() which expects req->end_io_data to have a value.
Note __ufshcd_issue_tm_cmd() and ufshcd_tmc_handler() are already synchronized using hba->tmf_rqs and hba->outstanding_tasks under the host_lock spinlock.
It is also not necessary (nor typical) to clear req->end_io_data because the block layer does it before allocating out requests e.g. via blk_get_request().
So fix by not clearing it.
--- drivers/scsi/ufs/ufshcd.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/scsi/ufs/ufshcd.c +0 -5
@@ -6280,11 +6280,6 @@ static int __ufshcd_issue_tm_cmd(struct err =wait_for_completion_io_timeout (&wait,msecs_to_jiffies (TM_CMD_TIMEOUT ));if (!err) { -/* -* Make sure that ufshcd_compl_tm() does not trigger a -* use-after-free. -*/ - req->end_io_data =NULL ;ufshcd_add_tm_upiu_trace (hba, task_tag,"tm_complete_err" );dev_err (hba->dev,"%s: task management cmd 0x%.2x timed-out\n" , __func__, tm_function);
Greg Kroah-Hartman
maintainerPATCH 146/154 hugetlbfs: flush TLBs correctly after huge_pmd_unshare
In reply to Greg Kroah-HartmanFrom: Nadav Amit <[email protected]>
commit a4a118f2eead1d6c49e00765de89878288d4b890 upstream.
When __unmap_hugepage_range() calls to huge_pmd_unshare() succeed, a TLB flush is missing. This TLB flush must be performed before releasing the i_mmap_rwsem, in order to prevent an unshared PMDs page from being released and reused before the TLB flush took place.
Arguably, a comprehensive solution would use mmu_gather interface to batch the TLB flushes and the PMDs page release, however it is not an easy solution: (1) try_to_unmap_one() and try_to_migrate_one() also call huge_pmd_unshare() and they cannot use the mmu_gather interface; and (2) deferring the release of the page reference for the PMDs page until after i_mmap_rwsem is dropeed can confuse huge_pmd_unshare() into thinking PMDs are shared when they are not.
Fix __unmap_hugepage_range() by adding the missing TLB flush, and forcing a flush when unshare is successful.
--- mm/hugetlb.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
mm/hugetlb.c +19 -4
@@ -3913,6 +3913,7 @@ void __unmap_hugepage_range(struct mmu_gstruct hstate *h =hstate_vma (vma);unsigned long sz =huge_page_size (h);struct mmu_notifier_range range; +bool force_flush = false;WARN_ON (!is_vm_hugetlb_page (vma));BUG_ON (start & ~huge_page_mask (h));
@@ -3941,10 +3942,8 @@ void __unmap_hugepage_range(struct mmu_g ptl =huge_pte_lock (h, mm, ptep);if (huge_pmd_unshare (mm, vma, &address, ptep)) {spin_unlock (ptl); -/* -* We just unmapped a page of PMDs by clearing a PUD. -* The caller's TLB flush range should cover this area. -*/ +tlb_flush_pmd_range (tlb, address &PUD_MASK ,PUD_SIZE ); + force_flush = true;continue ; }
@@ -4001,6 +4000,22 @@ void __unmap_hugepage_range(struct mmu_g }mmu_notifier_invalidate_range_end (&range);tlb_end_vma (tlb, vma); + +/* +* If we unshared PMDs, the TLB flush was not recorded in mmu_gather. We +* could defer the flush until now, since by holding i_mmap_rwsem we +* guaranteed that the last refernece would not be dropped. But we must +* do the flushing before we return, as otherwise i_mmap_rwsem will be +* dropped and the last reference to the shared PMDs page might be +* dropped as well. +* +* In theory we could defer the freeing of the PMD pages as well, but +* huge_pmd_unshare() relies on the exact page_count for the PMD page to +* detect sharing, so we cannot defer the release of the page either. +* Instead, do flush now. +*/ +if (force_flush) +tlb_flush_mmu_tlbonly (tlb); } void __unmap_hugepage_range_final(struct mmu_gather *tlb,
Greg Kroah-Hartman
maintainerPATCH 147/154 RDMA/netlink: Add __maybe_unused to static inline in C file
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
commit 83dde7498fefeb920b1def317421262317d178e5 upstream.
Like other commits in the tree add __maybe_unused to a static inline in a C file because some clang compilers will complain about unused code:
Quoted 1 line
Quoted 1 line
drivers/infiniband/core/nldev.c:2543:1: warning: unused function '__chk_RDMA_NL_NLDEV'
MODULE_ALIAS_RDMA_NETLINK(RDMA_NL_NLDEV, 5); ^
--- include/rdma/rdma_netlink.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/rdma/rdma_netlink.h +1 -1
@@ -30,7 +30,7 @@ enum rdma_nl_flags {* constant as well and the compiler checks they are the same. */ #define MODULE_ALIAS_RDMA_NETLINK (_index, _val) \ - static inline void __chk_##_index(void) \ + static inline void __maybe_unused __chk_##_index(void) \ { \ BUILD_BUG_ON(_index != _val); \ } \
Greg Kroah-Hartman
maintainerPATCH 148/154 selinux: fix NULL-pointer dereference when hashtab allocation fails
In reply to Greg Kroah-HartmanFrom: Ondrej Mosnacek <[email protected]>
commit dc27f3c5d10c58069672215787a96b4fae01818b upstream.
When the hash table slot array allocation fails in hashtab_init(), h->size is left initialized with a non-zero value, but the h->htable pointer is NULL. This may then cause a NULL pointer dereference, since the policydb code relies on the assumption that even after a failed hashtab_init(), hashtab_map() and hashtab_destroy() can be safely called on it. Yet, these detect an empty hashtab only by looking at the size.
Fix this by making sure that hashtab_init() always leaves behind a valid empty hashtab when the allocation fails.
--- security/selinux/ss/hashtab.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
security/selinux/ss/hashtab.c +12 -5
@@ -30,13 +30,20 @@ static u32 hashtab_compute_size(u32 nel)int hashtab_init (struct hashtab *h,u32 nel_hint) { - h->size =hashtab_compute_size (nel_hint); +u32 size =hashtab_compute_size (nel_hint); + +/* should already be zeroed, but better be safe */ h->nel =0 ; -if (!h->size) -return 0 ; + h->size =0 ; + h->htable =NULL ; - h->htable =kcalloc (h->size,sizeof (*h->htable),GFP_KERNEL ); -return h->htable ?0 : -ENOMEM ; +if (size) { + h->htable =kcalloc (size,sizeof (*h->htable),GFP_KERNEL ); +if (!h->htable) +return -ENOMEM ; + h->size = size; + } +return 0 ; } int __hashtab_insert(struct hashtab *h, struct hashtab_node **dst,