4.14.45-stable review
Subsystems (8)
Greg Kroah-Hartman
maintainercover 4.14.45-stable review
This is the start of the stable review cycle for the 4.14.45 release. There are 496 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 May 30 10:00:57 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.14.45-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.14.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.14.45-rc1
Deepak Rawat <[email protected]>
drm/vmwgfx: Set dmabuf_size when vmw_dmabuf_init is successful
Randy Dunlap <[email protected]>
kdb: make "mdr" command repeat
Jan Kundrát <[email protected]>
pinctrl: mcp23s08: spi: Fix regmap debugfs entries
Bjorn Andersson <[email protected]>
pinctrl: msm: Use dynamic GPIO numbering
Christophe JAILLET <[email protected]>
regulator: of: Add a missing 'of_node_put()' in an error handling path of 'of_regulator_match()'
Laurent Pinchart <[email protected]>
ARM: dts: porter: Fix HDMI output routing
Aapo Vienamo <[email protected]>
ARM: dts: imx7d: cl-som-imx7: fix pinctrl_enet
Filip Sadowski <[email protected]>
i40e: Add delay after EMP reset for firmware to recover
Charles Keepax <[email protected]>
regmap: Correct comparison in regmap_cached
Peter Rosin <[email protected]>
ARM: dts: at91: tse850: use the correct compatible for the eeprom
Sergei Shtylyov <[email protected]>
drm: rcar-du: lvds: Fix LVDS startup on R-Car Gen2
Sergei Shtylyov <[email protected]>
drm: rcar-du: lvds: Fix LVDS startup on R-Car Gen3
Richard Haines <[email protected]>
netlabel: If PF_INET6, check sk_buff ip header version
Prashant Bhole <[email protected]>
selftests/net: fixes psock_fanout eBPF test case
Jiri Olsa <[email protected]>
perf tests: Fix dwarf unwind for stripped binaries
Jiri Olsa <[email protected]>
perf report: Fix memory corruption in --branch-history mode --branch-history
Jiri Olsa <[email protected]>
perf tests: Use arch__compare_symbol_names to compare symbols
Jin Yao <[email protected]>
perf report: Fix wrong jump arrow
Thomas Richter <[email protected]>
perf test: Fix test case inet_pton to accept inlines.
Baoquan He <[email protected]>
x86/apic: Set up through-local-APIC mode on the boot CPU if 'noapic' specified
Ørjan Eide <[email protected]>
drm/rockchip: Respect page offset for PRIME mmap calls
Joe Perches <[email protected]>
MIPS: Octeon: Fix logging messages with spurious periods after newlines
Jake Moroni <[email protected]>
dpaa_eth: fix pause capability advertisement logic
Takeshi Kihara <[email protected]>
pinctrl: sh-pfc: r8a7796: Fix MOD_SEL register pin assignment for SSI pins group
Tejun Heo <[email protected]>
rcu: Call touch_nmi_watchdog() while printing stall warnings
Niklas Cassel <[email protected]>
net: stmmac: call correct function in stmmac_mac_config_rx_queues_routing()
Richard Guy Briggs <[email protected]>
audit: return on memory error to avoid null pointer dereference
Rafael J. Wysocki <[email protected]>
PCMCIA / PM: Avoid noirq suspend aborts during suspend-to-idle
Henry Zhang <[email protected]>
ARM: dts: bcm283x: Fix pin function of JTAG pins
Stefan Wahren <[email protected]>
ARM: dts: bcm283x: Fix probing of bcm2835-i2s
Ladislav Michl <[email protected]>
power: supply: ltc2941-battery-gauge: Fix temperature units
Sergei Shtylyov <[email protected]>
sh_eth: fix TSU init on SH7734/R8A7740
Jacob Keller <[email protected]>
ixgbe: prevent ptp_rx_hang from running when in FILTER_ALL mode
Jan Kara <[email protected]>
udf: Provide saner default for invalid uid / gid
Thomas Vincent-Cross <[email protected]>
PCI: Add function 1 DMA alias quirk for Marvell 88SE9220
Madalin Bucur <[email protected]>
dpaa_eth: fix SG mapping
Viresh Kumar <[email protected]>
cpufreq: Reorder cpufreq_online() error code path
Niklas Cassel <[email protected]>
net: stmmac: ensure that the MSS desc is the last desc to set the own bit
Niklas Cassel <[email protected]>
net: stmmac: ensure that the device has released ownership before reading data
Monk Liu <[email protected]>
drm/amdgpu: adjust timeout for ib_ring_tests(v2)
Monk Liu <[email protected]>
drm/amdgpu: disable GFX ring and disable PQ wptr in hw_fini
Ravikumar Kattekola <[email protected]>
ARM: dts: dra71-evm: Correct evm_sd regulator max voltage
Laurent Pinchart <[email protected]>
drm: omapdrm: dss: Move initialization code from component bind to probe
Srinivas Kandagatla <[email protected]>
dmaengine: qcom: bam_dma: get num-channels and num-ees from dt
Cornelia Huck <[email protected]>
vfio-ccw: fence off transport mode
Niklas Cassel <[email protected]>
pinctrl: artpec6: dt: add missing pin group uart5nocts
Richard Fitzgerald <[email protected]>
pinctrl: devicetree: Fix dt_to_map_one_config handling of hogs
[email protected] <[email protected]>
hwrng: stm32 - add reset during probe
Alexey Khoroshilov <[email protected]>
watchdog: asm9260_wdt: fix error handling in asm9260_wdt_probe()
Govindarajulu Varadarajan <[email protected]>
enic: enable rq before updating rq descriptors
Yoshihiro Shimoda <[email protected]>
dmaengine: rcar-dmac: Check the done lists in rcar_dmac_chan_get_residue()
Qi Hou <[email protected]>
dmaengine: pl330: fix a race condition in case of threaded irqs
Ming Lei <[email protected]>
block: null_blk: fix 'Invalid parameters' when loading module
Dexuan Cui <[email protected]>
tools: hv: fix compiler warnings about major/target_fname
Linus Walleij <[email protected]>
drm/bridge: sii902x: Retry status read after DDI I2C
Vivek Gautam <[email protected]>
phy: qcom-qmp: Fix phy pipe clock gating
Takashi Iwai <[email protected]>
ALSA: vmaster: Propagate slave error
Shawn Lin <[email protected]>
phy: rockchip-emmc: retry calpad busy trimming
Ivan Gorinov <[email protected]>
x86/devicetree: Fix device IRQ settings in DT
Ivan Gorinov <[email protected]>
x86/devicetree: Initialize device tree before using it
Andreas Gruenbacher <[email protected]>
gfs2: Fix fallocate chunk size
Bjorn Andersson <[email protected]>
soc: qcom: wcnss_ctrl: Fix increment in NV upload
Ilia Lin <[email protected]>
arm64: dts: qcom: Fix SPI5 config on MSM8996
Kan Liang <[email protected]>
perf/x86/intel: Fix event update for auto-reload
Kan Liang <[email protected]>
perf/x86/intel: Fix large period handling on Broadwell CPUs
Mark Rutland <[email protected]>
efi/arm*: Only register page tables when they exist
Maurizio Lombardi <[email protected]>
cdrom: do not call check_disk_change() inside cdrom_open()
Kan Liang <[email protected]>
perf/x86/intel: Properly save/restore the PMU state in the NMI handler
Guenter Roeck <[email protected]>
hwmon: (pmbus/adm1275) Accept negative page register values
Guenter Roeck <[email protected]>
hwmon: (pmbus/max8688) Accept negative page register values
Eric Anholt <[email protected]>
drm/panel: simple: Fix the bus format for the Ontat panel
Peter Zijlstra <[email protected]>
perf/core: Fix perf_output_read_group()
Pierre Bourdon <[email protected]>
max17042: propagate of_node to power supply device
leilei.lin <[email protected]>
perf/core: Fix installing cgroup events on CPU
Chao Yu <[email protected]>
f2fs: fix to check extent cache in f2fs_drop_extent_tree
Chao Yu <[email protected]>
f2fs: fix to clear CP_TRIMMED_FLAG
Chao Yu <[email protected]>
f2fs: fix to set KEEP_SIZE bit in f2fs_zero_range
Vaibhav Jain <[email protected]>
cxl: Check if PSL data-cache is available before issue flush request
Alistair Popple <[email protected]>
powerpc/powernv/npu: Fix deadlock in mmio_invalidate()
Mathieu Malaterre <[email protected]>
powerpc: Add missing prototype for arch_irq_work_raise()
Christophe JAILLET <[email protected]>
drm/meson: Fix an un-handled error path in 'meson_drv_bind_master()'
Christophe JAILLET <[email protected]>
drm/meson: Fix some error handling paths in 'meson_drv_bind_master()'
Kamlakant Patel <[email protected]>
ipmi_ssif: Fix kernel panic at msg_done_handler
Milton Miller <[email protected]>
watchdog: aspeed: Fix translation of reset mode to ctrl register
Brian Norris <[email protected]>
watchdog: dw: RMW the control register
Rafael J. Wysocki <[email protected]>
PCI: Restore config space on runtime resume despite being unbound
Mathias Kresin <[email protected]>
MIPS: ath79: Fix AR724X_PLL_REG_PCIE_CONFIG offset
Ursula Braun <[email protected]>
net/smc: pay attention to MAX_ORDER for CQ entries
Christophe Jaillet <[email protected]>
spi: bcm-qspi: fIX some error handling paths
Christophe Jaillet <[email protected]>
regulator: gpio: Fix some error handling paths in 'gpio_regulator_probe()'
Leo Yan <[email protected]>
coresight: Use %px to print pcsr instead of %p
Oded Gabbay <[email protected]>
drm/amdkfd: add missing include of mm.h
Parav Pandit <[email protected]>
IB/core: Honor port_num while resolving GID for IB link layer
Thomas Richter <[email protected]>
perf stat: Fix core dump when flag T is used
Yisheng Xie <[email protected]>
perf top: Fix top.call-graph config option reading
Vitaly Kuznetsov <[email protected]>
KVM: lapic: stop advertising DIRECTED_EOI when in-kernel IOAPIC is in use
Gregory CLEMENT <[email protected]>
i2c: mv64xxx: Apply errata delay only in standard mode
Arjun Vynipadath <[email protected]>
cxgb4: Fix queue free path of ULD drivers
Seunghun Han <[email protected]>
ACPICA: acpi: acpica: fix acpi operand cache leak in nseval.c
Bob Moore <[email protected]>
ACPICA: Fix memory leak on unusual memory leak
Erik Schmauss <[email protected]>
ACPICA: Events: add a return on failure from acpi_hw_register_read
Icenowy Zheng <[email protected]>
dt-bindings: add device tree binding for Allwinner H6 main CCU
Christophe JAILLET <[email protected]>
remoteproc: imx_rproc: Fix an error handling path in 'imx_rproc_probe()'
Coly Li <[email protected]>
bcache: quit dc->writeback_thread when BCACHE_DEV_DETACHING is set
Michael Schmitz <[email protected]>
zorro: Set up z->dev.dma_mask for the DMA API
Honggang Li <[email protected]>
IB/mlx5: Set the default active rate and width to QDR and 4X
Chunyu Hu <[email protected]>
cpufreq: cppc_cpufreq: Fix cppc_cpufreq_init() failure path
Yong Wu <[email protected]>
iommu/mediatek: Fix protect memory setting
Thomas Hellstrom <[email protected]>
drm/vmwgfx: Unpin the screen object backup buffer when not used
Eric Sandeen <[email protected]>
ext4: don't complain about incorrect features when probing
Philipp Puschmann <[email protected]>
arm: dts: socfpga: fix GIC PPI warning
Jay Vosburgh <[email protected]>
virtio-net: Fix operstate for virtio when no VIRTIO_NET_F_STATUS
Milton Miller <[email protected]>
watchdog: aspeed: Allow configuring for alternate boot
Petr Vorel <[email protected]>
ima: Fallback to the builtin hash algorithm
Jiandi An <[email protected]>
ima: Fix Kconfig to select TPM 2.0 CRB interface
Arjun Vynipadath <[email protected]>
cxgb4: Setup FW queues before registering netdev
Sebastian Gottschall <[email protected]>
ath9k: fix crash in spectral scan
Jarosław Janik <[email protected]>
nvme-pci: disable APST for Samsung NVMe SSD 960 EVO + ASUS PRIME Z370-A
Karthikeyan Periyasamy <[email protected]>
ath10k: Fix kernel panic while using worker (ath10k_sta_rc_update_wk)
Alexey Khoroshilov <[email protected]>
watchdog: davinci_wdt: fix error handling in davinci_wdt_probe()
Leon Romanovsky <[email protected]>
net/mlx5: Protect from command bit overflow
Michael Ellerman <[email protected]>
selftests: Print the test we're running to /dev/kmsg
Frank Asseg <[email protected]>
tools/thermal: tmon: fix for segfault
Amitkumar Karwar <[email protected]>
rsi: fix kernel panic observed on 64bit machine
Michael Ellerman <[email protected]>
powerpc/perf: Fix kernel address leak via sampling registers
Madhavan Srinivasan <[email protected]>
powerpc/perf: Prevent kernel address leak to userspace via BHRB buffer
Guenter Roeck <[email protected]>
hwmon: (nct6775) Fix writing pwmX_mode
Helge Deller <[email protected]>
parisc/pci: Switch LBA PCI bus from Hard Fail to Soft Fail mode
Luca Coelho <[email protected]>
iwlwifi: mvm: check if mac80211_queue is valid in iwl_mvm_disable_txq
Greg Ungerer <[email protected]>
m68k: set dma and coherent masks for platform FEC ethernets
Alexander Shishkin <[email protected]>
intel_th: Use correct method of finding hub
Sebastian Andrzej Siewior <[email protected]>
iommu/amd: Take into account that alloc_dev_data() may return NULL
Anilkumar Kolli <[email protected]>
ath10k: advertize beacon_int_min_gcd
Harry Morris <[email protected]>
ieee802154: ca8210: fix uninitialised data read
Michael Ellerman <[email protected]>
powerpc/mpic: Check if cpu_possible() in mpic_physmask()
Lenny Szubowicz <[email protected]>
ACPI: acpi_pad: Fix memory leak in power saving threads
Aaro Koskinen <[email protected]>
drivers: macintosh: rack-meter: really fix bogus memsets
Dan Carpenter <[email protected]>
xen/acpi: off by one in read_acpi_id()
David Howells <[email protected]>
rxrpc: Don't treat call aborts as conn aborts
David Howells <[email protected]>
rxrpc: Fix Tx ring annotation after initial Tx failure
Qu Wenruo <[email protected]>
btrfs: qgroup: Fix root item corruption when multiple same source snapshots are created with quota enabled
Jeff Mahoney <[email protected]>
btrfs: fix lockdep splat in btrfs_alloc_subvolume_writers
Filipe Manana <[email protected]>
Btrfs: fix copy_items() return value when logging an inode
Qu Wenruo <[email protected]>
btrfs: tests/qgroup: Fix wrong tree backref level
Nicholas Piggin <[email protected]>
powerpc/64s: sreset panic if there is no debugger or crash dump handlers
Florian Fainelli <[email protected]>
net: bgmac: Correctly annotate register space
Florian Fainelli <[email protected]>
net: bgmac: Fix endian access in bgmac_dma_tx_ring_free()
David S. Miller <[email protected]>
sparc64: Make atomic_xchg() an inline function rather than a macro.
David Howells <[email protected]>
fscache: Fix hanging wait on page discarded by writeback
Alexander Graf <[email protected]>
lan78xx: Connect phy early
Sean Christopherson <[email protected]>
KVM: VMX: raise internal error for exception during invalid protected mode state
Sai Praneeth <[email protected]>
x86/mm: Fix bogus warning during EFI bootup, use boot_cpu_has() instead of this_cpu_has() in build_cr3_noflush()
Davidlohr Bueso <[email protected]>
sched/rt: Fix rq->clock_update_flags < RQCF_ACT_SKIP warning
Nicholas Piggin <[email protected]>
powerpc/64s/idle: Fix restore of AMOR on POWER9 after deep sleep
Jun Piao <[email protected]>
ocfs2/dlm: don't handle migrate lockres if already in shutdown
Mikhail Malygin <[email protected]>
IB/rxe: Fix for oops in rxe_register_device on ppc64le arch
Nikolay Borisov <[email protected]>
btrfs: Fix possible softlock on single core machines
Liu Bo <[email protected]>
Btrfs: fix NULL pointer dereference in log_dir_items
Liu Bo <[email protected]>
Btrfs: bail out on error during replay_dir_deletes
Yang Shi <[email protected]>
mm: thp: fix potential clearing to referenced flag in page_idle_clear_pte_refs_one()
Huang Ying <[email protected]>
mm: fix races between address_space dereference and free in page_evicatable
Claudio Imbrenda <[email protected]>
mm/ksm: fix interaction with THP
Thomas Falcon <[email protected]>
ibmvnic: Zero used TX descriptor counter on reset
Esben Haabendal <[email protected]>
dp83640: Ensure against premature access to PHY registers after reset
Sandipan Das <[email protected]>
perf clang: Add support for recent clang versions
Sandipan Das <[email protected]>
perf tools: Fix perf builds with clang support
Anshuman Khandual <[email protected]>
powerpc/fscr: Enable interrupts earlier before calling get_user()
Shunyong Yang <[email protected]>
cpufreq: CPPC: Initialize shared perf capabilities of CPUs
Carlos Maiolino <[email protected]>
Force log to disk before reading the AGF during a fstrim
Jens Axboe <[email protected]>
sr: get/drop reference to device in revalidate and check_events
Xidong Wang <[email protected]>
z3fold: fix memory leak
Tom Abraham <[email protected]>
swap: divide-by-zero when zero length swap file on ssd
Danilo Krummrich <[email protected]>
fs/proc/proc_sysctl.c: fix potential page fault while unregistering sysctl table
Dave Hansen <[email protected]>
x86/mm: Do not forbid _PAGE_RW before init for __ro_after_init
Joerg Roedel <[email protected]>
x86/pgtable: Don't set huge PUD/PMD on non-leaf entries
Filipe Manana <[email protected]>
Btrfs: fix loss of prealloc extents past i_size after fsync log replay
Liu Bo <[email protected]>
Btrfs: clean up resources during umount after trans is aborted
Johannes Thumshirn <[email protected]>
nvme: don't send keep-alives to the discovery controller
Jean Delvare <[email protected]>
firmware: dmi_scan: Fix UUID length safety check
Rich Felker <[email protected]>
sh: fix debug trap failure to process signals before return to user
Yelena Krivosheev <[email protected]>
net: mvneta: fix enable of all initialized RXQs
Toshiaki Makita <[email protected]>
vlan: Fix vlan insertion for packets without ethernet header
Toshiaki Makita <[email protected]>
net: Fix untag for vlan packets without ethernet header
Manish Chopra <[email protected]>
qede: Do not drop rx-checksum invalidated packets.
Stephen Hemminger <[email protected]>
hv_netvsc: enable multicast if necessary
Vinayak Menon <[email protected]>
mm/kmemleak.c: wait for scan completion before disabling free
Steven J. Hill <[email protected]>
mm/vmstat.c: fix vmstat_update() preemption BUG
Maninder Singh <[email protected]>
mm/page_owner: fix recursion bug after changing skip entries
Shakeel Butt <[email protected]>
mm, slab: memcg_link the SLAB's kmem_cache
Manish Chopra <[email protected]>
qede: Fix barrier usage after tx doorbell write.
Jan Kiszka <[email protected]>
builddeb: Fix header package regarding dtc source links
Cong Wang <[email protected]>
llc: properly handle dev_queue_xmit() return value
Alexey Dobriyan <[email protected]>
x86/alternatives: Fixup alternative_call_2
Stephane Eranian <[email protected]>
perf/x86/intel: Fix linear IP of PEBS real_ip on Haswell and later CPUs
Or Gerlitz <[email protected]>
net/mlx5: Make eswitch support to depend on switchdev
Sean Wang <[email protected]>
net: dsa: mt7530: fix module autoloading for OF platform drivers
Xin Long <[email protected]>
bonding: fix the err path for dev hwaddr sync in bond_enslave
Pawel Dembicki <[email protected]>
net: qmi_wwan: add BroadMobi BM806U 2020:2033
Raghuram Chary J <[email protected]>
lan78xx: Set ASD in MAC_CR when EEE is enabled.
Jinbum Park <[email protected]>
ARM: 8748/1: mm: Define vdso_start, vdso_end as array
Linus Lüssing <[email protected]>
batman-adv: fix packet loss for broadcasted DHCP packets to a server
Linus Lüssing <[email protected]>
batman-adv: fix multicast-via-unicast transmission with AP isolation
Felix Kuehling <[email protected]>
drm/amdkfd: Fix scratch memory with HWS enabled
Masami Hiramatsu <[email protected]>
selftests: ftrace: Add a testcase for probepoint
Masami Hiramatsu <[email protected]>
selftests: ftrace: Add a testcase for string type with kprobe_event
Masami Hiramatsu <[email protected]>
selftests: ftrace: Add probe event argument syntax testcase
Steffen Klassert <[email protected]>
xfrm: Fix transport mode skb control buffer usage.
David Rientjes <[email protected]>
mm, thp: do not cause memcg oom for thp
Yisheng Xie <[email protected]>
mm/mempolicy.c: avoid use uninitialized preferred_node
Y.C. Chen <[email protected]>
drm/ast: Fixed 1280x800 Display Issue
Dan Carpenter <[email protected]>
macsec: missing dev_put() on error in macsec_newlink()
Florian Fainelli <[email protected]>
net: dsa: Fix functional dsa-loop dependency on FIXED_PHY
Davide Caratti <[email protected]>
net/sched: fix idr leak in the error path of tcf_skbmod_init()
Davide Caratti <[email protected]>
net/sched: fix idr leak in the error path of __tcf_ipt_init()
Davide Caratti <[email protected]>
net/sched: fix idr leak in the error path of tcp_pedit_init()
Davide Caratti <[email protected]>
net/sched: fix idr leak in the error path of tcf_act_police_init()
Davide Caratti <[email protected]>
net/sched: fix idr leak in the error path of tcf_simp_init()
Davide Caratti <[email protected]>
net/sched: fix idr leak on the error path of tcf_bpf_init()
Kalderon, Michal <[email protected]>
RDMA/qedr: Fix QP state initialization race
Kalderon, Michal <[email protected]>
RDMA/qedr: Fix rc initialization on CNQ allocation failure
Kalderon, Michal <[email protected]>
RDMA/qedr: fix QP's ack timeout configuration
Chien Tin Tung <[email protected]>
RDMA/ucma: Correct option size check using optlen
Nicolas Pitre <[email protected]>
kbuild: make scripts/adjust_autoksyms.sh robust against timestamp races
Stefan Wahren <[email protected]>
brcmfmac: Fix check for ISO3166 code
Song Liu <[email protected]>
perf/cgroup: Fix child event counting bug
Thierry Reding <[email protected]>
drm/tegra: Shutdown on driver unbind
Avraham Stern <[email protected]>
iwlwifi: mvm: fix array out of bounds reference
Avraham Stern <[email protected]>
iwlwifi: mvm: make sure internal station has a valid id
Avraham Stern <[email protected]>
iwlwifi: mvm: clear tx queue id when unreserving aggregation queue
Andrei Otcheretianski <[email protected]>
iwlwifi: mvm: Increase session protection time after CS
Stefano Brivio <[email protected]>
vti6: Fix dev->max_mtu setting
Stefano Brivio <[email protected]>
vti4: Don't override MTU passed on link creation via IFLA_MTU
Stefano Brivio <[email protected]>
ip_tunnel: Clamp MTU to bounds on new link
Stefano Brivio <[email protected]>
vti4: Don't count header length twice on tunnel setup
Sven Eckelmann <[email protected]>
batman-adv: Fix skbuff rcsum on packet reroute
Davide Caratti <[email protected]>
net/sched: fix NULL dereference in the error path of tcf_sample_init()
Matthias Schiffer <[email protected]>
batman-adv: fix header size check in batadv_dbg_arp()
Toshiaki Makita <[email protected]>
vlan: Fix out of order vlan headers with reorder header off
Toshiaki Makita <[email protected]>
net: Fix vlan untag for bridge and vlan_dev with reorder_hdr off
Rob Herring <[email protected]>
microblaze: switch to NO_BOOTMEM
Johannes Berg <[email protected]>
iwlwifi: mvm: fix error checking for multi/broadcast sta
Beni Lev <[email protected]>
iwlwifi: mvm: Correctly set IGTK for AP
Emmanuel Grumbach <[email protected]>
iwlwifi: mvm: set the correct tid when we flush the MCAST sta
Taehee Yoo <[email protected]>
xfrm: fix rcu_read_unlock usage in xfrm_local_error
Karol Herbst <[email protected]>
drm/nouveau/bl: fix backlight regression
Lucas Stach <[email protected]>
drm/imx: move arming of the vblank event to atomic_flush
Arnd Bergmann <[email protected]>
gpu: ipu-v3: prg: avoid possible array underflow
Andre Przywara <[email protected]>
KVM: arm/arm64: vgic: Add missing irq_lock to vgic_mmio_read_pending
Cathy Zhou <[email protected]>
sunvnet: does not support GSO for sctp
Sabrina Dubroca <[email protected]>
ipv4: lock mtu in fnhe when received PMTU < net.ipv4.route.min_pmtu
Arvind Yadav <[email protected]>
workqueue: use put_device() instead of kfree()
Michael Chan <[email protected]>
bnxt_en: Check valid VNIC ID in bnxt_hwrm_vnic_set_tpa().
Bich HEMON <[email protected]>
can: m_can: select pinctrl state in each suspend/resume function
Wolfram Sang <[email protected]>
can: m_can: change comparison to bitshift when dealing with a mask
Florian Westphal <[email protected]>
netfilter: ebtables: fix erroneous reject of last rule
Gregory CLEMENT <[email protected]>
dmaengine: mv_xor_v2: Fix clock resource by adding a register clock
Luis R. Rodriguez <[email protected]>
lib/test_kmod.c: fix limit check on number of test devices created
Li Zhijian <[email protected]>
selftests/vm/run_vmtests: adjust hugetlb size according to nr_cpus
Marc Zyngier <[email protected]>
arm64: Relax ARM_SMCCC_ARCH_WORKAROUND_1 discovery
Bartosz Golaszewski <[email protected]>
ARM: davinci: fix the GPIO lookup for omapl138-hawk
Stephen Hemminger <[email protected]>
hv_netvsc: fix locking during VF setup
Stephen Hemminger <[email protected]>
hv_netvsc: fix locking for rx_mode
Stephen Hemminger <[email protected]>
hv_netvsc: fix filter flags
Arvind Yadav <[email protected]>
xen: xenbus: use put_device() instead of kfree()
Bhavesh Davda <[email protected]>
xen-blkfront: move negotiate_mq to cover all cases of new VBDs
Ganesh Goudar <[email protected]>
cxgb4: do not set needs_free_netdev for mgmt dev's
Parav Pandit <[email protected]>
IB/core: Fix possible crash to access NULL netdev
Jeremy Linton <[email protected]>
net: smsc911x: Fix unload crash when link is up
Hemanth Puranik <[email protected]>
net: qcom/emac: Use proper free methods during TX
Michal Kalderon <[email protected]>
qed: Free RoCE ILT Memory on rmmod qedr
Denis Kirjanov <[email protected]>
fsl/fman: avoid sleeping in atomic context while adding an address
Peter Malone <[email protected]>
fbdev: Fixing arbitrary kernel leak in case FBIOGETCMAP_SPARC in sbusfb_ioctl_helper().
Dan Carpenter <[email protected]>
IB/mlx5: Fix an error code in __mlx5_ib_modify_qp()
Jack M <[email protected]>
IB/mlx4: Include GID type when deleting GIDs from HW table under RoCE
Jack Morgenstein <[email protected]>
IB/mlx4: Fix corruption of RoCEv2 IPv4 GIDs
Kalderon, Michal <[email protected]>
RDMA/qedr: Fix iWARP write and send with immediate
Kalderon, Michal <[email protected]>
RDMA/qedr: Fix kernel panic when running fio over NFSoRDMA
Davidlohr Bueso <[email protected]>
ia64/err-inject: Use get_user_pages_fast()
Pierre-Yves Kerbrat <[email protected]>
e1000e: allocate ring descriptors with dma_zalloc_coherent
Benjamin Poirier <[email protected]>
e1000e: Fix check_for_link return value with autoneg off
Jiri Olsa <[email protected]>
perf record: Fix crash in pipe mode
Rob Herring <[email protected]>
ARM: dts: rockchip: Add missing #sound-dai-cells on rk3288
Stephen Hemminger <[email protected]>
hv_netvsc: propagate rx filters to VF
Stephen Hemminger <[email protected]>
hv_netvsc: filter multicast/broadcast
Stephen Hemminger <[email protected]>
hv_netvsc: use napi_schedule_irqoff
Linus Lüssing <[email protected]>
batman-adv: Fix multicast packet loss with a single WANT_ALL_IPV4/6 flag
Jayachandran C <[email protected]>
watchdog: sbsa: use 32-bit read for WCV
Igor Pylypiv <[email protected]>
watchdog: f71808e_wdt: Fix magic close handling
Ka-Cheong Poon <[email protected]>
rds: Incorrect reference counting in TCP socket creation
Ilan Peer <[email protected]>
iwlwifi: mvm: Correctly set the tid for mcast queue
Ilan Peer <[email protected]>
iwlwifi: mvm: Direct multicast frames to the correct station
Sara Sharon <[email protected]>
iwlwifi: mvm: fix "failed to remove key" message
Shaul Triebitz <[email protected]>
iwlwifi: avoid collecting firmware dump if not loaded
Sara Sharon <[email protected]>
iwlwifi: mvm: fix assert 0x2B00 on older FWs
Andrei Otcheretianski <[email protected]>
iwlwifi: mvm: Fix channel switch for count 0 and 1
Sara Sharon <[email protected]>
iwlwifi: mvm: fix TX of CCMP 256
Edward Cree <[email protected]>
net: ethtool: don't ignore return from driver get_fecparam method
Hannes Reinecke <[email protected]>
scsi: core: return BLK_STS_OK for DID_OK in __scsi_error_from_host_byte()
Michael Ellerman <[email protected]>
selftests/powerpc: Skip the subpage_prot tests if the syscall is unavailable
Ming Lei <[email protected]>
nvme: pci: pass max vectors as num_possible_cpus() to pci_alloc_irq_vectors
Wen Xiong <[email protected]>
nvme-pci: Fix EEH failure on ppc
Jiufei Xue <[email protected]>
block: display the correct diskname for bio
Chengguang Xu <[email protected]>
ceph: fix potential memory leak in init_caches()
Filipe Manana <[email protected]>
Btrfs: fix log replay failure after linking special file and fsync
Filipe Manana <[email protected]>
Btrfs: send, fix issuing write op when processing hole in no data mode
Jeff Mahoney <[email protected]>
btrfs: use kvzalloc to allocate btrfs_fs_info
Giulio Benetti <[email protected]>
drm/sun4i: Fix dclk_set_phase
Douglas Anderson <[email protected]>
arm64: dts: rockchip: Fix rk3399-gru-* s2r (pinctrl hogs, wifi reset)
Steffen Klassert <[email protected]>
xfrm: Fix ESN sequence number handling for IPsec GSO packets.
Tom St Denis <[email protected]>
drm/amd/amdgpu: Correct VRAM width for APUs with GMC9
Roger Pau Monne <[email protected]>
xen/pirq: fix error path cleanup when binding MSIs
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Fix the ib_reg failure cleanup
Devesh Sharma <[email protected]>
RDMA/bnxt_re: Fix incorrect DB offset calculation
Devesh Sharma <[email protected]>
RDMA/bnxt_re: Unconditionly fence non wire memory operations
Moni Shoua <[email protected]>
IB/mlx: Set slid to zero in Ethernet completion struct
Julian Anastasov <[email protected]>
ipvs: remove IPS_NAT_MASK check to fix passive FTP
Eugeniy Paltsev <[email protected]>
ARC: setup cpu possible mask according to possible-cpus dts property
Eugeniy Paltsev <[email protected]>
ARC: mcip: update MCIP debug mask when the new cpu came online
Eugeniy Paltsev <[email protected]>
ARC: mcip: halt GFRC counter when ARC cores halt
Ido Schimmel <[email protected]>
spectrum: Reference count VLAN entries
Ido Schimmel <[email protected]>
mlxsw: spectrum: Treat IPv6 unregistered multicast as broadcast
Jiri Pirko <[email protected]>
mlxsw: core: Fix flex keys scratchpad offset conflict
Karsten Graul <[email protected]>
net/smc: use link_id of server in confirm link reply
Max Gurtovoy <[email protected]>
nvmet: fix PSDT field check in command format
Joey Pabalinas <[email protected]>
net/tcp/illinois: replace broken algorithm reference link
Claudiu Manoil <[email protected]>
gianfar: Fix Rx byte accounting for ndev stats
Felix Fietkau <[email protected]>
clocksource/drivers/mips-gic-timer: Use correct shift count to extract data
Guenter Roeck <[email protected]>
powerpc/boot: Fix random libfdt related build errors
Stefan Wahren <[email protected]>
ARM: dts: bcm283x: Fix unit address of local_intc
Florian Fainelli <[email protected]>
ARM: dts: NSP: Fix amount of RAM on BCM958625HR
Gustavo A. R. Silva <[email protected]>
nbd: fix return value in error handling path
Xin Long <[email protected]>
sit: fix IFLA_MTU ignored on NEWLINK
Xin Long <[email protected]>
ip6_tunnel: fix IFLA_MTU ignored on NEWLINK
Xin Long <[email protected]>
ip_gre: fix IFLA_MTU ignored on NEWLINK
Tang Junhui <[email protected]>
bcache: fix kcrashes with fio in RAID5 backend dev
Yoshihiro Shimoda <[email protected]>
dmaengine: rcar-dmac: fix max_chunk_size for R-Car Gen3
Dave Airlie <[email protected]>
virtio-gpu: fix ioctl and expose the fixed status to userspace.
Eric Dumazet <[email protected]>
r8152: fix tx packets accounting
Daniel Díaz <[email protected]>
selftests/futex: Fix line continuation in Makefile
Ramon Fried <[email protected]>
qrtr: add MODULE_ALIAS macro to smd
David S. Miller <[email protected]>
ARM: orion5x: Revert commit 4904dbda41c8.
Colin Ian King <[email protected]>
xen/pvcalls: fix null pointer dereference on map->sock
Chengguang Xu <[email protected]>
ceph: fix dentry leak when failing to init debugfs
Chengguang Xu <[email protected]>
libceph, ceph: avoid memory leak when specifying same option several times
Colin Ian King <[email protected]>
clocksource/drivers/fsl_ftm_timer: Fix error return checking
Jianchao Wang <[email protected]>
nvme-pci: Fix nvme queue cleanup if IRQ setup fails
Sven Eckelmann <[email protected]>
batman-adv: Fix netlink dumping of BLA backbones
Sven Eckelmann <[email protected]>
batman-adv: Fix netlink dumping of BLA claims
Sven Eckelmann <[email protected]>
batman-adv: Ignore invalid batadv_v_gw during netlink send
Sven Eckelmann <[email protected]>
batman-adv: Ignore invalid batadv_iv_gw during netlink send
Florian Westphal <[email protected]>
netfilter: ebtables: convert BUG_ONs to WARN_ONs
Florian Westphal <[email protected]>
netfilter: ipt_CLUSTERIP: put config instead of freeing it
Florian Westphal <[email protected]>
netfilter: ipt_CLUSTERIP: put config struct if we can't increment ct refcount
Matthias Schiffer <[email protected]>
batman-adv: invalidate checksum on fragment reassembly
Matthias Schiffer <[email protected]>
batman-adv: fix packet checksum in receive path
Yufen Yu <[email protected]>
md/raid1: fix NULL pointer dereference
BingJing Chang <[email protected]>
md: fix a potential deadlock of raid5/raid10 reshape
Will Deacon <[email protected]>
fs: dcache: Use READ_ONCE when accessing i_dir_seq
Will Deacon <[email protected]>
fs: dcache: Avoid livelock between d_alloc_parallel and __d_add
Shyam Saini <[email protected]>
ARM: dts: imx6dl: Include correct dtsi file for Engicam i.CoreM6 DualLite/Solo RQS
Sebastian Ott <[email protected]>
kvm: fix warning for CONFIG_HAVE_KVM_EVENTFD builds
Chao Gao <[email protected]>
KVM: nVMX: Don't halt vcpu when L1 is injecting events to L2
Alexey Kodanev <[email protected]>
macvlan: fix use-after-free in macvlan_common_newlink()
Pratyush Anand <[email protected]>
arm64: fix unwind_frame() for filtered out fn for function graph tracing
Felix Fietkau <[email protected]>
mac80211: drop frames with unexpected DS bits from fast-rx to slow path
Samuel Neves <[email protected]>
x86/topology: Update the 'cpu cores' field in /proc/cpuinfo correctly across CPU hotplug operations
Andrea Parri <[email protected]>
locking/xchg/alpha: Fix xchg() and cmpxchg() memory ordering bugs
Wang Hui <[email protected]>
x86/intel_rdt: Fix incorrect returned value when creating rdgroup sub-directory in resctrl file system
Randy Dunlap <[email protected]>
integrity/security: fix digsig.c build error with header file
Johannes Berg <[email protected]>
regulatory: add NUL to request alpha2
Eric Dumazet <[email protected]>
smsc75xx: fix smsc75xx_set_features()
Tony Lindgren <[email protected]>
ARM: OMAP: Fix dmtimer init for omap1
[email protected] <[email protected]>
nfs: system crashes after NFS4ERR_MOVED recovery
Rob Herring <[email protected]>
arm64: dts: cavium: fix PCI bus dtc warnings
Eric Biggers <[email protected]>
PKCS#7: fix direct verification of SignerInfo signature
Li Zhijian <[email protected]>
selftests/bpf/test_maps: exit child process without error in ENOMEM case
Sebastian Ott <[email protected]>
s390/cio: clear timer when terminating driver I/O
Sebastian Ott <[email protected]>
s390/cio: fix return code after missing interrupt
Sebastian Ott <[email protected]>
s390/cio: fix ccw_device_start_timeout API
Mark Lord <[email protected]>
powerpc/bpf/jit: Fix 32-bit JIT for seccomp_data access
Stefan Agner <[email protected]>
soc: imx: gpc: de-register power domains only if initialized
Tycho Andersen <[email protected]>
seccomp: add a selftest for get_metadata
Anders Roxell <[email protected]>
selftests/memfd: add run_fuse_test.sh to TEST_FILES
Arnd Bergmann <[email protected]>
bug.h: work around GCC PR82365 in BUG()
David Rientjes <[email protected]>
kernel/relay.c: limit kmalloc size to KMALLOC_MAX_SIZE
Jesper Dangaard Brouer <[email protected]>
virtio_net: fix XDP code path in receive_small()
Arnd Bergmann <[email protected]>
md: raid5: avoid string overflow warning
Andrea Parri <[email protected]>
locking/xchg/alpha: Add unconditional memory barrier to cmpxchg()
Or Gerlitz <[email protected]>
net/mlx5e: Return error if prio is specified when offloading eswitch vlan push
Thomas Falcon <[email protected]>
ibmvnic: Check for NULL skb's in NAPI poll routine
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Fix system crash during load/unload
Devesh Sharma <[email protected]>
RDMA/bnxt_re: Unpin SQ and RQ memory if QP create fails
Mark Rutland <[email protected]>
arm64: perf: correct PMUVer probing
Neil Armstrong <[email protected]>
drm/meson: fix vsync buffer update
Markus Elfring <[email protected]>
drm/exynos: g2d: Delete an error message for a failed memory allocation in two functions
Wolfram Sang <[email protected]>
drm/exynos: fix comparison to bitshift when dealing with a mask
Arnd Bergmann <[email protected]>
drm/exynos: g2d: use monotonic timestamps
Yufen Yu <[email protected]>
md raid10: fix NULL deference in handle_write_completed()
Tobias Jordan <[email protected]>
gpu: ipu-v3: prg: fix device node leak in ipu_prg_lookup_by_phandle
Tobias Jordan <[email protected]>
gpu: ipu-v3: pre: fix device node leak in ipu_pre_lookup_by_phandle
Ilan Peer <[email protected]>
mac80211: Fix sending ADDBA response for an ongoing session
Ilan Peer <[email protected]>
mac80211: Do not disconnect on invalid operating class
Avraham Stern <[email protected]>
cfg80211: clear wep keys after disconnection
Sara Sharon <[email protected]>
mac80211: fix calling sleeping function in atomic context
Sara Sharon <[email protected]>
mac80211: fix a possible leak of station stats
Felix Fietkau <[email protected]>
mac80211: round IEEE80211_TX_STATUS_HEADROOM up to multiple of 4
Xin Long <[email protected]>
xfrm: do not call rcu_read_unlock when afinfo is NULL in xfrm_get_tos
Stefan Haberland <[email protected]>
s390/dasd: fix handling of internal requests
Heinz Mauelshagen <[email protected]>
md: fix md_write_start() deadlock w/o metadata devices
Xiao Ni <[email protected]>
MD: Free bioset when md_run fails
David Howells <[email protected]>
rxrpc: Work around usercopy check
Kees Cook <[email protected]>
NFC: llcp: Limit size of SDP URI
Naftali Goldstein <[email protected]>
iwlwifi: mvm: always init rs with 20mhz bandwidth rates
Sara Sharon <[email protected]>
iwlwifi: mvm: fix IBSS for devices that support station type API
Sara Sharon <[email protected]>
iwlwifi: mvm: fix security bug in PN checking
Robin Murphy <[email protected]>
ARM: dts: rockchip: Fix DWMMC clocks
Robin Murphy <[email protected]>
arm64: dts: rockchip: Fix DWMMC clocks
Jason Gunthorpe <[email protected]>
IB/uverbs: Fix unbalanced unlock on error path for rdma_explicit_destroy
Matan Barak <[email protected]>
IB/uverbs: Fix possible oops with duplicate ioctl attributes
Matan Barak <[email protected]>
IB/uverbs: Fix method merging in uverbs_ioctl_merge
Joe Lee <[email protected]>
xhci: workaround for AMD Promontory disabled ports wakeup
Boris Pismenny <[email protected]>
tls: retrun the correct IV in getsockopt
Thomas Falcon <[email protected]>
ibmvnic: Clean RX pool buffers during device close
Thomas Falcon <[email protected]>
ibmvnic: Free RX socket buffer in case of adapter error
Thomas Falcon <[email protected]>
ibmvnic: Wait until reset is complete to set carrier on
Geert Uytterhoeven <[email protected]>
ARM: OMAP1: clock: Fix debugfs_create_*() usage
Tony Lindgren <[email protected]>
ARM: OMAP2+: Fix sar_base inititalization for HS omaps
Tony Lindgren <[email protected]>
ARM: OMAP3: Fix prm wake interrupt for resume
Qi Hou <[email protected]>
ARM: OMAP2+: timer: fix a kmemleak caused in omap_get_timer_dt
Anders Roxell <[email protected]>
selftests: memfd: add config fragment for fuse
Naresh Kamboju <[email protected]>
selftests: pstore: Adding config fragment CONFIG_PSTORE_RAM=m
Dominik Brodowski <[email protected]>
selftest/vDSO: fix O=
Anders Roxell <[email protected]>
selftests: sync: missing CFLAGS while compiling
Dong Bo <[email protected]>
libata: Fix compile warning with ATA_DEBUG enabled
Shawn Lin <[email protected]>
arm64: dts: rockchip: correct ep-gpios for rk3399-sapphire
Kamil Trzciński <[email protected]>
arm64: dts: rockchip: fix rock64 gmac2io stability issues
Jason Wang <[email protected]>
ptr_ring: prevent integer overflow when calculating size
Ulf Magnusson <[email protected]>
ARC: Fix malformed ARC_EMUL_UNALIGNED default
Peter Oh <[email protected]>
mac80211: mesh: fix wrong mesh TTL offset calculation
James Hogan <[email protected]>
MIPS: generic: Fix machine compatible matching
Nicholas Piggin <[email protected]>
powerpc/64s: Add support for a store forwarding barrier at kernel entry/exit
Michael Ellerman <[email protected]>
powerpc/64s: Fix section mismatch warnings from setup_rfi_flush()
Mauricio Faria de Oliveira <[email protected]>
powerpc/pseries: Restore default security feature flags on setup
Mauricio Faria de Oliveira <[email protected]>
powerpc: Move default security feature flags
Mauricio Faria de Oliveira <[email protected]>
powerpc/pseries: Fix clearing of security feature flags
Michael Ellerman <[email protected]>
powerpc/64s: Wire up cpu_show_spectre_v2()
Michael Ellerman <[email protected]>
powerpc/64s: Wire up cpu_show_spectre_v1()
Michael Ellerman <[email protected]>
powerpc/pseries: Use the security flags in pseries_setup_rfi_flush()
Michael Ellerman <[email protected]>
powerpc/powernv: Use the security flags in pnv_setup_rfi_flush()
Michael Ellerman <[email protected]>
powerpc/64s: Enhance the information in cpu_show_meltdown()
Michael Ellerman <[email protected]>
powerpc/64s: Move cpu_show_meltdown()
Michael Ellerman <[email protected]>
powerpc/powernv: Set or clear security feature flags
Michael Ellerman <[email protected]>
powerpc/pseries: Set or clear security feature flags
Michael Ellerman <[email protected]>
powerpc: Add security feature flags for Spectre/Meltdown
Michael Ellerman <[email protected]>
powerpc/pseries: Add new H_GET_CPU_CHARACTERISTICS flags
Michael Ellerman <[email protected]>
powerpc/rfi-flush: Call setup_rfi_flush() after LPM migration
Mauricio Faria de Oliveira <[email protected]>
powerpc/rfi-flush: Differentiate enabled and patched flush types
Michael Ellerman <[email protected]>
powerpc/rfi-flush: Always enable fallback flush on pseries
Michael Ellerman <[email protected]>
powerpc/rfi-flush: Make it possible to call setup_rfi_flush() again
Michael Ellerman <[email protected]>
powerpc/rfi-flush: Move the logic to avoid a redo into the debugfs code
Michael Ellerman <[email protected]>
powerpc/powernv: Support firmware disable of RFI flush
Michael Ellerman <[email protected]>
powerpc/pseries: Support firmware disable of RFI flush
Nicholas Piggin <[email protected]>
powerpc/64s: Improve RFI L1-D cache flush fallback
David Vrabel <[email protected]>
x86/kvm: fix LAPIC timer drift when guest uses periodic mode
Jim Mattson <[email protected]>
kvm: x86: IA32_ARCH_CAPABILITIES is always supported
Wei Huang <[email protected]>
KVM: x86: Update cpuid properly when CR4.OSXAVE or CR4.PKE is changed
David Hildenbrand <[email protected]>
KVM: s390: vsie: fix < 8k check for the itdba
Konrad Rzeszutek Wilk <[email protected]>
KVM/VMX: Expose SSBD properly to guests
Gustavo A. R. Silva <[email protected]>
kernel/sys.c: fix potential Spectre v1 issue
David Hildenbrand <[email protected]>
kasan: fix memory hotplug during boot
David Hildenbrand <[email protected]>
kasan: free allocated shadow memory on MEM_CANCEL_ONLINE
Andrey Ryabinin <[email protected]>
mm/kasan: don't vfree() nonexistent vm_area
Davidlohr Bueso <[email protected]>
ipc/shm: fix shmat() nil address after round-down when remapping
Davidlohr Bueso <[email protected]>
Revert "ipc/shm: Fix shmat mmap nil-page protection"
Matthew Wilcox <[email protected]>
idr: fix invalid ptr dereference on item delete
Jens Axboe <[email protected]>
sr: pass down correctly sized SCSI sense buffer
Lidong Chen <[email protected]>
IB/umem: Use the correct mm during ib_umem_release
Michael J. Ruhl <[email protected]>
IB/hfi1: Use after free race condition in send context error path
Michael Neuling <[email protected]>
powerpc/64s: Clear PCR on boot
Will Deacon <[email protected]>
arm64: lse: Add early clobbers to some input/output asm operands
Thomas Hellstrom <[email protected]>
drm/vmwgfx: Fix 32-bit VMW_PORT_HB_[IN|OUT] macros
Joe Jin <[email protected]>
xen-swiotlb: fix the check condition for xen_swiotlb_free_coherent
Sudip Mukherjee <[email protected]>
libata: blacklist Micron 500IT SSD with MU01 firmware
Tejun Heo <[email protected]>
libata: Blacklist some Sandisk SSDs for NCQ
Corneliu Doban <[email protected]>
mmc: sdhci-iproc: add SDHCI_QUIRK2_HOST_OFF_CARD_ON for cygnus
Corneliu Doban <[email protected]>
mmc: sdhci-iproc: fix 32bit writes for TRANSFER_MODE register
Srinath Mannam <[email protected]>
mmc: sdhci-iproc: remove hard coded mmc cap 1.8v
Al Viro <[email protected]>
do d_instantiate/unlock_new_inode combinations safely
Ben Hutchings <[email protected]>
ALSA: timer: Fix pause event notification
Al Viro <[email protected]>
aio: fix io_destroy(2) vs. lookup_ioctx() race
Dave Chinner <[email protected]>
fs: don't scan the inode cache before SB_BORN is set
Al Viro <[email protected]>
affs_lookup(): close a race with affs_remove_link()
Colin Ian King <[email protected]>
KVM: Fix spelling mistake: "cop_unsuable" -> "cop_unusable"
Maciej W. Rozycki <[email protected]>
MIPS: Fix ptrace(2) PTRACE_PEEKUSR and PTRACE_POKEUSR accesses to o32 FGRs
Maciej W. Rozycki <[email protected]>
MIPS: ptrace: Expose FIR register through FP regset
NeilBrown <[email protected]>
MIPS: c-r4k: Fix data corruption related to cache coherence
-------------
Diffstat:
.../devicetree/bindings/clock/sunxi-ccu.txt | 4 + .../devicetree/bindings/dma/mv-xor-v2.txt | 6 +- .../bindings/pinctrl/axis,artpec6-pinctrl.txt | 5 +- Makefile | 4 +- arch/alpha/include/asm/xchg.h | 30 ++- arch/arc/Kconfig | 1 - arch/arc/include/asm/bug.h | 3 +- arch/arc/kernel/mcip.c | 74 ++++++- arch/arc/kernel/smp.c | 50 ++++- arch/arm/boot/dts/at91-tse850-3.dts | 2 +- arch/arm/boot/dts/bcm2836.dtsi | 2 +- arch/arm/boot/dts/bcm2837.dtsi | 2 +- arch/arm/boot/dts/bcm283x.dtsi | 6 +- arch/arm/boot/dts/bcm958625hr.dts | 2 +- arch/arm/boot/dts/dra71-evm.dts | 4 +- arch/arm/boot/dts/imx6dl-icore-rqs.dts | 2 +- arch/arm/boot/dts/imx7d-cl-som-imx7.dts | 52 ++--- arch/arm/boot/dts/r8a7791-porter.dts | 2 +- arch/arm/boot/dts/rk3036.dtsi | 4 +- arch/arm/boot/dts/rk322x.dtsi | 6 +- arch/arm/boot/dts/rk3288.dtsi | 2 + arch/arm/boot/dts/socfpga.dtsi | 2 +- arch/arm/include/asm/vdso.h | 2 - arch/arm/kernel/vdso.c | 12 +- arch/arm/mach-davinci/board-omapl138-hawk.c | 4 +- arch/arm/mach-omap1/clock.c | 6 +- arch/arm/mach-omap2/omap-wakeupgen.c | 4 +- arch/arm/mach-omap2/pm.c | 4 +- arch/arm/mach-omap2/timer.c | 19 +- arch/arm/mach-orion5x/Kconfig | 3 - arch/arm/mach-orion5x/dns323-setup.c | 53 ++++- arch/arm/mach-orion5x/tsx09-common.c | 49 ++++- arch/arm/plat-omap/dmtimer.c | 7 +- arch/arm64/boot/dts/cavium/thunder2-99xx.dtsi | 3 +- arch/arm64/boot/dts/qcom/msm8996.dtsi | 4 +- arch/arm64/boot/dts/rockchip/rk3328-rock64.dts | 5 +- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 6 +- arch/arm64/boot/dts/rockchip/rk3368.dtsi | 2 +- arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi | 16 +- arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi | 2 +- arch/arm64/include/asm/atomic_lse.h | 24 +-- arch/arm64/include/asm/stacktrace.h | 2 +- arch/arm64/kernel/cpu_errata.c | 4 +- arch/arm64/kernel/perf_event.c | 4 +- arch/arm64/kernel/stacktrace.c | 5 + arch/arm64/kernel/time.c | 2 +- arch/cris/include/arch-v10/arch/bug.h | 11 +- arch/ia64/include/asm/bug.h | 6 +- arch/ia64/kernel/err_inject.c | 2 +- arch/m68k/coldfire/device.c | 12 +- arch/m68k/include/asm/bug.h | 3 + arch/microblaze/Kconfig | 1 + arch/microblaze/mm/init.c | 56 +---- arch/mips/cavium-octeon/octeon-irq.c | 10 +- arch/mips/include/asm/mach-ath79/ar71xx_regs.h | 2 +- arch/mips/include/asm/machine.h | 2 +- arch/mips/kernel/ptrace.c | 22 +- arch/mips/kernel/ptrace32.c | 4 +- arch/mips/kvm/mips.c | 2 +- arch/mips/mm/c-r4k.c | 9 +- arch/powerpc/boot/Makefile | 3 +- arch/powerpc/include/asm/exception-64s.h | 29 +++ arch/powerpc/include/asm/feature-fixups.h | 19 ++ arch/powerpc/include/asm/hvcall.h | 3 + arch/powerpc/include/asm/irq_work.h | 1 + arch/powerpc/include/asm/paca.h | 3 +- arch/powerpc/include/asm/security_features.h | 85 ++++++++ arch/powerpc/include/asm/setup.h | 2 +- arch/powerpc/kernel/Makefile | 2 +- arch/powerpc/kernel/asm-offsets.c | 3 +- arch/powerpc/kernel/cpu_setup_power.S | 6 + arch/powerpc/kernel/dt_cpu_ftrs.c | 1 + arch/powerpc/kernel/exceptions-64s.S | 95 +++++---- arch/powerpc/kernel/idle_book3s.S | 2 + arch/powerpc/kernel/security.c | 237 +++++++++++++++++++++ arch/powerpc/kernel/setup_64.c | 48 ++--- arch/powerpc/kernel/traps.c | 47 ++-- arch/powerpc/kernel/vmlinux.lds.S | 14 ++ arch/powerpc/lib/feature-fixups.c | 124 ++++++++++- arch/powerpc/net/bpf_jit_comp.c | 3 + arch/powerpc/perf/core-book3s.c | 25 +++ arch/powerpc/platforms/powernv/npu-dma.c | 229 ++++++++++++-------- arch/powerpc/platforms/powernv/setup.c | 92 +++++--- arch/powerpc/platforms/pseries/mobility.c | 3 + arch/powerpc/platforms/pseries/pseries.h | 2 + arch/powerpc/platforms/pseries/setup.c | 81 +++++-- arch/powerpc/sysdev/mpic.c | 2 +- arch/powerpc/xmon/xmon.c | 2 + arch/s390/kvm/vsie.c | 2 +- arch/sh/kernel/entry-common.S | 2 +- arch/sparc/include/asm/atomic_64.h | 6 +- arch/sparc/include/asm/bug.h | 6 +- arch/x86/events/core.c | 15 +- arch/x86/events/intel/core.c | 12 +- arch/x86/events/intel/ds.c | 117 ++++++++-- arch/x86/events/perf_event.h | 2 +- arch/x86/include/asm/alternative.h | 4 +- arch/x86/include/asm/tlbflush.h | 7 +- arch/x86/kernel/apic/apic.c | 2 +- arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 1 + arch/x86/kernel/devicetree.c | 21 +- arch/x86/kernel/smpboot.c | 1 + arch/x86/kvm/cpuid.c | 9 +- arch/x86/kvm/lapic.c | 26 ++- arch/x86/kvm/vmx.c | 27 ++- arch/x86/kvm/x86.c | 5 +- arch/x86/mm/pageattr.c | 6 +- arch/x86/mm/pgtable.c | 9 + block/partition-generic.c | 6 + crypto/asymmetric_keys/pkcs7_trust.c | 1 + drivers/acpi/acpi_pad.c | 3 + drivers/acpi/acpica/evevent.c | 9 +- drivers/acpi/acpica/nseval.c | 8 + drivers/acpi/acpica/psargs.c | 4 + drivers/ata/libata-core.c | 6 + drivers/ata/libata-scsi.c | 2 +- drivers/base/regmap/regmap.c | 2 +- drivers/block/nbd.c | 2 +- drivers/block/null_blk.c | 46 ++-- drivers/block/paride/pcd.c | 2 + drivers/block/xen-blkfront.c | 17 +- drivers/cdrom/cdrom.c | 3 - drivers/cdrom/gdrom.c | 3 + drivers/char/hw_random/stm32-rng.c | 9 + drivers/char/ipmi/ipmi_ssif.c | 4 +- drivers/clocksource/fsl_ftm_timer.c | 2 +- drivers/clocksource/mips-gic-timer.c | 2 +- drivers/cpufreq/cppc_cpufreq.c | 23 +- drivers/cpufreq/cpufreq.c | 6 +- drivers/dma/mv_xor_v2.c | 25 ++- drivers/dma/pl330.c | 6 +- drivers/dma/qcom/bam_dma.c | 27 ++- drivers/dma/sh/rcar-dmac.c | 11 +- drivers/firmware/dmi_scan.c | 2 +- drivers/firmware/efi/arm-runtime.c | 3 + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 33 ++- drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 8 +- drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 5 +- drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c | 3 +- drivers/gpu/drm/ast/ast_tables.h | 4 +- drivers/gpu/drm/bridge/sii902x.c | 20 +- drivers/gpu/drm/exynos/exynos_drm_g2d.c | 12 +- drivers/gpu/drm/exynos/regs-fimc.h | 2 +- drivers/gpu/drm/imx/ipuv3-crtc.c | 5 + drivers/gpu/drm/meson/meson_crtc.c | 6 + drivers/gpu/drm/meson/meson_drv.c | 29 ++- drivers/gpu/drm/meson/meson_drv.h | 3 + drivers/gpu/drm/meson/meson_plane.c | 7 +- drivers/gpu/drm/nouveau/nouveau_backlight.c | 10 +- drivers/gpu/drm/omapdrm/dss/dss.c | 193 +++++++++-------- drivers/gpu/drm/panel/panel-simple.c | 2 +- drivers/gpu/drm/rcar-du/rcar_du_lvdsenc.c | 18 +- drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 7 +- drivers/gpu/drm/sun4i/sun4i_dotclock.c | 5 +- drivers/gpu/drm/tegra/drm.c | 1 + drivers/gpu/drm/virtio/virtgpu_ioctl.c | 17 +- drivers/gpu/drm/vmwgfx/vmwgfx_msg.h | 25 ++- drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 31 ++- drivers/gpu/ipu-v3/ipu-pre.c | 3 + drivers/gpu/ipu-v3/ipu-prg.c | 15 +- drivers/hwmon/nct6775.c | 10 +- drivers/hwmon/pmbus/adm1275.c | 4 +- drivers/hwmon/pmbus/max8688.c | 2 +- drivers/hwtracing/coresight/coresight-cpu-debug.c | 2 +- drivers/hwtracing/intel_th/core.c | 2 +- drivers/i2c/busses/i2c-mv64xxx.c | 8 +- drivers/ide/ide-cd.c | 2 + drivers/infiniband/core/multicast.c | 26 ++- drivers/infiniband/core/rdma_core.c | 5 +- drivers/infiniband/core/sa_query.c | 7 +- drivers/infiniband/core/ucma.c | 2 +- drivers/infiniband/core/umem.c | 7 +- drivers/infiniband/core/uverbs_ioctl.c | 3 + drivers/infiniband/core/uverbs_ioctl_merge.c | 18 +- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 24 ++- drivers/infiniband/hw/bnxt_re/main.c | 10 +- drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 6 +- drivers/infiniband/hw/bnxt_re/qplib_rcfw.h | 1 + drivers/infiniband/hw/bnxt_re/qplib_sp.c | 3 +- drivers/infiniband/hw/bnxt_re/roce_hsi.h | 25 ++- drivers/infiniband/hw/hfi1/chip.c | 4 + drivers/infiniband/hw/mlx4/cq.c | 4 +- drivers/infiniband/hw/mlx4/main.c | 11 +- drivers/infiniband/hw/mlx5/cq.c | 3 +- drivers/infiniband/hw/mlx5/main.c | 3 + drivers/infiniband/hw/mlx5/qp.c | 4 +- drivers/infiniband/hw/qedr/main.c | 3 +- drivers/infiniband/hw/qedr/verbs.c | 58 +++-- drivers/infiniband/sw/rxe/rxe_verbs.c | 2 +- drivers/iommu/amd_iommu.c | 2 + drivers/iommu/mtk_iommu.c | 15 +- drivers/iommu/mtk_iommu.h | 1 + drivers/macintosh/rack-meter.c | 4 +- drivers/md/bcache/request.c | 2 +- drivers/md/bcache/writeback.c | 20 +- drivers/md/md.c | 49 ++++- drivers/md/md.h | 2 + drivers/md/raid1.c | 11 + drivers/md/raid10.c | 14 +- drivers/md/raid5.c | 15 +- drivers/misc/cxl/cxl.h | 4 + drivers/misc/cxl/native.c | 11 +- drivers/misc/cxl/pci.c | 19 +- drivers/mmc/host/sdhci-iproc.c | 33 ++- drivers/net/bonding/bond_main.c | 6 +- drivers/net/can/m_can/m_can.c | 7 +- drivers/net/dsa/Makefile | 5 +- drivers/net/dsa/mt7530.c | 1 + drivers/net/ethernet/broadcom/bgmac.c | 3 +- drivers/net/ethernet/broadcom/bgmac.h | 6 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 + drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 12 +- drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c | 1 + drivers/net/ethernet/cisco/enic/enic_main.c | 10 +- drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 23 +- drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c | 2 +- drivers/net/ethernet/freescale/fman/fman_dtsec.c | 2 +- drivers/net/ethernet/freescale/gianfar.c | 7 +- drivers/net/ethernet/ibm/ibmvnic.c | 42 +++- drivers/net/ethernet/intel/e1000e/ich8lan.c | 2 +- drivers/net/ethernet/intel/e1000e/mac.c | 2 +- drivers/net/ethernet/intel/e1000e/netdev.c | 4 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 11 + drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 3 +- drivers/net/ethernet/marvell/mvneta.c | 1 + drivers/net/ethernet/mellanox/mlx5/core/Kconfig | 2 +- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 4 +- drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 2 - drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 3 +- .../ethernet/mellanox/mlxsw/core_acl_flex_keys.h | 20 +- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 8 +- drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 1 + drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c | 2 +- drivers/net/ethernet/qlogic/qed/qed_cxt.c | 5 +- drivers/net/ethernet/qlogic/qed/qed_rdma.c | 1 + drivers/net/ethernet/qlogic/qede/qede_fp.c | 20 +- drivers/net/ethernet/qualcomm/emac/emac-mac.c | 23 +- drivers/net/ethernet/renesas/sh_eth.c | 6 +- drivers/net/ethernet/renesas/sh_eth.h | 1 + drivers/net/ethernet/smsc/smsc911x.c | 4 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 16 +- drivers/net/ethernet/sun/sunvnet.c | 2 +- drivers/net/hyperv/netvsc.c | 2 +- drivers/net/hyperv/netvsc_drv.c | 51 ++++- drivers/net/hyperv/rndis_filter.c | 20 +- drivers/net/ieee802154/ca8210.c | 14 +- drivers/net/macsec.c | 5 +- drivers/net/macvlan.c | 2 +- drivers/net/phy/dp83640.c | 18 ++ drivers/net/usb/lan78xx.c | 44 ++-- drivers/net/usb/qmi_wwan.c | 1 + drivers/net/usb/r8152.c | 2 +- drivers/net/usb/smsc75xx.c | 7 +- drivers/net/virtio_net.c | 4 +- drivers/net/wireless/ath/ath10k/mac.c | 12 ++ drivers/net/wireless/ath/ath9k/common-spectral.c | 12 +- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +- .../net/wireless/intel/iwlwifi/fw/api/time-event.h | 4 +- drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 13 +- drivers/net/wireless/intel/iwlwifi/fw/dbg.h | 3 + drivers/net/wireless/intel/iwlwifi/fw/runtime.h | 3 + drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c | 5 +- drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | 3 +- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 54 ++++- drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 + drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 8 + drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 28 ++- drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 39 ++-- drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 107 +++++----- .../net/wireless/intel/iwlwifi/mvm/time-event.c | 21 +- drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 23 +- drivers/net/wireless/intel/iwlwifi/mvm/utils.c | 11 +- drivers/net/wireless/rsi/rsi_91x_sdio.c | 32 ++- drivers/net/wireless/rsi/rsi_sdio.h | 2 + drivers/nvme/host/fabrics.c | 4 +- drivers/nvme/host/pci.c | 27 ++- drivers/nvme/target/core.c | 9 +- drivers/parisc/lba_pci.c | 20 +- drivers/pci/pci-driver.c | 17 +- drivers/pci/quirks.c | 3 + drivers/pcmcia/cs.c | 10 +- drivers/pcmcia/cs_internal.h | 1 + drivers/phy/qualcomm/phy-qcom-qmp.c | 4 +- drivers/phy/rockchip/phy-rockchip-emmc.c | 27 ++- drivers/pinctrl/devicetree.c | 6 +- drivers/pinctrl/pinctrl-mcp23s08.c | 37 +++- drivers/pinctrl/qcom/pinctrl-msm.c | 2 +- drivers/pinctrl/sh-pfc/pfc-r8a7796.c | 40 ++-- drivers/power/supply/ltc2941-battery-gauge.c | 8 +- drivers/power/supply/max17042_battery.c | 1 + drivers/regulator/gpio-regulator.c | 16 +- drivers/regulator/of_regulator.c | 1 + drivers/remoteproc/imx_rproc.c | 6 +- drivers/s390/block/dasd.c | 21 +- drivers/s390/cio/device_fsm.c | 7 +- drivers/s390/cio/device_ops.c | 72 +++---- drivers/s390/cio/io_sch.h | 1 + drivers/s390/cio/vfio_ccw_fsm.c | 5 + drivers/scsi/scsi_lib.c | 2 + drivers/scsi/sr.c | 21 +- drivers/scsi/sr_ioctl.c | 10 +- drivers/soc/imx/gpc.c | 10 +- drivers/soc/qcom/wcnss_ctrl.c | 2 +- drivers/spi/spi-bcm-qspi.c | 4 +- drivers/usb/host/pci-quirks.c | 109 ++++++++++ drivers/usb/host/pci-quirks.h | 5 + drivers/usb/host/xhci-hub.c | 7 + drivers/usb/host/xhci-pci.c | 11 + drivers/usb/host/xhci.h | 2 +- drivers/video/fbdev/sbuslib.c | 4 +- drivers/watchdog/asm9260_wdt.c | 8 +- drivers/watchdog/aspeed_wdt.c | 13 +- drivers/watchdog/davinci_wdt.c | 15 +- drivers/watchdog/dw_wdt.c | 23 +- drivers/watchdog/f71808e_wdt.c | 3 +- drivers/watchdog/sbsa_gwdt.c | 3 +- drivers/xen/events/events_base.c | 4 +- drivers/xen/pvcalls-back.c | 2 +- drivers/xen/swiotlb-xen.c | 2 +- drivers/xen/xen-acpi-processor.c | 6 +- drivers/xen/xenbus/xenbus_probe.c | 5 +- drivers/zorro/zorro.c | 12 ++ fs/affs/namei.c | 10 +- fs/aio.c | 4 +- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 5 +- fs/btrfs/extent-tree.c | 1 + fs/btrfs/inode.c | 16 +- fs/btrfs/send.c | 3 + fs/btrfs/super.c | 2 +- fs/btrfs/tests/qgroup-tests.c | 2 +- fs/btrfs/transaction.c | 10 +- fs/btrfs/tree-log.c | 77 ++++++- fs/ceph/super.c | 27 ++- fs/dcache.c | 32 ++- fs/ecryptfs/inode.c | 3 +- fs/ext2/namei.c | 6 +- fs/ext4/namei.c | 6 +- fs/ext4/super.c | 12 ++ fs/f2fs/checkpoint.c | 2 + fs/f2fs/extent_cache.c | 3 + fs/f2fs/file.c | 8 +- fs/f2fs/namei.c | 12 +- fs/fscache/page.c | 13 +- fs/gfs2/file.c | 5 +- fs/gfs2/quota.h | 2 + fs/jffs2/dir.c | 12 +- fs/jfs/namei.c | 12 +- fs/nfs/nfs4client.c | 6 +- fs/nilfs2/namei.c | 6 +- fs/ocfs2/dlm/dlmdomain.c | 14 -- fs/ocfs2/dlm/dlmdomain.h | 25 ++- fs/ocfs2/dlm/dlmrecovery.c | 9 + fs/orangefs/namei.c | 9 +- fs/proc/proc_sysctl.c | 3 + fs/reiserfs/namei.c | 12 +- fs/super.c | 30 ++- fs/udf/namei.c | 6 +- fs/udf/super.c | 5 +- fs/ufs/namei.c | 6 +- fs/xfs/xfs_discard.c | 14 +- include/asm-generic/bug.h | 1 + include/linux/bio.h | 4 +- include/linux/compiler-gcc.h | 15 +- include/linux/compiler.h | 5 + include/linux/dcache.h | 1 + include/linux/if_vlan.h | 79 +++++-- include/linux/kvm_host.h | 3 +- include/linux/ptr_ring.h | 2 +- include/net/ip.h | 11 +- include/net/ip_fib.h | 1 + include/net/llc_conn.h | 2 +- include/net/mac80211.h | 2 +- include/net/regulatory.h | 2 +- include/net/route.h | 3 +- include/rdma/ib_umem.h | 1 - include/soc/arc/mcip.h | 5 + include/uapi/drm/virtgpu_drm.h | 1 + include/uapi/linux/if_ether.h | 1 + ipc/shm.c | 19 +- kernel/audit.c | 2 + kernel/debug/kdb/kdb_main.c | 27 ++- kernel/events/core.c | 70 ++++-- kernel/rcu/tree_plugin.h | 14 +- kernel/relay.c | 2 +- kernel/sched/rt.c | 2 + kernel/sys.c | 2 + kernel/workqueue.c | 2 +- lib/radix-tree.c | 4 +- lib/test_kmod.c | 2 +- mm/huge_memory.c | 5 +- mm/kasan/kasan.c | 66 +++++- mm/khugepaged.c | 8 +- mm/kmemleak.c | 12 +- mm/ksm.c | 28 +++ mm/mempolicy.c | 3 + mm/page_idle.c | 12 +- mm/page_owner.c | 6 +- mm/slab.c | 1 + mm/swapfile.c | 4 + mm/vmscan.c | 8 +- mm/vmstat.c | 2 + mm/z3fold.c | 9 +- net/8021q/vlan_core.c | 4 +- net/batman-adv/bat_iv_ogm.c | 2 +- net/batman-adv/bat_v.c | 2 +- net/batman-adv/bridge_loop_avoidance.c | 22 +- net/batman-adv/distributed-arp-table.c | 2 +- net/batman-adv/fragmentation.c | 3 +- net/batman-adv/gateway_client.c | 5 +- net/batman-adv/multicast.c | 8 +- net/batman-adv/routing.c | 15 +- net/batman-adv/soft-interface.c | 8 +- net/bridge/netfilter/ebtables.c | 33 ++- net/ceph/ceph_common.c | 7 + net/core/ethtool.c | 5 +- net/core/skbuff.c | 9 +- net/ipv4/ip_gre.c | 5 - net/ipv4/ip_tunnel.c | 8 +- net/ipv4/ip_vti.c | 2 - net/ipv4/netfilter/ipt_CLUSTERIP.c | 15 +- net/ipv4/route.c | 26 ++- net/ipv4/tcp_illinois.c | 2 +- net/ipv4/xfrm4_policy.c | 1 + net/ipv6/ip6_tunnel.c | 12 +- net/ipv6/ip6_vti.c | 2 +- net/ipv6/sit.c | 7 + net/llc/llc_c_ac.c | 15 +- net/llc/llc_conn.c | 32 ++- net/mac80211/agg-rx.c | 4 +- net/mac80211/ieee80211_i.h | 2 +- net/mac80211/mesh.c | 17 +- net/mac80211/rx.c | 2 +- net/mac80211/spectmgmt.c | 7 +- net/mac80211/sta_info.c | 3 +- net/netfilter/ipvs/ip_vs_ftp.c | 2 +- net/netlabel/netlabel_unlabeled.c | 10 + net/nfc/llcp_commands.c | 4 + net/nfc/netlink.c | 3 +- net/qrtr/smd.c | 1 + net/rds/tcp_listen.c | 14 +- net/rxrpc/input.c | 15 +- net/rxrpc/recvmsg.c | 5 +- net/rxrpc/sendmsg.c | 4 +- net/sched/act_bpf.c | 2 +- net/sched/act_ipt.c | 9 +- net/sched/act_pedit.c | 2 +- net/sched/act_police.c | 2 +- net/sched/act_sample.c | 3 +- net/sched/act_simple.c | 2 +- net/sched/act_skbmod.c | 2 +- net/smc/smc_core.c | 1 + net/smc/smc_ib.c | 10 +- net/smc/smc_llc.c | 2 +- net/smc/smc_wr.h | 1 - net/tls/tls_main.c | 3 +- net/wireless/sme.c | 2 + net/xfrm/xfrm_input.c | 6 + net/xfrm/xfrm_output.c | 5 +- net/xfrm/xfrm_policy.c | 7 +- net/xfrm/xfrm_replay.c | 2 +- scripts/adjust_autoksyms.sh | 7 + scripts/package/builddeb | 2 +- security/integrity/digsig.c | 1 + security/integrity/ima/Kconfig | 1 + security/integrity/ima/ima_crypto.c | 2 + security/integrity/ima/ima_main.c | 13 ++ sound/core/timer.c | 4 +- sound/core/vmaster.c | 5 +- tools/hv/hv_fcopy_daemon.c | 3 +- tools/hv/hv_vss_daemon.c | 1 + tools/perf/Makefile.perf | 3 +- tools/perf/builtin-record.c | 9 + tools/perf/builtin-stat.c | 9 +- tools/perf/builtin-top.c | 6 +- tools/perf/perf.h | 1 + tools/perf/tests/dwarf-unwind.c | 46 ++-- .../perf/tests/shell/trace+probe_libc_inet_pton.sh | 6 +- tools/perf/tests/vmlinux-kallsyms.c | 2 +- tools/perf/ui/browsers/annotate.c | 9 +- tools/perf/util/c++/clang.cpp | 11 +- tools/perf/util/hist.c | 4 +- tools/perf/util/hist.h | 1 - tools/perf/util/record.c | 8 +- tools/testing/radix-tree/idr-test.c | 7 + tools/testing/selftests/Makefile | 1 + tools/testing/selftests/bpf/test_maps.c | 2 + .../ftrace/test.d/kprobe/kprobe_args_string.tc | 46 ++++ .../ftrace/test.d/kprobe/kprobe_args_syntax.tc | 97 +++++++++ .../selftests/ftrace/test.d/kprobe/probepoint.tc | 43 ++++ tools/testing/selftests/futex/Makefile | 6 +- tools/testing/selftests/memfd/Makefile | 1 + tools/testing/selftests/memfd/config | 1 + tools/testing/selftests/net/psock_fanout.c | 3 +- tools/testing/selftests/powerpc/mm/subpage_prot.c | 14 ++ tools/testing/selftests/pstore/config | 1 + tools/testing/selftests/seccomp/seccomp_bpf.c | 61 ++++++ tools/testing/selftests/sync/Makefile | 2 +- tools/testing/selftests/vDSO/Makefile | 14 +- tools/testing/selftests/vm/run_vmtests | 25 ++- tools/thermal/tmon/sysfs.c | 12 +- tools/thermal/tmon/tmon.c | 1 - virt/kvm/arm/vgic/vgic-mmio.c | 3 + virt/kvm/arm/vgic/vgic.h | 1 + 506 files changed, 4741 insertions(+), 1751 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/496 MIPS: c-r4k: Fix data corruption related to cache coherence
4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit 55a2aa08b3af519a9693f99cdf7fa6d8b62d9f65 upstream.
When DMA will be performed to a MIPS32 1004K CPS, the L1-cache for the range needs to be flushed and invalidated first.
The code currently takes one of two approaches.
1/ If the range is less than the size of the dcache, then HIT type
requests flush/invalidate cache lines for the particular addresses. HIT-type requests a globalised by the CPS so this is safe on SMP.
2/ If the range is larger than the size of dcache, then INDEX type
requests flush/invalidate the whole cache. INDEX type requests affect the local cache only. CPS does not propagate them in any way. So this invalidation is not safe on SMP CPS systems.
Data corruption due to '2' can quite easily be demonstrated by repeatedly "echo 3 > /proc/sys/vm/drop_caches" and then sha1sum a file that is several times the size of available memory. Dropping caches means that large contiguous extents (large than dcache) are more likely.
This was not a problem before Linux-4.8 because option 2 was never used if CONFIG_MIPS_CPS was defined. The commit which removed that apparently didn't appreciate the full consequence of the change.
We could, in theory, globalize the INDEX based flush by sending an IPI to other cores. These cache invalidation routines can be called with interrupts disabled and synchronous IPI require interrupts to be enabled. Asynchronous IPI may not trigger writeback soon enough. So we cannot use IPI in practice.
We can already test if IPI would be needed for an INDEX operation with r4k_op_needs_ipi(R4K_INDEX). If this is true then we mustn't try the INDEX approach as we cannot use IPI. If this is false (e.g. when there is only one core and hence one L1 cache) then it is safe to use the INDEX approach without IPI.
This patch avoids options 2 if r4k_op_needs_ipi(R4K_INDEX), and so eliminates the corruption.
Patchwork: https://patchwork.linux-mips.org/patch/19259/
--- arch/mips/mm/c-r4k.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
arch/mips/mm/c-r4k.c +6 -3
@@ -851,9 +851,12 @@ static void r4k_dma_cache_wback_inv(unsi/* * Either no secondary cache or the available caches don't have the * subset property so we have to flush the primary caches -* explicitly +* explicitly. +* If we would need IPI to perform an INDEX-type operation, then +* we have to use the HIT-type alternative as IPI cannot be used +* here due to interrupts possibly being disabled. */ -if (size >= dcache_size) { +if (!r4k_op_needs_ipi (R4K_INDEX ) && size >= dcache_size) {r4k_blast_dcache (); }else {R4600_HIT_CACHEOP_WAR_IMPL ;
@@ -890,7 +893,7 @@ static void r4k_dma_cache_inv(unsigned lreturn ; } -if (size >= dcache_size) { +if (!r4k_op_needs_ipi (R4K_INDEX ) && size >= dcache_size) {r4k_blast_dcache (); }else {R4600_HIT_CACHEOP_WAR_IMPL ;
Greg Kroah-Hartman
maintainerPATCH 2/496 MIPS: ptrace: Expose FIR register through FP regset
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej W. Rozycki <[email protected]>
commit 71e909c0cdad28a1df1fa14442929e68615dee45 upstream.
Correct commit 7aeb753b5353 ("MIPS: Implement task_user_regset_view.") and expose the FIR register using the unused 4 bytes at the end of the NT_PRFPREG regset. Without that register included clients cannot use the PTRACE_GETREGSET request to retrieve the complete FPU register set and have to resort to one of the older interfaces, either PTRACE_PEEKUSR or PTRACE_GETFPREGS, to retrieve the missing piece of data. Also the register is irreversibly missing from core dumps.
This register is architecturally hardwired and read-only so the write path does not matter. Ignore data supplied on writes then.
Patchwork: https://patchwork.linux-mips.org/patch/19273/
--- arch/mips/kernel/ptrace.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
arch/mips/kernel/ptrace.c +16 -2
@@ -454,7 +454,7 @@ static int fpr_get_msa(struct task_struc/* * Copy the floating-point context to the supplied NT_PRFPREG buffer. * Choose the appropriate helper for general registers, and then copy -* the FCSR register separately. +* the FCSR and FIR registers separately. */ static int fpr_get(struct task_struct *target, const struct user_regset *regset,
@@ -462,6 +462,7 @@ static int fpr_get(struct task_struct *t void *kbuf, void __user *ubuf) {const int fcr31_pos =NUM_FPU_REGS *sizeof (elf_fpreg_t); +const int fir_pos = fcr31_pos +sizeof (u32);int err;if (sizeof (target->thread.fpu.fpr[0 ]) ==sizeof (elf_fpreg_t))
@@ -474,6 +475,12 @@ static int fpr_get(struct task_struct *t err =user_regset_copyout (&pos, &count, &kbuf, &ubuf, &target->thread.fpu.fcr31, fcr31_pos, fcr31_pos +sizeof (u32)); +if (err) +return err; + + err =user_regset_copyout (&pos, &count, &kbuf, &ubuf, + &boot_cpu_data.fpu_id, + fir_pos, fir_pos +sizeof (u32));return err; }
@@ -522,7 +529,8 @@ static int fpr_set_msa(struct task_struc/* * Copy the supplied NT_PRFPREG buffer to the floating-point context. * Choose the appropriate helper for general registers, and then copy -* the FCSR register separately. +* the FCSR register separately. Ignore the incoming FIR register +* contents though, as the register is read-only. * * We optimize for the case where `count % sizeof(elf_fpreg_t) == 0', * which is supposed to have been guaranteed by the kernel before
@@ -536,6 +544,7 @@ static int fpr_set(struct task_struct *t const void *kbuf, const void __user *ubuf) { const int fcr31_pos = NUM_FPU_REGS * sizeof(elf_fpreg_t); +const int fir_pos = fcr31_pos +sizeof (u32);u32 fcr31;int err;
@@ -563,6 +572,11 @@ static int fpr_set(struct task_struct *tptrace_setfcr31 (target, fcr31); } +if (count >0 ) + err =user_regset_copyin_ignore (&pos, &count, &kbuf, &ubuf, + fir_pos, + fir_pos +sizeof (u32)); +return err; }
Greg Kroah-Hartman
maintainerPATCH 3/496 MIPS: Fix ptrace(2) PTRACE_PEEKUSR and PTRACE_POKEUSR accesses to o32 FGRs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej W. Rozycki <[email protected]>
commit 9a3a92ccfe3620743d4ae57c987dc8e9c5f88996 upstream.
Check the TIF_32BIT_FPREGS task setting of the tracee rather than the tracer in determining the layout of floating-point general registers in the floating-point context, correcting access to odd-numbered registers for o32 tracees where the setting disagrees between the two processes.
--- arch/mips/kernel/ptrace.c | 4 ++-- arch/mips/kernel/ptrace32.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
arch/mips/kernel/ptrace.c +2 -2
@@ -798,7 +798,7 @@ long arch_ptrace(struct task_struct *chi fregs =get_fpu_regs (child);#ifdef CONFIG_32BIT -if (test_thread_flag (TIF_32BIT_FPREGS )) { +if (test_tsk_thread_flag (child,TIF_32BIT_FPREGS )) {/* * The odd registers are actually the high * order bits of the values stored in the even
@@ -887,7 +887,7 @@ long arch_ptrace(struct task_struct *chiinit_fp_ctx (child);#ifdef CONFIG_32BIT -if (test_thread_flag (TIF_32BIT_FPREGS )) { +if (test_tsk_thread_flag (child,TIF_32BIT_FPREGS )) {/* * The odd registers are actually the high * order bits of the values stored in the even
arch/mips/kernel/ptrace32.c +2 -2
@@ -98,7 +98,7 @@ long compat_arch_ptrace(struct task_strubreak ; } fregs =get_fpu_regs (child); -if (test_thread_flag (TIF_32BIT_FPREGS )) { +if (test_tsk_thread_flag (child,TIF_32BIT_FPREGS )) {/* * The odd registers are actually the high * order bits of the values stored in the even
@@ -205,7 +205,7 @@ long compat_arch_ptrace(struct task_stru sizeof(child->thread.fpu)); child->thread.fpu.fcr31 =0 ; } -if (test_thread_flag (TIF_32BIT_FPREGS )) { +if (test_tsk_thread_flag (child,TIF_32BIT_FPREGS )) {/* * The odd registers are actually the high * order bits of the values stored in the even
Greg Kroah-Hartman
maintainerPATCH 4/496 KVM: Fix spelling mistake: "cop_unsuable" -> "cop_unusable"
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
commit ba3696e94d9d590d9a7e55f68e81c25dba515191 upstream.
Trivial fix to spelling mistake in debugfs_entries text.
--- arch/mips/kvm/mips.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/kvm/mips.c +1 -1
@@ -45,7 +45,7 @@ struct kvm_stats_debugfs_item debugfs_en { "cache", VCPU_STAT(cache_exits), KVM_STAT_VCPU }, { "signal", VCPU_STAT(signal_exits), KVM_STAT_VCPU }, { "interrupt", VCPU_STAT(int_exits), KVM_STAT_VCPU }, - { "cop_unsuable", VCPU_STAT(cop_unusable_exits), KVM_STAT_VCPU }, + { "cop_unusable", VCPU_STAT(cop_unusable_exits), KVM_STAT_VCPU }, { "tlbmod", VCPU_STAT(tlbmod_exits), KVM_STAT_VCPU }, { "tlbmiss_ld", VCPU_STAT(tlbmiss_ld_exits), KVM_STAT_VCPU }, { "tlbmiss_st", VCPU_STAT(tlbmiss_st_exits), KVM_STAT_VCPU },
Greg Kroah-Hartman
maintainerPATCH 5/496 affs_lookup(): close a race with affs_remove_link()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 30da870ce4a4e007c901858a96e9e394a1daa74a upstream.
we unlock the directory hash too early - if we are looking at secondary link and primary (in another directory) gets removed just as we unlock, we could have the old primary moved in place of the secondary, leaving us to look into freed entry (and leaving our dentry with ->d_fsdata pointing to a freed entry).
--- fs/affs/namei.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
fs/affs/namei.c +7 -3
@@ -206,9 +206,10 @@ affs_lookup(struct inode *dir, struct deaffs_lock_dir (dir); bh =affs_find_entry (dir, dentry); -affs_unlock_dir (dir); -if (IS_ERR (bh)) +if (IS_ERR (bh)) { +affs_unlock_dir (dir);return ERR_CAST (bh); + }if (bh) {u32 ino = bh->b_blocknr;
@@ -222,10 +223,13 @@ affs_lookup(struct inode *dir, struct de }affs_brelse (bh); inode =affs_iget (sb, ino); -if (IS_ERR (inode)) +if (IS_ERR (inode)) { +affs_unlock_dir (dir);return ERR_CAST (inode); + } }d_add (dentry, inode); +affs_unlock_dir (dir);return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 6/496 fs: dont scan the inode cache before SB_BORN is set
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Chinner <[email protected]>
commit 79f546a696bff2590169fb5684e23d65f4d9f591 upstream.
We recently had an oops reported on a 4.14 kernel in xfs_reclaim_inodes_count() where sb->s_fs_info pointed to garbage and so the m_perag_tree lookup walked into lala land. It produces an oops down this path during the failed mount:
radix_tree_gang_lookup_tag+0xc4/0x130 xfs_perag_get_tag+0x37/0xf0 xfs_reclaim_inodes_count+0x32/0x40 xfs_fs_nr_cached_objects+0x11/0x20 super_cache_count+0x35/0xc0 shrink_slab.part.66+0xb1/0x370 shrink_node+0x7e/0x1a0 try_to_free_pages+0x199/0x470 __alloc_pages_slowpath+0x3a1/0xd20 __alloc_pages_nodemask+0x1c3/0x200 cache_grow_begin+0x20b/0x2e0 fallback_alloc+0x160/0x200 kmem_cache_alloc+0x111/0x4e0
The problem is that the superblock shrinker is running before the filesystem structures it depends on have been fully set up. i.e. the shrinker is registered in sget(), before ->fill_super() has been called, and the shrinker can call into the filesystem before fill_super() does it's setup work. Essentially we are exposed to both use-after-free and use-before-initialisation bugs here.
To fix this, add a check for the SB_BORN flag in super_cache_count. In general, this flag is not set until ->fs_mount() completes successfully, so we know that it is set after the filesystem setup has completed. This matches the trylock_super() behaviour which will not let super_cache_scan() run if SB_BORN is not set, and hence will not allow the superblock shrinker from entering the filesystem while it is being set up or after it has failed setup and is being torn down.
--- fs/super.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-)
fs/super.c +24 -6
@@ -120,13 +120,23 @@ static unsigned long super_cache_count(s sb = container_of(shrink, struct super_block, s_shrink);/* -* Don't call trylock_super as it is a potential -* scalability bottleneck. The counts could get updated -* between super_cache_count and super_cache_scan anyway. -* Call to super_cache_count with shrinker_rwsem held -* ensures the safety of call to list_lru_shrink_count() and -* s_op->nr_cached_objects(). +* We don't call trylock_super() here as it is a scalability bottleneck, +* so we're exposed to partial setup state. The shrinker rwsem does not +* protect filesystem operations backing list_lru_shrink_count() or +* s_op->nr_cached_objects(). Counts can change between +* super_cache_count and super_cache_scan, so we really don't need locks +* here. +* +* However, if we are currently mounting the superblock, the underlying +* filesystem might be in a state of partial construction and hence it +* is dangerous to access it. trylock_super() uses a SB_BORN check to +* avoid this situation, so do the same here. The memory barrier is +* matched with the one in mount_fs() as we don't hold locks here. */ +if (!(sb->s_flags &SB_BORN )) +return 0 ; +smp_rmb (); +if (sb->s_op && sb->s_op->nr_cached_objects) total_objects = sb->s_op->nr_cached_objects (sb, sc);
@@ -1232,6 +1242,14 @@ mount_fs(struct file_system_type *type, sb = root->d_sb;BUG_ON (!sb);WARN_ON (!sb->s_bdi); + +/* +* Write barrier is for super_cache_count(). We place it before setting +* SB_BORN as the data dependency between the two functions is the +* superblock structure contents that we just set up, not the SB_BORN +* flag. +*/ +smp_wmb (); sb->s_flags |=SB_BORN ; error =security_sb_kern_mount (sb, flags, secdata);
Greg Kroah-Hartman
maintainerPATCH 7/496 aio: fix io_destroy(2) vs. lookup_ioctx() race
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit baf10564fbb66ea222cae66fbff11c444590ffd9 upstream.
kill_ioctx() used to have an explicit RCU delay between removing the reference from ->ioctx_table and percpu_ref_kill() dropping the refcount. At some point that delay had been removed, on the theory that percpu_ref_kill() itself contained an RCU delay. Unfortunately, that was the wrong kind of RCU delay and it didn't care about rcu_read_lock() used by lookup_ioctx(). As the result, we could get ctx freed right under lookup_ioctx(). Tejun has fixed that in a6d7cff472e ("fs/aio: Add explicit RCU grace period when freeing kioctx"); however, that fix is not enough.
Suppose io_destroy() from one thread races with e.g. io_setup() from another; CPU1 removes the reference from current->mm->ioctx_table[...] just as CPU2 has picked it (under rcu_read_lock()). Then CPU1 proceeds to drop the refcount, getting it to 0 and triggering a call of free_ioctx_users(), which proceeds to drop the secondary refcount and once that reaches zero calls free_ioctx_reqs(). That does
INIT_RCU_WORK(&ctx->free_rwork, free_ioctx);
queue_rcu_work(system_wq, &ctx->free_rwork);and schedules freeing the whole thing after RCU delay.
In the meanwhile CPU2 has gotten around to percpu_ref_get(), bumping the refcount from 0 to 1 and returned the reference to io_setup().
Tejun's fix (that queue_rcu_work() in there) guarantees that ctx won't get freed until after percpu_ref_get(). Sure, we'd increment the counter before ctx can be freed. Now we are out of rcu_read_lock() and there's nothing to stop freeing of the whole thing. Unfortunately, CPU2 assumes that since it has grabbed the reference, ctx is *NOT* going away until it gets around to dropping that reference.
The fix is obvious - use percpu_ref_tryget_live() and treat failure as miss. It's not costlier than what we currently do in normal case, it's safe to call since freeing *is* delayed and it closes the race window - either lookup_ioctx() comes before percpu_ref_kill() (in which case ctx->users won't reach 0 until the caller of lookup_ioctx() drops it) or lookup_ioctx() fails, ctx->users is unaffected and caller of lookup_ioctx() doesn't see the object in question at all.
--- fs/aio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/aio.c +2 -2
@@ -1087,8 +1087,8 @@ static struct kioctx *lookup_ioctx(unsig ctx =rcu_dereference (table->table[id]);if (ctx && ctx->user_id == ctx_id) { -percpu_ref_get (&ctx->users); - ret = ctx; +if (percpu_ref_tryget_live (&ctx->users)) + ret = ctx; } out:rcu_read_unlock ();
Greg Kroah-Hartman
maintainerPATCH 8/496 ALSA: timer: Fix pause event notification
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 3ae180972564846e6d794e3615e1ab0a1e6c4ef9 upstream.
Commit f65e0d299807 ("ALSA: timer: Call notifier in the same spinlock") combined the start/continue and stop/pause functions, and in doing so changed the event code for the pause case to SNDRV_TIMER_EVENT_CONTINUE. Change it back to SNDRV_TIMER_EVENT_PAUSE.
--- sound/core/timer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/core/timer.c +2 -2
@@ -592,7 +592,7 @@ static int snd_timer_stop1(struct snd_tielse timeri->flags |=SNDRV_TIMER_IFLG_PAUSED ;snd_timer_notify1 (timeri, stop ?SNDRV_TIMER_EVENT_STOP : -SNDRV_TIMER_EVENT_CONTINUE ); +SNDRV_TIMER_EVENT_PAUSE ); unlock:spin_unlock_irqrestore (&timer->lock, flags);return result;
@@ -614,7 +614,7 @@ static int snd_timer_stop_slave(struct slist_del_init (&timeri->ack_list);list_del_init (&timeri->active_list);snd_timer_notify1 (timeri, stop ?SNDRV_TIMER_EVENT_STOP : -SNDRV_TIMER_EVENT_CONTINUE ); +SNDRV_TIMER_EVENT_PAUSE );spin_unlock (&timeri->timer->lock); }spin_unlock_irqrestore (&slave_active_lock, flags);
Greg Kroah-Hartman
maintainerPATCH 9/496 do d_instantiate/unlock_new_inode combinations safely
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 1e2e547a93a00ebc21582c06ca3c6cfea2a309ee upstream.
For anything NFS-exported we do _not_ want to unlock new inode before it has grown an alias; original set of fixes got the ordering right, but missed the nasty complication in case of lockdep being enabled - unlock_new_inode() does
lockdep_annotate_inode_mutex_key(inode)
which can only be done before anyone gets a chance to touch ->i_mutex. Unfortunately, flipping the order and doing unlock_new_inode() before d_instantiate() opens a window when mkdir can race with open-by-fhandle on a guessed fhandle, leading to multiple aliases for a directory inode and all the breakage that follows from that.
Correct solution: a new primitive (d_instantiate_new())
combining these two in the right order - lockdep annotate, then d_instantiate(), then the rest of unlock_new_inode(). All combinations of d_instantiate() with unlock_new_inode() should be converted to that.
--- fs/btrfs/inode.c | 16 ++++------------ fs/dcache.c | 22 ++++++++++++++++++++++ fs/ecryptfs/inode.c | 3 +-- fs/ext2/namei.c | 6 ++---- fs/ext4/namei.c | 6 ++---- fs/f2fs/namei.c | 12 ++++-------- fs/jffs2/dir.c | 12 ++++-------- fs/jfs/namei.c | 12 ++++-------- fs/nilfs2/namei.c | 6 ++---- fs/orangefs/namei.c | 9 +++------ fs/reiserfs/namei.c | 12 ++++-------- fs/udf/namei.c | 6 ++---- fs/ufs/namei.c | 6 ++---- include/linux/dcache.h | 1 + 14 files changed, 57 insertions(+), 72 deletions(-)
fs/btrfs/inode.c +4 -12
@@ -6664,8 +6664,7 @@ static int btrfs_mknod(struct inode *dir goto out_unlock_inode; }else {btrfs_update_inode (trans, root, inode); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode); } out_unlock:
@@ -6742,8 +6741,7 @@ static int btrfs_create(struct inode *di goto out_unlock_inode;BTRFS_I (inode)->io_tree.ops = &btrfs_extent_io_ops; -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode); out_unlock:btrfs_end_transaction (trans);
@@ -6890,12 +6888,7 @@ static int btrfs_mkdir(struct inode *dirif (err) goto out_fail_inode; -d_instantiate (dentry, inode); -/* -* mkdir is special. We're unlocking after we call d_instantiate -* to avoid a race with nfsd calling d_instantiate. -*/ -unlock_new_inode (inode); +d_instantiate_new (dentry, inode); drop_on_err =0 ; out_fail:
@@ -10573,8 +10566,7 @@ static int btrfs_symlink(struct inode *d goto out_unlock_inode; } -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode); out_unlock:btrfs_end_transaction (trans);
fs/dcache.c +22 -0
@@ -1867,6 +1867,28 @@ void d_instantiate(struct dentry *entry, }EXPORT_SYMBOL (d_instantiate); +/* +* This should be equivalent to d_instantiate() + unlock_new_inode(), +* with lockdep-related part of unlock_new_inode() done before +* anything else. Use that instead of open-coding d_instantiate()/ +* unlock_new_inode() combinations. +*/ +void d_instantiate_new (struct dentry *entry,struct inode *inode) +{ +BUG_ON (!hlist_unhashed (&entry->d_u.d_alias)); +BUG_ON (!inode); +lockdep_annotate_inode_mutex_key (inode); +security_d_instantiate (entry, inode); +spin_lock (&inode->i_lock); +__d_instantiate (entry, inode); +WARN_ON (!(inode->i_state &I_NEW )); + inode->i_state &= ~I_NEW ; +smp_mb (); +wake_up_bit (&inode->i_state, __I_NEW); +spin_unlock (&inode->i_lock); +} +EXPORT_SYMBOL (d_instantiate_new); +/** * d_instantiate_no_diralias - instantiate a non-aliased dentry * @entry: dentry to complete
fs/ecryptfs/inode.c +1 -2
@@ -284,8 +284,7 @@ ecryptfs_create(struct inode *directory_iget_failed (ecryptfs_inode); goto out; } -unlock_new_inode (ecryptfs_inode); -d_instantiate (ecryptfs_dentry, ecryptfs_inode); +d_instantiate_new (ecryptfs_dentry, ecryptfs_inode); out:return rc; }
fs/ext2/namei.c +2 -4
@@ -41,8 +41,7 @@ static inline int ext2_add_nondir(struct {int err =ext2_add_link (dentry, inode);if (!err) { -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);return 0 ; }inode_dec_link_count (inode);
@@ -269,8 +268,7 @@ static int ext2_mkdir(struct inode * dirif (err) goto out_fail; -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode); out:return err;
fs/ext4/namei.c +2 -4
@@ -2420,8 +2420,7 @@ static int ext4_add_nondir(handle_t *hanint err =ext4_add_entry (handle, dentry, inode);if (!err) {ext4_mark_inode_dirty (handle, inode); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);return 0 ; }drop_nlink (inode);
@@ -2660,8 +2659,7 @@ out_clear_inode: err =ext4_mark_inode_dirty (handle, dir);if (err) goto out_clear_inode; -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);if (IS_DIRSYNC (dir))ext4_handle_sync (handle);
fs/f2fs/namei.c +4 -8
@@ -201,8 +201,7 @@ static int f2fs_create(struct inode *diralloc_nid_done (sbi, ino); -d_instantiate (dentry, inode); -unlock_new_inode (inode); +d_instantiate_new (dentry, inode);if (IS_DIRSYNC (dir))f2fs_sync_fs (sbi->sb,1 );
@@ -529,8 +528,7 @@ static int f2fs_symlink(struct inode *di err =page_symlink (inode, disk_link.name, disk_link.len); err_out: -d_instantiate (dentry, inode); -unlock_new_inode (inode); +d_instantiate_new (dentry, inode);/* * Let's flush symlink data in order to avoid broken symlink as much as
@@ -588,8 +586,7 @@ static int f2fs_mkdir(struct inode *dir,alloc_nid_done (sbi, inode->i_ino); -d_instantiate (dentry, inode); -unlock_new_inode (inode); +d_instantiate_new (dentry, inode);if (IS_DIRSYNC (dir))f2fs_sync_fs (sbi->sb,1 );
@@ -637,8 +634,7 @@ static int f2fs_mknod(struct inode *dir,alloc_nid_done (sbi, inode->i_ino); -d_instantiate (dentry, inode); -unlock_new_inode (inode); +d_instantiate_new (dentry, inode);if (IS_DIRSYNC (dir))f2fs_sync_fs (sbi->sb,1 );
fs/jffs2/dir.c +4 -8
@@ -209,8 +209,7 @@ static int jffs2_create(struct inode *di __func__, inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->pino_nlink, inode->i_mapping->nrpages); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);return 0 ; fail:
@@ -430,8 +429,7 @@ static int jffs2_symlink (struct inode *mutex_unlock (&dir_f->sem);jffs2_complete_reservation (c); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);return 0 ; fail:
@@ -575,8 +573,7 @@ static int jffs2_mkdir (struct inode *dimutex_unlock (&dir_f->sem);jffs2_complete_reservation (c); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);return 0 ; fail:
@@ -747,8 +744,7 @@ static int jffs2_mknod (struct inode *dimutex_unlock (&dir_f->sem);jffs2_complete_reservation (c); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);return 0 ; fail:
fs/jfs/namei.c +4 -8
@@ -178,8 +178,7 @@ static int jfs_create(struct inode *dip,unlock_new_inode (ip);iput (ip); }else { -unlock_new_inode (ip); -d_instantiate (dentry, ip); +d_instantiate_new (dentry, ip); } out2:
@@ -313,8 +312,7 @@ static int jfs_mkdir(struct inode *dip,unlock_new_inode (ip);iput (ip); }else { -unlock_new_inode (ip); -d_instantiate (dentry, ip); +d_instantiate_new (dentry, ip); } out2:
@@ -1059,8 +1057,7 @@ static int jfs_symlink(struct inode *dipunlock_new_inode (ip);iput (ip); }else { -unlock_new_inode (ip); -d_instantiate (dentry, ip); +d_instantiate_new (dentry, ip); } out2:
@@ -1447,8 +1444,7 @@ static int jfs_mknod(struct inode *dir,unlock_new_inode (ip);iput (ip); }else { -unlock_new_inode (ip); -d_instantiate (dentry, ip); +d_instantiate_new (dentry, ip); } out1:
fs/nilfs2/namei.c +2 -4
@@ -46,8 +46,7 @@ static inline int nilfs_add_nondir(strucint err =nilfs_add_link (dentry, inode);if (!err) { -d_instantiate (dentry, inode); -unlock_new_inode (inode); +d_instantiate_new (dentry, inode);return 0 ; }inode_dec_link_count (inode);
@@ -243,8 +242,7 @@ static int nilfs_mkdir(struct inode *dir goto out_fail;nilfs_mark_inode_dirty (inode); -d_instantiate (dentry, inode); -unlock_new_inode (inode); +d_instantiate_new (dentry, inode); out:if (!err) err =nilfs_transaction_commit (dir->i_sb);
fs/orangefs/namei.c +3 -6
@@ -71,8 +71,7 @@ static int orangefs_create(struct inodeget_khandle_from_ino (inode), dentry); -d_instantiate (dentry, inode); -unlock_new_inode (inode); +d_instantiate_new (dentry, inode);orangefs_set_timeout (dentry);ORANGEFS_I (inode)->getattr_time = jiffies -1 ;ORANGEFS_I (inode)->getattr_mask =STATX_BASIC_STATS ;
@@ -320,8 +319,7 @@ static int orangefs_symlink(struct inode"Assigned symlink inode new number of %pU\n" , get_khandle_from_ino(inode)); -d_instantiate (dentry, inode); -unlock_new_inode (inode); +d_instantiate_new (dentry, inode);orangefs_set_timeout (dentry);ORANGEFS_I (inode)->getattr_time = jiffies -1 ;ORANGEFS_I (inode)->getattr_mask =STATX_BASIC_STATS ;
@@ -385,8 +383,7 @@ static int orangefs_mkdir(struct inode *"Assigned dir inode new number of %pU\n" , get_khandle_from_ino(inode)); -d_instantiate (dentry, inode); -unlock_new_inode (inode); +d_instantiate_new (dentry, inode);orangefs_set_timeout (dentry);ORANGEFS_I (inode)->getattr_time = jiffies -1 ;ORANGEFS_I (inode)->getattr_mask =STATX_BASIC_STATS ;
fs/reiserfs/namei.c +4 -8
@@ -687,8 +687,7 @@ static int reiserfs_create(struct inodereiserfs_update_inode_transaction (inode);reiserfs_update_inode_transaction (dir); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode); retval =journal_end (&th); out_failed:
@@ -771,8 +770,7 @@ static int reiserfs_mknod(struct inode * goto out_failed; } -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode); retval =journal_end (&th); out_failed:
@@ -871,8 +869,7 @@ static int reiserfs_mkdir(struct inode */* the above add_entry did not update dir's stat data */ reiserfs_update_sd (&th, dir); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode); retval =journal_end (&th); out_failed:reiserfs_write_unlock (dir->i_sb);
@@ -1187,8 +1184,7 @@ static int reiserfs_symlink(struct inode goto out_failed; } -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode); retval =journal_end (&th); out_failed:reiserfs_write_unlock (parent_dir->i_sb);
fs/udf/namei.c +2 -4
@@ -621,8 +621,7 @@ static int udf_add_nondir(struct dentryif (fibh.sbh != fibh.ebh)brelse (fibh.ebh);brelse (fibh.sbh); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);return 0 ; }
@@ -732,8 +731,7 @@ static int udf_mkdir(struct inode *dir,inc_nlink (dir); dir->i_ctime = dir->i_mtime =current_time (dir);mark_inode_dirty (dir); -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);if (fibh.sbh != fibh.ebh)brelse (fibh.ebh);brelse (fibh.sbh);
fs/ufs/namei.c +2 -4
@@ -39,8 +39,7 @@ static inline int ufs_add_nondir(struct {int err =ufs_add_link (dentry, inode);if (!err) { -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);return 0 ; }inode_dec_link_count (inode);
@@ -193,8 +192,7 @@ static int ufs_mkdir(struct inode * dir,if (err) goto out_fail; -unlock_new_inode (inode); -d_instantiate (dentry, inode); +d_instantiate_new (dentry, inode);return 0 ; out_fail:
include/linux/dcache.h +1 -0
@@ -226,6 +226,7 @@ extern seqlock_t rename_lock;* These are the low-level FS interfaces to the dcache.. */ extern void d_instantiate (struct dentry *,struct inode *); +extern void d_instantiate_new (struct dentry *,struct inode *);extern struct dentry *d_instantiate_unique (struct dentry *,struct inode *);extern int d_instantiate_no_diralias (struct dentry *,struct inode *);extern void __d_drop (struct dentry *dentry);
Greg Kroah-Hartman
maintainerPATCH 10/496 mmc: sdhci-iproc: remove hard coded mmc cap 1.8v
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinath Mannam <[email protected]>
commit 4c94238f37af87a2165c3fb491b4a8b50e90649c upstream.
Remove hard coded mmc cap 1.8v from platform data as it is board specific. The 1.8v DDR mmc caps can be enabled using DTS property for those boards that support it.
--- drivers/mmc/host/sdhci-iproc.c | 1 - 1 file changed, 1 deletion(-)
drivers/mmc/host/sdhci-iproc.c +0 -1
@@ -206,7 +206,6 @@ static const struct sdhci_iproc_data ipr .caps1 = SDHCI_DRIVER_TYPE_C | SDHCI_DRIVER_TYPE_D | SDHCI_SUPPORT_DDR50, - .mmc_caps = MMC_CAP_1_8V_DDR, };static const struct sdhci_pltfm_data sdhci_bcm2835_pltfm_data = {
Greg Kroah-Hartman
maintainerPATCH 11/496 mmc: sdhci-iproc: fix 32bit writes for TRANSFER_MODE register
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Corneliu Doban <[email protected]>
commit 5f651b870485ee60f5abbbd85195a6852978894a upstream.
When the host controller accepts only 32bit writes, the value of the 16bit TRANSFER_MODE register, that has the same 32bit address as the 16bit COMMAND register, needs to be saved and it will be written in a 32bit write together with the command as this will trigger the host to send the command on the SD interface.
When sending the tuning command, TRANSFER_MODE is written and then sdhci_set_transfer_mode reads it back to clear AUTO_CMD12 bit and write it again resulting in wrong value to be written because the initial write value was saved in a shadow and the read-back returned a wrong value, from the register.
Fix sdhci_iproc_readw to return the saved value of TRANSFER_MODE when a saved value exist.
Same fix for read of BLOCK_SIZE and BLOCK_COUNT registers, that are saved for a different reason, although a scenario that will cause the mentioned problem on this registers is not probable.
--- drivers/mmc/host/sdhci-iproc.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-)
drivers/mmc/host/sdhci-iproc.c +25 -5
@@ -33,6 +33,8 @@ struct sdhci_iproc_host {const struct sdhci_iproc_data *data;u32 shadow_cmd;u32 shadow_blk; +bool is_cmd_shadowed; +bool is_blk_shadowed; };#define REG_OFFSET_IN_BITS (reg) ((reg) << 3 & 0x18)
@@ -48,8 +50,22 @@ static inline u32 sdhci_iproc_readl(strustatic u16 sdhci_iproc_readw (struct sdhci_host *host,int reg) { -u32 val =sdhci_iproc_readl (host, (reg & ~3 )); -u16 word = val >>REG_OFFSET_IN_BITS (reg) &0xffff ; +struct sdhci_pltfm_host *pltfm_host =sdhci_priv (host); +struct sdhci_iproc_host *iproc_host =sdhci_pltfm_priv (pltfm_host); +u32 val; +u16 word; + +if ((reg ==SDHCI_TRANSFER_MODE ) && iproc_host->is_cmd_shadowed) { +/* Get the saved transfer mode */ + val = iproc_host->shadow_cmd; + }else if ((reg ==SDHCI_BLOCK_SIZE || reg ==SDHCI_BLOCK_COUNT ) && + iproc_host->is_blk_shadowed) { +/* Get the saved block info */ + val = iproc_host->shadow_blk; + }else { + val =sdhci_iproc_readl (host, (reg & ~3 )); + } + word = val >>REG_OFFSET_IN_BITS (reg) &0xffff ;return word; }
@@ -105,13 +121,15 @@ static void sdhci_iproc_writew(struct sdif (reg ==SDHCI_COMMAND ) {/* Write the block now as we are issuing a command */ -if (iproc_host->shadow_blk !=0 ) { +if (iproc_host->is_blk_shadowed) {sdhci_iproc_writel (host, iproc_host->shadow_blk,SDHCI_BLOCK_SIZE ); - iproc_host->shadow_blk =0 ; + iproc_host->is_blk_shadowed = false; } oldval = iproc_host->shadow_cmd; - }else if (reg ==SDHCI_BLOCK_SIZE || reg ==SDHCI_BLOCK_COUNT ) { + iproc_host->is_cmd_shadowed = false; + }else if ((reg ==SDHCI_BLOCK_SIZE || reg ==SDHCI_BLOCK_COUNT ) && + iproc_host->is_blk_shadowed) {/* Block size and count are stored in shadow reg */ oldval = iproc_host->shadow_blk; }else {
@@ -123,9 +141,11 @@ static void sdhci_iproc_writew(struct sdif (reg ==SDHCI_TRANSFER_MODE ) {/* Save the transfer mode until the command is issued */ iproc_host->shadow_cmd = newval; + iproc_host->is_cmd_shadowed = true; }else if (reg ==SDHCI_BLOCK_SIZE || reg ==SDHCI_BLOCK_COUNT ) {/* Save the block info until the command is issued */ iproc_host->shadow_blk = newval; + iproc_host->is_blk_shadowed = true; }else {/* Command or other regular 32-bit write */ sdhci_iproc_writel (host, newval, reg & ~3 );
Greg Kroah-Hartman
maintainerPATCH 12/496 mmc: sdhci-iproc: add SDHCI_QUIRK2_HOST_OFF_CARD_ON for cygnus
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Corneliu Doban <[email protected]>
commit 3de06d5a1f05c11c94cbb68af14dbfa7fb81d78b upstream.
The SDHCI_QUIRK2_HOST_OFF_CARD_ON is needed for the driver to properly reset the host controller (reset all) on initialization after exiting deep sleep.
--- drivers/mmc/host/sdhci-iproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mmc/host/sdhci-iproc.c +1 -1
@@ -186,7 +186,7 @@ static const struct sdhci_ops sdhci_iprostatic const struct sdhci_pltfm_data sdhci_iproc_cygnus_pltfm_data = { .quirks =SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK , - .quirks2 =SDHCI_QUIRK2_ACMD23_BROKEN , + .quirks2 =SDHCI_QUIRK2_ACMD23_BROKEN |SDHCI_QUIRK2_HOST_OFF_CARD_ON , .ops = &sdhci_iproc_32only_ops, };
Greg Kroah-Hartman
maintainerPATCH 13/496 libata: Blacklist some Sandisk SSDs for NCQ
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit 322579dcc865b94b47345ad1b6002ad167f85405 upstream.
Sandisk SSDs SD7SN6S256G and SD8SN8U256G are regularly locking up regularly under sustained moderate load with NCQ enabled. Blacklist for now.
--- drivers/ata/libata-core.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/ata/libata-core.c +4 -0
@@ -4483,6 +4483,10 @@ static const struct ata_blacklist_entry/* https://bugzilla.kernel.org/show_bug.cgi?id=15573 */ { "C300-CTFDDAC128MAG", "0001", ATA_HORKAGE_NONCQ, }, + /* Some Sandisk SSDs lock up hard with NCQ enabled. Reported on + SD7SN6S256G and SD8SN8U256G */ + { "SanDisk SD[78]SN*G", NULL, ATA_HORKAGE_NONCQ, }, + /* devices which puke on READ_NATIVE_MAX */ { "HDS724040KLSA80", "KFAOA20N", ATA_HORKAGE_BROKEN_HPA, }, { "WDC WD3200JD-00KLB0", "WD-WCAMR1130137", ATA_HORKAGE_BROKEN_HPA },
Greg Kroah-Hartman
maintainerPATCH 14/496 libata: blacklist Micron 500IT SSD with MU01 firmware
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudip Mukherjee <[email protected]>
commit 136d769e0b3475d71350aa3648a116a6ee7a8f6c upstream.
While whitelisting Micron M500DC drives, the tweaked blacklist entry enabled queued TRIM from M500IT variants also. But these do not support queued TRIM. And while using those SSDs with the latest kernel we have seen errors and even the partition table getting corrupted.
Some part from the dmesg:
[ 6.727384] ata1.00: ATA-9: Micron_M500IT_MTFDDAK060MBD, MU01, max UDMA/133 [ 6.727390] ata1.00: 117231408 sectors, multi 16: LBA48 NCQ (depth 31/32), AA [ 6.741026] ata1.00: supports DRM functions and may not be fully accessible [ 6.759887] ata1.00: configured for UDMA/133 [ 6.762256] scsi 0:0:0:0: Direct-Access ATA Micron_M500IT_MT MU01 PQ: 0 ANSI: 5
and then for the error:
[ 120.860334] ata1.00: exception Emask 0x1 SAct 0x7ffc0007 SErr 0x0 action 0x6 frozen
[ 120.860338] ata1.00: irq_stat 0x40000008
[ 120.860342] ata1.00: failed command: SEND FPDMA QUEUED
[ 120.860351] ata1.00: cmd 64/01:00:00:00:00/00:00:00:00:00/a0 tag 0 ncq dma 512 out
res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x5 (timeout)
[ 120.860353] ata1.00: status: { DRDY }
[ 120.860543] ata1: hard resetting link
[ 121.166128] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[ 121.166376] ata1.00: supports DRM functions and may not be fully accessible
[ 121.186238] ata1.00: supports DRM functions and may not be fully accessible
[ 121.204445] ata1.00: configured for UDMA/133
[ 121.204454] ata1.00: device reported invalid CHS sector 0
[ 121.204541] sd 0:0:0:0: [sda] tag#18 UNKNOWN(0x2003) Result: hostbyte=0x00 driverbyte=0x08
[ 121.204546] sd 0:0:0:0: [sda] tag#18 Sense Key : 0x5 [current]
[ 121.204550] sd 0:0:0:0: [sda] tag#18 ASC=0x21 ASCQ=0x4
[ 121.204555] sd 0:0:0:0: [sda] tag#18 CDB: opcode=0x93 93 08 00 00 00 00 00 04 28 80 00 00 00 30 00 00
[ 121.204559] print_req_error: I/O error, dev sda, sector 272512After few reboots with these errors, and the SSD is corrupted. After blacklisting it, the errors are not seen and the SSD does not get corrupted any more.
--- drivers/ata/libata-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/ata/libata-core.c +2 -0
@@ -4547,6 +4547,8 @@ static const struct ata_blacklist_entry { "SanDisk SD7UB3Q*G1001", NULL, ATA_HORKAGE_NOLPM, }, /* devices that don't properly handle queued TRIM commands */ + { "Micron_M500IT_*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | + ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "Micron_M500_*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "Crucial_CT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
Greg Kroah-Hartman
maintainerPATCH 15/496 xen-swiotlb: fix the check condition for xen_swiotlb_free_coherent
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joe Jin <[email protected]>
commit 4855c92dbb7b3b85c23e88ab7ca04f99b9677b41 upstream.
When run raidconfig from Dom0 we found that the Xen DMA heap is reduced, but Dom Heap is increased by the same size. Tracing raidconfig we found that the related ioctl() in megaraid_sas will call dma_alloc_coherent() to apply memory. If the memory allocated by Dom0 is not in the DMA area, it will exchange memory with Xen to meet the requiment. Later drivers call dma_free_coherent() to free the memory, on xen_swiotlb_free_coherent() the check condition (dev_addr + size - 1 <= dma_mask) is always false, it prevents calling xen_destroy_contiguous_region() to return the memory to the Xen DMA heap.
This issue introduced by commit 6810df88dcfc2 "xen-swiotlb: When doing coherent alloc/dealloc check before swizzling the MFNs.".
--- drivers/xen/swiotlb-xen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/xen/swiotlb-xen.c +1 -1
@@ -365,7 +365,7 @@ xen_swiotlb_free_coherent(struct device* physical address */ phys =xen_bus_to_phys (dev_addr); -if (((dev_addr + size -1 > dma_mask)) || +if (((dev_addr + size -1 <= dma_mask)) ||range_straddles_page_boundary (phys, size))xen_destroy_contiguous_region (phys, order);
Greg Kroah-Hartman
maintainerPATCH 16/496 drm/vmwgfx: Fix 32-bit VMW_PORT_HB_[IN|OUT] macros
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Hellstrom <[email protected]>
commit 938ae7259c908ad031da35d551da297640bb640c upstream.
Depending on whether the kernel is compiled with frame-pointer or not, the temporary memory location used for the bp parameter in these macros is referenced relative to the stack pointer or the frame pointer. Hence we can never reference that parameter when we've modified either the stack pointer or the frame pointer, because then the compiler would generate an incorrect stack reference.
Fix this by pushing the temporary memory parameter on a known location on the stack before modifying the stack- and frame pointers.
--- drivers/gpu/drm/vmwgfx/vmwgfx_msg.h | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_msg.h +17 -8
@@ -135,17 +135,24 @@#else -/* In the 32-bit version of this macro, we use "m" because there is no -* more register left for bp +/* +* In the 32-bit version of this macro, we store bp in a memory location +* because we've ran out of registers. +* Now we can't reference that memory location while we've modified +* %esp or %ebp, so we first push it on the stack, just before we push +* %ebp, and then when we need it we read it from the stack where we +* just pushed it. */ #define VMW_PORT_HB_OUT (cmd, in_ecx, in_si, in_di, \ port_num, magic, bp, \ eax, ebx, ecx, edx, si, di) \ ({ \ - asm volatile ("push %%ebp;" \ - "mov %12, %%ebp;" \ + asm volatile ("push %12;" \ + "push %%ebp;" \ + "mov 0x04(%%esp), %%ebp;" \ "rep outsb;" \ - "pop %%ebp;" : \ + "pop %%ebp;" \ + "add $0x04, %%esp;" : \ "=a"(eax), \ "=b"(ebx), \ "=c"(ecx), \
@@ -167,10 +174,12 @@ port_num, magic, bp, \ eax, ebx, ecx, edx, si, di) \ ({ \ - asm volatile ("push %%ebp;" \ - "mov %12, %%ebp;" \ + asm volatile ("push %12;" \ + "push %%ebp;" \ + "mov 0x04(%%esp), %%ebp;" \ "rep insb;" \ - "pop %%ebp" : \ + "pop %%ebp;" \ + "add $0x04, %%esp;" : \ "=a"(eax), \ "=b"(ebx), \ "=c"(ecx), \
Greg Kroah-Hartman
maintainerPATCH 17/496 arm64: lse: Add early clobbers to some input/output asm operands
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
commit 32c3fa7cdf0c4a3eb8405fc3e13398de019e828b upstream.
For LSE atomics that read and write a register operand, we need to ensure that these operands are annotated as "early clobber" if the register is written before all of the input operands have been consumed. Failure to do so can result in the compiler allocating the same register to both operands, leading to splats such as:
Unable to handle kernel paging request at virtual address 11111122222221 [...] x1 : 1111111122222222 x0 : 1111111122222221 Process swapper/0 (pid: 1, stack limit = 0x000000008209f908) Call trace: test_atomic64+0x1360/0x155c
where x0 has been allocated as both the value to be stored and also the atomic_t pointer.
This patch adds the missing clobbers.
--- arch/arm64/include/asm/atomic_lse.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
arch/arm64/include/asm/atomic_lse.h +12 -12
@@ -117,7 +117,7 @@ static inline void atomic_and(int i, ato/* LSE atomics */ " mvn %w[i], %w[i]\n" " stclr %w[i], %[v]") - : [i] "+r" (w0), [v] "+Q" (v->counter) + : [i] "+&r" (w0), [v] "+Q" (v->counter) : "r" (x1) : __LL_SC_CLOBBERS); }
@@ -135,7 +135,7 @@ static inline int atomic_fetch_and##name/* LSE atomics */ \" mvn %w[i], %w[i]\n" \ " ldclr" #mb " %w[i], %w[i], %[v]") \ - : [i] "+r" (w0), [v] "+Q" (v->counter) \ + : [i] "+&r" (w0), [v] "+Q" (v->counter) \ : "r" (x1) \ : __LL_SC_CLOBBERS, ##cl); \ \
@@ -161,7 +161,7 @@ static inline void atomic_sub(int i, ato/* LSE atomics */ " neg %w[i], %w[i]\n" " stadd %w[i], %[v]") - : [i] "+r" (w0), [v] "+Q" (v->counter) + : [i] "+&r" (w0), [v] "+Q" (v->counter) : "r" (x1) : __LL_SC_CLOBBERS); }
@@ -180,7 +180,7 @@ static inline int atomic_sub_return##nam" neg %w[i], %w[i]\n" \ " ldadd" #mb " %w[i], w30, %[v]\n" \ " add %w[i], %w[i], w30") \ - : [i] "+r" (w0), [v] "+Q" (v->counter) \ + : [i] "+&r" (w0), [v] "+Q" (v->counter) \ : "r" (x1) \ : __LL_SC_CLOBBERS , ##cl); \ \
@@ -207,7 +207,7 @@ static inline int atomic_fetch_sub##name/* LSE atomics */ \" neg %w[i], %w[i]\n" \ " ldadd" #mb " %w[i], %w[i], %[v]") \ - : [i] "+r" (w0), [v] "+Q" (v->counter) \ + : [i] "+&r" (w0), [v] "+Q" (v->counter) \ : "r" (x1) \ : __LL_SC_CLOBBERS, ##cl); \ \
@@ -314,7 +314,7 @@ static inline void atomic64_and(long i,/* LSE atomics */ " mvn %[i], %[i]\n" " stclr %[i], %[v]") - : [i] "+r" (x0), [v] "+Q" (v->counter) + : [i] "+&r" (x0), [v] "+Q" (v->counter) : "r" (x1) : __LL_SC_CLOBBERS); }
@@ -332,7 +332,7 @@ static inline long atomic64_fetch_and##n/* LSE atomics */ \" mvn %[i], %[i]\n" \ " ldclr" #mb " %[i], %[i], %[v]") \ - : [i] "+r" (x0), [v] "+Q" (v->counter) \ + : [i] "+&r" (x0), [v] "+Q" (v->counter) \ : "r" (x1) \ : __LL_SC_CLOBBERS, ##cl); \ \
@@ -358,7 +358,7 @@ static inline void atomic64_sub(long i,/* LSE atomics */ " neg %[i], %[i]\n" " stadd %[i], %[v]") - : [i] "+r" (x0), [v] "+Q" (v->counter) + : [i] "+&r" (x0), [v] "+Q" (v->counter) : "r" (x1) : __LL_SC_CLOBBERS); }
@@ -377,7 +377,7 @@ static inline long atomic64_sub_return##" neg %[i], %[i]\n" \ " ldadd" #mb " %[i], x30, %[v]\n" \ " add %[i], %[i], x30") \ - : [i] "+r" (x0), [v] "+Q" (v->counter) \ + : [i] "+&r" (x0), [v] "+Q" (v->counter) \ : "r" (x1) \ : __LL_SC_CLOBBERS, ##cl); \ \
@@ -404,7 +404,7 @@ static inline long atomic64_fetch_sub##n/* LSE atomics */ \" neg %[i], %[i]\n" \ " ldadd" #mb " %[i], %[i], %[v]") \ - : [i] "+r" (x0), [v] "+Q" (v->counter) \ + : [i] "+&r" (x0), [v] "+Q" (v->counter) \ : "r" (x1) \ : __LL_SC_CLOBBERS, ##cl); \ \
@@ -435,7 +435,7 @@ static inline long atomic64_dec_if_posit" sub x30, x30, %[ret]\n" " cbnz x30, 1b\n" "2:") - : [ret] "+r" (x0), [v] "+Q" (v->counter) + : [ret] "+&r" (x0), [v] "+Q" (v->counter) : : __LL_SC_CLOBBERS, "cc", "memory");
@@ -516,7 +516,7 @@ static inline long __cmpxchg_double##nam" eor %[old1], %[old1], %[oldval1]\n" \" eor %[old2], %[old2], %[oldval2]\n" \ " orr %[old1], %[old1], %[old2]") \ - : [old1] "+r" (x0), [old2] "+r" (x1), \ + : [old1] "+&r" (x0), [old2] "+&r" (x1), \[v] " +Q " (*(unsigned long *)ptr) \ : [new1] " r" (x2), [new2] " r" (x3), [ptr] " r" (x4), \ [oldval1] " r" (oldval1), [oldval2] " r" (oldval2) \
Greg Kroah-Hartman
maintainerPATCH 18/496 powerpc/64s: Clear PCR on boot
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Neuling <[email protected]>
commit faf37c44a105f3608115785f17cbbf3500f8bc71 upstream.
Clear the PCR (Processor Compatibility Register) on boot to ensure we are not running in a compatibility mode.
We've seen this cause problems when a crash (and kdump) occurs while running compat mode guests. The kdump kernel then runs with the PCR set and causes problems. The symptom in the kdump kernel (also seen in petitboot after fast-reboot) is early userspace programs taking sigills on newer instructions (seen in libc).
--- arch/powerpc/kernel/cpu_setup_power.S | 6 ++++++ arch/powerpc/kernel/dt_cpu_ftrs.c | 1 + 2 files changed, 7 insertions(+)
arch/powerpc/kernel/cpu_setup_power.S +6 -0
@@ -28,6 +28,7 @@ _GLOBAL(__setup_cpu_power7) beqlr li r0,0 mtspr SPRN_LPID,r0 + mtspr SPRN_PCR,r0 mfspr r3,SPRN_LPCR li r4,(LPCR_LPES1 >> LPCR_LPES_SH) bl __init_LPCR_ISA206
@@ -42,6 +43,7 @@ _GLOBAL(__restore_cpu_power7) beqlr li r0,0 mtspr SPRN_LPID,r0 + mtspr SPRN_PCR,r0 mfspr r3,SPRN_LPCR li r4,(LPCR_LPES1 >> LPCR_LPES_SH) bl __init_LPCR_ISA206
@@ -59,6 +61,7 @@ _GLOBAL(__setup_cpu_power8) beqlr li r0,0 mtspr SPRN_LPID,r0 + mtspr SPRN_PCR,r0 mfspr r3,SPRN_LPCR ori r3, r3, LPCR_PECEDH li r4,0 /* LPES = 0 */
@@ -81,6 +84,7 @@ _GLOBAL(__restore_cpu_power8) beqlr li r0,0 mtspr SPRN_LPID,r0 + mtspr SPRN_PCR,r0 mfspr r3,SPRN_LPCR ori r3, r3, LPCR_PECEDH li r4,0 /* LPES = 0 */
@@ -103,6 +107,7 @@ _GLOBAL(__setup_cpu_power9) mtspr SPRN_PSSCR,r0 mtspr SPRN_LPID,r0 mtspr SPRN_PID,r0 + mtspr SPRN_PCR,r0 mfspr r3,SPRN_LPCR LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC) or r3, r3, r4
@@ -128,6 +133,7 @@ _GLOBAL(__restore_cpu_power9) mtspr SPRN_PSSCR,r0 mtspr SPRN_LPID,r0 mtspr SPRN_PID,r0 + mtspr SPRN_PCR,r0 mfspr r3,SPRN_LPCR LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC) or r3, r3, r4
arch/powerpc/kernel/dt_cpu_ftrs.c +1 -0
@@ -137,6 +137,7 @@ static void __restore_cpu_cpufeatures(voif (hv_mode) {mtspr (SPRN_LPID ,0 );mtspr (SPRN_HFSCR , system_registers.hfscr); +mtspr (SPRN_PCR ,0 ); }mtspr (SPRN_FSCR , system_registers.fscr);
Greg Kroah-Hartman
maintainerPATCH 19/496 IB/hfi1: Use after free race condition in send context error path
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael J. Ruhl <[email protected]>
commit f9e76ca3771bf23d2142a81a88ddd8f31f5c4c03 upstream.
A pio send egress error can occur when the PSM library attempts to to send a bad packet. That issue is still being investigated.
The pio error interrupt handler then attempts to progress the recovery of the errored pio send context.
Code inspection reveals that the handling lacks the necessary locking if that recovery interleaves with a PSM close of the "context" object contains the pio send context.
The lack of the locking can cause the recovery to access the already freed pio send context object and incorrectly deduce that the pio send context is actually a kernel pio send context as shown by the NULL deref stack below:
[<ffffffff8143d78c>] _dev_info+0x6c/0x90 [<ffffffffc0613230>] sc_restart+0x70/0x1f0 [hfi1] [<ffffffff816ab124>] ? __schedule+0x424/0x9b0 [<ffffffffc06133c5>] sc_halted+0x15/0x20 [hfi1] [<ffffffff810aa3ba>] process_one_work+0x17a/0x440 [<ffffffff810ab086>] worker_thread+0x126/0x3c0 [<ffffffff810aaf60>] ? manage_workers.isra.24+0x2a0/0x2a0 [<ffffffff810b252f>] kthread+0xcf/0xe0 [<ffffffff810b2460>] ? insert_kthread_work+0x40/0x40 [<ffffffff816b8798>] ret_from_fork+0x58/0x90 [<ffffffff810b2460>] ? insert_kthread_work+0x40/0x40
This is the best case scenario and other scenarios can corrupt the already freed memory.
Fix by adding the necessary locking in the pio send context error handler.
--- drivers/infiniband/hw/hfi1/chip.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/infiniband/hw/hfi1/chip.c +4 -0
@@ -5945,6 +5945,7 @@ static void is_sendctxt_err_int(struct hu64 status;u32 sw_index;int i =0 ; +unsigned long irq_flags; sw_index = dd->hw_to_sw[hw_context];if (sw_index >= dd->num_send_contexts) {
@@ -5954,10 +5955,12 @@ static void is_sendctxt_err_int(struct hreturn ; } sci = &dd->send_contexts[sw_index]; +spin_lock_irqsave (&dd->sc_lock, irq_flags); sc = sci->sc;if (!sc) {dd_dev_err (dd,"%s: context %u(%u): no sc?\n" , __func__, sw_index, hw_context); +spin_unlock_irqrestore (&dd->sc_lock, irq_flags);return ; }
@@ -5979,6 +5982,7 @@ static void is_sendctxt_err_int(struct h*/ if (sc->type !=SC_USER )queue_work (dd->pport->hfi1_wq, &sc->halt_work); +spin_unlock_irqrestore (&dd->sc_lock, irq_flags);/* * Update the counters for the corresponding status bits.
Greg Kroah-Hartman
maintainerPATCH 20/496 IB/umem: Use the correct mm during ib_umem_release
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lidong Chen <[email protected]>
commit 8e907ed4882714fd13cfe670681fc6cb5284c780 upstream.
User-space may invoke ibv_reg_mr and ibv_dereg_mr in different threads.
If ibv_dereg_mr is called after the thread which invoked ibv_reg_mr has exited, get_pid_task will return NULL and ib_umem_release will not decrease mm->pinned_vm.
Instead of using threads to locate the mm, use the overall tgid from the ib_ucontext struct instead. This matches the behavior of ODP and disassociate in handling the mm of the process that called ibv_reg_mr.
--- drivers/infiniband/core/umem.c | 7 +------ include/rdma/ib_umem.h | 1 - 2 files changed, 1 insertion(+), 7 deletions(-)
drivers/infiniband/core/umem.c +1 -6
@@ -119,7 +119,6 @@ struct ib_umem *ib_umem_get(struct ib_uc umem->length = size; umem->address = addr; umem->page_shift =PAGE_SHIFT ; - umem->pid =get_task_pid (current,PIDTYPE_PID );/* * We ask for writable memory if any of the following * access flags are set. "Local write" and "remote write"
@@ -132,7 +131,6 @@ struct ib_umem *ib_umem_get(struct ib_uc IB_ACCESS_REMOTE_ATOMIC | IB_ACCESS_MW_BIND));if (access &IB_ACCESS_ON_DEMAND ) { -put_pid (umem->pid); ret =ib_umem_odp_get (context, umem, access);if (ret) {kfree (umem);
@@ -148,7 +146,6 @@ struct ib_umem *ib_umem_get(struct ib_uc page_list = (struct page **)__get_free_page (GFP_KERNEL );if (!page_list) { -put_pid (umem->pid);kfree (umem);return ERR_PTR (-ENOMEM ); }
@@ -231,7 +228,6 @@ out:if (ret <0 ) {if (need_release)__ib_umem_release (context->device, umem,0 ); -put_pid (umem->pid);kfree (umem); }else current->mm->pinned_vm = locked;
@@ -274,8 +270,7 @@ void ib_umem_release(struct ib_umem *ume__ib_umem_release (umem->context->device, umem,1 ); - task =get_pid_task (umem->pid,PIDTYPE_PID ); -put_pid (umem->pid); + task =get_pid_task (umem->context->tgid,PIDTYPE_PID );if (!task) goto out; mm =get_task_mm (task);
include/rdma/ib_umem.h +0 -1
@@ -48,7 +48,6 @@ struct ib_umem {int writable;int hugetlb;struct work_struct work; -struct pid *pid;struct mm_struct *mm;unsigned long diff;struct ib_umem_odp *odp_data;
Greg Kroah-Hartman
maintainerPATCH 21/496 sr: pass down correctly sized SCSI sense buffer
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
commit f7068114d45ec55996b9040e98111afa56e010fe upstream.
We're casting the CDROM layer request_sense to the SCSI sense buffer, but the former is 64 bytes and the latter is 96 bytes. As we generally allocate these on the stack, we end up blowing up the stack.
Fix this by wrapping the scsi_execute() call with a properly sized sense buffer, and copying back the bits for the CDROM layer.
--- drivers/scsi/sr_ioctl.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/scsi/sr_ioctl.c +8 -2
@@ -188,9 +188,13 @@ int sr_do_ioctl(Scsi_CD *cd, struct packstruct scsi_device *SDev;struct scsi_sense_hdr sshdr;int result, err =0 , retries =0 ; +unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE ], *senseptr =NULL ; SDev = cd->device; +if (cgc->sense) + senseptr = sense_buffer; + retry:if (!scsi_block_when_processing_errors (SDev)) { err = -ENODEV ;
@@ -198,10 +202,12 @@ int sr_do_ioctl(Scsi_CD *cd, struct pack } result =scsi_execute (SDev, cgc->cmd, cgc->data_direction, - cgc->buffer, cgc->buflen, - (unsigned char *)cgc->sense, &sshdr, + cgc->buffer, cgc->buflen, senseptr, &sshdr, cgc->timeout,IOCTL_RETRIES ,0 ,0 ,NULL ); +if (cgc->sense) +memcpy (cgc->sense, sense_buffer,sizeof (*cgc->sense)); +/* Minimal error checking. Ignore cases we know about, and report the rest. */ if (driver_byte (result) !=0 ) {switch (sshdr.sense_key) {
Greg Kroah-Hartman
maintainerPATCH 22/496 idr: fix invalid ptr dereference on item delete
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox <[email protected]>
commit 7a4deea1aa8bddfed4ef1b35fc2b6732563d8ad5 upstream.
If the radix tree underlying the IDR happens to be full and we attempt to remove an id which is larger than any id in the IDR, we will call __radix_tree_delete() with an uninitialised 'slot' pointer, at which point anything could happen. This was easiest to hit with a single entry at id 0 and attempting to remove a non-0 id, but it could have happened with 64 entries and attempting to remove an id >= 64.
Roman said:
The syzcaller test boils down to opening /dev/kvm, creating an eventfd, and calling a couple of KVM ioctls. None of this requires superuser. And the result is dereferencing an uninitialized pointer which is likely a crash. The specific path caught by syzbot is via KVM_HYPERV_EVENTD ioctl which is new in 4.17. But I guess there are other user-triggerable paths, so cc:stable is probably justified.
Matthew added:
We have around 250 calls to idr_remove() in the kernel today. Many of them pass an ID which is embedded in the object they're removing, so they're safe. Picking a few likely candidates:
drivers/firewire/core-cdev.c looks unsafe; the ID comes from an ioctl. drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c is similar drivers/atm/nicstar.c could be taken down by a handcrafted packet
--- lib/radix-tree.c | 4 +++- tools/testing/radix-tree/idr-test.c | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-)
lib/radix-tree.c +3 -1
@@ -2037,10 +2037,12 @@ void *radix_tree_delete_item(struct radi unsigned long index, void *item) { struct radix_tree_node *node = NULL; -void __rcu **slot; +void __rcu **slot =NULL ;void *entry; entry =__radix_tree_lookup (root, index, &node, &slot); +if (!slot) +return NULL ;if (!entry && (!is_idr (root) ||node_tag_get (root, node,IDR_FREE ,get_slot_offset (node, slot))))return NULL ;
tools/testing/radix-tree/idr-test.c +7 -0
@@ -202,6 +202,13 @@ void idr_checks(void)idr_remove (&idr,3 );idr_remove (&idr,0 ); +assert (idr_alloc (&idr,DUMMY_PTR ,0 ,0 ,GFP_KERNEL ) ==0 ); +idr_remove (&idr,1 ); +for (i =1 ; i <RADIX_TREE_MAP_SIZE ; i++) +assert (idr_alloc (&idr,DUMMY_PTR ,0 ,0 ,GFP_KERNEL ) == i); +idr_remove (&idr,1 <<30 ); +idr_destroy (&idr); +for (i =INT_MAX -3UL ; i <INT_MAX +1UL ; i++) {struct item *item =item_create (i,0 );assert (idr_alloc (&idr, item, i, i +10 ,GFP_KERNEL ) == i);
Greg Kroah-Hartman
maintainerPATCH 23/496 Revert "ipc/shm: Fix shmat mmap nil-page protection"
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Davidlohr Bueso <[email protected]>
commit a73ab244f0dad8fffb3291b905f73e2d3eaa7c00 upstream.
Patch series "ipc/shm: shmat() fixes around nil-page".
These patches fix two issues reported[1] a while back by Joe and Andrea around how shmat(2) behaves with nil-page.
The first reverts a commit that it was incorrectly thought that mapping nil-page (address=0) was a no no with MAP_FIXED. This is not the case, with the exception of SHM_REMAP; which is address in the second patch.
I chose two patches because it is easier to backport and it explicitly reverts bogus behaviour. Both patches ought to be in -stable and ltp testcases need updated (the added testcase around the cve can be modified to just test for SHM_RND|SHM_REMAP).
[1] lkml.kernel.org/r/20180430172152.nfa564pvgpk3ut7p@linux-n805
This patch (of 2):
Commit 95e91b831f87 ("ipc/shm: Fix shmat mmap nil-page protection") worked on the idea that we should not be mapping as root addr=0 and MAP_FIXED. However, it was reported that this scenario is in fact valid, thus making the patch both bogus and breaks userspace as well.
For example X11's libint10.so relies on shmat(1, SHM_RND) for lowmem initialization[1].
[1] https://cgit.freedesktop.org/xorg/xserver/tree/hw/xfree86/os-support/linux/int10/linux.c#n347
--- ipc/shm.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
ipc/shm.c +2 -7
@@ -1309,13 +1309,8 @@ long do_shmat(int shmid, char __user *shif (addr) {if (addr & (shmlba -1 )) { -/* -* Round down to the nearest multiple of shmlba. -* For sane do_mmap_pgoff() parameters, avoid -* round downs that trigger nil-page and MAP_FIXED. -*/ -if ((shmflg &SHM_RND ) && addr >= shmlba) - addr &= ~(shmlba -1 ); +if (shmflg &SHM_RND ) + addr &= ~(shmlba -1 );/* round down */ else#ifndef __ARCH_FORCE_SHMLBAif (addr & ~PAGE_MASK )
Greg Kroah-Hartman
maintainerPATCH 24/496 ipc/shm: fix shmat() nil address after round-down when remapping
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Davidlohr Bueso <[email protected]>
commit 8f89c007b6dec16a1793cb88de88fcc02117bbbc upstream.
shmat()'s SHM_REMAP option forbids passing a nil address for; this is in fact the very first thing we check for. Andrea reported that for SHM_RND|SHM_REMAP cases we can end up bypassing the initial addr check, but we need to check again if the address was rounded down to nil. As of this patch, such cases will return -EINVAL.
--- ipc/shm.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
ipc/shm.c +10 -2
@@ -1309,9 +1309,17 @@ long do_shmat(int shmid, char __user *shif (addr) {if (addr & (shmlba -1 )) { -if (shmflg &SHM_RND ) +if (shmflg &SHM_RND ) { addr &= ~(shmlba -1 );/* round down */ - else + +/* +* Ensure that the round-down is non-nil +* when remapping. This can happen for +* cases when addr < shmlba. +*/ +if (!addr && (shmflg &SHM_REMAP )) + goto out; + } else#ifndef __ARCH_FORCE_SHMLBA if (addr & ~PAGE_MASK)#endif
Greg Kroah-Hartman
maintainerPATCH 25/496 mm/kasan: dont vfree() nonexistent vm_area
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Ryabinin <[email protected]>
commit 0f901dcbc31f88ae41a2aaa365f7802b5d520a28 upstream.
KASAN uses different routines to map shadow for hot added memory and memory obtained in boot process. Attempt to offline memory onlined by normal boot process leads to this:
Trying to vfree() nonexistent vm area (000000005d3b34b9)
WARNING: CPU: 2 PID: 13215 at mm/vmalloc.c:1525 __vunmap+0x147/0x190
Call Trace:
kasan_mem_notifier+0xad/0xb9
notifier_call_chain+0x166/0x260
__blocking_notifier_call_chain+0xdb/0x140
__offline_pages+0x96a/0xb10
memory_subsys_offline+0x76/0xc0
device_offline+0xb8/0x120
store_mem_state+0xfa/0x120
kernfs_fop_write+0x1d5/0x320
__vfs_write+0xd4/0x530
vfs_write+0x105/0x340
SyS_write+0xb0/0x140Obviously we can't call vfree() to free memory that wasn't allocated via vmalloc(). Use find_vm_area() to see if we can call vfree().
Unfortunately it's a bit tricky to properly unmap and free shadow allocated during boot, so we'll have to keep it. If memory will come online again that shadow will be reused.
Matthew asked: how can you call vfree() on something that isn't a vmalloc address?
vfree() is able to free any address returned by __vmalloc_node_range(). And __vmalloc_node_range() gives you any address you ask. It doesn't have to be an address in [VMALLOC_START, VMALLOC_END] range.
That's also how the module_alloc()/module_memfree() works on architectures that have designated area for modules.
--- mm/kasan/kasan.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-)
mm/kasan/kasan.c +61 -2
@@ -737,6 +737,40 @@ void __asan_unpoison_stack_memory(constEXPORT_SYMBOL (__asan_unpoison_stack_memory);#ifdef CONFIG_MEMORY_HOTPLUG +static bool shadow_mapped (unsigned long addr) +{ +pgd_t *pgd =pgd_offset_k (addr); +p4d_t *p4d; +pud_t *pud; +pmd_t *pmd; +pte_t *pte; + +if (pgd_none (*pgd)) +return false; + p4d =p4d_offset (pgd, addr); +if (p4d_none (*p4d)) +return false; + pud =pud_offset (p4d, addr); +if (pud_none (*pud)) +return false; + +/* +* We can't use pud_large() or pud_huge(), the first one is +* arch-specific, the last one depends on HUGETLB_PAGE. So let's abuse +* pud_bad(), if pud is bad then it's bad because it's huge. +*/ +if (pud_bad (*pud)) +return true; + pmd =pmd_offset (pud, addr); +if (pmd_none (*pmd)) +return false; + +if (pmd_bad (*pmd)) +return true; + pte =pte_offset_kernel (pmd, addr); +return !pte_none (*pte); +} +static int __meminit kasan_mem_notifier (struct notifier_block *nb,unsigned long action,void *data) {
@@ -758,6 +792,14 @@ static int __meminit kasan_mem_notifier(case MEM_GOING_ONLINE : {void *ret; +/* +* If shadow is mapped already than it must have been mapped +* during the boot. This could happen if we onlining previously +* offlined memory. +*/ +if (shadow_mapped (shadow_start)) +return NOTIFY_OK ; + ret = __vmalloc_node_range(shadow_size, PAGE_SIZE, shadow_start, shadow_end, GFP_KERNEL, PAGE_KERNEL, VM_NO_GUARD,
@@ -769,8 +811,25 @@ static int __meminit kasan_mem_notifier(kmemleak_ignore (ret);return NOTIFY_OK ; } -case MEM_OFFLINE : -vfree ((void *)shadow_start); +case MEM_OFFLINE : { +struct vm_struct *vm; + +/* +* shadow_start was either mapped during boot by kasan_init() +* or during memory online by __vmalloc_node_range(). +* In the latter case we can use vfree() to free shadow. +* Non-NULL result of the find_vm_area() will tell us if +* that was the second case. +* +* Currently it's not possible to free shadow mapped +* during boot by kasan_init(). It's because the code +* to do that hasn't been written yet. So we'll just +* leak the memory. +*/ + vm =find_vm_area ((void *)shadow_start); +if (vm) +vfree ((void *)shadow_start); + } }return NOTIFY_OK ;
Greg Kroah-Hartman
maintainerPATCH 26/496 kasan: free allocated shadow memory on MEM_CANCEL_ONLINE
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
commit ed1596f9ab958dd156a66c9ff1029d3761c1786a upstream.
We have to free memory again when we cancel onlining, otherwise a later onlining attempt will fail.
--- mm/kasan/kasan.c | 1 + 1 file changed, 1 insertion(+)
mm/kasan/kasan.c +1 -0
@@ -811,6 +811,7 @@ static int __meminit kasan_mem_notifier(kmemleak_ignore (ret);return NOTIFY_OK ; } +case MEM_CANCEL_ONLINE :case MEM_OFFLINE : {struct vm_struct *vm;
Greg Kroah-Hartman
maintainerPATCH 27/496 kasan: fix memory hotplug during boot
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
commit 3f1959721558a976aaf9c2024d5bc884e6411bf7 upstream.
Using module_init() is wrong. E.g. ACPI adds and onlines memory before our memory notifier gets registered.
This makes sure that ACPI memory detected during boot up will not result in a kernel crash.
Easily reproducible with QEMU, just specify a DIMM when starting up.
--- mm/kasan/kasan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/kasan/kasan.c +1 -1
@@ -843,5 +843,5 @@ static int __init kasan_memhotplug_init( return 0; } -module_init (kasan_memhotplug_init); +core_initcall (kasan_memhotplug_init);#endif
Greg Kroah-Hartman
maintainerPATCH 28/496 kernel/sys.c: fix potential Spectre v1 issue
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
commit 23d6aef74da86a33fa6bb75f79565e0a16ee97c2 upstream.
`resource' can be controlled by user-space, hence leading to a potential exploitation of the Spectre variant 1 vulnerability.
This issue was detected with the help of Smatch:
kernel/sys.c:1474 __do_compat_sys_old_getrlimit() warn: potential spectre issue 'get_current()->signal->rlim' (local cap) kernel/sys.c:1455 __do_sys_old_getrlimit() warn: potential spectre issue 'get_current()->signal->rlim' (local cap)
Fix this by sanitizing *resource* before using it to index current->signal->rlim
Notice that given that speculation windows are large, the policy is to kill the speculation on the first load and not worry if it can be completed with a dependent load/store [1].
[1] https://marc.info/?l=linux-kernel&m=152449131114778&w=2
--- kernel/sys.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/sys.c +2 -0
@@ -1395,6 +1395,7 @@ SYSCALL_DEFINE2(old_getrlimit, unsignedif (resource >=RLIM_NLIMITS )return -EINVAL ; + resource =array_index_nospec (resource,RLIM_NLIMITS );task_lock (current->group_leader); x = current->signal->rlim[resource];task_unlock (current->group_leader);
@@ -1414,6 +1415,7 @@ COMPAT_SYSCALL_DEFINE2(old_getrlimit, unif (resource >=RLIM_NLIMITS )return -EINVAL ; + resource =array_index_nospec (resource,RLIM_NLIMITS );task_lock (current->group_leader); r = current->signal->rlim[resource];task_unlock (current->group_leader);
Greg Kroah-Hartman
maintainerPATCH 30/496 KVM: s390: vsie: fix < 8k check for the itdba
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
commit f4a551b72358facbbe5714248dff78404272feee upstream.
By missing an "L", we might detect some addresses to be <8k, although they are not.
e.g. for itdba = 100001fff
!(gpa & ~0x1fffU) -> 1
!(gpa & ~0x1fffUL) -> 0
So we would report a SIE validity intercept although everything is fine.
--- arch/s390/kvm/vsie.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/kvm/vsie.c +1 -1
@@ -590,7 +590,7 @@ static int pin_blocks(struct kvm_vcpu *v gpa =READ_ONCE (scb_o->itdba) & ~0xffUL ;if (gpa && (scb_s->ecb &ECB_TE )) { -if (!(gpa & ~0x1fffU )) { +if (!(gpa & ~0x1fffUL )) { rc =set_validity_icpt (scb_s,0x0080U ); goto unpin; }
Greg Kroah-Hartman
maintainerPATCH 34/496 powerpc/64s: Improve RFI L1-D cache flush fallback
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Piggin <[email protected]>
commit bdcb1aefc5b3f7d0f1dc8b02673602bca2ff7a4b upstream.
The fallback RFI flush is used when firmware does not provide a way to flush the cache. It's a "displacement flush" that evicts useful data by displacing it with an uninteresting buffer.
The flush has to take care to work with implementation specific cache replacment policies, so the recipe has been in flux. The initial slow but conservative approach is to touch all lines of a congruence class, with dependencies between each load. It has since been determined that a linear pattern of loads without dependencies is sufficient, and is significantly faster.
Measuring the speed of a null syscall with RFI fallback flush enabled gives the relative improvement:
P8 - 1.83x
P9 - 1.75x
The flush also becomes simpler and more adaptable to different cache geometries.
--- arch/powerpc/include/asm/paca.h | 3 - arch/powerpc/kernel/asm-offsets.c | 3 - arch/powerpc/kernel/exceptions-64s.S | 76 ++++++++++++++++------------------- arch/powerpc/kernel/setup_64.c | 13 ----- arch/powerpc/xmon/xmon.c | 2 5 files changed, 41 insertions(+), 56 deletions(-)
arch/powerpc/include/asm/paca.h +1 -2
@@ -238,8 +238,7 @@ struct paca_struct {*/ u64 exrfi[EX_SIZE ]__aligned(0x80) ;void *rfi_flush_fallback_area; -u64 l1d_flush_congruence; -u64 l1d_flush_sets; +u64 l1d_flush_size;#endif };
arch/powerpc/kernel/asm-offsets.c +1 -2
@@ -239,8 +239,7 @@ int main(void)OFFSET (PACA_IN_NMI , paca_struct, in_nmi);OFFSET (PACA_RFI_FLUSH_FALLBACK_AREA , paca_struct, rfi_flush_fallback_area);OFFSET (PACA_EXRFI , paca_struct, exrfi); -OFFSET (PACA_L1D_FLUSH_CONGRUENCE , paca_struct, l1d_flush_congruence); -OFFSET (PACA_L1D_FLUSH_SETS , paca_struct, l1d_flush_sets); +OFFSET (PACA_L1D_FLUSH_SIZE , paca_struct, l1d_flush_size);#endif OFFSET (PACAHWCPUID , paca_struct, hw_cpu_id);
arch/powerpc/kernel/exceptions-64s.S +36 -40
114 lines not on this page · raw message
arch/powerpc/kernel/setup_64.c +1 -12
@@ -851,19 +851,8 @@ static void init_fallback_flush(void)memset (l1d_flush_fallback_area,0 , l1d_size *2 );for_each_possible_cpu (cpu) { -/* -* The fallback flush is currently coded for 8-way -* associativity. Different associativity is possible, but it -* will be treated as 8-way and may not evict the lines as -* effectively. -* -* 128 byte lines are mandatory. -*/ -u64 c = l1d_size /8 ; - paca[cpu].rfi_flush_fallback_area = l1d_flush_fallback_area; - paca[cpu].l1d_flush_congruence = c; - paca[cpu].l1d_flush_sets = c /128 ; + paca[cpu].l1d_flush_size = l1d_size; } }
arch/powerpc/xmon/xmon.c +2 -0
@@ -2348,6 +2348,8 @@ static void dump_one_paca(int cpu)DUMP (p, slb_cache_ptr,"x" );for (i =0 ; i <SLB_CACHE_ENTRIES ; i++)printf (" slb_cache[%d]: = 0x%016lx\n" , i, p->slb_cache[i]); + +DUMP (p, rfi_flush_fallback_area,"px" );#endif DUMP (p, dscr_default,"llx" );#ifdef CONFIG_PPC_BOOK3E
Greg Kroah-Hartman
maintainerPATCH 35/496 powerpc/pseries: Support firmware disable of RFI flush
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 582605a429e20ae68fd0b041b2e840af296edd08 upstream.
Some versions of firmware will have a setting that can be configured to disable the RFI flush, add support for it.
--- arch/powerpc/platforms/pseries/setup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/powerpc/platforms/pseries/setup.c +2 -1
@@ -482,7 +482,8 @@ static void pseries_setup_rfi_flush(voidif (types ==L1D_FLUSH_NONE ) types =L1D_FLUSH_FALLBACK ; -if (!(result.behaviour &H_CPU_BEHAV_L1D_FLUSH_PR )) +if ((!(result.behaviour &H_CPU_BEHAV_L1D_FLUSH_PR )) || + (!(result.behaviour &H_CPU_BEHAV_FAVOUR_SECURITY ))) enable = false; }else {/* Default to fallback if case hcall is not available */
Greg Kroah-Hartman
maintainerPATCH 36/496 powerpc/powernv: Support firmware disable of RFI flush
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit eb0a2d2620ae431c543963c8c7f08f597366fc60 upstream.
Some versions of firmware will have a setting that can be configured to disable the RFI flush, add support for it.
--- arch/powerpc/platforms/powernv/setup.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/powerpc/platforms/powernv/setup.c +4 -0
@@ -79,6 +79,10 @@ static void pnv_setup_rfi_flush(void)if (np &&of_property_read_bool (np,"disabled" )) enable--; + np =of_get_child_by_name (fw_features,"speculation-policy-favor-security" ); +if (np &&of_property_read_bool (np,"disabled" )) + enable =0 ; +of_node_put (np);of_node_put (fw_features); }
Greg Kroah-Hartman
maintainerPATCH 37/496 powerpc/rfi-flush: Move the logic to avoid a redo into the debugfs code
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 1e2a9fc7496955faacbbed49461d611b704a7505 upstream.
rfi_flush_enable() includes a check to see if we're already enabled (or disabled), and in that case does nothing.
But that means calling setup_rfi_flush() a 2nd time doesn't actually work, which is a bit confusing.
Move that check into the debugfs code, where it really belongs.
--- arch/powerpc/kernel/setup_64.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
arch/powerpc/kernel/setup_64.c +8 -5
@@ -822,9 +822,6 @@ static void do_nothing(void *unused)void rfi_flush_enable (bool enable) { -if (rfi_flush == enable) -return ; -if (enable) {do_rfi_flush_fixups (enabled_flush_types);on_each_cpu (do_nothing,NULL ,1 );
@@ -878,13 +875,19 @@ void __init setup_rfi_flush(enum l1d_flu#ifdef CONFIG_DEBUG_FS static int rfi_flush_set (void *data,u64 val) { +bool enable; +if (val ==1 ) -rfi_flush_enable (true); + enable = true;else if (val ==0 ) -rfi_flush_enable (false); + enable = false;else return -EINVAL ; +/* Only do anything if we're changing state */ +if (enable != rfi_flush) +rfi_flush_enable (enable); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 38/496 powerpc/rfi-flush: Make it possible to call setup_rfi_flush() again
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit abf110f3e1cea40f5ea15e85f5d67c39c14568a7 upstream.
For PowerVM migration we want to be able to call setup_rfi_flush() again after we've migrated the partition.
To support that we need to check that we're not trying to allocate the fallback flush area after memblock has gone away (i.e., boot-time only).
--- arch/powerpc/include/asm/setup.h | 2 +- arch/powerpc/kernel/setup_64.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-)
arch/powerpc/include/asm/setup.h +1 -1
@@ -49,7 +49,7 @@ enum l1d_flush_type { L1D_FLUSH_MTTRIG = 0x8, }; -void __init setup_rfi_flush (enum l1d_flush_type ,bool enable); +void setup_rfi_flush (enum l1d_flush_type ,bool enable);void do_rfi_flush_fixups (enum l1d_flush_type types);#endif /* !__ASSEMBLY__ */
arch/powerpc/kernel/setup_64.c +5 -1
@@ -836,6 +836,10 @@ static void init_fallback_flush(void)u64 l1d_size, limit;int cpu; +/* Only allocate the fallback flush area once (at boot time). */ +if (l1d_flush_fallback_area) +return ; + l1d_size = ppc64_caches.l1d.size; limit =min (safe_stack_limit (), ppc64_rma_size);
@@ -853,7 +857,7 @@ static void init_fallback_flush(void) } } -void __init setup_rfi_flush (enum l1d_flush_type types,bool enable) +void setup_rfi_flush (enum l1d_flush_type types,bool enable) {if (types &L1D_FLUSH_FALLBACK ) {pr_info ("rfi-flush: Using fallback displacement flush\n" );
Greg Kroah-Hartman
maintainerPATCH 39/496 powerpc/rfi-flush: Always enable fallback flush on pseries
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 84749a58b6e382f109abf1e734bc4dd43c2c25bb upstream.
This ensures the fallback flush area is always allocated on pseries, so in case a LPAR is migrated from a patched to an unpatched system, it is possible to enable the fallback flush in the target system.
--- arch/powerpc/platforms/pseries/setup.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-)
arch/powerpc/platforms/pseries/setup.c +1 -9
@@ -468,26 +468,18 @@ static void pseries_setup_rfi_flush(void/* Enable by default */ enable = true; + types =L1D_FLUSH_FALLBACK ; rc =plpar_get_cpu_characteristics (&result);if (rc ==H_SUCCESS ) { - types =L1D_FLUSH_NONE ; -if (result.character &H_CPU_CHAR_L1D_FLUSH_TRIG2 ) types |=L1D_FLUSH_MTTRIG ;if (result.character &H_CPU_CHAR_L1D_FLUSH_ORI30 ) types |=L1D_FLUSH_ORI ; -/* Use fallback if nothing set in hcall */ -if (types ==L1D_FLUSH_NONE ) - types =L1D_FLUSH_FALLBACK ; -if ((!(result.behaviour &H_CPU_BEHAV_L1D_FLUSH_PR )) || (!(result.behaviour &H_CPU_BEHAV_FAVOUR_SECURITY ))) enable = false; - }else { -/* Default to fallback if case hcall is not available */ - types =L1D_FLUSH_FALLBACK ; }setup_rfi_flush (types, enable);
Greg Kroah-Hartman
maintainerPATCH 40/496 powerpc/rfi-flush: Differentiate enabled and patched flush types
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauricio Faria de Oliveira <[email protected]>
commit 0063d61ccfc011f379a31acaeba6de7c926fed2c upstream.
Currently the rfi-flush messages print 'Using <type> flush' for all enabled_flush_types, but that is not necessarily true -- as now the fallback flush is always enabled on pseries, but the fixup function overwrites its nop/branch slot with other flush types, if available.
So, replace the 'Using <type> flush' messages with '<type> flush is available'.
Also, print the patched flush types in the fixup function, so users can know what is (not) being used (e.g., the slower, fallback flush, or no flush type at all if flush is disabled via the debugfs switch).
--- arch/powerpc/kernel/setup_64.c | 6 +++--- arch/powerpc/lib/feature-fixups.c | 9 ++++++++- 2 files changed, 11 insertions(+), 4 deletions(-)
arch/powerpc/kernel/setup_64.c +3 -3
@@ -860,15 +860,15 @@ static void init_fallback_flush(void)void setup_rfi_flush (enum l1d_flush_type types,bool enable) {if (types &L1D_FLUSH_FALLBACK ) { -pr_info ("rfi-flush: Using fallback displacement flush\n" ); +pr_info ("rfi-flush: fallback displacement flush available\n" );init_fallback_flush (); }if (types &L1D_FLUSH_ORI ) -pr_info ("rfi-flush: Using ori type flush\n" ); +pr_info ("rfi-flush: ori type flush available\n" );if (types &L1D_FLUSH_MTTRIG ) -pr_info ("rfi-flush: Using mttrig type flush\n" ); +pr_info ("rfi-flush: mttrig type flush available\n" ); enabled_flush_types = types;
arch/powerpc/lib/feature-fixups.c +8 -1
@@ -153,7 +153,14 @@ void do_rfi_flush_fixups(enum l1d_flush_ patch_instruction(dest + 2, instrs[2]); } -printk (KERN_DEBUG "rfi-flush: patched %d locations\n" , i); +printk (KERN_DEBUG "rfi-flush: patched %d locations (%s flush)\n" , i, + (types ==L1D_FLUSH_NONE ) ?"no" : + (types ==L1D_FLUSH_FALLBACK ) ?"fallback displacement" : + (types &L1D_FLUSH_ORI ) ? (types &L1D_FLUSH_MTTRIG ) + ?"ori+mttrig type" + :"ori type" : + (types &L1D_FLUSH_MTTRIG ) ?"mttrig type" + :"unknown" ); }#endif /* CONFIG_PPC_BOOK3S_64 */
Greg Kroah-Hartman
maintainerPATCH 41/496 powerpc/rfi-flush: Call setup_rfi_flush() after LPM migration
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 921bc6cf807ceb2ab8005319cf39f33494d6b100 upstream.
We might have migrated to a machine that uses a different flush type, or doesn't need flushing at all.
--- arch/powerpc/platforms/pseries/mobility.c | 3 +++ arch/powerpc/platforms/pseries/pseries.h | 2 ++ arch/powerpc/platforms/pseries/setup.c | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-)
arch/powerpc/platforms/pseries/mobility.c +3 -0
@@ -348,6 +348,9 @@ void post_mobility_fixup(void)printk (KERN_ERR "Post-mobility device tree update " "failed: %d\n" , rc); +/* Possibly switch to a new RFI flush type */ +pseries_setup_rfi_flush (); +return ; }
arch/powerpc/platforms/pseries/pseries.h +2 -0
@@ -100,4 +100,6 @@ static inline unsigned long cmo_get_pageint dlpar_workqueue_init (void ); +void pseries_setup_rfi_flush (void ); +#endif /* _PSERIES_PSERIES_H */
arch/powerpc/platforms/pseries/setup.c +1 -1
@@ -459,7 +459,7 @@ static void __init find_and_init_phbs(voof_pci_check_probe_only (); } -static void pseries_setup_rfi_flush (void ) +void pseries_setup_rfi_flush (void ) {struct h_cpu_char_result result;enum l1d_flush_type types;
Greg Kroah-Hartman
maintainerPATCH 42/496 powerpc/pseries: Add new H_GET_CPU_CHARACTERISTICS flags
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit c4bc36628d7f8b664657d8bd6ad1c44c177880b7 upstream.
Add some additional values which have been defined for the H_GET_CPU_CHARACTERISTICS hypercall.
--- arch/powerpc/include/asm/hvcall.h | 3 +++ 1 file changed, 3 insertions(+)
arch/powerpc/include/asm/hvcall.h +3 -0
@@ -337,6 +337,9 @@#define H_CPU_CHAR_L1D_FLUSH_ORI30 (1ull << 61) // IBM bit 2#define H_CPU_CHAR_L1D_FLUSH_TRIG2 (1ull << 60) // IBM bit 3#define H_CPU_CHAR_L1D_THREAD_PRIV (1ull << 59) // IBM bit 4 +#define H_CPU_CHAR_BRANCH_HINTS_HONORED (1ull << 58) // IBM bit 5 +#define H_CPU_CHAR_THREAD_RECONFIG_CTRL (1ull << 57) // IBM bit 6 +#define H_CPU_CHAR_COUNT_CACHE_DISABLED (1ull << 56) // IBM bit 7#define H_CPU_BEHAV_FAVOUR_SECURITY (1ull << 63) // IBM bit 0#define H_CPU_BEHAV_L1D_FLUSH_PR (1ull << 62) // IBM bit 1
Greg Kroah-Hartman
maintainerPATCH 43/496 powerpc: Add security feature flags for Spectre/Meltdown
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 9a868f634349e62922c226834aa23e3d1329ae7f upstream.
This commit adds security feature flags to reflect the settings we receive from firmware regarding Spectre/Meltdown mitigations.
The feature names reflect the names we are given by firmware on bare metal machines. See the hostboot source for details.
Arguably these could be firmware features, but that then requires them to be read early in boot so they're available prior to asm feature patching, but we don't actually want to use them for patching. We may also want to dynamically update them in future, which would be incompatible with the way firmware features work (at the moment at least). So for now just make them separate flags.
--- arch/powerpc/include/asm/security_features.h | 65 +++++++++++++++++++++++++++ arch/powerpc/kernel/Makefile | 2 arch/powerpc/kernel/security.c | 15 ++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/include/asm/security_features.h create mode 100644 arch/powerpc/kernel/security.c
arch/powerpc/include/asm/security_features.h new file +65 -0
@@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* +* Security related feature bit definitions. +* +* Copyright 2018, Michael Ellerman, IBM Corporation. +*/ + +#ifndef _ASM_POWERPC_SECURITY_FEATURES_H +#define _ASM_POWERPC_SECURITY_FEATURES_H + + +extern unsigned long powerpc_security_features; + +static inline void security_ftr_set (unsigned long feature) +{ + powerpc_security_features |= feature; +} + +static inline void security_ftr_clear (unsigned long feature) +{ + powerpc_security_features &= ~feature; +} + +static inline bool security_ftr_enabled (unsigned long feature) +{ +return !!(powerpc_security_features & feature); +} + + +// Features indicating support for Spectre/Meltdown mitigations + +// The L1-D cache can be flushed with ori r30,r30,0 +#define SEC_FTR_L1D_FLUSH_ORI30 0x0000000000000001ull + +// The L1-D cache can be flushed with mtspr 882,r0 (aka SPRN_TRIG2) +#define SEC_FTR_L1D_FLUSH_TRIG2 0x0000000000000002ull + +// ori r31,r31,0 acts as a speculation barrier +#define SEC_FTR_SPEC_BAR_ORI31 0x0000000000000004ull + +// Speculation past bctr is disabled +#define SEC_FTR_BCCTRL_SERIALISED 0x0000000000000008ull + +// Entries in L1-D are private to a SMT thread +#define SEC_FTR_L1D_THREAD_PRIV 0x0000000000000010ull + +// Indirect branch prediction cache disabled +#define SEC_FTR_COUNT_CACHE_DISABLED 0x0000000000000020ull + + +// Features indicating need for Spectre/Meltdown mitigations + +// The L1-D cache should be flushed on MSR[HV] 1->0 transition (hypervisor to guest) +#define SEC_FTR_L1D_FLUSH_HV 0x0000000000000040ull + +// The L1-D cache should be flushed on MSR[PR] 0->1 transition (kernel to userspace) +#define SEC_FTR_L1D_FLUSH_PR 0x0000000000000080ull + +// A speculation barrier should be used for bounds checks (Spectre variant 1) +#define SEC_FTR_BNDS_CHK_SPEC_BAR 0x0000000000000100ull + +// Firmware configuration indicates user favours security over performance +#define SEC_FTR_FAVOUR_SECURITY 0x0000000000000200ull + +#endif /* _ASM_POWERPC_SECURITY_FEATURES_H */
arch/powerpc/kernel/Makefile +1 -1
@@ -42,7 +42,7 @@ obj-$(CONFIG_VDSO32) += vdso32/ obj-$(CONFIG_PPC_WATCHDOG) += watchdog.o obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o -obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_power.o +obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_power.o security.o obj-$(CONFIG_PPC_BOOK3S_64) += mce.o mce_power.o obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o idle_book3e.o obj-$(CONFIG_PPC64) += vdso64/
arch/powerpc/kernel/security.c new file +15 -0
@@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0+ +// +// Security related flags and so on. +// +// Copyright 2018, Michael Ellerman, IBM Corporation. + +#include <linux/kernel.h> +#include <asm/security_features.h> + + +unsigned long powerpc_security_features __read_mostly = \ +SEC_FTR_L1D_FLUSH_HV | \ +SEC_FTR_L1D_FLUSH_PR | \ +SEC_FTR_BNDS_CHK_SPEC_BAR | \ +SEC_FTR_FAVOUR_SECURITY ;
Greg Kroah-Hartman
maintainerPATCH 44/496 powerpc/pseries: Set or clear security feature flags
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit f636c14790ead6cc22cf62279b1f8d7e11a67116 upstream.
Now that we have feature flags for security related things, set or clear them based on what we receive from the hypercall.
--- arch/powerpc/platforms/pseries/setup.c | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+)
arch/powerpc/platforms/pseries/setup.c +43 -0
@@ -68,6 +68,7 @@#include <asm/plpar_wrappers.h> #include <asm/kexec.h> #include <asm/isa-bridge.h> +#include <asm/security_features.h> #include "pseries.h"
@@ -459,6 +460,40 @@ static void __init find_and_init_phbs(voof_pci_check_probe_only (); } +static void init_cpu_char_feature_flags (struct h_cpu_char_result *result) +{ +if (result->character &H_CPU_CHAR_SPEC_BAR_ORI31 ) +security_ftr_set (SEC_FTR_SPEC_BAR_ORI31 ); + +if (result->character &H_CPU_CHAR_BCCTRL_SERIALISED ) +security_ftr_set (SEC_FTR_BCCTRL_SERIALISED ); + +if (result->character &H_CPU_CHAR_L1D_FLUSH_ORI30 ) +security_ftr_set (SEC_FTR_L1D_FLUSH_ORI30 ); + +if (result->character &H_CPU_CHAR_L1D_FLUSH_TRIG2 ) +security_ftr_set (SEC_FTR_L1D_FLUSH_TRIG2 ); + +if (result->character &H_CPU_CHAR_L1D_THREAD_PRIV ) +security_ftr_set (SEC_FTR_L1D_THREAD_PRIV ); + +if (result->character &H_CPU_CHAR_COUNT_CACHE_DISABLED ) +security_ftr_set (SEC_FTR_COUNT_CACHE_DISABLED ); + +/* +* The features below are enabled by default, so we instead look to see +* if firmware has *disabled* them, and clear them if so. +*/ +if (!(result->character &H_CPU_BEHAV_FAVOUR_SECURITY )) +security_ftr_clear (SEC_FTR_FAVOUR_SECURITY ); + +if (!(result->character &H_CPU_BEHAV_L1D_FLUSH_PR )) +security_ftr_clear (SEC_FTR_L1D_FLUSH_PR ); + +if (!(result->character &H_CPU_BEHAV_BNDS_CHK_SPEC_BAR )) +security_ftr_clear (SEC_FTR_BNDS_CHK_SPEC_BAR ); +} +void pseries_setup_rfi_flush (void ) {struct h_cpu_char_result result;
@@ -472,6 +507,8 @@ void pseries_setup_rfi_flush(void) rc =plpar_get_cpu_characteristics (&result);if (rc ==H_SUCCESS ) { +init_cpu_char_feature_flags (&result); +if (result.character &H_CPU_CHAR_L1D_FLUSH_TRIG2 ) types |=L1D_FLUSH_MTTRIG ;if (result.character &H_CPU_CHAR_L1D_FLUSH_ORI30 )
@@ -482,6 +519,12 @@ void pseries_setup_rfi_flush(void) enable = false; } +/* +* We're the guest so this doesn't apply to us, clear it to simplify +* handling of it elsewhere. +*/ +security_ftr_clear (SEC_FTR_L1D_FLUSH_HV ); +setup_rfi_flush (types, enable); }
Greg Kroah-Hartman
maintainerPATCH 45/496 powerpc/powernv: Set or clear security feature flags
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 77addf6e95c8689e478d607176b399a6242a777e upstream.
Now that we have feature flags for security related things, set or clear them based on what we see in the device tree provided by firmware.
--- arch/powerpc/platforms/powernv/setup.c | 56 +++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+)
arch/powerpc/platforms/powernv/setup.c +56 -0
@@ -37,9 +37,63 @@#include <asm/kexec.h> #include <asm/smp.h> #include <asm/setup.h> +#include <asm/security_features.h> #include "powernv.h" + +static bool fw_feature_is (const char *state,const char *name, +struct device_node *fw_features) +{ +struct device_node *np; +bool rc = false; + + np =of_get_child_by_name (fw_features, name); +if (np) { + rc =of_property_read_bool (np, state); +of_node_put (np); + } + +return rc; +} + +static void init_fw_feat_flags (struct device_node *np) +{ +if (fw_feature_is ("enabled" ,"inst-spec-barrier-ori31,31,0" , np)) +security_ftr_set (SEC_FTR_SPEC_BAR_ORI31 ); + +if (fw_feature_is ("enabled" ,"fw-bcctrl-serialized" , np)) +security_ftr_set (SEC_FTR_BCCTRL_SERIALISED ); + +if (fw_feature_is ("enabled" ,"inst-spec-barrier-ori31,31,0" , np)) +security_ftr_set (SEC_FTR_L1D_FLUSH_ORI30 ); + +if (fw_feature_is ("enabled" ,"inst-l1d-flush-trig2" , np)) +security_ftr_set (SEC_FTR_L1D_FLUSH_TRIG2 ); + +if (fw_feature_is ("enabled" ,"fw-l1d-thread-split" , np)) +security_ftr_set (SEC_FTR_L1D_THREAD_PRIV ); + +if (fw_feature_is ("enabled" ,"fw-count-cache-disabled" , np)) +security_ftr_set (SEC_FTR_COUNT_CACHE_DISABLED ); + +/* +* The features below are enabled by default, so we instead look to see +* if firmware has *disabled* them, and clear them if so. +*/ +if (fw_feature_is ("disabled" ,"speculation-policy-favor-security" , np)) +security_ftr_clear (SEC_FTR_FAVOUR_SECURITY ); + +if (fw_feature_is ("disabled" ,"needs-l1d-flush-msr-pr-0-to-1" , np)) +security_ftr_clear (SEC_FTR_L1D_FLUSH_PR ); + +if (fw_feature_is ("disabled" ,"needs-l1d-flush-msr-hv-1-to-0" , np)) +security_ftr_clear (SEC_FTR_L1D_FLUSH_HV ); + +if (fw_feature_is ("disabled" ,"needs-spec-barrier-for-bound-checks" , np)) +security_ftr_clear (SEC_FTR_BNDS_CHK_SPEC_BAR ); +} +static void pnv_setup_rfi_flush (void ) {struct device_node *np, *fw_features;
@@ -55,6 +109,8 @@ static void pnv_setup_rfi_flush(void)of_node_put (np);if (fw_features) { +init_fw_feat_flags (fw_features); + np =of_get_child_by_name (fw_features,"inst-l1d-flush-trig2" );if (np &&of_property_read_bool (np,"enabled" )) type =L1D_FLUSH_MTTRIG ;
Greg Kroah-Hartman
maintainerPATCH 46/496 powerpc/64s: Move cpu_show_meltdown()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 8ad33041563a10b34988800c682ada14b2612533 upstream.
This landed in setup_64.c for no good reason other than we had nowhere else to put it. Now that we have a security-related file, that is a better place for it so move it.
--- arch/powerpc/kernel/security.c | 11 +++++++++++ arch/powerpc/kernel/setup_64.c | 8 -------- 2 files changed, 11 insertions(+), 8 deletions(-)
arch/powerpc/kernel/security.c +11 -0
@@ -5,6 +5,8 @@// Copyright 2018, Michael Ellerman, IBM Corporation. #include <linux/kernel.h> +#include <linux/device.h> +#include <asm/security_features.h>
@@ -13,3 +15,12 @@ unsigned long powerpc_security_featuresSEC_FTR_L1D_FLUSH_PR | \SEC_FTR_BNDS_CHK_SPEC_BAR | \SEC_FTR_FAVOUR_SECURITY ; + + +ssize_t cpu_show_meltdown (struct device *dev,struct device_attribute *attr,char *buf) +{ +if (rfi_flush) +return sprintf (buf,"Mitigation: RFI Flush\n" ); + +return sprintf (buf,"Vulnerable\n" ); +}
arch/powerpc/kernel/setup_64.c +0 -8
@@ -910,12 +910,4 @@ static __init int rfi_flush_debugfs_init }device_initcall (rfi_flush_debugfs_init);#endif - -ssize_t cpu_show_meltdown (struct device *dev,struct device_attribute *attr,char *buf) -{ -if (rfi_flush) -return sprintf (buf,"Mitigation: RFI Flush\n" ); - -return sprintf (buf,"Vulnerable\n" ); -}#endif /* CONFIG_PPC_BOOK3S_64 */
Greg Kroah-Hartman
maintainerPATCH 47/496 powerpc/64s: Enhance the information in cpu_show_meltdown()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit ff348355e9c72493947be337bb4fae4fc1a41eba upstream.
Now that we have the security feature flags we can make the information displayed in the "meltdown" file more informative.
--- arch/powerpc/include/asm/security_features.h | 1 arch/powerpc/kernel/security.c | 30 +++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-)
arch/powerpc/include/asm/security_features.h +1 -0
@@ -10,6 +10,7 @@extern unsigned long powerpc_security_features; +extern bool rfi_flush;static inline void security_ftr_set (unsigned long feature) {
arch/powerpc/kernel/security.c +28 -2
@@ -6,6 +6,7 @@#include <linux/kernel.h> #include <linux/device.h> +#include <linux/seq_buf.h> #include <asm/security_features.h>
@@ -19,8 +20,33 @@ unsigned long powerpc_security_featuresssize_t cpu_show_meltdown (struct device *dev,struct device_attribute *attr,char *buf) { -if (rfi_flush) -return sprintf (buf,"Mitigation: RFI Flush\n" ); +bool thread_priv; + + thread_priv =security_ftr_enabled (SEC_FTR_L1D_THREAD_PRIV ); + +if (rfi_flush || thread_priv) { +struct seq_buf s; +seq_buf_init (&s, buf,PAGE_SIZE -1 ); + +seq_buf_printf (&s,"Mitigation: " ); + +if (rfi_flush) +seq_buf_printf (&s,"RFI Flush" ); + +if (rfi_flush && thread_priv) +seq_buf_printf (&s,", " ); + +if (thread_priv) +seq_buf_printf (&s,"L1D private per thread" ); + +seq_buf_printf (&s,"\n" ); + +return s.len; + } + +if (!security_ftr_enabled (SEC_FTR_L1D_FLUSH_HV ) && + !security_ftr_enabled (SEC_FTR_L1D_FLUSH_PR )) +return sprintf (buf,"Not affected\n" );return sprintf (buf,"Vulnerable\n" ); }
Greg Kroah-Hartman
maintainerPATCH 48/496 powerpc/powernv: Use the security flags in pnv_setup_rfi_flush()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 37c0bdd00d3ae83369ab60a6712c28e11e6458d5 upstream.
Now that we have the security flags we can significantly simplify the code in pnv_setup_rfi_flush(), because we can use the flags instead of checking device tree properties and because the security flags have pessimistic defaults.
--- arch/powerpc/platforms/powernv/setup.c | 41 ++++++++------------------------- 1 file changed, 10 insertions(+), 31 deletions(-)
arch/powerpc/platforms/powernv/setup.c +10 -31
@@ -65,7 +65,7 @@ static void init_fw_feat_flags(struct deif (fw_feature_is ("enabled" ,"fw-bcctrl-serialized" , np))security_ftr_set (SEC_FTR_BCCTRL_SERIALISED ); -if (fw_feature_is ("enabled" ,"inst-spec-barrier-ori31,31,0" , np)) +if (fw_feature_is ("enabled" ,"inst-l1d-flush-ori30,30,0" , np))security_ftr_set (SEC_FTR_L1D_FLUSH_ORI30 );if (fw_feature_is ("enabled" ,"inst-l1d-flush-trig2" , np))
@@ -98,11 +98,10 @@ static void pnv_setup_rfi_flush(void) {struct device_node *np, *fw_features;enum l1d_flush_type type; -int enable; +bool enable;/* Default to fallback in case fw-features are not available */ type =L1D_FLUSH_FALLBACK ; - enable =1 ; np =of_find_node_by_name (NULL ,"ibm,opal" ); fw_features =of_get_child_by_name (np,"fw-features" );
@@ -110,40 +109,20 @@ static void pnv_setup_rfi_flush(void)if (fw_features) {init_fw_feat_flags (fw_features); +of_node_put (fw_features); - np =of_get_child_by_name (fw_features,"inst-l1d-flush-trig2" ); -if (np &&of_property_read_bool (np,"enabled" )) +if (security_ftr_enabled (SEC_FTR_L1D_FLUSH_TRIG2 )) type =L1D_FLUSH_MTTRIG ; -of_node_put (np); - - np =of_get_child_by_name (fw_features,"inst-l1d-flush-ori30,30,0" ); -if (np &&of_property_read_bool (np,"enabled" )) +if (security_ftr_enabled (SEC_FTR_L1D_FLUSH_ORI30 )) type =L1D_FLUSH_ORI ; - -of_node_put (np); - -/* Enable unless firmware says NOT to */ - enable =2 ; - np =of_get_child_by_name (fw_features,"needs-l1d-flush-msr-hv-1-to-0" ); -if (np &&of_property_read_bool (np,"disabled" )) - enable--; - -of_node_put (np); - - np =of_get_child_by_name (fw_features,"needs-l1d-flush-msr-pr-0-to-1" ); -if (np &&of_property_read_bool (np,"disabled" )) - enable--; - - np =of_get_child_by_name (fw_features,"speculation-policy-favor-security" ); -if (np &&of_property_read_bool (np,"disabled" )) - enable =0 ; - -of_node_put (np); -of_node_put (fw_features); } -setup_rfi_flush (type, enable >0 ); + enable =security_ftr_enabled (SEC_FTR_FAVOUR_SECURITY ) && \ + (security_ftr_enabled (SEC_FTR_L1D_FLUSH_PR ) || \ +security_ftr_enabled (SEC_FTR_L1D_FLUSH_HV )); + +setup_rfi_flush (type, enable); }static void __init pnv_setup_arch (void )
Greg Kroah-Hartman
maintainerPATCH 49/496 powerpc/pseries: Use the security flags in pseries_setup_rfi_flush()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 2e4a16161fcd324b1f9bf6cb6856529f7eaf0689 upstream.
Now that we have the security flags we can simplify the code in pseries_setup_rfi_flush() because the security flags have pessimistic defaults.
--- arch/powerpc/platforms/pseries/setup.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)
arch/powerpc/platforms/pseries/setup.c +12 -15
@@ -501,30 +501,27 @@ void pseries_setup_rfi_flush(void)bool enable;long rc; -/* Enable by default */ - enable = true; - types =L1D_FLUSH_FALLBACK ; - rc =plpar_get_cpu_characteristics (&result); -if (rc ==H_SUCCESS ) { +if (rc ==H_SUCCESS )init_cpu_char_feature_flags (&result); -if (result.character &H_CPU_CHAR_L1D_FLUSH_TRIG2 ) - types |=L1D_FLUSH_MTTRIG ; -if (result.character &H_CPU_CHAR_L1D_FLUSH_ORI30 ) - types |=L1D_FLUSH_ORI ; - -if ((!(result.behaviour &H_CPU_BEHAV_L1D_FLUSH_PR )) || - (!(result.behaviour &H_CPU_BEHAV_FAVOUR_SECURITY ))) - enable = false; - } -/* * We're the guest so this doesn't apply to us, clear it to simplify * handling of it elsewhere. */ security_ftr_clear (SEC_FTR_L1D_FLUSH_HV ); + types =L1D_FLUSH_FALLBACK ; + +if (security_ftr_enabled (SEC_FTR_L1D_FLUSH_TRIG2 )) + types |=L1D_FLUSH_MTTRIG ; + +if (security_ftr_enabled (SEC_FTR_L1D_FLUSH_ORI30 )) + types |=L1D_FLUSH_ORI ; + + enable =security_ftr_enabled (SEC_FTR_FAVOUR_SECURITY ) && \ +security_ftr_enabled (SEC_FTR_L1D_FLUSH_PR ); +setup_rfi_flush (types, enable); }
Greg Kroah-Hartman
maintainerPATCH 50/496 powerpc/64s: Wire up cpu_show_spectre_v1()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 56986016cb8cd9050e601831fe89f332b4e3c46e upstream.
Add a definition for cpu_show_spectre_v1() to override the generic version. Currently this just prints "Not affected" or "Vulnerable" based on the firmware flag.
Although the kernel does have array_index_nospec() in a few places, we haven't yet audited all the powerpc code to see where it's necessary, so for now we don't list that as a mitigation.
--- arch/powerpc/kernel/security.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/powerpc/kernel/security.c +8 -0
@@ -50,3 +50,11 @@ ssize_t cpu_show_meltdown(struct devicereturn sprintf (buf,"Vulnerable\n" ); } + +ssize_t cpu_show_spectre_v1 (struct device *dev,struct device_attribute *attr,char *buf) +{ +if (!security_ftr_enabled (SEC_FTR_BNDS_CHK_SPEC_BAR )) +return sprintf (buf,"Not affected\n" ); + +return sprintf (buf,"Vulnerable\n" ); +}
Greg Kroah-Hartman
maintainerPATCH 51/496 powerpc/64s: Wire up cpu_show_spectre_v2()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit d6fbe1c55c55c6937cbea3531af7da84ab7473c3 upstream.
Add a definition for cpu_show_spectre_v2() to override the generic version. This has several permuations, though in practice some may not occur we cater for any combination.
The most verbose is:
Mitigation: Indirect branch serialisation (kernel only), Indirect branch cache disabled, ori31 speculation barrier enabled
We don't treat the ori31 speculation barrier as a mitigation on its own, because it has to be *used* by code in order to be a mitigation and we don't know if userspace is doing that. So if that's all we see we say:
Vulnerable, ori31 speculation barrier enabled
--- arch/powerpc/kernel/security.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
arch/powerpc/kernel/security.c +33 -0
@@ -58,3 +58,36 @@ ssize_t cpu_show_spectre_v1(struct devicreturn sprintf (buf,"Vulnerable\n" ); } + +ssize_t cpu_show_spectre_v2 (struct device *dev,struct device_attribute *attr,char *buf) +{ +bool bcs, ccd, ori; +struct seq_buf s; + +seq_buf_init (&s, buf,PAGE_SIZE -1 ); + + bcs =security_ftr_enabled (SEC_FTR_BCCTRL_SERIALISED ); + ccd =security_ftr_enabled (SEC_FTR_COUNT_CACHE_DISABLED ); + ori =security_ftr_enabled (SEC_FTR_SPEC_BAR_ORI31 ); + +if (bcs || ccd) { +seq_buf_printf (&s,"Mitigation: " ); + +if (bcs) +seq_buf_printf (&s,"Indirect branch serialisation (kernel only)" ); + +if (bcs && ccd) +seq_buf_printf (&s,", " ); + +if (ccd) +seq_buf_printf (&s,"Indirect branch cache disabled" ); + }else +seq_buf_printf (&s,"Vulnerable" ); + +if (ori) +seq_buf_printf (&s,", ori31 speculation barrier enabled" ); + +seq_buf_printf (&s,"\n" ); + +return s.len; +}
Greg Kroah-Hartman
maintainerPATCH 52/496 powerpc/pseries: Fix clearing of security feature flags
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauricio Faria de Oliveira <[email protected]>
commit 0f9bdfe3c77091e8704d2e510eb7c2c2c6cde524 upstream.
The H_CPU_BEHAV_* flags should be checked for in the 'behaviour' field of 'struct h_cpu_char_result' -- 'character' is for H_CPU_CHAR_* flags.
Found by playing around with QEMU's implementation of the hypercall:
H_CPU_CHAR=0xf000000000000000
H_CPU_BEHAV=0x0000000000000000
This clears H_CPU_BEHAV_FAVOUR_SECURITY and H_CPU_BEHAV_L1D_FLUSH_PR so pseries_setup_rfi_flush() disables 'rfi_flush'; and it also clears H_CPU_CHAR_L1D_THREAD_PRIV flag. So there is no RFI flush mitigation at all for cpu_show_meltdown() to report; but currently it does:
Original kernel:
# cat /sys/devices/system/cpu/vulnerabilities/meltdown
Mitigation: RFI FlushPatched kernel:
# cat /sys/devices/system/cpu/vulnerabilities/meltdown
Not affected H_CPU_CHAR=0x0000000000000000
H_CPU_BEHAV=0xf000000000000000
This sets H_CPU_BEHAV_BNDS_CHK_SPEC_BAR so cpu_show_spectre_v1() should report vulnerable; but currently it doesn't:
Original kernel:
# cat /sys/devices/system/cpu/vulnerabilities/spectre_v1
Not affectedPatched kernel:
# cat /sys/devices/system/cpu/vulnerabilities/spectre_v1
Vulnerable--- arch/powerpc/platforms/pseries/setup.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/platforms/pseries/setup.c +3 -3
@@ -484,13 +484,13 @@ static void init_cpu_char_feature_flags(* The features below are enabled by default, so we instead look to see * if firmware has *disabled* them, and clear them if so. */ -if (!(result->character &H_CPU_BEHAV_FAVOUR_SECURITY )) +if (!(result->behaviour &H_CPU_BEHAV_FAVOUR_SECURITY ))security_ftr_clear (SEC_FTR_FAVOUR_SECURITY ); -if (!(result->character &H_CPU_BEHAV_L1D_FLUSH_PR )) +if (!(result->behaviour &H_CPU_BEHAV_L1D_FLUSH_PR ))security_ftr_clear (SEC_FTR_L1D_FLUSH_PR ); -if (!(result->character &H_CPU_BEHAV_BNDS_CHK_SPEC_BAR )) +if (!(result->behaviour &H_CPU_BEHAV_BNDS_CHK_SPEC_BAR ))security_ftr_clear (SEC_FTR_BNDS_CHK_SPEC_BAR ); }
Greg Kroah-Hartman
maintainerPATCH 53/496 powerpc: Move default security feature flags
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauricio Faria de Oliveira <[email protected]>
commit e7347a86830f38dc3e40c8f7e28c04412b12a2e7 upstream.
This moves the definition of the default security feature flags (i.e., enabled by default) closer to the security feature flags.
This can be used to restore current flags to the default flags.
--- arch/powerpc/include/asm/security_features.h | 8 ++++++++ arch/powerpc/kernel/security.c | 7 +------ 2 files changed, 9 insertions(+), 6 deletions(-)
arch/powerpc/include/asm/security_features.h +8 -0
@@ -63,4 +63,12 @@ static inline bool security_ftr_enabled(// Firmware configuration indicates user favours security over performance #define SEC_FTR_FAVOUR_SECURITY 0x0000000000000200ull + +// Features enabled by default +#define SEC_FTR_DEFAULT \ + (SEC_FTR_L1D_FLUSH_HV | \ + SEC_FTR_L1D_FLUSH_PR | \ + SEC_FTR_BNDS_CHK_SPEC_BAR | \ + SEC_FTR_FAVOUR_SECURITY) +#endif /* _ASM_POWERPC_SECURITY_FEATURES_H */
arch/powerpc/kernel/security.c +1 -6
@@ -11,12 +11,7 @@#include <asm/security_features.h> -unsigned long powerpc_security_features __read_mostly = \ -SEC_FTR_L1D_FLUSH_HV | \ -SEC_FTR_L1D_FLUSH_PR | \ -SEC_FTR_BNDS_CHK_SPEC_BAR | \ -SEC_FTR_FAVOUR_SECURITY ; - +unsigned long powerpc_security_features__read_mostly =SEC_FTR_DEFAULT ;ssize_t cpu_show_meltdown (struct device *dev,struct device_attribute *attr,char *buf) {
Greg Kroah-Hartman
maintainerPATCH 54/496 powerpc/pseries: Restore default security feature flags on setup
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauricio Faria de Oliveira <[email protected]>
commit 6232774f1599028a15418179d17f7df47ede770a upstream.
After migration the security feature flags might have changed (e.g., destination system with unpatched firmware), but some flags are not set/clear again in init_cpu_char_feature_flags() because it assumes the security flags to be the defaults.
Additionally, if the H_GET_CPU_CHARACTERISTICS hypercall fails then init_cpu_char_feature_flags() does not run again, which potentially might leave the system in an insecure or sub-optimal configuration.
So, just restore the security feature flags to the defaults assumed by init_cpu_char_feature_flags() so it can set/clear them correctly, and to ensure safe settings are in place in case the hypercall fail.
Depends-on: 19887d6a28e2 ("powerpc: Move default security feature flags")
--- arch/powerpc/platforms/pseries/setup.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/powerpc/platforms/pseries/setup.c +11 -0
@@ -462,6 +462,10 @@ static void __init find_and_init_phbs(vostatic void init_cpu_char_feature_flags (struct h_cpu_char_result *result) { +/* +* The features below are disabled by default, so we instead look to see +* if firmware has *enabled* them, and set them if so. +*/ if (result->character &H_CPU_CHAR_SPEC_BAR_ORI31 )security_ftr_set (SEC_FTR_SPEC_BAR_ORI31 );
@@ -501,6 +505,13 @@ void pseries_setup_rfi_flush(void)bool enable;long rc; +/* +* Set features to the defaults assumed by init_cpu_char_feature_flags() +* so it can set/clear again any features that might have changed after +* migration, and in case the hypercall fails and it is not even called. +*/ + powerpc_security_features =SEC_FTR_DEFAULT ; + rc =plpar_get_cpu_characteristics (&result);if (rc ==H_SUCCESS )init_cpu_char_feature_flags (&result);
Greg Kroah-Hartman
maintainerPATCH 55/496 powerpc/64s: Fix section mismatch warnings from setup_rfi_flush()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 501a78cbc17c329fabf8e9750a1e9ab810c88a0e upstream.
The recent LPM changes to setup_rfi_flush() are causing some section mismatch warnings because we removed the __init annotation on setup_rfi_flush():
The function setup_rfi_flush() references
the function __init ppc64_bolted_size().
the function __init memblock_alloc_base().
The references are actually in init_fallback_flush(), but that is inlined into setup_rfi_flush().
These references are safe because:
- only pseries calls setup_rfi_flush() at runtime
- pseries always passes L1D_FLUSH_FALLBACK at boot
- so the fallback flush area will always be allocated
- so the check in init_fallback_flush() will always return early:
/* Only allocate the fallback flush area once (at boot time). */ if (l1d_flush_fallback_area)
return;
- and therefore we won't actually call the freed init routines.
We should rework the code to make it safer by default rather than relying on the above, but for now as a quick-fix just add a __ref annotation to squash the warning.
--- arch/powerpc/kernel/setup_64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kernel/setup_64.c +1 -1
@@ -831,7 +831,7 @@ void rfi_flush_enable(bool enable) rfi_flush = enable; } -static void init_fallback_flush (void ) +static void __ref init_fallback_flush (void ) {u64 l1d_size, limit;int cpu;
Greg Kroah-Hartman
maintainerPATCH 57/496 MIPS: generic: Fix machine compatible matching
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
[ Upstream commit 9a9ab3078e2744a1a55163cfaec73a5798aae33e ]
We now have a platform (Ranchu) in the "generic" platform which matches based on the FDT compatible string using mips_machine_is_compatible(), however that function doesn't stop at a blank struct of_device_id::compatible as that is an array in the struct, not a pointer to a string.
Fix the loop completion to check the first byte of the compatible array rather than the address of the compatible array in the struct.
Patchwork: https://patchwork.linux-mips.org/patch/18580/
--- arch/mips/include/asm/machine.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/include/asm/machine.h +1 -1
@@ -52,7 +52,7 @@ mips_machine_is_compatible(const structif (!mach->matches)return NULL ; -for (match = mach->matches; match->compatible; match++) { +for (match = mach->matches; match->compatible[0 ]; match++) {if (fdt_node_check_compatible (fdt,0 , match->compatible) ==0 )return match; }
Greg Kroah-Hartman
maintainerPATCH 58/496 mac80211: mesh: fix wrong mesh TTL offset calculation
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Oh <[email protected]>
[ Upstream commit c4de37ee2b55deac7d6aeac33e02e3d6be243898 ]
mesh TTL offset in Mesh Channel Switch Parameters element depends on not only Secondary Channel Offset element, but also affected by HT Control field and Wide Bandwidth Channel Switch element. So use element structure to manipulate mesh channel swich param IE after removing its constant attribution to correct the miscalculation.
--- net/mac80211/ieee80211_i.h | 2 +- net/mac80211/mesh.c | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-)
net/mac80211/ieee80211_i.h +1 -1
@@ -1466,7 +1466,7 @@ struct ieee802_11_elems {const struct ieee80211_timeout_interval_ie *timeout_int;const u8 *opmode_notif;const struct ieee80211_sec_chan_offs_ie *sec_chan_offs; -const struct ieee80211_mesh_chansw_params_ie *mesh_chansw_params_ie; +struct ieee80211_mesh_chansw_params_ie *mesh_chansw_params_ie;const struct ieee80211_bss_max_idle_period_ie *max_idle_period_ie;/* length of them, respectively */
net/mac80211/mesh.c +6 -11
@@ -1253,13 +1253,12 @@ int ieee80211_mesh_csa_beacon(struct iee }static int mesh_fwd_csa_frame (struct ieee80211_sub_if_data *sdata, -struct ieee80211_mgmt *mgmt,size_t len) +struct ieee80211_mgmt *mgmt,size_t len, +struct ieee802_11_elems *elems) {struct ieee80211_mgmt *mgmt_fwd;struct sk_buff *skb;struct ieee80211_local *local = sdata->local; -u8 *pos = mgmt->u.action.u.chan_switch.variable; -size_t offset_ttl; skb =dev_alloc_skb (local->tx_headroom + len);if (!skb)
@@ -1267,13 +1266,9 @@ static int mesh_fwd_csa_frame(struct ieeskb_reserve (skb, local->tx_headroom); mgmt_fwd =skb_put (skb, len); -/* offset_ttl is based on whether the secondary channel -* offset is available or not. Subtract 1 from the mesh TTL -* and disable the initiator flag before forwarding. -*/ - offset_ttl = (len <42 ) ?7 :10 ; - *(pos + offset_ttl) -=1 ; - *(pos + offset_ttl +1 ) &= ~WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR ; + elems->mesh_chansw_params_ie->mesh_ttl--; + elems->mesh_chansw_params_ie->mesh_flags &= + ~WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR ;memcpy (mgmt_fwd, mgmt, len);eth_broadcast_addr (mgmt_fwd->da);
@@ -1321,7 +1316,7 @@ static void mesh_rx_csa_frame(struct iee/* forward or re-broadcast the CSA frame */ if (fwd_csa) { -if (mesh_fwd_csa_frame (sdata, mgmt, len) <0 ) +if (mesh_fwd_csa_frame (sdata, mgmt, len, &elems) <0 )mcsa_dbg (sdata,"Failed to forward the CSA frame" ); } }
Greg Kroah-Hartman
maintainerPATCH 59/496 ARC: Fix malformed ARC_EMUL_UNALIGNED default
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ulf Magnusson <[email protected]>
[ Upstream commit 827cc2fa024dd6517d62de7a44c7b42f32af371b ]
'default N' should be 'default n', though they happen to have the same effect here, due to undefined symbols (N in this case) evaluating to n in a tristate sense.
Remove the default from ARC_EMUL_UNALIGNED instead of changing it. bool and tristate symbols implicitly default to n.
--- arch/arc/Kconfig | 1 - 1 file changed, 1 deletion(-)
arch/arc/Kconfig +0 -1
@@ -487,7 +487,6 @@ config ARC_CURR_IN_REG config ARC_EMUL_UNALIGNED bool "Emulate unaligned memory access (userspace only)" - default N select SYSCTL_ARCH_UNALIGN_NO_WARN select SYSCTL_ARCH_UNALIGN_ALLOW depends on ISA_ARCOMPACT
Greg Kroah-Hartman
maintainerPATCH 60/496 ptr_ring: prevent integer overflow when calculating size
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wang <[email protected]>
[ Upstream commit 54e02162d4454a99227f520948bf4494c3d972d0 ]
Switch to use dividing to prevent integer overflow when size is too big to calculate allocation size properly.
--- include/linux/ptr_ring.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/ptr_ring.h +1 -1
@@ -450,7 +450,7 @@ static inline int ptr_ring_consume_batch*/ static inline void **__ptr_ring_init_queue_alloc (unsigned int size,gfp_t gfp) { -if (size *sizeof (void *) >KMALLOC_MAX_SIZE ) +if (size >KMALLOC_MAX_SIZE /sizeof (void *))return NULL ;return kvmalloc_array (size,sizeof (void *), gfp | __GFP_ZERO); }
Greg Kroah-Hartman
maintainerPATCH 62/496 arm64: dts: rockchip: correct ep-gpios for rk3399-sapphire
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shawn Lin <[email protected]>
[ Upstream commit 2b7d2ed1af2e2c0c90a1a8b97926b7b6c6cb03ed ]
The endpoint control gpio for rk3399-sapphire boards is gpio2_a4, so correct it now.
--- arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi +1 -1
@@ -457,7 +457,7 @@ assigned-clocks = <&cru SCLK_PCIEPHY_REF>; assigned-clock-parents = <&cru SCLK_PCIEPHY_REF100M>; assigned-clock-rates = <100000000>; - ep-gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_HIGH>; + ep-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_HIGH>; num-lanes = <4>; pinctrl-names = "default"; pinctrl-0 = <&pcie_clkreqn_cpm>;
Greg Kroah-Hartman
maintainerPATCH 63/496 libata: Fix compile warning with ATA_DEBUG enabled
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dong Bo <[email protected]>
[ Upstream commit 0d3e45bc6507bd1f8728bf586ebd16c2d9e40613 ]
This fixs the following comile warnings with ATA_DEBUG enabled, which detected by Linaro GCC 5.2-2015.11:
drivers/ata/libata-scsi.c: In function 'ata_scsi_dump_cdb':
./include/linux/kern_levels.h:5:18: warning: format '%d' expects argument of type 'int', but argument 6 has type 'u64 {aka long
long unsigned int}' [-Wformat=]
tj: Patch hand-applied and description trimmed.
--- drivers/ata/libata-scsi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ata/libata-scsi.c +1 -1
@@ -4287,7 +4287,7 @@ static inline void ata_scsi_dump_cdb(str#ifdef ATA_DEBUG struct scsi_device *scsidev = cmd->device; -DPRINTK ("CDB (%u:%d,%d,%d) %9ph\n" , +DPRINTK ("CDB (%u:%d,%d,%lld) %9ph\n" , ap->print_id, scsidev->channel, scsidev->id, scsidev->lun, cmd->cmnd);
Greg Kroah-Hartman
maintainerPATCH 65/496 selftest/vDSO: fix O=
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dominik Brodowski <[email protected]>
[ Upstream commit 70b574e7d719bdf96d26528cb289f3e782e83979 ]
The vDSO selftests ignored the O= or KBUILD_OUTPUT= parameters. Fix it.
--- tools/testing/selftests/vDSO/Makefile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
tools/testing/selftests/vDSO/Makefile +7 -7
@@ -1,4 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 +include ../lib.mk + ifndef CROSS_COMPILE CFLAGS := -std=gnu99 CFLAGS_vdso_standalone_test_x86 := -nostdlib -fno-asynchronous-unwind-tables -fno-stack-protector
@@ -6,16 +8,14 @@ ifeq ($(CONFIG_X86_32),y) LDLIBS += -lgcc_s endif -TEST_PROGS := vdso_test vdso_standalone_test_x86 +TEST_PROGS := $(OUTPUT)/vdso_test $(OUTPUT)/vdso_standalone_test_x86 all: $(TEST_PROGS) -vdso_test: parse_vdso.c vdso_test.c -vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c +$(OUTPUT)/vdso_test: parse_vdso.c vdso_test.c +$(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c $(CC) $(CFLAGS) $(CFLAGS_vdso_standalone_test_x86) \ vdso_standalone_test_x86.c parse_vdso.c \ - -o vdso_standalone_test_x86 + -o $@ -include ../lib.mk -clean: - rm -fr $(TEST_PROGS) +EXTRA_CLEAN := $(TEST_PROGS) endif
Greg Kroah-Hartman
maintainerPATCH 66/496 selftests: pstore: Adding config fragment CONFIG_PSTORE_RAM=m
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naresh Kamboju <[email protected]>
[ Upstream commit 9a379e77033f02c4a071891afdf0f0a01eff8ccb ]
pstore_tests and pstore_post_reboot_tests need CONFIG_PSTORE_RAM=m
--- tools/testing/selftests/pstore/config | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/pstore/config +1 -0
@@ -2,3 +2,4 @@ CONFIG_MISC_FILESYSTEMS=y CONFIG_PSTORE=y CONFIG_PSTORE_PMSG=y CONFIG_PSTORE_CONSOLE=y +CONFIG_PSTORE_RAM=m
Greg Kroah-Hartman
maintainerPATCH 68/496 ARM: OMAP2+: timer: fix a kmemleak caused in omap_get_timer_dt
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qi Hou <[email protected]>
[ Upstream commit db35340c536f1af0108ec9a0b2126a05d358d14a ]
When more than one GP timers are used as kernel system timers and the corresponding nodes in device-tree are marked with the same "disabled" property, then the "attr" field of the property will be initialized more than once as the property being added to sys file system via __of_add_property_sysfs().
In __of_add_property_sysfs(), the "name" field of pp->attr.attr is set directly to the return value of safe_name(), without taking care of whether it's already a valid pointer to a memory block. If it is, its old value will always be overwritten by the new one and the memory block allocated before will a "ghost", then a kmemleak happened.
That the same "disabled" property being added to different nodes of device tree would cause that kind of kmemleak overhead, at least once.
To fix it, allocate the property dynamically, and delete static one.
--- arch/arm/mach-omap2/timer.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
arch/arm/mach-omap2/timer.c +11 -8
@@ -156,12 +156,6 @@ static struct clock_event_device clockev .tick_resume = omap2_gp_timer_shutdown, }; -static struct property device_disabled = { - .name ="status" , - .length =sizeof ("disabled" ), - .value ="disabled" , -}; -static const struct of_device_id omap_timer_match[]__initconst = { { .compatible ="ti,omap2420-timer" , }, { .compatible ="ti,omap3430-timer" , },
@@ -203,8 +197,17 @@ static struct device_node * __init omap_ of_get_property(np, "ti,timer-secure", NULL))) continue; -if (!of_device_is_compatible (np,"ti,omap-counter32k" )) -of_add_property (np, &device_disabled); +if (!of_device_is_compatible (np,"ti,omap-counter32k" )) { +struct property *prop; + + prop =kzalloc (sizeof (*prop),GFP_KERNEL ); +if (!prop) +return NULL ; + prop->name ="status" ; + prop->value ="disabled" ; + prop->length =strlen (prop->value); +of_add_property (np, prop); + }return np; }
Greg Kroah-Hartman
maintainerPATCH 69/496 ARM: OMAP3: Fix prm wake interrupt for resume
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit d3be6d2a08bd26580562d9714d3d97ea9ba22c73 ]
For platform_suspend_ops, the finish call is too late to re-enable wake irqs and we need re-enable wake irqs on wake call instead.
Otherwise noirq resume for devices has already happened. And then dev_pm_disarm_wake_irq() has already disabled the dedicated wake irqs when the interrupt triggers and the wake irq is never handled.
For devices that are already in PM runtime suspended state when we enter suspend this means that a possible wake irq will never trigger.
And this can lead into a situation where a device has a pending padconf wake irq, and the device will stay unresponsive to any further wake irqs.
This issue can be easily reproduced by setting serial console log level to zero, letting the serial console idle, and suspend the system from an ssh terminal. Then try to wake up the system by typing to the serial console.
Note that this affects only omap3 PRM interrupt as that's currently the only omap variant that does anything in omap_pm_wake().
In general, for the wake irqs to work, the interrupt must have either IRQF_NO_SUSPEND or IRQF_EARLY_RESUME set for it to trigger before dev_pm_disarm_wake_irq() disables the wake irqs.
--- arch/arm/mach-omap2/pm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/mach-omap2/pm.c +2 -2
@@ -186,7 +186,7 @@ static void omap_pm_end(void)cpu_idle_poll_ctrl (false); } -static void omap_pm_finish (void ) +static void omap_pm_wake (void ) {if (soc_is_omap34xx ())omap_prcm_irq_complete ();
@@ -196,7 +196,7 @@ static const struct platform_suspend_ops .begin = omap_pm_begin, .end = omap_pm_end, .enter = omap_pm_enter, - .finish = omap_pm_finish, + .wake = omap_pm_wake, .valid = suspend_valid_only_mem, };
Greg Kroah-Hartman
maintainerPATCH 70/496 ARM: OMAP2+: Fix sar_base inititalization for HS omaps
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit fe27f16794f313f5fc16f6d2f42d8c2b2f4d70cc ]
HS omaps use irq_save_secure_context() instead of irq_save_context() so sar_base will never get initialized and irq_sar_clear() gets called with a wrong address for HS omaps from irq_restore_context().
Starting with commit f4b9f40ae95b ("ARM: OMAP4+: Initialize SAR RAM base early for proper CPU1 reset for kexec") we have it available, and this ideally would been fixed with that commit already.
proper CPU1 reset for kexec")
--- arch/arm/mach-omap2/omap-wakeupgen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/mach-omap2/omap-wakeupgen.c +2 -2
@@ -299,8 +299,6 @@ static void irq_save_context(void)if (soc_is_dra7xx ())return ; -if (!sar_base) - sar_base =omap4_get_sar_ram_base ();if (wakeupgen_ops && wakeupgen_ops->save_context) wakeupgen_ops->save_context (); }
@@ -598,6 +596,8 @@ static int __init wakeupgen_init(structirq_hotplug_init ();irq_pm_init (); + sar_base =omap4_get_sar_ram_base (); +return 0 ; }IRQCHIP_DECLARE (ti_wakeupgen,"ti,omap4-wugen-mpu" , wakeupgen_init);
Greg Kroah-Hartman
maintainerPATCH 71/496 ARM: OMAP1: clock: Fix debugfs_create_*() usage
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 8cbbf1745dcde7ba7e423dc70619d223de90fd43 ]
When exposing data access through debugfs, the correct debugfs_create_*() functions must be used, depending on data type.
Remove all casts from data pointers passed to debugfs_create_*() functions, as such casts prevent the compiler from flagging bugs.
Correct all wrong usage:
- clk.rate is unsigned long, not u32,
- clk.flags is u8, not u32, which exposed the successive clk.rate_offset and clk.src_offset fields.
--- arch/arm/mach-omap1/clock.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm/mach-omap1/clock.c +3 -3
@@ -1011,17 +1011,17 @@ static int clk_debugfs_register_one(strureturn -ENOMEM ; c->dent = d; - d =debugfs_create_u8 ("usecount" ,S_IRUGO , c->dent, (u8 *)&c->usecount); + d =debugfs_create_u8 ("usecount" ,S_IRUGO , c->dent, &c->usecount);if (!d) { err = -ENOMEM ; goto err_out; } - d =debugfs_create_u32 ("rate" ,S_IRUGO , c->dent, (u32 *)&c->rate); + d =debugfs_create_ulong ("rate" ,S_IRUGO , c->dent, &c->rate);if (!d) { err = -ENOMEM ; goto err_out; } - d =debugfs_create_x32 ("flags" ,S_IRUGO , c->dent, (u32 *)&c->flags); + d =debugfs_create_x8 ("flags" ,S_IRUGO , c->dent, &c->flags);if (!d) { err = -ENOMEM ; goto err_out;
Greg Kroah-Hartman
maintainerPATCH 72/496 ibmvnic: Wait until reset is complete to set carrier on
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Falcon <[email protected]>
[ Upstream commit cc85c02edfe48a34865ae00f7d22298a3fdd17aa ]
Pushes back setting the carrier on until the end of the reset code. This resolves a bug where a watchdog timer was detecting that a TX queue had stalled before the adapter reset was complete.
--- drivers/net/ethernet/ibm/ibmvnic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/ibm/ibmvnic.c +2 -2
@@ -1460,8 +1460,6 @@ static int do_reset(struct ibmvnic_adaptreturn 0 ; } -netif_carrier_on (netdev); -/* kick napi */ for (i =0 ; i < adapter->req_rx_queues; i++)napi_schedule (&adapter->napi[i]);
@@ -1469,6 +1467,8 @@ static int do_reset(struct ibmvnic_adaptif (adapter->reset_reason !=VNIC_RESET_FAILOVER )netdev_notify_peers (netdev); +netif_carrier_on (netdev); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 73/496 ibmvnic: Free RX socket buffer in case of adapter error
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Falcon <[email protected]>
[ Upstream commit 4b9b0f01350500173f17e2b2e65beb4df4ef99c7 ]
If a RX buffer is returned to the client driver with an error, free the corresponding socket buffer before continuing.
--- drivers/net/ethernet/ibm/ibmvnic.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/ibm/ibmvnic.c +1 -0
@@ -1636,6 +1636,7 @@ restart_poll: be16_to_cpu(next->rx_comp.rc));/* free the entry */ next->rx_comp.first =0 ; +dev_kfree_skb_any (rx_buff->skb);remove_buff_from_pool (adapter, rx_buff);continue ; }
Greg Kroah-Hartman
maintainerPATCH 74/496 ibmvnic: Clean RX pool buffers during device close
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Falcon <[email protected]>
[ Upstream commit d0869c0071e40c4407d1a4d7c9497653cf47253b ]
During device close or reset, there were some cases of outstanding RX socket buffers not being freed. Include a function similar to the one that already exists to clean TX socket buffers in this case.
--- drivers/net/ethernet/ibm/ibmvnic.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-)
drivers/net/ethernet/ibm/ibmvnic.c +30 -1
@@ -933,6 +933,35 @@ static int ibmvnic_open(struct net_devicreturn rc; } +static void clean_rx_pools (struct ibmvnic_adapter *adapter) +{ +struct ibmvnic_rx_pool *rx_pool; +u64 rx_entries; +int rx_scrqs; +int i, j; + +if (!adapter->rx_pool) +return ; + + rx_scrqs =be32_to_cpu (adapter->login_rsp_buf->num_rxadd_subcrqs); + rx_entries = adapter->req_rx_add_entries_per_subcrq; + +/* Free any remaining skbs in the rx buffer pools */ +for (i =0 ; i < rx_scrqs; i++) { + rx_pool = &adapter->rx_pool[i]; +if (!rx_pool) +continue ; + +netdev_dbg (adapter->netdev,"Cleaning rx_pool[%d]\n" , i); +for (j =0 ; j < rx_entries; j++) { +if (rx_pool->rx_buff[j].skb) { +dev_kfree_skb_any (rx_pool->rx_buff[j].skb); + rx_pool->rx_buff[j].skb =NULL ; + } + } + } +} +static void clean_tx_pools (struct ibmvnic_adapter *adapter) {struct ibmvnic_tx_pool *tx_pool;
@@ -1010,7 +1039,7 @@ static int __ibmvnic_close(struct net_de } } } - +clean_rx_pools (adapter);clean_tx_pools (adapter); adapter->state =VNIC_CLOSED ;return rc;
Greg Kroah-Hartman
maintainerPATCH 75/496 tls: retrun the correct IV in getsockopt
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Pismenny <[email protected]>
[ Upstream commit a1dfa6812b682eef750412dd5a90e7d38d7af068 ]
Current code returns four bytes of salt followed by four bytes of IV. This patch returns all eight bytes of IV.
--- net/tls/tls_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/tls/tls_main.c +2 -1
@@ -299,7 +299,8 @@ static int do_tls_getsockopt_tx(struct s goto out; }lock_sock (sk); -memcpy (crypto_info_aes_gcm_128->iv, ctx->iv, +memcpy (crypto_info_aes_gcm_128->iv, + ctx->iv +TLS_CIPHER_AES_GCM_128_SALT_SIZE ,TLS_CIPHER_AES_GCM_128_IV_SIZE );release_sock (sk); if (copy_to_user(optval,
Greg Kroah-Hartman
maintainerPATCH 76/496 xhci: workaround for AMD Promontory disabled ports wakeup
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joe Lee <[email protected]>
[ Upstream commit bde0716d1f076e4c913c7946bcc858f71243c7a0 ]
For AMD Promontory xHCI host, although you can disable USB ports in BIOS settings, those ports will be enabled anyway after you remove a device on that port and re-plug it in again. It's a known limitation of the chip. As a workaround we can clear the PORT_WAKE_BITS.
--- drivers/usb/host/pci-quirks.c | 109 ++++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/pci-quirks.h | 5 + drivers/usb/host/xhci-hub.c | 7 ++ drivers/usb/host/xhci-pci.c | 11 ++++ drivers/usb/host/xhci.h | 2 5 files changed, 133 insertions(+), 1 deletion(-)
drivers/usb/host/pci-quirks.c +109 -0
@@ -65,6 +65,23 @@#define AX_INDXC 0x30#define AX_DATAC 0x34 +#define PT_ADDR_INDX 0xE8 +#define PT_READ_INDX 0xE4 +#define PT_SIG_1_ADDR 0xA520 +#define PT_SIG_2_ADDR 0xA521 +#define PT_SIG_3_ADDR 0xA522 +#define PT_SIG_4_ADDR 0xA523 +#define PT_SIG_1_DATA 0x78 +#define PT_SIG_2_DATA 0x56 +#define PT_SIG_3_DATA 0x34 +#define PT_SIG_4_DATA 0x12 +#define PT4_P1_REG 0xB521 +#define PT4_P2_REG 0xB522 +#define PT2_P1_REG 0xD520 +#define PT2_P2_REG 0xD521 +#define PT1_P1_REG 0xD522 +#define PT1_P2_REG 0xD523 +#define NB_PCIE_INDX_ADDR 0xe0#define NB_PCIE_INDX_DATA 0xe4#define PCIE_P_CNTL 0x10040
@@ -512,6 +529,98 @@ void usb_amd_dev_put(void)EXPORT_SYMBOL_GPL (usb_amd_dev_put);/* +* Check if port is disabled in BIOS on AMD Promontory host. +* BIOS Disabled ports may wake on connect/disconnect and need +* driver workaround to keep them disabled. +* Returns true if port is marked disabled. +*/ +bool usb_amd_pt_check_port (struct device *device,int port) +{ +unsigned char value, port_shift; +struct pci_dev *pdev; +u16 reg; + + pdev =to_pci_dev (device); +pci_write_config_word (pdev,PT_ADDR_INDX ,PT_SIG_1_ADDR ); + +pci_read_config_byte (pdev,PT_READ_INDX , &value); +if (value !=PT_SIG_1_DATA ) +return false; + +pci_write_config_word (pdev,PT_ADDR_INDX ,PT_SIG_2_ADDR ); + +pci_read_config_byte (pdev,PT_READ_INDX , &value); +if (value !=PT_SIG_2_DATA ) +return false; + +pci_write_config_word (pdev,PT_ADDR_INDX ,PT_SIG_3_ADDR ); + +pci_read_config_byte (pdev,PT_READ_INDX , &value); +if (value !=PT_SIG_3_DATA ) +return false; + +pci_write_config_word (pdev,PT_ADDR_INDX ,PT_SIG_4_ADDR ); + +pci_read_config_byte (pdev,PT_READ_INDX , &value); +if (value !=PT_SIG_4_DATA ) +return false; + +/* Check disabled port setting, if bit is set port is enabled */ +switch (pdev->device) { +case 0x43b9 : +case 0x43ba : +/* +* device is AMD_PROMONTORYA_4(0x43b9) or PROMONTORYA_3(0x43ba) +* PT4_P1_REG bits[7..1] represents USB2.0 ports 6 to 0 +* PT4_P2_REG bits[6..0] represents ports 13 to 7 +*/ +if (port >6 ) { + reg =PT4_P2_REG ; + port_shift = port -7 ; + }else { + reg =PT4_P1_REG ; + port_shift = port +1 ; + } +break ; +case 0x43bb : +/* +* device is AMD_PROMONTORYA_2(0x43bb) +* PT2_P1_REG bits[7..5] represents USB2.0 ports 2 to 0 +* PT2_P2_REG bits[5..0] represents ports 9 to 3 +*/ +if (port >2 ) { + reg =PT2_P2_REG ; + port_shift = port -3 ; + }else { + reg =PT2_P1_REG ; + port_shift = port +5 ; + } +break ; +case 0x43bc : +/* +* device is AMD_PROMONTORYA_1(0x43bc) +* PT1_P1_REG[7..4] represents USB2.0 ports 3 to 0 +* PT1_P2_REG[5..0] represents ports 9 to 4 +*/ +if (port >3 ) { + reg =PT1_P2_REG ; + port_shift = port -4 ; + }else { + reg =PT1_P1_REG ; + port_shift = port +4 ; + } +break ; +default : +return false; + } +pci_write_config_word (pdev,PT_ADDR_INDX , reg); +pci_read_config_byte (pdev,PT_READ_INDX , &value); + +return !(value &BIT (port_shift)); +} +EXPORT_SYMBOL_GPL (usb_amd_pt_check_port); + +/* * Make sure the controller is completely inactive, unable to * generate interrupts or do DMA. */
drivers/usb/host/pci-quirks.h +5 -0
@@ -17,6 +17,7 @@ void usb_enable_intel_xhci_ports(structvoid usb_disable_xhci_ports (struct pci_dev *xhci_pdev);void sb800_prefetch (struct device *dev,int on);bool usb_xhci_needs_pci_reset (struct pci_dev *pdev); +bool usb_amd_pt_check_port (struct device *device,int port);#else struct pci_dev ;static inline void usb_amd_quirk_pll_disable (void ) {}
@@ -25,6 +26,10 @@ static inline void usb_asmedia_modifyflostatic inline void usb_amd_dev_put (void ) {}static inline void usb_disable_xhci_ports (struct pci_dev *xhci_pdev) {}static inline void sb800_prefetch (struct device *dev,int on) {} +static inline bool usb_amd_pt_check_port (struct device *device,int port) +{ +return false; +}#endif /* CONFIG_USB_PCI */ #endif /* __LINUX_USB_PCI_QUIRKS_H */
drivers/usb/host/xhci-hub.c +7 -0
@@ -1531,6 +1531,13 @@ int xhci_bus_suspend(struct usb_hcd *hcd t2 |=PORT_WKOC_E |PORT_WKCONN_E ; t2 &= ~PORT_WKDISC_E ; } + +if ((xhci->quirks &XHCI_U2_DISABLE_WAKE ) && + (hcd->speed <HCD_USB3 )) { +if (usb_amd_pt_check_port (hcd->self.controller, + port_index)) + t2 &= ~PORT_WAKE_BITS ; + } }else t2 &= ~PORT_WAKE_BITS ;
drivers/usb/host/xhci-pci.c +11 -0
@@ -54,6 +54,10 @@#define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8#define PCI_DEVICE_ID_INTEL_DNV_XHCI 0x19d0 +#define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 +#define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba +#define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb +#define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc#define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142static const char hcd_name[] ="xhci_hcd" ;
@@ -143,6 +147,13 @@ static void xhci_pci_quirks(struct devicif (pdev->vendor ==PCI_VENDOR_ID_AMD ) xhci->quirks |=XHCI_TRUST_TX_LENGTH ; +if ((pdev->vendor ==PCI_VENDOR_ID_AMD ) && + ((pdev->device ==PCI_DEVICE_ID_AMD_PROMONTORYA_4 ) || + (pdev->device ==PCI_DEVICE_ID_AMD_PROMONTORYA_3 ) || + (pdev->device ==PCI_DEVICE_ID_AMD_PROMONTORYA_2 ) || + (pdev->device ==PCI_DEVICE_ID_AMD_PROMONTORYA_1 ))) + xhci->quirks |=XHCI_U2_DISABLE_WAKE ; +if (pdev->vendor ==PCI_VENDOR_ID_INTEL ) { xhci->quirks |=XHCI_LPM_SUPPORT ; xhci->quirks |=XHCI_INTEL_HOST ;
drivers/usb/host/xhci.h +1 -1
@@ -1829,7 +1829,7 @@ struct xhci_hcd {/* For controller with a broken Port Disable implementation */ #define XHCI_BROKEN_PORT_PED (1 << 25)#define XHCI_LIMIT_ENDPOINT_INTERVAL_7 (1 << 26) -/* Reserved. It was XHCI_U2_DISABLE_WAKE */ +#define XHCI_U2_DISABLE_WAKE (1 << 27)#define XHCI_ASMEDIA_MODIFY_FLOWCONTROL (1 << 28)#define XHCI_SUSPEND_DELAY (1 << 30)
Greg Kroah-Hartman
maintainerPATCH 77/496 IB/uverbs: Fix method merging in uverbs_ioctl_merge
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matan Barak <[email protected]>
[ Upstream commit 3d89459e2ef92cc0e5a50dde868780ccda9786c1 ]
Fix a bug in uverbs_ioctl_merge that looked at the object's iterator number instead of the method's iterator number when merging methods.
While we're at it, make the uverbs_ioctl_merge code a bit more clear and faster.
--- drivers/infiniband/core/uverbs_ioctl_merge.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/infiniband/core/uverbs_ioctl_merge.c +9 -9
@@ -114,6 +114,7 @@ static size_t get_elements_above_id(consshort min =SHRT_MAX ;const void *elem;int i, j, last_stored =-1 ; +unsigned int equal_min =0 ;for_each_element (elem, i, j, elements, num_elements, num_offset, data_offset) {
@@ -136,6 +137,10 @@ static size_t get_elements_above_id(cons*/ iters[last_stored == i ? num_iters -1 : num_iters++] = elem; last_stored = i; +if (min ==GET_ID (id)) + equal_min++; +else + equal_min =1 ; min =GET_ID (id); }
@@ -146,15 +151,10 @@ static size_t get_elements_above_id(cons* Therefore, we need to clean the beginning of the array to make sure * all ids of final elements are equal to min. */ -for (i = num_iters -1 ; i >=0 && -GET_ID (*(u16 *)(iters[i] + id_offset)) == min; i--) - ; - - num_iters -= i +1 ; -memmove (iters, iters + i +1 ,sizeof (*iters) * num_iters); +memmove (iters, iters + num_iters - equal_min,sizeof (*iters) * equal_min); *min_id = min; -return num_iters; +return equal_min; } #define find_max_element_entry_id(num_elements, elements, num_objects_fld, \
@@ -322,7 +322,7 @@ static struct uverbs_method_spec *build_ hash =kzalloc (sizeof (*hash) +ALIGN (sizeof (*hash->attrs) * (attr_max_bucket +1 ),sizeof (long )) + -BITS_TO_LONGS (attr_max_bucket) *sizeof (long ), +BITS_TO_LONGS (attr_max_bucket +1 ) *sizeof (long ),GFP_KERNEL );if (!hash) { res = -ENOMEM ;
@@ -509,7 +509,7 @@ static struct uverbs_object_spec *build_* first handler which != NULL. This also defines the * set of flags used for this handler. */ -for (i = num_object_defs -1 ; +for (i = num_method_defs -1 ; i >=0 && !method_defs[i]->handler; i--) ; hash->methods[min_id++] = method;
Greg Kroah-Hartman
maintainerPATCH 78/496 IB/uverbs: Fix possible oops with duplicate ioctl attributes
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matan Barak <[email protected]>
[ Upstream commit 4d39a959bc1f3d164b5a54147fdeb19f84b1ed58 ]
If the same attribute is listed twice by the user in the ioctl attribute list then error unwind can cause the kernel to deref garbage.
This happens when an object with WRITE access is sent twice. The second parse properly fails but corrupts the state required for the error unwind it triggers.
Fixing this by making duplicates in the attribute list invalid. This is not something we need to support.
The ioctl interface is currently recommended to be disabled in kConfig.
--- drivers/infiniband/core/uverbs_ioctl.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/core/uverbs_ioctl.c +3 -0
@@ -59,6 +59,9 @@ static int uverbs_process_attr(struct ibreturn 0 ; } +if (test_bit (attr_id, attr_bundle_h->valid_bitmap)) +return -EINVAL ; + spec = &attr_spec_bucket->attrs[attr_id]; e = &elements[attr_id]; e->uattr = uattr_ptr;
Greg Kroah-Hartman
maintainerPATCH 79/496 IB/uverbs: Fix unbalanced unlock on error path for rdma_explicit_destroy
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
[ Upstream commit ec6f8401c48a86809237e86878a6fac6b281118f ]
If remove_commit fails then the lock is left locked while the uobj still exists. Eventually the kernel will deadlock.
lockdep detects this and says:
test/4221 is leaving the kernel with locks still held!
1 lock held by test/4221:
#0: (&ucontext->cleanup_rwsem){.+.+}, at: [<000000001e5c7523>] rdma_explicit_destroy+0x37/0x120 [ib_uverbs]
--- drivers/infiniband/core/rdma_core.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/infiniband/core/rdma_core.c +3 -2
@@ -486,12 +486,13 @@ int rdma_explicit_destroy(struct ib_uobj ret = uobject->type->type_class->remove_commit (uobject,RDMA_REMOVE_DESTROY );if (ret) -return ret; + goto out; uobject->type = &null_obj_type; +out:up_read (&ucontext->cleanup_rwsem); -return 0 ; +return ret; }static void alloc_commit_idr_uobject (struct ib_uobject *uobj)
Greg Kroah-Hartman
maintainerPATCH 80/496 arm64: dts: rockchip: Fix DWMMC clocks
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robin Murphy <[email protected]>
[ Upstream commit ca9eee95a2decc6f60bed65b5b836a26bff825c1 ]
Trying to boot an RK3328 box with an HS200-capable eMMC, I see said eMMC fail to initialise as it can't run its tuning procedure, because the sample clock is missing. Upon closer inspection, whilst the clock is present in the DT, its name is subtly incorrect per the binding, so __of_clk_get_by_name() never finds it. By inspection, the drive clock suffers from a similar problem, so has never worked properly either.
Fix up all instances of the incorrect clock names across the 64-bit DTs.
--- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 6 +++--- arch/arm64/boot/dts/rockchip/rk3368.dtsi | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/rockchip/rk3328.dtsi +3 -3
@@ -683,7 +683,7 @@ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>, <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>; - clock-names = "biu", "ciu", "ciu_drv", "ciu_sample"; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; status = "disabled"; };
@@ -694,7 +694,7 @@ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>, <&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>; - clock-names = "biu", "ciu", "ciu_drv", "ciu_sample"; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; status = "disabled"; };
@@ -705,7 +705,7 @@ interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>, <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>; - clock-names = "biu", "ciu", "ciu_drv", "ciu_sample"; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; status = "disabled"; };
arch/arm64/boot/dts/rockchip/rk3368.dtsi +1 -1
@@ -257,7 +257,7 @@ max-frequency = <150000000>; clocks = <&cru HCLK_SDIO0>, <&cru SCLK_SDIO0>, <&cru SCLK_SDIO0_DRV>, <&cru SCLK_SDIO0_SAMPLE>; - clock-names = "biu", "ciu", "ciu_drv", "ciu_sample"; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>; resets = <&cru SRST_SDIO0>;
Greg Kroah-Hartman
maintainerPATCH 81/496 ARM: dts: rockchip: Fix DWMMC clocks
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robin Murphy <[email protected]>
[ Upstream commit e78c637127ee7683d606737f2e62b5da6fd7b1c3 ]
Trying to boot an RK3328 box with an HS200-capable eMMC, I see said eMMC fail to initialise as it can't run its tuning procedure, because the sample clock is missing. Upon closer inspection, whilst the clock is present in the DT, its name is subtly incorrect per the binding, so __of_clk_get_by_name() never finds it. By inspection, the drive clock suffers from a similar problem, so has never worked properly either.
This error has propagated across the 32-bit DTs too, so fix those up.
--- arch/arm/boot/dts/rk3036.dtsi | 4 ++-- arch/arm/boot/dts/rk322x.dtsi | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-)
arch/arm/boot/dts/rk3036.dtsi +2 -2
@@ -261,7 +261,7 @@ max-frequency = <37500000>; clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>, <&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>; - clock-names = "biu", "ciu", "ciu_drv", "ciu_sample"; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; resets = <&cru SRST_SDIO>;
@@ -279,7 +279,7 @@ max-frequency = <37500000>; clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>, <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>; - clock-names = "biu", "ciu", "ciu_drv", "ciu_sample"; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; default-sample-phase = <158>; disable-wp; dmas = <&pdma 12>;
arch/arm/boot/dts/rk322x.dtsi +3 -3
@@ -600,7 +600,7 @@ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>, <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>; - clock-names = "biu", "ciu", "ciu_drv", "ciu_sample"; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; pinctrl-names = "default"; pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus4>;
@@ -613,7 +613,7 @@ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>, <&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>; - clock-names = "biu", "ciu", "ciu_drv", "ciu_sample"; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; pinctrl-names = "default"; pinctrl-0 = <&sdio_clk &sdio_cmd &sdio_bus4>;
@@ -628,7 +628,7 @@ max-frequency = <37500000>; clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>, <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>; - clock-names = "biu", "ciu", "ciu_drv", "ciu_sample"; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; bus-width = <8>; default-sample-phase = <158>; fifo-depth = <0x100>;
Greg Kroah-Hartman
maintainerPATCH 82/496 iwlwifi: mvm: fix security bug in PN checking
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sara Sharon <[email protected]>
[ Upstream commit 5ab2ba931255d8bf03009c06d58dce97de32797c ]
A previous patch allowed the same PN for packets originating from the same AMSDU by copying PN only for the last packet in the series.
This however is bogus since we cannot assume the last frame will be received on the same queue, and if it is received on a different ueue we will end up not incrementing the PN and possibly let the next packet to have the same PN and pass through.
Change the logic instead to driver explicitly indicate for the second sub frame and on to be allowed to have the same PN as the first subframe. Indicate it to mac80211 as well for the fallback queue.
--- drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 39 +++++++++++++------------- 1 file changed, 20 insertions(+), 19 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +20 -19
@@ -71,6 +71,7 @@ static inline int iwl_mvm_check_pn(strucstruct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;struct ieee80211_rx_status *stats =IEEE80211_SKB_RXCB (skb);struct iwl_mvm_key_pn *ptk_pn; +int res;u8 tid, keyidx;u8 pn[IEEE80211_CCMP_PN_LEN ];u8 *extiv;
@@ -127,12 +128,13 @@ static inline int iwl_mvm_check_pn(struc pn[4 ] = extiv[1 ]; pn[5 ] = extiv[0 ]; -if (memcmp (pn, ptk_pn->q[queue].pn[tid], -IEEE80211_CCMP_PN_LEN ) <=0 ) + res =memcmp (pn, ptk_pn->q[queue].pn[tid],IEEE80211_CCMP_PN_LEN ); +if (res <0 ) +return -1 ; +if (!res && !(stats->flag &RX_FLAG_ALLOW_SAME_PN ))return -1 ; -if (!(stats->flag &RX_FLAG_AMSDU_MORE )) -memcpy (ptk_pn->q[queue].pn[tid], pn,IEEE80211_CCMP_PN_LEN ); +memcpy (ptk_pn->q[queue].pn[tid], pn,IEEE80211_CCMP_PN_LEN ); stats->flag |=RX_FLAG_PN_VALIDATED ;return 0 ;
@@ -310,28 +312,21 @@ static void iwl_mvm_rx_csum(struct ieee8 }/* -* returns true if a packet outside BA session is a duplicate and -* should be dropped +* returns true if a packet is a duplicate and should be dropped. +* Updates AMSDU PN tracking info */ -static bool iwl_mvm_is_nonagg_dup (struct ieee80211_sta *sta,int queue, -struct ieee80211_rx_status *rx_status, -struct ieee80211_hdr *hdr, -struct iwl_rx_mpdu_desc *desc) +static bool iwl_mvm_is_dup (struct ieee80211_sta *sta,int queue, +struct ieee80211_rx_status *rx_status, +struct ieee80211_hdr *hdr, +struct iwl_rx_mpdu_desc *desc) {struct iwl_mvm_sta *mvm_sta;struct iwl_mvm_rxq_dup_data *dup_data; -u8 baid, tid, sub_frame_idx; +u8 tid, sub_frame_idx;if (WARN_ON (IS_ERR_OR_NULL (sta)))return false; - baid = (le32_to_cpu (desc->reorder_data) & -IWL_RX_MPDU_REORDER_BAID_MASK ) >> -IWL_RX_MPDU_REORDER_BAID_SHIFT ; - -if (baid !=IWL_RX_REORDER_DATA_INVALID_BAID ) -return false; - mvm_sta =iwl_mvm_sta_from_mac80211 (sta); dup_data = &mvm_sta->dup_data[queue];
@@ -361,6 +356,12 @@ static bool iwl_mvm_is_nonagg_dup(struct dup_data->last_sub_frame[tid] >= sub_frame_idx))return true; +/* Allow same PN as the first subframe for following sub frames */ +if (dup_data->last_seq[tid] == hdr->seq_ctrl && + sub_frame_idx > dup_data->last_sub_frame[tid] && + desc->mac_flags2 &IWL_RX_MPDU_MFLG2_AMSDU ) + rx_status->flag |=RX_FLAG_ALLOW_SAME_PN ; + dup_data->last_seq[tid] = hdr->seq_ctrl; dup_data->last_sub_frame[tid] = sub_frame_idx;
@@ -929,7 +930,7 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *if (ieee80211_is_data (hdr->frame_control))iwl_mvm_rx_csum (sta, skb, desc); -if (iwl_mvm_is_nonagg_dup (sta, queue, rx_status, hdr, desc)) { +if (iwl_mvm_is_dup (sta, queue, rx_status, hdr, desc)) {kfree_skb (skb); goto out; }
Greg Kroah-Hartman
maintainerPATCH 83/496 iwlwifi: mvm: fix IBSS for devices that support station type API
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sara Sharon <[email protected]>
[ Upstream commit fc07bd8ce19bff9e7479c04077ddb5957d1a27be ]
In IBSS, the mac80211 sets the cab_queue to be invalid.
However, the multicast station uses it, so we need to override it.
A previous patch did it, but it was nested inside the if's and was applied only for legacy FWs that don't support the new station type API, instead of being applied for all paths.
In addition, add a missing NL80211_IFTYPE_ADHOC to the initialization of the queues in iwl_mvm_mac_ctxt_init()
--- drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | 3 +- drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 24 +++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c +2 -1
@@ -438,7 +438,8 @@ int iwl_mvm_mac_ctxt_init(struct iwl_mvm }/* Allocate the CAB queue for softAP and GO interfaces */ -if (vif->type ==NL80211_IFTYPE_AP ) { +if (vif->type ==NL80211_IFTYPE_AP || + vif->type ==NL80211_IFTYPE_ADHOC ) {/* * For TVQM this will be overwritten later with the FW assigned * queue value (when queue is enabled).
drivers/net/wireless/intel/iwlwifi/mvm/sta.c +12 -12
@@ -2037,6 +2037,17 @@ int iwl_mvm_add_mcast_sta(struct iwl_mvmreturn -ENOTSUPP ;/* +* In IBSS, ieee80211_check_queues() sets the cab_queue to be +* invalid, so make sure we use the queue we want. +* Note that this is done here as we want to avoid making DQA +* changes in mac80211 layer. +*/ +if (vif->type ==NL80211_IFTYPE_ADHOC ) { + vif->cab_queue =IWL_MVM_DQA_GCAST_QUEUE ; + mvmvif->cab_queue = vif->cab_queue; + } + +/* * While in previous FWs we had to exclude cab queue from TFD queue * mask, now it is needed as any other queue. */
@@ -2067,20 +2078,9 @@ int iwl_mvm_add_mcast_sta(struct iwl_mvm timeout); mvmvif->cab_queue = queue; }else if (!fw_has_api (&mvm->fw->ucode_capa, -IWL_UCODE_TLV_API_STA_TYPE )) { -/* -* In IBSS, ieee80211_check_queues() sets the cab_queue to be -* invalid, so make sure we use the queue we want. -* Note that this is done here as we want to avoid making DQA -* changes in mac80211 layer. -*/ -if (vif->type ==NL80211_IFTYPE_ADHOC ) { - vif->cab_queue =IWL_MVM_DQA_GCAST_QUEUE ; - mvmvif->cab_queue = vif->cab_queue; - } +IWL_UCODE_TLV_API_STA_TYPE ))iwl_mvm_enable_txq (mvm, vif->cab_queue, vif->cab_queue,0 , &cfg, timeout); - }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 84/496 iwlwifi: mvm: always init rs with 20mhz bandwidth rates
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naftali Goldstein <[email protected]>
[ Upstream commit 6b7a5aea71b342ec0593d23b08383e1f33da4c9a ]
In AP mode, when a new station associates, rs is initialized immediately upon association completion, before the phy context is updated with the association parameters, so the sta bandwidth might be wider than the phy context allows.
To avoid this issue, always initialize rs with 20mhz bandwidth rate, and after authorization, when the phy context is already up-to-date, re-init rs with the correct bw.
--- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 4 +++ drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 28 +++++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +4 -0
@@ -2703,6 +2703,10 @@ static int iwl_mvm_mac_sta_state(struct/* enable beacon filtering */ WARN_ON (iwl_mvm_enable_beacon_filter (mvm, vif,0 )); + +iwl_mvm_rs_rate_init (mvm, sta, mvmvif->phy_ctxt->channel->band, + false); + ret =0 ; }else if (old_state ==IEEE80211_STA_AUTHORIZED && new_state ==IEEE80211_STA_ASSOC ) {
drivers/net/wireless/intel/iwlwifi/mvm/rs.c +20 -8
@@ -2690,7 +2690,8 @@ static void rs_get_initial_rate(struct istruct ieee80211_sta *sta, struct iwl_lq_sta *lq_sta, enum nl80211_band band, - struct rs_rate *rate) + struct rs_rate *rate, + bool init) { int i, nentries;unsigned long active_rate;
@@ -2744,14 +2745,25 @@ static void rs_get_initial_rate(struct i*/ if (sta->vht_cap.vht_supported && best_rssi >IWL_RS_LOW_RSSI_THRESHOLD ) { -switch (sta->bandwidth) { -case IEEE80211_STA_RX_BW_160 : -case IEEE80211_STA_RX_BW_80 : -case IEEE80211_STA_RX_BW_40 : +/* +* In AP mode, when a new station associates, rs is initialized +* immediately upon association completion, before the phy +* context is updated with the association parameters, so the +* sta bandwidth might be wider than the phy context allows. +* To avoid this issue, always initialize rs with 20mhz +* bandwidth rate, and after authorization, when the phy context +* is already up-to-date, re-init rs with the correct bw. +*/ +u32 bw = init ?RATE_MCS_CHAN_WIDTH_20 :rs_bw_from_sta_bw (sta); + +switch (bw) { +case RATE_MCS_CHAN_WIDTH_40 : +case RATE_MCS_CHAN_WIDTH_80 : +case RATE_MCS_CHAN_WIDTH_160 : initial_rates = rs_optimal_rates_vht; nentries =ARRAY_SIZE (rs_optimal_rates_vht);break ; -case IEEE80211_STA_RX_BW_20 : +case RATE_MCS_CHAN_WIDTH_20 : initial_rates = rs_optimal_rates_vht_20mhz; nentries =ARRAY_SIZE (rs_optimal_rates_vht_20mhz);break ;
@@ -2762,7 +2774,7 @@ static void rs_get_initial_rate(struct i active_rate = lq_sta->active_siso_rate; rate->type =LQ_VHT_SISO ; - rate->bw =rs_bw_from_sta_bw (sta); + rate->bw = bw; }else if (sta->ht_cap.ht_supported && best_rssi >IWL_RS_LOW_RSSI_THRESHOLD ) { initial_rates = rs_optimal_rates_ht;
@@ -2844,7 +2856,7 @@ static void rs_initialize_lq(struct iwl_ tbl = &(lq_sta->lq_info[active_tbl]); rate = &tbl->rate; -rs_get_initial_rate (mvm, sta, lq_sta, band, rate); +rs_get_initial_rate (mvm, sta, lq_sta, band, rate, init);rs_init_optimal_rate (mvm, sta, lq_sta); WARN_ONCE(rate->ant != ANT_A && rate->ant != ANT_B,
Greg Kroah-Hartman
maintainerPATCH 85/496 NFC: llcp: Limit size of SDP URI
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit fe9c842695e26d8116b61b80bfb905356f07834b ]
The tlv_len is u8, so we need to limit the size of the SDP URI. Enforce this both in the NLA policy and in the code that performs the allocation and copy, to avoid writing past the end of the allocated buffer.
--- net/nfc/llcp_commands.c | 4 ++++ net/nfc/netlink.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-)
net/nfc/llcp_commands.c +4 -0
@@ -149,6 +149,10 @@ struct nfc_llcp_sdp_tlv *nfc_llcp_build_pr_debug ("uri: %s, len: %zu\n" , uri, uri_len); +/* sdreq->tlv_len is u8, takes uri_len, + 3 for header, + 1 for NULL */ +if (WARN_ON_ONCE (uri_len >U8_MAX -4 )) +return NULL ; + sdreq =kzalloc (sizeof (struct nfc_llcp_sdp_tlv ),GFP_KERNEL );if (sdreq ==NULL )return NULL ;
net/nfc/netlink.c +2 -1
@@ -61,7 +61,8 @@ static const struct nla_policy nfc_genl_ };static const struct nla_policy nfc_sdp_genl_policy[NFC_SDP_ATTR_MAX +1 ] = { - [NFC_SDP_ATTR_URI ] = { .type =NLA_STRING }, + [NFC_SDP_ATTR_URI ] = { .type =NLA_STRING , + .len =U8_MAX -4 }, [NFC_SDP_ATTR_SAP ] = { .type =NLA_U8 }, };
Greg Kroah-Hartman
maintainerPATCH 86/496 rxrpc: Work around usercopy check
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit a16b8d0cf2ec1e626d24bc2a7b9e64ace6f7501d ]
Due to a check recently added to copy_to_user(), it's now not permitted to copy from slab-held data to userspace unless the slab is whitelisted. This affects rxrpc_recvmsg() when it attempts to place an RXRPC_USER_CALL_ID control message in the userspace control message buffer. A warning is generated by usercopy_warn() because the source is the copy of the user_call_ID retained in the rxrpc_call struct.
Work around the issue by copying the user_call_ID to a variable on the stack and passing that to put_cmsg().
The warning generated looks like:
Bad or missing usercopy whitelist? Kernel memory exposure attempt detected from SLUB object 'dmaengine-unmap-128' (offset 680, size 8)! WARNING: CPU: 0 PID: 1401 at mm/usercopy.c:81 usercopy_warn+0x7e/0xa0 ... RIP: 0010:usercopy_warn+0x7e/0xa0 ... Call Trace: __check_object_size+0x9c/0x1a0 put_cmsg+0x98/0x120 rxrpc_recvmsg+0x6fc/0x1010 [rxrpc] ? finish_wait+0x80/0x80 ___sys_recvmsg+0xf8/0x240 ? __clear_rsb+0x25/0x3d ? __clear_rsb+0x15/0x3d ? __clear_rsb+0x25/0x3d ? __clear_rsb+0x15/0x3d ? __clear_rsb+0x25/0x3d ? __clear_rsb+0x15/0x3d ? __clear_rsb+0x25/0x3d ? __clear_rsb+0x15/0x3d ? finish_task_switch+0xa6/0x2b0 ? trace_hardirqs_on_caller+0xed/0x180 ? _raw_spin_unlock_irq+0x29/0x40 ? __sys_recvmsg+0x4e/0x90 __sys_recvmsg+0x4e/0x90 do_syscall_64+0x7a/0x220 entry_SYSCALL_64_after_hwframe+0x26/0x9b
--- net/rxrpc/recvmsg.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/rxrpc/recvmsg.c +3 -2
@@ -513,9 +513,10 @@ try_again: ret =put_cmsg (msg,SOL_RXRPC ,RXRPC_USER_CALL_ID ,sizeof (unsigned int ), &id32); }else { +unsigned long idl = call->user_call_ID; + ret =put_cmsg (msg,SOL_RXRPC ,RXRPC_USER_CALL_ID , -sizeof (unsigned long ), - &call->user_call_ID); +sizeof (unsigned long ), &idl); }if (ret <0 ) goto error_unlock_call;
Greg Kroah-Hartman
maintainerPATCH 87/496 MD: Free bioset when md_run fails
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiao Ni <[email protected]>
[ Upstream commit b126194cbb799f9980b92a77e58db6ad794c8082 ]
--- drivers/md/md.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-)
drivers/md/md.c +21 -5
@@ -5479,8 +5479,10 @@ int md_run(struct mddev *mddev) }if (mddev->sync_set ==NULL ) { mddev->sync_set =bioset_create (BIO_POOL_SIZE ,0 ,BIOSET_NEED_BVECS ); -if (!mddev->sync_set) -return -ENOMEM ; +if (!mddev->sync_set) { + err = -ENOMEM ; + goto abort; + } }spin_lock (&pers_lock);
@@ -5493,7 +5495,8 @@ int md_run(struct mddev *mddev)else pr_warn ("md: personality for level %s is not loaded!\n" , mddev->clevel); -return -EINVAL ; + err = -EINVAL ; + goto abort; }spin_unlock (&pers_lock);if (mddev->level != pers->level) {
@@ -5506,7 +5509,8 @@ int md_run(struct mddev *mddev) pers->start_reshape == NULL) {/* This personality cannot handle reshaping... */ module_put (pers->owner); -return -EINVAL ; + err = -EINVAL ; + goto abort; }if (pers->sync_request) {
@@ -5580,7 +5584,7 @@ int md_run(struct mddev *mddev) mddev->private =NULL ;module_put (pers->owner);bitmap_destroy (mddev); -return err; + goto abort; }if (mddev->queue) {bool nonrot = true;
@@ -5642,6 +5646,18 @@ int md_run(struct mddev *mddev)sysfs_notify_dirent_safe (mddev->sysfs_action);sysfs_notify (&mddev->kobj,NULL ,"degraded" );return 0 ; + +abort: +if (mddev->bio_set) { +bioset_free (mddev->bio_set); + mddev->bio_set =NULL ; + } +if (mddev->sync_set) { +bioset_free (mddev->sync_set); + mddev->sync_set =NULL ; + } + +return err; }EXPORT_SYMBOL_GPL (md_run);
Greg Kroah-Hartman
maintainerPATCH 88/496 md: fix md_write_start() deadlock w/o metadata devices
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heinz Mauelshagen <[email protected]>
[ Upstream commit 4b6c1060eaa6495aa5b0032e8f2d51dd936b1257 ]
If no metadata devices are configured on raid1/4/5/6/10 (e.g. via dm-raid), md_write_start() unconditionally waits for superblocks to be written thus deadlocking.
Fix introduces mddev->has_superblocks bool, defines it in md_run() and checks for it in md_write_start() to conditionally avoid waiting.
Once on it, check for non-existing superblocks in md_super_write().
--- drivers/md/md.c | 10 ++++++++++ drivers/md/md.h | 2 ++ 2 files changed, 12 insertions(+)
drivers/md/md.c +10 -0
@@ -779,6 +779,9 @@ void md_super_write(struct mddev *mddev,struct bio *bio;int ff =0 ; +if (!page) +return ; +if (test_bit (Faulty, &rdev->flags))return ;
@@ -5434,6 +5437,7 @@ int md_run(struct mddev *mddev)* the only valid external interface is through the md * device. */ + mddev->has_superblocks = false;rdev_for_each (rdev, mddev) {if (test_bit (Faulty, &rdev->flags))continue ;
@@ -5447,6 +5451,9 @@ int md_run(struct mddev *mddev)set_disk_ro (mddev->gendisk,1 ); } +if (rdev->sb_page) + mddev->has_superblocks = true; +/* perform some consistency tests on the device. * We don't want the data to overlap the metadata, * Internal Bitmap issues have been handled elsewhere.
@@ -8022,6 +8029,7 @@ EXPORT_SYMBOL(md_done_sync);bool md_write_start (struct mddev *mddev,struct bio *bi) {int did_change =0 ; +if (bio_data_dir (bi) !=WRITE )return true;
@@ -8054,6 +8062,8 @@ bool md_write_start(struct mddev *mddev,rcu_read_unlock ();if (did_change)sysfs_notify_dirent_safe (mddev->sysfs_state); +if (!mddev->has_superblocks) +return true;wait_event (mddev->sb_wait, !test_bit (MD_SB_CHANGE_PENDING , &mddev->sb_flags) || mddev->suspended);
drivers/md/md.h +2 -0
@@ -462,6 +462,8 @@ struct mddev {void (*sync_super)(struct mddev *mddev,struct md_rdev *rdev);struct md_cluster_info *cluster_info;unsigned int good_device_nr;/* good device num within cluster raid */ + + bool has_superblocks:1; };enum recovery_flags {
Greg Kroah-Hartman
maintainerPATCH 89/496 s390/dasd: fix handling of internal requests
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Haberland <[email protected]>
[ Upstream commit 9487cfd3430d07366801886bdf185799a2b6f066 ]
Internal DASD device driver I/O such as query host access count or path verification is started using the _sleep_on() function. To mark a request as started or ended the callback_data is set to either DASD_SLEEPON_START_TAG or DASD_SLEEPON_END_TAG.
In cases where the request has to be stopped unconditionally the status is set to DASD_SLEEPON_END_TAG as well which leads to immediate clearing of the request.
But the request might still be on a device request queue for normal operation which might lead to a panic because of a BUG() statement in __dasd_device_process_final_queue() or a list corruption of the device request queue.
Fix by removing the setting of DASD_SLEEPON_END_TAG in the dasd_cancel_req() and dasd_generic_requeue_all_requests() functions and ensure that the request is not deleted in the requeue function. Trigger the device tasklet in the requeue function and let the normal processing cleanup the request.
--- drivers/s390/block/dasd.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-)
drivers/s390/block/dasd.c +7 -14
@@ -2596,8 +2596,6 @@ int dasd_cancel_req(struct dasd_ccw_reqcase DASD_CQR_QUEUED :/* request was not started - just set to cleared */ cqr->status =DASD_CQR_CLEARED ; -if (cqr->callback_data ==DASD_SLEEPON_START_TAG ) - cqr->callback_data =DASD_SLEEPON_END_TAG ;break ;case DASD_CQR_IN_IO :/* request in IO - terminate IO and release again */
@@ -3917,9 +3915,12 @@ static int dasd_generic_requeue_all_requwait_event (dasd_flush_wq, (cqr->status !=DASD_CQR_CLEAR_PENDING )); -/* mark sleepon requests as ended */ -if (cqr->callback_data ==DASD_SLEEPON_START_TAG ) - cqr->callback_data =DASD_SLEEPON_END_TAG ; +/* +* requeue requests to blocklayer will only work +* for block device requests +*/ +if (_dasd_requeue_request (cqr)) +continue ;/* remove requests from device and block queue */ list_del_init (&cqr->devlist);
@@ -3932,13 +3933,6 @@ static int dasd_generic_requeue_all_requ cqr = refers; } -/* -* requeue requests to blocklayer will only work -* for block device requests -*/ -if (_dasd_requeue_request (cqr)) -continue ; -if (cqr->block)list_del_init (&cqr->blocklist); cqr->block->base->discipline->free_cp(
@@ -3955,8 +3949,7 @@ static int dasd_generic_requeue_all_requlist_splice_tail (&requeue_queue, &device->ccw_queue);spin_unlock_irq (get_ccwdev_lock (device->cdev)); } -/* wake up generic waitqueue for eventually ended sleepon requests */ -wake_up (&generic_waitq); +dasd_schedule_device_bh (device);return rc; }
Greg Kroah-Hartman
maintainerPATCH 90/496 xfrm: do not call rcu_read_unlock when afinfo is NULL in xfrm_get_tos
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit 143a4454daaf0e80a2b9f37159a0d6d2b61e64ed ]
When xfrm_policy_get_afinfo returns NULL, it will not hold rcu read lock. In this case, rcu_read_unlock should not be called in xfrm_get_tos, just like other places where it's calling xfrm_policy_get_afinfo.
--- net/xfrm/xfrm_policy.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/xfrm/xfrm_policy.c +5 -2
@@ -1459,10 +1459,13 @@ xfrm_tmpl_resolve(struct xfrm_policy **pstatic int xfrm_get_tos (const struct flowi *fl,int family) {const struct xfrm_policy_afinfo *afinfo; -int tos =0 ; +int tos; afinfo =xfrm_policy_get_afinfo (family); - tos = afinfo ? afinfo->get_tos (fl) :0 ; +if (!afinfo) +return 0 ; + + tos = afinfo->get_tos (fl);rcu_read_unlock ();
Greg Kroah-Hartman
maintainerPATCH 91/496 mac80211: round IEEE80211_TX_STATUS_HEADROOM up to multiple of 4
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit 651b9920d7a694ffb1f885aef2bbb068a25d9d66 ]
This ensures that mac80211 allocated management frames are properly aligned, which makes copying them more efficient.
For instance, mt76 uses iowrite32_copy to copy beacon frames to beacon template memory on the chip.
Misaligned 32-bit accesses cause CPU exceptions on MIPS and should be avoided.
--- include/net/mac80211.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/mac80211.h +1 -1
@@ -4141,7 +4141,7 @@ void ieee80211_sta_uapsd_trigger(struct* The TX headroom reserved by mac80211 for its own tx_status functions. * This is enough for the radiotap header. */ -#define IEEE80211_TX_STATUS_HEADROOM 14 +#define IEEE80211_TX_STATUS_HEADROOM ALIGN(14, 4)/** * ieee80211_sta_set_buffered - inform mac80211 about driver-buffered frames
Greg Kroah-Hartman
maintainerPATCH 92/496 mac80211: fix a possible leak of station stats
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sara Sharon <[email protected]>
[ Upstream commit d78d9ee9d40aca4781d2c5334972544601a4c3a2 ]
If sta_info_alloc fails after allocating the per CPU statistics, they are not properly freed.
--- net/mac80211/sta_info.c | 1 + 1 file changed, 1 insertion(+)
net/mac80211/sta_info.c +1 -0
@@ -439,6 +439,7 @@ free_txq:if (sta->sta.txq[0 ])kfree (to_txq_info (sta->sta.txq[0 ])); free: +free_percpu (sta->pcpu_rx_stats);#ifdef CONFIG_MAC80211_MESH kfree (sta->mesh);#endif
Greg Kroah-Hartman
maintainerPATCH 93/496 mac80211: fix calling sleeping function in atomic context
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sara Sharon <[email protected]>
[ Upstream commit 95f3ce6a77893ac828ba841df44421620de4314b ]
sta_info_alloc can be called from atomic paths (such as RX path) so we need to call pcpu_alloc with the correct gfp.
--- net/mac80211/sta_info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac80211/sta_info.c +1 -1
@@ -314,7 +314,7 @@ struct sta_info *sta_info_alloc(struct iif (ieee80211_hw_check (hw,USES_RSS )) { sta->pcpu_rx_stats = - alloc_percpu(struct ieee80211_sta_rx_stats); + alloc_percpu_gfp(struct ieee80211_sta_rx_stats, gfp);if (!sta->pcpu_rx_stats) goto free; }
Greg Kroah-Hartman
maintainerPATCH 94/496 cfg80211: clear wep keys after disconnection
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avraham Stern <[email protected]>
[ Upstream commit 3027a8e799b20fc922496a12f8ad2f9f36a8a696 ]
When a low level driver calls cfg80211_disconnected(), wep keys are not cleared. As a result, following connection requests will fail since cfg80211 internal state shows a connection is still in progress.
Fix this by clearing the wep keys when disconnecting.
--- net/wireless/sme.c | 2 ++ 1 file changed, 2 insertions(+)
net/wireless/sme.c +2 -0
@@ -989,6 +989,8 @@ void __cfg80211_disconnected(struct net_ wdev->current_bss =NULL ; wdev->ssid_len =0 ; wdev->conn_owner_nlportid =0 ; +kzfree (wdev->connect_keys); + wdev->connect_keys =NULL ;nl80211_send_disconnected (rdev, dev, reason, ie, ie_len, from_ap);
Greg Kroah-Hartman
maintainerPATCH 95/496 mac80211: Do not disconnect on invalid operating class
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilan Peer <[email protected]>
[ Upstream commit 191da271ac260700db3e5b4bb982a17ca78769d6 ]
Some APs include a non global operating class in their extended channel switch information element. In such a case, as the operating class is not known, mac80211 would decide to disconnect.
However the specification states that the operating class needs to be taken from Annex E, but it does not specify from which table it should be taken, so it is valid for an AP to use a non global operating class.
To avoid possibly unneeded disconnection, in such a case ignore the operating class and assume that the current band is used, and if the resulting channel and band configuration is invalid disconnect.
--- net/mac80211/spectmgmt.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/mac80211/spectmgmt.c +3 -4
@@ -8,6 +8,7 @@* Copyright 2007, Michael Wu <[email protected]> * Copyright 2007-2008, Intel Corporation * Copyright 2008, Johannes Berg <[email protected]> +* Copyright (C) 2018 Intel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as
@@ -27,7 +28,7 @@ int ieee80211_parse_ch_switch_ie(struct u32 sta_flags, u8 *bssid, struct ieee80211_csa_ie *csa_ie) { - enum nl80211_band new_band; + enum nl80211_band new_band = current_band;int new_freq;u8 new_chan_no;struct ieee80211_channel *new_chan;
@@ -55,15 +56,13 @@ int ieee80211_parse_ch_switch_ie(struct elems->ext_chansw_ie->new_operating_class, &new_band)) {sdata_info (sdata, -"cannot understand ECSA IE operating class %d, disconnecting\n" , +"cannot understand ECSA IE operating class, %d, ignoring\n" , elems->ext_chansw_ie->new_operating_class); -return -EINVAL ; } new_chan_no = elems->ext_chansw_ie->new_ch_num; csa_ie->count = elems->ext_chansw_ie->count; csa_ie->mode = elems->ext_chansw_ie->mode; }else if (elems->ch_switch_ie) { - new_band = current_band; new_chan_no = elems->ch_switch_ie->new_ch_num; csa_ie->count = elems->ch_switch_ie->count; csa_ie->mode = elems->ch_switch_ie->mode;
Greg Kroah-Hartman
maintainerPATCH 96/496 mac80211: Fix sending ADDBA response for an ongoing session
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilan Peer <[email protected]>
[ Upstream commit 3b07029729e347f288c70227cfe3c66b085d6b0b ]
In case an ADDBA request is received while there is already an ongoing BA sessions with the same parameters, i.e., update flow, an ADBBA response with decline status was sent twice. Fix it.
--- net/mac80211/agg-rx.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
net/mac80211/agg-rx.c +1 -3
@@ -8,6 +8,7 @@* Copyright 2007, Michael Wu <[email protected]> * Copyright 2007-2010, Intel Corporation * Copyright(c) 2015-2017 Intel Deutschland GmbH +* Copyright (C) 2018 Intel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as
@@ -322,9 +323,6 @@ void ___ieee80211_start_rx_ba_session(st* driver so reject the timeout update. */ status =WLAN_STATUS_REQUEST_DECLINED ; -ieee80211_send_addba_resp (sta->sdata, sta->sta.addr, - tid, dialog_token, status, -1 , buf_size, timeout); goto end; }
Greg Kroah-Hartman
maintainerPATCH 97/496 gpu: ipu-v3: pre: fix device node leak in ipu_pre_lookup_by_phandle
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tobias Jordan <[email protected]>
[ Upstream commit c795f3052b60b01e80485fad98c53e5e67d093c9 ]
Before returning, call of_node_put() for the device node returned by of_parse_phandle().
--- drivers/gpu/ipu-v3/ipu-pre.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/ipu-v3/ipu-pre.c +3 -0
@@ -125,11 +125,14 @@ ipu_pre_lookup_by_phandle(struct deviceif (pre_node == pre->dev->of_node) {mutex_unlock (&ipu_pre_list_mutex);device_link_add (dev, pre->dev,DL_FLAG_AUTOREMOVE ); +of_node_put (pre_node);return pre; } }mutex_unlock (&ipu_pre_list_mutex); +of_node_put (pre_node); +return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 98/496 gpu: ipu-v3: prg: fix device node leak in ipu_prg_lookup_by_phandle
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tobias Jordan <[email protected]>
[ Upstream commit 3addaba8141bc6a4f649a48f46e552af32922147 ]
Before returning, call of_node_put() for the device node returned by of_parse_phandle().
--- drivers/gpu/ipu-v3/ipu-prg.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/ipu-v3/ipu-prg.c +3 -0
@@ -101,11 +101,14 @@ ipu_prg_lookup_by_phandle(struct devicemutex_unlock (&ipu_prg_list_mutex);device_link_add (dev, prg->dev,DL_FLAG_AUTOREMOVE ); prg->id = ipu_id; +of_node_put (prg_node);return prg; } }mutex_unlock (&ipu_prg_list_mutex); +of_node_put (prg_node); +return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 99/496 md raid10: fix NULL deference in handle_write_completed()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yufen Yu <[email protected]>
[ Upstream commit 01a69cab01c184d3786af09e9339311123d63d22 ]
In the case of 'recover', an r10bio with R10BIO_WriteError & R10BIO_IsRecover will be progressed by handle_write_completed(). This function traverses all r10bio->devs[copies].
If devs[m].repl_bio != NULL, it thinks conf->mirrors[dev].replacement is also not NULL. However, this is not always true.
When there is an rdev of raid10 has replacement, then each r10bio ->devs[m].repl_bio != NULL in conf->r10buf_pool. However, in 'recover', even if corresponded replacement is NULL, it doesn't clear r10bio ->devs[m].repl_bio, resulting in replacement NULL deference.
This bug was introduced when replacement support for raid10 was added in Linux 3.3.
As NeilBrown suggested:
Elsewhere the determination of "is this device part of the resync/recovery" is made by resting bio->bi_end_io. If this is end_sync_write, then we tried to write here. If it is NULL, then we didn't try to write.
--- drivers/md/raid10.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/md/raid10.c +4 -2
@@ -2625,7 +2625,8 @@ static void handle_write_completed(strucfor (m =0 ; m < conf->copies; m++) {int dev = r10_bio->devs[m].devnum; rdev = conf->mirrors[dev].rdev; -if (r10_bio->devs[m].bio ==NULL ) +if (r10_bio->devs[m].bio ==NULL || + r10_bio->devs[m].bio->bi_end_io ==NULL )continue ;if (!r10_bio->devs[m].bio->bi_status) { rdev_clear_badblocks(
@@ -2640,7 +2641,8 @@ static void handle_write_completed(strucmd_error (conf->mddev, rdev); } rdev = conf->mirrors[dev].replacement; -if (r10_bio->devs[m].repl_bio ==NULL ) +if (r10_bio->devs[m].repl_bio ==NULL || + r10_bio->devs[m].repl_bio->bi_end_io ==NULL )continue ;if (!r10_bio->devs[m].repl_bio->bi_status) {
Greg Kroah-Hartman
maintainerPATCH 100/496 drm/exynos: g2d: use monotonic timestamps
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit a588a8bb7b25a3fb4f7fed00feb7aec541fc2632 ]
The exynos DRM driver uses real-time 'struct timeval' values for exporting its timestamps to user space. This has multiple problems:
1. signed seconds overflow in y2038
2. the 'struct timeval' definition is deprecated in the kernel
3. time may jump or go backwards after a 'settimeofday()' syscall
4. other DRM timestamps are in CLOCK_MONOTONIC domain, so they can't be compared
5. exporting microseconds requires a division by 1000, which may be slow on some architectures.
The code existed in two places before, but the IPP portion was removed in 8ded59413ccc ("drm/exynos: ipp: Remove Exynos DRM IPP subsystem"), so we no longer need to worry about it.
Ideally timestamps should just use 64-bit nanoseconds instead, but of course we can't change that now. Instead, this tries to address the first four points above by using monotonic 'timespec' values.
According to Tobias Jakobi, user space doesn't care about the timestamp at the moment, so we can change the format. Even if there is something looking at them, it will work just fine with monotonic times as long as the application only looks at the relative values between two events.
--- drivers/gpu/drm/exynos/exynos_drm_g2d.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/exynos/exynos_drm_g2d.c +3 -3
@@ -926,7 +926,7 @@ static void g2d_finish_event(struct g2d_struct drm_device *drm_dev = g2d->subdrv.drm_dev;struct g2d_runqueue_node *runqueue_node = g2d->runqueue_node;struct drm_exynos_pending_g2d_event *e; -struct timeval now; +struct timespec64 now;if (list_empty (&runqueue_node->event_list))return ;
@@ -934,9 +934,9 @@ static void g2d_finish_event(struct g2d_ e =list_first_entry (&runqueue_node->event_list, struct drm_exynos_pending_g2d_event, base.link); -do_gettimeofday (&now); +ktime_get_ts64 (&now); e->event.tv_sec = now.tv_sec; - e->event.tv_usec = now.tv_usec; + e->event.tv_usec = now.tv_nsec /NSEC_PER_USEC ; e->event.cmdlist_no = cmdlist_no;drm_send_event (drm_dev, &e->base);
Greg Kroah-Hartman
maintainerPATCH 101/496 drm/exynos: fix comparison to bitshift when dealing with a mask
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wolfram Sang <[email protected]>
[ Upstream commit 1293b6191010672c0c9dacae8f71c6f3e4d70cbe ]
Due to a typo, the mask was destroyed by a comparison instead of a bit shift.
--- drivers/gpu/drm/exynos/regs-fimc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/exynos/regs-fimc.h +1 -1
@@ -569,7 +569,7 @@#define EXYNOS_CIIMGEFF_FIN_EMBOSSING (4 << 26)#define EXYNOS_CIIMGEFF_FIN_SILHOUETTE (5 << 26)#define EXYNOS_CIIMGEFF_FIN_MASK (7 << 26) -#define EXYNOS_CIIMGEFF_PAT_CBCR_MASK ((0xff < 13) | (0xff < 0)) +#define EXYNOS_CIIMGEFF_PAT_CBCR_MASK ((0xff << 13) | (0xff << 0))/* Real input DMA size register */ #define EXYNOS_CIREAL_ISIZE_AUTOLOAD_ENABLE (1 << 31)
Greg Kroah-Hartman
maintainerPATCH 102/496 drm/exynos: g2d: Delete an error message for a failed memory allocation in two functions
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Elfring <[email protected]>
[ Upstream commit 6f0a60298bbbea43ab5e3955913ab19c153076f3 ]
Omit an extra message for a memory allocation failure in these functions.
This issue was detected by using the Coccinelle software.
--- drivers/gpu/drm/exynos/exynos_drm_g2d.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/gpu/drm/exynos/exynos_drm_g2d.c +2 -4
@@ -286,7 +286,6 @@ static int g2d_init_cmdlist(struct g2d_d node =kcalloc (G2D_CMDLIST_NUM ,sizeof (*node),GFP_KERNEL );if (!node) { -dev_err (dev,"failed to allocate memory\n" ); ret = -ENOMEM ; goto err; }
@@ -1358,10 +1357,9 @@ int exynos_g2d_exec_ioctl(struct drm_devreturn -EFAULT ; runqueue_node =kmem_cache_alloc (g2d->runqueue_slab,GFP_KERNEL ); -if (!runqueue_node) { -dev_err (dev,"failed to allocate memory\n" ); +if (!runqueue_node)return -ENOMEM ; - } + run_cmdlist = &runqueue_node->run_cmdlist; event_list = &runqueue_node->event_list;INIT_LIST_HEAD (run_cmdlist);
Re: [PATCH 4.14 102/496] drm/exynos: g2d: Delete an error message for a failed memory allocation in two functions
Quoted 5 lines · Greg Kroah-Hartman
4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Elfring <[email protected]>
I still wonder why any Markus Elfring patch should be applied to a stable branch.
The only reason I could believe is it would make
forward porting of an actually useful fix easier.
Does this?
Quoted 39 lines
[ Upstream commit
6f0a60298bbbea43ab5e3955913ab19c153076f3]Omit an extra message for a memory allocation failure in these functions.
This issue was detected by using the Coccinelle software.
Signed-off-by Markus Elfring <[email protected]>Signed-off-by Inki Dae <[email protected]>Signed-off-by Sasha Levin <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/gpu/drm/exynos/exynos_drm_g2d.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)drivers/gpu/drm/exynos/exynos_drm_g2d.c +2
-4@@ -286,7 +286,6 @@ static int g2d_init_cmdlist(struct g2d_d node =kcalloc (G2D_CMDLIST_NUM ,sizeof (*node),GFP_KERNEL );if (!node) { -dev_err (dev,"failed to allocate memory\n" ); ret = -ENOMEM ; goto err; }@@ -1358,10 +1357,9 @@ int exynos_g2d_exec_ioctl(struct drm_devreturn -EFAULT ; runqueue_node =kmem_cache_alloc (g2d->runqueue_slab,GFP_KERNEL ); -if (!runqueue_node) { -dev_err (dev,"failed to allocate memory\n" ); +if (!runqueue_node)return -ENOMEM ; - } + run_cmdlist = &runqueue_node->run_cmdlist; event_list = &runqueue_node->event_list;INIT_LIST_HEAD (run_cmdlist);
Greg Kroah-Hartman
maintainerRe: [PATCH 4.14 102/496] drm/exynos: g2d: Delete an error message for a failed memory allocation in two functions
Quoted 7 lines · Joe Perches
Quoted 5 lines · Greg Kroah-Hartman
4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Elfring <[email protected]>
Quoted 7 lines
I still wonder why any Markus Elfring patch should be applied to a stable branch.
The only reason I could believe is it would make
forward porting of an actually useful fix easier.Does this?
You are correct, it does not look like that at all. I'll go drop it from all of the stable queues.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 103/496 drm/meson: fix vsync buffer update
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Neil Armstrong <[email protected]>
[ Upstream commit e88230a3744a71a0b5ecfb45e08ddfe1c884e50d ]
The plane buffer address/stride/height was incorrectly updated in the plane_atomic_update operation instead of the vsync irq. This patch delays this operation in the vsync irq along with the other plane delayed setup.
This issue was masked using legacy framebuffer and X11 modesetting, but is clearly visible using gbm rendering when buffer is submitted late after vblank, like using software decoding and OpenGL rendering in Kodi. With this patch, tearing and other artifacts disappears completely.
--- drivers/gpu/drm/meson/meson_crtc.c | 6 ++++++ drivers/gpu/drm/meson/meson_drv.h | 3 +++ drivers/gpu/drm/meson/meson_plane.c | 7 +++---- 3 files changed, 12 insertions(+), 4 deletions(-)
drivers/gpu/drm/meson/meson_crtc.c +6 -0
@@ -36,6 +36,7 @@#include "meson_venc.h" #include "meson_vpp.h" #include "meson_viu.h" +#include "meson_canvas.h" #include "meson_registers.h" /* CRTC definition */
@@ -192,6 +193,11 @@ void meson_crtc_irq(struct meson_drm *pr }else meson_vpp_disable_interlace_vscaler_osd1 (priv); +meson_canvas_setup (priv,MESON_CANVAS_ID_OSD1 , + priv->viu.osd1_addr, priv->viu.osd1_stride, + priv->viu.osd1_height,MESON_CANVAS_WRAP_NONE , +MESON_CANVAS_BLKMODE_LINEAR ); +/* Enable OSD1 */ writel_bits_relaxed (VPP_OSD1_POSTBLEND ,VPP_OSD1_POSTBLEND , priv->io_base +_REG (VPP_MISC ));
drivers/gpu/drm/meson/meson_drv.h +3 -0
@@ -43,6 +43,9 @@ struct meson_drm {bool osd1_commit;uint32_t osd1_ctrl_stat;uint32_t osd1_blk0_cfg[5 ]; +uint32_t osd1_addr; +uint32_t osd1_stride; +uint32_t osd1_height; } viu;struct {
drivers/gpu/drm/meson/meson_plane.c +3 -4
@@ -164,10 +164,9 @@ static void meson_plane_atomic_update(st/* Update Canvas with buffer address */ gem =drm_fb_cma_get_gem_obj (fb,0 ); -meson_canvas_setup (priv,MESON_CANVAS_ID_OSD1 , - gem->paddr, fb->pitches[0 ], - fb->height,MESON_CANVAS_WRAP_NONE , -MESON_CANVAS_BLKMODE_LINEAR ); + priv->viu.osd1_addr = gem->paddr; + priv->viu.osd1_stride = fb->pitches[0 ]; + priv->viu.osd1_height = fb->height;spin_unlock_irqrestore (&priv->drm->event_lock, flags); }
Greg Kroah-Hartman
maintainerPATCH 104/496 arm64: perf: correct PMUVer probing
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
[ Upstream commit 0331365edb1d6ccd6ae68b1038111da85d4c68d1 ]
The ID_AA64DFR0_EL1.PMUVer field doesn't follow the usual ID registers scheme. While value 0xf indicates a non-architected PMU is implemented, values 0x1 to 0xe indicate an increasingly featureful architected PMU, as if the field were unsigned.
For more details, see ARM DDI 0487C.a, D10.1.4, "Alternative ID scheme used for the Performance Monitors Extension version".
Currently, we treat the field as signed, and erroneously bail out for values 0x8 to 0xe. Let's correct that.
--- arch/arm64/kernel/perf_event.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/kernel/perf_event.c +2 -2
@@ -914,9 +914,9 @@ static void __armv8pmu_probe_pmu(void *iint pmuver; dfr0 =read_sysreg (id_aa64dfr0_el1); - pmuver =cpuid_feature_extract_signed_field (dfr0, + pmuver =cpuid_feature_extract_unsigned_field (dfr0,ID_AA64DFR0_PMUVER_SHIFT ); -if (pmuver <1 ) +if (pmuver ==0xf || pmuver ==0 )return ; probe->present = true;
Greg Kroah-Hartman
maintainerPATCH 105/496 RDMA/bnxt_re: Unpin SQ and RQ memory if QP create fails
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Devesh Sharma <[email protected]>
[ Upstream commit 6b4521f5174c26020ae0deb3ef7f2c28557cf445 ]
Driver leaves the QP memory pinned if QP create command fails from the FW. Avoids this scenario by adding a proper exit path if the FW command fails.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +8 -1
@@ -1180,7 +1180,7 @@ struct ib_qp *bnxt_re_create_qp(struct i rc =bnxt_qplib_create_qp (&rdev->qplib_res, &qp->qplib_qp);if (rc) {dev_err (rdev_to_dev (rdev),"Failed to create HW QP" ); - goto fail; + goto free_umem; } }
@@ -1208,6 +1208,13 @@ struct ib_qp *bnxt_re_create_qp(struct ireturn &qp->ib_qp; qp_destroy:bnxt_qplib_destroy_qp (&rdev->qplib_res, &qp->qplib_qp); +free_umem: +if (udata) { +if (qp->rumem) +ib_umem_release (qp->rumem); +if (qp->sumem) +ib_umem_release (qp->sumem); + } fail:kfree (qp);return ERR_PTR (rc);
Greg Kroah-Hartman
maintainerPATCH 106/496 RDMA/bnxt_re: Fix system crash during load/unload
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Selvin Xavier <[email protected]>
[ Upstream commit dcdaba08062b4726500b9456f8664bfda896c664 ]
During driver unload, the driver proceeds with cleanup without waiting for the scheduled events. So the device pointers get freed up and driver crashes when the events are scheduled later.
Flush the bnxt_re_task work queue before starting device removal.
--- drivers/infiniband/hw/bnxt_re/main.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/infiniband/hw/bnxt_re/main.c +5 -0
@@ -1398,6 +1398,11 @@ static void __exit bnxt_re_mod_exit(voidlist_for_each_entry (rdev, &to_be_deleted, list) {dev_info (rdev_to_dev (rdev),"Unregistering Device" ); +/* +* Flush out any scheduled tasks before destroying the +* resources +*/ +flush_workqueue (bnxt_re_wq);bnxt_re_dev_stop (rdev);bnxt_re_ib_unreg (rdev, true);bnxt_re_remove_one (rdev);
Greg Kroah-Hartman
maintainerPATCH 107/496 ibmvnic: Check for NULL skbs in NAPI poll routine
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Falcon <[email protected]>
[ Upstream commit abe27a885d9e6575e663a16176dabc58ce9d7188 ]
After introduction of commit d0869c0071e4, there were some instances of RX queue entries from a previous session (before the device was closed and reopened) returned to the NAPI polling routine. Since the corresponding socket buffers were freed, this resulted in a panic on reopen. Include a check for a NULL skb here to avoid this.
--- drivers/net/ethernet/ibm/ibmvnic.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/ibm/ibmvnic.c +5 -0
@@ -1668,6 +1668,11 @@ restart_poll:dev_kfree_skb_any (rx_buff->skb);remove_buff_from_pool (adapter, rx_buff);continue ; + }else if (!rx_buff->skb) { +/* free the entry */ + next->rx_comp.first =0 ; +remove_buff_from_pool (adapter, rx_buff); +continue ; } length =be32_to_cpu (next->rx_comp.len);
Greg Kroah-Hartman
maintainerPATCH 108/496 net/mlx5e: Return error if prio is specified when offloading eswitch vlan push
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Or Gerlitz <[email protected]>
[ Upstream commit 001a2fc0c8cc29241305e44ffbce52d1daf8782b ]
This isn't supported when we emulate eswitch vlan push action which is the current state of things.
--- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +2 -1
@@ -2018,7 +2018,8 @@ static int parse_tc_fdb_actions(struct mif (tcf_vlan_action (a) ==TCA_VLAN_ACT_POP ) { attr->action |=MLX5_FLOW_CONTEXT_ACTION_VLAN_POP ; }else if (tcf_vlan_action (a) ==TCA_VLAN_ACT_PUSH ) { -if (tcf_vlan_push_proto (a) !=htons (ETH_P_8021Q )) +if (tcf_vlan_push_proto (a) !=htons (ETH_P_8021Q ) || +tcf_vlan_push_prio (a))return -EOPNOTSUPP ; attr->action |=MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH ;
Greg Kroah-Hartman
maintainerPATCH 109/496 locking/xchg/alpha: Add unconditional memory barrier to cmpxchg()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrea Parri <[email protected]>
[ Upstream commit cb13b424e986aed68d74cbaec3449ea23c50e167 ]
Continuing along with the fight against smp_read_barrier_depends() [1] (or rather, against its improper use), add an unconditional barrier to cmpxchg. This guarantees that dependency ordering is preserved when a dependency is headed by an unsuccessful cmpxchg. As it turns out, the change could enable further simplification of LKMM as proposed in [2].
[1] https://marc.info/?l=linux-kernel&m=150884953419377&w=2
https://marc.info/?l=linux-kernel&m=150884946319353&w=2 https://marc.info/?l=linux-kernel&m=151215810824468&w=2 https://marc.info/?l=linux-kernel&m=151215816324484&w=2
[2] https://marc.info/?l=linux-kernel&m=151881978314872&w=2
--- arch/alpha/include/asm/xchg.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
arch/alpha/include/asm/xchg.h +7 -8
@@ -128,10 +128,9 @@ ____xchg(, volatile void *ptr, unsigned* store NEW in MEM. Return the initial value in MEM. Success is * indicated by comparing RETURN with OLD. * -* The memory barrier should be placed in SMP only when we actually -* make the change. If we don't change anything (so if the returned -* prev is equal to old) then we aren't acquiring anything new and -* we don't need any memory barrier as far I can tell. +* The memory barrier is placed in SMP unconditionally, in order to +* guarantee that dependency ordering is preserved when a dependency +* is headed by an unsuccessful operation. */ static inline unsigned long
@@ -150,8 +149,8 @@ ____cmpxchg(_u8, volatile char *m, unsig" or %1,%2,%2\n" " stq_c %2,0(%4)\n" " beq %2,3f\n" - __ASM__MB"2:\n" + __ASM__MB".subsection 2\n" "3: br 1b\n" ".previous"
@@ -177,8 +176,8 @@ ____cmpxchg(_u16, volatile short *m, uns" or %1,%2,%2\n" " stq_c %2,0(%4)\n" " beq %2,3f\n" - __ASM__MB"2:\n" + __ASM__MB".subsection 2\n" "3: br 1b\n" ".previous"
@@ -200,8 +199,8 @@ ____cmpxchg(_u32, volatile int *m, int o" mov %4,%1\n" " stl_c %1,%2\n" " beq %1,3f\n" - __ASM__MB"2:\n" + __ASM__MB".subsection 2\n" "3: br 1b\n" ".previous"
@@ -223,8 +222,8 @@ ____cmpxchg(_u64, volatile long *m, unsi" mov %4,%1\n" " stq_c %1,%2\n" " beq %1,3f\n" - __ASM__MB"2:\n" + __ASM__MB".subsection 2\n" "3: br 1b\n" ".previous"
Greg Kroah-Hartman
maintainerPATCH 110/496 md: raid5: avoid string overflow warning
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 53b8d89ddbdbb0e4625a46d2cdbb6f106c52f801 ]
gcc warns about a possible overflow of the kmem_cache string, when adding four characters to a string of the same length:
drivers/md/raid5.c: In function 'setup_conf':drivers/md/raid5.c:2207:34: error: '-alt' directive writing 4 bytes into a region of size between 1 and 32 [-Werror=format-overflow=]
sprintf(conf->cache_name[1], "%s-alt", conf->cache_name[0]);
^~~~drivers/md/raid5.c:2207:2: note: 'sprintf' output between 5 and 36 bytes into a destination of size 32
sprintf(conf->cache_name[1], "%s-alt", conf->cache_name[0]); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If I'm counting correctly, we need 11 characters for the fixed part of the string and 18 characters for a 64-bit pointer (when no gendisk is used), so that leaves three characters for conf->level, which should always be sufficient.
This makes the code use snprintf() with the correct length, to make the code more robust against changes, and to get the compiler to shut up.
In commit f4be6b43f1ac ("md/raid5: ensure we create a unique name for kmem_cache when mddev has no gendisk") from 2010, Neil said that the pointer could be removed "shortly" once devices without gendisk are disallowed. I have no idea if that happened, but if it did, that should probably be changed as well.
--- drivers/md/raid5.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/md/raid5.c +4 -3
@@ -2197,15 +2197,16 @@ static int grow_one_stripe(struct r5confstatic int grow_stripes (struct r5conf *conf,int num) {struct kmem_cache *sc; +size_t namelen =sizeof (conf->cache_name[0 ]);int devs =max (conf->raid_disks, conf->previous_raid_disks);if (conf->mddev->gendisk) -sprintf (conf->cache_name[0 ], +snprintf (conf->cache_name[0 ], namelen,"raid%d-%s" , conf->level,mdname (conf->mddev));else -sprintf (conf->cache_name[0 ], +snprintf (conf->cache_name[0 ], namelen,"raid%d-%p" , conf->level, conf->mddev); -sprintf (conf->cache_name[1 ],"%s-alt" , conf->cache_name[0 ]); +snprintf (conf->cache_name[1 ], namelen,"%.27s-alt" , conf->cache_name[0 ]); conf->active_name =0 ; sc = kmem_cache_create(conf->cache_name[conf->active_name],
Greg Kroah-Hartman
maintainerPATCH 111/496 virtio_net: fix XDP code path in receive_small()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jesper Dangaard Brouer <[email protected]>
[ Upstream commit 95dbe9e7b3720efa5cf83d21f44f6d953f7cf4a2 ]
When configuring virtio_net to use the code path 'receive_small()', in-order to get correct XDP_REDIRECT support, I discovered TCP packets would get silently dropped when loading an XDP program action XDP_PASS.
The bug seems to be that receive_small() when XDP is loaded check that hdr->hdr.flags is zero, which seems wrong as hdr.flags contains the flags VIRTIO_NET_HDR_F_* :
#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 /* Use csum_start, csum_offset */ #define VIRTIO_NET_HDR_F_DATA_VALID 2 /* Csum is valid */
TCP got dropped as it had the VIRTIO_NET_HDR_F_DATA_VALID flag set.
The flags that are relevant here are the VIRTIO_NET_HDR_GSO_* flags stored in hdr->hdr.gso_type. Thus, the fix is just check that none of the gso_type flags have been set.
--- drivers/net/virtio_net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/virtio_net.c +1 -1
@@ -513,7 +513,7 @@ static struct sk_buff *receive_small(strvoid *orig_data;u32 act; -if (unlikely (hdr->hdr.gso_type || hdr->hdr.flags)) +if (unlikely (hdr->hdr.gso_type)) goto err_xdp;if (unlikely (xdp_headroom <virtnet_get_headroom (vi))) {
Greg Kroah-Hartman
maintainerPATCH 112/496 kernel/relay.c: limit kmalloc size to KMALLOC_MAX_SIZE
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Rientjes <[email protected]>
[ Upstream commit 88913bd8ea2a75d7e460a4bed5f75e1c32660d7e ]
chan->n_subbufs is set by the user and relay_create_buf() does a kmalloc() of chan->n_subbufs * sizeof(size_t *).
kmalloc_slab() will generate a warning when this fails if chan->subbufs * sizeof(size_t *) > KMALLOC_MAX_SIZE.
Limit chan->n_subbufs to the maximum allowed kmalloc() size.
--- kernel/relay.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/relay.c +1 -1
@@ -163,7 +163,7 @@ static struct rchan_buf *relay_create_bu {struct rchan_buf *buf; -if (chan->n_subbufs >UINT_MAX /sizeof (size_t *)) +if (chan->n_subbufs >KMALLOC_MAX_SIZE /sizeof (size_t *))return NULL ; buf =kzalloc (sizeof (struct rchan_buf ),GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 113/496 bug.h: work around GCC PR82365 in BUG()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 173a3efd3edb2ef6ef07471397c5f542a360e9c1 ]
Looking at functions with large stack frames across all architectures led me discovering that BUG() suffers from the same problem as fortify_panic(), which I've added a workaround for already.
In short, variables that go out of scope by calling a noreturn function or __builtin_unreachable() keep using stack space in functions afterwards.
A workaround that was identified is to insert an empty assembler statement just before calling the function that doesn't return. I'm adding a macro "barrier_before_unreachable()" to document this, and insert calls to that in all instances of BUG() that currently suffer from this problem.
The files that saw the largest change from this had these frame sizes before, and much less with my patch:
fs/ext4/inode.c:82:1: warning: the frame size of 1672 bytes is larger than 800 bytes [-Wframe-larger-than=] fs/ext4/namei.c:434:1: warning: the frame size of 904 bytes is larger than 800 bytes [-Wframe-larger-than=] fs/ext4/super.c:2279:1: warning: the frame size of 1160 bytes is larger than 800 bytes [-Wframe-larger-than=] fs/ext4/xattr.c:146:1: warning: the frame size of 1168 bytes is larger than 800 bytes [-Wframe-larger-than=] fs/f2fs/inode.c:152:1: warning: the frame size of 1424 bytes is larger than 800 bytes [-Wframe-larger-than=] net/netfilter/ipvs/ip_vs_core.c:1195:1: warning: the frame size of 1068 bytes is larger than 800 bytes [-Wframe-larger-than=] net/netfilter/ipvs/ip_vs_core.c:395:1: warning: the frame size of 1084 bytes is larger than 800 bytes [-Wframe-larger-than=] net/netfilter/ipvs/ip_vs_ftp.c:298:1: warning: the frame size of 928 bytes is larger than 800 bytes [-Wframe-larger-than=] net/netfilter/ipvs/ip_vs_ftp.c:418:1: warning: the frame size of 908 bytes is larger than 800 bytes [-Wframe-larger-than=] net/netfilter/ipvs/ip_vs_lblcr.c:718:1: warning: the frame size of 960 bytes is larger than 800 bytes [-Wframe-larger-than=] drivers/net/xen-netback/netback.c:1500:1: warning: the frame size of 1088 bytes is larger than 800 bytes [-Wframe-larger-than=]
In case of ARC and CRIS, it turns out that the BUG() implementation actually does return (or at least the compiler thinks it does), resulting in lots of warnings about uninitialized variable use and leaving noreturn functions, such as:
block/cfq-iosched.c: In function 'cfq_async_queue_prio':
block/cfq-iosched.c:3804:1: error: control reaches end of non-void function [-Werror=return-type] include/linux/dmaengine.h: In function 'dma_maxpq':
include/linux/dmaengine.h:1123:1: error: control reaches end of non-void function [-Werror=return-type]
This makes them call __builtin_trap() instead, which should normally dump the stack and kill the current process, like some of the other architectures already do.
I tried adding barrier_before_unreachable() to panic() and fortify_panic() as well, but that had very little effect, so I'm not submitting that patch.
Vineet said:
: For ARC, it is double win.
:
: 1. Fixes 3 -Wreturn-type warnings
:
: | ../net/core/ethtool.c:311:1: warning: control reaches end of non-void function : [-Wreturn-type]
: | ../kernel/sched/core.c:3246:1: warning: control reaches end of non-void function : [-Wreturn-type]
: | ../include/linux/sunrpc/svc_xprt.h:180:1: warning: control reaches end of : non-void function [-Wreturn-type]
:
: 2. bloat-o-meter reports code size improvements as gcc elides the
: generated code for stack return.
--- arch/arc/include/asm/bug.h | 3 ++- arch/cris/include/arch-v10/arch/bug.h | 11 +++++++++-- arch/ia64/include/asm/bug.h | 6 +++++- arch/m68k/include/asm/bug.h | 3 +++ arch/sparc/include/asm/bug.h | 6 +++++- include/asm-generic/bug.h | 1 + include/linux/compiler-gcc.h | 15 ++++++++++++++- include/linux/compiler.h | 5 +++++ 8 files changed, 44 insertions(+), 6 deletions(-)
arch/arc/include/asm/bug.h +2 -1
@@ -23,7 +23,8 @@ void die(const char *str, struct pt_regs#define BUG () do { \ pr_warn("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ - dump_stack(); \ + barrier_before_unreachable(); \ + __builtin_trap(); \ } while (0)#define HAVE_ARCH_BUG
arch/cris/include/arch-v10/arch/bug.h +9 -2
@@ -44,18 +44,25 @@ struct bug_frame {* not be used like this with newer versions of gcc. */ #define BUG () \ +do { \ __asm__ __volatile__ ("clear.d [" __stringify(BUG_MAGIC) "]\n\t"\ "movu.w " __stringify(__LINE__) ",$r0\n\t"\ "jump 0f\n\t" \ ".section .rodata\n" \ "0:\t.string \"" __FILE__ "\"\n\t" \ - ".previous") + ".previous"); \ + unreachable(); \ +} while (0)#endif #else /* This just causes an oops. */ -#define BUG () (*(int *)0 = 0) +#define BUG () \ +do { \ + barrier_before_unreachable(); \ + __builtin_trap(); \ +} while (0)#endif
arch/ia64/include/asm/bug.h +5 -1
@@ -4,7 +4,11 @@#ifdef CONFIG_BUG #define ia64_abort () __builtin_trap() -#define BUG () do { printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); ia64_abort(); } while (0) +#define BUG () do { \ + printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \ + barrier_before_unreachable(); \ + ia64_abort(); \ +} while (0)/* should this BUG be made generic? */ #define HAVE_ARCH_BUG
arch/m68k/include/asm/bug.h +3 -0
@@ -8,16 +8,19 @@#ifndef CONFIG_SUN3 #define BUG () do { \ pr_crit("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \ + barrier_before_unreachable(); \ __builtin_trap(); \ } while (0)#else #define BUG () do { \ pr_crit("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \ + barrier_before_unreachable(); \ panic("BUG!"); \ } while (0)#endif #else #define BUG () do { \ + barrier_before_unreachable(); \ __builtin_trap(); \ } while (0)#endif
arch/sparc/include/asm/bug.h +5 -1
@@ -9,10 +9,14 @@void do_BUG (const char *file,int line);#define BUG () do { \ do_BUG(__FILE__, __LINE__); \ + barrier_before_unreachable(); \ __builtin_trap(); \ } while (0)#else -#define BUG () __builtin_trap() +#define BUG () do { \ + barrier_before_unreachable(); \ + __builtin_trap(); \ +} while (0)#endif #define HAVE_ARCH_BUG
include/asm-generic/bug.h +1 -0
@@ -50,6 +50,7 @@ struct bug_entry {#ifndef HAVE_ARCH_BUG #define BUG () do { \ printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ + barrier_before_unreachable(); \ panic("BUG!"); \ } while (0)#endif
include/linux/compiler-gcc.h +14 -1
@@ -212,6 +212,15 @@#endif /* +* calling noreturn functions, __builtin_unreachable() and __builtin_trap() +* confuse the stack allocation in gcc, leading to overly large stack +* frames, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82365 +* +* Adding an empty inline assembly before it works around the problem +*/ +#define barrier_before_unreachable () asm volatile("") + +/* * Mark a position in code as unreachable. This can be used to * suppress control flow warnings after asm blocks that transfer * control elsewhere.
@@ -221,7 +230,11 @@* unreleased. Really, we need to have autoconf for the kernel. */ #define unreachable () \ - do { annotate_unreachable(); __builtin_unreachable(); } while (0) + do { \ + annotate_unreachable(); \ + barrier_before_unreachable(); \ + __builtin_unreachable(); \ + } while (0)/* Mark a function definition as prohibited from being cloned. */ #define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
include/linux/compiler.h +5 -0
@@ -86,6 +86,11 @@ void ftrace_likely_update(struct ftrace_# define barrier_data (ptr) barrier()#endif +/* workaround for GCC PR82365 if needed */ +#ifndef barrier_before_unreachable +# define barrier_before_unreachable () do { } while (0) +#endif +/* Unreachable code */ #ifdef CONFIG_STACK_VALIDATION #define annotate_reachable () ({ \
Greg Kroah-Hartman
maintainerPATCH 115/496 seccomp: add a selftest for get_metadata
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tycho Andersen <[email protected]>
[ Upstream commit d057dc4e35e16050befa3dda943876dab39cbf80 ]
Let's test that we get the flags correctly, and that we preserve the filter index across the ptrace(PTRACE_SECCOMP_GET_METADATA) correctly.
--- tools/testing/selftests/seccomp/seccomp_bpf.c | 61 ++++++++++++++++++++++++++ 1 file changed, 61 insertions(+)
tools/testing/selftests/seccomp/seccomp_bpf.c +61 -0
@@ -145,6 +145,15 @@ struct seccomp_data {#define SECCOMP_FILTER_FLAG_SPEC_ALLOW (1UL << 2)#endif +#ifndef PTRACE_SECCOMP_GET_METADATA +#define PTRACE_SECCOMP_GET_METADATA 0x420d + +struct seccomp_metadata { +__u64 filter_off;/* Input: which filter */ +__u64 flags;/* Output: filter's flags */ +}; +#endif +#ifndef seccompint seccomp (unsigned int op,unsigned int flags,void *args) {
@@ -2861,6 +2870,58 @@ TEST(get_action_avail)EXPECT_EQ (errno,EOPNOTSUPP ); } +TEST (get_metadata) +{ +pid_t pid; +int pipefd[2 ]; +char buf; +struct seccomp_metadata md; + +ASSERT_EQ (0 ,pipe (pipefd)); + + pid =fork (); +ASSERT_GE (pid,0 ); +if (pid ==0 ) { +struct sock_filter filter[] = { +BPF_STMT (BPF_RET |BPF_K ,SECCOMP_RET_ALLOW ), + }; +struct sock_fprog prog = { + .len = (unsigned short )ARRAY_SIZE (filter), + .filter = filter, + }; + +/* one with log, one without */ +ASSERT_EQ (0 ,seccomp (SECCOMP_SET_MODE_FILTER , +SECCOMP_FILTER_FLAG_LOG , &prog)); +ASSERT_EQ (0 ,seccomp (SECCOMP_SET_MODE_FILTER ,0 , &prog)); + +ASSERT_EQ (0 ,close (pipefd[0 ])); +ASSERT_EQ (1 ,write (pipefd[1 ],"1" ,1 )); +ASSERT_EQ (0 ,close (pipefd[1 ])); + +while (1 ) +sleep (100 ); + } + +ASSERT_EQ (0 ,close (pipefd[1 ])); +ASSERT_EQ (1 ,read (pipefd[0 ], &buf,1 )); + +ASSERT_EQ (0 ,ptrace (PTRACE_ATTACH , pid)); +ASSERT_EQ (pid,waitpid (pid,NULL ,0 )); + + md.filter_off =0 ; +ASSERT_EQ (sizeof (md),ptrace (PTRACE_SECCOMP_GET_METADATA , pid,sizeof (md), &md)); +EXPECT_EQ (md.flags,SECCOMP_FILTER_FLAG_LOG ); +EXPECT_EQ (md.filter_off,0 ); + + md.filter_off =1 ; +ASSERT_EQ (sizeof (md),ptrace (PTRACE_SECCOMP_GET_METADATA , pid,sizeof (md), &md)); +EXPECT_EQ (md.flags,0 ); +EXPECT_EQ (md.filter_off,1 ); + +ASSERT_EQ (0 ,kill (pid,SIGKILL )); +} +/* * TODO: * - add microbenchmarks
Greg Kroah-Hartman
maintainerPATCH 116/496 soc: imx: gpc: de-register power domains only if initialized
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Agner <[email protected]>
[ Upstream commit 7801c545e706674aeed40256eb806ad37b18ad71 ]
If power domain information are missing in the device tree, no power domains get initialized. However, imx_gpc_remove tries to remove power domains always in the old DT binding case. Only remove power domains when imx_gpc_probe initialized them in first place.
--- drivers/soc/imx/gpc.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/soc/imx/gpc.c +9 -1
@@ -456,13 +456,21 @@ static int imx_gpc_probe(struct platformstatic int imx_gpc_remove (struct platform_device *pdev) { +struct device_node *pgc_node;int ret; + pgc_node =of_get_child_by_name (pdev->dev.of_node,"pgc" ); + +/* bail out if DT too old and doesn't provide the necessary info */ +if (!of_property_read_bool (pdev->dev.of_node,"#power-domain-cells" ) && + !pgc_node) +return 0 ; +/* * If the old DT binding is used the toplevel driver needs to * de-register the power domains */ -if (!of_get_child_by_name (pdev->dev.of_node,"pgc" )) { +if (!pgc_node) {of_genpd_del_provider (pdev->dev.of_node); ret =pm_genpd_remove (&imx_gpc_domains[GPC_PGC_DOMAIN_PU ].base);
Greg Kroah-Hartman
maintainerPATCH 117/496 powerpc/bpf/jit: Fix 32-bit JIT for seccomp_data access
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Lord <[email protected]>
[ Upstream commit 083b20907185b076f21c265b30fe5b5f24c03d8c ]
I am using SECCOMP to filter syscalls on a ppc32 platform, and noticed that the JIT compiler was failing on the BPF even though the interpreter was working fine.
The issue was that the compiler was missing one of the instructions used by SECCOMP, so here is a patch to enable JIT for that instruction.
--- arch/powerpc/net/bpf_jit_comp.c | 3 +++ 1 file changed, 3 insertions(+)
arch/powerpc/net/bpf_jit_comp.c +3 -0
@@ -329,6 +329,9 @@ static int bpf_jit_build_body(struct bpf BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4);PPC_LWZ_OFFS (r_A, r_skb, offsetof(struct sk_buff , len));break ; +case BPF_LDX |BPF_W |BPF_ABS :/* A = *((u32 *)(seccomp_data + K)); */ +PPC_LWZ_OFFS (r_A, r_skb,K ); +break ;case BPF_LDX |BPF_W |BPF_LEN :/* X = skb->len; */ PPC_LWZ_OFFS (r_X, r_skb, offsetof(struct sk_buff , len));break ;
Greg Kroah-Hartman
maintainerPATCH 118/496 s390/cio: fix ccw_device_start_timeout API
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Ott <[email protected]>
[ Upstream commit f97a6b6c47d2f329a24f92cc0ca3c6df5727ba73 ]
There are cases a device driver can't start IO because the device is currently in use by cio. In this case the device driver is notified when the device is usable again.
Using ccw_device_start_timeout we would set the timeout (and change an existing timeout) before we test for internal usage. Worst case this could lead to an unexpected timer deletion.
Fix this by setting the timeout after we test for internal usage.
--- drivers/s390/cio/device_ops.c | 72 ++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 40 deletions(-)
drivers/s390/cio/device_ops.c +32 -40
@@ -160,7 +160,7 @@ int ccw_device_clear(struct ccw_device * }/** -* ccw_device_start_key() - start a s390 channel program with key +* ccw_device_start_timeout_key() - start a s390 channel program with timeout and key * @cdev: target ccw device * @cpa: logical start address of channel program * @intparm: user specific interruption parameter; will be presented back to
@@ -171,10 +171,15 @@ int ccw_device_clear(struct ccw_device ** @key: storage key to be used for the I/O * @flags: additional flags; defines the action to be performed for I/O * processing. +* @expires: timeout value in jiffies * * Start a S/390 channel program. When the interrupt arrives, the * IRQ handler is called, either immediately, delayed (dev-end missing, * or sense required) or never (no IRQ handler registered). +* This function notifies the device driver if the channel program has not +* completed during the time specified by @expires. If a timeout occurs, the +* channel program is terminated via xsch, hsch or csch, and the device's +* interrupt handler will be called with an irb containing ERR_PTR(-%ETIMEDOUT). * Returns: * %0, if the operation was successful; * -%EBUSY, if the device is busy, or status pending;
@@ -183,9 +188,9 @@ int ccw_device_clear(struct ccw_device ** Context: * Interrupts disabled, ccw device lock held */ -int ccw_device_start_key (struct ccw_device *cdev,struct ccw1 *cpa, -unsigned long intparm,__u8 lpm,__u8 key, -unsigned long flags) +int ccw_device_start_timeout_key (struct ccw_device *cdev,struct ccw1 *cpa, +unsigned long intparm,__u8 lpm,__u8 key, +unsigned long flags,int expires) {struct subchannel *sch;int ret;
@@ -225,6 +230,8 @@ int ccw_device_start_key(struct ccw_deviswitch (ret) {case 0 : cdev->private->intparm = intparm; +if (expires) +ccw_device_set_timeout (cdev, expires);break ;case -EACCES :case -ENODEV :
@@ -235,7 +242,7 @@ int ccw_device_start_key(struct ccw_devi }/** -* ccw_device_start_timeout_key() - start a s390 channel program with timeout and key +* ccw_device_start_key() - start a s390 channel program with key * @cdev: target ccw device * @cpa: logical start address of channel program * @intparm: user specific interruption parameter; will be presented back to
@@ -246,15 +253,10 @@ int ccw_device_start_key(struct ccw_devi* @key: storage key to be used for the I/O * @flags: additional flags; defines the action to be performed for I/O * processing. -* @expires: timeout value in jiffies * * Start a S/390 channel program. When the interrupt arrives, the * IRQ handler is called, either immediately, delayed (dev-end missing, * or sense required) or never (no IRQ handler registered). -* This function notifies the device driver if the channel program has not -* completed during the time specified by @expires. If a timeout occurs, the -* channel program is terminated via xsch, hsch or csch, and the device's -* interrupt handler will be called with an irb containing ERR_PTR(-%ETIMEDOUT). * Returns: * %0, if the operation was successful; * -%EBUSY, if the device is busy, or status pending;
@@ -263,19 +265,12 @@ int ccw_device_start_key(struct ccw_devi* Context: * Interrupts disabled, ccw device lock held */ -int ccw_device_start_timeout_key (struct ccw_device *cdev,struct ccw1 *cpa, -unsigned long intparm,__u8 lpm,__u8 key, -unsigned long flags,int expires) +int ccw_device_start_key (struct ccw_device *cdev,struct ccw1 *cpa, +unsigned long intparm,__u8 lpm,__u8 key, +unsigned long flags) { -int ret; - -if (!cdev) -return -ENODEV ; -ccw_device_set_timeout (cdev, expires); - ret =ccw_device_start_key (cdev, cpa, intparm, lpm, key, flags); -if (ret !=0 ) -ccw_device_set_timeout (cdev,0 ); -return ret; +return ccw_device_start_timeout_key (cdev, cpa, intparm, lpm, key, + flags,0 ); }/**
@@ -490,18 +485,20 @@ void ccw_device_get_id(struct ccw_deviceEXPORT_SYMBOL (ccw_device_get_id);/** -* ccw_device_tm_start_key() - perform start function +* ccw_device_tm_start_timeout_key() - perform start function * @cdev: ccw device on which to perform the start function * @tcw: transport-command word to be started * @intparm: user defined parameter to be passed to the interrupt handler * @lpm: mask of paths to use * @key: storage key to use for storage access +* @expires: time span in jiffies after which to abort request * * Start the tcw on the given ccw device. Return zero on success, non-zero * otherwise. */ -int ccw_device_tm_start_key (struct ccw_device *cdev,struct tcw *tcw, -unsigned long intparm,u8 lpm,u8 key) +int ccw_device_tm_start_timeout_key (struct ccw_device *cdev,struct tcw *tcw, +unsigned long intparm,u8 lpm,u8 key, +int expires) {struct subchannel *sch;int rc;
@@ -528,37 +525,32 @@ int ccw_device_tm_start_key(struct ccw_dreturn -EACCES ; } rc =cio_tm_start_key (sch, tcw, lpm, key); -if (rc ==0 ) +if (rc ==0 ) { cdev->private->intparm = intparm; +if (expires) +ccw_device_set_timeout (cdev, expires); + }return rc; } -EXPORT_SYMBOL (ccw_device_tm_start_key); +EXPORT_SYMBOL (ccw_device_tm_start_timeout_key);/** -* ccw_device_tm_start_timeout_key() - perform start function +* ccw_device_tm_start_key() - perform start function * @cdev: ccw device on which to perform the start function * @tcw: transport-command word to be started * @intparm: user defined parameter to be passed to the interrupt handler * @lpm: mask of paths to use * @key: storage key to use for storage access -* @expires: time span in jiffies after which to abort request * * Start the tcw on the given ccw device. Return zero on success, non-zero * otherwise. */ -int ccw_device_tm_start_timeout_key (struct ccw_device *cdev,struct tcw *tcw, -unsigned long intparm,u8 lpm,u8 key, -int expires) +int ccw_device_tm_start_key (struct ccw_device *cdev,struct tcw *tcw, +unsigned long intparm,u8 lpm,u8 key) { -int ret; - -ccw_device_set_timeout (cdev, expires); - ret =ccw_device_tm_start_key (cdev, tcw, intparm, lpm, key); -if (ret !=0 ) -ccw_device_set_timeout (cdev,0 ); -return ret; +return ccw_device_tm_start_timeout_key (cdev, tcw, intparm, lpm, key,0 ); } -EXPORT_SYMBOL (ccw_device_tm_start_timeout_key); +EXPORT_SYMBOL (ccw_device_tm_start_key);/** * ccw_device_tm_start() - perform start function
Greg Kroah-Hartman
maintainerPATCH 119/496 s390/cio: fix return code after missing interrupt
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Ott <[email protected]>
[ Upstream commit 770b55c995d171f026a9efb85e71e3b1ea47b93d ]
When a timeout occurs for users of ccw_device_start_timeout we will stop the IO and call the drivers int handler with the irb pointer set to ERR_PTR(-ETIMEDOUT). Sometimes however we'd set the irb pointer to ERR_PTR(-EIO) which is not intended. Just set the correct value in all codepaths.
--- drivers/s390/cio/device_fsm.c | 6 ++++-- drivers/s390/cio/io_sch.h | 1 + 2 files changed, 5 insertions(+), 2 deletions(-)
drivers/s390/cio/device_fsm.c +4 -2
@@ -796,6 +796,7 @@ ccw_device_online_timeout(struct ccw_devccw_device_set_timeout (cdev,0 ); cdev->private->iretry =255 ; + cdev->private->async_kill_io_rc = -ETIMEDOUT ; ret =ccw_device_cancel_halt_clear (cdev);if (ret == -EBUSY ) {ccw_device_set_timeout (cdev,3 *HZ );
@@ -872,7 +873,7 @@ ccw_device_killing_irq(struct ccw_device/* OK, i/o is dead now. Call interrupt handler. */ if (cdev->handler) cdev->handler (cdev, cdev->private->intparm, -ERR_PTR (-EIO )); +ERR_PTR (cdev->private->async_kill_io_rc)); } static void
@@ -889,7 +890,7 @@ ccw_device_killing_timeout(struct ccw_deccw_device_online_verify (cdev,0 );if (cdev->handler) cdev->handler (cdev, cdev->private->intparm, -ERR_PTR (-EIO )); +ERR_PTR (cdev->private->async_kill_io_rc)); }void ccw_device_kill_io (struct ccw_device *cdev)
@@ -897,6 +898,7 @@ void ccw_device_kill_io(struct ccw_devicint ret; cdev->private->iretry =255 ; + cdev->private->async_kill_io_rc = -EIO ; ret =ccw_device_cancel_halt_clear (cdev);if (ret == -EBUSY ) {ccw_device_set_timeout (cdev,3 *HZ );
drivers/s390/cio/io_sch.h +1 -0
@@ -157,6 +157,7 @@ struct ccw_device_private {unsigned long intparm;/* user interruption parameter */ struct qdio_irq *qdio_data;struct irb irb;/* device status */ +int async_kill_io_rc;struct senseid senseid;/* SenseID info */ struct pgid pgid[8 ];/* path group IDs per chpid*/ struct ccw1 iccws[2 ];/* ccws for SNID/SID/SPGID commands */
Greg Kroah-Hartman
maintainerPATCH 120/496 s390/cio: clear timer when terminating driver I/O
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Ott <[email protected]>
[ Upstream commit 410d5e13e7638bc146321671e223d56495fbf3c7 ]
When we terminate driver I/O (because we need to stop using a certain channel path) we also need to ensure that a timer (which may have been set up using ccw_device_start_timeout) is cleared.
--- drivers/s390/cio/device_fsm.c | 1 + 1 file changed, 1 insertion(+)
drivers/s390/cio/device_fsm.c +1 -0
@@ -897,6 +897,7 @@ void ccw_device_kill_io(struct ccw_devic {int ret; +ccw_device_set_timeout (cdev,0 ); cdev->private->iretry =255 ; cdev->private->async_kill_io_rc = -EIO ; ret =ccw_device_cancel_halt_clear (cdev);
Greg Kroah-Hartman
maintainerPATCH 121/496 selftests/bpf/test_maps: exit child process without error in ENOMEM case
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Zhijian <[email protected]>
[ Upstream commit 80475c48c6a8a65171e035e0915dc7996b5a0a65 ]
test_maps contains a series of stress tests, and previously it will break the rest tests when it failed to alloc memory.
-----------------------
Failed to create hashmap key=8 value=262144 'Cannot allocate memory' Failed to create hashmap key=16 value=262144 'Cannot allocate memory' Failed to create hashmap key=8 value=262144 'Cannot allocate memory' Failed to create hashmap key=8 value=262144 'Cannot allocate memory'test_maps: test_maps.c:955: run_parallel: Assertion `status == 0' failed. Aborted
not ok 1..3 selftests: test_maps [FAIL]
-----------------------
after this patch, the rest tests will be continue when it occurs an ENOMEM failure
--- tools/testing/selftests/bpf/test_maps.c | 2 ++ 1 file changed, 2 insertions(+)
tools/testing/selftests/bpf/test_maps.c +2 -0
@@ -126,6 +126,8 @@ static void test_hashmap_sizes(int task, fd =bpf_create_map (BPF_MAP_TYPE_HASH , i, j,2 , map_flags);if (fd <0 ) { +if (errno ==ENOMEM ) +return ;printf ("Failed to create hashmap key=%d value=%d '%s'\n" , i, j,strerror (errno));exit (1 );
Greg Kroah-Hartman
maintainerPATCH 122/496 PKCS#7: fix direct verification of SignerInfo signature
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
[ Upstream commit 6459ae386699a5fe0dc52cf30255f75274fa43a4 ]
If none of the certificates in a SignerInfo's certificate chain match a trusted key, nor is the last certificate signed by a trusted key, then pkcs7_validate_trust_one() tries to check whether the SignerInfo's signature was made directly by a trusted key. But, it actually fails to set the 'sig' variable correctly, so it actually verifies the last signature seen. That will only be the SignerInfo's signature if the certificate chain is empty; otherwise it will actually be the last certificate's signature.
This is not by itself a security problem, since verifying any of the certificates in the chain should be sufficient to verify the SignerInfo. Still, it's not working as intended so it should be fixed.
Fix it by setting 'sig' correctly for the direct verification case.
--- crypto/asymmetric_keys/pkcs7_trust.c | 1 + 1 file changed, 1 insertion(+)
crypto/asymmetric_keys/pkcs7_trust.c +1 -0
@@ -106,6 +106,7 @@ static int pkcs7_validate_trust_one(strupr_devel ("sinfo %u: Direct signer is key %x\n" , sinfo->index,key_serial (key)); x509 =NULL ; + sig = sinfo->sig; goto matched; }if (PTR_ERR (key) != -ENOKEY )
Greg Kroah-Hartman
maintainerPATCH 123/496 arm64: dts: cavium: fix PCI bus dtc warnings
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Herring <[email protected]>
[ Upstream commit e2c8d283c4e2f468bed1bcfedb80b670b1bc8ab1 ]
dtc recently added PCI bus checks. Fix these warnings:
arch/arm64/boot/dts/cavium/thunder2-99xx.dtb: Warning (pci_bridge): Node /pci missing bus-range for PCI bridge arch/arm64/boot/dts/cavium/thunder2-99xx.dtb: Warning (unit_address_vs_reg): Node /pci has a reg or ranges property, but no unit name
--- arch/arm64/boot/dts/cavium/thunder2-99xx.dtsi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/boot/dts/cavium/thunder2-99xx.dtsi +2 -1
@@ -98,7 +98,7 @@ clock-output-names = "clk125mhz"; }; - pci { + pcie@30000000 { compatible = "pci-host-ecam-generic"; device_type = "pci"; #interrupt-cells = <1>;
@@ -118,6 +118,7 @@ ranges = <0x02000000 0 0x40000000 0 0x40000000 0 0x20000000 0x43000000 0x40 0x00000000 0x40 0x00000000 0x20 0x00000000>; + bus-range = <0 0xff>; interrupt-map-mask = <0 0 0 7>; interrupt-map = /* addr pin ic icaddr icintr */
Greg Kroah-Hartman
maintainerPATCH 124/496 nfs: system crashes after NFS4ERR_MOVED recovery
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "[email protected]" <[email protected]>
[ Upstream commit ad86f605c59500da82d196ac312cfbac3daba31d ]
nfs4_update_server unconditionally releases the nfs_client for the source server. If migration fails, this can cause the source server's nfs_client struct to be left with a low reference count, resulting in use-after-free. Also, adjust reference count handling for ELOOP.
NFS: state manager: migration failed on NFSv4 server nfsvmu10 with error 6
WARNING: CPU: 16 PID: 17960 at fs/nfs/client.c:281 nfs_put_client+0xfa/0x110 [nfs]() nfs_put_client+0xfa/0x110 [nfs] nfs4_run_state_manager+0x30/0x40 [nfsv4] kthread+0xd8/0xf0 BUG: unable to handle kernel NULL pointer dereference at 00000000000002a8 nfs4_xdr_enc_write+0x6b/0x160 [nfsv4] rpcauth_wrap_req+0xac/0xf0 [sunrpc] call_transmit+0x18c/0x2c0 [sunrpc] __rpc_execute+0xa6/0x490 [sunrpc] rpc_async_schedule+0x15/0x20 [sunrpc] process_one_work+0x160/0x470 worker_thread+0x112/0x540 ? rescuer_thread+0x3f0/0x3f0 kthread+0xd8/0xf0
This bug was introduced by 32e62b7c ("NFS: Add nfs4_update_server"), but the fix applies cleanly to 52442f9b ("NFS4: Avoid migration loops")
--- fs/nfs/nfs4client.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/nfs/nfs4client.c +4 -2
@@ -858,8 +858,10 @@ static int nfs4_set_client(struct nfs_seif (IS_ERR (clp))return PTR_ERR (clp); -if (server->nfs_client == clp) +if (server->nfs_client == clp) { +nfs_put_client (clp);return -ELOOP ; + }/* * Query for the lease time on clientid setup or renewal
@@ -1217,11 +1219,11 @@ int nfs4_update_server(struct nfs_server clp->cl_proto, clnt->cl_timeout, clp->cl_minorversion, net);clear_bit (NFS_MIG_TSM_POSSIBLE , &server->mig_status); -nfs_put_client (clp);if (error !=0 ) {nfs_server_insert_lists (server);return error; } +nfs_put_client (clp);if (server->nfs_client->cl_hostname ==NULL ) server->nfs_client->cl_hostname =kstrdup (hostname,GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 125/496 ARM: OMAP: Fix dmtimer init for omap1
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit ba6887836178d43b3665b9da075c2c5dfe1d207c ]
We need to enable PM runtime on omap1 also as otherwise we will get errors:
omap_timer omap_timer.1: omap_dm_timer_probe: pm_runtime_get_sync failed!omap_timer: probe of omap_timer.1 failed with error -13
...
We are checking for OMAP_TIMER_NEEDS_RESET flag elsewhere so this is safe to do.
--- arch/arm/plat-omap/dmtimer.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
arch/arm/plat-omap/dmtimer.c +2 -5
@@ -890,11 +890,8 @@ static int omap_dm_timer_probe(struct pl timer->irq = irq->start; timer->pdev = pdev; -/* Skip pm_runtime_enable for OMAP1 */ -if (!(timer->capability &OMAP_TIMER_NEEDS_RESET )) { -pm_runtime_enable (dev); -pm_runtime_irq_safe (dev); - } +pm_runtime_enable (dev); +pm_runtime_irq_safe (dev);if (!timer->reserved) { ret =pm_runtime_get_sync (dev);
Greg Kroah-Hartman
maintainerPATCH 126/496 smsc75xx: fix smsc75xx_set_features()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 88e80c62671ceecdbb77c902731ec95a4bfa62f9 ]
If an attempt is made to disable RX checksums, USB adapter is changed but netdev->features is not, because smsc75xx_set_features() returns a non zero value.
This throws errors from netdev_rx_csum_fault() :
<devname>: hw csum failure
--- drivers/net/usb/smsc75xx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/usb/smsc75xx.c +4 -3
@@ -954,10 +954,11 @@ static int smsc75xx_set_features(struct/* it's racing here! */ ret =smsc75xx_write_reg (dev,RFE_CTL , pdata->rfe_ctl); -if (ret <0 ) +if (ret <0 ) {netdev_warn (dev->net,"Error writing RFE_CTL\n" ); - -return ret; +return ret; + } +return 0 ; }static int smsc75xx_wait_ready (struct usbnet *dev,int in_pm)
Greg Kroah-Hartman
maintainerPATCH 127/496 regulatory: add NUL to request alpha2
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 657308f73e674e86b60509a430a46e569bf02846 ]
Similar to the ancient commit a5fe8e7695dc ("regulatory: add NUL to alpha2"), add another byte to alpha2 in the request struct so that when we use nla_put_string(), we don't overrun anything.
--- include/net/regulatory.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/regulatory.h +1 -1
@@ -78,7 +78,7 @@ struct regulatory_request {int wiphy_idx;enum nl80211_reg_initiator initiator;enum nl80211_user_reg_hint_type user_reg_hint_type; -char alpha2[2 ]; +char alpha2[3 ];enum nl80211_dfs_regions dfs_region;bool intersect;bool processed;
Greg Kroah-Hartman
maintainerPATCH 128/496 integrity/security: fix digsig.c build error with header file
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit 120f3b11ef88fc38ce1d0ff9c9a4b37860ad3140 ]
security/integrity/digsig.c has build errors on some $ARCH due to a missing header file, so add it.
security/integrity/digsig.c:146:2: error: implicit declaration of function 'vfree' [-Werror=implicit-function-declaration]
--- security/integrity/digsig.c | 1 + 1 file changed, 1 insertion(+)
security/integrity/digsig.c +1 -0
@@ -18,6 +18,7 @@#include <linux/cred.h> #include <linux/key-type.h> #include <linux/digsig.h> +#include <linux/vmalloc.h> #include <crypto/public_key.h> #include <keys/system_keyring.h>
Greg Kroah-Hartman
maintainerPATCH 130/496 locking/xchg/alpha: Fix xchg() and cmpxchg() memory ordering bugs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrea Parri <[email protected]>
[ Upstream commit 472e8c55cf6622d1c112dc2bc777f68bbd4189db ]
Successful RMW operations are supposed to be fully ordered, but Alpha's xchg() and cmpxchg() do not meet this requirement.
Will Deacon noticed the bug:
Quoted 9 lines
So MP using xchg:
WRITE_ONCE(x, 1)xchg(y, 1)
smp_load_acquire(y)== 1READ_ONCE(x)== 0would be allowed.
... which thus violates the above requirement.
Fix it by adding a leading smp_mb() to the xchg() and cmpxchg() implementations.
--- arch/alpha/include/asm/xchg.h | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
arch/alpha/include/asm/xchg.h +18 -3
@@ -12,6 +12,10 @@* Atomic exchange. * Since it can be used to implement critical sections * it must clobber "memory" (also for interrupts in UP). +* +* The leading and the trailing memory barriers guarantee that these +* operations are fully ordered. +* */ static inline unsigned long
@@ -19,6 +23,7 @@ ____xchg(_u8, volatile char *m, unsigned {unsigned long ret, tmp, addr64; +smp_mb (); __asm__ __volatile__(" andnot %4,7,%3\n" " insbl %1,%4,%1\n"
@@ -43,6 +48,7 @@ ____xchg(_u16, volatile short *m, unsign {unsigned long ret, tmp, addr64; +smp_mb (); __asm__ __volatile__(" andnot %4,7,%3\n" " inswl %1,%4,%1\n"
@@ -67,6 +73,7 @@ ____xchg(_u32, volatile int *m, unsigned {unsigned long dummy; +smp_mb (); __asm__ __volatile__("1: ldl_l %0,%4\n" " bis $31,%3,%1\n"
@@ -87,6 +94,7 @@ ____xchg(_u64, volatile long *m, unsigne {unsigned long dummy; +smp_mb (); __asm__ __volatile__("1: ldq_l %0,%4\n" " bis $31,%3,%1\n"
@@ -128,9 +136,12 @@ ____xchg(, volatile void *ptr, unsigned* store NEW in MEM. Return the initial value in MEM. Success is * indicated by comparing RETURN with OLD. * -* The memory barrier is placed in SMP unconditionally, in order to -* guarantee that dependency ordering is preserved when a dependency -* is headed by an unsuccessful operation. +* The leading and the trailing memory barriers guarantee that these +* operations are fully ordered. +* +* The trailing memory barrier is placed in SMP unconditionally, in +* order to guarantee that dependency ordering is preserved when a +* dependency is headed by an unsuccessful operation. */ static inline unsigned long
@@ -138,6 +149,7 @@ ____cmpxchg(_u8, volatile char *m, unsig {unsigned long prev, tmp, cmp, addr64; +smp_mb (); __asm__ __volatile__(" andnot %5,7,%4\n" " insbl %1,%5,%1\n"
@@ -165,6 +177,7 @@ ____cmpxchg(_u16, volatile short *m, uns {unsigned long prev, tmp, cmp, addr64; +smp_mb (); __asm__ __volatile__(" andnot %5,7,%4\n" " inswl %1,%5,%1\n"
@@ -192,6 +205,7 @@ ____cmpxchg(_u32, volatile int *m, int o {unsigned long prev, cmp; +smp_mb (); __asm__ __volatile__("1: ldl_l %0,%5\n" " cmpeq %0,%3,%1\n"
@@ -215,6 +229,7 @@ ____cmpxchg(_u64, volatile long *m, unsi {unsigned long prev, cmp; +smp_mb (); __asm__ __volatile__("1: ldq_l %0,%5\n" " cmpeq %0,%3,%1\n"
Greg Kroah-Hartman
maintainerPATCH 131/496 x86/topology: Update the cpu cores field in /proc/cpuinfo correctly across CPU hotplug operations
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Samuel Neves <[email protected]>
[ Upstream commit 4596749339e06dc7a424fc08a15eded850ed78b7 ]
Without this fix, /proc/cpuinfo will display an incorrect amount of CPU cores, after bringing them offline and online again, as exemplified below:
$ cat /proc/cpuinfo | grep cores cpu cores : 4 cpu cores : 8 cpu cores : 8 cpu cores : 20 cpu cores : 4 cpu cores : 3 cpu cores : 2 cpu cores : 2
This patch fixes this by always zeroing the booted_cores variable upon turning off a logical CPU.
--- arch/x86/kernel/smpboot.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/kernel/smpboot.c +1 -0
@@ -1521,6 +1521,7 @@ static void remove_siblinginfo(int cpu)cpumask_clear (topology_core_cpumask (cpu)); c->phys_proc_id =0 ; c->cpu_core_id =0 ; + c->booted_cores =0 ;cpumask_clear_cpu (cpu, cpu_sibling_setup_mask);recompute_smt_state (); }
Greg Kroah-Hartman
maintainerPATCH 132/496 mac80211: drop frames with unexpected DS bits from fast-rx to slow path
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit b323ac19b7734a1c464b2785a082ee50bccd3b91 ]
Fixes rx for 4-addr packets in AP mode. These may be used for setting up a 4-addr link for stations that are allowed to do so.
--- net/mac80211/rx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac80211/rx.c +1 -1
@@ -3928,7 +3928,7 @@ static bool ieee80211_invoke_fast_rx(strif ((hdr->frame_control &cpu_to_le16 (IEEE80211_FCTL_FROMDS |IEEE80211_FCTL_TODS )) != fast_rx->expected_ds_bits) - goto drop; +return false;/* assign the key to drop unencrypted frames (later) * and strip the IV/MIC if necessary
Greg Kroah-Hartman
maintainerPATCH 133/496 arm64: fix unwind_frame() for filtered out fn for function graph tracing
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pratyush Anand <[email protected]>
[ Upstream commit 9f416319f40cd857d2bb517630e5855a905ef3fb ]
do_task_stat() calls get_wchan(), which further does unwind_frame(). unwind_frame() restores frame->pc to original value in case function graph tracer has modified a return address (LR) in a stack frame to hook a function return. However, if function graph tracer has hit a filtered function, then we can't unwind it as ftrace_push_return_trace() has biased the index(frame->graph) with a 'huge negative' offset(-FTRACE_NOTRACE_DEPTH).
Moreover, arm64 stack walker defines index(frame->graph) as unsigned int, which can not compare a -ve number.
Similar problem we can have with calling of walk_stackframe() from save_stack_trace_tsk() or dump_backtrace().
This patch fixes unwind_frame() to test the index for -ve value and restore index accordingly before we can restore frame->pc.
Reproducer:
cd /sys/kernel/debug/tracing/
echo schedule > set_graph_notrace
echo 1 > options/display-graph
echo wakeup > current_tracer
ps -ef | grep -i agent
Above commands result in:
Unable to handle kernel paging request at virtual address ffff801bd3d1e000 pgd = ffff8003cbe97c00 [ffff801bd3d1e000] *pgd=0000000000000000, *pud=0000000000000000 Internal error: Oops: 96000006 [#1] SMP [...] CPU: 5 PID: 11696 Comm: ps Not tainted 4.11.0+ #33
[...]
task: ffff8003c21ba000 task.stack: ffff8003cc6c0000 PC is at unwind_frame+0x12c/0x180
LR is at get_wchan+0xd4/0x134
pc : [<ffff00000808892c>] lr : [<ffff0000080860b8>] pstate: 60000145
sp : ffff8003cc6c3ab0
x29: ffff8003cc6c3ab0 x28: 0000000000000001
x27: 0000000000000026 x26: 0000000000000026
x25: 00000000000012d8 x24: 0000000000000000
x23: ffff8003c1c04000 x22: ffff000008c83000
x21: ffff8003c1c00000 x20: 000000000000000f
x19: ffff8003c1bc0000 x18: 0000fffffc593690
x17: 0000000000000000 x16: 0000000000000001
x15: 0000b855670e2b60 x14: 0003e97f22cf1d0f
x13: 0000000000000001 x12: 0000000000000000
x11: 00000000e8f4883e x10: 0000000154f47ec8
x9 : 0000000070f367c0 x8 : 0000000000000000
x7 : 00008003f7290000 x6 : 0000000000000018
x5 : 0000000000000000 x4 : ffff8003c1c03cb0
x3 : ffff8003c1c03ca0 x2 : 00000017ffe80000
x1 : ffff8003cc6c3af8 x0 : ffff8003d3e9e000
Process ps (pid: 11696, stack limit = 0xffff8003cc6c0000)
Stack: (0xffff8003cc6c3ab0 to 0xffff8003cc6c4000) [...] [<ffff00000808892c>] unwind_frame+0x12c/0x180 [<ffff000008305008>] do_task_stat+0x864/0x870 [<ffff000008305c44>] proc_tgid_stat+0x3c/0x48 [<ffff0000082fde0c>] proc_single_show+0x5c/0xb8 [<ffff0000082b27e0>] seq_read+0x160/0x414 [<ffff000008289e6c>] __vfs_read+0x58/0x164 [<ffff00000828b164>] vfs_read+0x88/0x144 [<ffff00000828c2e8>] SyS_read+0x60/0xc0 [<ffff0000080834a0>] __sys_trace_return+0x0/0x4
--- arch/arm64/include/asm/stacktrace.h | 2 +- arch/arm64/kernel/stacktrace.c | 5 +++++ arch/arm64/kernel/time.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-)
arch/arm64/include/asm/stacktrace.h +1 -1
@@ -27,7 +27,7 @@ struct stackframe {unsigned long fp;unsigned long pc;#ifdef CONFIG_FUNCTION_GRAPH_TRACER -unsigned int graph; +int graph;#endif };
arch/arm64/kernel/stacktrace.c +5 -0
@@ -59,6 +59,11 @@ int notrace unwind_frame(struct task_str#ifdef CONFIG_FUNCTION_GRAPH_TRACER if (tsk->ret_stack && (frame->pc == (unsigned long )return_to_handler)) { +if (WARN_ON_ONCE (frame->graph ==-1 )) +return -EINVAL ; +if (frame->graph <-1 ) + frame->graph +=FTRACE_NOTRACE_DEPTH ; +/* * This is a case where function graph tracer has * modified a return address (LR) in a stack frame
arch/arm64/kernel/time.c +1 -1
@@ -52,7 +52,7 @@ unsigned long profile_pc(struct pt_regs frame.fp = regs->regs[29 ]; frame.pc = regs->pc;#ifdef CONFIG_FUNCTION_GRAPH_TRACER - frame.graph =-1 ;/* no task info */ + frame.graph = current->curr_ret_stack;#endif do { int ret = unwind_frame(NULL, &frame);
Greg Kroah-Hartman
maintainerPATCH 134/496 macvlan: fix use-after-free in macvlan_common_newlink()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Kodanev <[email protected]>
[ Upstream commit 4e14bf4236490306004782813b8b4494b18f5e60 ]
The following use-after-free was reported by KASan when running LTP macvtap01 test on 4.16-rc2:
[10642.528443] BUG: KASAN: use-after-free in
macvlan_common_newlink+0x12ef/0x14a0 [macvlan]
[10642.626607] Read of size 8 at addr ffff880ba49f2100 by task ip/18450
...
[10642.963873] Call Trace:
[10642.994352] dump_stack+0x5c/0x7c
[10643.035325] print_address_description+0x75/0x290
[10643.092938] kasan_report+0x28d/0x390
[10643.137971] ? macvlan_common_newlink+0x12ef/0x14a0 [macvlan]
[10643.207963] macvlan_common_newlink+0x12ef/0x14a0 [macvlan]
[10643.275978] macvtap_newlink+0x171/0x260 [macvtap]
[10643.334532] rtnl_newlink+0xd4f/0x1300
...
[10646.256176] Allocated by task 18450:
[10646.299964] kasan_kmalloc+0xa6/0xd0
[10646.343746] kmem_cache_alloc_trace+0xf1/0x210
[10646.397826] macvlan_common_newlink+0x6de/0x14a0 [macvlan]
[10646.464386] macvtap_newlink+0x171/0x260 [macvtap]
[10646.522728] rtnl_newlink+0xd4f/0x1300
...
[10647.022028] Freed by task 18450:
[10647.061549] __kasan_slab_free+0x138/0x180
[10647.111468] kfree+0x9e/0x1c0
[10647.147869] macvlan_port_destroy+0x3db/0x650 [macvlan]
[10647.211411] rollback_registered_many+0x5b9/0xb10
[10647.268715] rollback_registered+0xd9/0x190
[10647.319675] register_netdevice+0x8eb/0xc70
[10647.370635] macvlan_common_newlink+0xe58/0x14a0 [macvlan]
[10647.437195] macvtap_newlink+0x171/0x260 [macvtap]Commit d02fd6e7d293 ("macvlan: Fix one possible double free") handles the case when register_netdevice() invokes ndo_uninit() on error and as a result free the port. But 'macvlan_port_get_rtnl(dev))' check (returns dev->rx_handler_data), which was added by this commit in order to prevent double free, is not quite correct:
* for macvlan it always returns NULL because 'lowerdev' is the one that was used to register rx handler (port) in macvlan_port_create() as well as to unregister it in macvlan_port_destroy().
* for macvtap it always returns a valid pointer because macvtap registers its own rx handler before macvlan_common_newlink().
--- drivers/net/macvlan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/macvlan.c +1 -1
@@ -1448,7 +1448,7 @@ destroy_macvlan_port:/* the macvlan port may be freed by macvlan_uninit when fail to register. * so we destroy the macvlan port only when it's valid. */ -if (create &&macvlan_port_get_rtnl (dev)) +if (create &&macvlan_port_get_rtnl (lowerdev))macvlan_port_destroy (port->dev);return err; }
Greg Kroah-Hartman
maintainerPATCH 135/496 KVM: nVMX: Dont halt vcpu when L1 is injecting events to L2
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Gao <[email protected]>
[ Upstream commit 135a06c3a515bbd17729eb04f4f26316d48363d7 ]
Although L2 is in halt state, it will be in the active state after VM entry if the VM entry is vectoring according to SDM 26.6.2 Activity State. Halting the vcpu here means the event won't be injected to L2 and this decision isn't reported to L1. Thus L0 drops an event that should be injected to L2.
--- arch/x86/kvm/vmx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/x86/kvm/vmx.c +6 -1
@@ -11174,7 +11174,12 @@ static int nested_vmx_run(struct kvm_vcpif (ret)return ret; -if (vmcs12->guest_activity_state ==GUEST_ACTIVITY_HLT ) +/* +* If we're entering a halted L2 vcpu and the L2 vcpu won't be woken +* by event injection, halt vcpu. +*/ +if ((vmcs12->guest_activity_state ==GUEST_ACTIVITY_HLT ) && + !(vmcs12->vm_entry_intr_info_field &INTR_INFO_VALID_MASK ))return kvm_vcpu_halt (vcpu); vmx->nested.nested_run_pending =1 ;
Greg Kroah-Hartman
maintainerPATCH 136/496 kvm: fix warning for CONFIG_HAVE_KVM_EVENTFD builds
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Ott <[email protected]>
[ Upstream commit 076467490b8176eb96eddc548a14d4135c7b5852 ]
Move the kvm_arch_irq_routing_update() prototype outside of ifdef CONFIG_HAVE_KVM_EVENTFD guards to fix the following sparse warning:
arch/s390/kvm/../../../virt/kvm/irqchip.c:171:28: warning: symbol 'kvm_arch_irq_routing_update' was not declared. Should it be static?
--- include/linux/kvm_host.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
include/linux/kvm_host.h +2 -1
@@ -1104,7 +1104,6 @@ static inline void kvm_irq_routing_updat { }#endif -void kvm_arch_irq_routing_update (struct kvm *kvm);static inline int kvm_ioeventfd (struct kvm *kvm,struct kvm_ioeventfd *args) {
@@ -1113,6 +1112,8 @@ static inline int kvm_ioeventfd(struct k#endif /* CONFIG_HAVE_KVM_EVENTFD */ +void kvm_arch_irq_routing_update (struct kvm *kvm); +static inline void kvm_make_request (int req,struct kvm_vcpu *vcpu) {/*
Greg Kroah-Hartman
maintainerPATCH 137/496 ARM: dts: imx6dl: Include correct dtsi file for Engicam i.CoreM6 DualLite/Solo RQS
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shyam Saini <[email protected]>
[ Upstream commit c0c6bb2322964bd264b4ddedaa5776f40c709f0c ]
This patch fixes the wrongly included dtsi file which
was breaking mainline support for Engicam i.CoreM6 DualLite/Solo RQS.
As per the board name, the correct file should be imx6dl.dtsi instead of imx6q.dtsi
--- arch/arm/boot/dts/imx6dl-icore-rqs.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/imx6dl-icore-rqs.dts +1 -1
@@ -42,7 +42,7 @@ /dts-v1/; -#include "imx6q.dtsi" +#include "imx6dl.dtsi" #include "imx6qdl-icore-rqs.dtsi" / {
Greg Kroah-Hartman
maintainerPATCH 138/496 fs: dcache: Avoid livelock between d_alloc_parallel and __d_add
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[ Upstream commit 015555fd4d2930bc0c86952c46ad88b3392f66e4 ]
If d_alloc_parallel runs concurrently with __d_add, it is possible for d_alloc_parallel to continuously retry whilst i_dir_seq has been incremented to an odd value by __d_add:
CPU0:__d_add
n = start_dir_add(dir); cmpxchg(&dir->i_dir_seq, n, n + 1) == n
CPU1:d_alloc_parallel
retry:
seq = smp_load_acquire(&parent->d_inode->i_dir_seq) & ~1; hlist_bl_lock(b); bit_spin_lock(0, (unsigned long *)b); // Always succeeds
CPU0:
__d_lookup_done(dentry) hlist_bl_lock bit_spin_lock(0, (unsigned long *)b); // Never succeeds
CPU1:
if (unlikely(parent->d_inode->i_dir_seq != seq)) {
hlist_bl_unlock(b);
goto retry;
}Since the simple bit_spin_lock used to implement hlist_bl_lock does not provide any fairness guarantees, then CPU1 can starve CPU0 of the lock and prevent it from reaching end_dir_add(dir), therefore CPU1 cannot exit its retry loop because the sequence number always has the bottom bit set.
This patch resolves the livelock by not taking hlist_bl_lock in d_alloc_parallel if the sequence counter is odd, since any subsequent masked comparison with i_dir_seq will fail anyway.
--- fs/dcache.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
fs/dcache.c +7 -1
@@ -2482,7 +2482,7 @@ struct dentry *d_alloc_parallel(struct d retry:rcu_read_lock (); - seq =smp_load_acquire (&parent->d_inode->i_dir_seq) & ~1 ; + seq =smp_load_acquire (&parent->d_inode->i_dir_seq); r_seq =read_seqbegin (&rename_lock); dentry =__d_lookup_rcu (parent, name, &d_seq);if (unlikely (dentry)) {
@@ -2503,6 +2503,12 @@ retry:rcu_read_unlock (); goto retry; } + +if (unlikely (seq &1 )) { +rcu_read_unlock (); + goto retry; + } +hlist_bl_lock (b);if (unlikely (parent->d_inode->i_dir_seq != seq)) {hlist_bl_unlock (b);
Greg Kroah-Hartman
maintainerPATCH 139/496 fs: dcache: Use READ_ONCE when accessing i_dir_seq
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[ Upstream commit 8cc07c808c9d595e81cbe5aad419b7769eb2e5c9 ]
i_dir_seq is subject to concurrent modification by a cmpxchg or store-release operation, so ensure that the relaxed access in d_alloc_parallel uses READ_ONCE.
--- fs/dcache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/dcache.c +1 -1
@@ -2510,7 +2510,7 @@ retry: }hlist_bl_lock (b); -if (unlikely (parent->d_inode->i_dir_seq != seq)) { +if (unlikely (READ_ONCE (parent->d_inode->i_dir_seq) != seq)) {hlist_bl_unlock (b);rcu_read_unlock (); goto retry;
Greg Kroah-Hartman
maintainerPATCH 140/496 md: fix a potential deadlock of raid5/raid10 reshape
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: BingJing Chang <[email protected]>
[ Upstream commit 8876391e440ba615b10eef729576e111f0315f87 ]
There is a potential deadlock if mount/umount happens when raid5_finish_reshape() tries to grow the size of emulated disk.
How the deadlock happens?
1) The raid5 resync thread finished reshape (expanding array).
2) The mount or umount thread holds VFS sb->s_umount lock and tries to write through critical data into raid5 emulated block device. So it waits for raid5 kernel thread handling stripes in order to finish it I/Os.
3) In the routine of raid5 kernel thread, md_check_recovery() will be called first in order to reap the raid5 resync thread. That is, raid5_finish_reshape() will be called. In this function, it will try to update conf and call VFS revalidate_disk() to grow the raid5 emulated block device. It will try to acquire VFS sb->s_umount lock.
The raid5 kernel thread cannot continue, so no one can handle mount/ umount I/Os (stripes). Once the write-through I/Os cannot be finished, mount/umount will not release sb->s_umount lock. The deadlock happens.
The raid5 kernel thread is an emulated block device. It is responible to handle I/Os (stripes) from upper layers. The emulated block device should not request any I/Os on itself. That is, it should not call VFS layer functions. (If it did, it will try to acquire VFS locks to guarantee the I/Os sequence.) So we have the resync thread to send resync I/O requests and to wait for the results.
For solving this potential deadlock, we can put the size growth of the emulated block device as the final step of reshape thread.
2017/12/29:
Thanks to Guoqing Jiang <[email protected]>,
we confirmed that there is the same deadlock issue in raid10. It's reproducible and can be fixed by this patch. For raid10.c, we can remove the similar code to prevent deadlock as well since they has been called before.
--- drivers/md/md.c | 13 +++++++++++++ drivers/md/raid10.c | 8 +------- drivers/md/raid5.c | 8 +------- 3 files changed, 15 insertions(+), 14 deletions(-)
drivers/md/md.c +13 -0
@@ -8522,6 +8522,19 @@ void md_do_sync(struct md_thread *threadset_mask_bits (&mddev->sb_flags,0 ,BIT (MD_SB_CHANGE_PENDING ) |BIT (MD_SB_CHANGE_DEVS )); +if (test_bit (MD_RECOVERY_RESHAPE , &mddev->recovery) && + !test_bit (MD_RECOVERY_INTR , &mddev->recovery) && + mddev->delta_disks >0 && + mddev->pers->finish_reshape && + mddev->pers->size && + mddev->queue) { +mddev_lock_nointr (mddev); +md_set_array_sectors (mddev, mddev->pers->size (mddev,0 ,0 )); +mddev_unlock (mddev); +set_capacity (mddev->gendisk, mddev->array_sectors); +revalidate_disk (mddev->gendisk); + } +spin_lock (&mddev->lock);if (!test_bit (MD_RECOVERY_INTR , &mddev->recovery)) {/* We completed so min/max setting can be forgotten if used. */
drivers/md/raid10.c +1 -7
@@ -4693,17 +4693,11 @@ static void raid10_finish_reshape(structreturn ;if (mddev->delta_disks >0 ) { -sector_t size =raid10_size (mddev,0 ,0 ); -md_set_array_sectors (mddev, size);if (mddev->recovery_cp > mddev->resync_max_sectors) { mddev->recovery_cp = mddev->resync_max_sectors;set_bit (MD_RECOVERY_NEEDED , &mddev->recovery); } - mddev->resync_max_sectors = size; -if (mddev->queue) { -set_capacity (mddev->gendisk, mddev->array_sectors); -revalidate_disk (mddev->gendisk); - } + mddev->resync_max_sectors = mddev->array_sectors; }else {int d;rcu_read_lock ();
drivers/md/raid5.c +1 -7
@@ -8001,13 +8001,7 @@ static void raid5_finish_reshape(structif (!test_bit (MD_RECOVERY_INTR , &mddev->recovery)) { -if (mddev->delta_disks >0 ) { -md_set_array_sectors (mddev,raid5_size (mddev,0 ,0 )); -if (mddev->queue) { -set_capacity (mddev->gendisk, mddev->array_sectors); -revalidate_disk (mddev->gendisk); - } - }else { +if (mddev->delta_disks <=0 ) {int d;spin_lock_irq (&conf->device_lock); mddev->degraded =raid5_calc_degraded (conf);
Greg Kroah-Hartman
maintainerPATCH 141/496 md/raid1: fix NULL pointer dereference
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yufen Yu <[email protected]>
[ Upstream commit 3de59bb9d551428cbdc76a9ea57883f82e350b4d ]
In handle_write_finished(), if r1_bio->bios[m] != NULL, it thinks the corresponding conf->mirrors[m].rdev is also not NULL. But, it is not always true.
Even if some io hold replacement rdev(i.e. rdev->nr_pending.count > 0), raid1_remove_disk() can also set the rdev as NULL. That means, bios[m] != NULL, but mirrors[m].rdev is NULL, resulting in NULL pointer dereference in handle_write_finished and sync_request_write.
This patch can fix BUGs as follows:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000140 IP: [<ffffffff815bbbbd>] raid1d+0x2bd/0xfc0 PGD 12ab52067 PUD 12f587067 PMD 0 Oops: 0000 [#1] SMP CPU: 1 PID: 2008 Comm: md3_raid1 Not tainted 4.1.44+ #130 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1.fc26 04/01/2014 Call Trace: ? schedule+0x37/0x90 ? prepare_to_wait_event+0x83/0xf0 md_thread+0x144/0x150 ? wake_atomic_t_function+0x70/0x70 ? md_start_sync+0xf0/0xf0 kthread+0xd8/0xf0 ? kthread_worker_fn+0x160/0x160 ret_from_fork+0x42/0x70 ? kthread_worker_fn+0x160/0x160 BUG: unable to handle kernel NULL pointer dereference at 00000000000000b8 IP: sync_request_write+0x9e/0x980 PGD 800000007c518067 P4D 800000007c518067 PUD 8002b067 PMD 0 Oops: 0000 [#1] SMP PTI CPU: 24 PID: 2549 Comm: md3_raid1 Not tainted 4.15.0+ #118 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1.fc26 04/01/2014 Call Trace: ? sched_clock+0x5/0x10 ? sched_clock_cpu+0xc/0xb0 ? flush_pending_writes+0x3a/0xd0 ? pick_next_task_fair+0x4d5/0x5f0 ? __switch_to+0xa2/0x430 raid1d+0x65a/0x870 ? find_pers+0x70/0x70 ? find_pers+0x70/0x70 ? md_thread+0x11c/0x160 md_thread+0x11c/0x160 ? finish_wait+0x80/0x80 kthread+0x111/0x130 ? kthread_create_worker_on_cpu+0x70/0x70 ? do_syscall_64+0x6f/0x190 ? SyS_exit_group+0x10/0x10 ret_from_fork+0x35/0x40
--- drivers/md/raid1.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/md/raid1.c +11 -0
@@ -1813,6 +1813,17 @@ static int raid1_remove_disk(struct mddestruct md_rdev *repl = conf->mirrors[conf->raid_disks + number].rdev;freeze_array (conf,0 ); +if (atomic_read (&repl->nr_pending)) { +/* It means that some queued IO of retry_list +* hold repl. Thus, we cannot set replacement +* as NULL, avoiding rdev NULL pointer +* dereference in sync_request_write and +* handle_write_finished. +*/ + err = -EBUSY ; +unfreeze_array (conf); + goto abort; + }clear_bit (Replacement, &repl->flags); p->rdev = repl; conf->mirrors[conf->raid_disks + number].rdev =NULL ;
Greg Kroah-Hartman
maintainerPATCH 142/496 batman-adv: fix packet checksum in receive path
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthias Schiffer <[email protected]>
[ Upstream commit abd6360591d3f8259f41c34e31ac4826dfe621b8 ]
eth_type_trans() internally calls skb_pull(), which does not adjust the skb checksum; skb_postpull_rcsum() is necessary to avoid log spam of the form "bat0: hw csum failure" when packets with CHECKSUM_COMPLETE are received.
Note that in usual setups, packets don't reach batman-adv with CHECKSUM_COMPLETE (I assume NICs bail out of checksumming when they see batadv's ethtype?), which is why the log messages do not occur on every system using batman-adv. I could reproduce this issue by stacking batman-adv on top of a VXLAN interface.
--- net/batman-adv/soft-interface.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
net/batman-adv/soft-interface.c +1 -7
@@ -451,13 +451,7 @@ void batadv_interface_rx(struct net_devi/* skb->dev & skb->pkt_type are set here */ skb->protocol =eth_type_trans (skb, soft_iface); - -/* should not be necessary anymore as we use skb_pull_rcsum() -* TODO: please verify this and remove this TODO -* -- Dec 21st 2009, Simon Wunderlich -*/ - -/* skb->ip_summed = CHECKSUM_UNNECESSARY; */ +skb_postpull_rcsum (skb,eth_hdr (skb),ETH_HLEN );batadv_inc_counter (bat_priv,BATADV_CNT_RX ); batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
Greg Kroah-Hartman
maintainerPATCH 143/496 batman-adv: invalidate checksum on fragment reassembly
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthias Schiffer <[email protected]>
[ Upstream commit 3bf2a09da956b43ecfaa630a2ef9a477f991a46a ]
A more sophisticated implementation could try to combine fragment checksums when all fragments have CHECKSUM_COMPLETE and are split at even offsets. For now, we just set ip_summed to CHECKSUM_NONE to avoid "hw csum failure" warnings in the kernel log when fragmented frames are received. In consequence, skb_pull_rcsum() can be replaced with skb_pull().
Note that in usual setups, packets don't reach batman-adv with CHECKSUM_COMPLETE (I assume NICs bail out of checksumming when they see batadv's ethtype?), which is why the log messages do not occur on every system using batman-adv. I could reproduce this issue by stacking batman-adv on top of a VXLAN interface.
--- net/batman-adv/fragmentation.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/batman-adv/fragmentation.c +2 -1
@@ -287,7 +287,8 @@ batadv_frag_merge_packets(struct hlist_h/* Move the existing MAC header to just before the payload. (Override * the fragment header.) */ -skb_pull_rcsum (skb_out, hdr_size); +skb_pull (skb_out, hdr_size); + skb_out->ip_summed =CHECKSUM_NONE ;memmove (skb_out->data -ETH_HLEN ,skb_mac_header (skb_out),ETH_HLEN );skb_set_mac_header (skb_out, -ETH_HLEN );skb_reset_network_header (skb_out);
Greg Kroah-Hartman
maintainerPATCH 144/496 netfilter: ipt_CLUSTERIP: put config struct if we cant increment ct refcount
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 8ae56822812ddedc26a152ab1916eb30120b4748 ]
This needs to put() the entry to avoid a resource leak in error path.
--- net/ipv4/netfilter/ipt_CLUSTERIP.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +6 -2
@@ -492,12 +492,15 @@ static int clusterip_tg_check(const strureturn PTR_ERR (config); } } - cipinfo->config = config; ret =nf_ct_netns_get (par->net, par->family); -if (ret <0 ) +if (ret <0 ) {pr_info ("cannot load conntrack support for proto=%u\n" , par->family); +clusterip_config_entry_put (par->net, config); +clusterip_config_put (config); +return ret; + }if (!par->net->xt.clusterip_deprecated_warning) { pr_info("ipt_CLUSTERIP is deprecated and it will removed soon, "
@@ -505,6 +508,7 @@ static int clusterip_tg_check(const stru par->net->xt.clusterip_deprecated_warning = true; } + cipinfo->config = config;return ret; }
Greg Kroah-Hartman
maintainerPATCH 145/496 netfilter: ipt_CLUSTERIP: put config instead of freeing it
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 1a9da5937386dbe553ffcf6c65d985bd48c347c5 ]
Once struct is added to per-netns list it becomes visible to other cpus, so we cannot use kfree().
Also delay setting entries refcount to 1 until after everything is initialised so that when we call clusterip_config_put() in this spot entries is still zero.
--- net/ipv4/netfilter/ipt_CLUSTERIP.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +4 -3
@@ -228,7 +228,6 @@ clusterip_config_init(struct net *net, c c->hash_mode = i->hash_mode; c->hash_initval = i->hash_initval;refcount_set (&c->refcount,1 ); -refcount_set (&c->entries,1 );spin_lock_bh (&cn->lock);if (__clusterip_config_find (net, ip)) {
@@ -259,8 +258,10 @@ clusterip_config_init(struct net *net, c c->notifier.notifier_call = clusterip_netdev_event; err =register_netdevice_notifier (&c->notifier); -if (!err) +if (!err) { +refcount_set (&c->entries,1 );return c; + }#ifdef CONFIG_PROC_FS proc_remove (c->pde);
@@ -269,7 +270,7 @@ err:spin_lock_bh (&cn->lock);list_del_rcu (&c->list);spin_unlock_bh (&cn->lock); -kfree (c); +clusterip_config_put (c);return ERR_PTR (err); }
Greg Kroah-Hartman
maintainerPATCH 146/496 netfilter: ebtables: convert BUG_ONs to WARN_ONs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit fc6a5d0601c5ac1d02f283a46f60b87b2033e5ca ]
All of these conditions are not fatal and should have been WARN_ONs from the get-go.
Convert them to WARN_ONs and bail out.
--- net/bridge/netfilter/ebtables.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
net/bridge/netfilter/ebtables.c +18 -9
@@ -1641,7 +1641,8 @@ static int compat_match_to_user(struct eint off =ebt_compat_match_offset (match, m->match_size);compat_uint_t msize = m->match_size - off; -BUG_ON (off >= m->match_size); +if (WARN_ON (off >= m->match_size)) +return -EINVAL ;if (copy_to_user (cm->u.name, match->name,strlen (match->name) +1 ) ||put_user (msize, &cm->match_size))
@@ -1671,7 +1672,8 @@ static int compat_target_to_user(structint off =xt_compat_target_offset (target);compat_uint_t tsize = t->target_size - off; -BUG_ON (off >= t->target_size); +if (WARN_ON (off >= t->target_size)) +return -EINVAL ;if (copy_to_user (cm->u.name, target->name,strlen (target->name) +1 ) ||put_user (tsize, &cm->match_size))
@@ -1907,7 +1909,8 @@ static int ebt_buf_add(struct ebt_entrieif (state->buf_kern_start ==NULL ) goto count_only; -BUG_ON (state->buf_kern_offset + sz > state->buf_kern_len); +if (WARN_ON (state->buf_kern_offset + sz > state->buf_kern_len)) +return -EINVAL ;memcpy (state->buf_kern_start + state->buf_kern_offset, data, sz);
@@ -1920,7 +1923,8 @@ static int ebt_buf_add_pad(struct ebt_en {char *b = state->buf_kern_start; -BUG_ON (b && state->buf_kern_offset > state->buf_kern_len); +if (WARN_ON (b && state->buf_kern_offset > state->buf_kern_len)) +return -EINVAL ;if (b !=NULL && sz >0 )memset (b + state->buf_kern_offset,0 , sz);
@@ -1997,8 +2001,10 @@ static int compat_mtw_from_user(struct c pad =XT_ALIGN (size_kern) - size_kern;if (pad >0 && dst) { -BUG_ON (state->buf_kern_len <= pad); -BUG_ON (state->buf_kern_offset - (match_size + off) + size_kern > state->buf_kern_len - pad); +if (WARN_ON (state->buf_kern_len <= pad)) +return -EINVAL ; +if (WARN_ON (state->buf_kern_offset - (match_size + off) + size_kern > state->buf_kern_len - pad)) +return -EINVAL ;memset (dst + size_kern,0 , pad); }return off + match_size;
@@ -2048,7 +2054,8 @@ static int ebt_size_mwt(struct compat_ebif (ret <0 )return ret; -BUG_ON (ret < match32->match_size); +if (WARN_ON (ret < match32->match_size)) +return -EINVAL ; growth += ret - match32->match_size; growth +=ebt_compat_entry_padsize ();
@@ -2157,7 +2164,8 @@ static int size_entry_mwt(struct ebt_ent startoff = state->buf_user_offset - startoff; -BUG_ON (*total < startoff); +if (WARN_ON (*total < startoff)) +return -EINVAL ; *total -= startoff;return 0 ; }
@@ -2286,7 +2294,8 @@ static int compat_do_replace(struct net state.buf_kern_len = size64; ret =compat_copy_entries (entries_tmp, tmp.entries_size, &state); -BUG_ON (ret <0 );/* parses same data again */ +if (WARN_ON (ret <0 )) + goto out_unlock;vfree (entries_tmp); tmp.entries_size = size64;
Greg Kroah-Hartman
maintainerPATCH 147/496 batman-adv: Ignore invalid batadv_iv_gw during netlink send
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
[ Upstream commit 10d570284258a30dc104c50787c5289ec49f3d23 ]
The function batadv_iv_gw_dump stops the processing loop when batadv_iv_gw_dump_entry returns a non-0 return code. This should only happen when the buffer is full. Otherwise, an empty message may be returned by batadv_gw_dump. This empty message will then stop the netlink dumping of gateway entries. At worst, not a single entry is returned to userspace even when plenty of possible gateways exist.
--- net/batman-adv/bat_iv_ogm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/batman-adv/bat_iv_ogm.c +1 -1
@@ -2719,7 +2719,7 @@ static int batadv_iv_gw_dump_entry(strucstruct batadv_neigh_ifinfo *router_ifinfo =NULL ;struct batadv_neigh_node *router;struct batadv_gw_node *curr_gw; -int ret = -EINVAL ; +int ret =0 ;void *hdr; router =batadv_orig_router_get (gw_node->orig_node,BATADV_IF_DEFAULT );
Greg Kroah-Hartman
maintainerPATCH 148/496 batman-adv: Ignore invalid batadv_v_gw during netlink send
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
[ Upstream commit 011c935fceae5252619ef730baa610c655281dda ]
The function batadv_v_gw_dump stops the processing loop when batadv_v_gw_dump_entry returns a non-0 return code. This should only happen when the buffer is full. Otherwise, an empty message may be returned by batadv_gw_dump. This empty message will then stop the netlink dumping of gateway entries. At worst, not a single entry is returned to userspace even when plenty of possible gateways exist.
--- net/batman-adv/bat_v.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/batman-adv/bat_v.c +1 -1
@@ -930,7 +930,7 @@ static int batadv_v_gw_dump_entry(structstruct batadv_neigh_ifinfo *router_ifinfo =NULL ;struct batadv_neigh_node *router;struct batadv_gw_node *curr_gw; -int ret = -EINVAL ; +int ret =0 ;void *hdr; router =batadv_orig_router_get (gw_node->orig_node,BATADV_IF_DEFAULT );
Greg Kroah-Hartman
maintainerPATCH 151/496 nvme-pci: Fix nvme queue cleanup if IRQ setup fails
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jianchao Wang <[email protected]>
[ Upstream commit f25a2dfc20e3a3ed8fe6618c331799dd7bd01190 ]
This patch fixes nvme queue cleanup if requesting an IRQ handler for the queue's vector fails. It does this by resetting the cq_vector to the uninitialized value of -1 so it is ignored for a controller reset.
--- drivers/nvme/host/pci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/nvme/host/pci.c +4 -1
@@ -1322,7 +1322,7 @@ static int nvme_create_queue(struct nvme nvmeq->cq_vector = qid -1 ; result =adapter_alloc_cq (dev, qid, nvmeq);if (result <0 ) -return result; + goto release_vector; result =adapter_alloc_sq (dev, qid, nvmeq);if (result <0 )
@@ -1336,9 +1336,12 @@ static int nvme_create_queue(struct nvmereturn result; release_sq: + dev->online_queues--;adapter_delete_sq (dev, qid); release_cq:adapter_delete_cq (dev, qid); + release_vector: + nvmeq->cq_vector =-1 ;return result; }
Greg Kroah-Hartman
maintainerPATCH 152/496 clocksource/drivers/fsl_ftm_timer: Fix error return checking
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
[ Upstream commit f287eb9013ccf199cbfa4eabd80c36fedfc15a73 ]
The error checks on freq for a negative error return always fails because freq is unsigned and can never be negative. Fix this by making freq a signed long.
Detected with Coccinelle:
drivers/clocksource/fsl_ftm_timer.c:287:5-9: WARNING: Unsigned expression compared with zero: freq <= 0 drivers/clocksource/fsl_ftm_timer.c:291:5-9: WARNING: Unsigned expression compared with zero: freq <= 0
--- drivers/clocksource/fsl_ftm_timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clocksource/fsl_ftm_timer.c +1 -1
@@ -281,7 +281,7 @@ static int __init __ftm_clk_init(structstatic unsigned long __init ftm_clk_init (struct device_node *np) { -unsigned long freq; +long freq; freq =__ftm_clk_init (np,"ftm-evt-counter-en" ,"ftm-evt" );if (freq <=0 )
Greg Kroah-Hartman
maintainerPATCH 153/496 libceph, ceph: avoid memory leak when specifying same option several times
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengguang Xu <[email protected]>
[ Upstream commit 937441f3a3158d5510ca8cc78a82453f57a96365 ]
When parsing string option, in order to avoid memory leak we need to carefully free it first in case of specifying same option several times.
--- fs/ceph/super.c | 2 ++ net/ceph/ceph_common.c | 7 +++++++ 2 files changed, 9 insertions(+)
fs/ceph/super.c +2 -0
@@ -224,6 +224,7 @@ static int parse_fsopt_token(char *c, voreturn -ENOMEM ;break ;case Opt_mds_namespace: +kfree (fsopt->mds_namespace); fsopt->mds_namespace =kstrndup (argstr[0 ].from, argstr[0 ].to-argstr[0 ].from,GFP_KERNEL );
@@ -231,6 +232,7 @@ static int parse_fsopt_token(char *c, voreturn -ENOMEM ;break ;case Opt_fscache_uniq: +kfree (fsopt->fscache_uniq); fsopt->fscache_uniq =kstrndup (argstr[0 ].from, argstr[0 ].to-argstr[0 ].from,GFP_KERNEL );
net/ceph/ceph_common.c +7 -0
@@ -418,11 +418,15 @@ ceph_parse_options(char *options, const opt->flags |=CEPH_OPT_FSID ;break ;case Opt_name: +kfree (opt->name); opt->name =kstrndup (argstr[0 ].from, argstr[0 ].to-argstr[0 ].from,GFP_KERNEL );break ;case Opt_secret: +ceph_crypto_key_destroy (opt->key); +kfree (opt->key); + opt->key =kzalloc (sizeof (*opt->key),GFP_KERNEL );if (!opt->key) { err = -ENOMEM ;
@@ -433,6 +437,9 @@ ceph_parse_options(char *options, const goto out;break ;case Opt_key: +ceph_crypto_key_destroy (opt->key); +kfree (opt->key); + opt->key =kzalloc (sizeof (*opt->key),GFP_KERNEL );if (!opt->key) { err = -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 154/496 ceph: fix dentry leak when failing to init debugfs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengguang Xu <[email protected]>
[ Upstream commit 18106734b512664a8541026519ce4b862498b6c3 ]
When failing from ceph_fs_debugfs_init() in ceph_real_mount(), there is lack of dput of root_dentry and it causes slab errors, so change the calling order of ceph_fs_debugfs_init() and open_root_dentry() and do some cleanups to avoid this issue.
--- fs/ceph/super.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)
fs/ceph/super.c +5 -11
@@ -837,7 +837,6 @@ static struct dentry *ceph_real_mount(stint err;unsigned long started = jiffies;/* note the start time */ struct dentry *root; -int first =0 ;/* first vfsmount for this super_block */ dout ("mount start %p\n" , fsc);mutex_lock (&fsc->client->mount_mutex);
@@ -862,17 +861,17 @@ static struct dentry *ceph_real_mount(st path = fsc->mount_options->server_path +1 ;dout ("mount opening path %s\n" , path); } + + err =ceph_fs_debugfs_init (fsc); +if (err <0 ) + goto out; + root =open_root_dentry (fsc, path, started);if (IS_ERR (root)) { err =PTR_ERR (root); goto out; } fsc->sb->s_root =dget (root); - first =1 ; - - err =ceph_fs_debugfs_init (fsc); -if (err <0 ) - goto fail; }else { root =dget (fsc->sb->s_root); }
@@ -882,11 +881,6 @@ static struct dentry *ceph_real_mount(stmutex_unlock (&fsc->client->mount_mutex);return root; -fail: -if (first) { -dput (fsc->sb->s_root); - fsc->sb->s_root =NULL ; - } out:mutex_unlock (&fsc->client->mount_mutex);return ERR_PTR (err);
Greg Kroah-Hartman
maintainerPATCH 155/496 xen/pvcalls: fix null pointer dereference on map->sock
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
[ Upstream commit 68d2059be660944152ba667e43c3b4ec225974bc ]
Currently if map is null then a potential null pointer deference occurs when calling sock_release on map->sock. I believe the actual intention was to call sock_release on sock instead. Fix this.
--- drivers/xen/pvcalls-back.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/xen/pvcalls-back.c +1 -1
@@ -424,7 +424,7 @@ static int pvcalls_back_connect(struct x sock);if (!map) { ret = -EFAULT ; -sock_release (map->sock); +sock_release (sock); } out:
Greg Kroah-Hartman
maintainerPATCH 156/496 ARM: orion5x: Revert commit 4904dbda41c8.
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 13a55372b64e00e564a08d785ca87bd9d454ba30 ]
It is not valid for orion5x to use mac_pton().
First of all, the orion5x buffer is not NULL terminated. mac_pton() has no business operating on non-NULL terminated buffers because only the caller can know that this is valid and in what manner it is ok to parse this NULL'less buffer.
Second of all, orion5x operates on an __iomem pointer, which cannot be dereferenced using normal C pointer operations. Accesses to such areas much be performed with the proper iomem accessors.
--- arch/arm/mach-orion5x/Kconfig | 3 - arch/arm/mach-orion5x/dns323-setup.c | 53 +++++++++++++++++++++++++++++++++-- arch/arm/mach-orion5x/tsx09-common.c | 49 +++++++++++++++++++++++++++++--- 3 files changed, 95 insertions(+), 10 deletions(-)
arch/arm/mach-orion5x/Kconfig +0 -3
@@ -58,7 +58,6 @@ config MACH_KUROBOX_PRO config MACH_DNS323 bool "D-Link DNS-323" - select GENERIC_NET_UTILS select I2C_BOARDINFO if I2C help Say 'Y' here if you want your kernel to support the
@@ -66,7 +65,6 @@ config MACH_DNS323 config MACH_TS209 bool "QNAP TS-109/TS-209" - select GENERIC_NET_UTILS help Say 'Y' here if you want your kernel to support the QNAP TS-109/TS-209 platform.
@@ -101,7 +99,6 @@ config MACH_LINKSTATION_LS_HGL config MACH_TS409 bool "QNAP TS-409" - select GENERIC_NET_UTILS help Say 'Y' here if you want your kernel to support the QNAP TS-409 platform.
arch/arm/mach-orion5x/dns323-setup.c +50 -3
68 lines not on this page · raw message
arch/arm/mach-orion5x/tsx09-common.c +45 -4
69 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 157/496 qrtr: add MODULE_ALIAS macro to smd
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ramon Fried <[email protected]>
[ Upstream commit c77f5fbbefc04612755117775e8555c2a7006cac ]
Added MODULE_ALIAS("rpmsg:IPCRTR") to ensure qrtr-smd and qrtr will load when IPCRTR channel is detected.
--- net/qrtr/smd.c | 1 + 1 file changed, 1 insertion(+)
net/qrtr/smd.c +1 -0
@@ -114,5 +114,6 @@ static struct rpmsg_driver qcom_smd_qrtrmodule_rpmsg_driver (qcom_smd_qrtr_driver); +MODULE_ALIAS ("rpmsg:IPCRTR" );MODULE_DESCRIPTION ("Qualcomm IPC-Router SMD interface driver" );MODULE_LICENSE ("GPL v2" );
Greg Kroah-Hartman
maintainerPATCH 159/496 r8152: fix tx packets accounting
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 4c27bf3c5b7434ccb9ab962301da661c26b467a4 ]
r8152 driver handles TSO packets (limited to ~16KB) quite well, but pretends each TSO logical packet is a single packet on the wire.
There is also some error since headers are accounted once, but error rate is small enough that we do not care.
--- drivers/net/usb/r8152.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/usb/r8152.c +1 -1
@@ -1793,7 +1793,7 @@ static int r8152_tx_agg_fill(struct r815 tx_data += len; agg->skb_len += len; - agg->skb_num++; + agg->skb_num +=skb_shinfo (skb)->gso_segs ?:1 ;dev_kfree_skb_any (skb);