5.4.42-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 5.4.42-rc1 review
This is the start of the stable review cycle for the 5.4.42 release. There are 147 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 20 May 2020 17:32:42 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.42-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.4.42-rc1
Kamal Mostafa <[email protected]>
bpf: Test_progs, fix test_get_stack_rawtp_err.c build
Andrii Nakryiko <[email protected]>
selftest/bpf: fix backported test_select_reuseport selftest changes
Andrii Nakryiko <[email protected]>
libbpf: Extract and generalize CPU mask parsing logic
Sergei Trofimovich <[email protected]>
Makefile: disallow data races on gcc-10 as well
Jim Mattson <[email protected]>
KVM: x86: Fix off-by-one error in kvm_vcpu_ioctl_x86_setup_mce
Xiyu Yang <[email protected]>
bpf: Fix sk_psock refcnt leak when receiving message
Chuck Lever <[email protected]>
SUNRPC: Revert 241b1f419f0e ("SUNRPC: Remove xdr_buf_trim()")Geert Uytterhoeven <[email protected]>
ARM: dts: r8a7740: Add missing extal2 to CPG node
Yoshihiro Shimoda <[email protected]>
arm64: dts: renesas: r8a77980: Fix IPMMU VIP[01] nodes
Geert Uytterhoeven <[email protected]>
ARM: dts: r8a73a4: Add missing CMT1 interrupts
Adam Ford <[email protected]>
arm64: dts: imx8mn: Change SDMA1 ahb clock for imx8mn
Chen-Yu Tsai <[email protected]>
arm64: dts: rockchip: Rename dwc3 device nodes on rk3399 to make dtc happy
Chen-Yu Tsai <[email protected]>
arm64: dts: rockchip: Replace RK805 PMIC node name with "pmic" on rk3328 boards
Neil Armstrong <[email protected]>
arm64: dts: meson-g12-common: fix dwc2 clock names
Neil Armstrong <[email protected]>
arm64: dts: meson-g12b-khadas-vim3: add missing frddr_a status property
Marc Zyngier <[email protected]>
clk: Unlink clock if failed to prepare or enable
Kai-Heng Feng <[email protected]>
Revert "ALSA: hda/realtek: Fix pop noise on ALC225"
Wei Yongjun <[email protected]>
usb: gadget: legacy: fix error return code in cdc_bind()
Wei Yongjun <[email protected]>
usb: gadget: legacy: fix error return code in gncm_bind()
Christophe JAILLET <[email protected]>
usb: gadget: audio: Fix a missing error return value in audio_bind()
Christophe JAILLET <[email protected]>
usb: gadget: net2272: Fix a memory leak in an error handling path in 'net2272_plat_probe()'
Amir Goldstein <[email protected]>
fanotify: fix merging marks masks with FAN_ONDIR
John Stultz <[email protected]>
dwc3: Remove check for HWO flag in dwc3_gadget_ep_reclaim_trb_sg()
Justin Swartz <[email protected]>
clk: rockchip: fix incorrect configuration of rk3228 aclk_gpu* clocks
Eric W. Biederman <[email protected]>
exec: Move would_dump into flush_old_exec
Josh Poimboeuf <[email protected]>
x86/unwind/orc: Fix error handling in __unwind_start()
Borislav Petkov <[email protected]>
x86: Fix early boot crash on gcc-10, third try
Adam McCoy <[email protected]>
cifs: fix leaked reference on requeued write
Christophe Leroy <[email protected]>
powerpc/32s: Fix build failure with CONFIG_PPC_KUAP_DEBUG
Simon Ser <[email protected]>
drm/amd/display: add basic atomic check for cursor plane
Michal Vokáč <[email protected]>
ARM: dts: imx6dl-yapp4: Fix Ursa board Ethernet connection
Fabio Estevam <[email protected]>
ARM: dts: imx27-phytec-phycard-s-rdk: Fix the I2C1 pinctrl entries
Kishon Vijay Abraham I <[email protected]>
ARM: dts: dra7: Fix bus_dma_limit for PCIe
Peter Jones <[email protected]>
Make the "Reducing compressed framebufer size" message be DRM_INFO_ONCE()
Sriharsha Allenki <[email protected]>
usb: xhci: Fix NULL pointer dereference when enqueuing trbs from urb sg list
Kyungtae Kim <[email protected]>
USB: gadget: fix illegal array access in binding with UDC
Peter Chen <[email protected]>
usb: cdns3: gadget: prev_req->trb is NULL for ep0
Li Jun <[email protected]>
usb: host: xhci-plat: keep runtime active when removing host
Eugeniu Rosca <[email protected]>
usb: core: hub: limit HUB_QUIRK_DISABLE_AUTOSUSPEND to USB5534B
Jesus Ramos <[email protected]>
ALSA: usb-audio: Add control message quirk delay for Kingston HyperX headset
Takashi Iwai <[email protected]>
ALSA: rawmidi: Fix racy buffer resize under concurrent accesses
Takashi Iwai <[email protected]>
ALSA: hda/realtek - Add COEF workaround for ASUS ZenBook UX431DA
Takashi Iwai <[email protected]>
ALSA: hda/realtek - Limit int mic boost for Thinkpad T530
Greg Kroah-Hartman <[email protected]>
USB: usbfs: fix mmap dma mismatch
Jeremy Linton <[email protected]>
usb: usbfs: correct kernel->user page attribute mismatch
Linus Torvalds <[email protected]>
gcc-10: avoid shadowing standard library 'free()' in crypto
Linus Torvalds <[email protected]>
gcc-10: mark more functions __init to avoid section mismatch warnings
Linus Torvalds <[email protected]>
gcc-10 warnings: fix low-hanging fruit
Linus Torvalds <[email protected]>
gcc-10: disable 'restrict' warning for now
Linus Torvalds <[email protected]>
gcc-10: disable 'stringop-overflow' warning for now
Linus Torvalds <[email protected]>
gcc-10: disable 'array-bounds' warning for now
Linus Torvalds <[email protected]>
gcc-10: disable 'zero-length-bounds' warning for now
Linus Torvalds <[email protected]>
Stop the ad-hoc games with -Wno-maybe-initialized
Jason Gunthorpe <[email protected]>
net/rds: Use ERR_PTR for rds_message_alloc_sgs()
Jason Gunthorpe <[email protected]>
pnp: Use list_for_each_entry() instead of open coding
Olga Kornievskaia <[email protected]>
NFSv3: fix rpc receive buffer size for MOUNT call
Yafang Shao <[email protected]>
mm, memcg: fix inconsistent oom event behavior
Wei Yongjun <[email protected]>
s390/ism: fix error return code in ism_probe()
Samu Nuutamo <[email protected]>
hwmon: (da9052) Synchronize access with mfd
Potnuri Bharat Teja <[email protected]>
RDMA/iw_cxgb4: Fix incorrect function parameters
Sasha Levin <[email protected]>
RDMA/core: Fix double put of resource
Jack Morgenstein <[email protected]>
IB/core: Fix potential NULL pointer dereference in pkey cache
Jack Morgenstein <[email protected]>
IB/mlx4: Test return value of calls to ib_get_cached_pkey
Sudip Mukherjee <[email protected]>
RDMA/rxe: Always return ERR_PTR from rxe_create_mmap_info()
Phil Sutter <[email protected]>
netfilter: nft_set_rbtree: Add missing expired checks
Stefano Brivio <[email protected]>
netfilter: nft_set_rbtree: Introduce and use nft_rbtree_interval_start()
Chuck Lever <[email protected]>
SUNRPC: Signalled ASYNC tasks need to exit
J. Bruce Fields <[email protected]>
nfs: fix NULL deference in nfs4_get_valid_delegation
Christoph Hellwig <[email protected]>
arm64: fix the flush_icache_range arguments in machine_kexec
Zhenyu Wang <[email protected]>
drm/i915/gvt: Fix kernel oops for 3-level ppgtt guest
Arnd Bergmann <[email protected]>
netfilter: conntrack: avoid gcc-10 zero-length-bounds warning
Dave Wysochanski <[email protected]>
NFSv4: Fix fscache cookie aux_data to ensure change_attr is included
Arnd Bergmann <[email protected]>
nfs: fscache: use timespec64 in inode auxdata
Dave Wysochanski <[email protected]>
NFS: Fix fscache super_cookie index_key from changing after umount
Alex Deucher <[email protected]>
drm/amdgpu: force fbdev into vram
Christian Brauner <[email protected]>
fork: prevent accidental access to clone3 features
Andreas Gruenbacher <[email protected]>
gfs2: More gfs2_find_jhead fixes
Adrian Hunter <[email protected]>
mmc: block: Fix request completion in the CQE timeout path
Sarthak Garg <[email protected]>
mmc: core: Fix recursive locking issue in CQE recovery path
Veerabhadrarao Badiganti <[email protected]>
mmc: core: Check request type before completing the request
Ben Chuang <[email protected]>
mmc: sdhci-pci-gli: Fix can not access GL9750 after reboot from Windows 10
Christophe JAILLET <[email protected]>
mmc: alcor: Fix a resource leak in the error path for ->probe()
John Fastabend <[email protected]>
bpf, sockmap: bpf_tcp_ingress needs to subtract bytes from sg.size
John Fastabend <[email protected]>
bpf, sockmap: msg_pop_data can incorrecty set an sge length
Sultan Alsawaf <[email protected]>
drm/i915: Don't enable WaIncreaseLatencyIPCEnabled when IPC is disabled
Dan Carpenter <[email protected]>
i40iw: Fix error handling in i40iw_manage_arp_cache()
Takashi Sakamoto <[email protected]>
ALSA: firewire-lib: fix 'function sizeof not defined' error of tracepoints format
Wei Yongjun <[email protected]>
bpf: Fix error return code in map_lookup_and_delete_elem()
Grace Kao <[email protected]>
pinctrl: cherryview: Add missing spinlock usage in chv_gpio_irq_handler
Ansuel Smith <[email protected]>
pinctrl: qcom: fix wrong write in update_dual_edge
Andy Shevchenko <[email protected]>
pinctrl: baytrail: Enable pin configuration setting for GPIO chip
Andy Shevchenko <[email protected]>
pinctrl: sunrisepoint: Fix PAD lock register offset for SPT-H
Rafael J. Wysocki <[email protected]>
ACPI: EC: PM: Avoid premature returns from acpi_s2idle_wake()
Mike Marciniszyn <[email protected]>
IB/hfi1: Fix another case where pq is left on waitlist
Ben Chuang <[email protected]>
mmc: sdhci-pci-gli: Fix no irq handler from suspend
Andreas Gruenbacher <[email protected]>
gfs2: Another gfs2_walk_metadata fix
Kai-Heng Feng <[email protected]>
ALSA: hda/realtek - Fix S3 pop noise on Dell Wyse
Vasily Averin <[email protected]>
ipc/util.c: sysvipc_find_ipc() incorrectly updates position index
Marek Olšák <[email protected]>
drm/amdgpu: invalidate L2 before SDMA IBs (v2)
Luben Tuikov <[email protected]>
drm/amdgpu: simplify padding calculations (v2)
Vasily Averin <[email protected]>
drm/qxl: lost qxl_bo_kunmap_atomic_page in qxl_image_init_helper()
Sung Lee <[email protected]>
drm/amd/display: Update downspread percent to match spreadsheet for DCN2.1
Dmytro Laktyushkin <[email protected]>
drm/amd/display: check if REFCLK_CNTL register is present
Tiecheng Zhou <[email protected]>
drm/amd/powerplay: avoid using pm_en before it is initialized revised
Kai Vehmanen <[email protected]>
ALSA: hda/hdmi: fix race in monitor detection during probe
Chris Wilson <[email protected]>
cpufreq: intel_pstate: Only mention the BIOS disabling turbo mode once
Xiao Yang <[email protected]>
selftests/ftrace: Check the first record for kprobe_args_type.tc
Lubomir Rintel <[email protected]>
dmaengine: mmp_tdma: Reset channel error on release
Lubomir Rintel <[email protected]>
dmaengine: mmp_tdma: Do not ignore slave config validation errors
Madhuparna Bhowmik <[email protected]>
dmaengine: pch_dma.c: Avoid data race between probe and irq handler
Ilie Halip <[email protected]>
riscv: fix vdso build with lld
Vincent Minet <[email protected]>
umh: fix memory leak on execve failure
Heiner Kallweit <[email protected]>
r8169: re-establish support for RTL8401 chip version
Wei Yongjun <[email protected]>
nfp: abm: fix error return code in nfp_abm_vnic_alloc()
Kelly Littlepage <[email protected]>
net: tcp: fix rx timestamp behavior for tcp_recvmsg
Zefan Li <[email protected]>
netprio_cgroup: Fix unlimited memory leak of v2 cgroups
Paolo Abeni <[email protected]>
net: ipv4: really enforce backoff for redirects
Florian Fainelli <[email protected]>
net: dsa: loop: Add module soft dependency
Luo bin <[email protected]>
hinic: fix a bug of ndo_stop
Dan Carpenter <[email protected]>
dpaa2-eth: prevent array underflow in update_cls_rule()
Michael S. Tsirkin <[email protected]>
virtio_net: fix lockdep warning on 32 bit
Eric Dumazet <[email protected]>
tcp: fix SO_RCVLOWAT hangs with fat skbs
Eric Dumazet <[email protected]>
tcp: fix error recovery in tcp_zerocopy_receive()
Maciej Żenczykowski <[email protected]>
Revert "ipv6: add mtu lock check in __ip6_rt_update_pmtu"
Guillaume Nault <[email protected]>
pppoe: only process PADT targeted at local interfaces
Vinod Koul <[email protected]>
net: stmmac: fix num_por initialization
Heiner Kallweit <[email protected]>
net: phy: fix aneg restart in phy_ethtool_set_eee
Paolo Abeni <[email protected]>
netlabel: cope with NULL catmap
Cong Wang <[email protected]>
net: fix a potential recursive NETDEV_FEAT_CHANGE
Ioana Ciornei <[email protected]>
dpaa2-eth: properly handle buffer size restrictions
Raul E Rangel <[email protected]>
mmc: sdhci-acpi: Add SDHCI_QUIRK2_BROKEN_64_BIT_DMA for AMDI0040
Hangbin Liu <[email protected]>
selftests/bpf: fix goto cleanup label not defined
Wu Bo <[email protected]>
scsi: sg: add sg_remove_request in sg_write
Cong Wang <[email protected]>
net_sched: fix tcm_parent in tc filter dump
Arnd Bergmann <[email protected]>
sun6i: dsi: fix gcc-4.8
Stefan Hajnoczi <[email protected]>
virtio-blk: handle block_device_operations callbacks after hot unplug
Arnd Bergmann <[email protected]>
drop_monitor: work around gcc-10 stringop-overflow warning
Alan Maguire <[email protected]>
ftrace/selftests: workaround cgroup RT scheduling issues
Christophe JAILLET <[email protected]>
net: moxa: Fix a potential double 'free_irq()'
Christophe JAILLET <[email protected]>
net/sonic: Fix a resource leak in an error handling path in 'jazz_sonic_probe()'
Chuck Lever <[email protected]>
SUNRPC: Fix GSS privacy computation of auth->au_ralign
Chuck Lever <[email protected]>
SUNRPC: Add "@len" parameter to gss_unwrap()
Adam Ford <[email protected]>
gpio: pca953x: Fix pca953x_gpio_set_config
Marc Zyngier <[email protected]>
KVM: arm: vgic: Synchronize the whole guest on GIC{D,R}_I{S,C}ACTIVER read
Yuiko Oshino <[email protected]>
net: phy: microchip_t1: add lan87xx_phy_init to initialize the lan87xx phy.
Hugh Dickins <[email protected]>
shmem: fix possible deadlocks on shmlock_user_lock
Florian Fainelli <[email protected]>
net: dsa: Do not make user port errors fatal
-------------
Diffstat:
Makefile | 20 ++- arch/arm/boot/dts/dra7.dtsi | 4 +- arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts | 4 +- arch/arm/boot/dts/imx6dl-yapp4-ursa.dts | 2 +- arch/arm/boot/dts/r8a73a4.dtsi | 9 +- arch/arm/boot/dts/r8a7740.dtsi | 2 +- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 2 +- .../boot/dts/amlogic/meson-g12b-khadas-vim3.dtsi | 4 + arch/arm64/boot/dts/freescale/imx8mn.dtsi | 2 +- arch/arm64/boot/dts/renesas/r8a77980.dtsi | 2 + arch/arm64/boot/dts/rockchip/rk3328-evb.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3328-rock64.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 4 +- arch/arm64/kernel/machine_kexec.c | 1 + arch/powerpc/include/asm/book3s/32/kup.h | 2 +- arch/riscv/kernel/vdso/Makefile | 6 +- arch/x86/include/asm/stackprotector.h | 7 +- arch/x86/kernel/smpboot.c | 8 + arch/x86/kernel/unwind_orc.c | 16 +- arch/x86/kvm/x86.c | 2 +- arch/x86/xen/smp_pv.c | 1 + crypto/lrw.c | 4 +- crypto/xts.c | 4 +- drivers/acpi/ec.c | 24 ++- drivers/acpi/internal.h | 1 - drivers/acpi/sleep.c | 14 +- drivers/block/virtio_blk.c | 86 ++++++++++- drivers/clk/clk.c | 3 + drivers/clk/rockchip/clk-rk3228.c | 17 +- drivers/cpufreq/intel_pstate.c | 2 +- drivers/dma/mmp_tdma.c | 5 +- drivers/dma/pch_dma.c | 2 +- drivers/firmware/efi/tpm.c | 2 +- drivers/gpio/gpio-pca953x.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 3 +- drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 4 +- drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h | 16 ++ drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 4 +- drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 4 +- drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 4 +- drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 31 +++- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 26 +++- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 3 +- .../gpu/drm/amd/display/dc/dcn21/dcn21_resource.c | 2 +- drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 6 +- drivers/gpu/drm/i915/display/intel_fbc.c | 3 +- drivers/gpu/drm/i915/gvt/scheduler.c | 6 +- drivers/gpu/drm/i915/intel_pm.c | 2 +- drivers/gpu/drm/qxl/qxl_image.c | 3 +- drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 2 +- drivers/hwmon/da9052-hwmon.c | 4 +- drivers/infiniband/core/cache.c | 7 +- drivers/infiniband/core/nldev.c | 2 +- drivers/infiniband/hw/cxgb4/cm.c | 7 +- drivers/infiniband/hw/hfi1/user_sdma.c | 4 - drivers/infiniband/hw/i40iw/i40iw_hw.c | 2 +- drivers/infiniband/hw/mlx4/qp.c | 14 +- drivers/infiniband/sw/rxe/rxe_mmap.c | 2 +- drivers/infiniband/sw/rxe/rxe_queue.c | 11 +- drivers/mmc/core/block.c | 3 +- drivers/mmc/core/queue.c | 16 +- drivers/mmc/host/alcor.c | 6 +- drivers/mmc/host/sdhci-acpi.c | 10 +- drivers/mmc/host/sdhci-pci-gli.c | 23 +++ drivers/net/dsa/dsa_loop.c | 1 + drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 29 ++-- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h | 1 + .../net/ethernet/freescale/dpaa2/dpaa2-ethtool.c | 2 +- drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c | 16 +- drivers/net/ethernet/huawei/hinic/hinic_main.c | 16 +- drivers/net/ethernet/moxa/moxart_ether.c | 2 +- drivers/net/ethernet/natsemi/jazzsonic.c | 6 +- drivers/net/ethernet/netronome/nfp/abm/main.c | 4 +- drivers/net/ethernet/realtek/r8169_main.c | 2 + .../ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c | 17 +- drivers/net/phy/microchip_t1.c | 171 +++++++++++++++++++++ drivers/net/phy/phy.c | 8 +- drivers/net/ppp/pppoe.c | 3 + drivers/net/virtio_net.c | 6 +- drivers/pinctrl/intel/pinctrl-baytrail.c | 1 + drivers/pinctrl/intel/pinctrl-cherryview.c | 4 + drivers/pinctrl/intel/pinctrl-sunrisepoint.c | 15 +- drivers/pinctrl/qcom/pinctrl-msm.c | 2 +- drivers/s390/net/ism_drv.c | 4 +- drivers/scsi/sg.c | 4 +- drivers/usb/cdns3/gadget.c | 2 +- drivers/usb/core/devio.c | 19 ++- drivers/usb/core/hub.c | 6 +- drivers/usb/dwc3/gadget.c | 3 - drivers/usb/gadget/configfs.c | 3 + drivers/usb/gadget/legacy/audio.c | 4 +- drivers/usb/gadget/legacy/cdc2.c | 4 +- drivers/usb/gadget/legacy/ncm.c | 4 +- drivers/usb/gadget/udc/net2272.c | 2 + drivers/usb/host/xhci-plat.c | 4 +- drivers/usb/host/xhci-ring.c | 4 +- fs/cifs/cifssmb.c | 2 +- fs/exec.c | 4 +- fs/gfs2/bmap.c | 16 +- fs/gfs2/lops.c | 19 ++- fs/nfs/fscache-index.c | 6 +- fs/nfs/fscache.c | 31 ++-- fs/nfs/fscache.h | 8 +- fs/nfs/mount_clnt.c | 3 +- fs/nfs/nfs4state.c | 2 +- fs/notify/fanotify/fanotify.c | 11 +- include/linux/compiler.h | 6 + include/linux/fs.h | 2 +- include/linux/memcontrol.h | 2 + include/linux/pnp.h | 29 ++-- include/linux/skmsg.h | 1 + include/linux/sunrpc/gss_api.h | 3 + include/linux/sunrpc/gss_krb5.h | 6 +- include/linux/sunrpc/xdr.h | 1 + include/linux/tty.h | 2 +- include/net/netfilter/nf_conntrack.h | 2 +- include/net/sch_generic.h | 1 + include/net/tcp.h | 13 ++ include/sound/rawmidi.h | 1 + init/Kconfig | 18 --- init/initramfs.c | 2 +- init/main.c | 2 + ipc/util.c | 12 +- kernel/bpf/syscall.c | 4 +- kernel/fork.c | 13 +- kernel/trace/Kconfig | 1 - kernel/umh.c | 6 + mm/shmem.c | 7 +- net/core/dev.c | 4 +- net/core/drop_monitor.c | 11 +- net/core/filter.c | 2 +- net/core/netprio_cgroup.c | 2 + net/dsa/dsa2.c | 8 +- net/ipv4/cipso_ipv4.c | 6 +- net/ipv4/route.c | 2 +- net/ipv4/tcp.c | 27 +++- net/ipv4/tcp_bpf.c | 10 +- net/ipv4/tcp_input.c | 3 +- net/ipv6/calipso.c | 3 +- net/ipv6/route.c | 6 +- net/netfilter/nf_conntrack_core.c | 4 +- net/netfilter/nft_set_rbtree.c | 28 +++- net/netlabel/netlabel_kapi.c | 6 + net/rds/message.c | 19 +-- net/rds/rdma.c | 12 +- net/rds/rds.h | 3 +- net/rds/send.c | 6 +- net/sched/cls_api.c | 8 +- net/sunrpc/auth_gss/auth_gss.c | 12 +- net/sunrpc/auth_gss/gss_krb5_crypto.c | 8 +- net/sunrpc/auth_gss/gss_krb5_wrap.c | 44 ++++-- net/sunrpc/auth_gss/gss_mech_switch.c | 3 +- net/sunrpc/auth_gss/svcauth_gss.c | 10 +- net/sunrpc/clnt.c | 5 + net/sunrpc/xdr.c | 41 +++++ sound/core/rawmidi.c | 31 +++- sound/firewire/amdtp-stream-trace.h | 3 +- sound/pci/hda/patch_hdmi.c | 2 + sound/pci/hda/patch_realtek.c | 41 ++++- sound/usb/quirks.c | 9 +- tools/lib/bpf/libbpf.c | 126 ++++++++++----- tools/lib/bpf/libbpf_internal.h | 2 + .../bpf/prog_tests/stacktrace_build_id_nmi.c | 2 +- .../selftests/bpf/progs/test_get_stack_rawtp_err.c | 2 +- .../testing/selftests/bpf/test_select_reuseport.c | 4 +- tools/testing/selftests/ftrace/ftracetest | 22 +++ .../ftrace/test.d/kprobe/kprobe_args_type.tc | 2 +- virt/kvm/arm/vgic/vgic-mmio-v2.c | 4 +- virt/kvm/arm/vgic/vgic-mmio-v3.c | 12 +- virt/kvm/arm/vgic/vgic-mmio.c | 100 +++++++----- virt/kvm/arm/vgic/vgic-mmio.h | 3 + 171 files changed, 1238 insertions(+), 523 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/147 net: dsa: Do not make user port errors fatal
From: Florian Fainelli <[email protected]>
commit 86f8b1c01a0a537a73d2996615133be63cdf75db upstream.
Prior to 1d27732f411d ("net: dsa: setup and teardown ports"), we would not treat failures to set-up an user port as fatal, but after this commit we would, which is a regression for some systems where interfaces may be declared in the Device Tree, but the underlying hardware may not be present (pluggable daughter cards for instance).
--- net/dsa/dsa2.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
net/dsa/dsa2.c +1 -7
@@ -461,18 +461,12 @@ static int dsa_tree_setup_switches(struc err =dsa_port_setup (dp);if (err) - goto ports_teardown; +continue ; } }return 0 ; -ports_teardown: -for (i =0 ; i < port; i++) -dsa_port_teardown (&ds->ports[i]); - -dsa_switch_teardown (ds); - switch_teardown:for (i =0 ; i < device; i++) { ds = dst->ds[i];
Greg Kroah-Hartman
maintainerPATCH 2/147 shmem: fix possible deadlocks on shmlock_user_lock
In reply to Greg Kroah-HartmanFrom: Hugh Dickins <[email protected]>
[ Upstream commit ea0dfeb4209b4eab954d6e00ed136bc6b48b380d ]
Recent commit 71725ed10c40 ("mm: huge tmpfs: try to split_huge_page() when punching hole") has allowed syzkaller to probe deeper, uncovering a long-standing lockdep issue between the irq-unsafe shmlock_user_lock, the irq-safe xa_lock on mapping->i_pages, and shmem inode's info->lock which nests inside xa_lock (or tree_lock) since 4.8's shmem_uncharge().
user_shm_lock(), servicing SysV shmctl(SHM_LOCK), wants shmlock_user_lock while its caller shmem_lock() holds info->lock with interrupts disabled; but hugetlbfs_file_setup() calls user_shm_lock() with interrupts enabled, and might be interrupted by a writeback endio wanting xa_lock on i_pages.
This may not risk an actual deadlock, since shmem inodes do not take part in writeback accounting, but there are several easy ways to avoid it.
Requiring interrupts disabled for shmlock_user_lock would be easy, but it's a high-level global lock for which that seems inappropriate. Instead, recall that the use of info->lock to guard info->flags in shmem_lock() dates from pre-3.1 days, when races with SHMEM_PAGEIN and SHMEM_TRUNCATE could occur: nowadays it serves no purpose, the only flag added or removed is VM_LOCKED itself, and calls to shmem_lock() an inode are already serialized by the caller.
Take info->lock out of the chain and the possibility of deadlock or lockdep warning goes away.
--- mm/shmem.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
mm/shmem.c +5 -2
@@ -2183,7 +2183,11 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user)struct shmem_inode_info *info =SHMEM_I (inode);int retval = -ENOMEM ; -spin_lock_irq (&info->lock); +/* +* What serializes the accesses to info->flags? +* ipc_lock_object() when called from shmctl_do_lock(), +* no serialization needed when called from shm_destroy(). +*/ if (lock && !(info->flags &VM_LOCKED )) {if (!user_shm_lock (inode->i_size, user)) goto out_nomem;
@@ -2198,7 +2202,6 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user) retval =0 ; out_nomem: -spin_unlock_irq (&info->lock);return retval; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 3/147 net: phy: microchip_t1: add lan87xx_phy_init to initialize the lan87xx phy.
In reply to Greg Kroah-HartmanFrom: Yuiko Oshino <[email protected]>
[ Upstream commit 63edbcceef612bdd95fa28ce100460c7b79008a4 ]
lan87xx_phy_init() initializes the lan87xx phy hardware including its TC10 Wake-up and Sleep features.
v0->v1:
- Add more details in the commit message and source comments.
- Update to the latest initialization sequences.
- Add access_ereg_modify_changed().
- Fix access_ereg() to access SMI bank correctly.
--- drivers/net/phy/microchip_t1.c | 171 +++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+)
drivers/net/phy/microchip_t1.c +171 -0
@@ -3,9 +3,21 @@#include <linux/kernel.h> #include <linux/module.h> +#include <linux/delay.h> #include <linux/mii.h> #include <linux/phy.h> +/* External Register Control Register */ +#define LAN87XX_EXT_REG_CTL (0x14) +#define LAN87XX_EXT_REG_CTL_RD_CTL (0x1000) +#define LAN87XX_EXT_REG_CTL_WR_CTL (0x0800) + +/* External Register Read Data Register */ +#define LAN87XX_EXT_REG_RD_DATA (0x15) + +/* External Register Write Data Register */ +#define LAN87XX_EXT_REG_WR_DATA (0x16) +/* Interrupt Source Register */ #define LAN87XX_INTERRUPT_SOURCE (0x18)
@@ -14,9 +26,160 @@#define LAN87XX_MASK_LINK_UP (0x0004)#define LAN87XX_MASK_LINK_DOWN (0x0002) +/* phyaccess nested types */ +#define PHYACC_ATTR_MODE_READ 0 +#define PHYACC_ATTR_MODE_WRITE 1 +#define PHYACC_ATTR_MODE_MODIFY 2 + +#define PHYACC_ATTR_BANK_SMI 0 +#define PHYACC_ATTR_BANK_MISC 1 +#define PHYACC_ATTR_BANK_PCS 2 +#define PHYACC_ATTR_BANK_AFE 3 +#define PHYACC_ATTR_BANK_MAX 7 +#define DRIVER_AUTHOR "Nisar Sayed <[email protected]>"#define DRIVER_DESC "Microchip LAN87XX T1 PHY driver" +struct access_ereg_val { +u8 mode; +u8 bank; +u8 offset; +u16 val; +u16 mask; +}; + +static int access_ereg (struct phy_device *phydev,u8 mode,u8 bank, +u8 offset,u16 val) +{ +u16 ereg =0 ; +int rc =0 ; + +if (mode >PHYACC_ATTR_MODE_WRITE || bank >PHYACC_ATTR_BANK_MAX ) +return -EINVAL ; + +if (bank ==PHYACC_ATTR_BANK_SMI ) { +if (mode ==PHYACC_ATTR_MODE_WRITE ) + rc =phy_write (phydev, offset, val); +else + rc =phy_read (phydev, offset); +return rc; + } + +if (mode ==PHYACC_ATTR_MODE_WRITE ) { + ereg =LAN87XX_EXT_REG_CTL_WR_CTL ; + rc =phy_write (phydev,LAN87XX_EXT_REG_WR_DATA , val); +if (rc <0 ) +return rc; + }else { + ereg =LAN87XX_EXT_REG_CTL_RD_CTL ; + } + + ereg |= (bank <<8 ) | offset; + + rc =phy_write (phydev,LAN87XX_EXT_REG_CTL , ereg); +if (rc <0 ) +return rc; + +if (mode ==PHYACC_ATTR_MODE_READ ) + rc =phy_read (phydev,LAN87XX_EXT_REG_RD_DATA ); + +return rc; +} + +static int access_ereg_modify_changed (struct phy_device *phydev, +u8 bank,u8 offset,u16 val,u16 mask) +{ +int new =0 , rc =0 ; + +if (bank >PHYACC_ATTR_BANK_MAX ) +return -EINVAL ; + + rc =access_ereg (phydev,PHYACC_ATTR_MODE_READ , bank, offset, val); +if (rc <0 ) +return rc; + + new = val | (rc & (mask ^0xFFFF )); + rc =access_ereg (phydev,PHYACC_ATTR_MODE_WRITE , bank, offset, new); + +return rc; +} + +static int lan87xx_phy_init (struct phy_device *phydev) +{ +static const struct access_ereg_val init[] = { +/* TX Amplitude = 5 */ + {PHYACC_ATTR_MODE_MODIFY ,PHYACC_ATTR_BANK_AFE ,0x0B , +0x000A ,0x001E }, +/* Clear SMI interrupts */ + {PHYACC_ATTR_MODE_READ ,PHYACC_ATTR_BANK_SMI ,0x18 , +0 ,0 }, +/* Clear MISC interrupts */ + {PHYACC_ATTR_MODE_READ ,PHYACC_ATTR_BANK_MISC ,0x08 , +0 ,0 }, +/* Turn on TC10 Ring Oscillator (ROSC) */ + {PHYACC_ATTR_MODE_MODIFY ,PHYACC_ATTR_BANK_MISC ,0x20 , +0x0020 ,0x0020 }, +/* WUR Detect Length to 1.2uS, LPC Detect Length to 1.09uS */ + {PHYACC_ATTR_MODE_WRITE ,PHYACC_ATTR_BANK_PCS ,0x20 , +0x283C ,0 }, +/* Wake_In Debounce Length to 39uS, Wake_Out Length to 79uS */ + {PHYACC_ATTR_MODE_WRITE ,PHYACC_ATTR_BANK_MISC ,0x21 , +0x274F ,0 }, +/* Enable Auto Wake Forward to Wake_Out, ROSC on, Sleep, +* and Wake_In to wake PHY +*/ + {PHYACC_ATTR_MODE_WRITE ,PHYACC_ATTR_BANK_MISC ,0x20 , +0x80A7 ,0 }, +/* Enable WUP Auto Fwd, Enable Wake on MDI, Wakeup Debouncer +* to 128 uS +*/ + {PHYACC_ATTR_MODE_WRITE ,PHYACC_ATTR_BANK_MISC ,0x24 , +0xF110 ,0 }, +/* Enable HW Init */ + {PHYACC_ATTR_MODE_MODIFY ,PHYACC_ATTR_BANK_SMI ,0x1A , +0x0100 ,0x0100 }, + }; +int rc, i; + +/* Start manual initialization procedures in Managed Mode */ + rc =access_ereg_modify_changed (phydev,PHYACC_ATTR_BANK_SMI , +0x1a ,0x0000 ,0x0100 ); +if (rc <0 ) +return rc; + +/* Soft Reset the SMI block */ + rc =access_ereg_modify_changed (phydev,PHYACC_ATTR_BANK_SMI , +0x00 ,0x8000 ,0x8000 ); +if (rc <0 ) +return rc; + +/* Check to see if the self-clearing bit is cleared */ +usleep_range (1000 ,2000 ); + rc =access_ereg (phydev,PHYACC_ATTR_MODE_READ , +PHYACC_ATTR_BANK_SMI ,0x00 ,0 ); +if (rc <0 ) +return rc; +if ((rc &0x8000 ) !=0 ) +return -ETIMEDOUT ; + +/* PHY Initialization */ +for (i =0 ; i <ARRAY_SIZE (init); i++) { +if (init[i].mode ==PHYACC_ATTR_MODE_MODIFY ) { + rc =access_ereg_modify_changed (phydev, init[i].bank, + init[i].offset, + init[i].val, + init[i].mask); + }else { + rc =access_ereg (phydev, init[i].mode, init[i].bank, + init[i].offset, init[i].val); + } +if (rc <0 ) +return rc; + } + +return 0 ; +} +static int lan87xx_phy_config_intr (struct phy_device *phydev) {int rc, val =0 ;
@@ -40,6 +203,13 @@ static int lan87xx_phy_ack_interrupt(struct phy_device *phydev)return rc <0 ? rc :0 ; } +static int lan87xx_config_init (struct phy_device *phydev) +{ +int rc =lan87xx_phy_init (phydev); + +return rc <0 ? rc :0 ; +} +static struct phy_driver microchip_t1_phy_driver[] = { { .phy_id =0x0007c150 ,
@@ -48,6 +218,7 @@ static struct phy_driver microchip_t1_phy_driver[] = { .features = PHY_BASIC_T1_FEATURES, + .config_init = lan87xx_config_init, .config_aneg = genphy_config_aneg, .ack_interrupt = lan87xx_phy_ack_interrupt,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 4/147 KVM: arm: vgic: Synchronize the whole guest on GIC{D,R}_I{S,C}ACTIVER read
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
[ Upstream commit 9a50ebbffa9862db7604345f5fd763122b0f6fed ]
When a guest tries to read the active state of its interrupts, we currently just return whatever state we have in memory. This means that if such an interrupt lives in a List Register on another CPU, we fail to obsertve the latest active state for this interrupt.
In order to remedy this, stop all the other vcpus so that they exit and we can observe the most recent value for the state. This is similar to what we are doing for the write side of the same registers, and results in new MMIO handlers for userspace (which do not need to stop the guest, as it is supposed to be stopped already).
--- virt/kvm/arm/vgic/vgic-mmio-v2.c | 4 +- virt/kvm/arm/vgic/vgic-mmio-v3.c | 12 ++-- virt/kvm/arm/vgic/vgic-mmio.c | 100 ++++++++++++++++++++----------- virt/kvm/arm/vgic/vgic-mmio.h | 3 + 4 files changed, 75 insertions(+), 44 deletions(-)
virt/kvm/arm/vgic/vgic-mmio-v2.c +2 -2
@@ -422,11 +422,11 @@ static const struct vgic_register_region vgic_v2_dist_registers[] = { VGIC_ACCESS_32bit),REGISTER_DESC_WITH_BITS_PER_IRQ (GIC_DIST_ACTIVE_SET , vgic_mmio_read_active, vgic_mmio_write_sactive, -NULL , vgic_mmio_uaccess_write_sactive,1 , + vgic_uaccess_read_active, vgic_mmio_uaccess_write_sactive,1 , VGIC_ACCESS_32bit),REGISTER_DESC_WITH_BITS_PER_IRQ (GIC_DIST_ACTIVE_CLEAR , vgic_mmio_read_active, vgic_mmio_write_cactive, -NULL , vgic_mmio_uaccess_write_cactive,1 , + vgic_uaccess_read_active, vgic_mmio_uaccess_write_cactive,1 , VGIC_ACCESS_32bit), REGISTER_DESC_WITH_BITS_PER_IRQ(GIC_DIST_PRI, vgic_mmio_read_priority, vgic_mmio_write_priority, NULL, NULL,
virt/kvm/arm/vgic/vgic-mmio-v3.c +6 -6
@@ -491,11 +491,11 @@ static const struct vgic_register_region vgic_v3_dist_registers[] = { VGIC_ACCESS_32bit),REGISTER_DESC_WITH_BITS_PER_IRQ_SHARED (GICD_ISACTIVER , vgic_mmio_read_active, vgic_mmio_write_sactive, -NULL , vgic_mmio_uaccess_write_sactive,1 , + vgic_uaccess_read_active, vgic_mmio_uaccess_write_sactive,1 , VGIC_ACCESS_32bit),REGISTER_DESC_WITH_BITS_PER_IRQ_SHARED (GICD_ICACTIVER , vgic_mmio_read_active, vgic_mmio_write_cactive, -NULL , vgic_mmio_uaccess_write_cactive, + vgic_uaccess_read_active, vgic_mmio_uaccess_write_cactive,1 , VGIC_ACCESS_32bit), REGISTER_DESC_WITH_BITS_PER_IRQ_SHARED(GICD_IPRIORITYR, vgic_mmio_read_priority, vgic_mmio_write_priority, NULL, NULL,
@@ -563,12 +563,12 @@ static const struct vgic_register_region vgic_v3_rd_registers[] = { VGIC_ACCESS_32bit),REGISTER_DESC_WITH_LENGTH_UACCESS (SZ_64K +GICR_ISACTIVER0 , vgic_mmio_read_active, vgic_mmio_write_sactive, -NULL , vgic_mmio_uaccess_write_sactive, -4 , VGIC_ACCESS_32bit), + vgic_uaccess_read_active, vgic_mmio_uaccess_write_sactive,4 , + VGIC_ACCESS_32bit),REGISTER_DESC_WITH_LENGTH_UACCESS (SZ_64K +GICR_ICACTIVER0 , vgic_mmio_read_active, vgic_mmio_write_cactive, -NULL , vgic_mmio_uaccess_write_cactive, -4 , VGIC_ACCESS_32bit), + vgic_uaccess_read_active, vgic_mmio_uaccess_write_cactive,4 , + VGIC_ACCESS_32bit),REGISTER_DESC_WITH_LENGTH (SZ_64K +GICR_IPRIORITYR0 , vgic_mmio_read_priority, vgic_mmio_write_priority,32 , VGIC_ACCESS_32bit | VGIC_ACCESS_8bit),
virt/kvm/arm/vgic/vgic-mmio.c +64 -36
142 lines not on this page · raw message
virt/kvm/arm/vgic/vgic-mmio.h +3 -0
@@ -157,6 +157,9 @@ void vgic_mmio_write_cpending(struct kvm_vcpu *vcpu,unsigned long vgic_mmio_read_active (struct kvm_vcpu *vcpu,gpa_t addr,unsigned int len); +unsigned long vgic_uaccess_read_active (struct kvm_vcpu *vcpu, +gpa_t addr,unsigned int len); +void vgic_mmio_write_cactive (struct kvm_vcpu *vcpu,gpa_t addr,unsigned int len,unsigned long val);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 5/147 gpio: pca953x: Fix pca953x_gpio_set_config
In reply to Greg Kroah-HartmanFrom: Adam Ford <[email protected]>
[ Upstream commit dc87f6dd058a648cd2a35e4aa04592dccdc9f0c2 ]
pca953x_gpio_set_config is setup to support pull-up/down bias. Currently the driver uses a variable called 'config' to determine which options to use. Unfortunately, this is incorrect.
This patch uses function pinconf_to_config_param(config), which converts this 'config' parameter back to pinconfig to determine which option to use.
--- drivers/gpio/gpio-pca953x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpio/gpio-pca953x.c +1 -1
@@ -528,7 +528,7 @@ static int pca953x_gpio_set_config(struct gpio_chip *gc, unsigned int offset, {struct pca953x_chip *chip =gpiochip_get_data (gc); -switch (config) { +switch (pinconf_to_config_param (config)) {case PIN_CONFIG_BIAS_PULL_UP :case PIN_CONFIG_BIAS_PULL_DOWN :return pca953x_gpio_set_pull_up_down (chip, offset, config);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 6/147 SUNRPC: Add "@len" parameter to gss_unwrap()
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit 31c9590ae468478fe47dc0f5f0d3562b2f69450e ]
Refactor: This is a pre-requisite to fixing the client-side ralign computation in gss_unwrap_resp_priv().
The length value is passed in explicitly rather that as the value of buf->len. This will subsequently allow gss_unwrap_kerberos_v1() to compute a slack and align value, instead of computing it in gss_unwrap_resp_priv().
--- include/linux/sunrpc/gss_api.h | 2 ++ include/linux/sunrpc/gss_krb5.h | 6 +++--- net/sunrpc/auth_gss/auth_gss.c | 4 ++-- net/sunrpc/auth_gss/gss_krb5_crypto.c | 8 ++++---- net/sunrpc/auth_gss/gss_krb5_wrap.c | 26 +++++++++++++++----------- net/sunrpc/auth_gss/gss_mech_switch.c | 3 ++- net/sunrpc/auth_gss/svcauth_gss.c | 8 ++------ 7 files changed, 30 insertions(+), 27 deletions(-)
include/linux/sunrpc/gss_api.h +2 -0
@@ -67,6 +67,7 @@ u32 gss_wrap(u32 gss_unwrap (struct gss_ctx *ctx_id,int offset, +int len,struct xdr_buf *inbuf);u32 gss_delete_sec_context (struct gss_ctx **ctx_id);
@@ -127,6 +128,7 @@ struct gss_api_ops {u32 (*gss_unwrap)(struct gss_ctx *ctx_id,int offset, +int len,struct xdr_buf *buf);void (*gss_delete_sec_context)(void *internal_ctx_id);
include/linux/sunrpc/gss_krb5.h +3 -3
@@ -83,7 +83,7 @@ struct gss_krb5_enctype {u32 (*encrypt_v2) (struct krb5_ctx *kctx,u32 offset,struct xdr_buf *buf,struct page **pages);/* v2 encryption function */ -u32 (*decrypt_v2) (struct krb5_ctx *kctx,u32 offset, +u32 (*decrypt_v2) (struct krb5_ctx *kctx,u32 offset,u32 len,struct xdr_buf *buf,u32 *headskip,u32 *tailskip);/* v2 decryption function */ };
@@ -255,7 +255,7 @@ gss_wrap_kerberos(struct gss_ctx *ctx_id, int offset, struct xdr_buf *outbuf, struct page **pages);u32 -gss_unwrap_kerberos (struct gss_ctx *ctx_id,int offset, +gss_unwrap_kerberos (struct gss_ctx *ctx_id,int offset,int len,struct xdr_buf *buf);
@@ -312,7 +312,7 @@ gss_krb5_aes_encrypt(struct krb5_ctx *kctx, u32 offset, struct page **pages);u32 -gss_krb5_aes_decrypt (struct krb5_ctx *kctx,u32 offset, +gss_krb5_aes_decrypt (struct krb5_ctx *kctx,u32 offset,u32 len,struct xdr_buf *buf,u32 *plainoffset,u32 *plainlen);
net/sunrpc/auth_gss/auth_gss.c +2 -2
@@ -2041,9 +2041,9 @@ gss_unwrap_resp_priv(struct rpc_task *task, struct rpc_cred *cred, offset = (u8 *)(p) - (u8 *)head->iov_base;if (offset + opaque_len > rcv_buf->len) goto unwrap_failed; - rcv_buf->len = offset + opaque_len; - maj_stat =gss_unwrap (ctx->gc_gss_ctx, offset, rcv_buf); + maj_stat =gss_unwrap (ctx->gc_gss_ctx, offset, + offset + opaque_len, rcv_buf);if (maj_stat ==GSS_S_CONTEXT_EXPIRED )clear_bit (RPCAUTH_CRED_UPTODATE , &cred->cr_flags);if (maj_stat !=GSS_S_COMPLETE )
net/sunrpc/auth_gss/gss_krb5_crypto.c +4 -4
@@ -851,8 +851,8 @@ gss_krb5_aes_encrypt(struct krb5_ctx *kctx, u32 offset, }u32 -gss_krb5_aes_decrypt (struct krb5_ctx *kctx,u32 offset,struct xdr_buf *buf, -u32 *headskip,u32 *tailskip) +gss_krb5_aes_decrypt (struct krb5_ctx *kctx,u32 offset,u32 len, +struct xdr_buf *buf,u32 *headskip,u32 *tailskip) {struct xdr_buf subbuf;u32 ret =0 ;
@@ -881,7 +881,7 @@ gss_krb5_aes_decrypt(struct krb5_ctx *kctx, u32 offset, struct xdr_buf *buf,/* create a segment skipping the header and leaving out the checksum */ xdr_buf_subsegment (buf, &subbuf, offset +GSS_KRB5_TOK_HDR_LEN , - (buf->len - offset -GSS_KRB5_TOK_HDR_LEN - + (len - offset -GSS_KRB5_TOK_HDR_LEN - kctx->gk5e->cksumlength)); nblocks = (subbuf.len + blocksize -1 ) / blocksize;
@@ -926,7 +926,7 @@ gss_krb5_aes_decrypt(struct krb5_ctx *kctx, u32 offset, struct xdr_buf *buf, goto out_err;/* Get the packet's hmac value */ - ret =read_bytes_from_xdr_buf (buf, buf->len - kctx->gk5e->cksumlength, + ret =read_bytes_from_xdr_buf (buf, len - kctx->gk5e->cksumlength, pkt_hmac, kctx->gk5e->cksumlength);if (ret) goto out_err;
net/sunrpc/auth_gss/gss_krb5_wrap.c +15 -11
@@ -261,7 +261,8 @@ gss_wrap_kerberos_v1(struct krb5_ctx *kctx, int offset, }static u32 -gss_unwrap_kerberos_v1 (struct krb5_ctx *kctx,int offset,struct xdr_buf *buf) +gss_unwrap_kerberos_v1 (struct krb5_ctx *kctx,int offset,int len, +struct xdr_buf *buf) {int signalg;int sealalg;
@@ -284,7 +285,7 @@ gss_unwrap_kerberos_v1(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf) ptr = (u8 *)buf->head[0 ].iov_base + offset;if (g_verify_token_header (&kctx->mech_used, &bodysize, &ptr, - buf->len - offset)) + len - offset))return GSS_S_DEFECTIVE_TOKEN ; if ((ptr[0] != ((KG_TOK_WRAP_MSG >> 8) & 0xff)) ||
@@ -324,6 +325,7 @@ gss_unwrap_kerberos_v1(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf) (!kctx->initiate && direction != 0))return GSS_S_BAD_SIG ; + buf->len = len;if (kctx->enctype ==ENCTYPE_ARCFOUR_HMAC ) {struct crypto_sync_skcipher *cipher;int err;
@@ -376,7 +378,7 @@ gss_unwrap_kerberos_v1(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf) data_len = (buf->head[0 ].iov_base + buf->head[0 ].iov_len) - data_start;memmove (orig_start, data_start, data_len); buf->head[0 ].iov_len -= (data_start - orig_start); - buf->len -= (data_start - orig_start); + buf->len = len - (data_start - orig_start);if (gss_krb5_remove_padding (buf, blocksize))return GSS_S_DEFECTIVE_TOKEN ;
@@ -486,7 +488,8 @@ gss_wrap_kerberos_v2(struct krb5_ctx *kctx, u32 offset, }static u32 -gss_unwrap_kerberos_v2 (struct krb5_ctx *kctx,int offset,struct xdr_buf *buf) +gss_unwrap_kerberos_v2 (struct krb5_ctx *kctx,int offset,int len, +struct xdr_buf *buf) {s32 now;u8 *ptr;
@@ -532,7 +535,7 @@ gss_unwrap_kerberos_v2(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf)if (rrc !=0 )rotate_left (offset +16 , buf, rrc); - err = (*kctx->gk5e->decrypt_v2)(kctx, offset, buf, + err = (*kctx->gk5e->decrypt_v2)(kctx, offset, len, buf, &headskip, &tailskip);if (err)return GSS_S_FAILURE ;
@@ -542,7 +545,7 @@ gss_unwrap_kerberos_v2(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf)* it against the original */ err =read_bytes_from_xdr_buf (buf, - buf->len -GSS_KRB5_TOK_HDR_LEN - tailskip, + len -GSS_KRB5_TOK_HDR_LEN - tailskip, decrypted_hdr,GSS_KRB5_TOK_HDR_LEN );if (err) {dprintk ("%s: error %u getting decrypted_hdr\n" , __func__, err);
@@ -568,14 +571,14 @@ gss_unwrap_kerberos_v2(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf)* Note that buf->head[0].iov_len may indicate the available * head buffer space rather than that actually occupied. */ - movelen = min_t(unsigned int, buf->head[0].iov_len, buf->len); + movelen = min_t(unsigned int, buf->head[0].iov_len, len); movelen -= offset +GSS_KRB5_TOK_HDR_LEN + headskip;if (offset +GSS_KRB5_TOK_HDR_LEN + headskip + movelen > buf->head[0 ].iov_len)return GSS_S_FAILURE ;memmove (ptr, ptr +GSS_KRB5_TOK_HDR_LEN + headskip, movelen); buf->head[0 ].iov_len -=GSS_KRB5_TOK_HDR_LEN + headskip; - buf->len -=GSS_KRB5_TOK_HDR_LEN + headskip; + buf->len = len -GSS_KRB5_TOK_HDR_LEN + headskip;/* Trim off the trailing "extra count" and checksum blob */ buf->len -= ec +GSS_KRB5_TOK_HDR_LEN + tailskip;
@@ -603,7 +606,8 @@ gss_wrap_kerberos(struct gss_ctx *gctx, int offset, }u32 -gss_unwrap_kerberos (struct gss_ctx *gctx,int offset,struct xdr_buf *buf) +gss_unwrap_kerberos (struct gss_ctx *gctx,int offset, +int len,struct xdr_buf *buf) {struct krb5_ctx *kctx = gctx->internal_ctx_id;
@@ -613,9 +617,9 @@ gss_unwrap_kerberos(struct gss_ctx *gctx, int offset, struct xdr_buf *buf)case ENCTYPE_DES_CBC_RAW :case ENCTYPE_DES3_CBC_RAW :case ENCTYPE_ARCFOUR_HMAC : -return gss_unwrap_kerberos_v1 (kctx, offset, buf); +return gss_unwrap_kerberos_v1 (kctx, offset, len, buf);case ENCTYPE_AES128_CTS_HMAC_SHA1_96 :case ENCTYPE_AES256_CTS_HMAC_SHA1_96 : -return gss_unwrap_kerberos_v2 (kctx, offset, buf); +return gss_unwrap_kerberos_v2 (kctx, offset, len, buf); } }
net/sunrpc/auth_gss/gss_mech_switch.c +2 -1
@@ -438,10 +438,11 @@ gss_wrap(struct gss_ctx *ctx_id,u32 gss_unwrap (struct gss_ctx *ctx_id,int offset, +int len,struct xdr_buf *buf) {return ctx_id->mech_type->gm_ops - ->gss_unwrap (ctx_id, offset, buf); + ->gss_unwrap (ctx_id, offset, len, buf); }
net/sunrpc/auth_gss/svcauth_gss.c +2 -6
@@ -925,7 +925,7 @@ static int unwrap_priv_data(struct svc_rqst *rqstp, struct xdr_buf *buf, u32 seq, struct gss_ctx *ctx) { u32 priv_len, maj_stat; -int pad, saved_len, remaining_len, offset; +int pad, remaining_len, offset;clear_bit (RQ_SPLICE_OK , &rqstp->rq_flags);
@@ -945,12 +945,8 @@ unwrap_priv_data(struct svc_rqst *rqstp, struct xdr_buf *buf, u32 seq, struct gs buf->len -= pad;fix_priv_head (buf, pad); -/* Maybe it would be better to give gss_unwrap a length parameter: */ - saved_len = buf->len; - buf->len = priv_len; - maj_stat =gss_unwrap (ctx,0 , buf); + maj_stat =gss_unwrap (ctx,0 , priv_len, buf); pad = priv_len - buf->len; - buf->len = saved_len; buf->len -= pad;/* The upper layers assume the buffer is aligned on 4-byte boundaries. * In the krb5p case, at least, the data ends up offset, so we need to
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 7/147 SUNRPC: Fix GSS privacy computation of auth->au_ralign
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit a7e429a6fa6d612d1dacde96c885dc1bb4a9f400 ]
When the au_ralign field was added to gss_unwrap_resp_priv, the wrong calculation was used. Setting au_rslack == au_ralign is probably correct for kerberos_v1 privacy, but kerberos_v2 privacy adds additional GSS data after the clear text RPC message. au_ralign needs to be smaller than au_rslack in that fairly common case.
When xdr_buf_trim() is restored to gss_unwrap_kerberos_v2(), it does exactly what I feared it would: it trims off part of the clear text RPC message. However, that's because rpc_prepare_reply_pages() does not set up the rq_rcv_buf's tail correctly because au_ralign is too large.
Fixing the au_ralign computation also corrects the alignment of rq_rcv_buf->pages so that the client does not have to shift reply data payloads after they are received.
--- include/linux/sunrpc/gss_api.h | 1 + net/sunrpc/auth_gss/auth_gss.c | 8 +++----- net/sunrpc/auth_gss/gss_krb5_wrap.c | 19 +++++++++++++++---- 3 files changed, 19 insertions(+), 9 deletions(-)
include/linux/sunrpc/gss_api.h +1 -0
@@ -22,6 +22,7 @@struct gss_ctx {struct gss_api_mech *mech_type;void *internal_ctx_id; +unsigned int slack, align; };#define GSS_C_NO_BUFFER ((struct xdr_netobj) 0)
net/sunrpc/auth_gss/auth_gss.c +3 -5
@@ -2030,7 +2030,6 @@ gss_unwrap_resp_priv(struct rpc_task *task, struct rpc_cred *cred,struct xdr_buf *rcv_buf = &rqstp->rq_rcv_buf;struct kvec *head = rqstp->rq_rcv_buf.head;struct rpc_auth *auth = cred->cr_auth; -unsigned int savedlen = rcv_buf->len;u32 offset, opaque_len, maj_stat;__be32 *p;
@@ -2057,10 +2056,9 @@ gss_unwrap_resp_priv(struct rpc_task *task, struct rpc_cred *cred,*/ xdr_init_decode (xdr, rcv_buf, p, rqstp); - auth->au_rslack = auth->au_verfsize +2 + -XDR_QUADLEN (savedlen - rcv_buf->len); - auth->au_ralign = auth->au_verfsize +2 + -XDR_QUADLEN (savedlen - rcv_buf->len); + auth->au_rslack = auth->au_verfsize +2 + ctx->gc_gss_ctx->slack; + auth->au_ralign = auth->au_verfsize +2 + ctx->gc_gss_ctx->align; +return 0 ; unwrap_failed:trace_rpcgss_unwrap_failed (task);
net/sunrpc/auth_gss/gss_krb5_wrap.c +15 -4
@@ -262,7 +262,8 @@ gss_wrap_kerberos_v1(struct krb5_ctx *kctx, int offset,static u32 gss_unwrap_kerberos_v1 (struct krb5_ctx *kctx,int offset,int len, -struct xdr_buf *buf) +struct xdr_buf *buf,unsigned int *slack, +unsigned int *align) {int signalg;int sealalg;
@@ -280,6 +281,7 @@ gss_unwrap_kerberos_v1(struct krb5_ctx *kctx, int offset, int len,u32 conflen = kctx->gk5e->conflen;int crypt_offset;u8 *cksumkey; +unsigned int saved_len = buf->len;dprintk ("RPC: gss_unwrap_kerberos\n" );
@@ -383,6 +385,10 @@ gss_unwrap_kerberos_v1(struct krb5_ctx *kctx, int offset, int len,if (gss_krb5_remove_padding (buf, blocksize))return GSS_S_DEFECTIVE_TOKEN ; +/* slack must include room for krb5 padding */ + *slack =XDR_QUADLEN (saved_len - buf->len); +/* The GSS blob always precedes the RPC message payload */ + *align = *slack;return GSS_S_COMPLETE ; }
@@ -489,7 +495,8 @@ gss_wrap_kerberos_v2(struct krb5_ctx *kctx, u32 offset,static u32 gss_unwrap_kerberos_v2 (struct krb5_ctx *kctx,int offset,int len, -struct xdr_buf *buf) +struct xdr_buf *buf,unsigned int *slack, +unsigned int *align) {s32 now;u8 *ptr;
@@ -583,6 +590,8 @@ gss_unwrap_kerberos_v2(struct krb5_ctx *kctx, int offset, int len,/* Trim off the trailing "extra count" and checksum blob */ buf->len -= ec +GSS_KRB5_TOK_HDR_LEN + tailskip; + *align =XDR_QUADLEN (GSS_KRB5_TOK_HDR_LEN + headskip); + *slack = *align +XDR_QUADLEN (ec +GSS_KRB5_TOK_HDR_LEN + tailskip);return GSS_S_COMPLETE ; }
@@ -617,9 +626,11 @@ gss_unwrap_kerberos(struct gss_ctx *gctx, int offset,case ENCTYPE_DES_CBC_RAW :case ENCTYPE_DES3_CBC_RAW :case ENCTYPE_ARCFOUR_HMAC : -return gss_unwrap_kerberos_v1 (kctx, offset, len, buf); +return gss_unwrap_kerberos_v1 (kctx, offset, len, buf, + &gctx->slack, &gctx->align);case ENCTYPE_AES128_CTS_HMAC_SHA1_96 :case ENCTYPE_AES256_CTS_HMAC_SHA1_96 : -return gss_unwrap_kerberos_v2 (kctx, offset, len, buf); +return gss_unwrap_kerberos_v2 (kctx, offset, len, buf, + &gctx->slack, &gctx->align); } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 8/147 net/sonic: Fix a resource leak in an error handling path in jazz_sonic_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 10e3cc180e64385edc9890c6855acf5ed9ca1339 ]
A call to 'dma_alloc_coherent()' is hidden in 'sonic_alloc_descriptors()', called from 'sonic_probe1()'.
This is correctly freed in the remove function, but not in the error handling path of the probe function.
Fix it and add the missing 'dma_free_coherent()' call.
While at it, rename a label in order to be slightly more informative.
--- drivers/net/ethernet/natsemi/jazzsonic.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/natsemi/jazzsonic.c +4 -2
@@ -235,11 +235,13 @@ static int jazz_sonic_probe(struct platform_device *pdev) err =register_netdev (dev);if (err) - goto out1; + goto undo_probe1;return 0 ; -out1: +undo_probe1: +dma_free_coherent (lp->device,SIZEOF_SONIC_DESC *SONIC_BUS_SCALE (lp->dma_bitmode), + lp->descriptors, lp->descriptors_laddr);release_mem_region (dev->base_addr,SONIC_MEM_SIZE ); out:free_netdev (dev);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 9/147 net: moxa: Fix a potential double free_irq()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit ee8d2267f0e39a1bfd95532da3a6405004114b27 ]
Should an irq requested with 'devm_request_irq' be released explicitly, it should be done by 'devm_free_irq()', not 'free_irq()'.
--- drivers/net/ethernet/moxa/moxart_ether.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/moxa/moxart_ether.c +1 -1
@@ -564,7 +564,7 @@ static int moxart_remove(struct platform_device *pdev)struct net_device *ndev =platform_get_drvdata (pdev);unregister_netdev (ndev); -free_irq (ndev->irq, ndev); +devm_free_irq (&pdev->dev, ndev->irq, ndev);moxart_mac_free_memory (ndev);free_netdev (ndev);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 10/147 ftrace/selftests: workaround cgroup RT scheduling issues
In reply to Greg Kroah-HartmanFrom: Alan Maguire <[email protected]>
[ Upstream commit 57c4cfd4a2eef8f94052bd7c0fce0981f74fb213 ]
wakeup_rt.tc and wakeup.tc tests in tracers/ subdirectory fail due to the chrt command returning:
chrt: failed to set pid 0's policy: Operation not permitted.
To work around this, temporarily disable grout RT scheduling during ftracetest execution. Restore original value on test run completion. With these changes in place, both tests consistently pass.
--- tools/testing/selftests/ftrace/ftracetest | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
tools/testing/selftests/ftrace/ftracetest +22 -0
@@ -29,8 +29,25 @@ err_ret=1 # kselftest skip code is 4 err_skip=4 +# cgroup RT scheduling prevents chrt commands from succeeding, which +# induces failures in test wakeup tests. Disable for the duration of +# the tests. + +readonly sched_rt_runtime=/proc/sys/kernel/sched_rt_runtime_us + +sched_rt_runtime_orig=$(cat $sched_rt_runtime) + +setup() { + echo -1 > $sched_rt_runtime +} + +cleanup() { + echo $sched_rt_runtime_orig > $sched_rt_runtime +} + errexit() { # message echo "Error: $1" 1>&2 + cleanup exit $err_ret }
@@ -39,6 +56,8 @@ if [ `id -u` -ne 0 ]; then errexit "this must be run by root user" fi +setup + # Utilities absdir() { # file_path (cd `dirname $1`; pwd)
@@ -235,6 +254,7 @@ TOTAL_RESULT=0 INSTANCE= CASENO=0 + testcase() { # testfile CASENO=$((CASENO+1)) desc=`grep "^#[ \t]*description:" $1 | cut -f2 -d:`
@@ -406,5 +426,7 @@ prlog "# of unsupported: " `echo $UNSUPPORTED_CASES | wc -w` prlog "# of xfailed: " `echo $XFAILED_CASES | wc -w` prlog "# of undefined(test bug): " `echo $UNDEFINED_CASES | wc -w` +cleanup + # if no error, return 0 exit $TOTAL_RESULT
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 11/147 drop_monitor: work around gcc-10 stringop-overflow warning
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit dc30b4059f6e2abf3712ab537c8718562b21c45d ]
The current gcc-10 snapshot produces a false-positive warning:
net/core/drop_monitor.c: In function 'trace_drop_common.constprop':
cc1: error: writing 8 bytes into a region of size 0 [-Werror=stringop-overflow=]
In file included from net/core/drop_monitor.c:23:include/uapi/linux/net_dropmon.h:36:8: note: at offset 0 to object 'entries' with size 4 declared here
36 | __u32 entries;
| ^~~~~~~I reported this in the gcc bugzilla, but in case it does not get fixed in the release, work around it by using a temporary variable.
--- net/core/drop_monitor.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
net/core/drop_monitor.c +7 -4
@@ -212,6 +212,7 @@ static void sched_send_work(struct timer_list *t)static void trace_drop_common (struct sk_buff *skb,void *location) {struct net_dm_alert_msg *msg; +struct net_dm_drop_point *point;struct nlmsghdr *nlh;struct nlattr *nla;int i;
@@ -230,11 +231,13 @@ static void trace_drop_common(struct sk_buff *skb, void *location) nlh = (struct nlmsghdr *)dskb->data; nla =genlmsg_data (nlmsg_data (nlh)); msg =nla_data (nla); + point = msg->points;for (i =0 ; i < msg->entries; i++) { -if (!memcmp (&location, msg->points[i].pc,sizeof (void *))) { - msg->points[i].count++; +if (!memcmp (&location, &point->pc,sizeof (void *))) { + point->count++; goto out; } + point++; }if (msg->entries == dm_hit_limit) goto out;
@@ -243,8 +246,8 @@ static void trace_drop_common(struct sk_buff *skb, void *location)*/ __nla_reserve_nohdr (dskb,sizeof (struct net_dm_drop_point )); nla->nla_len +=NLA_ALIGN (sizeof (struct net_dm_drop_point )); -memcpy (msg->points[msg->entries].pc, &location,sizeof (void *)); - msg->points[msg->entries].count =1 ; +memcpy (point->pc, &location,sizeof (void *)); + point->count =1 ; msg->entries++;if (!timer_pending (&data->send_timer)) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 12/147 virtio-blk: handle block_device_operations callbacks after hot unplug
In reply to Greg Kroah-HartmanFrom: Stefan Hajnoczi <[email protected]>
[ Upstream commit 90b5feb8c4bebc76c27fcaf3e1a0e5ca2d319e9e ]
A userspace process holding a file descriptor to a virtio_blk device can still invoke block_device_operations after hot unplug. This leads to a use-after-free accessing vblk->vdev in virtblk_getgeo() when ioctl(HDIO_GETGEO) is invoked:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000090 IP: [<ffffffffc00e5450>] virtio_check_driver_offered_feature+0x10/0x90 [virtio] PGD 800000003a92f067 PUD 3a930067 PMD 0 Oops: 0000 [#1] SMP CPU: 0 PID: 1310 Comm: hdio-getgeo Tainted: G OE ------------ 3.10.0-1062.el7.x86_64 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 task: ffff9be5fbfb8000 ti: ffff9be5fa890000 task.ti: ffff9be5fa890000 RIP: 0010:[<ffffffffc00e5450>] [<ffffffffc00e5450>] virtio_check_driver_offered_feature+0x10/0x90 [virtio] RSP: 0018:ffff9be5fa893dc8 EFLAGS: 00010246 RAX: ffff9be5fc3f3400 RBX: ffff9be5fa893e30 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000004 RDI: ffff9be5fbc10b40 RBP: ffff9be5fa893dc8 R08: 0000000000000301 R09: 0000000000000301 R10: 0000000000000000 R11: 0000000000000000 R12: ffff9be5fdc24680 R13: ffff9be5fbc10b40 R14: ffff9be5fbc10480 R15: 0000000000000000 FS: 00007f1bfb968740(0000) GS:ffff9be5ffc00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000090 CR3: 000000003a894000 CR4: 0000000000360ff0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: [<ffffffffc016ac37>] virtblk_getgeo+0x47/0x110 [virtio_blk] [<ffffffff8d3f200d>] ? handle_mm_fault+0x39d/0x9b0 [<ffffffff8d561265>] blkdev_ioctl+0x1f5/0xa20 [<ffffffff8d488771>] block_ioctl+0x41/0x50 [<ffffffff8d45d9e0>] do_vfs_ioctl+0x3a0/0x5a0 [<ffffffff8d45dc81>] SyS_ioctl+0xa1/0xc0
A related problem is that virtblk_remove() leaks the vd_index_ida index when something still holds a reference to vblk->disk during hot unplug. This causes virtio-blk device names to be lost (vda, vdb, etc).
Fix these issues by protecting vblk->vdev with a mutex and reference counting vblk so the vd_index_ida index can be removed in all cases.
--- drivers/block/virtio_blk.c | 86 ++++++++++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 8 deletions(-)
drivers/block/virtio_blk.c +78 -8
@@ -33,6 +33,15 @@ struct virtio_blk_vq { }____cacheline_aligned_in_smp ;struct virtio_blk { +/* +* This mutex must be held by anything that may run after +* virtblk_remove() sets vblk->vdev to NULL. +* +* blk-mq, virtqueue processing, and sysfs attribute code paths are +* shut down before vblk->vdev is set to NULL and therefore do not need +* to hold this mutex. +*/ +struct mutex vdev_mutex;struct virtio_device *vdev;/* The disk structure for the kernel. */
@@ -44,6 +53,13 @@ struct virtio_blk {/* Process context for config space updates */ struct work_struct config_work; +/* +* Tracks references from block_device_operations open/release and +* virtio_driver probe/remove so this object can be freed once no +* longer in use. +*/ +refcount_t refs; +/* What host tells us, plus 2 for header & tailer. */ unsigned int sg_elems;
@@ -388,10 +404,55 @@ static int virtblk_get_id(struct gendisk *disk, char *id_str)return err; } +static void virtblk_get (struct virtio_blk *vblk) +{ +refcount_inc (&vblk->refs); +} + +static void virtblk_put (struct virtio_blk *vblk) +{ +if (refcount_dec_and_test (&vblk->refs)) { +ida_simple_remove (&vd_index_ida, vblk->index); +mutex_destroy (&vblk->vdev_mutex); +kfree (vblk); + } +} + +static int virtblk_open (struct block_device *bd,fmode_t mode) +{ +struct virtio_blk *vblk = bd->bd_disk->private_data; +int ret =0 ; + +mutex_lock (&vblk->vdev_mutex); + +if (vblk->vdev) +virtblk_get (vblk); +else + ret = -ENXIO ; + +mutex_unlock (&vblk->vdev_mutex); +return ret; +} + +static void virtblk_release (struct gendisk *disk,fmode_t mode) +{ +struct virtio_blk *vblk = disk->private_data; + +virtblk_put (vblk); +} +/* We provide getgeo only to please some old bootloader/partitioning tools */ static int virtblk_getgeo (struct block_device *bd,struct hd_geometry *geo) {struct virtio_blk *vblk = bd->bd_disk->private_data; +int ret =0 ; + +mutex_lock (&vblk->vdev_mutex); + +if (!vblk->vdev) { + ret = -ENXIO ; + goto out; + }/* see if the host passed in geometry config */ if (virtio_has_feature (vblk->vdev,VIRTIO_BLK_F_GEOMETRY )) {
@@ -407,12 +468,16 @@ static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo) geo->sectors =1 <<5 ; geo->cylinders =get_capacity (bd->bd_disk) >>11 ; } -return 0 ; +out: +mutex_unlock (&vblk->vdev_mutex); +return ret; }static const struct block_device_operations virtblk_fops = { .ioctl = virtblk_ioctl, .owner =THIS_MODULE , + .open = virtblk_open, + .release = virtblk_release, .getgeo = virtblk_getgeo, };
@@ -767,6 +832,10 @@ static int virtblk_probe(struct virtio_device *vdev) goto out_free_index; } +/* This reference is dropped in virtblk_remove(). */ +refcount_set (&vblk->refs,1 ); +mutex_init (&vblk->vdev_mutex); + vblk->vdev = vdev; vblk->sg_elems = sg_elems;
@@ -932,8 +1001,6 @@ static int virtblk_probe(struct virtio_device *vdev)static void virtblk_remove (struct virtio_device *vdev) {struct virtio_blk *vblk = vdev->priv; -int index = vblk->index; -int refc;/* Make sure no work handler is accessing the device. */ flush_work (&vblk->config_work);
@@ -943,18 +1010,21 @@ static void virtblk_remove(struct virtio_device *vdev)blk_mq_free_tag_set (&vblk->tag_set); +mutex_lock (&vblk->vdev_mutex); +/* Stop all the virtqueues. */ vdev->config->reset (vdev); - refc =kref_read (&disk_to_dev (vblk->disk)->kobj.kref); +/* Virtqueues are stopped, nothing can use vblk->vdev anymore. */ + vblk->vdev =NULL ; +put_disk (vblk->disk); vdev->config->del_vqs (vdev);kfree (vblk->vqs); -kfree (vblk); -/* Only free device id if we don't have any users */ -if (refc ==1 ) -ida_simple_remove (&vd_index_ida, index); +mutex_unlock (&vblk->vdev_mutex); + +virtblk_put (vblk); }#ifdef CONFIG_PM_SLEEP
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 13/147 sun6i: dsi: fix gcc-4.8
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 3a3a71f97c30983f1627c2c550d43566e9b634d2 ]
Older compilers warn about initializers with incorrect curly braces:
drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c: In function 'sun6i_dsi_encoder_enable':drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c:720:8: error: missing braces around initializer [-Werror=missing-braces]
union phy_configure_opts opts = { 0 };
^drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c:720:8: error: (near initialization for 'opts.mipi_dphy') [-Werror=missing-braces]
Use the GNU empty initializer extension to avoid this.
--- drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c +1 -1
@@ -718,7 +718,7 @@ static void sun6i_dsi_encoder_enable(struct drm_encoder *encoder)struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;struct sun6i_dsi *dsi =encoder_to_sun6i_dsi (encoder);struct mipi_dsi_device *device = dsi->device; -union phy_configure_opts opts = {0 }; +union phy_configure_opts opts = { };struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy;u16 delay;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 14/147 net_sched: fix tcm_parent in tc filter dump
In reply to Greg Kroah-HartmanFrom: Cong Wang <[email protected]>
[ Upstream commit a7df4870d79b00742da6cc93ca2f336a71db77f7 ]
When we tell kernel to dump filters from root (ffff:ffff), those filters on ingress (ffff:0000) are matched, but their true parents must be dumped as they are. However, kernel dumps just whatever we tell it, that is either ffff:ffff or ffff:0000:
$ nl-cls-list --dev=dummy0 --parent=root cls basic dev dummy0 id none parent root prio 49152 protocol ip match-all cls basic dev dummy0 id :1 parent root prio 49152 protocol ip match-all $ nl-cls-list --dev=dummy0 --parent=ffff: cls basic dev dummy0 id none parent ffff: prio 49152 protocol ip match-all cls basic dev dummy0 id :1 parent ffff: prio 49152 protocol ip match-all
This is confusing and misleading, more importantly this is a regression since 4.15, so the old behavior must be restored.
And, when tc filters are installed on a tc class, the parent should be the classid, rather than the qdisc handle. Commit edf6711c9840 ("net: sched: remove classid and q fields from tcf_proto") removed the classid we save for filters, we can just restore this classid in tcf_block.
Steps to reproduce this:
ip li set dev dummy0 up
tc qd add dev dummy0 ingress
tc filter add dev dummy0 parent ffff: protocol arp basic action pass tc filter show dev dummy0 root
Before this patch:
filter protocol arp pref 49152 basic
filter protocol arp pref 49152 basic handle 0x1
action order 1: gact action pass
random type none pass val 0
index 1 ref 1 bind 1
After this patch:
filter parent ffff: protocol arp pref 49152 basic filter parent ffff: protocol arp pref 49152 basic handle 0x1
action order 1: gact action pass
random type none pass val 0
index 1 ref 1 bind 1
--- include/net/sch_generic.h | 1 + net/sched/cls_api.c | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-)
include/net/sch_generic.h +1 -0
@@ -407,6 +407,7 @@ struct tcf_block {struct mutex lock;struct list_head chain_list;u32 index;/* block index for shared blocks */ +u32 classid;/* which class this block belongs to */ refcount_t refcnt;struct net *net;struct Qdisc *q;
net/sched/cls_api.c +4 -4
@@ -2005,6 +2005,7 @@ static int tc_new_tfilter(struct sk_buff *skb, struct nlmsghdr *n, err =PTR_ERR (block); goto errout; } + block->classid = parent; chain_index = tca[TCA_CHAIN ] ?nla_get_u32 (tca[TCA_CHAIN ]) :0 ;if (chain_index >TC_ACT_EXT_VAL_MASK ) {
@@ -2547,12 +2548,10 @@ static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb)return skb->len; parent = tcm->tcm_parent; -if (!parent) { +if (!parent) q = dev->qdisc; - parent = q->handle; - }else { +else q =qdisc_lookup (dev,TC_H_MAJ (tcm->tcm_parent)); - }if (!q) goto out; cops = q->ops->cl_ops;
@@ -2568,6 +2567,7 @@ static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb) block = cops->tcf_block (q, cl,NULL );if (!block) goto out; + parent = block->classid;if (tcf_block_shared (block)) q =NULL ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 15/147 scsi: sg: add sg_remove_request in sg_write
In reply to Greg Kroah-HartmanFrom: Wu Bo <[email protected]>
commit 83c6f2390040f188cc25b270b4befeb5628c1aee upstream.
If the __copy_from_user function failed we need to call sg_remove_request in sg_write.
--- drivers/scsi/sg.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/sg.c +3 -1
@@ -689,8 +689,10 @@ sg_write(struct file *filp, const char _ hp->flags = input_size;/* structure abuse ... */ hp->pack_id = old_hdr.pack_id; hp->usr_ptr =NULL ; -if (__copy_from_user (cmnd, buf, cmd_size)) +if (__copy_from_user (cmnd, buf, cmd_size)) { +sg_remove_request (sfp, srp);return -EFAULT ; + }/* * SG_DXFER_TO_FROM_DEV is functionally equivalent to SG_DXFER_FROM_DEV, * but is is possible that the app intended SG_DXFER_TO_DEV, because there
Greg Kroah-Hartman
maintainerPATCH 16/147 selftests/bpf: fix goto cleanup label not defined
In reply to Greg Kroah-HartmanFrom: Hangbin Liu <[email protected]>
kernel test robot found a warning when build bpf selftest for 5.4.y stable tree:
prog_tests/stacktrace_build_id_nmi.c:55:3: error: label ‘cleanup’ used but not defined
goto cleanup;
^~~~
This is because we are lacking upstream commit dde53c1b763b ("selftests/bpf: Convert few more selftest to skeletons"). But this commit is too large and need more backports. To fix it, the easiest way is just use the current goto label 'close_prog'.
--- tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/prog_tests/stacktrace_build_id_nmi.c +1 -1
@@ -52,7 +52,7 @@ retry:if (pmu_fd <0 && errno ==ENOENT ) {printf ("%s:SKIP:no PERF_COUNT_HW_CPU_CYCLES\n" , __func__);test__skip (); - goto cleanup; + goto close_prog; }if (CHECK (pmu_fd <0 ,"perf_event_open" ,"err %d errno %d\n" , pmu_fd, errno))
Greg Kroah-Hartman
maintainerPATCH 17/147 mmc: sdhci-acpi: Add SDHCI_QUIRK2_BROKEN_64_BIT_DMA for AMDI0040
In reply to Greg Kroah-HartmanFrom: Raul E Rangel <[email protected]>
[ Upstream commit 45a3fe3bf93b7cfeddc28ef7386555e05dc57f06 ]
The AMD eMMC 5.0 controller does not support 64 bit DMA.
--- drivers/mmc/host/sdhci-acpi.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/mmc/host/sdhci-acpi.c +6 -4
@@ -602,10 +602,12 @@ static int sdhci_acpi_emmc_amd_probe_slot(struct platform_device *pdev, }static const struct sdhci_acpi_slot sdhci_acpi_slot_amd_emmc = { - .chip = &sdhci_acpi_chip_amd, - .caps =MMC_CAP_8_BIT_DATA |MMC_CAP_NONREMOVABLE , - .quirks =SDHCI_QUIRK_32BIT_DMA_ADDR |SDHCI_QUIRK_32BIT_DMA_SIZE | -SDHCI_QUIRK_32BIT_ADMA_SIZE , + .chip = &sdhci_acpi_chip_amd, + .caps =MMC_CAP_8_BIT_DATA |MMC_CAP_NONREMOVABLE , + .quirks =SDHCI_QUIRK_32BIT_DMA_ADDR | +SDHCI_QUIRK_32BIT_DMA_SIZE | +SDHCI_QUIRK_32BIT_ADMA_SIZE , + .quirks2 =SDHCI_QUIRK2_BROKEN_64_BIT_DMA , .probe_slot = sdhci_acpi_emmc_amd_probe_slot, };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 18/147 dpaa2-eth: properly handle buffer size restrictions
In reply to Greg Kroah-HartmanFrom: Ioana Ciornei <[email protected]>
[ Upstream commit efa6a7d07523ffbbf6503c1a7eeb52201c15c0e3 ]
Depending on the WRIOP version, the buffer size on the RX path must by a multiple of 64 or 256. Handle this restriction properly by aligning down the buffer size to the necessary value. Also, use the new buffer size dynamically computed instead of the compile time one.
--- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 29 +++++++++++++---------- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h | 1 2 files changed, 18 insertions(+), 12 deletions(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +17 -12
@@ -86,7 +86,7 @@ static void free_rx_fd(struct dpaa2_eth_for (i =1 ; i <DPAA2_ETH_MAX_SG_ENTRIES ; i++) { addr =dpaa2_sg_get_addr (&sgt[i]); sg_vaddr =dpaa2_iova_to_virt (priv->iommu_domain, addr); -dma_unmap_page (dev, addr,DPAA2_ETH_RX_BUF_SIZE , +dma_unmap_page (dev, addr, priv->rx_buf_size,DMA_BIDIRECTIONAL );free_pages ((unsigned long )sg_vaddr,0 );
@@ -144,7 +144,7 @@ static struct sk_buff *build_frag_skb(st/* Get the address and length from the S/G entry */ sg_addr =dpaa2_sg_get_addr (sge); sg_vaddr =dpaa2_iova_to_virt (priv->iommu_domain, sg_addr); -dma_unmap_page (dev, sg_addr,DPAA2_ETH_RX_BUF_SIZE , +dma_unmap_page (dev, sg_addr, priv->rx_buf_size,DMA_BIDIRECTIONAL ); sg_length =dpaa2_sg_get_len (sge);
@@ -185,7 +185,7 @@ static struct sk_buff *build_frag_skb(st (page_address (page) -page_address (head_page));skb_add_rx_frag (skb, i -1 , head_page, page_offset, - sg_length,DPAA2_ETH_RX_BUF_SIZE ); + sg_length, priv->rx_buf_size); }if (dpaa2_sg_is_final (sge))
@@ -211,7 +211,7 @@ static void free_bufs(struct dpaa2_eth_pfor (i =0 ; i < count; i++) { vaddr =dpaa2_iova_to_virt (priv->iommu_domain, buf_array[i]); -dma_unmap_page (dev, buf_array[i],DPAA2_ETH_RX_BUF_SIZE , +dma_unmap_page (dev, buf_array[i], priv->rx_buf_size,DMA_BIDIRECTIONAL );free_pages ((unsigned long )vaddr,0 ); }
@@ -331,7 +331,7 @@ static u32 run_xdp(struct dpaa2_eth_privbreak ;case XDP_REDIRECT :dma_unmap_page (priv->net_dev->dev.parent, addr, -DPAA2_ETH_RX_BUF_SIZE ,DMA_BIDIRECTIONAL ); + priv->rx_buf_size,DMA_BIDIRECTIONAL ); ch->buf_count--; xdp.data_hard_start = vaddr; err =xdp_do_redirect (priv->net_dev, &xdp, xdp_prog);
@@ -370,7 +370,7 @@ static void dpaa2_eth_rx(struct dpaa2_ettrace_dpaa2_rx_fd (priv->net_dev, fd); vaddr =dpaa2_iova_to_virt (priv->iommu_domain, addr); -dma_sync_single_for_cpu (dev, addr,DPAA2_ETH_RX_BUF_SIZE , +dma_sync_single_for_cpu (dev, addr, priv->rx_buf_size,DMA_BIDIRECTIONAL ); fas =dpaa2_get_fas (vaddr, false);
@@ -389,13 +389,13 @@ static void dpaa2_eth_rx(struct dpaa2_etreturn ; } -dma_unmap_page (dev, addr,DPAA2_ETH_RX_BUF_SIZE , +dma_unmap_page (dev, addr, priv->rx_buf_size,DMA_BIDIRECTIONAL ); skb =build_linear_skb (ch, fd, vaddr); }else if (fd_format == dpaa2_fd_sg) {WARN_ON (priv->xdp_prog); -dma_unmap_page (dev, addr,DPAA2_ETH_RX_BUF_SIZE , +dma_unmap_page (dev, addr, priv->rx_buf_size,DMA_BIDIRECTIONAL ); skb =build_frag_skb (priv, ch, buf_data);free_pages ((unsigned long )vaddr,0 );
@@ -963,7 +963,7 @@ static int add_bufs(struct dpaa2_eth_priif (!page) goto err_alloc; - addr =dma_map_page (dev, page,0 ,DPAA2_ETH_RX_BUF_SIZE , + addr =dma_map_page (dev, page,0 , priv->rx_buf_size,DMA_BIDIRECTIONAL );if (unlikely (dma_mapping_error (dev, addr))) goto err_map;
@@ -973,7 +973,7 @@ static int add_bufs(struct dpaa2_eth_pri/* tracing point */ trace_dpaa2_eth_buf_seed (priv->net_dev, page,DPAA2_ETH_RX_BUF_RAW_SIZE , - addr,DPAA2_ETH_RX_BUF_SIZE , + addr, priv->rx_buf_size, bpid); }
@@ -1680,7 +1680,7 @@ static bool xdp_mtu_valid(struct dpaa2_eint mfl, linear_mfl; mfl =DPAA2_ETH_L2_MAX_FRM (mtu); - linear_mfl =DPAA2_ETH_RX_BUF_SIZE -DPAA2_ETH_RX_HWA_SIZE - + linear_mfl = priv->rx_buf_size -DPAA2_ETH_RX_HWA_SIZE -dpaa2_eth_rx_head_room (priv) -XDP_PACKET_HEADROOM ;if (mfl > linear_mfl) {
@@ -2432,6 +2432,11 @@ static int set_buffer_layout(struct dpaaelse rx_buf_align =DPAA2_ETH_RX_BUF_ALIGN ; +/* We need to ensure that the buffer size seen by WRIOP is a multiple +* of 64 or 256 bytes depending on the WRIOP version. +*/ + priv->rx_buf_size =ALIGN_DOWN (DPAA2_ETH_RX_BUF_SIZE , rx_buf_align); +/* tx buffer */ buf_layout.private_data_size =DPAA2_ETH_SWA_SIZE ; buf_layout.pass_timestamp = true;
@@ -3096,7 +3101,7 @@ static int bind_dpni(struct dpaa2_eth_pr pools_params.num_dpbp =1 ; pools_params.pools[0 ].dpbp_id = priv->dpbp_dev->obj_desc.id; pools_params.pools[0 ].backup_pool =0 ; - pools_params.pools[0 ].buffer_size =DPAA2_ETH_RX_BUF_SIZE ; + pools_params.pools[0 ].buffer_size = priv->rx_buf_size; err =dpni_set_pools (priv->mc_io,0 , priv->mc_token, &pools_params);if (err) {dev_err (dev,"dpni_set_pools() failed\n" );
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h +1 -0
@@ -373,6 +373,7 @@ struct dpaa2_eth_priv {u16 tx_data_offset;struct fsl_mc_device *dpbp_dev; +u16 rx_buf_size;u16 bpid;struct iommu_domain *iommu_domain;
Greg Kroah-Hartman
maintainerPATCH 19/147 net: fix a potential recursive NETDEV_FEAT_CHANGE
In reply to Greg Kroah-HartmanFrom: Cong Wang <[email protected]>
[ Upstream commit dd912306ff008891c82cd9f63e8181e47a9cb2fb ]
syzbot managed to trigger a recursive NETDEV_FEAT_CHANGE event between bonding master and slave. I managed to find a reproducer for this:
ip li set bond0 up
ifenslave bond0 eth0
brctl addbr br0
ethtool -K eth0 lro off
brctl addif br0 bond0
ip li set br0 up
When a NETDEV_FEAT_CHANGE event is triggered on a bonding slave, it captures this and calls bond_compute_features() to fixup its master's and other slaves' features. However, when syncing with its lower devices by netdev_sync_lower_features() this event is triggered again on slaves when the LRO feature fails to change, so it goes back and forth recursively until the kernel stack is exhausted.
Commit 17b85d29e82c intentionally lets __netdev_update_features() return -1 for such a failure case, so we have to just rely on the existing check inside netdev_sync_lower_features() and skip NETDEV_FEAT_CHANGE event only for this specific failure case.
--- net/core/dev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/core/dev.c +3 -1
@@ -8595,11 +8595,13 @@ static void netdev_sync_lower_features(snetdev_dbg (upper,"Disabling feature %pNF on lower dev %s.\n" , &feature, lower->name); lower->wanted_features &= ~feature; -netdev_update_features (lower); +__netdev_update_features (lower);if (unlikely (lower->features & feature))netdev_WARN (upper,"failed to disable %pNF on %s!\n" , &feature, lower->name); +else +netdev_features_change (lower); } } }
Greg Kroah-Hartman
maintainerPATCH 20/147 netlabel: cope with NULL catmap
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit eead1c2ea2509fd754c6da893a94f0e69e83ebe4 ]
The cipso and calipso code can set the MLS_CAT attribute on successful parsing, even if the corresponding catmap has not been allocated, as per current configuration and external input.
Later, selinux code tries to access the catmap if the MLS_CAT flag is present via netlbl_catmap_getlong(). That may cause null ptr dereference while processing incoming network traffic.
Address the issue setting the MLS_CAT flag only if the catmap is really allocated. Additionally let netlbl_catmap_getlong() cope with NULL catmap.
--- net/ipv4/cipso_ipv4.c | 6 ++++-- net/ipv6/calipso.c | 3 ++- net/netlabel/netlabel_kapi.c | 6 ++++++ 3 files changed, 12 insertions(+), 3 deletions(-)
net/ipv4/cipso_ipv4.c +4 -2
@@ -1258,7 +1258,8 @@ static int cipso_v4_parsetag_rbm(const sreturn ret_val; } - secattr->flags |=NETLBL_SECATTR_MLS_CAT ; +if (secattr->attr.mls.cat) + secattr->flags |=NETLBL_SECATTR_MLS_CAT ; }return 0 ;
@@ -1439,7 +1440,8 @@ static int cipso_v4_parsetag_rng(const sreturn ret_val; } - secattr->flags |=NETLBL_SECATTR_MLS_CAT ; +if (secattr->attr.mls.cat) + secattr->flags |=NETLBL_SECATTR_MLS_CAT ; }return 0 ;
net/ipv6/calipso.c +2 -1
@@ -1047,7 +1047,8 @@ static int calipso_opt_getattr(const uns goto getattr_return; } - secattr->flags |=NETLBL_SECATTR_MLS_CAT ; +if (secattr->attr.mls.cat) + secattr->flags |=NETLBL_SECATTR_MLS_CAT ; } secattr->type =NETLBL_NLTYPE_CALIPSO ;
net/netlabel/netlabel_kapi.c +6 -0
@@ -734,6 +734,12 @@ int netlbl_catmap_getlong(struct netlbl_if ((off & (BITS_PER_LONG -1 )) !=0 )return -EINVAL ; +/* a null catmap is equivalent to an empty one */ +if (!catmap) { + *offset = (u32)-1 ; +return 0 ; + } +if (off < catmap->startbit) { off = catmap->startbit; *offset = off;
Greg Kroah-Hartman
maintainerPATCH 21/147 net: phy: fix aneg restart in phy_ethtool_set_eee
In reply to Greg Kroah-HartmanFrom: Heiner Kallweit <[email protected]>
[ Upstream commit 9de5d235b60a7cdfcdd5461e70c5663e713fde87 ]
phy_restart_aneg() enables aneg in the PHY. That's not what we want if phydev->autoneg is disabled. In this case still update EEE advertisement register, but don't enable aneg and don't trigger an aneg restart.
--- drivers/net/phy/phy.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/phy/phy.c +5 -3
@@ -1160,9 +1160,11 @@ int phy_ethtool_set_eee(struct phy_devic/* Restart autonegotiation so the new modes get sent to the * link partner. */ - ret =phy_restart_aneg (phydev); -if (ret <0 ) -return ret; +if (phydev->autoneg ==AUTONEG_ENABLE ) { + ret =phy_restart_aneg (phydev); +if (ret <0 ) +return ret; + } }return 0 ;
Greg Kroah-Hartman
maintainerPATCH 22/147 net: stmmac: fix num_por initialization
In reply to Greg Kroah-HartmanFrom: Vinod Koul <[email protected]>
[ Upstream commit fd4a5177382230d39e0d95632d98103fb2938383 ]
Driver missed initializing num_por which is one of the por values that driver configures to hardware. In order to get these values, add a new structure ethqos_emac_driver_data which holds por and num_por values and populate that in driver probe.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c | 17 ++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c +15 -2
@@ -75,6 +75,11 @@ struct ethqos_emac_por {unsigned int value; }; +struct ethqos_emac_driver_data { +const struct ethqos_emac_por *por; +unsigned int num_por; +}; +struct qcom_ethqos {struct platform_device *pdev;void __iomem *rgmii_base;
@@ -171,6 +176,11 @@ static const struct ethqos_emac_por emac { .offset = RGMII_IO_MACRO_CONFIG2, .value = 0x00002060 }, }; +static const struct ethqos_emac_driver_data emac_v2_3_0_data = { + .por = emac_v2_3_0_por, + .num_por =ARRAY_SIZE (emac_v2_3_0_por), +}; +static int ethqos_dll_configure (struct qcom_ethqos *ethqos) {unsigned int val;
@@ -442,6 +452,7 @@ static int qcom_ethqos_probe(struct platstruct device_node *np = pdev->dev.of_node;struct plat_stmmacenet_data *plat_dat;struct stmmac_resources stmmac_res; +const struct ethqos_emac_driver_data *data;struct qcom_ethqos *ethqos;struct resource *res;int ret;
@@ -471,7 +482,9 @@ static int qcom_ethqos_probe(struct plat goto err_mem; } - ethqos->por =of_device_get_match_data (&pdev->dev); + data =of_device_get_match_data (&pdev->dev); + ethqos->por = data->por; + ethqos->num_por = data->num_por; ethqos->rgmii_clk =devm_clk_get (&pdev->dev,"rgmii" );if (IS_ERR (ethqos->rgmii_clk)) {
@@ -526,7 +539,7 @@ static int qcom_ethqos_remove(struct pla }static const struct of_device_id qcom_ethqos_match[] = { - { .compatible ="qcom,qcs404-ethqos" , .data = &emac_v2_3_0_por}, + { .compatible ="qcom,qcs404-ethqos" , .data = &emac_v2_3_0_data}, { } };MODULE_DEVICE_TABLE (of, qcom_ethqos_match);
Greg Kroah-Hartman
maintainerPATCH 23/147 pppoe: only process PADT targeted at local interfaces
In reply to Greg Kroah-HartmanFrom: Guillaume Nault <[email protected]>
[ Upstream commit b8c158395119be62294da73646a3953c29ac974b ]
We don't want to disconnect a session because of a stray PADT arriving while the interface is in promiscuous mode.
Furthermore, multicast and broadcast packets make no sense here, so only PACKET_HOST is accepted.
--- drivers/net/ppp/pppoe.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ppp/pppoe.c +3 -0
@@ -492,6 +492,9 @@ static int pppoe_disc_rcv(struct sk_buffif (!skb) goto out; +if (skb->pkt_type !=PACKET_HOST ) + goto abort; +if (!pskb_may_pull (skb,sizeof (struct pppoe_hdr ))) goto abort;
Greg Kroah-Hartman
maintainerPATCH 24/147 Revert "ipv6: add mtu lock check in __ip6_rt_update_pmtu"
In reply to Greg Kroah-HartmanFrom: "Maciej Żenczykowski" <[email protected]>
[ Upstream commit 09454fd0a4ce23cb3d8af65066c91a1bf27120dd ]
This reverts commit 19bda36c4299ce3d7e5bce10bebe01764a655a6d:
| ipv6: add mtu lock check in __ip6_rt_update_pmtu | | Prior to this patch, ipv6 didn't do mtu lock check in ip6_update_pmtu. | It leaded to that mtu lock doesn't really work when receiving the pkt | of ICMPV6_PKT_TOOBIG. | | This patch is to add mtu lock check in __ip6_rt_update_pmtu just as ipv4 | did in __ip_rt_update_pmtu.
The above reasoning is incorrect. IPv6 *requires* icmp based pmtu to work. There's already a comment to this effect elsewhere in the kernel:
$ git grep -p -B1 -A3 'RTAX_MTU lock' net/ipv6/route.c=4813=
static int rt6_mtu_change_route(struct fib6_info *f6i, void *p_arg)
...
/* In IPv6 pmtu discovery is not optional,
so that RTAX_MTU lock cannot disable it.
We still use this lock to block changes
caused by addrconf/ndisc.
*/
This reverts to the pre-4.9 behaviour.
--- net/ipv6/route.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/ipv6/route.c +4 -2
@@ -2728,8 +2728,10 @@ static void __ip6_rt_update_pmtu(structconst struct in6_addr *daddr, *saddr;struct rt6_info *rt6 = (struct rt6_info *)dst; -if (dst_metric_locked (dst,RTAX_MTU )) -return ; +/* Note: do *NOT* check dst_metric_locked(dst, RTAX_MTU) +* IPv6 pmtu discovery isn't optional, so 'mtu lock' cannot disable it. +* [see also comment in rt6_mtu_change_route()] +*/ if (iph) { daddr = &iph->daddr;
Greg Kroah-Hartman
maintainerPATCH 25/147 tcp: fix error recovery in tcp_zerocopy_receive()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit e776af608f692a7a647455106295fa34469e7475 ]
If user provides wrong virtual address in TCP_ZEROCOPY_RECEIVE operation we want to return -EINVAL error.
But depending on zc->recv_skip_hint content, we might return -EIO error if the socket has SOCK_DONE set.
Make sure to return -EINVAL in this case.
BUG: KMSAN: uninit-value in tcp_zerocopy_receive net/ipv4/tcp.c:1833 [inline] BUG: KMSAN: uninit-value in do_tcp_getsockopt+0x4494/0x6320 net/ipv4/tcp.c:3685 CPU: 1 PID: 625 Comm: syz-executor.0 Not tainted 5.7.0-rc4-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x1c9/0x220 lib/dump_stack.c:118 kmsan_report+0xf7/0x1e0 mm/kmsan/kmsan_report.c:121 __msan_warning+0x58/0xa0 mm/kmsan/kmsan_instr.c:215 tcp_zerocopy_receive net/ipv4/tcp.c:1833 [inline] do_tcp_getsockopt+0x4494/0x6320 net/ipv4/tcp.c:3685 tcp_getsockopt+0xf8/0x1f0 net/ipv4/tcp.c:3728 sock_common_getsockopt+0x13f/0x180 net/core/sock.c:3131 __sys_getsockopt+0x533/0x7b0 net/socket.c:2177 __do_sys_getsockopt net/socket.c:2192 [inline] __se_sys_getsockopt+0xe1/0x100 net/socket.c:2189 __x64_sys_getsockopt+0x62/0x80 net/socket.c:2189 do_syscall_64+0xb8/0x160 arch/x86/entry/common.c:297 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x45c829 Code: 0d b7 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 db b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00 RSP: 002b:00007f1deeb72c78 EFLAGS: 00000246 ORIG_RAX: 0000000000000037 RAX: ffffffffffffffda RBX: 00000000004e01e0 RCX: 000000000045c829 RDX: 0000000000000023 RSI: 0000000000000006 RDI: 0000000000000009 RBP: 000000000078bf00 R08: 0000000020000200 R09: 0000000000000000 R10: 00000000200001c0 R11: 0000000000000246 R12: 00000000ffffffff R13: 00000000000001d8 R14: 00000000004d3038 R15: 00007f1deeb736d4
Local variable ----zc@do_tcp_getsockopt created at:
do_tcp_getsockopt+0x1a74/0x6320 net/ipv4/tcp.c:3670 do_tcp_getsockopt+0x1a74/0x6320 net/ipv4/tcp.c:3670
--- net/ipv4/tcp.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/ipv4/tcp.c +4 -3
@@ -1757,10 +1757,11 @@ static int tcp_zerocopy_receive(struct sdown_read (¤t->mm->mmap_sem); - ret = -EINVAL ; vma =find_vma (current->mm, address); -if (!vma || vma->vm_start > address || vma->vm_ops != &tcp_vm_ops) - goto out; +if (!vma || vma->vm_start > address || vma->vm_ops != &tcp_vm_ops) { +up_read (¤t->mm->mmap_sem); +return -EINVAL ; + } zc->length = min_t(unsigned long, zc->length, vma->vm_end - address); tp =tcp_sk (sk);
Greg Kroah-Hartman
maintainerPATCH 26/147 tcp: fix SO_RCVLOWAT hangs with fat skbs
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 24adbc1676af4e134e709ddc7f34cf2adc2131e4 ]
We autotune rcvbuf whenever SO_RCVLOWAT is set to account for 100% overhead in tcp_set_rcvlowat()
This works well when skb->len/skb->truesize ratio is bigger than 0.5
But if we receive packets with small MSS, we can end up in a situation where not enough bytes are available in the receive queue to satisfy RCVLOWAT setting.
As our sk_rcvbuf limit is hit, we send zero windows in ACK packets, preventing remote peer from sending more data.
Even autotuning does not help, because it only triggers at the time user process drains the queue. If no EPOLLIN is generated, this can not happen.
Note poll() has a similar issue, after commit c7004482e8dc ("tcp: Respect SO_RCVLOWAT in tcp_poll().")
--- include/net/tcp.h | 13 +++++++++++++ net/ipv4/tcp.c | 14 +++++++++++--- net/ipv4/tcp_input.c | 3 ++- 3 files changed, 26 insertions(+), 4 deletions(-)
include/net/tcp.h +13 -0
@@ -1401,6 +1401,19 @@ static inline int tcp_full_space(const sreturn tcp_win_from_space (sk,READ_ONCE (sk->sk_rcvbuf)); } +/* We provision sk_rcvbuf around 200% of sk_rcvlowat. +* If 87.5 % (7/8) of the space has been consumed, we want to override +* SO_RCVLOWAT constraint, since we are receiving skbs with too small +* len/truesize ratio. +*/ +static inline bool tcp_rmem_pressure (const struct sock *sk) +{ +int rcvbuf =READ_ONCE (sk->sk_rcvbuf); +int threshold = rcvbuf - (rcvbuf >>3 ); + +return atomic_read (&sk->sk_rmem_alloc) > threshold; +} +extern void tcp_openreq_init_rwin (struct request_sock *req,const struct sock *sk_listener,const struct dst_entry *dst);
net/ipv4/tcp.c +11 -3
@@ -477,9 +477,17 @@ static void tcp_tx_timestamp(struct sockstatic inline bool tcp_stream_is_readable (const struct tcp_sock *tp,int target,struct sock *sk) { -return (READ_ONCE (tp->rcv_nxt) -READ_ONCE (tp->copied_seq) >= target) || - (sk->sk_prot->stream_memory_read ? - sk->sk_prot->stream_memory_read (sk) : false); +int avail =READ_ONCE (tp->rcv_nxt) -READ_ONCE (tp->copied_seq); + +if (avail >0 ) { +if (avail >= target) +return true; +if (tcp_rmem_pressure (sk)) +return true; + } +if (sk->sk_prot->stream_memory_read) +return sk->sk_prot->stream_memory_read (sk); +return false; }/*
net/ipv4/tcp_input.c +2 -1
@@ -4751,7 +4751,8 @@ void tcp_data_ready(struct sock *sk)const struct tcp_sock *tp =tcp_sk (sk);int avail = tp->rcv_nxt - tp->copied_seq; -if (avail < sk->sk_rcvlowat && !sock_flag (sk,SOCK_DONE )) +if (avail < sk->sk_rcvlowat && !tcp_rmem_pressure (sk) && + !sock_flag (sk,SOCK_DONE ))return ; sk->sk_data_ready (sk);
Greg Kroah-Hartman
maintainerPATCH 27/147 virtio_net: fix lockdep warning on 32 bit
In reply to Greg Kroah-HartmanFrom: "Michael S. Tsirkin" <[email protected]>
[ Upstream commit 01c3259818a11f3cc3cd767adbae6b45849c03c1 ]
When we fill up a receive VQ, try_fill_recv currently tries to count kicks using a 64 bit stats counter. Turns out, on a 32 bit kernel that uses a seqcount. sequence counts are "lock" constructs where you need to make sure that writers are serialized.
In turn, this means that we mustn't run two try_fill_recv concurrently. Which of course we don't. We do run try_fill_recv sometimes from a softirq napi context, and sometimes from a fully preemptible context, but the later always runs with napi disabled.
However, when it comes to the seqcount, lockdep is trying to enforce the rule that the same lock isn't accessed from preemptible and softirq context - it doesn't know about napi being enabled/disabled. This causes a false-positive warning:
WARNING: inconsistent lock state
...
inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
As a work around, shut down the warning by switching to u64_stats_update_begin_irqsave - that works by disabling interrupts on 32 bit only, is a NOP on 64 bit.
--- drivers/net/virtio_net.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/virtio_net.c +4 -2
@@ -1231,9 +1231,11 @@ static bool try_fill_recv(struct virtnetbreak ; }while (rq->vq->num_free);if (virtqueue_kick_prepare (rq->vq) &&virtqueue_notify (rq->vq)) { -u64_stats_update_begin (&rq->stats.syncp); +unsigned long flags; + + flags =u64_stats_update_begin_irqsave (&rq->stats.syncp); rq->stats.kicks++; -u64_stats_update_end (&rq->stats.syncp); +u64_stats_update_end_irqrestore (&rq->stats.syncp, flags); }return !oom;
Greg Kroah-Hartman
maintainerPATCH 28/147 dpaa2-eth: prevent array underflow in update_cls_rule()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 6d32a5119811d2e9b5caa284181944c6f1f192ed ]
The "location" is controlled by the user via the ethtool_set_rxnfc() function. This update_cls_rule() function checks for array overflows but it doesn't check if the value is negative. I have changed the type to unsigned to prevent array underflows.
--- drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c +1 -1
@@ -590,7 +590,7 @@ static int num_rules(struct dpaa2_eth_prstatic int update_cls_rule (struct net_device *net_dev,struct ethtool_rx_flow_spec *new_fs, -int location) +unsigned int location) {struct dpaa2_eth_priv *priv =netdev_priv (net_dev);struct dpaa2_eth_cls_rule *rule;
Greg Kroah-Hartman
maintainerPATCH 29/147 hinic: fix a bug of ndo_stop
In reply to Greg Kroah-HartmanFrom: Luo bin <[email protected]>
[ Upstream commit e8a1b0efd632d1c9db7d4e93da66377c7b524862 ]
if some function in ndo_stop interface returns failure because of hardware fault, must go on excuting rest steps rather than return failure directly, otherwise will cause memory leak.And bump the timeout for SET_FUNC_STATE to ensure that cmd won't return failure when hw is busy. Otherwise hw may stomp host memory if we free memory regardless of the return value of SET_FUNC_STATE.
--- drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c | 16 ++++++++++++---- drivers/net/ethernet/huawei/hinic/hinic_main.c | 18 +++--------------- 2 files changed, 15 insertions(+), 19 deletions(-)
drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c +12 -4
@@ -45,6 +45,8 @@#define MGMT_MSG_TIMEOUT 5000 +#define SET_FUNC_PORT_MGMT_TIMEOUT 25000 +#define mgmt_to_pfhwdev (pf_mgmt) \ container_of(pf_mgmt, struct hinic_pfhwdev, pf_to_mgmt)
@@ -238,12 +240,13 @@ static int msg_to_mgmt_sync(struct hinic u8 *buf_in, u16 in_size, u8 *buf_out, u16 *out_size, enum mgmt_direction_type direction, - u16 resp_msg_id) + u16 resp_msg_id, u32 timeout) { struct hinic_hwif *hwif = pf_to_mgmt->hwif;struct pci_dev *pdev = hwif->pdev;struct hinic_recv_msg *recv_msg;struct completion *recv_done; +unsigned long timeo;u16 msg_id;int err;
@@ -267,8 +270,9 @@ static int msg_to_mgmt_sync(struct hinic goto unlock_sync_msg; } -if (!wait_for_completion_timeout (recv_done, -msecs_to_jiffies (MGMT_MSG_TIMEOUT ))) { + timeo =msecs_to_jiffies (timeout ? timeout :MGMT_MSG_TIMEOUT ); + +if (!wait_for_completion_timeout (recv_done, timeo)) {dev_err (&pdev->dev,"MGMT timeout, MSG id = %d\n" , msg_id); err = -ETIMEDOUT ; goto unlock_sync_msg;
@@ -342,6 +346,7 @@ int hinic_msg_to_mgmt(struct hinic_pf_to {struct hinic_hwif *hwif = pf_to_mgmt->hwif;struct pci_dev *pdev = hwif->pdev; +u32 timeout =0 ;if (sync !=HINIC_MGMT_MSG_SYNC ) {dev_err (&pdev->dev,"Invalid MGMT msg type\n" );
@@ -353,9 +358,12 @@ int hinic_msg_to_mgmt(struct hinic_pf_toreturn -EINVAL ; } +if (cmd ==HINIC_PORT_CMD_SET_FUNC_STATE ) + timeout =SET_FUNC_PORT_MGMT_TIMEOUT ; +return msg_to_mgmt_sync (pf_to_mgmt, mod, cmd, buf_in, in_size, buf_out, out_size,MGMT_DIRECT_SEND , -MSG_NOT_RESP ); +MSG_NOT_RESP , timeout); }/**
drivers/net/ethernet/huawei/hinic/hinic_main.c +3 -15
@@ -483,7 +483,6 @@ static int hinic_close(struct net_device {struct hinic_dev *nic_dev =netdev_priv (netdev);unsigned int flags; -int err;down (&nic_dev->mgmt_lock);
@@ -497,20 +496,9 @@ static int hinic_close(struct net_deviceup (&nic_dev->mgmt_lock); - err =hinic_port_set_func_state (nic_dev,HINIC_FUNC_PORT_DISABLE ); -if (err) { -netif_err (nic_dev, drv, netdev, -"Failed to set func port state\n" ); - nic_dev->flags |= (flags &HINIC_INTF_UP ); -return err; - } - - err =hinic_port_set_state (nic_dev,HINIC_PORT_DISABLE ); -if (err) { -netif_err (nic_dev, drv, netdev,"Failed to set port state\n" ); - nic_dev->flags |= (flags &HINIC_INTF_UP ); -return err; - } +hinic_port_set_state (nic_dev,HINIC_PORT_DISABLE ); + +hinic_port_set_func_state (nic_dev,HINIC_FUNC_PORT_DISABLE );if (nic_dev->flags &HINIC_RSS_ENABLE ) {hinic_rss_deinit (nic_dev);
Greg Kroah-Hartman
maintainerPATCH 30/147 net: dsa: loop: Add module soft dependency
In reply to Greg Kroah-HartmanFrom: Florian Fainelli <[email protected]>
[ Upstream commit 3047211ca11bf77b3ecbce045c0aa544d934b945 ]
There is a soft dependency against dsa_loop_bdinfo.ko which sets up the MDIO device registration, since there are no symbols referenced by dsa_loop.ko, there is no automatic loading of dsa_loop_bdinfo.ko which is needed.
--- drivers/net/dsa/dsa_loop.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/dsa/dsa_loop.c +1 -0
@@ -356,6 +356,7 @@ static void __exit dsa_loop_exit(void) }module_exit (dsa_loop_exit); +MODULE_SOFTDEP ("pre: dsa_loop_bdinfo" );MODULE_LICENSE ("GPL" );MODULE_AUTHOR ("Florian Fainelli" );MODULE_DESCRIPTION ("DSA loopback driver" );
Greg Kroah-Hartman
maintainerPATCH 31/147 net: ipv4: really enforce backoff for redirects
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 57644431a6c2faac5d754ebd35780cf43a531b1a ]
In commit b406472b5ad7 ("net: ipv4: avoid mixed n_redirects and rate_tokens usage") I missed the fact that a 0 'rate_tokens' will bypass the backoff algorithm.
Since rate_tokens is cleared after a redirect silence, and never incremented on redirects, if the host keeps receiving packets requiring redirect it will reply ignoring the backoff.
Additionally, the 'rate_last' field will be updated with the cadence of the ingress packet requiring redirect. If that rate is high enough, that will prevent the host from generating any other kind of ICMP messages
The check for a zero 'rate_tokens' value was likely a shortcut to avoid the more complex backoff algorithm after a redirect silence period. Address the issue checking for 'n_redirects' instead, which is incremented on successful redirect, and does not interfere with other ICMP replies.
--- net/ipv4/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/route.c +1 -1
@@ -914,7 +914,7 @@ void ip_rt_send_redirect(struct sk_buff/* Check for load limit; set rate_last to the latest sent * redirect. */ -if (peer->rate_tokens ==0 || +if (peer->n_redirects ==0 ||time_after (jiffies, (peer->rate_last + (ip_rt_redirect_load << peer->n_redirects)))) {
Greg Kroah-Hartman
maintainerPATCH 32/147 netprio_cgroup: Fix unlimited memory leak of v2 cgroups
In reply to Greg Kroah-HartmanFrom: Zefan Li <[email protected]>
[ Upstream commit 090e28b229af92dc5b40786ca673999d59e73056 ]
If systemd is configured to use hybrid mode which enables the use of both cgroup v1 and v2, systemd will create new cgroup on both the default root (v2) and netprio_cgroup hierarchy (v1) for a new session and attach task to the two cgroups. If the task does some network thing then the v2 cgroup can never be freed after the session exited.
One of our machines ran into OOM due to this memory leak.
In the scenario described above when sk_alloc() is called cgroup_sk_alloc() thought it's in v2 mode, so it stores the cgroup pointer in sk->sk_cgrp_data and increments the cgroup refcnt, but then sock_update_netprioidx() thought it's in v1 mode, so it stores netprioidx value in sk->sk_cgrp_data, so the cgroup refcnt will never be freed.
Currently we do the mode switch when someone writes to the ifpriomap cgroup control file. The easiest fix is to also do the switch when a task is attached to a new cgroup.
--- net/core/netprio_cgroup.c | 2 ++ 1 file changed, 2 insertions(+)
net/core/netprio_cgroup.c +2 -0
@@ -236,6 +236,8 @@ static void net_prio_attach(struct cgroustruct task_struct *p;struct cgroup_subsys_state *css; +cgroup_sk_alloc_disable (); +cgroup_taskset_for_each (p, css, tset) {void *v = (void *)(unsigned long )css->cgroup->id;
Greg Kroah-Hartman
maintainerPATCH 33/147 net: tcp: fix rx timestamp behavior for tcp_recvmsg
In reply to Greg Kroah-HartmanFrom: Kelly Littlepage <[email protected]>
[ Upstream commit cc4de047b33be247f9c8150d3e496743a49642b8 ]
The stated intent of the original commit is to is to "return the timestamp corresponding to the highest sequence number data returned." The current implementation returns the timestamp for the last byte of the last fully read skb, which is not necessarily the last byte in the recv buffer. This patch converts behavior to the original definition, and to the behavior of the previous draft versions of commit 98aaa913b4ed ("tcp: Extend SOF_TIMESTAMPING_RX_SOFTWARE to TCP recvmsg") which also match this behavior.
--- net/ipv4/tcp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/ipv4/tcp.c +4 -2
@@ -2158,13 +2158,15 @@ skip_copy: tp->urg_data =0 ;tcp_fast_path_check (sk); } -if (used + offset < skb->len) -continue ;if (TCP_SKB_CB (skb)->has_rxtstamp) {tcp_update_recv_tstamps (skb, &tss); cmsg_flags |=2 ; } + +if (used + offset < skb->len) +continue ; +if (TCP_SKB_CB (skb)->tcp_flags &TCPHDR_FIN ) goto found_fin_ok;if (!(flags &MSG_PEEK ))
Greg Kroah-Hartman
maintainerPATCH 34/147 nfp: abm: fix error return code in nfp_abm_vnic_alloc()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit 5099dea0a59f1c89525bb0ceac36689178a4c125 ]
Fix to return negative error code -ENOMEM from the kzalloc() error handling case instead of 0, as done elsewhere in this function.
--- drivers/net/ethernet/netronome/nfp/abm/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/netronome/nfp/abm/main.c +3 -1
@@ -333,8 +333,10 @@ nfp_abm_vnic_alloc(struct nfp_app *app, goto err_free_alink; alink->prio_map =kzalloc (abm->prio_map_len,GFP_KERNEL ); -if (!alink->prio_map) +if (!alink->prio_map) { + err = -ENOMEM ; goto err_free_alink; + }/* This is a multi-host app, make sure MAC/PHY is up, but don't * make the MAC/PHY state follow the state of any of the ports.
Greg Kroah-Hartman
maintainerPATCH 35/147 r8169: re-establish support for RTL8401 chip version
In reply to Greg Kroah-HartmanFrom: Heiner Kallweit <[email protected]>
[ Upstream commit 1f8492df081bd66255764f3ce82ba1b2c37def49 ]
r8169 never had native support for the RTL8401, however it reportedly worked with the fallback to RTL8101e [0]. Therefore let's add this as an explicit assignment.
[0] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=956868
--- drivers/net/ethernet/realtek/r8169_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/realtek/r8169_main.c +2 -0
@@ -2202,6 +2202,8 @@ static void rtl8169_get_mac_version(stru { 0x7cf, 0x348, RTL_GIGA_MAC_VER_07 }, { 0x7cf, 0x248, RTL_GIGA_MAC_VER_07 }, { 0x7cf, 0x340, RTL_GIGA_MAC_VER_13 }, +/* RTL8401, reportedly works if treated as RTL8101e */ + { 0x7cf, 0x240, RTL_GIGA_MAC_VER_13 }, { 0x7cf, 0x343, RTL_GIGA_MAC_VER_10 }, { 0x7cf, 0x342, RTL_GIGA_MAC_VER_16 }, { 0x7c8, 0x348, RTL_GIGA_MAC_VER_09 },
Greg Kroah-Hartman
maintainerPATCH 36/147 umh: fix memory leak on execve failure
In reply to Greg Kroah-HartmanFrom: Vincent Minet <[email protected]>
[ Upstream commit db803036ada7d61d096783726f9771b3fc540370 ]
If a UMH process created by fork_usermode_blob() fails to execute, a pair of struct file allocated by umh_pipe_setup() will leak.
Under normal conditions, the caller (like bpfilter) needs to manage the lifetime of the UMH and its two pipes. But when fork_usermode_blob() fails, the caller doesn't really have a way to know what needs to be done. It seems better to do the cleanup ourselves in this case.
--- kernel/umh.c | 6 ++++++ 1 file changed, 6 insertions(+)
kernel/umh.c +6 -0
@@ -475,6 +475,12 @@ static void umh_clean_and_save_pid(struc {struct umh_info *umh_info = info->data; +/* cleanup if umh_pipe_setup() was successful but exec failed */ +if (info->pid && info->retval) { +fput (umh_info->pipe_to_umh); +fput (umh_info->pipe_from_umh); + } +argv_free (info->argv); umh_info->pid = info->pid; }
Greg Kroah-Hartman
maintainerPATCH 37/147 riscv: fix vdso build with lld
In reply to Greg Kroah-HartmanFrom: Ilie Halip <[email protected]>
[ Upstream commit 3c1918c8f54166598195d938564072664a8275b1 ]
When building with the LLVM linker this error occurrs:
LD arch/riscv/kernel/vdso/vdso-syms.o
ld.lld: error: no input files
This happens because the lld treats -R as an alias to -rpath, as opposed to ld where -R means --just-symbols.
Use the long option name for compatibility between the two.
--- arch/riscv/kernel/vdso/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/riscv/kernel/vdso/Makefile +3 -3
@@ -33,15 +33,15 @@ $(obj)/vdso.so.dbg: $(src)/vdso.lds $(obj-vdso) FORCE $(call if_changed,vdsold) # We also create a special relocatable object that should mirror the symbol -# table and layout of the linked DSO. With ld -R we can then refer to -# these symbols in the kernel code rather than hand-coded addresses. +# table and layout of the linked DSO. With ld --just-symbols we can then +# refer to these symbols in the kernel code rather than hand-coded addresses. SYSCFLAGS_vdso.so.dbg = -shared -s -Wl,-soname=linux-vdso.so.1 \ -Wl,--build-id -Wl,--hash-style=both $(obj)/vdso-dummy.o: $(src)/vdso.lds $(obj)/rt_sigreturn.o FORCE $(call if_changed,vdsold) -LDFLAGS_vdso-syms.o := -r -R +LDFLAGS_vdso-syms.o := -r --just-symbols $(obj)/vdso-syms.o: $(obj)/vdso-dummy.o FORCE $(call if_changed,ld)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 38/147 dmaengine: pch_dma.c: Avoid data race between probe and irq handler
In reply to Greg Kroah-HartmanFrom: Madhuparna Bhowmik <[email protected]>
[ Upstream commit 2e45676a4d33af47259fa186ea039122ce263ba9 ]
pd->dma.dev is read in irq handler pd_irq().
However, it is set to pdev->dev after request_irq(). Therefore, set pd->dma.dev to pdev->dev before request_irq() to avoid data race between pch_dma_probe() and pd_irq().
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/dma/pch_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/pch_dma.c +1 -1
@@ -865,6 +865,7 @@ static int pch_dma_probe(struct pci_dev *pdev, }pci_set_master (pdev); + pd->dma.dev = &pdev->dev; err =request_irq (pdev->irq, pd_irq,IRQF_SHARED ,DRV_NAME , pd);if (err) {
@@ -880,7 +881,6 @@ static int pch_dma_probe(struct pci_dev *pdev, goto err_free_irq; } - pd->dma.dev = &pdev->dev;INIT_LIST_HEAD (&pd->dma.channels);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 39/147 dmaengine: mmp_tdma: Do not ignore slave config validation errors
In reply to Greg Kroah-HartmanFrom: Lubomir Rintel <[email protected]>
[ Upstream commit 363c32701c7fdc8265a84b21a6a4f45d1202b9ca ]
With an invalid dma_slave_config set previously, mmp_tdma_prep_dma_cyclic() would detect an error whilst configuring the channel, but proceed happily on:
[ 120.756530] mmp-tdma d42a0800.adma: mmp_tdma: unknown burst size.
--- drivers/dma/mmp_tdma.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/dma/mmp_tdma.c +2 -1
@@ -443,7 +443,8 @@ static struct dma_async_tx_descriptor *mmp_tdma_prep_dma_cyclic(if (!desc) goto err_out; -mmp_tdma_config_write (chan, direction, &tdmac->slave_config); +if (mmp_tdma_config_write (chan, direction, &tdmac->slave_config)) + goto err_out;while (buf < buf_len) { desc = &tdmac->desc_arr[i];
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 40/147 dmaengine: mmp_tdma: Reset channel error on release
In reply to Greg Kroah-HartmanFrom: Lubomir Rintel <[email protected]>
[ Upstream commit 0c89446379218698189a47871336cb30286a7197 ]
When a channel configuration fails, the status of the channel is set to DEV_ERROR so that an attempt to submit it fails. However, this status sticks until the heat end of the universe, making it impossible to recover from the error.
Let's reset it when the channel is released so that further use of the channel with correct configuration is not impacted.
--- drivers/dma/mmp_tdma.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/dma/mmp_tdma.c +2 -0
@@ -363,6 +363,8 @@ static void mmp_tdma_free_descriptor(struct mmp_tdma_chan *tdmac)gen_pool_free (gpool, (unsigned long )tdmac->desc_arr, size); tdmac->desc_arr =NULL ; +if (tdmac->status ==DMA_ERROR ) + tdmac->status =DMA_COMPLETE ;return ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 41/147 selftests/ftrace: Check the first record for kprobe_args_type.tc
In reply to Greg Kroah-HartmanFrom: Xiao Yang <[email protected]>
[ Upstream commit f0c0d0cf590f71b2213b29a7ded2cde3d0a1a0ba ]
It is possible to get multiple records from trace during test and then more
than 4 arguments are assigned to ARGS. This situation results in the failure
of kprobe_args_type.tc. For example:
-----------------------------------------------------------
grep testprobe trace
ftracetest-5902 [001] d... 111195.682227: testprobe: (_do_fork+0x0/0x460) arg1=334823024 arg2=334823024 arg3=0x13f4fe70 arg4=7
pmlogger-5949 [000] d... 111195.709898: testprobe: (_do_fork+0x0/0x460) arg1=345308784 arg2=345308784 arg3=0x1494fe70 arg4=7
grep testprobe trace
sed -e 's/.* arg1=\(.*\) arg2=\(.*\) arg3=\(.*\) arg4=\(.*\)/\1 \2 \3 \4/'
ARGS='334823024 334823024 0x13f4fe70 7
345308784 345308784 0x1494fe70 7'
-----------------------------------------------------------
We don't care which process calls do_fork so just check the first record to fix the issue.
--- .../testing/selftests/ftrace/test.d/kprobe/kprobe_args_type.tc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_type.tc +1 -1
@@ -38,7 +38,7 @@ for width in 64 32 16 8; do echo 0 > events/kprobes/testprobe/enable : "Confirm the arguments is recorded in given types correctly" - ARGS=`grep "testprobe" trace | sed -e 's/.* arg1=\(.*\) arg2=\(.*\) arg3=\(.*\) arg4=\(.*\)/\1 \2 \3 \4/'` + ARGS=`grep "testprobe" trace | head -n 1 | sed -e 's/.* arg1=\(.*\) arg2=\(.*\) arg3=\(.*\) arg4=\(.*\)/\1 \2 \3 \4/'` check_types $ARGS $width : "Clear event for next loop"
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 42/147 cpufreq: intel_pstate: Only mention the BIOS disabling turbo mode once
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
[ Upstream commit 8c539776ac83c0857395e1ccc9c6b516521a2d32 ]
Make a note of the first time we discover the turbo mode has been disabled by the BIOS, as otherwise we complain every time we try to update the mode.
--- drivers/cpufreq/intel_pstate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/cpufreq/intel_pstate.c +1 -1
@@ -1058,7 +1058,7 @@ static ssize_t store_no_turbo(struct kobject *a, struct kobj_attribute *b,update_turbo_state ();if (global.turbo_disabled) { -pr_warn ("Turbo disabled by BIOS or unavailable on processor\n" ); +pr_notice_once ("Turbo disabled by BIOS or unavailable on processor\n" );mutex_unlock (&intel_pstate_limits_lock);mutex_unlock (&intel_pstate_driver_lock);return -EPERM ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 43/147 ALSA: hda/hdmi: fix race in monitor detection during probe
In reply to Greg Kroah-HartmanFrom: Kai Vehmanen <[email protected]>
[ Upstream commit ca76282b6faffc83601c25bd2a95f635c03503ef ]
A race exists between build_pcms() and build_controls() phases of codec setup. Build_pcms() sets up notifier for jack events. If a monitor event is received before build_controls() is run, the initial jack state is lost and never reported via mixer controls.
The problem can be hit at least with SOF as the controller driver. SOF calls snd_hda_codec_build_controls() in its workqueue-based probe and this can be delayed enough to hit the race condition.
Fix the issue by invalidating the per-pin ELD information when build_controls() is called. The existing call to hdmi_present_sense() will update the ELD contents. This ensures initial monitor state is correctly reflected via mixer controls.
--- sound/pci/hda/patch_hdmi.c | 2 ++ 1 file changed, 2 insertions(+)
sound/pci/hda/patch_hdmi.c +2 -0
@@ -2234,7 +2234,9 @@ static int generic_hdmi_build_controls(struct hda_codec *codec)for (pin_idx =0 ; pin_idx < spec->num_pins; pin_idx++) {struct hdmi_spec_per_pin *per_pin =get_pin (spec, pin_idx); +struct hdmi_eld *pin_eld = &per_pin->sink_eld; + pin_eld->eld_valid = false;hdmi_present_sense (per_pin,0 ); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 44/147 drm/amd/powerplay: avoid using pm_en before it is initialized revised
In reply to Greg Kroah-HartmanFrom: Tiecheng Zhou <[email protected]>
[ Upstream commit 690ae30be163d5262feae01335b2a6f30569e5aa ]
hwmgr->pm_en is initialized at hwmgr_hw_init.
during amdgpu_device_init, there is amdgpu_asic_reset that calls to soc15_asic_reset (for V320 usecase, Vega10 asic), in which:
1) soc15_asic_reset_method calls to pp_get_asic_baco_capability (pm_en)
2) soc15_asic_baco_reset calls to pp_set_asic_baco_state (pm_en)
pm_en is used in the above two cases while it has not yet been initialized
So avoid using pm_en in the above two functions for V320 passthrough.
--- drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/powerplay/amd_powerplay.c +4 -2
@@ -1425,7 +1425,8 @@ static int pp_get_asic_baco_capability(void *handle, bool *cap)if (!hwmgr)return -EINVAL ; -if (!hwmgr->pm_en || !hwmgr->hwmgr_func->get_asic_baco_capability) +if (!(hwmgr->not_vf && amdgpu_dpm) || + !hwmgr->hwmgr_func->get_asic_baco_capability)return 0 ;mutex_lock (&hwmgr->smu_lock);
@@ -1459,7 +1460,8 @@ static int pp_set_asic_baco_state(void *handle, int state)if (!hwmgr)return -EINVAL ; -if (!hwmgr->pm_en || !hwmgr->hwmgr_func->set_asic_baco_state) +if (!(hwmgr->not_vf && amdgpu_dpm) || + !hwmgr->hwmgr_func->set_asic_baco_state)return 0 ;mutex_lock (&hwmgr->smu_lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 45/147 drm/amd/display: check if REFCLK_CNTL register is present
In reply to Greg Kroah-HartmanFrom: Dmytro Laktyushkin <[email protected]>
[ Upstream commit 3159d41db3a04330c31ece32f8b29752fc114848 ]
Check before programming the register since it isn't present on all IPs using this code.
--- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +2 -1
@@ -2015,7 +2015,8 @@ static void dcn20_fpga_init_hw(struct dc *dc)REG_UPDATE (DCHUBBUB_GLOBAL_TIMER_CNTL ,DCHUBBUB_GLOBAL_TIMER_REFDIV ,2 );REG_UPDATE (DCHUBBUB_GLOBAL_TIMER_CNTL ,DCHUBBUB_GLOBAL_TIMER_ENABLE ,1 ); -REG_WRITE (REFCLK_CNTL ,0 ); +if (REG (REFCLK_CNTL )) +REG_WRITE (REFCLK_CNTL ,0 );//
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 46/147 drm/amd/display: Update downspread percent to match spreadsheet for DCN2.1
In reply to Greg Kroah-HartmanFrom: Sung Lee <[email protected]>
[ Upstream commit 668a6741f809f2d15d125cfe2b39661e8f1655ea ]
[WHY]
The downspread percentage was copied over from a previous version of the display_mode_lib spreadsheet. This value has been updated, and the previous value is too high to allow for such modes as 4K120hz. The new value is sufficient for such modes.
[HOW]
Update the value in dcn21_resource to match the spreadsheet.
--- drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c +1 -1
@@ -247,7 +247,7 @@ struct _vcs_dpi_soc_bounding_box_st dcn2_1_soc = { .dram_channel_width_bytes = 4, .fabric_datapath_to_dcn_data_return_bytes = 32, .dcn_downspread_percent = 0.5, - .downspread_percent = 0.5, + .downspread_percent = 0.38, .dram_page_open_time_ns = 50.0, .dram_rw_turnaround_time_ns = 17.5, .dram_return_buffer_per_channel_bytes = 8192,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 47/147 drm/qxl: lost qxl_bo_kunmap_atomic_page in qxl_image_init_helper()
In reply to Greg Kroah-HartmanFrom: Vasily Averin <[email protected]>
[ Upstream commit 5b5703dbafae74adfbe298a56a81694172caf5e6 ]
v2: removed TODO reminder
--- drivers/gpu/drm/qxl/qxl_image.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/qxl/qxl_image.c +2 -1
@@ -212,7 +212,8 @@ qxl_image_init_helper(struct qxl_device *qdev,break ;default :DRM_ERROR ("unsupported image bit depth\n" ); -return -EINVAL ;/* TODO: cleanup */ +qxl_bo_kunmap_atomic_page (qdev, image_bo, ptr); +return -EINVAL ; } image->u.bitmap.flags =QXL_BITMAP_TOP_DOWN ; image->u.bitmap.x = width;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 48/147 drm/amdgpu: simplify padding calculations (v2)
In reply to Greg Kroah-HartmanFrom: Luben Tuikov <[email protected]>
[ Upstream commit ce73516d42c9ab011fad498168b892d28e181db4 ]
Simplify padding calculations.
v2: Comment update and spacing.
--- drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 4 ++-- drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 4 ++-- drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 4 ++-- drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 4 ++-- drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 17 ++++++++++++----- 5 files changed, 20 insertions(+), 13 deletions(-)
drivers/gpu/drm/amd/amdgpu/cik_sdma.c +2 -2
@@ -228,7 +228,7 @@ static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring,u32 extra_bits = vmid &0xf ;/* IB packet must end on a 8 DW boundary */ -cik_sdma_ring_insert_nop (ring, (12 - (lower_32_bits (ring->wptr) &7 )) %8 ); +cik_sdma_ring_insert_nop (ring, (4 -lower_32_bits (ring->wptr)) &7 );amdgpu_ring_write (ring,SDMA_PACKET (SDMA_OPCODE_INDIRECT_BUFFER ,0 , extra_bits));amdgpu_ring_write (ring, ib->gpu_addr &0xffffffe0 );/* base must be 32 byte aligned */
@@ -811,7 +811,7 @@ static void cik_sdma_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)u32 pad_count;int i; - pad_count = (8 - (ib->length_dw &0x7 )) %8 ; + pad_count = (-ib->length_dw) &7 ;for (i =0 ; i < pad_count; i++)if (sdma && sdma->burst_nop && (i ==0 )) ib->ptr[ib->length_dw++] =
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +2 -2
@@ -255,7 +255,7 @@ static void sdma_v2_4_ring_emit_ib(struct amdgpu_ring *ring,unsigned vmid =AMDGPU_JOB_GET_VMID (job);/* IB packet must end on a 8 DW boundary */ -sdma_v2_4_ring_insert_nop (ring, (10 - (lower_32_bits (ring->wptr) &7 )) %8 ); +sdma_v2_4_ring_insert_nop (ring, (2 -lower_32_bits (ring->wptr)) &7 );amdgpu_ring_write (ring,SDMA_PKT_HEADER_OP (SDMA_OP_INDIRECT ) |SDMA_PKT_INDIRECT_HEADER_VMID (vmid &0xf ));
@@ -750,7 +750,7 @@ static void sdma_v2_4_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ibu32 pad_count;int i; - pad_count = (8 - (ib->length_dw &0x7 )) %8 ; + pad_count = (-ib->length_dw) &7 ;for (i =0 ; i < pad_count; i++)if (sdma && sdma->burst_nop && (i ==0 )) ib->ptr[ib->length_dw++] =
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +2 -2
@@ -429,7 +429,7 @@ static void sdma_v3_0_ring_emit_ib(struct amdgpu_ring *ring,unsigned vmid =AMDGPU_JOB_GET_VMID (job);/* IB packet must end on a 8 DW boundary */ -sdma_v3_0_ring_insert_nop (ring, (10 - (lower_32_bits (ring->wptr) &7 )) %8 ); +sdma_v3_0_ring_insert_nop (ring, (2 -lower_32_bits (ring->wptr)) &7 );amdgpu_ring_write (ring,SDMA_PKT_HEADER_OP (SDMA_OP_INDIRECT ) |SDMA_PKT_INDIRECT_HEADER_VMID (vmid &0xf ));
@@ -1021,7 +1021,7 @@ static void sdma_v3_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ibu32 pad_count;int i; - pad_count = (8 - (ib->length_dw &0x7 )) %8 ; + pad_count = (-ib->length_dw) &7 ;for (i =0 ; i < pad_count; i++)if (sdma && sdma->burst_nop && (i ==0 )) ib->ptr[ib->length_dw++] =
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +2 -2
@@ -698,7 +698,7 @@ static void sdma_v4_0_ring_emit_ib(struct amdgpu_ring *ring,unsigned vmid =AMDGPU_JOB_GET_VMID (job);/* IB packet must end on a 8 DW boundary */ -sdma_v4_0_ring_insert_nop (ring, (10 - (lower_32_bits (ring->wptr) &7 )) %8 ); +sdma_v4_0_ring_insert_nop (ring, (2 -lower_32_bits (ring->wptr)) &7 );amdgpu_ring_write (ring,SDMA_PKT_HEADER_OP (SDMA_OP_INDIRECT ) |SDMA_PKT_INDIRECT_HEADER_VMID (vmid &0xf ));
@@ -1579,7 +1579,7 @@ static void sdma_v4_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ibu32 pad_count;int i; - pad_count = (8 - (ib->length_dw &0x7 )) %8 ; + pad_count = (-ib->length_dw) &7 ;for (i =0 ; i < pad_count; i++)if (sdma && sdma->burst_nop && (i ==0 )) ib->ptr[ib->length_dw++] =
drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +12 -5
@@ -382,8 +382,15 @@ static void sdma_v5_0_ring_emit_ib(struct amdgpu_ring *ring,unsigned vmid =AMDGPU_JOB_GET_VMID (job);uint64_t csa_mc_addr =amdgpu_sdma_get_csa_mc_addr (ring, vmid); -/* IB packet must end on a 8 DW boundary */ -sdma_v5_0_ring_insert_nop (ring, (10 - (lower_32_bits (ring->wptr) &7 )) %8 ); +/* An IB packet must end on a 8 DW boundary--the next dword +* must be on a 8-dword boundary. Our IB packet below is 6 +* dwords long, thus add x number of NOPs, such that, in +* modular arithmetic, +* wptr + 6 + x = 8k, k >= 0, which in C is, +* (wptr + 6 + x) % 8 = 0. +* The expression below, is a solution of x. +*/ +sdma_v5_0_ring_insert_nop (ring, (2 -lower_32_bits (ring->wptr)) &7 );amdgpu_ring_write (ring,SDMA_PKT_HEADER_OP (SDMA_OP_INDIRECT ) |SDMA_PKT_INDIRECT_HEADER_VMID (vmid &0xf ));
@@ -1086,10 +1093,10 @@ static void sdma_v5_0_vm_set_pte_pde(struct amdgpu_ib *ib, }/** -* sdma_v5_0_ring_pad_ib - pad the IB to the required number of dw -* +* sdma_v5_0_ring_pad_ib - pad the IB * @ib: indirect buffer to fill with padding * +* Pad the IB with NOPs to a boundary multiple of 8. */ static void sdma_v5_0_ring_pad_ib (struct amdgpu_ring *ring,struct amdgpu_ib *ib) {
@@ -1097,7 +1104,7 @@ static void sdma_v5_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ibu32 pad_count;int i; - pad_count = (8 - (ib->length_dw &0x7 )) %8 ; + pad_count = (-ib->length_dw) &0x7 ;for (i =0 ; i < pad_count; i++)if (sdma && sdma->burst_nop && (i ==0 )) ib->ptr[ib->length_dw++] =
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 49/147 drm/amdgpu: invalidate L2 before SDMA IBs (v2)
In reply to Greg Kroah-HartmanFrom: Marek Olšák <[email protected]>
[ Upstream commit fdf83646c0542ecfb9adc4db8f741a1f43dca058 ]
This fixes GPU hangs due to cache coherency issues.
v2: Split the version bump to a separate patch
--- .../gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h | 16 ++++++++++++++++ drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 14 +++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h +16 -0
@@ -73,6 +73,22 @@#define SDMA_OP_AQL_COPY 0#define SDMA_OP_AQL_BARRIER_OR 0 +#define SDMA_GCR_RANGE_IS_PA (1 << 18) +#define SDMA_GCR_SEQ (x) (((x) & 0x3) << 16) +#define SDMA_GCR_GL2_WB (1 << 15) +#define SDMA_GCR_GL2_INV (1 << 14) +#define SDMA_GCR_GL2_DISCARD (1 << 13) +#define SDMA_GCR_GL2_RANGE (x) (((x) & 0x3) << 11) +#define SDMA_GCR_GL2_US (1 << 10) +#define SDMA_GCR_GL1_INV (1 << 9) +#define SDMA_GCR_GLV_INV (1 << 8) +#define SDMA_GCR_GLK_INV (1 << 7) +#define SDMA_GCR_GLK_WB (1 << 6) +#define SDMA_GCR_GLM_INV (1 << 5) +#define SDMA_GCR_GLM_WB (1 << 4) +#define SDMA_GCR_GL1_RANGE (x) (((x) & 0x3) << 2) +#define SDMA_GCR_GLI_INV (x) (((x) & 0x3) << 0) +/*define for op field*/ #define SDMA_PKT_HEADER_op_offset 0#define SDMA_PKT_HEADER_op_mask 0x000000FF
drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +13 -1
@@ -382,6 +382,18 @@ static void sdma_v5_0_ring_emit_ib(struct amdgpu_ring *ring,unsigned vmid =AMDGPU_JOB_GET_VMID (job);uint64_t csa_mc_addr =amdgpu_sdma_get_csa_mc_addr (ring, vmid); +/* Invalidate L2, because if we don't do it, we might get stale cache +* lines from previous IBs. +*/ +amdgpu_ring_write (ring,SDMA_PKT_HEADER_OP (SDMA_OP_GCR_REQ )); +amdgpu_ring_write (ring,0 ); +amdgpu_ring_write (ring, (SDMA_GCR_GL2_INV | +SDMA_GCR_GL2_WB | +SDMA_GCR_GLM_INV | +SDMA_GCR_GLM_WB ) <<16 ); +amdgpu_ring_write (ring,0xffffff80 ); +amdgpu_ring_write (ring,0xffff ); +/* An IB packet must end on a 8 DW boundary--the next dword * must be on a 8-dword boundary. Our IB packet below is 6 * dwords long, thus add x number of NOPs, such that, in
@@ -1607,7 +1619,7 @@ static const struct amdgpu_ring_funcs sdma_v5_0_ring_funcs = {SOC15_FLUSH_GPU_TLB_NUM_WREG *3 +SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT *6 *2 + 10 + 10 + 10, /* sdma_v5_0_ring_emit_fence x3 for user fence, vm fence */ - .emit_ib_size = 7 + 6, /* sdma_v5_0_ring_emit_ib */ + .emit_ib_size = 5 + 7 + 6, /* sdma_v5_0_ring_emit_ib */ .emit_ib = sdma_v5_0_ring_emit_ib, .emit_fence = sdma_v5_0_ring_emit_fence, .emit_pipeline_sync = sdma_v5_0_ring_emit_pipeline_sync,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 50/147 ipc/util.c: sysvipc_find_ipc() incorrectly updates position index
In reply to Greg Kroah-HartmanFrom: Vasily Averin <[email protected]>
[ Upstream commit 5e698222c70257d13ae0816720dde57c56f81e15 ]
Commit 89163f93c6f9 ("ipc/util.c: sysvipc_find_ipc() should increase position index") is causing this bug (seen on 5.6.8):
# ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
# ipcmk -Q Message queue id: 0 # ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages 0x82db8127 0 root 644 0 0
# ipcmk -Q Message queue id: 1 # ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages 0x82db8127 0 root 644 0 0 0x76d1fb2a 1 root 644 0 0
# ipcrm -q 0 # ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages 0x76d1fb2a 1 root 644 0 0 0x76d1fb2a 1 root 644 0 0
# ipcmk -Q Message queue id: 2 # ipcrm -q 2 # ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages 0x76d1fb2a 1 root 644 0 0 0x76d1fb2a 1 root 644 0 0
# ipcmk -Q Message queue id: 3 # ipcrm -q 1 # ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages 0x7c982867 3 root 644 0 0 0x7c982867 3 root 644 0 0 0x7c982867 3 root 644 0 0 0x7c982867 3 root 644 0 0
Whenever an IPC item with a low id is deleted, the items with higher ids are duplicated, as if filling a hole.
new_pos should jump through hole of unused ids, pos can be updated inside "for" cycle.
--- ipc/util.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
ipc/util.c +6 -6
@@ -764,21 +764,21 @@ static struct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t pos, total++; } - *new_pos = pos +1 ; + ipc =NULL ;if (total >= ids->in_use) -return NULL ; + goto out;for (; pos < ipc_mni; pos++) { ipc =idr_find (&ids->ipcs_idr, pos);if (ipc !=NULL ) {rcu_read_lock ();ipc_lock_object (ipc); -return ipc; +break ; } } - -/* Out of range - return NULL to terminate iteration */ -return NULL ; +out: + *new_pos = pos +1 ; +return ipc; }static void *sysvipc_proc_next (struct seq_file *s,void *it,loff_t *pos)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 51/147 ALSA: hda/realtek - Fix S3 pop noise on Dell Wyse
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit 52e4e36807aeac1cdd07b14e509c8a64101e1a09 ]
Commit 317d9313925c ("ALSA: hda/realtek - Set default power save node to 0") makes the ALC225 have pop noise on S3 resume and cold boot.
The previous fix enable power save node universally for ALC225, however it makes some ALC225 systems unable to produce any sound.
So let's only enable power save node for the affected Dell Wyse platform.
--- sound/pci/hda/patch_realtek.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
sound/pci/hda/patch_realtek.c +16 -0
@@ -5743,6 +5743,15 @@ static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec, } } +static void alc225_fixup_s3_pop_noise (struct hda_codec *codec, +const struct hda_fixup *fix,int action) +{ +if (action !=HDA_FIXUP_ACT_PRE_PROBE ) +return ; + + codec->power_save_node =1 ; +} +/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */ static void alc274_fixup_bind_dacs (struct hda_codec *codec,const struct hda_fixup *fix,int action)
@@ -5932,6 +5941,7 @@ enum {ALC233_FIXUP_ACER_HEADSET_MIC ,ALC294_FIXUP_LENOVO_MIC_LOCATION ,ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE , +ALC225_FIXUP_S3_POP_NOISE ,ALC700_FIXUP_INTEL_REFERENCE ,ALC274_FIXUP_DELL_BIND_DACS , ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
@@ -6817,6 +6827,12 @@ static const struct hda_fixup alc269_fixups[] = { { } }, .chained = true, + .chain_id =ALC225_FIXUP_S3_POP_NOISE + }, + [ALC225_FIXUP_S3_POP_NOISE] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc225_fixup_s3_pop_noise, + .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC }, [ALC700_FIXUP_INTEL_REFERENCE] = {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 52/147 gfs2: Another gfs2_walk_metadata fix
In reply to Greg Kroah-HartmanFrom: Andreas Gruenbacher <[email protected]>
[ Upstream commit 566a2ab3c9005f62e784bd39022d58d34ef4365c ]
Make sure we don't walk past the end of the metadata in gfs2_walk_metadata: the inode holds fewer pointers than indirect blocks.
Slightly clean up gfs2_iomap_get.
--- fs/gfs2/bmap.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
fs/gfs2/bmap.c +9 -7
@@ -528,10 +528,12 @@ static int gfs2_walk_metadata(struct inode *inode, struct metapath *mp,/* Advance in metadata tree. */ (mp->mp_list[hgt])++; -if (mp->mp_list[hgt] >= sdp->sd_inptrs) { -if (!hgt) +if (hgt) { +if (mp->mp_list[hgt] >= sdp->sd_inptrs) + goto lower_metapath; + }else { +if (mp->mp_list[hgt] >= sdp->sd_diptrs)break ; - goto lower_metapath; } fill_up_metapath:
@@ -876,10 +878,9 @@ static int gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length, ret = -ENOENT ; goto unlock; }else { -/* report a hole */ iomap->offset = pos; iomap->length = length; - goto do_alloc; + goto hole_found; } } iomap->length = size;
@@ -933,8 +934,6 @@ static int gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length,return ret; do_alloc: - iomap->addr =IOMAP_NULL_ADDR ; - iomap->type =IOMAP_HOLE ;if (flags &IOMAP_REPORT ) {if (pos >= size) ret = -ENOENT ;
@@ -956,6 +955,9 @@ static int gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length,if (pos < size && height == ip->i_height) ret =gfs2_hole_size (inode, lblock, len, mp, iomap); } +hole_found: + iomap->addr =IOMAP_NULL_ADDR ; + iomap->type =IOMAP_HOLE ; goto out; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 53/147 mmc: sdhci-pci-gli: Fix no irq handler from suspend
In reply to Greg Kroah-HartmanFrom: Ben Chuang <[email protected]>
[ Upstream commit 282ede76e47048eebc8ce5324b412890f0ec0a69 ]
The kernel prints a message similar to
"[ 28.881959] do_IRQ: 5.36 No irq handler for vector"
when GL975x resumes from suspend. Implement a resume callback to fix this.
--- drivers/mmc/host/sdhci-pci-gli.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/mmc/host/sdhci-pci-gli.c +18 -0
@@ -334,6 +334,18 @@ static u32 sdhci_gl9750_readl(struct sdhci_host *host, int reg)return value; } +#ifdef CONFIG_PM_SLEEP +static int sdhci_pci_gli_resume (struct sdhci_pci_chip *chip) +{ +struct sdhci_pci_slot *slot = chip->slots[0 ]; + +pci_free_irq_vectors (slot->chip->pdev); +gli_pcie_enable_msi (slot); + +return sdhci_pci_resume_host (chip); +} +#endif +static const struct sdhci_ops sdhci_gl9755_ops = { .set_clock = sdhci_set_clock, .enable_dma = sdhci_pci_enable_dma,
@@ -348,6 +360,9 @@ const struct sdhci_pci_fixes sdhci_gl9755 = { .quirks2 = SDHCI_QUIRK2_BROKEN_DDR50, .probe_slot = gli_probe_slot_gl9755, .ops = &sdhci_gl9755_ops, +#ifdef CONFIG_PM_SLEEP + .resume = sdhci_pci_gli_resume, +#endif };static const struct sdhci_ops sdhci_gl9750_ops = {
@@ -366,4 +381,7 @@ const struct sdhci_pci_fixes sdhci_gl9750 = { .quirks2 = SDHCI_QUIRK2_BROKEN_DDR50, .probe_slot = gli_probe_slot_gl9750, .ops = &sdhci_gl9750_ops, +#ifdef CONFIG_PM_SLEEP + .resume = sdhci_pci_gli_resume, +#endif };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 54/147 IB/hfi1: Fix another case where pq is left on waitlist
In reply to Greg Kroah-HartmanFrom: Mike Marciniszyn <[email protected]>
[ Upstream commit fa8dac3968635dec8518a13ac78d662f2aa88e4d ]
The commit noted below fixed a case where a pq is left on the sdma wait list.
It however missed another case.
user_sdma_send_pkts() has two calls from hfi1_user_sdma_process_request().
If the first one fails as indicated by -EBUSY, the pq will be placed on the waitlist as by design.
If the second call then succeeds, the pq is still on the waitlist setting up a race with the interrupt handler if a subsequent request uses a different SDMA engine
Fix by deleting the first call.
The use of pcount and the intent to send a short burst of packets followed by the larger balance of packets was never correctly implemented, because the two calls always send pcount packets no matter what. A subsequent patch will correct that issue.
--- drivers/infiniband/hw/hfi1/user_sdma.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/infiniband/hw/hfi1/user_sdma.c +0 -4
@@ -589,10 +589,6 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,set_comp_state (pq, cq, info.comp_idx,QUEUED ,0 ); pq->state =SDMA_PKT_Q_ACTIVE ; -/* Send the first N packets in the request to buy us some time */ - ret =user_sdma_send_pkts (req, pcount); -if (unlikely (ret <0 && ret != -EBUSY )) - goto free_req;/* * This is a somewhat blocking send implementation.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 55/147 ACPI: EC: PM: Avoid premature returns from acpi_s2idle_wake()
In reply to Greg Kroah-HartmanFrom: Rafael J. Wysocki <[email protected]>
[ Upstream commit 7b301750f7f8f6503e11f1af4a03832525f58c66 ]
If the EC GPE status is not set after checking all of the other GPEs, acpi_s2idle_wake() returns 'false', to indicate that the SCI event that has just triggered is not a system wakeup one, but it does that without canceling the pending wakeup and re-arming the SCI for system wakeup which is a mistake, because it may cause s2idle_loop() to busy spin until the next valid wakeup event. [If that happens, the first spurious wakeup is still pending after acpi_s2idle_wake() has returned, so s2idle_enter() does nothing, acpi_s2idle_wake() is called again and it sees that the SCI has triggered, but no GPEs are active, so 'false' is returned again, and so on.]
Fix that by moving all of the GPE checking logic from acpi_s2idle_wake() to acpi_ec_dispatch_gpe() and making the latter return 'true' only if a non-EC GPE has triggered and 'false' otherwise, which will cause acpi_s2idle_wake() to cancel the pending SCI wakeup and re-arm the SCI for system wakeup regardless of the EC GPE status.
This also addresses a lockup observed on an Elitegroup EF20EA laptop after attempting to wake it up from suspend-to-idle by a key press.
--- drivers/acpi/ec.c | 24 ++++++++++++++++-------- drivers/acpi/internal.h | 1 - drivers/acpi/sleep.c | 14 ++------------ 3 files changed, 18 insertions(+), 21 deletions(-)
drivers/acpi/ec.c +16 -8
@@ -1962,23 +1962,31 @@ void acpi_ec_set_gpe_wake_mask(u8 action) acpi_set_gpe_wake_mask(NULL, first_ec->gpe, action); } -bool acpi_ec_other_gpes_active (void ) -{ -return acpi_any_gpe_status_set (first_ec ? first_ec->gpe :U32_MAX ); -} -bool acpi_ec_dispatch_gpe (void ) {u32 ret;if (!first_ec) +return acpi_any_gpe_status_set (U32_MAX ); + +/* +* Report wakeup if the status bit is set for any enabled GPE other +* than the EC one. +*/ +if (acpi_any_gpe_status_set (first_ec->gpe)) +return true; + +if (ec_no_wakeup)return false; +/* +* Dispatch the EC GPE in-band, but do not report wakeup in any case +* to allow the caller to process events properly after that. +*/ ret =acpi_dispatch_gpe (NULL , first_ec->gpe); -if (ret ==ACPI_INTERRUPT_HANDLED ) { +if (ret ==ACPI_INTERRUPT_HANDLED )pm_pr_dbg ("EC GPE dispatched\n" ); -return true; - } +return false; }#endif /* CONFIG_PM_SLEEP */
drivers/acpi/internal.h +0 -1
@@ -201,7 +201,6 @@ void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit);#ifdef CONFIG_PM_SLEEP void acpi_ec_flush_work (void ); -bool acpi_ec_other_gpes_active (void );bool acpi_ec_dispatch_gpe (void );#endif
drivers/acpi/sleep.c +2 -12
@@ -1010,20 +1010,10 @@ static bool acpi_s2idle_wake(void)if (acpi_check_wakeup_handlers ())return true; -/* -* If the status bit is set for any enabled GPE other than the -* EC one, the wakeup is regarded as a genuine one. -*/ -if (acpi_ec_other_gpes_active ()) +/* Check non-EC GPE wakeups and dispatch the EC GPE. */ +if (acpi_ec_dispatch_gpe ())return true; -/* -* If the EC GPE status bit has not been set, the wakeup is -* regarded as a spurious one. -*/ -if (!acpi_ec_dispatch_gpe ()) -return false; -/* * Cancel the wakeup and process all pending events in case * there are any wakeup ones in there.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 56/147 pinctrl: sunrisepoint: Fix PAD lock register offset for SPT-H
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 6b7275c87717652daace4c0b8131eb184c7d7516 ]
It appears that SPT-H variant has different offset for PAD locking registers. Fix it here.
--- drivers/pinctrl/intel/pinctrl-sunrisepoint.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/pinctrl/intel/pinctrl-sunrisepoint.c +8 -7
@@ -15,17 +15,18 @@#include "pinctrl-intel.h" -#define SPT_PAD_OWN 0x020 -#define SPT_PADCFGLOCK 0x0a0 -#define SPT_HOSTSW_OWN 0x0d0 -#define SPT_GPI_IS 0x100 -#define SPT_GPI_IE 0x120 +#define SPT_PAD_OWN 0x020 +#define SPT_H_PADCFGLOCK 0x090 +#define SPT_LP_PADCFGLOCK 0x0a0 +#define SPT_HOSTSW_OWN 0x0d0 +#define SPT_GPI_IS 0x100 +#define SPT_GPI_IE 0x120#define SPT_COMMUNITY (b, s, e) \ { \ .barno = (b), \ .padown_offset = SPT_PAD_OWN, \ - .padcfglock_offset = SPT_PADCFGLOCK, \ + .padcfglock_offset = SPT_LP_PADCFGLOCK, \ .hostown_offset = SPT_HOSTSW_OWN, \ .is_offset = SPT_GPI_IS, \ .ie_offset = SPT_GPI_IE, \
@@ -47,7 +48,7 @@ { \ .barno = (b), \ .padown_offset = SPT_PAD_OWN, \ - .padcfglock_offset = SPT_PADCFGLOCK, \ + .padcfglock_offset = SPT_H_PADCFGLOCK, \ .hostown_offset = SPT_HOSTSW_OWN, \ .is_offset = SPT_GPI_IS, \ .ie_offset = SPT_GPI_IE, \
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 57/147 pinctrl: baytrail: Enable pin configuration setting for GPIO chip
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit ccd025eaddaeb99e982029446197c544252108e2 ]
It appears that pin configuration for GPIO chip hasn't been enabled yet due to absence of ->set_config() callback.
Enable it here for Intel Baytrail.
Depends-on: 2956b5d94a76 ("pinctrl / gpio: Introduce .set_config() callback for GPIO chips")
--- drivers/pinctrl/intel/pinctrl-baytrail.c | 1 + 1 file changed, 1 insertion(+)
drivers/pinctrl/intel/pinctrl-baytrail.c +1 -0
@@ -1297,6 +1297,7 @@ static const struct gpio_chip byt_gpio_chip = { .direction_output = byt_gpio_direction_output, .get = byt_gpio_get, .set = byt_gpio_set, + .set_config = gpiochip_generic_config, .dbg_show = byt_gpio_dbg_show, };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 58/147 pinctrl: qcom: fix wrong write in update_dual_edge
In reply to Greg Kroah-HartmanFrom: Ansuel Smith <[email protected]>
[ Upstream commit 90bcb0c3ca0809d1ed358bfbf838df4b3d4e58e0 ]
Fix a typo in the readl/writel accessor conversion where val is used instead of pol changing the behavior of the original code.
--- drivers/pinctrl/qcom/pinctrl-msm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/qcom/pinctrl-msm.c +1 -1
@@ -688,7 +688,7 @@ static void msm_gpio_update_dual_edge_pos(struct msm_pinctrl *pctrl, pol =msm_readl_intr_cfg (pctrl, g); pol ^=BIT (g->intr_polarity_bit); -msm_writel_intr_cfg (val, pctrl, g); +msm_writel_intr_cfg (pol, pctrl, g); val2 =msm_readl_io (pctrl, g) &BIT (g->in_bit); intstat =msm_readl_intr_status (pctrl, g);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 59/147 pinctrl: cherryview: Add missing spinlock usage in chv_gpio_irq_handler
In reply to Greg Kroah-HartmanFrom: Grace Kao <[email protected]>
[ Upstream commit 69388e15f5078c961b9e5319e22baea4c57deff1 ]
According to Braswell NDA Specification Update (#557593), concurrent read accesses may result in returning 0xffffffff and write instructions may be dropped. We have an established format for the commit references, i.e.cdca06e4e859 ("pinctrl: baytrail: Add missing spinlock usage in byt_gpio_irq_handler")
--- drivers/pinctrl/intel/pinctrl-cherryview.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/pinctrl/intel/pinctrl-cherryview.c +4 -0
@@ -1474,11 +1474,15 @@ static void chv_gpio_irq_handler(struct irq_desc *desc)struct chv_pinctrl *pctrl =gpiochip_get_data (gc);struct irq_chip *chip =irq_desc_get_chip (desc);unsigned long pending; +unsigned long flags;u32 intr_line;chained_irq_enter (chip, desc); +raw_spin_lock_irqsave (&chv_lock, flags); pending =readl (pctrl->regs +CHV_INTSTAT ); +raw_spin_unlock_irqrestore (&chv_lock, flags); +for_each_set_bit (intr_line, &pending, pctrl->community->nirqs) {unsigned irq, offset;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 60/147 bpf: Fix error return code in map_lookup_and_delete_elem()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit 7f645462ca01d01abb94d75e6768c8b3ed3a188b ]
Fix to return negative error code -EFAULT from the copy_to_user() error handling case instead of 0, as done elsewhere in this function.
--- kernel/bpf/syscall.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/bpf/syscall.c +3 -1
@@ -1146,8 +1146,10 @@ static int map_lookup_and_delete_elem(union bpf_attr *attr)if (err) goto free_value; -if (copy_to_user (uvalue, value, value_size) !=0 ) +if (copy_to_user (uvalue, value, value_size) !=0 ) { + err = -EFAULT ; goto free_value; + } err =0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 61/147 ALSA: firewire-lib: fix function sizeof not defined error of tracepoints format
In reply to Greg Kroah-HartmanFrom: Takashi Sakamoto <[email protected]>
[ Upstream commit 1034872123a06b759aba772b1c99612ccb8e632a ]
The snd-firewire-lib.ko has 'amdtp-packet' event of tracepoints. Current printk format for the event includes 'sizeof(u8)' macro expected to be extended in compilation time. However, this is not done. As a result, perf tools cannot parse the event for printing:
$ mount -l -t debugfs
debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime)
$ cat /sys/kernel/debug/tracing/events/snd_firewire_lib/amdtp_packet/format
...
print fmt: "%02u %04u %04x %04x %02d %03u %02u %03u %02u %01u %02u %s",
REC->second, REC->cycle, REC->src, REC->dest, REC->channel,
REC->payload_quadlets, REC->data_blocks, REC->data_block_counter,
REC->packet_index, REC->irq, REC->index,
__print_array(__get_dynamic_array(cip_header),
__get_dynamic_array_len(cip_header),
sizeof(u8))$ sudo perf record -e snd_firewire_lib:amdtp_packet [snd_firewire_lib:amdtp_packet] function sizeof not defined Error: expected type 5 but read 0
This commit fixes it by obsoleting the macro with actual size.
--- sound/firewire/amdtp-stream-trace.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
sound/firewire/amdtp-stream-trace.h +1 -2
@@ -66,8 +66,7 @@ TRACE_EVENT(amdtp_packet, __entry->irq, __entry->index,__print_array (__get_dynamic_array (cip_header), -__get_dynamic_array_len (cip_header), - sizeof(u8))) + __get_dynamic_array_len(cip_header), 1)) );#endif
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 62/147 i40iw: Fix error handling in i40iw_manage_arp_cache()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 37e31d2d26a4124506c24e95434e9baf3405a23a ]
The i40iw_arp_table() function can return -EOVERFLOW if i40iw_alloc_resource() fails so we can't just test for "== -1".
--- drivers/infiniband/hw/i40iw/i40iw_hw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/i40iw/i40iw_hw.c +1 -1
@@ -534,7 +534,7 @@ void i40iw_manage_arp_cache(struct i40iw_device *iwdev,int arp_index; arp_index =i40iw_arp_table (iwdev, ip_addr, ipv4, mac_addr, action); -if (arp_index ==-1 ) +if (arp_index <0 )return ; cqp_request =i40iw_get_cqp_request (&iwdev->cqp, false);if (!cqp_request)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 63/147 drm/i915: Dont enable WaIncreaseLatencyIPCEnabled when IPC is disabled
In reply to Greg Kroah-HartmanFrom: Sultan Alsawaf <[email protected]>
[ Upstream commit 421abe200321a2c907ede1a6208c558284ba0b75 ]
In commit 5a7d202b1574, a logical AND was erroneously changed to an OR, causing WaIncreaseLatencyIPCEnabled to be enabled unconditionally for kabylake and coffeelake, even when IPC is disabled. Fix the logic so that WaIncreaseLatencyIPCEnabled is only used when IPC is enabled.
--- drivers/gpu/drm/i915/intel_pm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/intel_pm.c +1 -1
@@ -4784,7 +4784,7 @@ static void skl_compute_plane_wm(const struct intel_crtc_state *crtc_state,* WaIncreaseLatencyIPCEnabled: kbl,cfl * Display WA #1141: kbl,cfl */ -if ((IS_KABYLAKE (dev_priv) ||IS_COFFEELAKE (dev_priv)) || +if ((IS_KABYLAKE (dev_priv) ||IS_COFFEELAKE (dev_priv)) && dev_priv->ipc_enabled) latency +=4 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 64/147 bpf, sockmap: msg_pop_data can incorrecty set an sge length
In reply to Greg Kroah-HartmanFrom: John Fastabend <[email protected]>
[ Upstream commit 3e104c23816220919ea1b3fd93fabe363c67c484 ]
When sk_msg_pop() is called where the pop operation is working on the end of a sge element and there is no additional trailing data and there _is_ data in front of pop, like the following case,
|____________a_____________|__pop__|
We have out of order operations where we incorrectly set the pop variable so that instead of zero'ing pop we incorrectly leave it untouched, effectively. This can cause later logic to shift the buffers around believing it should pop extra space. The result is we have 'popped' more data then we expected potentially breaking program logic.
It took us a while to hit this case because typically we pop headers which seem to rarely be at the end of a scatterlist elements but we can't rely on this.
--- net/core/filter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/filter.c +1 -1
@@ -2590,8 +2590,8 @@ BPF_CALL_4(bpf_msg_pop_data, struct sk_msg *, msg, u32, start, } pop =0 ; }else if (pop >= sge->length - a) { - sge->length = a; pop -= (sge->length - a); + sge->length = a; } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 65/147 bpf, sockmap: bpf_tcp_ingress needs to subtract bytes from sg.size
In reply to Greg Kroah-HartmanFrom: John Fastabend <[email protected]>
[ Upstream commit 81aabbb9fb7b4b1efd073b62f0505d3adad442f3 ]
In bpf_tcp_ingress we used apply_bytes to subtract bytes from sg.size which is used to track total bytes in a message. But this is not correct because apply_bytes is itself modified in the main loop doing the mem_charge.
Then at the end of this we have sg.size incorrectly set and out of sync with actual sk values. Then we can get a splat if we try to cork the data later and again try to redirect the msg to ingress. To fix instead of trying to track msg.size do the easy thing and include it as part of the sk_msg_xfer logic so that when the msg is moved the sg.size is always correct.
To reproduce the below users will need ingress + cork and hit an error path that will then try to 'free' the skmsg.
[ 173.699981] BUG: KASAN: null-ptr-deref in sk_msg_free_elem+0xdd/0x120 [ 173.699987] Read of size 8 at addr 0000000000000008 by task test_sockmap/5317
[ 173.700000] CPU: 2 PID: 5317 Comm: test_sockmap Tainted: G I 5.7.0-rc1+ #43 [ 173.700005] Hardware name: Dell Inc. Precision 5820 Tower/002KVM, BIOS 1.9.2 01/24/2019 [ 173.700009] Call Trace: [ 173.700021] dump_stack+0x8e/0xcb [ 173.700029] ? sk_msg_free_elem+0xdd/0x120 [ 173.700034] ? sk_msg_free_elem+0xdd/0x120 [ 173.700042] __kasan_report+0x102/0x15f [ 173.700052] ? sk_msg_free_elem+0xdd/0x120 [ 173.700060] kasan_report+0x32/0x50 [ 173.700070] sk_msg_free_elem+0xdd/0x120 [ 173.700080] __sk_msg_free+0x87/0x150 [ 173.700094] tcp_bpf_send_verdict+0x179/0x4f0 [ 173.700109] tcp_bpf_sendpage+0x3ce/0x5d0
--- include/linux/skmsg.h | 1 + net/ipv4/tcp_bpf.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-)
include/linux/skmsg.h +1 -0
@@ -186,6 +186,7 @@ static inline void sk_msg_xfer(struct sk_msg *dst, struct sk_msg *src, dst->sg.data[which] = src->sg.data[which]; dst->sg.data[which].length = size; dst->sg.size += size; + src->sg.size -= size; src->sg.data[which].length -= size; src->sg.data[which].offset += size; }
net/ipv4/tcp_bpf.c +0 -1
@@ -200,7 +200,6 @@ static int bpf_tcp_ingress(struct sock *sk, struct sk_psock *psock,if (!ret) { msg->sg.start = i; - msg->sg.size -= apply_bytes;sk_psock_queue_msg (psock, tmp);sk_psock_data_ready (sk, psock); }else {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 66/147 mmc: alcor: Fix a resource leak in the error path for ->probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 7c277dd2b0ff6a16f1732a66c2c52a29f067163e ]
If devm_request_threaded_irq() fails, the allocated struct mmc_host needs to be freed via calling mmc_free_host(), so let's do that.
--- drivers/mmc/host/alcor.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/mmc/host/alcor.c +5 -1
@@ -1104,7 +1104,7 @@ static int alcor_pci_sdmmc_drv_probe(struct platform_device *pdev)if (ret) {dev_err (&pdev->dev,"Failed to get irq for data line\n" ); -return ret; + goto free_host; }mutex_init (&host->cmd_mutex);
@@ -1116,6 +1116,10 @@ static int alcor_pci_sdmmc_drv_probe(struct platform_device *pdev)dev_set_drvdata (&pdev->dev, host);mmc_add_host (mmc);return 0 ; + +free_host: +mmc_free_host (mmc); +return ret; }static int alcor_pci_sdmmc_drv_remove (struct platform_device *pdev)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 67/147 mmc: sdhci-pci-gli: Fix can not access GL9750 after reboot from Windows 10
In reply to Greg Kroah-HartmanFrom: Ben Chuang <[email protected]>
[ Upstream commit b56ff195c317ad28c05d354aeecbb9995b8e08c1 ]
Need to clear some bits in a vendor-defined register after reboot from Windows 10.
--- drivers/mmc/host/sdhci-pci-gli.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/mmc/host/sdhci-pci-gli.c +5 -0
@@ -26,6 +26,9 @@#define SDHCI_GLI_9750_DRIVING_2 GENMASK(27, 26)#define GLI_9750_DRIVING_1_VALUE 0xFFF#define GLI_9750_DRIVING_2_VALUE 0x3 +#define SDHCI_GLI_9750_SEL_1 BIT(29) +#define SDHCI_GLI_9750_SEL_2 BIT(31) +#define SDHCI_GLI_9750_ALL_RST (BIT(24)|BIT(25)|BIT(28)|BIT(30))#define SDHCI_GLI_9750_PLL 0x864#define SDHCI_GLI_9750_PLL_TX2_INV BIT(23)
@@ -122,6 +125,8 @@ static void gli_set_9750(struct sdhci_host *host) GLI_9750_DRIVING_1_VALUE); driving_value |=FIELD_PREP (SDHCI_GLI_9750_DRIVING_2 ,GLI_9750_DRIVING_2_VALUE ); + driving_value &= ~(SDHCI_GLI_9750_SEL_1 |SDHCI_GLI_9750_SEL_2 |SDHCI_GLI_9750_ALL_RST ); + driving_value |=SDHCI_GLI_9750_SEL_2 ;sdhci_writel (host, driving_value,SDHCI_GLI_9750_DRIVING ); sw_ctrl_value &= ~SDHCI_GLI_9750_SW_CTRL_4 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 68/147 mmc: core: Check request type before completing the request
In reply to Greg Kroah-HartmanFrom: Veerabhadrarao Badiganti <[email protected]>
[ Upstream commit e6bfb1bf00852b55f4c771f47ae67004c04d3c87 ]
In the request completion path with CQE, request type is being checked after the request is getting completed. This is resulting in returning the wrong request type and leading to the IO hang issue.
ASYNC request type is getting returned for DCMD type requests. Because of this mismatch, mq->cqe_busy flag is never getting cleared and the driver is not invoking blk_mq_hw_run_queue. So requests are not getting dispatched to the LLD from the block layer.
All these eventually leading to IO hang issues. So, get the request type before completing the request.
--- drivers/mmc/core/block.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/mmc/core/block.c +2 -1
@@ -1417,6 +1417,7 @@ static void mmc_blk_cqe_complete_rq(struct mmc_queue *mq, struct request *req)struct mmc_request *mrq = &mqrq->brq.mrq;struct request_queue *q = req->q;struct mmc_host *host = mq->card->host; +enum mmc_issue_type issue_type =mmc_issue_type (mq, req);unsigned long flags;bool put_card;int err;
@@ -1446,7 +1447,7 @@ static void mmc_blk_cqe_complete_rq(struct mmc_queue *mq, struct request *req)spin_lock_irqsave (&mq->lock, flags); - mq->in_flight[mmc_issue_type (mq, req)] -=1 ; + mq->in_flight[issue_type] -=1 ; put_card = (mmc_tot_in_flight (mq) ==0 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 69/147 mmc: core: Fix recursive locking issue in CQE recovery path
In reply to Greg Kroah-HartmanFrom: Sarthak Garg <[email protected]>
[ Upstream commit 39a22f73744d5baee30b5f134ae2e30b668b66ed ]
Consider the following stack trace
-001|raw_spin_lock_irqsave -002|mmc_blk_cqe_complete_rq -003|__blk_mq_complete_request(inline) -003|blk_mq_complete_request(rq) -004|mmc_cqe_timed_out(inline) -004|mmc_mq_timed_out
mmc_mq_timed_out acquires the queue_lock for the first time. The mmc_blk_cqe_complete_rq function also tries to acquire the same queue lock resulting in recursive locking where the task is spinning for the same lock which it has already acquired leading to watchdog bark.
Fix this issue with the lock only for the required critical section.
--- drivers/mmc/core/queue.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
drivers/mmc/core/queue.c +4 -9
@@ -107,7 +107,7 @@ static enum blk_eh_timer_return mmc_cqe_timed_out(struct request *req)case MMC_ISSUE_DCMD :if (host->cqe_ops->cqe_timeout (host, mrq, &recovery_needed)) {if (recovery_needed) -__mmc_cqe_recovery_notifier (mq); +mmc_cqe_recovery_notifier (mrq);return BLK_EH_RESET_TIMER ; }/* No timeout (XXX: huh? comment doesn't make much sense) */
@@ -125,18 +125,13 @@ static enum blk_eh_timer_return mmc_mq_timed_out(struct request *req,struct request_queue *q = req->q;struct mmc_queue *mq = q->queuedata;unsigned long flags; -int ret; +bool ignore_tout;spin_lock_irqsave (&mq->lock, flags); - -if (mq->recovery_needed || !mq->use_cqe) - ret =BLK_EH_RESET_TIMER ; -else - ret =mmc_cqe_timed_out (req); - + ignore_tout = mq->recovery_needed || !mq->use_cqe;spin_unlock_irqrestore (&mq->lock, flags); -return ret; +return ignore_tout ?BLK_EH_RESET_TIMER :mmc_cqe_timed_out (req); }static void mmc_mq_recovery_handler (struct work_struct *work)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 70/147 mmc: block: Fix request completion in the CQE timeout path
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
[ Upstream commit c077dc5e0620508a29497dac63a2822324ece52a ]
First, it should be noted that the CQE timeout (60 seconds) is substantial so a CQE request that times out is really stuck, and the race between timeout and completion is extremely unlikely. Nevertheless this patch fixes an issue with it.
Commit ad73d6feadbd7b ("mmc: complete requests from ->timeout") preserved the existing functionality, to complete the request. However that had only been necessary because the block layer timeout handler had been marking the request to prevent it from being completed normally. That restriction was removed at the same time, the result being that a request that has gone will have been completed anyway. That is, the completion was unnecessary.
At the time, the unnecessary completion was harmless because the block layer would ignore it, although that changed in kernel v5.0.
Note for stable, this patch will not apply cleanly without patch "mmc:
core: Fix recursive locking issue in CQE recovery path"
--- drivers/mmc/core/queue.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/mmc/core/queue.c +1 -2
@@ -110,8 +110,7 @@ static enum blk_eh_timer_return mmc_cqe_timed_out(struct request *req)mmc_cqe_recovery_notifier (mrq);return BLK_EH_RESET_TIMER ; } -/* No timeout (XXX: huh? comment doesn't make much sense) */ -blk_mq_complete_request (req); +/* The request has gone already */ return BLK_EH_DONE ;default :/* Timeout is handled by mmc core */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 71/147 gfs2: More gfs2_find_jhead fixes
In reply to Greg Kroah-HartmanFrom: Andreas Gruenbacher <[email protected]>
[ Upstream commit aa83da7f47b26c9587bade6c4bc4736ffa308f0a ]
It turns out that when extending an existing bio, gfs2_find_jhead fails to check if the block number is consecutive, which leads to incorrect reads for fragmented journals.
In addition, limit the maximum bio size to an arbitrary value of 2 megabytes:
since commit 07173c3ec276 ("block: enable multipage bvecs"), if we just keep adding pages until bio_add_page fails, bios will grow much larger than useful, which pins more memory than necessary with barely any additional performance gains.
--- fs/gfs2/lops.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
fs/gfs2/lops.c +12 -7
@@ -264,7 +264,7 @@ static struct bio *gfs2_log_alloc_bio(struct gfs2_sbd *sdp, u64 blkno,struct super_block *sb = sdp->sd_vfs;struct bio *bio =bio_alloc (GFP_NOIO ,BIO_MAX_PAGES ); - bio->bi_iter.bi_sector = blkno << (sb->s_blocksize_bits -9 ); + bio->bi_iter.bi_sector = blkno << sdp->sd_fsb2bb_shift;bio_set_dev (bio, sb->s_bdev); bio->bi_end_io = end_io; bio->bi_private = sdp;
@@ -504,7 +504,7 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head,unsigned int bsize = sdp->sd_sb.sb_bsize, off;unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift;unsigned int shift =PAGE_SHIFT - bsize_shift; -unsigned int readahead_blocks =BIO_MAX_PAGES << shift; +unsigned int max_bio_size =2 *1024 *1024 ;struct gfs2_journal_extent *je;int sz, ret =0 ;struct bio *bio =NULL ;
@@ -532,12 +532,17 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, off =0 ; } -if (!bio || (bio_chained && !off)) { +if (!bio || (bio_chained && !off) || + bio->bi_iter.bi_size >= max_bio_size) {/* start new bio */ }else { - sz =bio_add_page (bio, page, bsize, off); -if (sz == bsize) - goto block_added; +sector_t sector = dblock << sdp->sd_fsb2bb_shift; + +if (bio_end_sector (bio) == sector) { + sz =bio_add_page (bio, page, bsize, off); +if (sz == bsize) + goto block_added; + }if (off) {unsigned int blocks = (PAGE_SIZE - off) >> bsize_shift;
@@ -563,7 +568,7 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header_host *head, off += bsize;if (off ==PAGE_SIZE ) page =NULL ; -if (blocks_submitted < blocks_read + readahead_blocks) { +if (blocks_submitted <2 * max_bio_size >> bsize_shift) {/* Keep at least one bio in flight */ continue ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 72/147 fork: prevent accidental access to clone3 features
In reply to Greg Kroah-HartmanFrom: Christian Brauner <[email protected]>
[ Upstream commit 3f2c788a13143620c5471ac96ac4f033fc9ac3f3 ]
Jan reported an issue where an interaction between sign-extending clone's flag argument on ppc64le and the new CLONE_INTO_CGROUP feature causes clone() to consistently fail with EBADF.
The whole story is a little longer. The legacy clone() syscall is odd in a bunch of ways and here two things interact. First, legacy clone's flag argument is word-size dependent, i.e. it's an unsigned long whereas most system calls with flag arguments use int or unsigned int. Second, legacy clone() ignores unknown and deprecated flags. The two of them taken together means that users on 64bit systems can pass garbage for the upper 32bit of the clone() syscall since forever and things would just work fine. Just try this on a 64bit kernel prior to v5.7-rc1 where this will succeed and on v5.7-rc1 where this will fail with EBADF:
int main(int argc, char *argv[])
{
pid_t pid;
/* Note that legacy clone() has different argument ordering on
* different architectures so this won't work everywhere.
*
* Only set the upper 32 bits.
*/
pid = syscall(__NR_clone, 0xffffffff00000000 | SIGCHLD,
NULL, NULL, NULL, NULL);
if (pid < 0)
exit(EXIT_FAILURE);
if (pid == 0)
exit(EXIT_SUCCESS);
if (wait(NULL) != pid)
exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
}Since legacy clone() couldn't be extended this was not a problem so far and nobody really noticed or cared since nothing in the kernel ever bothered to look at the upper 32 bits.
But once we introduced clone3() and expanded the flag argument in struct clone_args to 64 bit we opened this can of worms. With the first flag-based extension to clone3() making use of the upper 32 bits of the flag argument we've effectively made it possible for the legacy clone() syscall to reach clone3() only flags. The sign extension scenario is just the odd corner-case that we needed to figure this out.
The reason we just realized this now and not already when we introduced CLONE_CLEAR_SIGHAND was that CLONE_INTO_CGROUP assumes that a valid cgroup file descriptor has been given. So the sign extension (or the user accidently passing garbage for the upper 32 bits) caused the CLONE_INTO_CGROUP bit to be raised and the kernel to error out when it didn't find a valid cgroup file descriptor.
Let's fix this by always capping the upper 32 bits for all codepaths that are not aware of clone3() features. This ensures that we can't reach clone3() only features by accident via legacy clone as with the sign extension case and also that legacy clone() works exactly like before, i.e. ignoring any unknown flags. This solution risks no regressions and is also pretty clean.
--- kernel/fork.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
kernel/fork.c +7 -6
@@ -2412,11 +2412,11 @@ long do_fork(unsigned long clone_flags, int __user *child_tidptr) {struct kernel_clone_args args = { - .flags = (clone_flags & ~CSIGNAL ), + .flags = (lower_32_bits (clone_flags) & ~CSIGNAL ), .pidfd = parent_tidptr, .child_tid = child_tidptr, .parent_tid = parent_tidptr, - .exit_signal = (clone_flags &CSIGNAL ), + .exit_signal = (lower_32_bits (clone_flags) &CSIGNAL ), .stack = stack_start, .stack_size = stack_size, };
@@ -2434,8 +2434,9 @@ long do_fork(unsigned long clone_flags,pid_t kernel_thread (int (*fn)(void *),void *arg,unsigned long flags) {struct kernel_clone_args args = { - .flags = ((flags |CLONE_VM |CLONE_UNTRACED ) & ~CSIGNAL ), - .exit_signal = (flags &CSIGNAL ), + .flags = ((lower_32_bits (flags) |CLONE_VM | +CLONE_UNTRACED ) & ~CSIGNAL ), + .exit_signal = (lower_32_bits (flags) &CSIGNAL ), .stack = (unsigned long )fn, .stack_size = (unsigned long )arg, };
@@ -2496,11 +2497,11 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,#endif {struct kernel_clone_args args = { - .flags = (clone_flags & ~CSIGNAL ), + .flags = (lower_32_bits (clone_flags) & ~CSIGNAL ), .pidfd = parent_tidptr, .child_tid = child_tidptr, .parent_tid = parent_tidptr, - .exit_signal = (clone_flags &CSIGNAL ), + .exit_signal = (lower_32_bits (clone_flags) &CSIGNAL ), .stack = newsp, .tls = tls, };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 73/147 drm/amdgpu: force fbdev into vram
In reply to Greg Kroah-HartmanFrom: Alex Deucher <[email protected]>
[ Upstream commit a6aacb2b26e85aa619cf0c6f98d0ca77314cd2a1 ]
We set the fb smem pointer to the offset into the BAR, so keep the fbdev bo in vram.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +1 -2
@@ -133,8 +133,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,u32 cpp;u64 flags =AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS | -AMDGPU_GEM_CREATE_VRAM_CLEARED | -AMDGPU_GEM_CREATE_CPU_GTT_USWC ; +AMDGPU_GEM_CREATE_VRAM_CLEARED ; info =drm_get_format_info (adev->ddev, mode_cmd); cpp = info->cpp[0 ];
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 74/147 NFS: Fix fscache super_cookie index_key from changing after umount
In reply to Greg Kroah-HartmanFrom: Dave Wysochanski <[email protected]>
[ Upstream commit d9bfced1fbcb35b28d8fbed4e785d2807055ed2b ]
Commit 402cb8dda949 ("fscache: Attach the index key and aux data to the cookie") added the index_key and index_key_len parameters to fscache_acquire_cookie(), and updated the callers in the NFS client. One of the callers was inside nfs_fscache_get_super_cookie() and was changed to use the full struct nfs_fscache_key as the index_key. However, a couple members of this structure contain pointers and thus will change each time the same NFS share is remounted. Since index_key is used for fscache_cookie->key_hash and this subsequently is used to compare cookies, the effectiveness of fscache with NFS is reduced to the point at which a umount
occurs. Any subsequent remount of the same share will cause a
unique NFS super_block index_key and key_hash to be generated for the same data, rendering any prior fscache data unable to be found. A simple reproducer demonstrates the problem.
1. Mount share with 'fsc', create a file, drop page cache systemctl start cachefilesd
mount -o vers=3,fsc 127.0.0.1:/export /mnt
dd if=/dev/zero of=/mnt/file1.bin bs=4096 count=1 echo 3 > /proc/sys/vm/drop_caches
2. Read file into page cache and fscache, then unmount dd if=/mnt/file1.bin of=/dev/null bs=4096 count=1 umount /mnt
3. Remount and re-read which should come from fscache mount -o vers=3,fsc 127.0.0.1:/export /mnt echo 3 > /proc/sys/vm/drop_caches
dd if=/mnt/file1.bin of=/dev/null bs=4096 count=1
4. Check for READ ops in mountstats - there should be none grep READ: /proc/self/mountstats
Looking at the history and the removed function, nfs_super_get_key(), we should only use nfs_fscache_key.key plus any uniquifier, for the fscache index_key.
--- fs/nfs/fscache.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/nfs/fscache.c +2 -1
@@ -188,7 +188,8 @@ void nfs_fscache_get_super_cookie(struct super_block *sb, const char *uniq, int/* create a cache index for looking up filehandles */ nfss->fscache =fscache_acquire_cookie (nfss->nfs_client->fscache, &nfs_fscache_super_index_def, - key,sizeof (*key) + ulen, + &key->key, +sizeof (key->key) + ulen,NULL ,0 , nfss,0 , true); dfprintk(FSCACHE, "NFS: get superblock cookie (0x%p/0x%p)\n",
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 75/147 nfs: fscache: use timespec64 in inode auxdata
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 6e31ded6895adfca97211118cc9b72236e8f6d53 ]
nfs currently behaves differently on 32-bit and 64-bit kernels regarding the on-disk format of nfs_fscache_inode_auxdata.
That format should really be the same on any kernel, and we should avoid the 'timespec' type in order to remove that from the kernel later on.
Using plain 'timespec64' would not be good here, since that includes implied padding and would possibly leak kernel stack data to the on-disk format on 32-bit architectures.
struct __kernel_timespec would work as a replacement, but open-coding the two struct members in nfs_fscache_inode_auxdata makes it more obvious what's going on here, and keeps the current format for 64-bit architectures.
--- fs/nfs/fscache-index.c | 6 ++++-- fs/nfs/fscache.c | 18 ++++++++++++------ fs/nfs/fscache.h | 8 +++++--- 3 files changed, 21 insertions(+), 11 deletions(-)
fs/nfs/fscache-index.c +4 -2
@@ -84,8 +84,10 @@ enum fscache_checkaux nfs_fscache_inode_check_aux(void *cookie_netfs_data,return FSCACHE_CHECKAUX_OBSOLETE ;memset (&auxdata,0 ,sizeof (auxdata)); - auxdata.mtime =timespec64_to_timespec (nfsi->vfs_inode.i_mtime); - auxdata.ctime =timespec64_to_timespec (nfsi->vfs_inode.i_ctime); + auxdata.mtime_sec = nfsi->vfs_inode.i_mtime.tv_sec; + auxdata.mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec; + auxdata.ctime_sec = nfsi->vfs_inode.i_ctime.tv_sec; + auxdata.ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec;if (NFS_SERVER (&nfsi->vfs_inode)->nfs_client->rpc_ops->version ==4 ) auxdata.change_attr =inode_peek_iversion_raw (&nfsi->vfs_inode);
fs/nfs/fscache.c +12 -6
@@ -241,8 +241,10 @@ void nfs_fscache_init_inode(struct inode *inode)return ;memset (&auxdata,0 ,sizeof (auxdata)); - auxdata.mtime =timespec64_to_timespec (nfsi->vfs_inode.i_mtime); - auxdata.ctime =timespec64_to_timespec (nfsi->vfs_inode.i_ctime); + auxdata.mtime_sec = nfsi->vfs_inode.i_mtime.tv_sec; + auxdata.mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec; + auxdata.ctime_sec = nfsi->vfs_inode.i_ctime.tv_sec; + auxdata.ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec;if (NFS_SERVER (&nfsi->vfs_inode)->nfs_client->rpc_ops->version ==4 ) auxdata.change_attr =inode_peek_iversion_raw (&nfsi->vfs_inode);
@@ -266,8 +268,10 @@ void nfs_fscache_clear_inode(struct inode *inode)dfprintk (FSCACHE ,"NFS: clear cookie (0x%p/0x%p)\n" , nfsi, cookie);memset (&auxdata,0 ,sizeof (auxdata)); - auxdata.mtime =timespec64_to_timespec (nfsi->vfs_inode.i_mtime); - auxdata.ctime =timespec64_to_timespec (nfsi->vfs_inode.i_ctime); + auxdata.mtime_sec = nfsi->vfs_inode.i_mtime.tv_sec; + auxdata.mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec; + auxdata.ctime_sec = nfsi->vfs_inode.i_ctime.tv_sec; + auxdata.ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec;fscache_relinquish_cookie (cookie, &auxdata, false); nfsi->fscache =NULL ; }
@@ -308,8 +312,10 @@ void nfs_fscache_open_file(struct inode *inode, struct file *filp)return ;memset (&auxdata,0 ,sizeof (auxdata)); - auxdata.mtime =timespec64_to_timespec (nfsi->vfs_inode.i_mtime); - auxdata.ctime =timespec64_to_timespec (nfsi->vfs_inode.i_ctime); + auxdata.mtime_sec = nfsi->vfs_inode.i_mtime.tv_sec; + auxdata.mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec; + auxdata.ctime_sec = nfsi->vfs_inode.i_ctime.tv_sec; + auxdata.ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec;if (inode_is_open_for_write (inode)) {dfprintk (FSCACHE ,"NFS: nfsi 0x%p disabling cache\n" , nfsi);
fs/nfs/fscache.h +5 -3
@@ -62,9 +62,11 @@ struct nfs_fscache_key {* cache object. */ struct nfs_fscache_inode_auxdata { -struct timespec mtime; -struct timespec ctime; -u64 change_attr; +s64 mtime_sec; +s64 mtime_nsec; +s64 ctime_sec; +s64 ctime_nsec; +u64 change_attr; };/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 76/147 NFSv4: Fix fscache cookie aux_data to ensure change_attr is included
In reply to Greg Kroah-HartmanFrom: Dave Wysochanski <[email protected]>
[ Upstream commit 50eaa652b54df1e2b48dc398d9e6114c9ed080eb ]
Commit 402cb8dda949 ("fscache: Attach the index key and aux data to the cookie") added the aux_data and aux_data_len to parameters to fscache_acquire_cookie(), and updated the callers in the NFS client. In the process it modified the aux_data to include the change_attr, but missed adding change_attr to a couple places where aux_data was used. Specifically, when opening a file and the change_attr is not added, the following attempt to lookup an object will fail inside cachefiles_check_object_xattr() = -116 due to nfs_fscache_inode_check_aux() failing memcmp on auxdata and returning FSCACHE_CHECKAUX_OBSOLETE.
Fix this by adding nfs_fscache_update_auxdata() to set the auxdata from all relevant fields in the inode, including the change_attr.
--- fs/nfs/fscache.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-)
fs/nfs/fscache.c +16 -18
@@ -227,6 +227,19 @@ void nfs_fscache_release_super_cookie(struct super_block *sb) } } +static void nfs_fscache_update_auxdata (struct nfs_fscache_inode_auxdata *auxdata, +struct nfs_inode *nfsi) +{ +memset (auxdata,0 ,sizeof (*auxdata)); + auxdata->mtime_sec = nfsi->vfs_inode.i_mtime.tv_sec; + auxdata->mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec; + auxdata->ctime_sec = nfsi->vfs_inode.i_ctime.tv_sec; + auxdata->ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec; + +if (NFS_SERVER (&nfsi->vfs_inode)->nfs_client->rpc_ops->version ==4 ) + auxdata->change_attr =inode_peek_iversion_raw (&nfsi->vfs_inode); +} +/* * Initialise the per-inode cache cookie pointer for an NFS inode. */
@@ -240,14 +253,7 @@ void nfs_fscache_init_inode(struct inode *inode)if (!(nfss->fscache &&S_ISREG (inode->i_mode)))return ; -memset (&auxdata,0 ,sizeof (auxdata)); - auxdata.mtime_sec = nfsi->vfs_inode.i_mtime.tv_sec; - auxdata.mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec; - auxdata.ctime_sec = nfsi->vfs_inode.i_ctime.tv_sec; - auxdata.ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec; - -if (NFS_SERVER (&nfsi->vfs_inode)->nfs_client->rpc_ops->version ==4 ) - auxdata.change_attr =inode_peek_iversion_raw (&nfsi->vfs_inode); +nfs_fscache_update_auxdata (&auxdata, nfsi); nfsi->fscache = fscache_acquire_cookie(NFS_SB(inode->i_sb)->fscache, &nfs_fscache_inode_object_def,
@@ -267,11 +273,7 @@ void nfs_fscache_clear_inode(struct inode *inode)dfprintk (FSCACHE ,"NFS: clear cookie (0x%p/0x%p)\n" , nfsi, cookie); -memset (&auxdata,0 ,sizeof (auxdata)); - auxdata.mtime_sec = nfsi->vfs_inode.i_mtime.tv_sec; - auxdata.mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec; - auxdata.ctime_sec = nfsi->vfs_inode.i_ctime.tv_sec; - auxdata.ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec; +nfs_fscache_update_auxdata (&auxdata, nfsi);fscache_relinquish_cookie (cookie, &auxdata, false); nfsi->fscache =NULL ; }
@@ -311,11 +313,7 @@ void nfs_fscache_open_file(struct inode *inode, struct file *filp)if (!fscache_cookie_valid (cookie))return ; -memset (&auxdata,0 ,sizeof (auxdata)); - auxdata.mtime_sec = nfsi->vfs_inode.i_mtime.tv_sec; - auxdata.mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec; - auxdata.ctime_sec = nfsi->vfs_inode.i_ctime.tv_sec; - auxdata.ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec; +nfs_fscache_update_auxdata (&auxdata, nfsi);if (inode_is_open_for_write (inode)) {dfprintk (FSCACHE ,"NFS: nfsi 0x%p disabling cache\n" , nfsi);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 77/147 netfilter: conntrack: avoid gcc-10 zero-length-bounds warning
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 2c407aca64977ede9b9f35158e919773cae2082f ]
gcc-10 warns around a suspicious access to an empty struct member:
net/netfilter/nf_conntrack_core.c: In function '__nf_conntrack_alloc':net/netfilter/nf_conntrack_core.c:1522:9: warning: array subscript 0 is outside the bounds of an interior zero-length array 'u8[0]' {aka 'unsigned char[0]'} [-Wzero-length-bounds]
1522 | memset(&ct->__nfct_init_offset[0], 0,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from net/netfilter/nf_conntrack_core.c:37:
include/net/netfilter/nf_conntrack.h:90:5: note: while referencing '__nfct_init_offset'
90 | u8 __nfct_init_offset[0];
| ^~~~~~~~~~~~~~~~~~The code is correct but a bit unusual. Rework it slightly in a way that does not trigger the warning, using an empty struct instead of an empty array. There are probably more elegant ways to do this, but this is the smallest change.
--- include/net/netfilter/nf_conntrack.h | 2 +- net/netfilter/nf_conntrack_core.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
include/net/netfilter/nf_conntrack.h +1 -1
@@ -87,7 +87,7 @@ struct nf_conn {struct hlist_node nat_bysource;#endif /* all members below initialized via memset */ -u8 __nfct_init_offset[0 ]; +struct { } __nfct_init_offset;/* If we were expected by an expectation, this will be it */ struct nf_conn *master;
net/netfilter/nf_conntrack_core.c +2 -2
@@ -1381,9 +1381,9 @@ __nf_conntrack_alloc(struct net *net, ct->status =0 ; ct->timeout =0 ;write_pnet (&ct->ct_net, net); -memset (&ct->__nfct_init_offset[0 ],0 , +memset (&ct->__nfct_init_offset,0 , offsetof(struct nf_conn , proto) - - offsetof(struct nf_conn, __nfct_init_offset[0])); + offsetof(struct nf_conn , __nfct_init_offset));nf_ct_zone_add (ct, zone);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 78/147 drm/i915/gvt: Fix kernel oops for 3-level ppgtt guest
In reply to Greg Kroah-HartmanFrom: Zhenyu Wang <[email protected]>
[ Upstream commit 72a7a9925e2beea09b109dffb3384c9bf920d9da ]
As i915 won't allocate extra PDP for current default PML4 table, so for 3-level ppgtt guest, we would hit kernel pointer access failure on extra PDP pointers. So this trys to bypass that now. It won't impact real shadow PPGTT setup, so guest context still works.
This is verified on 4.15 guest kernel with i915.enable_ppgtt=1 to force on old aliasing ppgtt behavior.
--- drivers/gpu/drm/i915/gvt/scheduler.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/gvt/scheduler.c +5 -1
@@ -374,7 +374,11 @@ static void set_context_ppgtt_from_shadow(struct intel_vgpu_workload *workload,for (i =0 ; i <GVT_RING_CTX_NR_PDPS ; i++) {struct i915_page_directory *const pd =i915_pd_entry (ppgtt->pd, i); - +/* skip now as current i915 ppgtt alloc won't allocate +top level pdp for non 4-level table, won't impact +shadow ppgtt. */ +if (!pd) +break ;px_dma (pd) = mm->ppgtt_mm.shadow_pdps[i]; } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 79/147 arm64: fix the flush_icache_range arguments in machine_kexec
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
[ Upstream commit d51c214541c5154dda3037289ee895ea3ded5ebd ]
The second argument is the end "pointer", not the length.
--- arch/arm64/kernel/machine_kexec.c | 1 + 1 file changed, 1 insertion(+)
arch/arm64/kernel/machine_kexec.c +1 -0
@@ -189,6 +189,7 @@ void machine_kexec(struct kimage *kimage)* the offline CPUs. Therefore, we must use the __* variant here. */ __flush_icache_range ((uintptr_t )reboot_code_buffer, + (uintptr_t )reboot_code_buffer + arm64_relocate_new_kernel_size);/* Flush the kimage list and its buffers. */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 80/147 nfs: fix NULL deference in nfs4_get_valid_delegation
In reply to Greg Kroah-HartmanFrom: J. Bruce Fields <[email protected]>
[ Upstream commit 29fe839976266bc7c55b927360a1daae57477723 ]
We add the new state to the nfsi->open_states list, making it potentially visible to other threads, before we've finished initializing it.
That wasn't a problem when all the readers were also taking the i_lock (as we do here), but since we switched to RCU, there's now a possibility that a reader could see the partially initialized state.
Symptoms observed were a crash when another thread called nfs4_get_valid_delegation() on a NULL inode, resulting in an oops like:
BUG: unable to handle page fault for address: ffffffffffffffb0 ... RIP: 0010:nfs4_get_valid_delegation+0x6/0x30 [nfsv4] ... Call Trace: nfs4_open_prepare+0x80/0x1c0 [nfsv4] __rpc_execute+0x75/0x390 [sunrpc] ? finish_task_switch+0x75/0x260 rpc_async_schedule+0x29/0x40 [sunrpc] process_one_work+0x1ad/0x370 worker_thread+0x30/0x390 ? create_worker+0x1a0/0x1a0 kthread+0x10c/0x130 ? kthread_park+0x80/0x80 ret_from_fork+0x22/0x30
--- fs/nfs/nfs4state.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/nfs4state.c +1 -1
@@ -733,9 +733,9 @@ nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner) state = new; state->owner = owner;atomic_inc (&owner->so_count); -list_add_rcu (&state->inode_states, &nfsi->open_states);ihold (inode); state->inode = inode; +list_add_rcu (&state->inode_states, &nfsi->open_states);spin_unlock (&inode->i_lock);/* Note: The reclaim code dictates that we add stateless * and read-only stateids to the end of the list */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 81/147 SUNRPC: Signalled ASYNC tasks need to exit
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit ce99aa62e1eb793e259d023c7f6ccb7c4879917b ]
Ensure that signalled ASYNC rpc_tasks exit immediately instead of spinning until a timeout (or forever).
To avoid checking for the signal flag on every scheduler iteration, the check is instead introduced in the client's finite state machine.
--- net/sunrpc/clnt.c | 5 +++++ 1 file changed, 5 insertions(+)
net/sunrpc/clnt.c +5 -0
@@ -2422,6 +2422,11 @@ rpc_check_timeout(struct rpc_task *task) {struct rpc_clnt *clnt = task->tk_client; +if (RPC_SIGNALLED (task)) { +rpc_call_rpcerror (task, -ERESTARTSYS ); +return ; + } +if (xprt_adjust_timeout (task->tk_rqstp) ==0 )return ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 82/147 netfilter: nft_set_rbtree: Introduce and use nft_rbtree_interval_start()
In reply to Greg Kroah-HartmanFrom: Stefano Brivio <[email protected]>
[ Upstream commit 6f7c9caf017be8ab0fe3b99509580d0793bf0833 ]
Replace negations of nft_rbtree_interval_end() with a new helper, nft_rbtree_interval_start(), wherever this helps to visualise the problem at hand, that is, for all the occurrences except for the comparison against given flags in __nft_rbtree_get().
This gets especially useful in the next patch.
--- net/netfilter/nft_set_rbtree.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
net/netfilter/nft_set_rbtree.c +11 -6
@@ -33,6 +33,11 @@ static bool nft_rbtree_interval_end(const struct nft_rbtree_elem *rbe) (*nft_set_ext_flags (&rbe->ext) &NFT_SET_ELEM_INTERVAL_END ); } +static bool nft_rbtree_interval_start (const struct nft_rbtree_elem *rbe) +{ +return !nft_rbtree_interval_end (rbe); +} +static bool nft_rbtree_equal (const struct nft_set *set,const void *this,const struct nft_rbtree_elem *interval) {
@@ -64,7 +69,7 @@ static bool __nft_rbtree_lookup(const struct net *net, const struct nft_set *setif (interval &&nft_rbtree_equal (set, this, interval) &&nft_rbtree_interval_end (rbe) && - !nft_rbtree_interval_end (interval)) +nft_rbtree_interval_start (interval))continue ; interval = rbe; }else if (d >0 )
@@ -89,7 +94,7 @@ static bool __nft_rbtree_lookup(const struct net *net, const struct nft_set *setif (set->flags &NFT_SET_INTERVAL && interval !=NULL &&nft_set_elem_active (&interval->ext, genmask) && - !nft_rbtree_interval_end (interval)) { +nft_rbtree_interval_start (interval)) { *ext = &interval->ext;return true; }
@@ -224,9 +229,9 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, p = &parent->rb_right; else {if (nft_rbtree_interval_end (rbe) && - !nft_rbtree_interval_end (new)) { +nft_rbtree_interval_start (new)) { p = &parent->rb_left; - }else if (!nft_rbtree_interval_end (rbe) && + }else if (nft_rbtree_interval_start (rbe) &&nft_rbtree_interval_end (new)) { p = &parent->rb_right; }else if (nft_set_elem_active (&rbe->ext, genmask)) {
@@ -317,10 +322,10 @@ static void *nft_rbtree_deactivate(const struct net *net, parent = parent->rb_right; else {if (nft_rbtree_interval_end (rbe) && - !nft_rbtree_interval_end (this)) { +nft_rbtree_interval_start (this)) { parent = parent->rb_left;continue ; - }else if (!nft_rbtree_interval_end (rbe) && + }else if (nft_rbtree_interval_start (rbe) &&nft_rbtree_interval_end (this)) { parent = parent->rb_right;continue ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 83/147 netfilter: nft_set_rbtree: Add missing expired checks
In reply to Greg Kroah-HartmanFrom: Phil Sutter <[email protected]>
[ Upstream commit 340eaff651160234bdbce07ef34b92a8e45cd540 ]
Expired intervals would still match and be dumped to user space until garbage collection wiped them out. Make sure they stop matching and disappear (from users' perspective) as soon as they expire.
--- net/netfilter/nft_set_rbtree.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
net/netfilter/nft_set_rbtree.c +11 -0
@@ -79,6 +79,10 @@ static bool __nft_rbtree_lookup(const struct net *net, const struct nft_set *set parent =rcu_dereference_raw (parent->rb_left);continue ; } + +if (nft_set_elem_expired (&rbe->ext)) +return false; +if (nft_rbtree_interval_end (rbe)) {if (nft_set_is_anonymous (set))return false;
@@ -94,6 +98,7 @@ static bool __nft_rbtree_lookup(const struct net *net, const struct nft_set *setif (set->flags &NFT_SET_INTERVAL && interval !=NULL &&nft_set_elem_active (&interval->ext, genmask) && + !nft_set_elem_expired (&interval->ext) &&nft_rbtree_interval_start (interval)) { *ext = &interval->ext;return true;
@@ -154,6 +159,9 @@ static bool __nft_rbtree_get(const struct net *net, const struct nft_set *set,continue ; } +if (nft_set_elem_expired (&rbe->ext)) +return false; +if (!nft_set_ext_exists (&rbe->ext,NFT_SET_EXT_FLAGS ) || (*nft_set_ext_flags (&rbe->ext) &NFT_SET_ELEM_INTERVAL_END ) == (flags &NFT_SET_ELEM_INTERVAL_END )) {
@@ -170,6 +178,7 @@ static bool __nft_rbtree_get(const struct net *net, const struct nft_set *set, if (set->flags & NFT_SET_INTERVAL && interval != NULL && nft_set_elem_active(&interval->ext, genmask) && + !nft_set_elem_expired(&interval->ext) && ((!nft_rbtree_interval_end(interval) && !(flags & NFT_SET_ELEM_INTERVAL_END)) || (nft_rbtree_interval_end(interval) &&
@@ -355,6 +364,8 @@ static void nft_rbtree_walk(const struct nft_ctx *ctx,if (iter->count < iter->skip) goto cont; +if (nft_set_elem_expired (&rbe->ext)) + goto cont;if (!nft_set_elem_active (&rbe->ext, iter->genmask)) goto cont;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 84/147 RDMA/rxe: Always return ERR_PTR from rxe_create_mmap_info()
In reply to Greg Kroah-HartmanFrom: Sudip Mukherjee <[email protected]>
[ Upstream commit bb43c8e382e5da0ee253e3105d4099820ff4d922 ]
The commit below modified rxe_create_mmap_info() to return ERR_PTR's but didn't update the callers to handle them. Modify rxe_create_mmap_info() to only return ERR_PTR and fix all error checking after rxe_create_mmap_info() is called.
Ensure that all other exit paths properly set the error return.
--- drivers/infiniband/sw/rxe/rxe_mmap.c | 2 +- drivers/infiniband/sw/rxe/rxe_queue.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-)
drivers/infiniband/sw/rxe/rxe_mmap.c +1 -1
@@ -151,7 +151,7 @@ struct rxe_mmap_info *rxe_create_mmap_info(struct rxe_dev *rxe, u32 size, ip =kmalloc (sizeof (*ip),GFP_KERNEL );if (!ip) -return NULL ; +return ERR_PTR (-ENOMEM ); size =PAGE_ALIGN (size);
drivers/infiniband/sw/rxe/rxe_queue.c +7 -4
@@ -45,12 +45,15 @@ int do_mmap_info(struct rxe_dev *rxe, struct mminfo __user *outbuf,if (outbuf) { ip =rxe_create_mmap_info (rxe, buf_size, udata, buf); -if (!ip) +if (IS_ERR (ip)) { + err =PTR_ERR (ip); goto err1; + } - err =copy_to_user (outbuf, &ip->info,sizeof (ip->info)); -if (err) +if (copy_to_user (outbuf, &ip->info,sizeof (ip->info))) { + err = -EFAULT ; goto err2; + }spin_lock_bh (&rxe->pending_lock);list_add (&ip->pending_mmaps, &rxe->pending_mmaps);
@@ -64,7 +67,7 @@ int do_mmap_info(struct rxe_dev *rxe, struct mminfo __user *outbuf, err2:kfree (ip); err1: -return -EINVAL ; +return err; }inline void rxe_queue_reset (struct rxe_queue *q)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 85/147 IB/mlx4: Test return value of calls to ib_get_cached_pkey
In reply to Greg Kroah-HartmanFrom: Jack Morgenstein <[email protected]>
[ Upstream commit 6693ca95bd4330a0ad7326967e1f9bcedd6b0800 ]
In the mlx4_ib_post_send() flow, some functions call ib_get_cached_pkey() without checking its return value. If ib_get_cached_pkey() returns an error code, these functions should return failure.
--- drivers/infiniband/hw/mlx4/qp.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/infiniband/hw/mlx4/qp.c +11 -3
@@ -2891,6 +2891,7 @@ static int build_sriov_qp0_header(struct mlx4_ib_sqp *sqp,int send_size;int header_size;int spc; +int err;int i;if (wr->wr.opcode !=IB_WR_SEND )
@@ -2925,7 +2926,9 @@ static int build_sriov_qp0_header(struct mlx4_ib_sqp *sqp, sqp->ud_header.lrh.virtual_lane =0 ; sqp->ud_header.bth.solicited_event = !!(wr->wr.send_flags &IB_SEND_SOLICITED ); -ib_get_cached_pkey (ib_dev, sqp->qp.port,0 , &pkey); + err =ib_get_cached_pkey (ib_dev, sqp->qp.port,0 , &pkey); +if (err) +return err; sqp->ud_header.bth.pkey =cpu_to_be16 (pkey);if (sqp->qp.mlx4_ib_qp_type ==MLX4_IB_QPT_TUN_SMI_OWNER ) sqp->ud_header.bth.destination_qpn =cpu_to_be32 (wr->remote_qpn);
@@ -3212,9 +3215,14 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, const struct ib_ud_wr *wr, } sqp->ud_header.bth.solicited_event = !!(wr->wr.send_flags &IB_SEND_SOLICITED );if (!sqp->qp.ibqp.qp_num) -ib_get_cached_pkey (ib_dev, sqp->qp.port, sqp->pkey_index, &pkey); + err =ib_get_cached_pkey (ib_dev, sqp->qp.port, sqp->pkey_index, + &pkey);else -ib_get_cached_pkey (ib_dev, sqp->qp.port, wr->pkey_index, &pkey); + err =ib_get_cached_pkey (ib_dev, sqp->qp.port, wr->pkey_index, + &pkey); +if (err) +return err; + sqp->ud_header.bth.pkey =cpu_to_be16 (pkey); sqp->ud_header.bth.destination_qpn =cpu_to_be32 (wr->remote_qpn); sqp->ud_header.bth.psn =cpu_to_be32 ((sqp->send_psn++) & ((1 <<24 ) -1 ));
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 86/147 IB/core: Fix potential NULL pointer dereference in pkey cache
In reply to Greg Kroah-HartmanFrom: Jack Morgenstein <[email protected]>
[ Upstream commit 1901b91f99821955eac2bd48fe25ee983385dc00 ]
The IB core pkey cache is populated by procedure ib_cache_update(). Initially, the pkey cache pointer is NULL. ib_cache_update allocates a buffer and populates it with the device's pkeys, via repeated calls to procedure ib_query_pkey().
If there is a failure in populating the pkey buffer via ib_query_pkey(), ib_cache_update does not replace the old pkey buffer cache with the updated one -- it leaves the old cache as is.
Since initially the pkey buffer cache is NULL, when calling ib_cache_update the first time, a failure in ib_query_pkey() will cause the pkey buffer cache pointer to remain NULL.
In this situation, any calls subsequent to ib_get_cached_pkey(), ib_find_cached_pkey(), or ib_find_cached_pkey_exact() will try to dereference the NULL pkey cache pointer, causing a kernel panic.
Fix this by checking the ib_cache_update() return value.
--- drivers/infiniband/core/cache.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/infiniband/core/cache.c +5 -2
@@ -1542,8 +1542,11 @@ int ib_cache_setup_one(struct ib_device *device)if (err)return err; - rdma_for_each_port (device, p) -ib_cache_update (device, p, true); + rdma_for_each_port (device, p) { + err =ib_cache_update (device, p, true); +if (err) +return err; + }return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 87/147 RDMA/core: Fix double put of resource
In reply to Greg Kroah-Hartman[ Upstream commit 50bbe3d34fea74b7c0fabe553c40c2f4a48bb9c3 ]
Do not decrease the reference count of resource tracker object twice in the error flow of res_get_common_doit.
--- drivers/infiniband/core/nldev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/core/nldev.c +1 -1
@@ -1248,10 +1248,10 @@ static int res_get_common_doit(struct sk_buff *skb, struct nlmsghdr *nlh, has_cap_net_admin =netlink_capable (skb,CAP_NET_ADMIN ); ret = fe->fill_res_func (msg, has_cap_net_admin, res, port); -rdma_restrack_put (res);if (ret) goto err_free; +rdma_restrack_put (res);nlmsg_end (msg, nlh);ib_device_put (device);return rdma_nl_unicast (sock_net (skb->sk), msg,NETLINK_CB (skb).portid);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 88/147 RDMA/iw_cxgb4: Fix incorrect function parameters
In reply to Greg Kroah-HartmanFrom: Potnuri Bharat Teja <[email protected]>
[ Upstream commit c8b1f340e54158662acfa41d6dee274846370282 ]
While reading the TCB field in t4_tcb_get_field32() the wrong mask is passed as a parameter which leads the driver eventually to a kernel panic/app segfault from access to an illegal SRQ index while flushing the SRQ completions during connection teardown.
--- drivers/infiniband/hw/cxgb4/cm.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/infiniband/hw/cxgb4/cm.c +3 -4
@@ -2891,8 +2891,7 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb) srqidx =ABORT_RSS_SRQIDX_G (be32_to_cpu (req->srqidx_status));if (srqidx) { -complete_cached_srq_buffers (ep, - req->srqidx_status); +complete_cached_srq_buffers (ep, srqidx); }else {/* Hold ep ref until finish_peer_abort() */ c4iw_get_ep (&ep->com);
@@ -3878,8 +3877,8 @@ static int read_tcb_rpl(struct c4iw_dev *dev, struct sk_buff *skb)return 0 ; } - ep->srqe_idx =t4_tcb_get_field32 (tcb,TCB_RQ_START_W ,TCB_RQ_START_W , -TCB_RQ_START_S ); + ep->srqe_idx =t4_tcb_get_field32 (tcb,TCB_RQ_START_W ,TCB_RQ_START_M , +TCB_RQ_START_S ); cleanup:pr_debug ("ep %p tid %u %016x\n" , ep, ep->hwtid, ep->srqe_idx);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 89/147 hwmon: (da9052) Synchronize access with mfd
In reply to Greg Kroah-HartmanFrom: Samu Nuutamo <[email protected]>
[ Upstream commit 333e22db228f0bd0c839553015a6a8d3db4ba569 ]
When tsi-as-adc is configured it is possible for in7[0123]_input read to return an incorrect value if a concurrent read to in[456]_input is performed. This is caused by a concurrent manipulation of the mux channel without proper locking as hwmon and mfd use different locks for synchronization.
Switch hwmon to use the same lock as mfd when accessing the TSI channel.
--- drivers/hwmon/da9052-hwmon.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hwmon/da9052-hwmon.c +2 -2
@@ -244,9 +244,9 @@ static ssize_t da9052_tsi_show(struct device *dev,int channel =to_sensor_dev_attr (devattr)->index;int ret; -mutex_lock (&hwmon->hwmon_lock); +mutex_lock (&hwmon->da9052->auxadc_lock); ret =__da9052_read_tsi (dev, channel); -mutex_unlock (&hwmon->hwmon_lock); +mutex_unlock (&hwmon->da9052->auxadc_lock);if (ret <0 )return ret;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 90/147 s390/ism: fix error return code in ism_probe()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit 29b74cb75e3572d83708745e81e24d37837415f9 ]
Fix to return negative error code -ENOMEM from the smcd_alloc_dev() error handling case instead of 0, as done elsewhere in this function.
--- drivers/s390/net/ism_drv.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/s390/net/ism_drv.c +3 -1
@@ -521,8 +521,10 @@ static int ism_probe(struct pci_dev *pdev, const struct pci_device_id *id) ism->smcd =smcd_alloc_dev (&pdev->dev,dev_name (&pdev->dev), &ism_ops,ISM_NR_DMBS ); -if (!ism->smcd) +if (!ism->smcd) { + ret = -ENOMEM ; goto err_resource; + } ism->smcd->priv = ism; ret =ism_dev_init (ism);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 91/147 mm, memcg: fix inconsistent oom event behavior
In reply to Greg Kroah-HartmanFrom: Yafang Shao <[email protected]>
[ Upstream commit 04fd61a4e01028210a91f0efc408c8bc61a3018c ]
A recent commit 9852ae3fe529 ("mm, memcg: consider subtrees in memory.events") changed the behavior of memcg events, which will now consider subtrees in memory.events.
But oom_kill event is a special one as it is used in both cgroup1 and cgroup2. In cgroup1, it is displayed in memory.oom_control. The file memory.oom_control is in both root memcg and non root memcg, that is different with memory.event as it only in non-root memcg. That commit is okay for cgroup2, but it is not okay for cgroup1 as it will cause inconsistent behavior between root memcg and non-root memcg.
Here's an example on why this behavior is inconsistent in cgroup1.
root memcg
/
memcg foo
/memcg bar
Suppose there's an oom_kill in memcg bar, then the oon_kill will be
root memcg : memory.oom_control(oom_kill) 0 /
memcg foo : memory.oom_control(oom_kill) 1
/
memcg bar : memory.oom_control(oom_kill) 1
For the non-root memcg, its memory.oom_control(oom_kill) includes its descendants' oom_kill, but for root memcg, it doesn't include its descendants' oom_kill. That means, memory.oom_control(oom_kill) has different meanings in different memcgs. That is inconsistent. Then the user has to know whether the memcg is root or not.
If we can't fully support it in cgroup1, for example by adding memory.events.local into cgroup1 as well, then let's don't touch its original behavior.
--- include/linux/memcontrol.h | 2 ++ 1 file changed, 2 insertions(+)
include/linux/memcontrol.h +2 -0
@@ -793,6 +793,8 @@ static inline void memcg_memory_event(struct mem_cgroup *memcg,atomic_long_inc (&memcg->memory_events[event]);cgroup_file_notify (&memcg->events_file); +if (!cgroup_subsys_on_dfl (memory_cgrp_subsys)) +break ;if (cgrp_dfl_root.flags &CGRP_ROOT_MEMORY_LOCAL_EVENTS )break ; } while ((memcg = parent_mem_cgroup(memcg)) &&
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 92/147 NFSv3: fix rpc receive buffer size for MOUNT call
In reply to Greg Kroah-HartmanFrom: Olga Kornievskaia <[email protected]>
[ Upstream commit 8eed292bc8cbf737e46fb1c119d4c8f6dcb00650 ]
Prior to commit e3d3ab64dd66 ("SUNRPC: Use au_rslack when computing reply buffer size"), there was enough slack in the reply buffer to commodate filehandles of size 60bytes. However, the real problem was that the reply buffer size for the MOUNT operation was not correctly calculated. Received buffer size used the filehandle size for NFSv2 (32bytes) which is much smaller than the allowed filehandle size for the v3 mounts.
Fix the reply buffer size (decode arguments size) for the MNT command.
--- fs/nfs/mount_clnt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/nfs/mount_clnt.c +2 -1
@@ -32,6 +32,7 @@#define MNT_fhs_status_sz (1)#define MNT_fhandle_sz XDR_QUADLEN(NFS2_FHSIZE)#define MNT_fhandle3_sz (1 + XDR_QUADLEN(NFS3_FHSIZE)) +#define MNT_fhandlev3_sz XDR_QUADLEN(NFS3_FHSIZE)#define MNT_authflav3_sz (1 + NFS_MAX_SECFLAVORS)/*
@@ -39,7 +40,7 @@*/ #define MNT_enc_dirpath_sz encode_dirpath_sz#define MNT_dec_mountres_sz (MNT_status_sz + MNT_fhandle_sz) -#define MNT_dec_mountres3_sz (MNT_status_sz + MNT_fhandle_sz + \ +#define MNT_dec_mountres3_sz (MNT_status_sz + MNT_fhandlev3_sz + \ MNT_authflav3_sz)/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 93/147 pnp: Use list_for_each_entry() instead of open coding
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
commit 01b2bafe57b19d9119413f138765ef57990921ce upstream.
Aside from good practice, this avoids a warning from gcc 10:
./include/linux/kernel.h:997:3: warning: array subscript -31 is outside array bounds of ‘struct list_head[1]’ [-Warray-bounds]
997 | ((type *)(__mptr - offsetof(type, member))); })
| ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./include/linux/list.h:493:2: note: in expansion of macro ‘container_of’
493 | container_of(ptr, type, member)
| ^~~~~~~~~~~~
./include/linux/pnp.h:275:30: note: in expansion of macro ‘list_entry’
275 | #define global_to_pnp_dev(n) list_entry(n, struct pnp_dev, global_list)
| ^~~~~~~~~~
./include/linux/pnp.h:281:11: note: in expansion of macro ‘global_to_pnp_dev’
281 | (dev) != global_to_pnp_dev(&pnp_global); \
| ^~~~~~~~~~~~~~~~~arch/x86/kernel/rtc.c:189:2: note: in expansion of macro ‘pnp_for_each_dev’
189 | pnp_for_each_dev(dev) {
Because the common code doesn't cast the starting list_head to the containing struct.
--- include/linux/pnp.h | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-)
include/linux/pnp.h +9 -20
@@ -220,10 +220,8 @@ struct pnp_card {#define global_to_pnp_card (n) list_entry(n, struct pnp_card, global_list)#define protocol_to_pnp_card (n) list_entry(n, struct pnp_card, protocol_list)#define to_pnp_card (n) container_of(n, struct pnp_card, dev) -#define pnp_for_each_card (card) \ - for((card) = global_to_pnp_card(pnp_cards.next); \ - (card) != global_to_pnp_card(&pnp_cards); \ - (card) = global_to_pnp_card((card)->global_list.next)) +#define pnp_for_each_card (card) \ + list_for_each_entry(card, &pnp_cards, global_list)struct pnp_card_link {struct pnp_card *card;
@@ -276,14 +274,9 @@ struct pnp_dev {#define card_to_pnp_dev (n) list_entry(n, struct pnp_dev, card_list)#define protocol_to_pnp_dev (n) list_entry(n, struct pnp_dev, protocol_list)#define to_pnp_dev (n) container_of(n, struct pnp_dev, dev) -#define pnp_for_each_dev (dev) \ - for((dev) = global_to_pnp_dev(pnp_global.next); \ - (dev) != global_to_pnp_dev(&pnp_global); \ - (dev) = global_to_pnp_dev((dev)->global_list.next)) -#define card_for_each_dev (card,dev) \ - for((dev) = card_to_pnp_dev((card)->devices.next); \ - (dev) != card_to_pnp_dev(&(card)->devices); \ - (dev) = card_to_pnp_dev((dev)->card_list.next)) +#define pnp_for_each_dev (dev) list_for_each_entry(dev, &pnp_global, global_list) +#define card_for_each_dev (card, dev) \ + list_for_each_entry(dev, &(card)->devices, card_list)#define pnp_dev_name (dev) (dev)->namestatic inline void *pnp_get_drvdata (struct pnp_dev *pdev)
@@ -437,14 +430,10 @@ struct pnp_protocol { };#define to_pnp_protocol (n) list_entry(n, struct pnp_protocol, protocol_list) -#define protocol_for_each_card (protocol,card) \ - for((card) = protocol_to_pnp_card((protocol)->cards.next); \ - (card) != protocol_to_pnp_card(&(protocol)->cards); \ - (card) = protocol_to_pnp_card((card)->protocol_list.next)) -#define protocol_for_each_dev (protocol,dev) \ - for((dev) = protocol_to_pnp_dev((protocol)->devices.next); \ - (dev) != protocol_to_pnp_dev(&(protocol)->devices); \ - (dev) = protocol_to_pnp_dev((dev)->protocol_list.next)) +#define protocol_for_each_card (protocol, card) \ + list_for_each_entry(card, &(protocol)->cards, protocol_list) +#define protocol_for_each_dev (protocol, dev) \ + list_for_each_entry(dev, &(protocol)->devices, protocol_list)extern struct bus_type pnp_bus_type;
Greg Kroah-Hartman
maintainerPATCH 94/147 net/rds: Use ERR_PTR for rds_message_alloc_sgs()
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
commit 7dba92037baf3fa00b4880a31fd532542264994c upstream.
Returning the error code via a 'int *ret' when the function returns a pointer is very un-kernely and causes gcc 10's static analysis to choke:
net/rds/message.c: In function ‘rds_message_map_pages’:net/rds/message.c:358:10: warning: ‘ret’ may be used uninitialized in this function [-Wmaybe-uninitialized]
358 | return ERR_PTR(ret);
Use a typical ERR_PTR return instead.
--- net/rds/message.c | 19 ++++++------------- net/rds/rdma.c | 12 ++++++++---- net/rds/rds.h | 3 +-- net/rds/send.c | 6 ++++-- 4 files changed, 19 insertions(+), 21 deletions(-)
net/rds/message.c +6 -13
@@ -308,26 +308,20 @@ out:/* * RDS ops use this to grab SG entries from the rm's sg pool. */ -struct scatterlist *rds_message_alloc_sgs (struct rds_message *rm,int nents, -int *ret) +struct scatterlist *rds_message_alloc_sgs (struct rds_message *rm,int nents) {struct scatterlist *sg_first = (struct scatterlist *) &rm[1 ];struct scatterlist *sg_ret; -if (WARN_ON (!ret)) -return NULL ; -if (nents <=0 ) {pr_warn ("rds: alloc sgs failed! nents <= 0\n" ); - *ret = -EINVAL ; -return NULL ; +return ERR_PTR (-EINVAL ); }if (rm->m_used_sgs + nents > rm->m_total_sgs) {pr_warn ("rds: alloc sgs failed! total %d used %d nents %d\n" , rm->m_total_sgs, rm->m_used_sgs, nents); - *ret = -ENOMEM ; -return NULL ; +return ERR_PTR (-ENOMEM ); } sg_ret = &sg_first[rm->m_used_sgs];
@@ -343,7 +337,6 @@ struct rds_message *rds_message_map_pageunsigned int i;int num_sgs =DIV_ROUND_UP (total_len,PAGE_SIZE );int extra_bytes = num_sgs *sizeof (struct scatterlist ); -int ret; rm =rds_message_alloc (extra_bytes,GFP_NOWAIT );if (!rm)
@@ -352,10 +345,10 @@ struct rds_message *rds_message_map_pageset_bit (RDS_MSG_PAGEVEC , &rm->m_flags); rm->m_inc.i_hdr.h_len =cpu_to_be32 (total_len); rm->data.op_nents =DIV_ROUND_UP (total_len,PAGE_SIZE ); - rm->data.op_sg =rds_message_alloc_sgs (rm, num_sgs, &ret); -if (!rm->data.op_sg) { + rm->data.op_sg =rds_message_alloc_sgs (rm, num_sgs); +if (IS_ERR (rm->data.op_sg)) {rds_message_put (rm); -return ERR_PTR (ret); +return ERR_CAST (rm->data.op_sg); }for (i =0 ; i < rm->data.op_nents; ++i) {
net/rds/rdma.c +8 -4
@@ -624,9 +624,11 @@ int rds_cmsg_rdma_args(struct rds_sock * op->op_active =1 ; op->op_recverr = rs->rs_recverr;WARN_ON (!nr_pages); - op->op_sg =rds_message_alloc_sgs (rm, nr_pages, &ret); -if (!op->op_sg) + op->op_sg =rds_message_alloc_sgs (rm, nr_pages); +if (IS_ERR (op->op_sg)) { + ret =PTR_ERR (op->op_sg); goto out_pages; + }if (op->op_notify || op->op_recverr) {/* We allocate an uninitialized notifier here, because
@@ -828,9 +830,11 @@ int rds_cmsg_atomic(struct rds_sock *rs, rm->atomic.op_silent = !!(args->flags &RDS_RDMA_SILENT ); rm->atomic.op_active =1 ; rm->atomic.op_recverr = rs->rs_recverr; - rm->atomic.op_sg =rds_message_alloc_sgs (rm,1 , &ret); -if (!rm->atomic.op_sg) + rm->atomic.op_sg =rds_message_alloc_sgs (rm,1 ); +if (IS_ERR (rm->atomic.op_sg)) { + ret =PTR_ERR (rm->atomic.op_sg); goto err; + }/* verify 8 byte-aligned */ if (args->local_addr &0x7 ) {
net/rds/rds.h +1 -2
@@ -849,8 +849,7 @@ rds_conn_connecting(struct rds_connectio/* message.c */ struct rds_message *rds_message_alloc (unsigned int nents,gfp_t gfp); -struct scatterlist *rds_message_alloc_sgs (struct rds_message *rm,int nents, -int *ret); +struct scatterlist *rds_message_alloc_sgs (struct rds_message *rm,int nents);int rds_message_copy_from_user (struct rds_message *rm,struct iov_iter *from,bool zcopy);struct rds_message *rds_message_map_pages (unsigned long *page_addrs,unsigned int total_len);
net/rds/send.c +4 -2
@@ -1274,9 +1274,11 @@ int rds_sendmsg(struct socket *sock, str/* Attach data to the rm */ if (payload_len) { - rm->data.op_sg =rds_message_alloc_sgs (rm, num_sgs, &ret); -if (!rm->data.op_sg) + rm->data.op_sg =rds_message_alloc_sgs (rm, num_sgs); +if (IS_ERR (rm->data.op_sg)) { + ret =PTR_ERR (rm->data.op_sg); goto out; + } ret =rds_message_copy_from_user (rm, &msg->msg_iter, zcopy);if (ret) goto out;
Greg Kroah-Hartman
maintainerPATCH 95/147 Stop the ad-hoc games with -Wno-maybe-initialized
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 78a5255ffb6a1af189a83e493d916ba1c54d8c75 upstream.
We have some rather random rules about when we accept the "maybe-initialized" warnings, and when we don't.
For example, we consider it unreliable for gcc versions < 4.9, but also if -O3 is enabled, or if optimizing for size. And then various kernel config options disabled it, because they know that they trigger that warning by confusing gcc sufficiently (ie PROFILE_ALL_BRANCHES).
And now gcc-10 seems to be introducing a lot of those warnings too, so it falls under the same heading as 4.9 did.
At the same time, we have a very straightforward way to _enable_ that warning when wanted: use "W=2" to enable more warnings.
So stop playing these ad-hoc games, and just disable that warning by default, with the known and straight-forward "if you want to work on the extra compiler warnings, use W=123".
Would it be great to have code that is always so obvious that it never confuses the compiler whether a variable is used initialized or not? Yes, it would. In a perfect world, the compilers would be smarter, and our source code would be simpler.
That's currently not the world we live in, though.
--- Makefile | 7 +++---- init/Kconfig | 18 ------------------ kernel/trace/Kconfig | 1 - 3 files changed, 3 insertions(+), 23 deletions(-)
Makefile +3 -4
@@ -707,10 +707,6 @@ else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE KBUILD_CFLAGS += -Os endif -ifdef CONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED -KBUILD_CFLAGS += -Wno-maybe-uninitialized -endif - # Tell gcc to never replace conditional load with a non-conditional one KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
@@ -860,6 +856,9 @@ KBUILD_CFLAGS += -Wno-pointer-sign # disable stringop warnings in gcc 8+ KBUILD_CFLAGS += $(call cc-disable-warning, stringop-truncation) +# Enabled with W=2, disabled by default as noisy +KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized) + # disable invalid "can't wrap" optimizations for signed / pointers KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow)
init/Kconfig +0 -18
@@ -36,22 +36,6 @@ config TOOLS_SUPPORT_RELR config CC_HAS_ASM_INLINE def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null) -config CC_HAS_WARN_MAYBE_UNINITIALIZED - def_bool $(cc-option,-Wmaybe-uninitialized) - help - GCC >= 4.7 supports this option. - -config CC_DISABLE_WARN_MAYBE_UNINITIALIZED - bool - depends on CC_HAS_WARN_MAYBE_UNINITIALIZED - default CC_IS_GCC && GCC_VERSION < 40900 # unreliable for GCC < 4.9 - help - GCC's -Wmaybe-uninitialized is not reliable by definition. - Lots of false positive warnings are produced in some cases. - - If this option is enabled, -Wno-maybe-uninitialzed is passed - to the compiler to suppress maybe-uninitialized warnings. - config CONSTRUCTORS bool depends on !UML
@@ -1226,14 +1210,12 @@ config CC_OPTIMIZE_FOR_PERFORMANCE config CC_OPTIMIZE_FOR_PERFORMANCE_O3 bool "Optimize more for performance (-O3)" depends on ARC - imply CC_DISABLE_WARN_MAYBE_UNINITIALIZED # avoid false positives help Choosing this option will pass "-O3" to your compiler to optimize the kernel yet more for performance. config CC_OPTIMIZE_FOR_SIZE bool "Optimize for size (-Os)" - imply CC_DISABLE_WARN_MAYBE_UNINITIALIZED # avoid false positives help Choosing this option will pass "-Os" to your compiler resulting in a smaller kernel.
kernel/trace/Kconfig +0 -1
@@ -371,7 +371,6 @@ config PROFILE_ANNOTATED_BRANCHES config PROFILE_ALL_BRANCHES bool "Profile all if conditionals" if !FORTIFY_SOURCE select TRACE_BRANCH_PROFILING - imply CC_DISABLE_WARN_MAYBE_UNINITIALIZED # avoid false positives help This tracer profiles all branch conditions. Every if () taken in the kernel is recorded whether it hit or miss.
Greg Kroah-Hartman
maintainerPATCH 96/147 gcc-10: disable zero-length-bounds warning for now
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 5c45de21a2223fe46cf9488c99a7fbcf01527670 upstream.
This is a fine warning, but we still have a number of zero-length arrays in the kernel that come from the traditional gcc extension. Yes, they are getting converted to flexible arrays, but in the meantime the gcc-10 warning about zero-length bounds is very verbose, and is hiding other issues.
I missed one actual build failure because it was hidden among hundreds of lines of warning. Thankfully I caught it on the second go before pushing things out, but it convinced me that I really need to disable the new warnings for now.
We'll hopefully be all done with our conversion to flexible arrays in the not too distant future, and we can then re-enable this warning.
--- Makefile | 3 +++ 1 file changed, 3 insertions(+)
Makefile +3 -0
@@ -856,6 +856,9 @@ KBUILD_CFLAGS += -Wno-pointer-sign # disable stringop warnings in gcc 8+ KBUILD_CFLAGS += $(call cc-disable-warning, stringop-truncation) +# We'll want to enable this eventually, but it's not going away for 5.7 at least +KBUILD_CFLAGS += $(call cc-disable-warning, zero-length-bounds) + # Enabled with W=2, disabled by default as noisy KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized)
Greg Kroah-Hartman
maintainerPATCH 97/147 gcc-10: disable array-bounds warning for now
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 44720996e2d79e47d508b0abe99b931a726a3197 upstream.
This is another fine warning, related to the 'zero-length-bounds' one, but hitting the same historical code in the kernel.
Because C didn't historically support flexible array members, we have code that instead uses a one-sized array, the same way we have cases of zero-sized arrays.
The one-sized arrays come from either not wanting to use the gcc zero-sized array extension, or from a slight convenience-feature, where particularly for strings, the size of the structure now includes the allocation for the final NUL character.
So with a "char name[1];" at the end of a structure, you can do things like
v = my_malloc(sizeof(struct vendor) + strlen(name));
and avoid the "+1" for the terminator.
Yes, the modern way to do that is with a flexible array, and using 'offsetof()' instead of 'sizeof()', and adding the "+1" by hand. That also technically gets the size "more correct" in that it avoids any alignment (and thus padding) issues, but this is another long-term cleanup thing that will not happen for 5.7.
So disable the warning for now, even though it's potentially quite useful. Having a slew of warnings that then hide more urgent new issues is not an improvement.
--- Makefile | 1 + 1 file changed, 1 insertion(+)
Makefile +1 -0
@@ -858,6 +858,7 @@ KBUILD_CFLAGS += $(call cc-disable-warni # We'll want to enable this eventually, but it's not going away for 5.7 at least KBUILD_CFLAGS += $(call cc-disable-warning, zero-length-bounds) +KBUILD_CFLAGS += $(call cc-disable-warning, array-bounds) # Enabled with W=2, disabled by default as noisy KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized)
Greg Kroah-Hartman
maintainerPATCH 98/147 gcc-10: disable stringop-overflow warning for now
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 5a76021c2eff7fcf2f0918a08fd8a37ce7922921 upstream.
This is the final array bounds warning removal for gcc-10 for now.
Again, the warning is good, and we should re-enable all these warnings when we have converted all the legacy array declaration cases to flexible arrays. But in the meantime, it's just noise.
--- Makefile | 1 + 1 file changed, 1 insertion(+)
Makefile +1 -0
@@ -859,6 +859,7 @@ KBUILD_CFLAGS += $(call cc-disable-warni # We'll want to enable this eventually, but it's not going away for 5.7 at least KBUILD_CFLAGS += $(call cc-disable-warning, zero-length-bounds) KBUILD_CFLAGS += $(call cc-disable-warning, array-bounds) +KBUILD_CFLAGS += $(call cc-disable-warning, stringop-overflow) # Enabled with W=2, disabled by default as noisy KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized)
Greg Kroah-Hartman
maintainerPATCH 99/147 gcc-10: disable restrict warning for now
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit adc71920969870dfa54e8f40dac8616284832d02 upstream.
gcc-10 now warns about passing aliasing pointers to functions that take restricted pointers.
That's actually a great warning, and if we ever start using 'restrict' in the kernel, it might be quite useful. But right now we don't, and it turns out that the only thing this warns about is an idiom where we have declared a few functions to be "printf-like" (which seems to make gcc pick up the restricted pointer thing), and then we print to the same buffer that we also use as an input.
And people do that as an odd concatenation pattern, with code like this:
#define sysfs_show_gen_prop(buffer, fmt, ...) \
snprintf(buffer, PAGE_SIZE, "%s"fmt, buffer, __VA_ARGS__)where we have 'buffer' as both the destination of the final result, and as the initial argument.
Yes, it's a bit questionable. And outside of the kernel, people do have standard declarations like
int snprintf( char *restrict buffer, size_t bufsz,
const char *restrict format, ... );
where that output buffer is marked as a restrict pointer that cannot alias with any other arguments.
But in the context of the kernel, that 'use snprintf() to concatenate to the end result' does work, and the pattern shows up in multiple places. And we have not marked our own version of snprintf() as taking restrict pointers, so the warning is incorrect for now, and gcc picks it up on its own.
If we do start using 'restrict' in the kernel (and it might be a good idea if people find places where it matters), we'll need to figure out how to avoid this issue for snprintf and friends. But in the meantime, this warning is not useful.
--- Makefile | 3 +++ 1 file changed, 3 insertions(+)
Makefile +3 -0
@@ -861,6 +861,9 @@ KBUILD_CFLAGS += $(call cc-disable-warni KBUILD_CFLAGS += $(call cc-disable-warning, array-bounds) KBUILD_CFLAGS += $(call cc-disable-warning, stringop-overflow) +# Another good warning that we'll want to enable eventually +KBUILD_CFLAGS += $(call cc-disable-warning, restrict) + # Enabled with W=2, disabled by default as noisy KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized)
Greg Kroah-Hartman
maintainerPATCH 100/147 gcc-10 warnings: fix low-hanging fruit
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 9d82973e032e246ff5663c9805fbb5407ae932e3 upstream.
Due to a bug-report that was compiler-dependent, I updated one of my machines to gcc-10. That shows a lot of new warnings. Happily they seem to be mostly the valid kind, but it's going to cause a round of churn for getting rid of them..
This is the really low-hanging fruit of removing a couple of zero-sized arrays in some core code. We have had a round of these patches before, and we'll have many more coming, and there is nothing special about these except that they were particularly trivial, and triggered more warnings than most.
--- include/linux/fs.h | 2 +- include/linux/tty.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/linux/fs.h +1 -1
@@ -978,7 +978,7 @@ struct file_handle {__u32 handle_bytes;int handle_type;/* file identifier */ -unsigned char f_handle[0 ]; +unsigned char f_handle[]; };static inline struct file *get_file (struct file *f)
include/linux/tty.h +1 -1
@@ -66,7 +66,7 @@ struct tty_buffer {int read;int flags;/* Data points here */ -unsigned long data[0 ]; +unsigned long data[]; };/* Values for .flags field of tty_buffer */
Greg Kroah-Hartman
maintainerPATCH 101/147 gcc-10: mark more functions __init to avoid section mismatch warnings
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit e99332e7b4cda6e60f5b5916cf9943a79dbef902 upstream.
It seems that for whatever reason, gcc-10 ends up not inlining a couple of functions that used to be inlined before. Even if they only have one single callsite - it looks like gcc may have decided that the code was unlikely, and not worth inlining.
The code generation difference is harmless, but caused a few new section mismatch errors, since the (now no longer inlined) function wasn't in the __init section, but called other init functions:
Section mismatch in reference from the function kexec_free_initrd() to the function .init.text:free_initrd_mem() Section mismatch in reference from the function tpm2_calc_event_log_size() to the function .init.text:early_memremap() Section mismatch in reference from the function tpm2_calc_event_log_size() to the function .init.text:early_memunmap()
So add the appropriate __init annotation to make modpost not complain. In both cases there were trivially just a single callsite from another __init function.
--- drivers/firmware/efi/tpm.c | 2 +- init/initramfs.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/firmware/efi/tpm.c +1 -1
@@ -16,7 +16,7 @@int efi_tpm_final_log_size;EXPORT_SYMBOL (efi_tpm_final_log_size); -static int tpm2_calc_event_log_size (void *data,int count,void *size_info) +static int __init tpm2_calc_event_log_size (void *data,int count,void *size_info) {struct tcg_pcr_event2_head *header;int event_size, size =0 ;
init/initramfs.c +1 -1
@@ -534,7 +534,7 @@ void __weak free_initrd_mem(unsigned lon }#ifdef CONFIG_KEXEC_CORE -static bool kexec_free_initrd (void ) +static bool __init kexec_free_initrd (void ) {unsigned long crashk_start = (unsigned long )__va (crashk_res.start);unsigned long crashk_end = (unsigned long )__va (crashk_res.end);
Greg Kroah-Hartman
maintainerPATCH 102/147 gcc-10: avoid shadowing standard library free() in crypto
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 1a263ae60b04de959d9ce9caea4889385eefcc7b upstream.
gcc-10 has started warning about conflicting types for a few new built-in functions, particularly 'free()'.
This results in warnings like:
crypto/xts.c:325:13: warning: conflicting types for built-in function ‘free’; expected ‘void(void *)’ [-Wbuiltin-declaration-mismatch]
because the crypto layer had its local freeing functions called 'free()'.
Gcc-10 is in the wrong here, since that function is marked 'static', and thus there is no chance of confusion with any standard library function namespace.
But the simplest thing to do is to just use a different name here, and avoid this gcc mis-feature.
[ Side note: gcc knowing about 'free()' is in itself not the
mis-feature: the semantics of 'free()' are special enough that a compiler can validly do special things when seeing it.
So the mis-feature here is that gcc thinks that 'free()' is some restricted name, and you can't shadow it as a local static function.
Making the special 'free()' semantics be a function attribute rather than tied to the name would be the much better model ]
--- crypto/lrw.c | 4 ++-- crypto/xts.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
crypto/lrw.c +2 -2
@@ -289,7 +289,7 @@ static void exit_tfm(struct crypto_skcipcrypto_free_skcipher (ctx->child); } -static void free (struct skcipher_instance *inst) +static void free_inst (struct skcipher_instance *inst) {crypto_drop_skcipher (skcipher_instance_ctx (inst));kfree (inst);
@@ -401,7 +401,7 @@ static int create(struct crypto_template inst->alg.encrypt = encrypt; inst->alg.decrypt = decrypt; - inst->free = free; + inst->free = free_inst; err =skcipher_register_instance (tmpl, inst);if (err)
crypto/xts.c +2 -2
@@ -328,7 +328,7 @@ static void exit_tfm(struct crypto_skcipcrypto_free_cipher (ctx->tweak); } -static void free (struct skcipher_instance *inst) +static void free_inst (struct skcipher_instance *inst) {crypto_drop_skcipher (skcipher_instance_ctx (inst));kfree (inst);
@@ -439,7 +439,7 @@ static int create(struct crypto_template inst->alg.encrypt = encrypt; inst->alg.decrypt = decrypt; - inst->free = free; + inst->free = free_inst; err =skcipher_register_instance (tmpl, inst);if (err)
Greg Kroah-Hartman
maintainerPATCH 103/147 usb: usbfs: correct kernel->user page attribute mismatch
In reply to Greg Kroah-HartmanFrom: Jeremy Linton <[email protected]>
commit 2bef9aed6f0e22391c8d4570749b1acc9bc3981e upstream.
On some architectures (e.g. arm64) requests for IO coherent memory may use non-cachable attributes if the relevant device isn't cache coherent. If these pages are then remapped into userspace as cacheable, they may not be coherent with the non-cacheable mappings.
In particular this happens with libusb, when it attempts to create zero-copy buffers for use by rtl-sdr
(https://github.com/osmocom/rtl-sdr/). On low end arm devices with non-coherent USB ports, the application will be unexpectedly killed, while continuing to work fine on arm machines with coherent USB controllers.
This bug has been discovered/reported a few times over the last few years. In the case of rtl-sdr a compile time option to enable/disable zero copy was implemented to work around it.
Rather than relaying on application specific workarounds, dma_mmap_coherent() can be used instead of remap_pfn_range(). The page cache/etc attributes will then be correctly set in userspace to match the kernel mapping.
--- drivers/usb/core/devio.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/usb/core/devio.c +2 -3
@@ -217,6 +217,7 @@ static int usbdev_mmap(struct file *file {struct usb_memory *usbm =NULL ;struct usb_dev_state *ps = file->private_data; +struct usb_hcd *hcd =bus_to_hcd (ps->dev->bus);size_t size = vma->vm_end - vma->vm_start;void *mem;unsigned long flags;
@@ -250,9 +251,7 @@ static int usbdev_mmap(struct file *file usbm->vma_use_count =1 ;INIT_LIST_HEAD (&usbm->memlist); -if (remap_pfn_range (vma, vma->vm_start, -virt_to_phys (usbm->mem) >>PAGE_SHIFT , - size, vma->vm_page_prot) <0 ) { +if (dma_mmap_coherent (hcd->self.sysdev, vma, mem, dma_handle, size)) {dec_usb_memory_use_count (usbm, &usbm->vma_use_count);return -EAGAIN ; }
Greg Kroah-Hartman
maintainerPATCH 104/147 USB: usbfs: fix mmap dma mismatch
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
commit a0e710a7def471b8eb779ff551fc27701da49599 upstream.
In commit 2bef9aed6f0e ("usb: usbfs: correct kernel->user page attribute mismatch") we switched from always calling remap_pfn_range() to call dma_mmap_coherent() to handle issues with systems with non-coherent USB host controller drivers. Unfortunatly, as syzbot quickly told us, not all the world is host controllers with DMA support, so we need to check what host controller we are attempting to talk to before doing this type of allocation.
Thanks to Christoph for the quick idea of how to fix this.
--- drivers/usb/core/devio.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
drivers/usb/core/devio.c +13 -3
@@ -251,9 +251,19 @@ static int usbdev_mmap(struct file *file usbm->vma_use_count =1 ;INIT_LIST_HEAD (&usbm->memlist); -if (dma_mmap_coherent (hcd->self.sysdev, vma, mem, dma_handle, size)) { -dec_usb_memory_use_count (usbm, &usbm->vma_use_count); -return -EAGAIN ; +if (hcd->localmem_pool || !hcd_uses_dma (hcd)) { +if (remap_pfn_range (vma, vma->vm_start, +virt_to_phys (usbm->mem) >>PAGE_SHIFT , + size, vma->vm_page_prot) <0 ) { +dec_usb_memory_use_count (usbm, &usbm->vma_use_count); +return -EAGAIN ; + } + }else { +if (dma_mmap_coherent (hcd->self.sysdev, vma, mem, dma_handle, + size)) { +dec_usb_memory_use_count (usbm, &usbm->vma_use_count); +return -EAGAIN ; + } } vma->vm_flags |=VM_IO ;
Greg Kroah-Hartman
maintainerPATCH 105/147 ALSA: hda/realtek - Limit int mic boost for Thinkpad T530
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit b590b38ca305d6d7902ec7c4f7e273e0069f3bcc upstream.
Lenovo Thinkpad T530 seems to have a sensitive internal mic capture that needs to limit the mic boost like a few other Thinkpad models. Although we may change the quirk for ALC269_FIXUP_LENOVO_DOCK, this hits way too many other laptop models, so let's add a new fixup model that limits the internal mic boost on top of the existing quirk and apply to only T530.
--- sound/pci/hda/patch_realtek.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
sound/pci/hda/patch_realtek.c +9 -1
@@ -5856,6 +5856,7 @@ enum {ALC269_FIXUP_HP_LINE1_MIC1_LED ,ALC269_FIXUP_INV_DMIC ,ALC269_FIXUP_LENOVO_DOCK , +ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST ,ALC269_FIXUP_NO_SHUTUP ,ALC286_FIXUP_SONY_MIC_NO_PRESENCE , ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
@@ -6175,6 +6176,12 @@ static const struct hda_fixup alc269_fix .chained = true, .chain_id =ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT }, + [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc269_fixup_limit_int_mic_boost, + .chained = true, + .chain_id = ALC269_FIXUP_LENOVO_DOCK, + }, [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = { .type = HDA_FIXUP_FUNC, .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
@@ -7317,7 +7324,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x21b8 ,"Thinkpad Edge 14" ,ALC269_FIXUP_SKU_IGNORE ),SND_PCI_QUIRK (0x17aa ,0x21ca ,"Thinkpad L412" ,ALC269_FIXUP_SKU_IGNORE ),SND_PCI_QUIRK (0x17aa ,0x21e9 ,"Thinkpad Edge 15" ,ALC269_FIXUP_SKU_IGNORE ), -SND_PCI_QUIRK (0x17aa ,0x21f6 ,"Thinkpad T530" ,ALC269_FIXUP_LENOVO_DOCK ), +SND_PCI_QUIRK (0x17aa ,0x21f6 ,"Thinkpad T530" ,ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST ),SND_PCI_QUIRK (0x17aa ,0x21fa ,"Thinkpad X230" ,ALC269_FIXUP_LENOVO_DOCK ),SND_PCI_QUIRK (0x17aa ,0x21f3 ,"Thinkpad T430" ,ALC269_FIXUP_LENOVO_DOCK ), SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
@@ -7456,6 +7463,7 @@ static const struct hda_model_fixup alc2 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"}, {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"}, {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"}, + {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"}, {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"}, {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"}, {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
Greg Kroah-Hartman
maintainerPATCH 106/147 ALSA: hda/realtek - Add COEF workaround for ASUS ZenBook UX431DA
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 1b94e59d30afecf18254ad413e953e7587645a20 upstream.
ASUS ZenBook UX431DA requires an additional COEF setup when booted from the recent Windows 10, otherwise it produces the noisy output. The quirk turns on COEF 0x1b bit 10 that has been cleared supposedly due to the pop noise reduction.
--- sound/pci/hda/patch_realtek.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
sound/pci/hda/patch_realtek.c +13 -0
@@ -5978,6 +5978,7 @@ enum {ALC294_FIXUP_ASUS_DUAL_SPK ,ALC285_FIXUP_THINKPAD_HEADSET_JACK ,ALC294_FIXUP_ASUS_HPE , +ALC294_FIXUP_ASUS_COEF_1B , ALC285_FIXUP_HP_GPIO_LED, };
@@ -7112,6 +7113,17 @@ static const struct hda_fixup alc269_fix .chained = true, .chain_id =ALC294_FIXUP_ASUS_HEADSET_MIC }, + [ALC294_FIXUP_ASUS_COEF_1B] = { + .type = HDA_FIXUP_VERBS, + .v.verbs = (const struct hda_verb []) { +/* Set bit 10 to correct noisy output after reboot from +* Windows 10 (due to pop noise reduction?) +*/ + {0x20 ,AC_VERB_SET_COEF_INDEX ,0x1b }, + {0x20 ,AC_VERB_SET_PROC_COEF ,0x4e4b }, + { } + }, + }, [ALC285_FIXUP_HP_GPIO_LED] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_hp_gpio_led,
@@ -7283,6 +7295,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1043 ,0x19ce ,"ASUS B9450FA" ,ALC294_FIXUP_ASUS_HPE ),SND_PCI_QUIRK (0x1043 ,0x1a13 ,"Asus G73Jw" ,ALC269_FIXUP_ASUS_G73JW ),SND_PCI_QUIRK (0x1043 ,0x1a30 ,"ASUS X705UD" ,ALC256_FIXUP_ASUS_MIC ), +SND_PCI_QUIRK (0x1043 ,0x1b11 ,"ASUS UX431DA" ,ALC294_FIXUP_ASUS_COEF_1B ),SND_PCI_QUIRK (0x1043 ,0x1b13 ,"Asus U41SV" ,ALC269_FIXUP_INV_DMIC ),SND_PCI_QUIRK (0x1043 ,0x1bbd ,"ASUS Z550MA" ,ALC255_FIXUP_ASUS_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Greg Kroah-Hartman
maintainerPATCH 107/147 ALSA: rawmidi: Fix racy buffer resize under concurrent accesses
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit c1f6e3c818dd734c30f6a7eeebf232ba2cf3181d upstream.
The rawmidi core allows user to resize the runtime buffer via ioctl, and this may lead to UAF when performed during concurrent reads or
writes: the read/write functions unlock the runtime lock temporarily during copying form/to user-space, and that's the race window.
This patch fixes the hole by introducing a reference counter for the runtime buffer read/write access and returns -EBUSY error when the resize is performed concurrently against read/write.
Note that the ref count field is a simple integer instead of refcount_t here, since the all contexts accessing the buffer is basically protected with a spinlock, hence we need no expensive atomic ops. Also, note that this busy check is needed only against read / write functions, and not in receive/transmit callbacks; the race can happen only at the spinlock hole mentioned in the above, while the whole function is protected for receive / transmit callbacks.
--- include/sound/rawmidi.h | 1 + sound/core/rawmidi.c | 31 +++++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-)
include/sound/rawmidi.h +1 -0
@@ -61,6 +61,7 @@ struct snd_rawmidi_runtime {size_t avail_min;/* min avail for wakeup */ size_t avail;/* max used buffer for wakeup */ size_t xruns;/* over/underruns counter */ +int buffer_ref;/* buffer reference count */ /* misc */ spinlock_t lock;wait_queue_head_t sleep;
sound/core/rawmidi.c +27 -4
@@ -97,6 +97,17 @@ static void snd_rawmidi_input_event_work runtime->event (runtime->substream); } +/* buffer refcount management: call with runtime->lock held */ +static inline void snd_rawmidi_buffer_ref (struct snd_rawmidi_runtime *runtime) +{ + runtime->buffer_ref++; +} + +static inline void snd_rawmidi_buffer_unref (struct snd_rawmidi_runtime *runtime) +{ + runtime->buffer_ref--; +} +static int snd_rawmidi_runtime_create (struct snd_rawmidi_substream *substream) {struct snd_rawmidi_runtime *runtime;
@@ -646,6 +657,11 @@ static int resize_runtime_buffer(structif (!newbuf)return -ENOMEM ;spin_lock_irq (&runtime->lock); +if (runtime->buffer_ref) { +spin_unlock_irq (&runtime->lock); +kvfree (newbuf); +return -EBUSY ; + } oldbuf = runtime->buffer; runtime->buffer = newbuf; runtime->buffer_size = params->buffer_size;
@@ -945,8 +961,10 @@ static long snd_rawmidi_kernel_read1(strlong result =0 , count1;struct snd_rawmidi_runtime *runtime = substream->runtime;unsigned long appl_ptr; +int err =0 ;spin_lock_irqsave (&runtime->lock, flags); +snd_rawmidi_buffer_ref (runtime);while (count >0 && runtime->avail) { count1 = runtime->buffer_size - runtime->appl_ptr;if (count1 > count)
@@ -965,16 +983,19 @@ static long snd_rawmidi_kernel_read1(strif (userbuf) {spin_unlock_irqrestore (&runtime->lock, flags);if (copy_to_user (userbuf + result, - runtime->buffer + appl_ptr, count1)) { -return result >0 ? result : -EFAULT ; - } + runtime->buffer + appl_ptr, count1)) + err = -EFAULT ;spin_lock_irqsave (&runtime->lock, flags); +if (err) + goto out; } result += count1; count -= count1; } + out: +snd_rawmidi_buffer_unref (runtime);spin_unlock_irqrestore (&runtime->lock, flags); -return result; +return result >0 ? result : err; } long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
@@ -1268,6 +1289,7 @@ static long snd_rawmidi_kernel_write1(streturn -EAGAIN ; } } +snd_rawmidi_buffer_ref (runtime);while (count >0 && runtime->avail >0 ) { count1 = runtime->buffer_size - runtime->appl_ptr;if (count1 > count)
@@ -1299,6 +1321,7 @@ static long snd_rawmidi_kernel_write1(st } __end: count1 = runtime->avail < runtime->buffer_size; +snd_rawmidi_buffer_unref (runtime);spin_unlock_irqrestore (&runtime->lock, flags);if (count1)snd_rawmidi_output_trigger (substream,1 );
Greg Kroah-Hartman
maintainerPATCH 108/147 ALSA: usb-audio: Add control message quirk delay for Kingston HyperX headset
In reply to Greg Kroah-HartmanFrom: Jesus Ramos <[email protected]>
commit 073919e09ca445d4486968e3f851372ff44cf2b5 upstream.
Kingston HyperX headset with 0951:16ad also needs the same quirk for delaying the frequency controls.
--- sound/usb/quirks.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
sound/usb/quirks.c +5 -4
@@ -1592,13 +1592,14 @@ void snd_usb_ctl_msg_quirk(struct usb_de && (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)msleep (20 ); -/* Zoom R16/24, Logitech H650e, Jabra 550a needs a tiny delay here, -* otherwise requests like get/set frequency return as failed despite -* actually succeeding. +/* Zoom R16/24, Logitech H650e, Jabra 550a, Kingston HyperX needs a tiny +* delay here, otherwise requests like get/set frequency return as +* failed despite actually succeeding. */ if ((chip->usb_id ==USB_ID (0x1686 ,0x00dd ) || chip->usb_id ==USB_ID (0x046d ,0x0a46 ) || - chip->usb_id ==USB_ID (0x0b0e ,0x0349 )) && + chip->usb_id ==USB_ID (0x0b0e ,0x0349 ) || + chip->usb_id ==USB_ID (0x0951 ,0x16ad )) && (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS )usleep_range (1000 ,2000 ); }
Greg Kroah-Hartman
maintainerPATCH 109/147 usb: core: hub: limit HUB_QUIRK_DISABLE_AUTOSUSPEND to USB5534B
In reply to Greg Kroah-HartmanFrom: Eugeniu Rosca <[email protected]>
commit 76e1ef1d81a4129d7e2fb8c48c83b166d1c8e040 upstream.
On Tue, May 12, 2020 at 09:36:07PM +0800, Kai-Heng Feng wrote [1]:
Quoted 1 line
This patch prevents my Raven Ridge xHCI from getting runtime suspend.
The problem described in v5.6 commit 1208f9e1d758c9 ("USB: hub: Fix the broken detection of USB3 device in SMSC hub") applies solely to the USB5534B hub [2] present on the Kingfisher Infotainment Carrier Board, manufactured by Shimafuji Electric Inc [3].
Despite that, the aforementioned commit applied the quirk to _all_ hubs carrying vendor ID 0x424 (i.e. SMSC), of which there are more [4] than initially expected. Consequently, the quirk is now enabled on platforms carrying SMSC/Microchip hub models which potentially don't exhibit the original issue.
To avoid reports like [1], further limit the quirk's scope to USB5534B [2], by employing both Vendor and Product ID checks.
Tested on H3ULCB + Kingfisher rev. M05.
[1] https://lore.kernel.org/linux-renesas-soc/[email protected]/
[2] https://www.microchip.com/wwwproducts/en/USB5534B
[3] http://www.shimafuji.co.jp/wp/wp-content/uploads/2018/08/SBEV-RCAR-KF-M06Board_HWSpecificationEN_Rev130.pdf
[4] https://devicehunt.com/search/type/usb/vendor/0424/device/any
--- drivers/usb/core/hub.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/usb/core/hub.c +5 -1
@@ -38,6 +38,7 @@#define USB_VENDOR_GENESYS_LOGIC 0x05e3#define USB_VENDOR_SMSC 0x0424 +#define USB_PRODUCT_USB5534B 0x5534#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01#define HUB_QUIRK_DISABLE_AUTOSUSPEND 0x02
@@ -5506,8 +5507,11 @@ out_hdev_lock: }static const struct usb_device_id hub_id_table[] = { - { .match_flags =USB_DEVICE_ID_MATCH_VENDOR |USB_DEVICE_ID_MATCH_INT_CLASS , + { .match_flags =USB_DEVICE_ID_MATCH_VENDOR + |USB_DEVICE_ID_MATCH_PRODUCT + |USB_DEVICE_ID_MATCH_INT_CLASS , .idVendor =USB_VENDOR_SMSC , + .idProduct =USB_PRODUCT_USB5534B , .bInterfaceClass =USB_CLASS_HUB , .driver_info =HUB_QUIRK_DISABLE_AUTOSUSPEND }, { .match_flags =USB_DEVICE_ID_MATCH_VENDOR
Greg Kroah-Hartman
maintainerPATCH 110/147 usb: host: xhci-plat: keep runtime active when removing host
In reply to Greg Kroah-HartmanFrom: Li Jun <[email protected]>
commit 1449cb2c2253d37d998c3714aa9b95416d16d379 upstream.
While removing the host (e.g. for USB role switch from host to device), if runtime pm is enabled by user, below oops occurs on dwc3 and cdns3 platforms.
Keeping the xhci-plat device active during host removal, and disabling runtime pm before calling pm_runtime_set_suspended() fixes them.
oops1:
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000240 Internal error: Oops: 96000004 [#1] PREEMPT SMP Modules linked in: CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted 5.4.3-00107-g64d454a-dirty Hardware name: FSL i.MX8MP EVK (DT) Workqueue: pm pm_runtime_work pstate: 60000005 (nZCv daif -PAN -UAO) pc : xhci_suspend+0x34/0x698 lr : xhci_plat_runtime_suspend+0x2c/0x38 sp : ffff800011ddbbc0 Call trace: xhci_suspend+0x34/0x698 xhci_plat_runtime_suspend+0x2c/0x38 pm_generic_runtime_suspend+0x28/0x40 __rpm_callback+0xd8/0x138 rpm_callback+0x24/0x98 rpm_suspend+0xe0/0x448 rpm_idle+0x124/0x140 pm_runtime_work+0xa0/0xf8 process_one_work+0x1dc/0x370 worker_thread+0x48/0x468 kthread+0xf0/0x120 ret_from_fork+0x10/0x1c
oops2:
usb 2-1: USB disconnect, device number 2
xhci-hcd xhci-hcd.1.auto: remove, state 4
usb usb2: USB disconnect, device number 1
xhci-hcd xhci-hcd.1.auto: USB bus 2 deregistered
xhci-hcd xhci-hcd.1.auto: remove, state 4
usb usb1: USB disconnect, device number 1
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000138 Internal error: Oops: 96000004 [#1] PREEMPT SMP Modules linked in: CPU: 2 PID: 7 Comm: kworker/u8:0 Not tainted 5.6.0-rc4-next-20200304-03578 Hardware name: Freescale i.MX8QXP MEK (DT) Workqueue: 1-0050 tcpm_state_machine_work pstate: 20000005 (nzCv daif -PAN -UAO) pc : xhci_free_dev+0x214/0x270 lr : xhci_plat_runtime_resume+0x78/0x88 sp : ffff80001006b5b0 Call trace: xhci_free_dev+0x214/0x270 xhci_plat_runtime_resume+0x78/0x88 pm_generic_runtime_resume+0x30/0x48 __rpm_callback+0x90/0x148 rpm_callback+0x28/0x88 rpm_resume+0x568/0x758 rpm_resume+0x260/0x758 rpm_resume+0x260/0x758 __pm_runtime_resume+0x40/0x88 device_release_driver_internal+0xa0/0x1c8 device_release_driver+0x1c/0x28 bus_remove_device+0xd4/0x158 device_del+0x15c/0x3a0 usb_disable_device+0xb0/0x268 usb_disconnect+0xcc/0x300 usb_remove_hcd+0xf4/0x1dc xhci_plat_remove+0x78/0xe0 platform_drv_remove+0x30/0x50 device_release_driver_internal+0xfc/0x1c8 device_release_driver+0x1c/0x28 bus_remove_device+0xd4/0x158 device_del+0x15c/0x3a0 platform_device_del.part.0+0x20/0x90 platform_device_unregister+0x28/0x40 cdns3_host_exit+0x20/0x40 cdns3_role_stop+0x60/0x90 cdns3_role_set+0x64/0xd8 usb_role_switch_set_role.part.0+0x3c/0x68 usb_role_switch_set_role+0x20/0x30 tcpm_mux_set+0x60/0xf8 tcpm_reset_port+0xa4/0xf0 tcpm_detach.part.0+0x28/0x50 tcpm_state_machine_work+0x12ac/0x2360 process_one_work+0x1c8/0x470 worker_thread+0x50/0x428 kthread+0xfc/0x128 ret_from_fork+0x10/0x18 Code: c8037c02 35ffffa3 17ffe7c3 f9800011 (c85f7c01) ---[ end trace 45b1a173d2679e44 ]---
--- drivers/usb/host/xhci-plat.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-plat.c +3 -1
@@ -363,6 +363,7 @@ static int xhci_plat_remove(struct platfstruct clk *reg_clk = xhci->reg_clk;struct usb_hcd *shared_hcd = xhci->shared_hcd; +pm_runtime_get_sync (&dev->dev); xhci->xhc_state |=XHCI_STATE_REMOVING ;usb_remove_hcd (shared_hcd);
@@ -376,8 +377,9 @@ static int xhci_plat_remove(struct platfclk_disable_unprepare (reg_clk);usb_put_hcd (hcd); -pm_runtime_set_suspended (&dev->dev);pm_runtime_disable (&dev->dev); +pm_runtime_put_noidle (&dev->dev); +pm_runtime_set_suspended (&dev->dev);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 111/147 usb: cdns3: gadget: prev_req->trb is NULL for ep0
In reply to Greg Kroah-HartmanFrom: Peter Chen <[email protected]>
commit 95cd7dc47abd71d1a0c9c43594ff2fa32552f46c upstream.
And there are no multiple TRBs on EP0 and WA1 workaround, so it doesn't need to change TRB for EP0. It fixes below oops.
configfs-gadget gadget: high-speed config #1: bandroid_work: sent uevent USB_STATE=CONFIGURED
Unable to handle kernel read from unreadable memory at virtual address 0000000000000008
Mem abort info:android_work: sent uevent USB_STATE=DISCONNECTED
ESR = 0x96000004
EC = 0x25: DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000004
CM = 0, WnR = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=00000008b5bb7000 [0000000000000008] pgd=0000000000000000
Internal error: Oops: 96000004 [#1] PREEMPT SMP Modules linked in: CPU: 2 PID: 430 Comm: HwBinder:401_1 Not tainted 5.4.24-06071-g6fa8921409c1-dirty #77 Hardware name: Freescale i.MX8QXP MEK (DT) pstate: 60400085 (nZCv daIf +PAN -UAO) pc : cdns3_gadget_ep_dequeue+0x1d4/0x270 lr : cdns3_gadget_ep_dequeue+0x48/0x270
sp : ffff800012763ba0
x29: ffff800012763ba0 x28: ffff00082c653c00
x27: 0000000000000000 x26: ffff000068fa7b00
x25: ffff0000699b2000 x24: ffff00082c6ac000
x23: ffff000834f0a480 x22: ffff000834e87b9c
x21: 0000000000000000 x20: ffff000834e87800
x19: ffff000069eddc00 x18: 0000000000000000
x17: 0000000000000000 x16: 0000000000000000
x15: 0000000000000000 x14: 0000000000000000
x13: 0000000000000000 x12: 0000000000000001
x11: ffff80001180fbe8 x10: 0000000000000001 x9 : ffff800012101558 x8 : 0000000000000001 x7 : 0000000000000006 x6 : ffff000835d9c668 x5 : ffff000834f0a4c8 x4 : 0000000096000000 x3 : 0000000000001810 x2 : 0000000000000000 x1 : ffff800024bd001c x0 : 0000000000000001
Call trace: cdns3_gadget_ep_dequeue+0x1d4/0x270 usb_ep_dequeue+0x34/0xf8 composite_dev_cleanup+0x154/0x170 configfs_composite_unbind+0x6c/0xa8 usb_gadget_remove_driver+0x44/0x70 usb_gadget_unregister_driver+0x74/0xe0 unregister_gadget+0x28/0x58 gadget_dev_desc_UDC_store+0x80/0x110 configfs_write_file+0x1e0/0x2a0 __vfs_write+0x48/0x90 vfs_write+0xe4/0x1c8 ksys_write+0x78/0x100 __arm64_sys_write+0x24/0x30 el0_svc_common.constprop.0+0x74/0x168 el0_svc_handler+0x34/0xa0 el0_svc+0x8/0xc Code: 52830203 b9407660 f94042e4 11000400 (b9400841) ---[ end trace 1574516e4c1772ca ]--- Kernel panic - not syncing: Fatal exception
SMP: stopping secondary CPUs
Kernel Offset: disabled
CPU features: 0x0002,20002008
Memory Limit: none
Rebooting in 5 seconds..
--- drivers/usb/cdns3/gadget.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/cdns3/gadget.c +1 -1
@@ -2105,7 +2105,7 @@ found: link_trb = priv_req->trb;/* Update ring only if removed request is on pending_req_list list */ -if (req_on_hw_ring) { +if (req_on_hw_ring && link_trb) { link_trb->buffer =TRB_BUFFER (priv_ep->trb_pool_dma + ((priv_req->end_trb +1 ) *TRB_SIZE )); link_trb->control = (link_trb->control & TRB_CYCLE) |
Greg Kroah-Hartman
maintainerPATCH 112/147 USB: gadget: fix illegal array access in binding with UDC
In reply to Greg Kroah-HartmanFrom: Kyungtae Kim <[email protected]>
commit 15753588bcd4bbffae1cca33c8ced5722477fe1f upstream.
FuzzUSB (a variant of syzkaller) found an illegal array access using an incorrect index while binding a gadget with UDC.
Reference: https://www.spinics.net/lists/linux-usb/msg194331.html
This bug occurs when a size variable used for a buffer
is misused to access its strcpy-ed buffer.
Given a buffer along with its size variable (taken from user input), from which, a new buffer is created using kstrdup().
Due to the original buffer containing 0 value in the middle,
the size of the kstrdup-ed buffer becomes smaller than that of the original. So accessing the kstrdup-ed buffer with the same size variable triggers memory access violation.
The fix makes sure no zero value in the buffer,
by comparing the strlen() of the orignal buffer with the size variable, so that the access to the kstrdup-ed buffer is safe.
BUG: KASAN: slab-out-of-bounds in gadget_dev_desc_UDC_store+0x1ba/0x200 drivers/usb/gadget/configfs.c:266 Read of size 1 at addr ffff88806a55dd7e by task syz-executor.0/17208 CPU: 2 PID: 17208 Comm: syz-executor.0 Not tainted 5.6.8 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0xce/0x128 lib/dump_stack.c:118 print_address_description.constprop.4+0x21/0x3c0 mm/kasan/report.c:374 __kasan_report+0x131/0x1b0 mm/kasan/report.c:506 kasan_report+0x12/0x20 mm/kasan/common.c:641 __asan_report_load1_noabort+0x14/0x20 mm/kasan/generic_report.c:132 gadget_dev_desc_UDC_store+0x1ba/0x200 drivers/usb/gadget/configfs.c:266 flush_write_buffer fs/configfs/file.c:251 [inline] configfs_write_file+0x2f1/0x4c0 fs/configfs/file.c:283 __vfs_write+0x85/0x110 fs/read_write.c:494 vfs_write+0x1cd/0x510 fs/read_write.c:558 ksys_write+0x18a/0x220 fs/read_write.c:611 __do_sys_write fs/read_write.c:623 [inline] __se_sys_write fs/read_write.c:620 [inline] __x64_sys_write+0x73/0xb0 fs/read_write.c:620 do_syscall_64+0x9e/0x510 arch/x86/entry/common.c:294 entry_SYSCALL_64_after_hwframe+0x49/0xbe
--- drivers/usb/gadget/configfs.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/gadget/configfs.c +3 -0
@@ -260,6 +260,9 @@ static ssize_t gadget_dev_desc_UDC_storechar *name;int ret; +if (strlen (page) < len) +return -EOVERFLOW ; + name =kstrdup (page,GFP_KERNEL );if (!name)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 113/147 usb: xhci: Fix NULL pointer dereference when enqueuing trbs from urb sg list
In reply to Greg Kroah-HartmanFrom: Sriharsha Allenki <[email protected]>
commit 3c6f8cb92c9178fc0c66b580ea3df1fa3ac1155a upstream.
On platforms with IOMMU enabled, multiple SGs can be coalesced into one by the IOMMU driver. In that case the SG list processing as part of the completion of a urb on a bulk endpoint can result into a NULL pointer dereference with the below stack dump.
<6> Unable to handle kernel NULL pointer dereference at virtual address 0000000c <6> pgd = c0004000
<6> [0000000c] *pgd=00000000
<6> Internal error: Oops: 5 [#1] PREEMPT SMP ARM
<2> PC is at xhci_queue_bulk_tx+0x454/0x80c
<2> LR is at xhci_queue_bulk_tx+0x44c/0x80c
<2> pc : [<c08907c4>] lr : [<c08907bc>] psr: 000000d3
<2> sp : ca337c80 ip : 00000000 fp : ffffffff <2> r10: 00000000 r9 : 50037000 r8 : 00004000 <2> r7 : 00000000 r6 : 00004000 r5 : 00000000 r4 : 00000000 <2> r3 : 00000000 r2 : 00000082 r1 : c2c1a200 r0 : 00000000
<2> Flags: nzcv IRQs off FIQs off Mode SVC_32 ISA ARM Segment none <2> Control: 10c0383d Table: b412c06a DAC: 00000051
<6> Process usb-storage (pid: 5961, stack limit = 0xca336210) <snip>
<2> [<c08907c4>] (xhci_queue_bulk_tx)
<2> [<c0881b3c>] (xhci_urb_enqueue)
<2> [<c0831068>] (usb_hcd_submit_urb)
<2> [<c08350b4>] (usb_sg_wait)
<2> [<c089f384>] (usb_stor_bulk_transfer_sglist)
<2> [<c089f2c0>] (usb_stor_bulk_srb)
<2> [<c089fe38>] (usb_stor_Bulk_transport)
<2> [<c089f468>] (usb_stor_invoke_transport)
<2> [<c08a11b4>] (usb_stor_control_thread)
<2> [<c014a534>] (kthread)
The above NULL pointer dereference is the result of block_len and the sent_len set to zero after the first SG of the list when IOMMU driver is enabled. Because of this the loop of processing the SGs has run more than num_sgs which resulted in a sg_next on the last SG of the list which has SG_END set.
Fix this by check for the sg before any attributes of the sg are accessed.
--- drivers/usb/host/xhci-ring.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/host/xhci-ring.c +2 -2
@@ -3421,8 +3421,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd */* New sg entry */ --num_sgs; sent_len -= block_len; -if (num_sgs !=0 ) { - sg =sg_next (sg); + sg =sg_next (sg); +if (num_sgs !=0 && sg) { block_len =sg_dma_len (sg); addr = (u64 )sg_dma_address (sg); addr += sent_len;
Greg Kroah-Hartman
maintainerPATCH 114/147 Make the "Reducing compressed framebufer size" message be DRM_INFO_ONCE()
In reply to Greg Kroah-HartmanFrom: Peter Jones <[email protected]>
commit 82152d424b6cb6fc1ede7d03d69c04e786688740 upstream.
This was sort of annoying me:
random:~$ dmesg | tail -1 [523884.039227] [drm] Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS. random:~$ dmesg | grep -c "Reducing the compressed" 47
This patch makes it DRM_INFO_ONCE() just like the similar message farther down in that function is pr_info_once().
--- drivers/gpu/drm/i915/display/intel_fbc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/gpu/drm/i915/display/intel_fbc.c +1 -2
@@ -504,8 +504,7 @@ static int intel_fbc_alloc_cfb(struct inif (!ret) goto err_llb;else if (ret >1 ) { -DRM_INFO ("Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS.\n" ); - +DRM_INFO_ONCE ("Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS.\n" ); } fbc->threshold = ret;
Greg Kroah-Hartman
maintainerPATCH 115/147 ARM: dts: dra7: Fix bus_dma_limit for PCIe
In reply to Greg Kroah-HartmanFrom: Kishon Vijay Abraham I <[email protected]>
commit 90d4d3f4ea45370d482fa609dbae4d2281b4074f upstream.
Even though commit cfb5d65f2595 ("ARM: dts: dra7: Add bus_dma_limit for L3 bus") added bus_dma_limit for L3 bus, the PCIe controller gets incorrect value of bus_dma_limit.
Fix it by adding empty dma-ranges property to axi@0 and axi@1 (parent device tree node of PCIe controller).
--- arch/arm/boot/dts/dra7.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/dra7.dtsi +2 -2
@@ -172,6 +172,7 @@ #address-cells = <1>; ranges = <0x51000000 0x51000000 0x3000 0x0 0x20000000 0x10000000>; + dma-ranges; /** * To enable PCI endpoint mode, disable the pcie1_rc * node and enable pcie1_ep mode.
@@ -185,7 +186,6 @@ device_type = "pci"; ranges = <0x81000000 0 0 0x03000 0 0x00010000 0x82000000 0 0x20013000 0x13000 0 0xffed000>; - dma-ranges = <0x02000000 0x0 0x00000000 0x00000000 0x1 0x00000000>; bus-range = <0x00 0xff>; #interrupt-cells = <1>; num-lanes = <1>;
@@ -230,6 +230,7 @@ #address-cells = <1>; ranges = <0x51800000 0x51800000 0x3000 0x0 0x30000000 0x10000000>; + dma-ranges; status = "disabled"; pcie2_rc: pcie@51800000 { reg = <0x51800000 0x2000>, <0x51802000 0x14c>, <0x1000 0x2000>;
@@ -240,7 +241,6 @@ device_type = "pci"; ranges = <0x81000000 0 0 0x03000 0 0x00010000 0x82000000 0 0x30013000 0x13000 0 0xffed000>; - dma-ranges = <0x02000000 0x0 0x00000000 0x00000000 0x1 0x00000000>; bus-range = <0x00 0xff>; #interrupt-cells = <1>; num-lanes = <1>;
Greg Kroah-Hartman
maintainerPATCH 116/147 ARM: dts: imx27-phytec-phycard-s-rdk: Fix the I2C1 pinctrl entries
In reply to Greg Kroah-HartmanFrom: Fabio Estevam <[email protected]>
commit 0caf34350a25907515d929a9c77b9b206aac6d1e upstream.
The I2C2 pins are already used and the following errors are seen:
imx27-pinctrl 10015000.iomuxc: pin MX27_PAD_I2C2_SDA already requested by 10012000.i2c; cannot claim for 1001d000.i2c imx27-pinctrl 10015000.iomuxc: pin-69 (1001d000.i2c) status -22
imx27-pinctrl 10015000.iomuxc: could not request pin 69 (MX27_PAD_I2C2_SDA) from group i2c2grp on device 10015000.iomuxc imx-i2c 1001d000.i2c: Error applying setting, reverse things back
imx-i2c: probe of 1001d000.i2c failed with error -22
Fix it by adding the correct I2C1 IOMUX entries for the pinctrl_i2c1 group.
--- arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts +2 -2
@@ -75,8 +75,8 @@ imx27-phycard-s-rdk { pinctrl_i2c1: i2c1grp { fsl,pins = < - MX27_PAD_I2C2_SDA__I2C2_SDA 0x0 - MX27_PAD_I2C2_SCL__I2C2_SCL 0x0 + MX27_PAD_I2C_DATA__I2C_DATA 0x0 + MX27_PAD_I2C_CLK__I2C_CLK 0x0 >; };
Greg Kroah-Hartman
maintainerPATCH 117/147 ARM: dts: imx6dl-yapp4: Fix Ursa board Ethernet connection
In reply to Greg Kroah-HartmanFrom: Michal Vokáč <[email protected]>
commit cbe63a8358310244e6007398bd2c7c70c7fd51cd upstream.
The Y Soft yapp4 platform supports up to two Ethernet ports. The Ursa board though has only one Ethernet port populated and that is the port@2. Since the introduction of this platform into mainline a wrong port was deleted and the Ethernet could never work. Fix this by deleting the correct port node.
--- arch/arm/boot/dts/imx6dl-yapp4-ursa.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/imx6dl-yapp4-ursa.dts +1 -1
@@ -38,7 +38,7 @@ }; &switch_ports { - /delete-node/ port@2; + /delete-node/ port@3; }; &touchscreen {
Greg Kroah-Hartman
maintainerPATCH 118/147 drm/amd/display: add basic atomic check for cursor plane
In reply to Greg Kroah-HartmanFrom: Simon Ser <[email protected]>
commit 626bf90fe03fa080d8df06bb0397c95c53ae8e27 upstream.
This patch adds a basic cursor check when an atomic test-only commit is performed. The position and size of the cursor plane is checked.
This should fix user-space relying on atomic checks to assign buffers to planes.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +24 -2
@@ -6921,6 +6921,7 @@ static int dm_update_plane_state(structstruct drm_crtc_state *old_crtc_state, *new_crtc_state;struct dm_crtc_state *dm_new_crtc_state, *dm_old_crtc_state;struct dm_plane_state *dm_new_plane_state, *dm_old_plane_state; +struct amdgpu_crtc *new_acrtc;bool needs_reset;int ret =0 ;
@@ -6930,9 +6931,30 @@ static int dm_update_plane_state(struct dm_new_plane_state =to_dm_plane_state (new_plane_state); dm_old_plane_state =to_dm_plane_state (old_plane_state); -/*TODO Implement atomic check for cursor plane */ -if (plane->type ==DRM_PLANE_TYPE_CURSOR ) +/*TODO Implement better atomic check for cursor plane */ +if (plane->type ==DRM_PLANE_TYPE_CURSOR ) { +if (!enable || !new_plane_crtc || +drm_atomic_plane_disabling (plane->state, new_plane_state)) +return 0 ; + + new_acrtc =to_amdgpu_crtc (new_plane_crtc); + +if ((new_plane_state->crtc_w > new_acrtc->max_cursor_width) || + (new_plane_state->crtc_h > new_acrtc->max_cursor_height)) { +DRM_DEBUG_ATOMIC ("Bad cursor size %d x %d\n" , + new_plane_state->crtc_w, new_plane_state->crtc_h); +return -EINVAL ; + } + +if (new_plane_state->crtc_x <= -new_acrtc->max_cursor_width || + new_plane_state->crtc_y <= -new_acrtc->max_cursor_height) { +DRM_DEBUG_ATOMIC ("Bad cursor position %d, %d\n" , + new_plane_state->crtc_x, new_plane_state->crtc_y); +return -EINVAL ; + } +return 0 ; + } needs_reset =should_reset_plane (state, plane, old_plane_state, new_plane_state);
Greg Kroah-Hartman
maintainerPATCH 119/147 powerpc/32s: Fix build failure with CONFIG_PPC_KUAP_DEBUG
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
commit 4833ce06e6855d526234618b746ffb71d6612c9a upstream.
gpr2 is not a parametre of kuap_check(), it doesn't exist.
Use gpr instead.
--- arch/powerpc/include/asm/book3s/32/kup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/include/asm/book3s/32/kup.h +1 -1
@@ -75,7 +75,7 @@ .macro kuap_check current, gpr#ifdef CONFIG_PPC_KUAP_DEBUG - lwz \gpr2, KUAP(thread) + lwz \gpr, KUAP(thread) 999: twnei \gpr, 0 EMIT_BUG_ENTRY 999b, __FILE__, __LINE__, (BUGFLAG_WARNING | BUGFLAG_ONCE)#endif
Greg Kroah-Hartman
maintainerPATCH 120/147 cifs: fix leaked reference on requeued write
In reply to Greg Kroah-HartmanFrom: Adam McCoy <[email protected]>
commit a48137996063d22ffba77e077425f49873856ca5 upstream.
Failed async writes that are requeued may not clean up a refcount on the file, which can result in a leaked open. This scenario arises very reliably when using persistent handles and a reconnect occurs while writing.
cifs_writev_requeue only releases the reference if the write fails (rc != 0). The server->ops->async_writev operation will take its own reference, so the initial reference can always be released.
--- fs/cifs/cifssmb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/cifs/cifssmb.c +1 -1
@@ -2135,8 +2135,8 @@ cifs_writev_requeue(struct cifs_writedat } } +kref_put (&wdata2->refcount, cifs_writedata_release);if (rc) { -kref_put (&wdata2->refcount, cifs_writedata_release);if (is_retryable_error (rc))continue ; i += nr_pages;
Greg Kroah-Hartman
maintainerPATCH 121/147 x86: Fix early boot crash on gcc-10, third try
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
commit a9a3ed1eff3601b63aea4fb462d8b3b92c7c1e7e upstream.
... or the odyssey of trying to disable the stack protector for the function which generates the stack canary value.
The whole story started with Sergei reporting a boot crash with a kernel built with gcc-10:
Kernel panic — not syncing: stack-protector: Kernel stack is corrupted in: start_secondary
CPU: 1 PID: 0 Comm: swapper/1 Not tainted 5.6.0-rc5—00235—gfffb08b37df9 #139
Hardware name: Gigabyte Technology Co., Ltd. To be filled by O.E.M./H77M—D3H, BIOS F12 11/14/2013
Call Trace:
dump_stack
panic
? start_secondary
__stack_chk_fail
start_secondary
secondary_startup_64
-—-[ end Kernel panic — not syncing: stack—protector: Kernel stack is corrupted in: start_secondaryThis happens because gcc-10 tail-call optimizes the last function call in start_secondary() - cpu_startup_entry() - and thus emits a stack canary check which fails because the canary value changes after the boot_init_stack_canary() call.
To fix that, the initial attempt was to mark the one function which generates the stack canary with:
__attribute__((optimize("-fno-stack-protector"))) ... start_secondary(void *unused)
however, using the optimize attribute doesn't work cumulatively as the attribute does not add to but rather replaces previously supplied optimization options - roughly all -fxxx options.
The key one among them being -fno-omit-frame-pointer and thus leading to not present frame pointer - frame pointer which the kernel needs.
The next attempt to prevent compilers from tail-call optimizing the last function call cpu_startup_entry(), shy of carving out start_secondary() into a separate compilation unit and building it with -fno-stack-protector, was to add an empty asm("").
This current solution was short and sweet, and reportedly, is supported by both compilers but we didn't get very far this time: future (LTO?) optimization passes could potentially eliminate this, which leads us to the third attempt: having an actual memory barrier there which the compiler cannot ignore or move around etc.
That should hold for a long time, but hey we said that about the other two solutions too so...
--- arch/x86/include/asm/stackprotector.h | 7 ++++++- arch/x86/kernel/smpboot.c | 8 ++++++++ arch/x86/xen/smp_pv.c | 1 + include/linux/compiler.h | 6 ++++++ init/main.c | 2 ++ 5 files changed, 23 insertions(+), 1 deletion(-)
arch/x86/include/asm/stackprotector.h +6 -1
@@ -55,8 +55,13 @@/* * Initialize the stackprotector canary value. * -* NOTE: this must only be called from functions that never return, +* NOTE: this must only be called from functions that never return * and it must always be inlined. +* +* In addition, it should be called from a compilation unit for which +* stack protector is disabled. Alternatively, the caller should not end +* with a function call which gets tail-call optimized as that would +* lead to checking a modified canary value. */ static __always_inline void boot_init_stack_canary(void) {
arch/x86/kernel/smpboot.c +8 -0
@@ -262,6 +262,14 @@ static void notrace start_secondary(voidwmb ();cpu_startup_entry (CPUHP_AP_ONLINE_IDLE ); + +/* +* Prevent tail call to cpu_startup_entry() because the stack protector +* guard has been changed a couple of function calls up, in +* boot_init_stack_canary() and must not be checked before tail calling +* another function. +*/ +prevent_tail_call_optimization (); }/**
arch/x86/xen/smp_pv.c +1 -0
@@ -92,6 +92,7 @@ asmlinkage __visible void cpu_bringup_ancpu_bringup ();boot_init_stack_canary ();cpu_startup_entry (CPUHP_AP_ONLINE_IDLE ); +prevent_tail_call_optimization (); }void xen_smp_intr_free_pv (unsigned int cpu)
include/linux/compiler.h +6 -0
@@ -356,4 +356,10 @@ static inline void *offset_to_ptr(const/* &a[0] degrades to a pointer: a different type from an array */ #define __must_be_array (a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) +/* +* This is needed in functions which generate the stack canary, see +* arch/x86/kernel/smpboot.c::start_secondary() for an example. +*/ +#define prevent_tail_call_optimization () mb() +#endif /* __LINUX_COMPILER_H */
init/main.c +2 -0
@@ -782,6 +782,8 @@ asmlinkage __visible void __init start_k/* Do the rest non-__init'ed, we're now alive */ arch_call_rest_init (); + +prevent_tail_call_optimization (); }/* Call all constructor functions linked into the kernel. */
Greg Kroah-Hartman
maintainerPATCH 122/147 x86/unwind/orc: Fix error handling in __unwind_start()
In reply to Greg Kroah-HartmanFrom: Josh Poimboeuf <[email protected]>
commit 71c95825289f585014fe9741b051d32a7a916680 upstream.
The unwind_state 'error' field is used to inform the reliable unwinding code that the stack trace can't be trusted. Set this field for all errors in __unwind_start().
Also, move the zeroing out of the unwind_state struct to before the ORC table initialization check, to prevent the caller from reading uninitialized data if the ORC table is corrupted.
--- arch/x86/kernel/unwind_orc.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
arch/x86/kernel/unwind_orc.c +9 -7
@@ -608,23 +608,23 @@ EXPORT_SYMBOL_GPL(unwind_next_frame);void __unwind_start (struct unwind_state *state,struct task_struct *task,struct pt_regs *regs,unsigned long *first_frame) { -if (!orc_init) - goto done; -memset (state,0 ,sizeof (*state)); state->task = task; +if (!orc_init) + goto err; +/* * Refuse to unwind the stack of a task while it's executing on another * CPU. This check is racy, but that's ok: the unwinder has other * checks to prevent it from going off the rails. */ if (task_on_another_cpu (task)) - goto done; + goto err;if (regs) {if (user_mode (regs)) - goto done; + goto the_end; state->ip = regs->ip; state->sp = regs->sp;
@@ -657,6 +657,7 @@ void __unwind_start(struct unwind_state* generate some kind of backtrace if this happens. */ void *next_page = (void *)PAGE_ALIGN ((unsigned long )state->sp); + state->error = true;if (get_stack_info (next_page, state->task, &state->stack_info, &state->stack_mask))return ;
@@ -682,8 +683,9 @@ void __unwind_start(struct unwind_statereturn ; -done: +err: + state->error = true; +the_end: state->stack_info.type =STACK_TYPE_UNKNOWN ; -return ; }EXPORT_SYMBOL_GPL (__unwind_start);
Greg Kroah-Hartman
maintainerPATCH 123/147 exec: Move would_dump into flush_old_exec
In reply to Greg Kroah-HartmanFrom: Eric W. Biederman <[email protected]>
commit f87d1c9559164294040e58f5e3b74a162bf7c6e8 upstream.
I goofed when I added mm->user_ns support to would_dump. I missed the fact that in the case of binfmt_loader, binfmt_em86, binfmt_misc, and binfmt_script bprm->file is reassigned. Which made the move of would_dump from setup_new_exec to __do_execve_file before exec_binprm incorrect as it can result in would_dump running on the script instead of the interpreter of the script.
The net result is that the code stopped making unreadable interpreters undumpable. Which allows them to be ptraced and written to disk without special permissions. Oops.
The move was necessary because the call in set_new_exec was after bprm->mm was no longer valid.
To correct this mistake move the misplaced would_dump from __do_execve_file into flos_old_exec, before exec_mmap is called.
I tested and confirmed that without this fix I can attach with gdb to a script with an unreadable interpreter, and with this fix I can not.
--- fs/exec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/exec.c +2 -2
@@ -1274,6 +1274,8 @@ int flush_old_exec(struct linux_binprm **/ set_mm_exe_file (bprm->mm, bprm->file); +would_dump (bprm, bprm->file); +/* * Release all of the old mmap stuff */
@@ -1817,8 +1819,6 @@ static int __do_execve_file(int fd, struif (retval <0 ) goto out; -would_dump (bprm, bprm->file); - retval =exec_binprm (bprm);if (retval <0 ) goto out;
Greg Kroah-Hartman
maintainerPATCH 124/147 clk: rockchip: fix incorrect configuration of rk3228 aclk_gpu* clocks
In reply to Greg Kroah-HartmanFrom: Justin Swartz <[email protected]>
commit cec9d101d70a3509da9bd2e601e0b242154ce616 upstream.
The following changes prevent the unrecoverable freezes and rcu_sched stall warnings experienced in each of my attempts to take advantage of lima.
Replace the COMPOSITE_NOGATE definition of aclk_gpu_pre with a COMPOSITE that retains the selection of HDMIPHY as the PLL source, but instead makes uses of the aclk_gpu PLL source gate and parent names defined by mux_pll_src_4plls_p rather than mux_aclk_gpu_pre_p.
Remove the now unused mux_aclk_gpu_pre_p and the four named but also unused definitions (cpll_gpu, gpll_gpu, hdmiphy_gpu and usb480m_gpu) of the aclk_gpu PLL source gate.
Use the correct gate offset for aclk_gpu and aclk_gpu_noc.
--- drivers/clk/rockchip/clk-rk3228.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-)
drivers/clk/rockchip/clk-rk3228.c +4 -13
@@ -156,8 +156,6 @@ PNAME(mux_i2s_out_p) = { "i2s1_pre", "xPNAME (mux_i2s2_p) = {"i2s2_src" ,"i2s2_frac" ,"xin12m" };PNAME (mux_sclk_spdif_p) = {"sclk_spdif_src" ,"spdif_frac" ,"xin12m" }; -PNAME (mux_aclk_gpu_pre_p) = {"cpll_gpu" ,"gpll_gpu" ,"hdmiphy_gpu" ,"usb480m_gpu" }; -PNAME (mux_uart0_p) = {"uart0_src" ,"uart0_frac" ,"xin24m" };PNAME (mux_uart1_p) = {"uart1_src" ,"uart1_frac" ,"xin24m" };PNAME (mux_uart2_p) = {"uart2_src" ,"uart2_frac" ,"xin24m" };
@@ -468,16 +466,9 @@ static struct rockchip_clk_branch rk3228 RK2928_CLKSEL_CON(24), 6, 10, DFLAGS, RK2928_CLKGATE_CON(2), 8, GFLAGS), -GATE (0 ,"cpll_gpu" ,"cpll" ,0 , -RK2928_CLKGATE_CON (3 ),13 ,GFLAGS ), -GATE (0 ,"gpll_gpu" ,"gpll" ,0 , -RK2928_CLKGATE_CON (3 ),13 ,GFLAGS ), -GATE (0 ,"hdmiphy_gpu" ,"hdmiphy" ,0 , -RK2928_CLKGATE_CON (3 ),13 ,GFLAGS ), -GATE (0 ,"usb480m_gpu" ,"usb480m" ,0 , +COMPOSITE (0 ,"aclk_gpu_pre" , mux_pll_src_4plls_p,0 , +RK2928_CLKSEL_CON (34 ),5 ,2 ,MFLAGS ,0 ,5 ,DFLAGS ,RK2928_CLKGATE_CON (3 ),13 ,GFLAGS ), -COMPOSITE_NOGATE (0 ,"aclk_gpu_pre" , mux_aclk_gpu_pre_p,0 , -RK2928_CLKSEL_CON (34 ),5 ,2 ,MFLAGS ,0 ,5 ,DFLAGS ), COMPOSITE(SCLK_SPI0, "sclk_spi0", mux_pll_src_2plls_p, 0, RK2928_CLKSEL_CON(25), 8, 1, MFLAGS, 0, 7, DFLAGS,
@@ -582,8 +573,8 @@ static struct rockchip_clk_branch rk3228GATE (0 ,"pclk_peri_noc" ,"pclk_peri" ,CLK_IGNORE_UNUSED ,RK2928_CLKGATE_CON (12 ),2 ,GFLAGS ),/* PD_GPU */ -GATE (ACLK_GPU ,"aclk_gpu" ,"aclk_gpu_pre" ,0 ,RK2928_CLKGATE_CON (13 ),14 ,GFLAGS ), -GATE (0 ,"aclk_gpu_noc" ,"aclk_gpu_pre" ,0 ,RK2928_CLKGATE_CON (13 ),15 ,GFLAGS ), +GATE (ACLK_GPU ,"aclk_gpu" ,"aclk_gpu_pre" ,0 ,RK2928_CLKGATE_CON (7 ),14 ,GFLAGS ), +GATE (0 ,"aclk_gpu_noc" ,"aclk_gpu_pre" ,0 ,RK2928_CLKGATE_CON (7 ),15 ,GFLAGS ),/* PD_BUS */ GATE(0, "sclk_initmem_mbist", "aclk_cpu", 0, RK2928_CLKGATE_CON(8), 1, GFLAGS),
Greg Kroah-Hartman
maintainerPATCH 125/147 dwc3: Remove check for HWO flag in dwc3_gadget_ep_reclaim_trb_sg()
In reply to Greg Kroah-HartmanFrom: John Stultz <[email protected]>
commit 00e21763f2c8cab21b7befa52996d1b18bde5c42 upstream.
The check for the HWO flag in dwc3_gadget_ep_reclaim_trb_sg() causes us to break out of the loop before we call dwc3_gadget_ep_reclaim_completed_trb(), which is what likely should be clearing the HWO flag.
This can cause odd behavior where we never reclaim all the trbs in the sg list, so we never call giveback on a usb req, and that will causes transfer stalls.
This effectively resovles the adb stalls seen on HiKey960 after userland changes started only using AIO in adbd.
--- drivers/usb/dwc3/gadget.c | 3 --- 1 file changed, 3 deletions(-)
drivers/usb/dwc3/gadget.c +0 -3
@@ -2480,9 +2480,6 @@ static int dwc3_gadget_ep_reclaim_trb_sgfor_each_sg (sg, s, pending, i) { trb = &dep->trb_pool[dep->trb_dequeue]; -if (trb->ctrl &DWC3_TRB_CTRL_HWO ) -break ; - req->sg =sg_next (s); req->num_pending_sgs--;
Greg Kroah-Hartman
maintainerPATCH 126/147 fanotify: fix merging marks masks with FAN_ONDIR
In reply to Greg Kroah-HartmanFrom: Amir Goldstein <[email protected]>
commit 55bf882c7f13dda8bbe624040c6d5b4fbb812d16 upstream.
Change the logic of FAN_ONDIR in two ways that are similar to the logic of FAN_EVENT_ON_CHILD, that was fixed in commit 54a307ba8d3c ("fanotify:
fix logic of events on child"):
1. The flag is meaningless in ignore mask
2. The flag refers only to events in the mask of the mark where it is set
This is what the fanotify_mark.2 man page says about FAN_ONDIR:
"Without this flag, only events for files are created." It doesn't say anything about setting this flag in ignore mask to stop getting events on directories nor can I think of any setup where this capability would be useful.
Currently, when marks masks are merged, the FAN_ONDIR flag set in one mark affects the events that are set in another mark's mask and this behavior causes unexpected results. For example, a user adds a mark on a directory with mask FAN_ATTRIB | FAN_ONDIR and a mount mark with mask FAN_OPEN (without FAN_ONDIR). An opendir() of that directory (which is inside that mount) generates a FAN_OPEN event even though neither of the marks requested to get open events on directories.
--- fs/notify/fanotify/fanotify.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
fs/notify/fanotify/fanotify.c +7 -4
@@ -172,6 +172,13 @@ static u32 fanotify_group_event_mask(strcontinue ; mark = iter_info->marks[type];/* +* If the event is on dir and this mark doesn't care about +* events on dir, don't send it! +*/ +if (event_mask &FS_ISDIR && !(mark->mask &FS_ISDIR )) +continue ; + +/* * If the event is for a child and this mark doesn't care about * events on a child, don't send it! */
@@ -203,10 +210,6 @@ static u32 fanotify_group_event_mask(str user_mask &= ~FAN_ONDIR ; } -if (event_mask &FS_ISDIR && - !(marks_mask &FS_ISDIR & ~marks_ignored_mask)) -return 0 ; -return test_mask & user_mask; }
Greg Kroah-Hartman
maintainerPATCH 127/147 usb: gadget: net2272: Fix a memory leak in an error handling path in net2272_plat_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
commit ccaef7e6e354fb65758eaddd3eae8065a8b3e295 upstream.
'dev' is allocated in 'net2272_probe_init()'. It must be freed in the error handling path, as already done in the remove function (i.e. 'net2272_plat_remove()')
--- drivers/usb/gadget/udc/net2272.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/gadget/udc/net2272.c +2 -0
@@ -2647,6 +2647,8 @@ net2272_plat_probe(struct platform_devic err_req:release_mem_region (base, len); err: +kfree (dev); +return ret; }
Greg Kroah-Hartman
maintainerPATCH 128/147 usb: gadget: audio: Fix a missing error return value in audio_bind()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
commit 19b94c1f9c9a16d41a8de3ccbdb8536cf1aecdbf upstream.
If 'usb_otg_descriptor_alloc()' fails, we must return an error code, not 0.
--- drivers/usb/gadget/legacy/audio.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/gadget/legacy/audio.c +3 -1
@@ -300,8 +300,10 @@ static int audio_bind(struct usb_composistruct usb_descriptor_header *usb_desc; usb_desc =usb_otg_descriptor_alloc (cdev->gadget); -if (!usb_desc) +if (!usb_desc) { + status = -ENOMEM ; goto fail; + }usb_otg_descriptor_init (cdev->gadget, usb_desc); otg_desc[0 ] = usb_desc; otg_desc[1 ] =NULL ;
Greg Kroah-Hartman
maintainerPATCH 129/147 usb: gadget: legacy: fix error return code in gncm_bind()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
commit e27d4b30b71c66986196d8a1eb93cba9f602904a upstream.
If 'usb_otg_descriptor_alloc()' fails, we must return a negative error code -ENOMEM, not 0.
--- drivers/usb/gadget/legacy/ncm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/gadget/legacy/ncm.c +3 -1
@@ -156,8 +156,10 @@ static int gncm_bind(struct usb_compositstruct usb_descriptor_header *usb_desc; usb_desc =usb_otg_descriptor_alloc (gadget); -if (!usb_desc) +if (!usb_desc) { + status = -ENOMEM ; goto fail; + }usb_otg_descriptor_init (gadget, usb_desc); otg_desc[0 ] = usb_desc; otg_desc[1 ] =NULL ;
Greg Kroah-Hartman
maintainerPATCH 130/147 usb: gadget: legacy: fix error return code in cdc_bind()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
commit e8f7f9e3499a6d96f7f63a4818dc7d0f45a7783b upstream.
If 'usb_otg_descriptor_alloc()' fails, we must return a negative error code -ENOMEM, not 0.
--- drivers/usb/gadget/legacy/cdc2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/gadget/legacy/cdc2.c +3 -1
@@ -179,8 +179,10 @@ static int cdc_bind(struct usb_compositestruct usb_descriptor_header *usb_desc; usb_desc =usb_otg_descriptor_alloc (gadget); -if (!usb_desc) +if (!usb_desc) { + status = -ENOMEM ; goto fail1; + }usb_otg_descriptor_init (gadget, usb_desc); otg_desc[0 ] = usb_desc; otg_desc[1 ] =NULL ;
Greg Kroah-Hartman
maintainerPATCH 131/147 Revert "ALSA: hda/realtek: Fix pop noise on ALC225"
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
commit f41224efcf8aafe80ea47ac870c5e32f3209ffc8 upstream.
This reverts commit 3b36b13d5e69d6f51ff1c55d1b404a74646c9757.
Enable power save node breaks some systems with ACL225. Revert the patch and use a platform specific quirk for the original issue isntead.
--- sound/pci/hda/patch_realtek.c | 2 -- 1 file changed, 2 deletions(-)
sound/pci/hda/patch_realtek.c +0 -2
@@ -8150,8 +8150,6 @@ static int patch_alc269(struct hda_codec spec->gen.mixer_nid =0 ;break ;case 0x10ec0225 : - codec->power_save_node =1 ; -/* fall through */ case 0x10ec0295 :case 0x10ec0299 : spec->codec_variant =ALC269_TYPE_ALC225 ;
Greg Kroah-Hartman
maintainerPATCH 132/147 clk: Unlink clock if failed to prepare or enable
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit 018d4671b9bbd4a5c55cf6eab3e1dbc70a50b66e upstream.
On failing to prepare or enable a clock, remove the core structure from the list it has been inserted as it is about to be freed.
This otherwise leads to random crashes when subsequent clocks get registered, during which parsing of the clock tree becomes adventurous.
Observed with QEMU's RPi-3 emulation.
--- drivers/clk/clk.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/clk/clk.c +3 -0
@@ -3448,6 +3448,9 @@ static int __clk_core_init(struct clk_co out:clk_pm_runtime_put (core); unlock: +if (ret) +hlist_del_init (&core->child_node); +clk_prepare_unlock ();if (!ret)
Greg Kroah-Hartman
maintainerPATCH 133/147 arm64: dts: meson-g12b-khadas-vim3: add missing frddr_a status property
In reply to Greg Kroah-HartmanFrom: Neil Armstrong <[email protected]>
commit 5ac0869fb39b1c1ba84d4d75c550f82e0bf44c96 upstream.
In the process of moving the VIM3 audio nodes to a G12B specific dtsi for enabling the SM1 based VIM3L, the frddr_a status = "okay" property got dropped.
This re-enables the frddr_a node to fix audio support.
--- arch/arm64/boot/dts/amlogic/meson-g12b-khadas-vim3.dtsi | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm64/boot/dts/amlogic/meson-g12b-khadas-vim3.dtsi +4 -0
@@ -152,6 +152,10 @@ clock-latency = <50000>; }; +&frddr_a { + status = "okay"; +}; + &frddr_b { status = "okay"; };
Greg Kroah-Hartman
maintainerPATCH 134/147 arm64: dts: meson-g12-common: fix dwc2 clock names
In reply to Greg Kroah-HartmanFrom: Neil Armstrong <[email protected]>
commit e4f634d812634067b0c661af2e3cecfd629c89b8 upstream.
Use the correct dwc2 clock name.
--- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +1 -1
@@ -2365,7 +2365,7 @@ reg = <0x0 0xff400000 0x0 0x40000>; interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clkc CLKID_USB1_DDR_BRIDGE>; - clock-names = "ddr"; + clock-names = "otg"; phys = <&usb2_phy1>; phy-names = "usb2-phy"; dr_mode = "peripheral";
Greg Kroah-Hartman
maintainerPATCH 135/147 arm64: dts: rockchip: Replace RK805 PMIC node name with "pmic" on rk3328 boards
In reply to Greg Kroah-HartmanFrom: Chen-Yu Tsai <[email protected]>
commit 83b994129fb4c18a8460fd395864a28740e5e7fb upstream.
In some board device tree files, "rk805" was used for the RK805 PMIC's node name. However the policy for device trees is that generic names should be used.
Replace the "rk805" node name with the generic "pmic" name.
--- arch/arm64/boot/dts/rockchip/rk3328-evb.dts | 2 +- arch/arm64/boot/dts/rockchip/rk3328-rock64.dts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/rockchip/rk3328-evb.dts +1 -1
@@ -92,7 +92,7 @@ &i2c1 { status = "okay"; - rk805: rk805@18 { + rk805: pmic@18 { compatible = "rockchip,rk805"; reg = <0x18>; interrupt-parent = <&gpio2>;
arch/arm64/boot/dts/rockchip/rk3328-rock64.dts +1 -1
@@ -169,7 +169,7 @@ &i2c1 { status = "okay"; - rk805: rk805@18 { + rk805: pmic@18 { compatible = "rockchip,rk805"; reg = <0x18>; interrupt-parent = <&gpio2>;
Greg Kroah-Hartman
maintainerPATCH 136/147 arm64: dts: rockchip: Rename dwc3 device nodes on rk3399 to make dtc happy
In reply to Greg Kroah-HartmanFrom: Chen-Yu Tsai <[email protected]>
commit 190c7f6fd43a776d4a6da1dac44408104649e9b7 upstream.
The device tree compiler complains that the dwc3 nodes have regs properties but no matching unit addresses.
Add the unit addresses to the device node name. While at it, also rename the nodes from "dwc3" to "usb", as guidelines require device nodes have generic names.
--- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/rockchip/rk3399.dtsi +2 -2
@@ -410,7 +410,7 @@ reset-names = "usb3-otg"; status = "disabled"; - usbdrd_dwc3_0: dwc3 { + usbdrd_dwc3_0: usb@fe800000 { compatible = "snps,dwc3"; reg = <0x0 0xfe800000 0x0 0x100000>; interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH 0>;
@@ -446,7 +446,7 @@ reset-names = "usb3-otg"; status = "disabled"; - usbdrd_dwc3_1: dwc3 { + usbdrd_dwc3_1: usb@fe900000 { compatible = "snps,dwc3"; reg = <0x0 0xfe900000 0x0 0x100000>; interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH 0>;
Greg Kroah-Hartman
maintainerPATCH 137/147 arm64: dts: imx8mn: Change SDMA1 ahb clock for imx8mn
In reply to Greg Kroah-HartmanFrom: Adam Ford <[email protected]>
commit 15ddc3e17aec0de4c69d595b873e184432b9791d upstream.
Using SDMA1 with UART1 is causing a "Timeout waiting for CH0" error. This patch changes to ahb clock from SDMA1_ROOT to AHB which fixes the timeout error.
--- arch/arm64/boot/dts/freescale/imx8mn.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mn.dtsi +1 -1
@@ -616,7 +616,7 @@ reg = <0x30bd0000 0x10000>; interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clk IMX8MN_CLK_SDMA1_ROOT>, - <&clk IMX8MN_CLK_SDMA1_ROOT>; + <&clk IMX8MN_CLK_AHB>; clock-names = "ipg", "ahb"; #dma-cells = <3>; fsl,sdma-ram-script-name = "imx/sdma/sdma-imx7d.bin";
Greg Kroah-Hartman
maintainerPATCH 138/147 ARM: dts: r8a73a4: Add missing CMT1 interrupts
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
commit 0f739fdfe9e5ce668bd6d3210f310df282321837 upstream.
The R-Mobile APE6 Compare Match Timer 1 generates 8 interrupts, one for each channel, but currently only 1 is described.
Fix this by adding the missing interrupts.
--- arch/arm/boot/dts/r8a73a4.dtsi | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
arch/arm/boot/dts/r8a73a4.dtsi +8 -1
@@ -131,7 +131,14 @@ cmt1: timer@e6130000 { compatible = "renesas,r8a73a4-cmt1", "renesas,rcar-gen2-cmt1"; reg = <0 0xe6130000 0 0x1004>; - interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>; + interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>; clocks = <&mstp3_clks R8A73A4_CLK_CMT1>; clock-names = "fck"; power-domains = <&pd_c5>;
Greg Kroah-Hartman
maintainerPATCH 139/147 arm64: dts: renesas: r8a77980: Fix IPMMU VIP[01] nodes
In reply to Greg Kroah-HartmanFrom: Yoshihiro Shimoda <[email protected]>
commit f4d71c6ea9e58c07dd4d02d09c5dd9bb780ec4b1 upstream.
Missing the renesas,ipmmu-main property on ipmmu_vip[01] nodes.
--- arch/arm64/boot/dts/renesas/r8a77980.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/renesas/r8a77980.dtsi +2 -0
@@ -1318,6 +1318,7 @@ ipmmu_vip0: mmu@e7b00000 { compatible = "renesas,ipmmu-r8a77980"; reg = <0 0xe7b00000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 4>; power-domains = <&sysc R8A77980_PD_ALWAYS_ON>; #iommu-cells = <1>; };
@@ -1325,6 +1326,7 @@ ipmmu_vip1: mmu@e7960000 { compatible = "renesas,ipmmu-r8a77980"; reg = <0 0xe7960000 0 0x1000>; + renesas,ipmmu-main = <&ipmmu_mm 11>; power-domains = <&sysc R8A77980_PD_ALWAYS_ON>; #iommu-cells = <1>; };
Greg Kroah-Hartman
maintainerPATCH 140/147 ARM: dts: r8a7740: Add missing extal2 to CPG node
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
commit e47cb97f153193d4b41ca8d48127da14513d54c7 upstream.
The Clock Pulse Generator (CPG) device node lacks the extal2 clock. This may lead to a failure registering the "r" clock, or to a wrong parent for the "usb24s" clock, depending on MD_CK2 pin configuration and boot loader CPG_USBCKCR register configuration.
This went unnoticed, as this does not affect the single upstream board configuration, which relies on the first clock input only.
--- arch/arm/boot/dts/r8a7740.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/r8a7740.dtsi +1 -1
@@ -479,7 +479,7 @@ cpg_clocks: cpg_clocks@e6150000 { compatible = "renesas,r8a7740-cpg-clocks"; reg = <0xe6150000 0x10000>; - clocks = <&extal1_clk>, <&extalr_clk>; + clocks = <&extal1_clk>, <&extal2_clk>, <&extalr_clk>; #clock-cells = <1>; clock-output-names = "system", "pllc0", "pllc1", "pllc2", "r",
Greg Kroah-Hartman
maintainerPATCH 141/147 SUNRPC: Revert 241b1f419f0e ("SUNRPC: Remove xdr_buf_trim()")
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
commit 0a8e7b7d08466b5fc52f8e96070acc116d82a8bb upstream.
I've noticed that when krb5i or krb5p security is in use, retransmitted requests are missing the server's duplicate reply cache. The computed checksum on the retransmitted request does not match the cached checksum, resulting in the server performing the retransmitted request again instead of returning the cached reply.
The assumptions made when removing xdr_buf_trim() were not correct. In the send paths, the upper layer has already set the segment lengths correctly, and shorting the buffer's content is simply a matter of reducing buf->len.
xdr_buf_trim() is the right answer in the receive/unwrap path on both the client and the server. The buffer segment lengths have to be shortened one-by-one.
On the server side in particular, head.iov_len needs to be updated correctly to enable nfsd_cache_csum() to work correctly. The simple buf->len computation doesn't do that, and that results in checksumming stale data in the buffer.
The problem isn't noticed until there's significant instability of the RPC transport. At that point, the reliability of retransmit detection on the server becomes crucial.
--- include/linux/sunrpc/xdr.h | 1 net/sunrpc/auth_gss/gss_krb5_wrap.c | 7 ++---- net/sunrpc/auth_gss/svcauth_gss.c | 2 - net/sunrpc/xdr.c | 41 ++++++++++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 5 deletions(-)
include/linux/sunrpc/xdr.h +1 -0
@@ -186,6 +186,7 @@ xdr_adjust_iovec(struct kvec *iov, __be3extern void xdr_shift_buf (struct xdr_buf *,size_t );extern void xdr_buf_from_iov (struct kvec *,struct xdr_buf *);extern int xdr_buf_subsegment (struct xdr_buf *,struct xdr_buf *,unsigned int ,unsigned int ); +extern void xdr_buf_trim (struct xdr_buf *,unsigned int );extern int xdr_buf_read_mic (struct xdr_buf *,struct xdr_netobj *,unsigned int );extern int read_bytes_from_xdr_buf (struct xdr_buf *,unsigned int ,void *,unsigned int );extern int write_bytes_to_xdr_buf (struct xdr_buf *,unsigned int ,void *,unsigned int );
net/sunrpc/auth_gss/gss_krb5_wrap.c +3 -4
@@ -580,15 +580,14 @@ gss_unwrap_kerberos_v2(struct krb5_ctx **/ movelen = min_t(unsigned int, buf->head[0].iov_len, len); movelen -= offset +GSS_KRB5_TOK_HDR_LEN + headskip; -if (offset +GSS_KRB5_TOK_HDR_LEN + headskip + movelen > - buf->head[0 ].iov_len) -return GSS_S_FAILURE ; +BUG_ON (offset +GSS_KRB5_TOK_HDR_LEN + headskip + movelen > + buf->head[0 ].iov_len);memmove (ptr, ptr +GSS_KRB5_TOK_HDR_LEN + headskip, movelen); buf->head[0 ].iov_len -=GSS_KRB5_TOK_HDR_LEN + headskip; buf->len = len -GSS_KRB5_TOK_HDR_LEN + headskip;/* Trim off the trailing "extra count" and checksum blob */ - buf->len -= ec +GSS_KRB5_TOK_HDR_LEN + tailskip; +xdr_buf_trim (buf, ec +GSS_KRB5_TOK_HDR_LEN + tailskip); *align =XDR_QUADLEN (GSS_KRB5_TOK_HDR_LEN + headskip); *slack = *align +XDR_QUADLEN (ec +GSS_KRB5_TOK_HDR_LEN + tailskip);
net/sunrpc/auth_gss/svcauth_gss.c +1 -1
@@ -897,7 +897,7 @@ unwrap_integ_data(struct svc_rqst *rqstpif (svc_getnl (&buf->head[0 ]) != seq) goto out;/* trim off the mic and padding at the end before returning */ - buf->len -=4 +round_up_to_quad (mic.len); +xdr_buf_trim (buf,round_up_to_quad (mic.len) +4 ); stat =0 ; out:kfree (mic.data);
net/sunrpc/xdr.c +41 -0
47 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 142/147 bpf: Fix sk_psock refcnt leak when receiving message
In reply to Greg Kroah-HartmanFrom: Xiyu Yang <[email protected]>
commit 18f02ad19e2c2a1d9e1d55a4e1c0cbf51419151c upstream.
tcp_bpf_recvmsg() invokes sk_psock_get(), which returns a reference of the specified sk_psock object to "psock" with increased refcnt.
When tcp_bpf_recvmsg() returns, local variable "psock" becomes invalid, so the refcount should be decreased to keep refcount balanced.
The reference counting issue happens in several exception handling paths of tcp_bpf_recvmsg(). When those error scenarios occur such as "flags" includes MSG_ERRQUEUE, the function forgets to decrease the refcnt increased by sk_psock_get(), causing a refcnt leak.
Fix this issue by calling sk_psock_put() or pulling up the error queue read handling when those error scenarios occur.
--- net/ipv4/tcp_bpf.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
net/ipv4/tcp_bpf.c +6 -3
@@ -121,14 +121,17 @@ int tcp_bpf_recvmsg(struct sock *sk, strstruct sk_psock *psock;int copied, ret; +if (unlikely (flags &MSG_ERRQUEUE )) +return inet_recv_error (sk, msg, len, addr_len); + psock =sk_psock_get (sk);if (unlikely (!psock))return tcp_recvmsg (sk, msg, len, nonblock, flags, addr_len); -if (unlikely (flags &MSG_ERRQUEUE )) -return inet_recv_error (sk, msg, len, addr_len);if (!skb_queue_empty (&sk->sk_receive_queue) && -sk_psock_queue_empty (psock)) +sk_psock_queue_empty (psock)) { +sk_psock_put (sk, psock);return tcp_recvmsg (sk, msg, len, nonblock, flags, addr_len); + }lock_sock (sk); msg_bytes_ready: copied =__tcp_bpf_recvmsg (sk, psock, msg, len, flags);
Greg Kroah-Hartman
maintainerPATCH 143/147 KVM: x86: Fix off-by-one error in kvm_vcpu_ioctl_x86_setup_mce
In reply to Greg Kroah-HartmanFrom: Jim Mattson <[email protected]>
commit c4e0e4ab4cf3ec2b3f0b628ead108d677644ebd9 upstream.
Bank_num is a one-based count of banks, not a zero-based index. It overflows the allocated space only when strictly greater than KVM_MAX_MCE_BANKS.
Message-Id: <[email protected]>
--- arch/x86/kvm/x86.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/x86.c +1 -1
@@ -3682,7 +3682,7 @@ static int kvm_vcpu_ioctl_x86_setup_mce(unsigned bank_num = mcg_cap &0xff , bank; r = -EINVAL ; -if (!bank_num || bank_num >=KVM_MAX_MCE_BANKS ) +if (!bank_num || bank_num >KVM_MAX_MCE_BANKS ) goto out;if (mcg_cap & ~(kvm_mce_cap_supported |0xff |0xff0000 )) goto out;
Greg Kroah-Hartman
maintainerPATCH 144/147 Makefile: disallow data races on gcc-10 as well
In reply to Greg Kroah-HartmanFrom: Sergei Trofimovich <[email protected]>
commit b1112139a103b4b1101d0d2d72931f2d33d8c978 upstream.
gcc-10 will rename --param=allow-store-data-races=0 to -fno-allow-store-data-races.
The flag change happened at https://gcc.gnu.org/PR92046.
--- Makefile | 1 + 1 file changed, 1 insertion(+)
Makefile +1 -0
@@ -709,6 +709,7 @@ endif # Tell gcc to never replace conditional load with a non-conditional one KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0) +KBUILD_CFLAGS += $(call cc-option,-fno-allow-store-data-races) include scripts/Makefile.kcov include scripts/Makefile.gcc-plugins
Greg Kroah-Hartman
maintainerPATCH 145/147 libbpf: Extract and generalize CPU mask parsing logic
In reply to Greg Kroah-HartmanFrom: Andrii Nakryiko <[email protected]>
commit 6803ee25f0ead1e836808acb14396bb9a9849113 upstream.
This logic is re-used for parsing a set of online CPUs. Having it as an isolated piece of code working with input string makes it conveninent to test this logic as well. While refactoring, also improve the robustness of original implementation.
--- tools/lib/bpf/libbpf.c | 128 ++++++++++++++++++++++++++-------------- tools/lib/bpf/libbpf_internal.h | 2 2 files changed, 87 insertions(+), 43 deletions(-)
tools/lib/bpf/libbpf.c +85 -43
@@ -5905,62 +5905,104 @@ void bpf_program__bpil_offs_to_addr(stru } } -int libbpf_num_possible_cpus (void ) +int parse_cpu_mask_str (const char *s,bool **mask,int *mask_sz) { -static const char *fcpu ="/sys/devices/system/cpu/possible" ; -int len =0 , n =0 , il =0 , ir =0 ; -unsigned int start =0 , end =0 ; -int tmp_cpus =0 ; -static int cpus; -char buf[128 ]; -int error =0 ; -int fd =-1 ; +int err =0 , n, len, start, end =-1 ; +bool *tmp; - tmp_cpus =READ_ONCE (cpus); -if (tmp_cpus >0 ) -return tmp_cpus; + *mask =NULL ; + *mask_sz =0 ; + +/* Each sub string separated by ',' has format \d+-\d+ or \d+ */ +while (*s) { +if (*s ==',' || *s =='\n' ) { + s++; +continue ; + } + n =sscanf (s,"%d%n-%d%n" , &start, &len, &end, &len); +if (n <=0 || n >2 ) { +pr_warning ("Failed to get CPU range %s: %d\n" , s, n); + err = -EINVAL ; + goto cleanup; + }else if (n ==1 ) { + end = start; + } +if (start <0 || start > end) { +pr_warning ("Invalid CPU range [%d,%d] in %s\n" , + start, end, s); + err = -EINVAL ; + goto cleanup; + } + tmp =realloc (*mask, end +1 ); +if (!tmp) { + err = -ENOMEM ; + goto cleanup; + } + *mask = tmp; +memset (tmp + *mask_sz,0 , start - *mask_sz); +memset (tmp + start,1 , end - start +1 ); + *mask_sz = end +1 ; + s += len; + } +if (!*mask_sz) { +pr_warning ("Empty CPU range\n" ); +return -EINVAL ; + } +return 0 ; +cleanup: +free (*mask); + *mask =NULL ; +return err; +} + +int parse_cpu_mask_file (const char *fcpu,bool **mask,int *mask_sz) +{ +int fd, err =0 , len; +char buf[128 ]; fd =open (fcpu,O_RDONLY );if (fd <0 ) { - error = errno; -pr_warning ("Failed to open file %s: %s\n" , - fcpu,strerror (error)); -return -error; + err = -errno; +pr_warning ("Failed to open cpu mask file %s: %d\n" , fcpu, err); +return err; } len =read (fd, buf,sizeof (buf));close (fd);if (len <=0 ) { - error = len ? errno :EINVAL ; -pr_warning ("Failed to read # of possible cpus from %s: %s\n" , - fcpu,strerror (error)); -return -error; - } -if (len ==sizeof (buf)) { -pr_warning ("File %s size overflow\n" , fcpu); -return -EOVERFLOW ; + err = len ? -errno : -EINVAL ; +pr_warning ("Failed to read cpu mask from %s: %d\n" , fcpu, err); +return err; + } +if (len >=sizeof (buf)) { +pr_warning ("CPU mask is too big in file %s\n" , fcpu); +return -E2BIG ; } buf[len] ='\0' ; -for (ir =0 , tmp_cpus =0 ; ir <= len; ir++) { -/* Each sub string separated by ',' has format \d+-\d+ or \d+ */ -if (buf[ir] ==',' || buf[ir] =='\0' ) { - buf[ir] ='\0' ; - n =sscanf (&buf[il],"%u-%u" , &start, &end); -if (n <=0 ) { -pr_warning ("Failed to get # CPUs from %s\n" , - &buf[il]); -return -EINVAL ; - }else if (n ==1 ) { - end = start; - } - tmp_cpus += end - start +1 ; - il = ir +1 ; - } - } -if (tmp_cpus <=0 ) { -pr_warning ("Invalid #CPUs %d from %s\n" , tmp_cpus, fcpu); -return -EINVAL ; +return parse_cpu_mask_str (buf, mask, mask_sz); +} + +int libbpf_num_possible_cpus (void ) +{ +static const char *fcpu ="/sys/devices/system/cpu/possible" ; +static int cpus; +int err, n, i, tmp_cpus; +bool *mask; + + tmp_cpus =READ_ONCE (cpus); +if (tmp_cpus >0 ) +return tmp_cpus; + + err =parse_cpu_mask_file (fcpu, &mask, &n); +if (err) +return err; + + tmp_cpus =0 ; +for (i =0 ; i < n; i++) { +if (mask[i]) + tmp_cpus++; } +free (mask);WRITE_ONCE (cpus, tmp_cpus);return tmp_cpus;
tools/lib/bpf/libbpf_internal.h +2 -0
@@ -63,6 +63,8 @@ do { \#define pr_info (fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__)#define pr_debug (fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__) +int parse_cpu_mask_str (const char *s,bool **mask,int *mask_sz); +int parse_cpu_mask_file (const char *fcpu,bool **mask,int *mask_sz);int libbpf__load_raw_btf (const char *raw_types,size_t types_len,const char *str_sec,size_t str_len);
Greg Kroah-Hartman
maintainerPATCH 146/147 selftest/bpf: fix backported test_select_reuseport selftest changes
In reply to Greg Kroah-HartmanFrom: Andrii Nakryiko <[email protected]>
Fix up RET_IF as CHECK macro to make selftests compile again.
--- tools/testing/selftests/bpf/test_select_reuseport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/testing/selftests/bpf/test_select_reuseport.c +2 -2
@@ -668,12 +668,12 @@ static void cleanup_per_test(void)for (i =0 ; i <NR_RESULTS ; i++) { err =bpf_map_update_elem (result_map, &i, &zero,BPF_ANY ); -RET_IF (err,"reset elem in result_map" , +CHECK (err,"reset elem in result_map" ,"i:%u err:%d errno:%d\n" , i, err, errno); } err =bpf_map_update_elem (linum_map, &zero, &zero,BPF_ANY ); -RET_IF (err,"reset line number in linum_map" ,"err:%d errno:%d\n" , +CHECK (err,"reset line number in linum_map" ,"err:%d errno:%d\n" , err, errno);for (i =0 ; i <REUSEPORT_ARRAY_SIZE ; i++)
Greg Kroah-Hartman
maintainerPATCH 147/147 bpf: Test_progs, fix test_get_stack_rawtp_err.c build
In reply to Greg Kroah-HartmanFrom: Kamal Mostafa <[email protected]>
The linux-5.4.y commit 8781011a302b ("bpf: Test_progs, add test to catch retval refine error handling") fails to build when libbpf headers are not installed, as it tries to include <bpf/bpf_helpers.h>:
progs/test_get_stack_rawtp_err.c:4:10:
fatal error: 'bpf/bpf_helpers.h' file not found
For 5.4-stable (only) the new test prog needs to include "bpf_helpers.h" instead (like all the rest of progs/*.c do) because 5.4-stable does not carry commit e01a75c15969 ("libbpf: Move bpf_{helpers, helper_defs, endian, tracing}.h into libbpf").
--- tools/testing/selftests/bpf/progs/test_get_stack_rawtp_err.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/progs/test_get_stack_rawtp_err.c +1 -1
@@ -1,7 +1,7 @@// SPDX-License-Identifier: GPL-2.0 #include <linux/bpf.h> -#include <bpf/bpf_helpers.h> +#include "bpf_helpers.h" #define MAX_STACK_RAWTP 10
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.42 release. There are 147 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 20 May 2020 17:32:42 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.42-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
NOTE:
While running ftrace test on arm64 hikey device the following kernel warning triggered and long with this rcu_preempt self-detected stall on CPU also noticed.
Please find full test link below,
[ 1313.494714] WARNING: CPU: 0 PID: 458 at /usr/src/kernel/kernel/trace/ring_buffer.c:2477 rb_commit+0x2c0/0x320 <> [ 1313.770237] CPU: 0 PID: 458 Comm: avahi-daemon Not tainted 5.4.42-rc1 #1 [ 1313.855515] Hardware name: HiKey Development Board (DT) [ 1313.939230] pstate: 60000005 (nZCv daif -PAN -UAO) [ 1314.022148] pc : rb_commit+0x2c0/0x320 [ 1314.104229] lr : ring_buffer_unlock_commit+0x30/0x128
full test log can be found here,
https://qa-reports.linaro.org/lkft/linux-stable-rc-5.4-oe/build/v5.4.41-148-gcac6eb2794c8/testrun/1441704/log
Summary
------------------------------------------------------------------------
kernel: 5.4.42-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-5.4.y
git commit: cac6eb2794c85e7777fb0caac6fa75b6364d81a0
git describe: v5.4.41-148-gcac6eb2794c8
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-5.4-oe/build/v5.4.41-148-gcac6eb2794c8
No regressions (compared to build v5.4.41)
No fixes (compared to build v5.4.41)
Ran 33314 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c
- hi6220-hikey
- i386
- juno-r2
- juno-r2-compat
- juno-r2-kasan
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15
- x86
- x86-kasan
Test Suites
-----------
* build
* install-android-platform-tools-r2600
* install-android-platform-tools-r2800
* kselftest
* kselftest/drivers
* kselftest/filesystems
* kselftest/net
* kselftest/networking
* libgpiod
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-tests
* ltp-hugetlb-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-sched-tests
* ltp-syscalls-tests
* perf
* ltp-containers-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-io-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-securebits-tests
* network-basic-tests
* v4l2-compliance
* ltp-open-posix-tests
* kvm-unit-tests
* kselftest-vsyscall-mode-native
* kselftest-vsyscall-mode-native/drivers
* kselftest-vsyscall-mode-native/filesystems
* kselftest-vsyscall-mode-native/net
* kselftest-vsyscall-mode-native/networking
* kselftest-vsyscall-mode-none
* kselftest-vsyscall-mode-none/drivers
* kselftest-vsyscall-mode-none/filesystems
* kselftest-vsyscall-mode-none/net
* kselftest-vsyscall-mode-none/networking
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Jon Hunter
maintainerQuoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.42 release. There are 147 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 20 May 2020 17:32:42 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.42-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests are passing for Tegra ...
Test results for stable-v5.4:
13 builds: 13 pass, 0 fail
26 boots: 26 pass, 0 fail
42 tests: 42 pass, 0 failLinux version: 5.4.42-rc1-gcac6eb2794c8
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Cheers
Jon
Signature · 1 line
nvpublic
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.42 release. There are 147 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 20 May 2020 17:32:42 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.42-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.42 release. There are 147 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 20 May 2020 17:32:42 +0000. Anything received after that time might be too late.
Build results:
total: 157 pass: 157 fail: 0 Qemu test results: total: 430 pass: 430 fail: 0
Guenter