4.19.133-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 4.19.133-rc1 review
This is the start of the stable review cycle for the 4.19.133 release. There are 58 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/v4.x/stable-review/patch-4.19.133-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-4.19.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.19.133-rc1
Janosch Frank <[email protected]>
s390/mm: fix huge pte soft dirty copying
Vineet Gupta <[email protected]>
ARC: elf: use right ELF_ARCH
Vineet Gupta <[email protected]>
ARC: entry: fix potential EFA clobber when TIF_SYSCALL_TRACE
Mikulas Patocka <[email protected]>
dm: use noio when sending kobject event
Tom Rix <[email protected]>
drm/radeon: fix double free
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
Gustavo A. R. Silva <[email protected]>
kernel: module: Use struct_size() helper
Kees Cook <[email protected]>
kallsyms: Refactor kallsyms_show_value() to take cred
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
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
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
Ido Schimmel <[email protected]>
mlxsw: spectrum_router: Remove inappropriate usage of WARN_ON()
Nicolas Ferre <[email protected]>
net: macb: mark device wake capable when "magic-packet" property present
Davide Caratti <[email protected]>
bnxt_en: fix NULL dereference in case SR-IOV configuration fails
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
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
Andre Edich <[email protected]>
smsc95xx: avoid memory leak in smsc95xx_bind
Andre Edich <[email protected]>
smsc95xx: check return value of smsc95xx_reset
Li Heng <[email protected]>
net: cxgb4: fix return error value in t4_prep_fw
Hsin-Yi Wang <[email protected]>
drm/mediatek: Check plane visibility in atomic_update
Dan Carpenter <[email protected]>
net: qrtr: Fix an out of bounds read qrtr_endpoint_post()
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
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
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
Thierry Reding <[email protected]>
gpu: host1x: Detach driver on unregister
Nicolin Chen <[email protected]>
drm/tegra: hub: Do not enable orphaned window group
Tony Lindgren <[email protected]>
ARM: dts: omap4-droid4: Fix spi configuration and increase rate
Jens Thoms Toerring <[email protected]>
regmap: fix alignment issue
Krzysztof Kozlowski <[email protected]>
spi: spi-fsl-dspi: Fix external abort on interrupt in resume or exit paths
Chuanhua Han <[email protected]>
spi: spi-fsl-dspi: use IRQF_SHARED mode to request IRQ
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/pgtable-prot.h | 2 +- arch/arm64/kernel/kgdb.c | 2 +- arch/arm64/kvm/hyp-init.S | 11 ++- arch/s390/include/asm/kvm_host.h | 8 +- arch/s390/kernel/early.c | 2 + arch/s390/mm/hugetlbpage.c | 2 +- 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.c | 2 + arch/x86/kvm/x86.c | 2 + block/bio-integrity.c | 23 +++-- drivers/base/regmap/regmap.c | 100 ++++++++++----------- drivers/block/nbd.c | 25 +++--- drivers/gpu/drm/drm_panel_orientation_quirks.c | 14 +-- 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/host1x/bus.c | 9 ++ drivers/md/dm.c | 15 +++- drivers/message/fusion/mptscsih.c | 4 +- drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 2 +- drivers/net/ethernet/cadence/macb_main.c | 2 +- drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 10 +-- drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | 8 +- drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.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 ++- .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 +- 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/spi/spi-fsl-dspi.c | 51 +++++++++-- drivers/spi/spidev.c | 24 ++--- drivers/usb/dwc3/dwc3-pci.c | 4 +- fs/btrfs/extent_io.c | 40 +++++---- 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 | 54 +++++------ net/core/sysctl_net_core.c | 2 +- net/qrtr/qrtr.c | 6 +- sound/core/compress_offload.c | 4 + sound/drivers/opl3/opl3_synth.c | 2 + sound/pci/hda/hda_auto_parser.c | 6 ++ sound/usb/quirks-table.h | 52 +++++++++++ 58 files changed, 492 insertions(+), 302 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/58 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
@@ -30,12 +30,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 80000/* s390-specific vcpu->requests bit members */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 2/58 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
@@ -43,6 +44,9 @@#define SPI_MCR_CLR_TXF (1 << 11)#define SPI_MCR_CLR_RXF (1 << 10)#define SPI_MCR_XSPI (1 << 3) +#define SPI_MCR_DIS_TXF (1 << 13) +#define SPI_MCR_DIS_RXF (1 << 12) +#define SPI_MCR_HALT (1 << 0)#define SPI_TCR 0x08#define SPI_TCR_GET_TCNT (x) (((x) & 0xffff0000) >> 16)
@@ -1140,6 +1144,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->master); +} +static struct platform_driver fsl_dspi_driver = { .driver.name =DRIVER_NAME , .driver.of_match_table = fsl_dspi_dt_ids,
@@ -1147,6 +1169,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/58 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
@@ -1137,9 +1137,18 @@ static int dspi_remove(struct platform_device *pdev)struct fsl_dspi *dspi =spi_master_get_devdata (master);/* Disconnect from the SPI framework */ +spi_unregister_controller (dspi->master); + +/* 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_master (dspi->master);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 4/58 spi: spi-fsl-dspi: use IRQF_SHARED mode to request IRQ
In reply to Greg Kroah-HartmanFrom: Chuanhua Han <[email protected]>
[ Upstream commit 13aed23927414137a017ac2f7d567001f714293f ]
Some SoC share one irq number between DSPI controllers.
For example, on the LX2160 board, DSPI0 and DSPI1 share one irq number. In this case, only one DSPI controller can register successfully, and others will fail.
--- drivers/spi/spi-fsl-dspi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/spi/spi-fsl-dspi.c +2 -2
@@ -1094,8 +1094,8 @@ static int dspi_probe(struct platform_device *pdev) goto out_clk_put; } - ret =devm_request_irq (&pdev->dev, dspi->irq, dspi_interrupt,0 , - pdev->name, dspi); + ret =devm_request_irq (&pdev->dev, dspi->irq, dspi_interrupt, +IRQF_SHARED , pdev->name, dspi);if (ret <0 ) {dev_err (&pdev->dev,"Unable to attach DSPI interrupt\n" ); goto out_clk_put;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 5/58 spi: spi-fsl-dspi: Fix external abort on interrupt in resume or exit paths
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 3d87b613d6a3c6f0980e877ab0895785a2dde581 ]
If shared interrupt comes late, during probe error path or device remove (could be triggered with CONFIG_DEBUG_SHIRQ), the interrupt handler dspi_interrupt() will access registers with the clock being disabled. This leads to external abort on non-linefetch on Toradex Colibri VF50 module (with Vybrid VF5xx):
$ echo 4002d000.spi > /sys/devices/platform/soc/40000000.bus/4002d000.spi/driver/unbind
Unhandled fault: external abort on non-linefetch (0x1008) at 0x8887f02c
Internal error: : 1008 [#1] ARM
Hardware name: Freescale Vybrid VF5xx/VF6xx (Device Tree)
Backtrace:
(regmap_mmio_read32le)
(regmap_mmio_read)
(_regmap_bus_reg_read)
(_regmap_read)
(regmap_read)
(dspi_interrupt)
(free_irq)
(devm_irq_release)
(release_nodes)
(devres_release_all)
(device_release_driver_internal)The resource-managed framework should not be used for shared interrupt handling, because the interrupt handler might be called after releasing other resources and disabling clocks.
Similar bug could happen during suspend - the shared interrupt handler could be invoked after suspending the device. Each device sharing this interrupt line should disable the IRQ during suspend so handler will be invoked only in following cases:
1. None suspended,
2. All devices resumed.
--- drivers/spi/spi-fsl-dspi.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/spi/spi-fsl-dspi.c +13 -4
@@ -897,6 +897,8 @@ static int dspi_suspend(struct device *dev)struct spi_master *master =dev_get_drvdata (dev);struct fsl_dspi *dspi =spi_master_get_devdata (master); +if (dspi->irq) +disable_irq (dspi->irq);spi_master_suspend (master);clk_disable_unprepare (dspi->clk);
@@ -917,6 +919,8 @@ static int dspi_resume(struct device *dev)if (ret)return ret;spi_master_resume (master); +if (dspi->irq) +enable_irq (dspi->irq);return 0 ; }
@@ -1094,8 +1098,8 @@ static int dspi_probe(struct platform_device *pdev) goto out_clk_put; } - ret =devm_request_irq (&pdev->dev, dspi->irq, dspi_interrupt, -IRQF_SHARED , pdev->name, dspi); + ret =request_threaded_irq (dspi->irq, dspi_interrupt,NULL , +IRQF_SHARED , pdev->name, dspi);if (ret <0 ) {dev_err (&pdev->dev,"Unable to attach DSPI interrupt\n" ); goto out_clk_put;
@@ -1105,7 +1109,7 @@ static int dspi_probe(struct platform_device *pdev) ret =dspi_request_dma (dspi, res->start);if (ret <0 ) {dev_err (&pdev->dev,"can't get dma channels\n" ); - goto out_clk_put; + goto out_free_irq; } }
@@ -1118,11 +1122,14 @@ static int dspi_probe(struct platform_device *pdev) ret =spi_register_master (master);if (ret !=0 ) {dev_err (&pdev->dev,"Problem registering DSPI master\n" ); - goto out_clk_put; + goto out_free_irq; }return ret; +out_free_irq: +if (dspi->irq) +free_irq (dspi->irq, dspi); out_clk_put:clk_disable_unprepare (dspi->clk); out_master_put:
@@ -1148,6 +1155,8 @@ static int dspi_remove(struct platform_device *pdev)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);return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 6/58 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
@@ -21,6 +21,7 @@#include <linux/delay.h> #include <linux/log2.h> #include <linux/hwspinlock.h> +#include <asm/unaligned.h> #define CREATE_TRACE_POINTS #include "trace.h"
@@ -232,22 +233,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)
@@ -263,43 +262,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
@@ -316,35 +311,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)
@@ -359,69 +353,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 7/58 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
@@ -16,8 +16,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/58 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
@@ -143,7 +143,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 ;
@@ -160,7 +162,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 9/58 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
@@ -632,8 +632,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 10/58 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
@@ -782,13 +782,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 11/58 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
@@ -607,15 +607,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 ;
@@ -623,19 +628,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 12/58 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
@@ -7005,7 +7005,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;
@@ -7026,15 +7029,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 13/58 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
@@ -446,11 +446,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;
@@ -793,6 +797,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);
@@ -806,8 +812,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;
@@ -10196,10 +10205,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 ); } } }
@@ -10233,7 +10242,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;
@@ -10251,7 +10260,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;
@@ -10264,7 +10273,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 14/58 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
@@ -107,6 +107,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 15/58 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 ,
@@ -100,7 +94,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
Re: [PATCH 4.19 15/58] drm: panel-orientation-quirks: Use generic orientation-data for Acer S1003
Hi!
Quoted 5 lines
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_updrm_dmi_panel_orientation_datastruct which is also used by other quirks.
This is just a cleanup, it does not fix anything. I don't think we
need it in stable.
Best regards,
Pavel
Quoted 23 lines
drivers/gpu/drm/drm_panel_orientation_quirks.c +1
-7-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 ,@@ -100,7 +94,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
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Greg Kroah-Hartman
maintainerPATCH 16/58 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
@@ -155,6 +155,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 17/58 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
@@ -435,6 +435,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
Greg Kroah-Hartman
maintainerPATCH 18/58 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
@@ -2225,6 +2225,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 19/58 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
@@ -497,14 +497,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);
@@ -527,7 +527,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);
@@ -574,7 +574,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);
@@ -584,6 +584,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 20/58 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 -/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*
@@ -2420,7 +2418,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 21/58 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
@@ -204,8 +204,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 22/58 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
@@ -38,6 +38,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
@@ -90,7 +102,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);
@@ -111,14 +123,7 @@ static 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 23/58 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
@@ -447,7 +447,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;/* +1 for ib_stop_cq */ queue->ib_cq = ib_alloc_cq(ibdev, queue,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 24/58 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
@@ -336,7 +336,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 25/58 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
@@ -266,7 +266,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);
@@ -280,6 +280,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);
@@ -293,6 +295,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 26/58 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
@@ -108,6 +108,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) {
@@ -122,6 +132,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;
@@ -143,16 +158,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 = { .atomic_check = mtk_plane_atomic_check, .atomic_update = mtk_plane_atomic_update,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 27/58 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 28/58 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
@@ -1301,6 +1301,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);
@@ -1331,6 +1333,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 29/58 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
@@ -1307,7 +1307,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 30/58 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
@@ -151,18 +151,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 31/58 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
@@ -57,6 +57,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 {
@@ -68,6 +69,7 @@ struct snd_compr_stream {enum snd_compr_direction direction;bool metadata_set;bool next_track; +bool partial_drain;void *private_data; };
@@ -171,7 +173,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
@@ -723,6 +723,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 ;
@@ -880,6 +883,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 32/58 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
@@ -269,7 +269,7 @@ static int kgdb_step_brk_fn(struct pt_regs *regs, unsigned int esr)if (user_mode (regs) || !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 33/58 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
@@ -974,25 +974,26 @@ static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg, test_bit(NBD_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);
@@ -1004,6 +1005,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 34/58 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
@@ -810,16 +810,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 35/58 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
@@ -365,6 +365,7 @@ static void bnxt_free_vf_resources(struct bnxt *bp) } } + bp->pf.active_vfs =0 ;kfree (bp->pf.vf); bp->pf.vf =NULL ; }
@@ -750,7 +751,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 36/58 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
@@ -4060,7 +4060,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 37/58 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
@@ -5982,7 +5982,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 38/58 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
@@ -105,6 +105,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 39/58 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
@@ -76,6 +76,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 40/58 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
@@ -3460,4 +3460,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 41/58 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
@@ -65,7 +65,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 42/58 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
@@ -144,11 +144,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
@@ -159,7 +163,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 43/58 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
@@ -4474,7 +4474,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 44/58 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
@@ -865,6 +865,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 45/58 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.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-)
arch/x86/kvm/kvm_cache_regs.h +1 -1
@@ -5,7 +5,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)static inline unsigned long kvm_register_read (struct kvm_vcpu *vcpu,enum kvm_reg reg)
arch/x86/kvm/vmx.c +2 -0
@@ -6335,6 +6335,8 @@ static void vmx_set_constant_host_state(static void 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 46/58 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
@@ -757,7 +757,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
@@ -644,19 +644,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; } }
@@ -673,7 +674,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
@@ -2334,7 +2334,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)
@@ -2435,7 +2435,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
@@ -4258,7 +4258,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 47/58 kernel: module: Use struct_size() helper
In reply to Greg Kroah-HartmanFrom: Gustavo A. R. Silva <[email protected]>
commit 8d1b73dd25ff92c3fa9807a20c22fa2b44c07336 upstream.
One of the more common cases of allocation size calculations is finding the size of a structure that has a zero-sized array at the end, along with memory for some number of elements for that array. For example:
struct module_sect_attrs {
...
struct module_sect_attr attrs[0];
};Make use of the struct_size() helper instead of an open-coded version in order to avoid any potential type mistakes.
So, replace the following form:
sizeof(*sect_attrs) + nloaded * sizeof(sect_attrs->attrs[0]
with:
struct_size(sect_attrs, attrs, nloaded)
This code was detected with the help of Coccinelle.
--- kernel/module.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
kernel/module.c +1 -2
@@ -1491,8 +1491,7 @@ static void add_sect_attrs(struct modulefor (i =0 ; i < info->hdr->e_shnum; i++)if (!sect_empty (&info->sechdrs[i])) nloaded++; - size[0 ] =ALIGN (sizeof (*sect_attrs) - + nloaded *sizeof (sect_attrs->attrs[0 ]), + 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 ]); sect_attrs =kzalloc (size[0 ] + size[1 ],GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 48/58 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
@@ -1451,8 +1451,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; };
@@ -1462,11 +1461,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 ); }
@@ -1476,7 +1480,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); }
@@ -1485,42 +1489,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 ;
@@ -1610,7 +1613,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 49/58 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
@@ -1471,8 +1471,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)
@@ -4260,7 +4260,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 50/58 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
@@ -2334,7 +2334,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)
@@ -2435,7 +2435,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 51/58 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
@@ -752,12 +752,12 @@ struct bpf_prog *bpf_int_jit_compile(strvoid bpf_jit_compile (struct bpf_prog *prog);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
@@ -1903,7 +1903,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;
@@ -1925,7 +1926,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 ; }
@@ -1942,7 +1943,7 @@ static struct bpf_insn *bpf_insn_preparecontinue ; } -if (!bpf_dump_raw_ok () && +if (!bpf_dump_raw_ok (f_cred) && imm == (unsigned long )prog->aux) { insns[i].imm =0 ; insns[i +1 ].imm =0 ;
@@ -1953,7 +1954,8 @@ static struct bpf_insn *bpf_insn_preparereturn insns; } -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) {
@@ -2010,11 +2012,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);
@@ -2048,7 +2050,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);
@@ -2083,7 +2085,7 @@ static int bpf_prog_get_info_by_fd(struc ulen = info.nr_jited_ksyms; info.nr_jited_ksyms = prog->aux->func_cnt;if (info.nr_jited_ksyms && ulen) { -if (bpf_dump_raw_ok ()) { +if (bpf_dump_raw_ok (file->f_cred)) {u64 __user *user_ksyms;ulong ksym_addr;u32 i;
@@ -2107,7 +2109,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;if (info.nr_jited_func_lens && ulen) { -if (bpf_dump_raw_ok ()) { +if (bpf_dump_raw_ok (file->f_cred)) {u32 __user *user_lens;u32 func_len, i;
@@ -2132,7 +2134,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) {
@@ -2174,7 +2177,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) {
@@ -2206,13 +2210,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
@@ -270,7 +270,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 52/58 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 bdf4d37b03dc410b91f318c8e097a41e732d1038 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 53/58 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
@@ -4801,25 +4801,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))
@@ -5273,6 +5276,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 54/58 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
@@ -5574,6 +5574,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;
@@ -5583,10 +5584,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,
@@ -5608,8 +5607,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 55/58 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>
@@ -2853,17 +2854,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 56/58 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
@@ -156,7 +156,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
@@ -199,15 +198,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
@@ -234,6 +227,10 @@ ENTRY(EV_Trap) EXCEPTION_PROLOGUE + lr r12, [efa] + + FAKE_RET_FROM_EXCPN + ;============ TRAP 1 :breakpoints ; Check ECR for trap with arg (PROLOGUE ensures r9 has ECR) bmsk.f 0, r9, 7
@@ -241,9 +238,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 57/58 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
@@ -26,7 +26,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 58/58 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);
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.133 release. There are 58 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/v4.x/stable-review/patch-4.19.133-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.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: 4.19.133-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.19.y
git commit: 4e2a5cde3f03246325a5db594e9aff787b2b7fab
git describe: v4.19.132-59-g4e2a5cde3f03
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.19-oe/build/v4.19.132-59-g4e2a5cde3f03
No regressions (compared to build v4.19.132)
No fixes (compared to build v4.19.132)
Ran 30760 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c - arm64
- hi6220-hikey - arm64
- i386
- juno-r2 - arm64
- juno-r2-compat
- juno-r2-kasan
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15 - arm
- x86_64
- x86-kasan
Test Suites
-----------
* build
* install-android-platform-tools-r2600
* install-android-platform-tools-r2800
* kselftest
* kselftest/drivers
* kselftest/filesystems
* kselftest/net
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-controllers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-ipc-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-securebits-tests
* perf
* v4l2-compliance
* kvm-unit-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fs-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-sched-tests
* ltp-syscalls-tests
* network-basic-tests
* ltp-open-posix-tests
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Greg Kroah-Hartman
maintainerQuoted 17 lines · Naresh Kamboju
Quoted 15 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.133 release. There are 58 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/v4.x/stable-review/patch-4.19.133-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.
Quoted 6 lines
Quoted 3 lines
thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm,x86_64, and i386.
Thanks for testing all of these and letting me know.
greg k-h
Jon Hunter
maintainerQuoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.133 release. There are 58 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/v4.x/stable-review/patch-4.19.133-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
All tests are passing for Tegra ...
Test results for stable-v4.19:
11 builds: 11 pass, 0 fail
22 boots: 22 pass, 0 fail
38 tests: 38 pass, 0 failLinux version: 4.19.133-rc1-g4e2a5cde3f03
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, 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 4.19.133 release. There are 58 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/v4.x/stable-review/patch-4.19.133-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.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 4.19.133 release. There are 58 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: 155 pass: 155 fail: 0 Qemu test results: total: 421 pass: 421 fail: 0
Guenter
Hi!
Quoted 7 lines
This is the start of the stable review cycle for the 4.19.133 release. There are 58 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.
No problems detected by CIP test farm:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/pipelines/166553779
And no problems on 4.4 detected, either: Linux 4.4.231-rc1 (270512166a37)
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/pipelines/166553747
Best regards,
Pavel
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html