5.4.52-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 5.4.52-rc1 review
This is the start of the stable review cycle for the 5.4.52 release. There are 109 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 16 Jul 2020 18:40:38 +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.4.52-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.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.4.52-rc1
Uwe Kleine-König <[email protected]>
pwm: jz4740: Fix build failure
Adrian Hunter <[email protected]>
perf scripts python: exported-sql-viewer.py: Fix unexpanded 'Find' result
Adrian Hunter <[email protected]>
perf scripts python: exported-sql-viewer.py: Fix zero id in call tree 'Find' result
Adrian Hunter <[email protected]>
perf scripts python: exported-sql-viewer.py: Fix zero id in call graph 'Find' result
Adrian Hunter <[email protected]>
perf scripts python: export-to-postgresql.py: Fix struct.pack() int argument
Michal Suchanek <[email protected]>
dm writecache: reject asynchronous pmem devices
Ming Lei <[email protected]>
blk-mq: consider non-idle request as "inflight" in blk_mq_rq_inflight()
Janosch Frank <[email protected]>
s390/mm: fix huge pte soft dirty copying
Vasily Gorbik <[email protected]>
s390/setup: init jump labels before command line parsing
Vineet Gupta <[email protected]>
ARC: elf: use right ELF_ARCH
Vineet Gupta <[email protected]>
ARC: entry: fix potential EFA clobber when TIF_SYSCALL_TRACE
Neil Armstrong <[email protected]>
mmc: meson-gx: limit segments to 1 when dram-access-quirk is needed
Mikulas Patocka <[email protected]>
dm: use noio when sending kobject event
Marek Olšák <[email protected]>
drm/amdgpu: don't do soft recovery if gpu_recovery=0
Tom Rix <[email protected]>
drm/radeon: fix double free
Josef Bacik <[email protected]>
btrfs: fix double put of block group with nocow
Boris Burkov <[email protected]>
btrfs: fix fatal extent_buffer readahead vs releasepage race
Greg Kroah-Hartman <[email protected]>
Revert "ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb"
Kees Cook <[email protected]>
bpf: Check correct cred for CAP_SYSLOG in bpf_dump_raw_ok()
Kees Cook <[email protected]>
kprobes: Do not expose probe addresses to non-CAP_SYSLOG
Kees Cook <[email protected]>
module: Do not expose section addresses to non-CAP_SYSLOG
Kees Cook <[email protected]>
module: Refactor section attr into bin attribute
Kees Cook <[email protected]>
kallsyms: Refactor kallsyms_show_value() to take cred
Steven Price <[email protected]>
KVM: arm64: Fix kvm_reset_vcpu() return code being incorrect with SVE
Sean Christopherson <[email protected]>
KVM: x86: Mark CR4.TSD as being possibly owned by the guest
Sean Christopherson <[email protected]>
KVM: x86: Inject #GP if guest attempts to toggle CR4.LA57 in 64-bit mode
Paolo Bonzini <[email protected]>
KVM: x86: bit 8 of non-leaf PDPEs is not reserved
Alexandru Elisei <[email protected]>
KVM: arm64: Annotate hyp NMI-related functions as __always_inline
Andrew Scull <[email protected]>
KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART
Will Deacon <[email protected]>
KVM: arm64: Fix definition of PAGE_HYP_DEVICE
Jian-Hong Pan <[email protected]>
ALSA: hda/realtek: Enable headset mic of Acer Veriton N4660G with ALC269VC
Jian-Hong Pan <[email protected]>
ALSA: hda/realtek: Enable headset mic of Acer C20-820 with ALC269VC
Jian-Hong Pan <[email protected]>
ALSA: hda/realtek - Enable audio jacks of Acer vCopperbox with ALC269VC
Benjamin Poirier <[email protected]>
ALSA: hda/realtek - Fix Lenovo Thinkpad X1 Carbon 7th quirk subdevice id
Pavel Hofman <[email protected]>
ALSA: usb-audio: Add implicit feedback quirk for RTX6001
Hector Martin <[email protected]>
ALSA: usb-audio: add quirk for MacroSilicon MS2109
Hui Wang <[email protected]>
ALSA: hda - let hs_mic be picked ahead of hp_mic
xidongwang <[email protected]>
ALSA: opl3: fix infoleak in opl3
Kaike Wan <[email protected]>
IB/hfi1: Do not destroy link_wq when the device is shut down
Kaike Wan <[email protected]>
IB/hfi1: Do not destroy hfi1_wq when the device is shut down
Ido Schimmel <[email protected]>
mlxsw: pci: Fix use-after-free in case of failed devlink reload
Ido Schimmel <[email protected]>
mlxsw: spectrum_router: Remove inappropriate usage of WARN_ON()
Nicolas Ferre <[email protected]>
net: macb: fix call to pm_runtime in the suspend/resume functions
Nicolas Ferre <[email protected]>
net: macb: mark device wake capable when "magic-packet" property present
Nicolas Ferre <[email protected]>
net: macb: fix wakeup test in runtime suspend/resume routines
Davide Caratti <[email protected]>
bnxt_en: fix NULL dereference in case SR-IOV configuration fails
Aya Levin <[email protected]>
net/mlx5e: Fix 50G per lane indication
Eran Ben Elisha <[email protected]>
net/mlx5: Fix eeprom support for SFP module
Sudarsana Reddy Kalluru <[email protected]>
qed: Populate nvm-file attributes while reading nvm config partition.
Aya Levin <[email protected]>
IB/mlx5: Fix 50G per lane indication
Rahul Lakkireddy <[email protected]>
cxgb4: fix all-mask IP address comparison
Zheng Bin <[email protected]>
nbd: Fix memory leak in nbd_add_socket
Wei Li <[email protected]>
arm64: kgdb: Fix single-step exception handling oops
Kamal Heib <[email protected]>
RDMA/siw: Fix reporting vendor_part_id
Vinod Koul <[email protected]>
ALSA: compress: fix partial_drain completion state
Yonglong Liu <[email protected]>
net: hns3: fix use-after-free when doing self test
Huazhong Tan <[email protected]>
net: hns3: add a missing uninit debugfs when unload driver
Andre Edich <[email protected]>
smsc95xx: avoid memory leak in smsc95xx_bind
Andre Edich <[email protected]>
smsc95xx: check return value of smsc95xx_reset
Adrian Hunter <[email protected]>
perf intel-pt: Fix PEBS sample for XMM registers
Adrian Hunter <[email protected]>
perf intel-pt: Fix recording PEBS-via-PT with registers
Wei Li <[email protected]>
perf report TUI: Fix segmentation fault in perf_evsel__hists_browse()
Pablo Neira Ayuso <[email protected]>
netfilter: conntrack: refetch conntrack after nf_conntrack_update()
Codrin Ciubotariu <[email protected]>
net: dsa: microchip: set the correct number of ports
Divya Indi <[email protected]>
IB/sa: Resolv use-after-free in ib_nl_make_request()
Li Heng <[email protected]>
net: cxgb4: fix return error value in t4_prep_fw
Russell King <[email protected]>
net: mvneta: fix use of state->speed
Eric Dumazet <[email protected]>
netfilter: ipset: call ip_set_free() instead of kfree()
John Fastabend <[email protected]>
bpf, sockmap: RCU dereferenced psock may be used outside RCU block
John Fastabend <[email protected]>
bpf, sockmap: RCU splat with redirect and strparser error or TLS
Hsin-Yi Wang <[email protected]>
drm/mediatek: Check plane visibility in atomic_update
Luca Coelho <[email protected]>
nl80211: don't return err unconditionally in nl80211_start_ap()
Andy Shevchenko <[email protected]>
gpio: pca953x: Fix GPIO resource leak on Intel Galileo Gen 2
Andy Shevchenko <[email protected]>
gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2
Dan Carpenter <[email protected]>
net: qrtr: Fix an out of bounds read qrtr_endpoint_post()
Scott Wood <[email protected]>
sched/core: Check cpus_mask, not cpus_ptr in __set_cpus_allowed_ptr(), to fix mask corruption
Peter Zijlstra <[email protected]>
x86/entry: Increase entry_stack size to a full page
Max Gurtovoy <[email protected]>
nvme-rdma: assign completion vector correctly
Chengguang Xu <[email protected]>
block: release bip in a right way in error path
Aditya Pakki <[email protected]>
usb: dwc3: pci: Fix reference count leak in dwc3_pci_resume_work
Tomas Henzl <[email protected]>
scsi: mptscsih: Fix read sense data size
yu kuai <[email protected]>
ARM: imx6: add missing put_device() call in imx6q_suspend_init()
Zhang Xiaoxu <[email protected]>
cifs: update ctime and mtime during truncate
Maxime Ripard <[email protected]>
drm/sun4i: mixer: Call of_dma_configure if there's an IOMMU
Vasily Gorbik <[email protected]>
s390/kasan: fix early pgm check handler execution
Hans de Goede <[email protected]>
drm: panel-orientation-quirks: Use generic orientation-data for Acer S1003
Hans de Goede <[email protected]>
drm: panel-orientation-quirks: Add quirk for Asus T101HA panel
Rajat Jain <[email protected]>
iommu/vt-d: Don't apply gfx quirks to untrusted devices
Aneesh Kumar K.V <[email protected]>
powerpc/kvm/book3s64: Fix kernel crash with nested kvm & DEBUG_VIRTUAL
Dany Madden <[email protected]>
ibmvnic: continue to init in CRQ reset returns H_CLOSED
Ciara Loftus <[email protected]>
i40e: protect ring accesses with READ- and WRITE_ONCE
Ciara Loftus <[email protected]>
ixgbe: protect ring accesses with READ- and WRITE_ONCE
Sascha Hauer <[email protected]>
net: ethernet: mvneta: Add 2500BaseX support for SoCs without comphy
Sascha Hauer <[email protected]>
net: ethernet: mvneta: Fix Serdes configuration for SoCs without comphy
Zhenzhong Duan <[email protected]>
spi: spidev: fix a potential use-after-free in spidev_release()
Zhenzhong Duan <[email protected]>
spi: spidev: fix a race between spidev_release and spidev_remove
Pierre-Louis Bossart <[email protected]>
ALSA: hda: Intel: add missing PCI IDs for ICL-H, TGL-H and EKL
Pierre-Louis Bossart <[email protected]>
ASoC: SOF: Intel: add PCI ID for CometLake-S
Linus Walleij <[email protected]>
drm: mcde: Fix display initialization problem
Thierry Reding <[email protected]>
gpu: host1x: Detach driver on unregister
Nicolin Chen <[email protected]>
drm/tegra: hub: Do not enable orphaned window group
Xiyu Yang <[email protected]>
drm/ttm: Fix dma_fence refcnt leak when adding move fence
Tony Lindgren <[email protected]>
ARM: dts: omap4-droid4: Fix spi configuration and increase rate
Stephane Eranian <[email protected]>
perf/x86/rapl: Fix RAPL config variable bug
Stephane Eranian <[email protected]>
perf/x86/rapl: Move RAPL support to common x86 code
Jens Thoms Toerring <[email protected]>
regmap: fix alignment issue
Krzysztof Kozlowski <[email protected]>
spi: spi-fsl-dspi: Fix lockup if device is removed during SPI transfer
Peng Ma <[email protected]>
spi: spi-fsl-dspi: Adding shutdown hook
Christian Borntraeger <[email protected]>
KVM: s390: reduce number of IO pins to 1
-------------
Diffstat:
Makefile | 4 +-
arch/arc/include/asm/elf.h | 2 +-
arch/arc/kernel/entry.S | 16 ++--
arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi | 4 +-
arch/arm/mach-imx/pm-imx6.c | 10 ++-
arch/arm64/include/asm/arch_gicv3.h | 2 +-
arch/arm64/include/asm/cpufeature.h | 2 +-
arch/arm64/include/asm/pgtable-prot.h | 2 +-
arch/arm64/kernel/kgdb.c | 2 +-
arch/arm64/kvm/hyp-init.S | 11 ++-
arch/arm64/kvm/reset.c | 10 ++-
arch/powerpc/kvm/book3s_64_mmu_radix.c | 3 +-
arch/s390/include/asm/kvm_host.h | 8 +-
arch/s390/kernel/early.c | 2 +
arch/s390/kernel/setup.c | 1 +
arch/s390/mm/hugetlbpage.c | 2 +-
arch/x86/events/Kconfig | 6 +-
arch/x86/events/Makefile | 1 +
arch/x86/events/intel/Makefile | 2 -
arch/x86/events/{intel => }/rapl.c | 9 +-
arch/x86/include/asm/processor.h | 2 +-
arch/x86/kvm/kvm_cache_regs.h | 2 +-
arch/x86/kvm/mmu.c | 2 +-
arch/x86/kvm/vmx/vmx.c | 2 +
arch/x86/kvm/x86.c | 2 +
block/bio-integrity.c | 23 +++--
block/blk-mq.c | 4 +-
drivers/base/regmap/regmap.c | 100 ++++++++++-----------
drivers/block/nbd.c | 25 +++---
drivers/gpio/gpio-pca953x.c | 84 +++++++++++++++++
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 3 +-
drivers/gpu/drm/drm_panel_orientation_quirks.c | 14 +--
drivers/gpu/drm/mcde/mcde_drv.c | 3 +-
drivers/gpu/drm/mediatek/mtk_drm_plane.c | 25 +++---
drivers/gpu/drm/radeon/ci_dpm.c | 7 +-
drivers/gpu/drm/sun4i/sun8i_mixer.c | 13 +++
drivers/gpu/drm/tegra/hub.c | 8 +-
drivers/gpu/drm/ttm/ttm_bo.c | 4 +-
drivers/gpu/host1x/bus.c | 9 ++
drivers/infiniband/core/sa_query.c | 38 ++++----
drivers/infiniband/hw/hfi1/init.c | 37 ++++++--
drivers/infiniband/hw/hfi1/qp.c | 5 +-
drivers/infiniband/hw/hfi1/tid_rdma.c | 5 +-
drivers/infiniband/hw/mlx5/main.c | 2 +-
drivers/infiniband/sw/siw/siw_main.c | 3 +-
drivers/iommu/intel-iommu.c | 37 ++++++++
drivers/md/dm-writecache.c | 6 ++
drivers/md/dm.c | 15 +++-
drivers/message/fusion/mptscsih.c | 4 +-
drivers/mmc/host/meson-gx-mmc.c | 6 +-
drivers/net/dsa/microchip/ksz8795.c | 3 +
drivers/net/dsa/microchip/ksz9477.c | 3 +
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 2 +-
drivers/net/ethernet/cadence/macb_main.c | 12 +--
drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 10 +--
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | 8 +-
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 3 +-
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c | 9 +-
drivers/net/ethernet/ibm/ibmvnic.c | 9 +-
drivers/net/ethernet/intel/i40e/i40e_main.c | 29 +++---
drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c | 12 +--
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 14 ++-
drivers/net/ethernet/marvell/mvneta.c | 88 ++++++++++--------
drivers/net/ethernet/mellanox/mlx5/core/en/port.c | 21 ++++-
drivers/net/ethernet/mellanox/mlx5/core/en/port.h | 2 +-
.../net/ethernet/mellanox/mlx5/core/en_ethtool.c | 8 +-
drivers/net/ethernet/mellanox/mlx5/core/port.c | 93 +++++++++++++++----
drivers/net/ethernet/mellanox/mlxsw/pci.c | 54 +++++++----
.../net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 +-
drivers/net/ethernet/qlogic/qed/qed_debug.c | 4 +
drivers/net/ethernet/qlogic/qed/qed_dev.c | 12 +--
drivers/net/ethernet/qlogic/qed/qed_mcp.c | 7 ++
drivers/net/ethernet/qlogic/qed/qed_mcp.h | 7 ++
drivers/net/usb/smsc95xx.c | 9 +-
drivers/net/wireless/ath/ath9k/hif_usb.c | 48 +++-------
drivers/net/wireless/ath/ath9k/hif_usb.h | 5 --
drivers/nvme/host/rdma.c | 2 +-
drivers/pwm/pwm-jz4740.c | 5 +-
drivers/spi/spi-fsl-dspi.c | 34 ++++++-
drivers/spi/spidev.c | 24 ++---
drivers/usb/dwc3/dwc3-pci.c | 4 +-
fs/btrfs/extent_io.c | 40 +++++----
fs/btrfs/inode.c | 9 +-
fs/cifs/inode.c | 9 ++
include/linux/filter.h | 4 +-
include/linux/kallsyms.h | 5 +-
include/sound/compress_driver.h | 10 ++-
kernel/bpf/syscall.c | 32 ++++---
kernel/kallsyms.c | 17 ++--
kernel/kprobes.c | 4 +-
kernel/module.c | 51 ++++++-----
kernel/sched/core.c | 2 +-
net/core/skmsg.c | 23 +++--
net/core/sysctl_net_core.c | 2 +-
net/netfilter/ipset/ip_set_bitmap_ip.c | 2 +-
net/netfilter/ipset/ip_set_bitmap_ipmac.c | 2 +-
net/netfilter/ipset/ip_set_bitmap_port.c | 2 +-
net/netfilter/ipset/ip_set_hash_gen.h | 4 +-
net/netfilter/nf_conntrack_core.c | 2 +
net/qrtr/qrtr.c | 6 +-
net/wireless/nl80211.c | 3 +-
sound/core/compress_offload.c | 4 +
sound/drivers/opl3/opl3_synth.c | 2 +
sound/pci/hda/hda_auto_parser.c | 6 ++
sound/pci/hda/hda_intel.c | 8 ++
sound/pci/hda/patch_realtek.c | 38 +++++++-
sound/soc/sof/sof-pci-dev.c | 2 +
sound/usb/pcm.c | 1 +
sound/usb/quirks-table.h | 52 +++++++++++
tools/perf/arch/x86/util/intel-pt.c | 1 +
tools/perf/scripts/python/export-to-postgresql.py | 2 +-
tools/perf/scripts/python/exported-sql-viewer.py | 7 +-
tools/perf/ui/browsers/hists.c | 17 ++--
tools/perf/util/evsel.c | 4 +-
tools/perf/util/intel-pt.c | 5 +-
115 files changed, 1025 insertions(+), 485 deletions(-)Greg Kroah-Hartman
maintainerPATCH 1/109 KVM: s390: reduce number of IO pins to 1
From: Christian Borntraeger <[email protected]>
[ Upstream commit 774911290c589e98e3638e73b24b0a4d4530e97c ]
The current number of KVM_IRQCHIP_NUM_PINS results in an order 3 allocation (32kb) for each guest start/restart. This can result in OOM killer activity even with free swap when the memory is fragmented enough:
kernel: qemu-system-s39 invoked oom-killer: gfp_mask=0x440dc0(GFP_KERNEL_ACCOUNT|__GFP_COMP|__GFP_ZERO), order=3, oom_score_adj=0 kernel: CPU: 1 PID: 357274 Comm: qemu-system-s39 Kdump: loaded Not tainted 5.4.0-29-generic #33-Ubuntu kernel: Hardware name: IBM 8562 T02 Z06 (LPAR) kernel: Call Trace: kernel: ([<00000001f848fe2a>] show_stack+0x7a/0xc0) kernel: [<00000001f8d3437a>] dump_stack+0x8a/0xc0 kernel: [<00000001f8687032>] dump_header+0x62/0x258 kernel: [<00000001f8686122>] oom_kill_process+0x172/0x180 kernel: [<00000001f8686abe>] out_of_memory+0xee/0x580 kernel: [<00000001f86e66b8>] __alloc_pages_slowpath+0xd18/0xe90 kernel: [<00000001f86e6ad4>] __alloc_pages_nodemask+0x2a4/0x320 kernel: [<00000001f86b1ab4>] kmalloc_order+0x34/0xb0 kernel: [<00000001f86b1b62>] kmalloc_order_trace+0x32/0xe0 kernel: [<00000001f84bb806>] kvm_set_irq_routing+0xa6/0x2e0 kernel: [<00000001f84c99a4>] kvm_arch_vm_ioctl+0x544/0x9e0 kernel: [<00000001f84b8936>] kvm_vm_ioctl+0x396/0x760 kernel: [<00000001f875df66>] do_vfs_ioctl+0x376/0x690 kernel: [<00000001f875e304>] ksys_ioctl+0x84/0xb0 kernel: [<00000001f875e39a>] __s390x_sys_ioctl+0x2a/0x40 kernel: [<00000001f8d55424>] system_call+0xd8/0x2c8
As far as I can tell s390x does not use the iopins as we bail our for anything other than KVM_IRQ_ROUTING_S390_ADAPTER and the chip/pin is only used for KVM_IRQ_ROUTING_IRQCHIP. So let us use a small number to reduce the memory footprint.
--- arch/s390/include/asm/kvm_host.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/s390/include/asm/kvm_host.h +4 -4
@@ -31,12 +31,12 @@#define KVM_USER_MEM_SLOTS 32/* -* These seem to be used for allocating ->chip in the routing table, -* which we don't use. 4096 is an out-of-thin-air value. If we need -* to look at ->chip later on, we'll need to revisit this. +* These seem to be used for allocating ->chip in the routing table, which we +* don't use. 1 is as small as we can get to reduce the needed memory. If we +* need to look at ->chip later on, we'll need to revisit this. */ #define KVM_NR_IRQCHIPS 1 -#define KVM_IRQCHIP_NUM_PINS 4096 +#define KVM_IRQCHIP_NUM_PINS 1#define KVM_HALT_POLL_NS_DEFAULT 50000/* s390-specific vcpu->requests bit members */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 2/109 spi: spi-fsl-dspi: Adding shutdown hook
In reply to Greg Kroah-HartmanFrom: Peng Ma <[email protected]>
[ Upstream commit dc234825997ec6ff05980ca9e2204f4ac3f8d695 ]
We need to ensure dspi controller could be stopped in order for kexec to start the next kernel.
So add the shutdown operation support.
--- drivers/spi/spi-fsl-dspi.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/spi/spi-fsl-dspi.c +23 -0
@@ -1,6 +1,7 @@// SPDX-License-Identifier: GPL-2.0+ // // Copyright 2013 Freescale Semiconductor, Inc. +// Copyright 2020 NXP // // Freescale DSPI driver // This file contains a driver for the Freescale DSPI
@@ -33,6 +34,9 @@#define SPI_MCR_CLR_TXF BIT(11)#define SPI_MCR_CLR_RXF BIT(10)#define SPI_MCR_XSPI BIT(3) +#define SPI_MCR_DIS_TXF BIT(13) +#define SPI_MCR_DIS_RXF BIT(12) +#define SPI_MCR_HALT BIT(0)#define SPI_TCR 0x08#define SPI_TCR_GET_TCNT (x) (((x) & GENMASK(31, 16)) >> 16)
@@ -1169,6 +1173,24 @@ static int dspi_remove(struct platform_device *pdev)return 0 ; } +static void dspi_shutdown (struct platform_device *pdev) +{ +struct spi_controller *ctlr =platform_get_drvdata (pdev); +struct fsl_dspi *dspi =spi_controller_get_devdata (ctlr); + +/* Disable RX and TX */ +regmap_update_bits (dspi->regmap,SPI_MCR , +SPI_MCR_DIS_TXF |SPI_MCR_DIS_RXF , +SPI_MCR_DIS_TXF |SPI_MCR_DIS_RXF ); + +/* Stop Running */ +regmap_update_bits (dspi->regmap,SPI_MCR ,SPI_MCR_HALT ,SPI_MCR_HALT ); + +dspi_release_dma (dspi); +clk_disable_unprepare (dspi->clk); +spi_unregister_controller (dspi->ctlr); +} +static struct platform_driver fsl_dspi_driver = { .driver.name =DRIVER_NAME , .driver.of_match_table = fsl_dspi_dt_ids,
@@ -1176,6 +1198,7 @@ static struct platform_driver fsl_dspi_driver = { .driver.pm = &dspi_pm, .probe = dspi_probe, .remove = dspi_remove, + .shutdown = dspi_shutdown, };module_platform_driver (fsl_dspi_driver);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 3/109 spi: spi-fsl-dspi: Fix lockup if device is removed during SPI transfer
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 7684580d45bd3d84ed9b453a4cadf7a9a5605a3f ]
During device removal, the driver should unregister the SPI controller and stop the hardware. Otherwise the dspi_transfer_one_message() could wait on completion infinitely.
Additionally, calling spi_unregister_controller() first in device removal reverse-matches the probe function, where SPI controller is registered at the end.
--- drivers/spi/spi-fsl-dspi.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/spi/spi-fsl-dspi.c +10 -1
@@ -1164,11 +1164,20 @@ static int dspi_remove(struct platform_device *pdev)struct fsl_dspi *dspi =spi_controller_get_devdata (ctlr);/* Disconnect from the SPI framework */ +spi_unregister_controller (dspi->ctlr); + +/* Disable RX and TX */ +regmap_update_bits (dspi->regmap,SPI_MCR , +SPI_MCR_DIS_TXF |SPI_MCR_DIS_RXF , +SPI_MCR_DIS_TXF |SPI_MCR_DIS_RXF ); + +/* Stop Running */ +regmap_update_bits (dspi->regmap,SPI_MCR ,SPI_MCR_HALT ,SPI_MCR_HALT ); +dspi_release_dma (dspi);if (dspi->irq)free_irq (dspi->irq, dspi);clk_disable_unprepare (dspi->clk); -spi_unregister_controller (dspi->ctlr);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 4/109 regmap: fix alignment issue
In reply to Greg Kroah-HartmanFrom: Jens Thoms Toerring <[email protected]>
[ Upstream commit 53d860952c8215cf9ae1ea33409c8cb71ad6ad3d ]
The assembly and disassembly of data to be sent to or received from a device invoke functions regmap_format_XX() and regmap_parse_XX() that extract or insert data items from or into a buffer, using assignments. In some cases the functions are called with a buffer pointer with an odd address. On architectures with strict alignment requirements this can result in a kernel crash. The assignments have been replaced by functions that take alignment into account.
--- drivers/base/regmap/regmap.c | 100 ++++++++++++++++------------------- 1 file changed, 46 insertions(+), 54 deletions(-)
drivers/base/regmap/regmap.c +46 -54
@@ -17,6 +17,7 @@#include <linux/delay.h> #include <linux/log2.h> #include <linux/hwspinlock.h> +#include <asm/unaligned.h> #define CREATE_TRACE_POINTS #include "trace.h"
@@ -249,22 +250,20 @@ static void regmap_format_8(void *buf, unsigned int val, unsigned int shift)static void regmap_format_16_be (void *buf,unsigned int val,unsigned int shift) { -__be16 *b = buf; - - b[0 ] =cpu_to_be16 (val << shift); +put_unaligned_be16 (val << shift, buf); }static void regmap_format_16_le (void *buf,unsigned int val,unsigned int shift) { -__le16 *b = buf; - - b[0 ] =cpu_to_le16 (val << shift); +put_unaligned_le16 (val << shift, buf); }static void regmap_format_16_native (void *buf,unsigned int val,unsigned int shift) { - *(u16 *)buf = val << shift; +u16 v = val << shift; + +memcpy (buf, &v,sizeof (v)); }static void regmap_format_24 (void *buf,unsigned int val,unsigned int shift)
@@ -280,43 +279,39 @@ static void regmap_format_24(void *buf, unsigned int val, unsigned int shift)static void regmap_format_32_be (void *buf,unsigned int val,unsigned int shift) { -__be32 *b = buf; - - b[0 ] =cpu_to_be32 (val << shift); +put_unaligned_be32 (val << shift, buf); }static void regmap_format_32_le (void *buf,unsigned int val,unsigned int shift) { -__le32 *b = buf; - - b[0 ] =cpu_to_le32 (val << shift); +put_unaligned_le32 (val << shift, buf); }static void regmap_format_32_native (void *buf,unsigned int val,unsigned int shift) { - *(u32 *)buf = val << shift; +u32 v = val << shift; + +memcpy (buf, &v,sizeof (v)); }#ifdef CONFIG_64BIT static void regmap_format_64_be (void *buf,unsigned int val,unsigned int shift) { -__be64 *b = buf; - - b[0 ] =cpu_to_be64 ((u64 )val << shift); +put_unaligned_be64 ((u64 ) val << shift, buf); }static void regmap_format_64_le (void *buf,unsigned int val,unsigned int shift) { -__le64 *b = buf; - - b[0 ] =cpu_to_le64 ((u64 )val << shift); +put_unaligned_le64 ((u64 ) val << shift, buf); }static void regmap_format_64_native (void *buf,unsigned int val,unsigned int shift) { - *(u64 *)buf = (u64 )val << shift; +u64 v = (u64 ) val << shift; + +memcpy (buf, &v,sizeof (v)); }#endif
@@ -333,35 +328,34 @@ static unsigned int regmap_parse_8(const void *buf)static unsigned int regmap_parse_16_be (const void *buf) { -const __be16 *b = buf; - -return be16_to_cpu (b[0 ]); +return get_unaligned_be16 (buf); }static unsigned int regmap_parse_16_le (const void *buf) { -const __le16 *b = buf; - -return le16_to_cpu (b[0 ]); +return get_unaligned_le16 (buf); }static void regmap_parse_16_be_inplace (void *buf) { -__be16 *b = buf; +u16 v =get_unaligned_be16 (buf); - b[0 ] =be16_to_cpu (b[0 ]); +memcpy (buf, &v,sizeof (v)); }static void regmap_parse_16_le_inplace (void *buf) { -__le16 *b = buf; +u16 v =get_unaligned_le16 (buf); - b[0 ] =le16_to_cpu (b[0 ]); +memcpy (buf, &v,sizeof (v)); }static unsigned int regmap_parse_16_native (const void *buf) { -return *(u16 *)buf; +u16 v; + +memcpy (&v, buf,sizeof (v)); +return v; }static unsigned int regmap_parse_24 (const void *buf)
@@ -376,69 +370,67 @@ static unsigned int regmap_parse_24(const void *buf)static unsigned int regmap_parse_32_be (const void *buf) { -const __be32 *b = buf; - -return be32_to_cpu (b[0 ]); +return get_unaligned_be32 (buf); }static unsigned int regmap_parse_32_le (const void *buf) { -const __le32 *b = buf; - -return le32_to_cpu (b[0 ]); +return get_unaligned_le32 (buf); }static void regmap_parse_32_be_inplace (void *buf) { -__be32 *b = buf; +u32 v =get_unaligned_be32 (buf); - b[0 ] =be32_to_cpu (b[0 ]); +memcpy (buf, &v,sizeof (v)); }static void regmap_parse_32_le_inplace (void *buf) { -__le32 *b = buf; +u32 v =get_unaligned_le32 (buf); - b[0 ] =le32_to_cpu (b[0 ]); +memcpy (buf, &v,sizeof (v)); }static unsigned int regmap_parse_32_native (const void *buf) { -return *(u32 *)buf; +u32 v; + +memcpy (&v, buf,sizeof (v)); +return v; }#ifdef CONFIG_64BIT static unsigned int regmap_parse_64_be (const void *buf) { -const __be64 *b = buf; - -return be64_to_cpu (b[0 ]); +return get_unaligned_be64 (buf); }static unsigned int regmap_parse_64_le (const void *buf) { -const __le64 *b = buf; - -return le64_to_cpu (b[0 ]); +return get_unaligned_le64 (buf); }static void regmap_parse_64_be_inplace (void *buf) { -__be64 *b = buf; +u64 v =get_unaligned_be64 (buf); - b[0 ] =be64_to_cpu (b[0 ]); +memcpy (buf, &v,sizeof (v)); }static void regmap_parse_64_le_inplace (void *buf) { -__le64 *b = buf; +u64 v =get_unaligned_le64 (buf); - b[0 ] =le64_to_cpu (b[0 ]); +memcpy (buf, &v,sizeof (v)); }static unsigned int regmap_parse_64_native (const void *buf) { -return *(u64 *)buf; +u64 v; + +memcpy (&v, buf,sizeof (v)); +return v; }#endif
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 5/109 perf/x86/rapl: Move RAPL support to common x86 code
In reply to Greg Kroah-HartmanFrom: Stephane Eranian <[email protected]>
[ Upstream commit fd3ae1e1587d64ef8cc8e361903d33625458073e ]
To prepare for support of both Intel and AMD RAPL.
As per the AMD PPR, Fam17h support Package RAPL counters to monitor power usage. The RAPL counter operates as with Intel RAPL, and as such it is beneficial to share the code.
No change in functionality.
---
arch/x86/events/Kconfig | 6 +++---
arch/x86/events/Makefile | 1 +
arch/x86/events/intel/Makefile | 2 --
arch/x86/events/{intel => }/rapl.c | 9 ++++++---
4 files changed, 10 insertions(+), 8 deletions(-)
rename arch/x86/events/{intel => }/rapl.c (98%)arch/x86/events/Kconfig +3 -3
@@ -10,11 +10,11 @@ config PERF_EVENTS_INTEL_UNCORE available on NehalemEX and more modern processors. config PERF_EVENTS_INTEL_RAPL - tristate "Intel rapl performance events" - depends on PERF_EVENTS && CPU_SUP_INTEL && PCI + tristate "Intel/AMD rapl performance events" + depends on PERF_EVENTS && (CPU_SUP_INTEL || CPU_SUP_AMD) && PCI default y ---help--- - Include support for Intel rapl performance events for power + Include support for Intel and AMD rapl performance events for power monitoring on modern processors. config PERF_EVENTS_INTEL_CSTATE
arch/x86/events/Makefile +1 -0
@@ -1,5 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only obj-y += core.o probe.o +obj-$(PERF_EVENTS_INTEL_RAPL) += rapl.o obj-y += amd/ obj-$(CONFIG_X86_LOCAL_APIC) += msr.o obj-$(CONFIG_CPU_SUP_INTEL) += intel/
arch/x86/events/intel/Makefile +0 -2
@@ -2,8 +2,6 @@ obj-$(CONFIG_CPU_SUP_INTEL) += core.o bts.o obj-$(CONFIG_CPU_SUP_INTEL) += ds.o knc.o obj-$(CONFIG_CPU_SUP_INTEL) += lbr.o p4.o p6.o pt.o -obj-$(CONFIG_PERF_EVENTS_INTEL_RAPL) += intel-rapl-perf.o -intel-rapl-perf-objs := rapl.o obj-$(CONFIG_PERF_EVENTS_INTEL_UNCORE) += intel-uncore.o intel-uncore-objs := uncore.o uncore_nhmex.o uncore_snb.o uncore_snbep.o obj-$(CONFIG_PERF_EVENTS_INTEL_CSTATE) += intel-cstate.o
arch/x86/events/rapl.c renamed from arch/x86/events/intel/rapl.c +6 -3
@@ -1,11 +1,14 @@// SPDX-License-Identifier: GPL-2.0-only /* -* Support Intel RAPL energy consumption counters +* Support Intel/AMD RAPL energy consumption counters * Copyright (C) 2013 Google, Inc., Stephane Eranian * * Intel RAPL interface is specified in the IA-32 Manual Vol3b * section 14.7.1 (September 2013) * +* AMD RAPL interface for Fam17h is described in the public PPR: +* https://bugzilla.kernel.org/show_bug.cgi?id=206537 +* * RAPL provides more controls than just reporting energy consumption * however here we only expose the 3 energy consumption free running * counters (pp0, pkg, dram).
@@ -58,8 +61,8 @@#include <linux/nospec.h> #include <asm/cpu_device_id.h> #include <asm/intel-family.h> -#include "../perf_event.h" -#include "../probe.h" +#include "perf_event.h" +#include "probe.h" MODULE_LICENSE ("GPL" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 6/109 perf/x86/rapl: Fix RAPL config variable bug
In reply to Greg Kroah-HartmanFrom: Stephane Eranian <[email protected]>
[ Upstream commit 16accae3d97f97d7f61c4ee5d0002bccdef59088 ]
This patch fixes a bug introduced by:
fd3ae1e1587d6 ("perf/x86/rapl: Move RAPL support to common x86 code")
The Kconfig variable name was wrong. It was missing the CONFIG_ prefix.
--- arch/x86/events/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/events/Makefile +1 -1
@@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only obj-y += core.o probe.o -obj-$(PERF_EVENTS_INTEL_RAPL) += rapl.o +obj-$(CONFIG_PERF_EVENTS_INTEL_RAPL) += rapl.o obj-y += amd/ obj-$(CONFIG_X86_LOCAL_APIC) += msr.o obj-$(CONFIG_CPU_SUP_INTEL) += intel/
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 7/109 ARM: dts: omap4-droid4: Fix spi configuration and increase rate
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 0df12a01f4857495816b05f048c4c31439446e35 ]
We can currently sometimes get "RXS timed out" errors and "EOT timed out" errors with spi transfers.
These errors can be made easy to reproduce by reading the cpcap iio values in a loop while keeping the CPUs busy by also reading /dev/urandom.
The "RXS timed out" errors we can fix by adding spi-cpol and spi-cpha in addition to the spi-cs-high property we already have.
The "EOT timed out" errors we can fix by increasing the spi clock rate to 9.6 MHz. Looks similar MC13783 PMIC says it works at spi clock rates up to 20 MHz, so let's assume we can pick any rate up to 20 MHz also for cpcap.
--- arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi +3 -1
@@ -13,8 +13,10 @@ #interrupt-cells = <2>; #address-cells = <1>; #size-cells = <0>; - spi-max-frequency = <3000000>; + spi-max-frequency = <9600000>; spi-cs-high; + spi-cpol; + spi-cpha; cpcap_adc: adc { compatible = "motorola,mapphone-cpcap-adc";
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 8/109 drm/ttm: Fix dma_fence refcnt leak when adding move fence
In reply to Greg Kroah-HartmanFrom: Xiyu Yang <[email protected]>
[ Upstream commit 11425c4519e2c974a100fc984867046d905b9380 ]
ttm_bo_add_move_fence() invokes dma_fence_get(), which returns a reference of the specified dma_fence object to "fence" with increased refcnt.
When ttm_bo_add_move_fence() returns, local variable "fence" becomes invalid, so the refcount should be decreased to keep refcount balanced.
The reference counting issue happens in one exception handling path of ttm_bo_add_move_fence(). When no_wait_gpu flag is equals to true, the function forgets to decrease the refcnt increased by dma_fence_get(), causing a refcnt leak.
Fix this issue by calling dma_fence_put() when no_wait_gpu flag is equals to true.
--- drivers/gpu/drm/ttm/ttm_bo.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/ttm/ttm_bo.c +3 -1
@@ -941,8 +941,10 @@ static int ttm_bo_add_move_fence(struct ttm_buffer_object *bo,if (!fence)return 0 ; -if (no_wait_gpu) +if (no_wait_gpu) { +dma_fence_put (fence);return -EBUSY ; + }dma_resv_add_shared_fence (bo->base.resv, fence);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 9/109 drm/tegra: hub: Do not enable orphaned window group
In reply to Greg Kroah-HartmanFrom: Nicolin Chen <[email protected]>
[ Upstream commit ef4e417eb3ec7fe657928f10ac1d2154d8a5fb38 ]
Though the unconditional enable/disable code is not a final solution, we don't want to run into a NULL pointer situation when window group doesn't link to its DC parent if the DC is disabled in Device Tree.
So this patch simply adds a check to make sure that window group has a valid parent before running into tegra_windowgroup_enable/disable.
--- drivers/gpu/drm/tegra/hub.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/gpu/drm/tegra/hub.c +6 -2
@@ -141,7 +141,9 @@ int tegra_display_hub_prepare(struct tegra_display_hub *hub)for (i =0 ; i < hub->soc->num_wgrps; i++) {struct tegra_windowgroup *wgrp = &hub->wgrps[i]; -tegra_windowgroup_enable (wgrp); +/* Skip orphaned window group whose parent DC is disabled */ +if (wgrp->parent) +tegra_windowgroup_enable (wgrp); }return 0 ;
@@ -158,7 +160,9 @@ void tegra_display_hub_cleanup(struct tegra_display_hub *hub)for (i =0 ; i < hub->soc->num_wgrps; i++) {struct tegra_windowgroup *wgrp = &hub->wgrps[i]; -tegra_windowgroup_disable (wgrp); +/* Skip orphaned window group whose parent DC is disabled */ +if (wgrp->parent) +tegra_windowgroup_disable (wgrp); } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 10/109 gpu: host1x: Detach driver on unregister
In reply to Greg Kroah-HartmanFrom: Thierry Reding <[email protected]>
[ Upstream commit d9a0a05bf8c76e6dc79230669a8b5d685b168c30 ]
Currently when a host1x device driver is unregistered, it is not detached from the host1x controller, which means that the device will stay around and when the driver is registered again, it may bind to the old, stale device rather than the new one that was created from scratch upon driver registration. This in turn can cause various weird crashes within the driver core because it is confronted with a device that was already deleted.
Fix this by detaching the driver from the host1x controller when it is unregistered. This ensures that the deleted device also is no longer present in the device list that drivers will bind to.
--- drivers/gpu/host1x/bus.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/gpu/host1x/bus.c +9 -0
@@ -686,8 +686,17 @@ EXPORT_SYMBOL(host1x_driver_register_full);*/ void host1x_driver_unregister (struct host1x_driver *driver) { +struct host1x *host1x; +driver_unregister (&driver->driver); +mutex_lock (&devices_lock); + +list_for_each_entry (host1x, &devices, list) +host1x_detach_driver (host1x, driver); + +mutex_unlock (&devices_lock); +mutex_lock (&drivers_lock);list_del_init (&driver->list);mutex_unlock (&drivers_lock);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 11/109 drm: mcde: Fix display initialization problem
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit b984b6d8b52372b98cce0a6ff6c2787f50665b87 ]
The following bug appeared in the MCDE driver/display initialization during the recent merge window.
First the place we call drm_fbdev_generic_setup() in the wrong place: this needs to be called AFTER calling drm_dev_register() else we get this splat:
------------[ cut here ]------------ WARNING: CPU: 0 PID: 1 at ../drivers/gpu/drm/drm_fb_helper.c:2198 drm_fbdev_generic_setup+0x164/0x1a8 mcde a0350000.mcde: Device has not been registered. Modules linked in: Hardware name: ST-Ericsson Ux5x0 platform (Device Tree Support) [<c010e704>] (unwind_backtrace) from [<c010a86c>] (show_stack+0x10/0x14) [<c010a86c>] (show_stack) from [<c0414f38>] (dump_stack+0x9c/0xb0) [<c0414f38>] (dump_stack) from [<c0121c8c>] (__warn+0xb8/0xd0) [<c0121c8c>] (__warn) from [<c0121d18>] (warn_slowpath_fmt+0x74/0xb8) [<c0121d18>] (warn_slowpath_fmt) from [<c04b154c>] (drm_fbdev_generic_setup+0x164/0x1a8) [<c04b154c>] (drm_fbdev_generic_setup) from [<c04ed278>] (mcde_drm_bind+0xc4/0x160) [<c04ed278>] (mcde_drm_bind) from [<c04f06b8>] (try_to_bring_up_master+0x15c/0x1a4)
(...)
--- drivers/gpu/drm/mcde/mcde_drv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/mcde/mcde_drv.c +2 -1
@@ -215,7 +215,6 @@ static int mcde_modeset_init(struct drm_device *drm)drm_mode_config_reset (drm);drm_kms_helper_poll_init (drm); -drm_fbdev_generic_setup (drm,32 );return 0 ;
@@ -282,6 +281,8 @@ static int mcde_drm_bind(struct device *dev)if (ret <0 ) goto unbind; +drm_fbdev_generic_setup (drm,32 ); +return 0 ; unbind:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 12/109 ASoC: SOF: Intel: add PCI ID for CometLake-S
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 258fb4f4c34a0db9d3834aba6784d7b322176bb9 ]
Mirror ID added for legacy HDaudio
--- sound/soc/sof/sof-pci-dev.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/sof/sof-pci-dev.c +2 -0
@@ -420,6 +420,8 @@ static const struct pci_device_id sof_pci_ids[] = { #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H) { PCI_DEVICE(0x8086, 0x06c8), .driver_data = (unsigned long)&cml_desc}, + { PCI_DEVICE(0x8086, 0xa3f0), /* CML-S */ + .driver_data = (unsigned long)&cml_desc}, #endif #if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE) { PCI_DEVICE(0x8086, 0xa0c8),
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 13/109 ALSA: hda: Intel: add missing PCI IDs for ICL-H, TGL-H and EKL
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit d50313a5a0d803bcf55121a2b82086633060d05e ]
Mirror PCI ids used for SOF.
--- sound/pci/hda/hda_intel.c | 8 ++++++++ 1 file changed, 8 insertions(+)
sound/pci/hda/hda_intel.c +8 -0
@@ -2433,6 +2433,9 @@ static const struct pci_device_id azx_ids[] = {/* Icelake */ { PCI_DEVICE(0x8086, 0x34c8), .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, + /* Icelake-H */ + { PCI_DEVICE(0x8086, 0x3dc8), + .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, /* Jasperlake */ { PCI_DEVICE(0x8086, 0x38c8), .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
@@ -2441,9 +2444,14 @@ static const struct pci_device_id azx_ids[] = {/* Tigerlake */ { PCI_DEVICE(0x8086, 0xa0c8), .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, + /* Tigerlake-H */ + { PCI_DEVICE(0x8086, 0x43c8), + .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, /* Elkhart Lake */ { PCI_DEVICE(0x8086, 0x4b55), .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, + { PCI_DEVICE(0x8086, 0x4b58), + .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE}, /* Broxton-P(Apollolake) */ { PCI_DEVICE(0x8086, 0x5a98), .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON },
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 14/109 spi: spidev: fix a race between spidev_release and spidev_remove
In reply to Greg Kroah-HartmanFrom: Zhenzhong Duan <[email protected]>
[ Upstream commit abd42781c3d2155868821f1b947ae45bbc33330d ]
Imagine below scene, spidev is referenced after it's freed.
spidev_release() spidev_remove()
...
spin_lock_irq(&spidev->spi_lock);
spidev->spi = NULL;
spin_unlock_irq(&spidev->spi_lock);
mutex_lock(&device_list_lock);
dofree = (spidev->spi == NULL);
if (dofree)
kfree(spidev);
mutex_unlock(&device_list_lock);
mutex_lock(&device_list_lock);
list_del(&spidev->device_entry);
device_destroy(spidev_class, spidev->devt);
clear_bit(MINOR(spidev->devt), minors);
if (spidev->users == 0)
kfree(spidev);
mutex_unlock(&device_list_lock);Fix it by resetting spidev->spi in device_list_lock's protection.
--- drivers/spi/spidev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/spi/spidev.c +2 -2
@@ -783,13 +783,13 @@ static int spidev_remove(struct spi_device *spi) {struct spidev_data *spidev =spi_get_drvdata (spi); +/* prevent new opens */ +mutex_lock (&device_list_lock);/* make sure ops on existing fds can abort cleanly */ spin_lock_irq (&spidev->spi_lock); spidev->spi =NULL ;spin_unlock_irq (&spidev->spi_lock); -/* prevent new opens */ -mutex_lock (&device_list_lock);list_del (&spidev->device_entry);device_destroy (spidev_class, spidev->devt);clear_bit (MINOR (spidev->devt), minors);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 15/109 spi: spidev: fix a potential use-after-free in spidev_release()
In reply to Greg Kroah-HartmanFrom: Zhenzhong Duan <[email protected]>
[ Upstream commit 06096cc6c5a84ced929634b0d79376b94c65a4bd ]
If an spi device is unbounded from the driver before the release process, there will be an NULL pointer reference when it's referenced in spi_slave_abort().
Fix it by checking it's already freed before reference.
--- drivers/spi/spidev.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
drivers/spi/spidev.c +10 -10
@@ -605,15 +605,20 @@ err_find_dev:static int spidev_release (struct inode *inode,struct file *filp) {struct spidev_data *spidev; +int dofree;mutex_lock (&device_list_lock); spidev = filp->private_data; filp->private_data =NULL ; +spin_lock_irq (&spidev->spi_lock); +/* ... after we unbound from the underlying device? */ + dofree = (spidev->spi ==NULL ); +spin_unlock_irq (&spidev->spi_lock); +/* last close? */ spidev->users--;if (!spidev->users) { -int dofree;kfree (spidev->tx_buffer); spidev->tx_buffer =NULL ;
@@ -621,19 +626,14 @@ static int spidev_release(struct inode *inode, struct file *filp)kfree (spidev->rx_buffer); spidev->rx_buffer =NULL ; -spin_lock_irq (&spidev->spi_lock); -if (spidev->spi) - spidev->speed_hz = spidev->spi->max_speed_hz; - -/* ... after we unbound from the underlying device? */ - dofree = (spidev->spi ==NULL ); -spin_unlock_irq (&spidev->spi_lock); -if (dofree)kfree (spidev); +else + spidev->speed_hz = spidev->spi->max_speed_hz; }#ifdef CONFIG_SPI_SLAVE -spi_slave_abort (spidev->spi); +if (!dofree) +spi_slave_abort (spidev->spi);#endif mutex_unlock (&device_list_lock);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 16/109 net: ethernet: mvneta: Fix Serdes configuration for SoCs without comphy
In reply to Greg Kroah-HartmanFrom: Sascha Hauer <[email protected]>
[ Upstream commit b4748553f53f2971e07d2619f13d461daac0f3bb ]
The MVNETA_SERDES_CFG register is only available on older SoCs like the Armada XP. On newer SoCs like the Armada 38x the fields are moved to comphy. This patch moves the writes to this register next to the comphy initialization, so that depending on the SoC either comphy or MVNETA_SERDES_CFG is configured.
With this we no longer write to the MVNETA_SERDES_CFG on SoCs where it doesn't exist.
--- drivers/net/ethernet/marvell/mvneta.c | 80 +++++++++++++++------------ 1 file changed, 44 insertions(+), 36 deletions(-)
drivers/net/ethernet/marvell/mvneta.c +44 -36
@@ -104,6 +104,7 @@#define MVNETA_TX_IN_PRGRS BIT(1)#define MVNETA_TX_FIFO_EMPTY BIT(8)#define MVNETA_RX_MIN_FRAME_SIZE 0x247c +/* Only exists on Armada XP and Armada 370 */ #define MVNETA_SERDES_CFG 0x24A0#define MVNETA_SGMII_SERDES_PROTO 0x0cc7#define MVNETA_QSGMII_SERDES_PROTO 0x0667
@@ -3164,26 +3165,55 @@ static int mvneta_setup_txqs(struct mvneta_port *pp)return 0 ; } -static int mvneta_comphy_init (struct mvneta_port *pp) +static int mvneta_comphy_init (struct mvneta_port *pp,phy_interface_t interface) {int ret; -if (!pp->comphy) -return 0 ; - - ret =phy_set_mode_ext (pp->comphy,PHY_MODE_ETHERNET , - pp->phy_interface); + ret =phy_set_mode_ext (pp->comphy,PHY_MODE_ETHERNET , interface);if (ret)return ret;return phy_power_on (pp->comphy); } +static int mvneta_config_interface (struct mvneta_port *pp, +phy_interface_t interface) +{ +int ret =0 ; + +if (pp->comphy) { +if (interface ==PHY_INTERFACE_MODE_SGMII || + interface ==PHY_INTERFACE_MODE_1000BASEX || + interface ==PHY_INTERFACE_MODE_2500BASEX ) { + ret =mvneta_comphy_init (pp, interface); + } + }else { +switch (interface) { +case PHY_INTERFACE_MODE_QSGMII : +mvreg_write (pp,MVNETA_SERDES_CFG , +MVNETA_QSGMII_SERDES_PROTO ); +break ; + +case PHY_INTERFACE_MODE_SGMII : +case PHY_INTERFACE_MODE_1000BASEX : +mvreg_write (pp,MVNETA_SERDES_CFG , +MVNETA_SGMII_SERDES_PROTO ); +break ; +default : +return -EINVAL ; + } + } + + pp->phy_interface = interface; + +return ret; +} +static void mvneta_start_dev (struct mvneta_port *pp) {int cpu; -WARN_ON (mvneta_comphy_init (pp)); +WARN_ON (mvneta_config_interface (pp, pp->phy_interface));mvneta_max_rx_size_set (pp, pp->pkt_size);mvneta_txq_max_tx_size_set (pp, pp->pkt_size);
@@ -3561,14 +3591,10 @@ static void mvneta_mac_config(struct phylink_config *config, unsigned int mode,if (state->speed ==SPEED_2500 ) new_ctrl4 |=MVNETA_GMAC4_SHORT_PREAMBLE_ENABLE ; -if (pp->comphy && pp->phy_interface != state->interface && - (state->interface ==PHY_INTERFACE_MODE_SGMII || - state->interface ==PHY_INTERFACE_MODE_1000BASEX || - state->interface ==PHY_INTERFACE_MODE_2500BASEX )) { - pp->phy_interface = state->interface; - -WARN_ON (phy_power_off (pp->comphy)); -WARN_ON (mvneta_comphy_init (pp)); +if (pp->phy_interface != state->interface) { +if (pp->comphy) +WARN_ON (phy_power_off (pp->comphy)); +WARN_ON (mvneta_config_interface (pp, state->interface)); }if (new_ctrl0 != gmac_ctrl0)
@@ -4464,20 +4490,10 @@ static void mvneta_conf_mbus_windows(struct mvneta_port *pp, }/* Power up the port */ -static int mvneta_port_power_up (struct mvneta_port *pp,int phy_mode) +static void mvneta_port_power_up (struct mvneta_port *pp,int phy_mode) {/* MAC Cause register should be cleared */ mvreg_write (pp,MVNETA_UNIT_INTR_CAUSE ,0 ); - -if (phy_mode ==PHY_INTERFACE_MODE_QSGMII ) -mvreg_write (pp,MVNETA_SERDES_CFG ,MVNETA_QSGMII_SERDES_PROTO ); -else if (phy_mode ==PHY_INTERFACE_MODE_SGMII || -phy_interface_mode_is_8023z (phy_mode)) -mvreg_write (pp,MVNETA_SERDES_CFG ,MVNETA_SGMII_SERDES_PROTO ); -else if (!phy_interface_mode_is_rgmii (phy_mode)) -return -EINVAL ; - -return 0 ; }/* Device initialization routine */
@@ -4661,11 +4677,7 @@ static int mvneta_probe(struct platform_device *pdev)if (err <0 ) goto err_netdev; - err =mvneta_port_power_up (pp, phy_mode); -if (err <0 ) { -dev_err (&pdev->dev,"can't power up port\n" ); - goto err_netdev; - } +mvneta_port_power_up (pp, phy_mode);/* Armada3700 network controller does not support per-cpu * operation, so only single NAPI should be initialized.
@@ -4818,11 +4830,7 @@ static int mvneta_resume(struct device *device) } }mvneta_defaults_set (pp); - err =mvneta_port_power_up (pp, pp->phy_interface); -if (err <0 ) { -dev_err (device,"can't power up port\n" ); -return err; - } +mvneta_port_power_up (pp, pp->phy_interface);netif_device_attach (dev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 17/109 net: ethernet: mvneta: Add 2500BaseX support for SoCs without comphy
In reply to Greg Kroah-HartmanFrom: Sascha Hauer <[email protected]>
[ Upstream commit 1a642ca7f38992b086101fe204a1ae3c90ed8016 ]
The older SoCs like Armada XP support a 2500BaseX mode in the datasheets referred to as DR-SGMII (Double rated SGMII) or HS-SGMII (High Speed SGMII). This is an upclocked 1000BaseX mode, thus PHY_INTERFACE_MODE_2500BASEX is the appropriate mode define for it. adding support for it merely means writing the correct magic value into the MVNETA_SERDES_CFG register.
--- drivers/net/ethernet/marvell/mvneta.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/ethernet/marvell/mvneta.c +6 -0
@@ -108,6 +108,7 @@#define MVNETA_SERDES_CFG 0x24A0#define MVNETA_SGMII_SERDES_PROTO 0x0cc7#define MVNETA_QSGMII_SERDES_PROTO 0x0667 +#define MVNETA_HSGMII_SERDES_PROTO 0x1107#define MVNETA_TYPE_PRIO 0x24bc#define MVNETA_FORCE_UNI BIT(21)#define MVNETA_TXQ_CMD_1 0x24e4
@@ -3199,6 +3200,11 @@ static int mvneta_config_interface(struct mvneta_port *pp,mvreg_write (pp,MVNETA_SERDES_CFG ,MVNETA_SGMII_SERDES_PROTO );break ; + +case PHY_INTERFACE_MODE_2500BASEX : +mvreg_write (pp,MVNETA_SERDES_CFG , +MVNETA_HSGMII_SERDES_PROTO ); +break ;default :return -EINVAL ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 18/109 ixgbe: protect ring accesses with READ- and WRITE_ONCE
In reply to Greg Kroah-HartmanFrom: Ciara Loftus <[email protected]>
[ Upstream commit f140ad9fe2ae16f385f8fe4dc9cf67bb4c51d794 ]
READ_ONCE should be used when reading rings prior to accessing the statistics pointer. Introduce this as well as the corresponding WRITE_ONCE usage when allocating and freeing the rings, to ensure protected access.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c | 12 ++++++------ drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 14 +++++++++++--- 2 files changed, 17 insertions(+), 9 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c +6 -6
@@ -923,7 +923,7 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter, ring->queue_index = txr_idx;/* assign ring to adapter */ - adapter->tx_ring[txr_idx] = ring; +WRITE_ONCE (adapter->tx_ring[txr_idx], ring);/* update count and index */ txr_count--;
@@ -950,7 +950,7 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter,set_ring_xdp (ring);/* assign ring to adapter */ - adapter->xdp_ring[xdp_idx] = ring; +WRITE_ONCE (adapter->xdp_ring[xdp_idx], ring);/* update count and index */ xdp_count--;
@@ -993,7 +993,7 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter, ring->queue_index = rxr_idx;/* assign ring to adapter */ - adapter->rx_ring[rxr_idx] = ring; +WRITE_ONCE (adapter->rx_ring[rxr_idx], ring);/* update count and index */ rxr_count--;
@@ -1022,13 +1022,13 @@ static void ixgbe_free_q_vector(struct ixgbe_adapter *adapter, int v_idx)ixgbe_for_each_ring (ring, q_vector->tx) {if (ring_is_xdp (ring)) - adapter->xdp_ring[ring->queue_index] =NULL ; +WRITE_ONCE (adapter->xdp_ring[ring->queue_index],NULL );else - adapter->tx_ring[ring->queue_index] =NULL ; +WRITE_ONCE (adapter->tx_ring[ring->queue_index],NULL ); }ixgbe_for_each_ring (ring, q_vector->rx) - adapter->rx_ring[ring->queue_index] =NULL ; +WRITE_ONCE (adapter->rx_ring[ring->queue_index],NULL ); adapter->q_vector[v_idx] =NULL ;napi_hash_del (&q_vector->napi);
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +11 -3
@@ -7064,7 +7064,10 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter) }for (i =0 ; i < adapter->num_rx_queues; i++) { -struct ixgbe_ring *rx_ring = adapter->rx_ring[i]; +struct ixgbe_ring *rx_ring =READ_ONCE (adapter->rx_ring[i]); + +if (!rx_ring) +continue ; non_eop_descs += rx_ring->rx_stats.non_eop_descs; alloc_rx_page += rx_ring->rx_stats.alloc_rx_page; alloc_rx_page_failed += rx_ring->rx_stats.alloc_rx_page_failed;
@@ -7085,15 +7088,20 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter) packets =0 ;/* gather some stats to the adapter struct that are per queue */ for (i =0 ; i < adapter->num_tx_queues; i++) { -struct ixgbe_ring *tx_ring = adapter->tx_ring[i]; +struct ixgbe_ring *tx_ring =READ_ONCE (adapter->tx_ring[i]); + +if (!tx_ring) +continue ; restart_queue += tx_ring->tx_stats.restart_queue; tx_busy += tx_ring->tx_stats.tx_busy; bytes += tx_ring->stats.bytes; packets += tx_ring->stats.packets; }for (i =0 ; i < adapter->num_xdp_queues; i++) { -struct ixgbe_ring *xdp_ring = adapter->xdp_ring[i]; +struct ixgbe_ring *xdp_ring =READ_ONCE (adapter->xdp_ring[i]); +if (!xdp_ring) +continue ; restart_queue += xdp_ring->tx_stats.restart_queue; tx_busy += xdp_ring->tx_stats.tx_busy; bytes += xdp_ring->stats.bytes;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 19/109 i40e: protect ring accesses with READ- and WRITE_ONCE
In reply to Greg Kroah-HartmanFrom: Ciara Loftus <[email protected]>
[ Upstream commit d59e267912cd90b0adf33b4659050d831e746317 ]
READ_ONCE should be used when reading rings prior to accessing the statistics pointer. Introduce this as well as the corresponding WRITE_ONCE usage when allocating and freeing the rings, to ensure protected access.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 29 ++++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +19 -10
@@ -458,11 +458,15 @@ static void i40e_get_netdev_stats_struct(struct net_device *netdev,i40e_get_netdev_stats_struct_tx (ring, stats);if (i40e_enabled_xdp_vsi (vsi)) { - ring++; + ring =READ_ONCE (vsi->xdp_rings[i]); +if (!ring) +continue ;i40e_get_netdev_stats_struct_tx (ring, stats); } - ring++; + ring =READ_ONCE (vsi->rx_rings[i]); +if (!ring) +continue ; do { start = u64_stats_fetch_begin_irq(&ring->syncp); packets = ring->stats.packets;
@@ -806,6 +810,8 @@ static void i40e_update_vsi_stats(struct i40e_vsi *vsi)for (q =0 ; q < vsi->num_queue_pairs; q++) {/* locate Tx ring */ p =READ_ONCE (vsi->tx_rings[q]); +if (!p) +continue ; do { start = u64_stats_fetch_begin_irq(&p->syncp);
@@ -819,8 +825,11 @@ static void i40e_update_vsi_stats(struct i40e_vsi *vsi) tx_linearize += p->tx_stats.tx_linearize; tx_force_wb += p->tx_stats.tx_force_wb; -/* Rx queue is part of the same block as Tx queue */ - p = &p[1 ]; +/* locate Rx ring */ + p =READ_ONCE (vsi->rx_rings[q]); +if (!p) +continue ; + do { start = u64_stats_fetch_begin_irq(&p->syncp); packets = p->stats.packets;
@@ -10816,10 +10825,10 @@ static void i40e_vsi_clear_rings(struct i40e_vsi *vsi)if (vsi->tx_rings && vsi->tx_rings[0 ]) {for (i =0 ; i < vsi->alloc_queue_pairs; i++) {kfree_rcu (vsi->tx_rings[i], rcu); - vsi->tx_rings[i] =NULL ; - vsi->rx_rings[i] =NULL ; +WRITE_ONCE (vsi->tx_rings[i],NULL ); +WRITE_ONCE (vsi->rx_rings[i],NULL );if (vsi->xdp_rings) - vsi->xdp_rings[i] =NULL ; +WRITE_ONCE (vsi->xdp_rings[i],NULL ); } } }
@@ -10853,7 +10862,7 @@ static int i40e_alloc_rings(struct i40e_vsi *vsi)if (vsi->back->hw_features &I40E_HW_WB_ON_ITR_CAPABLE ) ring->flags =I40E_TXR_FLAGS_WB_ON_ITR ; ring->itr_setting = pf->tx_itr_default; - vsi->tx_rings[i] = ring++; +WRITE_ONCE (vsi->tx_rings[i], ring++);if (!i40e_enabled_xdp_vsi (vsi)) goto setup_rx;
@@ -10871,7 +10880,7 @@ static int i40e_alloc_rings(struct i40e_vsi *vsi) ring->flags =I40E_TXR_FLAGS_WB_ON_ITR ;set_ring_xdp (ring); ring->itr_setting = pf->tx_itr_default; - vsi->xdp_rings[i] = ring++; +WRITE_ONCE (vsi->xdp_rings[i], ring++); setup_rx: ring->queue_index = i;
@@ -10884,7 +10893,7 @@ setup_rx: ring->size =0 ; ring->dcb_tc =0 ; ring->itr_setting = pf->rx_itr_default; - vsi->rx_rings[i] = ring; +WRITE_ONCE (vsi->rx_rings[i], ring); }return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 20/109 ibmvnic: continue to init in CRQ reset returns H_CLOSED
In reply to Greg Kroah-HartmanFrom: Dany Madden <[email protected]>
[ Upstream commit 8b40eb73509f5704a0e8cd25de0163876299f1a7 ]
Continue the reset path when partner adapter is not ready or H_CLOSED is returned from reset crq. This patch allows the CRQ init to proceed to establish a valid CRQ for traffic to flow after reset.
--- drivers/net/ethernet/ibm/ibmvnic.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/ethernet/ibm/ibmvnic.c +7 -2
@@ -1878,13 +1878,18 @@ static int do_reset(struct ibmvnic_adapter *adapter,release_sub_crqs (adapter,1 ); }else { rc =ibmvnic_reset_crq (adapter); -if (!rc) +if (rc ==H_CLOSED || rc ==H_SUCCESS ) { rc =vio_enable_interrupts (adapter->vdev); +if (rc) +netdev_err (adapter->netdev, +"Reset failed to enable interrupts. rc=%d\n" , + rc); + } }if (rc) {netdev_err (adapter->netdev, -"Couldn't initialize crq. rc=%d\n" , rc); +"Reset couldn't initialize crq. rc=%d\n" , rc); goto out; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 21/109 powerpc/kvm/book3s64: Fix kernel crash with nested kvm & DEBUG_VIRTUAL
In reply to Greg Kroah-HartmanFrom: Aneesh Kumar K.V <[email protected]>
[ Upstream commit c1ed1754f271f6b7acb1bfdc8cfb62220fbed423 ]
With CONFIG_DEBUG_VIRTUAL=y, __pa() checks for addr value and if it's less than PAGE_OFFSET it leads to a BUG().
#define __pa(x)
({
VIRTUAL_BUG_ON((unsigned long)(x) < PAGE_OFFSET);
(unsigned long)(x) & 0x0fffffffffffffffUL;
}) kernel BUG at arch/powerpc/kvm/book3s_64_mmu_radix.c:43! cpu 0x70: Vector: 700 (Program Check) at [c0000018a2187360]
pc: c000000000161b30: __kvmhv_copy_tofrom_guest_radix+0x130/0x1f0
lr: c000000000161d5c: kvmhv_copy_from_guest_radix+0x3c/0x80
...
kvmhv_copy_from_guest_radix+0x3c/0x80
kvmhv_load_from_eaddr+0x48/0xc0
kvmppc_ld+0x98/0x1e0
kvmppc_load_last_inst+0x50/0x90
kvmppc_hv_emulate_mmio+0x288/0x2b0
kvmppc_book3s_radix_page_fault+0xd8/0x2b0
kvmppc_book3s_hv_page_fault+0x37c/0x1050
kvmppc_vcpu_run_hv+0xbb8/0x1080
kvmppc_vcpu_run+0x34/0x50
kvm_arch_vcpu_ioctl_run+0x2fc/0x410
kvm_vcpu_ioctl+0x2b4/0x8f0
ksys_ioctl+0xf4/0x150
sys_ioctl+0x28/0x80
system_call_exception+0x104/0x1d0
system_call_common+0xe8/0x214kvmhv_copy_tofrom_guest_radix() uses a NULL value for to/from to indicate direction of copy.
Avoid calling __pa() if the value is NULL to avoid the BUG().
--- arch/powerpc/kvm/book3s_64_mmu_radix.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/powerpc/kvm/book3s_64_mmu_radix.c +2 -1
@@ -38,7 +38,8 @@ unsigned long __kvmhv_copy_tofrom_guest_radix(int lpid, int pid,/* Can't access quadrants 1 or 2 in non-HV mode, call the HV to do it */ if (kvmhv_on_pseries ())return plpar_hcall_norets (H_COPY_TOFROM_GUEST , lpid, pid, eaddr, -__pa (to),__pa (from), n); + (to !=NULL ) ?__pa (to):0 , + (from !=NULL ) ?__pa (from):0 , n); quadrant =1 ;if (!pid)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 22/109 iommu/vt-d: Dont apply gfx quirks to untrusted devices
In reply to Greg Kroah-HartmanFrom: Rajat Jain <[email protected]>
[ Upstream commit 67e8a5b18d41af9298db5c17193f671f235cce01 ]
Currently, an external malicious PCI device can masquerade the VID:PID of faulty gfx devices, and thus apply iommu quirks to effectively disable the IOMMU restrictions for itself.
Thus we need to ensure that the device we are applying quirks to, is indeed an internal trusted device.
--- drivers/iommu/intel-iommu.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
drivers/iommu/intel-iommu.c +37 -0
@@ -5962,6 +5962,23 @@ static bool intel_iommu_is_attach_deferred(struct iommu_domain *domain,return dev->archdata.iommu ==DEFER_DEVICE_DOMAIN_INFO ; } +/* +* Check that the device does not live on an external facing PCI port that is +* marked as untrusted. Such devices should not be able to apply quirks and +* thus not be able to bypass the IOMMU restrictions. +*/ +static bool risky_device (struct pci_dev *pdev) +{ +if (pdev->untrusted) { +pci_info (pdev, +"Skipping IOMMU quirk for dev [%04X:%04X] on untrusted PCI link\n" , + pdev->vendor, pdev->device); +pci_info (pdev,"Please check with your BIOS/Platform vendor about this\n" ); +return true; + } +return false; +} +const struct iommu_ops intel_iommu_ops = { .capable = intel_iommu_capable, .domain_alloc = intel_iommu_domain_alloc,
@@ -5990,6 +6007,9 @@ const struct iommu_ops intel_iommu_ops = {static void quirk_iommu_igfx (struct pci_dev *dev) { +if (risky_device (dev)) +return ; +pci_info (dev,"Disabling IOMMU for graphics on this chipset\n" ); dmar_map_gfx =0 ; }
@@ -6031,6 +6051,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x163D, quirk_iommu_igfx);static void quirk_iommu_rwbf (struct pci_dev *dev) { +if (risky_device (dev)) +return ; +/* * Mobile 4 Series Chipset neglects to set RWBF capability, * but needs it. Same seems to hold for the desktop versions.
@@ -6061,6 +6084,9 @@ static void quirk_calpella_no_shadow_gtt(struct pci_dev *dev) {unsigned short ggc; +if (risky_device (dev)) +return ; +if (pci_read_config_word (dev,GGC , &ggc))return ;
@@ -6094,6 +6120,12 @@ static void __init check_tylersburg_isoch(void) pdev =pci_get_device (PCI_VENDOR_ID_INTEL ,0x3a3e ,NULL );if (!pdev)return ; + +if (risky_device (pdev)) { +pci_dev_put (pdev); +return ; + } +pci_dev_put (pdev);/* System Management Registers. Might be hidden, in which case
@@ -6103,6 +6135,11 @@ static void __init check_tylersburg_isoch(void)if (!pdev)return ; +if (risky_device (pdev)) { +pci_dev_put (pdev); +return ; + } +if (pci_read_config_dword (pdev,0x188 , &vtisochctrl)) {pci_dev_put (pdev);return ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 23/109 drm: panel-orientation-quirks: Add quirk for Asus T101HA panel
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 6c22bc18a3b93a38018844636557ad02e588e055 ]
Like the Asus T100HA the Asus T101HA also uses a panel which has been mounted 90 degrees rotated, albeit in the opposite direction. Add a quirk for this.
--- drivers/gpu/drm/drm_panel_orientation_quirks.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/drm_panel_orientation_quirks.c +6 -0
@@ -121,6 +121,12 @@ static const struct dmi_system_id orientation_data[] = { DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100HAN"), }, .driver_data = (void *)&asus_t100ha, + }, { /* Asus T101HA */ + .matches = { +DMI_EXACT_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T101HA"), + }, + .driver_data = (void *)&lcd800x1280_rightside_up, }, { /* GPD MicroPC (generic strings, also match on bios date) */ .matches = { DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"),
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 24/109 drm: panel-orientation-quirks: Use generic orientation-data for Acer S1003
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit a05caf9e62a85d12da27e814ac13195f4683f21c ]
The Acer S1003 has proper DMI strings for sys-vendor and product-name, so we do not need to match by BIOS-date.
This means that the Acer S1003 can use the generic lcd800x1280_rightside_up drm_dmi_panel_orientation_data struct which is also used by other quirks.
--- drivers/gpu/drm/drm_panel_orientation_quirks.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/gpu/drm/drm_panel_orientation_quirks.c +1 -7
@@ -30,12 +30,6 @@ struct drm_dmi_panel_orientation_data {int orientation; }; -static const struct drm_dmi_panel_orientation_data acer_s1003 = { - .width =800 , - .height =1280 , - .orientation =DRM_MODE_PANEL_ORIENTATION_RIGHT_UP , -}; -static const struct drm_dmi_panel_orientation_data asus_t100ha = { .width =800 , .height =1280 ,
@@ -114,7 +108,7 @@ static const struct dmi_system_id orientation_data[] = {DMI_EXACT_MATCH (DMI_SYS_VENDOR ,"Acer" ), DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "One S1003"), }, - .driver_data = (void *)&acer_s1003, + .driver_data = (void *)&lcd800x1280_rightside_up, }, { /* Asus T100HA */ .matches = { DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 25/109 s390/kasan: fix early pgm check handler execution
In reply to Greg Kroah-HartmanFrom: Vasily Gorbik <[email protected]>
[ Upstream commit 998f5bbe3dbdab81c1cfb1aef7c3892f5d24f6c7 ]
Currently if early_pgm_check_handler is called it ends up in pgm check loop. The problem is that early_pgm_check_handler is instrumented by KASAN but executed without DAT flag enabled which leads to addressing exception when KASAN checks try to access shadow memory.
Fix that by executing early handlers with DAT flag on under KASAN as expected.
--- arch/s390/kernel/early.c | 2 ++ 1 file changed, 2 insertions(+)
arch/s390/kernel/early.c +2 -0
@@ -169,6 +169,8 @@ static noinline __init void setup_lowcore_early(void)psw_t psw; psw.mask =PSW_MASK_BASE |PSW_DEFAULT_KEY |PSW_MASK_EA |PSW_MASK_BA ; +if (IS_ENABLED (CONFIG_KASAN )) + psw.mask |=PSW_MASK_DAT ; psw.addr = (unsigned long ) s390_base_ext_handler; S390_lowcore.external_new_psw = psw; psw.addr = (unsigned long ) s390_base_pgm_handler;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 26/109 drm/sun4i: mixer: Call of_dma_configure if theres an IOMMU
In reply to Greg Kroah-HartmanFrom: Maxime Ripard <[email protected]>
[ Upstream commit 842ec61f4006a6477a9deaedd69131e9f46e4cb5 ]
The main DRM device is actually a virtual device so it doesn't have the iommus property, which is instead on the DMA masters, in this case the mixers.
Add a call to of_dma_configure with the mixers DT node but on the DRM virtual device to configure it in the same way than the mixers.
[Maxime: Applied to -fixes since it missed the merge window and display is
broken without it]
--- drivers/gpu/drm/sun4i/sun8i_mixer.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/gpu/drm/sun4i/sun8i_mixer.c +13 -0
@@ -452,6 +452,19 @@ static int sun8i_mixer_bind(struct device *dev, struct device *master, mixer->engine.ops = &sun8i_engine_ops; mixer->engine.node = dev->of_node; +if (of_find_property (dev->of_node,"iommus" ,NULL )) { +/* +* This assume we have the same DMA constraints for +* all our the mixers in our pipeline. This sounds +* bad, but it has always been the case for us, and +* DRM doesn't do per-device allocation either, so we +* would need to fix DRM first... +*/ + ret =of_dma_configure (drm->dev, dev->of_node, true); +if (ret) +return ret; + } +/* * While this function can fail, we shouldn't do anything * if this happens. Some early DE2 DT entries don't provide
Signature · 1 line
2.25.1
Re: [PATCH 5.4 026/109] drm/sun4i: mixer: Call of_dma_configure if theres an IOMMU
Hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
From: Maxime Ripard <[email protected]>
[ Upstream commit
842ec61f4006a6477a9deaedd69131e9f46e4cb5]The main DRM device is actually a virtual device so it doesn't have the iommus property, which is instead on the DMA masters, in this case the mixers.
The iommu driver and DT changes were added in v5.8-rc1. IMO There is no point in backporting this patch to any stable kernel.
ChenYu
Quoted 44 lines
Add a call to
of_dma_configurewith the mixers DT node but on the DRM virtual device to configure it in the same way than the mixers.Reviewed-by Paul Kocialkowski <[email protected]>Signed-off-by Maxime Ripard <[email protected]>(cherry picked from commit b718102dbdfd0285ad559687a30e27cc9124e592)[Maxime: Applied to -fixes since it missed the merge window and display is
broken without it]Signed-off-by Maxime Ripard <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/gpu/drm/sun4i/sun8i_mixer.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)drivers/gpu/drm/sun4i/sun8i_mixer.c +13
-1@@ -452,6 +452,19 @@ static int sun8i_mixer_bind(struct device *dev, struct device *master, mixer->engine.ops = &sun8i_engine_ops; mixer->engine.node = dev->of_node; +if (of_find_property (dev->of_node,"iommus" ,NULL )) { +/* +* This assume we have the same DMA constraints for +* all our the mixers in our pipeline. This sounds +* bad, but it has always been the case for us, and +* DRM doesn't do per-device allocation either, so we +* would need to fix DRM first... +*/ + ret =of_dma_configure (drm->dev, dev->of_node, true); +if (ret) +return ret; + } +/* * While this function can fail, we shouldn't do anything * if this happens. Some early DE2 DT entries don't provide -- 2.25.1
Greg Kroah-Hartman
maintainerRe: [PATCH 5.4 026/109] drm/sun4i: mixer: Call of_dma_configure if theres an IOMMU
Quoted 7 lines · Chen-Yu Tsai
Hi Greg,
Quoted 3 lines · Greg Kroah-Hartman
From: Maxime Ripard <[email protected]>
Quoted 8 lines
Quoted 5 lines
[ Upstream commit
842ec61f4006a6477a9deaedd69131e9f46e4cb5]The main DRM device is actually a virtual device so it doesn't have the iommus property, which is instead on the DMA masters, in this case the mixers.
The iommu driver and DT changes were added in v5.8-rc1. IMO There is no point in backporting this patch to any stable kernel.
Now dropped from everywhere, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 27/109 cifs: update ctime and mtime during truncate
In reply to Greg Kroah-HartmanFrom: Zhang Xiaoxu <[email protected]>
[ Upstream commit 5618303d8516f8ac5ecfe53ee8e8bc9a40eaf066 ]
As the man description of the truncate, if the size changed, then the st_ctime and st_mtime fields should be updated. But in cifs, we doesn't do it.
It lead the xfstests generic/313 failed.
So, add the ATTR_MTIME|ATTR_CTIME flags on attrs when change the file size
--- fs/cifs/inode.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/cifs/inode.c +9 -0
@@ -2270,6 +2270,15 @@ set_size_out:if (rc ==0 ) { cifsInode->server_eof = attrs->ia_size;cifs_setsize (inode, attrs->ia_size); + +/* +* The man page of truncate says if the size changed, +* then the st_ctime and st_mtime fields for the file +* are updated. +*/ + attrs->ia_ctime = attrs->ia_mtime =current_time (inode); + attrs->ia_valid |=ATTR_CTIME |ATTR_MTIME ; +cifs_truncate_page (inode->i_mapping, inode->i_size); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 28/109 ARM: imx6: add missing put_device() call in imx6q_suspend_init()
In reply to Greg Kroah-HartmanFrom: yu kuai <[email protected]>
[ Upstream commit 4845446036fc9c13f43b54a65c9b757c14f5141b ]
if of_find_device_by_node() succeed, imx6q_suspend_init() doesn't have a corresponding put_device(). Thus add a jump target to fix the exception handling for this function implementation.
--- arch/arm/mach-imx/pm-imx6.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
arch/arm/mach-imx/pm-imx6.c +6 -4
@@ -493,14 +493,14 @@ static int __init imx6q_suspend_init(const struct imx6_pm_socdata *socdata)if (!ocram_pool) {pr_warn ("%s: ocram pool unavailable!\n" , __func__); ret = -ENODEV ; - goto put_node; + goto put_device; } ocram_base =gen_pool_alloc (ocram_pool,MX6Q_SUSPEND_OCRAM_SIZE );if (!ocram_base) {pr_warn ("%s: unable to alloc ocram!\n" , __func__); ret = -ENOMEM ; - goto put_node; + goto put_device; } ocram_pbase =gen_pool_virt_to_phys (ocram_pool, ocram_base);
@@ -523,7 +523,7 @@ static int __init imx6q_suspend_init(const struct imx6_pm_socdata *socdata) ret =imx6_pm_get_base (&pm_info->mmdc_base, socdata->mmdc_compat);if (ret) {pr_warn ("%s: failed to get mmdc base %d!\n" , __func__, ret); - goto put_node; + goto put_device; } ret =imx6_pm_get_base (&pm_info->src_base, socdata->src_compat);
@@ -570,7 +570,7 @@ static int __init imx6q_suspend_init(const struct imx6_pm_socdata *socdata) &imx6_suspend, MX6Q_SUSPEND_OCRAM_SIZE - sizeof(*pm_info)); - goto put_node; + goto put_device; pl310_cache_map_failed:iounmap (pm_info->gpc_base.vbase);
@@ -580,6 +580,8 @@ iomuxc_map_failed:iounmap (pm_info->src_base.vbase); src_map_failed:iounmap (pm_info->mmdc_base.vbase); +put_device: +put_device (&pdev->dev); put_node:of_node_put (node);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 29/109 scsi: mptscsih: Fix read sense data size
In reply to Greg Kroah-HartmanFrom: Tomas Henzl <[email protected]>
[ Upstream commit afe89f115e84edbc76d316759e206580a06c6973 ]
The sense data buffer in sense_buf_pool is allocated with size of MPT_SENSE_BUFFER_ALLOC(64) (multiplied by req_depth) while SNS_LEN(sc)(96) is used when reading the data. That may lead to a read from unallocated area, sometimes from another (unallocated) page. To fix this, limit the read size to MPT_SENSE_BUFFER_ALLOC.
--- drivers/message/fusion/mptscsih.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/message/fusion/mptscsih.c +1 -3
@@ -118,8 +118,6 @@ int mptscsih_suspend(struct pci_dev *pdev, pm_message_t state);int mptscsih_resume (struct pci_dev *pdev);#endif -#define SNS_LEN (scp) SCSI_SENSE_BUFFERSIZE -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*
@@ -2422,7 +2420,7 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR/* Copy the sense received into the scsi command block. */ req_index =le16_to_cpu (mf->u.frame.hwhdr.msgctxu.fld.req_idx); sense_data = ((u8 *)ioc->sense_buf_pool + (req_index *MPT_SENSE_BUFFER_ALLOC )); -memcpy (sc->sense_buffer, sense_data,SNS_LEN (sc)); +memcpy (sc->sense_buffer, sense_data,MPT_SENSE_BUFFER_ALLOC );/* Log SMART data (asc = 0x5D, non-IM case only) if required. */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 30/109 usb: dwc3: pci: Fix reference count leak in dwc3_pci_resume_work
In reply to Greg Kroah-HartmanFrom: Aditya Pakki <[email protected]>
[ Upstream commit 2655971ad4b34e97dd921df16bb0b08db9449df7 ]
dwc3_pci_resume_work() calls pm_runtime_get_sync() that increments the reference counter. In case of failure, decrement the reference before returning.
--- drivers/usb/dwc3/dwc3-pci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/dwc3/dwc3-pci.c +3 -1
@@ -206,8 +206,10 @@ static void dwc3_pci_resume_work(struct work_struct *work)int ret; ret =pm_runtime_get_sync (&dwc3->dev); -if (ret) +if (ret) { +pm_runtime_put_sync_autosuspend (&dwc3->dev);return ; + }pm_runtime_mark_last_busy (&dwc3->dev);pm_runtime_put_sync_autosuspend (&dwc3->dev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 31/109 block: release bip in a right way in error path
In reply to Greg Kroah-HartmanFrom: Chengguang Xu <[email protected]>
[ Upstream commit 0b8eb629a700c0ef15a437758db8255f8444e76c ]
Release bip using kfree() in error path when that was allocated by kmalloc().
--- block/bio-integrity.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
block/bio-integrity.c +14 -9
@@ -24,6 +24,18 @@ void blk_flush_integrity(void)flush_workqueue (kintegrityd_wq); } +void __bio_integrity_free (struct bio_set *bs,struct bio_integrity_payload *bip) +{ +if (bs &&mempool_initialized (&bs->bio_integrity_pool)) { +if (bip->bip_vec) +bvec_free (&bs->bvec_integrity_pool, bip->bip_vec, + bip->bip_slab); +mempool_free (bip, &bs->bio_integrity_pool); + }else { +kfree (bip); + } +} +/** * bio_integrity_alloc - Allocate integrity payload and attach it to bio * @bio: bio to attach integrity metadata to
@@ -75,7 +87,7 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,return bip; err: -mempool_free (bip, &bs->bio_integrity_pool); +__bio_integrity_free (bs, bip);return ERR_PTR (-ENOMEM ); }EXPORT_SYMBOL (bio_integrity_alloc);
@@ -96,14 +108,7 @@ void bio_integrity_free(struct bio *bio)kfree (page_address (bip->bip_vec->bv_page) + bip->bip_vec->bv_offset); -if (bs &&mempool_initialized (&bs->bio_integrity_pool)) { -bvec_free (&bs->bvec_integrity_pool, bip->bip_vec, bip->bip_slab); - -mempool_free (bip, &bs->bio_integrity_pool); - }else { -kfree (bip); - } - +__bio_integrity_free (bs, bip); bio->bi_integrity =NULL ; bio->bi_opf &= ~REQ_INTEGRITY ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 32/109 nvme-rdma: assign completion vector correctly
In reply to Greg Kroah-HartmanFrom: Max Gurtovoy <[email protected]>
[ Upstream commit 032a9966a22a3596addf81dacf0c1736dfedc32a ]
The completion vector index that is given during CQ creation can't exceed the number of support vectors by the underlying RDMA device. This violation currently can accure, for example, in case one will try to connect with N regular read/write queues and M poll queues and the sum of N + M > num_supported_vectors. This will lead to failure in establish a connection to remote target. Instead, in that case, share a completion vector between queues.
--- drivers/nvme/host/rdma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/rdma.c +1 -1
@@ -451,7 +451,7 @@ static int nvme_rdma_create_queue_ib(struct nvme_rdma_queue *queue)* Spread I/O queues completion vectors according their queue index. * Admin queues can always go on completion vector 0. */ - comp_vector = idx ==0 ? idx : idx -1 ; + comp_vector = (idx ==0 ? idx : idx -1 ) % ibdev->num_comp_vectors;/* Polling queues need direct cq polling context */ if (nvme_rdma_poll_queue (queue))
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 33/109 x86/entry: Increase entry_stack size to a full page
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
[ Upstream commit c7aadc09321d8f9a1d3bd1e6d8a47222ecddf6c5 ]
Marco crashed in bad_iret with a Clang11/KCSAN build due to overflowing the stack. Now that we run C code on it, expand it to a full page.
--- arch/x86/include/asm/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/include/asm/processor.h +1 -1
@@ -334,7 +334,7 @@ struct x86_hw_tss {#define INVALID_IO_BITMAP_OFFSET 0x8000struct entry_stack { -unsigned long words[64 ]; +char stack[PAGE_SIZE ]; };struct entry_stack_page {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 34/109 sched/core: Check cpus_mask, not cpus_ptr in __set_cpus_allowed_ptr(), to fix mask corruption
In reply to Greg Kroah-HartmanFrom: Scott Wood <[email protected]>
[ Upstream commit fd844ba9ae59b51e34e77105d79f8eca780b3bd6 ]
This function is concerned with the long-term CPU mask, not the transitory mask the task might have while migrate disabled. Before this patch, if a task was migrate-disabled at the time __set_cpus_allowed_ptr() was called, and the new mask happened to be equal to the CPU that the task was running on, then the mask update would be lost.
--- kernel/sched/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/core.c +1 -1
@@ -1649,7 +1649,7 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, goto out; } -if (cpumask_equal (p->cpus_ptr, new_mask)) +if (cpumask_equal (&p->cpus_mask, new_mask)) goto out; dest_cpu =cpumask_any_and (cpu_valid_mask, new_mask);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 35/109 net: qrtr: Fix an out of bounds read qrtr_endpoint_post()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit 8ff41cc21714704ef0158a546c3c4d07fae2c952 upstream.
This code assumes that the user passed in enough data for a qrtr_hdr_v1 or qrtr_hdr_v2 struct, but it's not necessarily true. If the buffer is too small then it will read beyond the end.
--- net/qrtr/qrtr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/qrtr/qrtr.c +5 -1
@@ -259,7 +259,7 @@ int qrtr_endpoint_post(struct qrtr_endpounsigned int ver;size_t hdrlen; -if (len &3 ) +if (len ==0 || len &3 )return -EINVAL ; skb =netdev_alloc_skb (NULL , len);
@@ -273,6 +273,8 @@ int qrtr_endpoint_post(struct qrtr_endposwitch (ver) {case QRTR_PROTO_VER_1 : +if (len <sizeof (*v1)) + goto err; v1 = data; hdrlen =sizeof (*v1);
@@ -286,6 +288,8 @@ int qrtr_endpoint_post(struct qrtr_endpo size =le32_to_cpu (v1->size);break ;case QRTR_PROTO_VER_2 : +if (len <sizeof (*v2)) + goto err; v2 = data; hdrlen =sizeof (*v2) + v2->optlen;
Greg Kroah-Hartman
maintainerPATCH 36/109 gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit ba8c90c6184784b397807b72403656085ac2f8c1 ]
ACPI table on Intel Galileo Gen 2 has wrong pin number for IRQ resource of one of the I²C GPIO expanders. Since we know what that number is and luckily have GPIO bases fixed for SoC's controllers, we may use a simple DMI quirk to match the platform and retrieve GpioInt() pin on it for the expander in question.
Mika suggested the way to avoid a quirk in the GPIO ACPI library and here is the second, almost rewritten version of it.
Depends-on: 25e3ef894eef ("gpio: acpi: Split out acpi_gpio_get_irq_resource() helper")
--- drivers/gpio/gpio-pca953x.c | 79 +++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+)
drivers/gpio/gpio-pca953x.c +79 -0
@@ -107,6 +107,79 @@ static const struct i2c_device_id pca953x_id[] = { };MODULE_DEVICE_TABLE (i2c, pca953x_id); +#ifdef CONFIG_GPIO_PCA953X_IRQ + +#include <linux/dmi.h> +#include <linux/gpio.h> +#include <linux/list.h> + +static const struct dmi_system_id pca953x_dmi_acpi_irq_info[] = { + { +/* +* On Intel Galileo Gen 2 board the IRQ pin of one of +* the I²C GPIO expanders, which has GpioInt() resource, +* is provided as an absolute number instead of being +* relative. Since first controller (gpio-sch.c) and +* second (gpio-dwapb.c) are at the fixed bases, we may +* safely refer to the number in the global space to get +* an IRQ out of it. +*/ + .matches = { +DMI_EXACT_MATCH (DMI_BOARD_NAME ,"GalileoGen2" ), + }, + }, + {} +}; + +#ifdef CONFIG_ACPI +static int pca953x_acpi_get_pin (struct acpi_resource *ares,void *data) +{ +struct acpi_resource_gpio *agpio; +int *pin = data; + +if (acpi_gpio_get_irq_resource (ares, &agpio)) + *pin = agpio->pin_table[0 ]; +return 1 ; +} + +static int pca953x_acpi_find_pin (struct device *dev) +{ +struct acpi_device *adev =ACPI_COMPANION (dev); +int pin = -ENOENT , ret; +LIST_HEAD (r); + + ret =acpi_dev_get_resources (adev, &r, pca953x_acpi_get_pin, &pin); +acpi_dev_free_resource_list (&r); +if (ret <0 ) +return ret; + +return pin; +} +#else +static inline int pca953x_acpi_find_pin (struct device *dev) {return -ENXIO ; } +#endif + +static int pca953x_acpi_get_irq (struct device *dev) +{ +int pin, ret; + + pin =pca953x_acpi_find_pin (dev); +if (pin <0 ) +return pin; + +dev_info (dev,"Applying ACPI interrupt quirk (GPIO %d)\n" , pin); + +if (!gpio_is_valid (pin)) +return -EINVAL ; + + ret =gpio_request (pin,"pca953x interrupt" ); +if (ret) +return ret; + +return gpio_to_irq (pin); +} +#endif +static const struct acpi_device_id pca953x_acpi_ids[] = { {"INT3491" ,16 |PCA953X_TYPE |PCA_LATCH_INT , }, { }
@@ -772,6 +845,12 @@ static int pca953x_irq_setup(struct pca953x_chip *chip,u8 reg_direction[MAX_BANK ];int ret, i; +if (dmi_first_match (pca953x_dmi_acpi_irq_info)) { + ret =pca953x_acpi_get_irq (&client->dev); +if (ret >0 ) + client->irq = ret; + } +if (!client->irq)return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 37/109 gpio: pca953x: Fix GPIO resource leak on Intel Galileo Gen 2
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 5d8913504ccfeea6120df5ae1c6f4479ff09b931 ]
When adding a quirk for IRQ on Intel Galileo Gen 2 the commit ba8c90c61847 ("gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2") missed GPIO resource release. We can safely do this in the same quirk, since IRQ will be locked by GPIO framework when requested and unlocked on freeing.
--- drivers/gpio/gpio-pca953x.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpio/gpio-pca953x.c +6 -1
@@ -176,7 +176,12 @@ static int pca953x_acpi_get_irq(struct device *dev)if (ret)return ret; - return gpio_to_irq(pin); + ret =gpio_to_irq (pin); + +/* When pin is used as an IRQ, no need to keep it requested */ +gpio_free (pin); + + return ret; }#endif
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 38/109 nl80211: dont return err unconditionally in nl80211_start_ap()
In reply to Greg Kroah-HartmanFrom: Luca Coelho <[email protected]>
[ Upstream commit bc7a39b4272b9672d806d422b6850e8c1a09914c ]
When a memory leak was fixed, a return err was changed to goto err, but, accidentally, the if (err) was removed, so now we always exit at this point.
Fix it by adding if (err) back.
--- net/wireless/nl80211.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/wireless/nl80211.c +2 -1
@@ -4798,7 +4798,8 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) err =nl80211_parse_he_obss_pd ( info->attrs[NL80211_ATTR_HE_OBSS_PD ], ¶ms.he_obss_pd); - goto out; +if (err) + goto out; }nl80211_calculate_ap_params (¶ms);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 39/109 drm/mediatek: Check plane visibility in atomic_update
In reply to Greg Kroah-HartmanFrom: Hsin-Yi Wang <[email protected]>
[ Upstream commit c0b8892e2461b5fa740e47efbb1269a487b04020 ]
Disable the plane if it's not visible. Otherwise mtk_ovl_layer_config() would proceed with invalid plane and we may see vblank timeout.
--- drivers/gpu/drm/mediatek/mtk_drm_plane.c | 25 ++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
drivers/gpu/drm/mediatek/mtk_drm_plane.c +15 -10
@@ -101,6 +101,16 @@ static int mtk_plane_atomic_check(struct drm_plane *plane, true, true); } +static void mtk_plane_atomic_disable (struct drm_plane *plane, +struct drm_plane_state *old_state) +{ +struct mtk_plane_state *state =to_mtk_plane_state (plane->state); + + state->pending.enable = false; +wmb ();/* Make sure the above parameter is set before update */ + state->pending.dirty = true; +} +static void mtk_plane_atomic_update (struct drm_plane *plane,struct drm_plane_state *old_state) {
@@ -115,6 +125,11 @@ static void mtk_plane_atomic_update(struct drm_plane *plane,if (!crtc ||WARN_ON (!fb))return ; +if (!plane->state->visible) { +mtk_plane_atomic_disable (plane, old_state); +return ; + } + gem = fb->obj[0 ]; mtk_gem =to_mtk_gem_obj (gem); addr = mtk_gem->dma_addr;
@@ -136,16 +151,6 @@ static void mtk_plane_atomic_update(struct drm_plane *plane, state->pending.dirty = true; } -static void mtk_plane_atomic_disable (struct drm_plane *plane, -struct drm_plane_state *old_state) -{ -struct mtk_plane_state *state =to_mtk_plane_state (plane->state); - - state->pending.enable = false; -wmb ();/* Make sure the above parameter is set before update */ - state->pending.dirty = true; -} -static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = { .prepare_fb = drm_gem_fb_prepare_fb, .atomic_check = mtk_plane_atomic_check,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 40/109 bpf, sockmap: RCU splat with redirect and strparser error or TLS
In reply to Greg Kroah-HartmanFrom: John Fastabend <[email protected]>
[ Upstream commit 93dd5f185916b05e931cffae636596f21f98546e ]
There are two paths to generate the below RCU splat the first and most obvious is the result of the BPF verdict program issuing a redirect on a TLS socket (This is the splat shown below). Unlike the non-TLS case the caller of the *strp_read() hooks does not wrap the call in a rcu_read_lock/unlock. Then if the BPF program issues a redirect action we hit the RCU splat.
However, in the non-TLS socket case the splat appears to be relatively rare, because the skmsg caller into the strp_data_ready() is wrapped in a rcu_read_lock/unlock. Shown here,
static void sk_psock_strp_data_ready(struct sock *sk)
{
struct sk_psock *psock;
rcu_read_lock();
psock = sk_psock(sk);
if (likely(psock)) {
if (tls_sw_has_ctx_rx(sk)) {
psock->parser.saved_data_ready(sk);
} else {
write_lock_bh(&sk->sk_callback_lock);
strp_data_ready(&psock->parser.strp);
write_unlock_bh(&sk->sk_callback_lock);
}
}
rcu_read_unlock();}
If the above was the only way to run the verdict program we would be safe. But, there is a case where the strparser may throw an ENOMEM error while parsing the skb. This is a result of a failed skb_clone, or alloc_skb_for_msg while building a new merged skb when the msg length needed spans multiple skbs. This will in turn put the skb on the strp_wrk workqueue in the strparser code. The skb will later be dequeued and verdict programs run, but now from a different context without the rcu_read_lock()/unlock() critical section in sk_psock_strp_data_ready() shown above. In practice I have not seen this yet, because as far as I know most users of the verdict programs are also only working on single skbs. In this case no merge happens which could trigger the above ENOMEM errors. In addition the system would need to be under memory pressure. For example, we can't hit the above case in selftests because we missed having tests to merge skbs. (Added in later patch)
To fix the below splat extend the rcu_read_lock/unnlock block to include the call to sk_psock_tls_verdict_apply(). This will fix both TLS redirect case and non-TLS redirect+error case. Also remove psock from the sk_psock_tls_verdict_apply() function signature its not used there.
[ 1095.937597] WARNING: suspicious RCU usage
[ 1095.940964] 5.7.0-rc7-02911-g463bac5f1ca79 #1 Tainted: G W
[ 1095.944363] -----------------------------
[ 1095.947384] include/linux/skmsg.h:284 suspicious rcu_dereference_check() usage!
[ 1095.950866]
[ 1095.950866] other info that might help us debug this:
[ 1095.950866]
[ 1095.957146]
[ 1095.957146] rcu_scheduler_active = 2, debug_locks = 1
[ 1095.961482] 1 lock held by test_sockmap/15970:
[ 1095.964501] #0: ffff9ea6b25de660 (sk_lock-AF_INET){+.+.}-{0:0}, at: tls_sw_recvmsg+0x13a/0x840 [tls]
[ 1095.968568]
[ 1095.968568] stack backtrace:
[ 1095.975001] CPU: 1 PID: 15970 Comm: test_sockmap Tainted: G W 5.7.0-rc7-02911-g463bac5f1ca79 #1
[ 1095.977883] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
[ 1095.980519] Call Trace:
[ 1095.982191] dump_stack+0x8f/0xd0
[ 1095.984040] sk_psock_skb_redirect+0xa6/0xf0
[ 1095.986073] sk_psock_tls_strp_read+0x1d8/0x250
[ 1095.988095] tls_sw_recvmsg+0x714/0x840 [tls]v2: Improve commit message to identify non-TLS redirect plus error case
condition as well as more common TLS case. In the process I decided doing the rcu_read_unlock followed by the lock/unlock inside branches was unnecessarily complex. We can just extend the current rcu block and get the same effeective without the shuffling and branching. Thanks Martin!
--- net/core/skmsg.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
net/core/skmsg.c +6 -7
@@ -687,7 +687,7 @@ static struct sk_psock *sk_psock_from_strp(struct strparser *strp) return container_of(parser, struct sk_psock, parser); } -static void sk_psock_skb_redirect (struct sk_psock *psock,struct sk_buff *skb) +static void sk_psock_skb_redirect (struct sk_buff *skb) {struct sk_psock *psock_other;struct sock *sk_other;
@@ -719,12 +719,11 @@ static void sk_psock_skb_redirect(struct sk_psock *psock, struct sk_buff *skb) } } -static void sk_psock_tls_verdict_apply (struct sk_psock *psock, -struct sk_buff *skb,int verdict) +static void sk_psock_tls_verdict_apply (struct sk_buff *skb,int verdict) {switch (verdict) {case __SK_REDIRECT: -sk_psock_skb_redirect (psock, skb); +sk_psock_skb_redirect (skb);break ;case __SK_PASS:case __SK_DROP:
@@ -745,8 +744,8 @@ int sk_psock_tls_strp_read(struct sk_psock *psock, struct sk_buff *skb) ret =sk_psock_bpf_run (psock, prog, skb); ret =sk_psock_map_verd (ret,tcp_skb_bpf_redirect_fetch (skb)); } +sk_psock_tls_verdict_apply (skb, ret);rcu_read_unlock (); -sk_psock_tls_verdict_apply (psock, skb, ret);return ret; }EXPORT_SYMBOL_GPL (sk_psock_tls_strp_read);
@@ -774,7 +773,7 @@ static void sk_psock_verdict_apply(struct sk_psock *psock, } goto out_free;case __SK_REDIRECT: -sk_psock_skb_redirect (psock, skb); +sk_psock_skb_redirect (skb);break ;case __SK_DROP:/* fall-through */
@@ -798,8 +797,8 @@ static void sk_psock_strp_read(struct strparser *strp, struct sk_buff *skb) ret =sk_psock_bpf_run (psock, prog, skb); ret =sk_psock_map_verd (ret,tcp_skb_bpf_redirect_fetch (skb)); } -rcu_read_unlock ();sk_psock_verdict_apply (psock, skb, ret); +rcu_read_unlock (); }static int sk_psock_strp_read_done (struct strparser *strp,int err)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 41/109 bpf, sockmap: RCU dereferenced psock may be used outside RCU block
In reply to Greg Kroah-HartmanFrom: John Fastabend <[email protected]>
[ Upstream commit 8025751d4d55a2f32be6bdf825b6a80c299875f5 ]
If an ingress verdict program specifies message sizes greater than skb->len and there is an ENOMEM error due to memory pressure we may call the rcv_msg handler outside the strp_data_ready() caller context. This is because on an ENOMEM error the strparser will retry from a workqueue. The caller currently protects the use of psock by calling the strp_data_ready() inside a rcu_read_lock/unlock block.
But, in above workqueue error case the psock is accessed outside the read_lock/unlock block of the caller. So instead of using psock directly we must do a look up against the sk again to ensure the psock is available.
There is an an ugly piece here where we must handle
the case where we paused the strp and removed the psock. On psock removal we first pause the strparser and then remove the psock. If the strparser is paused while an skb is scheduled on the workqueue the skb will be dropped on the flow and kfree_skb() is called. If the workqueue manages to get called before we pause the strparser but runs the rcvmsg callback after the psock is removed we will hit the unlikely case where we run the sockmap rcvmsg handler but do not have a psock. For now we will follow strparser logic and drop the skb on the floor with skb_kfree(). This is ugly because the data is dropped. To date this has not caused problems in practice because either the application controlling the sockmap is coordinating with the datapath so that skbs are "flushed" before removal or we simply wait for the sock to be closed before removing it.
This patch fixes the describe RCU bug and dropping the skb doesn't make things worse. Future patches will improve this by allowing the normal case where skbs are not merged to skip the strparser altogether. In practice many (most?) use cases have no need to merge skbs so its both a code complexity hit as seen above and a performance issue. For example, in the Cilium case we always set the strparser up to return sbks 1:1 without any merging and have avoided above issues.
--- net/core/skmsg.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
net/core/skmsg.c +9 -1
@@ -785,11 +785,18 @@ static void sk_psock_verdict_apply(struct sk_psock *psock,static void sk_psock_strp_read (struct strparser *strp,struct sk_buff *skb) { -struct sk_psock *psock =sk_psock_from_strp (strp); +struct sk_psock *psock;struct bpf_prog *prog;int ret = __SK_DROP; +struct sock *sk;rcu_read_lock (); + sk = strp->sk; + psock =sk_psock (sk); +if (unlikely (!psock)) { +kfree_skb (skb); + goto out; + } prog =READ_ONCE (psock->progs.skb_verdict);if (likely (prog)) {skb_orphan (skb);
@@ -798,6 +805,7 @@ static void sk_psock_strp_read(struct strparser *strp, struct sk_buff *skb) ret =sk_psock_map_verd (ret,tcp_skb_bpf_redirect_fetch (skb)); }sk_psock_verdict_apply (psock, skb, ret); +out:rcu_read_unlock (); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 42/109 netfilter: ipset: call ip_set_free() instead of kfree()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit c4e8fa9074ad94f80e5c0dcaa16b313e50e958c5 ]
Whenever ip_set_alloc() is used, allocated memory can either use kmalloc() or vmalloc(). We should call kvfree() or ip_set_free()
invalid opcode: 0000 [#1] PREEMPT SMP KASAN
CPU: 0 PID: 21935 Comm: syz-executor.3 Not tainted 5.8.0-rc2-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:__phys_addr+0xa7/0x110 arch/x86/mm/physaddr.c:28 Code: 1d 7a 09 4c 89 e3 31 ff 48 d3 eb 48 89 de e8 d0 58 3f 00 48 85 db 75 0d e8 26 5c 3f 00 4c 89 e0 5b 5d 41 5c c3 e8 19 5c 3f 00 <0f> 0b e8 12 5c 3f 00 48 c7 c0 10 10 a8 89 48 ba 00 00 00 00 00 fc RSP: 0000:ffffc900018572c0 EFLAGS: 00010046 RAX: 0000000000040000 RBX: 0000000000000001 RCX: ffffc9000fac3000 RDX: 0000000000040000 RSI: ffffffff8133f437 RDI: 0000000000000007 RBP: ffffc90098aff000 R08: 0000000000000000 R09: ffff8880ae636cdb R10: 0000000000000000 R11: 0000000000000000 R12: 0000408018aff000 R13: 0000000000080000 R14: 000000000000001d R15: ffffc900018573d8 FS: 00007fc540c66700(0000) GS:ffff8880ae600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007fc9dcd67200 CR3: 0000000059411000 CR4: 00000000001406f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: virt_to_head_page include/linux/mm.h:841 [inline] virt_to_cache mm/slab.h:474 [inline] kfree+0x77/0x2c0 mm/slab.c:3749 hash_net_create+0xbb2/0xd70 net/netfilter/ipset/ip_set_hash_gen.h:1536 ip_set_create+0x6a2/0x13c0 net/netfilter/ipset/ip_set_core.c:1128 nfnetlink_rcv_msg+0xbe8/0xea0 net/netfilter/nfnetlink.c:230 netlink_rcv_skb+0x15a/0x430 net/netlink/af_netlink.c:2469 nfnetlink_rcv+0x1ac/0x420 net/netfilter/nfnetlink.c:564 netlink_unicast_kernel net/netlink/af_netlink.c:1303 [inline] netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1329 netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1918 sock_sendmsg_nosec net/socket.c:652 [inline] sock_sendmsg+0xcf/0x120 net/socket.c:672 ____sys_sendmsg+0x6e8/0x810 net/socket.c:2352 ___sys_sendmsg+0xf3/0x170 net/socket.c:2406 __sys_sendmsg+0xe5/0x1b0 net/socket.c:2439 do_syscall_64+0x60/0xe0 arch/x86/entry/common.c:359 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x45cb19 Code: Bad RIP value. RSP: 002b:00007fc540c65c78 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 00000000004fed80 RCX: 000000000045cb19 RDX: 0000000000000000 RSI: 0000000020001080 RDI: 0000000000000003 RBP: 000000000078bf00 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00000000ffffffff R13: 000000000000095e R14: 00000000004cc295 R15: 00007fc540c666d4
--- net/netfilter/ipset/ip_set_bitmap_ip.c | 2 +- net/netfilter/ipset/ip_set_bitmap_ipmac.c | 2 +- net/netfilter/ipset/ip_set_bitmap_port.c | 2 +- net/netfilter/ipset/ip_set_hash_gen.h | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-)
net/netfilter/ipset/ip_set_bitmap_ip.c +1 -1
@@ -314,7 +314,7 @@ bitmap_ip_create(struct net *net, struct ip_set *set, struct nlattr *tb[], set->variant = &bitmap_ip;if (!init_map_ip (set, map, first_ip, last_ip, elements, hosts, netmask)) { -kfree (map); +ip_set_free (map);return -ENOMEM ; }if (tb[IPSET_ATTR_TIMEOUT ]) {
net/netfilter/ipset/ip_set_bitmap_ipmac.c +1 -1
@@ -363,7 +363,7 @@ bitmap_ipmac_create(struct net *net, struct ip_set *set, struct nlattr *tb[], map->memsize =BITS_TO_LONGS (elements) *sizeof (unsigned long ); set->variant = &bitmap_ipmac;if (!init_map_ipmac (set, map, first_ip, last_ip, elements)) { -kfree (map); +ip_set_free (map);return -ENOMEM ; }if (tb[IPSET_ATTR_TIMEOUT ]) {
net/netfilter/ipset/ip_set_bitmap_port.c +1 -1
@@ -247,7 +247,7 @@ bitmap_port_create(struct net *net, struct ip_set *set, struct nlattr *tb[], map->memsize =BITS_TO_LONGS (elements) *sizeof (unsigned long ); set->variant = &bitmap_port;if (!init_map_port (set, map, first_port, last_port)) { -kfree (map); +ip_set_free (map);return -ENOMEM ; }if (tb[IPSET_ATTR_TIMEOUT ]) {
net/netfilter/ipset/ip_set_hash_gen.h +2 -2
@@ -682,7 +682,7 @@ mtype_resize(struct ip_set *set, bool retried) } t->hregion =ip_set_alloc (ahash_sizeof_regions (htable_bits));if (!t->hregion) { -kfree (t); +ip_set_free (t); ret = -ENOMEM ; goto out; }
@@ -1533,7 +1533,7 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set, } t->hregion =ip_set_alloc (ahash_sizeof_regions (hbits));if (!t->hregion) { -kfree (t); +ip_set_free (t);kfree (h);return -ENOMEM ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 43/109 net: mvneta: fix use of state->speed
In reply to Greg Kroah-HartmanFrom: Russell King <[email protected]>
[ Upstream commit f2ca673d2cd5df9a76247b670e9ffd4d63682b3f ]
When support for short preambles was added, it incorrectly keyed its decision off state->speed instead of state->interface. state->speed is not guaranteed to be correct for in-band modes, which can lead to short preambles being unexpectedly disabled.
Fix this by keying off the interface mode, which is the only way that mvneta can operate at 2.5Gbps.
--- drivers/net/ethernet/marvell/mvneta.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/marvell/mvneta.c +1 -1
@@ -3594,7 +3594,7 @@ static void mvneta_mac_config(struct phylink_config *config, unsigned int mode,/* When at 2.5G, the link partner can send frames with shortened * preambles. */ -if (state->speed ==SPEED_2500 ) +if (state->interface ==PHY_INTERFACE_MODE_2500BASEX ) new_ctrl4 |=MVNETA_GMAC4_SHORT_PREAMBLE_ENABLE ;if (pp->phy_interface != state->interface) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 44/109 net: cxgb4: fix return error value in t4_prep_fw
In reply to Greg Kroah-HartmanFrom: Li Heng <[email protected]>
[ Upstream commit 8a259e6b73ad8181b0b2ef338b35043433db1075 ]
t4_prep_fw goto bye tag with positive return value when something bad happened and which can not free resource in adap_init0. so fix it to return negative value.
--- drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +4 -4
@@ -3499,7 +3499,7 @@ int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info, drv_fw = &fw_info->fw_hdr;/* Read the header of the firmware on the card */ - ret = -t4_read_flash (adap,FLASH_FW_START , + ret =t4_read_flash (adap,FLASH_FW_START ,sizeof (*card_fw) /sizeof (uint32_t ), (uint32_t *)card_fw,1 );if (ret ==0 ) {
@@ -3528,8 +3528,8 @@ int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info,should_install_fs_fw (adap, card_fw_usable,be32_to_cpu (fs_fw->fw_ver), be32_to_cpu(card_fw->fw_ver))) { - ret = -t4_fw_upgrade(adap, adap->mbox, fw_data, - fw_size,0 ); + ret = t4_fw_upgrade(adap, adap->mbox, fw_data, + fw_size,0 );if (ret !=0 ) {dev_err (adap->pdev_dev,"failed to install firmware: %d\n" , ret);
@@ -3560,7 +3560,7 @@ int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info,FW_HDR_FW_VER_MICRO_G (c),FW_HDR_FW_VER_BUILD_G (c),FW_HDR_FW_VER_MAJOR_G (k),FW_HDR_FW_VER_MINOR_G (k), FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k)); - ret =EINVAL ; + ret = -EINVAL ; goto bye; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 45/109 IB/sa: Resolv use-after-free in ib_nl_make_request()
In reply to Greg Kroah-HartmanFrom: Divya Indi <[email protected]>
[ Upstream commit f427f4d6214c183c474eeb46212d38e6c7223d6a ]
There is a race condition where ib_nl_make_request() inserts the request data into the linked list but the timer in ib_nl_request_timeout() can see it and destroy it before ib_nl_send_msg() is done touching it. This could happen, for instance, if there is a long delay allocating memory during nlmsg_new()
This causes a use-after-free in the send_mad() thread:
[<ffffffffa02f43cb>] ? ib_pack+0x17b/0x240 [ib_core] [ <ffffffffa032aef1>] ib_sa_path_rec_get+0x181/0x200 [ib_sa]
[<ffffffffa0379db0>] rdma_resolve_route+0x3c0/0x8d0 [rdma_cm] [<ffffffffa0374450>] ? cma_bind_port+0xa0/0xa0 [rdma_cm] [<ffffffffa040f850>] ? rds_rdma_cm_event_handler_cmn+0x850/0x850 [rds_rdma] [<ffffffffa040f22c>] rds_rdma_cm_event_handler_cmn+0x22c/0x850 [rds_rdma] [<ffffffffa040f860>] rds_rdma_cm_event_handler+0x10/0x20 [rds_rdma] [<ffffffffa037778e>] addr_handler+0x9e/0x140 [rdma_cm] [<ffffffffa026cdb4>] process_req+0x134/0x190 [ib_addr] [<ffffffff810a02f9>] process_one_work+0x169/0x4a0 [<ffffffff810a0b2b>] worker_thread+0x5b/0x560 [<ffffffff810a0ad0>] ? flush_delayed_work+0x50/0x50 [<ffffffff810a68fb>] kthread+0xcb/0xf0 [<ffffffff816ec49a>] ? __schedule+0x24a/0x810 [<ffffffff816ec49a>] ? __schedule+0x24a/0x810 [<ffffffff810a6830>] ? kthread_create_on_node+0x180/0x180 [<ffffffff816f25a7>] ret_from_fork+0x47/0x90 [<ffffffff810a6830>] ? kthread_create_on_node+0x180/0x180
The ownership rule is once the request is on the list, ownership transfers to the list and the local thread can't touch it any more, just like for the normal MAD case in send_mad().
Thus, instead of adding before send and then trying to delete after on errors, move the entire thing under the spinlock so that the send and update of the lists are atomic to the conurrent threads. Lightly reoganize things so spinlock safe memory allocations are done in the final NL send path and the rest of the setup work is done before and outside the lock.
--- drivers/infiniband/core/sa_query.c | 38 +++++++++++++----------------- 1 file changed, 17 insertions(+), 21 deletions(-)
drivers/infiniband/core/sa_query.c +17 -21
@@ -829,13 +829,20 @@ static int ib_nl_get_path_rec_attrs_len(ib_sa_comp_mask comp_mask)return len; } -static int ib_nl_send_msg (struct ib_sa_query *query,gfp_t gfp_mask) +static int ib_nl_make_request (struct ib_sa_query *query,gfp_t gfp_mask) {struct sk_buff *skb =NULL ;struct nlmsghdr *nlh;void *data;struct ib_sa_mad *mad;int len; +unsigned long flags; +unsigned long delay; +gfp_t gfp_flag; +int ret; + +INIT_LIST_HEAD (&query->list); + query->seq = (u32 )atomic_inc_return (&ib_nl_sa_request_seq); mad = query->mad_buf->mad; len =ib_nl_get_path_rec_attrs_len (mad->sa_hdr.comp_mask);
@@ -860,36 +867,25 @@ static int ib_nl_send_msg(struct ib_sa_query *query, gfp_t gfp_mask)/* Repair the nlmsg header length */ nlmsg_end (skb, nlh); -return rdma_nl_multicast (&init_net, skb,RDMA_NL_GROUP_LS , gfp_mask); -} + gfp_flag = ((gfp_mask &GFP_ATOMIC ) ==GFP_ATOMIC ) ?GFP_ATOMIC : +GFP_NOWAIT ; -static int ib_nl_make_request (struct ib_sa_query *query,gfp_t gfp_mask) -{ -unsigned long flags; -unsigned long delay; -int ret; +spin_lock_irqsave (&ib_nl_request_lock, flags); + ret =rdma_nl_multicast (&init_net, skb,RDMA_NL_GROUP_LS , gfp_flag); -INIT_LIST_HEAD (&query->list); - query->seq = (u32 )atomic_inc_return (&ib_nl_sa_request_seq); +if (ret) + goto out; -/* Put the request on the list first.*/ -spin_lock_irqsave (&ib_nl_request_lock, flags); +/* Put the request on the list.*/ delay =msecs_to_jiffies (sa_local_svc_timeout_ms); query->timeout = delay + jiffies;list_add_tail (&query->list, &ib_nl_request_list);/* Start the timeout if this is the only request */ if (ib_nl_request_list.next == &query->list)queue_delayed_work (ib_nl_wq, &ib_nl_timed_work, delay); -spin_unlock_irqrestore (&ib_nl_request_lock, flags); - ret =ib_nl_send_msg (query, gfp_mask); -if (ret) { - ret = -EIO ; -/* Remove the request */ -spin_lock_irqsave (&ib_nl_request_lock, flags); -list_del (&query->list); -spin_unlock_irqrestore (&ib_nl_request_lock, flags); - } +out: +spin_unlock_irqrestore (&ib_nl_request_lock, flags);return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 46/109 net: dsa: microchip: set the correct number of ports
In reply to Greg Kroah-HartmanFrom: Codrin Ciubotariu <[email protected]>
[ Upstream commit af199a1a9cb02ec0194804bd46c174b6db262075 ]
The number of ports is incorrectly set to the maximum available for a DSA switch. Even if the extra ports are not used, this causes some functions to be called later, like port_disable() and port_stp_state_set(). If the driver doesn't check the port index, it will end up modifying unknown registers.
--- drivers/net/dsa/microchip/ksz8795.c | 3 +++ drivers/net/dsa/microchip/ksz9477.c | 3 +++ 2 files changed, 6 insertions(+)
drivers/net/dsa/microchip/ksz8795.c +3 -0
@@ -1267,6 +1267,9 @@ static int ksz8795_switch_init(struct ksz_device *dev)return -ENOMEM ; } +/* set the real number of ports */ + dev->ds->num_ports = dev->port_cnt; +return 0 ; }
drivers/net/dsa/microchip/ksz9477.c +3 -0
@@ -1587,6 +1587,9 @@ static int ksz9477_switch_init(struct ksz_device *dev)return -ENOMEM ; } +/* set the real number of ports */ + dev->ds->num_ports = dev->port_cnt; +return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 47/109 netfilter: conntrack: refetch conntrack after nf_conntrack_update()
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit d005fbb855d3b5660d62ee5a6bd2d99c13ff8cf3 ]
__nf_conntrack_update() might refresh the conntrack object that is attached to the skbuff. Otherwise, this triggers UAF.
[ 633.200434] ================================================================== [ 633.200472] BUG: KASAN: use-after-free in nf_conntrack_update+0x34e/0x770 [nf_conntrack] [ 633.200478] Read of size 1 at addr ffff888370804c00 by task nfqnl_test/6769
[ 633.200487] CPU: 1 PID: 6769 Comm: nfqnl_test Not tainted 5.8.0-rc2+ #388 [ 633.200490] Hardware name: LENOVO 23259H1/23259H1, BIOS G2ET32WW (1.12 ) 05/30/2012 [ 633.200491] Call Trace: [ 633.200499] dump_stack+0x7c/0xb0 [ 633.200526] ? nf_conntrack_update+0x34e/0x770 [nf_conntrack] [ 633.200532] print_address_description.constprop.6+0x1a/0x200 [ 633.200539] ? _raw_write_lock_irqsave+0xc0/0xc0 [ 633.200568] ? nf_conntrack_update+0x34e/0x770 [nf_conntrack] [ 633.200594] ? nf_conntrack_update+0x34e/0x770 [nf_conntrack] [ 633.200598] kasan_report.cold.9+0x1f/0x42 [ 633.200604] ? call_rcu+0x2c0/0x390 [ 633.200633] ? nf_conntrack_update+0x34e/0x770 [nf_conntrack] [ 633.200659] nf_conntrack_update+0x34e/0x770 [nf_conntrack] [ 633.200687] ? nf_conntrack_find_get+0x30/0x30 [nf_conntrack]
--- net/netfilter/nf_conntrack_core.c | 2 ++ 1 file changed, 2 insertions(+)
net/netfilter/nf_conntrack_core.c +2 -0
@@ -2012,6 +2012,8 @@ static int nf_conntrack_update(struct net *net, struct sk_buff *skb) err =__nf_conntrack_update (net, skb, ct, ctinfo);if (err <0 )return err; + + ct =nf_ct_get (skb, &ctinfo); }return nf_confirm_cthelper (skb, ct, ctinfo);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 48/109 perf report TUI: Fix segmentation fault in perf_evsel__hists_browse()
In reply to Greg Kroah-HartmanFrom: Wei Li <[email protected]>
[ Upstream commit d61cbb859b45fdb6b4997f2d51834fae41af0e94 ]
The segmentation fault can be reproduced as following steps:
1) Executing perf report in tui.
2) Typing '/xxxxx' to filter the symbol to get nothing matched.
3) Pressing enter with no entry selected.
Then it will report a segmentation fault.
It is caused by the lack of check of browser->he_selection when accessing it's member res_samples in perf_evsel__hists_browse().
These processes are meaningful for specified samples, so we can skip these when nothing is selected.
--- tools/perf/ui/browsers/hists.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
tools/perf/ui/browsers/hists.c +11 -6
@@ -2224,6 +2224,11 @@ static struct thread *hist_browser__selected_thread(struct hist_browser *browserreturn browser->he_selection->thread; } +static struct res_sample *hist_browser__selected_res_sample (struct hist_browser *browser) +{ +return browser->he_selection ? browser->he_selection->res_samples :NULL ; +} +/* Check whether the browser is for 'top' or 'report' */ static inline bool is_report_browser (void *timer) {
@@ -3170,16 +3175,16 @@ static int perf_evsel__hists_browse(struct evsel *evsel, int nr_events, &options[nr_options], NULL, NULL, evsel); nr_options +=add_res_sample_opt (browser, &actions[nr_options], &options[nr_options], -hist_browser__selected_entry (browser)->res_samples, - evsel,A_NORMAL ); +hist_browser__selected_res_sample (browser), + evsel,A_NORMAL ); nr_options +=add_res_sample_opt (browser, &actions[nr_options], &options[nr_options], -hist_browser__selected_entry (browser)->res_samples, - evsel,A_ASM ); +hist_browser__selected_res_sample (browser), + evsel,A_ASM ); nr_options +=add_res_sample_opt (browser, &actions[nr_options], &options[nr_options], -hist_browser__selected_entry (browser)->res_samples, - evsel,A_SOURCE ); +hist_browser__selected_res_sample (browser), + evsel,A_SOURCE ); nr_options +=add_switch_opt (browser, &actions[nr_options], &options[nr_options]); skip_scripting:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 49/109 perf intel-pt: Fix recording PEBS-via-PT with registers
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
[ Upstream commit 75bcb8776dc987538f267ba4ba05ca43fc2b1676 ]
When recording PEBS-via-PT, the kernel will not accept the intel_pt event with register sampling e.g.
# perf record --kcore -c 10000 -e '{intel_pt/branch=0/,branch-loads/aux-output/ppp}' -I -- ls -l
Error:
intel_pt/branch=0/: PMU Hardware doesn't support sampling/overflow-interrupts. Try 'perf stat'Fix by suppressing register sampling on the intel_pt evsel.
Committer notes:
Adrian informed that this is only available from Tremont onwards, so on older processors the error continues the same as before.
--- tools/perf/arch/x86/util/intel-pt.c | 1 + tools/perf/util/evsel.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-)
tools/perf/arch/x86/util/intel-pt.c +1 -0
@@ -596,6 +596,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr, } evsel->core.attr.freq =0 ; evsel->core.attr.sample_period =1 ; + evsel->no_aux_samples = true; intel_pt_evsel = evsel; opts->full_auxtrace = true; }
tools/perf/util/evsel.c +2 -2
@@ -1028,12 +1028,12 @@ void perf_evsel__config(struct evsel *evsel, struct record_opts *opts,if (callchain && callchain->enabled && !evsel->no_aux_samples)perf_evsel__config_callchain (evsel, opts, callchain); -if (opts->sample_intr_regs) { +if (opts->sample_intr_regs && !evsel->no_aux_samples) { attr->sample_regs_intr = opts->sample_intr_regs;perf_evsel__set_sample_bit (evsel,REGS_INTR ); } -if (opts->sample_user_regs) { +if (opts->sample_user_regs && !evsel->no_aux_samples) { attr->sample_regs_user |= opts->sample_user_regs;perf_evsel__set_sample_bit (evsel,REGS_USER ); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 50/109 perf intel-pt: Fix PEBS sample for XMM registers
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
[ Upstream commit 4c95ad261cfac120dd66238fcae222766754c219 ]
The condition to add XMM registers was missing, the regs array needed to be in the outer scope, and the size of the regs array was too small.
--- tools/perf/util/intel-pt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/perf/util/intel-pt.c +3 -2
@@ -1707,6 +1707,7 @@ static int intel_pt_synth_pebs_sample(struct intel_pt_queue *ptq)u64 sample_type = evsel->core.attr.sample_type;u64 id = evsel->core.id[0 ];u8 cpumode; +u64 regs[8 *sizeof (sample.intr_regs.mask)];if (intel_pt_skip_event (pt))return 0 ;
@@ -1756,8 +1757,8 @@ static int intel_pt_synth_pebs_sample(struct intel_pt_queue *ptq) }if (sample_type &PERF_SAMPLE_REGS_INTR && - items->mask[INTEL_PT_GP_REGS_POS ]) { -u64 regs[sizeof (sample.intr_regs.mask)]; + (items->mask[INTEL_PT_GP_REGS_POS ] || + items->mask[INTEL_PT_XMM_POS ])) {u64 regs_mask = evsel->core.attr.sample_regs_intr;u64 *pos;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 51/109 smsc95xx: check return value of smsc95xx_reset
In reply to Greg Kroah-HartmanFrom: Andre Edich <[email protected]>
[ Upstream commit 7c8b1e855f94f88a0c569be6309fc8d5c8844cd1 ]
The return value of the function smsc95xx_reset() must be checked to avoid returning false success from the function smsc95xx_bind().
--- drivers/net/usb/smsc95xx.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/usb/smsc95xx.c +6 -0
@@ -1287,6 +1287,8 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)/* Init all registers */ ret =smsc95xx_reset (dev); +if (ret) + goto free_pdata;/* detect device revision as different features may be available */ ret =smsc95xx_read_reg (dev,ID_REV , &val);
@@ -1317,6 +1319,10 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)schedule_delayed_work (&pdata->carrier_check,CARRIER_CHECK_DELAY );return 0 ; + +free_pdata: +kfree (pdata); +return ret; }static void smsc95xx_unbind (struct usbnet *dev,struct usb_interface *intf)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 52/109 smsc95xx: avoid memory leak in smsc95xx_bind
In reply to Greg Kroah-HartmanFrom: Andre Edich <[email protected]>
[ Upstream commit 3ed58f96a70b85ef646d5427258f677f1395b62f ]
In a case where the ID_REV register read is failed, the memory for a private data structure has to be freed before returning error from the function smsc95xx_bind.
--- drivers/net/usb/smsc95xx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/usb/smsc95xx.c +2 -1
@@ -1293,7 +1293,8 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)/* detect device revision as different features may be available */ ret =smsc95xx_read_reg (dev,ID_REV , &val);if (ret <0 ) -return ret; + goto free_pdata; + val >>=16 ; pdata->chip_id = val; pdata->mdix_ctrl =get_mdix_status (dev->net);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 53/109 net: hns3: add a missing uninit debugfs when unload driver
In reply to Greg Kroah-HartmanFrom: Huazhong Tan <[email protected]>
[ Upstream commit e22b5e728bbb179b912d3a3cd5c25894a89a26a2 ]
When unloading driver, if flag HNS3_NIC_STATE_INITED has been already cleared, the debugfs will not be uninitialized, so fix it.
--- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +1 -2
@@ -3993,9 +3993,8 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)hns3_put_ring_config (priv); -hns3_dbg_uninit (handle); - out_netdev_free: +hns3_dbg_uninit (handle);free_netdev (netdev); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 54/109 net: hns3: fix use-after-free when doing self test
In reply to Greg Kroah-HartmanFrom: Yonglong Liu <[email protected]>
[ Upstream commit a06656211304fec653c1931c2ca6d644013b5bbb ]
Enable promisc mode of PF, set VF link state to enable, and run iperf of the VF, then do self test of the PF. The self test will fail with a low frequency, and may cause a use-after-free problem.
[ 87.142126] selftest:000004a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [ 87.159722] ================================================================== [ 87.174187] BUG: KASAN: use-after-free in hex_dump_to_buffer+0x140/0x608 [ 87.187600] Read of size 1 at addr ffff003b22828000 by task ethtool/1186 [ 87.201012] [ 87.203978] CPU: 7 PID: 1186 Comm: ethtool Not tainted 5.5.0-rc4-gfd51c473-dirty #4 [ 87.219306] Hardware name: Huawei TaiShan 2280 V2/BC82AMDA, BIOS TA BIOS 2280-A CS V2.B160.01 01/15/2020 [ 87.238292] Call trace: [ 87.243173] dump_backtrace+0x0/0x280 [ 87.250491] show_stack+0x24/0x30 [ 87.257114] dump_stack+0xe8/0x140 [ 87.263911] print_address_description.isra.8+0x70/0x380 [ 87.274538] __kasan_report+0x12c/0x230 [ 87.282203] kasan_report+0xc/0x18 [ 87.288999] __asan_load1+0x60/0x68 [ 87.295969] hex_dump_to_buffer+0x140/0x608 [ 87.304332] print_hex_dump+0x140/0x1e0 [ 87.312000] hns3_lb_check_skb_data+0x168/0x170 [ 87.321060] hns3_clean_rx_ring+0xa94/0xfe0 [ 87.329422] hns3_self_test+0x708/0x8c0
The length of packet sent by the selftest process is only 128 + 14 bytes, and the min buffer size of a BD is 256 bytes, and the receive process will make sure the packet sent by the selftest process is in the linear part, so only check the linear part in hns3_lb_check_skb_data().
So fix this use-after-free by using skb_headlen() to dump skb->data instead of skb->len.
--- drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +6 -3
@@ -174,18 +174,21 @@ static void hns3_lb_check_skb_data(struct hns3_enet_ring *ring, {struct hns3_enet_tqp_vector *tqp_vector = ring->tqp_vector;unsigned char *packet = skb->data; +u32 len =skb_headlen (skb);u32 i; -for (i =0 ; i < skb->len; i++) + len =min_t (u32, len,HNS3_NIC_LB_TEST_PACKET_SIZE ); + +for (i =0 ; i < len; i++)if (packet[i] != (unsigned char )(i &0xff ))break ;/* The packet is correctly received */ -if (i == skb->len) +if (i ==HNS3_NIC_LB_TEST_PACKET_SIZE ) tqp_vector->rx_group.total_packets++;else print_hex_dump (KERN_ERR ,"selftest:" ,DUMP_PREFIX_OFFSET ,16 ,1 , - skb->data, skb->len, true); + skb->data, len, true);dev_kfree_skb_any (skb); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 55/109 ALSA: compress: fix partial_drain completion state
In reply to Greg Kroah-HartmanFrom: Vinod Koul <[email protected]>
[ Upstream commit f79a732a8325dfbd570d87f1435019d7e5501c6d ]
On partial_drain completion we should be in SNDRV_PCM_STATE_RUNNING state, so set that for partially draining streams in snd_compr_drain_notify() and use a flag for partially draining streams
While at it, add locks for stream state change insnd_compr_drain_notify() as well.
--- include/sound/compress_driver.h | 10 +++++++++- sound/core/compress_offload.c | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-)
include/sound/compress_driver.h +9 -1
@@ -59,6 +59,7 @@ struct snd_compr_runtime {* @direction: stream direction, playback/recording * @metadata_set: metadata set flag, true when set * @next_track: has userspace signal next track transition, true when set +* @partial_drain: undergoing partial_drain for stream, true when set * @private_data: pointer to DSP private data */ struct snd_compr_stream {
@@ -70,6 +71,7 @@ struct snd_compr_stream {enum snd_compr_direction direction;bool metadata_set;bool next_track; +bool partial_drain;void *private_data; };
@@ -173,7 +175,13 @@ static inline void snd_compr_drain_notify(struct snd_compr_stream *stream)if (snd_BUG_ON (!stream))return ; - stream->runtime->state =SNDRV_PCM_STATE_SETUP ; +/* for partial_drain case we are back to running state on success */ +if (stream->partial_drain) { + stream->runtime->state =SNDRV_PCM_STATE_RUNNING ; + stream->partial_drain = false;/* clear this flag as well */ + }else { + stream->runtime->state =SNDRV_PCM_STATE_SETUP ; + }wake_up (&stream->runtime->sleep); }
sound/core/compress_offload.c +4 -0
@@ -722,6 +722,9 @@ static int snd_compr_stop(struct snd_compr_stream *stream) retval = stream->ops->trigger (stream,SNDRV_PCM_TRIGGER_STOP );if (!retval) { +/* clear flags and stop any drain wait */ + stream->partial_drain = false; + stream->metadata_set = false;snd_compr_drain_notify (stream); stream->runtime->total_bytes_available =0 ; stream->runtime->total_bytes_transferred =0 ;
@@ -879,6 +882,7 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream)if (stream->next_track == false)return -EPERM ; + stream->partial_drain = true; retval = stream->ops->trigger (stream,SND_COMPR_TRIGGER_PARTIAL_DRAIN );if (retval) {pr_debug ("Partial drain returned failure\n" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 56/109 RDMA/siw: Fix reporting vendor_part_id
In reply to Greg Kroah-HartmanFrom: Kamal Heib <[email protected]>
[ Upstream commit 04340645f69ab7abb6f9052688a60f0213b3f79c ]
Move the initialization of the vendor_part_id to be before calling ib_register_device(), this is needed because the query_device() callback is called from the context of ib_register_device() before initializing the vendor_part_id, so the reported value is wrong.
--- drivers/infiniband/sw/siw/siw_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/infiniband/sw/siw/siw_main.c +2 -1
@@ -66,12 +66,13 @@ static int siw_device_register(struct siw_device *sdev, const char *name)static int dev_id =1 ;int rv; + sdev->vendor_part_id = dev_id++; + rv =ib_register_device (base_dev, name);if (rv) {pr_warn ("siw: device registration error %d\n" , rv);return rv; } - sdev->vendor_part_id = dev_id++;siw_dbg (base_dev,"HWaddr=%pM\n" , sdev->netdev->dev_addr);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 57/109 arm64: kgdb: Fix single-step exception handling oops
In reply to Greg Kroah-HartmanFrom: Wei Li <[email protected]>
[ Upstream commit 8523c006264df65aac7d77284cc69aac46a6f842 ]
After entering kdb due to breakpoint, when we execute 'ss' or 'go' (will delay installing breakpoints, do single-step first), it won't work correctly, and it will enter kdb due to oops.
It's because the reason gotten in kdb_stub() is not as expected, and it seems that the ex_vector for single-step should be 0, like what arch powerpc/sh/parisc has implemented.
Before the patch:
Entering kdb (current=0xffff8000119e2dc0, pid 0) on processor 0 due to Keyboard Entry [0]kdb> bp printk
Instruction(i) BP #0 at 0xffff8000101486cc (printk)
is enabled addr at ffff8000101486cc, hardtype=0 installed=0
[0]kdb> g
/ # echo h > /proc/sysrq-trigger
Entering kdb (current=0xffff0000fa878040, pid 266) on processor 3 due to Breakpoint @ 0xffff8000101486cc [3]kdb> ss
Entering kdb (current=0xffff0000fa878040, pid 266) on processor 3 Oops: (null) due to oops @ 0xffff800010082ab8
CPU: 3 PID: 266 Comm: sh Not tainted 5.7.0-rc4-13839-gf0e5ad491718 #6 Hardware name: linux,dummy-virt (DT) pstate: 00000085 (nzcv daIf -PAN -UAO) pc : el1_irq+0x78/0x180 lr : __handle_sysrq+0x80/0x190
sp : ffff800015003bf0
x29: ffff800015003d20 x28: ffff0000fa878040
x27: 0000000000000000 x26: ffff80001126b1f0
x25: ffff800011b6a0d8 x24: 0000000000000000
x23: 0000000080200005 x22: ffff8000101486cc
x21: ffff800015003d30 x20: 0000ffffffffffff
x19: ffff8000119f2000 x18: 0000000000000000
x17: 0000000000000000 x16: 0000000000000000
x15: 0000000000000000 x14: 0000000000000000
x13: 0000000000000000 x12: 0000000000000000
x11: 0000000000000000 x10: 0000000000000000
x9 : 0000000000000000 x8 : ffff800015003e50
x7 : 0000000000000002 x6 : 00000000380b9990
x5 : ffff8000106e99e8 x4 : ffff0000fadd83c0
x3 : 0000ffffffffffff x2 : ffff800011b6a0d8
x1 : ffff800011b6a000 x0 : ffff80001130c9d8
Call trace: el1_irq+0x78/0x180 printk+0x0/0x84 write_sysrq_trigger+0xb0/0x118 proc_reg_write+0xb4/0xe0 __vfs_write+0x18/0x40 vfs_write+0xb0/0x1b8 ksys_write+0x64/0xf0 __arm64_sys_write+0x14/0x20 el0_svc_common.constprop.2+0xb0/0x168 do_el0_svc+0x20/0x98 el0_sync_handler+0xec/0x1a8 el0_sync+0x140/0x180
[3]kdb>
After the patch:
Entering kdb (current=0xffff8000119e2dc0, pid 0) on processor 0 due to Keyboard Entry [0]kdb> bp printk
Instruction(i) BP #0 at 0xffff8000101486cc (printk)
is enabled addr at ffff8000101486cc, hardtype=0 installed=0
[0]kdb> g
/ # echo h > /proc/sysrq-trigger
Entering kdb (current=0xffff0000fa852bc0, pid 268) on processor 0 due to Breakpoint @ 0xffff8000101486cc [0]kdb> g
Entering kdb (current=0xffff0000fa852bc0, pid 268) on processor 0 due to Breakpoint @ 0xffff8000101486cc [0]kdb> ss
Entering kdb (current=0xffff0000fa852bc0, pid 268) on processor 0 due to SS trap @ 0xffff800010082ab8 [0]kdb>
--- arch/arm64/kernel/kgdb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/kernel/kgdb.c +1 -1
@@ -252,7 +252,7 @@ static int kgdb_step_brk_fn(struct pt_regs *regs, unsigned int esr)if (!kgdb_single_step)return DBG_HOOK_ERROR ; -kgdb_handle_exception (1 ,SIGTRAP ,0 , regs); +kgdb_handle_exception (0 ,SIGTRAP ,0 , regs);return DBG_HOOK_HANDLED ; }NOKPROBE_SYMBOL (kgdb_step_brk_fn);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 58/109 nbd: Fix memory leak in nbd_add_socket
In reply to Greg Kroah-HartmanFrom: Zheng Bin <[email protected]>
[ Upstream commit 579dd91ab3a5446b148e7f179b6596b270dace46 ]
When adding first socket to nbd, if nsock's allocation failed, the data structure member "config->socks" was reallocated, but the data structure member "config->num_connections" was not updated. A memory leak will occur then because the function "nbd_config_put" will free "config->socks" only when "config->num_connections" is not zero.
--- drivers/block/nbd.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
drivers/block/nbd.c +15 -10
@@ -1022,25 +1022,26 @@ static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg, test_bit(NBD_RT_BOUND, &config->runtime_flags))) {dev_err (disk_to_dev (nbd->disk),"Device being setup by another task" ); -sockfd_put (sock); -return -EBUSY ; + err = -EBUSY ; + goto put_socket; + } + + nsock =kzalloc (sizeof (*nsock),GFP_KERNEL ); +if (!nsock) { + err = -ENOMEM ; + goto put_socket; } socks =krealloc (config->socks, (config->num_connections +1 ) *sizeof (struct nbd_sock *),GFP_KERNEL );if (!socks) { -sockfd_put (sock); -return -ENOMEM ; +kfree (nsock); + err = -ENOMEM ; + goto put_socket; } config->socks = socks; - nsock =kzalloc (sizeof (struct nbd_sock ),GFP_KERNEL ); -if (!nsock) { -sockfd_put (sock); -return -ENOMEM ; - } - nsock->fallback_index =-1 ; nsock->dead = false;mutex_init (&nsock->tx_lock);
@@ -1052,6 +1053,10 @@ static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg,atomic_inc (&config->live_connections);return 0 ; + +put_socket: +sockfd_put (sock); +return err; }static int nbd_reconnect_socket (struct nbd_device *nbd,unsigned long arg)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 59/109 cxgb4: fix all-mask IP address comparison
In reply to Greg Kroah-HartmanFrom: Rahul Lakkireddy <[email protected]>
[ Upstream commit 76c4d85c9260c3d741cbd194c30c61983d0a4303 ]
Convert all-mask IP address to Big Endian, instead, for comparison.
--- drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c +5 -5
@@ -839,16 +839,16 @@ static bool is_addr_all_mask(u8 *ipmask, int family)struct in_addr *addr; addr = (struct in_addr *)ipmask; -if (ntohl (addr->s_addr) ==0xffffffff ) +if (addr->s_addr ==htonl (0xffffffff ))return true; }else if (family ==AF_INET6 ) {struct in6_addr *addr6; addr6 = (struct in6_addr *)ipmask; -if (ntohl (addr6->s6_addr32[0 ]) ==0xffffffff && -ntohl (addr6->s6_addr32[1 ]) ==0xffffffff && -ntohl (addr6->s6_addr32[2 ]) ==0xffffffff && -ntohl (addr6->s6_addr32[3 ]) ==0xffffffff ) +if (addr6->s6_addr32[0 ] ==htonl (0xffffffff ) && + addr6->s6_addr32[1 ] ==htonl (0xffffffff ) && + addr6->s6_addr32[2 ] ==htonl (0xffffffff ) && + addr6->s6_addr32[3 ] ==htonl (0xffffffff ))return true; }return false;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 60/109 IB/mlx5: Fix 50G per lane indication
In reply to Greg Kroah-HartmanFrom: Aya Levin <[email protected]>
[ Upstream commit 530c8632b547ff72f11ff83654b22462a73f1f7b ]
Some released FW versions mistakenly don't set the capability that 50G per lane link-modes are supported for VFs (ptys_extended_ethernet capability bit).
Use PTYS.ext_eth_proto_capability instead, as this indication is always accurate. If PTYS.ext_eth_proto_capability is valid
(has a non-zero value) conclude that the HCA supports 50G per lane.
Otherwise, conclude that the HCA doesn't support 50G per lane.
--- drivers/infiniband/hw/mlx5/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/mlx5/main.c +1 -1
@@ -517,7 +517,7 @@ static int mlx5_query_port_roce(struct ib_device *device, u8 port_num, mdev_port_num);if (err) goto out; - ext =MLX5_CAP_PCAM_FEATURE (dev->mdev, ptys_extended_ethernet); + ext = !!MLX5_GET_ETH_PROTO (ptys_reg, out, true, eth_proto_capability); eth_prot_oper =MLX5_GET_ETH_PROTO (ptys_reg, out, ext, eth_proto_oper); props->active_width =IB_WIDTH_4X ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 61/109 qed: Populate nvm-file attributes while reading nvm config partition.
In reply to Greg Kroah-HartmanFrom: Sudarsana Reddy Kalluru <[email protected]>
[ Upstream commit 13cf8aab7425a253070433b5a55b4209ceac8b19 ]
NVM config file address will be modified when the MBI image is upgraded. Driver would return stale config values if user reads the nvm-config (via ethtool -d) in this state. The fix is to re-populate nvm attribute info while reading the nvm config values/partition.
Changes from previous version:
-------------------------------
v3: Corrected the formatting in 'Fixes' tag.
v2: Added 'Fixes' tag.
--- drivers/net/ethernet/qlogic/qed/qed_debug.c | 4 ++++ drivers/net/ethernet/qlogic/qed/qed_dev.c | 12 +++--------- drivers/net/ethernet/qlogic/qed/qed_mcp.c | 7 +++++++ drivers/net/ethernet/qlogic/qed/qed_mcp.h | 7 +++++++ 4 files changed, 21 insertions(+), 9 deletions(-)
drivers/net/ethernet/qlogic/qed/qed_debug.c +4 -0
@@ -8197,6 +8197,10 @@ int qed_dbg_all_data(struct qed_dev *cdev, void *buffer)DP_ERR (cdev,"qed_dbg_mcp_trace failed. rc = %d\n" , rc); } +/* Re-populate nvm attribute info */ +qed_mcp_nvm_info_free (p_hwfn); +qed_mcp_nvm_info_populate (p_hwfn); +/* nvm cfg1 */ rc = qed_dbg_nvm_image(cdev, (u8 *)buffer + offset + REGDUMP_HEADER_SIZE,
drivers/net/ethernet/qlogic/qed/qed_dev.c +3 -9
@@ -4423,12 +4423,6 @@ static int qed_get_dev_info(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)return 0 ; } -static void qed_nvm_info_free (struct qed_hwfn *p_hwfn) -{ -kfree (p_hwfn->nvm_info.image_att); - p_hwfn->nvm_info.image_att =NULL ; -} - static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn, void __iomem *p_regview, void __iomem *p_doorbells,
@@ -4513,7 +4507,7 @@ static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn,return rc; err3:if (IS_LEAD_HWFN (p_hwfn)) -qed_nvm_info_free (p_hwfn); +qed_mcp_nvm_info_free (p_hwfn); err2:if (IS_LEAD_HWFN (p_hwfn))qed_iov_free_hw_info (p_hwfn->cdev);
@@ -4574,7 +4568,7 @@ int qed_hw_prepare(struct qed_dev *cdev,if (rc) {if (IS_PF (cdev)) {qed_init_free (p_hwfn); -qed_nvm_info_free (p_hwfn); +qed_mcp_nvm_info_free (p_hwfn);qed_mcp_free (p_hwfn);qed_hw_hwfn_free (p_hwfn); }
@@ -4608,7 +4602,7 @@ void qed_hw_remove(struct qed_dev *cdev)qed_iov_free_hw_info (cdev); -qed_nvm_info_free (p_hwfn); +qed_mcp_nvm_info_free (p_hwfn); } static void qed_chain_free_next_ptr(struct qed_dev *cdev,
drivers/net/ethernet/qlogic/qed/qed_mcp.c +7 -0
@@ -3149,6 +3149,13 @@ int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn)return rc; } +void qed_mcp_nvm_info_free (struct qed_hwfn *p_hwfn) +{ +kfree (p_hwfn->nvm_info.image_att); + p_hwfn->nvm_info.image_att =NULL ; + p_hwfn->nvm_info.valid = false; +} + int qed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn, enum qed_nvm_images image_id,
drivers/net/ethernet/qlogic/qed/qed_mcp.h +7 -0
@@ -1192,6 +1192,13 @@ void qed_mcp_read_ufp_config(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt);*/ int qed_mcp_nvm_info_populate (struct qed_hwfn *p_hwfn); +/** +* @brief Delete nvm info shadow in the given hardware function +* +* @param p_hwfn +*/ +void qed_mcp_nvm_info_free (struct qed_hwfn *p_hwfn); +/** * @brief Get the engine affinity configuration. *
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 62/109 net/mlx5: Fix eeprom support for SFP module
In reply to Greg Kroah-HartmanFrom: Eran Ben Elisha <[email protected]>
[ Upstream commit 47afbdd2fa4c5775c383ba376a3d1da7d7f694dc ]
Fix eeprom SFP query support by setting i2c_addr, offset and page number correctly. Unlike QSFP modules, SFP eeprom params are as follow:
- i2c_addr is 0x50 for offset 0 - 255 and 0x51 for offset 256 - 511.
- Page number is always zero.
- Page offset is always relative to zero.
As part of eeprom query, query the module ID (SFP / QSFP*) via helper function to set the params accordingly.
In addition, change mlx5_qsfp_eeprom_page() input type to be u16 to avoid unnecessary casting.
--- .../net/ethernet/mellanox/mlx5/core/port.c | 93 +++++++++++++++---- 1 file changed, 77 insertions(+), 16 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/port.c +77 -16
@@ -293,7 +293,40 @@ static int mlx5_query_module_num(struct mlx5_core_dev *dev, int *module_num)return 0 ; } -static int mlx5_eeprom_page (int offset) +static int mlx5_query_module_id (struct mlx5_core_dev *dev,int module_num, +u8 *module_id) +{ +u32 in[MLX5_ST_SZ_DW (mcia_reg)] = {}; +u32 out[MLX5_ST_SZ_DW (mcia_reg)]; +int err, status; +u8 *ptr; + +MLX5_SET (mcia_reg, in, i2c_device_address,MLX5_I2C_ADDR_LOW ); +MLX5_SET (mcia_reg, in, module, module_num); +MLX5_SET (mcia_reg, in, device_address,0 ); +MLX5_SET (mcia_reg, in, page_number,0 ); +MLX5_SET (mcia_reg, in, size,1 ); +MLX5_SET (mcia_reg, in, l,0 ); + + err =mlx5_core_access_reg (dev, in,sizeof (in), out, +sizeof (out),MLX5_REG_MCIA ,0 ,0 ); +if (err) +return err; + + status =MLX5_GET (mcia_reg, out, status); +if (status) { +mlx5_core_err (dev,"query_mcia_reg failed: status: 0x%x\n" , + status); +return -EIO ; + } + ptr =MLX5_ADDR_OF (mcia_reg, out, dword_0); + + *module_id = ptr[0 ]; + +return 0 ; +} + +static int mlx5_qsfp_eeprom_page (u16 offset) {if (offset <MLX5_EEPROM_PAGE_LENGTH )/* Addresses between 0-255 - page 00 */
@@ -307,7 +340,7 @@ static int mlx5_eeprom_page(int offset) MLX5_EEPROM_HIGH_PAGE_LENGTH); } -static int mlx5_eeprom_high_page_offset (int page_num) +static int mlx5_qsfp_eeprom_high_page_offset (int page_num) {if (!page_num)/* Page 0 always start from low page */ return 0 ;
@@ -316,35 +349,62 @@ static int mlx5_eeprom_high_page_offset(int page_num)return page_num *MLX5_EEPROM_HIGH_PAGE_LENGTH ; } +static void mlx5_qsfp_eeprom_params_set (u16 *i2c_addr,int *page_num,u16 *offset) +{ + *i2c_addr =MLX5_I2C_ADDR_LOW ; + *page_num =mlx5_qsfp_eeprom_page (*offset); + *offset -=mlx5_qsfp_eeprom_high_page_offset (*page_num); +} + +static void mlx5_sfp_eeprom_params_set (u16 *i2c_addr,int *page_num,u16 *offset) +{ + *i2c_addr =MLX5_I2C_ADDR_LOW ; + *page_num =0 ; + +if (*offset <MLX5_EEPROM_PAGE_LENGTH ) +return ; + + *i2c_addr =MLX5_I2C_ADDR_HIGH ; + *offset -=MLX5_EEPROM_PAGE_LENGTH ; +} +int mlx5_query_module_eeprom (struct mlx5_core_dev *dev,u16 offset,u16 size,u8 *data) { -int module_num, page_num, status, err; +int module_num, status, err, page_num =0 ; +u32 in[MLX5_ST_SZ_DW (mcia_reg)] = {};u32 out[MLX5_ST_SZ_DW (mcia_reg)]; -u32 in[MLX5_ST_SZ_DW (mcia_reg)]; -u16 i2c_addr; -void *ptr =MLX5_ADDR_OF (mcia_reg, out, dword_0); +u16 i2c_addr =0 ; +u8 module_id; +void *ptr; err =mlx5_query_module_num (dev, &module_num);if (err)return err; -memset (in,0 ,sizeof (in)); - size =min_t (int, size,MLX5_EEPROM_MAX_BYTES ); - -/* Get the page number related to the given offset */ - page_num =mlx5_eeprom_page (offset); + err =mlx5_query_module_id (dev, module_num, &module_id); +if (err) +return err; -/* Set the right offset according to the page number, -* For page_num > 0, relative offset is always >= 128 (high page). -*/ - offset -=mlx5_eeprom_high_page_offset (page_num); +switch (module_id) { +case MLX5_MODULE_ID_SFP : +mlx5_sfp_eeprom_params_set (&i2c_addr, &page_num, &offset); +break ; +case MLX5_MODULE_ID_QSFP : +case MLX5_MODULE_ID_QSFP_PLUS : +case MLX5_MODULE_ID_QSFP28 : +mlx5_qsfp_eeprom_params_set (&i2c_addr, &page_num, &offset); +break ; +default : +mlx5_core_err (dev,"Module ID not recognized: 0x%x\n" , module_id); +return -EINVAL ; + }if (offset + size >MLX5_EEPROM_PAGE_LENGTH )/* Cross pages read, read until offset 256 in low page */ size -= offset + size -MLX5_EEPROM_PAGE_LENGTH ; - i2c_addr =MLX5_I2C_ADDR_LOW ; + size =min_t (int, size,MLX5_EEPROM_MAX_BYTES );MLX5_SET (mcia_reg, in, l,0 );MLX5_SET (mcia_reg, in, module, module_num);
@@ -365,6 +425,7 @@ int mlx5_query_module_eeprom(struct mlx5_core_dev *dev,return -EIO ; } + ptr =MLX5_ADDR_OF (mcia_reg, out, dword_0);memcpy (data, ptr, size);return size;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 63/109 net/mlx5e: Fix 50G per lane indication
In reply to Greg Kroah-HartmanFrom: Aya Levin <[email protected]>
[ Upstream commit 6a1cf4e443a3b0a4d690d3c93b84b1e9cbfcb1bd ]
Some released FW versions mistakenly don't set the capability that 50G per lane link-modes are supported for VFs (ptys_extended_ethernet capability bit). When the capability is unset, read PTYS.ext_eth_proto_capability (always reliable).
If PTYS.ext_eth_proto_capability is valid (has a non-zero value) conclude that the HCA supports 50G per lane. Otherwise, conclude that the HCA doesn't support 50G per lane.
--- .../net/ethernet/mellanox/mlx5/core/en/port.c | 21 ++++++++++++++++--- .../net/ethernet/mellanox/mlx5/core/en/port.h | 2 +- .../ethernet/mellanox/mlx5/core/en_ethtool.c | 8 +++---- 3 files changed, 23 insertions(+), 8 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/port.c +18 -3
@@ -78,11 +78,26 @@ static const u32 mlx5e_ext_link_speed[MLX5E_EXT_LINK_MODES_NUMBER] = { [MLX5E_400GAUI_8] = 400000, }; +bool mlx5e_ptys_ext_supported (struct mlx5_core_dev *mdev) +{ +struct mlx5e_port_eth_proto eproto; +int err; + +if (MLX5_CAP_PCAM_FEATURE (mdev, ptys_extended_ethernet)) +return true; + + err =mlx5_port_query_eth_proto (mdev,1 , true, &eproto); +if (err) +return false; + +return !!eproto.cap; +} +static void mlx5e_port_get_speed_arr (struct mlx5_core_dev *mdev,const u32 **arr,u32 *size,bool force_legacy) { -bool ext = force_legacy ? false :MLX5_CAP_PCAM_FEATURE (mdev, ptys_extended_ethernet); +bool ext = force_legacy ? false :mlx5e_ptys_ext_supported (mdev); *size = ext ?ARRAY_SIZE (mlx5e_ext_link_speed) :ARRAY_SIZE (mlx5e_link_speed);
@@ -177,7 +192,7 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed)bool ext;int err; - ext =MLX5_CAP_PCAM_FEATURE (mdev, ptys_extended_ethernet); + ext =mlx5e_ptys_ext_supported (mdev); err =mlx5_port_query_eth_proto (mdev,1 , ext, &eproto);if (err) goto out;
@@ -205,7 +220,7 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed)int err;int i; - ext =MLX5_CAP_PCAM_FEATURE (mdev, ptys_extended_ethernet); + ext =mlx5e_ptys_ext_supported (mdev); err =mlx5_port_query_eth_proto (mdev,1 , ext, &eproto);if (err)return err;
drivers/net/ethernet/mellanox/mlx5/core/en/port.h +1 -1
@@ -54,7 +54,7 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);int mlx5e_port_max_linkspeed (struct mlx5_core_dev *mdev,u32 *speed);u32 mlx5e_port_speed2linkmodes (struct mlx5_core_dev *mdev,u32 speed,bool force_legacy); - +bool mlx5e_ptys_ext_supported (struct mlx5_core_dev *mdev);int mlx5e_port_query_pbmc (struct mlx5_core_dev *mdev,void *out);int mlx5e_port_set_pbmc (struct mlx5_core_dev *mdev,void *in);int mlx5e_port_query_priority2buffer (struct mlx5_core_dev *mdev,u8 *buffer);
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +4 -4
@@ -200,7 +200,7 @@ static void mlx5e_ethtool_get_speed_arr(struct mlx5_core_dev *mdev,struct ptys2ethtool_config **arr, u32 *size) { - bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet); + bool ext = mlx5e_ptys_ext_supported(mdev); *arr = ext ? ptys2ext_ethtool_table : ptys2legacy_ethtool_table; *size = ext ? ARRAY_SIZE(ptys2ext_ethtool_table) :
@@ -871,7 +871,7 @@ static void get_lp_advertising(struct mlx5_core_dev *mdev, u32 eth_proto_lp, struct ethtool_link_ksettings *link_ksettings) {unsigned long *lp_advertising = link_ksettings->link_modes.lp_advertising; -bool ext =MLX5_CAP_PCAM_FEATURE (mdev, ptys_extended_ethernet); +bool ext =mlx5e_ptys_ext_supported (mdev);ptys2ethtool_adver_link (lp_advertising, eth_proto_lp, ext); }
@@ -900,7 +900,7 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv, __func__, err); goto err_query_regs; } - ext =MLX5_CAP_PCAM_FEATURE (mdev, ptys_extended_ethernet); + ext = !!MLX5_GET_ETH_PROTO (ptys_reg, out, true, eth_proto_capability); eth_proto_cap =MLX5_GET_ETH_PROTO (ptys_reg, out, ext, eth_proto_capability); eth_proto_admin = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
@@ -1052,7 +1052,7 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv, autoneg = link_ksettings->base.autoneg; speed = link_ksettings->base.speed; - ext_supported =MLX5_CAP_PCAM_FEATURE (mdev, ptys_extended_ethernet); + ext_supported =mlx5e_ptys_ext_supported (mdev); ext =ext_requested (autoneg, adver, ext_supported);if (!ext_supported && ext)return -EOPNOTSUPP ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 64/109 bnxt_en: fix NULL dereference in case SR-IOV configuration fails
In reply to Greg Kroah-HartmanFrom: Davide Caratti <[email protected]>
[ Upstream commit c8b1d7436045d3599bae56aef1682813ecccaad7 ]
we need to set 'active_vfs' back to 0, if something goes wrong during the allocation of SR-IOV resources: otherwise, further VF configurations will wrongly assume that bp->pf.vf[x] are valid memory locations, and commands like the ones in the following sequence:
# echo 2 >/sys/bus/pci/devices/${ADDR}/sriov_numvfs
# ip link set dev ens1f0np0 up
# ip link set dev ens1f0np0 vf 0 trust onwill cause a kernel crash similar to this:
bnxt_en 0000:3b:00.0: not enough MMIO resources for SR-IOV
BUG: kernel NULL pointer dereference, address: 0000000000000014 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] SMP PTI CPU: 43 PID: 2059 Comm: ip Tainted: G I 5.8.0-rc2.upstream+ #871 Hardware name: Dell Inc. PowerEdge R740/08D89F, BIOS 2.2.11 06/13/2019 RIP: 0010:bnxt_set_vf_trust+0x5b/0x110 [bnxt_en] Code: 44 24 58 31 c0 e8 f5 fb ff ff 85 c0 0f 85 b6 00 00 00 48 8d 1c 5b 41 89 c6 b9 0b 00 00 00 48 c1 e3 04 49 03 9c 24 f0 0e 00 00 <8b> 43 14 89 c2 83 c8 10 83 e2 ef 45 84 ed 49 89 e5 0f 44 c2 4c 89 RSP: 0018:ffffac6246a1f570 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 000000000000000b RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffff98b28f538900 RBP: ffff98b28f538900 R08: 0000000000000000 R09: 0000000000000008 R10: ffffffffb9515be0 R11: ffffac6246a1f678 R12: ffff98b28f538000 R13: 0000000000000001 R14: 0000000000000000 R15: ffffffffc05451e0 FS: 00007fde0f688800(0000) GS:ffff98baffd40000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000014 CR3: 000000104bb0a003 CR4: 00000000007606e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: do_setlink+0x994/0xfe0 __rtnl_newlink+0x544/0x8d0 rtnl_newlink+0x47/0x70 rtnetlink_rcv_msg+0x29f/0x350 netlink_rcv_skb+0x4a/0x110 netlink_unicast+0x21d/0x300 netlink_sendmsg+0x329/0x450 sock_sendmsg+0x5b/0x60 ____sys_sendmsg+0x204/0x280 ___sys_sendmsg+0x88/0xd0 __sys_sendmsg+0x5e/0xa0 do_syscall_64+0x47/0x80 entry_SYSCALL_64_after_hwframe+0x44/0xa9
--- drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +1 -1
@@ -398,6 +398,7 @@ static void bnxt_free_vf_resources(struct bnxt *bp) } } + bp->pf.active_vfs =0 ;kfree (bp->pf.vf); bp->pf.vf =NULL ; }
@@ -833,7 +834,6 @@ void bnxt_sriov_disable(struct bnxt *bp)bnxt_free_vf_resources (bp); - bp->pf.active_vfs =0 ;/* Reclaim all resources for the PF. */ rtnl_lock ();bnxt_restore_pf_fw_resources (bp);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 65/109 net: macb: fix wakeup test in runtime suspend/resume routines
In reply to Greg Kroah-HartmanFrom: Nicolas Ferre <[email protected]>
[ Upstream commit 515a10a701d570e26dfbe6ee373f77c8bf11053f ]
Use the proper struct device pointer to check if the wakeup flag and wakeup source are positioned.
Use the one passed by function call which is equivalent to &bp->dev->dev.parent.
It's preventing the trigger of a spurious interrupt in case the Wake-on-Lan feature is used.
--- drivers/net/ethernet/cadence/macb_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/cadence/macb_main.c +2 -2
@@ -4507,7 +4507,7 @@ static int __maybe_unused macb_runtime_suspend(struct device *dev)struct net_device *netdev =dev_get_drvdata (dev);struct macb *bp =netdev_priv (netdev); -if (!(device_may_wakeup (&bp->dev->dev))) { +if (!(device_may_wakeup (dev))) {clk_disable_unprepare (bp->tx_clk);clk_disable_unprepare (bp->hclk);clk_disable_unprepare (bp->pclk);
@@ -4523,7 +4523,7 @@ static int __maybe_unused macb_runtime_resume(struct device *dev)struct net_device *netdev =dev_get_drvdata (dev);struct macb *bp =netdev_priv (netdev); -if (!(device_may_wakeup (&bp->dev->dev))) { +if (!(device_may_wakeup (dev))) {clk_prepare_enable (bp->pclk);clk_prepare_enable (bp->hclk);clk_prepare_enable (bp->tx_clk);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 66/109 net: macb: mark device wake capable when "magic-packet" property present
In reply to Greg Kroah-HartmanFrom: Nicolas Ferre <[email protected]>
[ Upstream commit ced4799d06375929e013eea04ba6908207afabbe ]
Change the way the "magic-packet" DT property is handled in the macb_probe() function, matching DT binding documentation. Now we mark the device as "wakeup capable" instead of calling the device_init_wakeup() function that would enable the wakeup source.
For Ethernet WoL, enabling the wakeup_source is done by using ethtool and associated macb_set_wol() function that already calls device_set_wakeup_enable() for this purpose.
That would reduce power consumption by cutting more clocks if "magic-packet" property is set but WoL is not configured by ethtool.
--- drivers/net/ethernet/cadence/macb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/cadence/macb_main.c +1 -1
@@ -4260,7 +4260,7 @@ static int macb_probe(struct platform_device *pdev) bp->wol =0 ;if (of_get_property (np,"magic-packet" ,NULL )) bp->wol |=MACB_WOL_HAS_MAGIC_PACKET ; -device_init_wakeup (&pdev->dev, bp->wol &MACB_WOL_HAS_MAGIC_PACKET ); +device_set_wakeup_capable (&pdev->dev, bp->wol &MACB_WOL_HAS_MAGIC_PACKET );spin_lock_init (&bp->lock);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 67/109 net: macb: fix call to pm_runtime in the suspend/resume functions
In reply to Greg Kroah-HartmanFrom: Nicolas Ferre <[email protected]>
[ Upstream commit 6c8f85cac98a4c6b767c4c4f6af7283724c32b47 ]
The calls to pm_runtime_force_suspend/resume() functions are only relevant if the device is not configured to act as a WoL wakeup source. Add the device_may_wakeup() test before calling them.
--- drivers/net/ethernet/cadence/macb_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/cadence/macb_main.c +4 -2
@@ -4453,7 +4453,8 @@ static int __maybe_unused macb_suspend(struct device *dev)netif_carrier_off (netdev);if (bp->ptp_info) bp->ptp_info->ptp_remove (netdev); -pm_runtime_force_suspend (dev); +if (!device_may_wakeup (dev)) +pm_runtime_force_suspend (dev);return 0 ; }
@@ -4468,7 +4469,8 @@ static int __maybe_unused macb_resume(struct device *dev)if (!netif_running (netdev))return 0 ; -pm_runtime_force_resume (dev); +if (!device_may_wakeup (dev)) +pm_runtime_force_resume (dev);if (bp->wol &MACB_WOL_ENABLED ) {macb_writel (bp,IDR ,MACB_BIT (WOL ));
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 68/109 mlxsw: spectrum_router: Remove inappropriate usage of WARN_ON()
In reply to Greg Kroah-HartmanFrom: Ido Schimmel <[email protected]>
[ Upstream commit d9d5420273997664a1c09151ca86ac993f2f89c1 ]
We should not trigger a warning when a memory allocation fails. Remove the WARN_ON().
The warning is constantly triggered by syzkaller when it is injecting faults:
[ 2230.758664] FAULT_INJECTION: forcing a failure. [ 2230.758664] name failslab, interval 1, probability 0, space 0, times 0 [ 2230.762329] CPU: 3 PID: 1407 Comm: syz-executor.0 Not tainted 5.8.0-rc2+ #28 ... [ 2230.898175] WARNING: CPU: 3 PID: 1407 at drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c:6265 mlxsw_sp_router_fib_event+0xfad/0x13e0 [ 2230.898179] Kernel panic - not syncing: panic_on_warn set ... [ 2230.898183] CPU: 3 PID: 1407 Comm: syz-executor.0 Not tainted 5.8.0-rc2+ #28 [ 2230.898190] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +1 -1
@@ -6287,7 +6287,7 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb, } fib_work =kzalloc (sizeof (*fib_work),GFP_ATOMIC ); -if (WARN_ON (!fib_work)) +if (!fib_work)return NOTIFY_BAD ; fib_work->mlxsw_sp = router->mlxsw_sp;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 69/109 mlxsw: pci: Fix use-after-free in case of failed devlink reload
In reply to Greg Kroah-HartmanFrom: Ido Schimmel <[email protected]>
[ Upstream commit c4317b11675b99af6641662ebcbd3c6010600e64 ]
In case devlink reload failed, it is possible to trigger a use-after-free when querying the kernel for device info via 'devlink dev info' [1].
This happens because as part of the reload error path the PCI command interface is de-initialized and its mailboxes are freed. When the devlink '->info_get()' callback is invoked the device is queried via the command interface and the freed mailboxes are accessed.
Fix this by initializing the command interface once during probe and not during every reload.
This is consistent with the other bus used by mlxsw (i.e., 'mlxsw_i2c') and also allows user space to query the running firmware version (for example) from the device after a failed reload.
[1]
BUG: KASAN: use-after-free in memcpy include/linux/string.h:406 [inline] BUG: KASAN: use-after-free in mlxsw_pci_cmd_exec+0x177/0xa60 drivers/net/ethernet/mellanox/mlxsw/pci.c:1675 Write of size 4096 at addr ffff88810ae32000 by task syz-executor.1/2355 CPU: 1 PID: 2355 Comm: syz-executor.1 Not tainted 5.8.0-rc2+ #29 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0xf6/0x16e lib/dump_stack.c:118 print_address_description.constprop.0+0x1c/0x250 mm/kasan/report.c:383 __kasan_report mm/kasan/report.c:513 [inline] kasan_report.cold+0x1f/0x37 mm/kasan/report.c:530 check_memory_region_inline mm/kasan/generic.c:186 [inline] check_memory_region+0x14e/0x1b0 mm/kasan/generic.c:192 memcpy+0x39/0x60 mm/kasan/common.c:106 memcpy include/linux/string.h:406 [inline] mlxsw_pci_cmd_exec+0x177/0xa60 drivers/net/ethernet/mellanox/mlxsw/pci.c:1675 mlxsw_cmd_exec+0x249/0x550 drivers/net/ethernet/mellanox/mlxsw/core.c:2335 mlxsw_cmd_access_reg drivers/net/ethernet/mellanox/mlxsw/cmd.h:859 [inline] mlxsw_core_reg_access_cmd drivers/net/ethernet/mellanox/mlxsw/core.c:1938 [inline] mlxsw_core_reg_access+0x2f6/0x540 drivers/net/ethernet/mellanox/mlxsw/core.c:1985 mlxsw_reg_query drivers/net/ethernet/mellanox/mlxsw/core.c:2000 [inline] mlxsw_devlink_info_get+0x17f/0x6e0 drivers/net/ethernet/mellanox/mlxsw/core.c:1090 devlink_nl_info_fill.constprop.0+0x13c/0x2d0 net/core/devlink.c:4588 devlink_nl_cmd_info_get_dumpit+0x246/0x460 net/core/devlink.c:4648 genl_lock_dumpit+0x85/0xc0 net/netlink/genetlink.c:575 netlink_dump+0x515/0xe50 net/netlink/af_netlink.c:2245 __netlink_dump_start+0x53d/0x830 net/netlink/af_netlink.c:2353 genl_family_rcv_msg_dumpit.isra.0+0x296/0x300 net/netlink/genetlink.c:638 genl_family_rcv_msg net/netlink/genetlink.c:733 [inline] genl_rcv_msg+0x78d/0x9d0 net/netlink/genetlink.c:753 netlink_rcv_skb+0x152/0x440 net/netlink/af_netlink.c:2469 genl_rcv+0x24/0x40 net/netlink/genetlink.c:764 netlink_unicast_kernel net/netlink/af_netlink.c:1303 [inline] netlink_unicast+0x53a/0x750 net/netlink/af_netlink.c:1329 netlink_sendmsg+0x850/0xd90 net/netlink/af_netlink.c:1918 sock_sendmsg_nosec net/socket.c:652 [inline] sock_sendmsg+0x150/0x190 net/socket.c:672 ____sys_sendmsg+0x6d8/0x840 net/socket.c:2363 ___sys_sendmsg+0xff/0x170 net/socket.c:2417 __sys_sendmsg+0xe5/0x1b0 net/socket.c:2450 do_syscall_64+0x56/0xa0 arch/x86/entry/common.c:359 entry_SYSCALL_64_after_hwframe+0x44/0xa9
--- drivers/net/ethernet/mellanox/mlxsw/pci.c | 54 ++++++++++++++++------- 1 file changed, 38 insertions(+), 16 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/pci.c +38 -16
@@ -1401,23 +1401,12 @@ static int mlxsw_pci_init(void *bus_priv, struct mlxsw_core *mlxsw_core,u16 num_pages;int err; -mutex_init (&mlxsw_pci->cmd.lock); -init_waitqueue_head (&mlxsw_pci->cmd.wait); - mlxsw_pci->core = mlxsw_core; mbox =mlxsw_cmd_mbox_alloc ();if (!mbox)return -ENOMEM ; - err =mlxsw_pci_mbox_alloc (mlxsw_pci, &mlxsw_pci->cmd.in_mbox); -if (err) - goto mbox_put; - - err =mlxsw_pci_mbox_alloc (mlxsw_pci, &mlxsw_pci->cmd.out_mbox); -if (err) - goto err_out_mbox_alloc; - err =mlxsw_pci_sw_reset (mlxsw_pci, mlxsw_pci->id);if (err) goto err_sw_reset;
@@ -1524,9 +1513,6 @@ static int mlxsw_pci_init(void *bus_priv, struct mlxsw_core *mlxsw_core,mlxsw_pci_free_irq_vectors (mlxsw_pci); err_alloc_irq: err_sw_reset: -mlxsw_pci_mbox_free (mlxsw_pci, &mlxsw_pci->cmd.out_mbox); -err_out_mbox_alloc: -mlxsw_pci_mbox_free (mlxsw_pci, &mlxsw_pci->cmd.in_mbox); mbox_put:mlxsw_cmd_mbox_free (mbox);return err;
@@ -1540,8 +1526,6 @@ static void mlxsw_pci_fini(void *bus_priv)mlxsw_pci_aqs_fini (mlxsw_pci);mlxsw_pci_fw_area_fini (mlxsw_pci);mlxsw_pci_free_irq_vectors (mlxsw_pci); -mlxsw_pci_mbox_free (mlxsw_pci, &mlxsw_pci->cmd.out_mbox); -mlxsw_pci_mbox_free (mlxsw_pci, &mlxsw_pci->cmd.in_mbox); } static struct mlxsw_pci_queue *
@@ -1755,6 +1739,37 @@ static const struct mlxsw_bus mlxsw_pci_bus = { .features = MLXSW_BUS_F_TXRX | MLXSW_BUS_F_RESET, }; +static int mlxsw_pci_cmd_init (struct mlxsw_pci *mlxsw_pci) +{ +int err; + +mutex_init (&mlxsw_pci->cmd.lock); +init_waitqueue_head (&mlxsw_pci->cmd.wait); + + err =mlxsw_pci_mbox_alloc (mlxsw_pci, &mlxsw_pci->cmd.in_mbox); +if (err) + goto err_in_mbox_alloc; + + err =mlxsw_pci_mbox_alloc (mlxsw_pci, &mlxsw_pci->cmd.out_mbox); +if (err) + goto err_out_mbox_alloc; + +return 0 ; + +err_out_mbox_alloc: +mlxsw_pci_mbox_free (mlxsw_pci, &mlxsw_pci->cmd.in_mbox); +err_in_mbox_alloc: +mutex_destroy (&mlxsw_pci->cmd.lock); +return err; +} + +static void mlxsw_pci_cmd_fini (struct mlxsw_pci *mlxsw_pci) +{ +mlxsw_pci_mbox_free (mlxsw_pci, &mlxsw_pci->cmd.out_mbox); +mlxsw_pci_mbox_free (mlxsw_pci, &mlxsw_pci->cmd.in_mbox); +mutex_destroy (&mlxsw_pci->cmd.lock); +} +static int mlxsw_pci_probe (struct pci_dev *pdev,const struct pci_device_id *id) {const char *driver_name = pdev->driver->name;
@@ -1810,6 +1825,10 @@ static int mlxsw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) mlxsw_pci->pdev = pdev;pci_set_drvdata (pdev, mlxsw_pci); + err =mlxsw_pci_cmd_init (mlxsw_pci); +if (err) + goto err_pci_cmd_init; + mlxsw_pci->bus_info.device_kind = driver_name; mlxsw_pci->bus_info.device_name =pci_name (mlxsw_pci->pdev); mlxsw_pci->bus_info.dev = &pdev->dev;
@@ -1827,6 +1846,8 @@ static int mlxsw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)return 0 ; err_bus_device_register: +mlxsw_pci_cmd_fini (mlxsw_pci); +err_pci_cmd_init:iounmap (mlxsw_pci->hw_addr); err_ioremap: err_pci_resource_len_check:
@@ -1844,6 +1865,7 @@ static void mlxsw_pci_remove(struct pci_dev *pdev)struct mlxsw_pci *mlxsw_pci =pci_get_drvdata (pdev);mlxsw_core_bus_device_unregister (mlxsw_pci->core, false); +mlxsw_pci_cmd_fini (mlxsw_pci);iounmap (mlxsw_pci->hw_addr);pci_release_regions (mlxsw_pci->pdev);pci_disable_device (mlxsw_pci->pdev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 70/109 IB/hfi1: Do not destroy hfi1_wq when the device is shut down
In reply to Greg Kroah-HartmanFrom: Kaike Wan <[email protected]>
commit 28b70cd9236563e1a88a6094673fef3c08db0d51 upstream.
The workqueue hfi1_wq is destroyed in function shutdown_device(), which is called by either shutdown_one() or remove_one(). The function shutdown_one() is called when the kernel is rebooted while remove_one() is called when the hfi1 driver is unloaded. When the kernel is rebooted, hfi1_wq is destroyed while all qps are still active, leading to a kernel crash:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000102 IP: [<ffffffff94cb7b02>] __queue_work+0x32/0x3e0 PGD 0 Oops: 0000 [#1] SMP Modules linked in: dm_round_robin nvme_rdma(OE) nvme_fabrics(OE) nvme_core(OE) ib_isert iscsi_target_mod target_core_mod ib_ucm mlx4_ib iTCO_wdt iTCO_vendor_support mxm_wmi sb_edac intel_powerclamp coretemp intel_rapl iosf_mbi kvm rpcrdma sunrpc irqbypass crc32_pclmul ghash_clmulni_intel rdma_ucm aesni_intel ib_uverbs lrw gf128mul opa_vnic glue_helper ablk_helper ib_iser cryptd ib_umad rdma_cm iw_cm ses enclosure libiscsi scsi_transport_sas pcspkr joydev ib_ipoib(OE) scsi_transport_iscsi ib_cm sg ipmi_ssif mei_me lpc_ich i2c_i801 mei ioatdma ipmi_si dm_multipath ipmi_devintf ipmi_msghandler wmi acpi_pad acpi_power_meter hangcheck_timer ip_tables ext4 mbcache jbd2 mlx4_en sd_mod crc_t10dif crct10dif_generic mgag200 drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm hfi1(OE) crct10dif_pclmul crct10dif_common crc32c_intel drm ahci mlx4_core libahci rdmavt(OE) igb megaraid_sas ib_core libata drm_panel_orientation_quirks ptp pps_core devlink dca i2c_algo_bit dm_mirror dm_region_hash dm_log dm_mod CPU: 19 PID: 0 Comm: swapper/19 Kdump: loaded Tainted: G OE ------------ 3.10.0-957.el7.x86_64 #1 Hardware name: Phegda X2226A/S2600CW, BIOS SE5C610.86B.01.01.0024.021320181901 02/13/2018 task: ffff8a799ba0d140 ti: ffff8a799bad8000 task.ti: ffff8a799bad8000 RIP: 0010:[<ffffffff94cb7b02>] [<ffffffff94cb7b02>] __queue_work+0x32/0x3e0 RSP: 0018:ffff8a90dde43d80 EFLAGS: 00010046 RAX: 0000000000000082 RBX: 0000000000000086 RCX: 0000000000000000 RDX: ffff8a90b924fcb8 RSI: 0000000000000000 RDI: 000000000000001b RBP: ffff8a90dde43db8 R08: ffff8a799ba0d6d8 R09: ffff8a90dde53900 R10: 0000000000000002 R11: ffff8a90dde43de8 R12: ffff8a90b924fcb8 R13: 000000000000001b R14: 0000000000000000 R15: ffff8a90d2890000 FS: 0000000000000000(0000) GS:ffff8a90dde40000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000102 CR3: 0000001a70410000 CR4: 00000000001607e0 Call Trace: [<ffffffff94cb8105>] queue_work_on+0x45/0x50 [<ffffffffc03f781e>] _hfi1_schedule_send+0x6e/0xc0 [hfi1] [<ffffffffc03f78a2>] hfi1_schedule_send+0x32/0x70 [hfi1] [<ffffffffc02cf2d9>] rvt_rc_timeout+0xe9/0x130 [rdmavt] [<ffffffff94ce563a>] ? trigger_load_balance+0x6a/0x280 [<ffffffffc02cf1f0>] ? rvt_free_qpn+0x40/0x40 [rdmavt] [<ffffffff94ca7f58>] call_timer_fn+0x38/0x110 [<ffffffffc02cf1f0>] ? rvt_free_qpn+0x40/0x40 [rdmavt] [<ffffffff94caa3bd>] run_timer_softirq+0x24d/0x300 [<ffffffff94ca0f05>] __do_softirq+0xf5/0x280 [<ffffffff9537832c>] call_softirq+0x1c/0x30 [<ffffffff94c2e675>] do_softirq+0x65/0xa0 [<ffffffff94ca1285>] irq_exit+0x105/0x110 [<ffffffff953796c8>] smp_apic_timer_interrupt+0x48/0x60 [<ffffffff95375df2>] apic_timer_interrupt+0x162/0x170 <EOI> [<ffffffff951adfb7>] ? cpuidle_enter_state+0x57/0xd0 [<ffffffff951ae10e>] cpuidle_idle_call+0xde/0x230 [<ffffffff94c366de>] arch_cpu_idle+0xe/0xc0 [<ffffffff94cfc3ba>] cpu_startup_entry+0x14a/0x1e0 [<ffffffff94c57db7>] start_secondary+0x1f7/0x270 [<ffffffff94c000d5>] start_cpu+0x5/0x14
The solution is to destroy the workqueue only when the hfi1 driver is unloaded, not when the device is shut down. In addition, when the device is shut down, no more work should be scheduled on the workqueues and the workqueues are flushed.
--- drivers/infiniband/hw/hfi1/init.c | 27 +++++++++++++++++++++++---- drivers/infiniband/hw/hfi1/qp.c | 5 ++++- drivers/infiniband/hw/hfi1/tid_rdma.c | 5 ++++- 3 files changed, 31 insertions(+), 6 deletions(-)
drivers/infiniband/hw/hfi1/init.c +23 -4
@@ -845,6 +845,25 @@ wq_error: }/** +* destroy_workqueues - destroy per port workqueues +* @dd: the hfi1_ib device +*/ +static void destroy_workqueues (struct hfi1_devdata *dd) +{ +int pidx; +struct hfi1_pportdata *ppd; + +for (pidx =0 ; pidx < dd->num_pports; ++pidx) { + ppd = dd->pport + pidx; + +if (ppd->hfi1_wq) { +destroy_workqueue (ppd->hfi1_wq); + ppd->hfi1_wq =NULL ; + } + } +} + +/** * enable_general_intr() - Enable the IRQs that will be handled by the * general interrupt handler. * @dd: valid devdata
@@ -1118,11 +1137,10 @@ static void shutdown_device(struct hfi1_*/ hfi1_quiet_serdes (ppd); -if (ppd->hfi1_wq) { -destroy_workqueue (ppd->hfi1_wq); - ppd->hfi1_wq =NULL ; - } +if (ppd->hfi1_wq) +flush_workqueue (ppd->hfi1_wq);if (ppd->link_wq) { +flush_workqueue (ppd->link_wq);destroy_workqueue (ppd->link_wq); ppd->link_wq =NULL ; }
@@ -1814,6 +1832,7 @@ static void remove_one(struct pci_dev *p* clear dma engines, etc. */ shutdown_device (dd); +destroy_workqueues (dd);stop_timers (dd);
drivers/infiniband/hw/hfi1/qp.c +4 -1
@@ -381,7 +381,10 @@ bool _hfi1_schedule_send(struct rvt_qp *struct hfi1_ibport *ibp =to_iport (qp->ibqp.device, qp->port_num);struct hfi1_pportdata *ppd =ppd_from_ibp (ibp); -struct hfi1_devdata *dd =dd_from_ibdev (qp->ibqp.device); +struct hfi1_devdata *dd = ppd->dd; + +if (dd->flags &HFI1_SHUTDOWN ) +return true; return iowait_schedule(&priv->s_iowait, ppd->hfi1_wq, priv->s_sde ?
drivers/infiniband/hw/hfi1/tid_rdma.c +4 -1
@@ -5406,7 +5406,10 @@ static bool _hfi1_schedule_tid_send(strustruct hfi1_ibport *ibp =to_iport (qp->ibqp.device, qp->port_num);struct hfi1_pportdata *ppd =ppd_from_ibp (ibp); -struct hfi1_devdata *dd =dd_from_ibdev (qp->ibqp.device); +struct hfi1_devdata *dd = ppd->dd; + +if ((dd->flags &HFI1_SHUTDOWN )) +return true; return iowait_tid_schedule(&priv->s_iowait, ppd->hfi1_wq, priv->s_sde ?
Greg Kroah-Hartman
maintainerPATCH 71/109 IB/hfi1: Do not destroy link_wq when the device is shut down
In reply to Greg Kroah-HartmanFrom: Kaike Wan <[email protected]>
commit 2315ec12ee8e8257bb335654c62e0cae71dc278d upstream.
The workqueue link_wq should only be destroyed when the hfi1 driver is unloaded, not when the device is shut down.
--- drivers/infiniband/hw/hfi1/init.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/infiniband/hw/hfi1/init.c +5 -5
@@ -860,6 +860,10 @@ static void destroy_workqueues(struct hfdestroy_workqueue (ppd->hfi1_wq); ppd->hfi1_wq =NULL ; } +if (ppd->link_wq) { +destroy_workqueue (ppd->link_wq); + ppd->link_wq =NULL ; + } } }
@@ -1136,14 +1140,10 @@ static void shutdown_device(struct hfi1_* We can't count on interrupts since we are stopping. */ hfi1_quiet_serdes (ppd); -if (ppd->hfi1_wq)flush_workqueue (ppd->hfi1_wq); -if (ppd->link_wq) { +if (ppd->link_wq)flush_workqueue (ppd->link_wq); -destroy_workqueue (ppd->link_wq); - ppd->link_wq =NULL ; - } }sdma_exit (dd); }
Greg Kroah-Hartman
maintainerPATCH 72/109 ALSA: opl3: fix infoleak in opl3
In reply to Greg Kroah-HartmanFrom: xidongwang <[email protected]>
commit ad155712bb1ea2151944cf06a0e08c315c70c1e3 upstream.
The stack object “info” in snd_opl3_ioctl() has a leaking problem. It has 2 padding bytes which are not initialized and leaked via “copy_to_user”.
--- sound/drivers/opl3/opl3_synth.c | 2 ++ 1 file changed, 2 insertions(+)
sound/drivers/opl3/opl3_synth.c +2 -0
@@ -91,6 +91,8 @@ int snd_opl3_ioctl(struct snd_hwdep * hw {struct snd_dm_fm_info info; +memset (&info,0 ,sizeof (info)); + info.fm_mode = opl3->fm_mode; info.rhythm = opl3->rhythm;if (copy_to_user (argp, &info,sizeof (struct snd_dm_fm_info )))
Greg Kroah-Hartman
maintainerPATCH 73/109 ALSA: hda - let hs_mic be picked ahead of hp_mic
In reply to Greg Kroah-HartmanFrom: Hui Wang <[email protected]>
commit 6a6ca7881b1ab1c13fe0d70bae29211a65dd90de upstream.
We have a Dell AIO, there is neither internal speaker nor internal mic, only a multi-function audio jack on it.
Users reported that after freshly installing the OS and plug a headset to the audio jack, the headset can't output sound. I reproduced this bug, at that moment, the Input Source is as below:
Simple mixer control 'Input Source',0
Capabilities: cenum
Items: 'Headphone Mic' 'Headset Mic'
Item0: 'Headphone Mic'
That is because the patch_realtek will set this audio jack as mic_in mode if Input Source's value is hp_mic.
If it is not fresh installing, this issue will not happen since the systemd will run alsactl restore -f /var/lib/alsa/asound.state, this will set the 'Input Source' according to history value.
If there is internal speaker or internal mic, this issue will not happen since there is valid sink/source in the pulseaudio, the PA will set the 'Input Source' according to active_port.
To fix this issue, change the parser function to let the hs_mic be stored ahead of hp_mic.
--- sound/pci/hda/hda_auto_parser.c | 6 ++++++ 1 file changed, 6 insertions(+)
sound/pci/hda/hda_auto_parser.c +6 -0
@@ -72,6 +72,12 @@ static int compare_input_type(const voidif (a->type != b->type)return (int )(a->type - b->type); +/* If has both hs_mic and hp_mic, pick the hs_mic ahead of hp_mic. */ +if (a->is_headset_mic && b->is_headphone_mic) +return -1 ;/* don't swap */ +else if (a->is_headphone_mic && b->is_headset_mic) +return 1 ;/* swap */ +/* In case one has boost and the other one has not, pick the one with boost first. */ return (int )(b->has_boost_on_pin - a->has_boost_on_pin);
Greg Kroah-Hartman
maintainerPATCH 74/109 ALSA: usb-audio: add quirk for MacroSilicon MS2109
In reply to Greg Kroah-HartmanFrom: Hector Martin <[email protected]>
commit e337bf19f6af38d5c3fa6d06cd594e0f890ca1ac upstream.
These devices claim to be 96kHz mono, but actually are 48kHz stereo with swapped channels and unaligned transfers.
--- sound/usb/quirks-table.h | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+)
sound/usb/quirks-table.h +52 -0
@@ -3695,4 +3695,56 @@ ALC1220_VB_DESKTOP(0x26ce, 0x0a01), /* A } }, +/* +* MacroSilicon MS2109 based HDMI capture cards +* +* These claim 96kHz 1ch in the descriptors, but are actually 48kHz 2ch. +* They also need QUIRK_AUDIO_ALIGN_TRANSFER, which makes one wonder if +* they pretend to be 96kHz mono as a workaround for stereo being broken +* by that... +* +* They also have swapped L-R channels, but that's for userspace to deal +* with. +*/ +{ + USB_DEVICE(0x534d, 0x2109), + .driver_info = (unsigned long ) &(const struct snd_usb_audio_quirk ) { + .vendor_name ="MacroSilicon" , + .product_name ="MS2109" , + .ifnum =QUIRK_ANY_INTERFACE , + .type =QUIRK_COMPOSITE , + .data = &(const struct snd_usb_audio_quirk []) { + { + .ifnum =2 , + .type =QUIRK_AUDIO_ALIGN_TRANSFER , + }, + { + .ifnum =2 , + .type =QUIRK_AUDIO_STANDARD_MIXER , + }, + { + .ifnum =3 , + .type =QUIRK_AUDIO_FIXED_ENDPOINT , + .data = &(const struct audioformat ) { + .formats =SNDRV_PCM_FMTBIT_S16_LE , + .channels =2 , + .iface =3 , + .altsetting =1 , + .altset_idx =1 , + .attributes =0 , + .endpoint =0x82 , + .ep_attr =USB_ENDPOINT_XFER_ISOC | +USB_ENDPOINT_SYNC_ASYNC , + .rates =SNDRV_PCM_RATE_CONTINUOUS , + .rate_min =48000 , + .rate_max =48000 , + } + }, + { + .ifnum =-1 + } + } + } +}, + #undef USB_DEVICE_VENDOR_SPEC
Greg Kroah-Hartman
maintainerPATCH 75/109 ALSA: usb-audio: Add implicit feedback quirk for RTX6001
In reply to Greg Kroah-HartmanFrom: Pavel Hofman <[email protected]>
commit b6a1e78b96a5d7f312f08b3a470eb911ab5feec0 upstream.
USB Audio analyzer RTX6001 uses the same implicit feedback quirk as other XMOS-based devices.
--- sound/usb/pcm.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/pcm.c +1 -0
@@ -350,6 +350,7 @@ static int set_sync_ep_implicit_fb_quirk goto add_sync_ep_from_ifnum;case USB_ID (0x07fd ,0x0008 ):/* MOTU M Series */ case USB_ID (0x31e9 ,0x0002 ):/* Solid State Logic SSL2+ */ +case USB_ID (0x0d9a ,0x00df ):/* RTX6001 */ ep =0x81 ; ifnum =2 ; goto add_sync_ep_from_ifnum;
Greg Kroah-Hartman
maintainerPATCH 76/109 ALSA: hda/realtek - Fix Lenovo Thinkpad X1 Carbon 7th quirk subdevice id
In reply to Greg Kroah-HartmanFrom: Benjamin Poirier <[email protected]>
commit 9774dc218bb628974dcbc76412f970e9258e5f27 upstream.
1)
In snd_hda_pick_fixup(), quirks are first matched by PCI SSID and then, if there is no match, by codec SSID. The Lenovo "ThinkPad X1 Carbon 7th" has an audio chip with PCI SSID 0x2292 and codec SSID 0x2293[1]. Therefore, fix the quirk meant for that device to match on .subdevice == 0x2292.
2)
The "Thinkpad X1 Yoga 7th" does not exist. The companion product to the Carbon 7th is the Yoga 4th. That device has an audio chip with PCI SSID 0x2292 and codec SSID 0x2292[2]. Given the behavior of snd_hda_pick_fixup(), it is not possible to have a separate quirk for the Yoga based on SSID. Therefore, merge the quirks meant for the Carbon and Yoga. This preserves the current behavior for the Yoga.
[1] This is the case on my own machine and can also be checked here
https://github.com/linuxhw/LsPCI/tree/master/Notebook/Lenovo/ThinkPad
https://gist.github.com/hamidzr/dd81e429dc86f4327ded7a2030e7d7d9#gistcomment-3225701
[2]
https://github.com/linuxhw/LsPCI/tree/master/Convertible/Lenovo/ThinkPad
https://gist.github.com/hamidzr/dd81e429dc86f4327ded7a2030e7d7d9#gistcomment-3176355
--- sound/pci/hda/patch_realtek.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +1 -2
@@ -7536,8 +7536,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x224c ,"Thinkpad" ,ALC298_FIXUP_TPT470_DOCK ),SND_PCI_QUIRK (0x17aa ,0x224d ,"Thinkpad" ,ALC298_FIXUP_TPT470_DOCK ),SND_PCI_QUIRK (0x17aa ,0x225d ,"Thinkpad T480" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ), -SND_PCI_QUIRK (0x17aa ,0x2292 ,"Thinkpad X1 Yoga 7th" ,ALC285_FIXUP_THINKPAD_HEADSET_JACK ), -SND_PCI_QUIRK (0x17aa ,0x2293 ,"Thinkpad X1 Carbon 7th" ,ALC285_FIXUP_THINKPAD_HEADSET_JACK ), +SND_PCI_QUIRK (0x17aa ,0x2292 ,"Thinkpad X1 Carbon 7th" ,ALC285_FIXUP_THINKPAD_HEADSET_JACK ),SND_PCI_QUIRK (0x17aa ,0x22be ,"Thinkpad X1 Carbon 8th" ,ALC285_FIXUP_THINKPAD_HEADSET_JACK ),SND_PCI_QUIRK (0x17aa ,0x30bb ,"ThinkCentre AIO" ,ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY ), SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
Greg Kroah-Hartman
maintainerPATCH 77/109 ALSA: hda/realtek - Enable audio jacks of Acer vCopperbox with ALC269VC
In reply to Greg Kroah-HartmanFrom: Jian-Hong Pan <[email protected]>
commit 8eae7e9b3967f08efaa4d70403aec513cbe45ad0 upstream.
The Acer desktop vCopperbox with ALC269VC cannot detect the MIC of headset, the line out and internal speaker until ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS quirk applied.
--- sound/pci/hda/patch_realtek.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
sound/pci/hda/patch_realtek.c +13 -0
@@ -6114,6 +6114,7 @@ enum {ALC236_FIXUP_HP_MUTE_LED ,ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET ,ALC295_FIXUP_ASUS_MIC_NO_PRESENCE , + ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS, }; static const struct hda_fixup alc269_fixups[] = {
@@ -7292,6 +7293,17 @@ static const struct hda_fixup alc269_fix .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MODE }, + [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x14 ,0x90100120 },/* use as internal speaker */ + {0x18 ,0x02a111f0 },/* use as headset mic, without its own jack detect */ + {0x1a ,0x01011020 },/* use as line out */ + { }, + }, + .chained = true, + .chain_id =ALC269_FIXUP_HEADSET_MIC + }, };static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -7311,6 +7323,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1025 ,0x1099 ,"Acer Aspire E5-523G" ,ALC255_FIXUP_ACER_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1025 ,0x110e ,"Acer Aspire ES1-432" ,ALC255_FIXUP_ACER_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1025 ,0x1246 ,"Acer Predator Helios 500" ,ALC299_FIXUP_PREDATOR_SPK ), +SND_PCI_QUIRK (0x1025 ,0x1247 ,"Acer vCopperbox" ,ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS ),SND_PCI_QUIRK (0x1025 ,0x128f ,"Acer Veriton Z6860G" ,ALC286_FIXUP_ACER_AIO_HEADSET_MIC ),SND_PCI_QUIRK (0x1025 ,0x1290 ,"Acer Veriton Z4860G" ,ALC286_FIXUP_ACER_AIO_HEADSET_MIC ), SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Greg Kroah-Hartman
maintainerPATCH 78/109 ALSA: hda/realtek: Enable headset mic of Acer C20-820 with ALC269VC
In reply to Greg Kroah-HartmanFrom: Jian-Hong Pan <[email protected]>
commit 6e15d1261d522d1d222f8f89b23c6966905e9049 upstream.
The Acer Aspire C20-820 AIO's audio (1025:1065) with ALC269VC can't detect the headset microphone until ALC269VC_FIXUP_ACER_HEADSET_MIC quirk maps the NID 0x18 as the headset mic pin.
--- sound/pci/hda/patch_realtek.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
sound/pci/hda/patch_realtek.c +11 -0
@@ -6115,6 +6115,7 @@ enum {ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET ,ALC295_FIXUP_ASUS_MIC_NO_PRESENCE ,ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS , + ALC269VC_FIXUP_ACER_HEADSET_MIC, }; static const struct hda_fixup alc269_fixups[] = {
@@ -7304,6 +7305,15 @@ static const struct hda_fixup alc269_fix .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MIC }, + [ALC269VC_FIXUP_ACER_HEADSET_MIC] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x18 ,0x02a11030 },/* use as headset mic */ + { } + }, + .chained = true, + .chain_id =ALC269_FIXUP_HEADSET_MIC + }, };static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -7319,6 +7329,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1025 ,0x0775 ,"Acer Aspire E1-572" ,ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572 ),SND_PCI_QUIRK (0x1025 ,0x079b ,"Acer Aspire V5-573G" ,ALC282_FIXUP_ASPIRE_V5_PINS ),SND_PCI_QUIRK (0x1025 ,0x102b ,"Acer Aspire C24-860" ,ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ), +SND_PCI_QUIRK (0x1025 ,0x1065 ,"Acer Aspire C20-820" ,ALC269VC_FIXUP_ACER_HEADSET_MIC ),SND_PCI_QUIRK (0x1025 ,0x106d ,"Acer Cloudbook 14" ,ALC283_FIXUP_CHROME_BOOK ),SND_PCI_QUIRK (0x1025 ,0x1099 ,"Acer Aspire E5-523G" ,ALC255_FIXUP_ACER_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
Greg Kroah-Hartman
maintainerPATCH 79/109 ALSA: hda/realtek: Enable headset mic of Acer Veriton N4660G with ALC269VC
In reply to Greg Kroah-HartmanFrom: Jian-Hong Pan <[email protected]>
commit 781c90c034d994c6a4e2badf189128a95ed864c2 upstream.
The Acer Veriton N4660G desktop's audio (1025:1248) with ALC269VC cannot detect the headset microphone until ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE quirk maps the NID 0x18 as the headset mic pin.
--- sound/pci/hda/patch_realtek.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
sound/pci/hda/patch_realtek.c +11 -0
@@ -6116,6 +6116,7 @@ enum {ALC295_FIXUP_ASUS_MIC_NO_PRESENCE ,ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS ,ALC269VC_FIXUP_ACER_HEADSET_MIC , + ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE, }; static const struct hda_fixup alc269_fixups[] = {
@@ -7314,6 +7315,15 @@ static const struct hda_fixup alc269_fix .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MIC }, + [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x18 ,0x01a11130 },/* use as headset mic, without its own jack detect */ + { } + }, + .chained = true, + .chain_id =ALC269_FIXUP_HEADSET_MIC + }, };static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -7335,6 +7345,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1025 ,0x110e ,"Acer Aspire ES1-432" ,ALC255_FIXUP_ACER_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1025 ,0x1246 ,"Acer Predator Helios 500" ,ALC299_FIXUP_PREDATOR_SPK ),SND_PCI_QUIRK (0x1025 ,0x1247 ,"Acer vCopperbox" ,ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS ), +SND_PCI_QUIRK (0x1025 ,0x1248 ,"Acer Veriton N4660G" ,ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1025 ,0x128f ,"Acer Veriton Z6860G" ,ALC286_FIXUP_ACER_AIO_HEADSET_MIC ),SND_PCI_QUIRK (0x1025 ,0x1290 ,"Acer Veriton Z4860G" ,ALC286_FIXUP_ACER_AIO_HEADSET_MIC ), SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Greg Kroah-Hartman
maintainerPATCH 80/109 KVM: arm64: Fix definition of PAGE_HYP_DEVICE
In reply to Greg Kroah-HartmanFrom: Will Deacon <[email protected]>
commit 68cf617309b5f6f3a651165f49f20af1494753ae upstream.
PAGE_HYP_DEVICE is intended to encode attribute bits for an EL2 stage-1 pte mapping a device. Unfortunately, it includes PROT_DEVICE_nGnRE which encodes attributes for EL1 stage-1 mappings such as UXN and nG, which are RES0 for EL2, and DBM which is meaningless as TCR_EL2.HD is not set.
Fix the definition of PAGE_HYP_DEVICE so that it doesn't set RES0 bits at EL2.
--- arch/arm64/include/asm/pgtable-prot.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/include/asm/pgtable-prot.h +1 -1
@@ -54,7 +54,7 @@#define PAGE_HYP __pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_HYP_XN)#define PAGE_HYP_EXEC __pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_RDONLY)#define PAGE_HYP_RO __pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_RDONLY | PTE_HYP_XN) -#define PAGE_HYP_DEVICE __pgprot(PROT_DEVICE_nGnRE | PTE_HYP) +#define PAGE_HYP_DEVICE __pgprot(_PROT_DEFAULT | PTE_ATTRINDX(MT_DEVICE_nGnRE) | PTE_HYP | PTE_HYP_XN)#define PAGE_S2_MEMATTR (attr) \ ({ \
Greg Kroah-Hartman
maintainerPATCH 81/109 KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART
In reply to Greg Kroah-HartmanFrom: Andrew Scull <[email protected]>
commit b9e10d4a6c9f5cbe6369ce2c17ebc67d2e5a4be5 upstream.
HVC_SOFT_RESTART is given values for x0-2 that it should installed before exiting to the new address so should not set x0 to stub HVC success or failure code.
--- arch/arm64/kvm/hyp-init.S | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
arch/arm64/kvm/hyp-init.S +7 -4
@@ -136,11 +136,15 @@ ENTRY(__kvm_handle_stub_hvc) 1: cmp x0, #HVC_RESET_VECTORS b.ne 1f -reset: + /* - * Reset kvm back to the hyp stub. Do not clobber x0-x4 in - * case we coming via HVC_SOFT_RESTART. + * Set the HVC_RESET_VECTORS return code before entering the common + * path so that we do not clobber x0-x2 in case we are coming via + * HVC_SOFT_RESTART. */ + mov x0, xzr +reset: + /* Reset kvm back to the hyp stub. */ mrs x5, sctlr_el2 ldr x6, =SCTLR_ELx_FLAGS bic x5, x5, x6 // Clear SCTL_M and etc
@@ -151,7 +155,6 @@ reset: /* Install stub vectors */ adr_l x5, __hyp_stub_vectors msr vbar_el2, x5 - mov x0, xzr eret 1: /* Bad stub call */
Greg Kroah-Hartman
maintainerPATCH 82/109 KVM: arm64: Annotate hyp NMI-related functions as __always_inline
In reply to Greg Kroah-HartmanFrom: Alexandru Elisei <[email protected]>
commit 7733306bd593c737c63110175da6c35b4b8bb32c upstream.
The "inline" keyword is a hint for the compiler to inline a function. The functions system_uses_irq_prio_masking() and gic_write_pmr() are used by the code running at EL2 on a non-VHE system, so mark them as __always_inline to make sure they'll always be part of the .hyp.text section.
This fixes the following splat when trying to run a VM:
[ 47.625273] Kernel panic - not syncing: HYP panic: [ 47.625273] PS:a00003c9 PC:0000ca0b42049fc4 ESR:86000006 [ 47.625273] FAR:0000ca0b42049fc4 HPFAR:0000000010001000 PAR:0000000000000000 [ 47.625273] VCPU:0000000000000000 [ 47.647261] CPU: 1 PID: 217 Comm: kvm-vcpu-0 Not tainted 5.8.0-rc1-ARCH+ #61 [ 47.654508] Hardware name: Globalscale Marvell ESPRESSOBin Board (DT) [ 47.661139] Call trace: [ 47.663659] dump_backtrace+0x0/0x1cc [ 47.667413] show_stack+0x18/0x24 [ 47.670822] dump_stack+0xb8/0x108 [ 47.674312] panic+0x124/0x2f4 [ 47.677446] panic+0x0/0x2f4 [ 47.680407] SMP: stopping secondary CPUs [ 47.684439] Kernel Offset: disabled [ 47.688018] CPU features: 0x240402,20002008 [ 47.692318] Memory Limit: none [ 47.695465] ---[ end Kernel panic - not syncing: HYP panic: [ 47.695465] PS:a00003c9 PC:0000ca0b42049fc4 ESR:86000006 [ 47.695465] FAR:0000ca0b42049fc4 HPFAR:0000000010001000 PAR:0000000000000000 [ 47.695465] VCPU:0000000000000000 ]---
The instruction abort was caused by the code running at EL2 trying to fetch an instruction which wasn't mapped in the EL2 translation tables. Using objdump showed the two functions as separate symbols in the .text section.
--- arch/arm64/include/asm/arch_gicv3.h | 2 +- arch/arm64/include/asm/cpufeature.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm64/include/asm/arch_gicv3.h +1 -1
@@ -109,7 +109,7 @@ static inline u32 gic_read_pmr(void)return read_sysreg_s (SYS_ICC_PMR_EL1 ); } -static inline void gic_write_pmr (u32 val) +static __always_inline void gic_write_pmr(u32 val) {write_sysreg_s (val,SYS_ICC_PMR_EL1 ); }
arch/arm64/include/asm/cpufeature.h +1 -1
@@ -601,7 +601,7 @@ static inline bool system_supports_gener cpus_have_const_cap(ARM64_HAS_GENERIC_AUTH_IMP_DEF)); } -static inline bool system_uses_irq_prio_masking (void ) +static __always_inline bool system_uses_irq_prio_masking(void) {return IS_ENABLED (CONFIG_ARM64_PSEUDO_NMI ) &&cpus_have_const_cap (ARM64_HAS_IRQ_PRIO_MASKING );
Greg Kroah-Hartman
maintainerPATCH 83/109 KVM: x86: bit 8 of non-leaf PDPEs is not reserved
In reply to Greg Kroah-HartmanFrom: Paolo Bonzini <[email protected]>
commit 5ecad245de2ae23dc4e2dbece92f8ccfbaed2fa7 upstream.
Bit 8 would be the "global" bit, which does not quite make sense for non-leaf page table entries. Intel ignores it; AMD ignores it in PDEs and PDPEs, but reserves it in PML4Es.
Probably, earlier versions of the AMD manual documented it as reserved in PDPEs as well, and that behavior made it into KVM as well as kvm-unit-tests; fix it.
--- arch/x86/kvm/mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/mmu.c +1 -1
@@ -4580,7 +4580,7 @@ __reset_rsvds_bits_mask(struct kvm_vcpu nonleaf_bit8_rsvd |rsvd_bits (7 ,7 ) |rsvd_bits (maxphyaddr,51 ); rsvd_check->rsvd_bits_mask[0 ][2 ] = exb_bit_rsvd | - nonleaf_bit8_rsvd | gbpages_bit_rsvd | + gbpages_bit_rsvd |rsvd_bits (maxphyaddr,51 ); rsvd_check->rsvd_bits_mask[0 ][1 ] = exb_bit_rsvd |rsvd_bits (maxphyaddr,51 );
Greg Kroah-Hartman
maintainerPATCH 84/109 KVM: x86: Inject #GP if guest attempts to toggle CR4.LA57 in 64-bit mode
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit d74fcfc1f0ff4b6c26ecef1f9e48d8089ab4eaac upstream.
Inject a #GP on MOV CR4 if CR4.LA57 is toggled in 64-bit mode, which is illegal per Intel's SDM:
CR4.LA57
57-bit linear addresses (bit 12 of CR4) ... blah blah blah ... This bit cannot be modified in IA-32e mode.
Note, the pseudocode for MOV CR doesn't call out the fault condition, which is likely why the check was missed during initial development. This is arguably an SDM bug and will hopefully be fixed in future release of the SDM.
Message-Id: <[email protected]>
--- arch/x86/kvm/x86.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/kvm/x86.c +2 -0
@@ -980,6 +980,8 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, uif (is_long_mode (vcpu)) {if (!(cr4 &X86_CR4_PAE ))return 1 ; +if ((cr4 ^ old_cr4) &X86_CR4_LA57 ) +return 1 ; }else if (is_paging (vcpu) && (cr4 &X86_CR4_PAE ) && ((cr4 ^ old_cr4) & pdptr_bits) && !load_pdptrs(vcpu, vcpu->arch.walk_mmu,
Greg Kroah-Hartman
maintainerPATCH 85/109 KVM: x86: Mark CR4.TSD as being possibly owned by the guest
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 7c83d096aed055a7763a03384f92115363448b71 upstream.
Mark CR4.TSD as being possibly owned by the guest as that is indeed the case on VMX. Without TSD being tagged as possibly owned by the guest, a targeted read of CR4 to get TSD could observe a stale value. This bug is benign in the current code base as the sole consumer of TSD is the emulator (for RDTSC) and the emulator always "reads" the entirety of CR4 when grabbing bits.
Add a build-time assertion in to ensure VMX doesn't hand over more CR4 bits without also updating x86.
Message-Id: <[email protected]>
--- arch/x86/kvm/kvm_cache_regs.h | 2 +- arch/x86/kvm/vmx/vmx.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-)
arch/x86/kvm/kvm_cache_regs.h +1 -1
@@ -7,7 +7,7 @@#define KVM_POSSIBLE_CR0_GUEST_BITS X86_CR0_TS#define KVM_POSSIBLE_CR4_GUEST_BITS \ (X86_CR4_PVI | X86_CR4_DE | X86_CR4_PCE | X86_CR4_OSFXSR \ - | X86_CR4_OSXMMEXCPT | X86_CR4_LA57 | X86_CR4_PGE) + | X86_CR4_OSXMMEXCPT | X86_CR4_LA57 | X86_CR4_PGE | X86_CR4_TSD)#define BUILD_KVM_GPR_ACCESSORS (lname, uname) \ static __always_inline unsigned long kvm_##lname##_read(struct kvm_vcpu *vcpu)\
arch/x86/kvm/vmx/vmx.c +2 -0
@@ -3913,6 +3913,8 @@ void vmx_set_constant_host_state(structvoid set_cr4_guest_host_mask (struct vcpu_vmx *vmx) { +BUILD_BUG_ON (KVM_CR4_GUEST_OWNED_BITS & ~KVM_POSSIBLE_CR4_GUEST_BITS ); + vmx->vcpu.arch.cr4_guest_owned_bits =KVM_CR4_GUEST_OWNED_BITS ;if (enable_ept) vmx->vcpu.arch.cr4_guest_owned_bits |=X86_CR4_PGE ;
Greg Kroah-Hartman
maintainerPATCH 86/109 KVM: arm64: Fix kvm_reset_vcpu() return code being incorrect with SVE
In reply to Greg Kroah-HartmanFrom: Steven Price <[email protected]>
If SVE is enabled then 'ret' can be assigned the return value of kvm_vcpu_enable_sve() which may be 0 causing future "goto out" sites to erroneously return 0 on failure rather than -EINVAL as expected.
Remove the initialisation of 'ret' and make setting the return value explicit to avoid this situation in the future.
--- arch/arm64/kvm/reset.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
arch/arm64/kvm/reset.c +7 -3
@@ -258,7 +258,7 @@ static int kvm_vcpu_enable_ptrauth(strucint kvm_reset_vcpu (struct kvm_vcpu *vcpu) {const struct kvm_regs *cpu_reset; -int ret = -EINVAL ; +int ret;bool loaded;/* Reset PMU outside of the non-preemptible section */
@@ -281,15 +281,19 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpuif (test_bit (KVM_ARM_VCPU_PTRAUTH_ADDRESS , vcpu->arch.features) ||test_bit (KVM_ARM_VCPU_PTRAUTH_GENERIC , vcpu->arch.features)) { -if (kvm_vcpu_enable_ptrauth (vcpu)) +if (kvm_vcpu_enable_ptrauth (vcpu)) { + ret = -EINVAL ; goto out; + } }switch (vcpu->arch.target) {default :if (test_bit (KVM_ARM_VCPU_EL1_32BIT , vcpu->arch.features)) { -if (!cpu_has_32bit_el1 ()) +if (!cpu_has_32bit_el1 ()) { + ret = -EINVAL ; goto out; + } cpu_reset = &default_regs_reset32; }else { cpu_reset = &default_regs_reset;
Greg Kroah-Hartman
maintainerPATCH 87/109 kallsyms: Refactor kallsyms_show_value() to take cred
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit 160251842cd35a75edfb0a1d76afa3eb674ff40a upstream.
In order to perform future tests against the cred saved during open(), switch kallsyms_show_value() to operate on a cred, and have all current callers pass current_cred(). This makes it very obvious where callers are checking the wrong credential in their "read" contexts. These will be fixed in the coming patches.
Additionally switch return value to bool, since it is always used as a direct permission check, not a 0-on-success, negative-on-error style function return.
--- include/linux/filter.h | 2 +- include/linux/kallsyms.h | 5 +++-- kernel/kallsyms.c | 17 +++++++++++------ kernel/kprobes.c | 4 ++-- kernel/module.c | 2 +- 5 files changed, 18 insertions(+), 12 deletions(-)
include/linux/filter.h +1 -1
@@ -858,7 +858,7 @@ static inline bool bpf_dump_raw_ok(void)/* Reconstruction of call-sites is dependent on kallsyms, * thus make dump the same restriction. */ -return kallsyms_show_value () ==1 ; +return kallsyms_show_value (current_cred ()); } struct bpf_prog *bpf_patch_insn_single(struct bpf_prog *prog, u32 off,
include/linux/kallsyms.h +3 -2
@@ -18,6 +18,7 @@#define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + (KSYM_NAME_LEN - 1) + \ 2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + 1) +struct cred ;struct module ;static inline int is_kernel_inittext (unsigned long addr)
@@ -98,7 +99,7 @@ int lookup_symbol_name(unsigned long addint lookup_symbol_attrs (unsigned long addr,unsigned long *size,unsigned long *offset,char *modname,char *name);/* How and when do we show kallsyms values? */ -extern int kallsyms_show_value (void ); +extern bool kallsyms_show_value (const struct cred *cred);#else /* !CONFIG_KALLSYMS */
@@ -158,7 +159,7 @@ static inline int lookup_symbol_attrs(unreturn -ERANGE ; } -static inline int kallsyms_show_value (void ) +static inline bool kallsyms_show_value (const struct cred *cred) {return false; }
kernel/kallsyms.c +11 -6
@@ -645,19 +645,20 @@ static inline int kallsyms_for_perf(void* Otherwise, require CAP_SYSLOG (assuming kptr_restrict isn't set to * block even that). */ -int kallsyms_show_value (void ) +bool kallsyms_show_value (const struct cred *cred) {switch (kptr_restrict) {case 0 :if (kallsyms_for_perf ()) -return 1 ; +return true;/* fallthrough */ case 1 : -if (has_capability_noaudit (current,CAP_SYSLOG )) -return 1 ; +if (security_capable (cred, &init_user_ns,CAP_SYSLOG , +CAP_OPT_NOAUDIT ) ==0 ) +return true;/* fallthrough */ default : -return 0 ; +return false; } }
@@ -674,7 +675,11 @@ static int kallsyms_open(struct inode *ireturn -ENOMEM ;reset_iter (iter,0 ); - iter->show_value =kallsyms_show_value (); +/* +* Instead of checking this on every s_show() call, cache +* the result here at open time. +*/ + iter->show_value =kallsyms_show_value (file->f_cred);return 0 ; }
kernel/kprobes.c +2 -2
@@ -2362,7 +2362,7 @@ static void report_probe(struct seq_fileelse kprobe_type ="k" ; -if (!kallsyms_show_value ()) +if (!kallsyms_show_value (current_cred ())) addr =NULL ;if (sym)
@@ -2463,7 +2463,7 @@ static int kprobe_blacklist_seq_show(str* If /proc/kallsyms is not showing kernel address, we won't * show them here either. */ -if (!kallsyms_show_value ()) +if (!kallsyms_show_value (current_cred ()))seq_printf (m,"0x%px-0x%px\t%ps\n" ,NULL ,NULL , (void *)ent->start_addr);else
kernel/module.c +1 -1
@@ -4391,7 +4391,7 @@ static int modules_open(struct inode *inif (!err) {struct seq_file *m = file->private_data; - m->private =kallsyms_show_value () ?NULL : (void *)8ul ; + m->private =kallsyms_show_value (current_cred ()) ?NULL : (void *)8ul ; }return err;
Greg Kroah-Hartman
maintainerPATCH 88/109 module: Refactor section attr into bin attribute
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit ed66f991bb19d94cae5d38f77de81f96aac7813f upstream.
In order to gain access to the open file's f_cred for kallsym visibility permission checks, refactor the module section attributes to use the bin_attribute instead of attribute interface. Additionally removes the redundant "name" struct member.
--- kernel/module.c | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-)
kernel/module.c +24 -21
@@ -1507,8 +1507,7 @@ static inline bool sect_empty(const Elf_ }struct module_sect_attr { -struct module_attribute mattr; -char *name; +struct bin_attribute battr;unsigned long address; };
@@ -1518,11 +1517,16 @@ struct module_sect_attrs {struct module_sect_attr attrs[0 ]; }; -static ssize_t module_sect_show (struct module_attribute *mattr, -struct module_kobject *mk,char *buf) +static ssize_t module_sect_read (struct file *file,struct kobject *kobj, +struct bin_attribute *battr, +char *buf,loff_t pos,size_t count) {struct module_sect_attr *sattr = - container_of(mattr, struct module_sect_attr, mattr); + container_of(battr, struct module_sect_attr, battr); + +if (pos !=0 ) +return -EINVAL ; +return sprintf (buf,"0x%px\n" , kptr_restrict <2 ? (void *)sattr->address :NULL ); }
@@ -1532,7 +1536,7 @@ static void free_sect_attrs(struct modulunsigned int section;for (section =0 ; section < sect_attrs->nsections; section++) -kfree (sect_attrs->attrs[section].name); +kfree (sect_attrs->attrs[section].battr.attr.name);kfree (sect_attrs); }
@@ -1541,42 +1545,41 @@ static void add_sect_attrs(struct moduleunsigned int nloaded =0 , i, size[2 ];struct module_sect_attrs *sect_attrs;struct module_sect_attr *sattr; -struct attribute **gattr; +struct bin_attribute **gattr;/* Count loaded sections and allocate structures */ for (i =0 ; i < info->hdr->e_shnum; i++)if (!sect_empty (&info->sechdrs[i])) nloaded++; size[0 ] =ALIGN (struct_size (sect_attrs, attrs, nloaded), -sizeof (sect_attrs->grp.attrs[0 ])); - size[1 ] = (nloaded +1 ) *sizeof (sect_attrs->grp.attrs[0 ]); +sizeof (sect_attrs->grp.bin_attrs[0 ])); + size[1 ] = (nloaded +1 ) *sizeof (sect_attrs->grp.bin_attrs[0 ]); sect_attrs =kzalloc (size[0 ] + size[1 ],GFP_KERNEL );if (sect_attrs ==NULL )return ;/* Setup section attributes. */ sect_attrs->grp.name ="sections" ; - sect_attrs->grp.attrs = (void *)sect_attrs + size[0 ]; + sect_attrs->grp.bin_attrs = (void *)sect_attrs + size[0 ]; sect_attrs->nsections =0 ; sattr = §_attrs->attrs[0 ]; - gattr = §_attrs->grp.attrs[0 ]; + gattr = §_attrs->grp.bin_attrs[0 ];for (i =0 ; i < info->hdr->e_shnum; i++) {Elf_Shdr *sec = &info->sechdrs[i];if (sect_empty (sec))continue ; +sysfs_bin_attr_init (&sattr->battr); sattr->address = sec->sh_addr; - sattr->name =kstrdup (info->secstrings + sec->sh_name, -GFP_KERNEL ); -if (sattr->name ==NULL ) + sattr->battr.attr.name = +kstrdup (info->secstrings + sec->sh_name,GFP_KERNEL ); +if (sattr->battr.attr.name ==NULL ) goto out; sect_attrs->nsections++; -sysfs_attr_init (&sattr->mattr.attr); - sattr->mattr.show = module_sect_show; - sattr->mattr.store =NULL ; - sattr->mattr.attr.name = sattr->name; - sattr->mattr.attr.mode =S_IRUSR ; - *(gattr++) = &(sattr++)->mattr.attr; + sattr->battr.read = module_sect_read; + sattr->battr.size =3 /* "0x", "\n" */ + (BITS_PER_LONG /4 ); + sattr->battr.attr.mode =0400 ; + *(gattr++) = &(sattr++)->battr; } *gattr =NULL ;
@@ -1666,7 +1669,7 @@ static void add_notes_attrs(struct modulcontinue ;if (info->sechdrs[i].sh_type ==SHT_NOTE ) {sysfs_bin_attr_init (nattr); - nattr->attr.name = mod->sect_attrs->attrs[loaded].name; + nattr->attr.name = mod->sect_attrs->attrs[loaded].battr.attr.name; nattr->attr.mode =S_IRUGO ; nattr->size = info->sechdrs[i].sh_size; nattr->private = (void *) info->sechdrs[i].sh_addr;
Greg Kroah-Hartman
maintainerPATCH 89/109 module: Do not expose section addresses to non-CAP_SYSLOG
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit b25a7c5af9051850d4f3d93ca500056ab6ec724b upstream.
The printing of section addresses in /sys/module/*/sections/* was not using the correct credentials to evaluate visibility.
Before:
# cat /sys/module/*/sections/.*text 0xffffffffc0458000 ... # capsh --drop=CAP_SYSLOG -- -c "cat /sys/module/*/sections/.*text" 0xffffffffc0458000 ...
After:
# cat /sys/module/*/sections/*.text 0xffffffffc0458000 ... # capsh --drop=CAP_SYSLOG -- -c "cat /sys/module/*/sections/.*text" 0x0000000000000000 ...
Additionally replaces the existing (safe) /proc/modules check with file->f_cred for consistency.
--- kernel/module.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/module.c +3 -3
@@ -1527,8 +1527,8 @@ static ssize_t module_sect_read(struct fif (pos !=0 )return -EINVAL ; -return sprintf (buf,"0x%px\n" , kptr_restrict <2 ? - (void *)sattr->address :NULL ); +return sprintf (buf,"0x%px\n" , +kallsyms_show_value (file->f_cred) ? (void *)sattr->address :NULL ); }static void free_sect_attrs (struct module_sect_attrs *sect_attrs)
@@ -4394,7 +4394,7 @@ static int modules_open(struct inode *inif (!err) {struct seq_file *m = file->private_data; - m->private =kallsyms_show_value (current_cred ()) ?NULL : (void *)8ul ; + m->private =kallsyms_show_value (file->f_cred) ?NULL : (void *)8ul ; }return err;
Greg Kroah-Hartman
maintainerPATCH 90/109 kprobes: Do not expose probe addresses to non-CAP_SYSLOG
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit 60f7bb66b88b649433bf700acfc60c3f24953871 upstream.
The kprobe show() functions were using "current"'s creds instead of the file opener's creds for kallsyms visibility. Fix to use seq_file->file->f_cred.
--- kernel/kprobes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/kprobes.c +2 -2
@@ -2362,7 +2362,7 @@ static void report_probe(struct seq_fileelse kprobe_type ="k" ; -if (!kallsyms_show_value (current_cred ())) +if (!kallsyms_show_value (pi->file->f_cred)) addr =NULL ;if (sym)
@@ -2463,7 +2463,7 @@ static int kprobe_blacklist_seq_show(str* If /proc/kallsyms is not showing kernel address, we won't * show them here either. */ -if (!kallsyms_show_value (current_cred ())) +if (!kallsyms_show_value (m->file->f_cred))seq_printf (m,"0x%px-0x%px\t%ps\n" ,NULL ,NULL , (void *)ent->start_addr);else
Greg Kroah-Hartman
maintainerPATCH 91/109 bpf: Check correct cred for CAP_SYSLOG in bpf_dump_raw_ok()
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit 63960260457a02af2a6cb35d75e6bdb17299c882 upstream.
When evaluating access control over kallsyms visibility, credentials at open() time need to be used, not the "current" creds (though in BPF's case, this has likely always been the same). Plumb access to associated file->f_cred down through bpf_dump_raw_ok() and its callers now that kallsysm_show_value() has been refactored to take struct cred.
--- include/linux/filter.h | 4 ++-- kernel/bpf/syscall.c | 32 ++++++++++++++++++-------------- net/core/sysctl_net_core.c | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-)
include/linux/filter.h +2 -2
@@ -853,12 +853,12 @@ void bpf_jit_compile(struct bpf_prog *prbool bpf_jit_needs_zext (void );bool bpf_helper_changes_pkt_data (void *func); -static inline bool bpf_dump_raw_ok (void ) +static inline bool bpf_dump_raw_ok (const struct cred *cred) {/* Reconstruction of call-sites is dependent on kallsyms, * thus make dump the same restriction. */ -return kallsyms_show_value (current_cred ()); +return kallsyms_show_value (cred); } struct bpf_prog *bpf_patch_insn_single(struct bpf_prog *prog, u32 off,
kernel/bpf/syscall.c +18 -14
@@ -2248,7 +2248,8 @@ static const struct bpf_map *bpf_map_froreturn NULL ; } -static struct bpf_insn *bpf_insn_prepare_dump (const struct bpf_prog *prog) +static struct bpf_insn *bpf_insn_prepare_dump (const struct bpf_prog *prog, +const struct cred *f_cred) {const struct bpf_map *map;struct bpf_insn *insns;
@@ -2271,7 +2272,7 @@ static struct bpf_insn *bpf_insn_prepare insns[i].code == (BPF_JMP | BPF_CALL_ARGS)) {if (insns[i].code == (BPF_JMP |BPF_CALL_ARGS )) insns[i].code =BPF_JMP |BPF_CALL ; -if (!bpf_dump_raw_ok ()) +if (!bpf_dump_raw_ok (f_cred)) insns[i].imm =0 ;continue ; }
@@ -2323,7 +2324,8 @@ static int set_info_rec_size(struct bpf_return 0 ; } -static int bpf_prog_get_info_by_fd (struct bpf_prog *prog, +static int bpf_prog_get_info_by_fd (struct file *file, +struct bpf_prog *prog,const union bpf_attr *attr,union bpf_attr __user *uattr) {
@@ -2392,11 +2394,11 @@ static int bpf_prog_get_info_by_fd(strucstruct bpf_insn *insns_sanitized;bool fault; -if (prog->blinded && !bpf_dump_raw_ok ()) { +if (prog->blinded && !bpf_dump_raw_ok (file->f_cred)) { info.xlated_prog_insns =0 ; goto done; } - insns_sanitized =bpf_insn_prepare_dump (prog); + insns_sanitized =bpf_insn_prepare_dump (prog, file->f_cred);if (!insns_sanitized)return -ENOMEM ; uinsns =u64_to_user_ptr (info.xlated_prog_insns);
@@ -2430,7 +2432,7 @@ static int bpf_prog_get_info_by_fd(struc }if (info.jited_prog_len && ulen) { -if (bpf_dump_raw_ok ()) { +if (bpf_dump_raw_ok (file->f_cred)) { uinsns =u64_to_user_ptr (info.jited_prog_insns); ulen =min_t (u32, info.jited_prog_len, ulen);
@@ -2465,7 +2467,7 @@ static int bpf_prog_get_info_by_fd(struc ulen = info.nr_jited_ksyms; info.nr_jited_ksyms = prog->aux->func_cnt ? :1 ;if (ulen) { -if (bpf_dump_raw_ok ()) { +if (bpf_dump_raw_ok (file->f_cred)) {unsigned long ksym_addr;u64 __user *user_ksyms;u32 i;
@@ -2496,7 +2498,7 @@ static int bpf_prog_get_info_by_fd(struc ulen = info.nr_jited_func_lens; info.nr_jited_func_lens = prog->aux->func_cnt ? :1 ;if (ulen) { -if (bpf_dump_raw_ok ()) { +if (bpf_dump_raw_ok (file->f_cred)) {u32 __user *user_lens;u32 func_len, i;
@@ -2553,7 +2555,7 @@ static int bpf_prog_get_info_by_fd(strucelse info.nr_jited_line_info =0 ;if (info.nr_jited_line_info && ulen) { -if (bpf_dump_raw_ok ()) { +if (bpf_dump_raw_ok (file->f_cred)) {__u64 __user *user_linfo;u32 i;
@@ -2599,7 +2601,8 @@ done:return 0 ; } -static int bpf_map_get_info_by_fd (struct bpf_map *map, +static int bpf_map_get_info_by_fd (struct file *file, +struct bpf_map *map,const union bpf_attr *attr,union bpf_attr __user *uattr) {
@@ -2641,7 +2644,8 @@ static int bpf_map_get_info_by_fd(structreturn 0 ; } -static int bpf_btf_get_info_by_fd (struct btf *btf, +static int bpf_btf_get_info_by_fd (struct file *file, +struct btf *btf,const union bpf_attr *attr,union bpf_attr __user *uattr) {
@@ -2673,13 +2677,13 @@ static int bpf_obj_get_info_by_fd(constreturn -EBADFD ;if (f.file->f_op == &bpf_prog_fops) - err =bpf_prog_get_info_by_fd (f.file->private_data, attr, + err =bpf_prog_get_info_by_fd (f.file, f.file->private_data, attr, uattr);else if (f.file->f_op == &bpf_map_fops) - err =bpf_map_get_info_by_fd (f.file->private_data, attr, + err =bpf_map_get_info_by_fd (f.file, f.file->private_data, attr, uattr);else if (f.file->f_op == &btf_fops) - err =bpf_btf_get_info_by_fd (f.file->private_data, attr, uattr); + err =bpf_btf_get_info_by_fd (f.file, f.file->private_data, attr, uattr);else err = -EINVAL ;
net/core/sysctl_net_core.c +1 -1
@@ -277,7 +277,7 @@ static int proc_dointvec_minmax_bpf_enab ret =proc_dointvec_minmax (&tmp, write, buffer, lenp, ppos);if (write && !ret) {if (jit_enable <2 || - (jit_enable ==2 &&bpf_dump_raw_ok ())) { + (jit_enable ==2 &&bpf_dump_raw_ok (current_cred ()))) { *(int *)table->data = jit_enable;if (jit_enable ==2 )pr_warn ("bpf_jit_enable = 2 was set! NEVER use this in production, only for JIT debugging!\n" );
Greg Kroah-Hartman
maintainerPATCH 92/109 Revert "ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb"
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
This reverts commit b5c8896bc14f54e5c4dd5a6e42879f125b8abd2d which is commit 2bbcaaee1fcbd83272e29f31e2bb7e70d8c49e05 upstream.
It is being reverted upstream, just hasn't made it there yet and is causing lots of problems.
--- drivers/net/wireless/ath/ath9k/hif_usb.c | 48 +++++++------------------------ drivers/net/wireless/ath/ath9k/hif_usb.h | 5 --- 2 files changed, 11 insertions(+), 42 deletions(-)
drivers/net/wireless/ath/ath9k/hif_usb.c +11 -37
@@ -643,9 +643,9 @@ err:static void ath9k_hif_usb_rx_cb (struct urb *urb) { -struct rx_buf *rx_buf = (struct rx_buf *)urb->context; -struct hif_device_usb *hif_dev = rx_buf->hif_dev; -struct sk_buff *skb = rx_buf->skb; +struct sk_buff *skb = (struct sk_buff *) urb->context; +struct hif_device_usb *hif_dev = +usb_get_intfdata (usb_ifnum_to_if (urb->dev,0 ));int ret;if (!skb)
@@ -685,15 +685,14 @@ resubmit:return ; free:kfree_skb (skb); -kfree (rx_buf); }static void ath9k_hif_usb_reg_in_cb (struct urb *urb) { -struct rx_buf *rx_buf = (struct rx_buf *)urb->context; -struct hif_device_usb *hif_dev = rx_buf->hif_dev; -struct sk_buff *skb = rx_buf->skb; +struct sk_buff *skb = (struct sk_buff *) urb->context;struct sk_buff *nskb; +struct hif_device_usb *hif_dev = +usb_get_intfdata (usb_ifnum_to_if (urb->dev,0 ));int ret;if (!skb)
@@ -751,7 +750,6 @@ resubmit:return ; free:kfree_skb (skb); -kfree (rx_buf); urb->context =NULL ; }
@@ -797,7 +795,7 @@ static int ath9k_hif_usb_alloc_tx_urbs(sinit_usb_anchor (&hif_dev->mgmt_submitted);for (i =0 ; i <MAX_TX_URB_NUM ; i++) { - tx_buf =kzalloc (sizeof (*tx_buf),GFP_KERNEL ); + tx_buf =kzalloc (sizeof (struct tx_buf ),GFP_KERNEL );if (!tx_buf) goto err;
@@ -834,9 +832,8 @@ static void ath9k_hif_usb_dealloc_rx_urbstatic int ath9k_hif_usb_alloc_rx_urbs (struct hif_device_usb *hif_dev) { -struct rx_buf *rx_buf =NULL ; -struct sk_buff *skb =NULL ;struct urb *urb =NULL ; +struct sk_buff *skb =NULL ;int i, ret;init_usb_anchor (&hif_dev->rx_submitted);
@@ -844,12 +841,6 @@ static int ath9k_hif_usb_alloc_rx_urbs(sfor (i =0 ; i <MAX_RX_URB_NUM ; i++) { - rx_buf =kzalloc (sizeof (*rx_buf),GFP_KERNEL ); -if (!rx_buf) { - ret = -ENOMEM ; - goto err_rxb; - } -/* Allocate URB */ urb =usb_alloc_urb (0 ,GFP_KERNEL );if (urb ==NULL ) {
@@ -864,14 +855,11 @@ static int ath9k_hif_usb_alloc_rx_urbs(s goto err_skb; } - rx_buf->hif_dev = hif_dev; - rx_buf->skb = skb; -usb_fill_bulk_urb (urb, hif_dev->udev,usb_rcvbulkpipe (hif_dev->udev,USB_WLAN_RX_PIPE ), skb->data,MAX_RX_BUF_SIZE , - ath9k_hif_usb_rx_cb, rx_buf); + ath9k_hif_usb_rx_cb, skb);/* Anchor URB */ usb_anchor_urb (urb, &hif_dev->rx_submitted);
@@ -897,8 +885,6 @@ err_submit: err_skb:usb_free_urb (urb); err_urb: -kfree (rx_buf); -err_rxb:ath9k_hif_usb_dealloc_rx_urbs (hif_dev);return ret; }
@@ -910,21 +896,14 @@ static void ath9k_hif_usb_dealloc_reg_instatic int ath9k_hif_usb_alloc_reg_in_urbs (struct hif_device_usb *hif_dev) { -struct rx_buf *rx_buf =NULL ; -struct sk_buff *skb =NULL ;struct urb *urb =NULL ; +struct sk_buff *skb =NULL ;int i, ret;init_usb_anchor (&hif_dev->reg_in_submitted);for (i =0 ; i <MAX_REG_IN_URB_NUM ; i++) { - rx_buf =kzalloc (sizeof (*rx_buf),GFP_KERNEL ); -if (!rx_buf) { - ret = -ENOMEM ; - goto err_rxb; - } -/* Allocate URB */ urb =usb_alloc_urb (0 ,GFP_KERNEL );if (urb ==NULL ) {
@@ -939,14 +918,11 @@ static int ath9k_hif_usb_alloc_reg_in_ur goto err_skb; } - rx_buf->hif_dev = hif_dev; - rx_buf->skb = skb; -usb_fill_int_urb (urb, hif_dev->udev,usb_rcvintpipe (hif_dev->udev,USB_REG_IN_PIPE ), skb->data,MAX_REG_IN_BUF_SIZE , - ath9k_hif_usb_reg_in_cb, rx_buf,1 ); + ath9k_hif_usb_reg_in_cb, skb,1 );/* Anchor URB */ usb_anchor_urb (urb, &hif_dev->reg_in_submitted);
@@ -972,8 +948,6 @@ err_submit: err_skb:usb_free_urb (urb); err_urb: -kfree (rx_buf); -err_rxb:ath9k_hif_usb_dealloc_reg_in_urbs (hif_dev);return ret; }
drivers/net/wireless/ath/ath9k/hif_usb.h +0 -5
@@ -86,11 +86,6 @@ struct tx_buf {struct list_head list; }; -struct rx_buf { -struct sk_buff *skb; -struct hif_device_usb *hif_dev; -}; -#define HIF_USB_TX_STOP BIT(0)#define HIF_USB_TX_FLUSH BIT(1)
Greg Kroah-Hartman
maintainerPATCH 93/109 btrfs: fix fatal extent_buffer readahead vs releasepage race
In reply to Greg Kroah-HartmanFrom: Boris Burkov <[email protected]>
commit 6bf9cd2eed9aee6d742bb9296c994a91f5316949 upstream.
Under somewhat convoluted conditions, it is possible to attempt to release an extent_buffer that is under io, which triggers a BUG_ON in btrfs_release_extent_buffer_pages.
This relies on a few different factors. First, extent_buffer reads done as readahead for searching use WAIT_NONE, so they free the local extent buffer reference while the io is outstanding. However, they should still be protected by TREE_REF. However, if the system is doing signficant reclaim, and simultaneously heavily accessing the extent_buffers, it is possible for releasepage to race with two concurrent readahead attempts in a way that leaves TREE_REF unset when the readahead extent buffer is released.
Essentially, if two tasks race to allocate a new extent_buffer, but the winner who attempts the first io is rebuffed by a page being locked (likely by the reclaim itself) then the loser will still go ahead with issuing the readahead. The loser's call to find_extent_buffer must also race with the reclaim task reading the extent_buffer's refcount as 1 in a way that allows the reclaim to re-clear the TREE_REF checked by find_extent_buffer.
The following represents an example execution demonstrating the race:
CPU0 CPU1 CPU2reada_for_search reada_for_search
readahead_tree_block readahead_tree_block
find_create_tree_block find_create_tree_block
alloc_extent_buffer alloc_extent_buffer
find_extent_buffer // not found
allocates eb
lock pages
associate pages to eb
insert eb into radix tree
set TREE_REF, refs == 2
unlock pages
read_extent_buffer_pages // WAIT_NONE
not uptodate (brand new eb)
lock_page
if !trylock_page
goto unlock_exit // not an error
free_extent_buffer
release_extent_buffer
atomic_dec_and_test refs to 1
find_extent_buffer // found
try_release_extent_buffer
take refs_lock reads refs == 1; no io
atomic_inc_not_zero refs to 2
mark_buffer_accessed
check_buffer_tree_ref
// not STALE, won't take refs_lock
refs == 2; TREE_REF set // no action
read_extent_buffer_pages // WAIT_NONE
clear TREE_REF release_extent_buffer
atomic_dec_and_test refs to 1 unlock_page
still not uptodate (CPU1 read failed on trylock_page)
locks pages
set io_pages > 0
submit io
return
free_extent_buffer
release_extent_buffer
dec refs to 0
delete from radix tree
btrfs_release_extent_buffer_pages
BUG_ON(io_pages > 0)!!!
We observe this at a very low rate in production and were also able to reproduce it in a test environment by introducing some spurious delays and by introducing probabilistic trylock_page failures.
To fix it, we apply check_tree_ref at a point where it could not possibly be unset by a competing task: after io_pages has been incremented. All the codepaths that clear TREE_REF check for io, so they would not be able to clear it after this point until the io is done.
Stack trace, for reference:
[1417839.424739] ------------[ cut here ]------------ [1417839.435328] kernel BUG at fs/btrfs/extent_io.c:4841! [1417839.447024] invalid opcode: 0000 [#1] SMP [1417839.502972] RIP: 0010:btrfs_release_extent_buffer_pages+0x20/0x1f0 [1417839.517008] Code: ed e9 ... [1417839.558895] RSP: 0018:ffffc90020bcf798 EFLAGS: 00010202 [1417839.570816] RAX: 0000000000000002 RBX: ffff888102d6def0 RCX: 0000000000000028 [1417839.586962] RDX: 0000000000000002 RSI: ffff8887f0296482 RDI: ffff888102d6def0 [1417839.603108] RBP: ffff88885664a000 R08: 0000000000000046 R09: 0000000000000238 [1417839.619255] R10: 0000000000000028 R11: ffff88885664af68 R12: 0000000000000000 [1417839.635402] R13: 0000000000000000 R14: ffff88875f573ad0 R15: ffff888797aafd90 [1417839.651549] FS: 00007f5a844fa700(0000) GS:ffff88885f680000(0000) knlGS:0000000000000000 [1417839.669810] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [1417839.682887] CR2: 00007f7884541fe0 CR3: 000000049f609002 CR4: 00000000003606e0 [1417839.699037] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [1417839.715187] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [1417839.731320] Call Trace: [1417839.737103] release_extent_buffer+0x39/0x90 [1417839.746913] read_block_for_search.isra.38+0x2a3/0x370 [1417839.758645] btrfs_search_slot+0x260/0x9b0 [1417839.768054] btrfs_lookup_file_extent+0x4a/0x70 [1417839.778427] btrfs_get_extent+0x15f/0x830 [1417839.787665] ? submit_extent_page+0xc4/0x1c0 [1417839.797474] ? __do_readpage+0x299/0x7a0 [1417839.806515] __do_readpage+0x33b/0x7a0 [1417839.815171] ? btrfs_releasepage+0x70/0x70 [1417839.824597] extent_readpages+0x28f/0x400 [1417839.833836] read_pages+0x6a/0x1c0 [1417839.841729] ? startup_64+0x2/0x30 [1417839.849624] __do_page_cache_readahead+0x13c/0x1a0 [1417839.860590] filemap_fault+0x6c7/0x990 [1417839.869252] ? xas_load+0x8/0x80 [1417839.876756] ? xas_find+0x150/0x190 [1417839.884839] ? filemap_map_pages+0x295/0x3b0 [1417839.894652] __do_fault+0x32/0x110 [1417839.902540] __handle_mm_fault+0xacd/0x1000 [1417839.912156] handle_mm_fault+0xaa/0x1c0 [1417839.921004] __do_page_fault+0x242/0x4b0 [1417839.930044] ? page_fault+0x8/0x30 [1417839.937933] page_fault+0x1e/0x30 [1417839.945631] RIP: 0033:0x33c4bae [1417839.952927] Code: Bad RIP value. [1417839.960411] RSP: 002b:00007f5a844f7350 EFLAGS: 00010206 [1417839.972331] RAX: 000000000000006e RBX: 1614b3ff6a50398a RCX: 0000000000000000 [1417839.988477] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000002 [1417840.004626] RBP: 00007f5a844f7420 R08: 000000000000006e R09: 00007f5a94aeccb8 [1417840.020784] R10: 00007f5a844f7350 R11: 0000000000000000 R12: 00007f5a94aecc79 [1417840.036932] R13: 00007f5a94aecc78 R14: 00007f5a94aecc90 R15: 00007f5a94aecc40
--- fs/btrfs/extent_io.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-)
fs/btrfs/extent_io.c +24 -16
@@ -5025,25 +5025,28 @@ struct extent_buffer *alloc_dummy_extentstatic void check_buffer_tree_ref (struct extent_buffer *eb) {int refs; -/* the ref bit is tricky. We have to make sure it is set -* if we have the buffer dirty. Otherwise the -* code to free a buffer can end up dropping a dirty -* page +/* +* The TREE_REF bit is first set when the extent_buffer is added +* to the radix tree. It is also reset, if unset, when a new reference +* is created by find_extent_buffer. * -* Once the ref bit is set, it won't go away while the -* buffer is dirty or in writeback, and it also won't -* go away while we have the reference count on the -* eb bumped. +* It is only cleared in two cases: freeing the last non-tree +* reference to the extent_buffer when its STALE bit is set or +* calling releasepage when the tree reference is the only reference. * -* We can't just set the ref bit without bumping the -* ref on the eb because free_extent_buffer might -* see the ref bit and try to clear it. If this happens -* free_extent_buffer might end up dropping our original -* ref by mistake and freeing the page before we are able -* to add one more ref. +* In both cases, care is taken to ensure that the extent_buffer's +* pages are not under io. However, releasepage can be concurrently +* called with creating new references, which is prone to race +* conditions between the calls to check_buffer_tree_ref in those +* codepaths and clearing TREE_REF in try_release_extent_buffer. * -* So bump the ref count first, then set the bit. If someone -* beat us to it, drop the ref we added. +* The actual lifetime of the extent_buffer in the radix tree is +* adequately protected by the refcount, but the TREE_REF bit and +* its corresponding reference are not. To protect against this +* class of races, we call check_buffer_tree_ref from the codepaths +* which trigger io after they set eb->io_pages. Note that once io is +* initiated, TREE_REF can no longer be cleared, so that is the +* moment at which any such race is best fixed. */ refs =atomic_read (&eb->refs);if (refs >=2 &&test_bit (EXTENT_BUFFER_TREE_REF , &eb->bflags))
@@ -5493,6 +5496,11 @@ int read_extent_buffer_pages(struct exteclear_bit (EXTENT_BUFFER_READ_ERR , &eb->bflags); eb->read_mirror =0 ;atomic_set (&eb->io_pages, num_reads); +/* +* It is possible for releasepage to clear the TREE_REF bit before we +* set io_pages. See check_buffer_tree_ref for a more detailed comment. +*/ +check_buffer_tree_ref (eb);for (i =0 ; i < num_pages; i++) { page = eb->pages[i];
Greg Kroah-Hartman
maintainerPATCH 94/109 btrfs: fix double put of block group with nocow
In reply to Greg Kroah-HartmanFrom: Josef Bacik <[email protected]>
commit 230ed397435e85b54f055c524fcb267ae2ce3bc4 upstream.
While debugging a patch that I wrote I was hitting use-after-free panics when accessing block groups on unmount. This turned out to be because in the nocow case if we bail out of doing the nocow for whatever reason we need to call btrfs_dec_nocow_writers() if we called the inc. This puts our block group, but a few error cases does
if (nocow) {
btrfs_dec_nocow_writers();
goto error;
}unfortunately, error is
error:
if (nocow) btrfs_dec_nocow_writers();
so we get a double put on our block group. Fix this by dropping the error cases calling of btrfs_dec_nocow_writers(), as it's handled at the error label now.
--- fs/btrfs/inode.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
fs/btrfs/inode.c +1 -8
@@ -1657,12 +1657,8 @@ out_check: ret =fallback_to_cow (inode, locked_page, cow_start, found_key.offset -1 , page_started, nr_written); -if (ret) { -if (nocow) -btrfs_dec_nocow_writers (fs_info, - disk_bytenr); +if (ret) goto error; - } cow_start = (u64)-1 ; }
@@ -1678,9 +1674,6 @@ out_check: ram_bytes,BTRFS_COMPRESS_NONE , BTRFS_ORDERED_PREALLOC);if (IS_ERR (em)) { -if (nocow) -btrfs_dec_nocow_writers (fs_info, - disk_bytenr); ret =PTR_ERR (em); goto error; }
Greg Kroah-Hartman
maintainerPATCH 95/109 drm/radeon: fix double free
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
commit 41855a898650803e24b284173354cc3e44d07725 upstream.
clang static analysis flags this error
drivers/gpu/drm/radeon/ci_dpm.c:5652:9: warning: Use of memory after it is freed [unix.Malloc]
kfree(rdev->pm.dpm.ps[i].ps_priv);
^~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/radeon/ci_dpm.c:5654:2: warning: Attempt to free released memory [unix.Malloc]
kfree(rdev->pm.dpm.ps);
^~~~~~~~~~~~~~~~~~~~~~problem is reported in ci_dpm_fini, with these code blocks.
for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
kfree(rdev->pm.dpm.ps[i].ps_priv);
}
kfree(rdev->pm.dpm.ps);The first free happens in ci_parse_power_table where it cleans up locally on a failure. ci_dpm_fini also does a cleanup.
ret = ci_parse_power_table(rdev);
if (ret) {
ci_dpm_fini(rdev);
return ret;
}So remove the cleanup in ci_parse_power_table and move the num_ps calculation to inside the loop so ci_dpm_fini will know how many array elements to free.
--- drivers/gpu/drm/radeon/ci_dpm.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/gpu/drm/radeon/ci_dpm.c +3 -4
@@ -5578,6 +5578,7 @@ static int ci_parse_power_table(struct rif (!rdev->pm.dpm.ps)return -ENOMEM ; power_state_offset = (u8 *)state_array->states; + rdev->pm.dpm.num_ps =0 ;for (i =0 ; i < state_array->ucNumEntries; i++) {u8 *idx; power_state = (union pplib_power_state *)power_state_offset;
@@ -5587,10 +5588,8 @@ static int ci_parse_power_table(struct rif (!rdev->pm.power_state[i].clock_info)return -EINVAL ; ps =kzalloc (sizeof (struct ci_ps ),GFP_KERNEL ); -if (ps ==NULL ) { -kfree (rdev->pm.dpm.ps); +if (ps ==NULL )return -ENOMEM ; - } rdev->pm.dpm.ps[i].ps_priv = ps; ci_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i], non_clock_info,
@@ -5612,8 +5611,8 @@ static int ci_parse_power_table(struct r k++; } power_state_offset +=2 + power_state->v2.ucNumDPMLevels; + rdev->pm.dpm.num_ps = i +1 ; } - rdev->pm.dpm.num_ps = state_array->ucNumEntries;/* fill in the vce power states */ for (i =0 ; i <RADEON_MAX_VCE_LEVELS ; i++) {
Greg Kroah-Hartman
maintainerPATCH 96/109 drm/amdgpu: dont do soft recovery if gpu_recovery=0
In reply to Greg Kroah-HartmanFrom: Marek Olšák <[email protected]>
commit f4892c327a8e5df7ce16cab40897daf90baf6bec upstream.
It's impossible to debug shader hangs with soft recovery.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +2 -1
@@ -36,7 +36,8 @@ static void amdgpu_job_timedout(struct dmemset (&ti,0 ,sizeof (struct amdgpu_task_info )); -if (amdgpu_ring_soft_recovery (ring, job->vmid, s_job->s_fence->parent)) { +if (amdgpu_gpu_recovery && +amdgpu_ring_soft_recovery (ring, job->vmid, s_job->s_fence->parent)) {DRM_ERROR ("ring %s timeout, but soft recovered\n" , s_job->sched->name);return ;
Greg Kroah-Hartman
maintainerPATCH 97/109 dm: use noio when sending kobject event
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit 6958c1c640af8c3f40fa8a2eee3b5b905d95b677 upstream.
kobject_uevent may allocate memory and it may be called while there are dm devices suspended. The allocation may recurse into a suspended device, causing a deadlock. We must set the noio flag when sending a uevent.
The observed deadlock was reported here:
https://www.redhat.com/archives/dm-devel/2020-March/msg00025.html
--- drivers/md/dm.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/md/dm.c +12 -3
@@ -12,6 +12,7 @@#include <linux/init.h> #include <linux/module.h> #include <linux/mutex.h> +#include <linux/sched/mm.h> #include <linux/sched/signal.h> #include <linux/blkpg.h> #include <linux/bio.h>
@@ -2886,17 +2887,25 @@ EXPORT_SYMBOL_GPL(dm_internal_resume_fasint dm_kobject_uevent (struct mapped_device *md,enum kobject_action action,unsigned cookie) { +int r; +unsigned noio_flag;char udev_cookie[DM_COOKIE_LENGTH ];char *envp[] = { udev_cookie,NULL }; + noio_flag =memalloc_noio_save (); +if (!cookie) -return kobject_uevent (&disk_to_dev (md->disk)->kobj, action); + r =kobject_uevent (&disk_to_dev (md->disk)->kobj, action);else {snprintf (udev_cookie,DM_COOKIE_LENGTH ,"%s=%u" ,DM_COOKIE_ENV_VAR_NAME , cookie); -return kobject_uevent_env (&disk_to_dev (md->disk)->kobj, - action, envp); + r =kobject_uevent_env (&disk_to_dev (md->disk)->kobj, + action, envp); } + +memalloc_noio_restore (noio_flag); + +return r; }uint32_t dm_next_uevent_seq (struct mapped_device *md)
Greg Kroah-Hartman
maintainerPATCH 98/109 mmc: meson-gx: limit segments to 1 when dram-access-quirk is needed
In reply to Greg Kroah-HartmanFrom: Neil Armstrong <[email protected]>
commit 27a5e7d36d383970affae801d77141deafd536a8 upstream.
The actual max_segs computation leads to failure while using the broadcom sdio brcmfmac/bcmsdh driver, since the driver tries to make usage of scatter gather.
But with the dram-access-quirk we use a 1,5K SRAM bounce buffer, and the max_segs current value of 3 leads to max transfers to 4,5k, which doesn't work.
This patch sets max_segs to 1 to better describe the hardware limitation, and fix the SDIO functionality with the brcmfmac/bcmsdh driver on Amlogic G12A/G12B SoCs on boards like SEI510 or Khadas VIM3.
--- drivers/mmc/host/meson-gx-mmc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/mmc/host/meson-gx-mmc.c +4 -2
@@ -1151,9 +1151,11 @@ static int meson_mmc_probe(struct platfo mmc->caps |=MMC_CAP_CMD23 ;if (host->dram_access_quirk) { +/* Limit segments to 1 due to low available sram memory */ + mmc->max_segs =1 ;/* Limit to the available sram memory */ - mmc->max_segs =SD_EMMC_SRAM_DATA_BUF_LEN / mmc->max_blk_size; - mmc->max_blk_count = mmc->max_segs; + mmc->max_blk_count =SD_EMMC_SRAM_DATA_BUF_LEN / + mmc->max_blk_size; }else { mmc->max_blk_count =CMD_CFG_LENGTH_MASK ; mmc->max_segs = SD_EMMC_DESC_BUF_LEN /
Greg Kroah-Hartman
maintainerPATCH 99/109 ARC: entry: fix potential EFA clobber when TIF_SYSCALL_TRACE
In reply to Greg Kroah-HartmanFrom: Vineet Gupta <[email protected]>
commit 00fdec98d9881bf5173af09aebd353ab3b9ac729 upstream.
Trap handler for syscall tracing reads EFA (Exception Fault Address), in case strace wants PC of trap instruction (EFA is not part of pt_regs as of current code).
However this EFA read is racy as it happens after dropping to pure kernel mode (re-enabling interrupts). A taken interrupt could context-switch, trigger a different task's trap, clobbering EFA for this execution context.
Fix this by reading EFA early, before re-enabling interrupts. A slight side benefit is de-duplication of FAKE_RET_FROM_EXCPN in trap handler. The trap handler is common to both ARCompact and ARCv2 builds too.
This just came out of code rework/review and no real problem was reported but is clearly a potential problem specially for strace.
--- arch/arc/kernel/entry.S | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)
arch/arc/kernel/entry.S +5 -11
@@ -153,7 +153,6 @@ END(EV_Extension) tracesys: ; save EFA in case tracer wants the PC of traced task ; using ERET won't work since next-PC has already committed - lr r12, [efa] GET_CURR_TASK_FIELD_PTR TASK_THREAD, r11 st r12, [r11, THREAD_FAULT_ADDR] ; thread.fault_address
@@ -196,15 +195,9 @@ tracesys_exit: ; Breakpoint TRAP ; --------------------------------------------- trap_with_param: - - ; stop_pc info by gdb needs this info - lr r0, [efa] + mov r0, r12 ; EFA in case ptracer/gdb wants stop_pc mov r1, sp - ; Now that we have read EFA, it is safe to do "fake" rtie - ; and get out of CPU exception mode - FAKE_RET_FROM_EXCPN - ; Save callee regs in case gdb wants to have a look ; SP will grow up by size of CALLEE Reg-File ; NOTE: clobbers r12
@@ -231,6 +224,10 @@ ENTRY(EV_Trap) EXCEPTION_PROLOGUE + lr r12, [efa] + + FAKE_RET_FROM_EXCPN + ;============ TRAP 1 :breakpoints ; Check ECR for trap with arg (PROLOGUE ensures r10 has ECR) bmsk.f 0, r10, 7
@@ -238,9 +235,6 @@ ENTRY(EV_Trap) ;============ TRAP (no param): syscall top level - ; First return from Exception to pure K mode (Exception/IRQs renabled) - FAKE_RET_FROM_EXCPN - ; If syscall tracing ongoing, invoke pre-post-hooks GET_CURR_THR_INFO_FLAGS r10 btst r10, TIF_SYSCALL_TRACE
Greg Kroah-Hartman
maintainerPATCH 100/109 ARC: elf: use right ELF_ARCH
In reply to Greg Kroah-HartmanFrom: Vineet Gupta <[email protected]>
commit b7faf971081a4e56147f082234bfff55135305cb upstream.
--- arch/arc/include/asm/elf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arc/include/asm/elf.h +1 -1
@@ -19,7 +19,7 @@#define R_ARC_32_PCREL 0x31/*to set parameters in the core dumps */ -#define ELF_ARCH EM_ARCOMPACT +#define ELF_ARCH EM_ARC_INUSE#define ELF_CLASS ELFCLASS32#ifdef CONFIG_CPU_BIG_ENDIAN
Greg Kroah-Hartman
maintainerPATCH 101/109 s390/setup: init jump labels before command line parsing
In reply to Greg Kroah-HartmanFrom: Vasily Gorbik <[email protected]>
commit 95e61b1b5d6394b53d147c0fcbe2ae70fbe09446 upstream.
Command line parameters might set static keys. This is true for s390 at least since commit 6471384af2a6 ("mm: security: introduce init_on_alloc=1 and init_on_free=1 boot options"). To avoid the following WARN:
static_key_enable_cpuslocked(): static key 'init_on_alloc+0x0/0x40' used before call to jump_label_init()
call jump_label_init() just before parse_early_param(). jump_label_init() is safe to call multiple times (x86 does that), doesn't do any memory allocations and hence should be safe to call that early.
--- arch/s390/kernel/setup.c | 1 + 1 file changed, 1 insertion(+)
arch/s390/kernel/setup.c +1 -0
@@ -1120,6 +1120,7 @@ void __init setup_arch(char **cmdline_p)if (IS_ENABLED (CONFIG_EXPOLINE_AUTO ))nospec_auto_detect (); +jump_label_init ();parse_early_param ();#ifdef CONFIG_CRASH_DUMP /* Deactivate elfcorehdr= kernel parameter */
Greg Kroah-Hartman
maintainerPATCH 102/109 s390/mm: fix huge pte soft dirty copying
In reply to Greg Kroah-HartmanFrom: Janosch Frank <[email protected]>
commit 528a9539348a0234375dfaa1ca5dbbb2f8f8e8d2 upstream.
If the pmd is soft dirty we must mark the pte as soft dirty (and not dirty). This fixes some cases for guest migration with huge page backings.
--- arch/s390/mm/hugetlbpage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/mm/hugetlbpage.c +1 -1
@@ -117,7 +117,7 @@ static inline pte_t __rste_to_pte(unsign _PAGE_YOUNG);#ifdef CONFIG_MEM_SOFT_DIRTY pte_val (pte) |=move_set_bit (rste, _SEGMENT_ENTRY_SOFT_DIRTY, - _PAGE_DIRTY); + _PAGE_SOFT_DIRTY);#endif pte_val (pte) |=move_set_bit (rste, _SEGMENT_ENTRY_NOEXEC, _PAGE_NOEXEC);
Greg Kroah-Hartman
maintainerPATCH 103/109 blk-mq: consider non-idle request as "inflight" in blk_mq_rq_inflight()
In reply to Greg Kroah-HartmanFrom: Ming Lei <[email protected]>
commit 05a4fed69ff00a8bd83538684cb602a4636b07a7 upstream.
dm-multipath is the only user of blk_mq_queue_inflight(). When dm-multipath calls blk_mq_queue_inflight() to check if it has outstanding IO it can get a false negative. The reason for this is blk_mq_rq_inflight() doesn't consider requests that are no longer MQ_RQ_IN_FLIGHT but that are now MQ_RQ_COMPLETE (->complete isn't called or finished yet) as "inflight".
This causes request-based dm-multipath's dm_wait_for_completion() to return before all outstanding dm-multipath requests have actually completed. This breaks DM multipath's suspend functionality because blk-mq requests complete after DM's suspend has finished -- which shouldn't happen.
Fix this by considering any request not in the MQ_RQ_IDLE state (so either MQ_RQ_COMPLETE or MQ_RQ_IN_FLIGHT) as "inflight" in blk_mq_rq_inflight().
--- block/blk-mq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
block/blk-mq.c +2 -2
@@ -829,10 +829,10 @@ static bool blk_mq_rq_inflight(struct bl void *priv, bool reserved) {/* -* If we find a request that is inflight and the queue matches, +* If we find a request that isn't idle and the queue matches, * we know the queue is busy. Return false to stop the iteration. */ -if (rq->state ==MQ_RQ_IN_FLIGHT && rq->q == hctx->queue) { +if (blk_mq_request_started (rq) && rq->q == hctx->queue) {bool *busy = priv; *busy = true;
Greg Kroah-Hartman
maintainerPATCH 104/109 dm writecache: reject asynchronous pmem devices
In reply to Greg Kroah-HartmanFrom: Michal Suchanek <[email protected]>
commit a46624580376a3a0beb218d94cbc7f258696e29f upstream.
DM writecache does not handle asynchronous pmem. Reject it when supplied as cache.
--- drivers/md/dm-writecache.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/md/dm-writecache.c +6 -0
@@ -2104,6 +2104,12 @@ invalid_optional: }if (WC_MODE_PMEM (wc)) { +if (!dax_synchronous (wc->ssd_dev->dax_dev)) { + r = -EOPNOTSUPP ; + ti->error ="Asynchronous persistent memory not supported as pmem cache" ; + goto bad; + } + r =persistent_memory_claim (wc);if (r) { ti->error ="Unable to map persistent memory for cache" ;
Greg Kroah-Hartman
maintainerPATCH 105/109 perf scripts python: export-to-postgresql.py: Fix struct.pack() int argument
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit 640432e6bed08e9d5d2ba26856ba3f55008b07e3 upstream.
Python 3.8 is requiring that arguments being packed as integers are also integers. Add int() accordingly.
Before:
$ perf record -e intel_pt//u uname
$ perf script --itrace=bep -s ~/libexec/perf-core/scripts/python/export-to-postgresql.py perf_data_db branches calls
2020-06-25 16:09:10.547256 Creating database...
2020-06-25 16:09:10.733185 Writing to intermediate files...
Traceback (most recent call last):
File "/home/ahunter/libexec/perf-core/scripts/python/export-to-postgresql.py", line 1106, in synth_data
cbr(id, raw_buf)
File "/home/ahunter/libexec/perf-core/scripts/python/export-to-postgresql.py", line 1058, in cbr
value = struct.pack("!hiqiiiiii", 4, 8, id, 4, cbr, 4, MHz, 4, percent)
struct.error: required argument is not an integer
Fatal Python error: problem in Python trace event handler
Python runtime state: initialized Current thread 0x00007f35d3695780 (most recent call first):
<no Python frame>
Aborted (core dumped)
After:
$ dropdb perf_data_db $ rm -rf perf_data_db-perf-data $ perf script --itrace=bep -s ~/libexec/perf-core/scripts/python/export-to-postgresql.py perf_data_db branches calls 2020-06-25 16:09:40.990267 Creating database... 2020-06-25 16:09:41.207009 Writing to intermediate files... 2020-06-25 16:09:41.270915 Copying to database... 2020-06-25 16:09:41.382030 Removing intermediate files... 2020-06-25 16:09:41.384630 Adding primary keys 2020-06-25 16:09:41.541894 Adding foreign keys 2020-06-25 16:09:41.677044 Dropping unused tables 2020-06-25 16:09:41.703761 Done
--- tools/perf/scripts/python/export-to-postgresql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/scripts/python/export-to-postgresql.py +1 -1
@@ -1055,7 +1055,7 @@ def cbr(id, raw_buf): cbr = data[0] MHz = (data[4] + 500) / 1000 percent = ((cbr * 1000 / data[2]) + 5) / 10 - value = struct.pack("!hiqiiiiii", 4, 8, id, 4, cbr, 4, MHz, 4, percent) + value = struct.pack("!hiqiiiiii", 4, 8, id, 4, cbr, 4, int(MHz), 4, int(percent)) cbr_file.write(value) def mwait(id, raw_buf):
Greg Kroah-Hartman
maintainerPATCH 106/109 perf scripts python: exported-sql-viewer.py: Fix zero id in call graph Find result
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit 7ff520b0a71dd2db695b52ad117d81b7eaf6ff9d upstream.
Using ctrl-F ('Find') would not find 'unknown' because it matches id zero. Fix by excluding id zero from selection.
Example:
$ perf record -e intel_pt//u uname Linux [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.034 MB perf.data ] $ perf script --itrace=bep -s ~/libexec/perf-core/scripts/python/export-to-sqlite.py perf.data.db branches calls 2020-06-26 15:32:14.928997 Creating database ... 2020-06-26 15:32:14.933971 Writing records... 2020-06-26 15:32:15.535251 Adding indexes 2020-06-26 15:32:15.542993 Dropping unused tables 2020-06-26 15:32:15.549716 Done $ python3 ~/libexec/perf-core/scripts/python/exported-sql-viewer.py perf.data.db
Select: Reports -> Context-Sensitive Call Graph
Press: Ctrl-F
Enter: unknown
Press: Enter
Before: gets stuck
After: tree is expanded to line showing 'unknown'
--- tools/perf/scripts/python/exported-sql-viewer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/scripts/python/exported-sql-viewer.py +2 -1
@@ -756,7 +756,8 @@ class CallGraphModel(CallGraphModelBase) " FROM calls" " INNER JOIN call_paths ON calls.call_path_id = call_paths.id" " INNER JOIN symbols ON call_paths.symbol_id = symbols.id" - " WHERE symbols.name" + match + + " WHERE calls.id <> 0" + " AND symbols.name" + match + " GROUP BY comm_id, thread_id, call_path_id" " ORDER BY comm_id, thread_id, call_path_id")
Greg Kroah-Hartman
maintainerPATCH 107/109 perf scripts python: exported-sql-viewer.py: Fix zero id in call tree Find result
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit 031c8d5edb1ddeb6d398f7942ce2a01a1a51ada9 upstream.
Using ctrl-F ('Find') would not find 'unknown' because it matches id zero. Fix by excluding id zero from selection.
Example:
$ perf record -e intel_pt//u uname Linux [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.034 MB perf.data ] $ perf script --itrace=bep -s ~/libexec/perf-core/scripts/python/export-to-sqlite.py perf.data.db branches calls 2020-06-26 15:32:14.928997 Creating database ... 2020-06-26 15:32:14.933971 Writing records... 2020-06-26 15:32:15.535251 Adding indexes 2020-06-26 15:32:15.542993 Dropping unused tables 2020-06-26 15:32:15.549716 Done $ python3 ~/libexec/perf-core/scripts/python/exported-sql-viewer.py perf.data.db
Select: Reports -> Call Tree
Press: Ctrl-F
Enter: unknown
Press: Enter
Before: displays 'unknown' not found
After: tree is expanded to line showing 'unknown'
--- tools/perf/scripts/python/exported-sql-viewer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/scripts/python/exported-sql-viewer.py +2 -1
@@ -951,7 +951,8 @@ class CallTreeModel(CallGraphModelBase): " FROM calls" " INNER JOIN call_paths ON calls.call_path_id = call_paths.id" " INNER JOIN symbols ON call_paths.symbol_id = symbols.id" - " WHERE symbols.name" + match + + " WHERE calls.id <> 0" + " AND symbols.name" + match + " ORDER BY comm_id, thread_id, call_time, calls.id") def FindPath(self, query):
Greg Kroah-Hartman
maintainerPATCH 108/109 perf scripts python: exported-sql-viewer.py: Fix unexpanded Find result
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit 3a3cf7c570a486b07d9a6e68a77548aea6a8421f upstream.
Using Python version 3.8.2 and PySide2 version 5.14.0, ctrl-F ('Find') would not expand the tree to the result. Fix by using setExpanded().
Example:
$ perf record -e intel_pt//u uname Linux [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.034 MB perf.data ] $ perf script --itrace=bep -s ~/libexec/perf-core/scripts/python/export-to-sqlite.py perf.data.db branches calls 2020-06-26 15:32:14.928997 Creating database ... 2020-06-26 15:32:14.933971 Writing records... 2020-06-26 15:32:15.535251 Adding indexes 2020-06-26 15:32:15.542993 Dropping unused tables 2020-06-26 15:32:15.549716 Done $ python3 ~/libexec/perf-core/scripts/python/exported-sql-viewer.py perf.data.db
Select: Reports -> Context-Sensitive Call Graph or Reports -> Call Tree
Press: Ctrl-F
Enter: main
Press: Enter
Before: line showing 'main' does not display
After: tree is expanded to line showing 'main'
--- tools/perf/scripts/python/exported-sql-viewer.py | 1 + 1 file changed, 1 insertion(+)
tools/perf/scripts/python/exported-sql-viewer.py +1 -0
@@ -1018,6 +1018,7 @@ class TreeWindowBase(QMdiSubWindow): child = self.model.index(row, 0, parent) if child.internalPointer().dbid == dbid: found = True + self.view.setExpanded(parent, True) self.view.setCurrentIndex(child) parent = child break
Greg Kroah-Hartman
maintainerPATCH 109/109 pwm: jz4740: Fix build failure
In reply to Greg Kroah-HartmanFrom: "Uwe Kleine-K�nig" <[email protected]>
When commit 9017dc4fbd59 ("pwm: jz4740: Enhance precision in calculation of duty cycle") from v5.8-rc1 was backported to v5.4.x its dependency on commit ce1f9cece057 ("pwm: jz4740: Use clocks from TCU driver") was not noticed which made the pwm-jz4740 driver fail to build.
As ce1f9cece057 depends on still more rework, just backport a small part of this commit to make the driver build again. (There is no dependency on the functionality introduced in ce1f9cece057, just the rate variable is needed.)
--- drivers/pwm/pwm-jz4740.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/pwm/pwm-jz4740.c +3 -2
@@ -92,11 +92,12 @@ static int jz4740_pwm_apply(struct pwm_c {struct jz4740_pwm_chip *jz4740 =to_jz4740 (pwm->chip);unsigned long long tmp; -unsigned long period, duty; +unsigned long rate, period, duty;unsigned int prescaler =0 ;uint16_t ctrl; - tmp = (unsigned long long )clk_get_rate (jz4740->clk) * state->period; + rate =clk_get_rate (jz4740->clk); + tmp = rate * state->period;do_div (tmp,1000000000 ); period = tmp;
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.52 release. There are 109 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 16 Jul 2020 18:40:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.52-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
Summary
------------------------------------------------------------------------
kernel: 5.4.52-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-5.4.y
git commit: e41ac96492edd546629b9fefe57c4f3c9415643c
git describe: v5.4.51-110-ge41ac96492ed
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-5.4-oe/build/v5.4.51-110-ge41ac96492ed
No regressions (compared to build v5.4.51)
No fixes (compared to build v5.4.51)
Ran 34148 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c
- hi6220-hikey
- i386
- juno-r2
- juno-r2-compat
- juno-r2-kasan
- nxp-ls2088
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15
- x86
- x86-kasan
Test Suites
-----------
* build
* install-android-platform-tools-r2800
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* v4l2-compliance
* kvm-unit-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-math-tests
* ltp-syscalls-tests
* network-basic-tests
* ltp-open-posix-tests
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Jon Hunter
maintainerQuoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.52 release. There are 109 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 16 Jul 2020 18:40:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.52-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests are passing for Tegra ...
Test results for stable-v5.4:
11 builds: 11 pass, 0 fail
26 boots: 26 pass, 0 fail
56 tests: 56 pass, 0 failLinux version: 5.4.52-rc1-ge41ac96492ed
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Cheers
Jon
Signature · 1 line
nvpublic
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.52 release. There are 109 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 16 Jul 2020 18:40:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.52-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.52 release. There are 109 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 16 Jul 2020 18:40:38 +0000. Anything received after that time might be too late.
Build results:
total: 157 pass: 157 fail: 0 Qemu test results: total: 430 pass: 430 fail: 0
Guenter