5.6.14-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 5.6.14-rc1 review
This is the start of the stable review cycle for the 5.6.14 release. There are 194 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.6.14-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.6.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.6.14-rc1
Sergei Trofimovich <[email protected]>
Makefile: disallow data races on gcc-10 as well
Daniel Borkmann <[email protected]>
bpf: Restrict bpf_trace_printk()'s %s usage and add %pks, %pus specifier
Yonghong Song <[email protected]>
selftests/bpf: Enforce returning 0 for fentry/fexit programs
Yonghong Song <[email protected]>
bpf: Enforce returning 0 for fentry/fexit progs
Jim Mattson <[email protected]>
KVM: x86: Fix off-by-one error in kvm_vcpu_ioctl_x86_setup_mce
Kefeng Wang <[email protected]>
riscv: perf: RISCV_BASE_PMU should be independent
Jason Gunthorpe <[email protected]>
RDMA/uverbs: Move IB_EVENT_DEVICE_FATAL to destroy_uobj
Jason Gunthorpe <[email protected]>
RDMA/uverbs: Do not discard the IB_EVENT_DEVICE_FATAL event
Nayna Jain <[email protected]>
powerpc/ima: Fix secure boot rules in ima arch policy
Nicholas Piggin <[email protected]>
powerpc/uaccess: Evaluate macro arguments once, before user access is allowed
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()")Michael Walle <[email protected]>
dt-bindings: dma: fsl-edma: fix ls1028a-edma compatible
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
Bjorn Andersson <[email protected]>
arm64: dts: qcom: msm8996: Reduce vdd_apc voltage
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
Tero Kristo <[email protected]>
clk: ti: clkctrl: Fix Bad of_node_put within clkctrl_get_name
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()'
Thierry Reding <[email protected]>
usb: gadget: tegra-xudc: Fix idle suspend/resume
Neil Armstrong <[email protected]>
arm64: dts: meson-g12b-ugoos-am6: fix usb vbus-supply
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
Babu Moger <[email protected]>
KVM: x86: Fix pkru save/restore when guest CR4.PKE=0, move it to x86.c
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
Christophe Leroy <[email protected]>
powerpc/vdso32: Fallback on getres syscall when clock is unknown
Imre Deak <[email protected]>
drm/i915/tgl+: Fix interrupt handling for DP AUX transactions
Tom St Denis <[email protected]>
drm/amd/amdgpu: add raven1 part to the gfxoff quirk list
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
Masami Hiramatsu <[email protected]>
bootconfig: Fix to prevent warning message if no bootconfig option
Masami Hiramatsu <[email protected]>
bootconfig: Fix to remove bootconfig data from initrd while boot
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
Sasha Levin <[email protected]>
bpf: Fix bug in mmap() implementation for BPF array map
Roman Penyaev <[email protected]>
epoll: call final ep_events_available() check under the lock
Yafang Shao <[email protected]>
mm, memcg: fix inconsistent oom event behavior
Chris Wilson <[email protected]>
drm/i915: Handle idling during i915_gem_evict_something busy loops
Wei Yongjun <[email protected]>
s390/ism: fix error return code in ism_probe()
Samu Nuutamo <[email protected]>
hwmon: (da9052) Synchronize access with mfd
Steven Rostedt (VMware) <[email protected]>
x86/ftrace: Have ftrace trampolines turn read-only at the end of system boot up
Potnuri Bharat Teja <[email protected]>
RDMA/iw_cxgb4: Fix incorrect function parameters
Maor Gottlieb <[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
Pablo Neira Ayuso <[email protected]>
netfilter: flowtable: set NF_FLOW_TEARDOWN flag on entry expiration
Steven Rostedt (VMware) <[email protected]>
tracing: Wait for preempt irq delay thread to execute
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
Chris Wilson <[email protected]>
drm/i915: Mark concurrent submissions with a weak-dependency
Florian Westphal <[email protected]>
netfilter: conntrack: fix infinite loop on rmmod
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
Guenter Roeck <[email protected]>
hwmon: (drivetemp) Fix SCT support if SCT data tables are not supported
Dave Wysochanski <[email protected]>
NFSv4: Fix fscache cookie aux_data to ensure change_attr is included
Dave Wysochanski <[email protected]>
NFS: Fix fscache super_cookie allocation
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()
Chris Wilson <[email protected]>
drm/i915/gem: Remove object_is_locked assertion from unpin_from_display_plane
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
Chris Wilson <[email protected]>
drm/i915/gt: Make timeslicing an explicit engine property
Dan Carpenter <[email protected]>
i40iw: Fix error handling in i40iw_manage_arp_cache()
David Howells <[email protected]>
cachefiles: Fix corruption of the return value in cachefiles_read_or_alloc_pages()
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()
Thierry Reding <[email protected]>
drm/tegra: Fix SMMU support on Tegra124 and Tegra210
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
Pavel Begunkov <[email protected]>
io_uring: check non-sync defer_list carefully
Xiaoguang Wang <[email protected]>
io_uring: use cond_resched() in io_ring_ctx_wait_and_kill()
Ritesh Harjani <[email protected]>
fibmap: Warn and return an error in case of block > INT_MAX
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
Nicholas Kazlauskas <[email protected]>
drm/amd/display: Defer cursor update around VUPDATE for all ASIC
Dmytro Laktyushkin <[email protected]>
drm/amd/display: check if REFCLK_CNTL register is present
Marek Olšák <[email protected]>
drm/amdgpu: bump version for invalidate L2 before SDMA IBs
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
Xiaodong Yan <[email protected]>
drm/amd/display: blank dp stream before re-train the link
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
Sebastian von Ohr <[email protected]>
dmaengine: xilinx_dma: Add missing check for empty list
Florian Fainelli <[email protected]>
net: broadcom: Select BROADCOM_PHY for BCMGENET
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
Paolo Abeni <[email protected]>
mptcp: set correct vfs info for subflows
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
Vladimir Oltean <[email protected]>
net: mscc: ocelot: ANA_AUTOAGE_AGE_PERIOD holds a value in seconds, not ms
Vladimir Oltean <[email protected]>
net: dsa: ocelot: the MAC table on Felix is twice as large
Joerg Roedel <[email protected]>
iommu/amd: Update Device Table in increase_address_space()
Joerg Roedel <[email protected]>
iommu/amd: Fix race in increase_address_space()/fetch_pte()
Colin Ian King <[email protected]>
net: stmmac: gmac5+: fix potential integer overflow on 32 bit multiply
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
Clay McClure <[email protected]>
net: Make PTP-specific drivers depend on PTP_1588_CLOCK
Nathan Chancellor <[email protected]>
hv_netvsc: Fix netvsc_start_xmit's return type
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-v2: Only use the virtual state when userspace accesses pending bits
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
José Roberto de Souza <[email protected]>
drm/i915/display: Load DP_TP_CTL/STATUS offset before use it
Matt Roper <[email protected]>
drm/i915/tgl: TBT AUX should use TC power well ops
Matt Roper <[email protected]>
drm/i915/tgl: Add Wa_14010477008:tgl
Chuck Lever <[email protected]>
xprtrdma: Fix trace point use-after-free race
Chuck Lever <[email protected]>
xprtrdma: Clean up the post_send path
Oliver Upton <[email protected]>
kvm: nVMX: reflect MTF VM-exits if injected by L1
Oliver Upton <[email protected]>
KVM: nVMX: Consolidate nested MTF checks to helper function
-------------
Diffstat:
Documentation/core-api/printk-formats.rst | 14 ++ Documentation/devicetree/bindings/dma/fsl-edma.txt | 3 +- 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 + .../boot/dts/amlogic/meson-g12b-ugoos-am6.dts | 2 +- arch/arm64/boot/dts/freescale/imx8mn.dtsi | 2 +- arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi | 4 +- 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/powerpc/include/asm/uaccess.h | 49 ++++-- arch/powerpc/kernel/ima_arch.c | 6 +- arch/powerpc/kernel/vdso32/gettimeofday.S | 6 +- arch/riscv/include/asm/perf_event.h | 8 +- arch/riscv/kernel/Makefile | 2 +- arch/riscv/kernel/vdso/Makefile | 6 +- arch/x86/include/asm/ftrace.h | 6 + arch/x86/include/asm/kvm_host.h | 1 + arch/x86/include/asm/stackprotector.h | 7 +- arch/x86/kernel/ftrace.c | 29 +++- arch/x86/kernel/smpboot.c | 8 + arch/x86/kernel/unwind_orc.c | 16 +- arch/x86/kvm/vmx/nested.c | 19 ++- arch/x86/kvm/vmx/vmx.c | 18 -- arch/x86/kvm/x86.c | 19 ++- arch/x86/mm/init_64.c | 3 + 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/clk/ti/clkctrl.c | 1 - drivers/cpufreq/intel_pstate.c | 2 +- drivers/dma/mmp_tdma.c | 5 +- drivers/dma/pch_dma.c | 2 +- drivers/dma/xilinx/xilinx_dma.c | 20 +-- drivers/firmware/efi/tpm.c | 2 +- drivers/gpio/gpio-pca953x.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 +- drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 3 +- drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 2 + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 26 ++- drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 12 ++ drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 28 +-- 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_ddi.c | 14 +- drivers/gpu/drm/i915/display/intel_display_power.c | 12 +- drivers/gpu/drm/i915/display/intel_dp.c | 5 +- drivers/gpu/drm/i915/display/intel_fbc.c | 3 +- drivers/gpu/drm/i915/display/intel_sprite.c | 17 +- drivers/gpu/drm/i915/gem/i915_gem_domain.c | 7 +- drivers/gpu/drm/i915/gt/intel_engine.h | 9 - drivers/gpu/drm/i915/gt/intel_engine_types.h | 18 +- drivers/gpu/drm/i915/gt/intel_lrc.c | 8 +- drivers/gpu/drm/i915/gvt/scheduler.c | 6 +- drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/i915_gem_evict.c | 26 ++- drivers/gpu/drm/i915/i915_irq.c | 16 +- drivers/gpu/drm/i915/i915_request.c | 8 +- drivers/gpu/drm/i915/i915_scheduler.c | 6 +- drivers/gpu/drm/i915/i915_scheduler.h | 3 +- drivers/gpu/drm/i915/i915_scheduler_types.h | 1 + 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/gpu/drm/tegra/drm.c | 3 +- drivers/gpu/host1x/dev.c | 13 ++ drivers/hwmon/da9052-hwmon.c | 4 +- drivers/hwmon/drivetemp.c | 2 +- drivers/infiniband/core/cache.c | 7 +- drivers/infiniband/core/nldev.c | 3 +- drivers/infiniband/core/rdma_core.c | 3 +- drivers/infiniband/core/uverbs.h | 4 + drivers/infiniband/core/uverbs_main.c | 12 +- .../infiniband/core/uverbs_std_types_async_fd.c | 30 +++- 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/iommu/amd_iommu.c | 175 ++++++++++++++----- drivers/iommu/amd_iommu_types.h | 9 +- 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/dsa/mv88e6xxx/Kconfig | 2 +- drivers/net/dsa/ocelot/felix.c | 1 + drivers/net/dsa/ocelot/felix.h | 1 + drivers/net/dsa/ocelot/felix_vsc9959.c | 1 + drivers/net/dsa/sja1105/Kconfig | 1 + drivers/net/ethernet/broadcom/Kconfig | 1 + drivers/net/ethernet/cadence/Kconfig | 2 +- drivers/net/ethernet/cavium/Kconfig | 2 +- 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/mscc/ocelot.c | 17 +- drivers/net/ethernet/mscc/ocelot_regs.c | 1 + 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/ethernet/stmicro/stmmac/dwmac5.c | 2 +- drivers/net/ethernet/ti/Kconfig | 3 +- drivers/net/hyperv/netvsc_drv.c | 3 +- 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/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/gadget/udc/tegra-xudc.c | 8 +- drivers/usb/host/xhci-plat.c | 4 +- drivers/usb/host/xhci-ring.c | 4 +- fs/cachefiles/rdwr.c | 10 +- fs/cifs/cifssmb.c | 2 +- fs/eventpoll.c | 48 +++--- fs/exec.c | 4 +- fs/gfs2/bmap.c | 16 +- fs/gfs2/lops.c | 19 ++- fs/io_uring.c | 4 +- fs/ioctl.c | 8 + fs/iomap/fiemap.c | 5 +- fs/nfs/fscache.c | 39 ++--- fs/nfs/mount_clnt.c | 3 +- fs/nfs/nfs4state.c | 2 +- fs/nfs/super.c | 1 - fs/notify/fanotify/fanotify.c | 11 +- include/linux/compiler.h | 6 + include/linux/fs.h | 2 +- include/linux/ftrace.h | 23 +++ include/linux/host1x.h | 3 + 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/soc/mscc/ocelot.h | 1 + include/sound/rawmidi.h | 1 + include/trace/events/rpcrdma.h | 12 +- init/Kconfig | 18 -- init/initramfs.c | 2 +- init/main.c | 75 +++++++-- ipc/util.c | 12 +- kernel/bpf/arraymap.c | 7 +- kernel/bpf/syscall.c | 4 +- kernel/bpf/verifier.c | 16 ++ kernel/fork.c | 13 +- kernel/trace/Kconfig | 1 - kernel/trace/bpf_trace.c | 94 +++++++---- kernel/trace/ftrace_internal.h | 22 --- kernel/trace/preemptirq_delay_test.c | 12 +- kernel/umh.c | 6 + lib/vsprintf.c | 12 ++ 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/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/mptcp/subflow.c | 10 ++ net/netfilter/nf_conntrack_core.c | 17 +- net/netfilter/nf_flow_table_core.c | 8 +- net/netfilter/nft_set_rbtree.c | 11 ++ 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 +++++ net/sunrpc/xprtrdma/backchannel.c | 2 +- net/sunrpc/xprtrdma/frwr_ops.c | 14 +- net/sunrpc/xprtrdma/transport.c | 2 +- net/sunrpc/xprtrdma/verbs.c | 15 +- net/sunrpc/xprtrdma/xprt_rdma.h | 5 +- scripts/kallsyms.c | 2 +- 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/testing/selftests/bpf/prog_tests/mmap.c | 9 + tools/testing/selftests/bpf/progs/test_overhead.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 | 10 +- virt/kvm/arm/vgic/vgic-mmio-v3.c | 12 +- virt/kvm/arm/vgic/vgic-mmio.c | 187 ++++++++++++++------- virt/kvm/arm/vgic/vgic-mmio.h | 11 ++ 241 files changed, 1928 insertions(+), 837 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/194 KVM: nVMX: Consolidate nested MTF checks to helper function
From: Oliver Upton <[email protected]>
[ Upstream commit 212617dbb6bac2a21dec6ef7d6012d96bb6dbb5d ]
commit 5ef8acbdd687 ("KVM: nVMX: Emulate MTF when performing instruction emulation") introduced a helper to check the MTF VM-execution control in vmcs12. Change pre-existing check in nested_vmx_exit_reflected() to instead use the helper.
--- arch/x86/kvm/vmx/nested.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/vmx/nested.c +1 -1
@@ -5618,7 +5618,7 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)case EXIT_REASON_MWAIT_INSTRUCTION :return nested_cpu_has (vmcs12,CPU_BASED_MWAIT_EXITING );case EXIT_REASON_MONITOR_TRAP_FLAG : -return nested_cpu_has (vmcs12,CPU_BASED_MONITOR_TRAP_FLAG ); +return nested_cpu_has_mtf (vmcs12);case EXIT_REASON_MONITOR_INSTRUCTION :return nested_cpu_has (vmcs12,CPU_BASED_MONITOR_EXITING );case EXIT_REASON_PAUSE_INSTRUCTION :
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 2/194 kvm: nVMX: reflect MTF VM-exits if injected by L1
In reply to Greg Kroah-HartmanFrom: Oliver Upton <[email protected]>
[ Upstream commit b045ae906b42afb361dc7ecf1a3cea110fb0a65f ]
According to SDM 26.6.2, it is possible to inject an MTF VM-exit via the VM-entry interruption-information field regardless of the 'monitor trap flag' VM-execution control. KVM appropriately copies the VM-entry interruption-information field from vmcs12 to vmcs02. However, if L1 has not set the 'monitor trap flag' VM-execution control, KVM fails to reflect the subsequent MTF VM-exit into L1.
Fix this by consulting the VM-entry interruption-information field of vmcs12 to determine if L1 has injected the MTF VM-exit. If so, reflect the exit, regardless of the 'monitor trap flag' VM-execution control.
Message-Id: <[email protected]>
--- arch/x86/kvm/vmx/nested.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
arch/x86/kvm/vmx/nested.c +18 -1
@@ -5504,6 +5504,23 @@ static bool nested_vmx_exit_handled_vmcs_access(struct kvm_vcpu *vcpu,return 1 & (b >> (field &7 )); } +static bool nested_vmx_exit_handled_mtf (struct vmcs12 *vmcs12) +{ +u32 entry_intr_info = vmcs12->vm_entry_intr_info_field; + +if (nested_cpu_has_mtf (vmcs12)) +return true; + +/* +* An MTF VM-exit may be injected into the guest by setting the +* interruption-type to 7 (other event) and the vector field to 0. Such +* is the case regardless of the 'monitor trap flag' VM-execution +* control. +*/ +return entry_intr_info == (INTR_INFO_VALID_MASK + |INTR_TYPE_OTHER_EVENT ); +} +/* * Return 1 if we should exit from L2 to L1 to handle an exit, or 0 if we * should handle it ourselves in L0 (and then continue L2). Only call this
@@ -5618,7 +5635,7 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)case EXIT_REASON_MWAIT_INSTRUCTION :return nested_cpu_has (vmcs12,CPU_BASED_MWAIT_EXITING );case EXIT_REASON_MONITOR_TRAP_FLAG : -return nested_cpu_has_mtf (vmcs12); +return nested_vmx_exit_handled_mtf (vmcs12);case EXIT_REASON_MONITOR_INSTRUCTION :return nested_cpu_has (vmcs12,CPU_BASED_MONITOR_EXITING );case EXIT_REASON_PAUSE_INSTRUCTION :
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 3/194 xprtrdma: Clean up the post_send path
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit 97d0de8812a10a66510ff95f8fe6e8d3053fd2ca ]
Clean up: Simplify the synopses of functions in the post_send path by combining the struct rpcrdma_ia and struct rpcrdma_ep arguments.
--- net/sunrpc/xprtrdma/backchannel.c | 2 +- net/sunrpc/xprtrdma/frwr_ops.c | 14 +++++++++----- net/sunrpc/xprtrdma/transport.c | 2 +- net/sunrpc/xprtrdma/verbs.c | 13 +++++-------- net/sunrpc/xprtrdma/xprt_rdma.h | 5 ++--- 5 files changed, 18 insertions(+), 18 deletions(-)
net/sunrpc/xprtrdma/backchannel.c +1 -1
@@ -115,7 +115,7 @@ int xprt_rdma_bc_send_reply(struct rpc_rqst *rqst)if (rc <0 ) goto failed_marshal; -if (rpcrdma_ep_post (&r_xprt->rx_ia, &r_xprt->rx_ep, req)) +if (rpcrdma_post_sends (r_xprt, req)) goto drop_connection;return 0 ;
net/sunrpc/xprtrdma/frwr_ops.c +9 -5
@@ -372,18 +372,22 @@ static void frwr_wc_fastreg(struct ib_cq *cq, struct ib_wc *wc) }/** -* frwr_send - post Send WR containing the RPC Call message -* @ia: interface adapter -* @req: Prepared RPC Call +* frwr_send - post Send WRs containing the RPC Call message +* @r_xprt: controlling transport instance +* @req: prepared RPC Call * * For FRWR, chain any FastReg WRs to the Send WR. Only a * single ib_post_send call is needed to register memory * and then post the Send WR. * -* Returns the result of ib_post_send. +* Returns the return code from ib_post_send. +* +* Caller must hold the transport send lock to ensure that the +* pointers to the transport's rdma_cm_id and QP are stable. */ -int frwr_send (struct rpcrdma_ia *ia,struct rpcrdma_req *req) +int frwr_send (struct rpcrdma_xprt *r_xprt,struct rpcrdma_req *req) { +struct rpcrdma_ia *ia = &r_xprt->rx_ia;struct ib_send_wr *post_wr;struct rpcrdma_mr *mr;
net/sunrpc/xprtrdma/transport.c +1 -1
@@ -694,7 +694,7 @@ xprt_rdma_send_request(struct rpc_rqst *rqst) goto drop_connection; rqst->rq_xtime =ktime_get (); -if (rpcrdma_ep_post (&r_xprt->rx_ia, &r_xprt->rx_ep, req)) +if (rpcrdma_post_sends (r_xprt, req)) goto drop_connection; rqst->rq_xmit_bytes_sent += rqst->rq_snd_buf.len;
net/sunrpc/xprtrdma/verbs.c +5 -8
@@ -1502,20 +1502,17 @@ static void rpcrdma_regbuf_free(struct rpcrdma_regbuf *rb) }/** -* rpcrdma_ep_post - Post WRs to a transport's Send Queue -* @ia: transport's device information -* @ep: transport's RDMA endpoint information +* rpcrdma_post_sends - Post WRs to a transport's Send Queue +* @r_xprt: controlling transport instance * @req: rpcrdma_req containing the Send WR to post * * Returns 0 if the post was successful, otherwise -ENOTCONN * is returned. */ -int -rpcrdma_ep_post (struct rpcrdma_ia *ia, -struct rpcrdma_ep *ep, -struct rpcrdma_req *req) +int rpcrdma_post_sends (struct rpcrdma_xprt *r_xprt,struct rpcrdma_req *req) {struct ib_send_wr *send_wr = &req->rl_wr; +struct rpcrdma_ep *ep = &r_xprt->rx_ep;int rc;if (!ep->rep_send_count ||kref_read (&req->rl_kref) >1 ) {
@@ -1526,7 +1523,7 @@ rpcrdma_ep_post(struct rpcrdma_ia *ia, --ep->rep_send_count; } - rc =frwr_send (ia, req); + rc =frwr_send (r_xprt, req);trace_xprtrdma_post_send (req, rc);if (rc)return -ENOTCONN ;
net/sunrpc/xprtrdma/xprt_rdma.h +2 -3
@@ -469,8 +469,7 @@ void rpcrdma_ep_destroy(struct rpcrdma_xprt *r_xprt);int rpcrdma_ep_connect (struct rpcrdma_ep *,struct rpcrdma_ia *);void rpcrdma_ep_disconnect (struct rpcrdma_ep *,struct rpcrdma_ia *); -int rpcrdma_ep_post (struct rpcrdma_ia *,struct rpcrdma_ep *, -struct rpcrdma_req *); +int rpcrdma_post_sends (struct rpcrdma_xprt *r_xprt,struct rpcrdma_req *req);void rpcrdma_post_recvs (struct rpcrdma_xprt *r_xprt,bool temp);/*
@@ -544,7 +543,7 @@ struct rpcrdma_mr_seg *frwr_map(struct rpcrdma_xprt *r_xprt,struct rpcrdma_mr_seg *seg, int nsegs, bool writing, __be32 xid, struct rpcrdma_mr *mr); -int frwr_send (struct rpcrdma_ia *ia,struct rpcrdma_req *req); +int frwr_send (struct rpcrdma_xprt *r_xprt,struct rpcrdma_req *req);void frwr_reminv (struct rpcrdma_rep *rep,struct list_head *mrs);void frwr_unmap_sync (struct rpcrdma_xprt *r_xprt,struct rpcrdma_req *req);void frwr_unmap_async (struct rpcrdma_xprt *r_xprt,struct rpcrdma_req *req);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 4/194 xprtrdma: Fix trace point use-after-free race
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit bdb2ce82818577ba6e57b7d68b698b8d17329281 ]
It's not safe to use resources pointed to by the @send_wr of ib_post_send() _after_ that function returns. Those resources are typically freed by the Send completion handler, which can run before ib_post_send() returns.
Thus the trace points currently around ib_post_send() in the client's RPC/RDMA transport are a hazard, even when they are disabled. Rearrange them so that they touch the Work Request only _before_ ib_post_send() is invoked.
--- include/trace/events/rpcrdma.h | 12 ++++-------- net/sunrpc/xprtrdma/verbs.c | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-)
include/trace/events/rpcrdma.h +4 -8
@@ -721,11 +721,10 @@ TRACE_EVENT(xprtrdma_prepsend_failed, TRACE_EVENT(xprtrdma_post_send, TP_PROTO( - const struct rpcrdma_req *req, - int status + const struct rpcrdma_req *req ), - TP_ARGS(req, status), + TP_ARGS(req), TP_STRUCT__entry( __field(const void *, req)
@@ -734,7 +733,6 @@ TRACE_EVENT(xprtrdma_post_send, __field(unsigned int, client_id) __field(int, num_sge) __field(int, signaled) - __field(int, status) ), TP_fast_assign(
@@ -747,15 +745,13 @@ TRACE_EVENT(xprtrdma_post_send, __entry->sc = req->rl_sendctx; __entry->num_sge = req->rl_wr.num_sge; __entry->signaled = req->rl_wr.send_flags &IB_SEND_SIGNALED ; - __entry->status = status; ), -TP_printk ("task:%u@%u req=%p sc=%p (%d SGE%s) %sstatus=%d" , +TP_printk ("task:%u@%u req=%p sc=%p (%d SGE%s) %s" , __entry->task_id, __entry->client_id, __entry->req, __entry->sc, __entry->num_sge, (__entry->num_sge ==1 ?"" :"s" ), - (__entry->signaled ?"signaled " :"" ), - __entry->status + (__entry->signaled ?"signaled" :"" ) ) );
net/sunrpc/xprtrdma/verbs.c +1 -1
@@ -1523,8 +1523,8 @@ int rpcrdma_post_sends(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) --ep->rep_send_count; } +trace_xprtrdma_post_send (req); rc =frwr_send (r_xprt, req); -trace_xprtrdma_post_send (req, rc);if (rc)return -ENOTCONN ;return 0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 5/194 drm/i915/tgl: Add Wa_14010477008:tgl
In reply to Greg Kroah-HartmanFrom: Matt Roper <[email protected]>
[ Upstream commit 81fdd7bfeb8e8f76bcdfef9174ec580707c37d38 ]
Media decompression support should not be advertised on any display planes for steppings A0-C0.
Bspec: 53273
--- drivers/gpu/drm/i915/display/intel_sprite.c | 17 ++++++++++++----- drivers/gpu/drm/i915/i915_drv.h | 2 ++ 2 files changed, 14 insertions(+), 5 deletions(-)
drivers/gpu/drm/i915/display/intel_sprite.c +12 -5
@@ -2754,19 +2754,25 @@ static bool skl_plane_format_mod_supported(struct drm_plane *_plane, } } -static bool gen12_plane_supports_mc_ccs (enum plane_id plane_id) +static bool gen12_plane_supports_mc_ccs (struct drm_i915_private *dev_priv, +enum plane_id plane_id) { +/* Wa_14010477008:tgl[a0..c0] */ +if (IS_TGL_REVID (dev_priv,TGL_REVID_A0 ,TGL_REVID_C0 )) +return false; +return plane_id <PLANE_SPRITE4 ; }static bool gen12_plane_format_mod_supported (struct drm_plane *_plane,u32 format,u64 modifier) { +struct drm_i915_private *dev_priv =to_i915 (_plane->dev);struct intel_plane *plane =to_intel_plane (_plane);switch (modifier) {case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS : -if (!gen12_plane_supports_mc_ccs (plane->id)) +if (!gen12_plane_supports_mc_ccs (dev_priv, plane->id))return false;/* fall through */ case DRM_FORMAT_MOD_LINEAR :
@@ -2935,9 +2941,10 @@ static const u32 *icl_get_plane_formats(struct drm_i915_private *dev_priv, } } -static const u64 *gen12_get_plane_modifiers (enum plane_id plane_id) +static const u64 *gen12_get_plane_modifiers (struct drm_i915_private *dev_priv, +enum plane_id plane_id) { -if (gen12_plane_supports_mc_ccs (plane_id)) +if (gen12_plane_supports_mc_ccs (dev_priv, plane_id))return gen12_plane_format_modifiers_mc_ccs;else return gen12_plane_format_modifiers_rc_ccs;
@@ -3008,7 +3015,7 @@ skl_universal_plane_create(struct drm_i915_private *dev_priv, plane->has_ccs =skl_plane_has_ccs (dev_priv, pipe, plane_id);if (INTEL_GEN (dev_priv) >=12 ) { - modifiers =gen12_get_plane_modifiers (plane_id); + modifiers =gen12_get_plane_modifiers (dev_priv, plane_id); plane_funcs = &gen12_plane_funcs; }else {if (plane->has_ccs)
drivers/gpu/drm/i915/i915_drv.h +2 -0
@@ -1601,6 +1601,8 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915, (IS_ICELAKE(p) && IS_REVID(p, since, until))#define TGL_REVID_A0 0x0 +#define TGL_REVID_B0 0x1 +#define TGL_REVID_C0 0x2#define IS_TGL_REVID (p, since, until) \ (IS_TIGERLAKE(p) && IS_REVID(p, since, until))
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 6/194 drm/i915/tgl: TBT AUX should use TC power well ops
In reply to Greg Kroah-HartmanFrom: Matt Roper <[email protected]>
[ Upstream commit 335f62e7606a7921775d7cc73f0ad8ffd899bc22 ]
As on ICL, we want to use the Type-C aux handlers for the TBT aux wells to ensure the DP_AUX_CH_CTL_TBT_IO flag is set properly.
--- drivers/gpu/drm/i915/display/intel_display_power.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/gpu/drm/i915/display/intel_display_power.c +6 -6
@@ -4068,7 +4068,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { { .name = "AUX D TBT1", .domains = TGL_AUX_D_TBT1_IO_POWER_DOMAINS, - .ops = &hsw_power_well_ops, + .ops = &icl_tc_phy_aux_power_well_ops, .id = DISP_PW_ID_NONE, { .hsw.regs = &icl_aux_power_well_regs,
@@ -4079,7 +4079,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { { .name = "AUX E TBT2", .domains = TGL_AUX_E_TBT2_IO_POWER_DOMAINS, - .ops = &hsw_power_well_ops, + .ops = &icl_tc_phy_aux_power_well_ops, .id = DISP_PW_ID_NONE, { .hsw.regs = &icl_aux_power_well_regs,
@@ -4090,7 +4090,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { { .name = "AUX F TBT3", .domains = TGL_AUX_F_TBT3_IO_POWER_DOMAINS, - .ops = &hsw_power_well_ops, + .ops = &icl_tc_phy_aux_power_well_ops, .id = DISP_PW_ID_NONE, { .hsw.regs = &icl_aux_power_well_regs,
@@ -4101,7 +4101,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { { .name = "AUX G TBT4", .domains = TGL_AUX_G_TBT4_IO_POWER_DOMAINS, - .ops = &hsw_power_well_ops, + .ops = &icl_tc_phy_aux_power_well_ops, .id = DISP_PW_ID_NONE, { .hsw.regs = &icl_aux_power_well_regs,
@@ -4112,7 +4112,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { { .name = "AUX H TBT5", .domains = TGL_AUX_H_TBT5_IO_POWER_DOMAINS, - .ops = &hsw_power_well_ops, + .ops = &icl_tc_phy_aux_power_well_ops, .id = DISP_PW_ID_NONE, { .hsw.regs = &icl_aux_power_well_regs,
@@ -4123,7 +4123,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { { .name = "AUX I TBT6", .domains = TGL_AUX_I_TBT6_IO_POWER_DOMAINS, - .ops = &hsw_power_well_ops, + .ops = &icl_tc_phy_aux_power_well_ops, .id = DISP_PW_ID_NONE, { .hsw.regs = &icl_aux_power_well_regs,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 7/194 drm/i915/display: Load DP_TP_CTL/STATUS offset before use it
In reply to Greg Kroah-HartmanFrom: José Roberto de Souza <[email protected]>
[ Upstream commit 12399028751b887bdc2515f1a1e2c81b4fd74085 ]
Right now dp.regs.dp_tp_ctl/status are only set during the encoder pre_enable() hook, what is causing all reads and writes to those registers to go to offset 0x0 before pre_enable() is executed.
So if i915 takes the BIOS state and don't do a modeset any following link retraing will fail.
In the case that i915 needs to do a modeset, the DDI disable sequence will write to a wrong register not disabling DP 'Transport Enable' in DP_TP_CTL, making a HDMI modeset in the same port/transcoder to not light up the monitor.
So here for GENs older than 12, that have those registers fixed at port offset range it is loading at encoder/port init while for GEN12 it will keep setting it at encoder pre_enable() and during HW state readout.
--- drivers/gpu/drm/i915/display/intel_ddi.c | 14 +++++++++++--- drivers/gpu/drm/i915/display/intel_dp.c | 5 ++--- 2 files changed, 13 insertions(+), 6 deletions(-)
drivers/gpu/drm/i915/display/intel_ddi.c +11 -3
@@ -3545,9 +3545,6 @@ static void hsw_ddi_pre_enable_dp(struct intel_encoder *encoder,intel_dp_set_link_params (intel_dp, crtc_state->port_clock, crtc_state->lane_count, is_mst); - intel_dp->regs.dp_tp_ctl =DP_TP_CTL (port); - intel_dp->regs.dp_tp_status =DP_TP_STATUS (port); -intel_edp_panel_on (intel_dp);intel_ddi_clk_select (encoder, crtc_state);
@@ -4269,12 +4266,18 @@ void intel_ddi_get_config(struct intel_encoder *encoder,struct drm_i915_private *dev_priv =to_i915 (encoder->base.dev);struct intel_crtc *intel_crtc =to_intel_crtc (pipe_config->uapi.crtc);enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; +struct intel_dp *intel_dp =enc_to_intel_dp (encoder);u32 temp, flags =0 ;/* XXX: DSI transcoder paranoia */ if (WARN_ON (transcoder_is_dsi (cpu_transcoder)))return ; +if (INTEL_GEN (dev_priv) >=12 ) { + intel_dp->regs.dp_tp_ctl =TGL_DP_TP_CTL (cpu_transcoder); + intel_dp->regs.dp_tp_status =TGL_DP_TP_STATUS (cpu_transcoder); + } +intel_dsc_get_config (encoder, pipe_config); temp =I915_READ (TRANS_DDI_FUNC_CTL (cpu_transcoder));
@@ -4492,6 +4495,7 @@ static const struct drm_encoder_funcs intel_ddi_funcs = {static struct intel_connector *intel_ddi_init_dp_connector (struct intel_digital_port *intel_dig_port) { +struct drm_i915_private *dev_priv =to_i915 (intel_dig_port->base.base.dev);struct intel_connector *connector;enum port port = intel_dig_port->base.port;
@@ -4502,6 +4506,10 @@ intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port) intel_dig_port->dp.output_reg =DDI_BUF_CTL (port); intel_dig_port->dp.prepare_link_retrain = intel_ddi_prepare_link_retrain; +if (INTEL_GEN (dev_priv) <12 ) { + intel_dig_port->dp.regs.dp_tp_ctl =DP_TP_CTL (port); + intel_dig_port->dp.regs.dp_tp_status =DP_TP_STATUS (port); + }if (!intel_dp_init_connector (intel_dig_port, connector)) {kfree (connector);
drivers/gpu/drm/i915/display/intel_dp.c +2 -3
@@ -2492,9 +2492,6 @@ static void intel_dp_prepare(struct intel_encoder *encoder,intel_crtc_has_type (pipe_config, INTEL_OUTPUT_DP_MST)); - intel_dp->regs.dp_tp_ctl =DP_TP_CTL (port); - intel_dp->regs.dp_tp_status =DP_TP_STATUS (port); -/* * There are four kinds of DP registers: *
@@ -7616,6 +7613,8 @@ bool intel_dp_init(struct drm_i915_private *dev_priv, intel_dig_port->dp.output_reg = output_reg; intel_dig_port->max_lanes =4 ; + intel_dig_port->dp.regs.dp_tp_ctl =DP_TP_CTL (port); + intel_dig_port->dp.regs.dp_tp_status =DP_TP_STATUS (port); intel_encoder->type =INTEL_OUTPUT_DP ; intel_encoder->power_domain =intel_port_to_power_domain (port);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 8/194 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
@@ -2184,7 +2184,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;
@@ -2199,7 +2203,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 9/194 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 10/194 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
@@ -494,11 +494,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,
@@ -566,12 +566,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
@@ -152,6 +152,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 11/194 KVM: arm: vgic-v2: Only use the virtual state when userspace accesses pending bits
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
[ Upstream commit ba1ed9e17b581c9a204ec1d72d40472dd8557edd ]
There is no point in accessing the HW when writing to any of the ISPENDR/ICPENDR registers from userspace, as only the guest should be allowed to change the HW state.
Introduce new userspace-specific accessors that deal solely with the virtual state. Note that the API differs from that of GICv3, where userspace exclusively uses ISPENDR to set the state. Too bad we can't reuse it.
--- virt/kvm/arm/vgic/vgic-mmio-v2.c | 6 ++- virt/kvm/arm/vgic/vgic-mmio.c | 87 ++++++++++++++++++++++++-------- virt/kvm/arm/vgic/vgic-mmio.h | 8 +++ 3 files changed, 77 insertions(+), 24 deletions(-)
virt/kvm/arm/vgic/vgic-mmio-v2.c +4 -2
@@ -415,10 +415,12 @@ static const struct vgic_register_region vgic_v2_dist_registers[] = { vgic_mmio_read_enable, vgic_mmio_write_cenable, NULL, NULL, 1, VGIC_ACCESS_32bit),REGISTER_DESC_WITH_BITS_PER_IRQ (GIC_DIST_PENDING_SET , - vgic_mmio_read_pending, vgic_mmio_write_spending,NULL ,NULL ,1 , + vgic_mmio_read_pending, vgic_mmio_write_spending, +NULL , vgic_uaccess_write_spending,1 , VGIC_ACCESS_32bit),REGISTER_DESC_WITH_BITS_PER_IRQ (GIC_DIST_PENDING_CLEAR , - vgic_mmio_read_pending, vgic_mmio_write_cpending,NULL ,NULL ,1 , + vgic_mmio_read_pending, vgic_mmio_write_cpending, +NULL , vgic_uaccess_write_cpending,1 , VGIC_ACCESS_32bit), REGISTER_DESC_WITH_BITS_PER_IRQ(GIC_DIST_ACTIVE_SET, vgic_mmio_read_active, vgic_mmio_write_sactive,
virt/kvm/arm/vgic/vgic-mmio.c +65 -22
131 lines not on this page · raw message
virt/kvm/arm/vgic/vgic-mmio.h +8 -0
@@ -149,6 +149,14 @@ void vgic_mmio_write_cpending(struct kvm_vcpu *vcpu, gpa_t addr, unsigned int len, unsigned long val); +int vgic_uaccess_write_spending (struct kvm_vcpu *vcpu, +gpa_t addr,unsigned int len, +unsigned long val); + +int vgic_uaccess_write_cpending (struct kvm_vcpu *vcpu, +gpa_t addr,unsigned int len, +unsigned long val); +unsigned long vgic_mmio_read_active (struct kvm_vcpu *vcpu,gpa_t addr,unsigned int len);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 12/194 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
@@ -531,7 +531,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 13/194 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
@@ -66,6 +66,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);
@@ -126,6 +127,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) {time64_t 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
@@ -411,10 +411,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
@@ -928,7 +928,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);
@@ -948,12 +948,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 14/194 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
@@ -21,6 +21,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) {time64_t 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 15/194 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 16/194 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 17/194 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 18/194 hv_netvsc: Fix netvsc_start_xmits return type
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 7fdc66debebc6a7170a37c8c9b0d9585a9788fb4 ]
netvsc_start_xmit is used as a callback function for the ndo_start_xmit function pointer. ndo_start_xmit's return type is netdev_tx_t but netvsc_start_xmit's return type is int.
This causes a failure with Control Flow Integrity (CFI), which requires function pointer prototypes and callback function definitions to match exactly. When CFI is in enforcing, the kernel panics. When booting a CFI kernel with WSL 2, the VM is immediately terminated because of this.
The splat when CONFIG_CFI_PERMISSIVE is used:
[ 5.916765] CFI failure (target: netvsc_start_xmit+0x0/0x10): [ 5.916771] WARNING: CPU: 8 PID: 0 at kernel/cfi.c:29 __cfi_check_fail+0x2e/0x40 [ 5.916772] Modules linked in: [ 5.916774] CPU: 8 PID: 0 Comm: swapper/8 Not tainted 5.7.0-rc3-next-20200424-microsoft-cbl-00001-ged4eb37d2c69-dirty #1 [ 5.916776] RIP: 0010:__cfi_check_fail+0x2e/0x40 [ 5.916777] Code: 48 c7 c7 70 98 63 a9 48 c7 c6 11 db 47 a9 e8 69 55 59 00 85 c0 75 02 5b c3 48 c7 c7 73 c6 43 a9 48 89 de 31 c0 e8 12 2d f0 ff <0f> 0b 5b c3 00 00 cc cc 00 00 cc cc 00 00 cc cc 00 00 85 f6 74 25 [ 5.916778] RSP: 0018:ffffa803c0260b78 EFLAGS: 00010246 [ 5.916779] RAX: 712a1af25779e900 RBX: ffffffffa8cf7950 RCX: ffffffffa962cf08 [ 5.916779] RDX: ffffffffa9c36b60 RSI: 0000000000000082 RDI: ffffffffa9c36b5c [ 5.916780] RBP: ffff8ffc4779c2c0 R08: 0000000000000001 R09: ffffffffa9c3c300 [ 5.916781] R10: 0000000000000151 R11: ffffffffa9c36b60 R12: ffff8ffe39084000 [ 5.916782] R13: ffffffffa8cf7950 R14: ffffffffa8d12cb0 R15: ffff8ffe39320140 [ 5.916784] FS: 0000000000000000(0000) GS:ffff8ffe3bc00000(0000) knlGS:0000000000000000 [ 5.916785] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 5.916786] CR2: 00007ffef5749408 CR3: 00000002f4f5e000 CR4: 0000000000340ea0 [ 5.916787] Call Trace: [ 5.916788] <IRQ> [ 5.916790] __cfi_check+0x3ab58/0x450e0 [ 5.916793] ? dev_hard_start_xmit+0x11f/0x160 [ 5.916795] ? sch_direct_xmit+0xf2/0x230 [ 5.916796] ? __dev_queue_xmit.llvm.11471227737707190958+0x69d/0x8e0 [ 5.916797] ? neigh_resolve_output+0xdf/0x220 [ 5.916799] ? neigh_connected_output.cfi_jt+0x8/0x8 [ 5.916801] ? ip6_finish_output2+0x398/0x4c0 [ 5.916803] ? nf_nat_ipv6_out+0x10/0xa0 [ 5.916804] ? nf_hook_slow+0x84/0x100 [ 5.916807] ? ip6_input_finish+0x8/0x8 [ 5.916807] ? ip6_output+0x6f/0x110 [ 5.916808] ? __ip6_local_out.cfi_jt+0x8/0x8 [ 5.916810] ? mld_sendpack+0x28e/0x330 [ 5.916811] ? ip_rt_bug+0x8/0x8 [ 5.916813] ? mld_ifc_timer_expire+0x2db/0x400 [ 5.916814] ? neigh_proxy_process+0x8/0x8 [ 5.916816] ? call_timer_fn+0x3d/0xd0 [ 5.916817] ? __run_timers+0x2a9/0x300 [ 5.916819] ? rcu_core_si+0x8/0x8 [ 5.916820] ? run_timer_softirq+0x14/0x30 [ 5.916821] ? __do_softirq+0x154/0x262 [ 5.916822] ? native_x2apic_icr_write+0x8/0x8 [ 5.916824] ? irq_exit+0xba/0xc0 [ 5.916825] ? hv_stimer0_vector_handler+0x99/0xe0 [ 5.916826] ? hv_stimer0_callback_vector+0xf/0x20 [ 5.916826] </IRQ> [ 5.916828] ? hv_stimer_global_cleanup.cfi_jt+0x8/0x8 [ 5.916829] ? raw_setsockopt+0x8/0x8 [ 5.916830] ? default_idle+0xe/0x10 [ 5.916832] ? do_idle.llvm.10446269078108580492+0xb7/0x130 [ 5.916833] ? raw_setsockopt+0x8/0x8 [ 5.916833] ? cpu_startup_entry+0x15/0x20 [ 5.916835] ? cpu_hotplug_enable.cfi_jt+0x8/0x8 [ 5.916836] ? start_secondary+0x188/0x190 [ 5.916837] ? secondary_startup_64+0xa5/0xb0 [ 5.916838] ---[ end trace f2683fa869597ba5 ]---
Avoid this by using the right return type for netvsc_start_xmit.
--- drivers/net/hyperv/netvsc_drv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/hyperv/netvsc_drv.c +2 -1
@@ -710,7 +710,8 @@ static int netvsc_xmit(struct sk_buff *skb, struct net_device *net, bool xdp_tx) goto drop; } -static int netvsc_start_xmit (struct sk_buff *skb,struct net_device *ndev) +static netdev_tx_t netvsc_start_xmit (struct sk_buff *skb, +struct net_device *ndev) {return netvsc_xmit (skb, ndev, false); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 19/194 net: Make PTP-specific drivers depend on PTP_1588_CLOCK
In reply to Greg Kroah-HartmanFrom: Clay McClure <[email protected]>
[ Upstream commit b6d49cab44b567b3e0a5544b3d61e516a7355fad ]
Commit d1cbfd771ce8 ("ptp_clock: Allow for it to be optional") changed all PTP-capable Ethernet drivers from select PTP_1588_CLOCK to imply PTP_1588_CLOCK, "in order to break the hard dependency between the PTP clock subsystem and ethernet drivers capable of being clock providers." As a result it is possible to build PTP-capable Ethernet drivers without the PTP subsystem by deselecting PTP_1588_CLOCK. Drivers are required to handle the missing dependency gracefully.
Some PTP-capable Ethernet drivers (e.g., TI_CPSW) factor their PTP code out into separate drivers (e.g., TI_CPTS_MOD). The above commit also changed these PTP-specific drivers to imply PTP_1588_CLOCK, making it possible to build them without the PTP subsystem. But as Grygorii Strashko noted in [1]:
Quoted 3 lines · Grygorii Strashko
Another question is that CPTS completely nonfunctional in this case and it was never expected that somebody will even try to use/run such configuration (except for random build purposes).
In my view, enabling a PTP-specific driver without the PTP subsystem is a configuration error made possible by the above commit. Kconfig should not allow users to create a configuration with missing dependencies that results in "completely nonfunctional" drivers.
I audited all network drivers that call ptp_clock_register() but merely imply PTP_1588_CLOCK and found five PTP-specific drivers that are likely nonfunctional without PTP_1588_CLOCK:
NET_DSA_MV88E6XXX_PTP
NET_DSA_SJA1105_PTP
MACB_USE_HWSTAMP
CAVIUM_PTP
TI_CPTS_MODNote how these symbols all reference PTP or timestamping in their name; this is a clue that they depend on PTP_1588_CLOCK.
Change them from imply PTP_1588_CLOCK [2] to depends on PTP_1588_CLOCK. I'm not using select PTP_1588_CLOCK here because PTP_1588_CLOCK has its own dependencies, which select would not transitively apply.
Additionally, remove the select NET_PTP_CLASSIFY from CPTS_TI_MOD; PTP_1588_CLOCK already selects that.
[1]: https://lore.kernel.org/lkml/[email protected]/
[2]: NET_DSA_SJA1105_PTP had never declared any type of dependency on PTP_1588_CLOCK (imply or otherwise); adding a depends on PTP_1588_CLOCK here seems appropriate.
--- drivers/net/dsa/mv88e6xxx/Kconfig | 2 +- drivers/net/dsa/sja1105/Kconfig | 1 + drivers/net/ethernet/cadence/Kconfig | 2 +- drivers/net/ethernet/cavium/Kconfig | 2 +- drivers/net/ethernet/ti/Kconfig | 3 +-- 5 files changed, 5 insertions(+), 5 deletions(-)
drivers/net/dsa/mv88e6xxx/Kconfig +1 -1
@@ -24,8 +24,8 @@ config NET_DSA_MV88E6XXX_PTP bool "PTP support for Marvell 88E6xxx" default n depends on NET_DSA_MV88E6XXX_GLOBAL2 + depends on PTP_1588_CLOCK imply NETWORK_PHY_TIMESTAMPING - imply PTP_1588_CLOCK help Say Y to enable PTP hardware timestamping on Marvell 88E6xxx switch chips that support it.
drivers/net/dsa/sja1105/Kconfig +1 -0
@@ -20,6 +20,7 @@ tristate "NXP SJA1105 Ethernet switch family support" config NET_DSA_SJA1105_PTP bool "Support for the PTP clock on the NXP SJA1105 Ethernet switch" depends on NET_DSA_SJA1105 + depends on PTP_1588_CLOCK help This enables support for timestamping and PTP clock manipulations in the SJA1105 DSA driver.
drivers/net/ethernet/cadence/Kconfig +1 -1
@@ -35,8 +35,8 @@ config MACB config MACB_USE_HWSTAMP bool "Use IEEE 1588 hwstamp" depends on MACB + depends on PTP_1588_CLOCK default y - imply PTP_1588_CLOCK ---help--- Enable IEEE 1588 Precision Time Protocol (PTP) support for MACB.
drivers/net/ethernet/cavium/Kconfig +1 -1
@@ -54,7 +54,7 @@ config THUNDER_NIC_RGX config CAVIUM_PTP tristate "Cavium PTP coprocessor as PTP clock" depends on 64BIT && PCI - imply PTP_1588_CLOCK + depends on PTP_1588_CLOCK ---help--- This driver adds support for the Precision Time Protocol Clocks and Timestamping coprocessor (PTP) found on Cavium processors.
drivers/net/ethernet/ti/Kconfig +1 -2
@@ -89,9 +89,8 @@ config TI_CPTS config TI_CPTS_MOD tristate depends on TI_CPTS + depends on PTP_1588_CLOCK default y if TI_CPSW=y || TI_KEYSTONE_NETCP=y || TI_CPSW_SWITCHDEV=y - select NET_PTP_CLASSIFY - imply PTP_1588_CLOCK default m config TI_KEYSTONE_NETCP
Signature · 1 line
2.20.1
Re: [PATCH 5.6 019/194] net: Make PTP-specific drivers depend on PTP_1588_CLOCK
Hi Greg,
Quoted 64 lines · Greg Kroah-Hartman
From: Clay McClure <[email protected]>
[ Upstream commit
b6d49cab44b567b3e0a5544b3d61e516a7355fad]Commit
d1cbfd771ce8("ptp_clock: Allow for it to be optional") changed all PTP-capable Ethernet drivers fromselect PTP_1588_CLOCKtoimply PTP_1588_CLOCK, "in order to break the hard dependency between the PTP clock subsystem and ethernet drivers capable of being clock providers." As a result it is possible to build PTP-capable Ethernet drivers without the PTP subsystem by deselectingPTP_1588_CLOCK. Drivers are required to handle the missing dependency gracefully.Some PTP-capable Ethernet drivers (e.g.,
TI_CPSW) factor their PTP code out into separate drivers (e.g.,TI_CPTS_MOD). The above commit also changed these PTP-specific drivers toimply PTP_1588_CLOCK, making it possible to build them without the PTP subsystem. But as Grygorii Strashko noted in [1]:Quoted 3 lines · Grygorii Strashko
Another question is that CPTS completely nonfunctional in this case and it was never expected that somebody will even try to use/run such configuration (except for random build purposes).
In my view, enabling a PTP-specific driver without the PTP subsystem is a configuration error made possible by the above commit.
Kconfigshould not allow users to create a configuration with missing dependencies that results in "completely nonfunctional" drivers.I audited all network drivers that call
ptp_clock_register()but merelyimply PTP_1588_CLOCKand found five PTP-specific drivers that are likely nonfunctional withoutPTP_1588_CLOCK:NET_DSA_MV88E6XXX_PTP NET_DSA_SJA1105_PTP MACB_USE_HWSTAMP CAVIUM_PTP TI_CPTS_MODNote how these symbols all reference PTP or timestamping in their name; this is a clue that they depend on
PTP_1588_CLOCK.Change them from
imply PTP_1588_CLOCK[2] todepends on PTP_1588_CLOCK. I'm not usingselect PTP_1588_CLOCKhere becausePTP_1588_CLOCKhas its own dependencies, whichselectwould not transitively apply.Additionally, remove the
select NET_PTP_CLASSIFYfromCPTS_TI_MOD;PTP_1588_CLOCKalready selects that.[1]: https://lore.kernel.org/lkml/[email protected]/
[2]:
NET_DSA_SJA1105_PTPhad never declared any type of dependency onPTP_1588_CLOCK(implyor otherwise); adding adepends on PTP_1588_CLOCKhere seems appropriate.Cc Arnd Bergmann <[email protected]>Cc Richard Cochran <[email protected]>Cc Nicolas Pitre <[email protected]>Cc Grygorii Strashko <[email protected]>Cc Geert Uytterhoeven <[email protected]>Fixes d1cbfd771ce8 ("ptp_clock: Allow for it to be optional")Signed-off-by Clay McClure <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Sasha Levin <[email protected]>
Quoted 1 line
---
Could you drop this patch, pls?
it's not for stable and can cause build failures.
Signature · 2 lines
Best regards, grygorii
Sasha Levin
maintainerRe: [PATCH 5.6 019/194] net: Make PTP-specific drivers depend on PTP_1588_CLOCK
Quoted 69 lines · Grygorii Strashko
Hi Greg,
Quoted 64 lines · Greg Kroah-Hartman
From: Clay McClure <[email protected]>
[ Upstream commit
b6d49cab44b567b3e0a5544b3d61e516a7355fad]Commit
d1cbfd771ce8("ptp_clock: Allow for it to be optional") changed all PTP-capable Ethernet drivers fromselect PTP_1588_CLOCKtoimply PTP_1588_CLOCK, "in order to break the hard dependency between the PTP clock subsystem and ethernet drivers capable of being clock providers." As a result it is possible to build PTP-capable Ethernet drivers without the PTP subsystem by deselectingPTP_1588_CLOCK. Drivers are required to handle the missing dependency gracefully.Some PTP-capable Ethernet drivers (e.g.,
TI_CPSW) factor their PTP code out into separate drivers (e.g.,TI_CPTS_MOD). The above commit also changed these PTP-specific drivers toimply PTP_1588_CLOCK, making it possible to build them without the PTP subsystem. But as Grygorii Strashko noted in [1]:Quoted 3 lines · Grygorii Strashko
Another question is that CPTS completely nonfunctional in this case and it was never expected that somebody will even try to use/run such configuration (except for random build purposes).
In my view, enabling a PTP-specific driver without the PTP subsystem is a configuration error made possible by the above commit.
Kconfigshould not allow users to create a configuration with missing dependencies that results in "completely nonfunctional" drivers.I audited all network drivers that call
ptp_clock_register()but merelyimply PTP_1588_CLOCKand found five PTP-specific drivers that are likely nonfunctional withoutPTP_1588_CLOCK:NET_DSA_MV88E6XXX_PTP NET_DSA_SJA1105_PTP MACB_USE_HWSTAMP CAVIUM_PTP TI_CPTS_MODNote how these symbols all reference PTP or timestamping in their name; this is a clue that they depend on
PTP_1588_CLOCK.Change them from
imply PTP_1588_CLOCK[2] todepends on PTP_1588_CLOCK. I'm not usingselect PTP_1588_CLOCKhere becausePTP_1588_CLOCKhas its own dependencies, whichselectwould not transitively apply.Additionally, remove the
select NET_PTP_CLASSIFYfromCPTS_TI_MOD;PTP_1588_CLOCKalready selects that.[1]: https://lore.kernel.org/lkml/[email protected]/
[2]:
NET_DSA_SJA1105_PTPhad never declared any type of dependency onPTP_1588_CLOCK(implyor otherwise); adding adepends on PTP_1588_CLOCKhere seems appropriate.Cc Arnd Bergmann <[email protected]>Cc Richard Cochran <[email protected]>Cc Nicolas Pitre <[email protected]>Cc Grygorii Strashko <[email protected]>Cc Geert Uytterhoeven <[email protected]>Fixes d1cbfd771ce8 ("ptp_clock: Allow for it to be optional")Signed-off-by Clay McClure <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Sasha Levin <[email protected]>Quoted 1 line
---
Quoted 2 lines
Could you drop this patch, pls?
it's not for stable and can cause build failures.
My bad - now dropped. Sorry!
Signature · 2 lines
Thanks, Sasha
Greg Kroah-Hartman
maintainerPATCH 20/194 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 21/194 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
@@ -32,6 +32,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. */
@@ -43,6 +52,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;
@@ -294,10 +310,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 )) {
@@ -313,11 +374,15 @@ 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 = { .owner =THIS_MODULE , + .open = virtblk_open, + .release = virtblk_release, .getgeo = virtblk_getgeo, };
@@ -657,6 +722,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;
@@ -822,8 +891,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);
@@ -833,18 +900,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 22/194 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
@@ -719,7 +719,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 23/194 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 24/194 net: stmmac: gmac5+: fix potential integer overflow on 32 bit multiply
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 44d95cc6b10ff7439d45839c96c581cb4368c088 ]
The multiplication of cfg->ctr[1] by 1000000000 is performed using a 32 bit multiplication (since cfg->ctr[1] is a u32) and this can lead to a potential overflow. Fix this by making the constant a ULL to ensure a 64 bit multiply occurs.
Addresses-Coverity: ("Unintentional integer overflow")
--- drivers/net/ethernet/stmicro/stmmac/dwmac5.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/dwmac5.c +1 -1
@@ -624,7 +624,7 @@ int dwmac5_est_configure(void __iomem *ioaddr, struct stmmac_est *cfg, total_offset += offset; } - total_ctr = cfg->ctr[0 ] + cfg->ctr[1 ] *1000000000 ; + total_ctr = cfg->ctr[0 ] + cfg->ctr[1 ] *1000000000ULL ; total_ctr += total_offset; ctr_low =do_div (total_ctr,1000000000 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 25/194 iommu/amd: Fix race in increase_address_space()/fetch_pte()
In reply to Greg Kroah-HartmanFrom: Joerg Roedel <[email protected]>
[ Upstream commit eb791aa70b90c559eeb371d807c8813d569393f0 ]
The 'pt_root' and 'mode' struct members of 'struct protection_domain' need to be get/set atomically, otherwise the page-table of the domain can get corrupted.
Merge the fields into one atomic64_t struct member which can be get/set atomically.
--- drivers/iommu/amd_iommu.c | 140 ++++++++++++++++++++++++-------- drivers/iommu/amd_iommu_types.h | 9 +- 2 files changed, 112 insertions(+), 37 deletions(-)
drivers/iommu/amd_iommu.c +105 -35
@@ -151,6 +151,26 @@ static struct protection_domain *to_pdomain(struct iommu_domain *dom) return container_of(dom, struct protection_domain, domain); } +static void amd_iommu_domain_get_pgtable (struct protection_domain *domain, +struct domain_pgtable *pgtable) +{ +u64 pt_root =atomic64_read (&domain->pt_root); + + pgtable->root = (u64 *)(pt_root &PAGE_MASK ); + pgtable->mode = pt_root &7 ;/* lowest 3 bits encode pgtable mode */ +} + +static u64 amd_iommu_domain_encode_pgtable (u64 *root,int mode) +{ +u64 pt_root; + +/* lowest 3 bits encode pgtable mode */ + pt_root = mode &7 ; + pt_root |= (u64 )root; + +return pt_root; +} +static struct iommu_dev_data *alloc_dev_data (u16 devid) {struct iommu_dev_data *dev_data;
@@ -1397,13 +1417,18 @@ static struct page *free_sub_pt(unsigned long root, int mode,static void free_pagetable (struct protection_domain *domain) { -unsigned long root = (unsigned long )domain->pt_root; +struct domain_pgtable pgtable;struct page *freelist =NULL ; +unsigned long root; + +amd_iommu_domain_get_pgtable (domain, &pgtable); +atomic64_set (&domain->pt_root,0 ); -BUG_ON (domain->mode <PAGE_MODE_NONE || - domain->mode >PAGE_MODE_6_LEVEL ); +BUG_ON (pgtable.mode <PAGE_MODE_NONE || + pgtable.mode >PAGE_MODE_6_LEVEL ); - freelist =free_sub_pt (root, domain->mode, freelist); + root = (unsigned long )pgtable.root; + freelist =free_sub_pt (root, pgtable.mode, freelist);free_page_list (freelist); }
@@ -1417,24 +1442,28 @@ static bool increase_address_space(struct protection_domain *domain, unsigned long address, gfp_t gfp) { +struct domain_pgtable pgtable;unsigned long flags;bool ret = false; -u64 *pte; +u64 *pte, root;spin_lock_irqsave (&domain->lock, flags); -if (address <=PM_LEVEL_SIZE (domain->mode) || -WARN_ON_ONCE (domain->mode ==PAGE_MODE_6_LEVEL )) +amd_iommu_domain_get_pgtable (domain, &pgtable); + +if (address <=PM_LEVEL_SIZE (pgtable.mode) || +WARN_ON_ONCE (pgtable.mode ==PAGE_MODE_6_LEVEL )) goto out; pte = (void *)get_zeroed_page (gfp);if (!pte) goto out; - *pte =PM_LEVEL_PDE (domain->mode, -iommu_virt_to_phys (domain->pt_root)); - domain->pt_root = pte; - domain->mode +=1 ; + *pte =PM_LEVEL_PDE (pgtable.mode,iommu_virt_to_phys (pgtable.root)); + + root =amd_iommu_domain_encode_pgtable (pte, pgtable.mode +1 ); + +atomic64_set (&domain->pt_root, root); ret = true;
@@ -1451,16 +1480,22 @@ static u64 *alloc_pte(struct protection_domain *domain,gfp_t gfp, bool *updated) { + struct domain_pgtable pgtable;int level, end_lvl;u64 *pte, *page;BUG_ON (!is_power_of_2 (page_size)); -while (address >PM_LEVEL_SIZE (domain->mode)) +amd_iommu_domain_get_pgtable (domain, &pgtable); + +while (address >PM_LEVEL_SIZE (pgtable.mode)) { *updated =increase_address_space (domain, address, gfp) || *updated; +amd_iommu_domain_get_pgtable (domain, &pgtable); + } + - level = domain->mode -1 ; - pte = &domain->pt_root[PM_LEVEL_INDEX (level, address)]; + level = pgtable.mode -1 ; + pte = &pgtable.root[PM_LEVEL_INDEX (level, address)]; address =PAGE_SIZE_ALIGN (address, page_size); end_lvl =PAGE_SIZE_LEVEL (page_size);
@@ -1536,16 +1571,19 @@ static u64 *fetch_pte(struct protection_domain *domain,unsigned long address, unsigned long *page_size) { + struct domain_pgtable pgtable;int level;u64 *pte; *page_size =0 ; -if (address >PM_LEVEL_SIZE (domain->mode)) +amd_iommu_domain_get_pgtable (domain, &pgtable); + +if (address >PM_LEVEL_SIZE (pgtable.mode))return NULL ; - level = domain->mode -1 ; - pte = &domain->pt_root[PM_LEVEL_INDEX (level, address)]; + level = pgtable.mode -1 ; + pte = &pgtable.root[PM_LEVEL_INDEX (level, address)]; *page_size =PTE_LEVEL_PAGE_SIZE (level);while (level >0 ) {
@@ -1806,6 +1844,7 @@ static void dma_ops_domain_free(struct protection_domain *domain)static struct protection_domain *dma_ops_domain_alloc (void ) {struct protection_domain *domain; +u64 *pt_root, root; domain =kzalloc (sizeof (struct protection_domain ),GFP_KERNEL );if (!domain)
@@ -1814,12 +1853,14 @@ static struct protection_domain *dma_ops_domain_alloc(void)if (protection_domain_init (domain)) goto free_domain; - domain->mode =PAGE_MODE_3_LEVEL ; - domain->pt_root = (void *)get_zeroed_page (GFP_KERNEL ); - domain->flags =PD_DMA_OPS_MASK ; -if (!domain->pt_root) + pt_root = (void *)get_zeroed_page (GFP_KERNEL ); +if (!pt_root) goto free_domain; + root =amd_iommu_domain_encode_pgtable (pt_root,PAGE_MODE_3_LEVEL ); +atomic64_set (&domain->pt_root, root); + domain->flags =PD_DMA_OPS_MASK ; +if (iommu_get_dma_cookie (&domain->domain) == -ENOMEM ) goto free_domain;
@@ -1843,14 +1884,17 @@ static bool dma_ops_domain(struct protection_domain *domain)static void set_dte_entry (u16 devid,struct protection_domain *domain,bool ats,bool ppr) { +struct domain_pgtable pgtable;u64 pte_root =0 ;u64 flags =0 ;u32 old_domid; -if (domain->mode !=PAGE_MODE_NONE ) - pte_root =iommu_virt_to_phys (domain->pt_root); +amd_iommu_domain_get_pgtable (domain, &pgtable); + +if (pgtable.mode !=PAGE_MODE_NONE ) + pte_root =iommu_virt_to_phys (pgtable.root); - pte_root |= (domain->mode &DEV_ENTRY_MODE_MASK ) + pte_root |= (pgtable.mode &DEV_ENTRY_MODE_MASK ) <<DEV_ENTRY_MODE_SHIFT ; pte_root |=DTE_FLAG_IR |DTE_FLAG_IW |DTE_FLAG_V |DTE_FLAG_TV ;
@@ -2375,6 +2419,7 @@ static struct protection_domain *protection_domain_alloc(void)static struct iommu_domain *amd_iommu_domain_alloc (unsigned type) {struct protection_domain *pdomain; +u64 *pt_root, root;switch (type) {case IOMMU_DOMAIN_UNMANAGED :
@@ -2382,13 +2427,15 @@ static struct iommu_domain *amd_iommu_domain_alloc(unsigned type)if (!pdomain)return NULL ; - pdomain->mode =PAGE_MODE_3_LEVEL ; - pdomain->pt_root = (void *)get_zeroed_page (GFP_KERNEL ); -if (!pdomain->pt_root) { + pt_root = (void *)get_zeroed_page (GFP_KERNEL ); +if (!pt_root) {protection_domain_free (pdomain);return NULL ; } + root =amd_iommu_domain_encode_pgtable (pt_root,PAGE_MODE_3_LEVEL ); +atomic64_set (&pdomain->pt_root, root); + pdomain->domain.geometry.aperture_start =0 ; pdomain->domain.geometry.aperture_end = ~0ULL ; pdomain->domain.geometry.force_aperture = true;
@@ -2406,7 +2453,7 @@ static struct iommu_domain *amd_iommu_domain_alloc(unsigned type)if (!pdomain)return NULL ; - pdomain->mode =PAGE_MODE_NONE ; +atomic64_set (&pdomain->pt_root,PAGE_MODE_NONE );break ;default :return NULL ;
@@ -2418,6 +2465,7 @@ static struct iommu_domain *amd_iommu_domain_alloc(unsigned type)static void amd_iommu_domain_free (struct iommu_domain *dom) {struct protection_domain *domain; +struct domain_pgtable pgtable; domain =to_pdomain (dom);
@@ -2435,7 +2483,9 @@ static void amd_iommu_domain_free(struct iommu_domain *dom)dma_ops_domain_free (domain);break ;default : -if (domain->mode !=PAGE_MODE_NONE ) +amd_iommu_domain_get_pgtable (domain, &pgtable); + +if (pgtable.mode !=PAGE_MODE_NONE )free_pagetable (domain);if (domain->flags &PD_IOMMUV2_MASK )
@@ -2518,10 +2568,12 @@ static int amd_iommu_map(struct iommu_domain *dom, unsigned long iova, gfp_t gfp) {struct protection_domain *domain =to_pdomain (dom); +struct domain_pgtable pgtable;int prot =0 ;int ret; -if (domain->mode ==PAGE_MODE_NONE ) +amd_iommu_domain_get_pgtable (domain, &pgtable); +if (pgtable.mode ==PAGE_MODE_NONE )return -EINVAL ;if (iommu_prot &IOMMU_READ )
@@ -2541,8 +2593,10 @@ static size_t amd_iommu_unmap(struct iommu_domain *dom, unsigned long iova, struct iommu_iotlb_gather *gather) {struct protection_domain *domain =to_pdomain (dom); +struct domain_pgtable pgtable; -if (domain->mode ==PAGE_MODE_NONE ) +amd_iommu_domain_get_pgtable (domain, &pgtable); +if (pgtable.mode ==PAGE_MODE_NONE )return 0 ;return iommu_unmap_page (domain, iova, page_size);
@@ -2553,9 +2607,11 @@ static phys_addr_t amd_iommu_iova_to_phys(struct iommu_domain *dom, {struct protection_domain *domain =to_pdomain (dom);unsigned long offset_mask, pte_pgsize; +struct domain_pgtable pgtable;u64 *pte, __pte; -if (domain->mode ==PAGE_MODE_NONE ) +amd_iommu_domain_get_pgtable (domain, &pgtable); +if (pgtable.mode ==PAGE_MODE_NONE )return iova; pte =fetch_pte (domain, iova, &pte_pgsize);
@@ -2708,16 +2764,26 @@ EXPORT_SYMBOL(amd_iommu_unregister_ppr_notifier);void amd_iommu_domain_direct_map (struct iommu_domain *dom) {struct protection_domain *domain =to_pdomain (dom); +struct domain_pgtable pgtable;unsigned long flags; +u64 pt_root;spin_lock_irqsave (&domain->lock, flags); +/* First save pgtable configuration*/ +amd_iommu_domain_get_pgtable (domain, &pgtable); +/* Update data structure */ - domain->mode =PAGE_MODE_NONE ; + pt_root =amd_iommu_domain_encode_pgtable (NULL ,PAGE_MODE_NONE ); +atomic64_set (&domain->pt_root, pt_root);/* Make changes visible to IOMMUs */ update_domain (domain); +/* Restore old pgtable in domain->ptroot to free page-table */ + pt_root =amd_iommu_domain_encode_pgtable (pgtable.root, pgtable.mode); +atomic64_set (&domain->pt_root, pt_root); +/* Page-table is not visible to IOMMU anymore, so free it */ free_pagetable (domain);
@@ -2908,9 +2974,11 @@ static u64 *__get_gcr3_pte(u64 *root, int level, int pasid, bool alloc)static int __set_gcr3 (struct protection_domain *domain,int pasid,unsigned long cr3) { +struct domain_pgtable pgtable;u64 *pte; -if (domain->mode !=PAGE_MODE_NONE ) +amd_iommu_domain_get_pgtable (domain, &pgtable); +if (pgtable.mode !=PAGE_MODE_NONE )return -EINVAL ; pte =__get_gcr3_pte (domain->gcr3_tbl, domain->glx, pasid, true);
@@ -2924,9 +2992,11 @@ static int __set_gcr3(struct protection_domain *domain, int pasid,static int __clear_gcr3 (struct protection_domain *domain,int pasid) { +struct domain_pgtable pgtable;u64 *pte; -if (domain->mode !=PAGE_MODE_NONE ) +amd_iommu_domain_get_pgtable (domain, &pgtable); +if (pgtable.mode !=PAGE_MODE_NONE )return -EINVAL ; pte =__get_gcr3_pte (domain->gcr3_tbl, domain->glx, pasid, false);
drivers/iommu/amd_iommu_types.h +7 -2
@@ -468,8 +468,7 @@ struct protection_domain {iommu core code */ spinlock_t lock;/* mostly used to lock the page table*/ u16 id;/* the domain id written to the device table */ -int mode;/* paging mode (0-6 levels) */ -u64 *pt_root;/* page table root pointer */ +atomic64_t pt_root;/* pgtable root and pgtable mode */ int glx;/* Number of levels for GCR3 table */ u64 *gcr3_tbl;/* Guest CR3 table */ unsigned long flags;/* flags to find out type of domain */
@@ -477,6 +476,12 @@ struct protection_domain {unsigned dev_iommu[MAX_IOMMUS ];/* per-IOMMU reference count */ }; +/* For decocded pt_root */ +struct domain_pgtable { +int mode; +u64 *root; +}; +/* * Structure where we save information about one hardware AMD IOMMU in the * system.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 26/194 iommu/amd: Update Device Table in increase_address_space()
In reply to Greg Kroah-HartmanFrom: Joerg Roedel <[email protected]>
[ Upstream commit 19c6978fba68a2cdedee7d55fb8c3063d47982d9 ]
The Device Table needs to be updated before the new page-table root can be published in domain->pt_root. Otherwise a concurrent call to fetch_pte might fetch a PTE which is not reachable through the Device Table Entry.
--- drivers/iommu/amd_iommu.c | 49 ++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 13 deletions(-)
drivers/iommu/amd_iommu.c +36 -13
@@ -101,6 +101,8 @@ struct kmem_cache *amd_iommu_irq_cache;static void update_domain (struct protection_domain *domain);static int protection_domain_init (struct protection_domain *domain);static void detach_device (struct device *dev); +static void update_and_flush_device_table (struct protection_domain *domain, +struct domain_pgtable *pgtable);/**************************************************************************** *
@@ -1461,8 +1463,16 @@ static bool increase_address_space(struct protection_domain *domain, *pte =PM_LEVEL_PDE (pgtable.mode,iommu_virt_to_phys (pgtable.root)); - root =amd_iommu_domain_encode_pgtable (pte, pgtable.mode +1 ); + pgtable.root = pte; + pgtable.mode +=1 ; +update_and_flush_device_table (domain, &pgtable); +domain_flush_complete (domain); +/* +* Device Table needs to be updated and flushed before the new root can +* be published. +*/ + root =amd_iommu_domain_encode_pgtable (pte, pgtable.mode);atomic64_set (&domain->pt_root, root); ret = true;
@@ -1882,19 +1892,17 @@ static bool dma_ops_domain(struct protection_domain *domain) }static void set_dte_entry (u16 devid,struct protection_domain *domain, +struct domain_pgtable *pgtable,bool ats,bool ppr) { -struct domain_pgtable pgtable;u64 pte_root =0 ;u64 flags =0 ;u32 old_domid; -amd_iommu_domain_get_pgtable (domain, &pgtable); +if (pgtable->mode !=PAGE_MODE_NONE ) + pte_root =iommu_virt_to_phys (pgtable->root); -if (pgtable.mode !=PAGE_MODE_NONE ) - pte_root =iommu_virt_to_phys (pgtable.root); - - pte_root |= (pgtable.mode &DEV_ENTRY_MODE_MASK ) + pte_root |= (pgtable->mode &DEV_ENTRY_MODE_MASK ) <<DEV_ENTRY_MODE_SHIFT ; pte_root |=DTE_FLAG_IR |DTE_FLAG_IW |DTE_FLAG_V |DTE_FLAG_TV ;
@@ -1967,6 +1975,7 @@ static void clear_dte_entry(u16 devid)static void do_attach (struct iommu_dev_data *dev_data,struct protection_domain *domain) { +struct domain_pgtable pgtable;struct amd_iommu *iommu;bool ats;
@@ -1982,7 +1991,9 @@ static void do_attach(struct iommu_dev_data *dev_data, domain->dev_cnt +=1 ;/* Update device table */ -set_dte_entry (dev_data->devid, domain, ats, dev_data->iommu_v2); +amd_iommu_domain_get_pgtable (domain, &pgtable); +set_dte_entry (dev_data->devid, domain, &pgtable, + ats, dev_data->iommu_v2);clone_aliases (dev_data->pdev);device_flush_dte (dev_data);
@@ -2293,22 +2304,34 @@ static int amd_iommu_domain_get_attr(struct iommu_domain *domain,* *****************************************************************************/ -static void update_device_table (struct protection_domain *domain) +static void update_device_table (struct protection_domain *domain, +struct domain_pgtable *pgtable) {struct iommu_dev_data *dev_data;list_for_each_entry (dev_data, &domain->dev_list, list) { -set_dte_entry (dev_data->devid, domain, dev_data->ats.enabled, - dev_data->iommu_v2); +set_dte_entry (dev_data->devid, domain, pgtable, + dev_data->ats.enabled, dev_data->iommu_v2);clone_aliases (dev_data->pdev); } } +static void update_and_flush_device_table (struct protection_domain *domain, +struct domain_pgtable *pgtable) +{ +update_device_table (domain, pgtable); +domain_flush_devices (domain); +} +static void update_domain (struct protection_domain *domain) { -update_device_table (domain); +struct domain_pgtable pgtable; -domain_flush_devices (domain); +/* Update device table */ +amd_iommu_domain_get_pgtable (domain, &pgtable); +update_and_flush_device_table (domain, &pgtable); + +/* Flush domain TLB(s) and wait for completion */ domain_flush_tlb_pde (domain); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 27/194 net: dsa: ocelot: the MAC table on Felix is twice as large
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 21ce7f3e16fbf89faaf149cfe0f730edfc553914 ]
When running 'bridge fdb dump' on Felix, sometimes learnt and static MAC addresses would appear, sometimes they wouldn't.
Turns out, the MAC table has 4096 entries on VSC7514 (Ocelot) and 8192 entries on VSC9959 (Felix), so the existing code from the Ocelot common library only dumped half of Felix's MAC table. They are both organized as a 4-way set-associative TCAM, so we just need a single variable indicating the correct number of rows.
--- drivers/net/dsa/ocelot/felix.c | 1 + drivers/net/dsa/ocelot/felix.h | 1 + drivers/net/dsa/ocelot/felix_vsc9959.c | 1 + drivers/net/ethernet/mscc/ocelot.c | 6 ++---- drivers/net/ethernet/mscc/ocelot_regs.c | 1 + include/soc/mscc/ocelot.h | 1 + 6 files changed, 7 insertions(+), 4 deletions(-)
drivers/net/dsa/ocelot/felix.c +1 -0
@@ -397,6 +397,7 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports) ocelot->stats_layout = felix->info->stats_layout; ocelot->num_stats = felix->info->num_stats; ocelot->shared_queue_sz = felix->info->shared_queue_sz; + ocelot->num_mact_rows = felix->info->num_mact_rows; ocelot->ops = felix->info->ops; port_phy_modes = kcalloc(num_phys_ports, sizeof(phy_interface_t),
drivers/net/dsa/ocelot/felix.h +1 -0
@@ -15,6 +15,7 @@ struct felix_info {const u32 *const *map;const struct ocelot_ops *ops;int shared_queue_sz; +int num_mact_rows;const struct ocelot_stat_layout *stats_layout;unsigned int num_stats;int num_ports;
drivers/net/dsa/ocelot/felix_vsc9959.c +1 -0
@@ -1090,6 +1090,7 @@ struct felix_info felix_info_vsc9959 = { .stats_layout = vsc9959_stats_layout, .num_stats = ARRAY_SIZE(vsc9959_stats_layout), .shared_queue_sz = 128 * 1024, + .num_mact_rows = 2048, .num_ports = 6, .switch_pci_bar = 4, .imdio_pci_bar = 0,
drivers/net/ethernet/mscc/ocelot.c +2 -4
@@ -1016,10 +1016,8 @@ int ocelot_fdb_dump(struct ocelot *ocelot, int port, {int i, j; -/* Loop through all the mac tables entries. There are 1024 rows of 4 -* entries. -*/ -for (i =0 ; i <1024 ; i++) { +/* Loop through all the mac tables entries. */ +for (i =0 ; i < ocelot->num_mact_rows; i++) {for (j =0 ; j <4 ; j++) {struct ocelot_mact_entry entry;bool is_static;
drivers/net/ethernet/mscc/ocelot_regs.c +1 -0
@@ -431,6 +431,7 @@ int ocelot_chip_init(struct ocelot *ocelot, const struct ocelot_ops *ops) ocelot->stats_layout = ocelot_stats_layout; ocelot->num_stats =ARRAY_SIZE (ocelot_stats_layout); ocelot->shared_queue_sz =224 *1024 ; + ocelot->num_mact_rows =1024 ; ocelot->ops = ops; ret =ocelot_regfields_init (ocelot, ocelot_regfields);
include/soc/mscc/ocelot.h +1 -0
@@ -437,6 +437,7 @@ struct ocelot {unsigned int num_stats;int shared_queue_sz; +int num_mact_rows;struct net_device *hw_bridge_dev;u16 bridge_mask;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 28/194 net: mscc: ocelot: ANA_AUTOAGE_AGE_PERIOD holds a value in seconds, not ms
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit c0d7eccbc76115b7eb337956c03d47d6a889cf8c ]
One may notice that automatically-learnt entries 'never' expire, even though the bridge configures the address age period at 300 seconds.
Actually the value written to hardware corresponds to a time interval 1000 times higher than intended, i.e. 83 hours.
--- drivers/net/ethernet/mscc/ocelot.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/net/ethernet/mscc/ocelot.c +9 -2
@@ -1444,8 +1444,15 @@ static void ocelot_port_attr_stp_state_svoid ocelot_set_ageing_time (struct ocelot *ocelot,unsigned int msecs) { -ocelot_write (ocelot,ANA_AUTOAGE_AGE_PERIOD (msecs /2 ), -ANA_AUTOAGE ); +unsigned int age_period =ANA_AUTOAGE_AGE_PERIOD (msecs /2000 ); + +/* Setting AGE_PERIOD to zero effectively disables automatic aging, +* which is clearly not what our intention is. So avoid that. +*/ +if (!age_period) + age_period =1 ; + +ocelot_rmw (ocelot, age_period,ANA_AUTOAGE_AGE_PERIOD_M ,ANA_AUTOAGE ); }EXPORT_SYMBOL (ocelot_set_ageing_time);
Greg Kroah-Hartman
maintainerPATCH 29/194 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
@@ -605,10 +605,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 30/194 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 ); }
@@ -335,7 +335,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);
@@ -374,7 +374,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);
@@ -393,13 +393,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 );
@@ -974,7 +974,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;
@@ -984,7 +984,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); }
@@ -1715,7 +1715,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) {
@@ -2457,6 +2457,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;
@@ -3121,7 +3126,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
@@ -382,6 +382,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 31/194 mptcp: set correct vfs info for subflows
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 7d14b0d2b9b317cfc14161143e2006b95a5da9b1 ]
When a subflow is created via mptcp_subflow_create_socket(), a new 'struct socket' is allocated, with a new i_ino value.
When inspecting TCP sockets via the procfs and or the diag interface, the above ones are not related to the process owning the MPTCP master socket, even if they are a logical part of it ('ss -p' shows an empty process field)
Additionally, subflows created by the path manager get the uid/gid from the running workqueue.
Subflows are part of the owning MPTCP master socket, let's adjust the vfs info to reflect this.
After this patch, 'ss' correctly displays subflows as belonging to the msk socket creator.
--- net/mptcp/subflow.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
net/mptcp/subflow.c +10 -0
@@ -633,6 +633,16 @@ int mptcp_subflow_create_socket(struct sif (err)return err; +/* the newly created socket really belongs to the owning MPTCP master +* socket, even if for additional subflows the allocation is performed +* by a kernel workqueue. Adjust inode references, so that the +* procfs/diag interaces really show this one belonging to the correct +* user. +*/ +SOCK_INODE (sf)->i_ino =SOCK_INODE (sk->sk_socket)->i_ino; +SOCK_INODE (sf)->i_uid =SOCK_INODE (sk->sk_socket)->i_uid; +SOCK_INODE (sf)->i_gid =SOCK_INODE (sk->sk_socket)->i_gid; + subflow =mptcp_subflow_ctx (sf->sk);pr_debug ("subflow=%p" , subflow);
Greg Kroah-Hartman
maintainerPATCH 32/194 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
@@ -8890,11 +8890,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 33/194 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 34/194 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
@@ -1132,9 +1132,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 35/194 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 36/194 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
@@ -490,6 +490,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 37/194 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
@@ -2725,8 +2725,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 38/194 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
@@ -1756,10 +1756,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 39/194 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
@@ -1421,6 +1421,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
@@ -476,9 +476,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
@@ -4761,7 +4761,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 40/194 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 41/194 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
@@ -625,7 +625,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 42/194 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 43/194 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
@@ -360,6 +360,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 44/194 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
@@ -915,7 +915,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 45/194 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->id;
Greg Kroah-Hartman
maintainerPATCH 46/194 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
@@ -2163,13 +2163,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 47/194 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 48/194 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
@@ -2127,6 +2127,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 49/194 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 50/194 net: broadcom: Select BROADCOM_PHY for BCMGENET
In reply to Greg Kroah-HartmanFrom: Florian Fainelli <[email protected]>
[ Upstream commit 99addbe31f5524494f4d7077bcb3f6fa64c5d160 ]
The GENET controller on the Raspberry Pi 4 (2711) is typically interfaced with an external Broadcom PHY via a RGMII electrical interface. To make sure that delays are properly configured at the PHY side, ensure that we the dedicated Broadcom PHY driver (CONFIG_BROADCOM_PHY) is enabled for this to happen.
--- drivers/net/ethernet/broadcom/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/broadcom/Kconfig +1 -0
@@ -69,6 +69,7 @@ config BCMGENET select BCM7XXX_PHY select MDIO_BCM_UNIMAC select DIMLIB + select BROADCOM_PHY if ARCH_BCM2835 help This driver supports the built-in Ethernet MACs found in the Broadcom BCM7xxx Set Top Box family chipset.
Greg Kroah-Hartman
maintainerPATCH 51/194 dmaengine: xilinx_dma: Add missing check for empty list
In reply to Greg Kroah-HartmanFrom: Sebastian von Ohr <[email protected]>
[ Upstream commit b269426011bcfd97b7c3101abfe1a99147b6f40b ]
The DMA transfer might finish just after checking the state with dma_cookie_status, but before the lock is acquired. Not checking for an empty list in xilinx_dma_tx_status may result in reading random data or data corruption when desc is written to. This can be reliably triggered by using dma_sync_wait to wait for DMA completion.
--- drivers/dma/xilinx/xilinx_dma.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
drivers/dma/xilinx/xilinx_dma.c +10 -10
@@ -1229,16 +1229,16 @@ static enum dma_status xilinx_dma_tx_status(struct dma_chan *dchan,return ret;spin_lock_irqsave (&chan->lock, flags); - - desc =list_last_entry (&chan->active_list, - struct xilinx_dma_tx_descriptor, node); -/* -* VDMA and simple mode do not support residue reporting, so the -* residue field will always be 0. -*/ -if (chan->has_sg && chan->xdev->dma_config->dmatype !=XDMA_TYPE_VDMA ) - residue =xilinx_dma_get_residue (chan, desc); - +if (!list_empty (&chan->active_list)) { + desc =list_last_entry (&chan->active_list, + struct xilinx_dma_tx_descriptor, node); +/* +* VDMA and simple mode do not support residue reporting, so the +* residue field will always be 0. +*/ +if (chan->has_sg && chan->xdev->dma_config->dmatype !=XDMA_TYPE_VDMA ) + residue =xilinx_dma_get_residue (chan, desc); + }spin_unlock_irqrestore (&chan->lock, flags);dma_set_residue (txstate, residue);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 52/194 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 53/194 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 54/194 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 55/194 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 56/194 drm/amd/display: blank dp stream before re-train the link
In reply to Greg Kroah-HartmanFrom: Xiaodong Yan <[email protected]>
[ Upstream commit 718a5569b6fa6e1f49f1ae76a3c18acb4ddb74f1 ]
[Why]
When link loss happened, monitor can not light up if only re-train the link.
[How]
Blank all the DP streams on this link before re-train the link, and then unblank the stream
--- drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +12 -0
@@ -2885,6 +2885,12 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpdsizeof (hpd_irq_dpcd_data), "Status: "); +for (i =0 ; i <MAX_PIPES ; i++) { + pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i]; +if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link == link) + link->dc->hwss.blank_stream (pipe_ctx); + } +for (i =0 ; i <MAX_PIPES ; i++) { pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i];if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link == link)
@@ -2904,6 +2910,12 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpdif (pipe_ctx->stream->signal ==SIGNAL_TYPE_DISPLAY_PORT_MST )dc_link_reallocate_mst_payload (link); +for (i =0 ; i <MAX_PIPES ; i++) { + pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i]; +if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link == link) + link->dc->hwss.unblank_stream (pipe_ctx, &previous_link_settings); + } + status = false;if (out_link_loss) *out_link_loss = true;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 57/194 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 58/194 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 59/194 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
@@ -2320,7 +2320,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 60/194 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
@@ -1435,7 +1435,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);
@@ -1469,7 +1470,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 61/194 drm/amdgpu: bump version for invalidate L2 before SDMA IBs
In reply to Greg Kroah-HartmanFrom: Marek Olšák <[email protected]>
[ Upstream commit 9017a4897a20658f010bebea825262963c10afa6 ]
This fixes GPU hangs due to cache coherency issues. Bump the driver version. Split out from the original patch.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +2 -1
@@ -85,9 +85,10 @@* - 3.34.0 - Non-DC can flip correctly between buffers with different pitches * - 3.35.0 - Add drm_amdgpu_info_device::tcc_disabled_mask * - 3.36.0 - Allow reading more status registers on si/cik +* - 3.37.0 - L2 is invalidated before SDMA IBs, needed for correctness */ #define KMS_DRIVER_MAJOR 3 -#define KMS_DRIVER_MINOR 36 +#define KMS_DRIVER_MINOR 37#define KMS_DRIVER_PATCHLEVEL 0int amdgpu_vram_limit =0 ;
Signature · 1 line
2.20.1
A message that is not in the archive (sent off-list or not yet received): CH2PR12MB42467AF7BC0405001FD91207F9B80@CH2PR12MB4246.namprd12.prod.outlook.com
Greg Kroah-Hartman
maintainerRe: [PATCH 5.6 061/194] drm/amdgpu: bump version for invalidate L2 before SDMA IBs
Quoted 5 lines · Marek
[AMD Official Use Only - Internal Distribution Only]
Hi Greg,
I disagree with this. Bumping the driver version will have implications on other new features, because it's like an ABI barrier exposing new functionality.
And yet another reason why driver versions are a total mess and shouldn't be in in-kernel drivers :(
Ugh.
I'll go drop this, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 62/194 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
@@ -2306,7 +2306,8 @@ 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 63/194 drm/amd/display: Defer cursor update around VUPDATE for all ASIC
In reply to Greg Kroah-HartmanFrom: Nicholas Kazlauskas <[email protected]>
[ Upstream commit fdfd2a858590d318cfee483bd1c73e00f77533af ]
[Why]
Fixes the following scenario:
- Flip has been prepared sometime during the frame, update pending
- Cursor update happens right when VUPDATE would happen
- OPTC lock acquired, VUPDATE is blocked until next frame
- Flip is delayed potentially infinitely
With the igt@kms_cursor_legacy cursor-vs-flip-legacy test we can observe nearly *13* frames of delay for some flips on Navi.
[How]
Apply the Raven workaround generically. When close enough to VUPDATE block cursor updates from occurring from the dc_stream_set_cursor_* helpers.
This could perhaps be a little smarter by checking if there were pending updates or flips earlier in the frame on the HUBP side before applying the delay, but this should be fine for now.
This fixes the kms_cursor_legacy test.
--- .../gpu/drm/amd/display/dc/core/dc_stream.c | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc_stream.c +14 -14
@@ -239,24 +239,24 @@ static void delay_cursor_until_vupdate(struct pipe_ctx *pipe_ctx, struct dc *dc)struct dc_stream_state *stream = pipe_ctx->stream;unsigned int us_per_line; -if (stream->ctx->asic_id.chip_family ==FAMILY_RV && -ASICREV_IS_RAVEN (stream->ctx->asic_id.hw_internal_rev)) { +if (!dc->hwss.get_vupdate_offset_from_vsync) +return ; - vupdate_line = dc->hwss.get_vupdate_offset_from_vsync (pipe_ctx); -if (!dc_stream_get_crtc_position (dc, &stream,1 , &vpos, &nvpos)) -return ; + vupdate_line = dc->hwss.get_vupdate_offset_from_vsync (pipe_ctx); +if (!dc_stream_get_crtc_position (dc, &stream,1 , &vpos, &nvpos)) +return ; -if (vpos >= vupdate_line) -return ; +if (vpos >= vupdate_line) +return ; - us_per_line = stream->timing.h_total *10000 / stream->timing.pix_clk_100hz; - lines_to_vupdate = vupdate_line - vpos; - us_to_vupdate = lines_to_vupdate * us_per_line; + us_per_line = + stream->timing.h_total *10000 / stream->timing.pix_clk_100hz; + lines_to_vupdate = vupdate_line - vpos; + us_to_vupdate = lines_to_vupdate * us_per_line; -/* 70 us is a conservative estimate of cursor update time*/ -if (us_to_vupdate <70 ) -udelay (us_to_vupdate); - } +/* 70 us is a conservative estimate of cursor update time*/ +if (us_to_vupdate <70 ) +udelay (us_to_vupdate);#endif }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 64/194 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
@@ -250,7 +250,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 65/194 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 66/194 fibmap: Warn and return an error in case of block > INT_MAX
In reply to Greg Kroah-HartmanFrom: Ritesh Harjani <[email protected]>
[ Upstream commit b75dfde1212991b24b220c3995101c60a7b8ae74 ]
We better warn the fibmap user and not return a truncated and therefore an incorrect block map address if the bmap() returned block address is greater than INT_MAX (since user supplied integer pointer).
It's better to pr_warn() all user of ioctl_fibmap() and return a proper error code rather than silently letting a FS corruption happen if the user tries to fiddle around with the returned block map address.
We fix this by returning an error code of -ERANGE and returning 0 as the block mapping address in case if it is > INT_MAX.
Now iomap_bmap() could be called from either of these two paths. Either when a user is calling an ioctl_fibmap() interface to get the block mapping address or by some filesystem via use of bmap() internal kernel API.bmap() kernel API is well equipped with handling of u64 addresses.
WARN condition in iomap_bmap_actor() was mainly added to warn all the fibmap users. But now that we have directly added this warning for all fibmap users and also made sure to return 0 as block map address in case if addr > INT_MAX.
So we can now remove this logic from iomap_bmap_actor().
--- fs/ioctl.c | 8 ++++++++ fs/iomap/fiemap.c | 5 +---- 2 files changed, 9 insertions(+), 4 deletions(-)
fs/ioctl.c +8 -0
@@ -55,6 +55,7 @@ EXPORT_SYMBOL(vfs_ioctl);static int ioctl_fibmap (struct file *filp,int __user *p) {struct inode *inode =file_inode (filp); +struct super_block *sb = inode->i_sb;int error, ur_block;sector_t block;
@@ -71,6 +72,13 @@ static int ioctl_fibmap(struct file *filp, int __user *p) block = ur_block; error =bmap (inode, &block); +if (block >INT_MAX ) { + error = -ERANGE ; +pr_warn_ratelimited ("[%s/%d] FS: %s File: %pD4 would truncate fibmap result\n" , + current->comm,task_pid_nr (current), + sb->s_id, filp); + } +if (error) ur_block =0 ;else
fs/iomap/fiemap.c +1 -4
@@ -117,10 +117,7 @@ iomap_bmap_actor(struct inode *inode, loff_t pos, loff_t length,if (iomap->type ==IOMAP_MAPPED ) { addr = (pos - iomap->offset + iomap->addr) >> inode->i_blkbits; -if (addr >INT_MAX ) -WARN (1 ,"would truncate bmap result\n" ); -else - *bno = addr; + *bno = addr; }return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 67/194 io_uring: use cond_resched() in io_ring_ctx_wait_and_kill()
In reply to Greg Kroah-HartmanFrom: Xiaoguang Wang <[email protected]>
[ Upstream commit 3fd44c86711f71156b586c22b0495c58f69358bb ]
While working on to make io_uring sqpoll mode support syscalls that need struct files_struct, I got cpu soft lockup in io_ring_ctx_wait_and_kill(),
while (ctx->sqo_thread && !wq_has_sleeper(&ctx->sqo_wait))
cpu_relax();above loop never has an chance to exit, it's because preempt isn't enabled in the kernel, and the context calling io_ring_ctx_wait_and_kill() and io_sq_thread() run in the same cpu, if io_sq_thread calls a cond_resched() yield cpu and another context enters above loop, then io_sq_thread() will always in runqueue and never exit.
Use cond_resched() can fix this issue.
--- fs/io_uring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/io_uring.c +1 -1
@@ -6451,7 +6451,7 @@ static void io_ring_ctx_wait_and_kill(struct io_ring_ctx *ctx)* it could cause shutdown to hang. */ while (ctx->sqo_thread && !wq_has_sleeper (&ctx->sqo_wait)) -cpu_relax (); +cond_resched ();io_kill_timeouts (ctx);io_poll_remove_all (ctx);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 68/194 io_uring: check non-sync defer_list carefully
In reply to Greg Kroah-HartmanFrom: Pavel Begunkov <[email protected]>
[ Upstream commit 4ee3631451c9a62e6b6bc7ee51fb9a5b34e33509 ]
io_req_defer() do double-checked locking. Use proper helpers for that, i.e. list_empty_careful().
--- fs/io_uring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/io_uring.c +1 -1
@@ -4258,7 +4258,7 @@ static int io_req_defer(struct io_kiocb *req, const struct io_uring_sqe *sqe)int ret;/* Still need defer if there is pending req in defer list. */ -if (!req_need_defer (req) &&list_empty (&ctx->defer_list)) +if (!req_need_defer (req) &&list_empty_careful (&ctx->defer_list))return 0 ;if (!req->io &&io_alloc_async_ctx (req))
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 69/194 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 70/194 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 71/194 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 72/194 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 73/194 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 74/194 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
@@ -2042,23 +2042,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
@@ -202,7 +202,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
@@ -1013,20 +1013,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 75/194 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 76/194 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
@@ -1286,6 +1286,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 77/194 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
@@ -692,7 +692,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 78/194 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
@@ -1479,11 +1479,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 int irq, offset;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 79/194 drm/tegra: Fix SMMU support on Tegra124 and Tegra210
In reply to Greg Kroah-HartmanFrom: Thierry Reding <[email protected]>
[ Upstream commit 501be6c1c72417eab05e7413671a38ea991a8ebc ]
When testing whether or not to enable the use of the SMMU, consult the supported DMA mask rather than the actually configured DMA mask, since the latter might already have been restricted.
--- drivers/gpu/drm/tegra/drm.c | 3 ++- drivers/gpu/host1x/dev.c | 13 +++++++++++++ include/linux/host1x.h | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-)
drivers/gpu/drm/tegra/drm.c +2 -1
@@ -1039,6 +1039,7 @@ void tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt,static bool host1x_drm_wants_iommu (struct host1x_device *dev) { +struct host1x *host1x =dev_get_drvdata (dev->dev.parent);struct iommu_domain *domain;/*
@@ -1076,7 +1077,7 @@ static bool host1x_drm_wants_iommu(struct host1x_device *dev)* sufficient and whether or not the host1x is attached to an IOMMU * doesn't matter. */ -if (!domain &&dma_get_mask (dev->dev.parent) <=DMA_BIT_MASK (32 )) +if (!domain &&host1x_get_dma_mask (host1x) <=DMA_BIT_MASK (32 ))return true;return domain !=NULL ;
drivers/gpu/host1x/dev.c +13 -0
@@ -502,6 +502,19 @@ static void __exit tegra_host1x_exit(void) }module_exit (tegra_host1x_exit); +/** +* host1x_get_dma_mask() - query the supported DMA mask for host1x +* @host1x: host1x instance +* +* Note that this returns the supported DMA mask for host1x, which can be +* different from the applicable DMA mask under certain circumstances. +*/ +u64 host1x_get_dma_mask (struct host1x *host1x) +{ +return host1x->info->dma_mask; +} +EXPORT_SYMBOL (host1x_get_dma_mask); +MODULE_AUTHOR ("Thierry Reding <[email protected]>" );MODULE_AUTHOR ("Terje Bergstrom <[email protected]>" );MODULE_DESCRIPTION ("Host1x driver for Tegra products" );
include/linux/host1x.h +3 -0
@@ -17,9 +17,12 @@ enum host1x_class { HOST1X_CLASS_GR3D = 0x60, }; +struct host1x ;struct host1x_client ;struct iommu_group ; +u64 host1x_get_dma_mask (struct host1x *host1x); +/** * struct host1x_client_ops - host1x client operations * @init: host1x client initialization code
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 80/194 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
@@ -1480,8 +1480,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 81/194 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 82/194 cachefiles: Fix corruption of the return value in cachefiles_read_or_alloc_pages()
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
[ Upstream commit c5f9d9db83d9f84d2b4aae5a1b29d9b582ccff2f ]
The patch which changed cachefiles from calling ->bmap() to using the bmap() wrapper overwrote the running return value with the result of calling bmap(). This causes an assertion failure elsewhere in the code.
Fix this by using ret2 rather than ret to hold the return value.
The oops looks like:
kernel BUG at fs/nfs/fscache.c:468! ... RIP: 0010:__nfs_readpages_from_fscache+0x18b/0x190 [nfs] ... Call Trace: nfs_readpages+0xbf/0x1c0 [nfs] ? __alloc_pages_nodemask+0x16c/0x320 read_pages+0x67/0x1a0 __do_page_cache_readahead+0x1cf/0x1f0 ondemand_readahead+0x172/0x2b0 page_cache_async_readahead+0xaa/0xe0 generic_file_buffered_read+0x852/0xd50 ? mem_cgroup_commit_charge+0x6e/0x140 ? nfs4_have_delegation+0x19/0x30 [nfsv4] generic_file_read_iter+0x100/0x140 ? nfs_revalidate_mapping+0x176/0x2b0 [nfs] nfs_file_read+0x6d/0xc0 [nfs] new_sync_read+0x11a/0x1c0 __vfs_read+0x29/0x40 vfs_read+0x8e/0x140 ksys_read+0x61/0xd0 __x64_sys_read+0x1a/0x20 do_syscall_64+0x60/0x1e0 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f5d148267e0
--- fs/cachefiles/rdwr.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/cachefiles/rdwr.c +5 -5
@@ -398,7 +398,7 @@ int cachefiles_read_or_alloc_page(struct fscache_retrieval *op,struct inode *inode;sector_t block;unsigned shift; -int ret; +int ret, ret2; object =container_of (op->op.object, struct cachefiles_object, fscache);
@@ -430,8 +430,8 @@ int cachefiles_read_or_alloc_page(struct fscache_retrieval *op, block = page->index; block <<= shift; - ret =bmap (inode, &block); -ASSERT (ret <0 ); + ret2 =bmap (inode, &block); +ASSERT (ret2 ==0 ); _debug("%llx -> %llx", (unsigned long long) (page->index << shift),
@@ -739,8 +739,8 @@ int cachefiles_read_or_alloc_pages(struct fscache_retrieval *op, block = page->index; block <<= shift; - ret =bmap (inode, &block); -ASSERT (!ret); + ret2 =bmap (inode, &block); +ASSERT (ret2 ==0 ); _debug("%llx -> %llx", (unsigned long long) (page->index << shift),
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 83/194 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 84/194 drm/i915/gt: Make timeslicing an explicit engine property
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
[ Upstream commit fe5a708267911d55cce42910d93e303924b088fd ]
In order to allow userspace to rely on timeslicing to reorder their batches, we must support preemption of those user batches. Declare timeslicing as an explicit property that is a combination of having the kernel support and HW support.
--- drivers/gpu/drm/i915/gt/intel_engine.h | 9 --------- drivers/gpu/drm/i915/gt/intel_engine_types.h | 18 ++++++++++++++---- drivers/gpu/drm/i915/gt/intel_lrc.c | 5 ++++- 3 files changed, 18 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/gt/intel_engine.h +0 -9
@@ -338,13 +338,4 @@ intel_engine_has_preempt_reset(const struct intel_engine_cs *engine) return intel_engine_has_preemption(engine); } -static inline bool -intel_engine_has_timeslices (const struct intel_engine_cs *engine) -{ -if (!IS_ACTIVE (CONFIG_DRM_I915_TIMESLICE_DURATION )) -return false; - -return intel_engine_has_semaphores (engine); -} -#endif /* _INTEL_RINGBUFFER_H_ */
drivers/gpu/drm/i915/gt/intel_engine_types.h +14 -4
@@ -473,10 +473,11 @@ struct intel_engine_cs {#define I915_ENGINE_SUPPORTS_STATS BIT(1)#define I915_ENGINE_HAS_PREEMPTION BIT(2)#define I915_ENGINE_HAS_SEMAPHORES BIT(3) -#define I915_ENGINE_NEEDS_BREADCRUMB_TASKLET BIT(4) -#define I915_ENGINE_IS_VIRTUAL BIT(5) -#define I915_ENGINE_HAS_RELATIVE_MMIO BIT(6) -#define I915_ENGINE_REQUIRES_CMD_PARSER BIT(7) +#define I915_ENGINE_HAS_TIMESLICES BIT(4) +#define I915_ENGINE_NEEDS_BREADCRUMB_TASKLET BIT(5) +#define I915_ENGINE_IS_VIRTUAL BIT(6) +#define I915_ENGINE_HAS_RELATIVE_MMIO BIT(7) +#define I915_ENGINE_REQUIRES_CMD_PARSER BIT(8)unsigned int flags;/*
@@ -573,6 +574,15 @@ intel_engine_has_semaphores(const struct intel_engine_cs *engine)return engine->flags &I915_ENGINE_HAS_SEMAPHORES ; } +static inline bool +intel_engine_has_timeslices (const struct intel_engine_cs *engine) +{ +if (!IS_ACTIVE (CONFIG_DRM_I915_TIMESLICE_DURATION )) +return false; + +return engine->flags &I915_ENGINE_HAS_TIMESLICES ; +} +static inline bool intel_engine_needs_breadcrumb_tasklet (const struct intel_engine_cs *engine) {
drivers/gpu/drm/i915/gt/intel_lrc.c +4 -1
@@ -4194,8 +4194,11 @@ void intel_execlists_set_default_submission(struct intel_engine_cs *engine) engine->flags |=I915_ENGINE_SUPPORTS_STATS ;if (!intel_vgpu_active (engine->i915)) { engine->flags |=I915_ENGINE_HAS_SEMAPHORES ; -if (HAS_LOGICAL_RING_PREEMPTION (engine->i915)) +if (HAS_LOGICAL_RING_PREEMPTION (engine->i915)) { engine->flags |=I915_ENGINE_HAS_PREEMPTION ; +if (IS_ACTIVE (CONFIG_DRM_I915_TIMESLICE_DURATION )) + engine->flags |=I915_ENGINE_HAS_TIMESLICES ; + } }if (INTEL_GEN (engine->i915) >=12 )
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 85/194 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
@@ -4722,7 +4722,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 86/194 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 87/194 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
@@ -187,6 +187,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 88/194 drm/i915/gem: Remove object_is_locked assertion from unpin_from_display_plane
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
[ Upstream commit 47bf7b7a7151bad568b9523d14477a353a450066 ]
Since moving the obj->vma.list to a spin_lock, and the vm->bound_list to its vm->mutex, along with tracking shrinkable status under its own spinlock, we no long require the object to be locked by the caller.
This is fortunate as it appears we can be called with the lock along an error path in flipping:
<4> [139.942851] WARN_ON(debug_locks && !lock_is_held(&(&((obj)->base.resv)->lock.base)->dep_map))
<4> [139.943242] WARNING: CPU: 0 PID: 1203 at drivers/gpu/drm/i915/gem/i915_gem_domain.c:405 i915_gem_object_unpin_from_display_plane+0x70/0x130 [i915]
<4> [139.943263] Modules linked in: snd_hda_intel i915 vgem snd_hda_codec_realtek snd_hda_codec_generic coretemp snd_intel_dspcfg snd_hda_codec snd_hwdep snd_hda_core r8169 lpc_ich snd_pcm realtek prime_numbers [last unloaded: i915]
<4> [139.943347] CPU: 0 PID: 1203 Comm: kms_flip Tainted: G U 5.6.0-gd0fda5c2cf3f1-drmtip_474+ #1
<4> [139.943363] Hardware name: /D510MO, BIOS MOPNV10J.86A.0311.2010.0802.2346 08/02/2010
<4> [139.943589] RIP: 0010:i915_gem_object_unpin_from_display_plane+0x70/0x130 [i915]
<4> [139.943589] Code: 85 28 01 00 00 be ff ff ff ff 48 8d 78 60 e8 d7 9b f0 e2 85 c0 75 b9 48 c7 c6 50 b9 38 c0 48 c7 c7 e9 48 3c c0 e8 20 d4 e9 e2 <0f> 0b eb a2 48 c7 c1 08 bb 38 c0 ba 0a 01 00 00 48 c7 c6 88 a3 35 <4> [139.943589] RSP: 0018:ffffb774c0603b48 EFLAGS: 00010282
<4> [139.943589] RAX: 0000000000000000 RBX: ffff9a142fa36e80 RCX: 0000000000000006
<4> [139.943589] RDX: 000000000000160d RSI: ffff9a142c1a88f8 RDI: ffffffffa434a64d
<4> [139.943589] RBP: ffff9a1410a513c0 R08: ffff9a142c1a88f8 R09: 0000000000000000
<4> [139.943589] R10: 0000000000000000 R11: 0000000000000000 R12: ffff9a1436ee94b8
<4> [139.943589] R13: 0000000000000001 R14: 00000000ffffffff R15: ffff9a1410960000
<4> [139.943589] FS: 00007fc73a744e40(0000) GS:ffff9a143da00000(0000) knlGS:0000000000000000
<4> [139.943589] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
<4> [139.943589] CR2: 00007fc73997e098 CR3: 000000002f5fe000 CR4: 00000000000006f0
<4> [139.943589] Call Trace:
<4> [139.943589] intel_pin_and_fence_fb_obj+0x1c9/0x1f0 [i915] <4> [139.943589] intel_plane_pin_fb+0x3f/0xd0 [i915] <4> [139.943589] intel_prepare_plane_fb+0x13b/0x5c0 [i915] <4> [139.943589] drm_atomic_helper_prepare_planes+0x85/0x110 <4> [139.943589] intel_atomic_commit+0xda/0x390 [i915] <4> [139.943589] drm_atomic_helper_page_flip+0x9c/0xd0 <4> [139.943589] ? drm_event_reserve_init+0x46/0x60 <4> [139.943589] drm_mode_page_flip_ioctl+0x587/0x5d0
This completes the symmetry lost in commit 8b1c78e06e61 ("drm/i915: Avoid calling i915_gem_object_unbind holding object lock").
--- drivers/gpu/drm/i915/gem/i915_gem_domain.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/gpu/drm/i915/gem/i915_gem_domain.c +1 -6
@@ -368,7 +368,6 @@ static void i915_gem_object_bump_inactive_ggtt(struct drm_i915_gem_object *obj)struct drm_i915_private *i915 =to_i915 (obj->base.dev);struct i915_vma *vma; -GEM_BUG_ON (!i915_gem_object_has_pinned_pages (obj));if (!atomic_read (&obj->bind_count))return ;
@@ -400,12 +399,8 @@ static void i915_gem_object_bump_inactive_ggtt(struct drm_i915_gem_object *obj)void i915_gem_object_unpin_from_display_plane (struct i915_vma *vma) { -struct drm_i915_gem_object *obj = vma->obj; - -assert_object_held (obj); -/* Bump the LRU to try and avoid premature eviction whilst flipping */ -i915_gem_object_bump_inactive_ggtt (obj); +i915_gem_object_bump_inactive_ggtt (vma->obj);i915_vma_unpin (vma); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 89/194 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 90/194 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 91/194 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 92/194 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 93/194 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 94/194 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
@@ -259,7 +259,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;
@@ -505,7 +505,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 ;
@@ -533,12 +533,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;
@@ -564,7 +569,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 95/194 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
@@ -2486,11 +2486,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, };
@@ -2508,8 +2508,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, };
@@ -2570,11 +2571,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 96/194 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 97/194 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 98/194 NFS: Fix fscache super_cookie allocation
In reply to Greg Kroah-HartmanFrom: Dave Wysochanski <[email protected]>
[ Upstream commit 15751612734ca0c419ac43ce986c9badcb5e2829 ]
Commit f2aedb713c28 ("NFS: Add fs_context support.") reworked NFS mount code paths for fs_context support which included super_block initialization. In the process there was an extra return left in the code and so we never call nfs_fscache_get_super_cookie even if 'fsc' is given on as mount option. In addition, there is an extra check inside nfs_fscache_get_super_cookie for the NFS_OPTION_FSCACHE which is unnecessary since the only caller nfs_get_cache_cookie checks this flag.
--- fs/nfs/fscache.c | 2 -- fs/nfs/super.c | 1 - 2 files changed, 3 deletions(-)
fs/nfs/fscache.c +0 -2
@@ -118,8 +118,6 @@ void nfs_fscache_get_super_cookie(struct super_block *sb, const char *uniq, int nfss->fscache_key =NULL ; nfss->fscache =NULL ; -if (!(nfss->options &NFS_OPTION_FSCACHE )) -return ;if (!uniq) { uniq ="" ; ulen =1 ;
fs/nfs/super.c +0 -1
@@ -1154,7 +1154,6 @@ static void nfs_get_cache_cookie(struct super_block *sb, uniq = ctx->fscache_uniq; ulen =strlen (ctx->fscache_uniq); } -return ; }nfs_fscache_get_super_cookie (sb, uniq, ulen);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 99/194 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
@@ -225,6 +225,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. */
@@ -238,14 +251,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,
@@ -265,11 +271,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 ; }
@@ -309,11 +311,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 100/194 hwmon: (drivetemp) Fix SCT support if SCT data tables are not supported
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
[ Upstream commit bcb543cc3d4034da3f3fd8bc4296a26dfeadf47d ]
If SCT is supported but SCT data tables are not, the driver unnecessarily tries to fall back to SMART. Use SCT without data tables instead in this situation.
--- drivers/hwmon/drivetemp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/drivetemp.c +1 -1
@@ -346,7 +346,7 @@ static int drivetemp_identify_sata(struct drivetemp_data *st) st->have_temp_highest =temp_is_valid (buf[SCT_STATUS_TEMP_HIGHEST ]);if (!have_sct_data_table) - goto skip_sct; + goto skip_sct_data;/* Request and read temperature history table */ memset (buf,'\0' ,sizeof (st->smartdata));
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 101/194 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
@@ -1517,9 +1517,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 102/194 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
@@ -375,7 +375,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 103/194 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
@@ -177,6 +177,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 104/194 netfilter: conntrack: fix infinite loop on rmmod
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit 54ab49fde95605a1077f759ce454d94e84b5ca45 ]
'rmmod nf_conntrack' can hang forever, because the netns exit gets stuck in nf_conntrack_cleanup_net_list():
i_see_dead_people:
busy = 0;
list_for_each_entry(net, net_exit_list, exit_list) {
nf_ct_iterate_cleanup(kill_all, net, 0, 0); if (atomic_read(&net->ct.count) != 0)
busy = 1;
}
if (busy) {
schedule();
goto i_see_dead_people;
}
When nf_ct_iterate_cleanup iterates the conntrack table, all nf_conn structures can be found twice:
once for the original tuple and once for the conntracks reply tuple.
get_next_corpse() only calls the iterator when the entry is in original direction -- the idea was to avoid unneeded invocations of the iterator callback.
When support for clashing entries was added, the assumption that all nf_conn objects are added twice, once in original, once for reply tuple no longer holds -- NF_CLASH_BIT entries are only added in the non-clashing reply direction.
Thus, if at least one NF_CLASH entry is in the list then nf_conntrack_cleanup_net_list() always skips it completely.
During normal netns destruction, this causes a hang of several seconds, until the gc worker removes the entry (NF_CLASH entries always have a 1 second timeout).
But in the rmmod case, the gc worker has already been stopped, so ct.count never becomes 0.
We can fix this in two ways:
1. Add a second test for CLASH_BIT and call iterator for those entries as well, or:
2. Skip the original tuple direction and use the reply tuple.
2) is simpler, so do that.
--- net/netfilter/nf_conntrack_core.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
net/netfilter/nf_conntrack_core.c +12 -1
@@ -2137,8 +2137,19 @@ get_next_corpse(int (*iter)(struct nf_conn *i, void *data),nf_conntrack_lock (lockp);if (*bucket < nf_conntrack_htable_size) {hlist_nulls_for_each_entry (h, n, &nf_conntrack_hash[*bucket], hnnode) { -if (NF_CT_DIRECTION (h) !=IP_CT_DIR_ORIGINAL ) +if (NF_CT_DIRECTION (h) !=IP_CT_DIR_REPLY )continue ; +/* All nf_conn objects are added to hash table twice, one +* for original direction tuple, once for the reply tuple. +* +* Exception: In the IPS_NAT_CLASH case, only the reply +* tuple is added (the original tuple already existed for +* a different object). +* +* We only need to call the iterator once for each +* conntrack, so we just use the 'reply' direction +* tuple while iterating. +*/ ct =nf_ct_tuplehash_to_ctrack (h);if (iter (ct, data)) goto found;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 105/194 drm/i915: Mark concurrent submissions with a weak-dependency
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
[ Upstream commit a9d094dcf7845af85f82adcad9f793e51e4d14c8 ]
We recorded the dependencies for WAIT_FOR_SUBMIT in order that we could correctly perform priority inheritance from the parallel branches to the common trunk. However, for the purpose of timeslicing and reset handling, the dependency is weak -- as we the pair of requests are allowed to run in parallel and not in strict succession.
The real significance though is that this allows us to rearrange groups of WAIT_FOR_SUBMIT linked requests along the single engine, and so can resolve user level inter-batch scheduling dependencies from user semaphores.
Testcase: igt/gem_exec_fence/submit
--- drivers/gpu/drm/i915/gt/intel_lrc.c | 3 +++ drivers/gpu/drm/i915/i915_request.c | 8 ++++++-- drivers/gpu/drm/i915/i915_scheduler.c | 6 +++--- drivers/gpu/drm/i915/i915_scheduler.h | 3 ++- drivers/gpu/drm/i915/i915_scheduler_types.h | 1 + 5 files changed, 15 insertions(+), 6 deletions(-)
drivers/gpu/drm/i915/gt/intel_lrc.c +3 -0
@@ -1626,6 +1626,9 @@ static void defer_request(struct i915_request *rq, struct list_head * const pl)struct i915_request *w =container_of (p->waiter,typeof (*w), sched); +if (p->flags &I915_DEPENDENCY_WEAK ) +continue ; +/* Leave semaphores spinning on the other engines */ if (w->engine != rq->engine)continue ;
drivers/gpu/drm/i915/i915_request.c +6 -2
@@ -951,7 +951,9 @@ i915_request_await_request(struct i915_request *to, struct i915_request *from)return 0 ;if (to->engine->schedule) { - ret =i915_sched_node_add_dependency (&to->sched, &from->sched); + ret =i915_sched_node_add_dependency (&to->sched, + &from->sched, +I915_DEPENDENCY_EXTERNAL );if (ret <0 )return ret; }
@@ -1084,7 +1086,9 @@ __i915_request_await_execution(struct i915_request *to,/* Couple the dependency tree for PI on this exposed to->fence */ if (to->engine->schedule) { - err =i915_sched_node_add_dependency (&to->sched, &from->sched); + err =i915_sched_node_add_dependency (&to->sched, + &from->sched, +I915_DEPENDENCY_WEAK );if (err <0 )return err; }
drivers/gpu/drm/i915/i915_scheduler.c +3 -3
@@ -455,7 +455,8 @@ bool __i915_sched_node_add_dependency(struct i915_sched_node *node, }int i915_sched_node_add_dependency (struct i915_sched_node *node, -struct i915_sched_node *signal) +struct i915_sched_node *signal, +unsigned long flags) {struct i915_dependency *dep;
@@ -464,8 +465,7 @@ int i915_sched_node_add_dependency(struct i915_sched_node *node,return -ENOMEM ;if (!__i915_sched_node_add_dependency (node, signal, dep, -I915_DEPENDENCY_EXTERNAL | -I915_DEPENDENCY_ALLOC )) + flags |I915_DEPENDENCY_ALLOC ))i915_dependency_free (dep);return 0 ;
drivers/gpu/drm/i915/i915_scheduler.h +2 -1
@@ -34,7 +34,8 @@ bool __i915_sched_node_add_dependency(struct i915_sched_node *node, unsigned long flags);int i915_sched_node_add_dependency (struct i915_sched_node *node, -struct i915_sched_node *signal); +struct i915_sched_node *signal, +unsigned long flags);void i915_sched_node_fini (struct i915_sched_node *node);
drivers/gpu/drm/i915/i915_scheduler_types.h +1 -0
@@ -78,6 +78,7 @@ struct i915_dependency {unsigned long flags;#define I915_DEPENDENCY_ALLOC BIT(0)#define I915_DEPENDENCY_EXTERNAL BIT(1) +#define I915_DEPENDENCY_WEAK BIT(2) };#endif /* _I915_SCHEDULER_TYPES_H_ */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 106/194 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
@@ -734,9 +734,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 107/194 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
@@ -2416,6 +2416,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 108/194 tracing: Wait for preempt irq delay thread to execute
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (VMware) <[email protected]>
[ Upstream commit 8b1fac2e73e84ef0d6391051880a8e1d7044c847 ]
A bug report was posted that running the preempt irq delay module on a slow machine, and removing it quickly could lead to the thread created by the modlue to execute after the module is removed, and this could cause the kernel to crash. The fix for this was to call kthread_stop() after creating the thread to make sure it finishes before allowing the module to be removed.
Now this caused the opposite problem on fast machines. What now happens is the kthread_stop() can cause the kthread never to execute and the test never to run. To fix this, add a completion and wait for the kthread to execute, then wait for it to end.
This issue caused the ftracetest selftests to fail on the preemptirq tests.
--- kernel/trace/preemptirq_delay_test.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
kernel/trace/preemptirq_delay_test.c +10 -2
@@ -16,6 +16,7 @@#include <linux/printk.h> #include <linux/string.h> #include <linux/sysfs.h> +#include <linux/completion.h> static ulong delay =100 ;static char test_mode[12 ] ="irq" ;
@@ -28,6 +29,8 @@ MODULE_PARM_DESC(delay, "Period in microseconds (100 us default)");MODULE_PARM_DESC (test_mode,"Mode of the test such as preempt, irq, or alternate (default irq)" );MODULE_PARM_DESC (burst_size,"The size of a burst (default 1)" ); +static struct completion done; +#define MIN (x, y) ((x) < (y) ? (x) : (y))static void busy_wait (ulong time)
@@ -114,6 +117,8 @@ static int preemptirq_delay_run(void *data)for (i =0 ; i < s; i++) (testfuncs[i])(i); +complete (&done); +set_current_state (TASK_INTERRUPTIBLE );while (!kthread_should_stop ()) {schedule ();
@@ -128,15 +133,18 @@ static int preemptirq_delay_run(void *data)static int preemptirq_run_test (void ) {struct task_struct *task; -char task_name[50 ]; +init_completion (&done); +snprintf (task_name,sizeof (task_name),"%s_test" , test_mode); task =kthread_run (preemptirq_delay_run,NULL , task_name);if (IS_ERR (task))return PTR_ERR (task); -if (task) +if (task) { +wait_for_completion (&done);kthread_stop (task); + }return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 109/194 netfilter: flowtable: set NF_FLOW_TEARDOWN flag on entry expiration
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 9ed81c8e0deb7bd2aa0d69371e4a0f9a7b31205d ]
If the flow timer expires, the gc sets on the NF_FLOW_TEARDOWN flag. Otherwise, the flowtable software path might race to refresh the timeout, leaving the state machine in inconsistent state.
--- net/netfilter/nf_flow_table_core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/netfilter/nf_flow_table_core.c +5 -3
@@ -271,7 +271,7 @@ static void flow_offload_del(struct nf_flowtable *flow_table,if (nf_flow_has_expired (flow))flow_offload_fixup_ct (flow->ct); -else if (test_bit (NF_FLOW_TEARDOWN , &flow->flags)) +else flow_offload_fixup_ct_timeout (flow->ct);flow_offload_free (flow);
@@ -348,8 +348,10 @@ static void nf_flow_offload_gc_step(struct flow_offload *flow, void *data) {struct nf_flowtable *flow_table = data; -if (nf_flow_has_expired (flow) ||nf_ct_is_dying (flow->ct) || -test_bit (NF_FLOW_TEARDOWN , &flow->flags)) { +if (nf_flow_has_expired (flow) ||nf_ct_is_dying (flow->ct)) +set_bit (NF_FLOW_TEARDOWN , &flow->flags); + +if (test_bit (NF_FLOW_TEARDOWN , &flow->flags)) {if (test_bit (NF_FLOW_HW , &flow->flags)) {if (!test_bit (NF_FLOW_HW_DYING , &flow->flags))nf_flow_offload_del (flow_table, flow);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 110/194 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) &&
@@ -418,6 +427,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 111/194 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 112/194 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 113/194 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
@@ -1536,8 +1536,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 114/194 RDMA/core: Fix double put of resource
In reply to Greg Kroah-HartmanFrom: Maor Gottlieb <[email protected]>
[ 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 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/infiniband/core/nldev.c +1 -2
@@ -1292,11 +1292,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 =fill_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 115/194 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 116/194 x86/ftrace: Have ftrace trampolines turn read-only at the end of system boot up
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (VMware) <[email protected]>
[ Upstream commit 59566b0b622e3e6ea928c0b8cac8a5601b00b383 ]
Booting one of my machines, it triggered the following crash:
Kernel/User page tables isolation: enabled
ftrace: allocating 36577 entries in 143 pages
Starting tracer 'function'
BUG: unable to handle page fault for address: ffffffffa000005c #PF: supervisor write access in kernel mode #PF: error_code(0x0003) - permissions violation PGD 2014067 P4D 2014067 PUD 2015063 PMD 7b253067 PTE 7b252061 Oops: 0003 [#1] PREEMPT SMP PTI CPU: 0 PID: 0 Comm: swapper Not tainted 5.4.0-test+ #24 Hardware name: To Be Filled By O.E.M. To Be Filled By O.E.M./To be filled by O.E.M., BIOS SDBLI944.86P 05/08/2007 RIP: 0010:text_poke_early+0x4a/0x58 Code: 34 24 48 89 54 24 08 e8 bf 72 0b 00 48 8b 34 24 48 8b 4c 24 08 84 c0 74 0b 48 89 df f3 a4 48 83 c4 10 5b c3 9c 58 fa 48 89 df <f3> a4 50 9d 48 83 c4 10 5b e9 d6 f9 ff ff
0 41 57 49
RSP: 0000:ffffffff82003d38 EFLAGS: 00010046
RAX: 0000000000000046 RBX: ffffffffa000005c RCX: 0000000000000005
RDX: 0000000000000005 RSI: ffffffff825b9a90 RDI: ffffffffa000005c
RBP: ffffffffa000005c R08: 0000000000000000 R09: ffffffff8206e6e0
R10: ffff88807b01f4c0 R11: ffffffff8176c106 R12: ffffffff8206e6e0
R13: ffffffff824f2440 R14: 0000000000000000 R15: ffffffff8206eac0
FS: 0000000000000000(0000) GS:ffff88807d400000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffffffffa000005c CR3: 0000000002012000 CR4: 00000000000006b0
Call Trace: text_poke_bp+0x27/0x64 ? mutex_lock+0x36/0x5d arch_ftrace_update_trampoline+0x287/0x2d5 ? ftrace_replace_code+0x14b/0x160 ? ftrace_update_ftrace_func+0x65/0x6c __register_ftrace_function+0x6d/0x81 ftrace_startup+0x23/0xc1 register_ftrace_function+0x20/0x37 func_set_flag+0x59/0x77 __set_tracer_option.isra.19+0x20/0x3e trace_set_options+0xd6/0x13e apply_trace_boot_options+0x44/0x6d register_tracer+0x19e/0x1ac early_trace_init+0x21b/0x2c9 start_kernel+0x241/0x518 ? load_ucode_intel_bsp+0x21/0x52 secondary_startup_64+0xa4/0xb0
I was able to trigger it on other machines, when I added to the kernel command line of both "ftrace=function" and "trace_options=func_stack_trace".
The cause is the "ftrace=function" would register the function tracer and create a trampoline, and it will set it as executable and read-only. Then the "trace_options=func_stack_trace" would then update the same trampoline to include the stack tracer version of the function tracer. But since the trampoline already exists, it updates it with text_poke_bp(). The problem is that text_poke_bp() called while system_state == SYSTEM_BOOTING, it will simply do a memcpy() and not the page mapping, as it would think that the text is still read-write. But in this case it is not, and we take a fault and crash.
Instead, lets keep the ftrace trampolines read-write during boot up, and then when the kernel executable text is set to read-only, the ftrace trampolines get set to read-only as well.
--- arch/x86/include/asm/ftrace.h | 6 ++++++ arch/x86/kernel/ftrace.c | 29 ++++++++++++++++++++++++++++- arch/x86/mm/init_64.c | 3 +++ include/linux/ftrace.h | 23 +++++++++++++++++++++++ kernel/trace/ftrace_internal.h | 22 ---------------------- 5 files changed, 60 insertions(+), 23 deletions(-)
arch/x86/include/asm/ftrace.h +6 -0
@@ -56,6 +56,12 @@ struct dyn_arch_ftrace {#ifndef __ASSEMBLY__ +#if defined(CONFIG_FUNCTION_TRACER ) && defined(CONFIG_DYNAMIC_FTRACE ) +extern void set_ftrace_ops_ro (void ); +#else +static inline void set_ftrace_ops_ro (void ) { } +#endif +#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME static inline bool arch_syscall_match_sym_name (const char *sym,const char *name) {
arch/x86/kernel/ftrace.c +28 -1
@@ -407,7 +407,8 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)set_vm_flush_reset_perms (trampoline); -set_memory_ro ((unsigned long )trampoline, npages); +if (likely (system_state !=SYSTEM_BOOTING )) +set_memory_ro ((unsigned long )trampoline, npages);set_memory_x ((unsigned long )trampoline, npages);return (unsigned long )trampoline; fail:
@@ -415,6 +416,32 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)return 0 ; } +void set_ftrace_ops_ro (void ) +{ +struct ftrace_ops *ops; +unsigned long start_offset; +unsigned long end_offset; +unsigned long npages; +unsigned long size; + +do_for_each_ftrace_op (ops, ftrace_ops_list) { +if (!(ops->flags &FTRACE_OPS_FL_ALLOC_TRAMP )) +continue ; + +if (ops->flags &FTRACE_OPS_FL_SAVE_REGS ) { + start_offset = (unsigned long )ftrace_regs_caller; + end_offset = (unsigned long )ftrace_regs_caller_end; + }else { + start_offset = (unsigned long )ftrace_caller; + end_offset = (unsigned long )ftrace_epilogue; + } + size = end_offset - start_offset; + size = size +RET_SIZE +sizeof (void *); + npages =DIV_ROUND_UP (size,PAGE_SIZE ); +set_memory_ro ((unsigned long )ops->trampoline, npages); + }while_for_each_ftrace_op (ops); +} +static unsigned long calc_trampoline_call_offset (bool save_regs) {unsigned long start_offset;
arch/x86/mm/init_64.c +3 -0
@@ -54,6 +54,7 @@#include <asm/init.h> #include <asm/uv/uv.h> #include <asm/setup.h> +#include <asm/ftrace.h> #include "mm_internal.h"
@@ -1288,6 +1289,8 @@ void mark_rodata_ro(void) all_end =roundup ((unsigned long )_brk_end,PMD_SIZE );set_memory_nx (text_end, (all_end - text_end) >>PAGE_SHIFT ); +set_ftrace_ops_ro (); +#ifdef CONFIG_CPA_DEBUG printk (KERN_INFO "Testing CPA: undo %lx-%lx\n" , start, end);set_memory_rw (start, (end-start) >>PAGE_SHIFT );
include/linux/ftrace.h +23 -0
@@ -210,6 +210,29 @@ struct ftrace_ops {#endif }; +extern struct ftrace_ops __rcu *ftrace_ops_list; +extern struct ftrace_ops ftrace_list_end; + +/* +* Traverse the ftrace_global_list, invoking all entries. The reason that we +* can use rcu_dereference_raw_check() is that elements removed from this list +* are simply leaked, so there is no need to interact with a grace-period +* mechanism. The rcu_dereference_raw_check() calls are needed to handle +* concurrent insertions into the ftrace_global_list. +* +* Silly Alpha and silly pointer-speculation compiler optimizations! +*/ +#define do_for_each_ftrace_op (op, list) \ + op = rcu_dereference_raw_check(list); \ + do + +/* +* Optimized for just a single item in the list (as that is the normal case). +*/ +#define while_for_each_ftrace_op (op) \ + while (likely(op = rcu_dereference_raw_check((op)->next)) && \ + unlikely((op) != &ftrace_list_end)) +/* * Type of the current tracing. */
kernel/trace/ftrace_internal.h +0 -22
@@ -4,28 +4,6 @@#ifdef CONFIG_FUNCTION_TRACER -/* -* Traverse the ftrace_global_list, invoking all entries. The reason that we -* can use rcu_dereference_raw_check() is that elements removed from this list -* are simply leaked, so there is no need to interact with a grace-period -* mechanism. The rcu_dereference_raw_check() calls are needed to handle -* concurrent insertions into the ftrace_global_list. -* -* Silly Alpha and silly pointer-speculation compiler optimizations! -*/ -#define do_for_each_ftrace_op (op, list) \ - op = rcu_dereference_raw_check(list); \ - do - -/* -* Optimized for just a single item in the list (as that is the normal case). -*/ -#define while_for_each_ftrace_op (op) \ - while (likely(op = rcu_dereference_raw_check((op)->next)) && \ - unlikely((op) != &ftrace_list_end)) - -extern struct ftrace_ops __rcu *ftrace_ops_list; -extern struct ftrace_ops ftrace_list_end;extern struct mutex ftrace_lock;extern struct ftrace_ops global_ops;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 117/194 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 118/194 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 119/194 drm/i915: Handle idling during i915_gem_evict_something busy loops
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
[ Upstream commit 955da9d77435acac066139e9d7f7723ce7204a1d ]
i915_gem_evict_something() is charged with finding a slot within the GTT that we may reuse. Since our goal is not to stall, we first look for a slot that only overlaps idle vma. To this end, on the first pass we move any active vma to the end of the search list. However, we only stopped moving active vma after we see the first active vma twice. If during the search, that first active vma completed, we would not notice and keep on extending the search list.
--- drivers/gpu/drm/i915/i915_gem_evict.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/i915_gem_evict.c +12 -14
@@ -130,6 +130,13 @@ i915_gem_evict_something(struct i915_address_space *vm, active =NULL ;INIT_LIST_HEAD (&eviction_list);list_for_each_entry_safe (vma, next, &vm->bound_list, vm_link) { +if (vma == active) {/* now seen this vma twice */ +if (flags &PIN_NONBLOCK ) +break ; + + active =ERR_PTR (-EAGAIN ); + } +/* * We keep this list in a rough least-recently scanned order * of active elements (inactive elements are cheap to reap).
@@ -145,21 +152,12 @@ i915_gem_evict_something(struct i915_address_space *vm,* To notice when we complete one full cycle, we record the * first active element seen, before moving it to the tail. */ -if (i915_vma_is_active (vma)) { -if (vma == active) { -if (flags &PIN_NONBLOCK ) -break ; - - active =ERR_PTR (-EAGAIN ); - } - -if (active !=ERR_PTR (-EAGAIN )) { -if (!active) - active = vma; +if (active !=ERR_PTR (-EAGAIN ) &&i915_vma_is_active (vma)) { +if (!active) + active = vma; -list_move_tail (&vma->vm_link, &vm->bound_list); -continue ; - } +list_move_tail (&vma->vm_link, &vm->bound_list); +continue ; }if (mark_free (&scan, vma, flags, &eviction_list))
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 120/194 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
@@ -783,6 +783,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 121/194 epoll: call final ep_events_available() check under the lock
In reply to Greg Kroah-HartmanFrom: Roman Penyaev <[email protected]>
[ Upstream commit 65759097d804d2a9ad2b687db436319704ba7019 ]
There is a possible race when ep_scan_ready_list() leaves ->rdllist and ->obflist empty for a short period of time although some events are pending. It is quite likely that ep_events_available() observes empty lists and goes to sleep.
Since commit 339ddb53d373 ("fs/epoll: remove unnecessary wakeups of nested epoll") we are conservative in wakeups (there is only one place for wakeup and this is ep_poll_callback()), thus ep_events_available() must always observe correct state of two lists.
The easiest and correct way is to do the final check under the lock. This does not impact the performance, since lock is taken anyway for adding a wait entry to the wait queue.
The discussion of the problem can be found here:
https://lore.kernel.org/linux-fsdevel/[email protected]/
In this patch barrierless __set_current_state() is used. This is safe since waitqueue_active() is called under the same lock on wakeup side.
Short-circuit for fatal signals (i.e. fatal_signal_pending() check) is moved to the line just before actual events harvesting routine. This is fully compliant to what is said in the comment of the patch where the actual fatal_signal_pending() check was added: c257a340ede0 ("fs, epoll:
short circuit fetching events if thread has been killed").
--- fs/eventpoll.c | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-)
fs/eventpoll.c +28 -20
@@ -1857,34 +1857,33 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,* event delivery. */ init_wait (&wait); -write_lock_irq (&ep->lock); -__add_wait_queue_exclusive (&ep->wq, &wait); -write_unlock_irq (&ep->lock); +write_lock_irq (&ep->lock);/* -* We don't want to sleep if the ep_poll_callback() sends us -* a wakeup in between. That's why we set the task state -* to TASK_INTERRUPTIBLE before doing the checks. +* Barrierless variant, waitqueue_active() is called under +* the same lock on wakeup ep_poll_callback() side, so it +* is safe to avoid an explicit barrier. */ -set_current_state (TASK_INTERRUPTIBLE ); +__set_current_state (TASK_INTERRUPTIBLE ); +/* -* Always short-circuit for fatal signals to allow -* threads to make a timely exit without the chance of -* finding more events available and fetching -* repeatedly. +* Do the final check under the lock. ep_scan_ready_list() +* plays with two lists (->rdllist and ->ovflist) and there +* is always a race when both lists are empty for short +* period of time although events are pending, so lock is +* important. */ -if (fatal_signal_pending (current)) { - res = -EINTR ; -break ; + eavail =ep_events_available (ep); +if (!eavail) { +if (signal_pending (current)) + res = -EINTR ; +else +__add_wait_queue_exclusive (&ep->wq, &wait); } +write_unlock_irq (&ep->lock); - eavail =ep_events_available (ep); -if (eavail) -break ; -if (signal_pending (current)) { - res = -EINTR ; +if (eavail || res)break ; - }if (!schedule_hrtimeout_range (to, slack,HRTIMER_MODE_ABS )) { timed_out =1 ;
@@ -1905,6 +1904,15 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, } send_events: +if (fatal_signal_pending (current)) { +/* +* Always short-circuit for fatal signals to allow +* threads to make a timely exit without the chance of +* finding more events available and fetching +* repeatedly. +*/ + res = -EINTR ; + }/* * Try to transfer events to user space. In case we get 0 events and * there's still timeout left over, we go trying again in search of
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 122/194 bpf: Fix bug in mmap() implementation for BPF array map
In reply to Greg Kroah-Hartman[ Upstream commit 333291ce5055f2039afc907badaf5b66bc1adfdc ]
mmap() subsystem allows user-space application to memory-map region with initial page offset. This wasn't taken into account in initial implementation of BPF array memory-mapping. This would result in wrong pages, not taking into account requested page shift, being memory-mmaped into user-space. This patch fixes this gap and adds a test for such scenario.
--- kernel/bpf/arraymap.c | 7 ++++++- tools/testing/selftests/bpf/prog_tests/mmap.c | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-)
kernel/bpf/arraymap.c +6 -1
@@ -486,7 +486,12 @@ static int array_map_mmap(struct bpf_map *map, struct vm_area_struct *vma)if (!(map->map_flags &BPF_F_MMAPABLE ))return -EINVAL ; -return remap_vmalloc_range (vma,array_map_vmalloc_addr (array), pgoff); +if (vma->vm_pgoff *PAGE_SIZE + (vma->vm_end - vma->vm_start) > +PAGE_ALIGN ((u64 )array->map.max_entries * array->elem_size)) +return -EINVAL ; + +return remap_vmalloc_range (vma,array_map_vmalloc_addr (array), + vma->vm_pgoff + pgoff); }const struct bpf_map_ops array_map_ops = {
tools/testing/selftests/bpf/prog_tests/mmap.c +9 -0
@@ -197,6 +197,15 @@ void test_mmap(void)CHECK_FAIL (map_data->val[far] !=3 *321 );munmap (tmp2,4 * page_size); + +/* map all 4 pages, but with pg_off=1 page, should fail */ + tmp1 =mmap (NULL ,4 * page_size,PROT_READ ,MAP_SHARED |MAP_FIXED , + data_map_fd, page_size/* initial page shift */ ); +if (CHECK (tmp1 !=MAP_FAILED ,"adv_mmap7" ,"unexpected success" )) { +munmap (tmp1,4 * page_size); + goto cleanup; + } + cleanup:if (bss_mmaped)CHECK_FAIL (munmap (bss_mmaped, bss_sz));
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 123/194 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
@@ -30,6 +30,7 @@#define encode_dirpath_sz (1 + XDR_QUADLEN(MNTPATHLEN))#define MNT_status_sz (1)#define MNT_fhandle_sz XDR_QUADLEN(NFS2_FHSIZE) +#define MNT_fhandlev3_sz XDR_QUADLEN(NFS3_FHSIZE)#define MNT_authflav3_sz (1 + NFS_MAX_SECFLAVORS)/*
@@ -37,7 +38,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 124/194 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 125/194 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
@@ -664,9 +664,11 @@ int rds_cmsg_rdma_args(struct rds_sock * op->op_odp_mr =NULL ;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
@@ -905,9 +907,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
@@ -852,8 +852,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 126/194 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
@@ -708,10 +708,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)
@@ -861,6 +857,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
@@ -1249,14 +1233,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
@@ -466,7 +466,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 127/194 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
@@ -857,6 +857,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 128/194 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
@@ -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) # Enabled with W=2, disabled by default as noisy KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized)
Greg Kroah-Hartman
maintainerPATCH 129/194 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
@@ -860,6 +860,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 130/194 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
@@ -862,6 +862,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 131/194 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 +- scripts/kallsyms.c | 2 +- 3 files changed, 3 insertions(+), 3 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 */
scripts/kallsyms.c +1 -1
@@ -34,7 +34,7 @@ struct sym_entry {unsigned int len;unsigned int start_pos;unsigned int percpu_absolute; -unsigned char sym[0 ]; +unsigned char sym[]; };struct addr_range {
Greg Kroah-Hartman
maintainerPATCH 132/194 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
@@ -542,7 +542,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 133/194 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
@@ -287,7 +287,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);
@@ -400,7 +400,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
@@ -322,7 +322,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);
@@ -434,7 +434,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 134/194 bootconfig: Fix to remove bootconfig data from initrd while boot
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
commit de462e5f10718517bacf2f84c8aa2804567ef7df upstream.
If there is a bootconfig data in the tail of initrd/initramfs, initrd image sanity check caused an error while decompression stage as follows.
[ 0.883882] Unpacking initramfs... [ 2.696429] Initramfs unpacking failed: invalid magic at start of compressed archive
This error will be ignored if CONFIG_BLK_DEV_RAM=n, but CONFIG_BLK_DEV_RAM=y the kernel failed to mount rootfs and causes a panic.
To fix this issue, shrink down the initrd_end for removing tailing bootconfig data while boot the kernel.
--- init/main.c | 69 +++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 17 deletions(-)
init/main.c +52 -17
@@ -257,6 +257,47 @@ static int __init loglevel(char *str)early_param ("loglevel" , loglevel); +#ifdef CONFIG_BLK_DEV_INITRD +static void *__init get_boot_config_from_initrd (u32 *_size,u32 *_csum) +{ +u32 size, csum; +char *data; +u32 *hdr; + +if (!initrd_end) +return NULL ; + + data = (char *)initrd_end -BOOTCONFIG_MAGIC_LEN ; +if (memcmp (data,BOOTCONFIG_MAGIC ,BOOTCONFIG_MAGIC_LEN )) +return NULL ; + + hdr = (u32 *)(data -8 ); + size = hdr[0 ]; + csum = hdr[1 ]; + + data = ((void *)hdr) - size; +if ((unsigned long )data < initrd_start) { +pr_err ("bootconfig size %d is greater than initrd size %ld\n" , + size, initrd_end - initrd_start); +return NULL ; + } + +/* Remove bootconfig from initramfs/initrd */ + initrd_end = (unsigned long )data; +if (_size) + *_size = size; +if (_csum) + *_csum = csum; + +return data; +} +#else +static void *__init get_boot_config_from_initrd (u32 *_size,u32 *_csum) +{ +return NULL ; +} +#endif +#ifdef CONFIG_BOOT_CONFIG char xbc_namebuf[XBC_KEYLEN_MAX ]__initdata ;
@@ -355,9 +396,12 @@ static void __init setup_boot_config(constatic char tmp_cmdline[COMMAND_LINE_SIZE ]__initdata ;u32 size, csum;char *data, *copy; -u32 *hdr;int ret; + data =get_boot_config_from_initrd (&size, &csum); +if (!data) + goto not_found; +strlcpy (tmp_cmdline, boot_command_line,COMMAND_LINE_SIZE );parse_args ("bootconfig" , tmp_cmdline,NULL ,0 ,0 ,0 ,NULL , bootconfig_params);
@@ -365,27 +409,12 @@ static void __init setup_boot_config(conif (!bootconfig_found)return ; -if (!initrd_end) - goto not_found; - - data = (char *)initrd_end -BOOTCONFIG_MAGIC_LEN ; -if (memcmp (data,BOOTCONFIG_MAGIC ,BOOTCONFIG_MAGIC_LEN )) - goto not_found; - - hdr = (u32 *)(data -8 ); - size = hdr[0 ]; - csum = hdr[1 ]; -if (size >=XBC_DATA_MAX ) {pr_err ("bootconfig size %d greater than max size %d\n" , size,XBC_DATA_MAX );return ; } - data = ((void *)hdr) - size; -if ((unsigned long )data < initrd_start) - goto not_found; -if (boot_config_checksum ((unsigned char *)data, size) != csum) {pr_err ("bootconfig checksum failed\n" );return ;
@@ -414,8 +443,14 @@ static void __init setup_boot_config(con not_found: pr_err("'bootconfig' found on command line, but no bootconfig found\n"); } +#else -#define setup_boot_config (cmdline) do { } while (0) + +static void __init setup_boot_config (const char *cmdline) +{ +/* Remove bootconfig data from initrd */ +get_boot_config_from_initrd (NULL ,NULL ); +}static int __init warn_bootconfig (char *str) {
Greg Kroah-Hartman
maintainerPATCH 135/194 bootconfig: Fix to prevent warning message if no bootconfig option
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
commit 611d0a95d46b0977a530b4d538948c69d447b001 upstream.
Commit de462e5f1071 ("bootconfig: Fix to remove bootconfig data from initrd while boot") causes a cosmetic regression on dmesg, which warns "no bootconfig data" message without bootconfig cmdline option.
Fix setup_boot_config() by moving no bootconfig check after commandline option check.
--- init/main.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
init/main.c +6 -4
@@ -398,9 +398,8 @@ static void __init setup_boot_config(conchar *data, *copy;int ret; +/* Cut out the bootconfig data even if we have no bootconfig option */ data =get_boot_config_from_initrd (&size, &csum); -if (!data) - goto not_found;strlcpy (tmp_cmdline, boot_command_line,COMMAND_LINE_SIZE ); parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL,
@@ -409,6 +408,11 @@ static void __init setup_boot_config(conif (!bootconfig_found)return ; +if (!data) { +pr_err ("'bootconfig' found on command line, but no bootconfig found\n" ); +return ; + } +if (size >=XBC_DATA_MAX ) {pr_err ("bootconfig size %d greater than max size %d\n" , size,XBC_DATA_MAX );
@@ -440,8 +444,6 @@ static void __init setup_boot_config(con extra_init_args = xbc_make_cmdline("init"); }return ; -not_found: -pr_err ("'bootconfig' found on command line, but no bootconfig found\n" ); }#else
Greg Kroah-Hartman
maintainerPATCH 136/194 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 137/194 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 138/194 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 139/194 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 140/194 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
@@ -120,6 +120,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;
@@ -669,6 +680,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;
@@ -1019,8 +1035,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)
@@ -1039,16 +1057,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,
@@ -1342,6 +1363,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)
@@ -1373,6 +1395,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 141/194 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 142/194 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
@@ -39,6 +39,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
@@ -5621,8 +5622,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 143/194 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 144/194 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
@@ -2548,7 +2548,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 145/194 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 146/194 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
@@ -3425,8 +3425,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 147/194 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
@@ -478,8 +478,7 @@ static int intel_fbc_alloc_cfb(struct drif (!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 148/194 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 149/194 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 >; };