5.13.6-rc1 review
Greg Kroah-Hartman
maintainercover 5.13.6-rc1 review
This is the start of the stable review cycle for the 5.13.6 release. There are 223 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, 28 Jul 2021 15:38:12 +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.13.6-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.13.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.13.6-rc1
Íñigo Huguet <[email protected]>
sfc: ensure correct number of XDP queues
Yoshitaka Ikeda <[email protected]>
spi: spi-cadence-quadspi: Fix division by zero warning - try2
Colin Xu <[email protected]>
drm/i915/gvt: Clear d3_entered on elsp cmd submission.
Riccardo Mancini <[email protected]>
perf inject: Close inject.output on exit
Mark Rutland <[email protected]>
arm64: entry: fix KCOV suppression
Robert Richter <[email protected]>
Documentation: Fix intiramfs script name
Stefan Wahren <[email protected]>
ARM: multi_v7_defconfig: Make NOP_USB_XCEIV driver built-in
Paul Blakey <[email protected]>
skbuff: Release nfct refcount on napi stolen or re-used skbs
Matthieu Baerts <[email protected]>
mptcp: fix 'masking a bool' warning
Mahesh Bandewar <[email protected]>
bonding: fix build issue
Yoshitaka Ikeda <[email protected]>
spi: spi-cadence-quadspi: Revert "Fix division by zero warning"
Likun Gao <[email protected]>
drm/amdgpu: update golden setting for sienna_cichlid
Xiaojian Du <[email protected]>
drm/amdgpu: update the golden setting for vangogh
Tao Zhou <[email protected]>
drm/amdgpu: update gc golden setting for dimgrey_cavefish
Charles Baylis <[email protected]>
drm: Return -ENOTTY for non-drm ioctls
Jason Ekstrand <[email protected]>
Revert "drm/i915: Propagate errors on awaiting already signaled fences"
Adrian Hunter <[email protected]>
driver core: Prevent warning when removing a device link from unregistered consumer
Greg Kroah-Hartman <[email protected]>
nds32: fix up stack guard gap
Jérôme Glisse <[email protected]>
misc: eeprom: at24: Always append device id even if label property is set.
Ilya Dryomov <[email protected]>
rbd: always kick acquire on "acquired" and "released" notifications
Ilya Dryomov <[email protected]>
rbd: don't hold lock_rwsem while running_list is being drained
Mike Kravetz <[email protected]>
hugetlbfs: fix mount mode command line processing
Qi Zheng <[email protected]>
mm: fix the deadlock in finish_fault()
Mike Rapoport <[email protected]>
memblock: make for_each_mem_range() traverse MEMBLOCK_HOTPLUG regions
Sergei Trofimovich <[email protected]>
mm: page_alloc: fix page_poison=1 / INIT_ON_ALLOC_DEFAULT_ON interaction
Christoph Hellwig <[email protected]>
mm: call flush_dcache_page() in memcpy_to_page() and memzero_page()
Alexander Potapenko <[email protected]>
kfence: skip all GFP_ZONEMASK allocations
Alexander Potapenko <[email protected]>
kfence: move the size check to the beginning of __kfence_alloc()
Peter Collingbourne <[email protected]>
userfaultfd: do not untag user pointers
Jens Axboe <[email protected]>
io_uring: fix early fdput() of file
Pavel Begunkov <[email protected]>
io_uring: remove double poll entry on arm failure
Pavel Begunkov <[email protected]>
io_uring: explicitly count entries for poll reqs
Peter Collingbourne <[email protected]>
selftest: use mmap instead of posix_memalign to allocate memory
Frederic Weisbecker <[email protected]>
posix-cpu-timers: Fix rearm racing against process tick
Loic Poulain <[email protected]>
bus: mhi: pci_generic: Fix inbound IPCR channel
Bhaumik Bhatt <[email protected]>
bus: mhi: core: Validate channel ID when processing command completions
Bhaumik Bhatt <[email protected]>
bus: mhi: pci_generic: Apply no-op for wake using sideband wake boolean
Peter Ujfalusi <[email protected]>
driver core: auxiliary bus: Fix memory leak when driver_register() fail
Markus Boehme <[email protected]>
ixgbe: Fix packet corruption due to missing DMA sync
Gustavo A. R. Silva <[email protected]>
media: ngene: Fix out-of-bounds bug in ngene_command_config_free_buf()
Filipe Manana <[email protected]>
btrfs: fix lock inversion problem when doing qgroup extent tracing
Filipe Manana <[email protected]>
btrfs: fix unpersisted i_size on fsync after expanding truncate
Anand Jain <[email protected]>
btrfs: check for missing device in btrfs_trim_fs
Steven Rostedt (VMware) <[email protected]>
tracing: Synthetic event field_pos is an index not a boolean
Haoran Luo <[email protected]>
tracing: Fix bug in rb_per_cpu_empty() that might cause deadloop.
Steven Rostedt (VMware) <[email protected]>
tracing/histogram: Rename "cpu" to "common_cpu"
Steven Rostedt (VMware) <[email protected]>
tracepoints: Update static_call before tp_funcs when adding a tracepoint
Marc Zyngier <[email protected]>
firmware/efi: Tell memblock about EFI iomem reservations
Amelie Delaunay <[email protected]>
usb: typec: stusb160x: Don't block probing of consumer of "connector" nodes
Amelie Delaunay <[email protected]>
usb: typec: stusb160x: register role switch before interrupt registration
Martin Kepplinger <[email protected]>
usb: typec: tipd: Don't block probing of consumer of "connector" nodes
Minas Harutyunyan <[email protected]>
usb: dwc2: gadget: Fix sending zero length packet in DDMA mode.
Minas Harutyunyan <[email protected]>
usb: dwc2: gadget: Fix GOUTNAK flow for Slave mode.
Marek Szyprowski <[email protected]>
usb: dwc2: Skip clock gating on Samsung SoCs
Zhang Qilong <[email protected]>
usb: gadget: Fix Unbalanced pm_runtime_enable in tegra_xudc_probe
John Keeping <[email protected]>
USB: serial: cp210x: add ID for CEL EM3588 USB ZigBee stick
Ian Ray <[email protected]>
USB: serial: cp210x: fix comments for GE CS1000
Marco De Marco <[email protected]>
USB: serial: option: add support for u-blox LARA-R6 family
Yoshihiro Shimoda <[email protected]>
usb: renesas_usbhs: Fix superfluous irqs happen after usb_pkt_pop()
Mark Tomlinson <[email protected]>
usb: max-3421: Prevent corruption of freed memory
Julian Sikorski <[email protected]>
USB: usb-storage: Add LaCie Rugged USB3-FW to IGNORE_UAS
Mathias Nyman <[email protected]>
usb: hub: Fix link power management max exit latency (MEL) calculations
Mathias Nyman <[email protected]>
usb: hub: Disable USB 3 device initiated lpm if exit latency is too high
Nicholas Piggin <[email protected]>
KVM: PPC: Book3S HV Nested: Sanitise H_ENTER_NESTED TM state
Nicholas Piggin <[email protected]>
KVM: PPC: Book3S: Fix H_RTAS rets buffer overflow
David Jeffery <[email protected]>
usb: ehci: Prevent missed ehci interrupts with edge-triggered MSI
Mathias Nyman <[email protected]>
xhci: Fix lost USB 2 remote wake
Greg Thelen <[email protected]>
usb: xhci: avoid renesas_usb_fw.mem when it's unusable
Moritz Fischer <[email protected]>
Revert "usb: renesas-xhci: Fix handling of unknown ROM state"
Takashi Iwai <[email protected]>
ALSA: pcm: Fix mmap capability check
Alan Young <[email protected]>
ALSA: pcm: Call substream ack() method upon compat mmap commit
Takashi Iwai <[email protected]>
ALSA: hdmi: Expose all pins on MSI MS-7C94 board
Hui Wang <[email protected]>
ALSA: hda/realtek: Fix pop noise and 2 Front Mic issues on a machine
Takashi Iwai <[email protected]>
ALSA: sb: Fix potential ABBA deadlock in CSP driver
Alexander Tsoy <[email protected]>
ALSA: usb-audio: Add registration quirk for JBL Quantum headsets
Takashi Iwai <[email protected]>
ALSA: usb-audio: Add missing proc text entry for BESPOKEN type
Alexander Egorenkov <[email protected]>
s390/boot: fix use of expolines in the DMA code
Vasily Gorbik <[email protected]>
s390/ftrace: fix ftrace_update_ftrace_func implementation
Stephen Boyd <[email protected]>
mmc: core: Don't allocate IDA for OF aliases
Olivier Langlois <[email protected]>
io_uring: Fix race condition when sqp thread goes to sleep
Linus Torvalds <[email protected]>
ACPI: fix NULL pointer dereference
Marcelo Henrique Cerri <[email protected]>
proc: Avoid mixing integer types in mem_rw()
Ronnie Sahlberg <[email protected]>
cifs: fix fallocate when trying to allocate a hole.
Ronnie Sahlberg <[email protected]>
cifs: only write 64kb at a time when fallocating a small region of a file
Ioana Ciornei <[email protected]>
dpaa2-switch: seed the buffer pool after allocating the swp
Maxime Ripard <[email protected]>
drm/panel: raspberrypi-touchscreen: Prevent double-free
Yajun Deng <[email protected]>
net: sched: cls_api: Fix the the wrong parameter
Heinrich Schuchardt <[email protected]>
RISC-V: load initrd wherever it fits into memory
Vladimir Oltean <[email protected]>
net: dsa: sja1105: make VID 4095 a bridge VLAN too
Wei Wang <[email protected]>
tcp: disable TFO blackhole logic by default
Bin Meng <[email protected]>
riscv: Fix 32-bit RISC-V boot failure
Sukadev Bhattiprolu <[email protected]>
ibmvnic: Remove the proper scrq flush
Vadim Fedorenko <[email protected]>
udp: check encap socket in __udp_lib_err
Xin Long <[email protected]>
sctp: update active_key for asoc when old key is being replaced
Christoph Hellwig <[email protected]>
nvme: set the PRACT bit when using Write Zeroes with T10 PI
Sayanta Pattanayak <[email protected]>
r8169: Avoid duplicate sysfs entry creation error
David Howells <[email protected]>
afs: Fix setting of writeback_index
Tom Rix <[email protected]>
afs: check function return
David Howells <[email protected]>
afs: Fix tracepoint string placement with built-in AFS
Vincent Palatin <[email protected]>
Revert "USB: quirks: ignore remote wake-up on Fibocom L850-GL LTE modem"
Zhihao Cheng <[email protected]>
nvme-pci: don't WARN_ON in nvme_reset_work if ctrl.state is not RESETTING
Jason Ekstrand <[email protected]>
drm/ttm: Force re-init if ttm_global_init() fails
David Disseldorp <[email protected]>
scsi: target: Fix NULL dereference on XCOPY completion
Chris Packham <[email protected]>
i2c: mpc: Poll for MCF
Luis Henriques <[email protected]>
ceph: don't WARN if we're still opening a session to an MDS
Paolo Abeni <[email protected]>
ipv6: fix another slab-out-of-bounds in fib6_nh_flush_exceptions
Peilin Ye <[email protected]>
net/sched: act_skbmod: Skip non-Ethernet packets
Yang Yingliang <[email protected]>
io_uring: fix memleak in io_init_wq_offload()
Alexandru Tachici <[email protected]>
spi: spi-bcm2835: Fix deadlock
Jian Shen <[email protected]>
net: hns3: fix rx VLAN offload state inconsistent issue
Chengwen Feng <[email protected]>
net: hns3: fix possible mismatches resp of mailbox
Pierre-Louis Bossart <[email protected]>
ALSA: hda: intel-dsp-cfg: add missing ElkhartLake PCI ID
Eric Dumazet <[email protected]>
net/tcp_fastopen: fix data races around tfo_active_disable_stamp
Randy Dunlap <[email protected]>
net: hisilicon: rename CACHE_LINE_MASK to avoid redefinition
Somnath Kotur <[email protected]>
bnxt_en: Check abort error state in bnxt_half_open_nic()
Michael Chan <[email protected]>
bnxt_en: Validate vlan protocol ID on RX packets
Somnath Kotur <[email protected]>
bnxt_en: fix error path of FW reset
Michael Chan <[email protected]>
bnxt_en: Add missing check for BNXT_STATE_ABORT_ERR in bnxt_fw_rset_task()
Michael Chan <[email protected]>
bnxt_en: Refresh RoCE capabilities in bnxt_ulp_probe()
Kalesh AP <[email protected]>
bnxt_en: don't disable an already disabled PCI device
Andy Shevchenko <[email protected]>
ACPI: utils: Fix reference counting in for_each_acpi_dev_match()
Andy Shevchenko <[email protected]>
efi/dev-path-parser: Switch to use for_each_acpi_dev_match()
Robert Richter <[email protected]>
ACPI: Kconfig: Fix table override from built-in initrd
Marek Vasut <[email protected]>
spi: cadence: Correct initialisation of runtime PM again
Dmitry Bogdanov <[email protected]>
scsi: target: Fix protect handling in WRITE SAME(32)
Mike Christie <[email protected]>
scsi: iscsi: Fix iface sysfs attr detection
Nguyen Dinh Phi <[email protected]>
netrom: Decrease sock refcount when sock timers expire
Xin Long <[email protected]>
sctp: trim optlen when it's a huge value in sctp_setsockopt
Pavel Skripkin <[email protected]>
net: sched: fix memory leak in tcindex_partial_destroy_work
Nicholas Piggin <[email protected]>
KVM: PPC: Fix kvm_arch_vcpu_ioctl vcpu_load leak
Nicholas Piggin <[email protected]>
KVM: PPC: Book3S: Fix CONFIG_TRANSACTIONAL_MEM=n crash
Yajun Deng <[email protected]>
net: decnet: Fix sleeping inside in af_decnet
Michal Suchanek <[email protected]>
efi/tpm: Differentiate missing and invalid final event log table.
Vijendar Mukunda <[email protected]>
ASoC: soc-pcm: add a flag to reverse the stop sequence
Roman Skakun <[email protected]>
dma-mapping: handle vmalloc addresses in dma_common_{mmap,get_sgtable}Dongliang Mu <[email protected]>
usb: hso: fix error handling code of hso_create_net_device
Yoshitaka Ikeda <[email protected]>
spi: spi-cadence-quadspi: Fix division by zero warning
Ziyang Xuan <[email protected]>
net: fix uninit-value in caif_seqpkt_sendmsg
Tobias Klauser <[email protected]>
bpftool: Check malloc return value in mount_bpffs_for_pin
Jakub Sitnicki <[email protected]>
bpf, sockmap, udp: sk_prot needs inuse_idx set for proc stats
John Fastabend <[email protected]>
bpf, sockmap, tcp: sk_prot needs inuse_idx set for proc stats
John Fastabend <[email protected]>
bpf, sockmap: Fix potential memory leak on unlikely error case
Colin Ian King <[email protected]>
s390/bpf: Perform r1 range checking before accessing jit->seen_reg[r1]
Colin Ian King <[email protected]>
liquidio: Fix unintentional sign extension issue on left shift of u16
Geert Uytterhoeven <[email protected]>
net: dsa: mv88e6xxx: NET_DSA_MV88E6XXX_PTP should depend on NET_DSA_MV88E6XXX
Maxime Ripard <[email protected]>
drm/vc4: hdmi: Drop devm interrupt handler for CEC interrupts
Nicolas Saenz Julienne <[email protected]>
timers: Fix get_next_timer_interrupt() with no timers pending
Sathya Prakash M R <[email protected]>
ASoC: SOF: Intel: Update ADL descriptor to use ACPI power states
Xuan Zhuo <[email protected]>
xdp, net: Fix use-after-free in bpf_xdp_link_release
Daniel Borkmann <[email protected]>
bpf: Fix tail_call_reachable rejection for interpreter when jit failed
Xuan Zhuo <[email protected]>
bpf, test: fix NULL pointer dereference on invalid expected_attach_type
Maxim Schwalm <[email protected]>
ASoC: rt5631: Fix regcache sync errors on resume
Peter Hess <[email protected]>
spi: mediatek: fix fifo rx mode
Axel Lin <[email protected]>
regulator: hi6421: Fix getting wrong drvdata
Axel Lin <[email protected]>
regulator: hi6421: Use correct variable type for regmap api val argument
Alain Volmat <[email protected]>
spi: stm32: fixes pm_runtime calls in probe/remove
Charles Keepax <[email protected]>
ASoC: wm_adsp: Correct wm_coeff_tlv_get handling
Lecopzer Chen <[email protected]>
Kbuild: lto: fix module versionings mismatch in GNU make 3.X
Yang Jihong <[email protected]>
perf sched: Fix record failure when CONFIG_SCHEDSTATS is not set
Riccardo Mancini <[email protected]>
perf data: Close all files in close_dir()
Riccardo Mancini <[email protected]>
perf probe-file: Delete namelist in del_events() on the error path
Riccardo Mancini <[email protected]>
perf lzma: Close lzma stream on exit
Riccardo Mancini <[email protected]>
perf script: Fix memory 'threads' and 'cpus' leaks on exit
Riccardo Mancini <[email protected]>
perf script: Release zstd data
Riccardo Mancini <[email protected]>
perf report: Free generated help strings for sort option
Riccardo Mancini <[email protected]>
perf env: Fix memory leak of cpu_pmu_caps
Riccardo Mancini <[email protected]>
perf test maps__merge_in: Fix memory leak of maps
Riccardo Mancini <[email protected]>
perf dso: Fix memory leak in dso__new_map()
Riccardo Mancini <[email protected]>
perf test event_update: Fix memory leak of unit
Riccardo Mancini <[email protected]>
perf test event_update: Fix memory leak of evlist
Riccardo Mancini <[email protected]>
perf test session_topology: Delete session->evlist
Riccardo Mancini <[email protected]>
perf env: Fix sibling_dies memory leak
Riccardo Mancini <[email protected]>
perf probe: Fix dso->nsinfo refcounting
Riccardo Mancini <[email protected]>
perf map: Fix dso->nsinfo refcounting
Riccardo Mancini <[email protected]>
perf inject: Fix dso->nsinfo refcounting
Sudeep Holla <[email protected]>
firmware: arm_scmi: Ensure drivers provide a probe function
Zev Weiss <[email protected]>
ARM: dts: aspeed: Update e3c246d4i vuart properties
Mark Rutland <[email protected]>
arm64: mte: fix restoration of GCR_EL1 from suspend
Sean Christopherson <[email protected]>
KVM: SVM: Fix sev_pin_memory() error checks in SEV migration utilities
Sean Christopherson <[email protected]>
KVM: SVM: Return -EFAULT if copy_to_user() for SEV mig packet header fails
Like Xu <[email protected]>
KVM: x86/pmu: Clear anythread deprecated bit when 0xa leaf is unsupported on the SVM
Íñigo Huguet <[email protected]>
sfc: fix lack of XDP TX queues - error XDP TX failed (-22)
Vladimir Oltean <[email protected]>
net: ocelot: fix switchdev objects synced for wrong netdev with LAG offload
Casey Chen <[email protected]>
nvme-pci: do not call nvme_dev_remove_admin from nvme_remove
Marek Behún <[email protected]>
net: phy: marvell10g: fix differentiation of 88X3310 from 88X3340
Paolo Abeni <[email protected]>
mptcp: properly account bulk freed memory
Paolo Abeni <[email protected]>
mptcp: refine mptcp_cleanup_rbuf
Paolo Abeni <[email protected]>
mptcp: use fast lock for subflows when possible
Jianguo Wu <[email protected]>
selftests: mptcp: fix case multiple subflows limited by server
Jianguo Wu <[email protected]>
mptcp: avoid processing packet if a subflow reset
Geliang Tang <[email protected]>
mptcp: add sk parameter for mptcp_get_options
Jianguo Wu <[email protected]>
mptcp: fix syncookie process if mptcp can not_accept new subflow
Jianguo Wu <[email protected]>
mptcp: remove redundant req destruct in subflow_check_req()
Jianguo Wu <[email protected]>
mptcp: fix warning in __skb_flow_dissect() when do syn cookie for subflow join
Zack Rusin <[email protected]>
drm/vmwgfx: Fix a bad merge in otable batch takedown
Shahjada Abul Husain <[email protected]>
cxgb4: fix IRQ free race during driver unload
Uwe Kleine-König <[email protected]>
pwm: sprd: Ensure configuring period and duty_cycle isn't wrongly skipped
Hangbin Liu <[email protected]>
selftests: icmp_redirect: IPv6 PMTU info should be cleared after redirect
Hangbin Liu <[email protected]>
selftests: icmp_redirect: remove from checking for IPv6 route get
YueHaibing <[email protected]>
stmmac: platform: Fix signedness bug in stmmac_probe_config_dt()
Nicolas Dichtel <[email protected]>
ipv6: fix 'disable_policy' for fwd packets
Taehee Yoo <[email protected]>
bonding: fix incorrect return value of bond_ipsec_offload_ok()
Taehee Yoo <[email protected]>
bonding: fix suspicious RCU usage in bond_ipsec_offload_ok()
Taehee Yoo <[email protected]>
bonding: Add struct bond_ipesc to manage SA
Taehee Yoo <[email protected]>
bonding: disallow setting nested bonding + ipsec offload
Taehee Yoo <[email protected]>
bonding: fix suspicious RCU usage in bond_ipsec_del_sa()
Taehee Yoo <[email protected]>
ixgbevf: use xso.real_dev instead of xso.dev in callback functions of struct xfrmdev_ops
Taehee Yoo <[email protected]>
bonding: fix null dereference in bond_ipsec_add_sa()
Taehee Yoo <[email protected]>
bonding: fix suspicious RCU usage in bond_ipsec_add_sa()
Wang Hai <[email protected]>
bpf, samples: Fix xdpsock with '-M' parameter missing unload process
Christophe JAILLET <[email protected]>
gve: Fix an error handling path in 'gve_probe()'
Mohammad Athari Bin Ismail <[email protected]>
net: stmmac: Terminate FPE workqueue in suspend
Jedrzej Jagielski <[email protected]>
igb: Fix position of assignment to *ring
Aleksandr Loktionov <[email protected]>
igb: Check if num of q_vectors is smaller than max before array access
Christophe JAILLET <[email protected]>
iavf: Fix an error handling path in 'iavf_probe()'
Christophe JAILLET <[email protected]>
e1000e: Fix an error handling path in 'e1000_probe()'
Christophe JAILLET <[email protected]>
fm10k: Fix an error handling path in 'fm10k_probe()'
Christophe JAILLET <[email protected]>
igb: Fix an error handling path in 'igb_probe()'
Christophe JAILLET <[email protected]>
igc: Fix an error handling path in 'igc_probe()'
Christophe JAILLET <[email protected]>
ixgbe: Fix an error handling path in 'ixgbe_probe()'
Tom Rix <[email protected]>
igc: change default return of igc_read_phy_reg()
Vinicius Costa Gomes <[email protected]>
igb: Fix use-after-free error during reset
Vinicius Costa Gomes <[email protected]>
igc: Fix use-after-free error during reset
-------------
Diffstat:
Documentation/arm64/tagged-address-abi.rst | 26 ++- .../early-userspace/early_userspace_support.rst | 8 +- .../filesystems/ramfs-rootfs-initramfs.rst | 2 +- Documentation/networking/ip-sysctl.rst | 2 +- Documentation/trace/histogram.rst | 2 +- Makefile | 4 +- arch/arm/boot/dts/aspeed-bmc-asrock-e3c246d4i.dts | 4 +- arch/arm/configs/multi_v7_defconfig | 2 +- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/mte.c | 15 +- arch/nds32/mm/mmap.c | 2 +- arch/powerpc/kvm/book3s_hv.c | 2 + arch/powerpc/kvm/book3s_hv_nested.c | 20 +++ arch/powerpc/kvm/book3s_rtas.c | 25 ++- arch/powerpc/kvm/powerpc.c | 4 +- arch/riscv/include/asm/efi.h | 4 +- arch/riscv/mm/init.c | 4 +- arch/s390/boot/text_dma.S | 19 +-- arch/s390/include/asm/ftrace.h | 1 + arch/s390/kernel/ftrace.c | 2 + arch/s390/kernel/mcount.S | 4 +- arch/s390/net/bpf_jit_comp.c | 2 +- arch/x86/kvm/cpuid.c | 3 +- arch/x86/kvm/svm/sev.c | 14 +- drivers/acpi/Kconfig | 2 +- drivers/acpi/utils.c | 7 +- drivers/base/auxiliary.c | 8 +- drivers/base/core.c | 6 +- drivers/block/rbd.c | 32 ++-- drivers/bus/mhi/core/main.c | 17 +- drivers/bus/mhi/pci_generic.c | 45 ++++- drivers/firmware/arm_scmi/bus.c | 3 + drivers/firmware/efi/dev-path-parser.c | 46 ++---- drivers/firmware/efi/efi.c | 13 +- drivers/firmware/efi/tpm.c | 8 +- drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 3 + drivers/gpu/drm/drm_ioctl.c | 3 + drivers/gpu/drm/i915/gvt/handlers.c | 15 ++ drivers/gpu/drm/i915/i915_request.c | 8 +- .../gpu/drm/panel/panel-raspberrypi-touchscreen.c | 1 - drivers/gpu/drm/ttm/ttm_device.c | 2 + drivers/gpu/drm/vc4/vc4_hdmi.c | 49 ++++-- drivers/gpu/drm/vmwgfx/vmwgfx_mob.c | 1 - drivers/i2c/busses/i2c-mpc.c | 4 +- drivers/media/pci/intel/ipu3/cio2-bridge.c | 6 +- drivers/media/pci/ngene/ngene-core.c | 2 +- drivers/media/pci/ngene/ngene.h | 14 +- drivers/misc/eeprom/at24.c | 17 +- drivers/mmc/core/host.c | 20 +-- drivers/net/bonding/bond_main.c | 183 +++++++++++++++++---- drivers/net/dsa/mv88e6xxx/Kconfig | 2 +- drivers/net/dsa/sja1105/sja1105_main.c | 6 + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 63 +++++-- drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 9 +- .../ethernet/cavium/liquidio/cn23xx_pf_device.c | 2 +- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 18 +- drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c | 3 + .../net/ethernet/freescale/dpaa2/dpaa2-switch.c | 16 +- drivers/net/ethernet/google/gve/gve_main.c | 5 +- drivers/net/ethernet/hisilicon/hip04_eth.c | 6 +- drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h | 6 +- .../net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 1 + .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 10 ++ drivers/net/ethernet/ibm/ibmvnic.c | 2 +- drivers/net/ethernet/intel/e1000e/netdev.c | 1 + drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 1 + drivers/net/ethernet/intel/iavf/iavf_main.c | 1 + drivers/net/ethernet/intel/igb/igb_main.c | 15 +- drivers/net/ethernet/intel/igc/igc.h | 2 +- drivers/net/ethernet/intel/igc/igc_main.c | 3 + drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 4 +- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 20 ++- drivers/net/ethernet/mscc/ocelot_net.c | 9 +- drivers/net/ethernet/realtek/r8169_main.c | 3 +- drivers/net/ethernet/sfc/efx_channels.c | 18 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 1 + .../net/ethernet/stmicro/stmmac/stmmac_platform.c | 8 +- drivers/net/phy/marvell10g.c | 40 ++++- drivers/net/usb/hso.c | 33 ++-- drivers/nvme/host/core.c | 5 +- drivers/nvme/host/pci.c | 5 +- drivers/pwm/pwm-sprd.c | 11 +- drivers/regulator/hi6421-regulator.c | 30 ++-- drivers/scsi/scsi_transport_iscsi.c | 90 ++++------ drivers/spi/spi-bcm2835.c | 12 +- drivers/spi/spi-cadence-quadspi.c | 3 + drivers/spi/spi-cadence.c | 14 +- drivers/spi/spi-mt65xx.c | 16 +- drivers/spi/spi-stm32.c | 9 +- drivers/target/target_core_sbc.c | 35 ++-- drivers/target/target_core_transport.c | 2 +- drivers/usb/core/hub.c | 120 ++++++++++---- drivers/usb/core/quirks.c | 4 - drivers/usb/dwc2/core.h | 4 + drivers/usb/dwc2/core_intr.c | 3 +- drivers/usb/dwc2/gadget.c | 31 +++- drivers/usb/dwc2/hcd.c | 6 +- drivers/usb/dwc2/params.c | 1 + drivers/usb/gadget/udc/tegra-xudc.c | 1 + drivers/usb/host/ehci-hcd.c | 18 +- drivers/usb/host/max3421-hcd.c | 44 ++--- drivers/usb/host/xhci-hub.c | 3 +- drivers/usb/host/xhci-pci-renesas.c | 16 +- drivers/usb/host/xhci-pci.c | 7 + drivers/usb/renesas_usbhs/fifo.c | 7 + drivers/usb/serial/cp210x.c | 5 +- drivers/usb/serial/option.c | 3 + drivers/usb/storage/unusual_uas.h | 7 + drivers/usb/typec/stusb160x.c | 20 ++- drivers/usb/typec/tipd/core.c | 9 + fs/afs/cmservice.c | 25 +-- fs/afs/write.c | 18 +- fs/btrfs/backref.c | 6 +- fs/btrfs/backref.h | 3 +- fs/btrfs/delayed-ref.c | 4 +- fs/btrfs/extent-tree.c | 3 + fs/btrfs/qgroup.c | 38 ++++- fs/btrfs/qgroup.h | 2 +- fs/btrfs/tests/qgroup-tests.c | 20 +-- fs/btrfs/tree-log.c | 31 +++- fs/ceph/mds_client.c | 2 +- fs/cifs/smb2ops.c | 49 ++++-- fs/hugetlbfs/inode.c | 2 +- fs/io_uring.c | 33 ++-- fs/proc/base.c | 2 +- fs/userfaultfd.c | 26 ++- include/acpi/acpi_bus.h | 8 +- include/drm/drm_ioctl.h | 1 + include/linux/highmem.h | 2 + include/linux/marvell_phy.h | 6 +- include/linux/memblock.h | 4 +- include/net/bonding.h | 9 +- include/net/mptcp.h | 5 +- include/sound/soc.h | 6 + include/trace/events/afs.h | 67 +++++++- kernel/bpf/verifier.c | 2 + kernel/dma/ops_helpers.c | 12 +- kernel/time/posix-cpu-timers.c | 10 +- kernel/time/timer.c | 8 +- kernel/trace/ring_buffer.c | 28 +++- kernel/trace/trace.c | 4 + kernel/trace/trace_events_hist.c | 22 ++- kernel/trace/trace_synth.h | 2 +- kernel/tracepoint.c | 2 +- mm/kfence/core.c | 19 ++- mm/memblock.c | 3 +- mm/memory.c | 11 +- mm/page_alloc.c | 29 ++-- net/bpf/test_run.c | 3 + net/caif/caif_socket.c | 3 +- net/core/dev.c | 27 ++- net/core/skbuff.c | 1 + net/core/skmsg.c | 16 +- net/decnet/af_decnet.c | 27 ++- net/ipv4/tcp_bpf.c | 2 +- net/ipv4/tcp_fastopen.c | 28 +++- net/ipv4/tcp_input.c | 19 ++- net/ipv4/tcp_ipv4.c | 2 +- net/ipv4/udp.c | 25 ++- net/ipv4/udp_bpf.c | 2 +- net/ipv6/ip6_output.c | 4 +- net/ipv6/route.c | 2 +- net/ipv6/udp.c | 25 ++- net/mptcp/mib.c | 1 + net/mptcp/mib.h | 1 + net/mptcp/options.c | 24 ++- net/mptcp/pm_netlink.c | 10 +- net/mptcp/protocol.c | 81 +++++---- net/mptcp/protocol.h | 14 +- net/mptcp/subflow.c | 21 +-- net/mptcp/syncookies.c | 16 +- net/netrom/nr_timer.c | 20 ++- net/sched/act_skbmod.c | 12 +- net/sched/cls_api.c | 2 +- net/sched/cls_tcindex.c | 5 +- net/sctp/auth.c | 2 + net/sctp/socket.c | 4 + samples/bpf/xdpsock_user.c | 28 ++++ scripts/Makefile.build | 2 +- sound/core/pcm_native.c | 25 ++- sound/hda/intel-dsp-config.c | 4 + sound/isa/sb/sb16_csp.c | 4 + sound/pci/hda/patch_hdmi.c | 1 + sound/pci/hda/patch_realtek.c | 1 + sound/soc/codecs/rt5631.c | 2 + sound/soc/codecs/wm_adsp.c | 2 +- sound/soc/soc-pcm.c | 22 ++- sound/soc/sof/intel/pci-tgl.c | 1 + sound/usb/mixer.c | 10 +- sound/usb/quirks.c | 3 + tools/bpf/bpftool/common.c | 5 + tools/perf/builtin-inject.c | 13 +- tools/perf/builtin-report.c | 33 ++-- tools/perf/builtin-sched.c | 33 +++- tools/perf/builtin-script.c | 8 + tools/perf/tests/event_update.c | 6 +- tools/perf/tests/maps.c | 2 + tools/perf/tests/topology.c | 1 + tools/perf/util/data.c | 2 +- tools/perf/util/dso.c | 4 +- tools/perf/util/env.c | 2 + tools/perf/util/lzma.c | 8 +- tools/perf/util/map.c | 2 + tools/perf/util/probe-event.c | 4 +- tools/perf/util/probe-file.c | 4 +- tools/perf/util/sort.c | 2 +- tools/perf/util/sort.h | 2 +- tools/testing/selftests/net/icmp_redirect.sh | 5 +- tools/testing/selftests/net/mptcp/mptcp_join.sh | 2 +- tools/testing/selftests/vm/userfaultfd.c | 6 +- 210 files changed, 1840 insertions(+), 869 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/223 igc: Fix use-after-free error during reset
From: Vinicius Costa Gomes <[email protected]>
[ Upstream commit 56ea7ed103b46970e171eb1c95916f393d64eeff ]
Cleans the next descriptor to watch (next_to_watch) when cleaning the TX ring.
Failure to do so can cause invalid memory accesses. If igc_poll() runs while the controller is being reset this can lead to the driver try to free a skb that was already freed.
Log message:
[ 101.525242] refcount_t: underflow; use-after-free. [ 101.525251] WARNING: CPU: 1 PID: 646 at lib/refcount.c:28 refcount_warn_saturate+0xab/0xf0 [ 101.525259] Modules linked in: sch_etf(E) sch_mqprio(E) rfkill(E) intel_rapl_msr(E) intel_rapl_common(E) x86_pkg_temp_thermal(E) intel_powerclamp(E) coretemp(E) binfmt_misc(E) kvm_intel(E) kvm(E) irqbypass(E) crc32_pclmul(E) ghash_clmulni_intel(E) aesni_intel(E) mei_wdt(E) libaes(E) crypto_simd(E) cryptd(E) glue_helper(E) snd_hda_codec_hdmi(E) rapl(E) intel_cstate(E) snd_hda_intel(E) snd_intel_dspcfg(E) sg(E) soundwire_intel(E) intel_uncore(E) at24(E) soundwire_generic_allocation(E) iTCO_wdt(E) soundwire_cadence(E) intel_pmc_bxt(E) serio_raw(E) snd_hda_codec(E) iTCO_vendor_support(E) watchdog(E) snd_hda_core(E) snd_hwdep(E) snd_soc_core(E) snd_compress(E) snd_pcsp(E) soundwire_bus(E) snd_pcm(E) evdev(E) snd_timer(E) mei_me(E) snd(E) soundcore(E) mei(E) configfs(E) ip_tables(E) x_tables(E) autofs4(E) ext4(E) crc32c_generic(E) crc16(E) mbcache(E) jbd2(E) sd_mod(E) t10_pi(E) crc_t10dif(E) crct10dif_generic(E) i915(E) ahci(E) libahci(E) ehci_pci(E) igb(E) xhci_pci(E) ehci_hcd(E) [ 101.525303] drm_kms_helper(E) dca(E) xhci_hcd(E) libata(E) crct10dif_pclmul(E) cec(E) crct10dif_common(E) tsn(E) igc(E) e1000e(E) ptp(E) i2c_i801(E) crc32c_intel(E) psmouse(E) i2c_algo_bit(E) i2c_smbus(E) scsi_mod(E) lpc_ich(E) pps_core(E) usbcore(E) drm(E) button(E) video(E) [ 101.525318] CPU: 1 PID: 646 Comm: irq/37-enp7s0-T Tainted: G E 5.10.30-rt37-tsn1-rt-ipipe #ipipe [ 101.525320] Hardware name: SIEMENS AG SIMATIC IPC427D/A5E31233588, BIOS V17.02.09 03/31/2017 [ 101.525322] RIP: 0010:refcount_warn_saturate+0xab/0xf0 [ 101.525325] Code: 05 31 48 44 01 01 e8 f0 c6 42 00 0f 0b c3 80 3d 1f 48 44 01 00 75 90 48 c7 c7 78 a8 f3 a6 c6 05 0f 48 44 01 01 e8 d1 c6 42 00 <0f> 0b c3 80 3d fe 47 44 01 00 0f 85 6d ff ff ff 48 c7 c7 d0 a8 f3 [ 101.525327] RSP: 0018:ffffbdedc0917cb8 EFLAGS: 00010286 [ 101.525329] RAX: 0000000000000000 RBX: ffff98fd6becbf40 RCX: 0000000000000001 [ 101.525330] RDX: 0000000000000001 RSI: ffffffffa6f2700c RDI: 00000000ffffffff [ 101.525332] RBP: ffff98fd6becc14c R08: ffffffffa7463d00 R09: ffffbdedc0917c50 [ 101.525333] R10: ffffffffa74c3578 R11: 0000000000000034 R12: 00000000ffffff00 [ 101.525335] R13: ffff98fd6b0b1000 R14: 0000000000000039 R15: ffff98fd6be35c40 [ 101.525337] FS: 0000000000000000(0000) GS:ffff98fd6e240000(0000) knlGS:0000000000000000 [ 101.525339] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 101.525341] CR2: 00007f34135a3a70 CR3: 0000000150210003 CR4: 00000000001706e0 [ 101.525343] Call Trace: [ 101.525346] sock_wfree+0x9c/0xa0 [ 101.525353] unix_destruct_scm+0x7b/0xa0 [ 101.525358] skb_release_head_state+0x40/0x90 [ 101.525362] skb_release_all+0xe/0x30 [ 101.525364] napi_consume_skb+0x57/0x160 [ 101.525367] igc_poll+0xb7/0xc80 [igc] [ 101.525376] ? sched_clock+0x5/0x10 [ 101.525381] ? sched_clock_cpu+0xe/0x100 [ 101.525385] net_rx_action+0x14c/0x410 [ 101.525388] __do_softirq+0xe9/0x2f4 [ 101.525391] __local_bh_enable_ip+0xe3/0x110 [ 101.525395] ? irq_finalize_oneshot.part.47+0xe0/0xe0 [ 101.525398] irq_forced_thread_fn+0x6a/0x80 [ 101.525401] irq_thread+0xe8/0x180 [ 101.525403] ? wake_threads_waitq+0x30/0x30 [ 101.525406] ? irq_thread_check_affinity+0xd0/0xd0 [ 101.525408] kthread+0x183/0x1a0 [ 101.525412] ? kthread_park+0x80/0x80 [ 101.525415] ret_from_fork+0x22/0x30
--- drivers/net/ethernet/intel/igc/igc_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/intel/igc/igc_main.c +2 -0
@@ -217,6 +217,8 @@ static void igc_clean_tx_ring(struct igc_ring *tx_ring) DMA_TO_DEVICE); } + tx_buffer->next_to_watch =NULL ; +/* move us one more past the eop_desc for start of next pkt */ tx_buffer++; i++;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 2/223 igb: Fix use-after-free error during reset
In reply to Greg Kroah-HartmanFrom: Vinicius Costa Gomes <[email protected]>
[ Upstream commit 7b292608db23ccbbfbfa50cdb155d01725d7a52e ]
Cleans the next descriptor to watch (next_to_watch) when cleaning the TX ring.
Failure to do so can cause invalid memory accesses. If igb_poll() runs while the controller is reset this can lead to the driver try to free a skb that was already freed.
(The crash is harder to reproduce with the igb driver, but the same potential problem exists as the code is identical to igc)
--- drivers/net/ethernet/intel/igb/igb_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/intel/igb/igb_main.c +2 -0
@@ -4835,6 +4835,8 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring) DMA_TO_DEVICE); } + tx_buffer->next_to_watch =NULL ; +/* move us one more past the eop_desc for start of next pkt */ tx_buffer++; i++;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 3/223 igc: change default return of igc_read_phy_reg()
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit 05682a0a61b6cbecd97a0f37f743b2cbfd516977 ]
Static analysis reports this problem
igc_main.c:4944:20: warning: The left operand of '&'
is a garbage value
if (!(phy_data & SR_1000T_REMOTE_RX_STATUS) &&
~~~~~~~~ ^phy_data is set by the call to igc_read_phy_reg() only if there is a read_reg() op, else it is unset and a 0 is returned. Change the return to -EOPNOTSUPP.
--- drivers/net/ethernet/intel/igc/igc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/igc/igc.h +1 -1
@@ -560,7 +560,7 @@ static inline s32 igc_read_phy_reg(struct igc_hw *hw, u32 offset, u16 *data)if (hw->phy.ops.read_reg)return hw->phy.ops.read_reg (hw, offset, data); -return 0 ; +return -EOPNOTSUPP ; }void igc_reinit_locked (struct igc_adapter *);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 4/223 ixgbe: Fix an error handling path in ixgbe_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit dd2aefcd5e37989ae5f90afdae44bbbf3a2990da ]
If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it must be undone by a corresponding 'pci_disable_pcie_error_reporting()' call, as already done in the remove function.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +1 -0
@@ -11069,6 +11069,7 @@ err_ioremap: disable_dev = !test_and_set_bit (__IXGBE_DISABLED, &adapter->state);free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 5/223 igc: Fix an error handling path in igc_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit c6bc9e5ce5d37cb3e6b552f41b92a193db1806ab ]
If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it must be undone by a corresponding 'pci_disable_pcie_error_reporting()' call, as already done in the remove function.
--- drivers/net/ethernet/intel/igc/igc_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/igc/igc_main.c +1 -0
@@ -5596,6 +5596,7 @@ err_sw_init: err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 6/223 igb: Fix an error handling path in igb_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit fea03b1cebd653cd095f2e9a58cfe1c85661c363 ]
If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it must be undone by a corresponding 'pci_disable_pcie_error_reporting()' call, as already done in the remove function.
--- drivers/net/ethernet/intel/igb/igb_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/igb/igb_main.c +1 -0
@@ -3615,6 +3615,7 @@ err_sw_init: err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 7/223 fm10k: Fix an error handling path in fm10k_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit e85e14d68f517ef12a5fb8123fff65526b35b6cd ]
If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it must be undone by a corresponding 'pci_disable_pcie_error_reporting()' call, as already done in the remove function.
--- drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/fm10k/fm10k_pci.c +1 -0
@@ -2227,6 +2227,7 @@ err_sw_init: err_ioremap:free_netdev (netdev); err_alloc_netdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 8/223 e1000e: Fix an error handling path in e1000_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 4589075608420bc49fcef6e98279324bf2bb91ae ]
If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it must be undone by a corresponding 'pci_disable_pcie_error_reporting()' call, as already done in the remove function.
--- drivers/net/ethernet/intel/e1000e/netdev.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/e1000e/netdev.c +1 -0
@@ -7664,6 +7664,7 @@ err_flashmap: err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_mem_regions (pdev); err_pci_reg: err_dma:
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 9/223 iavf: Fix an error handling path in iavf_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit af30cbd2f4d6d66a9b6094e0aa32420bc8b20e08 ]
If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it must be undone by a corresponding 'pci_disable_pcie_error_reporting()' call, as already done in the remove function.
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/iavf/iavf_main.c +1 -0
@@ -3798,6 +3798,7 @@ static int iavf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_ioremap:free_netdev (netdev); err_alloc_etherdev: +pci_disable_pcie_error_reporting (pdev);pci_release_regions (pdev); err_pci_reg: err_dma:
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 10/223 igb: Check if num of q_vectors is smaller than max before array access
In reply to Greg Kroah-HartmanFrom: Aleksandr Loktionov <[email protected]>
[ Upstream commit 6c19d772618fea40d9681f259368f284a330fd90 ]
Ensure that the adapter->q_vector[MAX_Q_VECTORS] array isn't accessed beyond its size. It was fixed by using a local variable num_q_vectors as a limit for loop index, and ensure that num_q_vectors is not bigger than MAX_Q_VECTORS.
--- drivers/net/ethernet/intel/igb/igb_main.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/igb/igb_main.c +8 -1
@@ -931,6 +931,7 @@ static void igb_configure_msix(struct igb_adapter *adapter)**/ static int igb_request_msix (struct igb_adapter *adapter) { +unsigned int num_q_vectors = adapter->num_q_vectors;struct net_device *netdev = adapter->netdev;int i, err =0 , vector =0 , free_vector =0 ;
@@ -939,7 +940,13 @@ static int igb_request_msix(struct igb_adapter *adapter)if (err) goto err_out; -for (i =0 ; i < adapter->num_q_vectors; i++) { +if (num_q_vectors >MAX_Q_VECTORS ) { + num_q_vectors =MAX_Q_VECTORS ; +dev_warn (&adapter->pdev->dev, +"The number of queue vectors (%d) is higher than max allowed (%d)\n" , + adapter->num_q_vectors,MAX_Q_VECTORS ); + } +for (i =0 ; i < num_q_vectors; i++) {struct igb_q_vector *q_vector = adapter->q_vector[i]; vector++;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 11/223 igb: Fix position of assignment to *ring
In reply to Greg Kroah-HartmanFrom: Jedrzej Jagielski <[email protected]>
[ Upstream commit 382a7c20d9253bcd5715789b8179528d0f3de72c ]
Assignment to *ring should be done after correctness check of the argument queue.
--- drivers/net/ethernet/intel/igb/igb_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/igb/igb_main.c +2 -1
@@ -1685,14 +1685,15 @@ static bool is_any_txtime_enabled(struct igb_adapter *adapter)**/ static void igb_config_tx_modes (struct igb_adapter *adapter,int queue) { -struct igb_ring *ring = adapter->tx_ring[queue];struct net_device *netdev = adapter->netdev;struct e1000_hw *hw = &adapter->hw; +struct igb_ring *ring;u32 tqavcc, tqavctrl;u16 value;WARN_ON (hw->mac.type != e1000_i210);WARN_ON (queue <0 || queue >1 ); + ring = adapter->tx_ring[queue];/* If any of the Qav features is enabled, configure queues as SR and * with HIGH PRIO. If none is, then configure them with LOW PRIO and
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 12/223 net: stmmac: Terminate FPE workqueue in suspend
In reply to Greg Kroah-HartmanFrom: Mohammad Athari Bin Ismail <[email protected]>
[ Upstream commit 6b28a86d6c0bb02119f386ec2f56efde909e9bcb ]
Add stmmac_fpe_stop_wq() in stmmac_suspend() to terminate FPE workqueue during suspend. So, in suspend mode, there will be no FPE workqueue available. Without this fix, new additional FPE workqueue will be created in every suspend->resume cycle.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -0
@@ -7170,6 +7170,7 @@ int stmmac_suspend(struct device *dev) priv->plat->rx_queues_to_use, false);stmmac_fpe_handshake (priv, false); +stmmac_fpe_stop_wq (priv); } priv->speed =SPEED_UNKNOWN ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 13/223 gve: Fix an error handling path in gve_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 2342ae10d1272d411a468a85a67647dd115b344f ]
If the 'register_netdev() call fails, we must release the resources allocated by the previous 'gve_init_priv()' call, as already done in the remove function.
Add a new label and the missing 'gve_teardown_priv_resources()' in the error handling path.
--- drivers/net/ethernet/google/gve/gve_main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/ethernet/google/gve/gve_main.c +4 -1
@@ -1349,13 +1349,16 @@ static int gve_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err =register_netdev (dev);if (err) - goto abort_with_wq; + goto abort_with_gve_init;dev_info (&pdev->dev,"GVE version %s\n" , gve_version_str);gve_clear_probe_in_progress (priv);queue_work (priv->gve_wq, &priv->service_task);return 0 ; +abort_with_gve_init: +gve_teardown_priv_resources (priv); + abort_with_wq:destroy_workqueue (priv->gve_wq);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 14/223 bpf, samples: Fix xdpsock with -M parameter missing unload process
In reply to Greg Kroah-HartmanFrom: Wang Hai <[email protected]>
[ Upstream commit 2620e92ae6ed83260eb46d214554cd308ee35d92 ]
Execute the following command and exit, then execute it again, the following error will be reported:
$ sudo ./samples/bpf/xdpsock -i ens4f2 -M ^C $ sudo ./samples/bpf/xdpsock -i ens4f2 -M libbpf: elf: skipping unrecognized data section(16) .eh_frame libbpf: elf: skipping relo section(17) .rel.eh_frame for section(16) .eh_frame libbpf: Kernel error message: XDP program already attached ERROR: link set xdp fd failed
Commit c9d27c9e8dc7 ("samples: bpf: Do not unload prog within xdpsock") removed the unloading prog code because of the presence of bpf_link. This is fine if XDP_SHARED_UMEM is disabled, but if it is enabled, unloading the prog is still needed.
--- samples/bpf/xdpsock_user.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
samples/bpf/xdpsock_user.c +28 -0
@@ -96,6 +96,7 @@ static int opt_xsk_frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE;static int opt_timeout =1000 ;static bool opt_need_wakeup = true;static u32 opt_num_xsks =1 ; +static u32 prog_id;static bool opt_busy_poll;static bool opt_reduced_cap;
@@ -461,6 +462,23 @@ static void *poller(void *arg)return NULL ; } +static void remove_xdp_program (void ) +{ +u32 curr_prog_id =0 ; + +if (bpf_get_link_xdp_id (opt_ifindex, &curr_prog_id, opt_xdp_flags)) { +printf ("bpf_get_link_xdp_id failed\n" ); +exit (EXIT_FAILURE ); + } + +if (prog_id == curr_prog_id) +bpf_set_link_xdp_fd (opt_ifindex,-1 , opt_xdp_flags); +else if (!curr_prog_id) +printf ("couldn't find a prog id on a given interface\n" ); +else +printf ("program on interface changed, not removing\n" ); +} +static void int_exit (int sig) { benchmark_done = true;
@@ -471,6 +489,9 @@ static void __exit_with_error(int error, const char *file, const char *func, {fprintf (stderr,"%s:%s:%i: errno: %d/\"%s\"\n" , file, func, line, error,strerror (error)); + +if (opt_num_xsks >1 ) +remove_xdp_program ();exit (EXIT_FAILURE ); }
@@ -490,6 +511,9 @@ static void xdpsock_cleanup(void)if (write (sock, &cmd,sizeof (int )) <0 )exit_with_error (errno); } + +if (opt_num_xsks >1 ) +remove_xdp_program (); }static void swap_mac_addresses (void *data)
@@ -857,6 +881,10 @@ static struct xsk_socket_info *xsk_configure_socket(struct xsk_umem_info *umem,if (ret)exit_with_error (-ret); + ret =bpf_get_link_xdp_id (opt_ifindex, &prog_id, opt_xdp_flags); +if (ret) +exit_with_error (-ret); + xsk->app_stats.rx_empty_polls =0 ; xsk->app_stats.fill_fail_polls =0 ; xsk->app_stats.copy_tx_sendtos =0 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 15/223 bonding: fix suspicious RCU usage in bond_ipsec_add_sa()
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit b648eba4c69e5819880b4907e7fcb2bb576069ab ]
To dereference bond->curr_active_slave, it uses rcu_dereference(). But it and the caller doesn't acquire RCU so a warning occurs. So add rcu_read_lock().
Test commands:
ip link add dummy0 type dummy
ip link add bond0 type bond
ip link set dummy0 master bond0
ip link set dummy0 up
ip link set bond0 up
ip x s add proto esp dst 14.1.1.1 src 15.1.1.1 spi 0x07 \
mode transport \
reqid 0x07 replay-window 32 aead 'rfc4106(gcm(aes))' \
0x44434241343332312423222114131211f4f3f2f1 128 sel \
src 14.0.0.52/24 dst 14.0.0.70/24 proto tcp offload \
dev bond0 dir in
Splat looks like:
=============================
WARNING: suspicious RCU usage
5.13.0-rc3+ #1168 Not tainted
-----------------------------drivers/net/bonding/bond_main.c:411 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
rcu_scheduler_active = 2, debug_locks = 1
1 lock held by ip/684:
#0: ffffffff9a2757c0 (&net->xfrm.xfrm_cfg_mutex){+.+.}-{3:3},
at: xfrm_netlink_rcv+0x59/0x80 [xfrm_user]
55.191733][ T684] stack backtrace:
CPU: 0 PID: 684 Comm: ip Not tainted 5.13.0-rc3+ #1168 Call Trace: dump_stack+0xa4/0xe5 bond_ipsec_add_sa+0x18c/0x1f0 [bonding] xfrm_dev_state_add+0x2a9/0x770 ? memcpy+0x38/0x60 xfrm_add_sa+0x2278/0x3b10 [xfrm_user] ? xfrm_get_policy+0xaa0/0xaa0 [xfrm_user] ? register_lock_class+0x1750/0x1750 xfrm_user_rcv_msg+0x331/0x660 [xfrm_user] ? rcu_read_lock_sched_held+0x91/0xc0 ? xfrm_user_state_lookup.constprop.39+0x320/0x320 [xfrm_user] ? find_held_lock+0x3a/0x1c0 ? mutex_lock_io_nested+0x1210/0x1210 ? sched_clock_cpu+0x18/0x170 netlink_rcv_skb+0x121/0x350 ? xfrm_user_state_lookup.constprop.39+0x320/0x320 [xfrm_user] ? netlink_ack+0x9d0/0x9d0 ? netlink_deliver_tap+0x17c/0xa50 xfrm_netlink_rcv+0x68/0x80 [xfrm_user] netlink_unicast+0x41c/0x610 ? netlink_attachskb+0x710/0x710 netlink_sendmsg+0x6b9/0xb70
[ ... ]
--- drivers/net/bonding/bond_main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/bonding/bond_main.c +6 -1
@@ -403,10 +403,12 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs)struct net_device *bond_dev = xs->xso.dev;struct bonding *bond;struct slave *slave; +int err;if (!bond_dev)return -EINVAL ; +rcu_read_lock (); bond =netdev_priv (bond_dev); slave =rcu_dereference (bond->curr_active_slave); xs->xso.real_dev = slave->dev;
@@ -415,10 +417,13 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs)if (!(slave->dev->xfrmdev_ops && slave->dev->xfrmdev_ops->xdo_dev_state_add)) {slave_warn (bond_dev, slave->dev,"Slave does not support ipsec offload\n" ); +rcu_read_unlock ();return -EINVAL ; } -return slave->dev->xfrmdev_ops->xdo_dev_state_add (xs); + err = slave->dev->xfrmdev_ops->xdo_dev_state_add (xs); +rcu_read_unlock (); +return err; }/**
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 16/223 bonding: fix null dereference in bond_ipsec_add_sa()
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit 105cd17a866017b45f3c45901b394c711c97bf40 ]
If bond doesn't have real device, bond->curr_active_slave is null. But bond_ipsec_add_sa() dereferences bond->curr_active_slave without null checking.
So, null-ptr-deref would occur.
Test commands:
ip link add bond0 type bond
ip link set bond0 up
ip x s add proto esp dst 14.1.1.1 src 15.1.1.1 spi \0x07 mode transport reqid 0x07 replay-window 32 aead 'rfc4106(gcm(aes))' \0x44434241343332312423222114131211f4f3f2f1 128 sel src 14.0.0.52/24 \
dst 14.0.0.70/24 proto tcp offload dev bond0 dir in
Splat looks like:
KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] CPU: 4 PID: 680 Comm: ip Not tainted 5.13.0-rc3+ #1168 RIP: 0010:bond_ipsec_add_sa+0xc4/0x2e0 [bonding] Code: 85 21 02 00 00 4d 8b a6 48 0c 00 00 e8 75 58 44 ce 85 c0 0f 85 14 01 00 00 48 b8 00 00 00 00 00 fc ff df 4c 89 e2 48 c1 ea 03 <80> 3c 02 00 0f 85 fc 01 00 00 48 8d bb e0 02 00 00 4d 8b 2c 24 48 RSP: 0018:ffff88810946f508 EFLAGS: 00010246 RAX: dffffc0000000000 RBX: ffff88810b4e8040 RCX: 0000000000000001 RDX: 0000000000000000 RSI: ffffffff8fe34280 RDI: ffff888115abe100 RBP: ffff88810946f528 R08: 0000000000000003 R09: fffffbfff2287e11 R10: 0000000000000001 R11: ffff888115abe0c8 R12: 0000000000000000 R13: ffffffffc0aea9a0 R14: ffff88800d7d2000 R15: ffff88810b4e8330 FS: 00007efc5552e680(0000) GS:ffff888119c00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000055c2530dbf40 CR3: 0000000103056004 CR4: 00000000003706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: xfrm_dev_state_add+0x2a9/0x770 ? memcpy+0x38/0x60 xfrm_add_sa+0x2278/0x3b10 [xfrm_user] ? xfrm_get_policy+0xaa0/0xaa0 [xfrm_user] ? register_lock_class+0x1750/0x1750 xfrm_user_rcv_msg+0x331/0x660 [xfrm_user] ? rcu_read_lock_sched_held+0x91/0xc0 ? xfrm_user_state_lookup.constprop.39+0x320/0x320 [xfrm_user] ? find_held_lock+0x3a/0x1c0 ? mutex_lock_io_nested+0x1210/0x1210 ? sched_clock_cpu+0x18/0x170 netlink_rcv_skb+0x121/0x350 ? xfrm_user_state_lookup.constprop.39+0x320/0x320 [xfrm_user] ? netlink_ack+0x9d0/0x9d0 ? netlink_deliver_tap+0x17c/0xa50 xfrm_netlink_rcv+0x68/0x80 [xfrm_user] netlink_unicast+0x41c/0x610 ? netlink_attachskb+0x710/0x710 netlink_sendmsg+0x6b9/0xb70
[ ...]
--- drivers/net/bonding/bond_main.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/bonding/bond_main.c +5 -0
@@ -411,6 +411,11 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs)rcu_read_lock (); bond =netdev_priv (bond_dev); slave =rcu_dereference (bond->curr_active_slave); +if (!slave) { +rcu_read_unlock (); +return -ENODEV ; + } + xs->xso.real_dev = slave->dev; bond->xs = xs;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 17/223 ixgbevf: use xso.real_dev instead of xso.dev in callback functions of struct xfrmdev_ops
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit 2de7e4f67599affc97132bd07e30e3bd59d0b777 ]
There are two pointers in struct xfrm_state_offload, *dev, *real_dev. These are used in callback functions of struct xfrmdev_ops. The *dev points whether bonding interface or real interface. If bonding ipsec offload is used, it points bonding interface If not, it points real interface.
And real_dev always points real interface.
So, ixgbevf should always use real_dev instead of dev.
Of course, real_dev always not be null.
Test commands:
ip link add bond0 type bond
#eth0 is ixgbevf interface
ip link set eth0 master bond0
ip link set bond0 up
ip x s add proto esp dst 14.1.1.1 src 15.1.1.1 spi 0x07 mode \
transport reqid 0x07 replay-window 32 aead 'rfc4106(gcm(aes))' \0x44434241343332312423222114131211f4f3f2f1 128 sel src 14.0.0.52/24 \
dst 14.0.0.70/24 proto tcp offload dev bond0 dir in
Splat looks like:
KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] CPU: 6 PID: 688 Comm: ip Not tainted 5.13.0-rc3+ #1168 RIP: 0010:ixgbevf_ipsec_find_empty_idx+0x28/0x1b0 [ixgbevf] Code: 00 00 0f 1f 44 00 00 55 53 48 89 fb 48 83 ec 08 40 84 f6 0f 84 9c 00 00 00 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <0f> b6 04 02 84 c0 74 08 3c 01 0f 8e 4c 01 00 00 66 81 3b 00 04 0f RSP: 0018:ffff8880089af390 EFLAGS: 00010246 RAX: dffffc0000000000 RBX: 0000000000000000 RCX: 0000000000000001 RDX: 0000000000000000 RSI: 0000000000000001 RDI: 0000000000000000 RBP: ffff8880089af4f8 R08: 0000000000000003 R09: fffffbfff4287e11 R10: 0000000000000001 R11: ffff888005de8908 R12: 0000000000000000 R13: ffff88810936a000 R14: ffff88810936a000 R15: ffff888004d78040 FS: 00007fdf9883a680(0000) GS:ffff88811a400000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000055bc14adbf40 CR3: 000000000b87c005 CR4: 00000000003706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: ixgbevf_ipsec_add_sa+0x1bf/0x9c0 [ixgbevf] ? rcu_read_lock_sched_held+0x91/0xc0 ? ixgbevf_ipsec_parse_proto_keys.isra.9+0x280/0x280 [ixgbevf] ? lock_acquire+0x191/0x720 ? bond_ipsec_add_sa+0x48/0x350 [bonding] ? lockdep_hardirqs_on_prepare+0x3e0/0x3e0 ? rcu_read_lock_held+0x91/0xa0 ? rcu_read_lock_sched_held+0xc0/0xc0 bond_ipsec_add_sa+0x193/0x350 [bonding] xfrm_dev_state_add+0x2a9/0x770 ? memcpy+0x38/0x60 xfrm_add_sa+0x2278/0x3b10 [xfrm_user] ? xfrm_get_policy+0xaa0/0xaa0 [xfrm_user] ? register_lock_class+0x1750/0x1750 xfrm_user_rcv_msg+0x331/0x660 [xfrm_user] ? rcu_read_lock_sched_held+0x91/0xc0 ? xfrm_user_state_lookup.constprop.39+0x320/0x320 [xfrm_user] ? find_held_lock+0x3a/0x1c0 ? mutex_lock_io_nested+0x1210/0x1210 ? sched_clock_cpu+0x18/0x170 netlink_rcv_skb+0x121/0x350
[ ... ]
--- drivers/net/ethernet/intel/ixgbevf/ipsec.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
drivers/net/ethernet/intel/ixgbevf/ipsec.c +13 -7
@@ -211,7 +211,7 @@ struct xfrm_state *ixgbevf_ipsec_find_rx_state(struct ixgbevf_ipsec *ipsec,static int ixgbevf_ipsec_parse_proto_keys (struct xfrm_state *xs,u32 *mykey,u32 *mysalt) { -struct net_device *dev = xs->xso.dev; +struct net_device *dev = xs->xso.real_dev;unsigned char *key_data;char *alg_name =NULL ;int key_len;
@@ -260,12 +260,15 @@ static int ixgbevf_ipsec_parse_proto_keys(struct xfrm_state *xs,**/ static int ixgbevf_ipsec_add_sa (struct xfrm_state *xs) { -struct net_device *dev = xs->xso.dev; -struct ixgbevf_adapter *adapter =netdev_priv (dev); -struct ixgbevf_ipsec *ipsec = adapter->ipsec; +struct net_device *dev = xs->xso.real_dev; +struct ixgbevf_adapter *adapter; +struct ixgbevf_ipsec *ipsec;u16 sa_idx;int ret; + adapter =netdev_priv (dev); + ipsec = adapter->ipsec; +if (xs->id.proto !=IPPROTO_ESP && xs->id.proto !=IPPROTO_AH ) {netdev_err (dev,"Unsupported protocol 0x%04x for IPsec offload\n" , xs->id.proto);
@@ -383,11 +386,14 @@ static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs)**/ static void ixgbevf_ipsec_del_sa (struct xfrm_state *xs) { -struct net_device *dev = xs->xso.dev; -struct ixgbevf_adapter *adapter =netdev_priv (dev); -struct ixgbevf_ipsec *ipsec = adapter->ipsec; +struct net_device *dev = xs->xso.real_dev; +struct ixgbevf_adapter *adapter; +struct ixgbevf_ipsec *ipsec;u16 sa_idx; + adapter =netdev_priv (dev); + ipsec = adapter->ipsec; +if (xs->xso.flags &XFRM_OFFLOAD_INBOUND ) { sa_idx = xs->xso.offload_handle -IXGBE_IPSEC_BASE_RX_INDEX ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 18/223 bonding: fix suspicious RCU usage in bond_ipsec_del_sa()
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit a22c39b831a081da9b2c488bd970a4412d926f30 ]
To dereference bond->curr_active_slave, it uses rcu_dereference(). But it and the caller doesn't acquire RCU so a warning occurs. So add rcu_read_lock().
Test commands:
ip netns add A
ip netns exec A bash
modprobe netdevsim
echo "1 1" > /sys/bus/netdevsim/new_device
ip link add bond0 type bond
ip link set eth0 master bond0
ip link set eth0 up
ip link set bond0 up
ip x s add proto esp dst 14.1.1.1 src 15.1.1.1 spi 0x07 mode \
transport reqid 0x07 replay-window 32 aead 'rfc4106(gcm(aes))' \0x44434241343332312423222114131211f4f3f2f1 128 sel src 14.0.0.52/24 \
dst 14.0.0.70/24 proto tcp offload dev bond0 dir in
ip x s f
Splat looks like:
=============================
WARNING: suspicious RCU usage
5.13.0-rc3+ #1168 Not tainted
-----------------------------drivers/net/bonding/bond_main.c:448 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
rcu_scheduler_active = 2, debug_locks = 1
2 locks held by ip/705:
#0: ffff888106701780 (&net->xfrm.xfrm_cfg_mutex){+.+.}-{3:3},
at: xfrm_netlink_rcv+0x59/0x80 [xfrm_user]
#1: ffff8880075b0098 (&x->lock){+.-.}-{2:2},
at: xfrm_state_delete+0x16/0x30
stack backtrace: CPU: 6 PID: 705 Comm: ip Not tainted 5.13.0-rc3+ #1168 Call Trace: dump_stack+0xa4/0xe5 bond_ipsec_del_sa+0x16a/0x1c0 [bonding] __xfrm_state_delete+0x51f/0x730 xfrm_state_delete+0x1e/0x30 xfrm_state_flush+0x22f/0x390 xfrm_flush_sa+0xd8/0x260 [xfrm_user] ? xfrm_flush_policy+0x290/0x290 [xfrm_user] xfrm_user_rcv_msg+0x331/0x660 [xfrm_user] ? rcu_read_lock_sched_held+0x91/0xc0 ? xfrm_user_state_lookup.constprop.39+0x320/0x320 [xfrm_user] ? find_held_lock+0x3a/0x1c0 ? mutex_lock_io_nested+0x1210/0x1210 ? sched_clock_cpu+0x18/0x170 netlink_rcv_skb+0x121/0x350
[ ... ]
--- drivers/net/bonding/bond_main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/bonding/bond_main.c +5 -2
@@ -444,21 +444,24 @@ static void bond_ipsec_del_sa(struct xfrm_state *xs)if (!bond_dev)return ; +rcu_read_lock (); bond =netdev_priv (bond_dev); slave =rcu_dereference (bond->curr_active_slave);if (!slave) -return ; + goto out; xs->xso.real_dev = slave->dev;if (!(slave->dev->xfrmdev_ops && slave->dev->xfrmdev_ops->xdo_dev_state_delete)) {slave_warn (bond_dev, slave->dev,"%s: no slave xdo_dev_state_delete\n" , __func__); -return ; + goto out; } slave->dev->xfrmdev_ops->xdo_dev_state_delete (xs); +out: +rcu_read_unlock (); }/**
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 19/223 bonding: disallow setting nested bonding + ipsec offload
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit b121693381b112b78c076dea171ee113e237c0e4 ]
bonding interface can be nested and it supports ipsec offload. So, it allows setting the nested bonding + ipsec scenario. But code does not support this scenario.
So, it should be disallowed.
interface graph:
bond2
|
bond1
|
eth0
The nested bonding + ipsec offload may not a real usecase. So, disallowing this scenario is fine.
--- drivers/net/bonding/bond_main.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/net/bonding/bond_main.c +9 -6
@@ -419,8 +419,9 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs) xs->xso.real_dev = slave->dev; bond->xs = xs; -if (!(slave->dev->xfrmdev_ops - && slave->dev->xfrmdev_ops->xdo_dev_state_add)) { +if (!slave->dev->xfrmdev_ops || + !slave->dev->xfrmdev_ops->xdo_dev_state_add || +netif_is_bond_master (slave->dev)) {slave_warn (bond_dev, slave->dev,"Slave does not support ipsec offload\n" );rcu_read_unlock ();return -EINVAL ;
@@ -453,8 +454,9 @@ static void bond_ipsec_del_sa(struct xfrm_state *xs) xs->xso.real_dev = slave->dev; -if (!(slave->dev->xfrmdev_ops - && slave->dev->xfrmdev_ops->xdo_dev_state_delete)) { +if (!slave->dev->xfrmdev_ops || + !slave->dev->xfrmdev_ops->xdo_dev_state_delete || +netif_is_bond_master (slave->dev)) {slave_warn (bond_dev, slave->dev,"%s: no slave xdo_dev_state_delete\n" , __func__); goto out; }
@@ -479,8 +481,9 @@ static bool bond_ipsec_offload_ok(struct sk_buff *skb, struct xfrm_state *xs)if (BOND_MODE (bond) !=BOND_MODE_ACTIVEBACKUP )return true; -if (!(slave_dev->xfrmdev_ops - && slave_dev->xfrmdev_ops->xdo_dev_offload_ok)) { +if (!slave_dev->xfrmdev_ops || + !slave_dev->xfrmdev_ops->xdo_dev_offload_ok || +netif_is_bond_master (slave_dev)) {slave_warn (bond_dev, slave_dev,"%s: no slave xdo_dev_offload_ok\n" , __func__);return false; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 20/223 bonding: Add struct bond_ipesc to manage SA
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit 9a5605505d9c7dbfdb89cc29a8f5fc5cf9fd2334 ]
bonding has been supporting ipsec offload.
When SA is added, bonding just passes SA to its own active real interface. But it doesn't manage SA.
So, when events(add/del real interface, active real interface change, etc) occur, bonding can't handle that well because It doesn't manage SA. So some problems(panic, UAF, refcnt leak)occur.
In order to make it stable, it should manage SA.
That's the reason why struct bond_ipsec is added.
When a new SA is added to bonding interface, it is stored in the bond_ipsec list. And the SA is passed to a current active real interface. If events occur, it uses bond_ipsec data to handle these events. bond->ipsec_list is protected by bond->ipsec_lock.
If a current active real interface is changed, the following logic works.
1. delete all SAs from old active real interface
2. Add all SAs to the new active real interface.
3. If a new active real interface doesn't support ipsec offload or SA's option, it sets real_dev to NULL.
--- drivers/net/bonding/bond_main.c | 139 +++++++++++++++++++++++++++----- include/net/bonding.h | 9 ++- 2 files changed, 127 insertions(+), 21 deletions(-)
drivers/net/bonding/bond_main.c +119 -20
@@ -401,6 +401,7 @@ static int bond_vlan_rx_kill_vid(struct net_device *bond_dev,static int bond_ipsec_add_sa (struct xfrm_state *xs) {struct net_device *bond_dev = xs->xso.dev; +struct bond_ipsec *ipsec;struct bonding *bond;struct slave *slave;int err;
@@ -416,9 +417,6 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs)return -ENODEV ; } - xs->xso.real_dev = slave->dev; - bond->xs = xs; -if (!slave->dev->xfrmdev_ops || !slave->dev->xfrmdev_ops->xdo_dev_state_add ||netif_is_bond_master (slave->dev)) {
@@ -427,11 +425,63 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs)return -EINVAL ; } + ipsec =kmalloc (sizeof (*ipsec),GFP_ATOMIC ); +if (!ipsec) { +rcu_read_unlock (); +return -ENOMEM ; + } + xs->xso.real_dev = slave->dev; + err = slave->dev->xfrmdev_ops->xdo_dev_state_add (xs); +if (!err) { + ipsec->xs = xs; +INIT_LIST_HEAD (&ipsec->list); +spin_lock_bh (&bond->ipsec_lock); +list_add (&ipsec->list, &bond->ipsec_list); +spin_unlock_bh (&bond->ipsec_lock); + }else { +kfree (ipsec); + }rcu_read_unlock ();return err; } +static void bond_ipsec_add_sa_all (struct bonding *bond) +{ +struct net_device *bond_dev = bond->dev; +struct bond_ipsec *ipsec; +struct slave *slave; + +rcu_read_lock (); + slave =rcu_dereference (bond->curr_active_slave); +if (!slave) + goto out; + +if (!slave->dev->xfrmdev_ops || + !slave->dev->xfrmdev_ops->xdo_dev_state_add || +netif_is_bond_master (slave->dev)) { +spin_lock_bh (&bond->ipsec_lock); +if (!list_empty (&bond->ipsec_list)) +slave_warn (bond_dev, slave->dev, +"%s: no slave xdo_dev_state_add\n" , + __func__); +spin_unlock_bh (&bond->ipsec_lock); + goto out; + } + +spin_lock_bh (&bond->ipsec_lock); +list_for_each_entry (ipsec, &bond->ipsec_list, list) { + ipsec->xs->xso.real_dev = slave->dev; +if (slave->dev->xfrmdev_ops->xdo_dev_state_add (ipsec->xs)) { +slave_warn (bond_dev, slave->dev,"%s: failed to add SA\n" , __func__); + ipsec->xs->xso.real_dev =NULL ; + } + } +spin_unlock_bh (&bond->ipsec_lock); +out: +rcu_read_unlock (); +} +/** * bond_ipsec_del_sa - clear out this specific SA * @xs: pointer to transformer state struct
@@ -439,6 +489,7 @@ static int bond_ipsec_add_sa(struct xfrm_state *xs)static void bond_ipsec_del_sa (struct xfrm_state *xs) {struct net_device *bond_dev = xs->xso.dev; +struct bond_ipsec *ipsec;struct bonding *bond;struct slave *slave;
@@ -452,7 +503,10 @@ static void bond_ipsec_del_sa(struct xfrm_state *xs)if (!slave) goto out; - xs->xso.real_dev = slave->dev; +if (!xs->xso.real_dev) + goto out; + +WARN_ON (xs->xso.real_dev != slave->dev); if (!slave->dev->xfrmdev_ops || !slave->dev->xfrmdev_ops->xdo_dev_state_delete ||
@@ -463,6 +517,48 @@ static void bond_ipsec_del_sa(struct xfrm_state *xs) slave->dev->xfrmdev_ops->xdo_dev_state_delete (xs); out: +spin_lock_bh (&bond->ipsec_lock); +list_for_each_entry (ipsec, &bond->ipsec_list, list) { +if (ipsec->xs == xs) { +list_del (&ipsec->list); +kfree (ipsec); +break ; + } + } +spin_unlock_bh (&bond->ipsec_lock); +rcu_read_unlock (); +} + +static void bond_ipsec_del_sa_all (struct bonding *bond) +{ +struct net_device *bond_dev = bond->dev; +struct bond_ipsec *ipsec; +struct slave *slave; + +rcu_read_lock (); + slave =rcu_dereference (bond->curr_active_slave); +if (!slave) { +rcu_read_unlock (); +return ; + } + +spin_lock_bh (&bond->ipsec_lock); +list_for_each_entry (ipsec, &bond->ipsec_list, list) { +if (!ipsec->xs->xso.real_dev) +continue ; + +if (!slave->dev->xfrmdev_ops || + !slave->dev->xfrmdev_ops->xdo_dev_state_delete || +netif_is_bond_master (slave->dev)) { +slave_warn (bond_dev, slave->dev, +"%s: no slave xdo_dev_state_delete\n" , + __func__); + }else { + slave->dev->xfrmdev_ops->xdo_dev_state_delete (ipsec->xs); + } + ipsec->xs->xso.real_dev =NULL ; + } +spin_unlock_bh (&bond->ipsec_lock);rcu_read_unlock (); }
@@ -474,22 +570,27 @@ out:static bool bond_ipsec_offload_ok (struct sk_buff *skb,struct xfrm_state *xs) {struct net_device *bond_dev = xs->xso.dev; -struct bonding *bond =netdev_priv (bond_dev); -struct slave *curr_active =rcu_dereference (bond->curr_active_slave); -struct net_device *slave_dev = curr_active->dev; +struct net_device *real_dev; +struct slave *curr_active; +struct bonding *bond; + + bond =netdev_priv (bond_dev); + curr_active =rcu_dereference (bond->curr_active_slave); + real_dev = curr_active->dev;if (BOND_MODE (bond) !=BOND_MODE_ACTIVEBACKUP )return true; -if (!slave_dev->xfrmdev_ops || - !slave_dev->xfrmdev_ops->xdo_dev_offload_ok || -netif_is_bond_master (slave_dev)) { -slave_warn (bond_dev, slave_dev,"%s: no slave xdo_dev_offload_ok\n" , __func__); +if (!xs->xso.real_dev) +return false; + +if (!real_dev->xfrmdev_ops || + !real_dev->xfrmdev_ops->xdo_dev_offload_ok || +netif_is_bond_master (real_dev)) {return false; } - xs->xso.real_dev = slave_dev; -return slave_dev->xfrmdev_ops->xdo_dev_offload_ok (skb, xs); +return real_dev->xfrmdev_ops->xdo_dev_offload_ok (skb, xs); }static const struct xfrmdev_ops bond_xfrmdev_ops = {
@@ -1006,8 +1107,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)return ;#ifdef CONFIG_XFRM_OFFLOAD -if (old_active && bond->xs) -bond_ipsec_del_sa (bond->xs); +bond_ipsec_del_sa_all (bond);#endif /* CONFIG_XFRM_OFFLOAD */ if (new_active) {
@@ -1083,10 +1183,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active) }#ifdef CONFIG_XFRM_OFFLOAD -if (new_active && bond->xs) { -xfrm_dev_state_flush (dev_net (bond->dev), bond->dev, true); -bond_ipsec_add_sa (bond->xs); - } +bond_ipsec_add_sa_all (bond);#endif /* CONFIG_XFRM_OFFLOAD */ /* resend IGMP joins since active slave has changed or
@@ -3335,6 +3432,7 @@ static int bond_master_netdev_event(unsigned long event,return bond_event_changename (event_bond);case NETDEV_UNREGISTER :bond_remove_proc_entry (event_bond); +xfrm_dev_state_flush (dev_net (bond_dev), bond_dev, true);break ;case NETDEV_REGISTER :bond_create_proc_entry (event_bond);
@@ -4898,7 +4996,8 @@ void bond_setup(struct net_device *bond_dev)#ifdef CONFIG_XFRM_OFFLOAD /* set up xfrm device ops (only supported in active-backup right now) */ bond_dev->xfrmdev_ops = &bond_xfrmdev_ops; - bond->xs =NULL ; +INIT_LIST_HEAD (&bond->ipsec_list); +spin_lock_init (&bond->ipsec_lock);#endif /* CONFIG_XFRM_OFFLOAD */ /* don't acquire bond device's netif_tx_lock when transmitting */
include/net/bonding.h +8 -1
@@ -201,6 +201,11 @@ struct bond_up_slave {*/ #define BOND_LINK_NOCHANGE -1 +struct bond_ipsec { +struct list_head list; +struct xfrm_state *xs; +}; +/* * Here are the locking policies for the two bonding locks: * Get rcu_read_lock when reading or RTNL when writing slave list.
@@ -249,7 +254,9 @@ struct bonding {#endif /* CONFIG_DEBUG_FS */ struct rtnl_link_stats64 bond_stats;#ifdef CONFIG_XFRM_OFFLOAD -struct xfrm_state *xs; +struct list_head ipsec_list; +/* protecting ipsec_list */ +spinlock_t ipsec_lock;#endif /* CONFIG_XFRM_OFFLOAD */ };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 21/223 bonding: fix suspicious RCU usage in bond_ipsec_offload_ok()
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit 955b785ec6b3b2f9b91914d6eeac8ee66ee29239 ]
To dereference bond->curr_active_slave, it uses rcu_dereference(). But it and the caller doesn't acquire RCU so a warning occurs. So add rcu_read_lock().
Splat looks like:
WARNING: suspicious RCU usage
5.13.0-rc6+ #1179 Not tainteddrivers/net/bonding/bond_main.c:571 suspiciousrcu_dereference_check() usage!
other info that might help us debug this:
rcu_scheduler_active = 2, debug_locks = 1
1 lock held by ping/974:
#0: ffff888109e7db70 (sk_lock-AF_INET){+.+.}-{0:0},
at: raw_sendmsg+0x1303/0x2cb0
stack backtrace: CPU: 2 PID: 974 Comm: ping Not tainted 5.13.0-rc6+ #1179 Call Trace: dump_stack+0xa4/0xe5 bond_ipsec_offload_ok+0x1f4/0x260 [bonding] xfrm_output+0x179/0x890 xfrm4_output+0xfa/0x410 ? __xfrm4_output+0x4b0/0x4b0 ? __ip_make_skb+0xecc/0x2030 ? xfrm4_udp_encap_rcv+0x800/0x800 ? ip_local_out+0x21/0x3a0 ip_send_skb+0x37/0xa0 raw_sendmsg+0x1bfd/0x2cb0
--- drivers/net/bonding/bond_main.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
drivers/net/bonding/bond_main.c +16 -6
@@ -573,24 +573,34 @@ static bool bond_ipsec_offload_ok(struct sk_buff *skb, struct xfrm_state *xs)struct net_device *real_dev;struct slave *curr_active;struct bonding *bond; +int err; bond =netdev_priv (bond_dev); +rcu_read_lock (); curr_active =rcu_dereference (bond->curr_active_slave); real_dev = curr_active->dev; -if (BOND_MODE (bond) !=BOND_MODE_ACTIVEBACKUP ) -return true; +if (BOND_MODE (bond) !=BOND_MODE_ACTIVEBACKUP ) { + err = true; + goto out; + } -if (!xs->xso.real_dev) -return false; +if (!xs->xso.real_dev) { + err = false; + goto out; + }if (!real_dev->xfrmdev_ops || !real_dev->xfrmdev_ops->xdo_dev_offload_ok ||netif_is_bond_master (real_dev)) { -return false; + err = false; + goto out; } -return real_dev->xfrmdev_ops->xdo_dev_offload_ok (skb, xs); + err = real_dev->xfrmdev_ops->xdo_dev_offload_ok (skb, xs); +out: +rcu_read_unlock (); +return err; }static const struct xfrmdev_ops bond_xfrmdev_ops = {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 22/223 bonding: fix incorrect return value of bond_ipsec_offload_ok()
In reply to Greg Kroah-HartmanFrom: Taehee Yoo <[email protected]>
[ Upstream commit 168e696a36792a4a3b2525a06249e7472ef90186 ]
bond_ipsec_offload_ok() is called to check whether the interface supports ipsec offload or not.
bonding interface support ipsec offload only in active-backup mode. So, if a bond interface is not in active-backup mode, it should return false but it returns true.
--- drivers/net/bonding/bond_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/bonding/bond_main.c +1 -1
@@ -581,7 +581,7 @@ static bool bond_ipsec_offload_ok(struct sk_buff *skb, struct xfrm_state *xs) real_dev = curr_active->dev;if (BOND_MODE (bond) !=BOND_MODE_ACTIVEBACKUP ) { - err = true; + err = false; goto out; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 23/223 ipv6: fix disable_policy for fwd packets
In reply to Greg Kroah-HartmanFrom: Nicolas Dichtel <[email protected]>
[ Upstream commit ccd27f05ae7b8ebc40af5b004e94517a919aa862 ]
The goal of commit df789fe75206 ("ipv6: Provide ipv6 version of "disable_policy" sysctl") was to have the disable_policy from ipv4 available on ipv6.
However, it's not exactly the same mechanism. On IPv4, all packets coming from an interface, which has disable_policy set, bypass the policy check. For ipv6, this is done only for local packets, ie for packets destinated to an address configured on the incoming interface.
Let's align ipv6 with ipv4 so that the 'disable_policy' sysctl has the same effect for both protocols.
My first approach was to create a new kind of route cache entries, to be able to set DST_NOPOLICY without modifying routes. This would have added a lot of code. Because the local delivery path is already handled, I choose to focus on the forwarding path to minimize code churn.
--- net/ipv6/ip6_output.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/ipv6/ip6_output.c +3 -1
@@ -479,7 +479,9 @@ int ip6_forward(struct sk_buff *skb)if (skb_warn_if_lro (skb)) goto drop; -if (!xfrm6_policy_check (NULL ,XFRM_POLICY_FWD , skb)) { +if (!net->ipv6.devconf_all->disable_policy && + !idev->cnf.disable_policy && + !xfrm6_policy_check (NULL ,XFRM_POLICY_FWD , skb)) {__IP6_INC_STATS (net, idev,IPSTATS_MIB_INDISCARDS ); goto drop; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 24/223 stmmac: platform: Fix signedness bug in stmmac_probe_config_dt()
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
[ Upstream commit eca81f09145d765c21dd8fb1ba5d874ca255c32c ]
The "plat->phy_interface" variable is an enum and in this context GCC will treat it as an unsigned int so the error handling is never triggered.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +5 -3
@@ -399,6 +399,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)struct device_node *np = pdev->dev.of_node;struct plat_stmmacenet_data *plat;struct stmmac_dma_cfg *dma_cfg; +int phy_mode;void *ret;int rc;
@@ -414,10 +415,11 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)eth_zero_addr (mac); } - plat->phy_interface =device_get_phy_mode (&pdev->dev); -if (plat->phy_interface <0 ) -return ERR_PTR (plat->phy_interface); + phy_mode =device_get_phy_mode (&pdev->dev); +if (phy_mode <0 ) +return ERR_PTR (phy_mode); + plat->phy_interface = phy_mode; plat->interface =stmmac_of_get_mac_mode (np);if (plat->interface <0 ) plat->interface = plat->phy_interface;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 25/223 selftests: icmp_redirect: remove from checking for IPv6 route get
In reply to Greg Kroah-HartmanFrom: Hangbin Liu <[email protected]>
[ Upstream commit 24b671aad4eae423e1abf5b7f08d9a5235458b8d ]
If the kernel doesn't enable option CONFIG_IPV6_SUBTREES, the RTA_SRC info will not be exported to userspace in rt6_fill_node(). And ip cmd will not print "from ::" to the route output. So remove this check.
--- tools/testing/selftests/net/icmp_redirect.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/icmp_redirect.sh +1 -1
@@ -311,7 +311,7 @@ check_exception() if [ "$with_redirect" = "yes" ]; then ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | \ - grep -q "${H2_N2_IP6} from :: via ${R2_LLADDR} dev br0.*${mtu}" + grep -q "${H2_N2_IP6} .*via ${R2_LLADDR} dev br0.*${mtu}" elif [ -n "${mtu}" ]; then ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | \ grep -q "${mtu}"
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 26/223 selftests: icmp_redirect: IPv6 PMTU info should be cleared after redirect
In reply to Greg Kroah-HartmanFrom: Hangbin Liu <[email protected]>
[ Upstream commit 0e02bf5de46ae30074a2e1a8194a422a84482a1a ]
After redirecting, it's already a new path. So the old PMTU info should be cleared. The IPv6 test "mtu exception plus redirect" should only has redirect info without old PMTU.
The IPv4 test can not be changed because of legacy.
--- tools/testing/selftests/net/icmp_redirect.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/testing/selftests/net/icmp_redirect.sh +3 -2
@@ -309,9 +309,10 @@ check_exception() fi log_test $? 0 "IPv4: ${desc}" - if [ "$with_redirect" = "yes" ]; then + # No PMTU info for test "redirect" and "mtu exception plus redirect" + if [ "$with_redirect" = "yes" ] && [ "$desc" != "redirect exception plus mtu" ]; then ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | \ - grep -q "${H2_N2_IP6} .*via ${R2_LLADDR} dev br0.*${mtu}" + grep -v "mtu" | grep -q "${H2_N2_IP6} .*via ${R2_LLADDR} dev br0" elif [ -n "${mtu}" ]; then ip -netns h1 -6 ro get ${H1_VRF_ARG} ${H2_N2_IP6} | \ grep -q "${mtu}"
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 27/223 pwm: sprd: Ensure configuring period and duty_cycle isnt wrongly skipped
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 65e2e6c1c20104ed19060a38f4edbf14e9f9a9a5 ]
As the last call to sprd_pwm_apply() might have exited early if state->enabled was false, the values for period and duty_cycle stored in pwm->state might not have been written to hardware and it must be ensured that they are configured before enabling the PWM.
--- drivers/pwm/pwm-sprd.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/pwm/pwm-sprd.c +4 -7
@@ -183,13 +183,10 @@ static int sprd_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, } } -if (state->period != cstate->period || - state->duty_cycle != cstate->duty_cycle) { - ret =sprd_pwm_config (spc, pwm, state->duty_cycle, - state->period); -if (ret) -return ret; - } + ret =sprd_pwm_config (spc, pwm, state->duty_cycle, + state->period); +if (ret) +return ret;sprd_pwm_write (spc, pwm->hwpwm,SPRD_PWM_ENABLE ,1 ); }else if (cstate->enabled) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 28/223 cxgb4: fix IRQ free race during driver unload
In reply to Greg Kroah-HartmanFrom: Shahjada Abul Husain <[email protected]>
[ Upstream commit 015fe6fd29c4b9ac0f61b8c4455ef88e6018b9cc ]
IRQs are requested during driver's ndo_open() and then later freed up in disable_interrupts() during driver unload. A race exists where driver can set the CXGB4_FULL_INIT_DONE flag in ndo_open() after the disable_interrupts() in driver unload path checks it, and hence misses calling free_irq().
Fix by unregistering netdevice first and sync with driver's ndo_open(). This ensures disable_interrupts() checks the flag correctly and frees up the IRQs properly.
--- .../net/ethernet/chelsio/cxgb4/cxgb4_main.c | 18 ++++++++++-------- drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c | 3 +++ 2 files changed, 13 insertions(+), 8 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +10 -8
@@ -2643,6 +2643,9 @@ static void detach_ulds(struct adapter *adap) {unsigned int i; +if (!is_uld (adap)) +return ; +mutex_lock (&uld_mutex);list_del (&adap->list_node);
@@ -7141,10 +7144,13 @@ static void remove_one(struct pci_dev *pdev)*/ destroy_workqueue (adapter->workq); -if (is_uld (adapter)) { -detach_ulds (adapter); -t4_uld_clean_up (adapter); - } +detach_ulds (adapter); + +for_each_port (adapter, i) +if (adapter->port[i]->reg_state ==NETREG_REGISTERED ) +unregister_netdev (adapter->port[i]); + +t4_uld_clean_up (adapter);adap_free_hma_mem (adapter);
@@ -7152,10 +7158,6 @@ static void remove_one(struct pci_dev *pdev)cxgb4_free_mps_ref_entries (adapter); -for_each_port (adapter, i) -if (adapter->port[i]->reg_state ==NETREG_REGISTERED ) -unregister_netdev (adapter->port[i]); -debugfs_remove_recursive (adapter->debugfs_root);if (!is_t4 (adapter->params.chip))
drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c +3 -0
@@ -581,6 +581,9 @@ void t4_uld_clean_up(struct adapter *adap) {unsigned int i; +if (!is_uld (adap)) +return ; +mutex_lock (&uld_mutex);for (i =0 ; i <CXGB4_ULD_MAX ; i++) {if (!adap->uld[i].handle)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 29/223 drm/vmwgfx: Fix a bad merge in otable batch takedown
In reply to Greg Kroah-HartmanFrom: Zack Rusin <[email protected]>
[ Upstream commit 34bd46bcf3de72cbffcdc42d3fa67e543d1c869b ]
Change2ef4fb92363c ("drm/vmwgfx: Make sure bo's are unpinned before putting them back") caused a conflict in one of the drm trees and the merge commit68a32ba14177 ("Merge tag 'drm-next-2021-04-28' of git://anongit.freedesktop.org/drm/drm")
accidently re-added code that the original change was removing.
Fixed by removing the incorrect buffer unpin - it has already been unpinned two lines above.
--- drivers/gpu/drm/vmwgfx/vmwgfx_mob.c | 1 - 1 file changed, 1 deletion(-)
drivers/gpu/drm/vmwgfx/vmwgfx_mob.c +0 -1
@@ -354,7 +354,6 @@ static void vmw_otable_batch_takedown(struct vmw_private *dev_priv,ttm_bo_unpin (bo);ttm_bo_unreserve (bo); -ttm_bo_unpin (batch->otable_bo);ttm_bo_put (batch->otable_bo); batch->otable_bo =NULL ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 30/223 mptcp: fix warning in __skb_flow_dissect() when do syn cookie for subflow join
In reply to Greg Kroah-HartmanFrom: Jianguo Wu <[email protected]>
[ Upstream commit 0c71929b5893e410e0efbe1bbeca6f19a5f19956 ]
I did stress test with wrk[1] and webfsd[2] with the assistance of mptcp-tools[3]:
Server side:
./use_mptcp.sh webfsd -4 -R /tmp/ -p 8099
Client side:
./use_mptcp.sh wrk -c 200 -d 30 -t 4 http://192.168.174.129:8099/and got the following warning message:
[ 55.552626] TCP: request_sock_subflow: Possible SYN flooding on port 8099. Sending cookies. Check SNMP counters. [ 55.553024] ------------[ cut here ]------------ [ 55.553027] WARNING: CPU: 0 PID: 10 at net/core/flow_dissector.c:984 __skb_flow_dissect+0x280/0x1650 ... [ 55.553117] CPU: 0 PID: 10 Comm: ksoftirqd/0 Not tainted 5.12.0+ #18 [ 55.553121] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 02/27/2020 [ 55.553124] RIP: 0010:__skb_flow_dissect+0x280/0x1650 ... [ 55.553133] RSP: 0018:ffffb79580087770 EFLAGS: 00010246 [ 55.553137] RAX: 0000000000000000 RBX: ffffffff8ddb58e0 RCX: ffffb79580087888 [ 55.553139] RDX: ffffffff8ddb58e0 RSI: ffff8f7e4652b600 RDI: 0000000000000000 [ 55.553141] RBP: ffffb79580087858 R08: 0000000000000000 R09: 0000000000000008 [ 55.553143] R10: 000000008c622965 R11: 00000000d3313a5b R12: ffff8f7e4652b600 [ 55.553146] R13: ffff8f7e465c9062 R14: 0000000000000000 R15: ffffb79580087888 [ 55.553149] FS: 0000000000000000(0000) GS:ffff8f7f75e00000(0000) knlGS:0000000000000000 [ 55.553152] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 55.553154] CR2: 00007f73d1d19000 CR3: 0000000135e10004 CR4: 00000000003706f0 [ 55.553160] Call Trace: [ 55.553166] ? __sha256_final+0x67/0xd0 [ 55.553173] ? sha256+0x7e/0xa0 [ 55.553177] __skb_get_hash+0x57/0x210 [ 55.553182] subflow_init_req_cookie_join_save+0xac/0xc0 [ 55.553189] subflow_check_req+0x474/0x550 [ 55.553195] ? ip_route_output_key_hash+0x67/0x90 [ 55.553200] ? xfrm_lookup_route+0x1d/0xa0 [ 55.553207] subflow_v4_route_req+0x8e/0xd0 [ 55.553212] tcp_conn_request+0x31e/0xab0 [ 55.553218] ? selinux_socket_sock_rcv_skb+0x116/0x210 [ 55.553224] ? tcp_rcv_state_process+0x179/0x6d0 [ 55.553229] tcp_rcv_state_process+0x179/0x6d0 [ 55.553235] tcp_v4_do_rcv+0xaf/0x220 [ 55.553239] tcp_v4_rcv+0xce4/0xd80 [ 55.553243] ? ip_route_input_rcu+0x246/0x260 [ 55.553248] ip_protocol_deliver_rcu+0x35/0x1b0 [ 55.553253] ip_local_deliver_finish+0x44/0x50 [ 55.553258] ip_local_deliver+0x6c/0x110 [ 55.553262] ? ip_rcv_finish_core.isra.19+0x5a/0x400 [ 55.553267] ip_rcv+0xd1/0xe0
...
After debugging, I found in __skb_flow_dissect(), skb->dev and skb->sk are both NULL, then net is NULL, and trigger WARN_ON_ONCE(!net), actually net is always NULL in this code path, as skb->dev is set to NULL in tcp_v4_rcv(), and skb->sk is never set.
Code snippet in __skb_flow_dissect() that trigger warning:
975 if (skb) {
976 if (!net) {
977 if (skb->dev)
978 net = dev_net(skb->dev);
979 else if (skb->sk)
980 net = sock_net(skb->sk);
981 }
982 }
983
984 WARN_ON_ONCE(!net);
So, using seq and transport header derived hash.
[1] https://github.com/wg/wrk
[2] https://github.com/ourway/webfsd
[3] https://github.com/pabeni/mptcp-tools
--- net/mptcp/syncookies.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
net/mptcp/syncookies.c +15 -1
@@ -37,7 +37,21 @@ static spinlock_t join_entry_locks[COOKIE_JOIN_SLOTS] __cacheline_aligned_in_smpstatic u32 mptcp_join_entry_hash (struct sk_buff *skb,struct net *net) { -u32 i =skb_get_hash (skb) ^net_hash_mix (net); +static u32 mptcp_join_hash_secret__read_mostly ; +struct tcphdr *th =tcp_hdr (skb); +u32 seq, i; + +net_get_random_once (&mptcp_join_hash_secret, +sizeof (mptcp_join_hash_secret)); + +if (th->syn) + seq =TCP_SKB_CB (skb)->seq; +else + seq =TCP_SKB_CB (skb)->seq -1 ; + + i =jhash_3words (seq,net_hash_mix (net), + (__force __u32 )th->source <<16 | (__force __u32 )th->dest, + mptcp_join_hash_secret);return i %ARRAY_SIZE (join_entries); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 31/223 mptcp: remove redundant req destruct in subflow_check_req()
In reply to Greg Kroah-HartmanFrom: Jianguo Wu <[email protected]>
[ Upstream commit 030d37bd1cd2443a1f21db47eb301899bfa45a2a ]
In subflow_check_req(), if subflow sport is mismatch, will put msk, destroy token, and destruct req, then return -EPERM, which can be done by subflow_req_destructor() via:
tcp_conn_request()
|--__reqsk_free()
|--subflow_req_destructor()So we should remove these redundant code, otherwise will call tcp_v4_reqsk_destructor() twice, and may double free inet_rsk(req)->ireq_opt.
--- net/mptcp/subflow.c | 5 ----- 1 file changed, 5 deletions(-)
net/mptcp/subflow.c +0 -5
@@ -212,11 +212,6 @@ again:ntohs (inet_sk (sk_listener)->inet_sport), ntohs(inet_sk((struct sock *)subflow_req->msk)->inet_sport));if (!mptcp_pm_sport_in_anno_list (subflow_req->msk, sk_listener)) { -sock_put ((struct sock *)subflow_req->msk); -mptcp_token_destroy_request (req); - tcp_request_sock_ops.destructor (req); - subflow_req->msk =NULL ; - subflow_req->mp_join =0 ;SUBFLOW_REQ_INC_STATS (req,MPTCP_MIB_MISMATCHPORTSYNRX );return -EPERM ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 32/223 mptcp: fix syncookie process if mptcp can not_accept new subflow
In reply to Greg Kroah-HartmanFrom: Jianguo Wu <[email protected]>
[ Upstream commit 8547ea5f52dd8ef19b69c25c41b1415481b3503b ]
Lots of "TCP: tcp_fin: Impossible, sk->sk_state=7" in client side when doing stress testing using wrk and webfsd.
There are at least two cases may trigger this warning:
1.mptcp is in syncookie, and server recv MP_JOIN SYN request,
in subflow_check_req(), the mptcp_can_accept_new_subflow() return false, so subflow_init_req_cookie_join_save() isn't called, i.e. not store the data present in the MP_JOIN syn request and the random nonce in hash table - join_entries[], but still send synack. When recv 3rd-ack, mptcp_token_join_cookie_init_state() will return false, and 3rd-ack is dropped, then if mptcp conn is closed by client, client will send a DATA_FIN and a MPTCP FIN, the DATA_FIN doesn't have MP_CAPABLE or MP_JOIN,
so mptcp_subflow_init_cookie_req() will return 0, and pass the cookie check, MP_JOIN request is fallback to normal TCP. Server will send a TCP FIN if closed, in client side, when process TCP FIN, it will do reset, the code path is:
tcp_data_queue()->mptcp_incoming_options()
->check_fully_established()->mptcp_subflow_reset(). mptcp_subflow_reset() will set sock state to TCP_CLOSE, so tcp_fin will hit TCP_CLOSE, and print the warning.
2.mptcp is in syncookie, and server recv 3rd-ack, in
mptcp_subflow_init_cookie_req(), mptcp_can_accept_new_subflow() return false, and subflow_req->mp_join is not set to 1, so in subflow_syn_recv_sock() will not reset the MP_JOIN subflow, but fallback to normal TCP, and then the same thing happens when server will send a TCP FIN if closed.
For case1, subflow_check_req() return -EPERM,
then tcp_conn_request() will drop MP_JOIN SYN.
For case2, let subflow_syn_recv_sock() call mptcp_can_accept_new_subflow(), and do fatal fallback, send reset.
--- net/mptcp/subflow.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/mptcp/subflow.c +3 -3
@@ -223,6 +223,8 @@ again:if (unlikely (req->syncookie)) {if (mptcp_can_accept_new_subflow (subflow_req->msk))subflow_init_req_cookie_join_save (subflow_req, skb); +else +return -EPERM ; } pr_debug("token=%u, remote_nonce=%u msk=%p", subflow_req->token,
@@ -262,9 +264,7 @@ int mptcp_subflow_init_cookie_req(struct request_sock *req,if (!mptcp_token_join_cookie_init_state (subflow_req, skb))return -EINVAL ; -if (mptcp_can_accept_new_subflow (subflow_req->msk)) - subflow_req->mp_join =1 ; - + subflow_req->mp_join =1 ; subflow_req->ssn_offset =TCP_SKB_CB (skb)->seq -1 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 33/223 mptcp: add sk parameter for mptcp_get_options
In reply to Greg Kroah-HartmanFrom: Geliang Tang <[email protected]>
[ Upstream commit c863225b79426459feca2ef5b0cc2f07e8e68771 ]
This patch added a new parameter name sk in mptcp_get_options().
--- net/mptcp/options.c | 5 +++-- net/mptcp/protocol.h | 3 ++- net/mptcp/subflow.c | 10 +++++----- 3 files changed, 10 insertions(+), 8 deletions(-)
net/mptcp/options.c +3 -2
@@ -323,7 +323,8 @@ static void mptcp_parse_option(const struct sk_buff *skb, } } -void mptcp_get_options (const struct sk_buff *skb, +void mptcp_get_options (const struct sock *sk, +const struct sk_buff *skb,struct mptcp_options_received *mp_opt) {const struct tcphdr *th =tcp_hdr (skb);
@@ -1010,7 +1011,7 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)return ; } -mptcp_get_options (skb, &mp_opt); +mptcp_get_options (sk, skb, &mp_opt);if (!check_fully_established (msk, sk, subflow, skb, &mp_opt))return ;
net/mptcp/protocol.h +2 -1
@@ -576,7 +576,8 @@ int __init mptcp_proto_v6_init(void);struct sock *mptcp_sk_clone (const struct sock *sk,const struct mptcp_options_received *mp_opt,struct request_sock *req); -void mptcp_get_options (const struct sk_buff *skb, +void mptcp_get_options (const struct sock *sk, +const struct sk_buff *skb,struct mptcp_options_received *mp_opt);void mptcp_finish_connect (struct sock *sk);
net/mptcp/subflow.c +5 -5
@@ -150,7 +150,7 @@ static int subflow_check_req(struct request_sock *req,return -EINVAL ;#endif -mptcp_get_options (skb, &mp_opt); +mptcp_get_options (sk_listener, skb, &mp_opt);if (mp_opt.mp_capable) {SUBFLOW_REQ_INC_STATS (req,MPTCP_MIB_MPCAPABLEPASSIVE );
@@ -244,7 +244,7 @@ int mptcp_subflow_init_cookie_req(struct request_sock *req,int err;subflow_init_req (req, sk_listener); -mptcp_get_options (skb, &mp_opt); +mptcp_get_options (sk_listener, skb, &mp_opt);if (mp_opt.mp_capable && mp_opt.mp_join)return -EINVAL ;
@@ -403,7 +403,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb) subflow->ssn_offset =TCP_SKB_CB (skb)->seq;pr_debug ("subflow=%p synack seq=%x" , subflow, subflow->ssn_offset); -mptcp_get_options (skb, &mp_opt); +mptcp_get_options (sk, skb, &mp_opt);if (subflow->request_mptcp) {if (!mp_opt.mp_capable) { MPTCP_INC_STATS(sock_net(sk),
@@ -650,7 +650,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,* reordered MPC will cause fallback, but we don't have other * options. */ -mptcp_get_options (skb, &mp_opt); +mptcp_get_options (sk, skb, &mp_opt);if (!mp_opt.mp_capable) { fallback = true; goto create_child;
@@ -660,7 +660,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,if (!new_msk) fallback = true; }else if (subflow_req->mp_join) { -mptcp_get_options (skb, &mp_opt); +mptcp_get_options (sk, skb, &mp_opt);if (!mp_opt.mp_join || !subflow_hmac_valid (req, &mp_opt) || !mptcp_can_accept_new_subflow (subflow_req->msk)) {SUBFLOW_REQ_INC_STATS (req,MPTCP_MIB_JOINACKMAC );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 34/223 mptcp: avoid processing packet if a subflow reset
In reply to Greg Kroah-HartmanFrom: Jianguo Wu <[email protected]>
[ Upstream commit 6787b7e350d3552651a3422d3d8980fbc8d65368 ]
If check_fully_established() causes a subflow reset, it should not continue to process the packet in tcp_data_queue().
Add a return value to mptcp_incoming_options(), and return false if a subflow has been reset, else return true. Then drop the packet in tcp_data_queue()/tcp_rcv_state_process() if mptcp_incoming_options() return false.
--- include/net/mptcp.h | 5 +++-- net/ipv4/tcp_input.c | 19 +++++++++++++++---- net/mptcp/options.c | 19 +++++++++++++------ 3 files changed, 31 insertions(+), 12 deletions(-)
include/net/mptcp.h +3 -2
@@ -101,7 +101,7 @@ bool mptcp_synack_options(const struct request_sock *req, unsigned int *size,bool mptcp_established_options (struct sock *sk,struct sk_buff *skb,unsigned int *size,unsigned int remaining,struct mptcp_out_options *opts); -void mptcp_incoming_options (struct sock *sk,struct sk_buff *skb); +bool mptcp_incoming_options (struct sock *sk,struct sk_buff *skb);void mptcp_write_options (__be32 *ptr,const struct tcp_sock *tp,struct mptcp_out_options *opts);
@@ -223,9 +223,10 @@ static inline bool mptcp_established_options(struct sock *sk,return false; } -static inline void mptcp_incoming_options (struct sock *sk, +static inline bool mptcp_incoming_options (struct sock *sk,struct sk_buff *skb) { +return true; } static inline void mptcp_skb_ext_move(struct sk_buff *to,
net/ipv4/tcp_input.c +15 -4
@@ -4247,6 +4247,9 @@ void tcp_reset(struct sock *sk, struct sk_buff *skb) {trace_tcp_receive_reset (sk); +/* mptcp can't tell us to ignore reset pkts, +* so just ignore the return value of mptcp_incoming_options(). +*/ if (sk_is_mptcp (sk))mptcp_incoming_options (sk, skb);
@@ -4941,8 +4944,13 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)bool fragstolen;int eaten; -if (sk_is_mptcp (sk)) -mptcp_incoming_options (sk, skb); +/* If a subflow has been reset, the packet should not continue +* to be processed, drop the packet. +*/ +if (sk_is_mptcp (sk) && !mptcp_incoming_options (sk, skb)) { +__kfree_skb (skb); +return ; + }if (TCP_SKB_CB (skb)->seq ==TCP_SKB_CB (skb)->end_seq) {__kfree_skb (skb);
@@ -6522,8 +6530,11 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)case TCP_CLOSING :case TCP_LAST_ACK :if (!before (TCP_SKB_CB (skb)->seq, tp->rcv_nxt)) { -if (sk_is_mptcp (sk)) -mptcp_incoming_options (sk, skb); +/* If a subflow has been reset, the packet should not +* continue to be processed, drop the packet. +*/ +if (sk_is_mptcp (sk) && !mptcp_incoming_options (sk, skb)) + goto discard;break ; } fallthrough;
net/mptcp/options.c +13 -6
@@ -990,7 +990,8 @@ static bool add_addr_hmac_valid(struct mptcp_sock *msk,return hmac == mp_opt->ahmac; } -void mptcp_incoming_options (struct sock *sk,struct sk_buff *skb) +/* Return false if a subflow has been reset, else return true */ +bool mptcp_incoming_options (struct sock *sk,struct sk_buff *skb) {struct mptcp_subflow_context *subflow =mptcp_subflow_ctx (sk);struct mptcp_sock *msk =mptcp_sk (subflow->conn);
@@ -1008,12 +1009,16 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)__mptcp_check_push (subflow->conn, sk);__mptcp_data_acked (subflow->conn);mptcp_data_unlock (subflow->conn); -return ; +return true; }mptcp_get_options (sk, skb, &mp_opt); + +/* The subflow can be in close state only if check_fully_established() +* just sent a reset. If so, tell the caller to ignore the current packet. +*/ if (!check_fully_established (msk, sk, subflow, skb, &mp_opt)) -return ; +return sk->sk_state !=TCP_CLOSE ;if (mp_opt.fastclose && msk->local_key == mp_opt.rcvr_key) {
@@ -1055,7 +1060,7 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) }if (!mp_opt.dss) -return ; +return true;/* we can't wait for recvmsg() to update the ack_seq, otherwise * monodirectional flows will stuck
@@ -1074,12 +1079,12 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) schedule_work(&msk->work))sock_hold (subflow->conn); -return ; +return true; } mpext =skb_ext_add (skb,SKB_EXT_MPTCP );if (!mpext) -return ; +return true;memset (mpext,0 ,sizeof (*mpext));
@@ -1104,6 +1109,8 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) mpext->data_len = mp_opt.data_len; mpext->use_map =1 ; } + +return true; }static void mptcp_set_rwin (const struct tcp_sock *tp)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 35/223 selftests: mptcp: fix case multiple subflows limited by server
In reply to Greg Kroah-HartmanFrom: Jianguo Wu <[email protected]>
[ Upstream commit a7da441621c7945fbfd43ed239c93b8073cda502 ]
After patch "mptcp: fix syncookie process if mptcp can not_accept new subflow", if subflow is limited, MP_JOIN SYN is dropped, and no SYN/ACK will be replied.
So in case "multiple subflows limited by server", the expected SYN/ACK number should be 1.
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/mptcp/mptcp_join.sh +1 -1
@@ -1341,7 +1341,7 @@ syncookies_tests() ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow run_tests $ns1 $ns2 10.0.1.1 - chk_join_nr "subflows limited by server w cookies" 2 2 1 + chk_join_nr "subflows limited by server w cookies" 2 1 1 # test signal address with cookies reset_with_cookies
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 36/223 mptcp: use fast lock for subflows when possible
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 75e908c33615999abe1f3a8429d25dea30d28e4e ]
There are a bunch of callsite where the ssk socket lock is acquired using the full-blown version eligible for the fast variant. Let's move to the latter.
--- net/mptcp/pm_netlink.c | 10 ++++++---- net/mptcp/protocol.c | 15 +++++++++------ 2 files changed, 15 insertions(+), 10 deletions(-)
net/mptcp/pm_netlink.c +6 -4
@@ -540,6 +540,7 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk) subflow =list_first_entry_or_null (&msk->conn_list,typeof (*subflow), node);if (subflow) {struct sock *ssk =mptcp_subflow_tcp_sock (subflow); +bool slow;spin_unlock_bh (&msk->pm.lock); pr_debug("send ack for %s%s%s",
@@ -547,9 +548,9 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk)mptcp_pm_should_add_signal_ipv6 (msk) ?" [ipv6]" :"" , mptcp_pm_should_add_signal_port(msk) ? " [port]" : ""); -lock_sock (ssk); + slow =lock_sock_fast (ssk);tcp_send_ack (ssk); -release_sock (ssk); +unlock_sock_fast (ssk, slow);spin_lock_bh (&msk->pm.lock); } }
@@ -566,6 +567,7 @@ int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,struct sock *ssk =mptcp_subflow_tcp_sock (subflow);struct sock *sk = (struct sock *)msk;struct mptcp_addr_info local; +bool slow;local_address ((struct sock_common *)ssk, &local);if (!addresses_equal (&local, addr, addr->port))
@@ -578,9 +580,9 @@ int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,spin_unlock_bh (&msk->pm.lock);pr_debug ("send ack for mp_prio" ); -lock_sock (ssk); + slow =lock_sock_fast (ssk);tcp_send_ack (ssk); -release_sock (ssk); +unlock_sock_fast (ssk, slow);spin_lock_bh (&msk->pm.lock);return 0 ;
net/mptcp/protocol.c +9 -6
@@ -424,23 +424,25 @@ static void mptcp_send_ack(struct mptcp_sock *msk)mptcp_for_each_subflow (msk, subflow) {struct sock *ssk =mptcp_subflow_tcp_sock (subflow); +bool slow; -lock_sock (ssk); + slow =lock_sock_fast (ssk);if (tcp_can_send_ack (ssk))tcp_send_ack (ssk); -release_sock (ssk); +unlock_sock_fast (ssk, slow); } }static bool mptcp_subflow_cleanup_rbuf (struct sock *ssk) { +bool slow;int ret; -lock_sock (ssk); + slow =lock_sock_fast (ssk); ret =tcp_can_send_ack (ssk);if (ret)tcp_cleanup_rbuf (ssk,1 ); -release_sock (ssk); +unlock_sock_fast (ssk, slow);return ret; }
@@ -2288,13 +2290,14 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk)list_for_each_entry_safe (subflow, tmp, &msk->conn_list, node) {struct sock *tcp_sk =mptcp_subflow_tcp_sock (subflow); +bool slow; -lock_sock (tcp_sk); + slow =lock_sock_fast (tcp_sk);if (tcp_sk->sk_state !=TCP_CLOSE ) {tcp_send_active_reset (tcp_sk,GFP_ATOMIC );tcp_set_state (tcp_sk,TCP_CLOSE ); } -release_sock (tcp_sk); +unlock_sock_fast (tcp_sk, slow); }inet_sk_state_store (sk,TCP_CLOSE );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 37/223 mptcp: refine mptcp_cleanup_rbuf
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit fde56eea01f96b664eb63033990be0fd2a945da5 ]
The current cleanup rbuf tries a bit too hard to avoid acquiring the subflow socket lock. We may end-up delaying the needed ack, or skip acking a blocked subflow.
Address the above extending the conditions used to trigger the cleanup to reflect more closely what TCP does and invoking tcp_cleanup_rbuf() on all the active subflows.
Note that we can't replicate the exact tests implemented in tcp_cleanup_rbuf(), as MPTCP lacks some of the required info - e.g. ping-pong mode.
--- net/mptcp/protocol.c | 56 ++++++++++++++++++-------------------------- net/mptcp/protocol.h | 1 - 2 files changed, 23 insertions(+), 34 deletions(-)
net/mptcp/protocol.c +23 -33
@@ -433,49 +433,46 @@ static void mptcp_send_ack(struct mptcp_sock *msk) } } -static bool mptcp_subflow_cleanup_rbuf (struct sock *ssk) +static void mptcp_subflow_cleanup_rbuf (struct sock *ssk) {bool slow; -int ret; slow =lock_sock_fast (ssk); - ret =tcp_can_send_ack (ssk); -if (ret) +if (tcp_can_send_ack (ssk))tcp_cleanup_rbuf (ssk,1 );unlock_sock_fast (ssk, slow); -return ret; +} + +static bool mptcp_subflow_could_cleanup (const struct sock *ssk,bool rx_empty) +{ +const struct inet_connection_sock *icsk =inet_csk (ssk); +bool ack_pending =READ_ONCE (icsk->icsk_ack.pending); +const struct tcp_sock *tp =tcp_sk (ssk); + +return (ack_pending &ICSK_ACK_SCHED ) && + ((READ_ONCE (tp->rcv_nxt) -READ_ONCE (tp->rcv_wup) > +READ_ONCE (icsk->icsk_ack.rcv_mss)) || + (rx_empty && ack_pending & + (ICSK_ACK_PUSHED2 |ICSK_ACK_PUSHED ))); }static void mptcp_cleanup_rbuf (struct mptcp_sock *msk) { -struct sock *ack_hint =READ_ONCE (msk->ack_hint);int old_space =READ_ONCE (msk->old_wspace);struct mptcp_subflow_context *subflow;struct sock *sk = (struct sock *)msk; -bool cleanup; +int space =__mptcp_space (sk); +bool cleanup, rx_empty; -/* this is a simple superset of what tcp_cleanup_rbuf() implements -* so that we don't have to acquire the ssk socket lock most of the time -* to do actually nothing -*/ - cleanup =__mptcp_space (sk) - old_space >=max (0 , old_space); -if (!cleanup) -return ; + cleanup = (space >0 ) && (space >= (old_space <<1 )); + rx_empty = !atomic_read (&sk->sk_rmem_alloc); -/* if the hinted ssk is still active, try to use it */ -if (likely (ack_hint)) { -mptcp_for_each_subflow (msk, subflow) { -struct sock *ssk =mptcp_subflow_tcp_sock (subflow); +mptcp_for_each_subflow (msk, subflow) { +struct sock *ssk =mptcp_subflow_tcp_sock (subflow); -if (ack_hint == ssk &&mptcp_subflow_cleanup_rbuf (ssk)) -return ; - } +if (cleanup ||mptcp_subflow_could_cleanup (ssk, rx_empty)) +mptcp_subflow_cleanup_rbuf (ssk); } - -/* otherwise pick the first active subflow */ -mptcp_for_each_subflow (msk, subflow) -if (mptcp_subflow_cleanup_rbuf (mptcp_subflow_tcp_sock (subflow))) -return ; }static bool mptcp_check_data_fin (struct sock *sk)
@@ -620,7 +617,6 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,break ; } }while (more_data_avail); -WRITE_ONCE (msk->ack_hint, ssk); *bytes += moved;return done;
@@ -1955,7 +1951,6 @@ static bool __mptcp_move_skbs(struct mptcp_sock *msk)__mptcp_update_rmem (sk); done =__mptcp_move_skbs_from_subflow (msk, ssk, &moved);mptcp_data_unlock (sk); -tcp_cleanup_rbuf (ssk, moved);if (unlikely (ssk->sk_err))__mptcp_error_report (sk);
@@ -1971,7 +1966,6 @@ static bool __mptcp_move_skbs(struct mptcp_sock *msk) ret |=__mptcp_ofo_queue (msk);__mptcp_splice_receive_queue (sk);mptcp_data_unlock (sk); -mptcp_cleanup_rbuf (msk); }if (ret)mptcp_check_data_fin ((struct sock *)msk);
@@ -2216,9 +2210,6 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,if (ssk == msk->last_snd) msk->last_snd =NULL ; -if (ssk == msk->ack_hint) - msk->ack_hint =NULL ; -if (ssk == msk->first) msk->first =NULL ;
@@ -2433,7 +2424,6 @@ static int __mptcp_init_sock(struct sock *sk) msk->tx_pending_data =0 ; msk->size_goal_cache =TCP_BASE_MSS ; - msk->ack_hint =NULL ; msk->first =NULL ;inet_csk (sk)->icsk_sync_mss = mptcp_sync_mss;
net/mptcp/protocol.h +0 -1
@@ -236,7 +236,6 @@ struct mptcp_sock {bool rcv_fastclose;bool use_64bit_ack;/* Set when we received a 64-bit DSN */ spinlock_t join_list_lock; -struct sock *ack_hint;struct work_struct work;struct sk_buff *ooo_last_skb;struct rb_root out_of_order_queue;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 38/223 mptcp: properly account bulk freed memory
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit ce599c516386f09ca30848a1a4eb93d3fffbe187 ]
After commit 879526030c8b ("mptcp: protect the rx path with the msk socket spinlock") the rmem currently used by a given msk is really sk_rmem_alloc - rmem_released.
The safety check in mptcp_data_ready() does not take the above in due account, as a result legit incoming data is kept in subflow receive queue with no reason, delaying or blocking MPTCP-level ack generation.
This change addresses the issue introducing a new helper to fetch the rmem memory and using it as needed. Additionally add a MIB counter for the exceptional event described above - the peer is misbehaving.
Finally, introduce the required annotation when rmem_released is updated.
--- net/mptcp/mib.c | 1 + net/mptcp/mib.h | 1 + net/mptcp/protocol.c | 12 +++++++----- net/mptcp/protocol.h | 10 +++++++++- 4 files changed, 18 insertions(+), 6 deletions(-)
net/mptcp/mib.c +1 -0
@@ -42,6 +42,7 @@ static const struct snmp_mib mptcp_snmp_list[] = {SNMP_MIB_ITEM ("RmSubflow" ,MPTCP_MIB_RMSUBFLOW ),SNMP_MIB_ITEM ("MPPrioTx" ,MPTCP_MIB_MPPRIOTX ),SNMP_MIB_ITEM ("MPPrioRx" ,MPTCP_MIB_MPPRIORX ), +SNMP_MIB_ITEM ("RcvPruned" ,MPTCP_MIB_RCVPRUNED ), SNMP_MIB_SENTINEL };
net/mptcp/mib.h +1 -0
@@ -35,6 +35,7 @@ enum linux_mptcp_mib_field {MPTCP_MIB_RMSUBFLOW ,/* Remove a subflow */ MPTCP_MIB_MPPRIOTX ,/* Transmit a MP_PRIO */ MPTCP_MIB_MPPRIORX ,/* Received a MP_PRIO */ +MPTCP_MIB_RCVPRUNED ,/* Incoming packet dropped due to memory limit */ __MPTCP_MIB_MAX };
net/mptcp/protocol.c +7 -5
@@ -465,7 +465,7 @@ static void mptcp_cleanup_rbuf(struct mptcp_sock *msk)bool cleanup, rx_empty; cleanup = (space >0 ) && (space >= (old_space <<1 )); - rx_empty = !atomic_read (&sk->sk_rmem_alloc); + rx_empty = !__mptcp_rmem (sk);mptcp_for_each_subflow (msk, subflow) {struct sock *ssk =mptcp_subflow_tcp_sock (subflow);
@@ -714,8 +714,10 @@ void mptcp_data_ready(struct sock *sk, struct sock *ssk) sk_rbuf = ssk_rbuf;/* over limit? can't append more skbs to msk, Also, no need to wake-up*/ -if (atomic_read (&sk->sk_rmem_alloc) > sk_rbuf) +if (__mptcp_rmem (sk) > sk_rbuf) { +MPTCP_INC_STATS (sock_net (sk),MPTCP_MIB_RCVPRUNED );return ; + }/* Wake-up the reader only for in-sequence data */ mptcp_data_lock (sk);
@@ -1799,7 +1801,7 @@ static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk,if (!(flags &MSG_PEEK )) {/* we will bulk release the skb memory later */ skb->destructor =NULL ; - msk->rmem_released += skb->truesize; +WRITE_ONCE (msk->rmem_released, msk->rmem_released + skb->truesize);__skb_unlink (skb, &msk->receive_queue);__kfree_skb (skb); }
@@ -1918,7 +1920,7 @@ static void __mptcp_update_rmem(struct sock *sk)atomic_sub (msk->rmem_released, &sk->sk_rmem_alloc);sk_mem_uncharge (sk, msk->rmem_released); - msk->rmem_released =0 ; +WRITE_ONCE (msk->rmem_released,0 ); }static void __mptcp_splice_receive_queue (struct sock *sk)
@@ -2420,7 +2422,7 @@ static int __mptcp_init_sock(struct sock *sk) msk->out_of_order_queue =RB_ROOT ; msk->first_pending =NULL ; msk->wmem_reserved =0 ; - msk->rmem_released =0 ; +WRITE_ONCE (msk->rmem_released,0 ); msk->tx_pending_data =0 ; msk->size_goal_cache =TCP_BASE_MSS ;
net/mptcp/protocol.h +9 -1
@@ -290,9 +290,17 @@ static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)return (struct mptcp_sock *)sk; } +/* the msk socket don't use the backlog, also account for the bulk +* free memory +*/ +static inline int __mptcp_rmem (const struct sock *sk) +{ +return atomic_read (&sk->sk_rmem_alloc) -READ_ONCE (mptcp_sk (sk)->rmem_released); +} +static inline int __mptcp_space (const struct sock *sk) { -return tcp_space (sk) +READ_ONCE (mptcp_sk (sk)->rmem_released); +return tcp_win_from_space (sk,READ_ONCE (sk->sk_rcvbuf) -__mptcp_rmem (sk)); }static inline struct mptcp_data_frag *mptcp_send_head (const struct sock *sk)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 39/223 net: phy: marvell10g: fix differentiation of 88X3310 from 88X3340
In reply to Greg Kroah-HartmanFrom: Marek Behún <[email protected]>
[ Upstream commit a5de4be0aaaa66a2fa98e8a33bdbed3bd0682804 ]
It seems that we cannot differentiate 88X3310 from 88X3340 by simply looking at bit 3 of revision ID. This only works on revisions A0 and A1. On revision B0, this bit is always 1.
Instead use the 3.d00d register for differentiation, since this register contains information about number of ports on the device.
--- drivers/net/phy/marvell10g.c | 40 +++++++++++++++++++++++++++++++----- include/linux/marvell_phy.h | 6 +----- 2 files changed, 36 insertions(+), 10 deletions(-)
drivers/net/phy/marvell10g.c +35 -5
@@ -78,6 +78,11 @@ enum {/* Temperature read register (88E2110 only) */ MV_PCS_TEMP =0x8042 , +/* Number of ports on the device */ +MV_PCS_PORT_INFO =0xd00d , +MV_PCS_PORT_INFO_NPORTS_MASK =0x0380 , +MV_PCS_PORT_INFO_NPORTS_SHIFT =7 , +/* These registers appear at 0x800X and 0xa00X - the 0xa00X control * registers appear to set themselves to the 0x800X when AN is * restarted, but status registers appear readable from either.
@@ -966,6 +971,30 @@ static const struct mv3310_chip mv2111_type = {#endif }; +static int mv3310_get_number_of_ports (struct phy_device *phydev) +{ +int ret; + + ret =phy_read_mmd (phydev,MDIO_MMD_PCS ,MV_PCS_PORT_INFO ); +if (ret <0 ) +return ret; + + ret &=MV_PCS_PORT_INFO_NPORTS_MASK ; + ret >>=MV_PCS_PORT_INFO_NPORTS_SHIFT ; + +return ret +1 ; +} + +static int mv3310_match_phy_device (struct phy_device *phydev) +{ +return mv3310_get_number_of_ports (phydev) ==1 ; +} + +static int mv3340_match_phy_device (struct phy_device *phydev) +{ +return mv3310_get_number_of_ports (phydev) ==4 ; +} +static int mv211x_match_phy_device (struct phy_device *phydev,bool has_5g) {int val;
@@ -994,7 +1023,8 @@ static int mv2111_match_phy_device(struct phy_device *phydev)static struct phy_driver mv3310_drivers[] = { { .phy_id =MARVELL_PHY_ID_88X3310 , - .phy_id_mask =MARVELL_PHY_ID_88X33X0_MASK , + .phy_id_mask =MARVELL_PHY_ID_MASK , + .match_phy_device = mv3310_match_phy_device, .name ="mv88x3310" , .driver_data = &mv3310_type, .get_features = mv3310_get_features,
@@ -1011,8 +1041,9 @@ static struct phy_driver mv3310_drivers[] = { .set_loopback = genphy_c45_loopback, }, { - .phy_id = MARVELL_PHY_ID_88X3340, - .phy_id_mask = MARVELL_PHY_ID_88X33X0_MASK, + .phy_id = MARVELL_PHY_ID_88X3310, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .match_phy_device = mv3340_match_phy_device, .name = "mv88x3340", .driver_data = &mv3340_type, .get_features = mv3310_get_features,
@@ -1069,8 +1100,7 @@ static struct phy_driver mv3310_drivers[] = {module_phy_driver (mv3310_drivers);static struct mdio_device_id __maybe_unused mv3310_tbl[] = { - {MARVELL_PHY_ID_88X3310 ,MARVELL_PHY_ID_88X33X0_MASK }, - {MARVELL_PHY_ID_88X3340 ,MARVELL_PHY_ID_88X33X0_MASK }, + {MARVELL_PHY_ID_88X3310 ,MARVELL_PHY_ID_MASK }, {MARVELL_PHY_ID_88E2110 ,MARVELL_PHY_ID_MASK }, { }, };
include/linux/marvell_phy.h +1 -5
@@ -22,14 +22,10 @@#define MARVELL_PHY_ID_88E1545 0x01410ea0#define MARVELL_PHY_ID_88E1548P 0x01410ec0#define MARVELL_PHY_ID_88E3016 0x01410e60 +#define MARVELL_PHY_ID_88X3310 0x002b09a0#define MARVELL_PHY_ID_88E2110 0x002b09b0#define MARVELL_PHY_ID_88X2222 0x01410f10 -/* PHY IDs and mask for Alaska 10G PHYs */ -#define MARVELL_PHY_ID_88X33X0_MASK 0xfffffff8 -#define MARVELL_PHY_ID_88X3310 0x002b09a0 -#define MARVELL_PHY_ID_88X3340 0x002b09a8 -/* Marvel 88E1111 in Finisar SFP module with modified PHY ID */ #define MARVELL_PHY_ID_88E1111_FINISAR 0x01ff0cc0
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 40/223 nvme-pci: do not call nvme_dev_remove_admin from nvme_remove
In reply to Greg Kroah-HartmanFrom: Casey Chen <[email protected]>
[ Upstream commit 251ef6f71be2adfd09546a26643426fe62585173 ]
nvme_dev_remove_admin could free dev->admin_q and the admin_tagset while they are being accessed by nvme_dev_disable(), which can be called by nvme_reset_work via nvme_remove_dead_ctrl.
Commit cb4bfda62afa ("nvme-pci: fix hot removal during error handling") intended to avoid requests being stuck on a removed controller by killing the admin queue. But the later fix c8e9e9b7646e ("nvme-pci: unquiesce admin queue on shutdown"), together with nvme_dev_disable(dev, true) right before nvme_dev_remove_admin() could help dispatch requests and fail them early, so we don't need nvme_dev_remove_admin() any more.
--- drivers/nvme/host/pci.c | 1 - 1 file changed, 1 deletion(-)
drivers/nvme/host/pci.c +0 -1
@@ -2998,7 +2998,6 @@ static void nvme_remove(struct pci_dev *pdev)if (!pci_device_is_present (pdev)) {nvme_change_ctrl_state (&dev->ctrl,NVME_CTRL_DEAD );nvme_dev_disable (dev, true); -nvme_dev_remove_admin (dev); }flush_work (&dev->ctrl.reset_work);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 41/223 net: ocelot: fix switchdev objects synced for wrong netdev with LAG offload
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit e56c6bbd98dc1cefb6f9c5d795fd29016e4f2fe7 ]
The point with a *dev and a *brport_dev is that when we have a LAG net device that is a bridge port, *dev is an ocelot net device and *brport_dev is the bonding/team net device. The ocelot net device beneath the LAG does not exist from the bridge's perspective, so we need to sync the switchdev objects belonging to the brport_dev and not to the dev.
--- drivers/net/ethernet/mscc/ocelot_net.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/net/ethernet/mscc/ocelot_net.c +5 -4
@@ -1287,6 +1287,7 @@ static int ocelot_netdevice_lag_leave(struct net_device *dev, }static int ocelot_netdevice_changeupper (struct net_device *dev, +struct net_device *brport_dev,struct netdev_notifier_changeupper_info *info) {struct netlink_ext_ack *extack;
@@ -1296,11 +1297,11 @@ static int ocelot_netdevice_changeupper(struct net_device *dev,if (netif_is_bridge_master (info->upper_dev)) {if (info->linking) - err =ocelot_netdevice_bridge_join (dev, dev, + err =ocelot_netdevice_bridge_join (dev, brport_dev, info->upper_dev, extack);else - err =ocelot_netdevice_bridge_leave (dev, dev, + err =ocelot_netdevice_bridge_leave (dev, brport_dev, info->upper_dev); }if (netif_is_lag_master (info->upper_dev)) {
@@ -1335,7 +1336,7 @@ ocelot_netdevice_lag_changeupper(struct net_device *dev,if (ocelot_port->bond != dev)return NOTIFY_OK ; - err =ocelot_netdevice_changeupper (lower, info); + err =ocelot_netdevice_changeupper (lower, dev, info);if (err)return notifier_from_errno (err); }
@@ -1374,7 +1375,7 @@ static int ocelot_netdevice_event(struct notifier_block *unused,struct netdev_notifier_changeupper_info *info = ptr;if (ocelot_netdevice_dev_check (dev)) -return ocelot_netdevice_changeupper (dev, info); +return ocelot_netdevice_changeupper (dev, dev, info);if (netif_is_lag_master (dev))return ocelot_netdevice_lag_changeupper (dev, info);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 42/223 sfc: fix lack of XDP TX queues - error XDP TX failed (-22)
In reply to Greg Kroah-HartmanFrom: Íñigo Huguet <[email protected]>
[ Upstream commit f28100cb9c9645c07cbd22431278ac9492f6a01c ]
The buggy commit intended to allocate less channels for XDP in order to be more unlikely to reach the limit of 32 channels of the driver.
The idea was to use each IRQ/eventqeue for more XDP TX queues than before, calculating which is the maximum number of TX queues that one event queue can handle. For example, in EF10 each event queue could handle up to 8 queues, better than the 4 they were handling before the change. This way, it would have to allocate half of channels than before for XDP TX.
The problem is that the TX queues are also contained inside the channel structs, and there are only 4 queues per channel. Reducing the number of channels means also reducing the number of queues, resulting in not having the desired number of 1 queue per CPU.
This leads to getting errors on XDP_TX and XDP_REDIRECT if they're executed from a high numbered CPU, because there only exist queues for the low half of CPUs, actually. If XDP_TX/REDIRECT is executed in a low numbered CPU, the error doesn't happen. This is the error in the logs (repeated many times, even rate limited):
sfc 0000:5e:00.0 ens3f0np0: XDP TX failed (-22)
This errors happens in function efx_xdp_tx_buffers, where it expects to have a dedicated XDP TX queue per CPU.
Reverting the change makes again more likely to reach the limit of 32 channels in machines with many CPUs. If this happen, no XDP_TX/REDIRECT will be possible at all, and we will have this log error messages:
At interface probe:
sfc 0000:5e:00.0: Insufficient resources for 12 XDP event queues (24 other channels, max 32)
At every subsequent XDP_TX/REDIRECT failure, rate limited:
sfc 0000:5e:00.0 ens3f0np0: XDP TX failed (-22)
However, without reverting the change, it makes the user to think that everything is OK at probe time, but later it fails in an unpredictable way, depending on the CPU that handles the packet.
It is better to restore the predictable behaviour. If the user sees the error message at probe time, he/she can try to configure the best way it fits his/her needs. At least, he/she will have 2 options:
- Accept that XDP_TX/REDIRECT is not available (he/she may not need it)
- Load sfc module with modparam 'rss_cpus' with a lower number, thus creating less normal RX queues/channels, letting more free resources for XDP, with some performance penalty.
Anyway, let the calculation of maximum TX queues that can be handled by a single event queue, and use it only if it's less than the number of TX queues per channel. This doesn't happen in practice, but could happen if some constant values are tweaked in the future, such us EFX_MAX_TXQ_PER_CHANNEL, EFX_MAX_EVQ_SIZE or EFX_MAX_DMAQ_SIZE.
Related mailing list thread:
https://lore.kernel.org/bpf/20201215104327.2be76156@carbon/
--- drivers/net/ethernet/sfc/efx_channels.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/sfc/efx_channels.c +2 -1
@@ -152,6 +152,7 @@ static int efx_allocate_msix_channels(struct efx_nic *efx,* maximum size. */ tx_per_ev =EFX_MAX_EVQ_SIZE /EFX_TXQ_MAX_ENT (efx); + tx_per_ev =min (tx_per_ev,EFX_MAX_TXQ_PER_CHANNEL ); n_xdp_tx =num_possible_cpus (); n_xdp_ev =DIV_ROUND_UP (n_xdp_tx, tx_per_ev);
@@ -181,7 +182,7 @@ static int efx_allocate_msix_channels(struct efx_nic *efx, efx->xdp_tx_queue_count =0 ; }else { efx->n_xdp_channels = n_xdp_ev; - efx->xdp_tx_per_channel =EFX_MAX_TXQ_PER_CHANNEL ; + efx->xdp_tx_per_channel = tx_per_ev; efx->xdp_tx_queue_count = n_xdp_tx; n_channels += n_xdp_ev; netif_dbg(efx, drv, efx->net_dev,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 43/223 KVM: x86/pmu: Clear anythread deprecated bit when 0xa leaf is unsupported on the SVM
In reply to Greg Kroah-HartmanFrom: Like Xu <[email protected]>
[ Upstream commit 7234c362ccb3c2228f06f19f93b132de9cfa7ae4 ]
The AMD platform does not support the functions Ah CPUID leaf. The returned results for this entry should all remain zero just like the native does:
AMD host:
0x0000000a 0x00: eax=0x00000000 ebx=0x00000000 ecx=0x00000000 edx=0x00000000
(uncanny) AMD guest:
0x0000000a 0x00: eax=0x00000000 ebx=0x00000000 ecx=0x00000000 edx=0x00008000
Message-Id: <[email protected]>
--- arch/x86/kvm/cpuid.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/kvm/cpuid.c +2 -1
@@ -765,7 +765,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) edx.split.num_counters_fixed =min (cap.num_counters_fixed,MAX_FIXED_COUNTERS ); edx.split.bit_width_fixed = cap.bit_width_fixed; - edx.split.anythread_deprecated =1 ; +if (cap.version) + edx.split.anythread_deprecated =1 ; edx.split.reserved1 =0 ; edx.split.reserved2 =0 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 44/223 KVM: SVM: Return -EFAULT if copy_to_user() for SEV mig packet header fails
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
[ Upstream commit b4a693924aab93f3747465b2261add46c82c3220 ]
Return -EFAULT if copy_to_user() fails; if accessing user memory faults, copy_to_user() returns the number of bytes remaining, not an error code.
Message-Id: <[email protected]>
--- arch/x86/kvm/svm/sev.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/x86/kvm/svm/sev.c +3 -2
@@ -1309,8 +1309,9 @@ static int sev_send_update_data(struct kvm *kvm, struct kvm_sev_cmd *argp) }/* Copy packet header to userspace. */ - ret =copy_to_user ((void __user *)(uintptr_t )params.hdr_uaddr, hdr, - params.hdr_len); +if (copy_to_user ((void __user *)(uintptr_t )params.hdr_uaddr, hdr, + params.hdr_len)) + ret = -EFAULT ; e_free_trans_data:kfree (trans_data);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 45/223 KVM: SVM: Fix sev_pin_memory() error checks in SEV migration utilities
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
[ Upstream commit c7a1b2b678c54ac19320daf525038d0e2e43ca7c ]
Use IS_ERR() instead of checking for a NULL pointer when querying for sev_pin_memory() failures. sev_pin_memory() always returns an error code cast to a pointer, or a valid pointer; it never returns NULL.
Message-Id: <[email protected]>
--- arch/x86/kvm/svm/sev.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
arch/x86/kvm/svm/sev.c +5 -4
@@ -1271,8 +1271,8 @@ static int sev_send_update_data(struct kvm *kvm, struct kvm_sev_cmd *argp)/* Pin guest memory */ guest_page =sev_pin_memory (kvm, params.guest_uaddr &PAGE_MASK ,PAGE_SIZE , &n,0 ); -if (!guest_page) -return -EFAULT ; +if (IS_ERR (guest_page)) +return PTR_ERR (guest_page);/* allocate memory for header and transport buffer */ ret = -ENOMEM ;
@@ -1463,11 +1463,12 @@ static int sev_receive_update_data(struct kvm *kvm, struct kvm_sev_cmd *argp) data.trans_len = params.trans_len;/* Pin guest memory */ - ret = -EFAULT ; guest_page =sev_pin_memory (kvm, params.guest_uaddr &PAGE_MASK ,PAGE_SIZE , &n,0 ); -if (!guest_page) +if (IS_ERR (guest_page)) { + ret =PTR_ERR (guest_page); goto e_free_trans; + }/* The RECEIVE_UPDATE_DATA command requires C-bit to be always set. */ data.guest_address = (page_to_pfn (guest_page[0 ]) <<PAGE_SHIFT ) + offset;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 46/223 arm64: mte: fix restoration of GCR_EL1 from suspend
In reply to Greg Kroah-HartmanFrom: Mark Rutland <[email protected]>
[ Upstream commit 59f44069e0527523f27948da7b77599a73dab157 ]
Since commit:
bad1e1c663e0a72f ("arm64: mte: switch GCR_EL1 in kernel entry and exit")
we saved/restored the user GCR_EL1 value at exception boundaries, and update_gcr_el1_excl() is no longer used for this. However it is used to restore the kernel's GCR_EL1 value when returning from a suspend state. Thus, the comment is misleading (and an ISB is necessary).
When restoring the kernel's GCR value, we need an ISB to ensure this is used by subsequent instructions. We don't necessarily get an ISB by other means (e.g. if the kernel is built without support for pointer authentication). As __cpu_setup() initialised GCR_EL1.Exclude to 0xffff, until a context synchronization event, allocation tag 0 may be used rather than the desired set of tags.
This patch drops the misleading comment, adds the missing ISB, and for clarity folds update_gcr_el1_excl() into its only user.
--- arch/arm64/kernel/mte.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-)
arch/arm64/kernel/mte.c +2 -13
@@ -185,18 +185,6 @@ void mte_check_tfsr_el1(void) }#endif -static void update_gcr_el1_excl (u64 excl) -{ - -/* -* Note that the mask controlled by the user via prctl() is an -* include while GCR_EL1 accepts an exclude mask. -* No need for ISB since this only affects EL0 currently, implicit -* with ERET. -*/ -sysreg_clear_set_s (SYS_GCR_EL1 ,SYS_GCR_EL1_EXCL_MASK , excl); -} -static void set_gcr_el1_excl (u64 excl) { current->thread.gcr_user_excl = excl;
@@ -257,7 +245,8 @@ void mte_suspend_exit(void)if (!system_supports_mte ())return ; -update_gcr_el1_excl (gcr_kernel_excl); +sysreg_clear_set_s (SYS_GCR_EL1 ,SYS_GCR_EL1_EXCL_MASK , gcr_kernel_excl); +isb (); }long set_mte_ctrl (struct task_struct *task,unsigned long arg)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 47/223 ARM: dts: aspeed: Update e3c246d4i vuart properties
In reply to Greg Kroah-HartmanFrom: Zev Weiss <[email protected]>
[ Upstream commit 812bae32e5d50914f75a6e036d3bde39ca86b0c3 ]
This device-tree was merged with a provisional vuart IRQ-polarity property that was still under review and ended up taking a somewhat different form. This patch updates it to match the final form of the new vuart properties, which additionally allow specifying the SIRQ number and LPC address.
--- arch/arm/boot/dts/aspeed-bmc-asrock-e3c246d4i.dts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/boot/dts/aspeed-bmc-asrock-e3c246d4i.dts +3 -1
@@ -4,6 +4,7 @@ #include "aspeed-g5.dtsi" #include <dt-bindings/gpio/aspeed-gpio.h> #include <dt-bindings/i2c/i2c.h> +#include <dt-bindings/interrupt-controller/irq.h> /{ model = "ASRock E3C246D4I BMC";
@@ -73,7 +74,8 @@ &vuart { status = "okay"; - aspeed,sirq-active-high; + aspeed,lpc-io-reg = <0x2f8>; + aspeed,lpc-interrupts = <3 IRQ_TYPE_LEVEL_HIGH>; }; &mac0 {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 48/223 firmware: arm_scmi: Ensure drivers provide a probe function
In reply to Greg Kroah-HartmanFrom: Sudeep Holla <[email protected]>
[ Upstream commit 5e469dac326555d2038d199a6329458cc82a34e5 ]
The bus probe callback calls the driver callback without further checking. Better be safe than sorry and refuse registration of a driver without a probe function to prevent a NULL pointer exception.
--- drivers/firmware/arm_scmi/bus.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/firmware/arm_scmi/bus.c +3 -0
@@ -139,6 +139,9 @@ int scmi_driver_register(struct scmi_driver *driver, struct module *owner, {int retval; +if (!driver->probe) +return -EINVAL ; + retval =scmi_protocol_device_request (driver->id_table);if (retval)return retval;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 49/223 perf inject: Fix dso->nsinfo refcounting
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit 0967ebffe098157180a0bbd180ac90348c6e07d7 ]
ASan reports a memory leak of nsinfo during the execution of:
# perf test "31: Lookup mmap thread"
The leak is caused by a refcounted variable being replaced without dropping the refcount.
This patch makes sure that the refcnt of nsinfo is decreased when a refcounted variable is replaced with a new value.
--- tools/perf/builtin-inject.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/perf/builtin-inject.c +3 -2
@@ -358,9 +358,10 @@ static struct dso *findnew_dso(int pid, int tid, const char *filename, dso =machine__findnew_dso_id (machine, filename, id); } -if (dso) +if (dso) { +nsinfo__put (dso->nsinfo); dso->nsinfo = nsi; -else + }else nsinfo__put (nsi);thread__put (thread);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 50/223 perf map: Fix dso->nsinfo refcounting
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit 2d6b74baa7147251c30a46c4996e8cc224aa2dc5 ]
ASan reports a memory leak of nsinfo during the execution of
# perf test "31: Lookup mmap thread"
The leak is caused by a refcounted variable being replaced without dropping the refcount.
This patch makes sure that the refcnt of nsinfo is decreased whenever a refcounted variable is replaced with a new value.
--- tools/perf/util/map.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/map.c +2 -0
@@ -192,6 +192,8 @@ struct map *map__new(struct machine *machine, u64 start, u64 len,if (!(prot &PROT_EXEC ))dso__set_loaded (dso); } + +nsinfo__put (dso->nsinfo); dso->nsinfo = nsi;if (build_id__is_defined (bid))
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 51/223 perf probe: Fix dso->nsinfo refcounting
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit dedeb4be203b382ba7245d13079bc3b0f6d40c65 ]
ASan reports a memory leak of nsinfo during the execution of:
# perf test "31: Lookup mmap thread".
The leak is caused by a refcounted variable being replaced without dropping the refcount.
This patch makes sure that the refcnt of nsinfo is decreased whenever a refcounted variable is replaced with a new value.
--- tools/perf/util/probe-event.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/util/probe-event.c +3 -1
@@ -180,8 +180,10 @@ struct map *get_target_map(const char *target, struct nsinfo *nsi, bool user)struct map *map; map =dso__new_map (target); -if (map && map->dso) +if (map && map->dso) { +nsinfo__put (map->dso->nsinfo); map->dso->nsinfo =nsinfo__get (nsi); + }return map; }else {return kernel_get_module_map (target);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 52/223 perf env: Fix sibling_dies memory leak
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit 42db3d9ded555f7148b5695109a7dc8d66f0dde4 ]
ASan reports a memory leak in perf_env while running:
# perf test "41: Session topology"
Caused by sibling_dies not being freed.
This patch adds the required free.
--- tools/perf/util/env.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/env.c +1 -0
@@ -186,6 +186,7 @@ void perf_env__exit(struct perf_env *env)zfree (&env->cpuid);zfree (&env->cmdline);zfree (&env->cmdline_argv); +zfree (&env->sibling_dies);zfree (&env->sibling_cores);zfree (&env->sibling_threads);zfree (&env->pmu_mappings);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 53/223 perf test session_topology: Delete session->evlist
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit 233f2dc1c284337286f9a64c0152236779a42f6c ]
ASan reports a memory leak related to session->evlist while running:
# perf test "41: Session topology".
When perf_data is in write mode, session->evlist is owned by the caller, which should also take care of deleting it.
This patch adds the missing evlist__delete().
--- tools/perf/tests/topology.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/tests/topology.c +1 -0
@@ -61,6 +61,7 @@ static int session_write_header(char *path)TEST_ASSERT_VAL ("failed to write header" , !perf_session__write_header (session, session->evlist, data.file.fd, true)); +evlist__delete (session->evlist);perf_session__delete (session);return 0 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 54/223 perf test event_update: Fix memory leak of evlist
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit fc56f54f6fcd5337634f4545af6459613129b432 ]
ASan reports a memory leak when running:
# perf test "49: Synthesize attr update"
Caused by evlist not being deleted.
This patch adds the missing evlist__delete and removes the perf_cpu_map__put since it's already being deleted by evlist__delete.
--- tools/perf/tests/event_update.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/tests/event_update.c +1 -1
@@ -118,6 +118,6 @@ int test__event_update(struct test *test __maybe_unused, int subtest __maybe_unuTEST_ASSERT_VAL ("failed to synthesize attr update cpus" , !perf_event__synthesize_event_update_cpus (&tmp.tool, evsel, process_event_cpus)); -perf_cpu_map__put (evsel->core.own_cpus); +evlist__delete (evlist);return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 55/223 perf test event_update: Fix memory leak of unit
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit dccfca926c351ba0893af4c8b481477bdb2881a4 ]
ASan reports a memory leak while running:
# perf test "49: Synthesize attr update"
Caused by a string being duplicated but never freed.
This patch adds the missing free().
Note that evsel->unit is not deallocated together with evsel since it is supposed to be a constant string.
--- tools/perf/tests/event_update.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/tests/event_update.c +3 -1
@@ -88,6 +88,7 @@ int test__event_update(struct test *test __maybe_unused, int subtest __maybe_unustruct evsel *evsel;struct event_name tmp;struct evlist *evlist =evlist__new_default (); +char *unit =strdup ("KRAVA" );TEST_ASSERT_VAL ("failed to get evlist" , evlist);
@@ -98,7 +99,7 @@ int test__event_update(struct test *test __maybe_unused, int subtest __maybe_unuperf_evlist__id_add (&evlist->core, &evsel->core,0 ,0 ,123 ); - evsel->unit =strdup ("KRAVA" ); + evsel->unit = unit;TEST_ASSERT_VAL ("failed to synthesize attr update unit" , !perf_event__synthesize_event_update_unit (NULL , evsel, process_event_unit));
@@ -118,6 +119,7 @@ int test__event_update(struct test *test __maybe_unused, int subtest __maybe_unuTEST_ASSERT_VAL ("failed to synthesize attr update cpus" , !perf_event__synthesize_event_update_cpus (&tmp.tool, evsel, process_event_cpus)); +free (unit);evlist__delete (evlist);return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 56/223 perf dso: Fix memory leak in dso__new_map()
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit 581e295a0f6b5c2931d280259fbbfff56959faa9 ]
ASan reports a memory leak when running:
# perf test "65: maps__merge_in".
The causes of the leaks are two, this patch addresses only the first one, which is related to dso__new_map().
The bug is that dso__new_map() creates a new dso but never decreases the refcount it gets from creating it.
This patch adds the missing dso__put().
--- tools/perf/util/dso.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/util/dso.c +3 -1
@@ -1154,8 +1154,10 @@ struct map *dso__new_map(const char *name)struct map *map =NULL ;struct dso *dso =dso__new (name); -if (dso) +if (dso) { map =map__new2 (0 , dso); +dso__put (dso); + }return map; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 57/223 perf test maps__merge_in: Fix memory leak of maps
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit 244d1797c8c8e850b8de7992af713aa5c70d5650 ]
ASan reports a memory leak when running:
# perf test "65: maps__merge_in"
This is the second and final patch addressing these memory leaks.
This time, the problem is simply that the maps object is never destructed.
This patch adds the missing maps__exit call.
--- tools/perf/tests/maps.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/tests/maps.c +2 -0
@@ -116,5 +116,7 @@ int test__maps__merge_in(struct test *t __maybe_unused, int subtest __maybe_unus ret =check_maps (merged3,ARRAY_SIZE (merged3), &maps);TEST_ASSERT_VAL ("merge check failed" , !ret); + +maps__exit (&maps);return TEST_OK ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 58/223 perf env: Fix memory leak of cpu_pmu_caps
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit da6b7c6c0626901428245f65712385805e42eba6 ]
ASan reports memory leaks while running:
# perf test "83: Zstd perf.data compression/decompression"
The first of the leaks is caused by env->cpu_pmu_caps not being freed.
This patch adds the missing (z)free inside perf_env__exit.
--- tools/perf/util/env.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/env.c +1 -0
@@ -191,6 +191,7 @@ void perf_env__exit(struct perf_env *env)zfree (&env->sibling_threads);zfree (&env->pmu_mappings);zfree (&env->cpu); +zfree (&env->cpu_pmu_caps);zfree (&env->numa_map);for (i =0 ; i < env->nr_numa_nodes; i++)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 59/223 perf report: Free generated help strings for sort option
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit a37338aad8c4d8676173ead14e881d2ec308155c ]
ASan reports the memory leak of the strings allocated by sort_help() when running perf report.
This patch changes the returned pointer to char* (instead of const char*), saves it in a temporary variable, and finally deallocates it at function exit.
--- tools/perf/builtin-report.c | 33 ++++++++++++++++++++++----------- tools/perf/util/sort.c | 2 +- tools/perf/util/sort.h | 2 +- 3 files changed, 24 insertions(+), 13 deletions(-)
tools/perf/builtin-report.c +22 -11
@@ -1167,6 +1167,8 @@ int cmd_report(int argc, const char **argv) .annotation_opts = annotation__default_options, .skip_empty = true, }; +char *sort_order_help =sort_help ("sort by key(s):" ); +char *field_order_help =sort_help ("output field(s): overhead period sample " );const struct option options[] = {OPT_STRING ('i' ,"input" , &input_name,"file" ,"input file name" ),
@@ -1201,9 +1203,9 @@ int cmd_report(int argc, const char **argv)OPT_BOOLEAN (0 ,"header-only" , &report.header_only,"Show only data header." ),OPT_STRING ('s' ,"sort" , &sort_order,"key[,key2...]" , -sort_help ("sort by key(s):" )), + sort_order_help),OPT_STRING ('F' ,"fields" , &field_order,"key[,keys...]" , -sort_help ("output field(s): overhead period sample " )), + field_order_help),OPT_BOOLEAN (0 ,"show-cpu-utilization" , &symbol_conf.show_cpu_utilization,"Show sample percentage for different cpu modes" ), OPT_BOOLEAN_FLAG(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
@@ -1336,11 +1338,11 @@ int cmd_report(int argc, const char **argv)char sort_tmp[128 ];if (ret <0 ) -return ret; + goto exit; ret =perf_config (report__config, &report);if (ret) -return ret; + goto exit; argc =parse_options (argc, argv, options, report_usage,0 );if (argc) {
@@ -1354,8 +1356,10 @@ int cmd_report(int argc, const char **argv) report.symbol_filter_str = argv[0 ]; } -if (annotate_check_args (&report.annotation_opts) <0 ) -return -EINVAL ; +if (annotate_check_args (&report.annotation_opts) <0 ) { + ret = -EINVAL ; + goto exit; + }if (report.mmaps_mode) report.tasks_mode = true;
@@ -1369,12 +1373,14 @@ int cmd_report(int argc, const char **argv)if (symbol_conf.vmlinux_name &&access (symbol_conf.vmlinux_name,R_OK )) {pr_err ("Invalid file: %s\n" , symbol_conf.vmlinux_name); -return -EINVAL ; + ret = -EINVAL ; + goto exit; }if (symbol_conf.kallsyms_name &&access (symbol_conf.kallsyms_name,R_OK )) {pr_err ("Invalid file: %s\n" , symbol_conf.kallsyms_name); -return -EINVAL ; + ret = -EINVAL ; + goto exit; }if (report.inverted_callchain)
@@ -1398,12 +1404,14 @@ int cmd_report(int argc, const char **argv) repeat: session =perf_session__new (&data, false, &report.tool); -if (IS_ERR (session)) -return PTR_ERR (session); +if (IS_ERR (session)) { + ret =PTR_ERR (session); + goto exit; + } ret =evswitch__init (&report.evswitch, session->evlist, stderr);if (ret) -return ret; + goto exit;if (zstd_init (&(session->zstd_data),0 ) <0 )pr_warning ("Decompression initialization failed. Reported data may be incomplete.\n" );
@@ -1638,5 +1646,8 @@ error:zstd_fini (&(session->zstd_data));perf_session__delete (session); +exit: +free (sort_order_help); +free (field_order_help);return ret; }
tools/perf/util/sort.c +1 -1
@@ -3370,7 +3370,7 @@ static void add_hpp_sort_string(struct strbuf *sb, struct hpp_dimension *s, intadd_key (sb, s[i].name, llen); } -const char *sort_help (const char *prefix) +char *sort_help (const char *prefix) {struct strbuf sb;char *s;
tools/perf/util/sort.h +1 -1
@@ -302,7 +302,7 @@ void reset_output_field(void);void sort__setup_elide (FILE *fp);void perf_hpp__set_elide (int idx,bool elide); -const char *sort_help (const char *prefix); +char *sort_help (const char *prefix);int report_parse_ignore_callees_opt (const struct option *opt,const char *arg,int unset);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 60/223 perf script: Release zstd data
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit 1b1f57cf9e4c8eb16c8f6b2ce12cc5dd3517fc61 ]
ASan reports several memory leak while running:
# perf test "82: Use vfs_getname probe to get syscall args filenames"
One of the leaks is caused by zstd data not being released on exit in perf-script.
This patch adds the missing zstd_fini().
--- tools/perf/builtin-script.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/builtin-script.c +1 -0
@@ -3991,6 +3991,7 @@ out_delete:zfree (&script.ptime_range); } +zstd_fini (&(session->zstd_data));evlist__free_stats (session->evlist);perf_session__delete (session);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 61/223 perf script: Fix memory threads and cpus leaks on exit
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit faf3ac305d61341c74e5cdd9e41daecce7f67bfe ]
ASan reports several memory leaks while running:
# perf test "82: Use vfs_getname probe to get syscall args filenames"
Two of these are caused by some refcounts not being decreased on perf-script exit, namely script.threads and script.cpus.
This patch adds the missing __put calls in a new perf_script__exit function, which is called at the end of cmd_script.
This patch concludes the fixes of all remaining memory leaks in perf test "82: Use vfs_getname probe to get syscall args filenames".
--- tools/perf/builtin-script.c | 7 +++++++ 1 file changed, 7 insertions(+)
tools/perf/builtin-script.c +7 -0
@@ -2534,6 +2534,12 @@ static void perf_script__exit_per_event_dump_stats(struct perf_script *script) } } +static void perf_script__exit (struct perf_script *script) +{ +perf_thread_map__put (script->threads); +perf_cpu_map__put (script->cpus); +} +static int __cmd_script (struct perf_script *script) {int ret;
@@ -3994,6 +4000,7 @@ out_delete:zstd_fini (&(session->zstd_data));evlist__free_stats (session->evlist);perf_session__delete (session); +perf_script__exit (&script);if (script_started)cleanup_scripting ();
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 62/223 perf lzma: Close lzma stream on exit
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit f8cbb0f926ae1e1fb5f9e51614e5437560ed4039 ]
ASan reports memory leaks when running:
# perf test "88: Check open filename arg using perf trace + vfs_getname"
One of these is caused by the lzma stream never being closed inside lzma_decompress_to_file().
This patch adds the missing lzma_end().
--- tools/perf/util/lzma.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
tools/perf/util/lzma.c +5 -3
@@ -69,7 +69,7 @@ int lzma_decompress_to_file(const char *input, int output_fd)if (ferror (infile)) {pr_err ("lzma: read error: %s\n" ,strerror (errno)); - goto err_fclose; + goto err_lzma_end; }if (feof (infile))
@@ -83,7 +83,7 @@ int lzma_decompress_to_file(const char *input, int output_fd)if (writen (output_fd, buf_out, write_size) != write_size) {pr_err ("lzma: write error: %s\n" ,strerror (errno)); - goto err_fclose; + goto err_lzma_end; } strm.next_out = buf_out;
@@ -95,11 +95,13 @@ int lzma_decompress_to_file(const char *input, int output_fd)break ;pr_err ("lzma: failed %s\n" ,lzma_strerror (ret)); - goto err_fclose; + goto err_lzma_end; } } err =0 ; +err_lzma_end: +lzma_end (&strm); err_fclose:fclose (infile);return err;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 63/223 perf probe-file: Delete namelist in del_events() on the error path
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit e0fa7ab42232e742dcb3de9f3c1f6127b5adc019 ]
ASan reports some memory leaks when running:
# perf test "42: BPF filter"
This second leak is caused by a strlist not being dellocated on error inside probe_file__del_events.
This patch adds a goto label before the deallocation and makes the error path jump to it.
--- tools/perf/util/probe-file.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/probe-file.c +2 -2
@@ -342,11 +342,11 @@ int probe_file__del_events(int fd, struct strfilter *filter) ret =probe_file__get_events (fd, filter, namelist);if (ret <0 ) -return ret; + goto out; ret =probe_file__del_strlist (fd, namelist); +out:strlist__delete (namelist); -return ret; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 64/223 perf data: Close all files in close_dir()
In reply to Greg Kroah-HartmanFrom: Riccardo Mancini <[email protected]>
[ Upstream commit d4b3eedce151e63932ce4a00f1d0baa340a8b907 ]
When using 'perf report' in directory mode, the first file is not closed on exit, causing a memory leak.
The problem is caused by the iterating variable never reaching 0.
--- tools/perf/util/data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/data.c +1 -1
@@ -20,7 +20,7 @@static void close_dir (struct perf_data_file *files,int nr) { -while (--nr >=1 ) { +while (--nr >=0 ) {close (files[nr].fd);zfree (&files[nr].path); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 65/223 perf sched: Fix record failure when CONFIG_SCHEDSTATS is not set
In reply to Greg Kroah-HartmanFrom: Yang Jihong <[email protected]>
[ Upstream commit b0f008551f0bf4d5f6db9b5f0e071b02790d6a2e ]
The tracepoints trace_sched_stat_{wait, sleep, iowait} are not exposed to user if CONFIG_SCHEDSTATS is not set, "perf sched record" records the three events. As a result, the command fails.
Before:
#perf sched record sleep 1
event syntax error: 'sched:sched_stat_wait'
\___ unknown tracepoint
Error: File /sys/kernel/tracing/events/sched/sched_stat_wait not found.
Hint: Perhaps this kernel misses some CONFIG_ setting to enable this feature?.
Run 'perf list' for a list of valid events
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf list' to list available events
Solution:
Check whether schedstat tracepoints are exposed. If no, these events are not recorded.
After:
# perf sched record sleep 1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.163 MB perf.data (1091 samples) ] # perf sched report run measurement overhead: 4736 nsecs sleep measurement overhead: 9059979 nsecs the run test took 999854 nsecs the sleep test took 8945271 nsecs nr_run_events: 716 nr_sleep_events: 785 nr_wakeup_events: 0 ... ------------------------------------------------------------
--- tools/perf/builtin-sched.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-)
tools/perf/builtin-sched.c +29 -4
@@ -3335,6 +3335,16 @@ static void setup_sorting(struct perf_sched *sched, const struct option *optionssort_dimension__add ("pid" , &sched->cmp_pid); } +static bool schedstat_events_exposed (void ) +{ +/* +* Select "sched:sched_stat_wait" event to check +* whether schedstat tracepoints are exposed. +*/ +return IS_ERR (trace_event__tp_format ("sched" ,"sched_stat_wait" )) ? + false : true; +} +static int __cmd_record (int argc,const char **argv) {unsigned int rec_argc, i, j;
@@ -3346,21 +3356,33 @@ static int __cmd_record(int argc, const char **argv)"-m" ,"1024" ,"-c" ,"1" ,"-e" ,"sched:sched_switch" , -"-e" ,"sched:sched_stat_wait" , -"-e" ,"sched:sched_stat_sleep" , -"-e" ,"sched:sched_stat_iowait" ,"-e" ,"sched:sched_stat_runtime" ,"-e" ,"sched:sched_process_fork" ,"-e" ,"sched:sched_wakeup_new" , "-e", "sched:sched_migrate_task", }; + +/* +* The tracepoints trace_sched_stat_{wait, sleep, iowait} +* are not exposed to user if CONFIG_SCHEDSTATS is not set, +* to prevent "perf sched record" execution failure, determine +* whether to record schedstat events according to actual situation. +*/ +const char *const schedstat_args[] = { +"-e" ,"sched:sched_stat_wait" , +"-e" ,"sched:sched_stat_sleep" , +"-e" ,"sched:sched_stat_iowait" , + }; +unsigned int schedstat_argc =schedstat_events_exposed () ? +ARRAY_SIZE (schedstat_args) :0 ; +struct tep_event *waking_event;/* * +2 for either "-e", "sched:sched_wakeup" or * "-e", "sched:sched_waking" */ - rec_argc =ARRAY_SIZE (record_args) +2 + argc -1 ; + rec_argc =ARRAY_SIZE (record_args) +2 + schedstat_argc + argc -1 ; rec_argv =calloc (rec_argc +1 ,sizeof (char *));if (rec_argv ==NULL )
@@ -3376,6 +3398,9 @@ static int __cmd_record(int argc, const char **argv)else rec_argv[i++] =strdup ("sched:sched_wakeup" ); +for (j =0 ; j < schedstat_argc; j++) + rec_argv[i++] =strdup (schedstat_args[j]); +for (j =1 ; j < (unsigned int )argc; j++, i++) rec_argv[i] = argv[j];
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 66/223 Kbuild: lto: fix module versionings mismatch in GNU make 3.X
In reply to Greg Kroah-HartmanFrom: Lecopzer Chen <[email protected]>
[ Upstream commit 1d11053dc63094075bf9e4809fffd3bb5e72f9a6 ]
When building modules(CONFIG_...=m), I found some of module versions are incorrect and set to 0.
This can be found in build log for first clean build which shows
WARNING: EXPORT symbol "XXXX" [drivers/XXX/XXX.ko] version generation failed, symbol will not be versioned.
But in second build(incremental build), the WARNING disappeared and the module version becomes valid CRC and make someone who want to change modules without updating kernel image can't insert their modules.
The problematic code is
+ $(foreach n, $(filter-out FORCE,$^), \
+ $(if $(wildcard $(n).symversions), \
+ ; cat $(n).symversions >> [email protected]))
For example:
rm -f fs/notify/built-in.a.symversions ; rm -f fs/notify/built-in.a; \
llvm-ar cDPrST fs/notify/built-in.a fs/notify/fsnotify.o \fs/notify/notification.o fs/notify/group.o ...
foreach n shows nothing to cat into $(n).symversions because if $(wildcard $(n).symversions) return nothing, but actually they do exist during this line was executed.
-rw-r--r-- 1 root root 168580 Jun 13 19:10 fs/notify/fsnotify.o
-rw-r--r-- 1 root root 111 Jun 13 19:10 fs/notify/fsnotify.o.symversions
The reason is the $(n).symversions are generated at runtime, but Makefile wildcard function expends and checks the file exist or not during parsing the Makefile.
Thus fix this by use test shell command to check the file existence in runtime.
Rebase from both:
1. [https://lore.kernel.org/lkml/[email protected]/]
2. [https://lore.kernel.org/lkml/[email protected]/]
--- scripts/Makefile.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/Makefile.build +1 -1
@@ -388,7 +388,7 @@ ifeq ($(CONFIG_LTO_CLANG) $(CONFIG_MODVERSIONS),y y) cmd_update_lto_symversions = \ rm -f [email protected] \ $(foreach n, $(filter-out FORCE,$^), \ - $(if $(wildcard $(n).symversions), \ + $(if $(shell test -s $(n).symversions && echo y), \ ; cat $(n).symversions >> [email protected])) else cmd_update_lto_symversions = echo >/dev/null
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 67/223 ASoC: wm_adsp: Correct wm_coeff_tlv_get handling
In reply to Greg Kroah-HartmanFrom: Charles Keepax <[email protected]>
[ Upstream commit dd6fb8ff2210f74b056bf9234d0605e8c26a8ac0 ]
When wm_coeff_tlv_get was updated it was accidentally switch to the _raw version of the helper causing it to ignore the current DSP state it should be checking. Switch the code back to the correct helper so that users can't read the controls when they arn't available.
--- sound/soc/codecs/wm_adsp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/codecs/wm_adsp.c +1 -1
@@ -1213,7 +1213,7 @@ static int wm_coeff_tlv_get(struct snd_kcontrol *kctl,mutex_lock (&ctl->dsp->pwr_lock); - ret =wm_coeff_read_ctrl_raw (ctl, ctl->cache, size); + ret =wm_coeff_read_ctrl (ctl, ctl->cache, size);if (!ret &©_to_user (bytes, ctl->cache, size)) ret = -EFAULT ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 68/223 spi: stm32: fixes pm_runtime calls in probe/remove
In reply to Greg Kroah-HartmanFrom: Alain Volmat <[email protected]>
[ Upstream commit 7999d2555c9f879d006ea8469d74db9cdb038af0 ]
Add pm_runtime calls in probe/probe error path and remove in order to be consistent in all places in ordering and ensure that pm_runtime is disabled prior to resources used by the SPI controller.
This patch also fixes the 2 following warnings on driver remove:
WARNING: CPU: 0 PID: 743 at drivers/clk/clk.c:594 clk_core_disable_lock+0x18/0x24 WARNING: CPU: 0 PID: 743 at drivers/clk/clk.c:476 clk_unprepare+0x24/0x2c
--- drivers/spi/spi-stm32.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/spi/spi-stm32.c +8 -1
@@ -1925,6 +1925,7 @@ static int stm32_spi_probe(struct platform_device *pdev) master->can_dma = stm32_spi_can_dma;pm_runtime_set_active (&pdev->dev); +pm_runtime_get_noresume (&pdev->dev);pm_runtime_enable (&pdev->dev); ret =spi_register_master (master);
@@ -1940,6 +1941,8 @@ static int stm32_spi_probe(struct platform_device *pdev) err_pm_disable:pm_runtime_disable (&pdev->dev); +pm_runtime_put_noidle (&pdev->dev); +pm_runtime_set_suspended (&pdev->dev); err_dma_release:if (spi->dma_tx)dma_release_channel (spi->dma_tx);
@@ -1956,9 +1959,14 @@ static int stm32_spi_remove(struct platform_device *pdev)struct spi_master *master =platform_get_drvdata (pdev);struct stm32_spi *spi =spi_master_get_devdata (master); +pm_runtime_get_sync (&pdev->dev); +spi_unregister_master (master); spi->cfg->disable (spi); +pm_runtime_disable (&pdev->dev); +pm_runtime_put_noidle (&pdev->dev); +pm_runtime_set_suspended (&pdev->dev);if (master->dma_tx)dma_release_channel (master->dma_tx);if (master->dma_rx)
@@ -1966,7 +1974,6 @@ static int stm32_spi_remove(struct platform_device *pdev)clk_disable_unprepare (spi->clk); -pm_runtime_disable (&pdev->dev);pinctrl_pm_select_sleep_state (&pdev->dev);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 69/223 regulator: hi6421: Use correct variable type for regmap api val argument
In reply to Greg Kroah-HartmanFrom: Axel Lin <[email protected]>
[ Upstream commit ae60e6a9d24e89a74e2512204ad04de94921bdd2 ]
Use unsigned int instead of u32 for regmap_read/regmap_update_bits val argument.
--- drivers/regulator/hi6421-regulator.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/regulator/hi6421-regulator.c +4 -4
@@ -386,7 +386,7 @@ static int hi6421_regulator_enable(struct regulator_dev *rdev)static unsigned int hi6421_regulator_ldo_get_mode (struct regulator_dev *rdev) {struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 reg_val; +unsigned int reg_val;regmap_read (rdev->regmap, rdev->desc->enable_reg, ®_val);if (reg_val & info->mode_mask)
@@ -398,7 +398,7 @@ static unsigned int hi6421_regulator_ldo_get_mode(struct regulator_dev *rdev)static unsigned int hi6421_regulator_buck_get_mode (struct regulator_dev *rdev) {struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 reg_val; +unsigned int reg_val;regmap_read (rdev->regmap, rdev->desc->enable_reg, ®_val);if (reg_val & info->mode_mask)
@@ -411,7 +411,7 @@ static int hi6421_regulator_ldo_set_mode(struct regulator_dev *rdev, unsigned int mode) {struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 new_mode; +unsigned int new_mode;switch (mode) {case REGULATOR_MODE_NORMAL :
@@ -435,7 +435,7 @@ static int hi6421_regulator_buck_set_mode(struct regulator_dev *rdev, unsigned int mode) {struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); -u32 new_mode; +unsigned int new_mode;switch (mode) {case REGULATOR_MODE_NORMAL :
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 70/223 regulator: hi6421: Fix getting wrong drvdata
In reply to Greg Kroah-HartmanFrom: Axel Lin <[email protected]>
[ Upstream commit 1c73daee4bf30ccdff5e86dc400daa6f74735da5 ]
Since config.dev = pdev->dev.parent in current code, so dev_get_drvdata(rdev->dev.parent) call in hi6421_regulator_enable returns the drvdata of the mfd device rather than the regulator. Fix it.
This was broken while converting to use simplified DT parsing because the config.dev changed from pdev->dev to pdev->dev.parent for parsing the parent's of_node.
--- drivers/regulator/hi6421-regulator.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
drivers/regulator/hi6421-regulator.c +13 -9
@@ -366,9 +366,8 @@ static struct hi6421_regulator_infostatic int hi6421_regulator_enable (struct regulator_dev *rdev) { -struct hi6421_regulator_pdata *pdata; +struct hi6421_regulator_pdata *pdata =rdev_get_drvdata (rdev); - pdata =dev_get_drvdata (rdev->dev.parent);/* hi6421 spec requires regulator enablement must be serialized: * - Because when BUCK, LDO switching from off to on, it will have * a huge instantaneous current; so you can not turn on two or
@@ -385,9 +384,10 @@ static int hi6421_regulator_enable(struct regulator_dev *rdev)static unsigned int hi6421_regulator_ldo_get_mode (struct regulator_dev *rdev) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); +struct hi6421_regulator_info *info;unsigned int reg_val; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);regmap_read (rdev->regmap, rdev->desc->enable_reg, ®_val);if (reg_val & info->mode_mask)return REGULATOR_MODE_IDLE ;
@@ -397,9 +397,10 @@ static unsigned int hi6421_regulator_ldo_get_mode(struct regulator_dev *rdev)static unsigned int hi6421_regulator_buck_get_mode (struct regulator_dev *rdev) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); +struct hi6421_regulator_info *info;unsigned int reg_val; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);regmap_read (rdev->regmap, rdev->desc->enable_reg, ®_val);if (reg_val & info->mode_mask)return REGULATOR_MODE_STANDBY ;
@@ -410,9 +411,10 @@ static unsigned int hi6421_regulator_buck_get_mode(struct regulator_dev *rdev)static int hi6421_regulator_ldo_set_mode (struct regulator_dev *rdev,unsigned int mode) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); +struct hi6421_regulator_info *info;unsigned int new_mode; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);switch (mode) {case REGULATOR_MODE_NORMAL : new_mode =0 ;
@@ -434,9 +436,10 @@ static int hi6421_regulator_ldo_set_mode(struct regulator_dev *rdev,static int hi6421_regulator_buck_set_mode (struct regulator_dev *rdev,unsigned int mode) { -struct hi6421_regulator_info *info =rdev_get_drvdata (rdev); +struct hi6421_regulator_info *info;unsigned int new_mode; + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);switch (mode) {case REGULATOR_MODE_NORMAL : new_mode =0 ;
@@ -459,7 +462,9 @@ static unsigned int hi6421_regulator_ldo_get_optimum_mode(struct regulator_dev *rdev, int input_uV, int output_uV, int load_uA) { - struct hi6421_regulator_info *info = rdev_get_drvdata(rdev); + struct hi6421_regulator_info *info; + + info = container_of(rdev->desc, struct hi6421_regulator_info, desc);if (load_uA > info->eco_microamp)return REGULATOR_MODE_NORMAL ;
@@ -543,14 +548,13 @@ static int hi6421_regulator_probe(struct platform_device *pdev)if (!pdata)return -ENOMEM ;mutex_init (&pdata->lock); -platform_set_drvdata (pdev, pdata);for (i =0 ; i <ARRAY_SIZE (hi6421_regulator_info); i++) {/* assign per-regulator data */ info = &hi6421_regulator_info[i]; config.dev = pdev->dev.parent; - config.driver_data = info; + config.driver_data = pdata; config.regmap = pmic->regmap; rdev = devm_regulator_register(&pdev->dev, &info->desc,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 71/223 spi: mediatek: fix fifo rx mode
In reply to Greg Kroah-HartmanFrom: Peter Hess <[email protected]>
[ Upstream commit 3a70dd2d050331ee4cf5ad9d5c0a32d83ead9a43 ]
In FIFO mode were two problems:
- RX mode was never handled and
- in this case the tx_buf pointer was NULL and caused an exception
fix this by handling RX mode in mtk_spi_fifo_transfer
--- drivers/spi/spi-mt65xx.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
drivers/spi/spi-mt65xx.c +13 -3
@@ -427,13 +427,23 @@ static int mtk_spi_fifo_transfer(struct spi_master *master,mtk_spi_setup_packet (master); cnt = xfer->len /4 ; -iowrite32_rep (mdata->base +SPI_TX_DATA_REG , xfer->tx_buf, cnt); +if (xfer->tx_buf) +iowrite32_rep (mdata->base +SPI_TX_DATA_REG , xfer->tx_buf, cnt); + +if (xfer->rx_buf) +ioread32_rep (mdata->base +SPI_RX_DATA_REG , xfer->rx_buf, cnt); remainder = xfer->len %4 ;if (remainder >0 ) { reg_val =0 ; -memcpy (®_val, xfer->tx_buf + (cnt *4 ), remainder); -writel (reg_val, mdata->base +SPI_TX_DATA_REG ); +if (xfer->tx_buf) { +memcpy (®_val, xfer->tx_buf + (cnt *4 ), remainder); +writel (reg_val, mdata->base +SPI_TX_DATA_REG ); + } +if (xfer->rx_buf) { + reg_val =readl (mdata->base +SPI_RX_DATA_REG ); +memcpy (xfer->rx_buf + (cnt *4 ), ®_val, remainder); + } }mtk_spi_enable_transfer (master);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 72/223 ASoC: rt5631: Fix regcache sync errors on resume
In reply to Greg Kroah-HartmanFrom: Maxim Schwalm <[email protected]>
[ Upstream commit c71f78a662611fe2c67f3155da19b0eff0f29762 ]
The ALC5631 does not like multi-write accesses, avoid them. This fixes:
rt5631 4-001a: Unable to sync registers 0x3a-0x3c. -121
errors on resume from suspend (and all registers after the registers in the error not being synced).
Inspired by commit 2d30e9494f1e ("ASoC: rt5651: Fix regcache sync errors on resume") from Hans de Geode, which fixed the same errors on ALC5651.
--- sound/soc/codecs/rt5631.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/codecs/rt5631.c +2 -0
@@ -1695,6 +1695,8 @@ static const struct regmap_config rt5631_regmap_config = { .reg_defaults = rt5631_reg, .num_reg_defaults = ARRAY_SIZE(rt5631_reg), .cache_type = REGCACHE_RBTREE, + .use_single_read = true, + .use_single_write = true, }; static int rt5631_i2c_probe(struct i2c_client *i2c,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 73/223 bpf, test: fix NULL pointer dereference on invalid expected_attach_type
In reply to Greg Kroah-HartmanFrom: Xuan Zhuo <[email protected]>
[ Upstream commit 5e21bb4e812566aef86fbb77c96a4ec0782286e4 ]
These two types of XDP progs (BPF_XDP_DEVMAP, BPF_XDP_CPUMAP) will not be executed directly in the driver, therefore we should also not directly run them from here. To run in these two situations, there must be further preparations done, otherwise these may cause a kernel panic.
For more details, see also dev_xdp_attach().
[ 46.982479] BUG: kernel NULL pointer dereference, address: 0000000000000000 [ 46.984295] #PF: supervisor read access in kernel mode [ 46.985777] #PF: error_code(0x0000) - not-present page [ 46.987227] PGD 800000010dca4067 P4D 800000010dca4067 PUD 10dca6067 PMD 0 [ 46.989201] Oops: 0000 [#1] SMP PTI [ 46.990304] CPU: 7 PID: 562 Comm: a.out Not tainted 5.13.0+ #44 [ 46.992001] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/24 [ 46.995113] RIP: 0010:___bpf_prog_run+0x17b/0x1710 [ 46.996586] Code: 49 03 14 cc e8 76 f6 fe ff e9 ad fe ff ff 0f b6 43 01 48 0f bf 4b 02 48 83 c3 08 89 c2 83 e0 0f c0 ea 04 02 [ 47.001562] RSP: 0018:ffffc900005afc58 EFLAGS: 00010246 [ 47.003115] RAX: 0000000000000000 RBX: ffffc9000023f068 RCX: 0000000000000000 [ 47.005163] RDX: 0000000000000000 RSI: 0000000000000079 RDI: ffffc900005afc98 [ 47.007135] RBP: 0000000000000000 R08: ffffc9000023f048 R09: c0000000ffffdfff [ 47.009171] R10: 0000000000000001 R11: ffffc900005afb40 R12: ffffc900005afc98 [ 47.011172] R13: 0000000000000001 R14: 0000000000000001 R15: ffffffff825258a8 [ 47.013244] FS: 00007f04a5207580(0000) GS:ffff88842fdc0000(0000) knlGS:0000000000000000 [ 47.015705] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 47.017475] CR2: 0000000000000000 CR3: 0000000100182005 CR4: 0000000000770ee0 [ 47.019558] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 47.021595] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 47.023574] PKRU: 55555554 [ 47.024571] Call Trace: [ 47.025424] __bpf_prog_run32+0x32/0x50 [ 47.026296] ? printk+0x53/0x6a [ 47.027066] ? ktime_get+0x39/0x90 [ 47.027895] bpf_test_run.cold.28+0x23/0x123 [ 47.028866] ? printk+0x53/0x6a [ 47.029630] bpf_prog_test_run_xdp+0x149/0x1d0 [ 47.030649] __sys_bpf+0x1305/0x23d0 [ 47.031482] __x64_sys_bpf+0x17/0x20 [ 47.032316] do_syscall_64+0x3a/0x80 [ 47.033165] entry_SYSCALL_64_after_hwframe+0x44/0xae [ 47.034254] RIP: 0033:0x7f04a51364dd [ 47.035133] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 48 [ 47.038768] RSP: 002b:00007fff8f9fc518 EFLAGS: 00000213 ORIG_RAX: 0000000000000141 [ 47.040344] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f04a51364dd [ 47.041749] RDX: 0000000000000048 RSI: 0000000020002a80 RDI: 000000000000000a [ 47.043171] RBP: 00007fff8f9fc530 R08: 0000000002049300 R09: 0000000020000100 [ 47.044626] R10: 0000000000000004 R11: 0000000000000213 R12: 0000000000401070 [ 47.046088] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 [ 47.047579] Modules linked in: [ 47.048318] CR2: 0000000000000000 [ 47.049120] ---[ end trace 7ad34443d5be719a ]--- [ 47.050273] RIP: 0010:___bpf_prog_run+0x17b/0x1710 [ 47.051343] Code: 49 03 14 cc e8 76 f6 fe ff e9 ad fe ff ff 0f b6 43 01 48 0f bf 4b 02 48 83 c3 08 89 c2 83 e0 0f c0 ea 04 02 [ 47.054943] RSP: 0018:ffffc900005afc58 EFLAGS: 00010246 [ 47.056068] RAX: 0000000000000000 RBX: ffffc9000023f068 RCX: 0000000000000000 [ 47.057522] RDX: 0000000000000000 RSI: 0000000000000079 RDI: ffffc900005afc98 [ 47.058961] RBP: 0000000000000000 R08: ffffc9000023f048 R09: c0000000ffffdfff [ 47.060390] R10: 0000000000000001 R11: ffffc900005afb40 R12: ffffc900005afc98 [ 47.061803] R13: 0000000000000001 R14: 0000000000000001 R15: ffffffff825258a8 [ 47.063249] FS: 00007f04a5207580(0000) GS:ffff88842fdc0000(0000) knlGS:0000000000000000 [ 47.065070] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 47.066307] CR2: 0000000000000000 CR3: 0000000100182005 CR4: 0000000000770ee0 [ 47.067747] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 47.069217] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 47.070652] PKRU: 55555554 [ 47.071318] Kernel panic - not syncing: Fatal exception [ 47.072854] Kernel Offset: disabled [ 47.073683] ---[ end Kernel panic - not syncing: Fatal exception ]---
--- net/bpf/test_run.c | 3 +++ 1 file changed, 3 insertions(+)
net/bpf/test_run.c +3 -0
@@ -701,6 +701,9 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr,void *data;int ret; +if (prog->expected_attach_type ==BPF_XDP_DEVMAP || + prog->expected_attach_type ==BPF_XDP_CPUMAP ) +return -EINVAL ;if (kattr->test.ctx_in || kattr->test.ctx_out)return -EINVAL ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 74/223 bpf: Fix tail_call_reachable rejection for interpreter when jit failed
In reply to Greg Kroah-HartmanFrom: Daniel Borkmann <[email protected]>
[ Upstream commit 5dd0a6b8582ffbfa88351949d50eccd5b6694ade ]
During testing of f263a81451c1 ("bpf: Track subprog poke descriptors correctly and fix use-after-free") under various failure conditions, for example, when jit_subprogs() fails and tries to clean up the program to be run under the interpreter, we ran into the following freeze:
[...]
#127/8 tailcall_bpf2bpf_3:FAIL
[...]
[ 92.041251] BUG: KASAN: slab-out-of-bounds in ___bpf_prog_run+0x1b9d/0x2e20 [ 92.042408] Read of size 8 at addr ffff88800da67f68 by task test_progs/682 [ 92.043707] [ 92.044030] CPU: 1 PID: 682 Comm: test_progs Tainted: G O 5.13.0-53301-ge6c08cb33a30-dirty #87 [ 92.045542] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1 04/01/2014 [ 92.046785] Call Trace: [ 92.047171] ? __bpf_prog_run_args64+0xc0/0xc0 [ 92.047773] ? __bpf_prog_run_args32+0x8b/0xb0 [ 92.048389] ? __bpf_prog_run_args64+0xc0/0xc0 [ 92.049019] ? ktime_get+0x117/0x130 [...] // few hundred [similar] lines more [ 92.659025] ? ktime_get+0x117/0x130 [ 92.659845] ? __bpf_prog_run_args64+0xc0/0xc0 [ 92.660738] ? __bpf_prog_run_args32+0x8b/0xb0 [ 92.661528] ? __bpf_prog_run_args64+0xc0/0xc0 [ 92.662378] ? print_usage_bug+0x50/0x50 [ 92.663221] ? print_usage_bug+0x50/0x50 [ 92.664077] ? bpf_ksym_find+0x9c/0xe0 [ 92.664887] ? ktime_get+0x117/0x130 [ 92.665624] ? kernel_text_address+0xf5/0x100 [ 92.666529] ? __kernel_text_address+0xe/0x30 [ 92.667725] ? unwind_get_return_address+0x2f/0x50 [ 92.668854] ? ___bpf_prog_run+0x15d4/0x2e20 [ 92.670185] ? ktime_get+0x117/0x130 [ 92.671130] ? __bpf_prog_run_args64+0xc0/0xc0 [ 92.672020] ? __bpf_prog_run_args32+0x8b/0xb0 [ 92.672860] ? __bpf_prog_run_args64+0xc0/0xc0 [ 92.675159] ? ktime_get+0x117/0x130 [ 92.677074] ? lock_is_held_type+0xd5/0x130 [ 92.678662] ? ___bpf_prog_run+0x15d4/0x2e20 [ 92.680046] ? ktime_get+0x117/0x130 [ 92.681285] ? __bpf_prog_run32+0x6b/0x90 [ 92.682601] ? __bpf_prog_run64+0x90/0x90 [ 92.683636] ? lock_downgrade+0x370/0x370 [ 92.684647] ? mark_held_locks+0x44/0x90 [ 92.685652] ? ktime_get+0x117/0x130 [ 92.686752] ? lockdep_hardirqs_on+0x79/0x100 [ 92.688004] ? ktime_get+0x117/0x130 [ 92.688573] ? __cant_migrate+0x2b/0x80 [ 92.689192] ? bpf_test_run+0x2f4/0x510 [ 92.689869] ? bpf_test_timer_continue+0x1c0/0x1c0 [ 92.690856] ? rcu_read_lock_bh_held+0x90/0x90 [ 92.691506] ? __kasan_slab_alloc+0x61/0x80 [ 92.692128] ? eth_type_trans+0x128/0x240 [ 92.692737] ? __build_skb+0x46/0x50 [ 92.693252] ? bpf_prog_test_run_skb+0x65e/0xc50 [ 92.693954] ? bpf_prog_test_run_raw_tp+0x2d0/0x2d0 [ 92.694639] ? __fget_light+0xa1/0x100 [ 92.695162] ? bpf_prog_inc+0x23/0x30 [ 92.695685] ? __sys_bpf+0xb40/0x2c80 [ 92.696324] ? bpf_link_get_from_fd+0x90/0x90 [ 92.697150] ? mark_held_locks+0x24/0x90 [ 92.698007] ? lockdep_hardirqs_on_prepare+0x124/0x220 [ 92.699045] ? finish_task_switch+0xe6/0x370 [ 92.700072] ? lockdep_hardirqs_on+0x79/0x100 [ 92.701233] ? finish_task_switch+0x11d/0x370 [ 92.702264] ? __switch_to+0x2c0/0x740 [ 92.703148] ? mark_held_locks+0x24/0x90 [ 92.704155] ? __x64_sys_bpf+0x45/0x50 [ 92.705146] ? do_syscall_64+0x35/0x80 [ 92.706953] ? entry_SYSCALL_64_after_hwframe+0x44/0xae [...]
Turns out that the program rejection from e411901c0b77 ("bpf: allow for tailcalls in BPF subprograms for x64 JIT") is buggy since env->prog->aux->tail_call_reachable is never true. Commit ebf7d1f508a7 ("bpf, x64: rework pro/epilogue and tailcall handling in JIT") added a tracker into check_max_stack_depth() which propagates the tail_call_reachable condition throughout the subprograms. This info is then assigned to the subprogram's func[i]->aux->tail_call_reachable. However, in the case of the rejection check upon JIT failure, env->prog->aux->tail_call_reachable is used. func[0]->aux->tail_call_reachable which represents the main program's information did not propagate this to the outer env->prog->aux, though. Add this propagation into check_max_stack_depth() where it needs to belong so that the check can be done reliably.
--- kernel/bpf/verifier.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/bpf/verifier.c +2 -0
@@ -3675,6 +3675,8 @@ continue_func:if (tail_call_reachable)for (j =0 ; j < frame; j++) subprog[ret_prog[j]].tail_call_reachable = true; +if (subprog[0 ].tail_call_reachable) + env->prog->aux->tail_call_reachable = true;/* end of for() loop means the last insn of the 'subprog' * was reached. Doesn't matter whether it was JA or EXIT
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 75/223 xdp, net: Fix use-after-free in bpf_xdp_link_release
In reply to Greg Kroah-HartmanFrom: Xuan Zhuo <[email protected]>
[ Upstream commit 5acc7d3e8d342858405fbbc671221f676b547ce7 ]
The problem occurs between dev_get_by_index() and dev_xdp_attach_link(). At this point, dev_xdp_uninstall() is called. Then xdp link will not be detached automatically when dev is released. But link->dev already points to dev, when xdp link is released, dev will still be accessed, but dev has been released.
dev_get_by_index() |
link->dev = dev |
| rtnl_lock()
| unregister_netdevice_many()
| dev_xdp_uninstall()
| rtnl_unlock()
rtnl_lock(); |
dev_xdp_attach_link() |
rtnl_unlock(); |
| netdev_run_todo() // dev released
bpf_xdp_link_release() |
/* access dev. |
use-after-free */ |[ 45.966867] BUG: KASAN: use-after-free in bpf_xdp_link_release+0x3b8/0x3d0 [ 45.967619] Read of size 8 at addr ffff00000f9980c8 by task a.out/732 [ 45.968297] [ 45.968502] CPU: 1 PID: 732 Comm: a.out Not tainted 5.13.0+ #22 [ 45.969222] Hardware name: linux,dummy-virt (DT) [ 45.969795] Call trace: [ 45.970106] dump_backtrace+0x0/0x4c8 [ 45.970564] show_stack+0x30/0x40 [ 45.970981] dump_stack_lvl+0x120/0x18c [ 45.971470] print_address_description.constprop.0+0x74/0x30c [ 45.972182] kasan_report+0x1e8/0x200 [ 45.972659] __asan_report_load8_noabort+0x2c/0x50 [ 45.973273] bpf_xdp_link_release+0x3b8/0x3d0 [ 45.973834] bpf_link_free+0xd0/0x188 [ 45.974315] bpf_link_put+0x1d0/0x218 [ 45.974790] bpf_link_release+0x3c/0x58 [ 45.975291] __fput+0x20c/0x7e8 [ 45.975706] ____fput+0x24/0x30 [ 45.976117] task_work_run+0x104/0x258 [ 45.976609] do_notify_resume+0x894/0xaf8 [ 45.977121] work_pending+0xc/0x328 [ 45.977575] [ 45.977775] The buggy address belongs to the page: [ 45.978369] page:fffffc00003e6600 refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x4f998 [ 45.979522] flags: 0x7fffe0000000000(node=0|zone=0|lastcpupid=0x3ffff) [ 45.980349] raw: 07fffe0000000000 fffffc00003e6708 ffff0000dac3c010 0000000000000000 [ 45.981309] raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000 [ 45.982259] page dumped because: kasan: bad access detected [ 45.982948] [ 45.983153] Memory state around the buggy address: [ 45.983753] ffff00000f997f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 45.984645] ffff00000f998000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 45.985533] >ffff00000f998080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 45.986419] ^ [ 45.987112] ffff00000f998100: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 45.988006] ffff00000f998180: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff [ 45.988895] ================================================================== [ 45.989773] Disabling lock debugging due to kernel taint [ 45.990552] Kernel panic - not syncing: panic_on_warn set ... [ 45.991166] CPU: 1 PID: 732 Comm: a.out Tainted: G B 5.13.0+ #22 [ 45.991929] Hardware name: linux,dummy-virt (DT) [ 45.992448] Call trace: [ 45.992753] dump_backtrace+0x0/0x4c8 [ 45.993208] show_stack+0x30/0x40 [ 45.993627] dump_stack_lvl+0x120/0x18c [ 45.994113] dump_stack+0x1c/0x34 [ 45.994530] panic+0x3a4/0x7d8 [ 45.994930] end_report+0x194/0x198 [ 45.995380] kasan_report+0x134/0x200 [ 45.995850] __asan_report_load8_noabort+0x2c/0x50 [ 45.996453] bpf_xdp_link_release+0x3b8/0x3d0 [ 45.997007] bpf_link_free+0xd0/0x188 [ 45.997474] bpf_link_put+0x1d0/0x218 [ 45.997942] bpf_link_release+0x3c/0x58 [ 45.998429] __fput+0x20c/0x7e8 [ 45.998833] ____fput+0x24/0x30 [ 45.999247] task_work_run+0x104/0x258 [ 45.999731] do_notify_resume+0x894/0xaf8 [ 46.000236] work_pending+0xc/0x328 [ 46.000697] SMP: stopping secondary CPUs [ 46.001226] Dumping ftrace buffer: [ 46.001663] (ftrace buffer empty) [ 46.002110] Kernel Offset: disabled [ 46.002545] CPU features: 0x00000001,23202c00 [ 46.003080] Memory Limit: none
--- net/core/dev.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
net/core/dev.c +10 -4
@@ -9659,14 +9659,17 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)struct net_device *dev;int err, fd; +rtnl_lock (); dev =dev_get_by_index (net, attr->link_create.target_ifindex); -if (!dev) +if (!dev) { +rtnl_unlock ();return -EINVAL ; + } link =kzalloc (sizeof (*link),GFP_USER );if (!link) { err = -ENOMEM ; - goto out_put_dev; + goto unlock; }bpf_link_init (&link->link,BPF_LINK_TYPE_XDP , &bpf_xdp_link_lops, prog);
@@ -9676,14 +9679,14 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog) err =bpf_link_prime (&link->link, &link_primer);if (err) {kfree (link); - goto out_put_dev; + goto unlock; } -rtnl_lock (); err =dev_xdp_attach_link (dev,NULL , link);rtnl_unlock ();if (err) { + link->dev =NULL ;bpf_link_cleanup (&link_primer); goto out_put_dev; }
@@ -9693,6 +9696,9 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)dev_put (dev);return fd; +unlock: +rtnl_unlock (); + out_put_dev:dev_put (dev);return err;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 76/223 ASoC: SOF: Intel: Update ADL descriptor to use ACPI power states
In reply to Greg Kroah-HartmanFrom: Sathya Prakash M R <[email protected]>
[ Upstream commit aa21548e34c19c12e924c736f3fd9e6a4d0f5419 ]
The ADL descriptor was missing an ACPI power setting, causing the DSP to enter D3 even with a D0i1-compatible wake-on-voice/hotwording capture stream.
--- sound/soc/sof/intel/pci-tgl.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/sof/intel/pci-tgl.c +1 -0
@@ -89,6 +89,7 @@ static const struct sof_dev_desc adls_desc = {static const struct sof_dev_desc adl_desc = { .machines = snd_soc_acpi_intel_adl_machines, .alt_machines = snd_soc_acpi_intel_adl_sdw_machines, + .use_acpi_target_states = true, .resindex_lpe_base =0 , .resindex_pcicfg_base =-1 , .resindex_imr_base =-1 ,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 77/223 timers: Fix get_next_timer_interrupt() with no timers pending
In reply to Greg Kroah-HartmanFrom: Nicolas Saenz Julienne <[email protected]>
[ Upstream commit aebacb7f6ca1926918734faae14d1f0b6fae5cb7 ]
31cd0e119d50 ("timers: Recalculate next timer interrupt only when necessary") subtly altered get_next_timer_interrupt()'s behaviour. The function no longer consistently returns KTIME_MAX with no timers pending.
In order to decide if there are any timers pending we check whether the next expiry will happen NEXT_TIMER_MAX_DELTA jiffies from now. Unfortunately, the next expiry time and the timer base clock are no longer updated in unison. The former changes upon certain timer operations (enqueue, expire, detach), whereas the latter keeps track of jiffies as they move forward. Ultimately breaking the logic above.
A simplified example:
- Upon entering get_next_timer_interrupt() with:
jiffies = 1 base->clk = 0; base->next_expiry = NEXT_TIMER_MAX_DELTA;
'base->next_expiry == base->clk + NEXT_TIMER_MAX_DELTA', the function returns KTIME_MAX.
- 'base->clk' is updated to the jiffies value.
- The next time we enter get_next_timer_interrupt(), taking into account no timer operations happened:
base->clk = 1; base->next_expiry = NEXT_TIMER_MAX_DELTA;
'base->next_expiry != base->clk + NEXT_TIMER_MAX_DELTA', the function returns a valid expire time, which is incorrect.
This ultimately might unnecessarily rearm sched's timer on nohz_full setups, and add latency to the system[1].
So, introduce 'base->timers_pending'[2], update it every time 'base->next_expiry' changes, and use it in get_next_timer_interrupt().
[1] See tick_nohz_stop_tick().
[2] A quick pahole check on x86_64 and arm64 shows it doesn't make 'struct timer_base' any bigger.
--- kernel/time/timer.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
kernel/time/timer.c +5 -3
@@ -207,6 +207,7 @@ struct timer_base {unsigned int cpu;bool next_expiry_recalc;bool is_idle; +bool timers_pending;DECLARE_BITMAP (pending_map,WHEEL_SIZE );struct hlist_head vectors[WHEEL_SIZE ]; }____cacheline_aligned ;
@@ -595,6 +596,7 @@ static void enqueue_timer(struct timer_base *base, struct timer_list *timer,* can reevaluate the wheel: */ base->next_expiry = bucket_expiry; + base->timers_pending = true; base->next_expiry_recalc = false;trigger_dyntick_cpu (base, timer); }
@@ -1596,6 +1598,7 @@ static unsigned long __next_timer_interrupt(struct timer_base *base) } base->next_expiry_recalc = false; + base->timers_pending = !(next == base->clk +NEXT_TIMER_MAX_DELTA );return next; }
@@ -1647,7 +1650,6 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem)struct timer_base *base =this_cpu_ptr (&timer_bases[BASE_STD ]);u64 expires =KTIME_MAX ;unsigned long nextevt; -bool is_max_delta;/* * Pretend that there is no timer pending if the cpu is offline.
@@ -1660,7 +1662,6 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem)if (base->next_expiry_recalc) base->next_expiry =__next_timer_interrupt (base); nextevt = base->next_expiry; - is_max_delta = (nextevt == base->clk +NEXT_TIMER_MAX_DELTA );/* * We have a fresh next event. Check whether we can forward the
@@ -1678,7 +1679,7 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem) expires = basem; base->is_idle = false; }else { -if (!is_max_delta) +if (base->timers_pending) expires = basem + (u64)(nextevt - basej) *TICK_NSEC ;/* * If we expect to sleep more than a tick, mark the base idle.
@@ -1961,6 +1962,7 @@ int timers_prepare_cpu(unsigned int cpu) base =per_cpu_ptr (&timer_bases[b], cpu); base->clk = jiffies; base->next_expiry = base->clk +NEXT_TIMER_MAX_DELTA ; + base->timers_pending = false; base->is_idle = false; }return 0 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 78/223 drm/vc4: hdmi: Drop devm interrupt handler for CEC interrupts
In reply to Greg Kroah-HartmanFrom: Maxime Ripard <[email protected]>
[ Upstream commit 32a19de21ae40f0601f48575b610dde4f518ccc6 ]
The CEC interrupt handlers are registered through the devm_request_threaded_irq function. However, while free_irq is indeed called properly when the device is unbound or bind fails, it's called after unbind or bind is done.
In our particular case, it means that on failure it creates a window where our interrupt handler can be called, but we're freeing every resource (CEC adapter, DRM objects, etc.) it might need.
In order to address this, let's switch to the non-devm variant to control better when the handler will be unregistered and allow us to make it safe.
--- drivers/gpu/drm/vc4/vc4_hdmi.c | 49 +++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 16 deletions(-)
drivers/gpu/drm/vc4/vc4_hdmi.c +33 -16
@@ -1690,38 +1690,46 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)vc4_hdmi_cec_update_clk_div (vc4_hdmi);if (vc4_hdmi->variant->external_irq_controller) { - ret =devm_request_threaded_irq (&pdev->dev, -platform_get_irq_byname (pdev,"cec-rx" ), - vc4_cec_irq_handler_rx_bare, - vc4_cec_irq_handler_rx_thread,0 , -"vc4 hdmi cec rx" , vc4_hdmi); + ret =request_threaded_irq (platform_get_irq_byname (pdev,"cec-rx" ), + vc4_cec_irq_handler_rx_bare, + vc4_cec_irq_handler_rx_thread,0 , +"vc4 hdmi cec rx" , vc4_hdmi);if (ret) goto err_delete_cec_adap; - ret =devm_request_threaded_irq (&pdev->dev, -platform_get_irq_byname (pdev,"cec-tx" ), - vc4_cec_irq_handler_tx_bare, - vc4_cec_irq_handler_tx_thread,0 , -"vc4 hdmi cec tx" , vc4_hdmi); + ret =request_threaded_irq (platform_get_irq_byname (pdev,"cec-tx" ), + vc4_cec_irq_handler_tx_bare, + vc4_cec_irq_handler_tx_thread,0 , +"vc4 hdmi cec tx" , vc4_hdmi);if (ret) - goto err_delete_cec_adap; + goto err_remove_cec_rx_handler; }else {HDMI_WRITE (HDMI_CEC_CPU_MASK_SET ,0xffffffff ); - ret =devm_request_threaded_irq (&pdev->dev,platform_get_irq (pdev,0 ), - vc4_cec_irq_handler, - vc4_cec_irq_handler_thread,0 , -"vc4 hdmi cec" , vc4_hdmi); + ret =request_threaded_irq (platform_get_irq (pdev,0 ), + vc4_cec_irq_handler, + vc4_cec_irq_handler_thread,0 , +"vc4 hdmi cec" , vc4_hdmi);if (ret) goto err_delete_cec_adap; } ret =cec_register_adapter (vc4_hdmi->cec_adap, &pdev->dev);if (ret <0 ) - goto err_delete_cec_adap; + goto err_remove_handlers;return 0 ; +err_remove_handlers: +if (vc4_hdmi->variant->external_irq_controller) +free_irq (platform_get_irq_byname (pdev,"cec-tx" ), vc4_hdmi); +else +free_irq (platform_get_irq (pdev,0 ), vc4_hdmi); + +err_remove_cec_rx_handler: +if (vc4_hdmi->variant->external_irq_controller) +free_irq (platform_get_irq_byname (pdev,"cec-rx" ), vc4_hdmi); + err_delete_cec_adap:cec_delete_adapter (vc4_hdmi->cec_adap);
@@ -1730,6 +1738,15 @@ err_delete_cec_adap:static void vc4_hdmi_cec_exit (struct vc4_hdmi *vc4_hdmi) { +struct platform_device *pdev = vc4_hdmi->pdev; + +if (vc4_hdmi->variant->external_irq_controller) { +free_irq (platform_get_irq_byname (pdev,"cec-rx" ), vc4_hdmi); +free_irq (platform_get_irq_byname (pdev,"cec-tx" ), vc4_hdmi); + }else { +free_irq (platform_get_irq (pdev,0 ), vc4_hdmi); + } +cec_unregister_adapter (vc4_hdmi->cec_adap); }#else
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 79/223 net: dsa: mv88e6xxx: NET_DSA_MV88E6XXX_PTP should depend on NET_DSA_MV88E6XXX
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 99bb2ebab953435852340cdb198c5abbf0bb5dd3 ]
Making global2 support mandatory removed the Kconfig symbol NET_DSA_MV88E6XXX_GLOBAL2. This symbol also served as an intermediate symbol to make NET_DSA_MV88E6XXX_PTP depend on NET_DSA_MV88E6XXX. With the symbol removed, the user is always asked about PTP support for Marvell 88E6xxx switches, even if the latter support is not enabled.
Fix this by reinstating the dependency.
--- drivers/net/dsa/mv88e6xxx/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/dsa/mv88e6xxx/Kconfig +1 -1
@@ -12,7 +12,7 @@ config NET_DSA_MV88E6XXX config NET_DSA_MV88E6XXX_PTP bool "PTP support for Marvell 88E6xxx" default n - depends on PTP_1588_CLOCK + depends on NET_DSA_MV88E6XXX && PTP_1588_CLOCK help Say Y to enable PTP hardware timestamping on Marvell 88E6xxx switch chips that support it.
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 80/223 liquidio: Fix unintentional sign extension issue on left shift of u16
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit e7efc2ce3d0789cd7c21b70ff00cd7838d382639 ]
Shifting the u16 integer oct->pcie_port by CN23XX_PKT_INPUT_CTL_MAC_NUM_POS
(29) bits will be promoted to a 32 bit signed int and then sign-extended to a u64. In the cases where oct->pcie_port where bit 2 is set (e.g. 3..7) the shifted value will be sign extended and the top 32 bits of the result will be set.
Fix this by casting the u16 values to a u64 before the 29 bit left shift.
Addresses-Coverity: ("Unintended sign extension")
--- drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c +1 -1
@@ -420,7 +420,7 @@ static int cn23xx_pf_setup_global_input_regs(struct octeon_device *oct)* bits 32:47 indicate the PVF num. */ for (q_no =0 ; q_no < ern; q_no++) { - reg_val = oct->pcie_port <<CN23XX_PKT_INPUT_CTL_MAC_NUM_POS ; + reg_val = (u64 )oct->pcie_port <<CN23XX_PKT_INPUT_CTL_MAC_NUM_POS ;/* for VF assigned queues. */ if (q_no < oct->sriov_info.pf_srn) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 81/223 s390/bpf: Perform r1 range checking before accessing jit->seen_reg[r1]
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 91091656252f5d6d8c476e0c92776ce9fae7b445 ]
Currently array jit->seen_reg[r1] is being accessed before the range checking of index r1. The range changing on r1 should be performed first since it will avoid any potential out-of-range accesses on the array seen_reg[] and also it is more optimal to perform checks on r1 before fetching data from the array. Fix this by swapping the order of the checks before the array access.
--- arch/s390/net/bpf_jit_comp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/net/bpf_jit_comp.c +1 -1
@@ -112,7 +112,7 @@ static inline void reg_set_seen(struct bpf_jit *jit, u32 b1) {u32 r1 = reg2hex[b1]; -if (!jit->seen_reg[r1] && r1 >=6 && r1 <=15 ) +if (r1 >=6 && r1 <=15 && !jit->seen_reg[r1]) jit->seen_reg[r1] =1 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 82/223 bpf, sockmap: Fix potential memory leak on unlikely error case
In reply to Greg Kroah-HartmanFrom: John Fastabend <[email protected]>
[ Upstream commit 7e6b27a69167f97c56b5437871d29e9722c3e470 ]
If skb_linearize is needed and fails we could leak a msg on the error handling. To fix ensure we kfree the msg block before returning error. Found during code review.
--- net/core/skmsg.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
net/core/skmsg.c +11 -5
@@ -531,10 +531,8 @@ static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb,if (skb_linearize (skb))return -EAGAIN ; num_sge =skb_to_sgvec (skb, msg->sg.data,0 , skb->len); -if (unlikely (num_sge <0 )) { -kfree (msg); +if (unlikely (num_sge <0 ))return num_sge; - } copied = skb->len; msg->sg.start =0 ;
@@ -553,6 +551,7 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb) {struct sock *sk = psock->sk;struct sk_msg *msg; +int err;/* If we are receiving on the same sock skb->sk is already assigned, * skip memory accounting and owner transition seeing it already set
@@ -571,7 +570,10 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb)* into user buffers. */ skb_set_owner_r (skb, sk); -return sk_psock_skb_ingress_enqueue (skb, psock, sk, msg); + err =sk_psock_skb_ingress_enqueue (skb, psock, sk, msg); +if (err <0 ) +kfree (msg); +return err; }/* Puts an skb on the ingress queue of the socket already assigned to the
@@ -582,12 +584,16 @@ static int sk_psock_skb_ingress_self(struct sk_psock *psock, struct sk_buff *skb {struct sk_msg *msg =kzalloc (sizeof (*msg), __GFP_NOWARN |GFP_ATOMIC );struct sock *sk = psock->sk; +int err;if (unlikely (!msg))return -EAGAIN ;sk_msg_init (msg);skb_set_owner_r (skb, sk); -return sk_psock_skb_ingress_enqueue (skb, psock, sk, msg); + err =sk_psock_skb_ingress_enqueue (skb, psock, sk, msg); +if (err <0 ) +kfree (msg); +return err; } static int sk_psock_handle_skb(struct sk_psock *psock, struct sk_buff *skb,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 83/223 bpf, sockmap, tcp: sk_prot needs inuse_idx set for proc stats
In reply to Greg Kroah-HartmanFrom: John Fastabend <[email protected]>
[ Upstream commit 228a4a7ba8e99bb9ef980b62f71e3be33f4aae69 ]
The proc socket stats use sk_prot->inuse_idx value to record inuse sock stats. We currently do not set this correctly from sockmap side. The result is reading sock stats '/proc/net/sockstat' gives incorrect values. The socket counter is incremented correctly, but because we don't set the counter correctly when we replace sk_prot we may omit the decrement.
To get the correct inuse_idx value move the core_initcall that initializes the TCP proto handlers to late_initcall. This way it is initialized after TCP has the chance to assign the inuse_idx value from the register protocol handler.
--- net/ipv4/tcp_bpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_bpf.c +1 -1
@@ -486,7 +486,7 @@ static int __init tcp_bpf_v4_build_proto(void)tcp_bpf_rebuild_protos (tcp_bpf_prots[TCP_BPF_IPV4 ], &tcp_prot);return 0 ; } -core_initcall (tcp_bpf_v4_build_proto); +late_initcall (tcp_bpf_v4_build_proto);static int tcp_bpf_assert_proto_ops (struct proto *ops) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 84/223 bpf, sockmap, udp: sk_prot needs inuse_idx set for proc stats
In reply to Greg Kroah-HartmanFrom: Jakub Sitnicki <[email protected]>
[ Upstream commit 54ea2f49fd9400dd698c25450be3352b5613b3b4 ]
The proc socket stats use sk_prot->inuse_idx value to record inuse sock stats. We currently do not set this correctly from sockmap side. The result is reading sock stats '/proc/net/sockstat' gives incorrect values. The socket counter is incremented correctly, but because we don't set the counter correctly when we replace sk_prot we may omit the decrement.
To get the correct inuse_idx value move the core_initcall that initializes the UDP proto handlers to late_initcall. This way it is initialized after UDP has the chance to assign the inuse_idx value from the register protocol handler.
--- net/ipv4/udp_bpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/udp_bpf.c +1 -1
@@ -101,7 +101,7 @@ static int __init udp_bpf_v4_build_proto(void)udp_bpf_rebuild_protos (&udp_bpf_prots[UDP_BPF_IPV4 ], &udp_prot);return 0 ; } -core_initcall (udp_bpf_v4_build_proto); +late_initcall (udp_bpf_v4_build_proto);int udp_bpf_update_proto (struct sock *sk,struct sk_psock *psock,bool restore) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 85/223 bpftool: Check malloc return value in mount_bpffs_for_pin
In reply to Greg Kroah-HartmanFrom: Tobias Klauser <[email protected]>
[ Upstream commit d444b06e40855219ef38b5e9286db16d435f06dc ]
Fix and add a missing NULL check for the prior malloc() call.
--- tools/bpf/bpftool/common.c | 5 +++++ 1 file changed, 5 insertions(+)
tools/bpf/bpftool/common.c +5 -0
@@ -222,6 +222,11 @@ int mount_bpffs_for_pin(const char *name)int err =0 ; file =malloc (strlen (name) +1 ); +if (!file) { +p_err ("mem alloc failed" ); +return -1 ; + } +strcpy (file, name); dir =dirname (file);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 86/223 net: fix uninit-value in caif_seqpkt_sendmsg
In reply to Greg Kroah-HartmanFrom: Ziyang Xuan <[email protected]>
[ Upstream commit 991e634360f2622a683b48dfe44fe6d9cb765a09 ]
When nr_segs equal to zero in iovec_from_user, the object msg->msg_iter.iov is uninit stack memory in caif_seqpkt_sendmsg which is defined in ___sys_sendmsg. So we cann't just judge msg->msg_iter.iov->base directlly. We can use nr_segs to judge msg in caif_seqpkt_sendmsg whether has data buffers.
=====================================================
BUG: KMSAN: uninit-value in caif_seqpkt_sendmsg+0x693/0xf60 net/caif/caif_socket.c:542 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x1c9/0x220 lib/dump_stack.c:118 kmsan_report+0xf7/0x1e0 mm/kmsan/kmsan_report.c:118 __msan_warning+0x58/0xa0 mm/kmsan/kmsan_instr.c:215 caif_seqpkt_sendmsg+0x693/0xf60 net/caif/caif_socket.c:542 sock_sendmsg_nosec net/socket.c:652 [inline] sock_sendmsg net/socket.c:672 [inline] ____sys_sendmsg+0x12b6/0x1350 net/socket.c:2343 ___sys_sendmsg net/socket.c:2397 [inline] __sys_sendmmsg+0x808/0xc90 net/socket.c:2480 __compat_sys_sendmmsg net/compat.c:656 [inline]
--- net/caif/caif_socket.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/caif/caif_socket.c +2 -1
@@ -539,7 +539,8 @@ static int caif_seqpkt_sendmsg(struct socket *sock, struct msghdr *msg, goto err; ret = -EINVAL ; -if (unlikely (msg->msg_iter.iov->iov_base ==NULL )) +if (unlikely (msg->msg_iter.nr_segs ==0 ) || +unlikely (msg->msg_iter.iov->iov_base ==NULL )) goto err; noblock = msg->msg_flags &MSG_DONTWAIT ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 87/223 spi: spi-cadence-quadspi: Fix division by zero warning
In reply to Greg Kroah-HartmanFrom: Yoshitaka Ikeda <[email protected]>
[ Upstream commit 55cef88bbf12f3bfbe5c2379a8868a034707e755 ]
Fix below division by zero warning:
- Added an if statement because buswidth can be zero, resulting in division by zero.
- The modified code was based on another driver (atmel-quadspi).
[ 0.795337] Division by zero in kernel. : [ 0.834051] [<807fd40c>] (__div0) from [<804e1acc>] (Ldiv0+0x8/0x10) [ 0.839097] [<805f0710>] (cqspi_exec_mem_op) from [<805edb4c>] (spi_mem_exec_op+0x3b0/0x3f8)
--- drivers/spi/spi-cadence-quadspi.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/spi/spi-cadence-quadspi.c +6 -4
@@ -307,11 +307,13 @@ static unsigned int cqspi_calc_rdreg(struct cqspi_flash_pdata *f_pdata)static unsigned int cqspi_calc_dummy (const struct spi_mem_op *op,bool dtr) { -unsigned int dummy_clk; +unsigned int dummy_clk =0 ; - dummy_clk = op->dummy.nbytes * (8 / op->dummy.buswidth); -if (dtr) - dummy_clk /=2 ; +if (op->dummy.buswidth && op->dummy.nbytes) { + dummy_clk = op->dummy.nbytes * (8 / op->dummy.buswidth); +if (dtr) + dummy_clk /=2 ; + }return dummy_clk; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 88/223 usb: hso: fix error handling code of hso_create_net_device
In reply to Greg Kroah-HartmanFrom: Dongliang Mu <[email protected]>
[ Upstream commit a6ecfb39ba9d7316057cea823b196b734f6b18ca ]
The current error handling code of hso_create_net_device is hso_free_net_device, no matter which errors lead to. For example, WARNING in hso_free_net_device [1].
Fix this by refactoring the error handling code of hso_create_net_device by handling different errors by different code.
[1] https://syzkaller.appspot.com/bug?id=66eff8d49af1b28370ad342787413e35bbe76efe
--- drivers/net/usb/hso.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-)
drivers/net/usb/hso.c +23 -10
@@ -2496,7 +2496,7 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface, hso_net_init);if (!net) {dev_err (&interface->dev,"Unable to create ethernet device\n" ); - goto exit; + goto err_hso_dev; } hso_net =netdev_priv (net);
@@ -2509,13 +2509,13 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface, USB_DIR_IN);if (!hso_net->in_endp) {dev_err (&interface->dev,"Can't find BULK IN endpoint\n" ); - goto exit; + goto err_net; } hso_net->out_endp =hso_get_ep (interface,USB_ENDPOINT_XFER_BULK ,USB_DIR_OUT );if (!hso_net->out_endp) {dev_err (&interface->dev,"Can't find BULK OUT endpoint\n" ); - goto exit; + goto err_net; }SET_NETDEV_DEV (net, &interface->dev);SET_NETDEV_DEVTYPE (net, &hso_type);
@@ -2524,18 +2524,18 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,for (i =0 ; i <MUX_BULK_RX_BUF_COUNT ; i++) { hso_net->mux_bulk_rx_urb_pool[i] =usb_alloc_urb (0 ,GFP_KERNEL );if (!hso_net->mux_bulk_rx_urb_pool[i]) - goto exit; + goto err_mux_bulk_rx; hso_net->mux_bulk_rx_buf_pool[i] =kzalloc (MUX_BULK_RX_BUF_SIZE ,GFP_KERNEL );if (!hso_net->mux_bulk_rx_buf_pool[i]) - goto exit; + goto err_mux_bulk_rx; } hso_net->mux_bulk_tx_urb =usb_alloc_urb (0 ,GFP_KERNEL );if (!hso_net->mux_bulk_tx_urb) - goto exit; + goto err_mux_bulk_rx; hso_net->mux_bulk_tx_buf =kzalloc (MUX_BULK_TX_BUF_SIZE ,GFP_KERNEL );if (!hso_net->mux_bulk_tx_buf) - goto exit; + goto err_free_tx_urb;add_net_device (hso_dev);
@@ -2543,7 +2543,7 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface, result =register_netdev (net);if (result) {dev_err (&interface->dev,"Failed to register device\n" ); - goto exit; + goto err_free_tx_buf; }hso_log_port (hso_dev);
@@ -2551,8 +2551,21 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,hso_create_rfkill (hso_dev, interface);return hso_dev; -exit: -hso_free_net_device (hso_dev, true); + +err_free_tx_buf: +remove_net_device (hso_dev); +kfree (hso_net->mux_bulk_tx_buf); +err_free_tx_urb: +usb_free_urb (hso_net->mux_bulk_tx_urb); +err_mux_bulk_rx: +for (i =0 ; i <MUX_BULK_RX_BUF_COUNT ; i++) { +usb_free_urb (hso_net->mux_bulk_rx_urb_pool[i]); +kfree (hso_net->mux_bulk_rx_buf_pool[i]); + } +err_net: +free_netdev (net); +err_hso_dev: +kfree (hso_dev);return NULL ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 89/223 dma-mapping: handle vmalloc addresses in dma_common_{mmap,get_sgtable}
In reply to Greg Kroah-HartmanFrom: Roman Skakun <[email protected]>
[ Upstream commit 40ac971eab89330d6153e7721e88acd2d98833f9 ]
xen-swiotlb can use vmalloc backed addresses for dma coherent allocations and uses the common helpers. Properly handle them to unbreak Xen on ARM platforms.
--- kernel/dma/ops_helpers.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
kernel/dma/ops_helpers.c +10 -2
@@ -5,6 +5,13 @@*/ #include <linux/dma-map-ops.h> +static struct page *dma_common_vaddr_to_page (void *cpu_addr) +{ +if (is_vmalloc_addr (cpu_addr)) +return vmalloc_to_page (cpu_addr); +return virt_to_page (cpu_addr); +} +/* * Create scatter-list for the already allocated DMA buffer. */
@@ -12,7 +19,7 @@ int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) { - struct page *page = virt_to_page(cpu_addr); + struct page *page = dma_common_vaddr_to_page(cpu_addr);int ret; ret =sg_alloc_table (sgt,1 ,GFP_KERNEL );
@@ -32,6 +39,7 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,unsigned long user_count =vma_pages (vma);unsigned long count =PAGE_ALIGN (size) >>PAGE_SHIFT ;unsigned long off = vma->vm_pgoff; +struct page *page =dma_common_vaddr_to_page (cpu_addr);int ret = -ENXIO ; vma->vm_page_prot =dma_pgprot (dev, vma->vm_page_prot, attrs);
@@ -43,7 +51,7 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,return -ENXIO ;return remap_pfn_range (vma, vma->vm_start, -page_to_pfn (virt_to_page (cpu_addr)) + vma->vm_pgoff, +page_to_pfn (page) + vma->vm_pgoff, user_count <<PAGE_SHIFT , vma->vm_page_prot);#else return -ENXIO ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 90/223 ASoC: soc-pcm: add a flag to reverse the stop sequence
In reply to Greg Kroah-HartmanFrom: Vijendar Mukunda <[email protected]>
[ Upstream commit 59dd33f82dc0975c55d3d46801e7ca45532d7673 ]
On stream stop, currently CPU DAI stop sequence invoked first followed by DMA. For Few platforms, it is required to stop the DMA first before stopping CPU DAI.
Introduced new flag in dai_link structure for reordering stop sequence. Based on flag check, ASoC core will re-order the stop sequence.
--- include/sound/soc.h | 6 ++++++ sound/soc/soc-pcm.c | 22 ++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-)
include/sound/soc.h +6 -0
@@ -712,6 +712,12 @@ struct snd_soc_dai_link {/* Do not create a PCM for this DAI link (Backend link) */ unsigned int ignore:1; +/* This flag will reorder stop sequence. By enabling this flag +* DMA controller stop sequence will be invoked first followed by +* CPU DAI driver stop sequence +*/ + unsigned int stop_dma_first:1; +#ifdef CONFIG_SND_SOC_TOPOLOGY struct snd_soc_dobj dobj;/* For topology */ #endif
sound/soc/soc-pcm.c +16 -6
@@ -1015,6 +1015,7 @@ out:static int soc_pcm_trigger (struct snd_pcm_substream *substream,int cmd) { +struct snd_soc_pcm_runtime *rtd =asoc_substream_to_rtd (substream);int ret = -EINVAL , _ret =0 ;int rollback =0 ;
@@ -1055,14 +1056,23 @@ start_err:case SNDRV_PCM_TRIGGER_STOP :case SNDRV_PCM_TRIGGER_SUSPEND :case SNDRV_PCM_TRIGGER_PAUSE_PUSH : - ret =snd_soc_pcm_dai_trigger (substream, cmd, rollback); -if (ret <0 ) -break ; +if (rtd->dai_link->stop_dma_first) { + ret =snd_soc_pcm_component_trigger (substream, cmd, rollback); +if (ret <0 ) +break ; - ret =snd_soc_pcm_component_trigger (substream, cmd, rollback); -if (ret <0 ) -break ; + ret =snd_soc_pcm_dai_trigger (substream, cmd, rollback); +if (ret <0 ) +break ; + }else { + ret =snd_soc_pcm_dai_trigger (substream, cmd, rollback); +if (ret <0 ) +break ; + ret =snd_soc_pcm_component_trigger (substream, cmd, rollback); +if (ret <0 ) +break ; + } ret =snd_soc_link_trigger (substream, cmd, rollback);break ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 91/223 efi/tpm: Differentiate missing and invalid final event log table.
In reply to Greg Kroah-HartmanFrom: Michal Suchanek <[email protected]>
[ Upstream commit 674a9f1f6815849bfb5bf385e7da8fc198aaaba9 ]
Missing TPM final event log table is not a firmware bug.
Clearly if providing event log in the old format makes the final event log invalid it should not be provided at least in that case.
--- drivers/firmware/efi/tpm.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/firmware/efi/tpm.c +5 -3
@@ -62,9 +62,11 @@ int __init efi_tpm_eventlog_init(void) tbl_size =sizeof (*log_tbl) + log_tbl->size;memblock_reserve (efi.tpm_log, tbl_size); -if (efi.tpm_final_log ==EFI_INVALID_TABLE_ADDR || - log_tbl->version !=EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 ) { -pr_warn (FW_BUG "TPM Final Events table missing or invalid\n" ); +if (efi.tpm_final_log ==EFI_INVALID_TABLE_ADDR ) { +pr_info ("TPM Final Events table not present\n" ); + goto out; + }else if (log_tbl->version !=EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 ) { +pr_warn (FW_BUG "TPM Final Events table invalid\n" ); goto out; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 92/223 net: decnet: Fix sleeping inside in af_decnet
In reply to Greg Kroah-HartmanFrom: Yajun Deng <[email protected]>
[ Upstream commit 5f119ba1d5771bbf46d57cff7417dcd84d3084ba ]
The release_sock() is blocking function, it would change the state after sleeping. use wait_woken() instead.
--- net/decnet/af_decnet.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)
net/decnet/af_decnet.c +12 -15
@@ -816,7 +816,7 @@ static int dn_auto_bind(struct socket *sock)static int dn_confirm_accept (struct sock *sk,long *timeo,gfp_t allocation) {struct dn_scp *scp =DN_SK (sk); -DEFINE_WAIT (wait); +DEFINE_WAIT_FUNC (wait, woken_wake_function);int err;if (scp->state !=DN_CR )
@@ -826,11 +826,11 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation) scp->segsize_loc =dst_metric_advmss (__sk_dst_get (sk));dn_send_conn_conf (sk, allocation); -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); +add_wait_queue (sk_sleep (sk), &wait);for (;;) {release_sock (sk);if (scp->state ==DN_CC ) - *timeo =schedule_timeout (*timeo); + *timeo =wait_woken (&wait,TASK_INTERRUPTIBLE , *timeo);lock_sock (sk); err =0 ;if (scp->state ==DN_RUN )
@@ -844,9 +844,8 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation) err = -EAGAIN ;if (!*timeo)break ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); } -finish_wait (sk_sleep (sk), &wait); +remove_wait_queue (sk_sleep (sk), &wait);if (err ==0 ) { sk->sk_socket->state =SS_CONNECTED ; }else if (scp->state !=DN_CC ) {
@@ -858,7 +857,7 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation)static int dn_wait_run (struct sock *sk,long *timeo) {struct dn_scp *scp =DN_SK (sk); -DEFINE_WAIT (wait); +DEFINE_WAIT_FUNC (wait, woken_wake_function);int err =0 ;if (scp->state ==DN_RUN )
@@ -867,11 +866,11 @@ static int dn_wait_run(struct sock *sk, long *timeo)if (!*timeo)return -EALREADY ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); +add_wait_queue (sk_sleep (sk), &wait);for (;;) {release_sock (sk);if (scp->state ==DN_CI || scp->state ==DN_CC ) - *timeo =schedule_timeout (*timeo); + *timeo =wait_woken (&wait,TASK_INTERRUPTIBLE , *timeo);lock_sock (sk); err =0 ;if (scp->state ==DN_RUN )
@@ -885,9 +884,8 @@ static int dn_wait_run(struct sock *sk, long *timeo) err = -ETIMEDOUT ;if (!*timeo)break ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); } -finish_wait (sk_sleep (sk), &wait); +remove_wait_queue (sk_sleep (sk), &wait); out:if (err ==0 ) { sk->sk_socket->state =SS_CONNECTED ;
@@ -1032,16 +1030,16 @@ static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt)static struct sk_buff *dn_wait_for_connect (struct sock *sk,long *timeo) { -DEFINE_WAIT (wait); +DEFINE_WAIT_FUNC (wait, woken_wake_function);struct sk_buff *skb =NULL ;int err =0 ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); +add_wait_queue (sk_sleep (sk), &wait);for (;;) {release_sock (sk); skb =skb_dequeue (&sk->sk_receive_queue);if (skb ==NULL ) { - *timeo =schedule_timeout (*timeo); + *timeo =wait_woken (&wait,TASK_INTERRUPTIBLE , *timeo); skb =skb_dequeue (&sk->sk_receive_queue); }lock_sock (sk);
@@ -1056,9 +1054,8 @@ static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo) err = -EAGAIN ;if (!*timeo)break ; -prepare_to_wait (sk_sleep (sk), &wait,TASK_INTERRUPTIBLE ); } -finish_wait (sk_sleep (sk), &wait); +remove_wait_queue (sk_sleep (sk), &wait);return skb ==NULL ?ERR_PTR (err) : skb; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 93/223 KVM: PPC: Book3S: Fix CONFIG_TRANSACTIONAL_MEM=n crash
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
[ Upstream commit bd31ecf44b8e18ccb1e5f6b50f85de6922a60de3 ]
When running CPU_FTR_P9_TM_HV_ASSIST, HFSCR[TM] is set for the guest even if the host has CONFIG_TRANSACTIONAL_MEM=n, which causes it to be unprepared to handle guest exits while transactional.
Normal guests don't have a problem because the HTM capability will not be advertised, but a rogue or buggy one could crash the host.
--- arch/powerpc/kvm/book3s_hv.c | 2 ++ 1 file changed, 2 insertions(+)
arch/powerpc/kvm/book3s_hv.c +2 -0
@@ -2445,8 +2445,10 @@ static int kvmppc_core_vcpu_create_hv(struct kvm_vcpu *vcpu)HFSCR_DSCR |HFSCR_VECVSX |HFSCR_FP |HFSCR_PREFIX ;if (cpu_has_feature (CPU_FTR_HVMODE )) { vcpu->arch.hfscr &=mfspr (SPRN_HFSCR ); +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM if (cpu_has_feature (CPU_FTR_P9_TM_HV_ASSIST )) vcpu->arch.hfscr |=HFSCR_TM ; +#endif }if (cpu_has_feature (CPU_FTR_TM_COMP )) vcpu->arch.hfscr |=HFSCR_TM ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 94/223 KVM: PPC: Fix kvm_arch_vcpu_ioctl vcpu_load leak
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
[ Upstream commit bc4188a2f56e821ea057aca6bf444e138d06c252 ]
vcpu_put is not called if the user copy fails. This can result in preempt notifier corruption and crashes, among other issues.
--- arch/powerpc/kvm/powerpc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/kvm/powerpc.c +2 -2
@@ -2045,9 +2045,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp, {struct kvm_enable_cap cap; r = -EFAULT ; -vcpu_load (vcpu);if (copy_from_user (&cap, argp,sizeof (cap))) goto out; +vcpu_load (vcpu); r =kvm_vcpu_ioctl_enable_cap (vcpu, &cap);vcpu_put (vcpu);break ;
@@ -2071,9 +2071,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,case KVM_DIRTY_TLB : {struct kvm_dirty_tlb dirty; r = -EFAULT ; -vcpu_load (vcpu);if (copy_from_user (&dirty, argp,sizeof (dirty))) goto out; +vcpu_load (vcpu); r =kvm_vcpu_ioctl_dirty_tlb (vcpu, &dirty);vcpu_put (vcpu);break ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 95/223 net: sched: fix memory leak in tcindex_partial_destroy_work
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
[ Upstream commit f5051bcece50140abd1a11a2d36dc3ec5484fc32 ]
Syzbot reported memory leak in tcindex_set_parms(). The problem was in non-freed perfect hash in tcindex_partial_destroy_work().
In tcindex_set_parms() new tcindex_data is allocated and some fields from old one are copied to new one, but not the perfect hash. Since tcindex_partial_destroy_work() is the destroy function for old tcindex_data, we need to free perfect hash to avoid memory leak.
--- net/sched/cls_tcindex.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/sched/cls_tcindex.c +4 -1
@@ -278,6 +278,8 @@ static int tcindex_filter_result_init(struct tcindex_filter_result *r, TCA_TCINDEX_POLICE); } +static void tcindex_free_perfect_hash (struct tcindex_data *cp); +static void tcindex_partial_destroy_work (struct work_struct *work) { struct tcindex_data *p = container_of(to_rcu_work(work),
@@ -285,7 +287,8 @@ static void tcindex_partial_destroy_work(struct work_struct *work) rwork);rtnl_lock (); -kfree (p->perfect); +if (p->perfect) +tcindex_free_perfect_hash (p);kfree (p);rtnl_unlock (); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 96/223 sctp: trim optlen when its a huge value in sctp_setsockopt
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit 2f3fdd8d4805015fa964807e1c7f3d88f31bd389 ]
After commit ca84bd058dae ("sctp: copy the optval from user space in sctp_setsockopt"), it does memory allocation in sctp_setsockopt with the optlen, and it would fail the allocation and return error if the optlen from user space is a huge value.
This breaks some sockopts, like SCTP_HMAC_IDENT, SCTP_RESET_STREAMS and SCTP_AUTH_KEY, as when processing these sockopts before, optlen would be trimmed to a biggest value it needs when optlen is a huge value, instead of failing the allocation and returning error.
This patch is to fix the allocation failure when it's a huge optlen from user space by trimming it to the biggest size sctp sockopt may need when necessary, and this biggest size is from sctp_setsockopt_reset_streams() for SCTP_RESET_STREAMS, which is bigger than those for SCTP_HMAC_IDENT and SCTP_AUTH_KEY.
--- net/sctp/socket.c | 4 ++++ 1 file changed, 4 insertions(+)
net/sctp/socket.c +4 -0
@@ -4521,6 +4521,10 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname, }if (optlen >0 ) { +/* Trim it to the biggest size sctp sockopt may need if necessary */ + optlen = min_t(unsigned int, optlen, +PAGE_ALIGN (USHRT_MAX + +sizeof (__u16) *sizeof (struct sctp_reset_streams ))); kopt =memdup_sockptr (optval, optlen);if (IS_ERR (kopt))return PTR_ERR (kopt);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 97/223 netrom: Decrease sock refcount when sock timers expire
In reply to Greg Kroah-HartmanFrom: Nguyen Dinh Phi <[email protected]>
[ Upstream commit 517a16b1a88bdb6b530f48d5d153478b2552d9a8 ]
Commit 63346650c1a9 ("netrom: switch to sock timer API") switched to use sock timer API. It replaces mod_timer() by sk_reset_timer(), and del_timer() by sk_stop_timer().
Function sk_reset_timer() will increase the refcount of sock if it is called on an inactive timer, hence, in case the timer expires, we need to decrease the refcount ourselves in the handler, otherwise, the sock refcount will be unbalanced and the sock will never be freed.
--- net/netrom/nr_timer.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
net/netrom/nr_timer.c +11 -9
@@ -121,11 +121,9 @@ static void nr_heartbeat_expiry(struct timer_list *t)is accepted() it isn't 'dead' so doesn't get removed. */ if (sock_flag (sk,SOCK_DESTROY ) || (sk->sk_state ==TCP_LISTEN &&sock_flag (sk,SOCK_DEAD ))) { -sock_hold (sk);bh_unlock_sock (sk);nr_destroy_socket (sk); -sock_put (sk); -return ; + goto out; }break ;
@@ -146,6 +144,8 @@ static void nr_heartbeat_expiry(struct timer_list *t)nr_start_heartbeat (sk);bh_unlock_sock (sk); +out: +sock_put (sk); }static void nr_t2timer_expiry (struct timer_list *t)
@@ -159,6 +159,7 @@ static void nr_t2timer_expiry(struct timer_list *t)nr_enquiry_response (sk); }bh_unlock_sock (sk); +sock_put (sk); }static void nr_t4timer_expiry (struct timer_list *t)
@@ -169,6 +170,7 @@ static void nr_t4timer_expiry(struct timer_list *t)bh_lock_sock (sk);nr_sk (sk)->condition &= ~NR_COND_PEER_RX_BUSY ;bh_unlock_sock (sk); +sock_put (sk); }static void nr_idletimer_expiry (struct timer_list *t)
@@ -197,6 +199,7 @@ static void nr_idletimer_expiry(struct timer_list *t)sock_set_flag (sk,SOCK_DEAD ); }bh_unlock_sock (sk); +sock_put (sk); }static void nr_t1timer_expiry (struct timer_list *t)
@@ -209,8 +212,7 @@ static void nr_t1timer_expiry(struct timer_list *t)case NR_STATE_1 :if (nr->n2count == nr->n2) {nr_disconnect (sk,ETIMEDOUT ); -bh_unlock_sock (sk); -return ; + goto out; }else { nr->n2count++;nr_write_internal (sk,NR_CONNREQ );
@@ -220,8 +222,7 @@ static void nr_t1timer_expiry(struct timer_list *t)case NR_STATE_2 :if (nr->n2count == nr->n2) {nr_disconnect (sk,ETIMEDOUT ); -bh_unlock_sock (sk); -return ; + goto out; }else { nr->n2count++;nr_write_internal (sk,NR_DISCREQ );
@@ -231,8 +232,7 @@ static void nr_t1timer_expiry(struct timer_list *t)case NR_STATE_3 :if (nr->n2count == nr->n2) {nr_disconnect (sk,ETIMEDOUT ); -bh_unlock_sock (sk); -return ; + goto out; }else { nr->n2count++;nr_requeue_frames (sk);
@@ -241,5 +241,7 @@ static void nr_t1timer_expiry(struct timer_list *t) }nr_start_t1timer (sk); +out:bh_unlock_sock (sk); +sock_put (sk); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 98/223 scsi: iscsi: Fix iface sysfs attr detection
In reply to Greg Kroah-HartmanFrom: Mike Christie <[email protected]>
[ Upstream commit e746f3451ec7f91dcc9fd67a631239c715850a34 ]
A ISCSI_IFACE_PARAM can have the same value as a ISCSI_NET_PARAM so when iscsi_iface_attr_is_visible tries to figure out the type by just checking the value, we can collide and return the wrong type. When we call into the driver we might not match and return that we don't want attr visible in sysfs. The patch fixes this by setting the type when we figure out what the param is.
--- drivers/scsi/scsi_transport_iscsi.c | 90 +++++++++++------------------ 1 file changed, 34 insertions(+), 56 deletions(-)
drivers/scsi/scsi_transport_iscsi.c +34 -56
@@ -439,39 +439,10 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj, struct device *dev = container_of(kobj, struct device, kobj);struct iscsi_iface *iface =iscsi_dev_to_iface (dev);struct iscsi_transport *t = iface->transport; -int param; -int param_type; +int param =-1 ;if (attr == &dev_attr_iface_enabled.attr) param =ISCSI_NET_PARAM_IFACE_ENABLE ; -else if (attr == &dev_attr_iface_vlan_id.attr) - param =ISCSI_NET_PARAM_VLAN_ID ; -else if (attr == &dev_attr_iface_vlan_priority.attr) - param =ISCSI_NET_PARAM_VLAN_PRIORITY ; -else if (attr == &dev_attr_iface_vlan_enabled.attr) - param =ISCSI_NET_PARAM_VLAN_ENABLED ; -else if (attr == &dev_attr_iface_mtu.attr) - param =ISCSI_NET_PARAM_MTU ; -else if (attr == &dev_attr_iface_port.attr) - param =ISCSI_NET_PARAM_PORT ; -else if (attr == &dev_attr_iface_ipaddress_state.attr) - param =ISCSI_NET_PARAM_IPADDR_STATE ; -else if (attr == &dev_attr_iface_delayed_ack_en.attr) - param =ISCSI_NET_PARAM_DELAYED_ACK_EN ; -else if (attr == &dev_attr_iface_tcp_nagle_disable.attr) - param =ISCSI_NET_PARAM_TCP_NAGLE_DISABLE ; -else if (attr == &dev_attr_iface_tcp_wsf_disable.attr) - param =ISCSI_NET_PARAM_TCP_WSF_DISABLE ; -else if (attr == &dev_attr_iface_tcp_wsf.attr) - param =ISCSI_NET_PARAM_TCP_WSF ; -else if (attr == &dev_attr_iface_tcp_timer_scale.attr) - param =ISCSI_NET_PARAM_TCP_TIMER_SCALE ; -else if (attr == &dev_attr_iface_tcp_timestamp_en.attr) - param =ISCSI_NET_PARAM_TCP_TIMESTAMP_EN ; -else if (attr == &dev_attr_iface_cache_id.attr) - param =ISCSI_NET_PARAM_CACHE_ID ; -else if (attr == &dev_attr_iface_redirect_en.attr) - param =ISCSI_NET_PARAM_REDIRECT_EN ;else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr) param =ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO ;else if (attr == &dev_attr_iface_header_digest.attr)
@@ -508,6 +479,38 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj, param =ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN ; else if (attr == &dev_attr_iface_initiator_name.attr) param =ISCSI_IFACE_PARAM_INITIATOR_NAME ; + +if (param !=-1 ) +return t->attr_is_visible (ISCSI_IFACE_PARAM , param); + +if (attr == &dev_attr_iface_vlan_id.attr) + param =ISCSI_NET_PARAM_VLAN_ID ; +else if (attr == &dev_attr_iface_vlan_priority.attr) + param =ISCSI_NET_PARAM_VLAN_PRIORITY ; +else if (attr == &dev_attr_iface_vlan_enabled.attr) + param =ISCSI_NET_PARAM_VLAN_ENABLED ; +else if (attr == &dev_attr_iface_mtu.attr) + param =ISCSI_NET_PARAM_MTU ; +else if (attr == &dev_attr_iface_port.attr) + param =ISCSI_NET_PARAM_PORT ; +else if (attr == &dev_attr_iface_ipaddress_state.attr) + param =ISCSI_NET_PARAM_IPADDR_STATE ; +else if (attr == &dev_attr_iface_delayed_ack_en.attr) + param =ISCSI_NET_PARAM_DELAYED_ACK_EN ; +else if (attr == &dev_attr_iface_tcp_nagle_disable.attr) + param =ISCSI_NET_PARAM_TCP_NAGLE_DISABLE ; +else if (attr == &dev_attr_iface_tcp_wsf_disable.attr) + param =ISCSI_NET_PARAM_TCP_WSF_DISABLE ; +else if (attr == &dev_attr_iface_tcp_wsf.attr) + param =ISCSI_NET_PARAM_TCP_WSF ; +else if (attr == &dev_attr_iface_tcp_timer_scale.attr) + param =ISCSI_NET_PARAM_TCP_TIMER_SCALE ; +else if (attr == &dev_attr_iface_tcp_timestamp_en.attr) + param =ISCSI_NET_PARAM_TCP_TIMESTAMP_EN ; +else if (attr == &dev_attr_iface_cache_id.attr) + param =ISCSI_NET_PARAM_CACHE_ID ; +else if (attr == &dev_attr_iface_redirect_en.attr) + param =ISCSI_NET_PARAM_REDIRECT_EN ;else if (iface->iface_type ==ISCSI_IFACE_TYPE_IPV4 ) {if (attr == &dev_attr_ipv4_iface_ipaddress.attr) param =ISCSI_NET_PARAM_IPV4_ADDR ;
@@ -598,32 +601,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,return 0 ; } -switch (param) { -case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO : -case ISCSI_IFACE_PARAM_HDRDGST_EN : -case ISCSI_IFACE_PARAM_DATADGST_EN : -case ISCSI_IFACE_PARAM_IMM_DATA_EN : -case ISCSI_IFACE_PARAM_INITIAL_R2T_EN : -case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN : -case ISCSI_IFACE_PARAM_PDU_INORDER_EN : -case ISCSI_IFACE_PARAM_ERL : -case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH : -case ISCSI_IFACE_PARAM_FIRST_BURST : -case ISCSI_IFACE_PARAM_MAX_R2T : -case ISCSI_IFACE_PARAM_MAX_BURST : -case ISCSI_IFACE_PARAM_CHAP_AUTH_EN : -case ISCSI_IFACE_PARAM_BIDI_CHAP_EN : -case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL : -case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN : -case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN : -case ISCSI_IFACE_PARAM_INITIATOR_NAME : - param_type =ISCSI_IFACE_PARAM ; -break ; -default : - param_type =ISCSI_NET_PARAM ; - } - -return t->attr_is_visible (param_type, param); +return t->attr_is_visible (ISCSI_NET_PARAM , param); }static struct attribute *iscsi_iface_attrs[] = {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 99/223 scsi: target: Fix protect handling in WRITE SAME(32)
In reply to Greg Kroah-HartmanFrom: Dmitry Bogdanov <[email protected]>
[ Upstream commit 6d8e7e7c932162bccd06872362751b0e1d76f5af ]
WRITE SAME(32) command handling reads WRPROTECT at the wrong offset in 1st byte instead of 10th byte.
--- drivers/target/target_core_sbc.c | 35 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 18 deletions(-)
drivers/target/target_core_sbc.c +17 -18
@@ -25,7 +25,7 @@#include "target_core_alua.h" static sense_reason_t -sbc_check_prot (struct se_device *,struct se_cmd *,unsigned char *,u32 ,bool ); +sbc_check_prot (struct se_device *,struct se_cmd *,unsigned char ,u32 ,bool );static sense_reason_t sbc_execute_unmap (struct se_cmd *cmd); static sense_reason_t
@@ -279,14 +279,14 @@ static inline unsigned long long transport_lba_64_ext(unsigned char *cdb) }static sense_reason_t -sbc_setup_write_same (struct se_cmd *cmd,unsigned char *flags,struct sbc_ops *ops) +sbc_setup_write_same (struct se_cmd *cmd,unsigned char flags,struct sbc_ops *ops) {struct se_device *dev = cmd->se_dev;sector_t end_lba = dev->transport->get_blocks (dev) +1 ;unsigned int sectors =sbc_get_write_same_sectors (cmd);sense_reason_t ret; -if ((flags[0 ] &0x04 ) || (flags[0 ] &0x02 )) { +if ((flags &0x04 ) || (flags &0x02 )) {pr_err ("WRITE_SAME PBDATA and LBDATA" " bits not supported for Block Discard" " Emulation\n" );
@@ -308,7 +308,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o }/* We always have ANC_SUP == 0 so setting ANCHOR is always an error */ -if (flags[0 ] &0x10 ) { +if (flags &0x10 ) {pr_warn ("WRITE SAME with ANCHOR not supported\n" );return TCM_INVALID_CDB_FIELD ; }
@@ -316,7 +316,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o* Special case for WRITE_SAME w/ UNMAP=1 that ends up getting * translated into block discard requests within backend code. */ -if (flags[0 ] &0x08 ) { +if (flags &0x08 ) {if (!ops->execute_unmap)return TCM_UNSUPPORTED_SCSI_OPCODE ;
@@ -331,7 +331,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *oif (!ops->execute_write_same)return TCM_UNSUPPORTED_SCSI_OPCODE ; - ret =sbc_check_prot (dev, cmd, &cmd->t_task_cdb[0 ], sectors, true); + ret =sbc_check_prot (dev, cmd, flags >>5 , sectors, true);if (ret)return ret;
@@ -717,10 +717,9 @@ sbc_set_prot_op_checks(u8 protect, bool fabric_prot, enum target_prot_type prot_ }static sense_reason_t -sbc_check_prot (struct se_device *dev,struct se_cmd *cmd,unsigned char *cdb, +sbc_check_prot (struct se_device *dev,struct se_cmd *cmd,unsigned char protect,u32 sectors,bool is_write) { -u8 protect = cdb[1 ] >>5 ;int sp_ops = cmd->se_sess->sup_prot_ops;int pi_prot_type = dev->dev_attrib.pi_prot_type;bool fabric_prot = false;
@@ -768,7 +767,7 @@ sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb, fallthrough;default :pr_err ("Unable to determine pi_prot_type for CDB: 0x%02x " -"PROTECT: 0x%02x\n" , cdb[0 ], protect); +"PROTECT: 0x%02x\n" , cmd->t_task_cdb[0 ], protect);return TCM_INVALID_CDB_FIELD ; }
@@ -843,7 +842,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, false); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, false);if (ret)return ret;
@@ -857,7 +856,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, false); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, false);if (ret)return ret;
@@ -871,7 +870,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, false); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, false);if (ret)return ret;
@@ -892,7 +891,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, true); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, true);if (ret)return ret;
@@ -906,7 +905,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, true); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, true);if (ret)return ret;
@@ -921,7 +920,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)if (sbc_check_dpofua (dev, cmd, cdb))return TCM_INVALID_CDB_FIELD ; - ret =sbc_check_prot (dev, cmd, cdb, sectors, true); + ret =sbc_check_prot (dev, cmd, cdb[1 ] >>5 , sectors, true);if (ret)return ret;
@@ -980,7 +979,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) size =sbc_get_size (cmd,1 ); cmd->t_task_lba =get_unaligned_be64 (&cdb[12 ]); - ret =sbc_setup_write_same (cmd, &cdb[10 ], ops); + ret =sbc_setup_write_same (cmd, cdb[10 ], ops);if (ret)return ret;break ;
@@ -1079,7 +1078,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) size =sbc_get_size (cmd,1 ); cmd->t_task_lba =get_unaligned_be64 (&cdb[2 ]); - ret =sbc_setup_write_same (cmd, &cdb[1 ], ops); + ret =sbc_setup_write_same (cmd, cdb[1 ], ops);if (ret)return ret;break ;
@@ -1097,7 +1096,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)* Follow sbcr26 with WRITE_SAME (10) and check for the existence * of byte 1 bit 3 UNMAP instead of original reserved field */ - ret =sbc_setup_write_same (cmd, &cdb[1 ], ops); + ret =sbc_setup_write_same (cmd, cdb[1 ], ops);if (ret)return ret;break ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 100/223 spi: cadence: Correct initialisation of runtime PM again
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
[ Upstream commit 56912da7a68c8356df6a6740476237441b0b792a ]
The original implementation of RPM handling in probe() was mostly correct, except it failed to call pm_runtime_get_*() to activate the hardware. The subsequent fix, 734882a8bf98 ("spi: cadence: Correct initialisation of runtime PM"), breaks the implementation further, to the point where the system using this hard IP on ZynqMP hangs on boot, because it accesses hardware which is gated off.
Undo 734882a8bf98 ("spi: cadence: Correct initialisation of runtime PM") and instead add missing pm_runtime_get_noresume() and move the RPM disabling all the way to the end of probe(). That makes ZynqMP not hang on boot yet again.
--- drivers/spi/spi-cadence.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/spi/spi-cadence.c +9 -5
@@ -517,6 +517,12 @@ static int cdns_spi_probe(struct platform_device *pdev) goto clk_dis_apb; } +pm_runtime_use_autosuspend (&pdev->dev); +pm_runtime_set_autosuspend_delay (&pdev->dev,SPI_AUTOSUSPEND_TIMEOUT ); +pm_runtime_get_noresume (&pdev->dev); +pm_runtime_set_active (&pdev->dev); +pm_runtime_enable (&pdev->dev); + ret =of_property_read_u32 (pdev->dev.of_node,"num-cs" , &num_cs);if (ret <0 ) master->num_chipselect =CDNS_SPI_DEFAULT_NUM_CS ;
@@ -531,11 +537,6 @@ static int cdns_spi_probe(struct platform_device *pdev)/* SPI controller initializations */ cdns_spi_init_hw (xspi); -pm_runtime_set_active (&pdev->dev); -pm_runtime_enable (&pdev->dev); -pm_runtime_use_autosuspend (&pdev->dev); -pm_runtime_set_autosuspend_delay (&pdev->dev,SPI_AUTOSUSPEND_TIMEOUT ); - irq =platform_get_irq (pdev,0 );if (irq <=0 ) { ret = -ENXIO ;
@@ -566,6 +567,9 @@ static int cdns_spi_probe(struct platform_device *pdev) master->bits_per_word_mask =SPI_BPW_MASK (8 ); +pm_runtime_mark_last_busy (&pdev->dev); +pm_runtime_put_autosuspend (&pdev->dev); + ret =spi_register_master (master);if (ret) {dev_err (&pdev->dev,"spi_register_master failed\n" );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 101/223 ACPI: Kconfig: Fix table override from built-in initrd
In reply to Greg Kroah-HartmanFrom: Robert Richter <[email protected]>
[ Upstream commit d2cbbf1fe503c07e466c62f83aa1926d74d15821 ]
During a rework of initramfs code the INITRAMFS_COMPRESSION config option was removed in commit 65e00e04e5ae. A leftover as a dependency broke the config option ACPI_TABLE_OVERRIDE_VIA_ BUILTIN_INITRD that is used to enable the overriding of ACPI tables from built-in initrd. Fixing the dependency.
--- drivers/acpi/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/acpi/Kconfig +1 -1
@@ -370,7 +370,7 @@ config ACPI_TABLE_UPGRADE config ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD bool "Override ACPI tables from built-in initrd" depends on ACPI_TABLE_UPGRADE - depends on INITRAMFS_SOURCE!="" && INITRAMFS_COMPRESSION="" + depends on INITRAMFS_SOURCE!="" && INITRAMFS_COMPRESSION_NONE help This option provides functionality to override arbitrary ACPI tables from built-in uncompressed initrd.
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 102/223 efi/dev-path-parser: Switch to use for_each_acpi_dev_match()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit edbd1bc4951eff8da65732dbe0d381e555054428 ]
Switch to use for_each_acpi_dev_match() instead of home grown analogue. No functional change intended.
--- drivers/firmware/efi/dev-path-parser.c | 49 ++++++++++---------------- 1 file changed, 18 insertions(+), 31 deletions(-)
drivers/firmware/efi/dev-path-parser.c +18 -31
@@ -12,52 +12,39 @@#include <linux/efi.h> #include <linux/pci.h> -struct acpi_hid_uid { -struct acpi_device_id hid[2 ]; -char uid[11 ];/* UINT_MAX + null byte */ -}; - -static int __init match_acpi_dev (struct device *dev,const void *data) -{ -struct acpi_hid_uid hid_uid = *(const struct acpi_hid_uid *)data; -struct acpi_device *adev =to_acpi_device (dev); - -if (acpi_match_device_ids (adev, hid_uid.hid)) -return 0 ; - -if (adev->pnp.unique_id) -return !strcmp (adev->pnp.unique_id, hid_uid.uid); -else -return !strcmp ("0" , hid_uid.uid); -} -static long __init parse_acpi_path (const struct efi_dev_path *node,struct device *parent,struct device **child) { -struct acpi_hid_uid hid_uid = {}; +char hid[ACPI_ID_LEN ], uid[11 ];/* UINT_MAX + null byte */ +struct acpi_device *adev;struct device *phys_dev;if (node->header.length !=12 )return -EINVAL ; -sprintf (hid_uid.hid[0 ].id,"%c%c%c%04X" , +sprintf (hid,"%c%c%c%04X" ,'A' + ((node->acpi.hid >>10 ) &0x1f ) -1 ,'A' + ((node->acpi.hid >>5 ) &0x1f ) -1 ,'A' + ((node->acpi.hid >>0 ) &0x1f ) -1 , node->acpi.hid >>16 ); -sprintf (hid_uid.uid,"%u" , node->acpi.uid); - - *child =bus_find_device (&acpi_bus_type,NULL , &hid_uid, - match_acpi_dev); -if (!*child) +sprintf (uid,"%u" , node->acpi.uid); + +for_each_acpi_dev_match (adev, hid,NULL ,-1 ) { +if (adev->pnp.unique_id && !strcmp (adev->pnp.unique_id, uid)) +break ; +if (!adev->pnp.unique_id && node->acpi.uid ==0 ) +break ; +acpi_dev_put (adev); + } +if (!adev)return -ENODEV ; - phys_dev =acpi_get_first_physical_node (to_acpi_device (*child)); + phys_dev =acpi_get_first_physical_node (adev);if (phys_dev) { -get_device (phys_dev); -put_device (*child); - *child = phys_dev; - } + *child =get_device (phys_dev); +acpi_dev_put (adev); + }else + *child = &adev->dev;return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 103/223 ACPI: utils: Fix reference counting in for_each_acpi_dev_match()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 71f6428332844f38c7cb10461d9f29e9c9b983a0 ]
Currently it's possible to iterate over the dangling pointer in case the device suddenly disappears. This may happen becase callers put it at the end of a loop.
Instead, let's move that call inside acpi_dev_get_next_match_dev().
--- drivers/acpi/utils.c | 7 +++---- drivers/firmware/efi/dev-path-parser.c | 1 - drivers/media/pci/intel/ipu3/cio2-bridge.c | 6 ++---- include/acpi/acpi_bus.h | 5 ----- 4 files changed, 5 insertions(+), 14 deletions(-)
drivers/acpi/utils.c +3 -4
@@ -846,11 +846,9 @@ EXPORT_SYMBOL(acpi_dev_present);* Return the next match of ACPI device if another matching device was present * at the moment of invocation, or NULL otherwise. * -* FIXME: The function does not tolerate the sudden disappearance of @adev, e.g. -* in the case of a hotplug event. That said, the caller should ensure that -* this will never happen. -* * The caller is responsible for invoking acpi_dev_put() on the returned device. +* On the other hand the function invokes acpi_dev_put() on the given @adev +* assuming that its reference counter had been increased beforehand. * * See additional information in acpi_dev_present() as well. */
@@ -866,6 +864,7 @@ acpi_dev_get_next_match_dev(struct acpi_device *adev, const char *hid, const cha match.hrv = hrv; dev =bus_find_device (&acpi_bus_type, start, &match, acpi_dev_match_cb); +acpi_dev_put (adev);return dev ?to_acpi_device (dev) :NULL ; }EXPORT_SYMBOL (acpi_dev_get_next_match_dev);
drivers/firmware/efi/dev-path-parser.c +0 -1
@@ -34,7 +34,6 @@ static long __init parse_acpi_path(const struct efi_dev_path *node,break ;if (!adev->pnp.unique_id && node->acpi.uid ==0 )break ; -acpi_dev_put (adev); }if (!adev)return -ENODEV ;
drivers/media/pci/intel/ipu3/cio2-bridge.c +2 -4
@@ -173,10 +173,8 @@ static int cio2_bridge_connect_sensor(const struct cio2_sensor_config *cfg,int ret;for_each_acpi_dev_match (adev, cfg->hid,NULL ,-1 ) { -if (!adev->status.enabled) { -acpi_dev_put (adev); +if (!adev->status.enabled)continue ; - }if (bridge->n_sensors >=CIO2_NUM_PORTS ) {acpi_dev_put (adev);
@@ -185,7 +183,6 @@ static int cio2_bridge_connect_sensor(const struct cio2_sensor_config *cfg, } sensor = &bridge->sensors[bridge->n_sensors]; - sensor->adev = adev;strscpy (sensor->name, cfg->hid,sizeof (sensor->name)); ret = cio2_bridge_read_acpi_buffer(adev, "SSDB",
@@ -215,6 +212,7 @@ static int cio2_bridge_connect_sensor(const struct cio2_sensor_config *cfg, goto err_free_swnodes; } + sensor->adev =acpi_dev_get (adev); adev->fwnode.secondary = fwnode; dev_info(&cio2->dev, "Found supported sensor %s\n",
include/acpi/acpi_bus.h +0 -5
@@ -698,11 +698,6 @@ acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv);* @hrv: Hardware Revision of the device, pass -1 to not check _HRV * * The caller is responsible for invoking acpi_dev_put() on the returned device. -* -* FIXME: Due to above requirement there is a window that may invalidate @adev -* and next iteration will use a dangling pointer, e.g. in the case of a -* hotplug event. That said, the caller should ensure that this will never -* happen. */ #define for_each_acpi_dev_match (adev, hid, uid, hrv) \ for (adev = acpi_dev_get_first_match_dev(hid, uid, hrv); \
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 104/223 bnxt_en: dont disable an already disabled PCI device
In reply to Greg Kroah-HartmanFrom: Kalesh AP <[email protected]>
[ Upstream commit c81cfb6256d90ea5ba4a6fb280ea3b171be4e05c ]
If device is already disabled in reset path and PCI io error is detected before the device could be enabled, driver could call pci_disable_device() for already disabled device. Fix this problem by calling pci_disable_device() only if the device is already enabled.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +2 -1
@@ -13315,7 +13315,8 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,if (netif_running (netdev))bnxt_close (netdev); -pci_disable_device (pdev); +if (pci_is_enabled (pdev)) +pci_disable_device (pdev);bnxt_free_ctx_mem (bp);kfree (bp->ctx); bp->ctx =NULL ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 105/223 bnxt_en: Refresh RoCE capabilities in bnxt_ulp_probe()
In reply to Greg Kroah-HartmanFrom: Michael Chan <[email protected]>
[ Upstream commit 2c9f046bc377efd1f5e26e74817d5f96e9506c86 ]
The capabilities can change after firmware upgrade/downgrade, so we should get the up-to-date RoCE capabilities everytime bnxt_ulp_probe() is called.
--- drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +5 -4
@@ -479,16 +479,17 @@ struct bnxt_en_dev *bnxt_ulp_probe(struct net_device *dev)if (!edev)return ERR_PTR (-ENOMEM ); edev->en_ops = &bnxt_en_ops_tbl; -if (bp->flags &BNXT_FLAG_ROCEV1_CAP ) - edev->flags |=BNXT_EN_FLAG_ROCEV1_CAP ; -if (bp->flags &BNXT_FLAG_ROCEV2_CAP ) - edev->flags |=BNXT_EN_FLAG_ROCEV2_CAP ; edev->net = dev; edev->pdev = bp->pdev; edev->l2_db_size = bp->db_size; edev->l2_db_size_nc = bp->db_size; bp->edev = edev; } + edev->flags &= ~BNXT_EN_FLAG_ROCE_CAP ; +if (bp->flags &BNXT_FLAG_ROCEV1_CAP ) + edev->flags |=BNXT_EN_FLAG_ROCEV1_CAP ; +if (bp->flags &BNXT_FLAG_ROCEV2_CAP ) + edev->flags |=BNXT_EN_FLAG_ROCEV2_CAP ;return bp->edev; }EXPORT_SYMBOL (bnxt_ulp_probe);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 106/223 bnxt_en: Add missing check for BNXT_STATE_ABORT_ERR in bnxt_fw_rset_task()
In reply to Greg Kroah-HartmanFrom: Michael Chan <[email protected]>
[ Upstream commit 6cd657cb3ee6f4de57e635b126ffbe0e51d00f1a ]
In the BNXT_FW_RESET_STATE_POLL_VF state in bnxt_fw_reset_task() after all VFs have unregistered, we need to check for BNXT_STATE_ABORT_ERR after we acquire the rtnl_lock. If the flag is set, we need to abort.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +4 -0
@@ -11882,6 +11882,10 @@ static void bnxt_fw_reset_task(struct work_struct *work) } bp->fw_reset_timestamp = jiffies;rtnl_lock (); +if (test_bit (BNXT_STATE_ABORT_ERR , &bp->state)) { +rtnl_unlock (); + goto fw_reset_abort; + }bnxt_fw_reset_close (bp);if (bp->fw_cap &BNXT_FW_CAP_ERR_RECOVER_RELOAD ) { bp->fw_reset_state =BNXT_FW_RESET_STATE_POLL_FW_DOWN ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 107/223 bnxt_en: fix error path of FW reset
In reply to Greg Kroah-HartmanFrom: Somnath Kotur <[email protected]>
[ Upstream commit 3958b1da725a477b4a222183d16a14d85445d4b6 ]
When bnxt_open() fails in the firmware reset path, the driver needs to gracefully abort, but it is executing code that should be invoked only in the success path. Define a function to abort FW reset and consolidate all error paths to call this new function.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 31 +++++++++++++++-------- 1 file changed, 21 insertions(+), 10 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +21 -10
@@ -11849,10 +11849,21 @@ static bool bnxt_fw_reset_timeout(struct bnxt *bp) (bp->fw_reset_max_dsecs * HZ / 10)); } +static void bnxt_fw_reset_abort (struct bnxt *bp,int rc) +{ +clear_bit (BNXT_STATE_IN_FW_RESET , &bp->state); +if (bp->fw_reset_state !=BNXT_FW_RESET_STATE_POLL_VF ) { +bnxt_ulp_start (bp, rc); +bnxt_dl_health_status_update (bp, false); + } + bp->fw_reset_state =0 ; +dev_close (bp->dev); +} +static void bnxt_fw_reset_task (struct work_struct *work) { struct bnxt *bp = container_of(work, struct bnxt, fw_reset_task.work); -int rc; +int rc =0 ;if (!test_bit (BNXT_STATE_IN_FW_RESET , &bp->state)) {netdev_err (bp->dev,"bnxt_fw_reset_task() called when not in fw reset mode!\n" );
@@ -11883,8 +11894,9 @@ static void bnxt_fw_reset_task(struct work_struct *work) bp->fw_reset_timestamp = jiffies;rtnl_lock ();if (test_bit (BNXT_STATE_ABORT_ERR , &bp->state)) { +bnxt_fw_reset_abort (bp, rc);rtnl_unlock (); - goto fw_reset_abort; +return ; }bnxt_fw_reset_close (bp);if (bp->fw_cap &BNXT_FW_CAP_ERR_RECOVER_RELOAD ) {
@@ -11933,6 +11945,7 @@ static void bnxt_fw_reset_task(struct work_struct *work)if (val ==0xffff ) {if (bnxt_fw_reset_timeout (bp)) {netdev_err (bp->dev,"Firmware reset aborted, PCI config space invalid\n" ); + rc = -ETIMEDOUT ; goto fw_reset_abort; }bnxt_queue_fw_reset_work (bp,HZ /1000 );
@@ -11942,6 +11955,7 @@ static void bnxt_fw_reset_task(struct work_struct *work)clear_bit (BNXT_STATE_FW_FATAL_COND , &bp->state);if (pci_enable_device (bp->pdev)) {netdev_err (bp->dev,"Cannot re-enable PCI device\n" ); + rc = -ENODEV ; goto fw_reset_abort; }pci_set_master (bp->pdev);
@@ -11968,9 +11982,10 @@ static void bnxt_fw_reset_task(struct work_struct *work) } rc =bnxt_open (bp->dev);if (rc) { -netdev_err (bp->dev,"bnxt_open_nic() failed\n" ); -clear_bit (BNXT_STATE_IN_FW_RESET , &bp->state); -dev_close (bp->dev); +netdev_err (bp->dev,"bnxt_open() failed during FW reset\n" ); +bnxt_fw_reset_abort (bp, rc); +rtnl_unlock (); +return ; } bp->fw_reset_state =0 ;
@@ -11997,12 +12012,8 @@ fw_reset_abort_status:netdev_err (bp->dev,"fw_health_status 0x%x\n" , sts); } fw_reset_abort: -clear_bit (BNXT_STATE_IN_FW_RESET , &bp->state); -if (bp->fw_reset_state !=BNXT_FW_RESET_STATE_POLL_VF ) -bnxt_dl_health_status_update (bp, false); - bp->fw_reset_state =0 ;rtnl_lock (); -dev_close (bp->dev); +bnxt_fw_reset_abort (bp, rc);rtnl_unlock (); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 108/223 bnxt_en: Validate vlan protocol ID on RX packets
In reply to Greg Kroah-HartmanFrom: Michael Chan <[email protected]>
[ Upstream commit 96bdd4b9ea7ef9a12db8fdd0ce90e37dffbd3703 ]
Only pass supported VLAN protocol IDs for stripped VLAN tags to the stack. The stack will hit WARN() if the protocol ID is unsupported.
Existing firmware sets up the chip to strip 0x8100, 0x88a8, 0x9100. Only the 1st two protocols are supported by the kernel.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +16 -5
@@ -1640,11 +1640,16 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp,if ((tpa_info->flags2 &RX_CMP_FLAGS2_META_FORMAT_VLAN ) && (skb->dev->features &BNXT_HW_FEATURE_VLAN_ALL_RX )) { -u16 vlan_proto = tpa_info->metadata >> -RX_CMP_FLAGS2_METADATA_TPID_SFT ; +__be16 vlan_proto =htons (tpa_info->metadata >> +RX_CMP_FLAGS2_METADATA_TPID_SFT );u16 vtag = tpa_info->metadata &RX_CMP_FLAGS2_METADATA_TCI_MASK ; -__vlan_hwaccel_put_tag (skb,htons (vlan_proto), vtag); +if (eth_type_vlan (vlan_proto)) { +__vlan_hwaccel_put_tag (skb, vlan_proto, vtag); + }else { +dev_kfree_skb (skb); +return NULL ; + } }skb_checksum_none_assert (skb);
@@ -1865,9 +1870,15 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, (skb->dev->features & BNXT_HW_FEATURE_VLAN_ALL_RX)) {u32 meta_data =le32_to_cpu (rxcmp1->rx_cmp_meta_data);u16 vtag = meta_data &RX_CMP_FLAGS2_METADATA_TCI_MASK ; -u16 vlan_proto = meta_data >>RX_CMP_FLAGS2_METADATA_TPID_SFT ; +__be16 vlan_proto =htons (meta_data >> +RX_CMP_FLAGS2_METADATA_TPID_SFT ); -__vlan_hwaccel_put_tag (skb,htons (vlan_proto), vtag); +if (eth_type_vlan (vlan_proto)) { +__vlan_hwaccel_put_tag (skb, vlan_proto, vtag); + }else { +dev_kfree_skb (skb); + goto next_rx; + } }skb_checksum_none_assert (skb);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 109/223 bnxt_en: Check abort error state in bnxt_half_open_nic()
In reply to Greg Kroah-HartmanFrom: Somnath Kotur <[email protected]>
[ Upstream commit 11a39259ff79b74bc99f8b7c44075a2d6d5e7ab1 ]
bnxt_half_open_nic() is called during during ethtool self test and is protected by rtnl_lock. Firmware reset can be happening at the same time. Only critical portions of the entire firmware reset sequence are protected by the rtnl_lock. It is possible that bnxt_half_open_nic() can be called when the firmware reset sequence is aborting. In that case, bnxt_half_open_nic() needs to check if the ABORT_ERR flag is set and abort if it is. The ethtool self test will fail but the NIC will be brought to a consistent IF_DOWN state.
Without this patch, if bnxt_half_open_nic() were to continue in this error state, it may crash like this:
bnxt_en 0000:82:00.1 enp130s0f1np1: FW reset in progress during close, FW reset will be aborted
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 ... Process ethtool (pid: 333327, stack limit = 0x0000000046476577) Call trace: bnxt_alloc_mem+0x444/0xef0 [bnxt_en] bnxt_half_open_nic+0x24/0xb8 [bnxt_en] bnxt_self_test+0x2dc/0x390 [bnxt_en] ethtool_self_test+0xe0/0x1f8 dev_ethtool+0x1744/0x22d0 dev_ioctl+0x190/0x3e0 sock_ioctl+0x238/0x480 do_vfs_ioctl+0xc4/0x758 ksys_ioctl+0x84/0xb8 __arm64_sys_ioctl+0x28/0x38 el0_svc_handler+0xb0/0x180 el0_svc+0x8/0xc
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +6 -0
@@ -10104,6 +10104,12 @@ int bnxt_half_open_nic(struct bnxt *bp) {int rc =0 ; +if (test_bit (BNXT_STATE_ABORT_ERR , &bp->state)) { +netdev_err (bp->dev,"A previous firmware reset has not completed, aborting half open\n" ); + rc = -ENODEV ; + goto half_open_err; + } + rc =bnxt_alloc_mem (bp, false);if (rc) {netdev_err (bp->dev,"bnxt_alloc_mem err: %x\n" , rc);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 110/223 net: hisilicon: rename CACHE_LINE_MASK to avoid redefinition
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit b16f3299ae1aa3c327e1fb742d0379ae4d6e86f2 ]
Building on ARCH=arc causes a "redefined" warning, so rename this driver's CACHE_LINE_MASK to avoid the warning.
../drivers/net/ethernet/hisilicon/hip04_eth.c:134: warning: "CACHE_LINE_MASK" redefined
134 | #define CACHE_LINE_MASK 0x3F
In file included from ../include/linux/cache.h:6,
from ../include/linux/printk.h:9,
from ../include/linux/kernel.h:19,
from ../include/linux/list.h:9,
from ../include/linux/module.h:12,
from ../drivers/net/ethernet/hisilicon/hip04_eth.c:7:../arch/arc/include/asm/cache.h:17: note: this is the location of the previous definition
17 | #define CACHE_LINE_MASK (~(L1_CACHE_BYTES - 1))
--- drivers/net/ethernet/hisilicon/hip04_eth.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/hisilicon/hip04_eth.c +3 -3
@@ -131,7 +131,7 @@/* buf unit size is cache_line_size, which is 64, so the shift is 6 */ #define PPE_BUF_SIZE_SHIFT 6#define PPE_TX_BUF_HOLD BIT(31) -#define CACHE_LINE_MASK 0x3F +#define SOC_CACHE_LINE_MASK 0x3F#else #define PPE_CFG_QOS_VMID_GRP_SHIFT 8#define PPE_CFG_RX_CTRL_ALIGN_SHIFT 11
@@ -531,8 +531,8 @@ hip04_mac_start_xmit(struct sk_buff *skb, struct net_device *ndev)#if defined(CONFIG_HI13X1_GMAC ) desc->cfg = (__force u32 )cpu_to_be32 (TX_CLEAR_WB |TX_FINISH_CACHE_INV |TX_RELEASE_TO_PPE | priv->port <<TX_POOL_SHIFT ); - desc->data_offset = (__force u32 )cpu_to_be32 (phys &CACHE_LINE_MASK ); - desc->send_addr = (__force u32 )cpu_to_be32 (phys & ~CACHE_LINE_MASK ); + desc->data_offset = (__force u32 )cpu_to_be32 (phys &SOC_CACHE_LINE_MASK ); + desc->send_addr = (__force u32 )cpu_to_be32 (phys & ~SOC_CACHE_LINE_MASK );#else desc->cfg = (__force u32 )cpu_to_be32 (TX_CLEAR_WB |TX_FINISH_CACHE_INV ); desc->send_addr = (__force u32 )cpu_to_be32 (phys);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 111/223 net/tcp_fastopen: fix data races around tfo_active_disable_stamp
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 6f20c8adb1813467ea52c1296d52c4e95978cb2f ]
tfo_active_disable_stamp is read and written locklessly. We need to annotate these accesses appropriately.
Then, we need to perform the atomic_inc(tfo_active_disable_times) after the timestamp has been updated, and thus add barriers to make sure tcp_fastopen_active_should_disable() wont read a stale timestamp.
--- net/ipv4/tcp_fastopen.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
net/ipv4/tcp_fastopen.c +16 -3
@@ -507,8 +507,15 @@ void tcp_fastopen_active_disable(struct sock *sk) {struct net *net =sock_net (sk); +/* Paired with READ_ONCE() in tcp_fastopen_active_should_disable() */ +WRITE_ONCE (net->ipv4.tfo_active_disable_stamp, jiffies); + +/* Paired with smp_rmb() in tcp_fastopen_active_should_disable(). +* We want net->ipv4.tfo_active_disable_stamp to be updated first. +*/ +smp_mb__before_atomic ();atomic_inc (&net->ipv4.tfo_active_disable_times); - net->ipv4.tfo_active_disable_stamp = jiffies; +NET_INC_STATS (net,LINUX_MIB_TCPFASTOPENBLACKHOLE ); }
@@ -526,10 +533,16 @@ bool tcp_fastopen_active_should_disable(struct sock *sk)if (!tfo_da_times)return false; +/* Paired with smp_mb__before_atomic() in tcp_fastopen_active_disable() */ +smp_rmb (); +/* Limit timout to max: 2^6 * initial timeout */ multiplier =1 <<min (tfo_da_times -1 ,6 ); - timeout = multiplier * tfo_bh_timeout *HZ ; -if (time_before (jiffies,sock_net (sk)->ipv4.tfo_active_disable_stamp + timeout)) + +/* Paired with the WRITE_ONCE() in tcp_fastopen_active_disable(). */ + timeout =READ_ONCE (sock_net (sk)->ipv4.tfo_active_disable_stamp) + + multiplier * tfo_bh_timeout *HZ ; +if (time_before (jiffies, timeout))return true;/* Mark check bit so we can check for successful active TFO
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 112/223 ALSA: hda: intel-dsp-cfg: add missing ElkhartLake PCI ID
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 114613f62f42e7cbc1242c4e82076a0153043761 ]
We missed the fact that ElkhartLake platforms have two different PCI IDs. We only added one so the SOF driver is never selected by the autodetection logic for the missing configuration.
--- sound/hda/intel-dsp-config.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/hda/intel-dsp-config.c +4 -0
@@ -319,6 +319,10 @@ static const struct config_entry config_table[] = { .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, .device = 0x4b55, }, + { + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, + .device = 0x4b58, + },#endif /* Alder Lake */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 113/223 net: hns3: fix possible mismatches resp of mailbox
In reply to Greg Kroah-HartmanFrom: Chengwen Feng <[email protected]>
[ Upstream commit 1b713d14dc3c077ec45e65dab4ea01a8bc41b8c1 ]
Currently, the mailbox synchronous communication between VF and PF use the following fields to maintain communication:
1. Origin_mbx_msg which was combined by message code and subcode, used to match request and response.
2. Received_resp which means whether received response.
There may possible mismatches of the following situation:
1. VF sends message A with code=1 subcode=1.
2. PF was blocked about 500ms when processing the message A.
3. VF will detect message A timeout because it can't get the response within 500ms.
4. VF sends message B with code=1 subcode=1 which equal message A.
5. PF processes the first message A and send the response message to VF.
6. VF will identify the response matched the message B because the code/subcode is the same. This will lead to mismatch of request and response.
To fix the above bug, we use the following scheme:
1. The message sent from VF was labelled with match_id which was a unique 16-bit non-zero value.
2. The response sent from PF will label with match_id which got from the request.
3. The VF uses the match_id to match request and response message.
As for PF driver, it only needs to copy the match_id from request to response.
--- drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h | 6 ++++-- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 1 + 2 files changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hclge_mbx.h +4 -2
@@ -135,7 +135,8 @@ struct hclge_mbx_vf_to_pf_cmd {u8 mbx_need_resp;u8 rsv1[1 ];u8 msg_len; -u8 rsv2[3 ]; +u8 rsv2; +u16 match_id;struct hclge_vf_to_pf_msg msg; };
@@ -145,7 +146,8 @@ struct hclge_mbx_pf_to_vf_cmd {u8 dest_vfid;u8 rsv[3 ];u8 msg_len; -u8 rsv1[3 ]; +u8 rsv1; +u16 match_id;struct hclge_pf_to_vf_msg msg; };
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +1 -0
@@ -47,6 +47,7 @@ static int hclge_gen_resp_to_vf(struct hclge_vport *vport, resp_pf_to_vf->dest_vfid = vf_to_pf_req->mbx_src_vfid; resp_pf_to_vf->msg_len = vf_to_pf_req->msg_len; + resp_pf_to_vf->match_id = vf_to_pf_req->match_id; resp_pf_to_vf->msg.code =HCLGE_MBX_PF_VF_RESP ; resp_pf_to_vf->msg.vf_mbx_msg_code = vf_to_pf_req->msg.code;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 114/223 net: hns3: fix rx VLAN offload state inconsistent issue
In reply to Greg Kroah-HartmanFrom: Jian Shen <[email protected]>
[ Upstream commit bbfd4506f962e7e6fff8f37f017154a3c3791264 ]
Currently, VF doesn't enable rx VLAN offload when initializating, and PF does it for VFs. If user disable the rx VLAN offload for VF with ethtool -K, and reload the VF driver, it may cause the rx VLAN offload state being inconsistent between hardware and software.
Fixes it by enabling rx VLAN offload when VF initializing.
--- .../net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +10 -0
@@ -2621,6 +2621,16 @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)static int hclgevf_init_vlan_config (struct hclgevf_dev *hdev) { +struct hnae3_handle *nic = &hdev->nic; +int ret; + + ret =hclgevf_en_hw_strip_rxvtag (nic, true); +if (ret) { +dev_err (&hdev->pdev->dev, +"failed to enable rx vlan offload, ret = %d\n" , ret); +return ret; + } +return hclgevf_set_vlan_filter (&hdev->nic,htons (ETH_P_8021Q ),0 , false); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 115/223 spi: spi-bcm2835: Fix deadlock
In reply to Greg Kroah-HartmanFrom: Alexandru Tachici <[email protected]>
[ Upstream commit c45c1e82bba130db4f19d9dbc1deefcf4ea994ed ]
The bcm2835_spi_transfer_one function can create a deadlock if it is called while another thread already has the CCF lock.
--- drivers/spi/spi-bcm2835.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/spi/spi-bcm2835.c +7 -5
@@ -84,6 +84,7 @@ MODULE_PARM_DESC(polling_limit_us,* struct bcm2835_spi - BCM2835 SPI controller * @regs: base address of register map * @clk: core clock, divided to calculate serial clock +* @clk_hz: core clock cached speed * @irq: interrupt, signals TX FIFO empty or RX FIFO ¾ full * @tfr: SPI transfer currently processed * @ctlr: SPI controller reverse lookup
@@ -124,6 +125,7 @@ MODULE_PARM_DESC(polling_limit_us,struct bcm2835_spi {void __iomem *regs;struct clk *clk; +unsigned long clk_hz;int irq;struct spi_transfer *tfr;struct spi_controller *ctlr;
@@ -1082,19 +1084,18 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, struct spi_transfer *tfr) {struct bcm2835_spi *bs =spi_controller_get_devdata (ctlr); -unsigned long spi_hz, clk_hz, cdiv; +unsigned long spi_hz, cdiv;unsigned long hz_per_byte, byte_limit;u32 cs = bs->prepare_cs[spi->chip_select];/* set clock */ spi_hz = tfr->speed_hz; - clk_hz =clk_get_rate (bs->clk); -if (spi_hz >= clk_hz /2 ) { +if (spi_hz >= bs->clk_hz /2 ) { cdiv =2 ;/* clk_hz/2 is the fastest we can go */ }else if (spi_hz) {/* CDIV must be a multiple of two */ - cdiv =DIV_ROUND_UP (clk_hz, spi_hz); + cdiv =DIV_ROUND_UP (bs->clk_hz, spi_hz); cdiv += (cdiv %2 );if (cdiv >=65536 )
@@ -1102,7 +1103,7 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, }else { cdiv =0 ;/* 0 is the slowest we can go */ } - tfr->effective_speed_hz = cdiv ? (clk_hz / cdiv) : (clk_hz /65536 ); + tfr->effective_speed_hz = cdiv ? (bs->clk_hz / cdiv) : (bs->clk_hz /65536 );bcm2835_wr (bs,BCM2835_SPI_CLK , cdiv);/* handle all the 3-wire mode */
@@ -1320,6 +1321,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev)return bs->irq ? bs->irq : -ENODEV ;clk_prepare_enable (bs->clk); + bs->clk_hz =clk_get_rate (bs->clk); err =bcm2835_dma_init (ctlr, &pdev->dev, bs);if (err)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 116/223 io_uring: fix memleak in io_init_wq_offload()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 362a9e65289284f36403058eea2462d0330c1f24 ]
I got memory leak report when doing fuzz test:
BUG: memory leak
unreferenced object 0xffff888107310a80 (size 96):
comm "syz-executor.6", pid 4610, jiffies 4295140240 (age 20.135s) hex dump (first 32 bytes):
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00 .....N.......... backtrace:
[<000000001974933b>] kmalloc include/linux/slab.h:591 [inline] [<000000001974933b>] kzalloc include/linux/slab.h:721 [inline] [<000000001974933b>] io_init_wq_offload fs/io_uring.c:7920 [inline] [<000000001974933b>] io_uring_alloc_task_context+0x466/0x640 fs/io_uring.c:7955 [<0000000039d0800d>] __io_uring_add_tctx_node+0x256/0x360 fs/io_uring.c:9016 [<000000008482e78c>] io_uring_add_tctx_node fs/io_uring.c:9052 [inline] [<000000008482e78c>] __do_sys_io_uring_enter fs/io_uring.c:9354 [inline] [<000000008482e78c>] __se_sys_io_uring_enter fs/io_uring.c:9301 [inline] [<000000008482e78c>] __x64_sys_io_uring_enter+0xabc/0xc20 fs/io_uring.c:9301 [<00000000b875f18f>] do_syscall_x64 arch/x86/entry/common.c:50 [inline] [<00000000b875f18f>] do_syscall_64+0x3b/0x90 arch/x86/entry/common.c:80 [<000000006b0a8484>] entry_SYSCALL_64_after_hwframe+0x44/0xae
CPU0 CPU1 io_uring_enter io_uring_enter io_uring_add_tctx_node io_uring_add_tctx_node __io_uring_add_tctx_node __io_uring_add_tctx_node io_uring_alloc_task_context io_uring_alloc_task_context io_init_wq_offload io_init_wq_offload hash = kzalloc hash = kzalloc ctx->hash_map = hash ctx->hash_map = hash <- one of the hash is leaked
When calling io_uring_enter() in parallel, the 'hash_map' will be leaked, add uring_lock to protect 'hash_map'.
--- fs/io_uring.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/io_uring.c +5 -1
@@ -7859,15 +7859,19 @@ static struct io_wq *io_init_wq_offload(struct io_ring_ctx *ctx,struct io_wq_data data;unsigned int concurrency; +mutex_lock (&ctx->uring_lock); hash = ctx->hash_map;if (!hash) { hash =kzalloc (sizeof (*hash),GFP_KERNEL ); -if (!hash) +if (!hash) { +mutex_unlock (&ctx->uring_lock);return ERR_PTR (-ENOMEM ); + }refcount_set (&hash->refs,1 );init_waitqueue_head (&hash->wait); ctx->hash_map = hash; } +mutex_unlock (&ctx->uring_lock); data.hash = hash; data.task = task;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 117/223 net/sched: act_skbmod: Skip non-Ethernet packets
In reply to Greg Kroah-HartmanFrom: Peilin Ye <[email protected]>
[ Upstream commit 727d6a8b7ef3d25080fad228b2c4a1d4da5999c6 ]
Currently tcf_skbmod_act() assumes that packets use Ethernet as their L2 protocol, which is not always the case. As an example, for CAN devices:
$ ip link add dev vcan0 type vcan $ ip link set up vcan0 $ tc qdisc add dev vcan0 root handle 1: htb $ tc filter add dev vcan0 parent 1: protocol ip prio 10 \ matchall action skbmod swap mac
Doing the above silently corrupts all the packets. Do not perform skbmod actions for non-Ethernet packets.
--- net/sched/act_skbmod.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
net/sched/act_skbmod.c +8 -4
@@ -6,6 +6,7 @@*/ #include <linux/module.h> +#include <linux/if_arp.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/skbuff.h>
@@ -33,6 +34,13 @@ static int tcf_skbmod_act(struct sk_buff *skb, const struct tc_action *a,tcf_lastuse_update (&d->tcf_tm);bstats_cpu_update (this_cpu_ptr (d->common.cpu_bstats), skb); + action =READ_ONCE (d->tcf_action); +if (unlikely (action ==TC_ACT_SHOT )) + goto drop; + +if (!skb->dev || skb->dev->type !=ARPHRD_ETHER ) +return action; +/* XXX: if you are going to edit more fields beyond ethernet header * (example when you add IP header replacement or vlan swap) * then MAX_EDIT_LEN needs to change appropriately
@@ -41,10 +49,6 @@ static int tcf_skbmod_act(struct sk_buff *skb, const struct tc_action *a,if (unlikely (err))/* best policy is to drop on the floor */ goto drop; - action =READ_ONCE (d->tcf_action); -if (unlikely (action ==TC_ACT_SHOT )) - goto drop; - p =rcu_dereference_bh (d->skbmod_p); flags = p->flags;if (flags &SKBMOD_F_DMAC )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 118/223 ipv6: fix another slab-out-of-bounds in fib6_nh_flush_exceptions
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 8fb4792f091e608a0a1d353dfdf07ef55a719db5 ]
While running the self-tests on a KASAN enabled kernel, I observed a slab-out-of-bounds splat very similar to the one reported in commit 821bbf79fe46 ("ipv6: Fix KASAN: slab-out-of-bounds Read in
fib6_nh_flush_exceptions").
We additionally need to take care of fib6_metrics initialization failure when the caller provides an nh.
The fix is similar, explicitly free the route instead of calling fib6_info_release on a half-initialized object.
--- net/ipv6/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/route.c +1 -1
@@ -3642,7 +3642,7 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, err =PTR_ERR (rt->fib6_metrics);/* Do not leave garbage there. */ rt->fib6_metrics = (struct dst_metrics *)&dst_default_metrics; - goto out; + goto out_free; }if (cfg->fc_flags &RTF_ADDRCONF )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 119/223 ceph: dont WARN if were still opening a session to an MDS
In reply to Greg Kroah-HartmanFrom: Luis Henriques <[email protected]>
[ Upstream commit cdb330f4b41ab55feb35487729e883c9e08b8a54 ]
If MDSs aren't available while mounting a filesystem, the session state will transition from SESSION_OPENING to SESSION_CLOSING. And in that scenario check_session_state() will be called from delayed_work() and trigger this WARN.
Avoid this by only WARNing after a session has already been established (i.e., the s_ttl will be different from 0).
--- fs/ceph/mds_client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ceph/mds_client.c +1 -1
@@ -4468,7 +4468,7 @@ bool check_session_state(struct ceph_mds_session *s)break ;case CEPH_MDS_SESSION_CLOSING :/* Should never reach this when we're unmounting */ -WARN_ON_ONCE (true); +WARN_ON_ONCE (s->s_ttl); fallthrough;case CEPH_MDS_SESSION_NEW :case CEPH_MDS_SESSION_RESTARTING :
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 120/223 i2c: mpc: Poll for MCF
In reply to Greg Kroah-HartmanFrom: Chris Packham <[email protected]>
[ Upstream commit 4a8ac5e45cdaa88884b4ce05303e304cbabeb367 ]
During some transfers the bus can still be busy when an interrupt is received. Commit 763778cd7926 ("i2c: mpc: Restore reread of I2C status register") attempted to address this by re-reading MPC_I2C_SR once but that just made it less likely to happen without actually preventing it. Instead of a single re-read, poll with a timeout so that the bus is given enough time to settle but a genuine stuck SCL is still noticed.
--- drivers/i2c/busses/i2c-mpc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-mpc.c +2 -2
@@ -635,8 +635,8 @@ static irqreturn_t mpc_i2c_isr(int irq, void *dev_id) status =readb (i2c->base +MPC_I2C_SR );if (status &CSR_MIF ) { -/* Read again to allow register to stabilise */ - status =readb (i2c->base +MPC_I2C_SR ); +/* Wait up to 100us for transfer to properly complete */ +readb_poll_timeout (i2c->base +MPC_I2C_SR , status, !(status &CSR_MCF ),0 ,100 );writeb (0 , i2c->base +MPC_I2C_SR );mpc_i2c_do_intr (i2c, status);return IRQ_HANDLED ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 121/223 scsi: target: Fix NULL dereference on XCOPY completion
In reply to Greg Kroah-HartmanFrom: David Disseldorp <[email protected]>
[ Upstream commit a47fa41381a09e5997afd762664db4f5f6657e03 ]
CPU affinity control added with commit 39ae3edda325 ("scsi: target: core:
Make completion affinity configurable") makes target_complete_cmd() queue work on a CPU based on se_tpg->se_tpg_wwn->cmd_compl_affinity state.
LIO's EXTENDED COPY worker is a special case in that read/write cmds are dispatched using the global xcopy_pt_tpg, which carries a NULL se_tpg_wwn pointer following initialization in target_xcopy_setup_pt().
The NULL xcopy_pt_tpg->se_tpg_wwn pointer is dereferenced on completion of any EXTENDED COPY initiated read/write cmds. E.g using the libiscsi SCSI.ExtendedCopy.Simple test:
BUG: kernel NULL pointer dereference, address: 00000000000001a8 RIP: 0010:target_complete_cmd+0x9d/0x130 [target_core_mod] Call Trace: fd_execute_rw+0x148/0x42a [target_core_file] ? __dynamic_pr_debug+0xa7/0xe0 ? target_check_reservation+0x5b/0x940 [target_core_mod] __target_execute_cmd+0x1e/0x90 [target_core_mod] transport_generic_new_cmd+0x17c/0x330 [target_core_mod] target_xcopy_issue_pt_cmd+0x9/0x60 [target_core_mod] target_xcopy_read_source.isra.7+0x10b/0x1b0 [target_core_mod] ? target_check_fua+0x40/0x40 [target_core_mod] ? transport_complete_task_attr+0x130/0x130 [target_core_mod] target_xcopy_do_work+0x61f/0xc00 [target_core_mod]
This fix makes target_complete_cmd() queue work on se_cmd->cpuid if se_tpg_wwn is NULL.
--- drivers/target/target_core_transport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/target/target_core_transport.c +1 -1
@@ -886,7 +886,7 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)INIT_WORK (&cmd->work, success ? target_complete_ok_work : target_complete_failure_work); -if (wwn->cmd_compl_affinity ==SE_COMPL_AFFINITY_CPUID ) +if (!wwn || wwn->cmd_compl_affinity ==SE_COMPL_AFFINITY_CPUID ) cpu = cmd->cpuid;else cpu = wwn->cmd_compl_affinity;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 122/223 drm/ttm: Force re-init if ttm_global_init() fails
In reply to Greg Kroah-HartmanFrom: Jason Ekstrand <[email protected]>
[ Upstream commit 235c3610d5f02ee91244239b43cd9ae8b4859dff ]
If we have a failure, decrement the reference count so that the next call to ttm_global_init() will actually do something instead of assume everything is all set up.
--- drivers/gpu/drm/ttm/ttm_device.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/ttm/ttm_device.c +2 -0
@@ -100,6 +100,8 @@ static int ttm_global_init(void)debugfs_create_atomic_t ("buffer_objects" ,0444 , ttm_debugfs_root, &glob->bo_count); out: +if (ret) + --ttm_glob_use_count;mutex_unlock (&ttm_global_mutex);return ret; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 123/223 nvme-pci: dont WARN_ON in nvme_reset_work if ctrl.state is not RESETTING
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit 7764656b108cd308c39e9a8554353b8f9ca232a3 ]
Followling process:nvme_probe
nvme_reset_ctrl
nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING)
queue_work(nvme_reset_wq, &ctrl->reset_work)--------------> nvme_remove
nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DELETING)
worker_thread
process_one_work
nvme_reset_work
WARN_ON(dev->ctrl.state != NVME_CTRL_RESETTING), which will trigger WARN_ON in nvme_reset_work():
[ 127.534298] WARNING: CPU: 0 PID: 139 at drivers/nvme/host/pci.c:2594 [ 127.536161] CPU: 0 PID: 139 Comm: kworker/u8:7 Not tainted 5.13.0 [ 127.552518] Call Trace: [ 127.552840] ? kvm_sched_clock_read+0x25/0x40 [ 127.553936] ? native_send_call_func_single_ipi+0x1c/0x30 [ 127.555117] ? send_call_function_single_ipi+0x9b/0x130 [ 127.556263] ? __smp_call_single_queue+0x48/0x60 [ 127.557278] ? ttwu_queue_wakelist+0xfa/0x1c0 [ 127.558231] ? try_to_wake_up+0x265/0x9d0 [ 127.559120] ? ext4_end_io_rsv_work+0x160/0x290 [ 127.560118] process_one_work+0x28c/0x640 [ 127.561002] worker_thread+0x39a/0x700 [ 127.561833] ? rescuer_thread+0x580/0x580 [ 127.562714] kthread+0x18c/0x1e0 [ 127.563444] ? set_kthread_struct+0x70/0x70 [ 127.564347] ret_from_fork+0x1f/0x30
The preceding problem can be easily reproduced by executing following script (based on blktests suite):test() {
pdev="$(_get_pci_dev_from_blkdev)" sysfs="/sys/bus/pci/devices/${pdev}"
for ((i = 0; i < 10; i++)); do
echo 1 > "$sysfs/remove"
echo 1 > /sys/bus/pci/rescan
done
}
Since the device ctrl could be updated as an non-RESETTING state by repeating probe/remove in userspace (which is a normal situation), we can replace stack dumping WARN_ON with a warnning message.
--- drivers/nvme/host/pci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/nvme/host/pci.c +3 -1
@@ -2591,7 +2591,9 @@ static void nvme_reset_work(struct work_struct *work)bool was_suspend = !!(dev->ctrl.ctrl_config &NVME_CC_SHN_NORMAL );int result; -if (WARN_ON (dev->ctrl.state !=NVME_CTRL_RESETTING )) { +if (dev->ctrl.state !=NVME_CTRL_RESETTING ) { +dev_warn (dev->ctrl.device,"ctrl state %d is not RESETTING\n" , + dev->ctrl.state); result = -ENODEV ; goto out; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 124/223 Revert "USB: quirks: ignore remote wake-up on Fibocom L850-GL LTE modem"
In reply to Greg Kroah-HartmanFrom: Vincent Palatin <[email protected]>
[ Upstream commit f3a1a937f7b240be623d989c8553a6d01465d04f ]
This reverts commit 0bd860493f81eb2a46173f6f5e44cc38331c8dbd.
While the patch was working as stated,ie preventing the L850-GL LTE modem from crashing on some U3 wake-ups due to a race condition between the host wake-up and the modem-side wake-up, when using the MBIM interface, this would force disabling the USB runtime PM on the device.
The increased power consumption is significant for LTE laptops, and given that with decently recent modem firmwares, when the modem hits the bug, it automatically recovers (ie it drops from the bus, but automatically re-enumerates after less than half a second, rather than being stuck until a power cycle as it was doing with ancient firmware), for most people, the trade-off now seems in favor of re-enabling it by default.
For people with access to the platform code, the bug can also be worked-around successfully by changing the USB3 LFPM polling off-time for the XHCI controller in the BIOS code.
--- drivers/usb/core/quirks.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/usb/core/quirks.c +0 -4
@@ -502,10 +502,6 @@ static const struct usb_device_id usb_quirk_list[] = {/* DJI CineSSD */ { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM }, - /* Fibocom L850-GL LTE Modem */ - { USB_DEVICE(0x2cb7, 0x0007), .driver_info = - USB_QUIRK_IGNORE_REMOTE_WAKEUP }, - /* INTEL VALUE SSD */ { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 125/223 afs: Fix tracepoint string placement with built-in AFS
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
[ Upstream commit 6c881ca0b3040f3e724eae513117ba4ddef86057 ]
To quote Alexey[1]:
I was adding custom tracepoint to the kernel, grabbed full F34 kernel .config, disabled modules and booted whole shebang as VM kernel.
Then did
perf record -a -e ...
It crashed:
general protection fault, probably for non-canonical address 0x435f5346592e4243: 0000 [#1] SMP PTI
CPU: 1 PID: 842 Comm: cat Not tainted 5.12.6+ #26
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1.fc33 04/01/2014
RIP: 0010:t_show+0x22/0xd0
Then reproducer was narrowed to
# cat /sys/kernel/tracing/printk_formats
Original F34 kernel with modules didn't crash.
So I started to disable options and after disabling AFS everything started working again.
The root cause is that AFS was placing char arrays content into a section full of _pointers_ to strings with predictable consequences.
Non canonical address 435f5346592e4243 is "CB.YFS_" which came from CM_NAME macro.
Steps to reproduce:
CONFIG_AFS=y
CONFIG_TRACING=y
# cat /sys/kernel/tracing/printk_formats
Fix this by the following means:
(1) Add enum->string translation tables in the event header with the AFS and YFS cache/callback manager operations listed by RPC operation ID.
(2) Modify the afs_cb_call tracepoint to print the string from the translation table rather than using the string at the afs_call name pointer.
(3) Switch translation table depending on the service we're being accessed as (AFS or YFS) in the tracepoint print clause. Will this cause problems to userspace utilities?
Note that the symbolic representation of the YFS service ID isn't available to this header, so I've put it in as a number. I'm not sure if this is the best way to do this.
(4) Remove the name wrangling (CM_NAME) macro and put the names directly into the afs_call_type structs in cmservice.c.
--- fs/afs/cmservice.c | 25 ++++---------- include/trace/events/afs.h | 67 +++++++++++++++++++++++++++++++++++--- 2 files changed, 69 insertions(+), 23 deletions(-)
fs/afs/cmservice.c +7 -18
@@ -29,16 +29,11 @@ static void SRXAFSCB_TellMeAboutYourself(struct work_struct *);static int afs_deliver_yfs_cb_callback (struct afs_call *); -#define CM_NAME (name) \ - char afs_SRXCB##name##_name[] __tracepoint_string = \ - "CB." #name -/* * CB.CallBack operation type */ -static CM_NAME (CallBack);static const struct afs_call_type afs_SRXCBCallBack = { - .name = afs_SRXCBCallBack_name, + .name ="CB.CallBack" , .deliver = afs_deliver_cb_callback, .destructor = afs_cm_destructor, .work = SRXAFSCB_CallBack,
@@ -47,9 +42,8 @@ static const struct afs_call_type afs_SRXCBCallBack = {/* * CB.InitCallBackState operation type */ -static CM_NAME (InitCallBackState);static const struct afs_call_type afs_SRXCBInitCallBackState = { - .name = afs_SRXCBInitCallBackState_name, + .name ="CB.InitCallBackState" , .deliver = afs_deliver_cb_init_call_back_state, .destructor = afs_cm_destructor, .work = SRXAFSCB_InitCallBackState,
@@ -58,9 +52,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState = {/* * CB.InitCallBackState3 operation type */ -static CM_NAME (InitCallBackState3);static const struct afs_call_type afs_SRXCBInitCallBackState3 = { - .name = afs_SRXCBInitCallBackState3_name, + .name ="CB.InitCallBackState3" , .deliver = afs_deliver_cb_init_call_back_state3, .destructor = afs_cm_destructor, .work = SRXAFSCB_InitCallBackState,
@@ -69,9 +62,8 @@ static const struct afs_call_type afs_SRXCBInitCallBackState3 = {/* * CB.Probe operation type */ -static CM_NAME (Probe);static const struct afs_call_type afs_SRXCBProbe = { - .name = afs_SRXCBProbe_name, + .name ="CB.Probe" , .deliver = afs_deliver_cb_probe, .destructor = afs_cm_destructor, .work = SRXAFSCB_Probe,
@@ -80,9 +72,8 @@ static const struct afs_call_type afs_SRXCBProbe = {/* * CB.ProbeUuid operation type */ -static CM_NAME (ProbeUuid);static const struct afs_call_type afs_SRXCBProbeUuid = { - .name = afs_SRXCBProbeUuid_name, + .name ="CB.ProbeUuid" , .deliver = afs_deliver_cb_probe_uuid, .destructor = afs_cm_destructor, .work = SRXAFSCB_ProbeUuid,
@@ -91,9 +82,8 @@ static const struct afs_call_type afs_SRXCBProbeUuid = {/* * CB.TellMeAboutYourself operation type */ -static CM_NAME (TellMeAboutYourself);static const struct afs_call_type afs_SRXCBTellMeAboutYourself = { - .name = afs_SRXCBTellMeAboutYourself_name, + .name ="CB.TellMeAboutYourself" , .deliver = afs_deliver_cb_tell_me_about_yourself, .destructor = afs_cm_destructor, .work = SRXAFSCB_TellMeAboutYourself,
@@ -102,9 +92,8 @@ static const struct afs_call_type afs_SRXCBTellMeAboutYourself = {/* * YFS CB.CallBack operation type */ -static CM_NAME (YFS_CallBack);static const struct afs_call_type afs_SRXYFSCB_CallBack = { - .name = afs_SRXCBYFS_CallBack_name, + .name ="YFSCB.CallBack" , .deliver = afs_deliver_yfs_cb_callback, .destructor = afs_cm_destructor, .work = SRXAFSCB_CallBack,
include/trace/events/afs.h +62 -5
100 lines not on this page · raw message
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 126/223 afs: check function return
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit afe6949862f77bcc14fa16ad7938a04e84586d6a ]
Static analysis reports this problem
write.c:773:29: warning: Assigned value is garbage or undefined
mapping->writeback_index = next;
^ ~~~~The call to afs_writepages_region() can return without setting next. So check the function return before using next.
Changes:
ver #2:
- Need to fix the range_cyclic case also[1].
--- fs/afs/write.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
fs/afs/write.c +11 -5
@@ -771,13 +771,19 @@ int afs_writepages(struct address_space *mapping,if (wbc->range_cyclic) { start = mapping->writeback_index *PAGE_SIZE ; ret =afs_writepages_region (mapping, wbc, start,LLONG_MAX , &next); -if (start >0 && wbc->nr_to_write >0 && ret ==0 ) - ret =afs_writepages_region (mapping, wbc,0 , start, - &next); - mapping->writeback_index = next /PAGE_SIZE ; +if (ret ==0 ) { + mapping->writeback_index = next /PAGE_SIZE ; +if (start >0 && wbc->nr_to_write >0 ) { + ret =afs_writepages_region (mapping, wbc,0 , + start, &next); +if (ret ==0 ) + mapping->writeback_index = + next /PAGE_SIZE ; + } + } }else if (wbc->range_start ==0 && wbc->range_end ==LLONG_MAX ) { ret =afs_writepages_region (mapping, wbc,0 ,LLONG_MAX , &next); -if (wbc->nr_to_write >0 ) +if (wbc->nr_to_write >0 && ret ==0 ) mapping->writeback_index = next; }else { ret = afs_writepages_region(mapping, wbc,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 127/223 afs: Fix setting of writeback_index
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
[ Upstream commit 5a972474cf685bf99ca430979657095bda3a15c8 ]
Fix afs_writepages() to always set mapping->writeback_index to a page index and not a byte position[1].
--- fs/afs/write.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/afs/write.c +1 -1
@@ -784,7 +784,7 @@ int afs_writepages(struct address_space *mapping, }else if (wbc->range_start ==0 && wbc->range_end ==LLONG_MAX ) { ret =afs_writepages_region (mapping, wbc,0 ,LLONG_MAX , &next);if (wbc->nr_to_write >0 && ret ==0 ) - mapping->writeback_index = next; + mapping->writeback_index = next /PAGE_SIZE ; }else { ret =afs_writepages_region (mapping, wbc, wbc->range_start, wbc->range_end, &next);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 128/223 r8169: Avoid duplicate sysfs entry creation error
In reply to Greg Kroah-HartmanFrom: Sayanta Pattanayak <[email protected]>
[ Upstream commit e9a72f874d5b95cef0765bafc56005a50f72c5fe ]
When registering the MDIO bus for a r8169 device, we use the PCI bus/device specifier as a (seemingly) unique device identifier. However the very same BDF number can be used on another PCI segment, which makes the driver fail probing:
[ 27.544136] r8169 0002:07:00.0: enabling device (0000 -> 0003) [ 27.559734] sysfs: cannot create duplicate filename '/class/mdio_bus/r8169-700' .... [ 27.684858] libphy: mii_bus r8169-700 failed to register [ 27.695602] r8169: probe of 0002:07:00.0 failed with error -22
Add the segment number to the device name to make it more unique.
This fixes operation on ARM N1SDP boards, with two boards connected together to form an SMP system, and all on-board devices showing up twice, just on different PCI segments. A similar issue would occur on large systems with many PCI slots and multiple RTL8169 NICs.
--- drivers/net/ethernet/realtek/r8169_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/realtek/r8169_main.c +2 -1
@@ -5085,7 +5085,8 @@ static int r8169_mdio_register(struct rtl8169_private *tp) new_bus->priv = tp; new_bus->parent = &pdev->dev; new_bus->irq[0 ] =PHY_MAC_INTERRUPT ; -snprintf (new_bus->id,MII_BUS_ID_SIZE ,"r8169-%x" ,pci_dev_id (pdev)); +snprintf (new_bus->id,MII_BUS_ID_SIZE ,"r8169-%x-%x" , +pci_domain_nr (pdev->bus),pci_dev_id (pdev)); new_bus->read = r8169_mdio_read_reg; new_bus->write = r8169_mdio_write_reg;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 129/223 nvme: set the PRACT bit when using Write Zeroes with T10 PI
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
[ Upstream commit aaeb7bb061be545251606f4d9c82d710ca2a7c8e ]
When using Write Zeroes on a namespace that has protection information enabled they behavior without the PRACT bit counter-intuitive and will generally lead to validation failures when reading the written blocks. Fix this by always setting the PRACT bit that generates matching PI data on the fly.
--- drivers/nvme/host/core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/nvme/host/core.c +4 -1
@@ -880,7 +880,10 @@ static inline blk_status_t nvme_setup_write_zeroes(struct nvme_ns *ns,cpu_to_le64 (nvme_sect_to_lba (ns,blk_rq_pos (req))); cmnd->write_zeroes.length =cpu_to_le16 ((blk_rq_bytes (req) >> ns->lba_shift) -1 ); - cmnd->write_zeroes.control =0 ; +if (nvme_ns_has_pi (ns)) + cmnd->write_zeroes.control =cpu_to_le16 (NVME_RW_PRINFO_PRACT ); +else + cmnd->write_zeroes.control =0 ;return BLK_STS_OK ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 130/223 sctp: update active_key for asoc when old key is being replaced
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit 58acd10092268831e49de279446c314727101292 ]
syzbot reported a call trace:
BUG: KASAN: use-after-free in sctp_auth_shkey_hold+0x22/0xa0 net/sctp/auth.c:112 Call Trace: sctp_auth_shkey_hold+0x22/0xa0 net/sctp/auth.c:112 sctp_set_owner_w net/sctp/socket.c:131 [inline] sctp_sendmsg_to_asoc+0x152e/0x2180 net/sctp/socket.c:1865 sctp_sendmsg+0x103b/0x1d30 net/sctp/socket.c:2027 inet_sendmsg+0x99/0xe0 net/ipv4/af_inet.c:821 sock_sendmsg_nosec net/socket.c:703 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:723
This is an use-after-free issue caused by not updating asoc->shkey after it was replaced in the key list asoc->endpoint_shared_keys, and the old key was freed.
This patch is to fix by also updating active_key for asoc when old key is being replaced with a new one. Note that this issue doesn't exist in sctp_auth_del_key_id(), as it's not allowed to delete the active_key from the asoc.
--- net/sctp/auth.c | 2 ++ 1 file changed, 2 insertions(+)
net/sctp/auth.c +2 -0
@@ -860,6 +860,8 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,if (replace) {list_del_init (&shkey->key_list);sctp_auth_shkey_release (shkey); +if (asoc && asoc->active_key_id == auth_key->sca_keynumber) +sctp_auth_asoc_init_active_key (asoc,GFP_KERNEL ); }list_add (&cur_key->key_list, sh_keys);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 131/223 udp: check encap socket in __udp_lib_err
In reply to Greg Kroah-HartmanFrom: Vadim Fedorenko <[email protected]>
[ Upstream commit 9bfce73c8921c92a9565562e6e7d458d37b7ce80 ]
Commit d26796ae5894 ("udp: check udp sock encap_type in __udp_lib_err") added checks for encapsulated sockets but it broke cases when there is no implementation of encap_err_lookup for encapsulation, i.e. ESP in UDP encapsulation. Fix it by calling encap_err_lookup only if socket implements this method otherwise treat it as legal socket.
--- net/ipv4/udp.c | 25 +++++++++++++++++++------ net/ipv6/udp.c | 25 +++++++++++++++++++------ 2 files changed, 38 insertions(+), 12 deletions(-)
net/ipv4/udp.c +19 -6
@@ -645,10 +645,12 @@ static struct sock *__udp4_lib_err_encap(struct net *net,const struct iphdr *iph, struct udphdr *uh, struct udp_table *udptable, + struct sock *sk, struct sk_buff *skb, u32 info) { + int (*lookup)(struct sock *sk, struct sk_buff *skb);int network_offset, transport_offset; -struct sock *sk; +struct udp_sock *up; network_offset =skb_network_offset (skb); transport_offset =skb_transport_offset (skb);
@@ -659,18 +661,28 @@ static struct sock *__udp4_lib_err_encap(struct net *net,/* Transport header needs to point to the UDP header */ skb_set_transport_header (skb, iph->ihl <<2 ); +if (sk) { + up =udp_sk (sk); + + lookup =READ_ONCE (up->encap_err_lookup); +if (lookup &&lookup (sk, skb)) + sk =NULL ; + + goto out; + } + sk =__udp4_lib_lookup (net, iph->daddr, uh->source, iph->saddr, uh->dest, skb->dev->ifindex,0 , udptable,NULL );if (sk) { -int (*lookup)(struct sock *sk,struct sk_buff *skb); -struct udp_sock *up =udp_sk (sk); + up =udp_sk (sk); lookup =READ_ONCE (up->encap_err_lookup);if (!lookup ||lookup (sk, skb)) sk =NULL ; } +out:if (!sk) sk =ERR_PTR (__udp4_lib_err_encap_no_sk (skb, info));
@@ -707,15 +719,16 @@ int __udp4_lib_err(struct sk_buff *skb, u32 info, struct udp_table *udptable) sk =__udp4_lib_lookup (net, iph->daddr, uh->dest, iph->saddr, uh->source, skb->dev->ifindex,inet_sdif (skb), udptable,NULL ); +if (!sk ||udp_sk (sk)->encap_type) {/* No socket for error: try tunnels before discarding */ - sk =ERR_PTR (-ENOENT );if (static_branch_unlikely (&udp_encap_needed_key)) { - sk =__udp4_lib_err_encap (net, iph, uh, udptable, skb, + sk =__udp4_lib_err_encap (net, iph, uh, udptable, sk, skb, info);if (!sk)return 0 ; - } + }else + sk =ERR_PTR (-ENOENT );if (IS_ERR (sk)) {__ICMP_INC_STATS (net,ICMP_MIB_INERRORS );
net/ipv6/udp.c +19 -6
@@ -502,12 +502,14 @@ static struct sock *__udp6_lib_err_encap(struct net *net, const struct ipv6hdr *hdr, int offset, struct udphdr *uh, struct udp_table *udptable, + struct sock *sk, struct sk_buff *skb, struct inet6_skb_parm *opt, u8 type, u8 code, __be32 info) { + int (*lookup)(struct sock *sk, struct sk_buff *skb);int network_offset, transport_offset; -struct sock *sk; +struct udp_sock *up; network_offset =skb_network_offset (skb); transport_offset =skb_transport_offset (skb);
@@ -518,18 +520,28 @@ static struct sock *__udp6_lib_err_encap(struct net *net,/* Transport header needs to point to the UDP header */ skb_set_transport_header (skb, offset); +if (sk) { + up =udp_sk (sk); + + lookup =READ_ONCE (up->encap_err_lookup); +if (lookup &&lookup (sk, skb)) + sk =NULL ; + + goto out; + } + sk =__udp6_lib_lookup (net, &hdr->daddr, uh->source, &hdr->saddr, uh->dest,inet6_iif (skb),0 , udptable, skb);if (sk) { -int (*lookup)(struct sock *sk,struct sk_buff *skb); -struct udp_sock *up =udp_sk (sk); + up =udp_sk (sk); lookup =READ_ONCE (up->encap_err_lookup);if (!lookup ||lookup (sk, skb)) sk =NULL ; } +out:if (!sk) { sk =ERR_PTR (__udp6_lib_err_encap_no_sk (skb, opt, type, code, offset, info));
@@ -558,16 +570,17 @@ int __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt, sk =__udp6_lib_lookup (net, daddr, uh->dest, saddr, uh->source,inet6_iif (skb),inet6_sdif (skb), udptable,NULL ); +if (!sk ||udp_sk (sk)->encap_type) {/* No socket for error: try tunnels before discarding */ - sk =ERR_PTR (-ENOENT );if (static_branch_unlikely (&udpv6_encap_needed_key)) { sk =__udp6_lib_err_encap (net, hdr, offset, uh, - udptable, skb, + udptable, sk, skb, opt, type, code, info);if (!sk)return 0 ; - } + }else + sk =ERR_PTR (-ENOENT );if (IS_ERR (sk)) { __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev),
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 132/223 ibmvnic: Remove the proper scrq flush
In reply to Greg Kroah-HartmanFrom: Sukadev Bhattiprolu <[email protected]>
[ Upstream commit bb55362bd6976631b662ca712779b6532d8de0a6 ]
Commit 65d6470d139a ("ibmvnic: clean pending indirect buffs during reset") intended to remove the call to ibmvnic_tx_scrq_flush() when the ->resetting flag is true and was tested that way. But during the final rebase to net-next, the hunk got applied to a block few lines below (which happened to have the same diff context) and the wrong call to ibmvnic_tx_scrq_flush() got removed.
Fix that by removing the correct ibmvnic_tx_scrq_flush() and restoring the one that was incorrectly removed.
--- drivers/net/ethernet/ibm/ibmvnic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/ibm/ibmvnic.c +1 -1
@@ -1707,7 +1707,6 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev) tx_send_failed++; tx_dropped++; ret =NETDEV_TX_OK ; -ibmvnic_tx_scrq_flush (adapter, tx_scrq); goto out; }
@@ -1729,6 +1728,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)dev_kfree_skb_any (skb); tx_send_failed++; tx_dropped++; +ibmvnic_tx_scrq_flush (adapter, tx_scrq); ret =NETDEV_TX_OK ; goto out; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 133/223 riscv: Fix 32-bit RISC-V boot failure
In reply to Greg Kroah-HartmanFrom: Bin Meng <[email protected]>
[ Upstream commit d0e4dae74470fb709fc0ab61862c317938f4cc4d ]
Commit dd2d082b5760 ("riscv: Cleanup setup_bootmem()") adjusted the calling sequence in setup_bootmem(), which invalidates the fix commit de043da0b9e7 ("RISC-V: Fix usage of memblock_enforce_memory_limit") did for 32-bit RISC-V unfortunately.
So now 32-bit RISC-V does not boot again when testing booting kernel on QEMU 'virt' with '-m 2G', which was exactly what the original commit de043da0b9e7 ("RISC-V: Fix usage of memblock_enforce_memory_limit") tried to fix.
--- arch/riscv/mm/init.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/riscv/mm/init.c +3 -1
@@ -123,7 +123,7 @@ void __init setup_bootmem(void) {phys_addr_t vmlinux_end =__pa_symbol (&_end);phys_addr_t vmlinux_start =__pa_symbol (&_start); -phys_addr_t dram_end =memblock_end_of_DRAM (); +phys_addr_t dram_end;phys_addr_t max_mapped_addr =__pa (~(ulong )0 );#ifdef CONFIG_XIP_KERNEL
@@ -146,6 +146,8 @@ void __init setup_bootmem(void)#endif memblock_reserve (vmlinux_start, vmlinux_end - vmlinux_start); + dram_end =memblock_end_of_DRAM (); +/* * memblock allocator is not aware of the fact that last 4K bytes of * the addressable memory can not be mapped because of IS_ERR_VALUE
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 134/223 tcp: disable TFO blackhole logic by default
In reply to Greg Kroah-HartmanFrom: Wei Wang <[email protected]>
[ Upstream commit 213ad73d06073b197a02476db3a4998e219ddb06 ]
Multiple complaints have been raised from the TFO users on the internet stating that the TFO blackhole logic is too aggressive and gets falsely triggered too often.
(e.g. https://blog.apnic.net/2021/07/05/tcp-fast-open-not-so-fast/)
Considering that most middleboxes no longer drop TFO packets, we decide to disable the blackhole logic by setting /proc/sys/net/ipv4/tcp_fastopen_blackhole_timeout_set to 0 by default.
--- Documentation/networking/ip-sysctl.rst | 2 +- net/ipv4/tcp_fastopen.c | 9 ++++++++- net/ipv4/tcp_ipv4.c | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-)
Documentation/networking/ip-sysctl.rst +1 -1
@@ -772,7 +772,7 @@ tcp_fastopen_blackhole_timeout_sec - INTEGER initial value when the blackhole issue goes away. 0 to disable the blackhole detection. - By default, it is set to 1hr. + By default, it is set to 0 (feature is disabled). tcp_fastopen_key - list of comma separated 32-digit hexadecimal INTEGERs The list consists of a primary key and an optional backup key. The
net/ipv4/tcp_fastopen.c +8 -1
@@ -507,6 +507,9 @@ void tcp_fastopen_active_disable(struct sock *sk) {struct net *net =sock_net (sk); +if (!sock_net (sk)->ipv4.sysctl_tcp_fastopen_blackhole_timeout) +return ; +/* Paired with READ_ONCE() in tcp_fastopen_active_should_disable() */ WRITE_ONCE (net->ipv4.tfo_active_disable_stamp, jiffies);
@@ -526,10 +529,14 @@ void tcp_fastopen_active_disable(struct sock *sk)bool tcp_fastopen_active_should_disable (struct sock *sk) {unsigned int tfo_bh_timeout =sock_net (sk)->ipv4.sysctl_tcp_fastopen_blackhole_timeout; -int tfo_da_times =atomic_read (&sock_net (sk)->ipv4.tfo_active_disable_times);unsigned long timeout; +int tfo_da_times;int multiplier; +if (!tfo_bh_timeout) +return false; + + tfo_da_times =atomic_read (&sock_net (sk)->ipv4.tfo_active_disable_times);if (!tfo_da_times)return false;
net/ipv4/tcp_ipv4.c +1 -1
@@ -2954,7 +2954,7 @@ static int __net_init tcp_sk_init(struct net *net) net->ipv4.sysctl_tcp_comp_sack_nr =44 ; net->ipv4.sysctl_tcp_fastopen =TFO_CLIENT_ENABLE ;spin_lock_init (&net->ipv4.tcp_fastopen_ctx_lock); - net->ipv4.sysctl_tcp_fastopen_blackhole_timeout =60 *60 ; + net->ipv4.sysctl_tcp_fastopen_blackhole_timeout =0 ;atomic_set (&net->ipv4.tfo_active_disable_times,0 );/* Reno is always built in */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 135/223 net: dsa: sja1105: make VID 4095 a bridge VLAN too
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit e40cba9490bab1414d45c2d62defc0ad4f6e4136 ]
This simple series of commands:
ip link add br0 type bridge vlan_filtering 1
ip link set swp0 master br0
fails on sja1105 with the following error:
[ 33.439103] sja1105 spi0.1: vlan-lookup-table needs to have at least the default untagged VLAN [ 33.447710] sja1105 spi0.1: Invalid config, cannot upload
Warning: sja1105: Failed to change VLAN Ethertype.
For context, sja1105 has 3 operating modes:
- SJA1105_VLAN_UNAWARE: the dsa_8021q_vlans are committed to hardware
- SJA1105_VLAN_FILTERING_FULL: the bridge_vlans are committed to hardware
- SJA1105_VLAN_FILTERING_BEST_EFFORT: both the dsa_8021q_vlans and the bridge_vlans are committed to hardware
Swapping out a VLAN list and another in happens in sja1105_build_vlan_table(), which performs a delta update procedure. That function is called from a few places, notably from sja1105_vlan_filtering() which is called from the SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING handler.
The above set of 2 commands fails when run on a kernel pre-commit 8841f6e63f2c ("net: dsa: sja1105: make devlink property best_effort_vlan_filtering true by default"). So the priv->vlan_state transition that takes place is between VLAN-unaware and full VLAN filtering. So the dsa_8021q_vlans are swapped out and the bridge_vlans are swapped in.
So why does it fail?
Well, the bridge driver, through nbp_vlan_init(), first sets up the SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING attribute, and only then proceeds to call nbp_vlan_add for the default_pvid.
So when we swap out the dsa_8021q_vlans and swap in the bridge_vlans in the SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING handler, there are no bridge VLANs (yet). So we have wiped the VLAN table clean, and the low-level static config checker complains of an invalid configuration. We _will_ add the bridge VLANs using the dynamic config interface, albeit later, when nbp_vlan_add() calls us. So it is natural that it fails.
So why did it ever work?
Surprisingly, it looks like I only tested this configuration with 2 things set up in a particular way:
- a network manager that brings all ports up
- a kernel with CONFIG_VLAN_8021Q=y
It is widely known that commit ad1afb003939 ("vlan_dev: VLAN 0 should be treated as "no vlan tag" (802.1p packet)") installs VID 0 to every net device that comes up. DSA treats these VLANs as bridge VLANs, and therefore, in my testing, the list of bridge_vlans was never empty.
However, if CONFIG_VLAN_8021Q is not enabled, or the port is not up when it joins a VLAN-aware bridge, the bridge_vlans list will be temporarily empty, and the sja1105_static_config_reload() call from sja1105_vlan_filtering() will fail.
To fix this, the simplest thing is to keep VID 4095, the one used for CPU-injected control packets since commit ed040abca4c1 ("net: dsa:
sja1105: use 4095 as the private VLAN for untagged traffic"), in the list of bridge VLANs too, not just the list of tag_8021q VLANs. This ensures that the list of bridge VLANs will never be empty.
--- drivers/net/dsa/sja1105/sja1105_main.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/dsa/sja1105/sja1105_main.c +6 -0
@@ -378,6 +378,12 @@ static int sja1105_init_static_vlan(struct sja1105_private *priv)if (dsa_is_cpu_port (ds, port)) v->pvid = true;list_add (&v->list, &priv->dsa_8021q_vlans); + + v =kmemdup (v,sizeof (*v),GFP_KERNEL ); +if (!v) +return -ENOMEM ; + +list_add (&v->list, &priv->bridge_vlans); } ((struct sja1105_vlan_lookup_entry *)table->entries)[0 ] = pvid;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 136/223 RISC-V: load initrd wherever it fits into memory
In reply to Greg Kroah-HartmanFrom: Heinrich Schuchardt <[email protected]>
[ Upstream commit c79e89ecaa246c880292ba68cbe08c9c30db77e3 ]
Requiring that initrd is loaded below RAM start + 256 MiB led to failure to boot SUSE Linux with GRUB on QEMU, cf.
https://lists.gnu.org/archive/html/grub-devel/2021-06/msg00037.html
Remove the constraint.
--- arch/riscv/include/asm/efi.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/riscv/include/asm/efi.h +2 -2
@@ -27,10 +27,10 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md);#define ARCH_EFI_IRQ_FLAGS_MASK (SR_IE | SR_SPIE) -/* Load initrd at enough distance from DRAM start */ +/* Load initrd anywhere in system RAM */ static inline unsigned long efi_get_max_initrd_addr (unsigned long image_addr) { -return image_addr +SZ_256M ; +return ULONG_MAX ; } #define alloc_screen_info(x...) (&screen_info)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 137/223 net: sched: cls_api: Fix the the wrong parameter
In reply to Greg Kroah-HartmanFrom: Yajun Deng <[email protected]>
[ Upstream commit 9d85a6f44bd5585761947f40f7821c9cd78a1bbe ]
The 4th parameter in tc_chain_notify() should be flags rather than seq. Let's change it back correctly.
--- net/sched/cls_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/cls_api.c +1 -1
@@ -2904,7 +2904,7 @@ replay:break ;case RTM_GETCHAIN : err =tc_chain_notify (chain, skb, n->nlmsg_seq, - n->nlmsg_seq, n->nlmsg_type, true); + n->nlmsg_flags, n->nlmsg_type, true);if (err <0 )NL_SET_ERR_MSG (extack,"Failed to send chain notify message" );break ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 138/223 drm/panel: raspberrypi-touchscreen: Prevent double-free
In reply to Greg Kroah-HartmanFrom: Maxime Ripard <[email protected]>
[ Upstream commit 7bbcb919e32d776ca8ddce08abb391ab92eef6a9 ]
The mipi_dsi_device allocated by mipi_dsi_device_register_full() is already free'd on release.
--- drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | 1 - 1 file changed, 1 deletion(-)
drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +0 -1
@@ -447,7 +447,6 @@ static int rpi_touchscreen_remove(struct i2c_client *i2c)drm_panel_remove (&ts->base);mipi_dsi_device_unregister (ts->dsi); -kfree (ts->dsi);return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 139/223 dpaa2-switch: seed the buffer pool after allocating the swp
In reply to Greg Kroah-HartmanFrom: Ioana Ciornei <[email protected]>
[ Upstream commit 7aaa0f311e2df2704fa8ddb8ed681a3b5841d0bf ]
Any interraction with the buffer pool (seeding a buffer, acquire one) is made through a software portal (SWP, a DPIO object).
There are circumstances where the dpaa2-switch driver probes on a DPSW before any DPIO devices have been probed. In this case, seeding of the buffer pool will lead to a panic since no SWPs are initialized.
To fix this, seed the buffer pool after making sure that the software portals have been probed and are ready to be used.
--- .../net/ethernet/freescale/dpaa2/dpaa2-switch.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +8 -8
@@ -2770,32 +2770,32 @@ static int dpaa2_switch_ctrl_if_setup(struct ethsw_core *ethsw)if (err)return err; - err =dpaa2_switch_seed_bp (ethsw); -if (err) - goto err_free_dpbp; - err =dpaa2_switch_alloc_rings (ethsw);if (err) - goto err_drain_dpbp; + goto err_free_dpbp; err =dpaa2_switch_setup_dpio (ethsw);if (err) goto err_destroy_rings; + err =dpaa2_switch_seed_bp (ethsw); +if (err) + goto err_deregister_dpio; + err =dpsw_ctrl_if_enable (ethsw->mc_io,0 , ethsw->dpsw_handle);if (err) {dev_err (ethsw->dev,"dpsw_ctrl_if_enable err %d\n" , err); - goto err_deregister_dpio; + goto err_drain_dpbp; }return 0 ; +err_drain_dpbp: +dpaa2_switch_drain_bp (ethsw); err_deregister_dpio:dpaa2_switch_free_dpio (ethsw); err_destroy_rings:dpaa2_switch_destroy_rings (ethsw); -err_drain_dpbp: -dpaa2_switch_drain_bp (ethsw); err_free_dpbp:dpaa2_switch_free_dpbp (ethsw);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 140/223 cifs: only write 64kb at a time when fallocating a small region of a file
In reply to Greg Kroah-HartmanFrom: Ronnie Sahlberg <[email protected]>
[ Upstream commit 2485bd7557a7edb4520b4072af464f0a08c8efe0 ]
We only allow sending single credit writes through the SMB2_write() synchronous api so split this into smaller chunks.
--- fs/cifs/smb2ops.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-)
fs/cifs/smb2ops.c +19 -7
@@ -3613,7 +3613,7 @@ static int smb3_simple_fallocate_write_range(unsigned int xid, char *buf) {struct cifs_io_parms io_parms = {0 }; -int nbytes; +int rc, nbytes;struct kvec iov[2 ]; io_parms.netfid = cfile->fid.netfid;
@@ -3621,13 +3621,25 @@ static int smb3_simple_fallocate_write_range(unsigned int xid, io_parms.tcon = tcon; io_parms.persistent_fid = cfile->fid.persistent_fid; io_parms.volatile_fid = cfile->fid.volatile_fid; - io_parms.offset = off; - io_parms.length = len; -/* iov[0] is reserved for smb header */ - iov[1 ].iov_base = buf; - iov[1 ].iov_len = io_parms.length; -return SMB2_write (xid, &io_parms, &nbytes, iov,1 ); +while (len) { + io_parms.offset = off; + io_parms.length = len; +if (io_parms.length >SMB2_MAX_BUFFER_SIZE ) + io_parms.length =SMB2_MAX_BUFFER_SIZE ; +/* iov[0] is reserved for smb header */ + iov[1 ].iov_base = buf; + iov[1 ].iov_len = io_parms.length; + rc =SMB2_write (xid, &io_parms, &nbytes, iov,1 ); +if (rc) +break ; +if (nbytes > len) +return -EINVAL ; + buf += nbytes; + off += nbytes; + len -= nbytes; + } +return rc; } static int smb3_simple_fallocate_range(unsigned int xid,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 141/223 cifs: fix fallocate when trying to allocate a hole.
In reply to Greg Kroah-HartmanFrom: Ronnie Sahlberg <[email protected]>
[ Upstream commit 488968a8945c119859d91bb6a8dc13bf50002f15 ]
Remove the conditional checking for out_data_len and skipping the fallocate if it is 0. This is wrong will actually change any legitimate the fallocate where the entire region is unallocated into a no-op.
Additionally, before allocating the range, if FALLOC_FL_KEEP_SIZE is set then we need to clamp the length of the fallocate region as to not extend the size of the file.
--- fs/cifs/smb2ops.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)
fs/cifs/smb2ops.c +18 -5
@@ -3663,11 +3663,6 @@ static int smb3_simple_fallocate_range(unsigned int xid, (char **)&out_data, &out_data_len);if (rc) goto out; -/* -* It is already all allocated -*/ -if (out_data_len ==0 ) - goto out; buf =kzalloc (1024 *1024 ,GFP_KERNEL );if (buf ==NULL ) {
@@ -3790,6 +3785,24 @@ static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon, goto out; } +if (keep_size == true) { +/* +* We can not preallocate pages beyond the end of the file +* in SMB2 +*/ +if (off >=i_size_read (inode)) { + rc =0 ; + goto out; + } +/* +* For fallocates that are partially beyond the end of file, +* clamp len so we only fallocate up to the end of file. +*/ +if (off + len >i_size_read (inode)) { + len =i_size_read (inode) - off; + } + } +if ((keep_size == true) || (i_size_read (inode) >= off + len)) {/* * At this point, we are trying to fallocate an internal
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 142/223 proc: Avoid mixing integer types in mem_rw()
In reply to Greg Kroah-HartmanFrom: Marcelo Henrique Cerri <[email protected]>
[ Upstream commit d238692b4b9f2c36e35af4c6e6f6da36184aeb3e ]
Use size_t when capping the count argument received by mem_rw(). Since count is size_t, using min_t(int, ...) can lead to a negative value that will later be passed to access_remote_vm(), which can cause unexpected behavior.
Since we are capping the value to at maximum PAGE_SIZE, the conversion from size_t to int when passing it to access_remote_vm() as "len" shouldn't be a problem.
--- fs/proc/base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/proc/base.c +1 -1
@@ -854,7 +854,7 @@ static ssize_t mem_rw(struct file *file, char __user *buf, flags =FOLL_FORCE | (write ?FOLL_WRITE :0 );while (count >0 ) { -int this_len =min_t (int, count,PAGE_SIZE ); +size_t this_len =min_t (size_t, count,PAGE_SIZE );if (write &©_from_user (page, buf, this_len)) { copied = -EFAULT ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 143/223 ACPI: fix NULL pointer dereference
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit fc68f42aa737dc15e7665a4101d4168aadb8e4c4 upstream.
Commit 71f642833284 ("ACPI: utils: Fix reference counting in for_each_acpi_dev_match()") started doing "acpi_dev_put()" on a pointer that was possibly NULL. That fails miserably, because that helper inline function is not set up to handle that case.
Just make acpi_dev_put() silently accept a NULL pointer, rather than calling down to put_device() with an invalid offset off that NULL pointer.
--- include/acpi/acpi_bus.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
include/acpi/acpi_bus.h +2 -1
@@ -711,7 +711,8 @@ static inline struct acpi_device *acpi_dstatic inline void acpi_dev_put (struct acpi_device *adev) { -put_device (&adev->dev); +if (adev) +put_device (&adev->dev); }#else /* CONFIG_ACPI */
Greg Kroah-Hartman
maintainerPATCH 144/223 io_uring: Fix race condition when sqp thread goes to sleep
In reply to Greg Kroah-HartmanFrom: Olivier Langlois <[email protected]>
commit 997135017716c33f3405e86cca5da9567b40a08e upstream.
If an asynchronous completion happens before the task is preparing itself to wait and set its state to TASK_INTERRUPTIBLE, the completion will not wake up the sqp thread.
--- fs/io_uring.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/io_uring.c +2 -1
@@ -6876,7 +6876,8 @@ static int io_sq_thread(void *data) }prepare_to_wait (&sqd->wait, &wait,TASK_INTERRUPTIBLE ); -if (!test_bit (IO_SQ_THREAD_SHOULD_PARK , &sqd->state)) { +if (!test_bit (IO_SQ_THREAD_SHOULD_PARK , &sqd->state) && + !io_run_task_work ()) {list_for_each_entry (ctx, &sqd->ctx_list, sqd_list)io_ring_set_wakeup_flag (ctx);
Greg Kroah-Hartman
maintainerPATCH 145/223 mmc: core: Dont allocate IDA for OF aliases
In reply to Greg Kroah-HartmanFrom: Stephen Boyd <[email protected]>
commit 10252bae863d09b9648bed2e035572d207200ca1 upstream.
There's a chance that the IDA allocated in mmc_alloc_host() is not freed for some time because it's freed as part of a class' release function (see mmc_host_classdev_release() where the IDA is freed). If another thread is holding a reference to the class, then only once all balancing device_put() calls (in turn calling kobject_put()) have been made will the IDA be released and usable again.
Normally this isn't a problem because the kobject is released before anything else that may want to use the same number tries to again, but with CONFIG_DEBUG_KOBJECT_RELEASE=y and OF aliases it becomes pretty easy to try to allocate an alias from the IDA twice while the first time it was allocated is still pending a call to ida_simple_remove(). It's also possible to trigger it by using CONFIG_DEBUG_KOBJECT_RELEASE and probe defering a driver at boot that calls mmc_alloc_host() before trying to get resources that may defer likes clks or regulators.
Instead of allocating from the IDA in this scenario, let's just skip it if we know this is an OF alias. The number is already "claimed" and devices that aren't using OF aliases won't try to use the claimed numbers anyway (see mmc_first_nonreserved_index()). This should avoid any issues with mmc_alloc_host() returning failures from the ida_simple_get() in the case that we're using an OF alias.
--- drivers/mmc/core/host.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
drivers/mmc/core/host.c +10 -10
@@ -75,7 +75,8 @@ static void mmc_host_classdev_release(st {struct mmc_host *host =cls_dev_to_mmc_host (dev);wakeup_source_unregister (host->ws); -ida_simple_remove (&mmc_host_ida, host->index); +if (of_alias_get_id (host->parent->of_node,"mmc" ) <0 ) +ida_simple_remove (&mmc_host_ida, host->index);kfree (host); }
@@ -499,7 +500,7 @@ static int mmc_first_nonreserved_index(v*/ struct mmc_host *mmc_alloc_host (int extra,struct device *dev) { -int err; +int index;struct mmc_host *host;int alias_id, min_idx, max_idx;
@@ -512,20 +513,19 @@ struct mmc_host *mmc_alloc_host(int extr alias_id =of_alias_get_id (dev->of_node,"mmc" );if (alias_id >=0 ) { - min_idx = alias_id; - max_idx = alias_id +1 ; + index = alias_id; }else { min_idx =mmc_first_nonreserved_index (); max_idx =0 ; - } - err =ida_simple_get (&mmc_host_ida, min_idx, max_idx,GFP_KERNEL ); -if (err <0 ) { -kfree (host); -return NULL ; + index =ida_simple_get (&mmc_host_ida, min_idx, max_idx,GFP_KERNEL ); +if (index <0 ) { +kfree (host); +return NULL ; + } } - host->index = err; + host->index = index;dev_set_name (&host->class_dev,"mmc%d" , host->index); host->ws =wakeup_source_register (NULL ,dev_name (&host->class_dev));
Greg Kroah-Hartman
maintainerPATCH 146/223 s390/ftrace: fix ftrace_update_ftrace_func implementation
In reply to Greg Kroah-HartmanFrom: Vasily Gorbik <[email protected]>
commit f8c2602733c953ed7a16e060640b8e96f9d94b9b upstream.
s390 enforces DYNAMIC_FTRACE if FUNCTION_TRACER is selected. At the same time implementation of ftrace_caller is not compliant with HAVE_DYNAMIC_FTRACE since it doesn't provide implementation of ftrace_update_ftrace_func() and calls ftrace_trace_function() directly.
The subtle difference is that during ftrace code patching ftrace replaces function tracer via ftrace_update_ftrace_func() and activates it back afterwards. Unexpected direct calls to ftrace_trace_function() during ftrace code patching leads to nullptr-dereferences when tracing is activated for one of functions which are used during code patching. Those function currently are:copy_from_kernel_nofault() copy_from_kernel_nofault_allowed()preempt_count_sub() [with debug_defconfig] preempt_count_add() [with debug_defconfig]
Corresponding KASAN report:
BUG: KASAN: nullptr-dereference in function_trace_call+0x316/0x3b0
Read of size 4 at addr 0000000000001e08 by task migration/0/15
CPU: 0 PID: 15 Comm: migration/0 Tainted: G B 5.13.0-41423-g08316af3644d
Hardware name: IBM 3906 M04 704 (LPAR)
Stopper: multi_cpu_stop+0x0/0x3e0 <- stop_machine_cpuslocked+0x1e4/0x218
Call Trace:
[<0000000001f77caa>] show_stack+0x16a/0x1d0
[<0000000001f8de42>] dump_stack+0x15a/0x1b0
[<0000000001f81d56>] print_address_description.constprop.0+0x66/0x2e0
[<000000000082b0ca>] kasan_report+0x152/0x1c0
[<00000000004cfd8e>] function_trace_call+0x316/0x3b0
[<0000000001fb7082>] ftrace_caller+0x7a/0x7e
[<00000000006bb3e6>] copy_from_kernel_nofault_allowed+0x6/0x10
[<00000000006bb42e>] copy_from_kernel_nofault+0x3e/0xd0
[<000000000014605c>] ftrace_make_call+0xb4/0x1f8
[<000000000047a1b4>] ftrace_replace_code+0x134/0x1d8
[<000000000047a6e0>] ftrace_modify_all_code+0x120/0x1d0
[<000000000047a7ec>] __ftrace_modify_code+0x5c/0x78
[<000000000042395c>] multi_cpu_stop+0x224/0x3e0
[<0000000000423212>] cpu_stopper_thread+0x33a/0x5a0
[<0000000000243ff2>] smpboot_thread_fn+0x302/0x708
[<00000000002329ea>] kthread+0x342/0x408
[<00000000001066b2>] __ret_from_fork+0x92/0xf0
[<0000000001fb57fa>] ret_from_fork+0xa/0x30
The buggy address belongs to the page:
page:(____ptrval____) refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x1
flags: 0x1ffff00000001000(reserved|node=0|zone=0|lastcpupid=0x1ffff)
raw: 1ffff00000001000 0000040000000048 0000040000000048 0000000000000000
raw: 0000000000000000 0000000000000000 ffffffff00000001 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
0000000000001d00: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
0000000000001d80: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
>0000000000001e00: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
^
0000000000001e80: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
0000000000001f00: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
==================================================================To fix that introduce ftrace_func callback to be called from ftrace_caller and update it in ftrace_update_ftrace_func().
--- arch/s390/include/asm/ftrace.h | 1 + arch/s390/kernel/ftrace.c | 2 ++ arch/s390/kernel/mcount.S | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-)
arch/s390/include/asm/ftrace.h +1 -0
@@ -19,6 +19,7 @@ void ftrace_caller(void);extern char ftrace_graph_caller_end;extern unsigned long ftrace_plt; +extern void *ftrace_func;struct dyn_arch_ftrace { };
arch/s390/kernel/ftrace.c +2 -0
@@ -40,6 +40,7 @@* trampoline (ftrace_plt), which clobbers also r1. */ +void *ftrace_func__read_mostly = ftrace_stub;unsigned long ftrace_plt; int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
@@ -85,6 +86,7 @@ int ftrace_make_call(struct dyn_ftrace *int ftrace_update_ftrace_func (ftrace_func_t func) { + ftrace_func = func;return 0 ; }
arch/s390/kernel/mcount.S +2 -2
@@ -59,13 +59,13 @@ ENTRY(ftrace_caller) #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES aghik %r2,%r0,-MCOUNT_INSN_SIZE lgrl %r4,function_trace_op - lgrl %r1,ftrace_trace_function + lgrl %r1,ftrace_func #else lgr %r2,%r0 aghi %r2,-MCOUNT_INSN_SIZE larl %r4,function_trace_op lg %r4,0(%r4) - larl %r1,ftrace_trace_function + larl %r1,ftrace_func lg %r1,0(%r1) #endif lgr %r3,%r14
Greg Kroah-Hartman
maintainerPATCH 147/223 s390/boot: fix use of expolines in the DMA code
In reply to Greg Kroah-HartmanFrom: Alexander Egorenkov <[email protected]>
commit 463f36c76fa4ec015c640ff63ccf52e7527abee0 upstream.
The DMA code section of the decompressor must be compiled with expolines if Spectre V2 mitigation has been enabled for the decompressed kernel. This is required because although the decompressor's image contains the DMA code section, it is handed over to the decompressed kernel for use.
Because the DMA code is already slow w/o expolines, use expolines always regardless whether the decompressed kernel is using them or not. This simplifies the DMA code by dropping the conditional compilation of expolines.
--- arch/s390/boot/text_dma.S | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-)
arch/s390/boot/text_dma.S +4 -15
@@ -9,16 +9,6 @@ #include <asm/errno.h> #include <asm/sigp.h> -#ifdef CC_USING_EXPOLINE - .pushsection .dma.text.__s390_indirect_jump_r14,"axG" -__dma__s390_indirect_jump_r14: - larl %r1,0f - ex 0,0(%r1) - j . -0: br %r14 - .popsection -#endif - .section .dma.text,"ax" /* * Simplified version of expoline thunk. The normal thunks can not be used here,
@@ -27,11 +17,10 @@ __dma__s390_indirect_jump_r14: * affects a few functions that are not performance-relevant. */ .macro BR_EX_DMA_r14 -#ifdef CC_USING_EXPOLINE - jg __dma__s390_indirect_jump_r14 -#else - br %r14 -#endif + larl %r1,0f + ex 0,0(%r1) + j . +0: br %r14 .endm /*
Greg Kroah-Hartman
maintainerPATCH 148/223 ALSA: usb-audio: Add missing proc text entry for BESPOKEN type
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 64752a95b702817602d72f109ceaf5ec0780e283 upstream.
Recently we've added a new usb_mixer element type, USB_MIXER_BESPOKEN, but it wasn't added in the table in snd_usb_mixer_dump_cval(). This is no big problem since each bespoken type should have its own dump method, but it still isn't disallowed to use the standard one, so we should cover it as well. Along with it, define the table with the explicit array initializer for avoiding other pitfalls.
--- sound/usb/mixer.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
sound/usb/mixer.c +9 -1
@@ -3295,7 +3295,15 @@ static void snd_usb_mixer_dump_cval(stru {struct usb_mixer_elem_info *cval =mixer_elem_list_to_info (list);static const char *const val_types[] = { -"BOOLEAN" ,"INV_BOOLEAN" ,"S8" ,"U8" ,"S16" ,"U16" ,"S32" ,"U32" , + [USB_MIXER_BOOLEAN ] ="BOOLEAN" , + [USB_MIXER_INV_BOOLEAN ] ="INV_BOOLEAN" , + [USB_MIXER_S8 ] ="S8" , + [USB_MIXER_U8 ] ="U8" , + [USB_MIXER_S16 ] ="S16" , + [USB_MIXER_U16 ] ="U16" , + [USB_MIXER_S32 ] ="S32" , + [USB_MIXER_U32 ] ="U32" , + [USB_MIXER_BESPOKEN ] ="BESPOKEN" , }; snd_iprintf(buffer, " Info: id=%i, control=%i, cmask=0x%x, " "channels=%i, type=\"%s\"\n", cval->head.id,
Greg Kroah-Hartman
maintainerPATCH 149/223 ALSA: usb-audio: Add registration quirk for JBL Quantum headsets
In reply to Greg Kroah-HartmanFrom: Alexander Tsoy <[email protected]>
commit b0084afde27fe8a504377dee65f55bc6aa776937 upstream.
These devices has two interfaces, but only the second interface contains the capture endpoint, thus quirk is required to delay the registration until the second interface appears.
--- sound/usb/quirks.c | 3 +++ 1 file changed, 3 insertions(+)
sound/usb/quirks.c +3 -0
@@ -1897,6 +1897,9 @@ static const struct registration_quirk rREG_QUIRK_ENTRY (0x0951 ,0x16d8 ,2 ),/* Kingston HyperX AMP */ REG_QUIRK_ENTRY (0x0951 ,0x16ed ,2 ),/* Kingston HyperX Cloud Alpha S */ REG_QUIRK_ENTRY (0x0951 ,0x16ea ,2 ),/* Kingston HyperX Cloud Flight S */ +REG_QUIRK_ENTRY (0x0ecb ,0x1f46 ,2 ),/* JBL Quantum 600 */ +REG_QUIRK_ENTRY (0x0ecb ,0x2039 ,2 ),/* JBL Quantum 400 */ +REG_QUIRK_ENTRY (0x0ecb ,0x203e ,2 ),/* JBL Quantum 800 */ { 0 } /* terminator */ };
Greg Kroah-Hartman
maintainerPATCH 150/223 ALSA: sb: Fix potential ABBA deadlock in CSP driver
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 1c2b9519159b470ef24b2638f4794e86e2952ab7 upstream.
SB16 CSP driver may hit potentially a typical ABBA deadlock in two code paths:
In snd_sb_csp_stop():
spin_lock_irqsave(&p->chip->mixer_lock, flags);
spin_lock(&p->chip->reg_lock); In snd_sb_csp_load():
spin_lock_irqsave(&p->chip->reg_lock, flags);
spin_lock(&p->chip->mixer_lock);Also the similar pattern is seen in snd_sb_csp_start().
Although the practical impact is very small (those states aren't triggered in the same running state and this happens only on a real hardware, decades old ISA sound boards -- which must be very difficult to find nowadays), it's a real scenario and has to be fixed.
This patch addresses those deadlocks by splitting the locks in snd_sb_csp_start() and snd_sb_csp_stop() for avoiding the nested locks.
--- sound/isa/sb/sb16_csp.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/isa/sb/sb16_csp.c +4 -0
@@ -814,6 +814,7 @@ static int snd_sb_csp_start(struct snd_s mixR =snd_sbmixer_read (p->chip,SB_DSP4_PCM_DEV +1 );snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV , mixL &0x7 );snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV +1 , mixR &0x7 ); +spin_unlock_irqrestore (&p->chip->mixer_lock, flags);spin_lock (&p->chip->reg_lock);set_mode_register (p->chip,0xc0 );/* c0 = STOP */
@@ -853,6 +854,7 @@ static int snd_sb_csp_start(struct snd_sspin_unlock (&p->chip->reg_lock);/* restore PCM volume */ +spin_lock_irqsave (&p->chip->mixer_lock, flags);snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV , mixL);snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV +1 , mixR);spin_unlock_irqrestore (&p->chip->mixer_lock, flags);
@@ -878,6 +880,7 @@ static int snd_sb_csp_stop(struct snd_sb mixR =snd_sbmixer_read (p->chip,SB_DSP4_PCM_DEV +1 );snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV , mixL &0x7 );snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV +1 , mixR &0x7 ); +spin_unlock_irqrestore (&p->chip->mixer_lock, flags);spin_lock (&p->chip->reg_lock);if (p->running &SNDRV_SB_CSP_ST_QSOUND ) {
@@ -892,6 +895,7 @@ static int snd_sb_csp_stop(struct snd_sbspin_unlock (&p->chip->reg_lock);/* restore PCM volume */ +spin_lock_irqsave (&p->chip->mixer_lock, flags);snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV , mixL);snd_sbmixer_write (p->chip,SB_DSP4_PCM_DEV +1 , mixR);spin_unlock_irqrestore (&p->chip->mixer_lock, flags);
Greg Kroah-Hartman
maintainerPATCH 151/223 ALSA: hda/realtek: Fix pop noise and 2 Front Mic issues on a machine
In reply to Greg Kroah-HartmanFrom: Hui Wang <[email protected]>
commit e4efa82660e6d80338c554e45e903714e1b2c27b upstream.
This is a Lenovo ThinkStation machine which uses the codec alc623. There are 2 issues on this machine, the 1st one is the pop noise in the lineout, the 2nd one is there are 2 Front Mics and pulseaudio can't handle them, After applying the fixup of ALC623_FIXUP_LENOVO_THINKSTATION_P340 to this machine, the 2 issues are fixed.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -8566,6 +8566,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x3151 ,"ThinkCentre Station" ,ALC283_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x17aa ,0x3176 ,"ThinkCentre Station" ,ALC283_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x17aa ,0x3178 ,"ThinkCentre Station" ,ALC283_FIXUP_HEADSET_MIC ), +SND_PCI_QUIRK (0x17aa ,0x31af ,"ThinkCentre Station" ,ALC623_FIXUP_LENOVO_THINKSTATION_P340 ),SND_PCI_QUIRK (0x17aa ,0x3818 ,"Lenovo C940" ,ALC298_FIXUP_LENOVO_SPK_VOLUME ),SND_PCI_QUIRK (0x17aa ,0x3827 ,"Ideapad S740" ,ALC285_FIXUP_IDEAPAD_S740_COEF ), SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
Greg Kroah-Hartman
maintainerPATCH 152/223 ALSA: hdmi: Expose all pins on MSI MS-7C94 board
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 33f735f137c6539e3ceceb515cd1e2a644005b49 upstream.
The BIOS on MSI Mortar B550m WiFi (MS-7C94) board with AMDGPU seems disabling the other pins than HDMI although it has more outputs including DP.
This patch adds the board to the allow list for enabling all pins.
--- sound/pci/hda/patch_hdmi.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_hdmi.c +1 -0
@@ -1940,6 +1940,7 @@ static int hdmi_add_cvt(struct hda_codecstatic const struct snd_pci_quirk force_connect_list[] = {SND_PCI_QUIRK (0x103c ,0x870f ,"HP" ,1 ),SND_PCI_QUIRK (0x103c ,0x871a ,"HP" ,1 ), +SND_PCI_QUIRK (0x1462 ,0xec94 ,"MS-7C94" ,1 ), {} };
Greg Kroah-Hartman
maintainerPATCH 153/223 ALSA: pcm: Call substream ack() method upon compat mmap commit
In reply to Greg Kroah-HartmanFrom: Alan Young <[email protected]>
commit 2e2832562c877e6530b8480982d99a4ff90c6777 upstream.
If a 32-bit application is being used with a 64-bit kernel and is using the mmap mechanism to write data, then the SNDRV_PCM_IOCTL_SYNC_PTR ioctl results in calling snd_pcm_ioctl_sync_ptr_compat(). Make this use pcm_lib_apply_appl_ptr() so that the substream's ack() method, if defined, is called.
The snd_pcm_sync_ptr() function, used in the 64-bit ioctl case, already uses snd_pcm_ioctl_sync_ptr_compat().
--- sound/core/pcm_native.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
sound/core/pcm_native.c +8 -3
@@ -3057,9 +3057,14 @@ static int snd_pcm_ioctl_sync_ptr_compat boundary =0x7fffffff ;snd_pcm_stream_lock_irq (substream);/* FIXME: we should consider the boundary for the sync from app */ -if (!(sflags &SNDRV_PCM_SYNC_PTR_APPL )) - control->appl_ptr = scontrol.appl_ptr; -else +if (!(sflags &SNDRV_PCM_SYNC_PTR_APPL )) { + err =pcm_lib_apply_appl_ptr (substream, + scontrol.appl_ptr); +if (err <0 ) { +snd_pcm_stream_unlock_irq (substream); +return err; + } + }else scontrol.appl_ptr = control->appl_ptr % boundary;if (!(sflags &SNDRV_PCM_SYNC_PTR_AVAIL_MIN )) control->avail_min = scontrol.avail_min;
Greg Kroah-Hartman
maintainerPATCH 154/223 ALSA: pcm: Fix mmap capability check
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit c4824ae7db418aee6f50f308a20b832e58e997fd upstream.
The hw_support_mmap() doesn't cover all memory allocation types and might use a wrong device pointer for checking the capability. Check the all memory allocation types more completely.
--- sound/core/pcm_native.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
sound/core/pcm_native.c +10 -4
@@ -246,12 +246,18 @@ static bool hw_support_mmap(struct snd_pif (!(substream->runtime->hw.info &SNDRV_PCM_INFO_MMAP ))return false; -if (substream->ops->mmap || - (substream->dma_buffer.dev.type !=SNDRV_DMA_TYPE_DEV && - substream->dma_buffer.dev.type !=SNDRV_DMA_TYPE_DEV_UC )) +if (substream->ops->mmap)return true; -return dma_can_mmap (substream->dma_buffer.dev.dev); +switch (substream->dma_buffer.dev.type) { +case SNDRV_DMA_TYPE_UNKNOWN : +return false; +case SNDRV_DMA_TYPE_CONTINUOUS : +case SNDRV_DMA_TYPE_VMALLOC : +return true; +default : +return dma_can_mmap (substream->dma_buffer.dev.dev); + } } static int constrain_mask_params(struct snd_pcm_substream *substream,
Greg Kroah-Hartman
maintainerPATCH 155/223 Revert "usb: renesas-xhci: Fix handling of unknown ROM state"
In reply to Greg Kroah-HartmanFrom: Moritz Fischer <[email protected]>
commit 44cf53602f5a0db80d53c8fff6cdbcae59650a42 upstream.
This reverts commit d143825baf15f204dac60acdf95e428182aa3374.
Justin reports some of his systems now fail as result of this commit:
xhci_hcd 0000:04:00.0: Direct firmware load for renesas_usb_fw.mem failed with error -2 xhci_hcd 0000:04:00.0: request_firmware failed: -2
xhci_hcd: probe of 0000:04:00.0 failed with error -2
The revert brings back the original issue the commit tried to solve but at least unbreaks existing systems relying on previous behavior.
--- drivers/usb/host/xhci-pci-renesas.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/usb/host/xhci-pci-renesas.c +8 -8
@@ -207,8 +207,7 @@ static int renesas_check_rom_state(strucreturn 0 ;case RENESAS_ROM_STATUS_NO_RESULT :/* No result yet */ -dev_dbg (&pdev->dev,"Unknown ROM status ...\n" ); -break ; +return 0 ;case RENESAS_ROM_STATUS_ERROR :/* Error State */ default :/* All other states are marked as "Reserved states" */
@@ -225,12 +224,13 @@ static int renesas_fw_check_running(struu8 fw_state;int err; -/* -* Only if device has ROM and loaded FW we can skip loading and -* return success. Otherwise (even unknown state), attempt to load FW. -*/ -if (renesas_check_rom (pdev) && !renesas_check_rom_state (pdev)) -return 0 ; +/* Check if device has ROM and loaded, if so skip everything */ + err =renesas_check_rom (pdev); +if (err) {/* we have rom */ + err =renesas_check_rom_state (pdev); +if (!err) +return err; + }/* * Test if the device is actually needing the firmware. As most
Greg Kroah-Hartman
maintainerPATCH 156/223 usb: xhci: avoid renesas_usb_fw.mem when its unusable
In reply to Greg Kroah-HartmanFrom: Greg Thelen <[email protected]>
commit 0665e387318607d8269bfdea60723c627c8bae43 upstream.
Commit a66d21d7dba8 ("usb: xhci: Add support for Renesas controller with memory") added renesas_usb_fw.mem firmware reference to xhci-pci. Thus modinfo indicates xhci-pci.ko has "firmware: renesas_usb_fw.mem". But the firmware is only actually used with CONFIG_USB_XHCI_PCI_RENESAS. An unusable firmware reference can trigger safety checkers which look for drivers with unmet firmware dependencies.
Avoid referring to renesas_usb_fw.mem in circumstances when it cannot be loaded (when CONFIG_USB_XHCI_PCI_RENESAS isn't set).
--- drivers/usb/host/xhci-pci.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/usb/host/xhci-pci.c +7 -0
@@ -636,7 +636,14 @@ static const struct pci_device_id pci_id {/* end: all zeroes */ } };MODULE_DEVICE_TABLE (pci, pci_ids); + +/* +* Without CONFIG_USB_XHCI_PCI_RENESAS renesas_xhci_check_request_fw() won't +* load firmware, so don't encumber the xhci-pci driver with it. +*/ +#if IS_ENABLED (CONFIG_USB_XHCI_PCI_RENESAS )MODULE_FIRMWARE ("renesas_usb_fw.mem" ); +#endif /* pci driver glue; this is a "new style" PCI driver module */ static struct pci_driver xhci_pci_driver = {
Greg Kroah-Hartman
maintainerPATCH 157/223 xhci: Fix lost USB 2 remote wake
In reply to Greg Kroah-HartmanFrom: Mathias Nyman <[email protected]>
commit 72f68bf5c756f5ce1139b31daae2684501383ad5 upstream.
There's a small window where a USB 2 remote wake may be left unhandled due to a race between hub thread and xhci port event interrupt handler.
When the resume event is detected in the xhci interrupt handler it kicks the hub timer, which should move the port from resume to U0 once resume has been signalled for long enough.
To keep the hub "thread" running we set a bus_state->resuming_ports flag. This flag makes sure hub timer function kicks itself.
checking this flag was not properly protected by the spinlock. Flag was copied to a local variable before lock was taken. The local variable was then checked later with spinlock held.
If interrupt is handled right after copying the flag to the local variable we end up stopping the hub thread before it can handle the USB 2 resume.
CPU0 CPU1
(hub thread) (xhci event handler)
xhci_hub_status_data()
status = bus_state->resuming_ports; <Interrupt> handle_port_status() spin_lock() bus_state->resuming_ports = 1 set_flag(HCD_FLAG_POLL_RH) spin_unlock()
spin_lock()
if (!status)
clear_flag(HCD_FLAG_POLL_RH)spin_unlock()
Fix this by taking the lock a bit earlier so that it covers the resuming_ports flag copy in the hub thread
--- drivers/usb/host/xhci-hub.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-hub.c +2 -1
@@ -1638,11 +1638,12 @@ int xhci_hub_status_data(struct usb_hcd* Inform the usbcore about resume-in-progress by returning * a non-zero value even if there are no status changes. */ +spin_lock_irqsave (&xhci->lock, flags); + status = bus_state->resuming_ports; mask =PORT_CSC |PORT_PEC |PORT_OCC |PORT_PLC |PORT_WRC |PORT_CEC ; -spin_lock_irqsave (&xhci->lock, flags);/* For each port, did anything change? If so, set that bit in buf. */ for (i =0 ; i < max_ports; i++) { temp =readl (ports[i]->addr);
Greg Kroah-Hartman
maintainerPATCH 158/223 usb: ehci: Prevent missed ehci interrupts with edge-triggered MSI
In reply to Greg Kroah-HartmanFrom: David Jeffery <[email protected]>
commit 0b60557230adfdeb8164e0b342ac9cd469a75759 upstream.
When MSI is used by the ehci-hcd driver, it can cause lost interrupts which results in EHCI only continuing to work due to a polling fallback. But the reliance of polling drastically reduces performance of any I/O through EHCI.
Interrupts are lost as the EHCI interrupt handler does not safely handle edge-triggered interrupts. It fails to ensure all interrupt status bits are cleared, which works with level-triggered interrupts but not the edge-triggered interrupts typical from using MSI.
To fix this problem, check if the driver may have raced with the hardware setting additional interrupt status bits and clear status until it is in a stable state.
--- drivers/usb/host/ehci-hcd.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
drivers/usb/host/ehci-hcd.c +14 -4
@@ -703,24 +703,28 @@ EXPORT_SYMBOL_GPL(ehci_setup);static irqreturn_t ehci_irq (struct usb_hcd *hcd) {struct ehci_hcd *ehci =hcd_to_ehci (hcd); -u32 status, masked_status, pcd_status =0 , cmd; +u32 status, current_status, masked_status, pcd_status =0 ; +u32 cmd;int bh;spin_lock (&ehci->lock); - status =ehci_readl (ehci, &ehci->regs->status); + status =0 ; + current_status =ehci_readl (ehci, &ehci->regs->status); +restart:/* e.g. cardbus physical eject */ -if (status == ~(u32 )0 ) { +if (current_status == ~(u32 )0 ) {ehci_dbg (ehci,"device removed\n" ); goto dead; } + status |= current_status;/* * We don't use STS_FLR, but some controllers don't like it to * remain on, so mask it out along with the other status bits. */ - masked_status = status & (INTR_MASK |STS_FLR ); + masked_status = current_status & (INTR_MASK |STS_FLR );/* Shared IRQ? */ if (!masked_status ||unlikely (ehci->rh_state ==EHCI_RH_HALTED )) {
@@ -730,6 +734,12 @@ static irqreturn_t ehci_irq (struct usb_/* clear (just) interrupts */ ehci_writel (ehci, masked_status, &ehci->regs->status); + +/* For edge interrupts, don't race with an interrupt bit being raised */ + current_status =ehci_readl (ehci, &ehci->regs->status); +if (current_status &INTR_MASK ) + goto restart; + cmd =ehci_readl (ehci, &ehci->regs->command); bh =0 ;
Greg Kroah-Hartman
maintainerPATCH 159/223 KVM: PPC: Book3S: Fix H_RTAS rets buffer overflow
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
commit f62f3c20647ebd5fb6ecb8f0b477b9281c44c10a upstream.
The kvmppc_rtas_hcall() sets the host rtas_args.rets pointer based on the rtas_args.nargs that was provided by the guest. That guest nargs value is not range checked, so the guest can cause the host rets pointer to be pointed outside the args array. The individual rtas function handlers check the nargs and nrets values to ensure they are correct, but if they are not, the handlers store a -3 (0xfffffffd) failure indication in rets[0] which corrupts host memory.
Fix this by testing up front whether the guest supplied nargs and nret would exceed the array size, and fail the hcall directly without storing a failure indication to rets[0].
Also expand on a comment about why we kill the guest and try not to return errors directly if we have a valid rets[0] pointer.
--- arch/powerpc/kvm/book3s_rtas.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)
arch/powerpc/kvm/book3s_rtas.c +22 -3
@@ -242,6 +242,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *v* value so we can restore it on the way out. */ orig_rets = args.rets; +if (be32_to_cpu (args.nargs) >=ARRAY_SIZE (args.args)) { +/* +* Don't overflow our args array: ensure there is room for +* at least rets[0] (even if the call specifies 0 nret). +* +* Each handler must then check for the correct nargs and nret +* values, but they may always return failure in rets[0]. +*/ + rc = -EINVAL ; + goto fail; + } args.rets = &args.args[be32_to_cpu (args.nargs)];mutex_lock (&vcpu->kvm->arch.rtas_token_lock);
@@ -269,9 +280,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *v fail:/* * We only get here if the guest has called RTAS with a bogus -* args pointer. That means we can't get to the args, and so we -* can't fail the RTAS call. So fail right out to userspace, -* which should kill the guest. +* args pointer or nargs/nret values that would overflow the +* array. That means we can't get to the args, and so we can't +* fail the RTAS call. So fail right out to userspace, which +* should kill the guest. +* +* SLOF should actually pass the hcall return value from the +* rtas handler call in r3, so enter_rtas could be modified to +* return a failure indication in r3 and we could return such +* errors to the guest rather than failing to host userspace. +* However old guests that don't test for failure could then +* continue silently after errors, so for now we won't do this. */ return rc; }
Greg Kroah-Hartman
maintainerPATCH 160/223 KVM: PPC: Book3S HV Nested: Sanitise H_ENTER_NESTED TM state
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
commit d9c57d3ed52a92536f5fa59dc5ccdd58b4875076 upstream.
The H_ENTER_NESTED hypercall is handled by the L0, and it is a request by the L1 to switch the context of the vCPU over to that of its L2 guest, and return with an interrupt indication. The L1 is responsible for switching some registers to guest context, and the L0 switches others (including all the hypervisor privileged state).
If the L2 MSR has TM active, then the L1 is responsible for recheckpointing the L2 TM state. Then the L1 exits to L0 via the H_ENTER_NESTED hcall, and the L0 saves the TM state as part of the exit, and then it recheckpoints the TM state as part of the nested entry and finally HRFIDs into the L2 with TM active MSR. Not efficient, but about the simplest approach for something that's horrendously complicated.
Problems arise if the L1 exits to the L0 with a TM state which does not match the L2 TM state being requested. For example if the L1 is transactional but the L2 MSR is non-transactional, or vice versa. The L0's HRFID can take a TM Bad Thing interrupt and crash.
Fix this by disallowing H_ENTER_NESTED in TM[T] state entirely, and then ensuring that if the L1 is suspended then the L2 must have TM active, and if the L1 is not suspended then the L2 must not have TM active.
--- arch/powerpc/kvm/book3s_hv_nested.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
arch/powerpc/kvm/book3s_hv_nested.c +20 -0
@@ -301,6 +301,9 @@ long kvmhv_enter_nested_guest(struct kvmif (vcpu->kvm->arch.l1_ptcr ==0 )return H_NOT_AVAILABLE ; +if (MSR_TM_TRANSACTIONAL (vcpu->arch.shregs.msr)) +return H_BAD_MODE ; +/* copy parameters in */ hv_ptr =kvmppc_get_gpr (vcpu,4 ); regs_ptr =kvmppc_get_gpr (vcpu,5 );
@@ -321,6 +324,23 @@ long kvmhv_enter_nested_guest(struct kvmif (l2_hv.vcpu_token >=NR_CPUS )return H_PARAMETER ; +/* +* L1 must have set up a suspended state to enter the L2 in a +* transactional state, and only in that case. These have to be +* filtered out here to prevent causing a TM Bad Thing in the +* host HRFID. We could synthesize a TM Bad Thing back to the L1 +* here but there doesn't seem like much point. +*/ +if (MSR_TM_SUSPENDED (vcpu->arch.shregs.msr)) { +if (!MSR_TM_ACTIVE (l2_regs.msr)) +return H_BAD_MODE ; + }else { +if (l2_regs.msr &MSR_TS_MASK ) +return H_BAD_MODE ; +if (WARN_ON_ONCE (vcpu->arch.shregs.msr &MSR_TS_MASK )) +return H_BAD_MODE ; + } +/* translate lpid */ l2 =kvmhv_get_nested (vcpu->kvm, l2_hv.lpid, true);if (!l2)