5.10.9-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 5.10.9-rc1 review
This is the start of the stable review cycle for the 5.10.9 release. There are 152 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 Wed, 20 Jan 2021 11:33:23 +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.9-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.9-rc1
Dinghao Liu <[email protected]>
netfilter: nf_nat: Fix memleak in nf_nat_init
Jesper Dangaard Brouer <[email protected]>
netfilter: conntrack: fix reading nf_conntrack_buckets
Geert Uytterhoeven <[email protected]>
ALSA: firewire-tascam: Fix integer overflow in midi_port_work()
Geert Uytterhoeven <[email protected]>
ALSA: fireface: Fix integer overflow in transmit_midi_msg()
Mike Snitzer <[email protected]>
dm: eliminate potential source of excessive kernel log noise
Chen Yi <[email protected]>
selftests: netfilter: Pass family parameter "-f" to conntrack tool
[email protected] <[email protected]>
net: sunrpc: interpret the return value of kstrtou32 correctly
Lu Baolu <[email protected]>
iommu/vt-d: Fix unaligned addresses for intel_flush_svm_range_dev()
Atish Patra <[email protected]>
riscv: Trace irq on only interrupt is enabled
Jann Horn <[email protected]>
mm, slub: consider rest of partial list if acquire_slab() fails
Chris Wilson <[email protected]>
drm/i915/gt: Restore clear-residual mitigations for Ivybridge, Baytrail
Imre Deak <[email protected]>
drm/i915/icl: Fix initing the DSI DSC power refcount during HW readout
Hans de Goede <[email protected]>
drm/i915/dsi: Use unconditional msleep for the panel_on_delay when there is no reset-deassert MIPI-sequence
Arnd Bergmann <[email protected]>
dm zoned: select CONFIG_CRC32
Al Viro <[email protected]>
umount(2): move the flag validity checks first
Parav Pandit <[email protected]>
IB/mlx5: Fix error unwinding when set_has_smi_cap fails
Mark Bloch <[email protected]>
RDMA/mlx5: Fix wrong free of blue flame register on error
Michael Chan <[email protected]>
bnxt_en: Improve stats context resource accounting with RDMA driver loaded.
Dinghao Liu <[email protected]>
RDMA/usnic: Fix memleak in find_free_vf_and_create_qp_grp
Leon Romanovsky <[email protected]>
RDMA/restrack: Don't treat as an error allocation ID wrapping
Jan Kara <[email protected]>
ext4: fix superblock checksum failure when setting password salt
Stanley Chu <[email protected]>
scsi: ufs: Fix possible power drain during system suspend
Trond Myklebust <[email protected]>
NFS: nfs_igrab_and_active must first reference the superblock
Trond Myklebust <[email protected]>
NFS: nfs_delegation_find_inode_server must first reference the superblock
Trond Myklebust <[email protected]>
NFS/pNFS: Fix a leak of the layout 'plh_outstanding' counter
Trond Myklebust <[email protected]>
NFS/pNFS: Don't leak DS commits in pnfs_generic_retry_commit()
Trond Myklebust <[email protected]>
NFS/pNFS: Don't call pnfs_free_bucket_lseg() before removing the request
Scott Mayhew <[email protected]>
NFS: Adjust fs_context error logging
Trond Myklebust <[email protected]>
pNFS: Stricter ordering of layoutget and layoutreturn
Trond Myklebust <[email protected]>
pNFS: Mark layout for return if return-on-close was not sent
Trond Myklebust <[email protected]>
pNFS: We want return-on-close to complete when evicting the inode
Dave Wysochanski <[email protected]>
NFS4: Fix use-after-free in trace_event_raw_event_nfs4_set_lock
Sagi Grimberg <[email protected]>
nvme-tcp: Fix warning with CONFIG_DEBUG_PREEMPT
Sagi Grimberg <[email protected]>
nvme-tcp: fix possible data corruption with bio merges
Sagi Grimberg <[email protected]>
nvme: don't intialize hwmon for discovery controllers
Israel Rukshin <[email protected]>
nvmet-rdma: Fix NULL deref when setting pi_enable and traddr INADDR_ANY
Dan Carpenter <[email protected]>
ASoC: Intel: fix error code cnl_set_dsp_D0()
Jerome Brunet <[email protected]>
ASoC: meson: axg-tdmin: fix axg skew offset
Jerome Brunet <[email protected]>
ASoC: meson: axg-tdm-interface: fix loopback
Al Viro <[email protected]>
dump_common_audit_data(): fix racy accesses to ->d_name
Adrian Hunter <[email protected]>
perf intel-pt: Fix 'CPU too large' error
Linus Torvalds <[email protected]>
mm: don't put pinned pages into the swap cache
Linus Torvalds <[email protected]>
mm: don't play games with pinned pages in clear_page_refs
Linus Torvalds <[email protected]>
mm: fix clear_refs_write locking
John Garry <[email protected]>
blk-mq-debugfs: Add decode for BLK_MQ_F_TAG_HCTX_SHARED
Alaa Hleihel <[email protected]>
net/mlx5: E-Switch, fix changing vf VLANID
YueHaibing <[email protected]>
net/mlx5: Fix passing zero to 'PTR_ERR'
Oz Shlomo <[email protected]>
net/mlx5e: CT: Use per flow counter when CT flow accounting is enabled
Lu Baolu <[email protected]>
iommu/vt-d: Update domain geometry in iommu_ops.at(de)tach_dev
James Smart <[email protected]>
nvme-fc: avoid calling _nvme_fc_abort_outstanding_ios from interrupt context
Arnd Bergmann <[email protected]>
cfg80211: select CONFIG_CRC32
Peter Gonda <[email protected]>
x86/sev-es: Fix SEV-ES OUT/IN immediate opcode vc handling
Jonathan Lemon <[email protected]>
bpf: Save correct stopping point in file seq iteration
Song Liu <[email protected]>
bpf: Simplify task_file_seq_get_next()
Uladzislau Rezki (Sony) <[email protected]>
rcu-tasks: Move RCU-tasks initialization to before early_initcall()
Linus Torvalds <[email protected]>
poll: fix performance regression due to out-of-line __put_user()
Arnd Bergmann <[email protected]>
ARM: picoxcell: fix missing interrupt-parent properties
Craig Tatlor <[email protected]>
drm/msm: Call msm_init_vram before binding the gpu
Shawn Guo <[email protected]>
ACPI: scan: add stub acpi_create_platform_device() for !CONFIG_ACPI
Lu Baolu <[email protected]>
iommu/vt-d: Fix lockdep splat in sva bind()/unbind()
Peter Robinson <[email protected]>
usb: typec: Fix copy paste error for NVIDIA alt-mode description
Jiawei Gu <[email protected]>
drm/amdgpu: fix potential memory leak during navi12 deinitialization
Xiaojian Du <[email protected]>
drm/amd/pm: fix the failure when change power profile for renoir
Dennis Li <[email protected]>
drm/amdgpu: fix a GPU hang issue when remove device
Kevin Wang <[email protected]>
drm/amd/display: fix sysfs amdgpu_current_backlight_pwm NULL pointer issue
Israel Rukshin <[email protected]>
nvmet-rdma: Fix list_del corruption on queue establishment failure
Lalithambika Krishnakumar <[email protected]>
nvme: avoid possible double fetch in handling CQE
Gopal Tiwari <[email protected]>
nvme-pci: mark Samsung PM1725a as IGNORE_DEV_SUBNQN
Po-Hsu Lin <[email protected]>
selftests: fix the return value for UDP GRO test
Michael Ellerman <[email protected]>
net: ethernet: fs_enet: Add missing MODULE_LICENSE
Arnd Bergmann <[email protected]>
misdn: dsp: select CONFIG_BITREVERSE
Randy Dunlap <[email protected]>
arch/arc: add copy_user_page() to <asm/page.h> to fix build error on ARC
Jan Kara <[email protected]>
bfq: Fix computation of shallow depth
Pavel Begunkov <[email protected]>
io_uring: drop file refs after task cancel
Xu Yilun <[email protected]>
spi: fix the divide by 0 error when calculating xfer waiting time
Masahiro Yamada <[email protected]>
kconfig: remove 'kvmconfig' and 'xenconfig' shorthands
John Millikin <[email protected]>
lib/raid6: Let $(UNROLL) rules work with macOS userland
Uwe Kleine-König <[email protected]>
hwmon: (pwm-fan) Ensure that calculation doesn't discard big period values
Dinghao Liu <[email protected]>
habanalabs: Fix memleak in hl_device_reset
Xu Yilun <[email protected]>
spi: altera: fix return value for altera_spi_txrx()
Christophe JAILLET <[email protected]>
staging: spmi: hisi-spmi-controller: Fix some error handling paths
Oded Gabbay <[email protected]>
habanalabs: register to pci shutdown callback
Oded Gabbay <[email protected]>
habanalabs/gaudi: retry loading TPC f/w on -EINTR
Oded Gabbay <[email protected]>
habanalabs: adjust pci controller init to new firmware
Linus Walleij <[email protected]>
ARM: dts: ux500/golden: Set display max brightness
Rasmus Villemoes <[email protected]>
ethernet: ucc_geth: fix definition and size of ucc_geth_tx_global_pram
Guido Günther <[email protected]>
regulator: bd718x7: Add enable times
Filipe Manana <[email protected]>
btrfs: fix transaction leak and crash after RO remount caused by qgroup rescan
Pavel Begunkov <[email protected]>
btrfs: merge critical sections of discard lock in workfn
Pavel Begunkov <[email protected]>
btrfs: fix async discard stall
Carl Huang <[email protected]>
ath11k: qmi: try to allocate a big block of DMA memory first
Vasily Averin <[email protected]>
netfilter: ipset: fixes possible oops in mtype_resize
Carl Huang <[email protected]>
ath11k: fix crash caused by NULL rx_channel
Carl Philipp Klemm <[email protected]>
ARM: omap2: pmic-cpcap: fix maximum voltage to be consistent with defaults on xt875
Masahiro Yamada <[email protected]>
ARC: build: move symlink creation to arch/arc/Makefile to avoid race
Masahiro Yamada <[email protected]>
ARC: build: add boot_targets to PHONY
Masahiro Yamada <[email protected]>
ARC: build: add uImage.lzma to the top-level target
Masahiro Yamada <[email protected]>
ARC: build: remove non-existing bootpImage from KBUILD_IMAGE
Pavel Begunkov <[email protected]>
io_uring: drop mm and files after task_work_run
Pavel Begunkov <[email protected]>
io_uring: don't take files/mm for a dead task
Theodore Ts'o <[email protected]>
ext4: don't leak old mountpoint samples
Su Yue <[email protected]>
btrfs: tree-checker: check if chunk item end overflows
Leon Schuermann <[email protected]>
r8152: Add Lenovo Powered USB-C Travel Hub
Voon Weifeng <[email protected]>
stmmac: intel: change all EHL/TGL to auto detect phy addr
Ignat Korchagin <[email protected]>
dm crypt: defer decryption to a tasklet if interrupts disabled
Ignat Korchagin <[email protected]>
dm crypt: do not call bio_endio() from the dm-crypt tasklet
Ignat Korchagin <[email protected]>
dm crypt: do not wait for backlogged crypto request completion in softirq
Ignat Korchagin <[email protected]>
dm crypt: use GFP_ATOMIC when allocating crypto requests from softirq
Mikulas Patocka <[email protected]>
dm integrity: fix the maximum number of arguments
Mikulas Patocka <[email protected]>
dm integrity: fix flush with external metadata device
Akilesh Kailash <[email protected]>
dm snapshot: flush merged data before committing metadata
Mike Snitzer <[email protected]>
dm raid: fix discard limits for raid1
Andrew Morton <[email protected]>
mm/process_vm_access.c: include compat.h
Miaohe Lin <[email protected]>
mm/hugetlb: fix potential missing huge page size info
Miaohe Lin <[email protected]>
mm/vmalloc.c: fix potential memory leak
Will Deacon <[email protected]>
compiler.h: Raise minimum version of GCC to 5.1 for arm64
Roger Pau Monne <[email protected]>
xen/privcmd: allow fetching resource sizes
Dexuan Cui <[email protected]>
ACPI: scan: Harden acpi_device_add() against device ID overflows
Tom Rix <[email protected]>
RDMA/ocrdma: Fix use after free in ocrdma_dealloc_ucontext_pd()
Alexander Lobakin <[email protected]>
MIPS: relocatable: fix possible boot hangup with KASLR enabled
Al Viro <[email protected]>
MIPS: Fix malformed NT_FILE and NT_SIGINFO in 32bit coredumps
Paul Cercueil <[email protected]>
MIPS: boot: Fix unaligned access with CONFIG_MIPS_RAW_APPENDED_DTB
Anders Roxell <[email protected]>
mips: lib: uncached: fix non-standard usage of variable 'sp'
Anders Roxell <[email protected]>
mips: fix Section mismatch in reference
Nick Hu <[email protected]>
riscv: Fix KASAN memory mapping.
Guo Ren <[email protected]>
riscv: Fixup CONFIG_GENERIC_TIME_VSYSCALL
Andreas Schwab <[email protected]>
riscv: return -ENOSYS for syscall -1
Kefeng Wang <[email protected]>
riscv: Drop a duplicated PAGE_KERNEL_EXEC
Paulo Alcantara <[email protected]>
cifs: fix interrupted close commands
Tom Rix <[email protected]>
cifs: check pointer before freeing
yangerkun <[email protected]>
ext4: fix bug for rename with RENAME_WHITEOUT
Daejun Park <[email protected]>
ext4: fix wrong list_splice in ext4_fc_cleanup
Yi Li <[email protected]>
ext4: use IS_ERR instead of IS_ERR_OR_NULL and set inode null when IS_ERR
Masami Hiramatsu <[email protected]>
tools/bootconfig: Add tracing_on support to helper scripts
Masami Hiramatsu <[email protected]>
tracing/kprobes: Do the notrace functions check without kprobes on ftrace
Alexandru Gagniuc <[email protected]>
drm/bridge: sii902x: Enable I/O and core VCC supplies if present
Alexandru Gagniuc <[email protected]>
dt-bindings: display: sii902x: Add supply bindings
Alexandru Gagniuc <[email protected]>
drm/bridge: sii902x: Refactor init code into separate function
Jani Nikula <[email protected]>
drm/i915/backlight: fix CPU mode backlight takeover on LPT
Chris Wilson <[email protected]>
drm/i915/gt: Limit VFE threads based on GT
Chris Wilson <[email protected]>
drm/i915: Allow the sysadmin to override security mitigations
mengwang <[email protected]>
drm/amdgpu: add new device id for Renior
Rodrigo Siqueira <[email protected]>
Revert "drm/amd/display: Fixed Intermittent blue screen on OLED panel"
Alexandre Demers <[email protected]>
drm/amdgpu: fix DRM_INFO flood if display core is not supported (bug 210921)
Prike Liang <[email protected]>
drm/amdgpu: add green_sardine device id (v2)
Wei Liu <[email protected]>
x86/hyperv: check cpu mask after interrupt has been disabled
Thomas Hebb <[email protected]>
ASoC: dapm: remove widget from dirty list on free
Jaroslav Kysela <[email protected]>
ASoC: AMD Renoir - add DMI entry for Lenovo ThinkPad X395
Jonathan Neuschäfer <[email protected]>
ALSA: doc: Fix reference to mixart.rst
Jeremy Szu <[email protected]>
ALSA: hda/realtek: fix right sounds and mute/micmute LEDs for HP machines
Su Yue <[email protected]>
btrfs: prevent NULL pointer dereference in extent_io_tree_panic
Qu Wenruo <[email protected]>
btrfs: reloc: fix wrong file extent type check to avoid false ENOENT
-------------
Diffstat:
.../devicetree/bindings/display/bridge/sii902x.txt | 4 + Documentation/sound/alsa-configuration.rst | 2 +- Makefile | 4 +- arch/arc/Makefile | 20 ++- arch/arc/boot/Makefile | 11 +- arch/arc/include/asm/page.h | 1 + arch/arm/boot/dts/picoxcell-pc3x2.dtsi | 4 + arch/arm/boot/dts/ste-ux500-samsung-golden.dts | 1 + arch/arm/mach-omap2/pmic-cpcap.c | 2 +- arch/mips/boot/compressed/decompress.c | 3 +- arch/mips/kernel/binfmt_elfn32.c | 7 + arch/mips/kernel/binfmt_elfo32.c | 7 + arch/mips/kernel/relocate.c | 10 +- arch/mips/lib/uncached.c | 4 +- arch/mips/mm/c-r4k.c | 2 +- arch/mips/mm/sc-mips.c | 4 +- arch/riscv/include/asm/pgtable.h | 1 - arch/riscv/include/asm/vdso.h | 2 +- arch/riscv/kernel/entry.S | 15 +- arch/riscv/kernel/vdso.c | 2 +- arch/riscv/mm/kasan_init.c | 4 +- arch/x86/hyperv/mmu.c | 12 +- arch/x86/kernel/sev-es-shared.c | 4 +- block/bfq-iosched.c | 8 +- block/blk-mq-debugfs.c | 1 + drivers/acpi/internal.h | 2 +- drivers/acpi/scan.c | 15 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 6 +- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 + drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 18 ++- drivers/gpu/drm/amd/amdgpu/soc15.c | 3 +- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 7 +- .../display/dc/dml/dcn20/display_mode_vba_20v2.c | 11 +- drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c | 1 + drivers/gpu/drm/amd/pm/swsmu/smu12/smu_v12_0.c | 1 + drivers/gpu/drm/bridge/sii902x.c | 100 +++++++----- drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/display/icl_dsi.c | 4 - drivers/gpu/drm/i915/display/intel_panel.c | 9 +- drivers/gpu/drm/i915/display/vlv_dsi.c | 16 +- drivers/gpu/drm/i915/gt/gen7_renderclear.c | 157 +++++++++++-------- drivers/gpu/drm/i915/gt/intel_ring_submission.c | 6 +- drivers/gpu/drm/i915/i915_mitigations.c | 146 ++++++++++++++++++ drivers/gpu/drm/i915/i915_mitigations.h | 13 ++ drivers/gpu/drm/msm/msm_drv.c | 8 +- drivers/hwmon/pwm-fan.c | 12 +- drivers/infiniband/core/restrack.c | 1 + drivers/infiniband/hw/mlx5/main.c | 4 +- drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 2 +- drivers/infiniband/hw/usnic/usnic_ib_verbs.c | 3 + drivers/iommu/intel/iommu.c | 16 +- drivers/iommu/intel/svm.c | 36 ++++- drivers/isdn/mISDN/Kconfig | 1 + drivers/md/Kconfig | 1 + drivers/md/dm-bufio.c | 6 + drivers/md/dm-crypt.c | 170 ++++++++++++++++++--- drivers/md/dm-integrity.c | 62 ++++++-- drivers/md/dm-raid.c | 6 +- drivers/md/dm-snap.c | 24 +++ drivers/md/dm.c | 2 +- drivers/misc/habanalabs/common/device.c | 2 + drivers/misc/habanalabs/common/habanalabs_drv.c | 1 + drivers/misc/habanalabs/common/pci.c | 28 ++-- drivers/misc/habanalabs/gaudi/gaudi.c | 14 +- drivers/misc/habanalabs/gaudi/gaudi_coresight.c | 3 +- drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 8 +- .../net/ethernet/freescale/fs_enet/mii-bitbang.c | 1 + drivers/net/ethernet/freescale/fs_enet/mii-fec.c | 1 + drivers/net/ethernet/freescale/ucc_geth.h | 9 +- drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c | 77 ++++++---- .../mellanox/mlx5/core/esw/acl/egress_lgcy.c | 27 ++-- .../mellanox/mlx5/core/esw/acl/egress_ofld.c | 2 +- .../mellanox/mlx5/core/esw/acl/ingress_lgcy.c | 2 +- .../mellanox/mlx5/core/esw/acl/ingress_ofld.c | 2 +- drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c | 6 +- drivers/net/usb/cdc_ether.c | 7 + drivers/net/usb/r8152.c | 1 + drivers/net/wireless/ath/ath11k/dp_rx.c | 10 +- drivers/net/wireless/ath/ath11k/qmi.c | 24 ++- drivers/net/wireless/ath/ath11k/qmi.h | 1 + drivers/nvme/host/core.c | 11 +- drivers/nvme/host/fc.c | 15 +- drivers/nvme/host/pci.c | 10 +- drivers/nvme/host/tcp.c | 4 +- drivers/nvme/target/rdma.c | 26 +++- drivers/regulator/bd718x7-regulator.c | 57 +++++++ drivers/scsi/ufs/ufshcd.c | 3 +- drivers/spi/spi-altera.c | 26 ++-- drivers/spi/spi.c | 6 +- drivers/staging/hikey9xx/hisi-spmi-controller.c | 21 ++- drivers/usb/typec/altmodes/Kconfig | 2 +- drivers/xen/privcmd.c | 25 ++- fs/btrfs/discard.c | 60 ++++---- fs/btrfs/extent_io.c | 4 +- fs/btrfs/qgroup.c | 13 +- fs/btrfs/relocation.c | 7 +- fs/btrfs/super.c | 8 + fs/btrfs/tree-checker.c | 7 + fs/cifs/dfs_cache.c | 3 +- fs/cifs/smb2pdu.c | 2 +- fs/ext4/fast_commit.c | 25 +-- fs/ext4/file.c | 2 +- fs/ext4/ioctl.c | 3 + fs/ext4/namei.c | 17 ++- fs/io_uring.c | 29 ++-- fs/namespace.c | 7 +- fs/nfs/delegation.c | 12 +- fs/nfs/internal.h | 38 ++++- fs/nfs/nfs4proc.c | 28 ++-- fs/nfs/nfs4super.c | 4 +- fs/nfs/pnfs.c | 58 +++---- fs/nfs/pnfs.h | 8 +- fs/nfs/pnfs_nfs.c | 22 ++- fs/proc/task_mmu.c | 53 ++++--- fs/select.c | 14 +- include/linux/acpi.h | 7 + include/linux/compiler-gcc.h | 6 + include/linux/dm-bufio.h | 1 + include/linux/rcupdate.h | 6 + init/main.c | 1 + kernel/bpf/task_iter.c | 57 +++---- kernel/rcu/tasks.h | 25 ++- kernel/trace/Kconfig | 2 +- kernel/trace/trace_kprobe.c | 2 +- lib/raid6/Makefile | 2 +- mm/hugetlb.c | 2 +- mm/process_vm_access.c | 1 + mm/slub.c | 2 +- mm/vmalloc.c | 4 +- mm/vmscan.c | 2 + net/netfilter/ipset/ip_set_hash_gen.h | 22 +-- net/netfilter/nf_conntrack_standalone.c | 3 + net/netfilter/nf_nat_core.c | 1 + net/sunrpc/addr.c | 2 +- net/wireless/Kconfig | 1 + scripts/kconfig/Makefile | 10 -- security/lsm_audit.c | 7 +- sound/firewire/fireface/ff-transaction.c | 2 +- sound/firewire/tascam/tascam-transaction.c | 2 +- sound/pci/hda/patch_realtek.c | 4 + sound/soc/amd/renoir/rn-pci-acp3x.c | 7 + sound/soc/intel/skylake/cnl-sst.c | 1 + sound/soc/meson/axg-tdm-interface.c | 14 +- sound/soc/meson/axg-tdmin.c | 13 +- sound/soc/soc-dapm.c | 1 + tools/bootconfig/scripts/bconf2ftrace.sh | 1 + tools/bootconfig/scripts/ftrace2bconf.sh | 4 + tools/perf/util/machine.c | 4 +- tools/perf/util/session.c | 2 +- tools/testing/selftests/net/udpgro.sh | 34 +++++ .../selftests/netfilter/nft_conntrack_helper.sh | 12 +- 151 files changed, 1520 insertions(+), 610 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/152 btrfs: reloc: fix wrong file extent type check to avoid false ENOENT
From: Qu Wenruo <[email protected]>
commit 50e31ef486afe60f128d42fb9620e2a63172c15c upstream.
[BUG]
There are several bug reports about recent kernel unable to relocate certain data block groups.
Sometimes the error just goes away, but there is one reporter who can reproduce it reliably.
The dmesg would look like:
[438.260483] BTRFS info (device dm-10): balance: start -dvrange=34625344765952..34625344765953 [438.269018] BTRFS info (device dm-10): relocating block group 34625344765952 flags data|raid1 [450.439609] BTRFS info (device dm-10): found 167 extents, stage: move data extents [463.501781] BTRFS info (device dm-10): balance: ended with status: -2
[CAUSE]
The ENOENT error is returned from the following call chain:
add_data_references()
|- delete_v1_space_cache();
|- if (!found)
return -ENOENT;The variable @found is set to true if we find a data extent whose disk bytenr matches parameter @data_bytes.
With extra debugging, the offending tree block looks like this:
leaf bytenr = 42676709441536, data_bytenr = 34626327621632
ctime 1567904822.739884119 (2019-09-08 03:07:02)
mtime 0.0 (1970-01-01 01:00:00)
otime 0.0 (1970-01-01 01:00:00)
item 27 key (51933 EXTENT_DATA 0) itemoff 9854 itemsize 53
generation 1517381 type 2 (prealloc)
prealloc data disk byte 34626327621632 nr 262144 <<<
prealloc data offset 0 nr 262144
item 28 key (52262 ROOT_ITEM 0) itemoff 9415 itemsize 439
generation 2618893 root_dirid 256 bytenr 42677048360960 level 3 refs 1
lastsnap 2618893 byte_limit 0 bytes_used 5557338112 flags 0x0(none)
uuid d0d4361f-d231-6d40-8901-fe506e4b2b53Although item 27 has disk bytenr 34626327621632, which matches the data_bytenr, its type is prealloc, not reg.
This makes the existing code skip that item, and return ENOENT.
[FIX]
The code is modified in commit 19b546d7a1b2 ("btrfs: relocation: Use btrfs_find_all_leafs to locate data extent parent tree leaves"), before that commit, we use something like
"if (type == BTRFS_FILE_EXTENT_INLINE) continue;"
But in that offending commit, we use (type == BTRFS_FILE_EXTENT_REG), ignoring BTRFS_FILE_EXTENT_PREALLOC.
Fix it by also checking BTRFS_FILE_EXTENT_PREALLOC.
--- fs/btrfs/relocation.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
fs/btrfs/relocation.c +6 -1
@@ -3027,11 +3027,16 @@ static int delete_v1_space_cache(structreturn 0 ;for (i =0 ; i <btrfs_header_nritems (leaf); i++) { +u8 type; +btrfs_item_key_to_cpu (leaf, &key, i);if (key.type !=BTRFS_EXTENT_DATA_KEY )continue ; ei = btrfs_item_ptr(leaf, i, struct btrfs_file_extent_item); -if (btrfs_file_extent_type (leaf, ei) ==BTRFS_FILE_EXTENT_REG && + type =btrfs_file_extent_type (leaf, ei); + +if ((type ==BTRFS_FILE_EXTENT_REG || + type ==BTRFS_FILE_EXTENT_PREALLOC ) &&btrfs_file_extent_disk_bytenr (leaf, ei) == data_bytenr) { found = true; space_cache_ino = key.objectid;
Greg Kroah-Hartman
maintainerPATCH 2/152 btrfs: prevent NULL pointer dereference in extent_io_tree_panic
In reply to Greg Kroah-HartmanFrom: Su Yue <[email protected]>
commit 29b665cc51e8b602bf2a275734349494776e3dbc upstream.
Some extent io trees are initialized with NULL private member (e.g. btrfs_device::alloc_state and btrfs_fs_info::excluded_extents). Dereference of a NULL tree->private as inode pointer will cause panic.
Pass tree->fs_info as it's known to be valid in all cases.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=208929
--- fs/btrfs/extent_io.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
fs/btrfs/extent_io.c +1 -3
@@ -676,9 +676,7 @@ alloc_extent_state_atomic(struct extent_static void extent_io_tree_panic (struct extent_io_tree *tree,int err) { -struct inode *inode = tree->private_data; - -btrfs_panic (btrfs_sb (inode->i_sb), err, +btrfs_panic (tree->fs_info, err,"locking error: extent tree was modified by another thread while locked" ); }
Greg Kroah-Hartman
maintainerPATCH 3/152 ALSA: hda/realtek: fix right sounds and mute/micmute LEDs for HP machines
In reply to Greg Kroah-HartmanFrom: Jeremy Szu <[email protected]>
commit 91bc156817a3c2007332b64b4f85c32aafbbbea6 upstream.
* The HP ZBook Fury 15/17 G7 Mobile Workstation are using ALC285 codec which is using 0x04 to control mute LED and 0x01 to control micmute LED.
* The right channel speaker is no sound and it needs to expose GPIO1 for initialing AMP.
Add quirks to support them.
--- sound/pci/hda/patch_realtek.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/pci/hda/patch_realtek.c +4 -0
@@ -7970,6 +7970,10 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x8760 ,"HP" ,ALC285_FIXUP_HP_MUTE_LED ),SND_PCI_QUIRK (0x103c ,0x877a ,"HP" ,ALC285_FIXUP_HP_MUTE_LED ),SND_PCI_QUIRK (0x103c ,0x877d ,"HP" ,ALC236_FIXUP_HP_MUTE_LED ), +SND_PCI_QUIRK (0x103c ,0x8780 ,"HP ZBook Fury 17 G7 Mobile Workstation" , +ALC285_FIXUP_HP_GPIO_AMP_INIT ), +SND_PCI_QUIRK (0x103c ,0x8783 ,"HP ZBook Fury 15 G7 Mobile Workstation" , +ALC285_FIXUP_HP_GPIO_AMP_INIT ),SND_PCI_QUIRK (0x103c ,0x87c8 ,"HP" ,ALC287_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x87f4 ,"HP" ,ALC287_FIXUP_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
Greg Kroah-Hartman
maintainerPATCH 4/152 ALSA: doc: Fix reference to mixart.rst
In reply to Greg Kroah-HartmanFrom: Jonathan Neuschäfer <[email protected]>
commit 3e096a2112b7b407549020cf095e2a425f00fabb upstream.
MIXART.txt has been converted to ReST and renamed. Fix the reference in alsa-configuration.rst.
Documentation/sound/alsa-configuration.rst +1 -1
@@ -1501,7 +1501,7 @@ Module for Digigram miXart8 sound cards. This module supports multiple cards. Note: One miXart8 board will be represented as 4 alsa cards. -See MIXART.txt for details. +See Documentation/sound/cards/mixart.rst for details. When the driver is compiled as a module and the hotplug firmware is supported, the firmware data is loaded via hotplug automatically.
Greg Kroah-Hartman
maintainerPATCH 5/152 ASoC: AMD Renoir - add DMI entry for Lenovo ThinkPad X395
In reply to Greg Kroah-HartmanFrom: Jaroslav Kysela <[email protected]>
commit 1f092d1c8819679d78a7d9c62a46d4939d217a9d upstream.
The ThinkPad X395 latop does not have the internal digital microphone connected to the AMD's ACP bridge, but it's advertised via BIOS. The internal microphone is connected to the HDA codec.
Use DMI to block the microphone PCM device for this platform.
--- sound/soc/amd/renoir/rn-pci-acp3x.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/soc/amd/renoir/rn-pci-acp3x.c +7 -0
@@ -171,6 +171,13 @@ static const struct dmi_system_id rn_acp DMI_EXACT_MATCH(DMI_BOARD_NAME, "LNVNB161216"), } }, + { + /* Lenovo ThinkPad X395 */ + .matches = { + DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_EXACT_MATCH(DMI_BOARD_NAME, "20NLCTO1WW"), + } + }, {} };
Greg Kroah-Hartman
maintainerPATCH 6/152 ASoC: dapm: remove widget from dirty list on free
In reply to Greg Kroah-HartmanFrom: Thomas Hebb <[email protected]>
commit 5c6679b5cb120f07652418524ab186ac47680b49 upstream.
A widget's "dirty" list_head, much like its "list" list_head, eventually chains back to a list_head on the snd_soc_card itself. This means that the list can stick around even after the widget (or all widgets) have been freed. Currently, however, widgets that are in the dirty list when freed remain there, corrupting the entire list and leading to memory errors and undefined behavior when the list is next accessed or modified.
I encountered this issue when a component failed to probe relatively late in snd_soc_bind_card(), causing it to bail out and call soc_cleanup_card_resources(), which eventually called snd_soc_dapm_free() with widgets that were still dirty from when they'd been added.
--- sound/soc/soc-dapm.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/soc-dapm.c +1 -0
@@ -2486,6 +2486,7 @@ void snd_soc_dapm_free_widget(struct sndenum snd_soc_dapm_direction dir;list_del (&w->list); +list_del (&w->dirty);/* * remove source and sink paths associated to this widget. * While removing the path, remove reference to it from both
Greg Kroah-Hartman
maintainerPATCH 7/152 x86/hyperv: check cpu mask after interrupt has been disabled
In reply to Greg Kroah-HartmanFrom: Wei Liu <[email protected]>
commit ad0a6bad44758afa3b440c254a24999a0c7e35d5 upstream.
We've observed crashes due to an empty cpu mask in hyperv_flush_tlb_others. Obviously the cpu mask in question is changed between the cpumask_empty call at the beginning of the function and when it is actually used later.
One theory is that an interrupt comes in between and a code path ends up changing the mask. Move the check after interrupt has been disabled to see if it fixes the issue.
--- arch/x86/hyperv/mmu.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
arch/x86/hyperv/mmu.c +9 -3
@@ -66,11 +66,17 @@ static void hyperv_flush_tlb_others(consif (!hv_hypercall_pg) goto do_native; -if (cpumask_empty (cpus)) -return ; -local_irq_save (flags); +/* +* Only check the mask _after_ interrupt has been disabled to avoid the +* mask changing under our feet. +*/ +if (cpumask_empty (cpus)) { +local_irq_restore (flags); +return ; + } + flush_pcpu = (struct hv_tlb_flush **)this_cpu_ptr (hyperv_pcpu_input_arg);
Greg Kroah-Hartman
maintainerPATCH 8/152 drm/amdgpu: add green_sardine device id (v2)
In reply to Greg Kroah-HartmanFrom: Prike Liang <[email protected]>
commit 21702c8cae51535e09b91341a069503c6ef3d2a3 upstream.
Add green_sardine PCI id support and map it to renoir asic type.
v2: add apu flag
--- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +1 -0
@@ -1076,6 +1076,7 @@ static const struct pci_device_id pciidl/* Renoir */ {0x1002, 0x1636, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU}, + {0x1002, 0x1638, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},/* Navi12 */ {0x1002, 0x7360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12},
Greg Kroah-Hartman
maintainerPATCH 9/152 drm/amdgpu: fix DRM_INFO flood if display core is not supported (bug 210921)
In reply to Greg Kroah-HartmanFrom: Alexandre Demers <[email protected]>
commit ff9346dbabbb6595c5c20d90d88ae4a2247487a9 upstream.
This fix bug 210921 where DRM_INFO floods log when hitting an unsupported ASIC in amdgpu_device_asic_has_dc_support(). This info should be only called once.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +1 -1
@@ -3008,7 +3008,7 @@ bool amdgpu_device_asic_has_dc_support(e#endif default :if (amdgpu_dc >0 ) -DRM_INFO ("Display Core has been requested via kernel parameter " +DRM_INFO_ONCE ("Display Core has been requested via kernel parameter " "but isn't supported by ASIC, ignoring\n" );return false; }
Greg Kroah-Hartman
maintainerPATCH 10/152 Revert "drm/amd/display: Fixed Intermittent blue screen on OLED panel"
In reply to Greg Kroah-HartmanFrom: Rodrigo Siqueira <[email protected]>
commit 4eec66c014e9a406d8d453de958f6791d05427e4 upstream.
commit a861736dae64 ("drm/amd/display: Fixed Intermittent blue screen on OLED panel")
causes power regression for many users. It seems that this change causes the MCLK to get forced high; this creates a regression for many users since their devices were not able to drop to a low state after this change. For this reason, this reverts commit a861736dae644a0d7abbca0c638ae6aad28feeb8.
--- drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c | 11 +++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/display/dc/dml/dcn20/display_mode_vba_20v2.c +6 -5
@@ -2635,14 +2635,15 @@ static void dml20v2_DISPCLKDPPCLKDCFCLKD }if (mode_lib->vba.DRAMClockChangeSupportsVActive && - mode_lib->vba.MinActiveDRAMClockChangeMargin >60 && - mode_lib->vba.PrefetchMode[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] ==0 ) { + mode_lib->vba.MinActiveDRAMClockChangeMargin >60 ) { mode_lib->vba.DRAMClockChangeWatermark +=25 ;for (k =0 ; k < mode_lib->vba.NumberOfActivePlanes; ++k) { -if (mode_lib->vba.DRAMClockChangeWatermark > -dml_max (mode_lib->vba.StutterEnterPlusExitWatermark, mode_lib->vba.UrgentWatermark)) - mode_lib->vba.MinTTUVBlank[k] +=25 ; +if (mode_lib->vba.PrefetchMode[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] ==0 ) { +if (mode_lib->vba.DRAMClockChangeWatermark > +dml_max (mode_lib->vba.StutterEnterPlusExitWatermark, mode_lib->vba.UrgentWatermark)) + mode_lib->vba.MinTTUVBlank[k] +=25 ; + } } mode_lib->vba.DRAMClockChangeSupport[0 ][0 ] = dm_dram_clock_change_vactive;
Greg Kroah-Hartman
maintainerPATCH 11/152 drm/amdgpu: add new device id for Renior
In reply to Greg Kroah-HartmanFrom: mengwang <[email protected]>
commit 53f1e7f6a1720f8299b5283857eedc8f07d29533 upstream.
add DID 0x164C into pciidlist under CHIP_RENOIR family.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 1 + drivers/gpu/drm/amd/amdgpu/soc15.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +1 -0
@@ -1077,6 +1077,7 @@ static const struct pci_device_id pciidl/* Renoir */ {0x1002, 0x1636, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU}, {0x1002, 0x1638, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU}, + {0x1002, 0x164C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},/* Navi12 */ {0x1002, 0x7360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12},
drivers/gpu/drm/amd/amdgpu/soc15.c +2 -1
@@ -1242,7 +1242,8 @@ static int soc15_common_early_init(voidbreak ;case CHIP_RENOIR : adev->asic_funcs = &soc15_asic_funcs; -if (adev->pdev->device ==0x1636 ) +if ((adev->pdev->device ==0x1636 ) || + (adev->pdev->device ==0x164c )) adev->apu_flags |=AMD_APU_IS_RENOIR ;else adev->apu_flags |=AMD_APU_IS_GREEN_SARDINE ;
Greg Kroah-Hartman
maintainerPATCH 12/152 drm/i915: Allow the sysadmin to override security mitigations
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
commit 984cadea032b103c5824a5f29d0a36b3e9df6333 upstream.
The clear-residuals mitigation is a relatively heavy hammer and under some circumstances the user may wish to forgo the context isolation in order to meet some performance requirement. Introduce a generic module parameter to allow selectively enabling/disabling different mitigations.
To disable just the clear-residuals mitigation (on Ivybridge, Baytrail, or Haswell) use the module parameter: i915.mitigations=auto,!residuals
--- drivers/gpu/drm/i915/Makefile | 1 drivers/gpu/drm/i915/gt/intel_ring_submission.c | 4 drivers/gpu/drm/i915/i915_mitigations.c | 146 ++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_mitigations.h | 13 ++ 4 files changed, 163 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/Makefile +1 -0
@@ -38,6 +38,7 @@ i915-y += i915_drv.o \ i915_config.o \ i915_irq.o \ i915_getparam.o \ + i915_mitigations.o \ i915_params.o \ i915_pci.o \ i915_scatterlist.o \
drivers/gpu/drm/i915/gt/intel_ring_submission.c +3 -1
@@ -32,6 +32,7 @@#include "gen6_ppgtt.h" #include "gen7_renderclear.h" #include "i915_drv.h" +#include "i915_mitigations.h" #include "intel_breadcrumbs.h" #include "intel_context.h" #include "intel_gt.h"
@@ -885,7 +886,8 @@ static int switch_context(struct i915_reGEM_BUG_ON (HAS_EXECLISTS (engine->i915));if (engine->wa_ctx.vma && ce != engine->kernel_context) { -if (engine->wa_ctx.vma->private != ce) { +if (engine->wa_ctx.vma->private != ce && +i915_mitigate_clear_residuals ()) { ret =clear_residuals (rq);if (ret)return ret;
drivers/gpu/drm/i915/i915_mitigations.c new file +146 -0
146 lines not on this page · raw message
drivers/gpu/drm/i915/i915_mitigations.h new file +13 -0
@@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: MIT */ +/* +* Copyright © 2021 Intel Corporation +*/ + +#ifndef __I915_MITIGATIONS_H__ +#define __I915_MITIGATIONS_H__ + +#include <linux/types.h> + +bool i915_mitigate_clear_residuals (void ); + +#endif /* __I915_MITIGATIONS_H__ */
Greg Kroah-Hartman
maintainerPATCH 13/152 drm/i915/gt: Limit VFE threads based on GT
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
commit ffaf97899c4a58b9fefb11534f730785443611a8 upstream.
MEDIA_STATE_VFE only accepts the 'maximum number of threads' in the range [0, n-1] where n is #EU * (#threads/EU) with the number of threads based on plaform and the number of EU based on the number of slices and subslices. This is a fixed number per platform/gt, so appropriately limit the number of threads we spawn to match the device.
v2: Oversaturate the system with tasks to force execution on every HW thread; if the thread idles it is returned to the pool and may be reused again before an unused thread.
v3: Fix more state commands, which was causing Baytrail to barf.
v4: STATE_CACHE_INVALIDATE requires a stall on Ivybridge
--- drivers/gpu/drm/i915/gt/gen7_renderclear.c | 157 +++++++++++++++++------------ 1 file changed, 94 insertions(+), 63 deletions(-)
drivers/gpu/drm/i915/gt/gen7_renderclear.c +94 -63
@@ -7,8 +7,6 @@#include "i915_drv.h" #include "intel_gpu_commands.h" -#define MAX_URB_ENTRIES 64 -#define STATE_SIZE (4 * 1024)#define GT3_INLINE_DATA_DELAYS 0x1E00#define batch_advance (Y ,CS ) GEM_BUG_ON((Y)->end != (CS))
@@ -34,38 +32,59 @@ struct batch_chunk { };struct batch_vals { -u32 max_primitives; -u32 max_urb_entries; -u32 cmd_size; -u32 state_size; +u32 max_threads;u32 state_start; -u32 batch_size; +u32 surface_start;u32 surface_height;u32 surface_width; -u32 scratch_size; -u32 max_size; +u32 size; }; +static inline int num_primitives (const struct batch_vals *bv) +{ +/* +* We need to saturate the GPU with work in order to dispatch +* a shader on every HW thread, and clear the thread-local registers. +* In short, we have to dispatch work faster than the shaders can +* run in order to fill the EU and occupy each HW thread. +*/ +return bv->max_threads; +} +static void batch_get_defaults (struct drm_i915_private *i915,struct batch_vals *bv) {if (IS_HASWELL (i915)) { - bv->max_primitives =280 ; - bv->max_urb_entries =MAX_URB_ENTRIES ; +switch (INTEL_INFO (i915)->gt) { +default : +case 1 : + bv->max_threads =70 ; +break ; +case 2 : + bv->max_threads =140 ; +break ; +case 3 : + bv->max_threads =280 ; +break ; + } bv->surface_height =16 *16 ; bv->surface_width =32 *2 *16 ; }else { - bv->max_primitives =128 ; - bv->max_urb_entries =MAX_URB_ENTRIES /2 ; +switch (INTEL_INFO (i915)->gt) { +default : +case 1 :/* including vlv */ + bv->max_threads =36 ; +break ; +case 2 : + bv->max_threads =128 ; +break ; + } bv->surface_height =16 *8 ; bv->surface_width =32 *16 ; } - bv->cmd_size = bv->max_primitives *4096 ; - bv->state_size =STATE_SIZE ; - bv->state_start = bv->cmd_size; - bv->batch_size = bv->cmd_size + bv->state_size; - bv->scratch_size = bv->surface_height * bv->surface_width; - bv->max_size = bv->batch_size + bv->scratch_size; + bv->state_start =round_up (SZ_1K +num_primitives (bv) *64 ,SZ_4K ); + bv->surface_start = bv->state_start +SZ_4K ; + bv->size = bv->surface_start + bv->surface_height * bv->surface_width; } static void batch_init(struct batch_chunk *bc,
@@ -155,7 +174,8 @@ static u32 gen7_fill_binding_table(struct batch_chunk *state, const struct batch_vals *bv) { - u32 surface_start = gen7_fill_surface_state(state, bv->batch_size, bv); + u32 surface_start = +gen7_fill_surface_state (state, bv->surface_start, bv);u32 *cs =batch_alloc_items (state,32 ,8 );u32 offset =batch_offset (state, cs);
@@ -214,9 +234,9 @@ static void gen7_emit_state_base_address(struct batch_chunk *batch, u32 surface_state_base) { -u32 *cs =batch_alloc_items (batch,0 ,12 ); +u32 *cs =batch_alloc_items (batch,0 ,10 ); - *cs++ =STATE_BASE_ADDRESS | (12 -2 ); + *cs++ =STATE_BASE_ADDRESS | (10 -2 );/* general */ *cs++ =batch_addr (batch) |BASE_ADDRESS_MODIFY ;/* surface */
@@ -233,8 +253,6 @@ gen7_emit_state_base_address(struct batc *cs++ =BASE_ADDRESS_MODIFY ; *cs++ =0 ; *cs++ =BASE_ADDRESS_MODIFY ; - *cs++ =0 ; - *cs++ =0 ;batch_advance (batch, cs); }
@@ -244,8 +262,7 @@ gen7_emit_vfe_state(struct batch_chunk * u32 urb_size, u32 curbe_size, u32 mode) { - u32 urb_entries = bv->max_urb_entries; -u32 threads = bv->max_primitives -1 ; + u32 threads = bv->max_threads - 1;u32 *cs =batch_alloc_items (batch,32 ,8 ); *cs++ =MEDIA_VFE_STATE | (8 -2 );
@@ -254,7 +271,7 @@ gen7_emit_vfe_state(struct batch_chunk * *cs++ =0 ;/* number of threads & urb entries for GPGPU vs Media Mode */ - *cs++ = threads <<16 | urb_entries <<8 | mode <<2 ; + *cs++ = threads <<16 |1 <<8 | mode <<2 ; *cs++ =0 ;
@@ -293,17 +310,12 @@ gen7_emit_media_object(struct batch_chun {unsigned int x_offset = (media_object_index %16 ) *64 ;unsigned int y_offset = (media_object_index /16 ) *16 ; -unsigned int inline_data_size; -unsigned int media_batch_size; -unsigned int i; +unsigned int pkt =6 +3 ;u32 *cs; - inline_data_size =112 *8 ; - media_batch_size = inline_data_size +6 ; - - cs =batch_alloc_items (batch,8 , media_batch_size); + cs =batch_alloc_items (batch,8 , pkt); - *cs++ =MEDIA_OBJECT | (media_batch_size -2 ); + *cs++ =MEDIA_OBJECT | (pkt -2 );/* interface descriptor offset */ *cs++ =0 ;
@@ -317,25 +329,44 @@ gen7_emit_media_object(struct batch_chun *cs++ =0 ;/* inline */ - *cs++ = (y_offset <<16 ) | (x_offset); + *cs++ = y_offset <<16 | x_offset; *cs++ =0 ; *cs++ =GT3_INLINE_DATA_DELAYS ; -for (i =3 ; i < inline_data_size; i++) - *cs++ =0 ;batch_advance (batch, cs); }static void gen7_emit_pipeline_flush (struct batch_chunk *batch) { -u32 *cs =batch_alloc_items (batch,0 ,5 ); +u32 *cs =batch_alloc_items (batch,0 ,4 ); - *cs++ =GFX_OP_PIPE_CONTROL (5 ); - *cs++ =PIPE_CONTROL_STATE_CACHE_INVALIDATE | -PIPE_CONTROL_GLOBAL_GTT_IVB ; + *cs++ =GFX_OP_PIPE_CONTROL (4 ); + *cs++ =PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH | +PIPE_CONTROL_DEPTH_CACHE_FLUSH | +PIPE_CONTROL_DC_FLUSH_ENABLE | +PIPE_CONTROL_CS_STALL ; *cs++ =0 ; *cs++ =0 ; + +batch_advance (batch, cs); +} + +static void gen7_emit_pipeline_invalidate (struct batch_chunk *batch) +{ +u32 *cs =batch_alloc_items (batch,0 ,8 ); + +/* ivb: Stall before STATE_CACHE_INVALIDATE */ + *cs++ =GFX_OP_PIPE_CONTROL (4 ); + *cs++ =PIPE_CONTROL_STALL_AT_SCOREBOARD | +PIPE_CONTROL_CS_STALL ; + *cs++ =0 ; + *cs++ =0 ; + + *cs++ =GFX_OP_PIPE_CONTROL (4 ); + *cs++ =PIPE_CONTROL_STATE_CACHE_INVALIDATE ; *cs++ =0 ; + *cs++ =0 ; +batch_advance (batch, cs); }
@@ -344,34 +375,34 @@ static void emit_batch(struct i915_vma * const struct batch_vals *bv) {struct drm_i915_private *i915 = vma->vm->i915; -unsigned int desc_count =64 ; -const u32 urb_size =112 ; +const unsigned int desc_count =1 ; +const unsigned int urb_size =1 ;struct batch_chunk cmds, state; -u32 interface_descriptor; +u32 descriptors;unsigned int i; -batch_init (&cmds, vma, start,0 , bv->cmd_size); -batch_init (&state, vma, start, bv->state_start, bv->state_size); +batch_init (&cmds, vma, start,0 , bv->state_start); +batch_init (&state, vma, start, bv->state_start,SZ_4K ); - interface_descriptor = -gen7_fill_interface_descriptor (&state, bv, -IS_HASWELL (i915) ? - &cb_kernel_hsw : - &cb_kernel_ivb, - desc_count); -gen7_emit_pipeline_flush (&cmds); + descriptors =gen7_fill_interface_descriptor (&state, bv, +IS_HASWELL (i915) ? + &cb_kernel_hsw : + &cb_kernel_ivb, + desc_count); + +gen7_emit_pipeline_invalidate (&cmds);batch_add (&cmds,PIPELINE_SELECT |PIPELINE_SELECT_MEDIA );batch_add (&cmds,MI_NOOP ); -gen7_emit_state_base_address (&cmds, interface_descriptor); +gen7_emit_pipeline_invalidate (&cmds); +gen7_emit_pipeline_flush (&cmds); +gen7_emit_state_base_address (&cmds, descriptors); +gen7_emit_pipeline_invalidate (&cmds);gen7_emit_vfe_state (&cmds, bv, urb_size -1 ,0 ,0 ); +gen7_emit_interface_descriptor_load (&cmds, descriptors, desc_count); -gen7_emit_interface_descriptor_load (&cmds, - interface_descriptor, - desc_count); - -for (i =0 ; i < bv->max_primitives; i++) +for (i =0 ; i <num_primitives (bv); i++)gen7_emit_media_object (&cmds, i);batch_add (&cmds,MI_BATCH_BUFFER_END );
@@ -385,15 +416,15 @@ int gen7_setup_clear_gpr_bb(struct intelbatch_get_defaults (engine->i915, &bv);if (!vma) -return bv.max_size; +return bv.size; -GEM_BUG_ON (vma->obj->base.size < bv.max_size); +GEM_BUG_ON (vma->obj->base.size < bv.size); batch =i915_gem_object_pin_map (vma->obj,I915_MAP_WC );if (IS_ERR (batch))return PTR_ERR (batch); -emit_batch (vma,memset (batch,0 , bv.max_size), &bv); +emit_batch (vma,memset (batch,0 , bv.size), &bv);i915_gem_object_flush_map (vma->obj);__i915_gem_object_release_map (vma->obj);
Greg Kroah-Hartman
maintainerPATCH 14/152 drm/i915/backlight: fix CPU mode backlight takeover on LPT
In reply to Greg Kroah-HartmanFrom: Jani Nikula <[email protected]>
commit bb83d5fb550bb7db75b29e6342417fda2bbb691c upstream.
The pch_get_backlight(), lpt_get_backlight(), and lpt_set_backlight() functions operate directly on the hardware registers. If inverting the value is needed, using intel_panel_compute_brightness(), it should only be done in the interface between hardware registers and panel->backlight.level.
The CPU mode takeover code added in commit 5b1ec9ac7ab5 ("drm/i915/backlight: Fix backlight takeover on LPT, v3.") reads the hardware register and converts to panel->backlight.level correctly, however the value written back should remain in the hardware register "domain".
This hasn't been an issue, because GM45 machines are the only known users of i915.invert_brightness and the brightness invert quirk, and without one of them no conversion is made. It's likely nobody's ever hit the problem.
--- drivers/gpu/drm/i915/display/intel_panel.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/gpu/drm/i915/display/intel_panel.c +5 -4
@@ -1650,16 +1650,13 @@ static int lpt_setup_backlight(struct in val =pch_get_backlight (connector); else val =lpt_get_backlight (connector); - val =intel_panel_compute_brightness (connector, val); - panel->backlight.level =clamp (val, panel->backlight.min, - panel->backlight.max);if (cpu_mode) {drm_dbg_kms (&dev_priv->drm,"CPU backlight register was enabled, switching to PCH override\n" );/* Write converted CPU PWM value to PCH override register */ -lpt_set_backlight (connector->base.state, panel->backlight.level); +lpt_set_backlight (connector->base.state, val);intel_de_write (dev_priv,BLC_PWM_PCH_CTL1 , pch_ctl1 |BLM_PCH_OVERRIDE_ENABLE );
@@ -1667,6 +1664,10 @@ static int lpt_setup_backlight(struct in cpu_ctl2 & ~BLM_PWM_ENABLE); } + val =intel_panel_compute_brightness (connector, val); + panel->backlight.level =clamp (val, panel->backlight.min, + panel->backlight.max); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 15/152 drm/bridge: sii902x: Refactor init code into separate function
In reply to Greg Kroah-HartmanFrom: Alexandru Gagniuc <[email protected]>
commit 91b5e26731c5d409d6134603afc061617639933e upstream.
Separate the hardware initialization code from setting up the data structures and parsing the device tree. The purpose of this change is to provide a single exit point and avoid a waterfall of 'goto's in the subsequent patch.
--- drivers/gpu/drm/bridge/sii902x.c | 77 +++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 34 deletions(-)
drivers/gpu/drm/bridge/sii902x.c +43 -34
@@ -954,41 +954,13 @@ static const struct drm_bridge_timings d | DRM_BUS_FLAG_DE_HIGH, }; -static int sii902x_probe (struct i2c_client *client, -const struct i2c_device_id *id) +static int sii902x_init (struct sii902x *sii902x) { -struct device *dev = &client->dev; +struct device *dev = &sii902x->i2c->dev;unsigned int status =0 ; -struct sii902x *sii902x;u8 chipid[4 ];int ret; - ret =i2c_check_functionality (client->adapter, -I2C_FUNC_SMBUS_BYTE_DATA ); -if (!ret) { -dev_err (dev,"I2C adapter not suitable\n" ); -return -EIO ; - } - - sii902x =devm_kzalloc (dev,sizeof (*sii902x),GFP_KERNEL ); -if (!sii902x) -return -ENOMEM ; - - sii902x->i2c = client; - sii902x->regmap =devm_regmap_init_i2c (client, &sii902x_regmap_config); -if (IS_ERR (sii902x->regmap)) -return PTR_ERR (sii902x->regmap); - - sii902x->reset_gpio =devm_gpiod_get_optional (dev,"reset" , -GPIOD_OUT_LOW ); -if (IS_ERR (sii902x->reset_gpio)) { -dev_err (dev,"Failed to retrieve/request reset gpio: %ld\n" , -PTR_ERR (sii902x->reset_gpio)); -return PTR_ERR (sii902x->reset_gpio); - } - -mutex_init (&sii902x->mutex); -sii902x_reset (sii902x); ret =regmap_write (sii902x->regmap,SII902X_REG_TPI_RQB ,0x0 );
@@ -1012,11 +984,11 @@ static int sii902x_probe(struct i2c_clieregmap_read (sii902x->regmap,SII902X_INT_STATUS , &status);regmap_write (sii902x->regmap,SII902X_INT_STATUS , status); -if (client->irq >0 ) { +if (sii902x->i2c->irq >0 ) {regmap_write (sii902x->regmap,SII902X_INT_ENABLE ,SII902X_HOTPLUG_EVENT ); - ret =devm_request_threaded_irq (dev, client->irq,NULL , + ret =devm_request_threaded_irq (dev, sii902x->i2c->irq,NULL , sii902x_interrupt,IRQF_ONESHOT ,dev_name (dev), sii902x);
@@ -1031,9 +1003,9 @@ static int sii902x_probe(struct i2c_cliesii902x_audio_codec_init (sii902x, dev); -i2c_set_clientdata (client, sii902x); +i2c_set_clientdata (sii902x->i2c, sii902x); - sii902x->i2cmux =i2c_mux_alloc (client->adapter, dev, + sii902x->i2cmux =i2c_mux_alloc (sii902x->i2c->adapter, dev,1 ,0 ,I2C_MUX_GATE , sii902x_i2c_bypass_select, sii902x_i2c_bypass_deselect);
@@ -1044,6 +1016,43 @@ static int sii902x_probe(struct i2c_cliereturn i2c_mux_add_adapter (sii902x->i2cmux,0 ,0 ,0 ); } +static int sii902x_probe (struct i2c_client *client, +const struct i2c_device_id *id) +{ +struct device *dev = &client->dev; +struct sii902x *sii902x; +int ret; + + ret =i2c_check_functionality (client->adapter, +I2C_FUNC_SMBUS_BYTE_DATA ); +if (!ret) { +dev_err (dev,"I2C adapter not suitable\n" ); +return -EIO ; + } + + sii902x =devm_kzalloc (dev,sizeof (*sii902x),GFP_KERNEL ); +if (!sii902x) +return -ENOMEM ; + + sii902x->i2c = client; + sii902x->regmap =devm_regmap_init_i2c (client, &sii902x_regmap_config); +if (IS_ERR (sii902x->regmap)) +return PTR_ERR (sii902x->regmap); + + sii902x->reset_gpio =devm_gpiod_get_optional (dev,"reset" , +GPIOD_OUT_LOW ); +if (IS_ERR (sii902x->reset_gpio)) { +dev_err (dev,"Failed to retrieve/request reset gpio: %ld\n" , +PTR_ERR (sii902x->reset_gpio)); +return PTR_ERR (sii902x->reset_gpio); + } + +mutex_init (&sii902x->mutex); + + ret =sii902x_init (sii902x); +return ret; +} +static int sii902x_remove (struct i2c_client *client) {
Greg Kroah-Hartman
maintainerPATCH 16/152 dt-bindings: display: sii902x: Add supply bindings
In reply to Greg Kroah-HartmanFrom: Alexandru Gagniuc <[email protected]>
commit 4c1e054322da99cbfd293a5fddf283f2fdb3e2d0 upstream.
The sii902x chip family requires IO and core voltages to reach the correct voltage before chip initialization. Add binding for describing the two supplies.
--- Documentation/devicetree/bindings/display/bridge/sii902x.txt | 4 ++++ 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/display/bridge/sii902x.txt +4 -0
@@ -8,6 +8,8 @@ Optional properties: - interrupts: describe the interrupt line used to inform the host about hotplug events. - reset-gpios: OF device-tree gpio specification for RST_N pin. + - iovcc-supply: I/O Supply Voltage (1.8V or 3.3V) + - cvcc12-supply: Digital Core Supply Voltage (1.2V) HDMI audio properties: - #sound-dai-cells: <0> or <1>. <0> if only i2s or spdif pin
@@ -54,6 +56,8 @@ Example: compatible = "sil,sii9022"; reg = <0x39>; reset-gpios = <&pioA 1 0>; + iovcc-supply = <&v3v3_hdmi>; + cvcc12-supply = <&v1v2_hdmi>; #sound-dai-cells = <0>; sil,i2s-data-lanes = < 0 1 2 >;
Greg Kroah-Hartman
maintainerPATCH 17/152 drm/bridge: sii902x: Enable I/O and core VCC supplies if present
In reply to Greg Kroah-HartmanFrom: Alexandru Gagniuc <[email protected]>
commit cc5f7e2fcbe396f2f461cd67c872af771a334bca upstream.
On the SII9022, the IOVCC and CVCC12 supplies must reach the correct voltage before the reset sequence is initiated. On most boards, this assumption is true at boot-up, so initialization succeeds.
However, when we try to initialize the chip with incorrect supply voltages, it will not respond to I2C requests. sii902x_probe() fails with -ENXIO.
To resolve this, look for the "iovcc" and "cvcc12" regulators, and make sure they are enabled before starting the reset sequence. If these supplies are not available in devicetree, then they will default to dummy-regulator. In that case everything will work like before.
This was observed on a STM32MP157C-DK2 booting in u-boot falcon mode. On this board, the supplies would be set by the second stage bootloader, which does not run in falcon mode.
--- drivers/gpu/drm/bridge/sii902x.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/gpu/drm/bridge/sii902x.c +23 -0
@@ -17,6 +17,7 @@#include <linux/i2c.h> #include <linux/module.h> #include <linux/regmap.h> +#include <linux/regulator/consumer.h> #include <linux/clk.h> #include <drm/drm_atomic_helper.h>
@@ -168,6 +169,7 @@ struct sii902x {struct drm_connector connector;struct gpio_desc *reset_gpio;struct i2c_mux_core *i2cmux; +struct regulator_bulk_data supplies[2 ];/* * Mutex protects audio and video functions from interfering * each other, by keeping their i2c command sequences atomic.
@@ -1049,7 +1051,26 @@ static int sii902x_probe(struct i2c_cliemutex_init (&sii902x->mutex); + sii902x->supplies[0 ].supply ="iovcc" ; + sii902x->supplies[1 ].supply ="cvcc12" ; + ret =devm_regulator_bulk_get (dev,ARRAY_SIZE (sii902x->supplies), + sii902x->supplies); +if (ret <0 ) +return ret; + + ret =regulator_bulk_enable (ARRAY_SIZE (sii902x->supplies), + sii902x->supplies); +if (ret <0 ) { +dev_err_probe (dev, ret,"Failed to enable supplies" ); +return ret; + } + ret =sii902x_init (sii902x); +if (ret <0 ) { +regulator_bulk_disable (ARRAY_SIZE (sii902x->supplies), + sii902x->supplies); + } +return ret; }
@@ -1060,6 +1081,8 @@ static int sii902x_remove(struct i2c_clii2c_mux_del_adapters (sii902x->i2cmux);drm_bridge_remove (&sii902x->bridge); +regulator_bulk_disable (ARRAY_SIZE (sii902x->supplies), + sii902x->supplies);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 18/152 tracing/kprobes: Do the notrace functions check without kprobes on ftrace
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
commit 7bb83f6fc4ee84e95d0ac0d14452c2619fb3fe70 upstream.
Enable the notrace function check on the architecture which doesn't support kprobes on ftrace but support dynamic ftrace. This notrace function check is not only for the kprobes on ftrace but also sw-breakpoint based kprobes.
Thus there is no reason to limit this check for the arch which supports kprobes on ftrace.
This also changes the dependency of Kconfig. Because kprobe event uses the function tracer's address list for identifying notrace function, if the CONFIG_DYNAMIC_FTRACE=n, it can not check whether the target function is notrace or not.
--- kernel/trace/Kconfig | 2 +- kernel/trace/trace_kprobe.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
kernel/trace/Kconfig +1 -1
@@ -531,7 +531,7 @@ config KPROBE_EVENTS config KPROBE_EVENTS_ON_NOTRACE bool "Do NOT protect notrace function from kprobe events" depends on KPROBE_EVENTS - depends on KPROBES_ON_FTRACE + depends on DYNAMIC_FTRACE default n help This is only for the developers who want to debug ftrace itself
kernel/trace/trace_kprobe.c +1 -1
@@ -434,7 +434,7 @@ static int disable_trace_kprobe(struct treturn 0 ; } -#if defined(CONFIG_KPROBES_ON_FTRACE ) && \ +#if defined(CONFIG_DYNAMIC_FTRACE ) && \ !defined(CONFIG_KPROBE_EVENTS_ON_NOTRACE )static bool __within_notrace_func (unsigned long addr) {
Greg Kroah-Hartman
maintainerPATCH 19/152 tools/bootconfig: Add tracing_on support to helper scripts
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
commit 55ed4560774d81d7343223b8fd2784c530a9c6c1 upstream.
Add ftrace.instance.INSTANCE.tracing_on support to ftrace2bconf.sh and bconf2ftrace.sh.
commit 8490db06f914 ("tracing/boot: Add per-instance tracing_on option support") added the per-instance tracing_on option, but forgot to update the helper scripts.
--- tools/bootconfig/scripts/bconf2ftrace.sh | 1 + tools/bootconfig/scripts/ftrace2bconf.sh | 4 ++++ 2 files changed, 5 insertions(+)
tools/bootconfig/scripts/bconf2ftrace.sh +1 -0
@@ -152,6 +152,7 @@ setup_instance() { # [instance] set_array_of ${instance}.options ${instancedir}/trace_options set_value_of ${instance}.trace_clock ${instancedir}/trace_clock set_value_of ${instance}.cpumask ${instancedir}/tracing_cpumask + set_value_of ${instance}.tracing_on ${instancedir}/tracing_on set_value_of ${instance}.tracer ${instancedir}/current_tracer set_array_of ${instance}.ftrace.filters \ ${instancedir}/set_ftrace_filter
tools/bootconfig/scripts/ftrace2bconf.sh +4 -0
@@ -221,6 +221,10 @@ instance_options() { # [instance-name] if [ `echo $val | sed -e s/f//g`x != x ]; then emit_kv $PREFIX.cpumask = $val fi + val=`cat $INSTANCE/tracing_on` + if [ `echo $val | sed -e s/f//g`x != x ]; then + emit_kv $PREFIX.tracing_on = $val + fi val= for i in `cat $INSTANCE/set_event`; do
Greg Kroah-Hartman
maintainerPATCH 20/152 ext4: use IS_ERR instead of IS_ERR_OR_NULL and set inode null when IS_ERR
In reply to Greg Kroah-HartmanFrom: Yi Li <[email protected]>
commit 23dd561ad9eae02b4d51bb502fe4e1a0666e9567 upstream.
1: ext4_iget/ext4_find_extent never returns NULL, use IS_ERR instead of IS_ERR_OR_NULL to fix this.
2: ext4_fc_replay_inode should set the inode to NULL when IS_ERR. and go to call iput properly.
--- fs/ext4/fast_commit.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
fs/ext4/fast_commit.c +12 -11
@@ -1269,14 +1269,14 @@ static int ext4_fc_replay_unlink(struct entry.len = darg.dname_len; inode =ext4_iget (sb, darg.ino,EXT4_IGET_NORMAL ); -if (IS_ERR_OR_NULL (inode)) { +if (IS_ERR (inode)) {jbd_debug (1 ,"Inode %d not found" , darg.ino);return 0 ; } old_parent =ext4_iget (sb, darg.parent_ino,EXT4_IGET_NORMAL ); -if (IS_ERR_OR_NULL (old_parent)) { +if (IS_ERR (old_parent)) {jbd_debug (1 ,"Dir with inode %d not found" , darg.parent_ino);iput (inode);return 0 ;
@@ -1361,7 +1361,7 @@ static int ext4_fc_replay_link(struct su darg.parent_ino, darg.dname_len); inode =ext4_iget (sb, darg.ino,EXT4_IGET_NORMAL ); -if (IS_ERR_OR_NULL (inode)) { +if (IS_ERR (inode)) {jbd_debug (1 ,"Inode not found." );return 0 ; }
@@ -1417,10 +1417,11 @@ static int ext4_fc_replay_inode(struct strace_ext4_fc_replay (sb, tag, ino,0 ,0 ); inode =ext4_iget (sb, ino,EXT4_IGET_NORMAL ); -if (!IS_ERR_OR_NULL (inode)) { +if (!IS_ERR (inode)) {ext4_ext_clear_bb (inode);iput (inode); } + inode =NULL ;ext4_fc_record_modified_inode (sb, ino);
@@ -1463,7 +1464,7 @@ static int ext4_fc_replay_inode(struct s/* Given that we just wrote the inode on disk, this SHOULD succeed. */ inode =ext4_iget (sb, ino,EXT4_IGET_NORMAL ); -if (IS_ERR_OR_NULL (inode)) { +if (IS_ERR (inode)) {jbd_debug (1 ,"Inode not found." );return -EFSCORRUPTED ; }
@@ -1515,7 +1516,7 @@ static int ext4_fc_replay_create(struct goto out; inode =ext4_iget (sb, darg.ino,EXT4_IGET_NORMAL ); -if (IS_ERR_OR_NULL (inode)) { +if (IS_ERR (inode)) {jbd_debug (1 ,"inode %d not found." , darg.ino); inode =NULL ; ret = -EINVAL ;
@@ -1528,7 +1529,7 @@ static int ext4_fc_replay_create(struct* dot and dot dot dirents are setup properly. */ dir =ext4_iget (sb, darg.parent_ino,EXT4_IGET_NORMAL ); -if (IS_ERR_OR_NULL (dir)) { +if (IS_ERR (dir)) {jbd_debug (1 ,"Dir %d not found." , darg.ino); goto out; }
@@ -1604,7 +1605,7 @@ static int ext4_fc_replay_add_range(stru inode =ext4_iget (sb,le32_to_cpu (fc_add_ex->fc_ino),EXT4_IGET_NORMAL ); -if (IS_ERR_OR_NULL (inode)) { +if (IS_ERR (inode)) {jbd_debug (1 ,"Inode not found." );return 0 ; }
@@ -1728,7 +1729,7 @@ ext4_fc_replay_del_range(struct super_bl le32_to_cpu(lrange->fc_ino), cur, remaining); inode =ext4_iget (sb,le32_to_cpu (lrange->fc_ino),EXT4_IGET_NORMAL ); -if (IS_ERR_OR_NULL (inode)) { +if (IS_ERR (inode)) {jbd_debug (1 ,"Inode %d not found" ,le32_to_cpu (lrange->fc_ino));return 0 ; }
@@ -1809,7 +1810,7 @@ static void ext4_fc_set_bitmaps_and_counfor (i =0 ; i < state->fc_modified_inodes_used; i++) { inode =ext4_iget (sb, state->fc_modified_inodes[i],EXT4_IGET_NORMAL ); -if (IS_ERR_OR_NULL (inode)) { +if (IS_ERR (inode)) {jbd_debug (1 ,"Inode %d not found." , state->fc_modified_inodes[i]);continue ;
@@ -1826,7 +1827,7 @@ static void ext4_fc_set_bitmaps_and_counif (ret >0 ) { path =ext4_find_extent (inode, map.m_lblk,NULL ,0 ); -if (!IS_ERR_OR_NULL (path)) { +if (!IS_ERR (path)) {for (j =0 ; j < path->p_depth; j++)ext4_mb_mark_bb (inode->i_sb, path[j].p_block,1 ,1 );
Greg Kroah-Hartman
maintainerPATCH 21/152 ext4: fix wrong list_splice in ext4_fc_cleanup
In reply to Greg Kroah-HartmanFrom: Daejun Park <[email protected]>
commit 31e203e09f036f48e7c567c2d32df0196bbd303f upstream.
After full/fast commit, entries in staging queue are promoted to main queue. In ext4_fs_cleanup function, it splice to staging queue to staging queue.
--- fs/ext4/fast_commit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/fast_commit.c +1 -1
@@ -1207,7 +1207,7 @@ static void ext4_fc_cleanup(journal_t *jlist_splice_init (&sbi->s_fc_dentry_q[FC_Q_STAGING ], &sbi->s_fc_dentry_q[FC_Q_MAIN ]);list_splice_init (&sbi->s_fc_q[FC_Q_STAGING ], - &sbi->s_fc_q[FC_Q_STAGING ]); + &sbi->s_fc_q[FC_Q_MAIN ]);ext4_clear_mount_flag (sb,EXT4_MF_FC_COMMITTING );ext4_clear_mount_flag (sb,EXT4_MF_FC_INELIGIBLE );
Greg Kroah-Hartman
maintainerPATCH 22/152 ext4: fix bug for rename with RENAME_WHITEOUT
In reply to Greg Kroah-HartmanFrom: yangerkun <[email protected]>
commit 6b4b8e6b4ad8553660421d6360678b3811d5deb9 upstream.
We got a "deleted inode referenced" warning cross our fsstress test. The bug can be reproduced easily with following steps:
cd /dev/shm
mkdir test/
fallocate -l 128M img
mkfs.ext4 -b 1024 img
mount img test/
dd if=/dev/zero of=test/foo bs=1M count=128
mkdir test/dir/ && cd test/dir/
for ((i=0;i<1000;i++)); do touch file$i; done # consume all block cd ~ && renameat2(AT_FDCWD, /dev/shm/test/dir/file1, AT_FDCWD,
/dev/shm/test/dir/dst_file, RENAME_WHITEOUT) # ext4_add_entry in ext4_rename will return ENOSPC!!
cd /dev/shm/ && umount test/ && mount img test/ && ls -li test/dir/file1 We will get the output:
"ls: cannot access 'test/dir/file1': Structure needs cleaning" and the dmesg show:
"EXT4-fs error (device loop0): ext4_lookup:1626: inode #2049: comm ls:
deleted inode referenced: 139"
ext4_rename will create a special inode for whiteout and use this 'ino' to replace the source file's dir entry 'ino'. Once error happens latter(the error above was the ENOSPC return from ext4_add_entry in ext4_rename since all space has been consumed), the cleanup do drop the nlink for whiteout, but forget to restore 'ino' with source file. This will trigger the bug describle as above.
--- fs/ext4/namei.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
fs/ext4/namei.c +9 -8
@@ -3602,9 +3602,6 @@ static int ext4_setent(handle_t *handle,return retval2; } } -brelse (ent->bh); - ent->bh =NULL ; -return retval; }
@@ -3803,6 +3800,7 @@ static int ext4_rename(struct inode *old } } + old_file_type = old.de->file_type;if (IS_DIRSYNC (old.dir) ||IS_DIRSYNC (new.dir))ext4_handle_sync (handle);
@@ -3830,7 +3828,6 @@ static int ext4_rename(struct inode *old force_reread = (new.dir->i_ino == old.dir->i_ino &&ext4_test_inode_flag (new.dir,EXT4_INODE_INLINE_DATA )); - old_file_type = old.de->file_type;if (whiteout) {/* * Do this before adding a new entry, so the old entry is sure
@@ -3928,15 +3925,19 @@ static int ext4_rename(struct inode *old retval =0 ; end_rename: -brelse (old.dir_bh); -brelse (old.bh); -brelse (new.bh);if (whiteout) { -if (retval) +if (retval) { +ext4_setent (handle, &old, + old.inode->i_ino, old_file_type);drop_nlink (whiteout); + }unlock_new_inode (whiteout);iput (whiteout); + } +brelse (old.dir_bh); +brelse (old.bh); +brelse (new.bh);if (handle)ext4_journal_stop (handle);return retval;
Greg Kroah-Hartman
maintainerPATCH 23/152 cifs: check pointer before freeing
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
commit 77b6ec01c29aade01701aa30bf1469acc7f2be76 upstream.
clang static analysis reports this problem
dfs_cache.c:591:2: warning: Argument to kfree() is a constant address
(18446744073709551614), which is not memory allocated by malloc()
kfree(vi);
^~~~~~~~~In dfs_cache_del_vol() the volume info pointer 'vi' being freed is the return of a call to find_vol(). The large constant address is find_vol() returning an error.
Add an error check to dfs_cache_del_vol() similar to the one done in dfs_cache_update_vol().
--- fs/cifs/dfs_cache.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/cifs/dfs_cache.c +2 -1
@@ -1317,7 +1317,8 @@ void dfs_cache_del_vol(const char *fullp vi =find_vol (fullpath);spin_unlock (&vol_list_lock); -kref_put (&vi->refcnt, vol_release); +if (!IS_ERR (vi)) +kref_put (&vi->refcnt, vol_release); }/**
Greg Kroah-Hartman
maintainerPATCH 24/152 cifs: fix interrupted close commands
In reply to Greg Kroah-HartmanFrom: Paulo Alcantara <[email protected]>
commit 2659d3bff3e1b000f49907d0839178b101a89887 upstream.
Retry close command if it gets interrupted to not leak open handles on the server.
--- fs/cifs/smb2pdu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/cifs/smb2pdu.c +1 -1
@@ -3248,7 +3248,7 @@ close_exit:free_rsp_buf (resp_buftype, rsp);/* retry close in a worker thread if this one is interrupted */ -if (rc == -EINTR ) { +if (is_interrupt_error (rc)) {int tmp_rc; tmp_rc = smb2_handle_cancelled_close(tcon, persistent_fid,
Greg Kroah-Hartman
maintainerPATCH 25/152 riscv: Drop a duplicated PAGE_KERNEL_EXEC
In reply to Greg Kroah-HartmanFrom: Kefeng Wang <[email protected]>
commit 0ea02c73775277001c651ad4a0e83781a9acf406 upstream.
commit b91540d52a08 ("RISC-V: Add EFI runtime services") add a duplicated PAGE_KERNEL_EXEC, kill it.
--- arch/riscv/include/asm/pgtable.h | 1 - 1 file changed, 1 deletion(-)
arch/riscv/include/asm/pgtable.h +0 -1
@@ -99,7 +99,6 @@ | _PAGE_DIRTY)#define PAGE_KERNEL __pgprot(_PAGE_KERNEL) -#define PAGE_KERNEL_EXEC __pgprot(_PAGE_KERNEL | _PAGE_EXEC)#define PAGE_KERNEL_READ __pgprot(_PAGE_KERNEL & ~_PAGE_WRITE)#define PAGE_KERNEL_EXEC __pgprot(_PAGE_KERNEL | _PAGE_EXEC)#define PAGE_KERNEL_READ_EXEC __pgprot((_PAGE_KERNEL & ~_PAGE_WRITE) \
Greg Kroah-Hartman
maintainerPATCH 26/152 riscv: return -ENOSYS for syscall -1
In reply to Greg Kroah-HartmanFrom: Andreas Schwab <[email protected]>
commit cf7b2ae4d70432fa94ebba3fbaab825481ae7189 upstream.
Properly return -ENOSYS for syscall -1 instead of leaving the return value uninitialized. This fixes the strace teststuite.
--- arch/riscv/kernel/entry.S | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
arch/riscv/kernel/entry.S +1 -8
@@ -186,14 +186,7 @@ check_syscall_nr: * Syscall number held in a7. * If syscall number is above allowed value, redirect to ni_syscall. */ - bge a7, t0, 1f - /* - * Check if syscall is rejected by tracer, i.e., a7 == -1. - * If yes, we pretend it was executed. - */ - li t1, -1 - beq a7, t1, ret_from_syscall_rejected - blt a7, t1, 1f + bgeu a7, t0, 1f /* Call syscall */ la s0, sys_call_table slli t0, a7, RISCV_LGPTR
Greg Kroah-Hartman
maintainerPATCH 27/152 riscv: Fixup CONFIG_GENERIC_TIME_VSYSCALL
In reply to Greg Kroah-HartmanFrom: Guo Ren <[email protected]>
commit 0aa2ec8a475fb505fd98d93bbcf4e03beeeebcb6 upstream.
The patch fix commit: ad5d112 ("riscv: use vDSO common flow to reduce the latency of the time-related functions").
The GENERIC_TIME_VSYSCALL should be CONFIG_GENERIC_TIME_VSYSCALL or vgettimeofday won't work.
--- arch/riscv/include/asm/vdso.h | 2 +- arch/riscv/kernel/vdso.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/riscv/include/asm/vdso.h +1 -1
@@ -10,7 +10,7 @@#include <linux/types.h> -#ifndef GENERIC_TIME_VSYSCALL +#ifndef CONFIG_GENERIC_TIME_VSYSCALL struct vdso_data { };#endif
arch/riscv/kernel/vdso.c +1 -1
@@ -12,7 +12,7 @@#include <linux/binfmts.h> #include <linux/err.h> #include <asm/page.h> -#ifdef GENERIC_TIME_VSYSCALL +#ifdef CONFIG_GENERIC_TIME_VSYSCALL #include <vdso/datapage.h> #else #include <asm/vdso.h>
Greg Kroah-Hartman
maintainerPATCH 28/152 riscv: Fix KASAN memory mapping.
In reply to Greg Kroah-HartmanFrom: Nick Hu <[email protected]>
commit c25a053e15778f6b4d6553708673736e27a6c2cf upstream.
Use virtual address instead of physical address when translating the address to shadow memory by kasan_mem_to_shadow().
--- arch/riscv/mm/kasan_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/riscv/mm/kasan_init.c +2 -2
@@ -93,8 +93,8 @@ void __init kasan_init(void) VMALLOC_END));for_each_mem_range (i, &_start, &_end) { -void *start = (void *)_start; -void *end = (void *)_end; +void *start = (void *)__va (_start); +void *end = (void *)__va (_end);if (start >= end)break ;
Greg Kroah-Hartman
maintainerPATCH 29/152 mips: fix Section mismatch in reference
In reply to Greg Kroah-HartmanFrom: Anders Roxell <[email protected]>
commit ad4fddef5f2345aa9214e979febe2f47639c10d9 upstream.
When building mips tinyconfig with clang the following error show up:
WARNING: modpost: vmlinux.o(.text+0x1940c): Section mismatch in reference from the function r4k_cache_init() to the function .init.text:loongson3_sc_init() The function r4k_cache_init() references
the function __init loongson3_sc_init().
This is often because r4k_cache_init lacks a __init
annotation or the annotation of loongson3_sc_init is wrong.
Remove marked __init from function loongson3_sc_init(), mips_sc_probe_cm3(), and mips_sc_probe().
--- arch/mips/mm/c-r4k.c | 2 +- arch/mips/mm/sc-mips.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/mips/mm/c-r4k.c +1 -1
@@ -1609,7 +1609,7 @@ static void __init loongson2_sc_init(voi c->options |=MIPS_CPU_INCLUSIVE_CACHES ; } -static void __init loongson3_sc_init (void ) +static void loongson3_sc_init (void ) {struct cpuinfo_mips *c = ¤t_cpu_data;unsigned int config2, lsize;
arch/mips/mm/sc-mips.c +2 -2
@@ -146,7 +146,7 @@ static inline int mips_sc_is_activated(sreturn 1 ; } -static int __init mips_sc_probe_cm3 (void ) +static int mips_sc_probe_cm3 (void ) {struct cpuinfo_mips *c = ¤t_cpu_data;unsigned long cfg =read_gcr_l2_config ();
@@ -180,7 +180,7 @@ static int __init mips_sc_probe_cm3(voidreturn 0 ; } -static inline int __init mips_sc_probe (void ) +static inline int mips_sc_probe (void ) {struct cpuinfo_mips *c = ¤t_cpu_data;unsigned int config1, config2;
Greg Kroah-Hartman
maintainerPATCH 30/152 mips: lib: uncached: fix non-standard usage of variable sp
In reply to Greg Kroah-HartmanFrom: Anders Roxell <[email protected]>
commit 5b058973d3205578aa6c9a71392e072a11ca44ef upstream.
When building mips tinyconfig with clang the following warning show up:
arch/mips/lib/uncached.c:45:6: warning: variable 'sp' is uninitialized when used here [-Wuninitialized]
if (sp >= (long)CKSEG0 && sp < (long)CKSEG2)
^~
arch/mips/lib/uncached.c:40:18: note: initialize the variable 'sp' to silence this warning
register long sp __asm__("$sp");
^
= 01 warning generated.
Rework to make an explicit inline move, instead of the non-standard use of specifying registers for local variables. This is what's written from the gcc-10 manual [1] about specifying registers for local variables:
"6.47.5.2 Specifying Registers for Local Variables
.................................................
[...]
"The only supported use for this feature is to specify registers for input and output operands when calling Extended 'asm' (*note Extended Asm::). [...]".
[1] https://docs.w3cub.com/gcc~10/local-register-variables
--- arch/mips/lib/uncached.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/mips/lib/uncached.c +3 -1
@@ -37,10 +37,12 @@*/ unsigned long run_uncached (void *func) { - registerlong sp __asm__("$sp" ); registerlong ret __asm__("$2" );long lfunc = (long )func, ufunc;long usp; +long sp; + + __asm__("move %0, $sp" :"=r" (sp));if (sp >= (long )CKSEG0 && sp < (long )CKSEG2 ) usp =CKSEG1ADDR (sp);
Greg Kroah-Hartman
maintainerPATCH 31/152 MIPS: boot: Fix unaligned access with CONFIG_MIPS_RAW_APPENDED_DTB
In reply to Greg Kroah-HartmanFrom: Paul Cercueil <[email protected]>
commit 4d4f9c1a17a3480f8fe523673f7232b254d724b7 upstream.
The compressed payload is not necesarily 4-byte aligned, at least when compiling with Clang. In that case, the 4-byte value appended to the compressed payload that corresponds to the uncompressed kernel image size must be read using get_unaligned_le32().
This fixes Clang-built kernels not booting on MIPS (tested on a Ingenic JZ4770 board).
--- arch/mips/boot/compressed/decompress.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/mips/boot/compressed/decompress.c +2 -1
@@ -13,6 +13,7 @@#include <linux/libfdt.h> #include <asm/addrspace.h> +#include <asm/unaligned.h> /* * These two variables specify the free mem region
@@ -117,7 +118,7 @@ void decompress_kernel(unsigned long boo dtb_size =fdt_totalsize ((void *)&__appended_dtb);/* last four bytes is always image size in little endian */ - image_size =le32_to_cpup ((void *)&__image_end -4 ); + image_size =get_unaligned_le32 ((void *)&__image_end -4 );/* copy dtb to where the booted kernel will expect it */ memcpy((void *)VMLINUX_LOAD_ADDRESS_ULL + image_size,
Greg Kroah-Hartman
maintainerPATCH 32/152 MIPS: Fix malformed NT_FILE and NT_SIGINFO in 32bit coredumps
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit 698222457465ce343443be81c5512edda86e5914 upstream.
Patches that introduced NT_FILE and NT_SIGINFO notes back in 2012 had taken care of native (fs/binfmt_elf.c) and compat (fs/compat_binfmt_elf.c) coredumps; unfortunately, compat on mips (which does not go through the usual compat_binfmt_elf.c) had not been noticed.
As the result, both N32 and O32 coredumps on 64bit mips kernels have those sections malformed enough to confuse the living hell out of all gdb and readelf versions (up to and including the tip of binutils-gdb.git).
Longer term solution is to make both O32 and N32 compat use the regular compat_binfmt_elf.c, but that's too much for backports. The minimal solution is to do in arch/mips/kernel/binfmt_elf[on]32.c the same thing those patches have done in fs/compat_binfmt_elf.c
--- arch/mips/kernel/binfmt_elfn32.c | 7 +++++++ arch/mips/kernel/binfmt_elfo32.c | 7 +++++++ 2 files changed, 14 insertions(+)
arch/mips/kernel/binfmt_elfn32.c +7 -0
@@ -103,4 +103,11 @@ jiffies_to_old_timeval32(unsigned long j#undef ns_to_kernel_old_timeval#define ns_to_kernel_old_timeval ns_to_old_timeval32 +/* +* Some data types as stored in coredump. +*/ +#define user_long_t compat_long_t +#define user_siginfo_t compat_siginfo_t +#define copy_siginfo_to_external copy_siginfo_to_external32 +#include "../../../fs/binfmt_elf.c"
arch/mips/kernel/binfmt_elfo32.c +7 -0
@@ -106,4 +106,11 @@ jiffies_to_old_timeval32(unsigned long j#undef ns_to_kernel_old_timeval#define ns_to_kernel_old_timeval ns_to_old_timeval32 +/* +* Some data types as stored in coredump. +*/ +#define user_long_t compat_long_t +#define user_siginfo_t compat_siginfo_t +#define copy_siginfo_to_external copy_siginfo_to_external32 +#include "../../../fs/binfmt_elf.c"
Greg Kroah-Hartman
maintainerPATCH 33/152 MIPS: relocatable: fix possible boot hangup with KASLR enabled
In reply to Greg Kroah-HartmanFrom: Alexander Lobakin <[email protected]>
commit 69e976831cd53f9ba304fd20305b2025ecc78eab upstream.
LLVM-built Linux triggered a boot hangup with KASLR enabled.
arch/mips/kernel/relocate.c:get_random_boot() uses linux_banner, which is a string constant, as a random seed, but accesses it as an array of unsigned long (in rotate_xor()).
When the address of linux_banner is not aligned to sizeof(long), such access emits unaligned access exception and hangs the kernel.
Use PTR_ALIGN() to align input address to sizeof(long) and also align down the input length to prevent possible access-beyond-end.
--- arch/mips/kernel/relocate.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/mips/kernel/relocate.c +8 -2
@@ -187,8 +187,14 @@ static int __init relocate_exception_tabstatic inline __init unsigned long rotate_xor (unsigned long hash,const void *area,size_t size) { -size_t i; -unsigned long *ptr = (unsigned long *)area; +const typeof (hash) *ptr =PTR_ALIGN (area,sizeof (hash)); +size_t diff, i; + + diff = (void *)ptr - area; +if (unlikely (size < diff +sizeof (hash))) +return hash; + + size =ALIGN_DOWN (size - diff,sizeof (hash));for (i =0 ; i < size /sizeof (hash); i++) {/* Rotate by odd number of bits and XOR. */
Greg Kroah-Hartman
maintainerPATCH 34/152 RDMA/ocrdma: Fix use after free in ocrdma_dealloc_ucontext_pd()
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
commit f2bc3af6353cb2a33dfa9d270d999d839eef54cb upstream.
In ocrdma_dealloc_ucontext_pd() uctx->cntxt_pd is assigned to the variable pd and then after uctx->cntxt_pd is freed, the variable pd is passed to function _ocrdma_dealloc_pd() which dereferences pd directly or through its call to ocrdma_mbx_dealloc_pd().
Reorder the free using the variable pd.
--- drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +1 -1
@@ -434,9 +434,9 @@ static void ocrdma_dealloc_ucontext_pd(spr_err ("%s(%d) Freeing in use pdid=0x%x.\n" , __func__, dev->id, pd->id); } -kfree (uctx->cntxt_pd); uctx->cntxt_pd =NULL ;_ocrdma_dealloc_pd (dev, pd); +kfree (pd); }static struct ocrdma_pd *ocrdma_get_ucontext_pd (struct ocrdma_ucontext *uctx)
Greg Kroah-Hartman
maintainerPATCH 35/152 ACPI: scan: Harden acpi_device_add() against device ID overflows
In reply to Greg Kroah-HartmanFrom: Dexuan Cui <[email protected]>
commit a58015d638cd4e4555297b04bec9b49028369075 upstream.
Linux VM on Hyper-V crashes with the latest mainline:
[ 4.069624] detected buffer overflow in strcpy [ 4.077733] kernel BUG at lib/string.c:1149! .. [ 4.085819] RIP: 0010:fortify_panic+0xf/0x11 ... [ 4.085819] Call Trace: [ 4.085819] acpi_device_add.cold.15+0xf2/0xfb [ 4.085819] acpi_add_single_object+0x2a6/0x690 [ 4.085819] acpi_bus_check_add+0xc6/0x280 [ 4.085819] acpi_ns_walk_namespace+0xda/0x1aa [ 4.085819] acpi_walk_namespace+0x9a/0xc2 [ 4.085819] acpi_bus_scan+0x78/0x90 [ 4.085819] acpi_scan_init+0xfa/0x248 [ 4.085819] acpi_init+0x2c1/0x321 [ 4.085819] do_one_initcall+0x44/0x1d0 [ 4.085819] kernel_init_freeable+0x1ab/0x1f4
This is because of the recent buffer overflow detection in the commit 6a39e62abbaf ("lib: string.h: detect intra-object overflow in fortified string functions")
Here acpi_device_bus_id->bus_id can only hold 14 characters, while the the acpi_device_hid(device) returns a 22-char string "HYPER_V_GEN_COUNTER_V1".
Per ACPI Spec v6.2, Section 6.1.5 _HID (Hardware ID), if the ID is a string, it must be of the form AAA#### or NNNN####, i.e. 7 chars or 8 chars.
The field bus_id in struct acpi_device_bus_id was originally defined as char bus_id[9], and later was enlarged to char bus_id[15] in 2007 in the commit bb0958544f3c ("ACPI: use more understandable bus_id for ACPI devices")
Fix the issue by changing the field bus_id to const char *, and use kstrdup_const() to initialize it.
--- drivers/acpi/internal.h | 2 +- drivers/acpi/scan.c | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-)
drivers/acpi/internal.h +1 -1
@@ -97,7 +97,7 @@ void acpi_scan_table_handler(u32 event,extern struct list_head acpi_bus_id_list;struct acpi_device_bus_id { -char bus_id[15 ]; +const char *bus_id;unsigned int instance_no;struct list_head node; };
drivers/acpi/scan.c +14 -1
@@ -486,6 +486,7 @@ static void acpi_device_del(struct acpi_ acpi_device_bus_id->instance_no--; else {list_del (&acpi_device_bus_id->node); +kfree_const (acpi_device_bus_id->bus_id);kfree (acpi_device_bus_id); }break ;
@@ -674,7 +675,14 @@ int acpi_device_add(struct acpi_device * }if (!found) { acpi_device_bus_id = new_bus_id; -strcpy (acpi_device_bus_id->bus_id,acpi_device_hid (device)); + acpi_device_bus_id->bus_id = +kstrdup_const (acpi_device_hid (device),GFP_KERNEL ); +if (!acpi_device_bus_id->bus_id) { +pr_err (PREFIX "Memory allocation error for bus id\n" ); + result = -ENOMEM ; + goto err_free_new_bus_id; + } + acpi_device_bus_id->instance_no =0 ;list_add_tail (&acpi_device_bus_id->node, &acpi_bus_id_list); }
@@ -709,6 +717,11 @@ int acpi_device_add(struct acpi_device *if (device->parent)list_del (&device->node);list_del (&device->wakeup_list); + + err_free_new_bus_id: +if (!found) +kfree (new_bus_id); +mutex_unlock (&acpi_device_lock); err_detach:
Greg Kroah-Hartman
maintainerPATCH 36/152 xen/privcmd: allow fetching resource sizes
In reply to Greg Kroah-HartmanFrom: Roger Pau Monne <[email protected]>
commit ef3a575baf53571dc405ee4028e26f50856898e7 upstream.
Allow issuing an IOCTL_PRIVCMD_MMAP_RESOURCE ioctl with num = 0 and addr = 0 in order to fetch the size of a specific resource.
Add a shortcut to the default map resource path, since fetching the size requires no address to be passed in, and thus no VMA to setup.
This is missing from the initial implementation, and causes issues when mapping resources that don't have fixed or known sizes.
--- drivers/xen/privcmd.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-)
drivers/xen/privcmd.c +19 -6
@@ -717,14 +717,15 @@ static long privcmd_ioctl_restrict(strucreturn 0 ; } -static long privcmd_ioctl_mmap_resource (struct file *file,void __user *udata) +static long privcmd_ioctl_mmap_resource (struct file *file, +struct privcmd_mmap_resource __user *udata) {struct privcmd_data *data = file->private_data;struct mm_struct *mm = current->mm;struct vm_area_struct *vma;struct privcmd_mmap_resource kdata;xen_pfn_t *pfns =NULL ; -struct xen_mem_acquire_resource xdata; +struct xen_mem_acquire_resource xdata = { };int rc;if (copy_from_user (&kdata, udata,sizeof (kdata)))
@@ -734,6 +735,22 @@ static long privcmd_ioctl_mmap_resource(if (data->domid !=DOMID_INVALID && data->domid != kdata.dom)return -EPERM ; +/* Both fields must be set or unset */ +if (!!kdata.addr != !!kdata.num) +return -EINVAL ; + + xdata.domid = kdata.dom; + xdata.type = kdata.type; + xdata.id = kdata.id; + +if (!kdata.addr && !kdata.num) { +/* Query the size of the resource. */ + rc =HYPERVISOR_memory_op (XENMEM_acquire_resource, &xdata); +if (rc) +return rc; +return __put_user (xdata.nr_frames, &udata->num); + } +mmap_write_lock (mm); vma =find_vma (mm, kdata.addr);
@@ -768,10 +785,6 @@ static long privcmd_ioctl_mmap_resource( }else vma->vm_private_data =PRIV_VMA_LOCKED ; -memset (&xdata,0 ,sizeof (xdata)); - xdata.domid = kdata.dom; - xdata.type = kdata.type; - xdata.id = kdata.id; xdata.frame = kdata.idx; xdata.nr_frames = kdata.num;set_xen_guest_handle (xdata.frame_list, pfns);
Greg Kroah-Hartman
maintainerPATCH 37/152 compiler.h: Raise minimum version of GCC to 5.1 for arm64
In reply to Greg Kroah-HartmanFrom: Will Deacon <[email protected]>
commit dca5244d2f5b94f1809f0c02a549edf41ccd5493 upstream.
GCC versions >= 4.9 and < 5.1 have been shown to emit memory references beyond the stack pointer, resulting in memory corruption if an interrupt is taken after the stack pointer has been adjusted but before the reference has been executed. This leads to subtle, infrequent data corruption such as the EXT4 problems reported by Russell King at the link below.
Life is too short for buggy compilers, so raise the minimum GCC version required by arm64 to 5.1.
--- include/linux/compiler-gcc.h | 6 ++++++ 1 file changed, 6 insertions(+)
include/linux/compiler-gcc.h +6 -0
@@ -13,6 +13,12 @@/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58145 */ #if GCC_VERSION <40900 # error Sorry, your version of GCC is too old - please use 4.9 or newer. +#elif defined(CONFIG_ARM64 ) &&GCC_VERSION <50100 +/* +* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293 +* https://lore.kernel.org/r/[email protected] +*/ +# error Sorry, your version of GCC is too old - please use 5.1 or newer.#endif /*
Greg Kroah-Hartman
maintainerPATCH 38/152 mm/vmalloc.c: fix potential memory leak
In reply to Greg Kroah-HartmanFrom: Miaohe Lin <[email protected]>
commit c22ee5284cf58017fa8c6d21d8f8c68159b6faab upstream.
In VM_MAP_PUT_PAGES case, we should put pages and free array in vfree. But we missed to set area->nr_pages in vmap(). So we would fail to put pages in __vunmap() because area->nr_pages = 0.
--- mm/vmalloc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
mm/vmalloc.c +3 -1
@@ -2405,8 +2405,10 @@ void *vmap(struct page **pages, unsignedreturn NULL ; } -if (flags &VM_MAP_PUT_PAGES ) +if (flags &VM_MAP_PUT_PAGES ) { area->pages = pages; + area->nr_pages = count; + }return area->addr; }EXPORT_SYMBOL (vmap);
Greg Kroah-Hartman
maintainerPATCH 39/152 mm/hugetlb: fix potential missing huge page size info
In reply to Greg Kroah-HartmanFrom: Miaohe Lin <[email protected]>
commit 0eb98f1588c2cc7a79816d84ab18a55d254f481c upstream.
The huge page size is encoded for VM_FAULT_HWPOISON errors only. So if we return VM_FAULT_HWPOISON, huge page size would just be ignored.
--- mm/hugetlb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/hugetlb.c +1 -1
@@ -4372,7 +4372,7 @@ retry:* So we need to block hugepage fault by PG_hwpoison bit check. */ if (unlikely (PageHWPoison (page))) { - ret =VM_FAULT_HWPOISON | + ret =VM_FAULT_HWPOISON_LARGE |VM_FAULT_SET_HINDEX (hstate_index (h)); goto backout_unlocked; }
Greg Kroah-Hartman
maintainerPATCH 40/152 mm/process_vm_access.c: include compat.h
In reply to Greg Kroah-HartmanFrom: Andrew Morton <[email protected]>
commit eb351d75ce1e75b4f793d609efac08426ca50acd upstream.
Fix the build error:
mm/process_vm_access.c:277:5: error: implicit declaration of function 'in_compat_syscall'; did you mean 'in_ia32_syscall'? [-Werror=implicit-function-declaration]
--- mm/process_vm_access.c | 1 + 1 file changed, 1 insertion(+)
mm/process_vm_access.c +1 -0
@@ -9,6 +9,7 @@#include <linux/mm.h> #include <linux/uio.h> #include <linux/sched.h> +#include <linux/compat.h> #include <linux/sched/mm.h> #include <linux/highmem.h> #include <linux/ptrace.h>
Greg Kroah-Hartman
maintainerPATCH 41/152 dm raid: fix discard limits for raid1
In reply to Greg Kroah-HartmanFrom: Mike Snitzer <[email protected]>
commit cc07d72bf350b77faeffee1c37bc52197171473f upstream.
Block core warned that discard_granularity was 0 for dm-raid with personality of raid1. Reason is that raid_io_hints() was incorrectly special-casing raid1 rather than raid0.
Fix raid_io_hints() by removing discard limits settings for raid1. Check for raid0 instead.
--- drivers/md/dm-raid.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/md/dm-raid.c +3 -3
@@ -3730,10 +3730,10 @@ static void raid_io_hints(struct dm_targblk_limits_io_opt (limits, chunk_size_bytes *mddev_data_stripes (rs));/* -* RAID1 and RAID10 personalities require bio splitting, -* RAID0/4/5/6 don't and process large discard bios properly. +* RAID0 and RAID10 personalities require bio splitting, +* RAID1/4/5/6 don't and process large discard bios properly. */ -if (rs_is_raid1 (rs) ||rs_is_raid10 (rs)) { +if (rs_is_raid0 (rs) ||rs_is_raid10 (rs)) { limits->discard_granularity = chunk_size_bytes; limits->max_discard_sectors = rs->md.chunk_sectors; }
Greg Kroah-Hartman
maintainerPATCH 42/152 dm snapshot: flush merged data before committing metadata
In reply to Greg Kroah-HartmanFrom: Akilesh Kailash <[email protected]>
commit fcc42338375a1e67b8568dbb558f8b784d0f3b01 upstream.
If the origin device has a volatile write-back cache and the following events occur:
1: After finishing merge operation of one set of exceptions,
merge_callback() is invoked.
2: Update the metadata in COW device tracking the merge completion.
This update to COW device is flushed cleanly.
3: System crashes and the origin device's cache where the recent
merge was completed has not been flushed.
During the next cycle when we read the metadata from the COW device, we will skip reading those metadata whose merge was completed in step (1). This will lead to data loss/corruption.
To address this, flush the origin device post merge IO before updating the metadata.
--- drivers/md/dm-snap.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
drivers/md/dm-snap.c +24 -0
@@ -141,6 +141,11 @@ struct dm_snapshot {* for them to be committed. */ struct bio_list bios_queued_during_merge; + +/* +* Flush data after merge. +*/ +struct bio flush_bio; };/*
@@ -1121,6 +1126,17 @@ shut:static void error_bios (struct bio *bio); +static int flush_data (struct dm_snapshot *s) +{ +struct bio *flush_bio = &s->flush_bio; + +bio_reset (flush_bio); +bio_set_dev (flush_bio, s->origin->bdev); + flush_bio->bi_opf =REQ_OP_WRITE |REQ_PREFLUSH ; + +return submit_bio_wait (flush_bio); +} +static void merge_callback (int read_err,unsigned long write_err,void *context) {struct dm_snapshot *s = context;
@@ -1134,6 +1150,11 @@ static void merge_callback(int read_err, goto shut; } +if (flush_data (s) <0 ) { +DMERR ("Flush after merge failed: shutting down merge" ); + goto shut; + } +if (s->store->type->commit_merge (s->store, s->num_merging_chunks) <0 ) {DMERR ("Write error in exception store: shutting down merge" );
@@ -1318,6 +1339,7 @@ static int snapshot_ctr(struct dm_target s->first_merging_chunk =0 ; s->num_merging_chunks =0 ;bio_list_init (&s->bios_queued_during_merge); +bio_init (&s->flush_bio,NULL ,0 );/* Allocate hash table for COW data */ if (init_hash_tables (s)) {
@@ -1504,6 +1526,8 @@ static void snapshot_dtr(struct dm_targedm_exception_store_destroy (s->store); +bio_uninit (&s->flush_bio); +dm_put_device (ti, s->cow);dm_put_device (ti, s->origin);
Greg Kroah-Hartman
maintainerPATCH 43/152 dm integrity: fix flush with external metadata device
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit 9b5948267adc9e689da609eb61cf7ed49cae5fa8 upstream.
With external metadata device, flush requests are not passed down to the data device.
Fix this by submitting the flush request in dm_integrity_flush_buffers. In order to not degrade performance, we overlap the data device flush with the metadata device flush.
--- drivers/md/dm-bufio.c | 6 ++++ drivers/md/dm-integrity.c | 60 +++++++++++++++++++++++++++++++++++++--------- include/linux/dm-bufio.h | 1 3 files changed, 56 insertions(+), 11 deletions(-)
drivers/md/dm-bufio.c +6 -0
@@ -1534,6 +1534,12 @@ sector_t dm_bufio_get_device_size(struct }EXPORT_SYMBOL_GPL (dm_bufio_get_device_size); +struct dm_io_client *dm_bufio_get_dm_io_client (struct dm_bufio_client *c) +{ +return c->dm_io; +} +EXPORT_SYMBOL_GPL (dm_bufio_get_dm_io_client); +sector_t dm_bufio_get_block_number (struct dm_buffer *b) {return b->block;
drivers/md/dm-integrity.c +49 -11
116 lines not on this page · raw message
include/linux/dm-bufio.h +1 -0
@@ -150,6 +150,7 @@ void dm_bufio_set_minimum_buffers(structunsigned dm_bufio_get_block_size (struct dm_bufio_client *c);sector_t dm_bufio_get_device_size (struct dm_bufio_client *c); +struct dm_io_client *dm_bufio_get_dm_io_client (struct dm_bufio_client *c);sector_t dm_bufio_get_block_number (struct dm_buffer *b);void *dm_bufio_get_block_data (struct dm_buffer *b);void *dm_bufio_get_aux_data (struct dm_buffer *b);
Greg Kroah-Hartman
maintainerPATCH 44/152 dm integrity: fix the maximum number of arguments
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit 17ffc193cdc6dc7a613d00d8ad47fc1f801b9bf0 upstream.
Advance the maximum number of arguments from 9 to 15 to account for all potential feature flags that may be supplied.
Linux 4.19 added "meta_device" (356d9d52e1221ba0c9f10b8b38652f78a5298329) and "recalculate" (a3fcf7253139609bf9ff901fbf955fba047e75dd) flags.
Commit 468dfca38b1a6fbdccd195d875599cb7c8875cd9 added "sectors_per_bit" and "bitmap_flush_interval".
Commit 84597a44a9d86ac949900441cea7da0af0f2f473 added "allow_discards".
And the commit d537858ac8aaf4311b51240893add2fc62003b97 added "fix_padding".
--- drivers/md/dm-integrity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/dm-integrity.c +1 -1
@@ -3792,7 +3792,7 @@ static int dm_integrity_ctr(struct dm_taunsigned extra_args;struct dm_arg_set as;static const struct dm_arg _args[] = { - {0 ,9 ,"Invalid number of feature args" }, + {0 ,15 ,"Invalid number of feature args" }, };unsigned journal_sectors, interleave_sectors, buffer_sectors, journal_watermark, sync_msec;bool should_write_sb;
Greg Kroah-Hartman
maintainerPATCH 45/152 dm crypt: use GFP_ATOMIC when allocating crypto requests from softirq
In reply to Greg Kroah-HartmanFrom: Ignat Korchagin <[email protected]>
commit d68b29584c25dbacd01ed44a3e45abb35353f1de upstream.
Commit 39d42fa96ba1 ("dm crypt: add flags to optionally bypass kcryptd workqueues") made it possible for some code paths in dm-crypt to be executed in softirq context, when the underlying driver processes IO requests in interrupt/softirq context.
In this case sometimes when allocating a new crypto request we may get a stacktrace like below:
[ 210.103008][ C0] BUG: sleeping function called from invalid context at mm/mempool.c:381 [ 210.104746][ C0] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 2602, name: fio [ 210.106599][ C0] CPU: 0 PID: 2602 Comm: fio Tainted: G W 5.10.0+ #50 [ 210.108331][ C0] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 [ 210.110212][ C0] Call Trace: [ 210.110921][ C0] <IRQ> [ 210.111527][ C0] dump_stack+0x7d/0xa3 [ 210.112411][ C0] ___might_sleep.cold+0x122/0x151 [ 210.113527][ C0] mempool_alloc+0x16b/0x2f0 [ 210.114524][ C0] ? __queue_work+0x515/0xde0 [ 210.115553][ C0] ? mempool_resize+0x700/0x700 [ 210.116586][ C0] ? crypt_endio+0x91/0x180 [ 210.117479][ C0] ? blk_update_request+0x757/0x1150 [ 210.118513][ C0] ? blk_mq_end_request+0x4b/0x480 [ 210.119572][ C0] ? blk_done_softirq+0x21d/0x340 [ 210.120628][ C0] ? __do_softirq+0x190/0x611 [ 210.121626][ C0] crypt_convert+0x29f9/0x4c00 [ 210.122668][ C0] ? _raw_spin_lock_irqsave+0x87/0xe0 [ 210.123824][ C0] ? kasan_set_track+0x1c/0x30 [ 210.124858][ C0] ? crypt_iv_tcw_ctr+0x4a0/0x4a0 [ 210.125930][ C0] ? kmem_cache_free+0x104/0x470 [ 210.126973][ C0] ? crypt_endio+0x91/0x180 [ 210.127947][ C0] kcryptd_crypt_read_convert+0x30e/0x420 [ 210.129165][ C0] blk_update_request+0x757/0x1150 [ 210.130231][ C0] blk_mq_end_request+0x4b/0x480 [ 210.131294][ C0] blk_done_softirq+0x21d/0x340 [ 210.132332][ C0] ? _raw_spin_lock+0x81/0xd0 [ 210.133289][ C0] ? blk_mq_stop_hw_queue+0x30/0x30 [ 210.134399][ C0] ? _raw_read_lock_irq+0x40/0x40 [ 210.135458][ C0] __do_softirq+0x190/0x611 [ 210.136409][ C0] ? handle_edge_irq+0x221/0xb60 [ 210.137447][ C0] asm_call_irq_on_stack+0x12/0x20 [ 210.138507][ C0] </IRQ> [ 210.139118][ C0] do_softirq_own_stack+0x37/0x40 [ 210.140191][ C0] irq_exit_rcu+0x110/0x1b0 [ 210.141151][ C0] common_interrupt+0x74/0x120 [ 210.142171][ C0] asm_common_interrupt+0x1e/0x40
Fix this by allocating crypto requests with GFP_ATOMIC mask in interrupt context.
--- drivers/md/dm-crypt.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-)
drivers/md/dm-crypt.c +25 -10
@@ -1454,13 +1454,16 @@ static int crypt_convert_block_skcipher(static void kcryptd_async_done (struct crypto_async_request *async_req,int error); -static void crypt_alloc_req_skcipher (struct crypt_config *cc, +static int crypt_alloc_req_skcipher (struct crypt_config *cc,struct convert_context *ctx) {unsigned key_index = ctx->cc_sector & (cc->tfms_count -1 ); -if (!ctx->r.req) - ctx->r.req =mempool_alloc (&cc->req_pool,GFP_NOIO ); +if (!ctx->r.req) { + ctx->r.req =mempool_alloc (&cc->req_pool,in_interrupt () ?GFP_ATOMIC :GFP_NOIO ); +if (!ctx->r.req) +return -ENOMEM ; + }skcipher_request_set_tfm (ctx->r.req, cc->cipher_tfm.tfms[key_index]);
@@ -1471,13 +1474,18 @@ static void crypt_alloc_req_skcipher(strskcipher_request_set_callback (ctx->r.req,CRYPTO_TFM_REQ_MAY_BACKLOG , kcryptd_async_done,dmreq_of_req (cc, ctx->r.req)); + +return 0 ; } -static void crypt_alloc_req_aead (struct crypt_config *cc, +static int crypt_alloc_req_aead (struct crypt_config *cc,struct convert_context *ctx) { -if (!ctx->r.req_aead) - ctx->r.req_aead =mempool_alloc (&cc->req_pool,GFP_NOIO ); +if (!ctx->r.req) { + ctx->r.req =mempool_alloc (&cc->req_pool,in_interrupt () ?GFP_ATOMIC :GFP_NOIO ); +if (!ctx->r.req) +return -ENOMEM ; + }aead_request_set_tfm (ctx->r.req_aead, cc->cipher_tfm.tfms_aead[0 ]);
@@ -1488,15 +1496,17 @@ static void crypt_alloc_req_aead(structaead_request_set_callback (ctx->r.req_aead,CRYPTO_TFM_REQ_MAY_BACKLOG , kcryptd_async_done,dmreq_of_req (cc, ctx->r.req_aead)); + +return 0 ; } -static void crypt_alloc_req (struct crypt_config *cc, +static int crypt_alloc_req (struct crypt_config *cc,struct convert_context *ctx) {if (crypt_integrity_aead (cc)) -crypt_alloc_req_aead (cc, ctx); +return crypt_alloc_req_aead (cc, ctx);else -crypt_alloc_req_skcipher (cc, ctx); +return crypt_alloc_req_skcipher (cc, ctx); } static void crypt_free_req_skcipher(struct crypt_config *cc,
@@ -1539,7 +1549,12 @@ static blk_status_t crypt_convert(structwhile (ctx->iter_in.bi_size && ctx->iter_out.bi_size) { -crypt_alloc_req (cc, ctx); + r =crypt_alloc_req (cc, ctx); +if (r) { +complete (&ctx->restart); +return BLK_STS_DEV_RESOURCE ; + } +atomic_inc (&ctx->cc_pending);if (crypt_integrity_aead (cc))
Re: [PATCH 5.10 045/152] dm crypt: use GFP_ATOMIC when allocating crypto requests from softirq
Quoted 3 lines
Fix this by allocating crypto requests with
GFP_ATOMICmask in interrupt context.
...
This one is wrong.
drivers/md/dm-crypt.c static int crypt_convert_block_skcipher( · line 1455
Quoted 6 lines
+++
b/drivers/md/dm-crypt.cdrivers/md/dm-crypt.c +2
-2@@ -1454,13 +1454,16 @@ static int crypt_convert_block_skcipher( -if (!ctx->r.req) - ctx->r.req =mempool_alloc (&cc->req_pool,GFP_NOIO ); +if (!ctx->r.req) { + ctx->r.req =mempool_alloc (&cc->req_pool,in_interrupt () ?GFP_ATOMIC :GFP_NOIO );
Good so far. Ugly but good.
drivers/md/dm-crypt.c static void crypt_alloc_req_skcipher(str · line 1488
Quoted 11 lines
drivers/md/dm-crypt.c +6
-3-static void crypt_alloc_req_aead (struct crypt_config *cc, +static int crypt_alloc_req_aead (struct crypt_config *cc,struct convert_context *ctx) { -if (!ctx->r.req_aead) - ctx->r.req_aead =mempool_alloc (&cc->req_pool,GFP_NOIO ); +if (!ctx->r.req) { + ctx->r.req =mempool_alloc (&cc->req_pool,in_interrupt () ?GFP_ATOMIC :GFP_NOIO ); +if (!ctx->r.req) +return -ENOMEM ; + }
But this one can't be good. We are now allocating different field in the structure!
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Re: [PATCH 5.10 045/152] dm crypt: use GFP_ATOMIC when allocating crypto requests from softirq
Quoted 18 lines · Pavel Machek
Quoted 4 lines
Fix this by allocating crypto requests with
GFP_ATOMICmask in interrupt context....
This one is wrong.
drivers/md/dm-crypt.c static int crypt_convert_block_skcipher( · line 1455
Quoted 6 lines
+++
b/drivers/md/dm-crypt.cdrivers/md/dm-crypt.c +2
-2@@ -1454,13 +1454,16 @@ static int crypt_convert_block_skcipher( -if (!ctx->r.req) - ctx->r.req =mempool_alloc (&cc->req_pool,GFP_NOIO ); +if (!ctx->r.req) { + ctx->r.req =mempool_alloc (&cc->req_pool,in_interrupt () ?GFP_ATOMIC :GFP_NOIO );Good so far. Ugly but good.
Quoted 14 lines
drivers/md/dm-crypt.c static void crypt_alloc_req_skcipher(str · line 1488
Quoted 11 lines
drivers/md/dm-crypt.c +6
-3-static void crypt_alloc_req_aead (struct crypt_config *cc, +static int crypt_alloc_req_aead (struct crypt_config *cc,struct convert_context *ctx) { -if (!ctx->r.req_aead) - ctx->r.req_aead =mempool_alloc (&cc->req_pool,GFP_NOIO ); +if (!ctx->r.req) { + ctx->r.req =mempool_alloc (&cc->req_pool,in_interrupt () ?GFP_ATOMIC :GFP_NOIO ); +if (!ctx->r.req) +return -ENOMEM ; + }But this one can't be good. We are now allocating different field in the structure!
Good catch! Sorry for the copy-paste. It is actually not a big deal, because this is not a structure, but a union:
as long as the mempool was initialized with the correct size, it should be no different.
Nevertheless, I'll send the patch to fix the typo.
Regards,
Ignat
Quoted 6 lines
Pavel
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Re: [PATCH 5.10 045/152] dm crypt: use GFP_ATOMIC when allocating crypto requests from softirq
Hi!
Quoted 15 lines
Quoted 6 lines
Quoted 6 lines
drivers/md/dm-crypt.c +1
-3-static void crypt_alloc_req_aead (struct crypt_config *cc, +static int crypt_alloc_req_aead (struct crypt_config *cc,struct convert_context *ctx) { -if (!ctx->r.req_aead) - ctx->r.req_aead =mempool_alloc (&cc->req_pool,GFP_NOIO );Quoted 8 lines
drivers/md/dm-crypt.c static int crypt_convert_block_skcipher( · line 1466
Quoted 5 lines
drivers/md/dm-crypt.c +5
-0+if (!ctx->r.req) { + ctx->r.req =mempool_alloc (&cc->req_pool,in_interrupt () ?GFP_ATOMIC :GFP_NOIO ); +if (!ctx->r.req) +return -ENOMEM ; + }But this one can't be good. We are now allocating different field in the structure!
Quoted 4 lines
Good catch! Sorry for the copy-paste. It is actually not a big deal, because this is not a structure, but a union:
as long as the mempool was initialized with the correct size, it should be no different.
Ah. I actually thought about unions and went back to definition to see if it is one, but was somehow blind for the moment.
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Greg Kroah-Hartman
maintainerPATCH 46/152 dm crypt: do not wait for backlogged crypto request completion in softirq
In reply to Greg Kroah-HartmanFrom: Ignat Korchagin <[email protected]>
commit 8abec36d1274bbd5ae8f36f3658b9abb3db56c31 upstream.
Commit 39d42fa96ba1 ("dm crypt: add flags to optionally bypass kcryptd workqueues") made it possible for some code paths in dm-crypt to be executed in softirq context, when the underlying driver processes IO requests in interrupt/softirq context.
When Crypto API backlogs a crypto request, dm-crypt uses wait_for_completion to avoid sending further requests to an already overloaded crypto driver. However, if the code is executing in softirq context, we might get the following stacktrace:
[ 210.235213][ C0] BUG: scheduling while atomic: fio/2602/0x00000102 [ 210.236701][ C0] Modules linked in: [ 210.237566][ C0] CPU: 0 PID: 2602 Comm: fio Tainted: G W 5.10.0+ #50 [ 210.239292][ C0] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015 [ 210.241233][ C0] Call Trace: [ 210.241946][ C0] <IRQ> [ 210.242561][ C0] dump_stack+0x7d/0xa3 [ 210.243466][ C0] __schedule_bug.cold+0xb3/0xc2 [ 210.244539][ C0] __schedule+0x156f/0x20d0 [ 210.245518][ C0] ? io_schedule_timeout+0x140/0x140 [ 210.246660][ C0] schedule+0xd0/0x270 [ 210.247541][ C0] schedule_timeout+0x1fb/0x280 [ 210.248586][ C0] ? usleep_range+0x150/0x150 [ 210.249624][ C0] ? unpoison_range+0x3a/0x60 [ 210.250632][ C0] ? ____kasan_kmalloc.constprop.0+0x82/0xa0 [ 210.251949][ C0] ? unpoison_range+0x3a/0x60 [ 210.252958][ C0] ? __prepare_to_swait+0xa7/0x190 [ 210.254067][ C0] do_wait_for_common+0x2ab/0x370 [ 210.255158][ C0] ? usleep_range+0x150/0x150 [ 210.256192][ C0] ? bit_wait_io_timeout+0x160/0x160 [ 210.257358][ C0] ? blk_update_request+0x757/0x1150 [ 210.258582][ C0] ? _raw_spin_lock_irq+0x82/0xd0 [ 210.259674][ C0] ? _raw_read_unlock_irqrestore+0x30/0x30 [ 210.260917][ C0] wait_for_completion+0x4c/0x90 [ 210.261971][ C0] crypt_convert+0x19a6/0x4c00 [ 210.263033][ C0] ? _raw_spin_lock_irqsave+0x87/0xe0 [ 210.264193][ C0] ? kasan_set_track+0x1c/0x30 [ 210.265191][ C0] ? crypt_iv_tcw_ctr+0x4a0/0x4a0 [ 210.266283][ C0] ? kmem_cache_free+0x104/0x470 [ 210.267363][ C0] ? crypt_endio+0x91/0x180 [ 210.268327][ C0] kcryptd_crypt_read_convert+0x30e/0x420 [ 210.269565][ C0] blk_update_request+0x757/0x1150 [ 210.270563][ C0] blk_mq_end_request+0x4b/0x480 [ 210.271680][ C0] blk_done_softirq+0x21d/0x340 [ 210.272775][ C0] ? _raw_spin_lock+0x81/0xd0 [ 210.273847][ C0] ? blk_mq_stop_hw_queue+0x30/0x30 [ 210.275031][ C0] ? _raw_read_lock_irq+0x40/0x40 [ 210.276182][ C0] __do_softirq+0x190/0x611 [ 210.277203][ C0] ? handle_edge_irq+0x221/0xb60 [ 210.278340][ C0] asm_call_irq_on_stack+0x12/0x20 [ 210.279514][ C0] </IRQ> [ 210.280164][ C0] do_softirq_own_stack+0x37/0x40 [ 210.281281][ C0] irq_exit_rcu+0x110/0x1b0 [ 210.282286][ C0] common_interrupt+0x74/0x120 [ 210.283376][ C0] asm_common_interrupt+0x1e/0x40 [ 210.284496][ C0] RIP: 0010:_aesni_enc1+0x65/0xb0
Fix this by making crypt_convert function reentrant from the point of a single bio and make dm-crypt defer further bio processing to a workqueue, if Crypto API backlogs a request in interrupt context.
--- drivers/md/dm-crypt.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 98 insertions(+), 5 deletions(-)
drivers/md/dm-crypt.c +98 -5
@@ -1539,13 +1539,19 @@ static void crypt_free_req(struct crypt_* Encrypt / decrypt data from one bio to another one (can be the same one) */ static blk_status_t crypt_convert (struct crypt_config *cc, -struct convert_context *ctx,bool atomic) +struct convert_context *ctx,bool atomic,bool reset_pending) {unsigned int tag_offset =0 ;unsigned int sector_step = cc->sector_size >>SECTOR_SHIFT ;int r; -atomic_set (&ctx->cc_pending,1 ); +/* +* if reset_pending is set we are dealing with the bio for the first time, +* else we're continuing to work on the previous bio, so don't mess with +* the cc_pending counter +*/ +if (reset_pending) +atomic_set (&ctx->cc_pending,1 );while (ctx->iter_in.bi_size && ctx->iter_out.bi_size) {
@@ -1568,7 +1574,25 @@ static blk_status_t crypt_convert(struct* but the driver request queue is full, let's wait. */ case -EBUSY : -wait_for_completion (&ctx->restart); +if (in_interrupt ()) { +if (try_wait_for_completion (&ctx->restart)) { +/* +* we don't have to block to wait for completion, +* so proceed +*/ + }else { +/* +* we can't wait for completion without blocking +* exit and continue processing in a workqueue +*/ + ctx->r.req =NULL ; + ctx->cc_sector += sector_step; + tag_offset++; +return BLK_STS_DEV_RESOURCE ; + } + }else { +wait_for_completion (&ctx->restart); + }reinit_completion (&ctx->restart); fallthrough;/*
@@ -1960,6 +1984,37 @@ static bool kcryptd_crypt_write_inline(s } } +static void kcryptd_crypt_write_continue (struct work_struct *work) +{ + struct dm_crypt_io *io = container_of(work, struct dm_crypt_io, work); +struct crypt_config *cc = io->cc; +struct convert_context *ctx = &io->ctx; +int crypt_finished; +sector_t sector = io->sector; +blk_status_t r; + +wait_for_completion (&ctx->restart); +reinit_completion (&ctx->restart); + + r =crypt_convert (cc, &io->ctx, true, false); +if (r) + io->error = r; + crypt_finished =atomic_dec_and_test (&ctx->cc_pending); +if (!crypt_finished &&kcryptd_crypt_write_inline (cc, ctx)) { +/* Wait for completion signaled by kcryptd_async_done() */ +wait_for_completion (&ctx->restart); + crypt_finished =1 ; + } + +/* Encryption was already finished, submit io now */ +if (crypt_finished) { +kcryptd_crypt_write_io_submit (io,0 ); + io->sector = sector; + } + +crypt_dec_pending (io); +} +static void kcryptd_crypt_write_convert (struct dm_crypt_io *io) {struct crypt_config *cc = io->cc;
@@ -1988,7 +2043,17 @@ static void kcryptd_crypt_write_convert(crypt_inc_pending (io); r =crypt_convert (cc, ctx, -test_bit (DM_CRYPT_NO_WRITE_WORKQUEUE , &cc->flags)); +test_bit (DM_CRYPT_NO_WRITE_WORKQUEUE , &cc->flags), true); +/* +* Crypto API backlogged the request, because its queue was full +* and we're in softirq context, so continue from a workqueue +* (TODO: is it actually possible to be in softirq in the write path?) +*/ +if (r ==BLK_STS_DEV_RESOURCE ) { +INIT_WORK (&io->work, kcryptd_crypt_write_continue); +queue_work (cc->crypt_queue, &io->work); +return ; + }if (r) io->error = r; crypt_finished =atomic_dec_and_test (&ctx->cc_pending);
@@ -2013,6 +2078,25 @@ static void kcryptd_crypt_read_done(strucrypt_dec_pending (io); } +static void kcryptd_crypt_read_continue (struct work_struct *work) +{ + struct dm_crypt_io *io = container_of(work, struct dm_crypt_io, work); +struct crypt_config *cc = io->cc; +blk_status_t r; + +wait_for_completion (&io->ctx.restart); +reinit_completion (&io->ctx.restart); + + r =crypt_convert (cc, &io->ctx, true, false); +if (r) + io->error = r; + +if (atomic_dec_and_test (&io->ctx.cc_pending)) +kcryptd_crypt_read_done (io); + +crypt_dec_pending (io); +} +static void kcryptd_crypt_read_convert (struct dm_crypt_io *io) {struct crypt_config *cc = io->cc;
@@ -2024,7 +2108,16 @@ static void kcryptd_crypt_read_convert(s io->sector); r =crypt_convert (cc, &io->ctx, -test_bit (DM_CRYPT_NO_READ_WORKQUEUE , &cc->flags)); +test_bit (DM_CRYPT_NO_READ_WORKQUEUE , &cc->flags), true); +/* +* Crypto API backlogged the request, because its queue was full +* and we're in softirq context, so continue from a workqueue +*/ +if (r ==BLK_STS_DEV_RESOURCE ) { +INIT_WORK (&io->work, kcryptd_crypt_read_continue); +queue_work (cc->crypt_queue, &io->work); +return ; + }if (r) io->error = r;
Greg Kroah-Hartman
maintainerPATCH 47/152 dm crypt: do not call bio_endio() from the dm-crypt tasklet
In reply to Greg Kroah-HartmanFrom: Ignat Korchagin <[email protected]>
commit 8e14f610159d524cd7aac37982826d3ef75c09e8 upstream.
Sometimes, when dm-crypt executes decryption in a tasklet, we may get "BUG: KASAN: use-after-free in tasklet_action_common.constprop..." with a kasan-enabled kernel.
When the decryption fully completes in the tasklet, dm-crypt will call bio_endio(), which in turn will call clone_endio() from dm.c core code. That function frees the resources associated with the bio, including per bio private structures. For dm-crypt it will free the current struct dm_crypt_io, which contains our tasklet object, causing use-after-free, when the tasklet is being dequeued by the kernel.
To avoid this, do not call bio_endio() from the current tasklet context, but delay its execution to the dm-crypt IO workqueue.
--- drivers/md/dm-crypt.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-)
drivers/md/dm-crypt.c +23 -1
@@ -1730,6 +1730,12 @@ static void crypt_inc_pending(struct dm_atomic_inc (&io->io_pending); } +static void kcryptd_io_bio_endio (struct work_struct *work) +{ + struct dm_crypt_io *io = container_of(work, struct dm_crypt_io, work); +bio_endio (io->base_bio); +} +/* * One of the bios was finished. Check for completion of * the whole request and correctly clean up the buffer.
@@ -1752,7 +1758,23 @@ static void crypt_dec_pending(struct dm_kfree (io->integrity_metadata); base_bio->bi_status = error; -bio_endio (base_bio); + +/* +* If we are running this function from our tasklet, +* we can't call bio_endio() here, because it will call +* clone_endio() from dm.c, which in turn will +* free the current struct dm_crypt_io structure with +* our tasklet. In this case we need to delay bio_endio() +* execution to after the tasklet is done and dequeued. +*/ +if (tasklet_trylock (&io->tasklet)) { +tasklet_unlock (&io->tasklet); +bio_endio (base_bio); +return ; + } + +INIT_WORK (&io->work, kcryptd_io_bio_endio); +queue_work (cc->io_queue, &io->work); }/*
Greg Kroah-Hartman
maintainerPATCH 48/152 dm crypt: defer decryption to a tasklet if interrupts disabled
In reply to Greg Kroah-HartmanFrom: Ignat Korchagin <[email protected]>
commit c87a95dc28b1431c7e77e2c0c983cf37698089d2 upstream.
On some specific hardware on early boot we occasionally get:
[ 1193.920255][ T0] BUG: sleeping function called from invalid context at mm/mempool.c:381 [ 1193.936616][ T0] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 0, name: swapper/69 [ 1193.953233][ T0] no locks held by swapper/69/0. [ 1193.965871][ T0] irq event stamp: 575062 [ 1193.977724][ T0] hardirqs last enabled at (575061): [<ffffffffab73f662>] tick_nohz_idle_exit+0xe2/0x3e0 [ 1194.002762][ T0] hardirqs last disabled at (575062): [<ffffffffab74e8af>] flush_smp_call_function_from_idle+0x4f/0x80 [ 1194.029035][ T0] softirqs last enabled at (575050): [<ffffffffad600fd2>] asm_call_irq_on_stack+0x12/0x20 [ 1194.054227][ T0] softirqs last disabled at (575043): [<ffffffffad600fd2>] asm_call_irq_on_stack+0x12/0x20 [ 1194.079389][ T0] CPU: 69 PID: 0 Comm: swapper/69 Not tainted 5.10.6-cloudflare-kasan-2021.1.4-dev #1 [ 1194.104103][ T0] Hardware name: NULL R162-Z12-CD/MZ12-HD4-CD, BIOS R10 06/04/2020 [ 1194.119591][ T0] Call Trace: [ 1194.130233][ T0] dump_stack+0x9a/0xcc [ 1194.141617][ T0] ___might_sleep.cold+0x180/0x1b0 [ 1194.153825][ T0] mempool_alloc+0x16b/0x300 [ 1194.165313][ T0] ? remove_element+0x160/0x160 [ 1194.176961][ T0] ? blk_mq_end_request+0x4b/0x490 [ 1194.188778][ T0] crypt_convert+0x27f6/0x45f0 [dm_crypt] [ 1194.201024][ T0] ? rcu_read_lock_sched_held+0x3f/0x70 [ 1194.212906][ T0] ? module_assert_mutex_or_preempt+0x3e/0x70 [ 1194.225318][ T0] ? __module_address.part.0+0x1b/0x3a0 [ 1194.237212][ T0] ? is_kernel_percpu_address+0x5b/0x190 [ 1194.249238][ T0] ? crypt_iv_tcw_ctr+0x4a0/0x4a0 [dm_crypt] [ 1194.261593][ T0] ? is_module_address+0x25/0x40 [ 1194.272905][ T0] ? static_obj+0x8a/0xc0 [ 1194.283582][ T0] ? lockdep_init_map_waits+0x26a/0x700 [ 1194.295570][ T0] ? __raw_spin_lock_init+0x39/0x110 [ 1194.307330][ T0] kcryptd_crypt_read_convert+0x31c/0x560 [dm_crypt] [ 1194.320496][ T0] ? kcryptd_queue_crypt+0x1be/0x380 [dm_crypt] [ 1194.333203][ T0] blk_update_request+0x6d7/0x1500 [ 1194.344841][ T0] ? blk_mq_trigger_softirq+0x190/0x190 [ 1194.356831][ T0] blk_mq_end_request+0x4b/0x490 [ 1194.367994][ T0] ? blk_mq_trigger_softirq+0x190/0x190 [ 1194.379693][ T0] flush_smp_call_function_queue+0x24b/0x560 [ 1194.391847][ T0] flush_smp_call_function_from_idle+0x59/0x80 [ 1194.403969][ T0] do_idle+0x287/0x450 [ 1194.413891][ T0] ? arch_cpu_idle_exit+0x40/0x40 [ 1194.424716][ T0] ? lockdep_hardirqs_on_prepare+0x286/0x3f0 [ 1194.436399][ T0] ? _raw_spin_unlock_irqrestore+0x39/0x40 [ 1194.447759][ T0] cpu_startup_entry+0x19/0x20 [ 1194.458038][ T0] secondary_startup_64_no_verify+0xb0/0xbb
IO completion can be queued to a different CPU by the block subsystem as a "call single function/data". The CPU may run these routines from the idle task, but it does so with interrupts disabled.
It is not a good idea to do decryption with irqs disabled even in an idle task context, so just defer it to a tasklet (as is done with requests from hard irqs).
--- drivers/md/dm-crypt.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/md/dm-crypt.c +6 -2
@@ -2221,8 +2221,12 @@ static void kcryptd_queue_crypt(struct dif ((bio_data_dir (io->base_bio) ==READ &&test_bit (DM_CRYPT_NO_READ_WORKQUEUE , &cc->flags)) || (bio_data_dir (io->base_bio) ==WRITE &&test_bit (DM_CRYPT_NO_WRITE_WORKQUEUE , &cc->flags))) { -if (in_irq ()) { -/* Crypto API's "skcipher_walk_first() refuses to work in hard IRQ context */ +/* +* in_irq(): Crypto API's skcipher_walk_first() refuses to work in hard IRQ context. +* irqs_disabled(): the kernel may run some IO completion from the idle thread, but +* it is being executed with irqs disabled. +*/ +if (in_irq () ||irqs_disabled ()) {tasklet_init (&io->tasklet, kcryptd_crypt_tasklet, (unsigned long )&io->work);tasklet_schedule (&io->tasklet);return ;
Greg Kroah-Hartman
maintainerPATCH 49/152 stmmac: intel: change all EHL/TGL to auto detect phy addr
In reply to Greg Kroah-HartmanFrom: Voon Weifeng <[email protected]>
commit bff6f1db91e330d7fba56f815cdbc412c75fe163 upstream.
Set all EHL/TGL phy_addr to -1 so that the driver will automatically detect it at run-time by probing all the possible 32 addresses.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c +1 -5
@@ -236,6 +236,7 @@ static int intel_mgbe_common_data(structint ret;int i; + plat->phy_addr =-1 ; plat->clk_csr =5 ; plat->has_gmac =0 ; plat->has_gmac4 =1 ;
@@ -345,7 +346,6 @@ static int ehl_sgmii_data(struct pci_dev struct plat_stmmacenet_data *plat) { plat->bus_id =1 ; - plat->phy_addr =0 ; plat->phy_interface =PHY_INTERFACE_MODE_SGMII ; plat->serdes_powerup = intel_serdes_powerup;
@@ -362,7 +362,6 @@ static int ehl_rgmii_data(struct pci_dev struct plat_stmmacenet_data *plat) { plat->bus_id =1 ; - plat->phy_addr =0 ; plat->phy_interface =PHY_INTERFACE_MODE_RGMII ;return ehl_common_data (pdev, plat);
@@ -376,7 +375,6 @@ static int ehl_pse0_common_data(struct p struct plat_stmmacenet_data *plat) { plat->bus_id =2 ; - plat->phy_addr =1 ;return ehl_common_data (pdev, plat); }
@@ -408,7 +406,6 @@ static int ehl_pse1_common_data(struct p struct plat_stmmacenet_data *plat) { plat->bus_id =3 ; - plat->phy_addr =1 ;return ehl_common_data (pdev, plat); }
@@ -450,7 +447,6 @@ static int tgl_sgmii_data(struct pci_dev struct plat_stmmacenet_data *plat) { plat->bus_id =1 ; - plat->phy_addr =0 ; plat->phy_interface =PHY_INTERFACE_MODE_SGMII ; plat->serdes_powerup = intel_serdes_powerup; plat->serdes_powerdown = intel_serdes_powerdown;
Greg Kroah-Hartman
maintainerPATCH 50/152 r8152: Add Lenovo Powered USB-C Travel Hub
In reply to Greg Kroah-HartmanFrom: Leon Schuermann <[email protected]>
commit cb82a54904a99df9e8f9e9d282046055dae5a730 upstream.
This USB-C Hub (17ef:721e) based on the Realtek RTL8153B chip used to use the cdc_ether driver. However, using this driver, with the system suspended the device constantly sends pause-frames as soon as the receive buffer fills up. This causes issues with other devices, where some Ethernet switches stop forwarding packets altogether.
Using the Realtek driver (r8152) fixes this issue. Pause frames are no longer sent while the host system is suspended.
--- drivers/net/usb/cdc_ether.c | 7 +++++++ drivers/net/usb/r8152.c | 1 + 2 files changed, 8 insertions(+)
drivers/net/usb/cdc_ether.c +7 -0
@@ -793,6 +793,13 @@ static const struct usb_device_id produc .driver_info = 0, }, +/* Lenovo Powered USB-C Travel Hub (4X90S92381, based on Realtek RTL8153) */ +{ +USB_DEVICE_AND_INTERFACE_INFO (LENOVO_VENDOR_ID ,0x721e ,USB_CLASS_COMM , + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), + .driver_info =0 , +}, + /* ThinkPad USB-C Dock Gen 2 (based on Realtek RTL8153) */ { USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0xa387, USB_CLASS_COMM,
drivers/net/usb/r8152.c +1 -0
@@ -6893,6 +6893,7 @@ static const struct usb_device_id rtl815 {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x721e)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0xa387)}, {REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041)}, {REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff)},
Greg Kroah-Hartman
maintainerPATCH 51/152 btrfs: tree-checker: check if chunk item end overflows
In reply to Greg Kroah-HartmanFrom: Su Yue <[email protected]>
[ Upstream commit 347fb0cfc9bab5195c6701e62eda488310d7938f ]
While mounting a crafted image provided by user, kernel panics due to the invalid chunk item whose end is less than start.
[66.387422] loop: module loaded [66.389773] loop0: detected capacity change from 262144 to 0 [66.427708] BTRFS: device fsid a62e00e8-e94e-4200-8217-12444de93c2e devid 1 transid 12 /dev/loop0 scanned by mount (613) [66.431061] BTRFS info (device loop0): disk space caching is enabled [66.431078] BTRFS info (device loop0): has skinny extents [66.437101] BTRFS error: insert state: end < start 29360127 37748736 [66.437136] ------------[ cut here ]------------ [66.437140] WARNING: CPU: 16 PID: 613 at fs/btrfs/extent_io.c:557 insert_state.cold+0x1a/0x46 [btrfs] [66.437369] CPU: 16 PID: 613 Comm: mount Tainted: G O 5.11.0-rc1-custom #45 [66.437374] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ArchLinux 1.14.0-1 04/01/2014 [66.437378] RIP: 0010:insert_state.cold+0x1a/0x46 [btrfs] [66.437420] RSP: 0018:ffff93e5414c3908 EFLAGS: 00010286 [66.437427] RAX: 0000000000000000 RBX: 0000000001bfffff RCX: 0000000000000000 [66.437431] RDX: 0000000000000000 RSI: ffffffffb90d4660 RDI: 00000000ffffffff [66.437434] RBP: ffff93e5414c3938 R08: 0000000000000001 R09: 0000000000000001 [66.437438] R10: ffff93e5414c3658 R11: 0000000000000000 R12: ffff8ec782d72aa0 [66.437441] R13: ffff8ec78bc71628 R14: 0000000000000000 R15: 0000000002400000 [66.437447] FS: 00007f01386a8580(0000) GS:ffff8ec809000000(0000) knlGS:0000000000000000 [66.437451] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [66.437455] CR2: 00007f01382fa000 CR3: 0000000109a34000 CR4: 0000000000750ee0 [66.437460] PKRU: 55555554 [66.437464] Call Trace: [66.437475] set_extent_bit+0x652/0x740 [btrfs] [66.437539] set_extent_bits_nowait+0x1d/0x20 [btrfs] [66.437576] add_extent_mapping+0x1e0/0x2f0 [btrfs] [66.437621] read_one_chunk+0x33c/0x420 [btrfs] [66.437674] btrfs_read_chunk_tree+0x6a4/0x870 [btrfs] [66.437708] ? kvm_sched_clock_read+0x18/0x40 [66.437739] open_ctree+0xb32/0x1734 [btrfs] [66.437781] ? bdi_register_va+0x1b/0x20 [66.437788] ? super_setup_bdi_name+0x79/0xd0 [66.437810] btrfs_mount_root.cold+0x12/0xeb [btrfs] [66.437854] ? __kmalloc_track_caller+0x217/0x3b0 [66.437873] legacy_get_tree+0x34/0x60 [66.437880] vfs_get_tree+0x2d/0xc0 [66.437888] vfs_kern_mount.part.0+0x78/0xc0 [66.437897] vfs_kern_mount+0x13/0x20 [66.437902] btrfs_mount+0x11f/0x3c0 [btrfs] [66.437940] ? kfree+0x5ff/0x670 [66.437944] ? __kmalloc_track_caller+0x217/0x3b0 [66.437962] legacy_get_tree+0x34/0x60 [66.437974] vfs_get_tree+0x2d/0xc0 [66.437983] path_mount+0x48c/0xd30 [66.437998] __x64_sys_mount+0x108/0x140 [66.438011] do_syscall_64+0x38/0x50 [66.438018] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [66.438023] RIP: 0033:0x7f0138827f6e [66.438033] RSP: 002b:00007ffecd79edf8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a5 [66.438040] RAX: ffffffffffffffda RBX: 00007f013894c264 RCX: 00007f0138827f6e [66.438044] RDX: 00005593a4a41360 RSI: 00005593a4a33690 RDI: 00005593a4a3a6c0 [66.438047] RBP: 00005593a4a33440 R08: 0000000000000000 R09: 0000000000000001 [66.438050] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 [66.438054] R13: 00005593a4a3a6c0 R14: 00005593a4a41360 R15: 00005593a4a33440 [66.438078] irq event stamp: 18169 [66.438082] hardirqs last enabled at (18175): [<ffffffffb81154bf>] console_unlock+0x4ff/0x5f0 [66.438088] hardirqs last disabled at (18180): [<ffffffffb8115427>] console_unlock+0x467/0x5f0 [66.438092] softirqs last enabled at (16910): [<ffffffffb8a00fe2>] asm_call_irq_on_stack+0x12/0x20 [66.438097] softirqs last disabled at (16905): [<ffffffffb8a00fe2>] asm_call_irq_on_stack+0x12/0x20 [66.438103] ---[ end trace e114b111db64298b ]--- [66.438107] BTRFS error: found node 12582912 29360127 on insert of 37748736 29360127 [66.438127] BTRFS critical: panic in extent_io_tree_panic:679: locking error: extent tree was modified by another thread while locked (errno=-17 Object already exists) [66.441069] ------------[ cut here ]------------ [66.441072] kernel BUG at fs/btrfs/extent_io.c:679! [66.442064] invalid opcode: 0000 [#1] PREEMPT SMP NOPTI [66.443018] CPU: 16 PID: 613 Comm: mount Tainted: G W O 5.11.0-rc1-custom #45 [66.444538] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ArchLinux 1.14.0-1 04/01/2014 [66.446223] RIP: 0010:extent_io_tree_panic.isra.0+0x23/0x25 [btrfs] [66.450878] RSP: 0018:ffff93e5414c3948 EFLAGS: 00010246 [66.451840] RAX: 0000000000000000 RBX: 0000000001bfffff RCX: 0000000000000000 [66.453141] RDX: 0000000000000000 RSI: ffffffffb90d4660 RDI: 00000000ffffffff [66.454445] RBP: ffff93e5414c3948 R08: 0000000000000001 R09: 0000000000000001 [66.455743] R10: ffff93e5414c3658 R11: 0000000000000000 R12: ffff8ec782d728c0 [66.457055] R13: ffff8ec78bc71628 R14: ffff8ec782d72aa0 R15: 0000000002400000 [66.458356] FS: 00007f01386a8580(0000) GS:ffff8ec809000000(0000) knlGS:0000000000000000 [66.459841] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [66.460895] CR2: 00007f01382fa000 CR3: 0000000109a34000 CR4: 0000000000750ee0 [66.462196] PKRU: 55555554 [66.462692] Call Trace: [66.463139] set_extent_bit.cold+0x30/0x98 [btrfs] [66.464049] set_extent_bits_nowait+0x1d/0x20 [btrfs] [66.490466] add_extent_mapping+0x1e0/0x2f0 [btrfs] [66.514097] read_one_chunk+0x33c/0x420 [btrfs] [66.534976] btrfs_read_chunk_tree+0x6a4/0x870 [btrfs] [66.555718] ? kvm_sched_clock_read+0x18/0x40 [66.575758] open_ctree+0xb32/0x1734 [btrfs] [66.595272] ? bdi_register_va+0x1b/0x20 [66.614638] ? super_setup_bdi_name+0x79/0xd0 [66.633809] btrfs_mount_root.cold+0x12/0xeb [btrfs] [66.652938] ? __kmalloc_track_caller+0x217/0x3b0 [66.671925] legacy_get_tree+0x34/0x60 [66.690300] vfs_get_tree+0x2d/0xc0 [66.708221] vfs_kern_mount.part.0+0x78/0xc0 [66.725808] vfs_kern_mount+0x13/0x20 [66.742730] btrfs_mount+0x11f/0x3c0 [btrfs] [66.759350] ? kfree+0x5ff/0x670 [66.775441] ? __kmalloc_track_caller+0x217/0x3b0 [66.791750] legacy_get_tree+0x34/0x60 [66.807494] vfs_get_tree+0x2d/0xc0 [66.823349] path_mount+0x48c/0xd30 [66.838753] __x64_sys_mount+0x108/0x140 [66.854412] do_syscall_64+0x38/0x50 [66.869673] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [66.885093] RIP: 0033:0x7f0138827f6e [66.945613] RSP: 002b:00007ffecd79edf8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a5 [66.977214] RAX: ffffffffffffffda RBX: 00007f013894c264 RCX: 00007f0138827f6e [66.994266] RDX: 00005593a4a41360 RSI: 00005593a4a33690 RDI: 00005593a4a3a6c0 [67.011544] RBP: 00005593a4a33440 R08: 0000000000000000 R09: 0000000000000001 [67.028836] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 [67.045812] R13: 00005593a4a3a6c0 R14: 00005593a4a41360 R15: 00005593a4a33440 [67.216138] ---[ end trace e114b111db64298c ]--- [67.237089] RIP: 0010:extent_io_tree_panic.isra.0+0x23/0x25 [btrfs] [67.325317] RSP: 0018:ffff93e5414c3948 EFLAGS: 00010246 [67.347946] RAX: 0000000000000000 RBX: 0000000001bfffff RCX: 0000000000000000 [67.371343] RDX: 0000000000000000 RSI: ffffffffb90d4660 RDI: 00000000ffffffff [67.394757] RBP: ffff93e5414c3948 R08: 0000000000000001 R09: 0000000000000001 [67.418409] R10: ffff93e5414c3658 R11: 0000000000000000 R12: ffff8ec782d728c0 [67.441906] R13: ffff8ec78bc71628 R14: ffff8ec782d72aa0 R15: 0000000002400000 [67.465436] FS: 00007f01386a8580(0000) GS:ffff8ec809000000(0000) knlGS:0000000000000000 [67.511660] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [67.535047] CR2: 00007f01382fa000 CR3: 0000000109a34000 CR4: 0000000000750ee0 [67.558449] PKRU: 55555554 [67.581146] note: mount[613] exited with preempt_count 2
The image has a chunk item which has a logical start 37748736 and length 18446744073701163008 (-8M). The calculated end 29360127 overflows. EEXIST was caught by insert_state() because of the duplicate end and extent_io_tree_panic() was called.
Add overflow check of chunk item end to tree checker so it can be detected early at mount time.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=208929
--- fs/btrfs/tree-checker.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/btrfs/tree-checker.c +7 -0
@@ -754,6 +754,7 @@ int btrfs_check_chunk_valid(struct extent_buffer *leaf, {struct btrfs_fs_info *fs_info = leaf->fs_info;u64 length; +u64 chunk_end;u64 stripe_len;u16 num_stripes;u16 sub_stripes;
@@ -808,6 +809,12 @@ int btrfs_check_chunk_valid(struct extent_buffer *leaf, "invalid chunk length, have %llu", length);return -EUCLEAN ; } +if (unlikely (check_add_overflow (logical, length, &chunk_end))) { +chunk_err (leaf, chunk, logical, +"invalid chunk logical start and length, have logical start %llu length %llu" , + logical, length); +return -EUCLEAN ; + }if (!is_power_of_2 (stripe_len) || stripe_len !=BTRFS_STRIPE_LEN ) { chunk_err(leaf, chunk, logical, "invalid chunk stripe length: %llu",
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 52/152 ext4: dont leak old mountpoint samples
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
[ Upstream commit 5a3b590d4b2db187faa6f06adc9a53d6199fb1f9 ]
When the first file is opened, ext4 samples the mountpoint of the filesystem in 64 bytes of the super block. It does so using strlcpy(), this means that the remaining bytes in the super block string buffer are untouched. If the mount point before had a longer path than the current one, it can be reconstructed.
Consider the case where the fs was mounted to "/media/johnjdeveloper" and later to "/". The super block buffer then contains "/\x00edia/johnjdeveloper".
This case was seen in the wild and caused confusion how the name of a developer ands up on the super block of a filesystem used in production...
Fix this by using strncpy() instead of strlcpy(). The superblock field is defined to be a fixed-size char array, and it is already marked using __nonstring in fs/ext4/ext4.h. The consumer of the field in e2fsprogs already assumes that in the case of a 64+ byte mount path, that s_last_mounted will not be NUL terminated.
--- fs/ext4/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/file.c +1 -1
@@ -809,7 +809,7 @@ static int ext4_sample_last_mounted(struct super_block *sb, err =ext4_journal_get_write_access (handle, sbi->s_sbh);if (err) goto out_journal; -strlcpy (sbi->s_es->s_last_mounted, cp, +strncpy (sbi->s_es->s_last_mounted, cp,sizeof (sbi->s_es->s_last_mounted));ext4_handle_dirty_super (handle, sb); out_journal:
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 53/152 io_uring: dont take files/mm for a dead task
In reply to Greg Kroah-HartmanFrom: Pavel Begunkov <[email protected]>
[ Upstream commit 621fadc22365f3cf307bcd9048e3372e9ee9cdcc ]
In rare cases a task may be exiting while io_ring_exit_work() trying to cancel/wait its requests. It's ok for __io_sq_thread_acquire_mm() because of SQPOLL check, but is not for __io_sq_thread_acquire_files(). Play safe and fail for both of them.
--- fs/io_uring.c | 2 ++ 1 file changed, 2 insertions(+)
fs/io_uring.c +2 -0
@@ -1009,6 +1009,8 @@ static int __io_sq_thread_acquire_mm(struct io_ring_ctx *ctx) {struct mm_struct *mm; +if (current->flags &PF_EXITING ) +return -EFAULT ;if (current->mm)return 0 ;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 54/152 io_uring: drop mm and files after task_work_run
In reply to Greg Kroah-HartmanFrom: Pavel Begunkov <[email protected]>
[ Upstream commit d434ab6db524ab1efd0afad4ffa1ee65ca6ac097 ]
__io_req_task_submit() run by task_work can set mm and files, but io_sq_thread() in some cases, and because __io_sq_thread_acquire_mm() and __io_sq_thread_acquire_files() do a simple current->mm/files check it may end up submitting IO with mm/files of another task.
We also need to drop it after in the end to drop potentially grabbed references to them.
--- fs/io_uring.c | 2 ++ 1 file changed, 2 insertions(+)
fs/io_uring.c +2 -0
@@ -6841,6 +6841,7 @@ static int io_sq_thread(void *data)if (ret &SQT_SPIN ) {io_run_task_work (); +io_sq_thread_drop_mm ();cond_resched (); }else if (ret ==SQT_IDLE ) {if (kthread_should_park ())
@@ -6855,6 +6856,7 @@ static int io_sq_thread(void *data) }io_run_task_work (); +io_sq_thread_drop_mm ();if (cur_css)io_sq_thread_unassociate_blkcg ();
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 55/152 ARC: build: remove non-existing bootpImage from KBUILD_IMAGE
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 9836720911cfec25d3fbdead1c438bf87e0f2841 ]
The deb-pkg builds for ARCH=arc fail.
$ export CROSS_COMPILE=<your-arc-compiler-prefix> $ make -s ARCH=arc defconfig $ make ARCH=arc bindeb-pkg SORTTAB vmlinux SYSMAP System.map MODPOST Module.symvers make KERNELRELEASE=5.10.0-rc4 ARCH=arc KBUILD_BUILD_VERSION=2 -f ./Makefile intdeb-pkg sh ./scripts/package/builddeb cp: cannot stat 'arch/arc/boot/bootpImage': No such file or directory make[4]: *** [scripts/Makefile.package:87: intdeb-pkg] Error 1 make[3]: *** [Makefile:1527: intdeb-pkg] Error 2 make[2]: *** [debian/rules:13: binary-arch] Error 2 dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 make[1]: *** [scripts/Makefile.package:83: bindeb-pkg] Error 2 make: *** [Makefile:1527: bindeb-pkg] Error 2
The reason is obvious; arch/arc/Makefile sets $(boot)/bootpImage as the default image, but there is no rule to build it.
Remove the meaningless KBUILD_IMAGE assignment so it will fallback to the default vmlinux. With this change, you can build the deb package.
I removed the 'bootpImage' target as well. At best, it provides 'make bootpImage' as an alias of 'make vmlinux', but I do not see much sense in doing so.
--- arch/arc/Makefile | 6 ------ 1 file changed, 6 deletions(-)
arch/arc/Makefile +0 -6
@@ -102,12 +102,6 @@ libs-y += arch/arc/lib/ $(LIBGCC) boot := arch/arc/boot -#default target for make without any arguments. -KBUILD_IMAGE := $(boot)/bootpImage - -all: bootpImage -bootpImage: vmlinux - boot_targets += uImage uImage.bin uImage.gz $(boot_targets): vmlinux
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 56/152 ARC: build: add uImage.lzma to the top-level target
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit f2712ec76a5433e5ec9def2bd52a95df1f96d050 ]
arch/arc/boot/Makefile supports uImage.lzma, but you cannot do 'make uImage.lzma' because the corresponding target is missing in arch/arc/Makefile. Add it.
I also changed the assignment operator '+=' to ':=' since this is the only place where we expect this variable to be set.
--- arch/arc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arc/Makefile +1 -1
@@ -102,7 +102,7 @@ libs-y += arch/arc/lib/ $(LIBGCC) boot := arch/arc/boot -boot_targets += uImage uImage.bin uImage.gz +boot_targets := uImage uImage.bin uImage.gz uImage.lzma $(boot_targets): vmlinux $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 57/152 ARC: build: add boot_targets to PHONY
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 0cfccb3c04934cdef42ae26042139f16e805b5f7 ]
The top-level boot_targets (uImage and uImage.*) should be phony targets. They just let Kbuild descend into arch/arc/boot/ and create files there.
If a file exists in the top directory with the same name, the boot image will not be created.
You can confirm it by the following steps:
$ export CROSS_COMPILE=<your-arc-compiler-prefix> $ make -s ARCH=arc defconfig all # vmlinux will be built $ touch uImage.gz $ make ARCH=arc uImage.gz CALL scripts/atomic/check-atomics.sh CALL scripts/checksyscalls.sh CHK include/generated/compile.h # arch/arc/boot/uImage.gz is not created
Specify the targets as PHONY to fix this.
--- arch/arc/Makefile | 1 + 1 file changed, 1 insertion(+)
arch/arc/Makefile +1 -0
@@ -104,6 +104,7 @@ boot := arch/arc/boot boot_targets := uImage uImage.bin uImage.gz uImage.lzma +PHONY += $(boot_targets) $(boot_targets): vmlinux $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 58/152 ARC: build: move symlink creation to arch/arc/Makefile to avoid race
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit c5e6ae563c802c4d828d42e134af64004db2e58c ]
If you run 'make uImage uImage.gz' with the parallel option, uImage.gz will be created by two threads simultaneously.
This is because arch/arc/Makefile does not specify the dependency between uImage and uImage.gz. Hence, GNU Make assumes they can be built in parallel. One thread descends into arch/arc/boot/ to create uImage, and another to create uImage.gz.
Please notice the same log is displayed twice in the following steps:
$ export CROSS_COMPILE=<your-arc-compiler-prefix>
$ make -s ARCH=arc defconfig
$ make -j$(nproc) ARCH=arc uImage uImage.gz
[ snip ]
LD vmlinux
SORTTAB vmlinux
SYSMAP System.map
OBJCOPY arch/arc/boot/vmlinux.bin
OBJCOPY arch/arc/boot/vmlinux.bin
GZIP arch/arc/boot/vmlinux.bin.gz
GZIP arch/arc/boot/vmlinux.bin.gz
UIMAGE arch/arc/boot/uImage.gz
UIMAGE arch/arc/boot/uImage.gz
Image Name: Linux-5.10.0-rc4-00003-g62f23044
Created: Sun Nov 22 02:52:26 2020
Image Type: ARC Linux Kernel Image (gzip compressed)
Data Size: 2109376 Bytes = 2059.94 KiB = 2.01 MiB
Load Address: 80000000
Entry Point: 80004000
Image arch/arc/boot/uImage is ready
Image Name: Linux-5.10.0-rc4-00003-g62f23044
Created: Sun Nov 22 02:52:26 2020
Image Type: ARC Linux Kernel Image (gzip compressed)
Data Size: 2815455 Bytes = 2749.47 KiB = 2.69 MiB
Load Address: 80000000
Entry Point: 80004000This is a race between the two threads trying to write to the same file arch/arc/boot/uImage.gz. This is a potential problem that can generate a broken file.
I fixed a similar problem for ARM by commit 3939f3345050 ("ARM: 8418/1:
add boot image dependencies to not generate invalid images").
I highly recommend to avoid such build rules that cause a race condition.
Move the uImage rule to arch/arc/Makefile.
Another strangeness is that arch/arc/boot/Makefile compares the timestamps between $(obj)/uImage and $(obj)/uImage.*:
$(obj)/uImage: $(obj)/uImage.$(suffix-y)
@ln -sf $(notdir $<) $@
@echo ' Image $@ is ready'This does not work as expected since $(obj)/uImage is a symlink. The symlink should be created in a phony target rule.
I used $(kecho) instead of echo to suppress the message 'Image arch/arc/boot/uImage is ready' when the -s option is given.
--- arch/arc/Makefile | 13 ++++++++++++- arch/arc/boot/Makefile | 11 +---------- 2 files changed, 13 insertions(+), 11 deletions(-)
arch/arc/Makefile +12 -1
@@ -102,11 +102,22 @@ libs-y += arch/arc/lib/ $(LIBGCC) boot := arch/arc/boot -boot_targets := uImage uImage.bin uImage.gz uImage.lzma +boot_targets := uImage.bin uImage.gz uImage.lzma PHONY += $(boot_targets) $(boot_targets): vmlinux $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ +uimage-default-y := uImage.bin +uimage-default-$(CONFIG_KERNEL_GZIP) := uImage.gz +uimage-default-$(CONFIG_KERNEL_LZMA) := uImage.lzma + +PHONY += uImage +uImage: $(uimage-default-y) + @ln -sf $< $(boot)/uImage + @$(kecho) ' Image $(boot)/uImage is ready' + +CLEAN_FILES += $(boot)/uImage + archclean: $(Q)$(MAKE) $(clean)=$(boot)
arch/arc/boot/Makefile +1 -10
@@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 -targets := vmlinux.bin vmlinux.bin.gz uImage +targets := vmlinux.bin vmlinux.bin.gz # uImage build relies on mkimage being availble on your host for ARC target # You will need to build u-boot for ARC, rename mkimage to arc-elf32-mkimage
@@ -13,11 +13,6 @@ LINUX_START_TEXT = $$(readelf -h vmlinux | \ UIMAGE_LOADADDR = $(CONFIG_LINUX_LINK_BASE) UIMAGE_ENTRYADDR = $(LINUX_START_TEXT) -suffix-y := bin -suffix-$(CONFIG_KERNEL_GZIP) := gz -suffix-$(CONFIG_KERNEL_LZMA) := lzma - -targets += uImage targets += uImage.bin targets += uImage.gz targets += uImage.lzma
@@ -42,7 +37,3 @@ $(obj)/uImage.gz: $(obj)/vmlinux.bin.gz FORCE $(obj)/uImage.lzma: $(obj)/vmlinux.bin.lzma FORCE $(call if_changed,uimage,lzma) - -$(obj)/uImage: $(obj)/uImage.$(suffix-y) - @ln -sf $(notdir $<) $@ - @echo ' Image $@ is ready'
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 59/152 ARM: omap2: pmic-cpcap: fix maximum voltage to be consistent with defaults on xt875
In reply to Greg Kroah-HartmanFrom: Carl Philipp Klemm <[email protected]>
[ Upstream commit c0bc969c176b10598b31d5d1a5edf9a5261f0a9f ]
xt875 comes up with a iva voltage of 1375000 and android runs at this too. fix maximum voltage to be consistent with this.
--- arch/arm/mach-omap2/pmic-cpcap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-omap2/pmic-cpcap.c +1 -1
@@ -71,7 +71,7 @@ static struct omap_voltdm_pmic omap_cpcap_iva = { .vp_vstepmin = OMAP4_VP_VSTEPMIN_VSTEPMIN, .vp_vstepmax = OMAP4_VP_VSTEPMAX_VSTEPMAX, .vddmin = 900000, - .vddmax = 1350000, + .vddmax = 1375000, .vp_timeout_us = OMAP4_VP_VLIMITTO_TIMEOUT_US, .i2c_slave_addr = 0x44, .volt_reg_addr = 0x0,
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 60/152 ath11k: fix crash caused by NULL rx_channel
In reply to Greg Kroah-HartmanFrom: Carl Huang <[email protected]>
[ Upstream commit 3597010630d0aa96f5778901e691c6068bb86318 ]
During connect and disconnect stress test, crashed happened because ar->rx_channel is NULL. Fix it by checking whether ar->rx_channel is NULL.
Crash stack is as below:
RIP: 0010:ath11k_dp_rx_h_ppdu+0x110/0x230 [ath11k] [ 5028.808963] ath11k_dp_rx_wbm_err+0x14a/0x360 [ath11k] [ 5028.808970] ath11k_dp_rx_process_wbm_err+0x41c/0x520 [ath11k] [ 5028.808978] ath11k_dp_service_srng+0x25e/0x2d0 [ath11k] [ 5028.808982] ath11k_pci_ext_grp_napi_poll+0x23/0x80 [ath11k_pci] [ 5028.808986] net_rx_action+0x27e/0x400 [ 5028.808990] __do_softirq+0xfd/0x2bb [ 5028.808993] irq_exit+0xa6/0xb0 [ 5028.808995] do_IRQ+0x56/0xe0 [ 5028.808997] common_interrupt+0xf/0xf
Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
--- drivers/net/wireless/ath/ath11k/dp_rx.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/ath11k/dp_rx.c +7 -3
@@ -2272,6 +2272,7 @@ static void ath11k_dp_rx_h_ppdu(struct ath11k *ar, struct hal_rx_desc *rx_desc, {u8 channel_num;u32 center_freq; +struct ieee80211_channel *channel; rx_status->freq =0 ; rx_status->rate_idx =0 ;
@@ -2292,9 +2293,12 @@ static void ath11k_dp_rx_h_ppdu(struct ath11k *ar, struct hal_rx_desc *rx_desc, rx_status->band =NL80211_BAND_5GHZ ; }else {spin_lock_bh (&ar->data_lock); - rx_status->band = ar->rx_channel->band; - channel_num = -ieee80211_frequency_to_channel (ar->rx_channel->center_freq); + channel = ar->rx_channel; +if (channel) { + rx_status->band = channel->band; + channel_num = +ieee80211_frequency_to_channel (channel->center_freq); + }spin_unlock_bh (&ar->data_lock);ath11k_dbg_dump (ar->ab,ATH11K_DBG_DATA ,NULL ,"rx_desc: " , rx_desc,sizeof (struct hal_rx_desc ));
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 61/152 netfilter: ipset: fixes possible oops in mtype_resize
In reply to Greg Kroah-HartmanFrom: Vasily Averin <[email protected]>
[ Upstream commit 2b33d6ffa9e38f344418976b06057e2fc2aa9e2a ]
currently mtype_resize() can cause oops
t = ip_set_alloc(htable_size(htable_bits));
if (!t) {
ret = -ENOMEM;
goto out;
}
t->hregion = ip_set_alloc(ahash_sizeof_regions(htable_bits));Increased htable_bits can force htable_size() to return 0. In own turn ip_set_alloc(0) returns not 0 but ZERO_SIZE_PTR, so follwoing access to t->hregion should trigger an OOPS.
--- net/netfilter/ipset/ip_set_hash_gen.h | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
net/netfilter/ipset/ip_set_hash_gen.h +13 -9
@@ -630,7 +630,7 @@ mtype_resize(struct ip_set *set, bool retried)struct htype *h = set->data;struct htable *t, *orig;u8 htable_bits; -size_t dsize = set->dsize; +size_t hsize, dsize = set->dsize;#ifdef IP_SET_HASH_WITH_NETS u8 flags;struct mtype_elem *tmp;
@@ -654,14 +654,12 @@ mtype_resize(struct ip_set *set, bool retried) retry: ret =0 ; htable_bits++; -if (!htable_bits) { -/* In case we have plenty of memory :-) */ -pr_warn ("Cannot increase the hashsize of set %s further\n" , - set->name); - ret = -IPSET_ERR_HASH_FULL ; - goto out; - } - t =ip_set_alloc (htable_size (htable_bits)); +if (!htable_bits) + goto hbwarn; + hsize =htable_size (htable_bits); +if (!hsize) + goto hbwarn; + t =ip_set_alloc (hsize);if (!t) { ret = -ENOMEM ; goto out;
@@ -803,6 +801,12 @@ cleanup:if (ret == -EAGAIN ) goto retry; goto out; + +hbwarn: +/* In case we have plenty of memory :-) */ +pr_warn ("Cannot increase the hashsize of set %s further\n" , set->name); + ret = -IPSET_ERR_HASH_FULL ; + goto out; }/* Get the current number of elements and ext_size in the set */
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 62/152 ath11k: qmi: try to allocate a big block of DMA memory first
In reply to Greg Kroah-HartmanFrom: Carl Huang <[email protected]>
[ Upstream commit f6f92968e1e5a7a9d211faaebefc26ebe408dad7 ]
Not all firmware versions support allocating DMA memory in smaller blocks so first try to allocate big block of DMA memory for QMI. If the allocation fails, let firmware request multiple blocks of DMA memory with smaller size.
This also fixes an unnecessary error message seen during ath11k probe on QCA6390:
ath11k_pci 0000:06:00.0: Respond mem req failed, result: 1, err: 0 ath11k_pci 0000:06:00.0: qmi failed to respond fw mem req:-22
Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1
--- drivers/net/wireless/ath/ath11k/qmi.c | 24 ++++++++++++++++++++++-- drivers/net/wireless/ath/ath11k/qmi.h | 1 + 2 files changed, 23 insertions(+), 2 deletions(-)
drivers/net/wireless/ath/ath11k/qmi.c +22 -2
@@ -1654,6 +1654,7 @@ static int ath11k_qmi_respond_fw_mem_request(struct ath11k_base *ab)struct qmi_wlanfw_respond_mem_resp_msg_v01 resp;struct qmi_txn txn = {};int ret =0 , i; +bool delayed; req =kzalloc (sizeof (*req),GFP_KERNEL );if (!req)
@@ -1666,11 +1667,13 @@ static int ath11k_qmi_respond_fw_mem_request(struct ath11k_base *ab)* failure to FW and FW will then request mulitple blocks of small * chunk size memory. */ -if (!ab->bus_params.fixed_mem_region && ab->qmi.mem_seg_count <=2 ) { +if (!ab->bus_params.fixed_mem_region && ab->qmi.target_mem_delayed) { + delayed = true;ath11k_dbg (ab,ATH11K_DBG_QMI ,"qmi delays mem_request %d\n" , ab->qmi.mem_seg_count);memset (req,0 ,sizeof (*req)); }else { + delayed = false; req->mem_seg_len = ab->qmi.mem_seg_count;for (i =0 ; i < req->mem_seg_len ; i++) {
@@ -1702,6 +1705,12 @@ static int ath11k_qmi_respond_fw_mem_request(struct ath11k_base *ab) }if (resp.resp.result !=QMI_RESULT_SUCCESS_V01 ) { +/* the error response is expected when +* target_mem_delayed is true. +*/ +if (delayed && resp.resp.error ==0 ) + goto out; +ath11k_warn (ab,"Respond mem req failed, result: %d, err: %d\n" , resp.resp.result, resp.resp.error); ret = -EINVAL ;
@@ -1736,6 +1745,8 @@ static int ath11k_qmi_alloc_target_mem_chunk(struct ath11k_base *ab)int i;struct target_mem_chunk *chunk; + ab->qmi.target_mem_delayed = false; +for (i =0 ; i < ab->qmi.mem_seg_count; i++) { chunk = &ab->qmi.target_mem[i]; chunk->vaddr = dma_alloc_coherent(ab->dev,
@@ -1743,6 +1754,15 @@ static int ath11k_qmi_alloc_target_mem_chunk(struct ath11k_base *ab) &chunk->paddr, GFP_KERNEL);if (!chunk->vaddr) { +if (ab->qmi.mem_seg_count <=2 ) { +ath11k_dbg (ab,ATH11K_DBG_QMI , +"qmi dma allocation failed (%d B type %u), will try later with small size\n" , + chunk->size, + chunk->type); +ath11k_qmi_free_target_mem_chunk (ab); + ab->qmi.target_mem_delayed = true; +return 0 ; + }ath11k_err (ab,"failed to alloc memory, size: 0x%x, type: %u\n" , chunk->size, chunk->type);
@@ -2467,7 +2487,7 @@ static void ath11k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl, ret);return ; } - }else if (msg->mem_seg_len >2 ) { + }else { ret =ath11k_qmi_alloc_target_mem_chunk (ab);if (ret) { ath11k_warn(ab, "qmi failed to alloc target memory: %d\n",
drivers/net/wireless/ath/ath11k/qmi.h +1 -0
@@ -121,6 +121,7 @@ struct ath11k_qmi {struct target_mem_chunk target_mem[ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01 ];u32 mem_seg_count;u32 target_mem_mode; +bool target_mem_delayed;u8 cal_done;struct target_info target;struct m3_mem_region m3_mem;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 63/152 btrfs: fix async discard stall
In reply to Greg Kroah-HartmanFrom: Pavel Begunkov <[email protected]>
[ Upstream commit ea9ed87c73e87e044b2c58d658eb4ba5216bc488 ]
Might happen that bg->discard_eligible_time was changed without rescheduling, so btrfs_discard_workfn() wakes up earlier than that new time, peek_discard_list() returns NULL, and all work halts and goes to sleep without further rescheduling even there are block groups to discard.
It happens pretty often, but not so visible from the userspace because after some time it usually will be kicked off anyway by someone else calling btrfs_discard_reschedule_work().
Fix it by continue rescheduling if block group discard lists are not empty.
--- fs/btrfs/discard.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
fs/btrfs/discard.c +10 -7
@@ -199,16 +199,15 @@ static struct btrfs_block_group *find_next_block_group(static struct btrfs_block_group *peek_discard_list (struct btrfs_discard_ctl *discard_ctl,enum btrfs_discard_state *discard_state, -int *discard_index) +int *discard_index,u64 now) {struct btrfs_block_group *block_group; -const u64 now =ktime_get_ns ();spin_lock (&discard_ctl->lock); again: block_group =find_next_block_group (discard_ctl, now); -if (block_group && now > block_group->discard_eligible_time) { +if (block_group && now >= block_group->discard_eligible_time) {if (block_group->discard_index ==BTRFS_DISCARD_INDEX_UNUSED && block_group->used !=0 ) {if (btrfs_is_block_group_data_only (block_group))
@@ -222,12 +221,11 @@ again: block_group->discard_state =BTRFS_DISCARD_EXTENTS ; } discard_ctl->block_group = block_group; + } +if (block_group) { *discard_state = block_group->discard_state; *discard_index = block_group->discard_index; - }else { - block_group =NULL ; } -spin_unlock (&discard_ctl->lock);return block_group;
@@ -429,13 +427,18 @@ static void btrfs_discard_workfn(struct work_struct *work)int discard_index =0 ;u64 trimmed =0 ;u64 minlen =0 ; +u64 now =ktime_get_ns (); discard_ctl = container_of(work, struct btrfs_discard_ctl, work.work); block_group =peek_discard_list (discard_ctl, &discard_state, - &discard_index); + &discard_index, now);if (!block_group || !btrfs_run_discard_work (discard_ctl))return ; +if (now < block_group->discard_eligible_time) { +btrfs_discard_schedule_work (discard_ctl, false); +return ; + }/* Perform discarding */ minlen = discard_minlen[discard_index];
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 64/152 btrfs: merge critical sections of discard lock in workfn
In reply to Greg Kroah-HartmanFrom: Pavel Begunkov <[email protected]>
[ Upstream commit 8fc058597a283e9a37720abb0e8d68e342b9387d ]
btrfs_discard_workfn() drops discard_ctl->lock just to take it again in a moment in btrfs_discard_schedule_work(). Avoid that and also reuse ktime.
--- fs/btrfs/discard.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-)
fs/btrfs/discard.c +23 -20
@@ -328,28 +328,15 @@ void btrfs_discard_queue_work(struct btrfs_discard_ctl *discard_ctl,btrfs_discard_schedule_work (discard_ctl, false); } -/** -* btrfs_discard_schedule_work - responsible for scheduling the discard work -* @discard_ctl: discard control -* @override: override the current timer -* -* Discards are issued by a delayed workqueue item. @override is used to -* update the current delay as the baseline delay interval is reevaluated on -* transaction commit. This is also maxed with any other rate limit. -*/ -void btrfs_discard_schedule_work (struct btrfs_discard_ctl *discard_ctl, -bool override) +static void __btrfs_discard_schedule_work (struct btrfs_discard_ctl *discard_ctl, +u64 now,bool override) {struct btrfs_block_group *block_group; -const u64 now =ktime_get_ns (); - -spin_lock (&discard_ctl->lock);if (!btrfs_run_discard_work (discard_ctl)) - goto out; - +return ;if (!override &&delayed_work_pending (&discard_ctl->work)) - goto out; +return ; block_group =find_next_block_group (discard_ctl, now);if (block_group) {
@@ -382,7 +369,24 @@ void btrfs_discard_schedule_work(struct btrfs_discard_ctl *discard_ctl,mod_delayed_work (discard_ctl->discard_workers, &discard_ctl->work, delay); } -out: +} + +/* +* btrfs_discard_schedule_work - responsible for scheduling the discard work +* @discard_ctl: discard control +* @override: override the current timer +* +* Discards are issued by a delayed workqueue item. @override is used to +* update the current delay as the baseline delay interval is reevaluated on +* transaction commit. This is also maxed with any other rate limit. +*/ +void btrfs_discard_schedule_work (struct btrfs_discard_ctl *discard_ctl, +bool override) +{ +const u64 now =ktime_get_ns (); + +spin_lock (&discard_ctl->lock); +__btrfs_discard_schedule_work (discard_ctl, now, override);spin_unlock (&discard_ctl->lock); }
@@ -487,9 +491,8 @@ static void btrfs_discard_workfn(struct work_struct *work)spin_lock (&discard_ctl->lock); discard_ctl->block_group =NULL ; +__btrfs_discard_schedule_work (discard_ctl, now, false);spin_unlock (&discard_ctl->lock); - -btrfs_discard_schedule_work (discard_ctl, false); }/**
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 65/152 btrfs: fix transaction leak and crash after RO remount caused by qgroup rescan
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
[ Upstream commit cb13eea3b49055bd78e6ddf39defd6340f7379fc ]
If we remount a filesystem in RO mode while the qgroup rescan worker is running, we can end up having it still running after the remount is done, and at unmount time we may end up with an open transaction that ends up never getting committed. If that happens we end up with several memory leaks and can crash when hardware acceleration is unavailable for crc32c. Possibly it can lead to other nasty surprises too, due to use-after-free issues.
The following steps explain how the problem happens.
1) We have a filesystem mounted in RW mode and the qgroup rescan worker is running;
2) We remount the filesystem in RO mode, and never stop/pause the rescan worker, so after the remount the rescan worker is still running. The important detail here is that the rescan task is still running after the remount operation committed any ongoing transaction through its call to btrfs_commit_super();
3) The rescan is still running, and after the remount completed, the rescan worker started a transaction, after it finished iterating all leaves of the extent tree, to update the qgroup status item in the quotas tree. It does not commit the transaction, it only releases its handle on the transaction;
4) A filesystem unmount operation starts shortly after;
5) The unmount task, at close_ctree(), stops the transaction kthread, which had not had a chance to commit the open transaction since it was sleeping and the commit interval (default of 30 seconds) has not yet elapsed since the last time it committed a transaction;
6) So after stopping the transaction kthread we still have the transaction used to update the qgroup status item open. At close_ctree(), when the filesystem is in RO mode and no transaction abort happened (or the filesystem is in error mode), we do not expect to have any transaction open, so we do not call btrfs_commit_super();
7) We then proceed to destroy the work queues, free the roots and block groups, etc. After that we drop the last reference on the btree inode by calling iput() on it. Since there are dirty pages for the btree inode, corresponding to the COWed extent buffer for the quotas btree, btree_write_cache_pages() is invoked to flush those dirty pages. This results in creating a bio and submitting it, which makes us end up at btrfs_submit_metadata_bio();
8) At btrfs_submit_metadata_bio() we end up at the if-then-else branch that calls btrfs_wq_submit_bio(), because check_async_write() returned a value of 1. This value of 1 is because we did not have hardware acceleration available for crc32c, so BTRFS_FS_CSUM_IMPL_FAST was not set in fs_info->flags;
9) Then at btrfs_wq_submit_bio() we call btrfs_queue_work() against the workqueue at fs_info->workers, which was already freed before by the call to btrfs_stop_all_workers() at close_ctree(). This results in an invalid memory access due to a use-after-free, leading to a crash.
When this happens, before the crash there are several warnings triggered, since we have reserved metadata space in a block group, the delayed refs reservation, etc:
------------[ cut here ]------------ WARNING: CPU: 4 PID: 1729896 at fs/btrfs/block-group.c:125 btrfs_put_block_group+0x63/0xa0 [btrfs] Modules linked in: btrfs dm_snapshot dm_thin_pool (...) CPU: 4 PID: 1729896 Comm: umount Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:btrfs_put_block_group+0x63/0xa0 [btrfs] Code: f0 01 00 00 48 39 c2 75 (...) RSP: 0018:ffffb270826bbdd8 EFLAGS: 00010206 RAX: 0000000000000001 RBX: ffff947ed73e4000 RCX: ffff947ebc8b29c8 RDX: 0000000000000001 RSI: ffffffffc0b150a0 RDI: ffff947ebc8b2800 RBP: ffff947ebc8b2800 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000001 R12: ffff947ed73e4110 R13: ffff947ed73e4160 R14: ffff947ebc8b2988 R15: dead000000000100 FS: 00007f15edfea840(0000) GS:ffff9481ad600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f37e2893320 CR3: 0000000138f68001 CR4: 00000000003706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: btrfs_free_block_groups+0x17f/0x2f0 [btrfs] close_ctree+0x2ba/0x2fa [btrfs] generic_shutdown_super+0x6c/0x100 kill_anon_super+0x14/0x30 btrfs_kill_super+0x12/0x20 [btrfs] deactivate_locked_super+0x31/0x70 cleanup_mnt+0x100/0x160 task_work_run+0x68/0xb0 exit_to_user_mode_prepare+0x1bb/0x1c0 syscall_exit_to_user_mode+0x4b/0x260 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f15ee221ee7 Code: ff 0b 00 f7 d8 64 89 01 48 (...) RSP: 002b:00007ffe9470f0f8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6 RAX: 0000000000000000 RBX: 00007f15ee347264 RCX: 00007f15ee221ee7 RDX: ffffffffffffff78 RSI: 0000000000000000 RDI: 000056169701d000 RBP: 0000561697018a30 R08: 0000000000000000 R09: 00007f15ee2e2be0 R10: 000056169701efe0 R11: 0000000000000246 R12: 0000000000000000 R13: 000056169701d000 R14: 0000561697018b40 R15: 0000561697018c60 irq event stamp: 0 hardirqs last enabled at (0): [<0000000000000000>] 0x0 hardirqs last disabled at (0): [<ffffffff8bcae560>] copy_process+0x8a0/0x1d70 softirqs last enabled at (0): [<ffffffff8bcae560>] copy_process+0x8a0/0x1d70 softirqs last disabled at (0): [<0000000000000000>] 0x0 ---[ end trace dd74718fef1ed5c6 ]--- ------------[ cut here ]------------ WARNING: CPU: 2 PID: 1729896 at fs/btrfs/block-rsv.c:459 btrfs_release_global_block_rsv+0x70/0xc0 [btrfs] Modules linked in: btrfs dm_snapshot dm_thin_pool (...) CPU: 2 PID: 1729896 Comm: umount Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:btrfs_release_global_block_rsv+0x70/0xc0 [btrfs] Code: 48 83 bb b0 03 00 00 00 (...) RSP: 0018:ffffb270826bbdd8 EFLAGS: 00010206 RAX: 000000000033c000 RBX: ffff947ed73e4000 RCX: 0000000000000000 RDX: 0000000000000001 RSI: ffffffffc0b0d8c1 RDI: 00000000ffffffff RBP: ffff947ebc8b7000 R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000001 R12: ffff947ed73e4110 R13: ffff947ed73e5278 R14: dead000000000122 R15: dead000000000100 FS: 00007f15edfea840(0000) GS:ffff9481aca00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000561a79f76e20 CR3: 0000000138f68006 CR4: 00000000003706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: btrfs_free_block_groups+0x24c/0x2f0 [btrfs] close_ctree+0x2ba/0x2fa [btrfs] generic_shutdown_super+0x6c/0x100 kill_anon_super+0x14/0x30 btrfs_kill_super+0x12/0x20 [btrfs] deactivate_locked_super+0x31/0x70 cleanup_mnt+0x100/0x160 task_work_run+0x68/0xb0 exit_to_user_mode_prepare+0x1bb/0x1c0 syscall_exit_to_user_mode+0x4b/0x260 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f15ee221ee7 Code: ff 0b 00 f7 d8 64 89 01 (...) RSP: 002b:00007ffe9470f0f8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6 RAX: 0000000000000000 RBX: 00007f15ee347264 RCX: 00007f15ee221ee7 RDX: ffffffffffffff78 RSI: 0000000000000000 RDI: 000056169701d000 RBP: 0000561697018a30 R08: 0000000000000000 R09: 00007f15ee2e2be0 R10: 000056169701efe0 R11: 0000000000000246 R12: 0000000000000000 R13: 000056169701d000 R14: 0000561697018b40 R15: 0000561697018c60 irq event stamp: 0 hardirqs last enabled at (0): [<0000000000000000>] 0x0 hardirqs last disabled at (0): [<ffffffff8bcae560>] copy_process+0x8a0/0x1d70 softirqs last enabled at (0): [<ffffffff8bcae560>] copy_process+0x8a0/0x1d70 softirqs last disabled at (0): [<0000000000000000>] 0x0 ---[ end trace dd74718fef1ed5c7 ]--- ------------[ cut here ]------------ WARNING: CPU: 2 PID: 1729896 at fs/btrfs/block-group.c:3377 btrfs_free_block_groups+0x25d/0x2f0 [btrfs] Modules linked in: btrfs dm_snapshot dm_thin_pool (...) CPU: 5 PID: 1729896 Comm: umount Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:btrfs_free_block_groups+0x25d/0x2f0 [btrfs] Code: ad de 49 be 22 01 00 (...) RSP: 0018:ffffb270826bbde8 EFLAGS: 00010206 RAX: ffff947ebeae1d08 RBX: ffff947ed73e4000 RCX: 0000000000000000 RDX: 0000000000000001 RSI: ffff947e9d823ae8 RDI: 0000000000000246 RBP: ffff947ebeae1d08 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000001 R12: ffff947ebeae1c00 R13: ffff947ed73e5278 R14: dead000000000122 R15: dead000000000100 FS: 00007f15edfea840(0000) GS:ffff9481ad200000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f1475d98ea8 CR3: 0000000138f68005 CR4: 00000000003706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: close_ctree+0x2ba/0x2fa [btrfs] generic_shutdown_super+0x6c/0x100 kill_anon_super+0x14/0x30 btrfs_kill_super+0x12/0x20 [btrfs] deactivate_locked_super+0x31/0x70 cleanup_mnt+0x100/0x160 task_work_run+0x68/0xb0 exit_to_user_mode_prepare+0x1bb/0x1c0 syscall_exit_to_user_mode+0x4b/0x260 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f15ee221ee7 Code: ff 0b 00 f7 d8 64 89 (...) RSP: 002b:00007ffe9470f0f8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6 RAX: 0000000000000000 RBX: 00007f15ee347264 RCX: 00007f15ee221ee7 RDX: ffffffffffffff78 RSI: 0000000000000000 RDI: 000056169701d000 RBP: 0000561697018a30 R08: 0000000000000000 R09: 00007f15ee2e2be0 R10: 000056169701efe0 R11: 0000000000000246 R12: 0000000000000000 R13: 000056169701d000 R14: 0000561697018b40 R15: 0000561697018c60 irq event stamp: 0 hardirqs last enabled at (0): [<0000000000000000>] 0x0 hardirqs last disabled at (0): [<ffffffff8bcae560>] copy_process+0x8a0/0x1d70 softirqs last enabled at (0): [<ffffffff8bcae560>] copy_process+0x8a0/0x1d70 softirqs last disabled at (0): [<0000000000000000>] 0x0 ---[ end trace dd74718fef1ed5c8 ]--- BTRFS info (device sdc): space_info 4 has 268238848 free, is not full BTRFS info (device sdc): space_info total=268435456, used=114688, pinned=0, reserved=16384, may_use=0, readonly=65536 BTRFS info (device sdc): global_block_rsv: size 0 reserved 0 BTRFS info (device sdc): trans_block_rsv: size 0 reserved 0 BTRFS info (device sdc): chunk_block_rsv: size 0 reserved 0 BTRFS info (device sdc): delayed_block_rsv: size 0 reserved 0 BTRFS info (device sdc): delayed_refs_rsv: size 524288 reserved 0
And the crash, which only happens when we do not have crc32c hardware acceleration, produces the following trace immediately after those warnings:
stack segment: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC PTI CPU: 2 PID: 1749129 Comm: umount Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 RIP: 0010:btrfs_queue_work+0x36/0x190 [btrfs] Code: 54 55 53 48 89 f3 (...) RSP: 0018:ffffb27082443ae8 EFLAGS: 00010282 RAX: 0000000000000004 RBX: ffff94810ee9ad90 RCX: 0000000000000000 RDX: 0000000000000001 RSI: ffff94810ee9ad90 RDI: ffff947ed8ee75a0 RBP: a56b6b6b6b6b6b6b R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000007 R11: 0000000000000001 R12: ffff947fa9b435a8 R13: ffff94810ee9ad90 R14: 0000000000000000 R15: ffff947e93dc0000 FS: 00007f3cfe974840(0000) GS:ffff9481ac600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f1b42995a70 CR3: 0000000127638003 CR4: 00000000003706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: btrfs_wq_submit_bio+0xb3/0xd0 [btrfs] btrfs_submit_metadata_bio+0x44/0xc0 [btrfs] submit_one_bio+0x61/0x70 [btrfs] btree_write_cache_pages+0x414/0x450 [btrfs] ? kobject_put+0x9a/0x1d0 ? trace_hardirqs_on+0x1b/0xf0 ? _raw_spin_unlock_irqrestore+0x3c/0x60 ? free_debug_processing+0x1e1/0x2b0 do_writepages+0x43/0xe0 ? lock_acquired+0x199/0x490 __writeback_single_inode+0x59/0x650 writeback_single_inode+0xaf/0x120 write_inode_now+0x94/0xd0 iput+0x187/0x2b0 close_ctree+0x2c6/0x2fa [btrfs] generic_shutdown_super+0x6c/0x100 kill_anon_super+0x14/0x30 btrfs_kill_super+0x12/0x20 [btrfs] deactivate_locked_super+0x31/0x70 cleanup_mnt+0x100/0x160 task_work_run+0x68/0xb0 exit_to_user_mode_prepare+0x1bb/0x1c0 syscall_exit_to_user_mode+0x4b/0x260 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f3cfebabee7 Code: ff 0b 00 f7 d8 64 89 01 (...) RSP: 002b:00007ffc9c9a05f8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6 RAX: 0000000000000000 RBX: 00007f3cfecd1264 RCX: 00007f3cfebabee7 RDX: ffffffffffffff78 RSI: 0000000000000000 RDI: 0000562b6b478000 RBP: 0000562b6b473a30 R08: 0000000000000000 R09: 00007f3cfec6cbe0 R10: 0000562b6b479fe0 R11: 0000000000000246 R12: 0000000000000000 R13: 0000562b6b478000 R14: 0000562b6b473b40 R15: 0000562b6b473c60 Modules linked in: btrfs dm_snapshot dm_thin_pool (...) ---[ end trace dd74718fef1ed5cc ]---
Finally when we remove the btrfs module (rmmod btrfs), there are several warnings about objects that were allocated from our slabs but were never freed, consequence of the transaction that was never committed and got leaked:
=============================================================================
BUG btrfs_delayed_ref_head (Tainted: G B W ): Objects remaining in btrfs_delayed_ref_head on __kmem_cache_shutdown()
-----------------------------------------------------------------------------
INFO: Slab 0x0000000094c2ae56 objects=24 used=2 fp=0x000000002bfa2521 flags=0x17fffc000010200
CPU: 5 PID: 1729921 Comm: rmmod Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Call Trace: dump_stack+0x8d/0xb5 slab_err+0xb7/0xdc ? lock_acquired+0x199/0x490 __kmem_cache_shutdown+0x1ac/0x3c0 ? lock_release+0x20e/0x4c0 kmem_cache_destroy+0x55/0x120 btrfs_delayed_ref_exit+0x11/0x35 [btrfs] exit_btrfs_fs+0xa/0x59 [btrfs] __x64_sys_delete_module+0x194/0x260 ? fpregs_assert_state_consistent+0x1e/0x40 ? exit_to_user_mode_prepare+0x55/0x1c0 ? trace_hardirqs_on+0x1b/0xf0 do_syscall_64+0x33/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f693e305897 Code: 73 01 c3 48 8b 0d f9 f5 (...) RSP: 002b:00007ffcf73eb508 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0 RAX: ffffffffffffffda RBX: 0000559df504f760 RCX: 00007f693e305897 RDX: 000000000000000a RSI: 0000000000000800 RDI: 0000559df504f7c8 RBP: 00007ffcf73eb568 R08: 0000000000000000 R09: 0000000000000000 R10: 00007f693e378ac0 R11: 0000000000000206 R12: 00007ffcf73eb740 R13: 00007ffcf73ec5a6 R14: 0000559df504f2a0 R15: 0000559df504f760 INFO: Object 0x0000000050cbdd61 @offset=12104 INFO: Allocated in btrfs_add_delayed_tree_ref+0xbb/0x480 [btrfs] age=1894 cpu=6 pid=1729873 __slab_alloc.isra.0+0x109/0x1c0 kmem_cache_alloc+0x7bb/0x830 btrfs_add_delayed_tree_ref+0xbb/0x480 [btrfs] btrfs_free_tree_block+0x128/0x360 [btrfs] __btrfs_cow_block+0x489/0x5f0 [btrfs] btrfs_cow_block+0xf7/0x220 [btrfs] btrfs_search_slot+0x62a/0xc40 [btrfs] btrfs_del_orphan_item+0x65/0xd0 [btrfs] btrfs_find_orphan_roots+0x1bf/0x200 [btrfs] open_ctree+0x125a/0x18a0 [btrfs] btrfs_mount_root.cold+0x13/0xed [btrfs] legacy_get_tree+0x30/0x60 vfs_get_tree+0x28/0xe0 fc_mount+0xe/0x40 vfs_kern_mount.part.0+0x71/0x90 btrfs_mount+0x13b/0x3e0 [btrfs] INFO: Freed in __btrfs_run_delayed_refs+0x1117/0x1290 [btrfs] age=4292 cpu=2 pid=1729526 kmem_cache_free+0x34c/0x3c0 __btrfs_run_delayed_refs+0x1117/0x1290 [btrfs] btrfs_run_delayed_refs+0x81/0x210 [btrfs] commit_cowonly_roots+0xfb/0x300 [btrfs] btrfs_commit_transaction+0x367/0xc40 [btrfs] sync_filesystem+0x74/0x90 generic_shutdown_super+0x22/0x100 kill_anon_super+0x14/0x30 btrfs_kill_super+0x12/0x20 [btrfs] deactivate_locked_super+0x31/0x70 cleanup_mnt+0x100/0x160 task_work_run+0x68/0xb0 exit_to_user_mode_prepare+0x1bb/0x1c0 syscall_exit_to_user_mode+0x4b/0x260 entry_SYSCALL_64_after_hwframe+0x44/0xa9 INFO: Object 0x0000000086e9b0ff @offset=12776 INFO: Allocated in btrfs_add_delayed_tree_ref+0xbb/0x480 [btrfs] age=1900 cpu=6 pid=1729873 __slab_alloc.isra.0+0x109/0x1c0 kmem_cache_alloc+0x7bb/0x830 btrfs_add_delayed_tree_ref+0xbb/0x480 [btrfs] btrfs_alloc_tree_block+0x2bf/0x360 [btrfs] alloc_tree_block_no_bg_flush+0x4f/0x60 [btrfs] __btrfs_cow_block+0x12d/0x5f0 [btrfs] btrfs_cow_block+0xf7/0x220 [btrfs] btrfs_search_slot+0x62a/0xc40 [btrfs] btrfs_del_orphan_item+0x65/0xd0 [btrfs] btrfs_find_orphan_roots+0x1bf/0x200 [btrfs] open_ctree+0x125a/0x18a0 [btrfs] btrfs_mount_root.cold+0x13/0xed [btrfs] legacy_get_tree+0x30/0x60 vfs_get_tree+0x28/0xe0 fc_mount+0xe/0x40 vfs_kern_mount.part.0+0x71/0x90 INFO: Freed in __btrfs_run_delayed_refs+0x1117/0x1290 [btrfs] age=3141 cpu=6 pid=1729803 kmem_cache_free+0x34c/0x3c0 __btrfs_run_delayed_refs+0x1117/0x1290 [btrfs] btrfs_run_delayed_refs+0x81/0x210 [btrfs] btrfs_write_dirty_block_groups+0x17d/0x3d0 [btrfs] commit_cowonly_roots+0x248/0x300 [btrfs] btrfs_commit_transaction+0x367/0xc40 [btrfs] close_ctree+0x113/0x2fa [btrfs] generic_shutdown_super+0x6c/0x100 kill_anon_super+0x14/0x30 btrfs_kill_super+0x12/0x20 [btrfs] deactivate_locked_super+0x31/0x70 cleanup_mnt+0x100/0x160 task_work_run+0x68/0xb0 exit_to_user_mode_prepare+0x1bb/0x1c0 syscall_exit_to_user_mode+0x4b/0x260 entry_SYSCALL_64_after_hwframe+0x44/0xa9 kmem_cache_destroy btrfs_delayed_ref_head: Slab cache still has objects CPU: 5 PID: 1729921 Comm: rmmod Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Call Trace: dump_stack+0x8d/0xb5 kmem_cache_destroy+0x119/0x120 btrfs_delayed_ref_exit+0x11/0x35 [btrfs] exit_btrfs_fs+0xa/0x59 [btrfs] __x64_sys_delete_module+0x194/0x260 ? fpregs_assert_state_consistent+0x1e/0x40 ? exit_to_user_mode_prepare+0x55/0x1c0 ? trace_hardirqs_on+0x1b/0xf0 do_syscall_64+0x33/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f693e305897 Code: 73 01 c3 48 8b 0d f9 f5 0b (...) RSP: 002b:00007ffcf73eb508 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0 RAX: ffffffffffffffda RBX: 0000559df504f760 RCX: 00007f693e305897 RDX: 000000000000000a RSI: 0000000000000800 RDI: 0000559df504f7c8 RBP: 00007ffcf73eb568 R08: 0000000000000000 R09: 0000000000000000 R10: 00007f693e378ac0 R11: 0000000000000206 R12: 00007ffcf73eb740 R13: 00007ffcf73ec5a6 R14: 0000559df504f2a0 R15: 0000559df504f760 ============================================================================= BUG btrfs_delayed_tree_ref (Tainted: G B W ): Objects remaining in btrfs_delayed_tree_ref on __kmem_cache_shutdown() -----------------------------------------------------------------------------
INFO: Slab 0x0000000011f78dc0 objects=37 used=2 fp=0x0000000032d55d91 flags=0x17fffc000010200
CPU: 3 PID: 1729921 Comm: rmmod Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Call Trace: dump_stack+0x8d/0xb5 slab_err+0xb7/0xdc ? lock_acquired+0x199/0x490 __kmem_cache_shutdown+0x1ac/0x3c0 ? lock_release+0x20e/0x4c0 kmem_cache_destroy+0x55/0x120 btrfs_delayed_ref_exit+0x1d/0x35 [btrfs] exit_btrfs_fs+0xa/0x59 [btrfs] __x64_sys_delete_module+0x194/0x260 ? fpregs_assert_state_consistent+0x1e/0x40 ? exit_to_user_mode_prepare+0x55/0x1c0 ? trace_hardirqs_on+0x1b/0xf0 do_syscall_64+0x33/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f693e305897 Code: 73 01 c3 48 8b 0d f9 f5 (...) RSP: 002b:00007ffcf73eb508 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0 RAX: ffffffffffffffda RBX: 0000559df504f760 RCX: 00007f693e305897 RDX: 000000000000000a RSI: 0000000000000800 RDI: 0000559df504f7c8 RBP: 00007ffcf73eb568 R08: 0000000000000000 R09: 0000000000000000 R10: 00007f693e378ac0 R11: 0000000000000206 R12: 00007ffcf73eb740 R13: 00007ffcf73ec5a6 R14: 0000559df504f2a0 R15: 0000559df504f760 INFO: Object 0x000000001a340018 @offset=4408 INFO: Allocated in btrfs_add_delayed_tree_ref+0x9e/0x480 [btrfs] age=1917 cpu=6 pid=1729873 __slab_alloc.isra.0+0x109/0x1c0 kmem_cache_alloc+0x7bb/0x830 btrfs_add_delayed_tree_ref+0x9e/0x480 [btrfs] btrfs_free_tree_block+0x128/0x360 [btrfs] __btrfs_cow_block+0x489/0x5f0 [btrfs] btrfs_cow_block+0xf7/0x220 [btrfs] btrfs_search_slot+0x62a/0xc40 [btrfs] btrfs_del_orphan_item+0x65/0xd0 [btrfs] btrfs_find_orphan_roots+0x1bf/0x200 [btrfs] open_ctree+0x125a/0x18a0 [btrfs] btrfs_mount_root.cold+0x13/0xed [btrfs] legacy_get_tree+0x30/0x60 vfs_get_tree+0x28/0xe0 fc_mount+0xe/0x40 vfs_kern_mount.part.0+0x71/0x90 btrfs_mount+0x13b/0x3e0 [btrfs] INFO: Freed in __btrfs_run_delayed_refs+0x63d/0x1290 [btrfs] age=4167 cpu=4 pid=1729795 kmem_cache_free+0x34c/0x3c0 __btrfs_run_delayed_refs+0x63d/0x1290 [btrfs] btrfs_run_delayed_refs+0x81/0x210 [btrfs] btrfs_commit_transaction+0x60/0xc40 [btrfs] create_subvol+0x56a/0x990 [btrfs] btrfs_mksubvol+0x3fb/0x4a0 [btrfs] __btrfs_ioctl_snap_create+0x119/0x1a0 [btrfs] btrfs_ioctl_snap_create+0x58/0x80 [btrfs] btrfs_ioctl+0x1a92/0x36f0 [btrfs] __x64_sys_ioctl+0x83/0xb0 do_syscall_64+0x33/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xa9 INFO: Object 0x000000002b46292a @offset=13648 INFO: Allocated in btrfs_add_delayed_tree_ref+0x9e/0x480 [btrfs] age=1923 cpu=6 pid=1729873 __slab_alloc.isra.0+0x109/0x1c0 kmem_cache_alloc+0x7bb/0x830 btrfs_add_delayed_tree_ref+0x9e/0x480 [btrfs] btrfs_alloc_tree_block+0x2bf/0x360 [btrfs] alloc_tree_block_no_bg_flush+0x4f/0x60 [btrfs] __btrfs_cow_block+0x12d/0x5f0 [btrfs] btrfs_cow_block+0xf7/0x220 [btrfs] btrfs_search_slot+0x62a/0xc40 [btrfs] btrfs_del_orphan_item+0x65/0xd0 [btrfs] btrfs_find_orphan_roots+0x1bf/0x200 [btrfs] open_ctree+0x125a/0x18a0 [btrfs] btrfs_mount_root.cold+0x13/0xed [btrfs] legacy_get_tree+0x30/0x60 vfs_get_tree+0x28/0xe0 fc_mount+0xe/0x40 vfs_kern_mount.part.0+0x71/0x90 INFO: Freed in __btrfs_run_delayed_refs+0x63d/0x1290 [btrfs] age=3164 cpu=6 pid=1729803 kmem_cache_free+0x34c/0x3c0 __btrfs_run_delayed_refs+0x63d/0x1290 [btrfs] btrfs_run_delayed_refs+0x81/0x210 [btrfs] commit_cowonly_roots+0xfb/0x300 [btrfs] btrfs_commit_transaction+0x367/0xc40 [btrfs] close_ctree+0x113/0x2fa [btrfs] generic_shutdown_super+0x6c/0x100 kill_anon_super+0x14/0x30 btrfs_kill_super+0x12/0x20 [btrfs] deactivate_locked_super+0x31/0x70 cleanup_mnt+0x100/0x160 task_work_run+0x68/0xb0 exit_to_user_mode_prepare+0x1bb/0x1c0 syscall_exit_to_user_mode+0x4b/0x260 entry_SYSCALL_64_after_hwframe+0x44/0xa9 kmem_cache_destroy btrfs_delayed_tree_ref: Slab cache still has objects CPU: 5 PID: 1729921 Comm: rmmod Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Call Trace: dump_stack+0x8d/0xb5 kmem_cache_destroy+0x119/0x120 btrfs_delayed_ref_exit+0x1d/0x35 [btrfs] exit_btrfs_fs+0xa/0x59 [btrfs] __x64_sys_delete_module+0x194/0x260 ? fpregs_assert_state_consistent+0x1e/0x40 ? exit_to_user_mode_prepare+0x55/0x1c0 ? trace_hardirqs_on+0x1b/0xf0 do_syscall_64+0x33/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f693e305897 Code: 73 01 c3 48 8b 0d f9 f5 (...) RSP: 002b:00007ffcf73eb508 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0 RAX: ffffffffffffffda RBX: 0000559df504f760 RCX: 00007f693e305897 RDX: 000000000000000a RSI: 0000000000000800 RDI: 0000559df504f7c8 RBP: 00007ffcf73eb568 R08: 0000000000000000 R09: 0000000000000000 R10: 00007f693e378ac0 R11: 0000000000000206 R12: 00007ffcf73eb740 R13: 00007ffcf73ec5a6 R14: 0000559df504f2a0 R15: 0000559df504f760 ============================================================================= BUG btrfs_delayed_extent_op (Tainted: G B W ): Objects remaining in btrfs_delayed_extent_op on __kmem_cache_shutdown() -----------------------------------------------------------------------------
INFO: Slab 0x00000000f145ce2f objects=22 used=1 fp=0x00000000af0f92cf flags=0x17fffc000010200
CPU: 5 PID: 1729921 Comm: rmmod Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Call Trace: dump_stack+0x8d/0xb5 slab_err+0xb7/0xdc ? lock_acquired+0x199/0x490 __kmem_cache_shutdown+0x1ac/0x3c0 ? __mutex_unlock_slowpath+0x45/0x2a0 kmem_cache_destroy+0x55/0x120 exit_btrfs_fs+0xa/0x59 [btrfs] __x64_sys_delete_module+0x194/0x260 ? fpregs_assert_state_consistent+0x1e/0x40 ? exit_to_user_mode_prepare+0x55/0x1c0 ? trace_hardirqs_on+0x1b/0xf0 do_syscall_64+0x33/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f693e305897 Code: 73 01 c3 48 8b 0d f9 f5 (...) RSP: 002b:00007ffcf73eb508 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0 RAX: ffffffffffffffda RBX: 0000559df504f760 RCX: 00007f693e305897 RDX: 000000000000000a RSI: 0000000000000800 RDI: 0000559df504f7c8 RBP: 00007ffcf73eb568 R08: 0000000000000000 R09: 0000000000000000 R10: 00007f693e378ac0 R11: 0000000000000206 R12: 00007ffcf73eb740 R13: 00007ffcf73ec5a6 R14: 0000559df504f2a0 R15: 0000559df504f760 INFO: Object 0x000000004cf95ea8 @offset=6264 INFO: Allocated in btrfs_alloc_tree_block+0x1e0/0x360 [btrfs] age=1931 cpu=6 pid=1729873 __slab_alloc.isra.0+0x109/0x1c0 kmem_cache_alloc+0x7bb/0x830 btrfs_alloc_tree_block+0x1e0/0x360 [btrfs] alloc_tree_block_no_bg_flush+0x4f/0x60 [btrfs] __btrfs_cow_block+0x12d/0x5f0 [btrfs] btrfs_cow_block+0xf7/0x220 [btrfs] btrfs_search_slot+0x62a/0xc40 [btrfs] btrfs_del_orphan_item+0x65/0xd0 [btrfs] btrfs_find_orphan_roots+0x1bf/0x200 [btrfs] open_ctree+0x125a/0x18a0 [btrfs] btrfs_mount_root.cold+0x13/0xed [btrfs] legacy_get_tree+0x30/0x60 vfs_get_tree+0x28/0xe0 fc_mount+0xe/0x40 vfs_kern_mount.part.0+0x71/0x90 btrfs_mount+0x13b/0x3e0 [btrfs] INFO: Freed in __btrfs_run_delayed_refs+0xabd/0x1290 [btrfs] age=3173 cpu=6 pid=1729803 kmem_cache_free+0x34c/0x3c0 __btrfs_run_delayed_refs+0xabd/0x1290 [btrfs] btrfs_run_delayed_refs+0x81/0x210 [btrfs] commit_cowonly_roots+0xfb/0x300 [btrfs] btrfs_commit_transaction+0x367/0xc40 [btrfs] close_ctree+0x113/0x2fa [btrfs] generic_shutdown_super+0x6c/0x100 kill_anon_super+0x14/0x30 btrfs_kill_super+0x12/0x20 [btrfs] deactivate_locked_super+0x31/0x70 cleanup_mnt+0x100/0x160 task_work_run+0x68/0xb0 exit_to_user_mode_prepare+0x1bb/0x1c0 syscall_exit_to_user_mode+0x4b/0x260 entry_SYSCALL_64_after_hwframe+0x44/0xa9 kmem_cache_destroy btrfs_delayed_extent_op: Slab cache still has objects CPU: 3 PID: 1729921 Comm: rmmod Tainted: G B W 5.10.0-rc4-btrfs-next-73 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Call Trace: dump_stack+0x8d/0xb5 kmem_cache_destroy+0x119/0x120 exit_btrfs_fs+0xa/0x59 [btrfs] __x64_sys_delete_module+0x194/0x260 ? fpregs_assert_state_consistent+0x1e/0x40 ? exit_to_user_mode_prepare+0x55/0x1c0 ? trace_hardirqs_on+0x1b/0xf0 do_syscall_64+0x33/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f693e305897 Code: 73 01 c3 48 8b 0d f9 (...) RSP: 002b:00007ffcf73eb508 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0 RAX: ffffffffffffffda RBX: 0000559df504f760 RCX: 00007f693e305897 RDX: 000000000000000a RSI: 0000000000000800 RDI: 0000559df504f7c8 RBP: 00007ffcf73eb568 R08: 0000000000000000 R09: 0000000000000000 R10: 00007f693e378ac0 R11: 0000000000000206 R12: 00007ffcf73eb740 R13: 00007ffcf73ec5a6 R14: 0000559df504f2a0 R15: 0000559df504f760 BTRFS: state leak: start 30408704 end 30425087 state 1 in tree 1 refs 1
Fix this issue by having the remount path stop the qgroup rescan worker when we are remounting RO and teach the rescan worker to stop when a remount is in progress. If later a remount in RW mode happens, we are already resuming the qgroup rescan worker through the call to btrfs_qgroup_rescan_resume(), so we do not need to worry about that.
--- fs/btrfs/qgroup.c | 13 ++++++++++--- fs/btrfs/super.c | 8 ++++++++ 2 files changed, 18 insertions(+), 3 deletions(-)
fs/btrfs/qgroup.c +10 -3
@@ -3224,6 +3224,12 @@ out:return ret; } +static bool rescan_should_stop (struct btrfs_fs_info *fs_info) +{ +return btrfs_fs_closing (fs_info) || +test_bit (BTRFS_FS_STATE_REMOUNTING , &fs_info->fs_state); +} +static void btrfs_qgroup_rescan_worker (struct btrfs_work *work) { struct btrfs_fs_info *fs_info = container_of(work, struct btrfs_fs_info,
@@ -3232,6 +3238,7 @@ static void btrfs_qgroup_rescan_worker(struct btrfs_work *work)struct btrfs_trans_handle *trans =NULL ;int err = -ENOMEM ;int ret =0 ; +bool stopped = false; path =btrfs_alloc_path ();if (!path)
@@ -3244,7 +3251,7 @@ static void btrfs_qgroup_rescan_worker(struct btrfs_work *work) path->skip_locking =1 ; err =0 ; -while (!err && !btrfs_fs_closing (fs_info)) { +while (!err && !(stopped =rescan_should_stop (fs_info))) { trans =btrfs_start_transaction (fs_info->fs_root,0 );if (IS_ERR (trans)) { err =PTR_ERR (trans);
@@ -3287,7 +3294,7 @@ out: }mutex_lock (&fs_info->qgroup_rescan_lock); -if (!btrfs_fs_closing (fs_info)) +if (!stopped) fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN ;if (trans) { ret =update_qgroup_status_item (trans);
@@ -3306,7 +3313,7 @@ out:btrfs_end_transaction (trans); -if (btrfs_fs_closing (fs_info)) { +if (stopped) {btrfs_info (fs_info,"qgroup scan paused" ); }else if (err >=0 ) { btrfs_info(fs_info, "qgroup scan completed%s",
fs/btrfs/super.c +8 -0
@@ -1895,6 +1895,14 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)btrfs_scrub_cancel (fs_info);btrfs_pause_balance (fs_info); +/* +* Pause the qgroup rescan worker if it is running. We don't want +* it to be still running after we are in RO mode, as after that, +* by the time we unmount, it might have left a transaction open, +* so we would leak the transaction and/or crash. +*/ +btrfs_qgroup_wait_for_completion (fs_info, false); + ret =btrfs_commit_super (fs_info);if (ret) goto restore;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 66/152 regulator: bd718x7: Add enable times
In reply to Greg Kroah-HartmanFrom: Guido Günther <[email protected]>
[ Upstream commit 3b66e4a8e58a85af3212c7117d7a29c9ef6679a2 ]
Use the typical startup times from the data sheet so boards get a reasonable default. Not setting any enable time can lead to board hangs when e.g. clocks are enabled too soon afterwards.
This fixes gpu power domain resume on the Librem 5.
[Moved #defines into driver, seems to be general agreement and avoids any cross tree issues -- broonie]
--- drivers/regulator/bd718x7-regulator.c | 57 +++++++++++++++++++++++++++ 1 file changed, 57 insertions(+)
drivers/regulator/bd718x7-regulator.c +57 -0
@@ -15,6 +15,36 @@#include <linux/regulator/of_regulator.h> #include <linux/slab.h> +/* Typical regulator startup times as per data sheet in uS */ +#define BD71847_BUCK1_STARTUP_TIME 144 +#define BD71847_BUCK2_STARTUP_TIME 162 +#define BD71847_BUCK3_STARTUP_TIME 162 +#define BD71847_BUCK4_STARTUP_TIME 240 +#define BD71847_BUCK5_STARTUP_TIME 270 +#define BD71847_BUCK6_STARTUP_TIME 200 +#define BD71847_LDO1_STARTUP_TIME 440 +#define BD71847_LDO2_STARTUP_TIME 370 +#define BD71847_LDO3_STARTUP_TIME 310 +#define BD71847_LDO4_STARTUP_TIME 400 +#define BD71847_LDO5_STARTUP_TIME 530 +#define BD71847_LDO6_STARTUP_TIME 400 + +#define BD71837_BUCK1_STARTUP_TIME 160 +#define BD71837_BUCK2_STARTUP_TIME 180 +#define BD71837_BUCK3_STARTUP_TIME 180 +#define BD71837_BUCK4_STARTUP_TIME 180 +#define BD71837_BUCK5_STARTUP_TIME 160 +#define BD71837_BUCK6_STARTUP_TIME 240 +#define BD71837_BUCK7_STARTUP_TIME 220 +#define BD71837_BUCK8_STARTUP_TIME 200 +#define BD71837_LDO1_STARTUP_TIME 440 +#define BD71837_LDO2_STARTUP_TIME 370 +#define BD71837_LDO3_STARTUP_TIME 310 +#define BD71837_LDO4_STARTUP_TIME 400 +#define BD71837_LDO5_STARTUP_TIME 310 +#define BD71837_LDO6_STARTUP_TIME 400 +#define BD71837_LDO7_STARTUP_TIME 530 +/* * BD718(37/47/50) have two "enable control modes". ON/OFF can either be * controlled by software - or by PMIC internal HW state machine. Whether
@@ -613,6 +643,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .vsel_mask = DVS_BUCK_RUN_MASK, .enable_reg = BD718XX_REG_BUCK1_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71847_BUCK1_STARTUP_TIME, .owner = THIS_MODULE, .of_parse_cb = buck_set_hw_dvs_levels, },
@@ -646,6 +677,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .vsel_mask = DVS_BUCK_RUN_MASK, .enable_reg = BD718XX_REG_BUCK2_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71847_BUCK2_STARTUP_TIME, .owner = THIS_MODULE, .of_parse_cb = buck_set_hw_dvs_levels, },
@@ -680,6 +712,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .linear_range_selectors = bd71847_buck3_volt_range_sel, .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71847_BUCK3_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -706,6 +739,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .vsel_range_mask = BD71847_BUCK4_RANGE_MASK, .linear_range_selectors = bd71847_buck4_volt_range_sel, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71847_BUCK4_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -727,6 +761,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK, .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71847_BUCK5_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -750,6 +785,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK, .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71847_BUCK6_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -775,6 +811,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .linear_range_selectors = bd718xx_ldo1_volt_range_sel, .enable_reg = BD718XX_REG_LDO1_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71847_LDO1_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -796,6 +833,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .n_voltages = ARRAY_SIZE(ldo_2_volts), .enable_reg = BD718XX_REG_LDO2_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71847_LDO2_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -818,6 +856,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .vsel_mask = BD718XX_LDO3_MASK, .enable_reg = BD718XX_REG_LDO3_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71847_LDO3_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -840,6 +879,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .vsel_mask = BD718XX_LDO4_MASK, .enable_reg = BD718XX_REG_LDO4_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71847_LDO4_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -865,6 +905,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .linear_range_selectors = bd71847_ldo5_volt_range_sel, .enable_reg = BD718XX_REG_LDO5_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71847_LDO5_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -889,6 +930,7 @@ static struct bd718xx_regulator_data bd71847_regulators[] = { .vsel_mask = BD718XX_LDO6_MASK, .enable_reg = BD718XX_REG_LDO6_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71847_LDO6_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -942,6 +984,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = DVS_BUCK_RUN_MASK, .enable_reg = BD718XX_REG_BUCK1_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71837_BUCK1_STARTUP_TIME, .owner = THIS_MODULE, .of_parse_cb = buck_set_hw_dvs_levels, },
@@ -975,6 +1018,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = DVS_BUCK_RUN_MASK, .enable_reg = BD718XX_REG_BUCK2_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71837_BUCK2_STARTUP_TIME, .owner = THIS_MODULE, .of_parse_cb = buck_set_hw_dvs_levels, },
@@ -1005,6 +1049,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = DVS_BUCK_RUN_MASK, .enable_reg = BD71837_REG_BUCK3_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71837_BUCK3_STARTUP_TIME, .owner = THIS_MODULE, .of_parse_cb = buck_set_hw_dvs_levels, },
@@ -1033,6 +1078,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = DVS_BUCK_RUN_MASK, .enable_reg = BD71837_REG_BUCK4_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71837_BUCK4_STARTUP_TIME, .owner = THIS_MODULE, .of_parse_cb = buck_set_hw_dvs_levels, },
@@ -1065,6 +1111,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .linear_range_selectors = bd71837_buck5_volt_range_sel, .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71837_BUCK5_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1088,6 +1135,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = BD71837_BUCK6_MASK, .enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71837_BUCK6_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1109,6 +1157,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK, .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71837_BUCK7_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1132,6 +1181,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK, .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL, .enable_mask = BD718XX_BUCK_EN, + .enable_time = BD71837_BUCK8_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1157,6 +1207,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .linear_range_selectors = bd718xx_ldo1_volt_range_sel, .enable_reg = BD718XX_REG_LDO1_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71837_LDO1_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1178,6 +1229,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .n_voltages = ARRAY_SIZE(ldo_2_volts), .enable_reg = BD718XX_REG_LDO2_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71837_LDO2_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1200,6 +1252,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = BD718XX_LDO3_MASK, .enable_reg = BD718XX_REG_LDO3_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71837_LDO3_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1222,6 +1275,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = BD718XX_LDO4_MASK, .enable_reg = BD718XX_REG_LDO4_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71837_LDO4_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1246,6 +1300,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = BD71837_LDO5_MASK, .enable_reg = BD718XX_REG_LDO5_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71837_LDO5_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1272,6 +1327,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = BD718XX_LDO6_MASK, .enable_reg = BD718XX_REG_LDO6_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71837_LDO6_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
@@ -1296,6 +1352,7 @@ static struct bd718xx_regulator_data bd71837_regulators[] = { .vsel_mask = BD71837_LDO7_MASK, .enable_reg = BD71837_REG_LDO7_VOLT, .enable_mask = BD718XX_LDO_EN, + .enable_time = BD71837_LDO7_STARTUP_TIME, .owner = THIS_MODULE, }, .init = {
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 67/152 ethernet: ucc_geth: fix definition and size of ucc_geth_tx_global_pram
In reply to Greg Kroah-HartmanFrom: Rasmus Villemoes <[email protected]>
[ Upstream commit 887078de2a23689e29d6fa1b75d7cbc544c280be ]
Table 8-53 in the QUICC Engine Reference manual shows definitions of fields up to a size of 192 bytes, not just 128. But in table 8-111, one does find the text
Base Address of the Global Transmitter Parameter RAM Page. [...] The user needs to allocate 128 bytes for this page. The address must be aligned to the page size.
I've checked both rev. 7 (11/2015) and rev. 9 (05/2018) of the manual; they both have this inconsistency (and the table numbers are the same).
Adding a bit of debug printing, on my board the struct ucc_geth_tx_global_pram is allocated at offset 0x880, while the (opaque) ucc_geth_thread_data_tx gets allocated immediately afterwards, at 0x900. So whatever the engine writes into the thread data overlaps with the tail of the global tx pram (and devmem says that something does get written during a simple ping).
I haven't observed any failure that could be attributed to this, but it seems to be the kind of thing that would be extremely hard to debug. So extend the struct definition so that we do allocate 192 bytes.
--- drivers/net/ethernet/freescale/ucc_geth.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/net/ethernet/freescale/ucc_geth.h +8 -1
@@ -575,7 +575,14 @@ struct ucc_geth_tx_global_pram {u32 vtagtable[0x8 ];/* 8 4-byte VLAN tags */ u32 tqptr;/* a base pointer to the Tx Queues Memory Region */ -u8 res2[0x80 -0x74 ]; +u8 res2[0x78 -0x74 ]; +u64 snums_en; +u32 l2l3baseptr;/* top byte consists of a few other bit fields */ + +u16 mtu[8 ]; +u8 res3[0xa8 -0x94 ]; +u32 wrrtablebase;/* top byte is reserved */ +u8 res4[0xc0 -0xac ]; } __packed;/* structure representing Extended Filtering Global Parameters in PRAM */
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 68/152 ARM: dts: ux500/golden: Set display max brightness
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit 7887cc89d5851cbdec49219e9614beec776af150 ]
A too high brightness by default (default is max) makes the screen go blank. Set this to 15 as in the Vendor tree.
--- arch/arm/boot/dts/ste-ux500-samsung-golden.dts | 1 + 1 file changed, 1 insertion(+)
arch/arm/boot/dts/ste-ux500-samsung-golden.dts +1 -0
@@ -326,6 +326,7 @@ panel@0 { compatible = "samsung,s6e63m0"; reg = <0>; + max-brightness = <15>; vdd3-supply = <&panel_reg_3v0>; vci-supply = <&panel_reg_1v8>; reset-gpios = <&gpio4 11 GPIO_ACTIVE_LOW>;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 69/152 habanalabs: adjust pci controller init to new firmware
In reply to Greg Kroah-HartmanFrom: Oded Gabbay <[email protected]>
[ Upstream commit 377182a3cc5ae6cc17fb04d06864c975f9f71c18 ]
When the firmware security is enabled, the pcie_aux_dbi_reg_addr register in the PCI controller is blocked. Therefore, ignore the result of writing to this register and assume it worked. Also remove the prints on errors in the internal ELBI write function.
If the security is enabled, the firmware is responsible for setting this register correctly so we won't have any problem.
If the security is disabled, the write will work (unless something is totally broken at the PCI level and then the whole sequence will fail).
In addition, remove a write to register pcie_aux_dbi_reg_addr+4, which was never actually needed.
Moreover, PCIE_DBI registers are blocked to access from host when firmware security is enabled. Use a different register to flush the writes.
--- drivers/misc/habanalabs/common/pci.c | 28 +++++++++++-------- drivers/misc/habanalabs/gaudi/gaudi.c | 4 +-- .../misc/habanalabs/gaudi/gaudi_coresight.c | 3 +- 3 files changed, 21 insertions(+), 14 deletions(-)
drivers/misc/habanalabs/common/pci.c +17 -11
@@ -130,10 +130,8 @@ static int hl_pci_elbi_write(struct hl_device *hdev, u64 addr, u32 data)if ((val &PCI_CONFIG_ELBI_STS_MASK ) ==PCI_CONFIG_ELBI_STS_DONE )return 0 ; -if (val &PCI_CONFIG_ELBI_STS_ERR ) { -dev_err (hdev->dev,"Error writing to ELBI\n" ); +if (val &PCI_CONFIG_ELBI_STS_ERR )return -EIO ; - }if (!(val &PCI_CONFIG_ELBI_STS_MASK )) {dev_err (hdev->dev,"ELBI write didn't finish in time\n" );
@@ -160,8 +158,12 @@ int hl_pci_iatu_write(struct hl_device *hdev, u32 addr, u32 data) dbi_offset = addr &0xFFF ; - rc =hl_pci_elbi_write (hdev, prop->pcie_aux_dbi_reg_addr,0x00300000 ); - rc |=hl_pci_elbi_write (hdev, prop->pcie_dbi_base_address + dbi_offset, +/* Ignore result of writing to pcie_aux_dbi_reg_addr as it could fail +* in case the firmware security is enabled +*/ +hl_pci_elbi_write (hdev, prop->pcie_aux_dbi_reg_addr,0x00300000 ); + + rc =hl_pci_elbi_write (hdev, prop->pcie_dbi_base_address + dbi_offset, data);if (rc)
@@ -244,9 +246,11 @@ int hl_pci_set_inbound_region(struct hl_device *hdev, u8 region, rc |=hl_pci_iatu_write (hdev, offset +0x4 , ctrl_reg_val); -/* Return the DBI window to the default location */ - rc |=hl_pci_elbi_write (hdev, prop->pcie_aux_dbi_reg_addr,0 ); - rc |=hl_pci_elbi_write (hdev, prop->pcie_aux_dbi_reg_addr +4 ,0 ); +/* Return the DBI window to the default location +* Ignore result of writing to pcie_aux_dbi_reg_addr as it could fail +* in case the firmware security is enabled +*/ +hl_pci_elbi_write (hdev, prop->pcie_aux_dbi_reg_addr,0 );if (rc) dev_err(hdev->dev, "failed to map bar %u to 0x%08llx\n",
@@ -294,9 +298,11 @@ int hl_pci_set_outbound_region(struct hl_device *hdev,/* Enable */ rc |=hl_pci_iatu_write (hdev,0x004 ,0x80000000 ); -/* Return the DBI window to the default location */ - rc |=hl_pci_elbi_write (hdev, prop->pcie_aux_dbi_reg_addr,0 ); - rc |=hl_pci_elbi_write (hdev, prop->pcie_aux_dbi_reg_addr +4 ,0 ); +/* Return the DBI window to the default location +* Ignore result of writing to pcie_aux_dbi_reg_addr as it could fail +* in case the firmware security is enabled +*/ +hl_pci_elbi_write (hdev, prop->pcie_aux_dbi_reg_addr,0 );return rc; }
drivers/misc/habanalabs/gaudi/gaudi.c +2 -2
@@ -2893,7 +2893,7 @@ static int gaudi_init_cpu_queues(struct hl_device *hdev, u32 cpu_timeout)static void gaudi_pre_hw_init (struct hl_device *hdev) {/* Perform read from the device to make sure device is up */ -RREG32 (mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG); +RREG32 (mmHW_STATE);/* Set the access through PCI bars (Linux driver only) as * secured
@@ -2996,7 +2996,7 @@ static int gaudi_hw_init(struct hl_device *hdev) }/* Perform read from the device to flush all configuration */ -RREG32 (mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG); +RREG32 (mmHW_STATE);return 0 ;
drivers/misc/habanalabs/gaudi/gaudi_coresight.c +2 -1
@@ -9,6 +9,7 @@#include "../include/gaudi/gaudi_coresight.h" #include "../include/gaudi/asic_reg/gaudi_regs.h" #include "../include/gaudi/gaudi_masks.h" +#include "../include/gaudi/gaudi_reg_map.h" #include <uapi/misc/habanalabs.h> #include <linux/coresight.h>
@@ -876,7 +877,7 @@ int gaudi_debug_coresight(struct hl_device *hdev, void *data) }/* Perform read from the device to flush all configuration */ -RREG32 (mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG); +RREG32 (mmHW_STATE);return rc; }
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 70/152 habanalabs/gaudi: retry loading TPC f/w on -EINTR
In reply to Greg Kroah-HartmanFrom: Oded Gabbay <[email protected]>
[ Upstream commit 98e8781f008372057bd5cb059ca6b507371e473d ]
If loading the firmware file for the TPC f/w was interrupted, try to do it again, up to 5 times.
--- drivers/misc/habanalabs/gaudi/gaudi.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/misc/habanalabs/gaudi/gaudi.c +8 -2
@@ -754,11 +754,17 @@ static int gaudi_init_tpc_mem(struct hl_device *hdev)size_t fw_size;void *cpu_addr;dma_addr_t dma_handle; -int rc; +int rc, count =5 ; +again: rc =request_firmware (&fw,GAUDI_TPC_FW_FILE , hdev->dev); +if (rc == -EINTR && count-- >0 ) { +msleep (50 ); + goto again; + } +if (rc) { -dev_err (hdev->dev,"Firmware file %s is not found!\n" , +dev_err (hdev->dev,"Failed to load firmware file %s\n" ,GAUDI_TPC_FW_FILE ); goto out; }
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 71/152 habanalabs: register to pci shutdown callback
In reply to Greg Kroah-HartmanFrom: Oded Gabbay <[email protected]>
[ Upstream commit fcaebc7354188b0d708c79df4390fbabd4d9799d ]
We need to make sure our device is idle when rebooting a virtual machine. This is done in the driver level.
The firmware will later handle FLR but we want to be extra safe and stop the devices until the FLR is handled.
--- drivers/misc/habanalabs/common/habanalabs_drv.c | 1 + 1 file changed, 1 insertion(+)
drivers/misc/habanalabs/common/habanalabs_drv.c +1 -0
@@ -528,6 +528,7 @@ static struct pci_driver hl_pci_driver = { .id_table = ids, .probe = hl_pci_probe, .remove = hl_pci_remove, + .shutdown = hl_pci_remove, .driver.pm = &hl_pm_ops, .err_handler = &hl_pci_err_handler, };
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 72/152 staging: spmi: hisi-spmi-controller: Fix some error handling paths
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 12b38ea040b3bb2a30eb9cd488376df5be7ea81f ]
IN the probe function, if an error occurs after calling 'spmi_controller_alloc()', it must be undone by a corresponding 'spmi_controller_put() call.
In the remove function, use 'spmi_controller_put(ctrl)' instead of 'kfree(ctrl)'.
While a it fix an error message
(s/spmi_add_controller/spmi_controller_add/)
--- .../staging/hikey9xx/hisi-spmi-controller.c | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
drivers/staging/hikey9xx/hisi-spmi-controller.c +15 -6
@@ -278,21 +278,24 @@ static int spmi_controller_probe(struct platform_device *pdev) iores =platform_get_resource (pdev,IORESOURCE_MEM ,0 );if (!iores) {dev_err (&pdev->dev,"can not get resource!\n" ); -return -EINVAL ; + ret = -EINVAL ; + goto err_put_controller; } spmi_controller->base =devm_ioremap (&pdev->dev, iores->start,resource_size (iores));if (!spmi_controller->base) {dev_err (&pdev->dev,"can not remap base addr!\n" ); -return -EADDRNOTAVAIL ; + ret = -EADDRNOTAVAIL ; + goto err_put_controller; } ret =of_property_read_u32 (pdev->dev.of_node,"spmi-channel" , &spmi_controller->channel);if (ret) {dev_err (&pdev->dev,"can not get channel\n" ); -return -ENODEV ; + ret = -ENODEV ; + goto err_put_controller; }platform_set_drvdata (pdev, spmi_controller);
@@ -309,9 +312,15 @@ static int spmi_controller_probe(struct platform_device *pdev) ctrl->write_cmd = spmi_write_cmd; ret =spmi_controller_add (ctrl); -if (ret) -dev_err (&pdev->dev,"spmi_add_controller failed with error %d!\n" , ret); +if (ret) { +dev_err (&pdev->dev,"spmi_controller_add failed with error %d!\n" , ret); + goto err_put_controller; + } + +return 0 ; +err_put_controller: +spmi_controller_put (ctrl);return ret; }
@@ -320,7 +329,7 @@ static int spmi_del_controller(struct platform_device *pdev)struct spmi_controller *ctrl =platform_get_drvdata (pdev);spmi_controller_remove (ctrl); -kfree (ctrl); +spmi_controller_put (ctrl);return 0 ; }
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 73/152 spi: altera: fix return value for altera_spi_txrx()
In reply to Greg Kroah-HartmanFrom: Xu Yilun <[email protected]>
[ Upstream commit ede090f5a438e97d0586f64067bbb956e30a2a31 ]
This patch fixes the return value for altera_spi_txrx. It should return 1 for interrupt transfer mode, and return 0 for polling transfer mode.
The altera_spi_txrx() implements the spi_controller.transfer_one callback. According to the spi-summary.rst, the transfer_one should return 0 when transfer is finished, return 1 when transfer is still in progress.
--- drivers/spi/spi-altera.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)
drivers/spi/spi-altera.c +14 -12
@@ -189,24 +189,26 @@ static int altera_spi_txrx(struct spi_master *master,/* send the first byte */ altera_spi_tx_word (hw); - }else { -while (hw->count < hw->len) { -altera_spi_tx_word (hw); -for (;;) { -altr_spi_readl (hw,ALTERA_SPI_STATUS , &val); -if (val &ALTERA_SPI_STATUS_RRDY_MSK ) -break ; +return 1 ; + } + +while (hw->count < hw->len) { +altera_spi_tx_word (hw); -cpu_relax (); - } +for (;;) { +altr_spi_readl (hw,ALTERA_SPI_STATUS , &val); +if (val &ALTERA_SPI_STATUS_RRDY_MSK ) +break ; -altera_spi_rx_word (hw); +cpu_relax (); } -spi_finalize_current_transfer (master); + +altera_spi_rx_word (hw); } +spi_finalize_current_transfer (master); -return t->len; +return 0 ; }static irqreturn_t altera_spi_irq (int irq,void *dev)
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 74/152 habanalabs: Fix memleak in hl_device_reset
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit b000700d6db50c933ce8b661154e26cf4ad06dba ]
When kzalloc() fails, we should execute hl_mmu_fini() to release the MMU module. It's the same when hl_ctx_init() fails.
--- drivers/misc/habanalabs/common/device.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/misc/habanalabs/common/device.c +2 -0
@@ -1027,6 +1027,7 @@ again: GFP_KERNEL);if (!hdev->kernel_ctx) { rc = -ENOMEM ; +hl_mmu_fini (hdev); goto out_err; }
@@ -1038,6 +1039,7 @@ again: "failed to init kernel ctx in hard reset\n");kfree (hdev->kernel_ctx); hdev->kernel_ctx =NULL ; +hl_mmu_fini (hdev); goto out_err; } }
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 75/152 hwmon: (pwm-fan) Ensure that calculation doesnt discard big period values
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 1eda52334e6d13eb1a85f713ce06dd39342b5020 ]
With MAX_PWM being defined to 255 the code
unsigned long period; ... period = ctx->pwm->args.period; state.duty_cycle = DIV_ROUND_UP(pwm * (period - 1), MAX_PWM);
calculates a too small value for duty_cycle if the configured period is big (either by discarding the 64 bit value ctx->pwm->args.period or by overflowing the multiplication). As this results in a too slow fan and so maybe an overheating machine better be safe than sorry and error out in .probe.
--- drivers/hwmon/pwm-fan.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/hwmon/pwm-fan.c +11 -1
@@ -324,8 +324,18 @@ static int pwm_fan_probe(struct platform_device *pdev) ctx->pwm_value =MAX_PWM ; -/* Set duty cycle to maximum allowed and enable PWM output */ pwm_init_state (ctx->pwm, &state); +/* +* __set_pwm assumes that MAX_PWM * (period - 1) fits into an unsigned +* long. Check this here to prevent the fan running at a too low +* frequency. +*/ +if (state.period >ULONG_MAX /MAX_PWM +1 ) { +dev_err (dev,"Configured period too big\n" ); +return -EINVAL ; + } + +/* Set duty cycle to maximum allowed and enable PWM output */ state.duty_cycle = ctx->pwm->args.period -1 ; state.enabled = true;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 76/152 lib/raid6: Let $(UNROLL) rules work with macOS userland
In reply to Greg Kroah-HartmanFrom: John Millikin <[email protected]>
[ Upstream commit 0c36d88cff4d72149f94809303c5180b6f716d39 ]
Older versions of BSD awk are fussy about the order of '-v' and '-f' flags, and require a space after the flag name. This causes build failures on platforms with an old awk, such as macOS and NetBSD.
Since GNU awk and modern versions of BSD awk (distributed with FreeBSD/OpenBSD) are fine with either form, the definition of 'cmd_unroll' can be trivially tweaked to let the lib/raid6 Makefile work with both old and new awk flag dialects.
--- lib/raid6/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
lib/raid6/Makefile +1 -1
@@ -48,7 +48,7 @@ endif endif quiet_cmd_unroll = UNROLL $@ - cmd_unroll = $(AWK) -f$(srctree)/$(src)/unroll.awk -vN=$* < $< > $@ + cmd_unroll = $(AWK) -v N=$* -f $(srctree)/$(src)/unroll.awk < $< > $@ targets += int1.c int2.c int4.c int8.c int16.c int32.c $(obj)/int%.c: $(src)/int.uc $(src)/unroll.awk FORCE
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 77/152 kconfig: remove kvmconfig and xenconfig shorthands
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 9bba03d4473df0b707224d4d2067b62d1e1e2a77 ]
Linux 5.10 is out. Remove the 'kvmconfig' and 'xenconfig' shorthands as previously announced.
--- scripts/kconfig/Makefile | 10 ---------- 1 file changed, 10 deletions(-)
scripts/kconfig/Makefile +0 -10
@@ -94,16 +94,6 @@ configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/c $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles) $(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig -PHONY += kvmconfig -kvmconfig: kvm_guest.config - @echo >&2 "WARNING: 'make $@' will be removed after Linux 5.10" - @echo >&2 " Please use 'make $<' instead." - -PHONY += xenconfig -xenconfig: xen.config - @echo >&2 "WARNING: 'make $@' will be removed after Linux 5.10" - @echo >&2 " Please use 'make $<' instead." - PHONY += tinyconfig tinyconfig: $(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config
Signature · 1 line
2.27.0
Re: [PATCH 5.10 077/152] kconfig: remove kvmconfig and xenconfig shorthands
Hi!
Quoted 6 lines
From: Masahiro Yamada <[email protected]>
[ Upstream commit
9bba03d4473df0b707224d4d2067b62d1e1e2a77]Linux 5.10 is out. Remove the 'kvmconfig' and 'xenconfig' shorthands as previously announced.
I don't believe this is suitable for stable.
Best regards,
Pavel
Quoted 18 lines
+++ b/scripts/kconfig/Makefile
scripts/kconfig/Makefile +0
-10@@ -94,16 +94,6 @@ configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/c $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles) $(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig -PHONY += kvmconfig -kvmconfig: kvm_guest.config - @echo >&2 "WARNING: 'make $@' will be removed after Linux 5.10" - @echo >&2 " Please use 'make $<' instead." - -PHONY += xenconfig -xenconfig: xen.config - @echo >&2 "WARNING: 'make $@' will be removed after Linux 5.10" - @echo >&2 " Please use 'make $<' instead." - PHONY += tinyconfig tinyconfig: $(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config
Signature · 1 line
http://www.livejournal.com/~pavelmachek
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 077/152] kconfig: remove kvmconfig and xenconfig shorthands
Quoted 10 lines · Pavel Machek
Hi!
Quoted 6 lines
From: Masahiro Yamada <[email protected]>
[ Upstream commit
9bba03d4473df0b707224d4d2067b62d1e1e2a77]Linux 5.10 is out. Remove the 'kvmconfig' and 'xenconfig' shorthands as previously announced.
I don't believe this is suitable for stable.
Yeah, this doesn't look right, I'll go revert it for the next release, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 78/152 spi: fix the divide by 0 error when calculating xfer waiting time
In reply to Greg Kroah-HartmanFrom: Xu Yilun <[email protected]>
[ Upstream commit 6170d077bf92c5b3dfbe1021688d3c0404f7c9e9 ]
The xfer waiting time is the result of xfer->len / xfer->speed_hz. This patch makes the assumption of 100khz xfer speed if the xfer->speed_hz is not assigned and stays 0. This avoids the divide by 0 issue and ensures a reasonable tolerant waiting time.
--- drivers/spi/spi.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/spi/spi.c +5 -1
@@ -1100,6 +1100,7 @@ static int spi_transfer_wait(struct spi_controller *ctlr, {struct spi_statistics *statm = &ctlr->statistics;struct spi_statistics *stats = &msg->spi->statistics; +u32 speed_hz = xfer->speed_hz;unsigned long long ms;if (spi_controller_is_slave (ctlr)) {
@@ -1108,8 +1109,11 @@ static int spi_transfer_wait(struct spi_controller *ctlr,return -EINTR ; } }else { +if (!speed_hz) + speed_hz =100000 ; + ms =8LL *1000LL * xfer->len; -do_div (ms, xfer->speed_hz); +do_div (ms, speed_hz); ms += ms +200 ;/* some tolerance */ if (ms >UINT_MAX )
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 79/152 io_uring: drop file refs after task cancel
In reply to Greg Kroah-HartmanFrom: Pavel Begunkov <[email protected]>
[ Upstream commit de7f1d9e99d8b99e4e494ad8fcd91f0c4c5c9357 ]
io_uring fds marked O_CLOEXEC and we explicitly cancel all requests before going through exec, so we don't want to leave task's file references to not our anymore io_uring instances.
--- fs/io_uring.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-)
fs/io_uring.c +16 -9
@@ -8821,6 +8821,15 @@ static void io_uring_attempt_task_drop(struct file *file)io_uring_del_task_file (file); } +static void io_uring_remove_task_files (struct io_uring_task *tctx) +{ +struct file *file; +unsigned long index; + +xa_for_each (&tctx->xa, index, file) +io_uring_del_task_file (file); +} +void __io_uring_files_cancel (struct files_struct *files) {struct io_uring_task *tctx = current->io_uring;
@@ -8829,16 +8838,12 @@ void __io_uring_files_cancel(struct files_struct *files)/* make sure overflow events are dropped */ atomic_inc (&tctx->in_idle); - -xa_for_each (&tctx->xa, index, file) { -struct io_ring_ctx *ctx = file->private_data; - -io_uring_cancel_task_requests (ctx, files); -if (files) -io_uring_del_task_file (file); - } - +xa_for_each (&tctx->xa, index, file) +io_uring_cancel_task_requests (file->private_data, files);atomic_dec (&tctx->in_idle); + +if (files) +io_uring_remove_task_files (tctx); }static s64 tctx_inflight (struct io_uring_task *tctx)
@@ -8901,6 +8906,8 @@ void __io_uring_task_cancel(void)finish_wait (&tctx->wait, &wait);atomic_dec (&tctx->in_idle); + +io_uring_remove_task_files (tctx); }static int io_uring_flush (struct file *file,void *data)
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 80/152 bfq: Fix computation of shallow depth
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
[ Upstream commit 6d4d273588378c65915acaf7b2ee74e9dd9c130a ]
BFQ computes number of tags it allows to be allocated for each request type based on tag bitmap. However it uses 1 << bitmap.shift as number of available tags which is wrong. 'shift' is just an internal bitmap value containing logarithm of how many bits bitmap uses in each bitmap word. Thus number of tags allowed for some request types can be far to low. Use proper bitmap.depth which has the number of tags instead.
--- block/bfq-iosched.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
block/bfq-iosched.c +4 -4
@@ -6332,13 +6332,13 @@ static unsigned int bfq_update_depths(struct bfq_data *bfqd,* limit 'something'. */ /* no more than 50% of tags for async I/O */ - bfqd->word_depths[0 ][0 ] =max ((1U << bt->sb.shift) >>1 ,1U ); + bfqd->word_depths[0 ][0 ] =max (bt->sb.depth >>1 ,1U );/* * no more than 75% of tags for sync writes (25% extra tags * w.r.t. async I/O, to prevent async I/O from starving sync * writes) */ - bfqd->word_depths[0 ][1 ] =max (((1U << bt->sb.shift) *3 ) >>2 ,1U ); + bfqd->word_depths[0 ][1 ] =max ((bt->sb.depth *3 ) >>2 ,1U );/* * In-word depths in case some bfq_queue is being weight-
@@ -6348,9 +6348,9 @@ static unsigned int bfq_update_depths(struct bfq_data *bfqd,* shortage. */ /* no more than ~18% of tags for async I/O */ - bfqd->word_depths[1 ][0 ] =max (((1U << bt->sb.shift) *3 ) >>4 ,1U ); + bfqd->word_depths[1 ][0 ] =max ((bt->sb.depth *3 ) >>4 ,1U );/* no more than ~37% of tags for sync writes (~20% extra tags) */ - bfqd->word_depths[1 ][1 ] =max (((1U << bt->sb.shift) *6 ) >>4 ,1U ); + bfqd->word_depths[1 ][1 ] =max ((bt->sb.depth *6 ) >>4 ,1U );for (i =0 ; i <2 ; i++)for (j =0 ; j <2 ; j++)
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 81/152 arch/arc: add copy_user_page() to <asm/page.h> to fix build error on ARC
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit 8a48c0a3360bf2bf4f40c980d0ec216e770e58ee ]
fs/dax.c uses copy_user_page() but ARC does not provide that interface, resulting in a build error.
Provide copy_user_page() in <asm/page.h>.
../fs/dax.c: In function 'copy_cow_page_dax':../fs/dax.c:702:2: error: implicit declaration of function 'copy_user_page'; did you mean 'copy_to_user_page'? [-Werror=implicit-function-declaration]
#Acked-by: Vineet Gupta <[email protected]> # v1
Cc: Andrew Morton <[email protected]>
Cc: Matthew Wilcox <[email protected]>
Cc: Jan Kara <[email protected]>
Cc: [email protected]
Cc: [email protected] #Reviewed-by: Ira Weiny <[email protected]> # v2
--- arch/arc/include/asm/page.h | 1 + 1 file changed, 1 insertion(+)
arch/arc/include/asm/page.h +1 -0
@@ -10,6 +10,7 @@#ifndef __ASSEMBLY__#define clear_page (paddr) memset((paddr), 0, PAGE_SIZE) +#define copy_user_page (to, from, vaddr, pg) copy_page(to, from)#define copy_page (to, from) memcpy((to), (from), PAGE_SIZE)struct vm_area_struct ;
Signature · 6 lines
2.27.0 _______________________________________________ Linux-nvdimm mailing list -- [email protected] To unsubscribe send an email to [email protected]
Greg Kroah-Hartman
maintainerPATCH 82/152 misdn: dsp: select CONFIG_BITREVERSE
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 51049bd903a81307f751babe15a1df8d197884e8 ]
Without this, we run into a link error
arm-linux-gnueabi-ld: drivers/isdn/mISDN/dsp_audio.o: in function `dsp_audio_generate_law_tables':
(.text+0x30c): undefined reference to `byte_rev_table'
arm-linux-gnueabi-ld: drivers/isdn/mISDN/dsp_audio.o:(.text+0x5e4): more undefined references to `byte_rev_table' follow
--- drivers/isdn/mISDN/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/isdn/mISDN/Kconfig +1 -0
@@ -13,6 +13,7 @@ if MISDN != n config MISDN_DSP tristate "Digital Audio Processing of transparent data" depends on MISDN + select BITREVERSE help Enable support for digital audio processing capability.
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 83/152 net: ethernet: fs_enet: Add missing MODULE_LICENSE
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit 445c6198fe7be03b7d38e66fe8d4b3187bc251d4 ]
Since commit 1d6cd3929360 ("modpost: turn missing MODULE_LICENSE() into error") the ppc32_allmodconfig build fails with:
ERROR: modpost: missing MODULE_LICENSE() in drivers/net/ethernet/freescale/fs_enet/mii-fec.o
ERROR: modpost: missing MODULE_LICENSE() in drivers/net/ethernet/freescale/fs_enet/mii-bitbang.o
Add the missing MODULE_LICENSEs to fix the build. Both files include a copyright header indicating they are GPL v2.
--- drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c | 1 + drivers/net/ethernet/freescale/fs_enet/mii-fec.c | 1 + 2 files changed, 2 insertions(+)
drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c +1 -0
@@ -223,3 +223,4 @@ static struct platform_driver fs_enet_bb_mdio_driver = { };module_platform_driver (fs_enet_bb_mdio_driver); +MODULE_LICENSE ("GPL" );
drivers/net/ethernet/freescale/fs_enet/mii-fec.c +1 -0
@@ -224,3 +224,4 @@ static struct platform_driver fs_enet_fec_mdio_driver = { };module_platform_driver (fs_enet_fec_mdio_driver); +MODULE_LICENSE ("GPL" );
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 84/152 selftests: fix the return value for UDP GRO test
In reply to Greg Kroah-HartmanFrom: Po-Hsu Lin <[email protected]>
[ Upstream commit 3503ee6c0bec5f173d606359e6384a5ef85492fb ]
The udpgro.sh will always return 0 (unless the bpf selftest was not build first) even if there are some failed sub test-cases.
Therefore the kselftest framework will report this case is OK.
Check and return the exit status of each test to make it easier to spot real failures.
--- tools/testing/selftests/net/udpgro.sh | 34 +++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
tools/testing/selftests/net/udpgro.sh +34 -0
@@ -5,6 +5,14 @@ readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)" +# set global exit status, but never reset nonzero one. +check_err() +{ + if [ $ret -eq 0 ]; then + ret=$1 + fi +} + cleanup() { local -r jobs="$(jobs -p)" local -r ns="$(ip netns list|grep $PEER_NS)"
@@ -44,7 +52,9 @@ run_one() { # Hack: let bg programs complete the startup sleep 0.1 ./udpgso_bench_tx ${tx_args} + ret=$? wait $(jobs -p) + return $ret } run_test() {
@@ -87,8 +97,10 @@ run_one_nat() { sleep 0.1 ./udpgso_bench_tx ${tx_args} + ret=$? kill -INT $pid wait $(jobs -p) + return $ret } run_one_2sock() {
@@ -110,7 +122,9 @@ run_one_2sock() { sleep 0.1 # first UDP GSO socket should be closed at this point ./udpgso_bench_tx ${tx_args} + ret=$? wait $(jobs -p) + return $ret } run_nat_test() {
@@ -131,36 +145,54 @@ run_all() { local -r core_args="-l 4" local -r ipv4_args="${core_args} -4 -D 192.168.1.1" local -r ipv6_args="${core_args} -6 -D 2001:db8::1" + ret=0 echo "ipv4" run_test "no GRO" "${ipv4_args} -M 10 -s 1400" "-4 -n 10 -l 1400" + check_err $? # explicitly check we are not receiving UDP_SEGMENT cmsg (-S -1) # when GRO does not take place run_test "no GRO chk cmsg" "${ipv4_args} -M 10 -s 1400" "-4 -n 10 -l 1400 -S -1" + check_err $? # the GSO packets are aggregated because: # * veth schedule napi after each xmit # * segmentation happens in BH context, veth napi poll is delayed after # the transmission of the last segment run_test "GRO" "${ipv4_args} -M 1 -s 14720 -S 0 " "-4 -n 1 -l 14720" + check_err $? run_test "GRO chk cmsg" "${ipv4_args} -M 1 -s 14720 -S 0 " "-4 -n 1 -l 14720 -S 1472" + check_err $? run_test "GRO with custom segment size" "${ipv4_args} -M 1 -s 14720 -S 500 " "-4 -n 1 -l 14720" + check_err $? run_test "GRO with custom segment size cmsg" "${ipv4_args} -M 1 -s 14720 -S 500 " "-4 -n 1 -l 14720 -S 500" + check_err $? run_nat_test "bad GRO lookup" "${ipv4_args} -M 1 -s 14720 -S 0" "-n 10 -l 1472" + check_err $? run_2sock_test "multiple GRO socks" "${ipv4_args} -M 1 -s 14720 -S 0 " "-4 -n 1 -l 14720 -S 1472" + check_err $? echo "ipv6" run_test "no GRO" "${ipv6_args} -M 10 -s 1400" "-n 10 -l 1400" + check_err $? run_test "no GRO chk cmsg" "${ipv6_args} -M 10 -s 1400" "-n 10 -l 1400 -S -1" + check_err $? run_test "GRO" "${ipv6_args} -M 1 -s 14520 -S 0" "-n 1 -l 14520" + check_err $? run_test "GRO chk cmsg" "${ipv6_args} -M 1 -s 14520 -S 0" "-n 1 -l 14520 -S 1452" + check_err $? run_test "GRO with custom segment size" "${ipv6_args} -M 1 -s 14520 -S 500" "-n 1 -l 14520" + check_err $? run_test "GRO with custom segment size cmsg" "${ipv6_args} -M 1 -s 14520 -S 500" "-n 1 -l 14520 -S 500" + check_err $? run_nat_test "bad GRO lookup" "${ipv6_args} -M 1 -s 14520 -S 0" "-n 10 -l 1452" + check_err $? run_2sock_test "multiple GRO socks" "${ipv6_args} -M 1 -s 14520 -S 0 " "-n 1 -l 14520 -S 1452" + check_err $? + return $ret } if [ ! -f ../bpf/xdp_dummy.o ]; then
@@ -180,3 +212,5 @@ elif [[ $1 == "__subprocess_2sock" ]]; then shift run_one_2sock $@ fi + +exit $?
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 85/152 nvme-pci: mark Samsung PM1725a as IGNORE_DEV_SUBNQN
In reply to Greg Kroah-HartmanFrom: Gopal Tiwari <[email protected]>
[ Upstream commit 7ee5c78ca3895d44e918c38332921983ed678be0 ]
A system with more than one of these SSDs will only have one usable. Hence the kernel fails to detect nvme devices due to duplicate cntlids.
[ 6.274554] nvme nvme1: Duplicate cntlid 33 with nvme0, rejecting [ 6.274566] nvme nvme1: Removing after probe failure status: -22
Adding the NVME_QUIRK_IGNORE_DEV_SUBNQN quirk to resolves the issue.
--- drivers/nvme/host/pci.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/nvme/host/pci.c +2 -1
@@ -3201,7 +3201,8 @@ static const struct pci_device_id nvme_id_table[] = { { PCI_DEVICE(0x144d, 0xa821), /* Samsung PM1725 */ .driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY, }, { PCI_DEVICE(0x144d, 0xa822), /* Samsung PM1725a */ - .driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY, }, + .driver_data = NVME_QUIRK_DELAY_BEFORE_CHK_RDY | + NVME_QUIRK_IGNORE_DEV_SUBNQN, }, { PCI_DEVICE(0x1d1d, 0x1f1f), /* LighNVM qemu device */ .driver_data = NVME_QUIRK_LIGHTNVM, }, { PCI_DEVICE(0x1d1d, 0x2807), /* CNEX WL */
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 86/152 nvme: avoid possible double fetch in handling CQE
In reply to Greg Kroah-HartmanFrom: Lalithambika Krishnakumar <[email protected]>
[ Upstream commit 62df80165d7f197c9c0652e7416164f294a96661 ]
While handling the completion queue, keep a local copy of the command id from the DMA-accessible completion entry. This silences a time-of-check to time-of-use (TOCTOU) warning from KF/x[1], with respect to a Thunderclap[2] vulnerability analysis. The double-read impact appears benign.
There may be a theoretical window for @command_id to be used as an adversary-controlled array-index-value for mounting a speculative execution attack, but that mitigation is saved for a potential follow-on. A man-in-the-middle attack on the data payload is out of scope for this analysis and is hopefully mitigated by filesystem integrity mechanisms.
[1] https://github.com/intel/kernel-fuzzer-for-xen-project
[2] http://thunderclap.io/thunderclap-paper-ndss2019.pdf
--- drivers/nvme/host/pci.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/nvme/host/pci.c +4 -3
@@ -967,6 +967,7 @@ static inline struct blk_mq_tags *nvme_queue_tagset(struct nvme_queue *nvmeq)static inline void nvme_handle_cqe (struct nvme_queue *nvmeq,u16 idx) {struct nvme_completion *cqe = &nvmeq->cqes[idx]; +__u16 command_id =READ_ONCE (cqe->command_id);struct request *req;/*
@@ -975,17 +976,17 @@ static inline void nvme_handle_cqe(struct nvme_queue *nvmeq, u16 idx)* aborts. We don't even bother to allocate a struct request * for them but rather special case them here. */ -if (unlikely (nvme_is_aen_req (nvmeq->qid, cqe->command_id))) { +if (unlikely (nvme_is_aen_req (nvmeq->qid, command_id))) {nvme_complete_async_event (&nvmeq->dev->ctrl, cqe->status, &cqe->result);return ; } - req =blk_mq_tag_to_rq (nvme_queue_tagset (nvmeq), cqe->command_id); + req =blk_mq_tag_to_rq (nvme_queue_tagset (nvmeq), command_id);if (unlikely (!req)) {dev_warn (nvmeq->dev->ctrl.device,"invalid id %d completed on queue %d\n" , - cqe->command_id,le16_to_cpu (cqe->sq_id)); + command_id,le16_to_cpu (cqe->sq_id));return ; }
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 87/152 nvmet-rdma: Fix list_del corruption on queue establishment failure
In reply to Greg Kroah-HartmanFrom: Israel Rukshin <[email protected]>
[ Upstream commit 9ceb7863537748c67fa43ac4f2f565819bbd36e4 ]
When a queue is in NVMET_RDMA_Q_CONNECTING state, it may has some requests at rsp_wait_list. In case a disconnect occurs at this state, no one will empty this list and will return the requests to free_rsps list. Normally nvmet_rdma_queue_established() free those requests after moving the queue to NVMET_RDMA_Q_LIVE state, but in this case __nvmet_rdma_queue_disconnect() is called before. The crash happens at nvmet_rdma_free_rsps() when calling list_del(&rsp->free_list), because the request exists only at the wait list. To fix the issue, simply clear rsp_wait_list when destroying the queue.
--- drivers/nvme/target/rdma.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/nvme/target/rdma.c +10 -0
@@ -1641,6 +1641,16 @@ static void __nvmet_rdma_queue_disconnect(struct nvmet_rdma_queue *queue)spin_lock_irqsave (&queue->state_lock, flags);switch (queue->state) {case NVMET_RDMA_Q_CONNECTING : +while (!list_empty (&queue->rsp_wait_list)) { +struct nvmet_rdma_rsp *rsp; + + rsp =list_first_entry (&queue->rsp_wait_list, + struct nvmet_rdma_rsp, + wait_list); +list_del (&rsp->wait_list); +nvmet_rdma_put_rsp (rsp); + } + fallthrough;case NVMET_RDMA_Q_LIVE : queue->state =NVMET_RDMA_Q_DISCONNECTING ; disconnect = true;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 88/152 drm/amd/display: fix sysfs amdgpu_current_backlight_pwm NULL pointer issue
In reply to Greg Kroah-HartmanFrom: Kevin Wang <[email protected]>
[ Upstream commit a7b5d9dd57298333e6e9f4c167f01385d922bbfb ]
fix NULL pointer issue when read sysfs amdgpu_current_backlight_pwm sysfs node.
Call Trace: [ 248.273833] BUG: kernel NULL pointer dereference, address: 0000000000000130 [ 248.273930] #PF: supervisor read access in kernel mode [ 248.273993] #PF: error_code(0x0000) - not-present page [ 248.274054] PGD 0 P4D 0 [ 248.274092] Oops: 0000 [#1] SMP PTI [ 248.274138] CPU: 2 PID: 1377 Comm: cat Tainted: G OE 5.9.0-rc5-drm-next-5.9+ #1 [ 248.274233] Hardware name: System manufacturer System Product Name/Z170-A, BIOS 3802 03/15/2018 [ 248.274641] RIP: 0010:dc_link_get_backlight_level+0x5/0x70 [amdgpu] [ 248.274718] Code: 67 ff ff ff 41 b9 03 00 00 00 e9 45 ff ff ff d1 ea e9 55 ff ff ff 0f 1f 44 00 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 <48> 8b 87 30 01 00 00 48 8b 00 48 8b 88 88 03 00 00 48 8d 81 e8 01 [ 248.274919] RSP: 0018:ffffb5ad809b3df0 EFLAGS: 00010203 [ 248.274982] RAX: ffffa0f77d1c0010 RBX: ffffa0f793ae9168 RCX: 0000000000000001 [ 248.275064] RDX: ffffa0f79753db00 RSI: 0000000000000001 RDI: 0000000000000000 [ 248.275145] RBP: ffffb5ad809b3e00 R08: ffffb5ad809b3da0 R09: 0000000000000000 [ 248.275225] R10: ffffb5ad809b3e68 R11: 0000000000000000 R12: ffffa0f793ae9190 [ 248.275306] R13: ffffb5ad809b3ef0 R14: 0000000000000001 R15: ffffa0f793ae9168 [ 248.275388] FS: 00007f5f1ec4d540(0000) GS:ffffa0f79ec80000(0000) knlGS:0000000000000000 [ 248.275480] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 248.275547] CR2: 0000000000000130 CR3: 000000042a03c005 CR4: 00000000003706e0 [ 248.275628] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 248.275708] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 248.275789] Call Trace: [ 248.276124] ? current_backlight_read+0x24/0x40 [amdgpu] [ 248.276194] seq_read+0xc3/0x3f0 [ 248.276240] full_proxy_read+0x5c/0x90 [ 248.276290] vfs_read+0xa7/0x190 [ 248.276334] ksys_read+0xa7/0xe0 [ 248.276379] __x64_sys_read+0x1a/0x20 [ 248.276429] do_syscall_64+0x37/0x80 [ 248.276477] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 248.276538] RIP: 0033:0x7f5f1e75c191 [ 248.276585] Code: fe ff ff 48 8d 3d b7 9d 0a 00 48 83 ec 08 e8 46 4d 02 00 66 0f 1f 44 00 00 48 8d 05 71 07 2e 00 8b 00 85 c0 75 13 31 c0 0f 05 <48> 3d 00 f0 ff ff 77 57 f3 c3 0f 1f 44 00 00 41 54 55 49 89 d4 53Hw [ 248.276784] RSP: 002b:00007ffcb1fc3f38 EFLAGS: 00000246 ORIG_RAX: 0000000000000000 [ 248.276872] RAX: ffffffffffffffda RBX: 0000000000020000 RCX: 00007f5f1e75c191 [ 248.276953] RDX: 0000000000020000 RSI: 00007f5f1ec2b000 RDI: 0000000000000003 [ 248.277034] RBP: 0000000000020000 R08: 00000000ffffffff R09: 0000000000000000 [ 248.277115] R10: 0000000000000022 R11: 0000000000000246 R12: 00007f5f1ec2b000 [ 248.277195] R13: 0000000000000003 R14: 00007f5f1ec2b00f R15: 0000000000020000 [ 248.277279] Modules linked in: amdgpu(OE) iommu_v2 gpu_sched ttm(OE) drm_kms_helper cec drm
i2c_algo_bit fb_sys_fops syscopyarea sysfillrect sysimgblt rpcsec_gss_krb5 auth_rpcgss nfsv4 nfs lockd grace fscache nls_iso8859_1 snd_hda_codec_realtek snd_hda_codec_hdmi snd_hda_codec_generic ledtrig_audio intel_rapl_msr intel_rapl_common snd_hda_intel snd_intel_dspcfg x86_pkg_temp_thermal intel_powerclamp snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_seq_midi snd_seq_midi_event mei_hdcp coretemp snd_rawmidi snd_seq kvm_intel kvm snd_seq_device snd_timer irqbypass joydev snd input_leds soundcore crct10dif_pclmul crc32_pclmul ghash_clmulni_intel aesni_intel crypto_simd cryptd glue_helper rapl intel_cstate mac_hid mei_me serio_raw mei eeepc_wmi wmi_bmof asus_wmi mxm_wmi intel_wmi_thunderbolt acpi_pad sparse_keymap efi_pstore sch_fq_codel parport_pc ppdev lp parport sunrpc ip_tables x_tables autofs4 hid_logitech_hidpp hid_logitech_dj hid_generic usbhid hid e1000e psmouse ahci libahci wmi video
[ 248.278211] CR2: 0000000000000130 [ 248.278221] ---[ end trace 1fbe72fe6f91091d ]--- [ 248.357226] RIP: 0010:dc_link_get_backlight_level+0x5/0x70 [amdgpu] [ 248.357272] Code: 67 ff ff ff 41 b9 03 00 00 00 e9 45 ff ff ff d1 ea e9 55 ff ff ff 0f 1f 44 00 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 <48> 8b 87 30 01 00 00 48 8b 00 48 8b 88 88 03 00 00 48 8d 81 e8 01
--- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc_link.c +6 -1
@@ -2471,9 +2471,14 @@ enum dc_status dc_link_validate_mode_timing(static struct abm *get_abm_from_stream_res (const struct dc_link *link) {int i; -struct dc *dc = link->ctx->dc; +struct dc *dc =NULL ;struct abm *abm =NULL ; +if (!link || !link->ctx) +return NULL ; + + dc = link->ctx->dc; +for (i =0 ; i <MAX_PIPES ; i++) {struct pipe_ctx pipe_ctx = dc->current_state->res_ctx.pipe_ctx[i];struct dc_stream_state *stream = pipe_ctx.stream;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 89/152 drm/amdgpu: fix a GPU hang issue when remove device
In reply to Greg Kroah-HartmanFrom: Dennis Li <[email protected]>
[ Upstream commit 88e21af1b3f887d217f2fb14fc7e7d3cd87ebf57 ]
When GFXOFF is enabled and GPU is idle, driver will fail to access some registers. Therefore change to disable power gating before all access registers with MMIO.
Dmesg log is as following:
amdgpu 0000:03:00.0: amdgpu: amdgpu: finishing device.
amdgpu: cp queue pipe 4 queue 0 preemption failed
amdgpu 0000:03:00.0: amdgpu: failed to write reg 2890 wait reg 28a2 amdgpu 0000:03:00.0: amdgpu: failed to write reg 1a6f4 wait reg 1a706 amdgpu 0000:03:00.0: amdgpu: failed to write reg 2890 wait reg 28a2 amdgpu 0000:03:00.0: amdgpu: failed to write reg 1a6f4 wait reg 1a706
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +2 -2
@@ -2524,11 +2524,11 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)if (adev->gmc.xgmi.num_physical_nodes >1 )amdgpu_xgmi_remove_device (adev); -amdgpu_amdkfd_device_fini (adev); -amdgpu_device_set_pg_state (adev,AMD_PG_STATE_UNGATE );amdgpu_device_set_cg_state (adev,AMD_CG_STATE_UNGATE ); +amdgpu_amdkfd_device_fini (adev); +/* need to disable SMC first */ for (i =0 ; i < adev->num_ip_blocks; i++) {if (!adev->ip_blocks[i].status.hw)
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 90/152 drm/amd/pm: fix the failure when change power profile for renoir
In reply to Greg Kroah-HartmanFrom: Xiaojian Du <[email protected]>
[ Upstream commit 44cb39e19a05ca711bcb6e776e0a4399223204a0 ]
This patch is to fix the failure when change power profile to "profile_peak" for renoir.
--- drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c | 1 + drivers/gpu/drm/amd/pm/swsmu/smu12/smu_v12_0.c | 1 + 2 files changed, 2 insertions(+)
drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c +1 -0
@@ -188,6 +188,7 @@ static int renoir_get_dpm_clk_limited(struct smu_context *smu, enum smu_clk_typereturn -EINVAL ; *freq = clk_table->SocClocks[dpm_level].Freq;break ; +case SMU_UCLK :case SMU_MCLK :if (dpm_level >=NUM_FCLK_DPM_LEVELS )return -EINVAL ;
drivers/gpu/drm/amd/pm/swsmu/smu12/smu_v12_0.c +1 -0
@@ -222,6 +222,7 @@ int smu_v12_0_set_soft_freq_limited_range(struct smu_context *smu, enum smu_clk_break ;case SMU_FCLK :case SMU_MCLK : +case SMU_UCLK : ret =smu_cmn_send_smc_msg_with_param (smu, SMU_MSG_SetHardMinFclkByFreq, min,NULL );if (ret)return ret;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 91/152 drm/amdgpu: fix potential memory leak during navi12 deinitialization
In reply to Greg Kroah-HartmanFrom: Jiawei Gu <[email protected]>
[ Upstream commit e6d5c64efaa34aae3815a9afeb1314a976142e83 ]
Navi12 HDCP & DTM deinitialization needs continue to free bo if already created though initialized flag is not set.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +14 -4
@@ -1283,8 +1283,12 @@ static int psp_hdcp_terminate(struct psp_context *psp)if (amdgpu_sriov_vf (psp->adev))return 0 ; -if (!psp->hdcp_context.hdcp_initialized) -return 0 ; +if (!psp->hdcp_context.hdcp_initialized) { +if (psp->hdcp_context.hdcp_shared_buf) + goto out; +else +return 0 ; + } ret =psp_hdcp_unload (psp);if (ret)
@@ -1292,6 +1296,7 @@ static int psp_hdcp_terminate(struct psp_context *psp) psp->hdcp_context.hdcp_initialized = false; +out:/* free hdcp shared memory */ amdgpu_bo_free_kernel(&psp->hdcp_context.hdcp_shared_bo, &psp->hdcp_context.hdcp_shared_mc_addr,
@@ -1430,8 +1435,12 @@ static int psp_dtm_terminate(struct psp_context *psp)if (amdgpu_sriov_vf (psp->adev))return 0 ; -if (!psp->dtm_context.dtm_initialized) -return 0 ; +if (!psp->dtm_context.dtm_initialized) { +if (psp->dtm_context.dtm_shared_buf) + goto out; +else +return 0 ; + } ret =psp_dtm_unload (psp);if (ret)
@@ -1439,6 +1448,7 @@ static int psp_dtm_terminate(struct psp_context *psp) psp->dtm_context.dtm_initialized = false; +out:/* free hdcp shared memory */ amdgpu_bo_free_kernel(&psp->dtm_context.dtm_shared_bo, &psp->dtm_context.dtm_shared_mc_addr,
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 92/152 usb: typec: Fix copy paste error for NVIDIA alt-mode description
In reply to Greg Kroah-HartmanFrom: Peter Robinson <[email protected]>
[ Upstream commit 41952a66015466c3208aac96b14ffd92e0943589 ]
The name of the module for the NVIDIA alt-mode is incorrect as it looks to be a copy-paste error from the entry above, update it to the correct typec_nvidia module name.
--- drivers/usb/typec/altmodes/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/typec/altmodes/Kconfig +1 -1
@@ -20,6 +20,6 @@ config TYPEC_NVIDIA_ALTMODE to enable support for VirtualLink devices with NVIDIA GPUs. To compile this driver as a module, choose M here: the - module will be called typec_displayport. + module will be called typec_nvidia. endmenu
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 93/152 iommu/vt-d: Fix lockdep splat in sva bind()/unbind()
In reply to Greg Kroah-HartmanFrom: Lu Baolu <[email protected]>
[ Upstream commit 420d42f6f9db27d88bc4f83e3e668fcdacbf7e29 ]
Lock(&iommu->lock) without disabling irq causes lockdep warnings.
========================================================
WARNING: possible irq lock inversion dependency detected 5.11.0-rc1+ #828 Not tainted
--------------------------------------------------------
kworker/0:1H/120 just changed the state of lock:ffffffffad9ea1b8 (device_domain_lock){..-.}-{2:2}, at:
iommu_flush_dev_iotlb.part.0+0x32/0x120
but this lock took another, SOFTIRQ-unsafe lock in the past:
(&iommu->lock){+.+.}-{2:2}
and interrupts could create inverse lock ordering between them.
other info that might help us debug this:
Possible interrupt unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&iommu->lock);
local_irq_disable();
lock(device_domain_lock);
lock(&iommu->lock);
<Interrupt>
lock(device_domain_lock);*** DEADLOCK ***
--- drivers/iommu/intel/svm.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/iommu/intel/svm.c +8 -6
@@ -281,6 +281,7 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,struct dmar_domain *dmar_domain;struct device_domain_info *info;struct intel_svm *svm =NULL ; +unsigned long iflags;int ret =0 ;if (WARN_ON (!iommu) || !data)
@@ -382,12 +383,12 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev,* each bind of a new device even with an existing PASID, we need to * call the nested mode setup function here. */ -spin_lock (&iommu->lock); +spin_lock_irqsave (&iommu->lock, iflags); ret =intel_pasid_setup_nested (iommu, dev, (pgd_t *)(uintptr_t )data->gpgd, data->hpasid, &data->vendor.vtd, dmar_domain, data->addr_width); -spin_unlock (&iommu->lock); +spin_unlock_irqrestore (&iommu->lock, iflags);if (ret) {dev_err_ratelimited (dev,"Failed to set up PASID %llu in nested mode, Err %d\n" , data->hpasid, ret);
@@ -487,6 +488,7 @@ intel_svm_bind_mm(struct device *dev, unsigned int flags,struct device_domain_info *info;struct intel_svm_dev *sdev;struct intel_svm *svm =NULL ; +unsigned long iflags;int pasid_max;int ret;
@@ -606,14 +608,14 @@ intel_svm_bind_mm(struct device *dev, unsigned int flags, } } -spin_lock (&iommu->lock); +spin_lock_irqsave (&iommu->lock, iflags); ret =intel_pasid_setup_first_level (iommu, dev, mm ? mm->pgd : init_mm.pgd, svm->pasid,FLPT_DEFAULT_DID , (mm ?0 :PASID_FLAG_SUPERVISOR_MODE ) | (cpu_feature_enabled (X86_FEATURE_LA57 ) ?PASID_FLAG_FL5LP :0 )); -spin_unlock (&iommu->lock); +spin_unlock_irqrestore (&iommu->lock, iflags);if (ret) {if (mm)mmu_notifier_unregister (&svm->notifier, mm);
@@ -633,14 +635,14 @@ intel_svm_bind_mm(struct device *dev, unsigned int flags,* Binding a new device with existing PASID, need to setup * the PASID entry. */ -spin_lock (&iommu->lock); +spin_lock_irqsave (&iommu->lock, iflags); ret =intel_pasid_setup_first_level (iommu, dev, mm ? mm->pgd : init_mm.pgd, svm->pasid,FLPT_DEFAULT_DID , (mm ?0 :PASID_FLAG_SUPERVISOR_MODE ) | (cpu_feature_enabled (X86_FEATURE_LA57 ) ?PASID_FLAG_FL5LP :0 )); -spin_unlock (&iommu->lock); +spin_unlock_irqrestore (&iommu->lock, iflags);if (ret) {kfree (sdev); goto out;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 94/152 ACPI: scan: add stub acpi_create_platform_device() for !CONFIG_ACPI
In reply to Greg Kroah-HartmanFrom: Shawn Guo <[email protected]>
[ Upstream commit ee61cfd955a64a58ed35cbcfc54068fcbd486945 ]
It adds a stub acpi_create_platform_device() for !CONFIG_ACPI build, so that caller doesn't have to deal with !CONFIG_ACPI build issue.
--- include/linux/acpi.h | 7 +++++++ 1 file changed, 7 insertions(+)
include/linux/acpi.h +7 -0
@@ -885,6 +885,13 @@ static inline int acpi_device_modalias(struct device *dev,return -ENODEV ; } +static inline struct platform_device * +acpi_create_platform_device (struct acpi_device *adev, +struct property_entry *properties) +{ +return NULL ; +} +static inline bool acpi_dma_supported (struct acpi_device *adev) {return false;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 95/152 drm/msm: Call msm_init_vram before binding the gpu
In reply to Greg Kroah-HartmanFrom: Craig Tatlor <[email protected]>
[ Upstream commit d863f0c7b536288e2bd40cbc01c10465dd226b11 ]
vram.size is needed when binding a gpu without an iommu and is defined in msm_init_vram(), so run that before binding it.
--- drivers/gpu/drm/msm/msm_drv.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/msm/msm_drv.c +4 -4
@@ -444,14 +444,14 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)drm_mode_config_init (ddev); -/* Bind all our sub-components: */ - ret =component_bind_all (dev, ddev); + ret =msm_init_vram (ddev);if (ret) goto err_destroy_mdss; - ret =msm_init_vram (ddev); +/* Bind all our sub-components: */ + ret =component_bind_all (dev, ddev);if (ret) - goto err_msm_uninit; + goto err_destroy_mdss;dma_set_max_seg_size (dev,UINT_MAX );
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 96/152 ARM: picoxcell: fix missing interrupt-parent properties
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit bac717171971176b78c72d15a8b6961764ab197f ]
dtc points out that the interrupts for some devices are not parsable:
picoxcell-pc3x2.dtsi:45.19-49.5: Warning (interrupts_property): /paxi/gem@30000: Missing interrupt-parent picoxcell-pc3x2.dtsi:51.21-55.5: Warning (interrupts_property): /paxi/dmac@40000: Missing interrupt-parent picoxcell-pc3x2.dtsi:57.21-61.5: Warning (interrupts_property): /paxi/dmac@50000: Missing interrupt-parent picoxcell-pc3x2.dtsi:233.21-237.5: Warning (interrupts_property): /rwid-axi/axi2pico@c0000000: Missing interrupt-parent
There are two VIC instances, so it's not clear which one needs to be used. I found the BSP sources that reference VIC0, so use that:
--- arch/arm/boot/dts/picoxcell-pc3x2.dtsi | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm/boot/dts/picoxcell-pc3x2.dtsi +4 -0
@@ -45,18 +45,21 @@ emac: gem@30000 { compatible = "cadence,gem"; reg = <0x30000 0x10000>; + interrupt-parent = <&vic0>; interrupts = <31>; }; dmac1: dmac@40000 { compatible = "snps,dw-dmac"; reg = <0x40000 0x10000>; + interrupt-parent = <&vic0>; interrupts = <25>; }; dmac2: dmac@50000 { compatible = "snps,dw-dmac"; reg = <0x50000 0x10000>; + interrupt-parent = <&vic0>; interrupts = <26>; };
@@ -233,6 +236,7 @@ axi2pico@c0000000 { compatible = "picochip,axi2pico-pc3x2"; reg = <0xc0000000 0x10000>; + interrupt-parent = <&vic0>; interrupts = <13 14 15 16 17 18 19 20 21>; }; };
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 97/152 poll: fix performance regression due to out-of-line __put_user()
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
[ Upstream commit ef0ba05538299f1391cbe097de36895bb36ecfe6 ]
The kernel test robot reported a -5.8% performance regression on the "poll2" test of will-it-scale, and bisected it to commit d55564cfc222 ("x86: Make __put_user() generate an out-of-line call").
I didn't expect an out-of-line __put_user() to matter, because no normal core code should use that non-checking legacy version of user access any more. But I had overlooked the very odd poll() usage, which does a __put_user() to update the 'revents' values of the poll array.
Now, Al Viro correctly points out that instead of updating just the 'revents' field, it would be much simpler to just copy the _whole_ pollfd entry, and then we could just use "copy_to_user()" on the whole array of entries, the same way we use "copy_from_user()" a few lines earlier to get the original values.
But that is not what we've traditionally done, and I worry that threaded applications might be concurrently modifying the other fields of the pollfd array. So while Al's suggestion is simpler - and perhaps worth trying in the future - this instead keeps the "just update revents" model.
To fix the performance regression, use the modern "unsafe_put_user()" instead of __put_user(), with the proper "user_write_access_begin()" guarding in place. This improves code generation enormously.
--- fs/select.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
fs/select.c +11 -3
@@ -1011,14 +1011,17 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, fdcount =do_poll (head, &table, end_time);poll_freewait (&table); +if (!user_write_access_begin (ufds, nfds *sizeof (*ufds))) + goto out_fds; +for (walk = head; walk; walk = walk->next) {struct pollfd *fds = walk->entries;int j; -for (j =0 ; j < walk->len; j++, ufds++) -if (__put_user (fds[j].revents, &ufds->revents)) - goto out_fds; +for (j = walk->len; j; fds++, ufds++, j--) +unsafe_put_user (fds->revents, &ufds->revents, Efault); } +user_write_access_end (); err = fdcount; out_fds:
@@ -1030,6 +1033,11 @@ out_fds: }return err; + +Efault: +user_write_access_end (); + err = -EFAULT ; + goto out_fds; }static long do_restart_poll (struct restart_block *restart_block)
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 98/152 rcu-tasks: Move RCU-tasks initialization to before early_initcall()
In reply to Greg Kroah-HartmanFrom: Uladzislau Rezki (Sony) <[email protected]>
[ Upstream commit 1b04fa9900263b4e217ca2509fd778b32c2b4eb2 ]
PowerPC testing encountered boot failures due to RCU Tasks not being fully initialized until core_initcall() time. This commit therefore initializes RCU Tasks (along with Rude RCU and RCU Tasks Trace) just before early_initcall() time, thus allowing waiting on RCU Tasks grace periods from early_initcall() handlers.
--- include/linux/rcupdate.h | 6 ++++++ init/main.c | 1 + kernel/rcu/tasks.h | 25 +++++++++++++++++++++---- 3 files changed, 28 insertions(+), 4 deletions(-)
include/linux/rcupdate.h +6 -0
@@ -86,6 +86,12 @@ void rcu_sched_clock_irq(int user);void rcu_report_dead (unsigned int cpu);void rcutree_migrate_callbacks (int cpu); +#ifdef CONFIG_TASKS_RCU_GENERIC +void rcu_init_tasks_generic (void ); +#else +static inline void rcu_init_tasks_generic (void ) { } +#endif +#ifdef CONFIG_RCU_STALL_COMMON void rcu_sysrq_start (void );void rcu_sysrq_end (void );
init/main.c +1 -0
@@ -1512,6 +1512,7 @@ static noinline void __init kernel_init_freeable(void)init_mm_internals (); +rcu_init_tasks_generic ();do_pre_smp_initcalls ();lockup_detector_init ();
kernel/rcu/tasks.h +21 -4
@@ -241,7 +241,7 @@ static int __noreturn rcu_tasks_kthread(void *arg) } } -/* Spawn RCU-tasks grace-period kthread, e.g., at core_initcall() time. */ +/* Spawn RCU-tasks grace-period kthread. */ static void __init rcu_spawn_tasks_kthread_generic (struct rcu_tasks *rtp) {struct task_struct *t;
@@ -569,7 +569,6 @@ static int __init rcu_spawn_tasks_kthread(void)rcu_spawn_tasks_kthread_generic (&rcu_tasks);return 0 ; } -core_initcall (rcu_spawn_tasks_kthread);#ifndef CONFIG_TINY_RCU static void show_rcu_tasks_classic_gp_kthread (void )
@@ -697,7 +696,6 @@ static int __init rcu_spawn_tasks_rude_kthread(void)rcu_spawn_tasks_kthread_generic (&rcu_tasks_rude);return 0 ; } -core_initcall (rcu_spawn_tasks_rude_kthread);#ifndef CONFIG_TINY_RCU static void show_rcu_tasks_rude_gp_kthread (void )
@@ -975,6 +973,11 @@ static void rcu_tasks_trace_pregp_step(void)static void rcu_tasks_trace_pertask (struct task_struct *t,struct list_head *hop) { +// During early boot when there is only the one boot CPU, there +// is no idle task for the other CPUs. Just return. +if (unlikely (t ==NULL )) +return ; +WRITE_ONCE (t->trc_reader_special.b.need_qs, false);WRITE_ONCE (t->trc_reader_checked, false); t->trc_ipi_to_cpu =-1 ;
@@ -1200,7 +1203,6 @@ static int __init rcu_spawn_tasks_trace_kthread(void)rcu_spawn_tasks_kthread_generic (&rcu_tasks_trace);return 0 ; } -core_initcall (rcu_spawn_tasks_trace_kthread);#ifndef CONFIG_TINY_RCU static void show_rcu_tasks_trace_gp_kthread (void )
@@ -1229,6 +1231,21 @@ void show_rcu_tasks_gp_kthreads(void) }#endif /* #ifndef CONFIG_TINY_RCU */ +void __init rcu_init_tasks_generic (void ) +{ +#ifdef CONFIG_TASKS_RCU +rcu_spawn_tasks_kthread (); +#endif + +#ifdef CONFIG_TASKS_RUDE_RCU +rcu_spawn_tasks_rude_kthread (); +#endif + +#ifdef CONFIG_TASKS_TRACE_RCU +rcu_spawn_tasks_trace_kthread (); +#endif +} +#else /* #ifdef CONFIG_TASKS_RCU_GENERIC */ static inline void rcu_tasks_bootup_oddness (void ) {}void show_rcu_tasks_gp_kthreads (void ) {}
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 99/152 bpf: Simplify task_file_seq_get_next()
In reply to Greg Kroah-HartmanFrom: Song Liu <[email protected]>
[ Upstream commit 91b2db27d3ff9ad29e8b3108dfbf1e2f49fe9bd3 ]
Simplify task_file_seq_get_next() by removing two in/out arguments: task and fstruct. Use info->task and info->files instead.
--- kernel/bpf/task_iter.c | 54 +++++++++++++----------------------------- 1 file changed, 17 insertions(+), 37 deletions(-)
kernel/bpf/task_iter.c +17 -37
@@ -136,8 +136,7 @@ struct bpf_iter_seq_task_file_info { };static struct file * -task_file_seq_get_next (struct bpf_iter_seq_task_file_info *info, -struct task_struct **task,struct files_struct **fstruct) +task_file_seq_get_next (struct bpf_iter_seq_task_file_info *info) {struct pid_namespace *ns = info->common.ns;u32 curr_tid = info->tid, max_fds;
@@ -150,14 +149,17 @@ task_file_seq_get_next(struct bpf_iter_seq_task_file_info *info,* Otherwise, it does not hold any reference. */ again: -if (*task) { - curr_task = *task; - curr_files = *fstruct; +if (info->task) { + curr_task = info->task; + curr_files = info->files; curr_fd = info->fd; }else { curr_task =task_seq_get_next (ns, &curr_tid, true); -if (!curr_task) +if (!curr_task) { + info->task =NULL ; + info->files =NULL ;return NULL ; + } curr_files =get_files_struct (curr_task);if (!curr_files) {
@@ -167,9 +169,8 @@ task_file_seq_get_next(struct bpf_iter_seq_task_file_info *info, goto again; } -/* set *fstruct, *task and info->tid */ - *fstruct = curr_files; - *task = curr_task; + info->files = curr_files; + info->task = curr_task;if (curr_tid == info->tid) { curr_fd = info->fd; }else {
@@ -199,8 +200,8 @@ task_file_seq_get_next(struct bpf_iter_seq_task_file_info *info,rcu_read_unlock ();put_files_struct (curr_files);put_task_struct (curr_task); - *task =NULL ; - *fstruct =NULL ; + info->task =NULL ; + info->files =NULL ; info->fd =0 ; curr_tid = ++(info->tid); goto again;
@@ -209,21 +210,13 @@ task_file_seq_get_next(struct bpf_iter_seq_task_file_info *info,static void *task_file_seq_start (struct seq_file *seq,loff_t *pos) {struct bpf_iter_seq_task_file_info *info = seq->private; -struct files_struct *files =NULL ; -struct task_struct *task =NULL ;struct file *file; - file =task_file_seq_get_next (info, &task, &files); -if (!file) { - info->files =NULL ; - info->task =NULL ; -return NULL ; - } - -if (*pos ==0 ) + info->task =NULL ; + info->files =NULL ; + file =task_file_seq_get_next (info); +if (file && *pos ==0 ) ++*pos; - info->task = task; - info->files = files;return file; }
@@ -231,24 +224,11 @@ static void *task_file_seq_start(struct seq_file *seq, loff_t *pos)static void *task_file_seq_next (struct seq_file *seq,void *v,loff_t *pos) {struct bpf_iter_seq_task_file_info *info = seq->private; -struct files_struct *files = info->files; -struct task_struct *task = info->task; -struct file *file; ++*pos; ++info->fd;fput ((struct file *)v); - file =task_file_seq_get_next (info, &task, &files); -if (!file) { - info->files =NULL ; - info->task =NULL ; -return NULL ; - } - - info->task = task; - info->files = files; - -return file; +return task_file_seq_get_next (info); }struct bpf_iter__task_file {
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 100/152 bpf: Save correct stopping point in file seq iteration
In reply to Greg Kroah-HartmanFrom: Jonathan Lemon <[email protected]>
[ Upstream commit 69ca310f34168eae0ada434796bfc22fb4a0fa26 ]
On some systems, some variant of the following splat is repeatedly seen. The common factor in all traces seems to be the entry point to task_file_seq_next(). With the patch, all warnings go away.
rcu: INFO: rcu_sched self-detected stall on CPU
rcu: \x0926-....: (20992 ticks this GP) idle=d7e/1/0x4000000000000002 softirq=81556231/81556231 fqs=4876
\x09(t=21033 jiffies g=159148529 q=223125)
NMI backtrace for cpu 26
CPU: 26 PID: 2015853 Comm: bpftool Kdump: loaded Not tainted 5.6.13-0_fbk4_3876_gd8d1f9bf80bb #1
Hardware name: Quanta Twin Lakes MP/Twin Lakes Passive MP, BIOS F09_3A12 10/08/2018
Call Trace:
<IRQ>
dump_stack+0x50/0x70
nmi_cpu_backtrace.cold.6+0x13/0x50
? lapic_can_unplug_cpu.cold.30+0x40/0x40
nmi_trigger_cpumask_backtrace+0xba/0xca
rcu_dump_cpu_stacks+0x99/0xc7
rcu_sched_clock_irq.cold.90+0x1b4/0x3aa
? tick_sched_do_timer+0x60/0x60
update_process_times+0x24/0x50
tick_sched_timer+0x37/0x70
__hrtimer_run_queues+0xfe/0x270
hrtimer_interrupt+0xf4/0x210
smp_apic_timer_interrupt+0x5e/0x120
apic_timer_interrupt+0xf/0x20
</IRQ>
RIP: 0010:get_pid_task+0x38/0x80
Code: 89 f6 48 8d 44 f7 08 48 8b 00 48 85 c0 74 2b 48 83 c6 55 48 c1 e6 04 48 29 f0 74 19 48 8d 78 20 ba 01 00 00 00 f0 0f c1 50 20 <85> d2 74 27 78 11 83 c2 01 78 0c 48 83 c4 08 c3 31 c0 48 83 c4 08
RSP: 0018:ffffc9000d293dc8 EFLAGS: 00000202 ORIG_RAX: ffffffffffffff13
RAX: ffff888637c05600 RBX: ffffc9000d293e0c RCX: 0000000000000000
RDX: 0000000000000001 RSI: 0000000000000550 RDI: ffff888637c05620
RBP: ffffffff8284eb80 R08: ffff88831341d300 R09: ffff88822ffd8248
R10: ffff88822ffd82d0 R11: 00000000003a93c0 R12: 0000000000000001
R13: 00000000ffffffff R14: ffff88831341d300 R15: 0000000000000000
? find_ge_pid+0x1b/0x20
task_seq_get_next+0x52/0xc0
task_file_seq_get_next+0x159/0x220
task_file_seq_next+0x4f/0xa0
bpf_seq_read+0x159/0x390
vfs_read+0x8a/0x140
ksys_read+0x59/0xd0
do_syscall_64+0x42/0x110
entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x7f95ae73e76e
Code: Bad RIP value.
RSP: 002b:00007ffc02c1dbf8 EFLAGS: 00000246 ORIG_RAX: 0000000000000000
RAX: ffffffffffffffda RBX: 000000000170faa0 RCX: 00007f95ae73e76e
RDX: 0000000000001000 RSI: 00007ffc02c1dc30 RDI: 0000000000000007
RBP: 00007ffc02c1ec70 R08: 0000000000000005 R09: 0000000000000006
R10: fffffffffffff20b R11: 0000000000000246 R12: 00000000019112a0
R13: 0000000000000000 R14: 0000000000000007 R15: 00000000004283c0If unable to obtain the file structure for the current task, proceed to the next task number after the one returned from task_seq_get_next(), instead of the next task number from the original iterator.
Also, save the stopping task number from task_seq_get_next() on failure in case of restarts.
--- kernel/bpf/task_iter.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/bpf/task_iter.c +2 -1
@@ -158,13 +158,14 @@ task_file_seq_get_next(struct bpf_iter_seq_task_file_info *info)if (!curr_task) { info->task =NULL ; info->files =NULL ; + info->tid = curr_tid;return NULL ; } curr_files =get_files_struct (curr_task);if (!curr_files) {put_task_struct (curr_task); - curr_tid = ++(info->tid); + curr_tid = curr_tid +1 ; info->fd =0 ; goto again; }
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 101/152 x86/sev-es: Fix SEV-ES OUT/IN immediate opcode vc handling
In reply to Greg Kroah-HartmanFrom: Peter Gonda <[email protected]>
[ Upstream commit a8f7e08a81708920a928664a865208fdf451c49f ]
The IN and OUT instructions with port address as an immediate operand only use an 8-bit immediate (imm8). The current VC handler uses the entire 32-bit immediate value but these instructions only set the first bytes.
Cast the operand to an u8 for that.
[ bp: Massage commit message. ]
--- arch/x86/kernel/sev-es-shared.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/kernel/sev-es-shared.c +2 -2
@@ -305,14 +305,14 @@ static enum es_result vc_ioio_exitinfo(struct es_em_ctxt *ctxt, u64 *exitinfo)case 0xe4 :case 0xe5 : *exitinfo |=IOIO_TYPE_IN ; - *exitinfo |= (u64 )insn->immediate.value <<16 ; + *exitinfo |= (u8 )insn->immediate.value <<16 ;break ;/* OUT immediate opcodes */ case 0xe6 :case 0xe7 : *exitinfo |=IOIO_TYPE_OUT ; - *exitinfo |= (u64 )insn->immediate.value <<16 ; + *exitinfo |= (u8 )insn->immediate.value <<16 ;break ;/* IN register opcodes */
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 102/152 cfg80211: select CONFIG_CRC32
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 152a8a6c017bfdeda7f6d052fbc6e151891bd9b6 ]
Without crc32 support, this fails to link:
arm-linux-gnueabi-ld: net/wireless/scan.o: in function `cfg80211_scan_6ghz':
scan.c:(.text+0x928): undefined reference to `crc32_le'
--- net/wireless/Kconfig | 1 + 1 file changed, 1 insertion(+)
net/wireless/Kconfig +1 -0
@@ -21,6 +21,7 @@ config CFG80211 tristate "cfg80211 - wireless configuration API" depends on RFKILL || !RFKILL select FW_LOADER + select CRC32 # may need to update this when certificates are changed and are # using a different algorithm, though right now they shouldn't # (this is here rather than below to allow it to be a module)
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 103/152 nvme-fc: avoid calling _nvme_fc_abort_outstanding_ios from interrupt context
In reply to Greg Kroah-HartmanFrom: James Smart <[email protected]>
[ Upstream commit 19fce0470f05031e6af36e49ce222d0f0050d432 ]
Recent patches changed calling sequences. nvme_fc_abort_outstanding_ios used to be called from a timeout or work context. Now it is being called in an io completion context, which can be an interrupt handler. Unfortunately, the abort outstanding ios routine attempts to stop nvme queues and nested routines that may try to sleep, which is in conflict with the interrupt handler.
Correct replacing the direct call with a work element scheduling, and the abort outstanding ios routine will be called in the work element.
--- drivers/nvme/host/fc.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/nvme/host/fc.c +14 -1
@@ -166,6 +166,7 @@ struct nvme_fc_ctrl {struct blk_mq_tag_set admin_tag_set;struct blk_mq_tag_set tag_set; +struct work_struct ioerr_work;struct delayed_work connect_work;struct kref ref;
@@ -1888,6 +1889,15 @@ __nvme_fc_fcpop_chk_teardowns(struct nvme_fc_ctrl *ctrl, } } +static void +nvme_fc_ctrl_ioerr_work (struct work_struct *work) +{ +struct nvme_fc_ctrl *ctrl = + container_of(work, struct nvme_fc_ctrl, ioerr_work); + +nvme_fc_error_recovery (ctrl,"transport detected io error" ); +} +static void nvme_fc_fcpio_done (struct nvmefc_fcp_req *req) {
@@ -2046,7 +2056,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req) check_error:if (terminate_assoc) -nvme_fc_error_recovery (ctrl,"transport detected io error" ); +queue_work (nvme_reset_wq, &ctrl->ioerr_work); } static int
@@ -3233,6 +3243,7 @@ nvme_fc_delete_ctrl(struct nvme_ctrl *nctrl) {struct nvme_fc_ctrl *ctrl =to_fc_ctrl (nctrl); +cancel_work_sync (&ctrl->ioerr_work);cancel_delayed_work_sync (&ctrl->connect_work);/* * kill the association on the link side. this will block
@@ -3449,6 +3460,7 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,INIT_WORK (&ctrl->ctrl.reset_work, nvme_fc_reset_ctrl_work);INIT_DELAYED_WORK (&ctrl->connect_work, nvme_fc_connect_ctrl_work); +INIT_WORK (&ctrl->ioerr_work, nvme_fc_ctrl_ioerr_work);spin_lock_init (&ctrl->lock);/* io queue count */
@@ -3540,6 +3552,7 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts, fail_ctrl:nvme_change_ctrl_state (&ctrl->ctrl,NVME_CTRL_DELETING ); +cancel_work_sync (&ctrl->ioerr_work);cancel_work_sync (&ctrl->ctrl.reset_work);cancel_delayed_work_sync (&ctrl->connect_work);
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 104/152 iommu/vt-d: Update domain geometry in iommu_ops.at(de)tach_dev
In reply to Greg Kroah-HartmanFrom: Lu Baolu <[email protected]>
[ Upstream commit c062db039f40e868c371c36afe8d0fac64305b5d ]
The iommu-dma constrains IOVA allocation based on the domain geometry that the driver reports. Update domain geometry everytime a domain is attached to or detached from a device.
--- drivers/iommu/intel/iommu.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/iommu/intel/iommu.c +14 -2
@@ -67,8 +67,8 @@#define MAX_AGAW_WIDTH 64#define MAX_AGAW_PFN_WIDTH (MAX_AGAW_WIDTH - VTD_PAGE_SHIFT) -#define __DOMAIN_MAX_PFN (gaw) ((((uint64_t)1) << (gaw-VTD_PAGE_SHIFT)) - 1) -#define __DOMAIN_MAX_ADDR (gaw) ((((uint64_t)1) << gaw) - 1) +#define __DOMAIN_MAX_PFN (gaw) ((((uint64_t)1) << ((gaw) - VTD_PAGE_SHIFT)) - 1) +#define __DOMAIN_MAX_ADDR (gaw) ((((uint64_t)1) << (gaw)) - 1)/* We limit DOMAIN_MAX_PFN to fit in an unsigned long, and DOMAIN_MAX_ADDR to match. That way, we can use 'unsigned long' for PFNs with impunity. */
@@ -739,6 +739,18 @@ static void domain_update_iommu_cap(struct dmar_domain *domain)*/ if (domain->nid ==NUMA_NO_NODE ) domain->nid =domain_update_device_node (domain); + +/* +* First-level translation restricts the input-address to a +* canonical address (i.e., address bits 63:N have the same +* value as address bit [N-1], where N is 48-bits with 4-level +* paging and 57-bits with 5-level paging). Hence, skip bit +* [N-1]. +*/ +if (domain_use_first_level (domain)) + domain->domain.geometry.aperture_end =__DOMAIN_MAX_ADDR (domain->gaw -1 ); +else + domain->domain.geometry.aperture_end =__DOMAIN_MAX_ADDR (domain->gaw); } struct context_entry *iommu_context_addr(struct intel_iommu *iommu, u8 bus,
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 105/152 net/mlx5e: CT: Use per flow counter when CT flow accounting is enabled
In reply to Greg Kroah-HartmanFrom: Oz Shlomo <[email protected]>
[ Upstream commit eed38eeee734756596e2cc163bdc7dac3be501b1 ]
Connection counters may be shared for both directions when the counter is used for connection aging purposes. However, if TC flow accounting is enabled then a unique counter is required per direction.
Instantiate a unique counter per direction if the conntrack accounting extension is enabled. Use a shared counter when the connection accounting extension is disabled.
--- .../ethernet/mellanox/mlx5/core/en/tc_ct.c | 77 ++++++++++++------- 1 file changed, 49 insertions(+), 28 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c +49 -28
@@ -118,16 +118,17 @@ struct mlx5_ct_tuple {u16 zone; }; -struct mlx5_ct_shared_counter { +struct mlx5_ct_counter {struct mlx5_fc *counter;refcount_t refcount; +bool is_shared; };struct mlx5_ct_entry {struct rhash_head node;struct rhash_head tuple_node;struct rhash_head tuple_nat_node; -struct mlx5_ct_shared_counter *shared_counter; +struct mlx5_ct_counter *counter;unsigned long cookie;unsigned long restore_cookie;struct mlx5_ct_tuple tuple;
@@ -394,13 +395,14 @@ mlx5_tc_ct_set_tuple_match(struct mlx5e_priv *priv, struct mlx5_flow_spec *spec, }static void -mlx5_tc_ct_shared_counter_put (struct mlx5_tc_ct_priv *ct_priv,struct mlx5_ct_entry *entry) +mlx5_tc_ct_counter_put (struct mlx5_tc_ct_priv *ct_priv,struct mlx5_ct_entry *entry) { -if (!refcount_dec_and_test (&entry->shared_counter->refcount)) +if (entry->counter->is_shared && + !refcount_dec_and_test (&entry->counter->refcount))return ; -mlx5_fc_destroy (ct_priv->dev, entry->shared_counter->counter); -kfree (entry->shared_counter); +mlx5_fc_destroy (ct_priv->dev, entry->counter->counter); +kfree (entry->counter); } static void
@@ -699,7 +701,7 @@ mlx5_tc_ct_entry_add_rule(struct mlx5_tc_ct_priv *ct_priv, attr->dest_ft = ct_priv->post_ct; attr->ft = nat ? ct_priv->ct_nat : ct_priv->ct; attr->outer_match_level =MLX5_MATCH_L4 ; - attr->counter = entry->shared_counter->counter; + attr->counter = entry->counter->counter; attr->flags |=MLX5_ESW_ATTR_FLAG_NO_IN_PORT ;mlx5_tc_ct_set_tuple_match (netdev_priv (ct_priv->netdev), spec, flow_rule);
@@ -732,13 +734,34 @@ mlx5_tc_ct_entry_add_rule(struct mlx5_tc_ct_priv *ct_priv,return err; } -static struct mlx5_ct_shared_counter * +static struct mlx5_ct_counter * +mlx5_tc_ct_counter_create (struct mlx5_tc_ct_priv *ct_priv) +{ +struct mlx5_ct_counter *counter; +int ret; + + counter =kzalloc (sizeof (*counter),GFP_KERNEL ); +if (!counter) +return ERR_PTR (-ENOMEM ); + + counter->is_shared = false; + counter->counter =mlx5_fc_create (ct_priv->dev, true); +if (IS_ERR (counter->counter)) { +ct_dbg ("Failed to create counter for ct entry" ); + ret =PTR_ERR (counter->counter); +kfree (counter); +return ERR_PTR (ret); + } + +return counter; +} + +static struct mlx5_ct_counter *mlx5_tc_ct_shared_counter_get (struct mlx5_tc_ct_priv *ct_priv,struct mlx5_ct_entry *entry) {struct mlx5_ct_tuple rev_tuple = entry->tuple; -struct mlx5_ct_shared_counter *shared_counter; -struct mlx5_core_dev *dev = ct_priv->dev; +struct mlx5_ct_counter *shared_counter;struct mlx5_ct_entry *rev_entry;__be16 tmp_port;int ret;
@@ -767,25 +790,20 @@ mlx5_tc_ct_shared_counter_get(struct mlx5_tc_ct_priv *ct_priv, rev_entry =rhashtable_lookup_fast (&ct_priv->ct_tuples_ht, &rev_tuple, tuples_ht_params);if (rev_entry) { -if (refcount_inc_not_zero (&rev_entry->shared_counter->refcount)) { +if (refcount_inc_not_zero (&rev_entry->counter->refcount)) {mutex_unlock (&ct_priv->shared_counter_lock); -return rev_entry->shared_counter; +return rev_entry->counter; } }mutex_unlock (&ct_priv->shared_counter_lock); - shared_counter =kzalloc (sizeof (*shared_counter),GFP_KERNEL ); -if (!shared_counter) -return ERR_PTR (-ENOMEM ); - - shared_counter->counter =mlx5_fc_create (dev, true); -if (IS_ERR (shared_counter->counter)) { -ct_dbg ("Failed to create counter for ct entry" ); - ret =PTR_ERR (shared_counter->counter); -kfree (shared_counter); + shared_counter =mlx5_tc_ct_counter_create (ct_priv); +if (IS_ERR (shared_counter)) { + ret =PTR_ERR (shared_counter);return ERR_PTR (ret); } + shared_counter->is_shared = true;refcount_set (&shared_counter->refcount,1 );return shared_counter; }
@@ -798,10 +816,13 @@ mlx5_tc_ct_entry_add_rules(struct mlx5_tc_ct_priv *ct_priv, {int err; - entry->shared_counter =mlx5_tc_ct_shared_counter_get (ct_priv, entry); -if (IS_ERR (entry->shared_counter)) { - err =PTR_ERR (entry->shared_counter); -ct_dbg ("Failed to create counter for ct entry" ); +if (nf_ct_acct_enabled (dev_net (ct_priv->netdev))) + entry->counter =mlx5_tc_ct_counter_create (ct_priv); +else + entry->counter =mlx5_tc_ct_shared_counter_get (ct_priv, entry); + +if (IS_ERR (entry->counter)) { + err =PTR_ERR (entry->counter);return err; }
@@ -820,7 +841,7 @@ mlx5_tc_ct_entry_add_rules(struct mlx5_tc_ct_priv *ct_priv, err_nat:mlx5_tc_ct_entry_del_rule (ct_priv, entry, false); err_orig: -mlx5_tc_ct_shared_counter_put (ct_priv, entry); +mlx5_tc_ct_counter_put (ct_priv, entry);return err; }
@@ -918,7 +939,7 @@ mlx5_tc_ct_del_ft_entry(struct mlx5_tc_ct_priv *ct_priv,rhashtable_remove_fast (&ct_priv->ct_tuples_ht, &entry->tuple_node, tuples_ht_params);mutex_unlock (&ct_priv->shared_counter_lock); -mlx5_tc_ct_shared_counter_put (ct_priv, entry); +mlx5_tc_ct_counter_put (ct_priv, entry); }
@@ -956,7 +977,7 @@ mlx5_tc_ct_block_flow_offload_stats(struct mlx5_ct_ft *ft,if (!entry)return -ENOENT ; -mlx5_fc_query_cached (entry->shared_counter->counter, &bytes, &packets, &lastuse); +mlx5_fc_query_cached (entry->counter->counter, &bytes, &packets, &lastuse);flow_stats_update (&f->stats, bytes, packets,0 , lastuse,FLOW_ACTION_HW_STATS_DELAYED );
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 106/152 net/mlx5: Fix passing zero to PTR_ERR
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
[ Upstream commit 0c4accc41cb56e527c8c049f5495af9f3d6bef7e ]
Fix smatch warnings:
drivers/net/ethernet/mellanox/mlx5/core/esw/acl/egress_lgcy.c:105 esw_acl_egress_lgcy_setup() warn: passing zero to 'PTR_ERR' drivers/net/ethernet/mellanox/mlx5/core/esw/acl/egress_ofld.c:177 esw_acl_egress_ofld_setup() warn: passing zero to 'PTR_ERR' drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_lgcy.c:184 esw_acl_ingress_lgcy_setup() warn: passing zero to 'PTR_ERR' drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_ofld.c:262 esw_acl_ingress_ofld_setup() warn: passing zero to 'PTR_ERR'
esw_acl_table_create() never returns NULL, so
NULL test should be removed.
--- drivers/net/ethernet/mellanox/mlx5/core/esw/acl/egress_lgcy.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/esw/acl/egress_ofld.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_lgcy.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_ofld.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/esw/acl/egress_lgcy.c +1 -1
@@ -101,7 +101,7 @@ int esw_acl_egress_lgcy_setup(struct mlx5_eswitch *esw, vport->egress.acl =esw_acl_table_create (esw, vport->vport,MLX5_FLOW_NAMESPACE_ESW_EGRESS , table_size); -if (IS_ERR_OR_NULL (vport->egress.acl)) { +if (IS_ERR (vport->egress.acl)) { err =PTR_ERR (vport->egress.acl); vport->egress.acl =NULL ; goto out;
drivers/net/ethernet/mellanox/mlx5/core/esw/acl/egress_ofld.c +1 -1
@@ -173,7 +173,7 @@ int esw_acl_egress_ofld_setup(struct mlx5_eswitch *esw, struct mlx5_vport *vport table_size++; vport->egress.acl =esw_acl_table_create (esw, vport->vport,MLX5_FLOW_NAMESPACE_ESW_EGRESS , table_size); -if (IS_ERR_OR_NULL (vport->egress.acl)) { +if (IS_ERR (vport->egress.acl)) { err =PTR_ERR (vport->egress.acl); vport->egress.acl =NULL ;return err;
drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_lgcy.c +1 -1
@@ -180,7 +180,7 @@ int esw_acl_ingress_lgcy_setup(struct mlx5_eswitch *esw, vport->ingress.acl =esw_acl_table_create (esw, vport->vport,MLX5_FLOW_NAMESPACE_ESW_INGRESS , table_size); -if (IS_ERR_OR_NULL (vport->ingress.acl)) { +if (IS_ERR (vport->ingress.acl)) { err =PTR_ERR (vport->ingress.acl); vport->ingress.acl =NULL ;return err;
drivers/net/ethernet/mellanox/mlx5/core/esw/acl/ingress_ofld.c +1 -1
@@ -258,7 +258,7 @@ int esw_acl_ingress_ofld_setup(struct mlx5_eswitch *esw, vport->ingress.acl =esw_acl_table_create (esw, vport->vport,MLX5_FLOW_NAMESPACE_ESW_INGRESS , num_ftes); -if (IS_ERR_OR_NULL (vport->ingress.acl)) { +if (IS_ERR (vport->ingress.acl)) { err =PTR_ERR (vport->ingress.acl); vport->ingress.acl =NULL ;return err;
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 107/152 net/mlx5: E-Switch, fix changing vf VLANID
In reply to Greg Kroah-HartmanFrom: Alaa Hleihel <[email protected]>
[ Upstream commit 25c904b59aaf4816337acd415514b0c47715f604 ]
Adding vf VLANID for the first time, or after having cleared previously defined VLANID works fine, however, attempting to change an existing vf VLANID clears the rules on the firmware, but does not add new rules for the new vf VLANID.
Fix this by changing the logic in function esw_acl_egress_lgcy_setup() so that it will always configure egress rules.
--- .../mellanox/mlx5/core/esw/acl/egress_lgcy.c | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/esw/acl/egress_lgcy.c +13 -14
@@ -95,22 +95,21 @@ int esw_acl_egress_lgcy_setup(struct mlx5_eswitch *esw,return 0 ; } -if (!IS_ERR_OR_NULL (vport->egress.acl)) -return 0 ; - - vport->egress.acl =esw_acl_table_create (esw, vport->vport, -MLX5_FLOW_NAMESPACE_ESW_EGRESS , - table_size); -if (IS_ERR (vport->egress.acl)) { - err =PTR_ERR (vport->egress.acl); - vport->egress.acl =NULL ; - goto out; +if (!vport->egress.acl) { + vport->egress.acl =esw_acl_table_create (esw, vport->vport, +MLX5_FLOW_NAMESPACE_ESW_EGRESS , + table_size); +if (IS_ERR (vport->egress.acl)) { + err =PTR_ERR (vport->egress.acl); + vport->egress.acl =NULL ; + goto out; + } + + err =esw_acl_egress_lgcy_groups_create (esw, vport); +if (err) + goto out; } - err =esw_acl_egress_lgcy_groups_create (esw, vport); -if (err) - goto out; -esw_debug (esw->dev,"vport[%d] configure egress rules, vlan(%d) qos(%d)\n" , vport->vport, vport->info.vlan, vport->info.qos);
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 108/152 blk-mq-debugfs: Add decode for BLK_MQ_F_TAG_HCTX_SHARED
In reply to Greg Kroah-HartmanFrom: John Garry <[email protected]>
[ Upstream commit 02f938e9fed1681791605ca8b96c2d9da9355f6a ]
Showing the hctx flags for when BLK_MQ_F_TAG_HCTX_SHARED is set gives something like:
root@debian:/home/john# more /sys/kernel/debug/block/sda/hctx0/flags alloc_policy=FIFO SHOULD_MERGE|TAG_QUEUE_SHARED|3
Add the decoding for that flag.
--- block/blk-mq-debugfs.c | 1 + 1 file changed, 1 insertion(+)
block/blk-mq-debugfs.c +1 -0
@@ -246,6 +246,7 @@ static const char *const hctx_flag_name[] = {HCTX_FLAG_NAME (BLOCKING ),HCTX_FLAG_NAME (NO_SCHED ),HCTX_FLAG_NAME (STACKING ), + HCTX_FLAG_NAME(TAG_HCTX_SHARED), };#undef HCTX_FLAG_NAME
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 109/152 mm: fix clear_refs_write locking
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
[ Upstream commit 29a951dfb3c3263c3a0f3bd9f7f2c2cfde4baedb ]
Turning page table entries read-only requires the mmap_sem held for writing.
So stop doing the odd games with turning things from read locks to write locks and back. Just get the write lock.
--- fs/proc/task_mmu.c | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-)
fs/proc/task_mmu.c +9 -23
@@ -1215,41 +1215,26 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, .type = type, }; +if (mmap_write_lock_killable (mm)) { + count = -EINTR ; + goto out_mm; + }if (type ==CLEAR_REFS_MM_HIWATER_RSS ) { -if (mmap_write_lock_killable (mm)) { - count = -EINTR ; - goto out_mm; - } -/* * Writing 5 to /proc/pid/clear_refs resets the peak * resident set size to this mm's current rss value. */ reset_mm_hiwater_rss (mm); -mmap_write_unlock (mm); - goto out_mm; + goto out_unlock; } -if (mmap_read_lock_killable (mm)) { - count = -EINTR ; - goto out_mm; - }tlb_gather_mmu (&tlb, mm,0 ,-1 );if (type ==CLEAR_REFS_SOFT_DIRTY ) {for (vma = mm->mmap; vma; vma = vma->vm_next) {if (!(vma->vm_flags &VM_SOFTDIRTY ))continue ; -mmap_read_unlock (mm); -if (mmap_write_lock_killable (mm)) { - count = -EINTR ; - goto out_mm; - } -for (vma = mm->mmap; vma; vma = vma->vm_next) { - vma->vm_flags &= ~VM_SOFTDIRTY ; -vma_set_page_prot (vma); - } -mmap_write_downgrade (mm); -break ; + vma->vm_flags &= ~VM_SOFTDIRTY ; +vma_set_page_prot (vma); } mmu_notifier_range_init(&range, MMU_NOTIFY_SOFT_DIRTY,
@@ -1261,7 +1246,8 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,if (type ==CLEAR_REFS_SOFT_DIRTY )mmu_notifier_invalidate_range_end (&range);tlb_finish_mmu (&tlb,0 ,-1 ); -mmap_read_unlock (mm); +out_unlock: +mmap_write_unlock (mm); out_mm:mmput (mm); }
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 110/152 mm: dont play games with pinned pages in clear_page_refs
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
[ Upstream commit 9348b73c2e1bfea74ccd4a44fb4ccc7276ab9623 ]
Turning a pinned page read-only breaks the pinning after COW. Don't do it.
The whole "track page soft dirty" state doesn't work with pinned pages anyway, since the page might be dirtied by the pinning entity without ever being noticed in the page tables.
--- fs/proc/task_mmu.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
fs/proc/task_mmu.c +21 -0
@@ -1035,6 +1035,25 @@ struct clear_refs_private { };#ifdef CONFIG_MEM_SOFT_DIRTY + +#define is_cow_mapping (flags) (((flags) & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE) + +static inline bool pte_is_pinned (struct vm_area_struct *vma,unsigned long addr,pte_t pte) +{ +struct page *page; + +if (!pte_write (pte)) +return false; +if (!is_cow_mapping (vma->vm_flags)) +return false; +if (likely (!atomic_read (&vma->vm_mm->has_pinned))) +return false; + page =vm_normal_page (vma, addr, pte); +if (!page) +return false; +return page_maybe_dma_pinned (page); +} +static inline void clear_soft_dirty (struct vm_area_struct *vma,unsigned long addr,pte_t *pte) {
@@ -1049,6 +1068,8 @@ static inline void clear_soft_dirty(struct vm_area_struct *vma,if (pte_present (ptent)) {pte_t old_pte; +if (pte_is_pinned (vma, addr, ptent)) +return ; old_pte =ptep_modify_prot_start (vma, addr, pte); ptent =pte_wrprotect (old_pte); ptent =pte_clear_soft_dirty (ptent);
Signature · 1 line
2.27.0
Greg Kroah-Hartman
maintainerPATCH 111/152 mm: dont put pinned pages into the swap cache
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
[ Upstream commit feb889fb40fafc6933339cf1cca8f770126819fb ]
So technically there is nothing wrong with adding a pinned page to the swap cache, but the pinning obviously means that the page can't actually be free'd right now anyway, so it's a bit pointless.
However, the real problem is not with it being a bit pointless: the real issue is that after we've added it to the swap cache, we'll try to unmap the page. That will succeed, because the code in mm/rmap.c doesn't know or care about pinned pages.
Even the unmapping isn't fatal per se, since the page will stay around in memory due to the pinning, and we do hold the connection to it using the swap cache. But when we then touch it next and take a page fault, the logic in do_swap_page() will map it back into the process as a possibly read-only page, and we'll then break the page association on the next COW fault.
Honestly, this issue could have been fixed in any of those other places:
(a) we could refuse to unmap a pinned page (which makes conceptual sense), or (b) we could make sure to re-map a pinned page writably in do_swap_page(), or (c) we could just make do_wp_page() not COW the pinned page (which was what we historically did before that "mm:do_wp_page() simplification" commit).
But while all of them are equally valid models for breaking this chain, not putting pinned pages into the swap cache in the first place is the simplest one by far.
It's also the safest one: the reason why do_wp_page() was changed in the first place was that getting the "can I re-use this page" wrong is so fraught with errors. If you do it wrong, you end up with an incorrectly shared page.
As a result, using "page_maybe_dma_pinned()" in either do_wp_page() or do_swap_page() would be a serious bug since it is only a (very good) heuristic. Re-using the page requires a hard black-and-white rule with no room for ambiguity.
In contrast, saying "this page is very likely dma pinned, so let's not add it to the swap cache and try to unmap it" is an obviously safe thing to do, and if the heuristic might very rarely be a false positive, no harm is done.
--- mm/vmscan.c | 2 ++ 1 file changed, 2 insertions(+)
mm/vmscan.c +2 -0
@@ -1240,6 +1240,8 @@ static unsigned int shrink_page_list(strif (!PageSwapCache (page)) {if (!(sc->gfp_mask & __GFP_IO)) goto keep_locked; +if (page_maybe_dma_pinned (page)) + goto keep_locked;if (PageTransHuge (page)) {/* cannot split THP, skip it */ if (!can_split_huge_page (page,NULL ))
Greg Kroah-Hartman
maintainerPATCH 112/152 perf intel-pt: Fix CPU too large error
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit 5501e9229a80d95a1ea68609f44c447a75d23ed5 upstream.
In some cases, the number of cpus (nr_cpus_online) is confused with the maximum cpu number (nr_cpus_avail), which results in the error in the example below:
Example on system with 8 cpus:
Before:
# echo 0 > /sys/devices/system/cpu/cpu2/online # ./perf record --kcore -e intel_pt// taskset --cpu-list 7 uname Linux [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.147 MB perf.data ] # ./perf script --itrace=e Requested CPU 7 too large. Consider raising MAX_NR_CPUS 0x25908 [0x8]: failed to process type: 68 [Invalid argument]
After:
# ./perf script --itrace=e #
--- tools/perf/util/machine.c | 4 ++-- tools/perf/util/session.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
tools/perf/util/machine.c +2 -2
@@ -2973,7 +2973,7 @@ int machines__for_each_thread(struct macpid_t machine__get_current_tid (struct machine *machine,int cpu) { -int nr_cpus =min (machine->env->nr_cpus_online,MAX_NR_CPUS ); +int nr_cpus =min (machine->env->nr_cpus_avail,MAX_NR_CPUS );if (cpu <0 || cpu >= nr_cpus || !machine->current_tid)return -1 ;
@@ -2985,7 +2985,7 @@ int machine__set_current_tid(struct mach pid_t tid) {struct thread *thread; -int nr_cpus =min (machine->env->nr_cpus_online,MAX_NR_CPUS ); +int nr_cpus =min (machine->env->nr_cpus_avail,MAX_NR_CPUS );if (cpu <0 )return -EINVAL ;
tools/perf/util/session.c +1 -1
@@ -2397,7 +2397,7 @@ int perf_session__cpu_bitmap(struct perf {int i, err =-1 ;struct perf_cpu_map *map; -int nr_cpus =min (session->header.env.nr_cpus_online,MAX_NR_CPUS ); +int nr_cpus =min (session->header.env.nr_cpus_avail,MAX_NR_CPUS );for (i =0 ; i <PERF_TYPE_MAX ; ++i) {struct evsel *evsel;
Greg Kroah-Hartman
maintainerPATCH 113/152 dump_common_audit_data(): fix racy accesses to ->d_name
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit d36a1dd9f77ae1e72da48f4123ed35627848507d upstream.
We are not guaranteed the locking environment that would prevent dentry getting renamed right under us. And it's possible for old long name to be freed after rename, leading to UAF here.
--- security/lsm_audit.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
security/lsm_audit.c +5 -2
@@ -278,7 +278,9 @@ static void dump_common_audit_data(strucstruct inode *inode;audit_log_format (ab," name=" ); +spin_lock (&a->u.dentry->d_lock);audit_log_untrustedstring (ab, a->u.dentry->d_name.name); +spin_unlock (&a->u.dentry->d_lock); inode =d_backing_inode (a->u.dentry);if (inode) {
@@ -297,8 +299,9 @@ static void dump_common_audit_data(struc dentry =d_find_alias (inode);if (dentry) {audit_log_format (ab," name=" ); -audit_log_untrustedstring (ab, - dentry->d_name.name); +spin_lock (&dentry->d_lock); +audit_log_untrustedstring (ab, dentry->d_name.name); +spin_unlock (&dentry->d_lock);dput (dentry); }audit_log_format (ab," dev=" );
Greg Kroah-Hartman
maintainerPATCH 114/152 ASoC: meson: axg-tdm-interface: fix loopback
In reply to Greg Kroah-HartmanFrom: Jerome Brunet <[email protected]>
commit 671ee4db952449acde126965bf76817a3159040d upstream.
When the axg-tdm-interface was introduced, the backend DAI was marked as an endpoint when DPCM was walking the DAPM graph to find a its BE.
It is no longer the case since this
commit 8dd26dff00c0 ("ASoC: dapm: Fix handling of custom_stop_condition on DAPM graph walks") Because of this, when DPCM finds a BE it does everything it needs on the
DAIs but it won't power up the widgets between the FE and the BE if there
is no actual endpoint after the BE.
On meson-axg HWs, the loopback is a special DAI of the tdm-interface BE. It is only linked to the dummy codec since there no actual HW after it.
Quoted 1 line
From the DAPM perspective, the DAI has no endpoint. Because of this, the TDM
decoder, which is a widget between the FE and BE is not powered up.
Quoted 1 line
From the user perspective, everything seems fine but no data is produced.
Connecting the Loopback DAI to a dummy DAPM endpoint solves the problem.
--- sound/soc/meson/axg-tdm-interface.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
sound/soc/meson/axg-tdm-interface.c +13 -1
@@ -467,8 +467,20 @@ static int axg_tdm_iface_set_bias_level(return ret; } +static const struct snd_soc_dapm_widget axg_tdm_iface_dapm_widgets[] = { +SND_SOC_DAPM_SIGGEN ("Playback Signal" ), +}; + +static const struct snd_soc_dapm_route axg_tdm_iface_dapm_routes[] = { + {"Loopback" ,NULL ,"Playback Signal" }, +}; +static const struct snd_soc_component_driver axg_tdm_iface_component_drv = { - .set_bias_level = axg_tdm_iface_set_bias_level, + .dapm_widgets = axg_tdm_iface_dapm_widgets, + .num_dapm_widgets =ARRAY_SIZE (axg_tdm_iface_dapm_widgets), + .dapm_routes = axg_tdm_iface_dapm_routes, + .num_dapm_routes =ARRAY_SIZE (axg_tdm_iface_dapm_routes), + .set_bias_level = axg_tdm_iface_set_bias_level, };static const struct of_device_id axg_tdm_iface_of_match[] = {
Greg Kroah-Hartman
maintainerPATCH 115/152 ASoC: meson: axg-tdmin: fix axg skew offset
In reply to Greg Kroah-HartmanFrom: Jerome Brunet <[email protected]>
commit a84dfb3d55934253de6aed38ad75990278a2d21e upstream.
The signal captured on from tdm decoder of the AXG SoC is incorrect. It appears amplified. The skew offset of the decoder is wrong.
Setting the skew offset to 3, like the g12 and sm1 SoCs, solves and gives correct data.
--- sound/soc/meson/axg-tdmin.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-)
sound/soc/meson/axg-tdmin.c +2 -11
@@ -228,15 +228,6 @@ static const struct axg_tdm_formatter_dr .regmap_cfg = &axg_tdmin_regmap_cfg, .ops = &axg_tdmin_ops, .quirks = &(const struct axg_tdm_formatter_hw ) { - .skew_offset =2 , - }, -}; - -static const struct axg_tdm_formatter_driver g12a_tdmin_drv = { - .component_drv = &axg_tdmin_component_drv, - .regmap_cfg = &axg_tdmin_regmap_cfg, - .ops = &axg_tdmin_ops, - .quirks = &(const struct axg_tdm_formatter_hw ) { .skew_offset =3 , }, };
@@ -247,10 +238,10 @@ static const struct of_device_id axg_tdm .data = &axg_tdmin_drv, }, { .compatible = "amlogic,g12a-tdmin", - .data = &g12a_tdmin_drv, + .data = &axg_tdmin_drv, }, { .compatible = "amlogic,sm1-tdmin", - .data = &g12a_tdmin_drv, + .data = &axg_tdmin_drv, }, {} };MODULE_DEVICE_TABLE (of, axg_tdmin_of_match);
Greg Kroah-Hartman
maintainerPATCH 116/152 ASoC: Intel: fix error code cnl_set_dsp_D0()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit f373a811fd9a69fc8bafb9bcb41d2cfa36c62665 upstream.
Return -ETIMEDOUT if the dsp boot times out instead of returning success.
--- sound/soc/intel/skylake/cnl-sst.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/intel/skylake/cnl-sst.c +1 -0
@@ -224,6 +224,7 @@ static int cnl_set_dsp_D0(struct sst_dsp"dsp boot timeout, status=%#x error=%#x\n" ,sst_dsp_shim_read (ctx,CNL_ADSP_FW_STATUS ), sst_dsp_shim_read(ctx, CNL_ADSP_ERROR_CODE)); + ret = -ETIMEDOUT ; goto err; } }else {
Greg Kroah-Hartman
maintainerPATCH 117/152 nvmet-rdma: Fix NULL deref when setting pi_enable and traddr INADDR_ANY
In reply to Greg Kroah-HartmanFrom: Israel Rukshin <[email protected]>
commit 7a84665619bb5da8c8b6517157875a1fd7632014 upstream.
When setting port traddr to INADDR_ANY, the listening cm_id->device is NULL. The associate IB device is known only when a connect request event arrives, so checking T10-PI device capability should be done at this stage.
--- drivers/nvme/target/rdma.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/nvme/target/rdma.c +8 -8
@@ -1220,6 +1220,14 @@ nvmet_rdma_find_get_device(struct rdma_c } ndev->inline_data_size = nport->inline_data_size; ndev->inline_page_count = inline_page_count; + +if (nport->pi_enable && !(cm_id->device->attrs.device_cap_flags & +IB_DEVICE_INTEGRITY_HANDOVER )) { +pr_warn ("T10-PI is not supported by device %s. Disabling it\n" , + cm_id->device->name); + nport->pi_enable = false; + } + ndev->device = cm_id->device;kref_init (&ndev->ref);
@@ -1855,14 +1863,6 @@ static int nvmet_rdma_enable_port(struct goto out_destroy_id; } -if (port->nport->pi_enable && - !(cm_id->device->attrs.device_cap_flags & -IB_DEVICE_INTEGRITY_HANDOVER )) { -pr_err ("T10-PI is not supported for %pISpcs\n" , addr); - ret = -EINVAL ; - goto out_destroy_id; - } - port->cm_id = cm_id;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 118/152 nvme: dont intialize hwmon for discovery controllers
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
commit 5ab25a32cd90ce561ac28b9302766e565d61304c upstream.
Discovery controllers usually don't support smart log page command.
So when we connect to the discovery controller we see this warning:
nvme nvme0: Failed to read smart log (error 24577)
nvme nvme0: new ctrl: NQN "nqn.2014-08.org.nvmexpress.discovery", addr 192.168.123.1:8009 nvme nvme0: Removing ctrl: NQN "nqn.2014-08.org.nvmexpress.discovery"
Introduce a new helper to understand if the controller is a discovery controller and use this helper to skip nvme_init_hwmon (also use it in other places that we check if the controller is a discovery controller).
--- drivers/nvme/host/core.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/nvme/host/core.c +8 -3
@@ -2802,6 +2802,11 @@ static const struct attribute_group *nvm NULL, }; +static inline bool nvme_discovery_ctrl (struct nvme_ctrl *ctrl) +{ +return ctrl->opts && ctrl->opts->discovery_nqn; +} +static bool nvme_validate_cntlid (struct nvme_subsystem *subsys,struct nvme_ctrl *ctrl,struct nvme_id_ctrl *id) {
@@ -2821,7 +2826,7 @@ static bool nvme_validate_cntlid(struct }if ((id->cmic &NVME_CTRL_CMIC_MULTI_CTRL ) || - (ctrl->opts && ctrl->opts->discovery_nqn)) +nvme_discovery_ctrl (ctrl))continue ; dev_err(ctrl->device,
@@ -3090,7 +3095,7 @@ int nvme_init_identify(struct nvme_ctrl goto out_free; } -if (!ctrl->opts->discovery_nqn && !ctrl->kas) { +if (!nvme_discovery_ctrl (ctrl) && !ctrl->kas) {dev_err (ctrl->device,"keep-alive support is mandatory for fabrics\n" ); ret = -EINVAL ;
@@ -3130,7 +3135,7 @@ int nvme_init_identify(struct nvme_ctrlif (ret <0 )return ret; -if (!ctrl->identified) { +if (!ctrl->identified && !nvme_discovery_ctrl (ctrl)) { ret =nvme_hwmon_init (ctrl);if (ret <0 )return ret;
Greg Kroah-Hartman
maintainerPATCH 119/152 nvme-tcp: fix possible data corruption with bio merges
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
commit ca1ff67d0fb14f39cf0cc5102b1fbcc3b14f6fb9 upstream.
When a bio merges, we can get a request that spans multiple bios, and the overall request payload size is the sum of all bios. When we calculate how much we need to send from the existing bio (and bvec), we did not take into account the iov_iter byte count cap.
Since multipage bvecs support, bvecs can split in the middle which means that when we account for the last bvec send we should also take the iov_iter byte count cap as it might be lower than the last bvec size.
--- drivers/nvme/host/tcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/tcp.c +1 -1
@@ -201,7 +201,7 @@ static inline size_t nvme_tcp_req_cur_ofstatic inline size_t nvme_tcp_req_cur_length (struct nvme_tcp_request *req) { -return min_t (size_t, req->iter.bvec->bv_len - req->iter.iov_offset, +return min_t (size_t,iov_iter_single_seg_count (&req->iter), req->pdu_len - req->pdu_sent); }
Greg Kroah-Hartman
maintainerPATCH 120/152 nvme-tcp: Fix warning with CONFIG_DEBUG_PREEMPT
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
commit ada831772188192243f9ea437c46e37e97a5975d upstream.
We shouldn't call smp_processor_id() in a preemptible context, but this is advisory at best, so instead call __smp_processor_id().
--- drivers/nvme/host/tcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/tcp.c +1 -1
@@ -286,7 +286,7 @@ static inline void nvme_tcp_queue_reques* directly, otherwise queue io_work. Also, only do that if we * are on the same cpu, so we don't introduce contention. */ -if (queue->io_cpu ==smp_processor_id () && +if (queue->io_cpu ==__smp_processor_id () && sync && empty &&mutex_trylock (&queue->send_mutex)) { queue->more_requests = !last;nvme_tcp_send_all (queue);
Greg Kroah-Hartman
maintainerPATCH 121/152 NFS4: Fix use-after-free in trace_event_raw_event_nfs4_set_lock
In reply to Greg Kroah-HartmanFrom: Dave Wysochanski <[email protected]>
commit 3d1a90ab0ed93362ec8ac85cf291243c87260c21 upstream.
It is only safe to call the tracepoint before rpc_put_task() because 'data' is freed inside nfs4_lock_release (rpc_release).
--- fs/nfs/nfs4proc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/nfs4proc.c +1 -1
@@ -7106,9 +7106,9 @@ static int _nfs4_do_setlk(struct nfs4_st data->arg.new_lock_owner, ret); }else data->cancelled = true; +trace_nfs4_set_lock (fl, state, &data->res.stateid, cmd, ret);rpc_put_task (task);dprintk ("%s: done, ret = %d!\n" , __func__, ret); -trace_nfs4_set_lock (fl, state, &data->res.stateid, cmd, ret);return ret; }
Greg Kroah-Hartman
maintainerPATCH 122/152 pNFS: We want return-on-close to complete when evicting the inode
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit 078000d02d57f02dde61de4901f289672e98c8bc upstream.
If the inode is being evicted, it should be safe to run return-on-close, so we should do it to ensure we don't inadvertently leak layout segments.
--- fs/nfs/nfs4proc.c | 26 ++++++++++---------------- fs/nfs/pnfs.c | 8 +++----- fs/nfs/pnfs.h | 8 +++----- 3 files changed, 16 insertions(+), 26 deletions(-)
fs/nfs/nfs4proc.c +10 -16
@@ -3534,10 +3534,8 @@ static void nfs4_close_done(struct rpc_ttrace_nfs4_close (state, &calldata->arg, &calldata->res, task->tk_status);/* Handle Layoutreturn errors */ -if (pnfs_roc_done (task, calldata->inode, - &calldata->arg.lr_args, - &calldata->res.lr_res, - &calldata->res.lr_ret) == -EAGAIN ) +if (pnfs_roc_done (task, &calldata->arg.lr_args, &calldata->res.lr_res, + &calldata->res.lr_ret) == -EAGAIN ) goto out_restart;/* hmm. we are done with the inode, and in the process of freeing
@@ -6379,10 +6377,8 @@ static void nfs4_delegreturn_done(structtrace_nfs4_delegreturn_exit (&data->args, &data->res, task->tk_status);/* Handle Layoutreturn errors */ -if (pnfs_roc_done (task, data->inode, - &data->args.lr_args, - &data->res.lr_res, - &data->res.lr_ret) == -EAGAIN ) +if (pnfs_roc_done (task, &data->args.lr_args, &data->res.lr_res, + &data->res.lr_ret) == -EAGAIN ) goto out_restart;switch (task->tk_status) {
@@ -6436,10 +6432,10 @@ static void nfs4_delegreturn_release(voistruct nfs4_delegreturndata *data = calldata;struct inode *inode = data->inode; +if (data->lr.roc) +pnfs_roc_release (&data->lr.arg, &data->lr.res, + data->res.lr_ret);if (inode) { -if (data->lr.roc) -pnfs_roc_release (&data->lr.arg, &data->lr.res, - data->res.lr_ret);nfs_post_op_update_inode_force_wcc (inode, &data->fattr);nfs_iput_and_deactive (inode); }
@@ -6515,16 +6511,14 @@ static int _nfs4_proc_delegreturn(structnfs_fattr_init (data->res.fattr); data->timestamp = jiffies; data->rpc_status =0 ; - data->lr.roc =pnfs_roc (inode, &data->lr.arg, &data->lr.res, cred); data->inode =nfs_igrab_and_active (inode); -if (data->inode) { +if (data->inode || issync) { + data->lr.roc =pnfs_roc (inode, &data->lr.arg, &data->lr.res, + cred);if (data->lr.roc) { data->args.lr_args = &data->lr.arg; data->res.lr_res = &data->lr.res; } - }else if (data->lr.roc) { -pnfs_roc_release (&data->lr.arg, &data->lr.res,0 ); - data->lr.roc = false; } task_setup_data.callback_data = data;
fs/nfs/pnfs.c +3 -5
@@ -1509,10 +1509,8 @@ out_noroc:return false; } -int pnfs_roc_done (struct rpc_task *task,struct inode *inode, -struct nfs4_layoutreturn_args **argpp, -struct nfs4_layoutreturn_res **respp, -int *ret) +int pnfs_roc_done (struct rpc_task *task,struct nfs4_layoutreturn_args **argpp, +struct nfs4_layoutreturn_res **respp,int *ret) {struct nfs4_layoutreturn_args *arg = *argpp;int retval = -EAGAIN ;
@@ -1545,7 +1543,7 @@ int pnfs_roc_done(struct rpc_task *task,return 0 ;case -NFS4ERR_OLD_STATEID :if (!nfs4_layout_refresh_old_stateid (&arg->stateid, - &arg->range, inode)) + &arg->range, arg->inode))break ; *ret = -NFS4ERR_NOMATCHING_LAYOUT ;return -EAGAIN ;
fs/nfs/pnfs.h +3 -5
@@ -295,10 +295,8 @@ bool pnfs_roc(struct inode *ino,struct nfs4_layoutreturn_args *args, struct nfs4_layoutreturn_res *res, const struct cred *cred); -int pnfs_roc_done (struct rpc_task *task,struct inode *inode, -struct nfs4_layoutreturn_args **argpp, -struct nfs4_layoutreturn_res **respp, -int *ret); +int pnfs_roc_done (struct rpc_task *task,struct nfs4_layoutreturn_args **argpp, +struct nfs4_layoutreturn_res **respp,int *ret);void pnfs_roc_release (struct nfs4_layoutreturn_args *args,struct nfs4_layoutreturn_res *res,int ret);
@@ -770,7 +768,7 @@ pnfs_roc(struct inode *ino, }static inline int -pnfs_roc_done (struct rpc_task *task,struct inode *inode, +pnfs_roc_done (struct rpc_task *task,struct nfs4_layoutreturn_args **argpp,struct nfs4_layoutreturn_res **respp,int *ret)
Greg Kroah-Hartman
maintainerPATCH 123/152 pNFS: Mark layout for return if return-on-close was not sent
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit 67bbceedc9bb8ad48993a8bd6486054756d711f4 upstream.
If the layout return-on-close failed because the layoutreturn was never sent, then we should mark the layout for return again.
--- fs/nfs/pnfs.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/nfs/pnfs.c +6 -0
@@ -1558,12 +1558,18 @@ void pnfs_roc_release(struct nfs4_layout int ret) {struct pnfs_layout_hdr *lo = args->layout; +struct inode *inode = args->inode;const nfs4_stateid *arg_stateid =NULL ;const nfs4_stateid *res_stateid =NULL ;struct nfs4_xdr_opaque_data *ld_private = args->ld_private;switch (ret) {case -NFS4ERR_NOMATCHING_LAYOUT : +spin_lock (&inode->i_lock); +if (pnfs_layout_is_valid (lo) && +nfs4_stateid_match_other (&args->stateid, &lo->plh_stateid)) +pnfs_set_plh_return_info (lo, args->range.iomode,0 ); +spin_unlock (&inode->i_lock);break ;case 0 :if (res->lrs_present)
Greg Kroah-Hartman
maintainerPATCH 124/152 pNFS: Stricter ordering of layoutget and layoutreturn
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit 2c8d5fc37fe2384a9bdb6965443ab9224d46f704 upstream.
If a layout return is in progress, we should wait for it to complete, in case the layout segment we are picking up gets returned too.
--- fs/nfs/pnfs.c | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-)
fs/nfs/pnfs.c +21 -22
@@ -2019,6 +2019,27 @@ lookup_again: goto lookup_again; } +/* +* Because we free lsegs when sending LAYOUTRETURN, we need to wait +* for LAYOUTRETURN. +*/ +if (test_bit (NFS_LAYOUT_RETURN , &lo->plh_flags)) { +spin_unlock (&ino->i_lock); +dprintk ("%s wait for layoutreturn\n" , __func__); + lseg =ERR_PTR (pnfs_prepare_to_retry_layoutget (lo)); +if (!IS_ERR (lseg)) { +pnfs_put_layout_hdr (lo); +dprintk ("%s retrying\n" , __func__); +trace_pnfs_update_layout (ino, pos, count, iomode, lo, + lseg, +PNFS_UPDATE_LAYOUT_RETRY ); + goto lookup_again; + } +trace_pnfs_update_layout (ino, pos, count, iomode, lo, lseg, +PNFS_UPDATE_LAYOUT_RETURN ); + goto out_put_layout_hdr; + } + lseg =pnfs_find_lseg (lo, &arg, strict_iomode);if (lseg) { trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
@@ -2071,28 +2092,6 @@ lookup_again:nfs4_stateid_copy (&stateid, &lo->plh_stateid); } -/* -* Because we free lsegs before sending LAYOUTRETURN, we need to wait -* for LAYOUTRETURN even if first is true. -*/ -if (test_bit (NFS_LAYOUT_RETURN , &lo->plh_flags)) { -spin_unlock (&ino->i_lock); -dprintk ("%s wait for layoutreturn\n" , __func__); - lseg =ERR_PTR (pnfs_prepare_to_retry_layoutget (lo)); -if (!IS_ERR (lseg)) { -if (first) -pnfs_clear_first_layoutget (lo); -pnfs_put_layout_hdr (lo); -dprintk ("%s retrying\n" , __func__); -trace_pnfs_update_layout (ino, pos, count, iomode, lo, - lseg,PNFS_UPDATE_LAYOUT_RETRY ); - goto lookup_again; - } -trace_pnfs_update_layout (ino, pos, count, iomode, lo, lseg, -PNFS_UPDATE_LAYOUT_RETURN ); - goto out_put_layout_hdr; - } -if (pnfs_layoutgets_blocked (lo)) {trace_pnfs_update_layout (ino, pos, count, iomode, lo, lseg,PNFS_UPDATE_LAYOUT_BLOCKED );
Greg Kroah-Hartman
maintainerPATCH 125/152 NFS: Adjust fs_context error logging
In reply to Greg Kroah-HartmanFrom: Scott Mayhew <[email protected]>
commit c98e9daa59a611ff4e163689815f40380c912415 upstream.
Several existing dprink()/dfprintk() calls were converted to use the new mount API logging macros by commit ce8866f0913f ("NFS: Attach supplementary error information to fs_context"). If the fs_context was not created using fsopen() then it will not have had a log buffer allocated for it, and the new mount API logging macros will wind up calling printk().
This can result in syslog messages being logged where previously there were none... most notably "NFS4: Couldn't follow remote path", which can happen if the client is auto-negotiating a protocol version with an NFS server that doesn't support the higher v4.x versions.
Convert the nfs_errorf(), nfs_invalf(), and nfs_warnf() macros to check for the existence of the fs_context's log buffer and call dprintk() if it doesn't exist. Add nfs_ferrorf(), nfs_finvalf(), and nfs_warnf(), which do the same thing but take an NFS debug flag as an argument and call dfprintk(). Finally, modify the "NFS4: Couldn't follow remote path" message to use nfs_ferrorf().
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=207385
--- fs/nfs/internal.h | 26 +++++++++++++++++++++++--- fs/nfs/nfs4super.c | 4 ++-- 2 files changed, 25 insertions(+), 5 deletions(-)
fs/nfs/internal.h +23 -3
@@ -142,9 +142,29 @@ struct nfs_fs_context { } clone_data; }; -#define nfs_errorf (fc, fmt, ...) errorf(fc, fmt, ## __VA_ARGS__) -#define nfs_invalf (fc, fmt, ...) invalf(fc, fmt, ## __VA_ARGS__) -#define nfs_warnf (fc, fmt, ...) warnf(fc, fmt, ## __VA_ARGS__) +#define nfs_errorf (fc, fmt, ...) ((fc)->log.log ? \ + errorf(fc, fmt, ## __VA_ARGS__) : \ + ({ dprintk(fmt "\n", ## __VA_ARGS__); })) + +#define nfs_ferrorf (fc, fac, fmt, ...) ((fc)->log.log ? \ + errorf(fc, fmt, ## __VA_ARGS__) : \ + ({ dfprintk(fac, fmt "\n", ## __VA_ARGS__); })) + +#define nfs_invalf (fc, fmt, ...) ((fc)->log.log ? \ + invalf(fc, fmt, ## __VA_ARGS__) : \ + ({ dprintk(fmt "\n", ## __VA_ARGS__); -EINVAL; })) + +#define nfs_finvalf (fc, fac, fmt, ...) ((fc)->log.log ? \ + invalf(fc, fmt, ## __VA_ARGS__) : \ + ({ dfprintk(fac, fmt "\n", ## __VA_ARGS__); -EINVAL; })) + +#define nfs_warnf (fc, fmt, ...) ((fc)->log.log ? \ + warnf(fc, fmt, ## __VA_ARGS__) : \ + ({ dprintk(fmt "\n", ## __VA_ARGS__); })) + +#define nfs_fwarnf (fc, fac, fmt, ...) ((fc)->log.log ? \ + warnf(fc, fmt, ## __VA_ARGS__) : \ + ({ dfprintk(fac, fmt "\n", ## __VA_ARGS__); }))static inline struct nfs_fs_context *nfs_fc2context (const struct fs_context *fc) {
fs/nfs/nfs4super.c +2 -2
@@ -227,7 +227,7 @@ int nfs4_try_get_tree(struct fs_context fc, ctx->nfs_server.hostname, ctx->nfs_server.export_path);if (err) { -nfs_errorf (fc,"NFS4: Couldn't follow remote path" ); +nfs_ferrorf (fc,MOUNT ,"NFS4: Couldn't follow remote path" );dfprintk (MOUNT ,"<-- nfs4_try_get_tree() = %d [error]\n" , err); }else {dfprintk (MOUNT ,"<-- nfs4_try_get_tree() = 0\n" );
@@ -250,7 +250,7 @@ int nfs4_get_referral_tree(struct fs_con fc, ctx->nfs_server.hostname, ctx->nfs_server.export_path);if (err) { -nfs_errorf (fc,"NFS4: Couldn't follow remote path" ); +nfs_ferrorf (fc,MOUNT ,"NFS4: Couldn't follow remote path" );dfprintk (MOUNT ,"<-- nfs4_get_referral_tree() = %d [error]\n" , err); }else {dfprintk (MOUNT ,"<-- nfs4_get_referral_tree() = 0\n" );
Greg Kroah-Hartman
maintainerPATCH 126/152 NFS/pNFS: Dont call pnfs_free_bucket_lseg() before removing the request
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit 1757655d780d9d29bc4b60e708342e94924f7ef3 upstream.
In pnfs_generic_clear_request_commit(), we try calling pnfs_free_bucket_lseg() before we remove the request from the DS bucket. That will always fail, since the point is to test for whether or not that bucket is empty.
--- fs/nfs/pnfs_nfs.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
fs/nfs/pnfs_nfs.c +5 -9
@@ -78,22 +78,18 @@ void pnfs_generic_clear_request_commit(struct nfs_page *req, struct nfs_commit_info *cinfo) { - struct pnfs_layout_segment *freeme = NULL; + struct pnfs_commit_bucket *bucket = NULL;if (!test_and_clear_bit (PG_COMMIT_TO_DS , &req->wb_flags)) goto out; cinfo->ds->nwritten--; -if (list_is_singular (&req->wb_list)) { -struct pnfs_commit_bucket *bucket; - +if (list_is_singular (&req->wb_list)) bucket =list_first_entry (&req->wb_list, - struct pnfs_commit_bucket, - written); - freeme =pnfs_free_bucket_lseg (bucket); - } + struct pnfs_commit_bucket, written); out:nfs_request_remove_commit_list (req, cinfo); -pnfs_put_lseg (freeme); +if (bucket) +pnfs_put_lseg (pnfs_free_bucket_lseg (bucket)); }EXPORT_SYMBOL_GPL (pnfs_generic_clear_request_commit);
Greg Kroah-Hartman
maintainerPATCH 127/152 NFS/pNFS: Dont leak DS commits in pnfs_generic_retry_commit()
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit 46c9ea1d4fee4cf1f8cc6001b9c14aae61b3d502 upstream.
We must ensure that we pass a layout segment to nfs_retry_commit() when we're cleaning up after pnfs_bucket_alloc_ds_commits(). Otherwise, requests that should be committed to the DS will get committed to the MDS.
Do so by ensuring that pnfs_bucket_get_committing() always tries to return a layout segment when it returns a non-empty page list.
--- fs/nfs/pnfs_nfs.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
fs/nfs/pnfs_nfs.c +5 -3
@@ -403,12 +403,16 @@ pnfs_bucket_get_committing(struct list_hstruct pnfs_commit_bucket *bucket, struct nfs_commit_info *cinfo) { + struct pnfs_layout_segment *lseg;struct list_head *pos;list_for_each (pos, &bucket->committing) cinfo->ds->ncommitting--;list_splice_init (&bucket->committing, head); -return pnfs_free_bucket_lseg (bucket); + lseg =pnfs_free_bucket_lseg (bucket); +if (!lseg) + lseg =pnfs_get_lseg (bucket->lseg); +return lseg; } static struct nfs_commit_data *
@@ -420,8 +424,6 @@ pnfs_bucket_fetch_commitdata(struct pnfsif (!data)return NULL ; data->lseg =pnfs_bucket_get_committing (&data->pages, bucket, cinfo); -if (!data->lseg) - data->lseg =pnfs_get_lseg (bucket->lseg);return data; }
Greg Kroah-Hartman
maintainerPATCH 128/152 NFS/pNFS: Fix a leak of the layout plh_outstanding counter
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit cb2856c5971723910a86b7d1d0cf623d6919cbc4 upstream.
If we exit _lgopen_prepare_attached() without setting a layout, we will currently leak the plh_outstanding counter.
--- fs/nfs/pnfs.c | 1 + 1 file changed, 1 insertion(+)
fs/nfs/pnfs.c +1 -0
@@ -2245,6 +2245,7 @@ static void _lgopen_prepare_attached(str &rng, GFP_KERNEL);if (!lgp) {pnfs_clear_first_layoutget (lo); +nfs_layoutget_end (lo);pnfs_put_layout_hdr (lo);return ; }
Greg Kroah-Hartman
maintainerPATCH 129/152 NFS: nfs_delegation_find_inode_server must first reference the superblock
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit 113aac6d567bda783af36d08f73bfda47d8e9a40 upstream.
Before referencing the inode, we must ensure that the superblock can be referenced. Otherwise, we can end up with iput() calling superblock operations that are no longer valid or accessible.
--- fs/nfs/delegation.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/nfs/delegation.c +7 -5
@@ -1011,22 +1011,24 @@ nfs_delegation_find_inode_server(struct const struct nfs_fh *fhandle) {struct nfs_delegation *delegation; -struct inode *freeme, *res =NULL ; +struct super_block *freeme =NULL ; +struct inode *res =NULL ;list_for_each_entry_rcu (delegation, &server->delegations, super_list) {spin_lock (&delegation->lock);if (delegation->inode !=NULL && !test_bit (NFS_DELEGATION_REVOKED , &delegation->flags) &&nfs_compare_fh (fhandle, &NFS_I (delegation->inode)->fh) ==0 ) { - freeme =igrab (delegation->inode); -if (freeme &&nfs_sb_active (freeme->i_sb)) - res = freeme; +if (nfs_sb_active (server->super)) { + freeme = server->super; + res =igrab (delegation->inode); + }spin_unlock (&delegation->lock);if (res !=NULL )return res;if (freeme) {rcu_read_unlock (); -iput (freeme); +nfs_sb_deactive (freeme);rcu_read_lock (); }return ERR_PTR (-EAGAIN );
Greg Kroah-Hartman
maintainerPATCH 130/152 NFS: nfs_igrab_and_active must first reference the superblock
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit 896567ee7f17a8a736cda8a28cc987228410a2ac upstream.
Before referencing the inode, we must ensure that the superblock can be referenced. Otherwise, we can end up with iput() calling superblock operations that are no longer valid or accessible.
--- fs/nfs/internal.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/nfs/internal.h +7 -5
@@ -605,12 +605,14 @@ extern void nfs4_test_session_trunk(strustatic inline struct inode *nfs_igrab_and_active (struct inode *inode) { - inode =igrab (inode); -if (inode !=NULL && !nfs_sb_active (inode->i_sb)) { -iput (inode); - inode =NULL ; +struct super_block *sb = inode->i_sb; + +if (sb &&nfs_sb_active (sb)) { +if (igrab (inode)) +return inode; +nfs_sb_deactive (sb); } -return inode; +return NULL ; }static inline void nfs_iput_and_deactive (struct inode *inode)
Greg Kroah-Hartman
maintainerPATCH 131/152 scsi: ufs: Fix possible power drain during system suspend
In reply to Greg Kroah-HartmanFrom: Stanley Chu <[email protected]>
commit 1d53864c3617f5235f891ca0fbe9347c4cd35d46 upstream.
Currently if device needs to do flush or BKOP operations, the device VCC power is kept during runtime-suspend period.
However, if system suspend is happening while device is runtime-suspended, such power may not be disabled successfully.
The reasons may be,
1. If current PM level is the same as SPM level, device will keep runtime-suspended by ufshcd_system_suspend().
2. Flush recheck work may not be scheduled successfully during system suspend period. If it can wake up the system, this is also not the intention of the recheck work.
To fix this issue, simply runtime-resume the device if the flush is allowed during runtime suspend period. Flush capability will be disabled while leaving runtime suspend, and also not be allowed in system suspend period.
--- drivers/scsi/ufs/ufshcd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/ufs/ufshcd.c +2 -1
@@ -8818,7 +8818,8 @@ int ufshcd_system_suspend(struct ufs_hbaif ((ufs_get_pm_lvl_to_dev_pwr_mode (hba->spm_lvl) == hba->curr_dev_pwr_mode) && (ufs_get_pm_lvl_to_link_pwr_state (hba->spm_lvl) == - hba->uic_link_state)) + hba->uic_link_state) && + !hba->dev_info.b_rpm_dev_flush_capable) goto out;if (pm_runtime_suspended (hba->dev)) {
Greg Kroah-Hartman
maintainerPATCH 132/152 ext4: fix superblock checksum failure when setting password salt
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
commit dfd56c2c0c0dbb11be939b804ddc8d5395ab3432 upstream.
When setting password salt in the superblock, we forget to recompute the superblock checksum so it will not match until the next superblock modification which recomputes the checksum. Fix it.
--- fs/ext4/ioctl.c | 3 +++ 1 file changed, 3 insertions(+)
fs/ext4/ioctl.c +3 -0
@@ -1157,7 +1157,10 @@ resizefs_out: err =ext4_journal_get_write_access (handle, sbi->s_sbh);if (err) goto pwsalt_err_journal; +lock_buffer (sbi->s_sbh);generate_random_uuid (sbi->s_es->s_encrypt_pw_salt); +ext4_superblock_csum_set (sb); +unlock_buffer (sbi->s_sbh); err =ext4_handle_dirty_metadata (handle,NULL , sbi->s_sbh); pwsalt_err_journal:
Greg Kroah-Hartman
maintainerPATCH 133/152 RDMA/restrack: Dont treat as an error allocation ID wrapping
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
commit 3c638cdb8ecc0442552156e0fed8708dd2c7f35b upstream.
xa_alloc_cyclic() call returns positive number if ID allocation succeeded but wrapped. It is not an error, so normalize the "ret" variable to zero as marker of not-an-error.
drivers/infiniband/core/restrack.c:261 rdma_restrack_add()
warn: 'ret' can be either negative or positive
--- drivers/infiniband/core/restrack.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/core/restrack.c +1 -0
@@ -244,6 +244,7 @@ void rdma_restrack_add(struct rdma_restr }else { ret =xa_alloc_cyclic (&rt->xa, &res->id, res, xa_limit_32b, &rt->next_id,GFP_KERNEL ); + ret = (ret <0 ) ? ret :0 ; }if (!ret)
Greg Kroah-Hartman
maintainerPATCH 134/152 RDMA/usnic: Fix memleak in find_free_vf_and_create_qp_grp
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
commit a306aba9c8d869b1fdfc8ad9237f1ed718ea55e6 upstream.
If usnic_ib_qp_grp_create() fails at the first call, dev_list will not be freed on error, which leads to memleak.
--- drivers/infiniband/hw/usnic/usnic_ib_verbs.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/hw/usnic/usnic_ib_verbs.c +3 -0
@@ -214,6 +214,7 @@ find_free_vf_and_create_qp_grp(struct us }usnic_uiom_free_dev_list (dev_list); + dev_list =NULL ; }/* Try to find resources on an unused vf */
@@ -239,6 +240,8 @@ find_free_vf_and_create_qp_grp(struct us qp_grp_check:if (IS_ERR_OR_NULL (qp_grp)) {usnic_err ("Failed to allocate qp_grp\n" ); +if (usnic_ib_share_vf) +usnic_uiom_free_dev_list (dev_list);return ERR_PTR (qp_grp ?PTR_ERR (qp_grp) : -ENOMEM ); }return qp_grp;
Greg Kroah-Hartman
maintainerPATCH 135/152 bnxt_en: Improve stats context resource accounting with RDMA driver loaded.
In reply to Greg Kroah-HartmanFrom: Michael Chan <[email protected]>
commit 869c4d5eb1e6fbda66aa790c48bdb946d71494a0 upstream.
The function bnxt_get_ulp_stat_ctxs() does not count the stats contexts used by the RDMA driver correctly when the RDMA driver is freeing the MSIX vectors. It assumes that if the RDMA driver is registered, the additional stats contexts will be needed. This is not true when the RDMA driver is about to unregister and frees the MSIX vectors.
This slight error leads to over accouting of the stats contexts needed after the RDMA driver has unloaded. This will cause some firmware warning and error messages in dmesg during subsequent config. changes or ifdown/ifup.
Fix it by properly accouting for extra stats contexts only if the RDMA driver is registered and MSIX vectors have been successfully requested.
--- drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +6 -2
@@ -222,8 +222,12 @@ int bnxt_get_ulp_msix_base(struct bnxt *int bnxt_get_ulp_stat_ctxs (struct bnxt *bp) { -if (bnxt_ulp_registered (bp->edev,BNXT_ROCE_ULP )) -return BNXT_MIN_ROCE_STAT_CTXS ; +if (bnxt_ulp_registered (bp->edev,BNXT_ROCE_ULP )) { +struct bnxt_en_dev *edev = bp->edev; + +if (edev->ulp_tbl[BNXT_ROCE_ULP ].msix_requested) +return BNXT_MIN_ROCE_STAT_CTXS ; + }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 136/152 RDMA/mlx5: Fix wrong free of blue flame register on error
In reply to Greg Kroah-HartmanFrom: Mark Bloch <[email protected]>
commit 1c3aa6bd0b823105c2030af85d92d158e815d669 upstream.
If the allocation of the fast path blue flame register fails, the driver should free the regular blue flame register allocated a statement above, not the one that it just failed to allocate.
--- drivers/infiniband/hw/mlx5/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/mlx5/main.c +1 -1
@@ -4362,7 +4362,7 @@ static int mlx5_ib_stage_bfrag_init(stru err =mlx5_alloc_bfreg (dev->mdev, &dev->fp_bfreg, false, true);if (err) -mlx5_free_bfreg (dev->mdev, &dev->fp_bfreg); +mlx5_free_bfreg (dev->mdev, &dev->bfreg);return err; }
Greg Kroah-Hartman
maintainerPATCH 137/152 IB/mlx5: Fix error unwinding when set_has_smi_cap fails
In reply to Greg Kroah-HartmanFrom: Parav Pandit <[email protected]>
commit 2cb091f6293df898b47f4e0f2e54324e2bbaf816 upstream.
When set_has_smi_cap() fails, multiport master cleanup is missed. Fix it by doing the correct error unwinding goto.
--- drivers/infiniband/hw/mlx5/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/mlx5/main.c +1 -1
@@ -3950,7 +3950,7 @@ static int mlx5_ib_stage_init_init(struc err =set_has_smi_cap (dev);if (err) -return err; + goto err_mp;if (!mlx5_core_mp_enabled (mdev)) {for (i =1 ; i <= dev->num_ports; i++) {
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.9 release. There are 152 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 Wed, 20 Jan 2021 11:33:23 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.9-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
Summary
------------------------------------------------------------------------
kernel: 5.10.9-rc1
git repo: ['https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git', 'https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc']
git branch: linux-5.10.y
git commit: 293595df2bc42c77b0150d51073b49e09bb0d213
git describe: v5.10.8-153-g293595df2bc4
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.10.y/build/v5.10.8-153-g293595df2bc4
No regressions (compared to build v5.10.7-104-gc6e710bf849b)
fixes (compared to build v5.10.7-104-gc6e710bf849b)
------------------------------------------------------------------------
mips:
build:
* clang-10-allnoconfig
* clang-10-tinyconfig
* clang-11-allnoconfig
* clang-11-tinyconfig
Ran 57479 total tests in the following environments and test suites.
Environments
--------------
- arc
- arm
- arm64
- dragonboard-410c
- hi6220-hikey
- i386
- juno-r2
- juno-r2-compat
- juno-r2-kasan
- mips
- nxp-ls2088
- parisc
- powerpc
- qemu-arm-clang
- qemu-arm64-clang
- qemu-arm64-kasan
- qemu-i386-clang
- qemu-x86_64-clang
- qemu-x86_64-kasan
- qemu-x86_64-kcsan
- qemu_arm
- qemu_arm64
- qemu_arm64-compat
- qemu_i386
- qemu_x86_64
- qemu_x86_64-compat
- riscv
- s390
- sh
- sparc
- x15
- x86
- x86-kasan
- x86_64
Test Suites
-----------
* build
* linux-log-parser
* igt-gpu-tools
* install-android-platform-tools-r2600
* kselftest
* ltp-cap_bounds-tests
* ltp-containers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-ipc-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* v4l2-compliance
* fwts
* libhugetlbfs
* ltp-commands-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fs-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-math-tests
* ltp-mm-tests
* network-basic-tests
* ltp-controllers-tests
* ltp-open-posix-tests
* perf
* kvm-unit-tests
* kunit
* rcutorture
* kselftest-vsyscall-mode-none
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Greg Kroah-Hartman
maintainerQuoted 17 lines · Naresh Kamboju
Quoted 15 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.9 release. There are 152 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 Wed, 20 Jan 2021 11:33:23 +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.9-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.
Quoted 8 lines
Quoted 3 lines
thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm,x86_64, and i386.
Thanks for testing these and letting me know.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 138/152 umount(2): move the flag validity checks first
In reply to Greg Kroah-HartmanFrom: Al Viro <[email protected]>
commit a0a6df9afcaf439a6b4c88a3b522e3d05fdef46f upstream.
Unfortunately, there's userland code that used to rely upon these checks being done before anything else to check for UMOUNT_NOFOLLOW support. That broke in 41525f56e256 ("fs: refactor ksys_umount"). Separate those from the rest of checks and move them to ksys_umount(); unlike everything else in there, this can be sanely done there.
--- fs/namespace.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/namespace.c +5 -2
@@ -1713,8 +1713,6 @@ static int can_umount(const struct path {struct mount *mnt =real_mount (path->mnt); -if (flags & ~(MNT_FORCE |MNT_DETACH |MNT_EXPIRE |UMOUNT_NOFOLLOW )) -return -EINVAL ;if (!may_mount ())return -EPERM ;if (path->dentry != path->mnt->mnt_root)
@@ -1728,6 +1726,7 @@ static int can_umount(const struct pathreturn 0 ; } +// caller is responsible for flags being sane int path_umount (struct path *path,int flags) {struct mount *mnt =real_mount (path->mnt);
@@ -1749,6 +1748,10 @@ static int ksys_umount(char __user *namestruct path path;int ret; +// basic validity checks done first +if (flags & ~(MNT_FORCE |MNT_DETACH |MNT_EXPIRE |UMOUNT_NOFOLLOW )) +return -EINVAL ; +if (!(flags &UMOUNT_NOFOLLOW )) lookup_flags |=LOOKUP_FOLLOW ; ret =user_path_at (AT_FDCWD , name, lookup_flags, &path);
Greg Kroah-Hartman
maintainerPATCH 139/152 dm zoned: select CONFIG_CRC32
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit b690bd546b227c32b860dae985a18bed8aa946fe upstream.
Without crc32 support, this driver fails to link:
arm-linux-gnueabi-ld: drivers/md/dm-zoned-metadata.o: in function `dmz_write_sb':
dm-zoned-metadata.c:(.text+0xe98): undefined reference to `crc32_le'
arm-linux-gnueabi-ld: drivers/md/dm-zoned-metadata.o: in function `dmz_check_sb':
dm-zoned-metadata.c:(.text+0x7978): undefined reference to `crc32_le'
--- drivers/md/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/md/Kconfig +1 -0
@@ -602,6 +602,7 @@ config DM_ZONED tristate "Drive-managed zoned block device target support" depends on BLK_DEV_DM depends on BLK_DEV_ZONED + select CRC32 help This device-mapper target takes a host-managed or host-aware zoned block device and exposes most of its capacity as a regular block
Greg Kroah-Hartman
maintainerPATCH 140/152 drm/i915/dsi: Use unconditional msleep for the panel_on_delay when there is no reset-deassert MIPI-sequence
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
commit 00cb645fd7e29bdd20967cd20fa8f77bcdf422f9 upstream.
Commit 25b4620ee822 ("drm/i915/dsi: Skip delays for v3 VBTs in vid-mode") added an intel_dsi_msleep() helper which skips sleeping if the MIPI-sequences have a version of 3 or newer and the panel is in vid-mode; and it moved a bunch of msleep-s over to this new helper.
This was based on my reading of the big comment around line 730 which starts with "Panel enable/disable sequences from the VBT spec.", where the "v3 video mode seq" column does not have any wait t# entries.
Given that this code has been used on a lot of different devices without issues until now, it seems that my interpretation of the spec here is mostly correct.
But now I have encountered one device, an Acer Aspire Switch 10 E SW3-016, where the panel will not light up unless we do actually honor the panel_on_delay after exexuting the MIPI_SEQ_PANEL_ON sequence.
What seems to set this model apart is that it is lacking a MIPI_SEQ_DEASSERT_RESET sequence, which is where the power-on delay usually happens.
Fix the panel not lighting up on this model by using an unconditional msleep(panel_on_delay) instead of intel_dsi_msleep() when there is no MIPI_SEQ_DEASSERT_RESET sequence.
--- drivers/gpu/drm/i915/display/vlv_dsi.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/display/vlv_dsi.c +13 -3
@@ -812,10 +812,20 @@ static void intel_dsi_pre_enable(structintel_dsi_prepare (encoder, pipe_config);intel_dsi_vbt_exec_sequence (intel_dsi,MIPI_SEQ_POWER_ON ); -intel_dsi_msleep (intel_dsi, intel_dsi->panel_on_delay); -/* Deassert reset */ -intel_dsi_vbt_exec_sequence (intel_dsi,MIPI_SEQ_DEASSERT_RESET ); +/* +* Give the panel time to power-on and then deassert its reset. +* Depending on the VBT MIPI sequences version the deassert-seq +* may contain the necessary delay, intel_dsi_msleep() will skip +* the delay in that case. If there is no deassert-seq, then an +* unconditional msleep is used to give the panel time to power-on. +*/ +if (dev_priv->vbt.dsi.sequence[MIPI_SEQ_DEASSERT_RESET ]) { +intel_dsi_msleep (intel_dsi, intel_dsi->panel_on_delay); +intel_dsi_vbt_exec_sequence (intel_dsi,MIPI_SEQ_DEASSERT_RESET ); + }else { +msleep (intel_dsi->panel_on_delay); + }if (IS_GEMINILAKE (dev_priv)) { glk_cold_boot =glk_dsi_enable_io (encoder);
Greg Kroah-Hartman
maintainerPATCH 141/152 drm/i915/icl: Fix initing the DSI DSC power refcount during HW readout
In reply to Greg Kroah-HartmanFrom: Imre Deak <[email protected]>
commit 2af5268180410b874fc06be91a1b2fbb22b1be0c upstream.
For an enabled DSC during HW readout the corresponding power reference is taken along the CRTC power domain references in get_crtc_power_domains(). Remove the incorrect get ref from the DSI encoder hook.
--- drivers/gpu/drm/i915/display/icl_dsi.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/gpu/drm/i915/display/icl_dsi.c +0 -4
@@ -1585,10 +1585,6 @@ static void gen11_dsi_get_power_domains(get_dsi_io_power_domains (i915,enc_to_intel_dsi (encoder)); - -if (crtc_state->dsc.compression_enable) -intel_display_power_get (i915, -intel_dsc_power_domain (crtc_state)); } static bool gen11_dsi_get_hw_state(struct intel_encoder *encoder,
Greg Kroah-Hartman
maintainerPATCH 142/152 drm/i915/gt: Restore clear-residual mitigations for Ivybridge, Baytrail
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
commit 09aa9e45863e9e25dfbf350bae89fc3c2964482c upstream.
The mitigation is required for all gen7 platforms, now that it does not cause GPU hangs, restore it for Ivybridge and Baytrail.
--- drivers/gpu/drm/i915/gt/intel_ring_submission.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/gt/intel_ring_submission.c +1 -1
@@ -1291,7 +1291,7 @@ int intel_ring_submission_setup(struct iGEM_BUG_ON (timeline->hwsp_ggtt != engine->status_page.vma); -if (IS_HASWELL (engine->i915) && engine->class ==RENDER_CLASS ) { +if (IS_GEN (engine->i915,7 ) && engine->class ==RENDER_CLASS ) { err =gen7_ctx_switch_bb_init (engine);if (err) goto err_ring_unpin;
Greg Kroah-Hartman
maintainerPATCH 143/152 mm, slub: consider rest of partial list if acquire_slab() fails
In reply to Greg Kroah-HartmanFrom: Jann Horn <[email protected]>
commit 8ff60eb052eeba95cfb3efe16b08c9199f8121cf upstream.
acquire_slab() fails if there is contention on the freelist of the page (probably because some other CPU is concurrently freeing an object from the page). In that case, it might make sense to look for a different page (since there might be more remote frees to the page from other CPUs, and we don't want contention on struct page).
However, the current code accidentally stops looking at the partial list completely in that case. Especially on kernels without CONFIG_NUMA set, this means that get_partial() fails and new_slab_objects() falls back to new_slab(), allocating new pages. This could lead to an unnecessary increase in memory fragmentation.
--- mm/slub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/slub.c +1 -1
@@ -1971,7 +1971,7 @@ static void *get_partial_node(struct kme t =acquire_slab (s, n, page, object ==NULL , &objects);if (!t) -break ; +continue ;/* cmpxchg raced */ available += objects;if (!object) {
Greg Kroah-Hartman
maintainerPATCH 144/152 riscv: Trace irq on only interrupt is enabled
In reply to Greg Kroah-HartmanFrom: Atish Patra <[email protected]>
commit 7cd1af107a92eb63b93a96dc07406dcbc5269436 upstream.
We should call irq trace only if interrupt is going to be enabled during excecption handling. Otherwise, it results in following warning during boot with lock debugging enabled.
[ 0.000000] ------------[ cut here ]------------ [ 0.000000] DEBUG_LOCKS_WARN_ON(early_boot_irqs_disabled) [ 0.000000] WARNING: CPU: 0 PID: 0 at kernel/locking/lockdep.c:4085 lockdep_hardirqs_on_prepare+0x22a/0x22e [ 0.000000] Modules linked in: [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 5.10.0-00022-ge20097fb37e2-dirty #548 [ 0.000000] epc: c005d5d4 ra : c005d5d4 sp : c1c01e80 [ 0.000000] gp : c1d456e0 tp : c1c0a980 t0 : 00000000 [ 0.000000] t1 : ffffffff t2 : 00000000 s0 : c1c01ea0 [ 0.000000] s1 : c100f360 a0 : 0000002d a1 : c00666ee [ 0.000000] a2 : 00000000 a3 : 00000000 a4 : 00000000 [ 0.000000] a5 : 00000000 a6 : c1c6b390 a7 : 3ffff00e [ 0.000000] s2 : c2384fe8 s3 : 00000000 s4 : 00000001 [ 0.000000] s5 : c1c0a980 s6 : c1d48000 s7 : c1613b4c [ 0.000000] s8 : 00000fff s9 : 80000200 s10: c1613b40 [ 0.000000] s11: 00000000 t3 : 00000000 t4 : 00000000 [ 0.000000] t5 : 00000001 t6 : 00000000
--- arch/riscv/kernel/entry.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/riscv/kernel/entry.S +3 -3
@@ -124,15 +124,15 @@ skip_context_tracking: REG_L a1, (a1) jr a1 1: -#ifdef CONFIG_TRACE_IRQFLAGS - call trace_hardirqs_on -#endif /* * Exceptions run with interrupts enabled or disabled depending on the * state of SR_PIE in m/sstatus. */ andi t0, s1, SR_PIE beqz t0, 1f +#ifdef CONFIG_TRACE_IRQFLAGS + call trace_hardirqs_on +#endif csrs CSR_STATUS, SR_IE 1:
Greg Kroah-Hartman
maintainerPATCH 145/152 iommu/vt-d: Fix unaligned addresses for intel_flush_svm_range_dev()
In reply to Greg Kroah-HartmanFrom: Lu Baolu <[email protected]>
commit 2d6ffc63f12417b979955a5b22ad9a76d2af5de9 upstream.
The VT-d hardware will ignore those Addr bits which have been masked by the AM field in the PASID-based-IOTLB invalidation descriptor. As the result, if the starting address in the descriptor is not aligned with the address mask, some IOTLB caches might not invalidate. Hence people will see below errors.
[ 1093.704661] dmar_fault: 29 callbacks suppressed
[ 1093.704664] DMAR: DRHD: handling fault status reg 3
[ 1093.712738] DMAR: [DMA Read] Request device [7a:02.0] PASID 2
fault addr 7f81c968d000 [fault reason 113]
SM: Present bit in first-level paging entry is clearFix this by using aligned address for PASID-based-IOTLB invalidation.
--- drivers/iommu/intel/svm.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-)
drivers/iommu/intel/svm.c +20 -2
@@ -118,8 +118,10 @@ void intel_svm_check(struct intel_iommu iommu->flags |=VTD_FLAG_SVM_CAPABLE ; } -static void intel_flush_svm_range_dev (struct intel_svm *svm,struct intel_svm_dev *sdev, -unsigned long address,unsigned long pages,int ih) +static void __flush_svm_range_dev (struct intel_svm *svm, +struct intel_svm_dev *sdev, +unsigned long address, +unsigned long pages,int ih) {struct qi_desc desc;
@@ -170,6 +172,22 @@ static void intel_flush_svm_range_dev (s } } +static void intel_flush_svm_range_dev (struct intel_svm *svm, +struct intel_svm_dev *sdev, +unsigned long address, +unsigned long pages,int ih) +{ +unsigned long shift =ilog2 (__roundup_pow_of_two (pages)); +unsigned long align = (1ULL << (VTD_PAGE_SHIFT + shift)); +unsigned long start =ALIGN_DOWN (address, align); +unsigned long end =ALIGN (address + (pages <<VTD_PAGE_SHIFT ), align); + +while (start < end) { +__flush_svm_range_dev (svm, sdev, start, align >>VTD_PAGE_SHIFT , ih); + start += align; + } +} +static void intel_flush_svm_range (struct intel_svm *svm,unsigned long address,unsigned long pages,int ih) {
Greg Kroah-Hartman
maintainerPATCH 146/152 net: sunrpc: interpret the return value of kstrtou32 correctly
In reply to Greg Kroah-HartmanFrom: [email protected] <[email protected]>
commit 86b53fbf08f48d353a86a06aef537e78e82ba721 upstream.
A return value of 0 means success. This is documented in lib/kstrtox.c.
This was found by trying to mount an NFS share from a link-local IPv6 address with the interface specified by its index:
mount("[fe80::1%1]:/srv/nfs", "/mnt", "nfs", 0, "nolock,addr=fe80::1%1")
Before this commit this failed with EINVAL and also caused the following message in dmesg:
[...] NFS: bad IP address specified: addr=fe80::1%1
The syscall using the same address based on the interface name instead of its index succeeds.
Credits for this patch go to my colleague Christian Speich, who traced the origin of this bug to this line of code.
--- net/sunrpc/addr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sunrpc/addr.c +1 -1
@@ -185,7 +185,7 @@ static int rpc_parse_scope_id(struct net scope_id = dev->ifindex;dev_put (dev); }else { -if (kstrtou32 (p,10 , &scope_id) ==0 ) { +if (kstrtou32 (p,10 , &scope_id) !=0 ) {kfree (p);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 147/152 selftests: netfilter: Pass family parameter "-f" to conntrack tool
In reply to Greg Kroah-HartmanFrom: Chen Yi <[email protected]>
commit fab336b42441e0b2eb1d81becedb45fbdf99606e upstream.
Fix nft_conntrack_helper.sh false fail report:
1) Conntrack tool need "-f ipv6" parameter to show out ipv6 traffic items.
2) Sleep 1 second after background nc send packet, to make sure check is after this statement executed.
False report:
FAIL: ns1-lkjUemYw did not show attached helper ip set via ruleset
PASS: ns1-lkjUemYw connection on port 2121 has ftp helper attached
...
After fix:
PASS: ns1-2hUniwU2 connection on port 2121 has ftp helper attached
PASS: ns2-2hUniwU2 connection on port 2121 has ftp helper attached
...
--- tools/testing/selftests/netfilter/nft_conntrack_helper.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
tools/testing/selftests/netfilter/nft_conntrack_helper.sh +9 -3
@@ -94,7 +94,13 @@ check_for_helper() local message=$2 local port=$3 - ip netns exec ${netns} conntrack -L -p tcp --dport $port 2> /dev/null |grep -q 'helper=ftp' + if echo $message |grep -q 'ipv6';then + local family="ipv6" + else + local family="ipv4" + fi + + ip netns exec ${netns} conntrack -L -f $family -p tcp --dport $port 2> /dev/null |grep -q 'helper=ftp' if [ $? -ne 0 ] ; then echo "FAIL: ${netns} did not show attached helper $message" 1>&2 ret=1
@@ -111,8 +117,8 @@ test_helper() sleep 3 | ip netns exec ${ns2} nc -w 2 -l -p $port > /dev/null & - sleep 1 sleep 1 | ip netns exec ${ns1} nc -w 2 10.0.1.2 $port > /dev/null & + sleep 1 check_for_helper "$ns1" "ip $msg" $port check_for_helper "$ns2" "ip $msg" $port
@@ -128,8 +134,8 @@ test_helper() sleep 3 | ip netns exec ${ns2} nc -w 2 -6 -l -p $port > /dev/null & - sleep 1 sleep 1 | ip netns exec ${ns1} nc -w 2 -6 dead:1::2 $port > /dev/null & + sleep 1 check_for_helper "$ns1" "ipv6 $msg" $port check_for_helper "$ns2" "ipv6 $msg" $port
Greg Kroah-Hartman
maintainerPATCH 148/152 dm: eliminate potential source of excessive kernel log noise
In reply to Greg Kroah-HartmanFrom: Mike Snitzer <[email protected]>
commit 0378c625afe80eb3f212adae42cc33c9f6f31abf upstream.
There wasn't ever a real need to log an error in the kernel log for ioctls issued with insufficient permissions. Simply return an error and if an admin/user is sufficiently motivated they can enable DM's dynamic debugging to see an explanation for why the ioctls were disallowed.
--- drivers/md/dm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/dm.c +1 -1
@@ -562,7 +562,7 @@ static int dm_blk_ioctl(struct block_dev* subset of the parent bdev; require extra privileges. */ if (!capable (CAP_SYS_RAWIO )) { -DMWARN_LIMIT ( +DMDEBUG_LIMIT ("%s: sending ioctl %x to DM device without required privilege." , current->comm, cmd); r = -ENOIOCTLCMD ;
Greg Kroah-Hartman
maintainerPATCH 149/152 ALSA: fireface: Fix integer overflow in transmit_midi_msg()
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
commit e7c22eeaff8565d9a8374f320238c251ca31480b upstream.
As snd_ff.rx_bytes[] is unsigned int, and NSEC_PER_SEC is 1000000000L, the second multiplication in
ff->rx_bytes[port] * 8 * NSEC_PER_SEC / 31250
always overflows on 32-bit platforms, truncating the result. Fix this by precalculating "NSEC_PER_SEC / 31250", which is an integer constant.
Note that this assumes ff->rx_bytes[port] <= 16777.
--- sound/firewire/fireface/ff-transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/firewire/fireface/ff-transaction.c +1 -1
@@ -88,7 +88,7 @@ static void transmit_midi_msg(struct snd/* Set interval to next transaction. */ ff->next_ktime[port] =ktime_add_ns (ktime_get (), - ff->rx_bytes[port] *8 *NSEC_PER_SEC /31250 ); + ff->rx_bytes[port] *8 * (NSEC_PER_SEC /31250 ));if (quad_count ==1 ) tcode =TCODE_WRITE_QUADLET_REQUEST ;
Greg Kroah-Hartman
maintainerPATCH 150/152 ALSA: firewire-tascam: Fix integer overflow in midi_port_work()
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
commit 9f65df9c589f249435255da37a5dd11f1bc86f4d upstream.
As snd_fw_async_midi_port.consume_bytes is unsigned int, and NSEC_PER_SEC is 1000000000L, the second multiplication in
port->consume_bytes * 8 * NSEC_PER_SEC / 31250
always overflows on 32-bit platforms, truncating the result. Fix this by precalculating "NSEC_PER_SEC / 31250", which is an integer constant.
Note that this assumes port->consume_bytes <= 16777.
--- sound/firewire/tascam/tascam-transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/firewire/tascam/tascam-transaction.c +1 -1
@@ -209,7 +209,7 @@ static void midi_port_work(struct work_s/* Set interval to next transaction. */ port->next_ktime =ktime_add_ns (ktime_get (), - port->consume_bytes *8 *NSEC_PER_SEC /31250 ); + port->consume_bytes *8 * (NSEC_PER_SEC /31250 ));/* Start this transaction. */ port->idling = false;
Greg Kroah-Hartman
maintainerPATCH 151/152 netfilter: conntrack: fix reading nf_conntrack_buckets
In reply to Greg Kroah-HartmanFrom: Jesper Dangaard Brouer <[email protected]>
commit f6351c3f1c27c80535d76cac2299aec44c36291e upstream.
The old way of changing the conntrack hashsize runtime was through changing the module param via file /sys/module/nf_conntrack/parameters/hashsize. This was extended to sysctl change in commit 3183ab8997a4 ("netfilter: conntrack:
allow increasing bucket size via sysctl too").
The commit introduced second "user" variable nf_conntrack_htable_size_user which shadow actual variable nf_conntrack_htable_size. When hashsize is changed via module param this "user" variable isn't updated. This results in sysctl net/netfilter/nf_conntrack_buckets shows the wrong value when users update via the old way.
This patch fix the issue by always updating "user" variable when reading the proc file. This will take care of changes to the actual variable without sysctl need to be aware.
--- net/netfilter/nf_conntrack_standalone.c | 3 +++ 1 file changed, 3 insertions(+)
net/netfilter/nf_conntrack_standalone.c +3 -0
@@ -523,6 +523,9 @@ nf_conntrack_hash_sysctl(struct ctl_tabl {int ret; +/* module_param hashsize could have changed value */ + nf_conntrack_htable_size_user = nf_conntrack_htable_size; + ret =proc_dointvec (table, write, buffer, lenp, ppos);if (ret <0 || !write)return ret;
Greg Kroah-Hartman
maintainerPATCH 152/152 netfilter: nf_nat: Fix memleak in nf_nat_init
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
commit 869f4fdaf4ca7bb6e0d05caf6fa1108dddc346a7 upstream.
When register_pernet_subsys() fails, nf_nat_bysource should be freed just like when nf_ct_extend_register() fails.
--- net/netfilter/nf_nat_core.c | 1 + 1 file changed, 1 insertion(+)
net/netfilter/nf_nat_core.c +1 -0
@@ -1174,6 +1174,7 @@ static int __init nf_nat_init(void) ret =register_pernet_subsys (&nat_net_ops);if (ret <0 ) {nf_ct_extend_unregister (&nat_extend); +kvfree (nf_nat_bysource);return ret; }
Hi!
Quoted 7 lines
This is the start of the stable review cycle for the 5.10.9 release. There are 152 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 Wed, 20 Jan 2021 11:33:23 +0000. Anything received after that time might be too late.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-5.10.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Greg Kroah-Hartman
maintainerQuoted 7 lines · Pavel Machek
Hi!
Quoted 5 lines
This is the start of the stable review cycle for the 5.10.9 release. There are 152 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.
Quoted 8 lines
Quoted 2 lines
Responses should be made by Wed, 20 Jan 2021 11:33:23 +0000. Anything received after that time might be too late.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-5.10.y
Tested-by Pavel Machek (CIP) <[email protected]>
Thanks for testing!
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.9 release. There are 152 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 Wed, 20 Jan 2021 11:33:23 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.9-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.10:
12 builds: 12 pass, 0 fail
26 boots: 26 pass, 0 fail
64 tests: 64 pass, 0 failLinux version: 5.10.9-rc1-g293595df2bc4
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon
Greg Kroah-Hartman
maintainerQuoted 26 lines · Jon Hunter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.9 release. There are 152 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 Wed, 20 Jan 2021 11:33:23 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.9-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.10.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.10:
12 builds: 12 pass, 0 fail 26 boots: 26 pass, 0 fail 64 tests: 64 pass, 0 fail
Quoted 7 lines
Linux version: 5.10.9-rc1-g293595df2bc4
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,tegra194-p2972-0000, tegra20-ventana, tegra210-p2371-2180, tegra210-p3450-0000, tegra30-cardhu-a04Tested-by Jon Hunter <[email protected]>
Thanks for testing them all.
greg k-h
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.9 release. There are 152 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 Wed, 20 Jan 2021 11:33:23 +0000. Anything received after that time might be too late.
Build results:
total: 154 pass: 154 fail: 0 Qemu test results: total: 427 pass: 427 fail: 0
Guenter
Greg Kroah-Hartman
maintainerQuoted 10 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.10.9 release. There are 152 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 Wed, 20 Jan 2021 11:33:23 +0000. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 154 pass: 154 fail: 0 Qemu test results: total: 427 pass: 427 fail: 0Tested-by Guenter Roeck <[email protected]>
Great, thanks for testing and letting me know.
greg k-h