4.14.108-stable review
Greg Kroah-Hartman
maintainercover 4.14.108-stable review
This is the start of the stable review cycle for the 4.14.108 release. There are 183 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 Sun Mar 24 11:11:06 UTC 2019. 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.108-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.108-rc1
Martin Schwidefsky <[email protected]>
s390/setup: fix boot crash for machine without EDAT-1
Sean Christopherson <[email protected]>
KVM: nVMX: Ignore limit checks on VMX instructions using flat segments
Sean Christopherson <[email protected]>
KVM: nVMX: Apply addr size mask to effective address for VMX instructions
Sean Christopherson <[email protected]>
KVM: nVMX: Sign extend displacements of VMX instr's mem operands
Sean Christopherson <[email protected]>
KVM: x86/mmu: Do not cache MMIO accesses while memslots are in flux
Sean Christopherson <[email protected]>
KVM: x86/mmu: Detect MMIO generation wrap in any address space
Sean Christopherson <[email protected]>
KVM: Call kvm_arch_memslots_updated() before updating memslots
Gustavo A. R. Silva <[email protected]>
drm/radeon/evergreen_cs: fix missing break in switch statement
Steve Longerbeam <[email protected]>
media: imx: csi: Stop upstream before disabling IDMA channel
Steve Longerbeam <[email protected]>
media: imx: csi: Disable CSI immediately after last EOF
Lucas A. M. Magalhães <[email protected]>
media: vimc: Add vimc-streamer for stream control
Sakari Ailus <[email protected]>
media: uvcvideo: Avoid NULL pointer dereference at the end of streaming
Steve Longerbeam <[email protected]>
media: imx: prpencvf: Stop upstream before disabling IDMA channel
Zhang, Jun <[email protected]>
rcu: Do RCU GP kthread self-wakeup from softirq and interrupt
Jarkko Sakkinen <[email protected]>
tpm: Unify the send callback behaviour
Jarkko Sakkinen <[email protected]>
tpm/tpm_crb: Avoid unaligned reads in crb_recv()
Aditya Pakki <[email protected]>
md: Fix failed allocation of md_register_thread
Adrian Hunter <[email protected]>
perf intel-pt: Fix divide by zero when TSC is not available
Adrian Hunter <[email protected]>
perf intel-pt: Fix overlap calculation for padding
Adrian Hunter <[email protected]>
perf auxtrace: Define auxtrace record alignment
Adrian Hunter <[email protected]>
perf intel-pt: Fix CYC timestamp calculation after OVF
Josh Poimboeuf <[email protected]>
x86/unwind/orc: Fix ORC unwind table alignment
Daniel Axtens <[email protected]>
bcache: never writeback a discard operation
Viresh Kumar <[email protected]>
PM / wakeup: Rework wakeup source timer cancellation
Trond Myklebust <[email protected]>
NFSv4.1: Reinitialise sequence results before retransmitting a request
Yihao Wu <[email protected]>
nfsd: fix wrong check in write_v4_end_grace()
NeilBrown <[email protected]>
nfsd: fix memory corruption caused by readdir
Trond Myklebust <[email protected]>
NFS: Don't recoalesce on error in nfs_pageio_complete_mirror()
Trond Myklebust <[email protected]>
NFS: Fix an I/O request leakage in nfs_do_recoalesce
Trond Myklebust <[email protected]>
NFS: Fix I/O request leakages
Pavel Machek <[email protected]>
cpcap-charger: generate events for userspace
Mikulas Patocka <[email protected]>
dm integrity: limit the rate of error messages
NeilBrown <[email protected]>
dm: fix to_sector() for 32bit
Dave Martin <[email protected]>
arm64: KVM: Fix architecturally invalid reset value for FPEXC32_EL2
Will Deacon <[email protected]>
arm64: debug: Ensure debug handlers check triggering exception level
Julien Thierry <[email protected]>
arm64: Fix HCR.TGE status for NMI contexts
Gustavo A. R. Silva <[email protected]>
ARM: s3c24xx: Fix boolean expressions in osiris_dvs_notify
Christophe Leroy <[email protected]>
powerpc/traps: Fix the message printed when stack overflows
Christophe Leroy <[email protected]>
powerpc/traps: fix recoverability of machine check handling on book3s/32
Aneesh Kumar K.V <[email protected]>
powerpc/hugetlb: Don't do runtime allocation of 16G pages in LPAR configuration
Michael Ellerman <[email protected]>
powerpc/ptrace: Simplify vr_get/set() to avoid GCC warning
Mark Cave-Ayland <[email protected]>
powerpc: Fix 32-bit KVM-PR lockup and host crash with MacOS guest
Christophe Leroy <[email protected]>
powerpc/83xx: Also save/restore SPRG4-7 during suspend
Jordan Niethe <[email protected]>
powerpc/powernv: Make opal log only readable by root
Christophe Leroy <[email protected]>
powerpc/wii: properly disable use of BATs when requested.
Christophe Leroy <[email protected]>
powerpc/32: Clear on-stack exception marker upon exception return
J. Bruce Fields <[email protected]>
security/selinux: fix SECURITY_LSM_NATIVE_LABELS on reused superblock
zhangyi (F) <[email protected]>
jbd2: fix compile warning when using JBUFFER_TRACE
zhangyi (F) <[email protected]>
jbd2: clear dirty flag when revoking a buffer from an older transaction
Jay Dolan <[email protected]>
serial: 8250_pci: Have ACCES cards that use the four port Pericom PI7C9X7954 chip use the pci_pericom_setup()
Jay Dolan <[email protected]>
serial: 8250_pci: Fix number of ports for ACCES serial cards
Lubomir Rintel <[email protected]>
serial: 8250_of: assume reg-shift of 2 for mrvl,mmp-uart
Anssi Hannula <[email protected]>
serial: uartps: Fix stuck ISR if RX disabled with non-empty FIFO
Tvrtko Ursulin <[email protected]>
drm/i915: Relax mmap VMA check
Eric Biggers <[email protected]>
crypto: arm64/aes-neonbs - fix returning final keystream block
Sowjanya Komatineni <[email protected]>
i2c: tegra: fix maximum transfer size
QiaoChong <[email protected]>
parport_pc: fix find_superio io compare code, should use equal test.
Alexander Shishkin <[email protected]>
intel_th: Don't reference unassigned outputs
Heikki Krogerus <[email protected]>
device property: Fix the length used in PROPERTY_ENTRY_STRING()
Zev Weiss <[email protected]>
kernel/sysctl.c: add missing range check in do_proc_dointvec_minmax_conv
Roman Penyaev <[email protected]>
mm/vmalloc: fix size check for remap_vmalloc_range_partial()
zhongjiang <[email protected]>
mm: hwpoison: fix thp split handing in soft_offline_in_use_page()
Dexuan Cui <[email protected]>
nfit: acpi_nfit_ctl(): Check out_obj->type in the right place
Dmitry Osipenko <[email protected]>
usb: chipidea: tegra: Fix missed ci_hdrc_remove_device()
Paul Cercueil <[email protected]>
clk: ingenic: Fix doc of ingenic_cgu_div_info
Paul Cercueil <[email protected]>
clk: ingenic: Fix round_rate misbehaving with non-integer dividers
Tony Lindgren <[email protected]>
clk: clk-twl6040: Fix imprecise external abort for pdmclk
Kunihiko Hayashi <[email protected]>
clk: uniphier: Fix update register for CPU-gear
Jan Kara <[email protected]>
ext2: Fix underflow in ext2_max_size()
Vaibhav Jain <[email protected]>
cxl: Wrap iterations over afu slices inside 'afu_list_lock'
Michael J. Ruhl <[email protected]>
IB/hfi1: Close race condition on user context disable and close
Jan Kara <[email protected]>
ext4: fix crash during online resizing
yangerkun <[email protected]>
ext4: add mask of ext4 flags to swap
Arnd Bergmann <[email protected]>
cpufreq: pxa2xx: remove incorrect __init annotation
Yangtao Li <[email protected]>
cpufreq: tegra124: add missing of_node_put()
Masami Hiramatsu <[email protected]>
x86/kprobes: Prohibit probing on optprobe template code
Zenghui Yu <[email protected]>
irqchip/gic-v3-its: Avoid parsing _indirect_ twice for Device table
Lubomir Rintel <[email protected]>
libertas_tf: don't set URB_ZERO_PACKET on IN USB transfer
Eric Biggers <[email protected]>
crypto: pcbc - remove bogus memcpy()s with src == dest
Filipe Manana <[email protected]>
Btrfs: fix corruption reading shared and compressed extents after hole punching
Johannes Thumshirn <[email protected]>
btrfs: ensure that a DUP or RAID1 block group has exactly two stripes
Filipe Manana <[email protected]>
Btrfs: setup a nofs context for memory allocation at __btrfs_set_acl
Finn Thain <[email protected]>
m68k: Add -ffreestanding to CFLAGS
Jann Horn <[email protected]>
splice: don't merge into linked buffers
Varad Gautam <[email protected]>
fs/devpts: always delete dcache dentry-s in dput()
Bart Van Assche <[email protected]>
scsi: target/iscsi: Avoid iscsit_release_commands_from_conn() deadlock
Martin K. Petersen <[email protected]>
scsi: sd: Optimal I/O size should be a multiple of physical block size
Sagar Biradar <[email protected]>
scsi: aacraid: Fix performance issue on logical drives
Felipe Franciosi <[email protected]>
scsi: virtio_scsi: don't send sc payload with tmfs
Halil Pasic <[email protected]>
s390/virtio: handle find on invalid queue gracefully
Martin Schwidefsky <[email protected]>
s390/setup: fix early warning messages
Stuart Menefy <[email protected]>
clocksource/drivers/exynos_mct: Clear timer interrupt when shutdown
Stuart Menefy <[email protected]>
clocksource/drivers/exynos_mct: Move one-shot check from tick clear to ISR
Stuart Menefy <[email protected]>
regulator: s2mpa01: Fix step values for some LDOs
Mark Zhang <[email protected]>
regulator: max77620: Initialize values for DT properties
Krzysztof Kozlowski <[email protected]>
regulator: s2mps11: Fix steps for buck7, buck8 and LDO35
Andy Shevchenko <[email protected]>
spi: pxa2xx: Setup maximum supported DMA transfer length
Vignesh R <[email protected]>
spi: ti-qspi: Fix mmap read when more than one CS in use
BOUGH CHEN <[email protected]>
mmc: sdhci-esdhc-imx: fix HS400 timing issue
Andy Shevchenko <[email protected]>
ACPI / device_sysfs: Avoid OF modalias creation for removed device
Juergen Gross <[email protected]>
xen: fix dom0 boot on huge systems
zhangyi (F) <[email protected]>
tracing: Do not free iter->trace in fail path of tracing_open_pipe()
Tom Zanussi <[email protected]>
tracing: Use strncpy instead of memcpy for string keys in hist triggers
Pavel Shilovsky <[email protected]>
CIFS: Fix read after write for files with read caching
Pavel Shilovsky <[email protected]>
CIFS: Do not reset lease state to NONE on lease break
Ard Biesheuvel <[email protected]>
crypto: arm64/aes-ccm - fix bugs in non-NEON fallback routine
Ard Biesheuvel <[email protected]>
crypto: arm64/aes-ccm - fix logical bug in AAD MAC handling
Eric Biggers <[email protected]>
crypto: testmgr - skip crc32c context test for ahash algorithms
Eric Biggers <[email protected]>
crypto: hash - set CRYPTO_TFM_NEED_KEY if ->setkey() fails
Ard Biesheuvel <[email protected]>
crypto: arm64/crct10dif - revert to C code for short inputs
Ard Biesheuvel <[email protected]>
crypto: arm/crct10dif - revert to C code for short inputs
Al Viro <[email protected]>
fix cgroup_do_mount() handling of failure exits
Oliver O'Halloran <[email protected]>
libnvdimm: Fix altmap reservation size calculation
Dan Williams <[email protected]>
libnvdimm/pmem: Honor force_raw for legacy pmem regions
Wei Yang <[email protected]>
libnvdimm, pfn: Fix over-trim in trim_pfn_device()
Dan Williams <[email protected]>
libnvdimm/label: Clear 'updating' flag after label-set update
Alexander Shishkin <[email protected]>
stm class: Prevent division by zero
Hans Verkuil <[email protected]>
media: videobuf2-v4l2: drop WARN_ON in vb2_warn_zero_bytesused()
Darrick J. Wong <[email protected]>
tmpfs: fix uninitialized return value in shmem_link
Mao Wenan <[email protected]>
net: set static variable an initial value in atl2_probe()
Jiong Wang <[email protected]>
nfp: bpf: fix ALU32 high bits clearance bug
Jiong Wang <[email protected]>
nfp: bpf: fix code-gen bug on BPF_ALU | BPF_XOR | BPF_K
Vadim Lomovtsev <[email protected]>
net: thunderx: make CFG_DONE message to run through generic send-ack sequence
Li RongQing <[email protected]>
mac80211_hwsim: propagate genlmsg_reply return code
Arnd Bergmann <[email protected]>
phonet: fix building with clang
Vineet Gupta <[email protected]>
ARCv2: support manual regfile save on interrupts
Vineet Gupta <[email protected]>
ARC: uacces: remove lp_start, lp_end from clobber list
Eugeniy Paltsev <[email protected]>
ARCv2: lib: memcpy: fix doing prefetchw outside of buffer
Jeff Kirsher <[email protected]>
ixgbe: fix older devices that do not support IXGBE_MRQC_L3L4TXSWEN
Darrick J. Wong <[email protected]>
tmpfs: fix link accounting when a tmpfile is linked in
Russell King <[email protected]>
net: marvell: mvneta: fix DMA debug warning
Vladimir Murzin <[email protected]>
arm64: Relax GIC version check during early boot
Michal Kalderon <[email protected]>
qed: Fix iWARP syn packet mac address validation.
Bard liao <[email protected]>
ASoC: topology: free created components in tplg load error
Rayagonda Kokatanur <[email protected]>
mailbox: bcm-flexrm-mailbox: Fix FlexRM ring flush timeout issue
Alexey Khoroshilov <[email protected]>
net: mv643xx_eth: disable clk on error path in mv643xx_eth_shared_probe()
Beniamino Galvani <[email protected]>
qmi_wwan: apply SET_DTR quirk to Sierra WP7607
Martin Blumenstingl <[email protected]>
pinctrl: meson: meson8b: fix the sdxc_a data 1..3 pins
Florian Fainelli <[email protected]>
net: systemport: Fix reception of BPDUs
Anoob Soman <[email protected]>
scsi: libiscsi: Fix race between iscsi_xmit_task and iscsi_complete_task
David Howells <[email protected]>
keys: Fix dependency loop between construction record and auth key
David Howells <[email protected]>
assoc_array: Fix shortcut creation
Sean Tranchetti <[email protected]>
af_key: unconditionally clone on broadcast
Dietmar Eggemann <[email protected]>
ARM: 8824/1: fix a migrating irq bug when hotplug cpu
Martin Willi <[email protected]>
esp: Skip TX bytes accounting when sending from a request socket
Andre Przywara <[email protected]>
clk: sunxi: A31: Fix wrong AHB gate number
Paul Kocialkowski <[email protected]>
clk: sunxi-ng: v3s: Fix TCON reset de-assert bit
Gabriel Fernandez <[email protected]>
Input: st-keyscan - fix potential zalloc NULL dereference
Miguel Ojeda <[email protected]>
auxdisplay: ht16k33: fix potential user-after-free on module unload
Paul Kocialkowski <[email protected]>
i2c: bcm2835: Clear current buffer pointers and counts after a transfer
Shubhrajyoti Datta <[email protected]>
i2c: cadence: Fix the hold bit setting
Huang Zijiang <[email protected]>
net: hns: Fix object reference leaks in hns_dsaf_roce_reset()
Jann Horn <[email protected]>
mm: page_alloc: fix ref bias in page_frag_alloc() for 1-byte allocs
Qian Cai <[email protected]>
Revert "mm: use early_pfn_to_nid in page_ext_init"
Yu Zhao <[email protected]>
mm/gup: fix gup_pmd_range() for dax
Benjamin Coddington <[email protected]>
NFS: Don't use page_file_mapping after removing the page
Yufen Yu <[email protected]>
floppy: check_events callback should not return a negative number
Andrea Claudi <[email protected]>
ipvs: fix dependency on nf_defrag_ipv6
Ilan Peer <[email protected]>
mac80211: Fix Tx aggregation session tear down with ITXQs
Dmitry Torokhov <[email protected]>
Input: matrix_keypad - use flush_delayed_work()
Dmitry Torokhov <[email protected]>
Input: ps2-gpio - flush TX work when closing port
Dmitry Torokhov <[email protected]>
Input: cap11xx - switch to using set_brightness_blocking()
Russell King <[email protected]>
ARM: OMAP2+: fix lack of timer interrupts on CPU1 after hotplug
Christoffer Dall <[email protected]>
KVM: arm/arm64: Reset the VCPU without preemption and vcpu state loaded
Kuninori Morimoto <[email protected]>
ASoC: rsnd: fixup rsnd_ssi_master_clk_start() user count check
Pierre-Louis Bossart <[email protected]>
ASoC: dapm: fix out-of-bounds accesses to DAPM lookup tables
Yizhuo <[email protected]>
ARM: OMAP2+: Variable "reg" in function omap4_dsi_mux_pads() could be uninitialized
Paweł Chmiel <[email protected]>
Input: pwm-vibra - stop regulator after disabling pwm, not before
Jonathan Bakker <[email protected]>
Input: pwm-vibra - prevent unbalanced regulator
Stefan Haberland <[email protected]>
s390/dasd: fix using offset into zero size array error
Steve Longerbeam <[email protected]>
gpu: ipu-v3: Fix CSI offsets for imx53
Julia Lawall <[email protected]>
drm/imx: imx-ldb: add missing of_node_puts
Alexander Shiyan <[email protected]>
gpu: ipu-v3: Fix i.MX51 CSI control registers offset
Philipp Zabel <[email protected]>
drm/imx: ignore plane updates on disabled crtcs
Zhang Zhijie <[email protected]>
crypto: rockchip - update new iv to device in multiple operations
Zhang Zhijie <[email protected]>
crypto: rockchip - fix scatterlist nents error
Eric Biggers <[email protected]>
crypto: ahash - fix another early termination in hash walk
Pankaj Gupta <[email protected]>
crypto: caam - fixed handling of sg list
Zhi Jin <[email protected]>
stm class: Fix an endless loop in channel allocation
Krzysztof Kozlowski <[email protected]>
iio: adc: exynos-adc: Fix NULL pointer exception on unbind
S.j. Wang <[email protected]>
ASoC: fsl_esai: fix register setting issue in RIGHT_J mode
zhengbin <[email protected]>
9p/net: fix memory leak in p9_client_create
Hou Tao <[email protected]>
9p: use inode->i_lock to protect i_size_write() under 32-bit
-------------
Diffstat:
Makefile | 4 +- arch/arc/Kconfig | 8 + arch/arc/include/asm/entry-arcv2.h | 54 ++++++ arch/arc/include/asm/uaccess.h | 8 +- arch/arc/kernel/entry-arcv2.S | 4 +- arch/arc/kernel/intc-arcv2.c | 2 + arch/arc/lib/memcpy-archs.S | 14 -- arch/arc/plat-hsdk/Kconfig | 1 + arch/arm/Kconfig | 1 + arch/arm/crypto/crct10dif-ce-core.S | 14 +- arch/arm/crypto/crct10dif-ce-glue.c | 23 +-- arch/arm/include/asm/irq.h | 1 - arch/arm/kernel/irq.c | 62 ------- arch/arm/kernel/smp.c | 2 +- arch/arm/mach-omap2/cpuidle44xx.c | 16 +- arch/arm/mach-omap2/display.c | 7 +- arch/arm/mach-s3c24xx/mach-osiris-dvs.c | 8 +- arch/arm64/crypto/aes-ce-ccm-core.S | 5 +- arch/arm64/crypto/aes-ce-ccm-glue.c | 4 +- arch/arm64/crypto/aes-neonbs-core.S | 5 +- arch/arm64/crypto/crct10dif-ce-glue.c | 25 +-- arch/arm64/include/asm/hardirq.h | 31 ++++ arch/arm64/kernel/head.S | 3 +- arch/arm64/kernel/irq.c | 3 + arch/arm64/kernel/kgdb.c | 14 +- arch/arm64/kernel/probes/kprobes.c | 6 + arch/arm64/kvm/reset.c | 26 ++- arch/arm64/kvm/sys_regs.c | 2 +- arch/m68k/Makefile | 5 +- arch/mips/include/asm/kvm_host.h | 2 +- arch/powerpc/include/asm/book3s/64/hugetlb.h | 8 + arch/powerpc/include/asm/kvm_host.h | 2 +- arch/powerpc/kernel/entry_32.S | 9 + arch/powerpc/kernel/process.c | 2 +- arch/powerpc/kernel/ptrace.c | 10 +- arch/powerpc/kernel/traps.c | 12 +- arch/powerpc/platforms/83xx/suspend-asm.S | 34 +++- arch/powerpc/platforms/embedded6xx/wii.c | 4 + arch/powerpc/platforms/powernv/opal-msglog.c | 2 +- arch/s390/include/asm/kvm_host.h | 2 +- arch/s390/kernel/setup.c | 31 +++- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kernel/kprobes/opt.c | 5 + arch/x86/kvm/mmu.c | 23 ++- arch/x86/kvm/vmx.c | 41 ++++- arch/x86/kvm/x86.c | 4 +- arch/x86/kvm/x86.h | 7 +- arch/x86/xen/mmu_pv.c | 13 +- crypto/ahash.c | 42 +++-- crypto/pcbc.c | 14 +- crypto/shash.c | 18 +- crypto/testmgr.c | 14 +- drivers/acpi/device_sysfs.c | 6 +- drivers/acpi/nfit/core.c | 14 +- drivers/auxdisplay/ht16k33.c | 2 +- drivers/base/power/wakeup.c | 8 +- drivers/block/floppy.c | 2 +- drivers/char/tpm/st33zp24/st33zp24.c | 2 +- drivers/char/tpm/tpm-interface.c | 11 +- drivers/char/tpm/tpm_atmel.c | 2 +- drivers/char/tpm/tpm_crb.c | 22 ++- drivers/char/tpm/tpm_i2c_atmel.c | 6 +- drivers/char/tpm/tpm_i2c_infineon.c | 2 +- drivers/char/tpm/tpm_i2c_nuvoton.c | 2 +- drivers/char/tpm/tpm_ibmvtpm.c | 8 +- drivers/char/tpm/tpm_infineon.c | 2 +- drivers/char/tpm/tpm_nsc.c | 2 +- drivers/char/tpm/tpm_tis_core.c | 2 +- drivers/char/tpm/tpm_vtpm_proxy.c | 3 +- drivers/char/tpm/xen-tpmfront.c | 2 +- drivers/clk/clk-twl6040.c | 53 +++++- drivers/clk/ingenic/cgu.c | 10 +- drivers/clk/ingenic/cgu.h | 2 +- drivers/clk/sunxi-ng/ccu-sun6i-a31.c | 4 +- drivers/clk/sunxi-ng/ccu-sun8i-v3s.c | 2 +- drivers/clk/uniphier/clk-uniphier-cpugear.c | 2 +- drivers/clocksource/exynos_mct.c | 23 +-- drivers/cpufreq/pxa2xx-cpufreq.c | 4 +- drivers/cpufreq/tegra124-cpufreq.c | 2 + drivers/crypto/caam/caamalg.c | 1 + drivers/crypto/rockchip/rk3288_crypto.c | 2 +- drivers/crypto/rockchip/rk3288_crypto.h | 4 +- drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c | 39 ++++- drivers/crypto/rockchip/rk3288_crypto_ahash.c | 2 +- drivers/gpu/drm/i915/i915_gem.c | 3 +- drivers/gpu/drm/imx/imx-ldb.c | 25 ++- drivers/gpu/drm/imx/ipuv3-plane.c | 4 +- drivers/gpu/drm/radeon/evergreen_cs.c | 1 + drivers/gpu/ipu-v3/ipu-common.c | 8 +- drivers/hwtracing/intel_th/gth.c | 4 + drivers/hwtracing/stm/core.c | 11 +- drivers/i2c/busses/i2c-bcm2835.c | 12 ++ drivers/i2c/busses/i2c-cadence.c | 9 +- drivers/i2c/busses/i2c-tegra.c | 2 +- drivers/iio/adc/exynos_adc.c | 2 +- drivers/infiniband/hw/hfi1/hfi.h | 2 +- drivers/infiniband/hw/hfi1/init.c | 14 +- drivers/input/keyboard/cap11xx.c | 35 ++-- drivers/input/keyboard/matrix_keypad.c | 2 +- drivers/input/keyboard/st-keyscan.c | 4 +- drivers/input/misc/pwm-vibra.c | 19 ++- drivers/input/serio/ps2-gpio.c | 1 + drivers/irqchip/irq-gic-v3-its.c | 2 + drivers/mailbox/bcm-flexrm-mailbox.c | 4 +- drivers/md/bcache/writeback.h | 3 + drivers/md/dm-integrity.c | 8 +- drivers/md/raid10.c | 2 + drivers/md/raid5.c | 2 + drivers/media/platform/vimc/Makefile | 3 +- drivers/media/platform/vimc/vimc-capture.c | 18 +- drivers/media/platform/vimc/vimc-common.c | 35 ---- drivers/media/platform/vimc/vimc-common.h | 15 +- drivers/media/platform/vimc/vimc-debayer.c | 26 +-- drivers/media/platform/vimc/vimc-scaler.c | 28 +-- drivers/media/platform/vimc/vimc-sensor.c | 56 ++---- drivers/media/platform/vimc/vimc-streamer.c | 188 +++++++++++++++++++++ drivers/media/platform/vimc/vimc-streamer.h | 38 +++++ drivers/media/usb/uvc/uvc_video.c | 8 + drivers/media/v4l2-core/videobuf2-v4l2.c | 1 - drivers/misc/cxl/guest.c | 2 + drivers/misc/cxl/pci.c | 39 ++++- drivers/mmc/host/sdhci-esdhc-imx.c | 1 + drivers/net/ethernet/atheros/atlx/atl2.c | 4 +- drivers/net/ethernet/broadcom/bcmsysport.c | 4 + drivers/net/ethernet/cavium/thunder/nic_main.c | 2 +- drivers/net/ethernet/cavium/thunder/nicvf_main.c | 15 +- drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 2 + drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 7 +- drivers/net/ethernet/marvell/mv643xx_eth.c | 7 +- drivers/net/ethernet/marvell/mvneta.c | 2 +- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 17 +- drivers/net/ethernet/qlogic/qed/qed_iwarp.c | 9 + drivers/net/usb/qmi_wwan.c | 4 +- drivers/net/wireless/mac80211_hwsim.c | 2 +- drivers/net/wireless/marvell/libertas_tf/if_usb.c | 2 - drivers/nvdimm/label.c | 23 ++- drivers/nvdimm/namespace_devs.c | 4 + drivers/nvdimm/pfn_devs.c | 4 +- drivers/parport/parport_pc.c | 2 +- drivers/pinctrl/meson/pinctrl-meson8b.c | 2 +- drivers/power/supply/cpcap-charger.c | 1 + drivers/regulator/max77620-regulator.c | 10 +- drivers/regulator/s2mpa01.c | 10 +- drivers/regulator/s2mps11.c | 6 +- drivers/s390/block/dasd_eckd.c | 8 + drivers/s390/virtio/virtio_ccw.c | 4 +- drivers/scsi/aacraid/linit.c | 13 +- drivers/scsi/libiscsi.c | 6 + drivers/scsi/sd.c | 59 ++++++- drivers/scsi/virtio_scsi.c | 2 - drivers/spi/spi-pxa2xx.c | 1 + drivers/spi/spi-ti-qspi.c | 6 +- drivers/staging/media/imx/imx-ic-prpencvf.c | 26 ++- drivers/staging/media/imx/imx-media-csi.c | 42 +++-- drivers/target/iscsi/iscsi_target.c | 4 +- drivers/tty/serial/8250/8250_of.c | 4 + drivers/tty/serial/8250/8250_pci.c | 141 ++++++++++++++-- drivers/tty/serial/xilinx_uartps.c | 8 +- drivers/usb/chipidea/ci_hdrc_tegra.c | 1 + fs/9p/v9fs_vfs.h | 23 ++- fs/9p/vfs_file.c | 6 +- fs/9p/vfs_inode.c | 23 ++- fs/9p/vfs_inode_dotl.c | 27 +-- fs/9p/vfs_super.c | 4 +- fs/btrfs/acl.c | 9 + fs/btrfs/extent_io.c | 4 +- fs/btrfs/volumes.c | 4 +- fs/cifs/file.c | 12 +- fs/cifs/smb2misc.c | 17 +- fs/cifs/smb2ops.c | 15 +- fs/devpts/inode.c | 1 + fs/ext2/super.c | 39 +++-- fs/ext4/ext4.h | 3 + fs/ext4/ioctl.c | 6 +- fs/ext4/resize.c | 3 +- fs/jbd2/transaction.c | 33 ++-- fs/kernfs/mount.c | 8 +- fs/nfs/nfs4idmap.c | 31 ++-- fs/nfs/nfs4proc.c | 12 +- fs/nfs/pagelist.c | 29 +++- fs/nfs/write.c | 11 +- fs/nfsd/nfs3proc.c | 16 +- fs/nfsd/nfs3xdr.c | 1 + fs/nfsd/nfsctl.c | 2 +- fs/pipe.c | 14 ++ fs/splice.c | 4 + include/asm-generic/vmlinux.lds.h | 2 +- include/keys/request_key_auth-type.h | 36 ++++ include/linux/device-mapper.h | 2 +- include/linux/hardirq.h | 7 + include/linux/key-type.h | 22 +-- include/linux/kvm_host.h | 2 +- include/linux/pipe_fs_i.h | 1 + include/linux/property.h | 2 +- include/net/phonet/pep.h | 5 +- init/main.c | 3 +- kernel/cgroup/cgroup.c | 9 +- kernel/rcu/tree.c | 20 ++- kernel/sysctl.c | 11 +- kernel/trace/trace.c | 1 - kernel/trace/trace_events_hist.c | 5 +- lib/assoc_array.c | 8 +- mm/gup.c | 3 +- mm/memory-failure.c | 14 +- mm/page_alloc.c | 8 +- mm/page_ext.c | 4 +- mm/shmem.c | 12 +- mm/vmalloc.c | 2 +- net/9p/client.c | 2 +- net/ipv4/esp4.c | 2 +- net/ipv6/esp6.c | 2 +- net/key/af_key.c | 40 ++--- net/mac80211/agg-tx.c | 4 +- net/netfilter/ipvs/Kconfig | 1 + net/netfilter/ipvs/ip_vs_core.c | 10 +- net/netfilter/ipvs/ip_vs_ctl.c | 10 ++ net/phonet/pep.c | 32 ++-- security/keys/internal.h | 13 +- security/keys/keyctl.c | 1 + security/keys/process_keys.c | 1 + security/keys/request_key.c | 72 ++++---- security/keys/request_key_auth.c | 16 +- security/selinux/hooks.c | 5 +- sound/soc/fsl/fsl_esai.c | 7 +- sound/soc/sh/rcar/ssi.c | 2 +- sound/soc/soc-dapm.c | 24 +++ sound/soc/soc-topology.c | 8 +- tools/perf/util/auxtrace.c | 4 +- tools/perf/util/auxtrace.h | 3 + .../perf/util/intel-pt-decoder/intel-pt-decoder.c | 37 +++- tools/perf/util/intel-pt.c | 2 + virt/kvm/arm/mmu.c | 2 +- virt/kvm/kvm_main.c | 7 +- 233 files changed, 1914 insertions(+), 937 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/183 9p: use inode->i_lock to protect i_size_write() under 32-bit
4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Tao <[email protected]>
commit 5e3cc1ee1405a7eb3487ed24f786dec01b4cbe1f upstream.
Use inode->i_lock to protect i_size_write(), else i_size_read() in generic_fillattr() may loop infinitely in read_seqcount_begin() when multiple processes invoke v9fs_vfs_getattr() or v9fs_vfs_getattr_dotl() simultaneously under 32-bit SMP environment, and a soft lockup will be triggered as show below:
watchdog: BUG: soft lockup - CPU#5 stuck for 22s! [stat:2217] Modules linked in: CPU: 5 PID: 2217 Comm: stat Not tainted 5.0.0-rc1-00005-g7f702faf5a9e #4 Hardware name: Generic DT based system PC is at generic_fillattr+0x104/0x108 LR is at 0xec497f00 pc : [<802b8898>] lr : [<ec497f00>] psr: 200c0013 sp : ec497e20 ip : ed608030 fp : ec497e3c r10: 00000000 r9 : ec497f00 r8 : ed608030 r7 : ec497ebc r6 : ec497f00 r5 : ee5c1550 r4 : ee005780 r3 : 0000052d r2 : 00000000 r1 : ec497f00 r0 : ed608030 Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none Control: 10c5387d Table: ac48006a DAC: 00000051 CPU: 5 PID: 2217 Comm: stat Not tainted 5.0.0-rc1-00005-g7f702faf5a9e #4 Hardware name: Generic DT based system Backtrace: [<8010d974>] (dump_backtrace) from [<8010dc88>] (show_stack+0x20/0x24) [<8010dc68>] (show_stack) from [<80a1d194>] (dump_stack+0xb0/0xdc) [<80a1d0e4>] (dump_stack) from [<80109f34>] (show_regs+0x1c/0x20) [<80109f18>] (show_regs) from [<801d0a80>] (watchdog_timer_fn+0x280/0x2f8) [<801d0800>] (watchdog_timer_fn) from [<80198658>] (__hrtimer_run_queues+0x18c/0x380) [<801984cc>] (__hrtimer_run_queues) from [<80198e60>] (hrtimer_run_queues+0xb8/0xf0) [<80198da8>] (hrtimer_run_queues) from [<801973e8>] (run_local_timers+0x28/0x64) [<801973c0>] (run_local_timers) from [<80197460>] (update_process_times+0x3c/0x6c) [<80197424>] (update_process_times) from [<801ab2b8>] (tick_nohz_handler+0xe0/0x1bc) [<801ab1d8>] (tick_nohz_handler) from [<80843050>] (arch_timer_handler_virt+0x38/0x48) [<80843018>] (arch_timer_handler_virt) from [<80180a64>] (handle_percpu_devid_irq+0x8c/0x240) [<801809d8>] (handle_percpu_devid_irq) from [<8017ac20>] (generic_handle_irq+0x34/0x44) [<8017abec>] (generic_handle_irq) from [<8017b344>] (__handle_domain_irq+0x6c/0xc4) [<8017b2d8>] (__handle_domain_irq) from [<801022e0>] (gic_handle_irq+0x4c/0x88) [<80102294>] (gic_handle_irq) from [<80101a30>] (__irq_svc+0x70/0x98) [<802b8794>] (generic_fillattr) from [<8056b284>] (v9fs_vfs_getattr_dotl+0x74/0xa4) [<8056b210>] (v9fs_vfs_getattr_dotl) from [<802b8904>] (vfs_getattr_nosec+0x68/0x7c) [<802b889c>] (vfs_getattr_nosec) from [<802b895c>] (vfs_getattr+0x44/0x48) [<802b8918>] (vfs_getattr) from [<802b8a74>] (vfs_statx+0x9c/0xec) [<802b89d8>] (vfs_statx) from [<802b9428>] (sys_lstat64+0x48/0x78) [<802b93e0>] (sys_lstat64) from [<80101000>] (ret_fast_syscall+0x0/0x28)
[[email protected]: updated comment to not refer to a function in another subsystem]
--- fs/9p/v9fs_vfs.h | 23 +++++++++++++++++++++-- fs/9p/vfs_file.c | 6 +++++- fs/9p/vfs_inode.c | 23 +++++++++++------------ fs/9p/vfs_inode_dotl.c | 27 ++++++++++++++------------- fs/9p/vfs_super.c | 4 ++-- 5 files changed, 53 insertions(+), 30 deletions(-)
fs/9p/v9fs_vfs.h +21 -2
@@ -40,6 +40,9 @@*/ #define P9_LOCK_TIMEOUT (30*HZ) +/* flags for v9fs_stat2inode() & v9fs_stat2inode_dotl() */ +#define V9FS_STAT2INODE_KEEP_ISIZE 1 +extern struct file_system_type v9fs_fs_type;extern const struct address_space_operations v9fs_addr_operations;extern const struct file_operations v9fs_file_operations;
@@ -61,8 +64,10 @@ int v9fs_init_inode(struct v9fs_session_ struct inode *inode, umode_t mode, dev_t);void v9fs_evict_inode (struct inode *inode);ino_t v9fs_qid2ino (struct p9_qid *qid); -void v9fs_stat2inode (struct p9_wstat *,struct inode *,struct super_block *); -void v9fs_stat2inode_dotl (struct p9_stat_dotl *,struct inode *); +void v9fs_stat2inode (struct p9_wstat *stat,struct inode *inode, +struct super_block *sb,unsigned int flags); +void v9fs_stat2inode_dotl (struct p9_stat_dotl *stat,struct inode *inode, +unsigned int flags);int v9fs_dir_release (struct inode *inode,struct file *filp);int v9fs_file_open (struct inode *inode,struct file *file);void v9fs_inode2stat (struct inode *inode,struct p9_wstat *stat);
@@ -83,4 +88,18 @@ static inline void v9fs_invalidate_inode }int v9fs_open_to_dotl_flags (int flags); + +static inline void v9fs_i_size_write (struct inode *inode,loff_t i_size) +{ +/* +* 32-bit need the lock, concurrent updates could break the +* sequences and make i_size_read() loop forever. +* 64-bit updates are atomic and can skip the locking. +*/ +if (sizeof (i_size) >sizeof (long )) +spin_lock (&inode->i_lock); +i_size_write (inode, i_size); +if (sizeof (i_size) >sizeof (long )) +spin_unlock (&inode->i_lock); +}#endif
fs/9p/vfs_file.c +5 -1
@@ -442,7 +442,11 @@ v9fs_file_write_iter(struct kiocb *iocb, i_size =i_size_read (inode);if (iocb->ki_pos > i_size) {inode_add_bytes (inode, iocb->ki_pos - i_size); -i_size_write (inode, iocb->ki_pos); +/* +* Need to serialize against i_size_write() in +* v9fs_stat2inode() +*/ +v9fs_i_size_write (inode, iocb->ki_pos); }return retval; }
fs/9p/vfs_inode.c +11 -12
@@ -538,7 +538,7 @@ static struct inode *v9fs_qid_iget(strucif (retval) goto error; -v9fs_stat2inode (st, inode, sb); +v9fs_stat2inode (st, inode, sb,0 );v9fs_cache_inode_get_cookie (inode);unlock_new_inode (inode);return inode;
@@ -1080,7 +1080,7 @@ v9fs_vfs_getattr(const struct path *pathif (IS_ERR (st))return PTR_ERR (st); -v9fs_stat2inode (st,d_inode (dentry), dentry->d_sb); +v9fs_stat2inode (st,d_inode (dentry), dentry->d_sb,0 );generic_fillattr (d_inode (dentry), stat);p9stat_free (st);
@@ -1158,12 +1158,13 @@ static int v9fs_vfs_setattr(struct dentr* @stat: Plan 9 metadata (mistat) structure * @inode: inode to populate * @sb: superblock of filesystem +* @flags: control flags (e.g. V9FS_STAT2INODE_KEEP_ISIZE) * */ void v9fs_stat2inode (struct p9_wstat *stat,struct inode *inode, -struct super_block *sb) +struct super_block *sb,unsigned int flags) {umode_t mode;char ext[32 ];
@@ -1204,10 +1205,11 @@ v9fs_stat2inode(struct p9_wstat *stat, s mode =p9mode2perm (v9ses, stat); mode |= inode->i_mode & ~S_IALLUGO ; inode->i_mode = mode; -i_size_write (inode, stat->length); +if (!(flags &V9FS_STAT2INODE_KEEP_ISIZE )) +v9fs_i_size_write (inode, stat->length);/* not real number of blocks, but 512 byte ones ... */ - inode->i_blocks = (i_size_read (inode) +512 -1 ) >>9 ; + inode->i_blocks = (stat->length +512 -1 ) >>9 ; v9inode->cache_validity &= ~V9FS_INO_INVALID_ATTR ; }
@@ -1404,9 +1406,9 @@ int v9fs_refresh_inode(struct p9_fid *fi {int umode;dev_t rdev; -loff_t i_size;struct p9_wstat *st;struct v9fs_session_info *v9ses; +unsigned int flags; v9ses =v9fs_inode2v9ses (inode); st =p9_client_stat (fid);
@@ -1419,16 +1421,13 @@ int v9fs_refresh_inode(struct p9_fid *fiif ((inode->i_mode &S_IFMT ) != (umode &S_IFMT )) goto out; -spin_lock (&inode->i_lock);/* * We don't want to refresh inode->i_size, * because we may have cached data */ - i_size = inode->i_size; -v9fs_stat2inode (st, inode, inode->i_sb); -if (v9ses->cache ==CACHE_LOOSE || v9ses->cache ==CACHE_FSCACHE ) - inode->i_size = i_size; -spin_unlock (&inode->i_lock); + flags = (v9ses->cache ==CACHE_LOOSE || v9ses->cache ==CACHE_FSCACHE ) ? +V9FS_STAT2INODE_KEEP_ISIZE :0 ; +v9fs_stat2inode (st, inode, inode->i_sb, flags); out:p9stat_free (st);kfree (st);
fs/9p/vfs_inode_dotl.c +14 -13
@@ -143,7 +143,7 @@ static struct inode *v9fs_qid_iget_dotl(if (retval) goto error; -v9fs_stat2inode_dotl (st, inode); +v9fs_stat2inode_dotl (st, inode,0 );v9fs_cache_inode_get_cookie (inode); retval =v9fs_get_acl (inode, fid);if (retval)
@@ -497,7 +497,7 @@ v9fs_vfs_getattr_dotl(const struct pathif (IS_ERR (st))return PTR_ERR (st); -v9fs_stat2inode_dotl (st,d_inode (dentry)); +v9fs_stat2inode_dotl (st,d_inode (dentry),0 );generic_fillattr (d_inode (dentry), stat);/* Change block size to what the server returned */ stat->blksize = st->st_blksize;
@@ -608,11 +608,13 @@ int v9fs_vfs_setattr_dotl(struct dentry* v9fs_stat2inode_dotl - populate an inode structure with stat info * @stat: stat structure * @inode: inode to populate +* @flags: ctrl flags (e.g. V9FS_STAT2INODE_KEEP_ISIZE) * */ void -v9fs_stat2inode_dotl (struct p9_stat_dotl *stat,struct inode *inode) +v9fs_stat2inode_dotl (struct p9_stat_dotl *stat,struct inode *inode, +unsigned int flags) {umode_t mode;struct v9fs_inode *v9inode =V9FS_I (inode);
@@ -632,7 +634,8 @@ v9fs_stat2inode_dotl(struct p9_stat_dotl mode |= inode->i_mode & ~S_IALLUGO ; inode->i_mode = mode; -i_size_write (inode, stat->st_size); +if (!(flags &V9FS_STAT2INODE_KEEP_ISIZE )) +v9fs_i_size_write (inode, stat->st_size); inode->i_blocks = stat->st_blocks; }else {if (stat->st_result_mask &P9_STATS_ATIME ) {
@@ -662,8 +665,9 @@ v9fs_stat2inode_dotl(struct p9_stat_dotl }if (stat->st_result_mask &P9_STATS_RDEV ) inode->i_rdev =new_decode_dev (stat->st_rdev); -if (stat->st_result_mask &P9_STATS_SIZE ) -i_size_write (inode, stat->st_size); +if (!(flags &V9FS_STAT2INODE_KEEP_ISIZE ) && + stat->st_result_mask &P9_STATS_SIZE ) +v9fs_i_size_write (inode, stat->st_size);if (stat->st_result_mask &P9_STATS_BLOCKS ) inode->i_blocks = stat->st_blocks; }
@@ -929,9 +933,9 @@ v9fs_vfs_get_link_dotl(struct dentry *deint v9fs_refresh_inode_dotl (struct p9_fid *fid,struct inode *inode) { -loff_t i_size;struct p9_stat_dotl *st;struct v9fs_session_info *v9ses; +unsigned int flags; v9ses =v9fs_inode2v9ses (inode); st =p9_client_getattr_dotl (fid,P9_STATS_ALL );
@@ -943,16 +947,13 @@ int v9fs_refresh_inode_dotl(struct p9_fiif ((inode->i_mode &S_IFMT ) != (st->st_mode &S_IFMT )) goto out; -spin_lock (&inode->i_lock);/* * We don't want to refresh inode->i_size, * because we may have cached data */ - i_size = inode->i_size; -v9fs_stat2inode_dotl (st, inode); -if (v9ses->cache ==CACHE_LOOSE || v9ses->cache ==CACHE_FSCACHE ) - inode->i_size = i_size; -spin_unlock (&inode->i_lock); + flags = (v9ses->cache ==CACHE_LOOSE || v9ses->cache ==CACHE_FSCACHE ) ? +V9FS_STAT2INODE_KEEP_ISIZE :0 ; +v9fs_stat2inode_dotl (st, inode, flags); out:kfree (st);return 0 ;
fs/9p/vfs_super.c +2 -2
@@ -172,7 +172,7 @@ static struct dentry *v9fs_mount(struct goto release_sb; }d_inode (root)->i_ino =v9fs_qid2ino (&st->qid); -v9fs_stat2inode_dotl (st,d_inode (root)); +v9fs_stat2inode_dotl (st,d_inode (root),0 );kfree (st); }else {struct p9_wstat *st =NULL ;
@@ -183,7 +183,7 @@ static struct dentry *v9fs_mount(struct }d_inode (root)->i_ino =v9fs_qid2ino (&st->qid); -v9fs_stat2inode (st,d_inode (root), sb); +v9fs_stat2inode (st,d_inode (root), sb,0 );p9stat_free (st);kfree (st);
Greg Kroah-Hartman
maintainerPATCH 2/183 9p/net: fix memory leak in p9_client_create
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: zhengbin <[email protected]>
commit bb06c388fa20ae24cfe80c52488de718a7e3a53f upstream.
If msize is less than 4096, we should close and put trans, destroy tagpool, not just free client. This patch fixes that.
--- net/9p/client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/9p/client.c +1 -1
@@ -1082,7 +1082,7 @@ struct p9_client *p9_client_create(constp9_debug (P9_DEBUG_ERROR ,"Please specify a msize of at least 4k\n" ); err = -EINVAL ; - goto free_client; + goto close_trans; } err =p9_client_version (clnt);
Greg Kroah-Hartman
maintainerPATCH 3/183 ASoC: fsl_esai: fix register setting issue in RIGHT_J mode
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: S.j. Wang <[email protected]>
commit cc29ea007347f39f4c5a4d27b0b555955a0277f9 upstream.
The ESAI_xCR_xWA is xCR's bit, not the xCCR's bit, driver set it to wrong register, correct it.
Fixes 43d24e76b698 ("ASoC: fsl_esai: Add ESAI CPU DAI driver")
--- sound/soc/fsl/fsl_esai.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
sound/soc/fsl/fsl_esai.c +4 -3
@@ -395,7 +395,8 @@ static int fsl_esai_set_dai_fmt(struct sbreak ;case SND_SOC_DAIFMT_RIGHT_J :/* Data on rising edge of bclk, frame high, right aligned */ - xccr |= ESAI_xCCR_xCKP | ESAI_xCCR_xHCKP | ESAI_xCR_xWA; + xccr |= ESAI_xCCR_xCKP | ESAI_xCCR_xHCKP; + xcr |= ESAI_xCR_xWA;break ;case SND_SOC_DAIFMT_DSP_A :/* Data on rising edge of bclk, frame high, 1clk before data */
@@ -452,12 +453,12 @@ static int fsl_esai_set_dai_fmt(struct sreturn -EINVAL ; } - mask = ESAI_xCR_xFSL | ESAI_xCR_xFSR; + mask = ESAI_xCR_xFSL | ESAI_xCR_xFSR | ESAI_xCR_xWA;regmap_update_bits (esai_priv->regmap,REG_ESAI_TCR , mask, xcr);regmap_update_bits (esai_priv->regmap,REG_ESAI_RCR , mask, xcr); mask = ESAI_xCCR_xCKP | ESAI_xCCR_xHCKP | ESAI_xCCR_xFSP | - ESAI_xCCR_xFSD | ESAI_xCCR_xCKD | ESAI_xCR_xWA; + ESAI_xCCR_xFSD | ESAI_xCCR_xCKD;regmap_update_bits (esai_priv->regmap,REG_ESAI_TCCR , mask, xccr);regmap_update_bits (esai_priv->regmap,REG_ESAI_RCCR , mask, xccr);
Greg Kroah-Hartman
maintainerPATCH 4/183 iio: adc: exynos-adc: Fix NULL pointer exception on unbind
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 2ea8bab4dd2a9014e723b28091831fa850b82d83 upstream.
Fix NULL pointer exception on device unbind when device tree does not contain "has-touchscreen" property. In such case the input device is not registered so it should not be unregistered.
$ echo "12d10000.adc" > /sys/bus/platform/drivers/exynos-adc/unbind
Unable to handle kernel NULL pointer dereference at virtual address 00000474
...
(input_unregister_device) from [<c0772060>] (exynos_adc_remove+0x20/0x80)
(exynos_adc_remove) from [<c0587d5c>] (platform_drv_remove+0x20/0x40)
(platform_drv_remove) from [<c05860f0>] (device_release_driver_internal+0xdc/0x1ac)
(device_release_driver_internal) from [<c0583ecc>] (unbind_store+0x60/0xd4)
(unbind_store) from [<c031b89c>] (kernfs_fop_write+0x100/0x1e0)
(kernfs_fop_write) from [<c029709c>] (__vfs_write+0x2c/0x17c)
(__vfs_write) from [<c0297374>] (vfs_write+0xa4/0x184)
(vfs_write) from [<c0297594>] (ksys_write+0x4c/0xac)
(ksys_write) from [<c0101000>] (ret_fast_syscall+0x0/0x28)--- drivers/iio/adc/exynos_adc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/exynos_adc.c +1 -1
@@ -916,7 +916,7 @@ static int exynos_adc_remove(struct platstruct iio_dev *indio_dev =platform_get_drvdata (pdev);struct exynos_adc *info =iio_priv (indio_dev); -if (IS_REACHABLE (CONFIG_INPUT )) { +if (IS_REACHABLE (CONFIG_INPUT ) && info->input) {free_irq (info->tsirq, info);input_unregister_device (info->input); }
Greg Kroah-Hartman
maintainerPATCH 5/183 stm class: Fix an endless loop in channel allocation
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhi Jin <[email protected]>
commit a1d75dad3a2c689e70a1c4e0214cca9de741d0aa upstream.
There is a bug in the channel allocation logic that leads to an endless loop when looking for a contiguous range of channels in a range with a mixture of free and occupied channels. For example, opening three consequtive channels, closing the first two and requesting 4 channels in a row will trigger this soft lockup. The bug is that the search loop forgets to skip over the range once it detects that one channel in that range is occupied.
Restore the original intent to the logic by fixing the omission.
--- drivers/hwtracing/stm/core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/hwtracing/stm/core.c +3 -0
@@ -252,6 +252,9 @@ static int find_free_channels(unsigned l ;if (i == width)return pos; + +/* step over [pos..pos+i) to continue search */ + pos += i; }return -1 ;
Greg Kroah-Hartman
maintainerPATCH 6/183 crypto: caam - fixed handling of sg list
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pankaj Gupta <[email protected]>
commit 42e95d1f10dcf8b18b1d7f52f7068985b3dc5b79 upstream.
when the source sg contains more than 1 fragment and destination sg contains 1 fragment, the caam driver mishandle the buffers to be sent to caam.
--- drivers/crypto/caam/caamalg.c | 1 + 1 file changed, 1 insertion(+)
drivers/crypto/caam/caamalg.c +1 -0
@@ -1097,6 +1097,7 @@ static void init_ablkcipher_job(u32 *sh_ }else {if (edesc->dst_nents ==1 ) { dst_dma =sg_dma_address (req->dst); + out_options =0 ; }else { dst_dma = edesc->sec4_sg_dma + (edesc->src_nents +1 ) *sizeof (struct sec4_sg_entry );
Greg Kroah-Hartman
maintainerPATCH 7/183 crypto: ahash - fix another early termination in hash walk
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit 77568e535af7c4f97eaef1e555bf0af83772456c upstream.
Hash algorithms with an alignmask set, e.g. "xcbc(aes-aesni)" and "michael_mic", fail the improved hash tests because they sometimes produce the wrong digest. The bug is that in the case where a scatterlist element crosses pages, not all the data is actually hashed because the scatterlist walk terminates too early. This happens because the 'nbytes' variable in crypto_hash_walk_done() is assigned the number of bytes remaining in the page, then later interpreted as the number of bytes remaining in the scatterlist element. Fix it.
--- crypto/ahash.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
crypto/ahash.c +7 -7
@@ -86,17 +86,17 @@ static int hash_walk_new_entry(struct crint crypto_hash_walk_done (struct crypto_hash_walk *walk,int err) {unsigned int alignmask = walk->alignmask; -unsigned int nbytes = walk->entrylen; walk->data -= walk->offset; -if (nbytes && walk->offset & alignmask && !err) { - walk->offset =ALIGN (walk->offset, alignmask +1 ); - nbytes =min (nbytes, - ((unsigned int )(PAGE_SIZE )) - walk->offset); - walk->entrylen -= nbytes; +if (walk->entrylen && (walk->offset & alignmask) && !err) { +unsigned int nbytes; + walk->offset =ALIGN (walk->offset, alignmask +1 ); + nbytes =min (walk->entrylen, + (unsigned int )(PAGE_SIZE - walk->offset));if (nbytes) { + walk->entrylen -= nbytes; walk->data += walk->offset;return nbytes; }
@@ -116,7 +116,7 @@ int crypto_hash_walk_done(struct crypto_if (err)return err; -if (nbytes) { +if (walk->entrylen) { walk->offset =0 ; walk->pg++;return hash_walk_next (walk);
Greg Kroah-Hartman
maintainerPATCH 8/183 crypto: rockchip - fix scatterlist nents error
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Zhijie <[email protected]>
commit 4359669a087633132203c52d67dd8c31e09e7b2e upstream.
In some cases, the nents of src scatterlist is different from dst scatterlist. So two variables are used to handle the nents of src&dst scatterlist.
--- drivers/crypto/rockchip/rk3288_crypto.c | 2 +- drivers/crypto/rockchip/rk3288_crypto.h | 3 ++- drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c | 5 +++-- drivers/crypto/rockchip/rk3288_crypto_ahash.c | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-)
drivers/crypto/rockchip/rk3288_crypto.c +1 -1
@@ -119,7 +119,7 @@ static int rk_load_data(struct rk_crypto count = (dev->left_bytes >PAGE_SIZE ) ?PAGE_SIZE : dev->left_bytes; -if (!sg_pcopy_to_buffer (dev->first, dev->nents, +if (!sg_pcopy_to_buffer (dev->first, dev->src_nents, dev->addr_vir, count, dev->total - dev->left_bytes)) { dev_err(dev->dev, "[%s:%d] pcopy err\n",
drivers/crypto/rockchip/rk3288_crypto.h +2 -1
@@ -207,7 +207,8 @@ struct rk_crypto_info {void *addr_vir;int aligned;int align_size; -size_t nents; +size_t src_nents; +size_t dst_nents;unsigned int total;unsigned int count;dma_addr_t addr_in;
drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c +3 -2
@@ -260,8 +260,9 @@ static int rk_ablk_start(struct rk_crypt dev->total = req->nbytes; dev->sg_src = req->src; dev->first = req->src; - dev->nents =sg_nents (req->src); + dev->src_nents =sg_nents (req->src); dev->sg_dst = req->dst; + dev->dst_nents =sg_nents (req->dst); dev->aligned =1 ;spin_lock_irqsave (&dev->lock, flags);
@@ -297,7 +298,7 @@ static int rk_ablk_rx(struct rk_crypto_i dev->unload_data (dev);if (!dev->aligned) { -if (!sg_pcopy_from_buffer (req->dst, dev->nents, +if (!sg_pcopy_from_buffer (req->dst, dev->dst_nents, dev->addr_vir, dev->count, dev->total - dev->left_bytes - dev->count)) {
drivers/crypto/rockchip/rk3288_crypto_ahash.c +1 -1
@@ -206,7 +206,7 @@ static int rk_ahash_start(struct rk_cryp dev->sg_dst =NULL ; dev->sg_src = req->src; dev->first = req->src; - dev->nents =sg_nents (req->src); + dev->src_nents =sg_nents (req->src); rctx =ahash_request_ctx (req); rctx->mode =0 ;
Greg Kroah-Hartman
maintainerPATCH 9/183 crypto: rockchip - update new iv to device in multiple operations
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Zhijie <[email protected]>
commit c1c214adcb56d36433480c8fedf772498e7e539c upstream.
For chain mode in cipher(eg. AES-CBC/DES-CBC), the iv is continuously updated in the operation. The new iv value should be written to device register by software.
--- drivers/crypto/rockchip/rk3288_crypto.h | 1 drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c | 34 +++++++++++++++++++++ 2 files changed, 35 insertions(+)
drivers/crypto/rockchip/rk3288_crypto.h +1 -0
@@ -245,6 +245,7 @@ struct rk_cipher_ctx {struct rk_crypto_info *dev;unsigned int keylen;u32 mode; +u8 iv[AES_BLOCK_SIZE ]; };enum alg_type {
drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c +34 -0
@@ -242,6 +242,17 @@ static void crypto_dma_start(struct rk_cstatic int rk_set_data_start (struct rk_crypto_info *dev) {int err; +struct ablkcipher_request *req = +ablkcipher_request_cast (dev->async_req); +struct crypto_ablkcipher *tfm =crypto_ablkcipher_reqtfm (req); +struct rk_cipher_ctx *ctx =crypto_ablkcipher_ctx (tfm); +u32 ivsize =crypto_ablkcipher_ivsize (tfm); +u8 *src_last_blk =page_address (sg_page (dev->sg_src)) + + dev->sg_src->offset + dev->sg_src->length - ivsize; + +/* store the iv that need to be updated in chain mode */ +if (ctx->mode &RK_CRYPTO_DEC ) +memcpy (ctx->iv, src_last_blk, ivsize); err = dev->load_data (dev, dev->sg_src, dev->sg_dst);if (!err)
@@ -286,6 +297,28 @@ static void rk_iv_copyback(struct rk_crymemcpy_fromio (req->info, dev->reg +RK_CRYPTO_AES_IV_0 , ivsize); } +static void rk_update_iv (struct rk_crypto_info *dev) +{ +struct ablkcipher_request *req = +ablkcipher_request_cast (dev->async_req); +struct crypto_ablkcipher *tfm =crypto_ablkcipher_reqtfm (req); +struct rk_cipher_ctx *ctx =crypto_ablkcipher_ctx (tfm); +u32 ivsize =crypto_ablkcipher_ivsize (tfm); +u8 *new_iv =NULL ; + +if (ctx->mode &RK_CRYPTO_DEC ) { + new_iv = ctx->iv; + }else { + new_iv =page_address (sg_page (dev->sg_dst)) + + dev->sg_dst->offset + dev->sg_dst->length - ivsize; + } + +if (ivsize ==DES_BLOCK_SIZE ) +memcpy_toio (dev->reg +RK_CRYPTO_TDES_IV_0 , new_iv, ivsize); +else if (ivsize ==AES_BLOCK_SIZE ) +memcpy_toio (dev->reg +RK_CRYPTO_AES_IV_0 , new_iv, ivsize); +} +/* return: * true some err was occurred * fault no err, continue
@@ -307,6 +340,7 @@ static int rk_ablk_rx(struct rk_crypto_i } }if (dev->left_bytes) { +rk_update_iv (dev);if (dev->aligned) {if (sg_is_last (dev->sg_src)) { dev_err(dev->dev, "[%s:%d] Lack of data\n",
Greg Kroah-Hartman
maintainerPATCH 10/183 drm/imx: ignore plane updates on disabled crtcs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4fb873c9648e383206e0a91cef9b03aa54066aca ]
This patch fixes backtraces like the following when sending SIGKILL to a process with a currently pending plane update:
[drm:ipu_plane_atomic_check] CRTC should be enabled
[drm:drm_framebuffer_remove] *ERROR* failed to commit
------------[ cut here ]------------
WARNING: CPU: 3 PID: 63 at drivers/gpu/drm/drm_framebuffer.c:926 drm_framebuffer_remove+0x47c/0x498 atomic remove_fb failed with -22
--- drivers/gpu/drm/imx/ipuv3-plane.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/imx/ipuv3-plane.c +2 -2
@@ -348,9 +348,9 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,if (ret)return ret; -/* CRTC should be enabled */ +/* nothing to check when disabling or disabled */ if (!crtc_state->enable) -return -EINVAL ; +return 0 ;switch (plane->type) {case DRM_PLANE_TYPE_PRIMARY :
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 11/183 gpu: ipu-v3: Fix i.MX51 CSI control registers offset
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2c0408dd0d8906b26fe8023889af7adf5e68b2c2 ]
The CSI0/CSI1 registers offset is at +0xe030000/+0xe038000 relative to the control module registers on IPUv3EX.
This patch fixes wrong values for i.MX51 CSI0/CSI1.
--- drivers/gpu/ipu-v3/ipu-common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/ipu-v3/ipu-common.c +2 -2
@@ -894,8 +894,8 @@ static struct ipu_devtype ipu_type_imx51 = { .cpmem_ofs = 0x1f000000, .srm_ofs = 0x1f040000, .tpm_ofs = 0x1f060000, - .csi0_ofs = 0x1f030000, - .csi1_ofs = 0x1f038000, + .csi0_ofs = 0x1e030000, + .csi1_ofs = 0x1e038000, .ic_ofs = 0x1e020000, .disp0_ofs = 0x1e040000, .disp1_ofs = 0x1e048000,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 12/183 drm/imx: imx-ldb: add missing of_node_puts
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit aa3312012f103f91f123600bbf768b11c8f431bc ]
The device node iterators perform an of_node_get on each iteration, so a jump out of the loop requires an of_node_put.
Move the initialization channel->child = child; down to just before the call to imx_ldb_register so that intervening failures don't need to clear it. Add a label at the end of the function to do all the of_node_puts.
The semantic patch that finds part of this problem is as follows
(http://coccinelle.lip6.fr):
// <smpl>
@@
expression root,e;
local idexpression child;
iterator name for_each_child_of_node;
@@
for_each_child_of_node(root, child) {
... when != of_node_put(child)
when != e = child
(
return child;
|
* return ...;
)
...
}
// </smpl>
--- drivers/gpu/drm/imx/imx-ldb.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)
drivers/gpu/drm/imx/imx-ldb.c +17 -8
@@ -652,8 +652,10 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)int bus_format; ret =of_property_read_u32 (child,"reg" , &i); -if (ret || i <0 || i >1 ) -return -EINVAL ; +if (ret || i <0 || i >1 ) { + ret = -EINVAL ; + goto free_child; + }if (!of_device_is_available (child))continue ;
@@ -666,7 +668,6 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data) channel = &imx_ldb->channel[i]; channel->ldb = imx_ldb; channel->chno = i; - channel->child = child;/* * The output port is port@4 with an external 4-port mux or
@@ -676,13 +677,13 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data) imx_ldb->lvds_mux ?4 :2 ,0 , &channel->panel, &channel->bridge);if (ret && ret != -ENODEV ) -return ret; + goto free_child;/* panel ddc only if there is no bridge */ if (!channel->bridge) { ret =imx_ldb_panel_ddc (dev, channel, child);if (ret) -return ret; + goto free_child; } bus_format =of_get_bus_format (dev, child);
@@ -698,18 +699,26 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)if (bus_format <0 ) {dev_err (dev,"could not determine data mapping: %d\n" , bus_format); -return bus_format; + ret = bus_format; + goto free_child; } channel->bus_format = bus_format; + channel->child = child; ret =imx_ldb_register (drm, channel); -if (ret) -return ret; +if (ret) { + channel->child =NULL ; + goto free_child; + } }dev_set_drvdata (dev, imx_ldb);return 0 ; + +free_child: +of_node_put (child); +return ret; } static void imx_ldb_unbind(struct device *dev, struct device *master,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 13/183 gpu: ipu-v3: Fix CSI offsets for imx53
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit bb867d219fda7fbaabea3314702474c4eac2b91d ]
The CSI offsets are wrong for both CSI0 and CSI1. They are at physical address 0x1e030000 and 0x1e038000 respectively.
--- drivers/gpu/ipu-v3/ipu-common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/ipu-v3/ipu-common.c +2 -2
@@ -910,8 +910,8 @@ static struct ipu_devtype ipu_type_imx53 = { .cpmem_ofs = 0x07000000, .srm_ofs = 0x07040000, .tpm_ofs = 0x07060000, - .csi0_ofs = 0x07030000, - .csi1_ofs = 0x07038000, + .csi0_ofs = 0x06030000, + .csi1_ofs = 0x06038000, .ic_ofs = 0x06020000, .disp0_ofs = 0x06040000, .disp1_ofs = 0x06048000,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 14/183 s390/dasd: fix using offset into zero size array error
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4a8ef6999bce998fa5813023a9a6b56eea329dba ]
Dan Carpenter reported the following:
The patch 52898025cf7d: "[S390] dasd: security and PSF update patch for EMC CKD ioctl" from Mar 8, 2010, leads to the following static checker warning:
drivers/s390/block/dasd_eckd.c:4486 dasd_symm_io() error: using offset into zero size array 'psf_data[]'
drivers/s390/block/dasd_eckd.c
4458 /* Copy parms from caller */
4459 rc = -EFAULT;
4460 if (copy_from_user(&usrparm, argp, sizeof(usrparm)))
^^^^^^^The user can specify any "usrparm.psf_data_len". They choose zero by mistake.
4461 goto out;
4462 if (is_compat_task()) {
4463 /* Make sure pointers are sane even on 31 bit. */ 4464 rc = -EINVAL; 4465 if ((usrparm.psf_data >> 32) != 0) 4466 goto out; 4467 if ((usrparm.rssd_result >> 32) != 0) 4468 goto out; 4469 usrparm.psf_data &= 0x7fffffffULL; 4470 usrparm.rssd_result &= 0x7fffffffULL; 4471 } 4472 /* alloc I/O data area */ 4473 psf_data = kzalloc(usrparm.psf_data_len, GFP_KERNEL | GFP_DMA); 4474 rssd_result = kzalloc(usrparm.rssd_result_len, GFP_KERNEL | GFP_DMA);
4475 if (!psf_data || !rssd_result) {
kzalloc() returns a ZERO_SIZE_PTR (0x16).
4476 rc = -ENOMEM; 4477 goto out_free; 4478 } 4479 4480 /* get syscall header from user space */ 4481 rc = -EFAULT; 4482 if (copy_from_user(psf_data, 4483 (void __user *)(unsigned long) usrparm.psf_data, 4484 usrparm.psf_data_len))
That all works great.
4485 goto out_free; 4486 psf0 = psf_data[0]; 4487 psf1 = psf_data[1];
But now we're assuming that "->psf_data_len" was at least 2 bytes.
Fix this by checking the user specified length psf_data_len.
--- drivers/s390/block/dasd_eckd.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/s390/block/dasd_eckd.c +8 -0
@@ -4463,6 +4463,14 @@ static int dasd_symm_io(struct dasd_device *device, void __user *argp) usrparm.psf_data &=0x7fffffffULL ; usrparm.rssd_result &=0x7fffffffULL ; } +/* at least 2 bytes are accessed and should be allocated */ +if (usrparm.psf_data_len <2 ) { +DBF_DEV_EVENT (DBF_WARNING , device, +"Symmetrix ioctl invalid data length %d" , + usrparm.psf_data_len); + rc = -EINVAL ; + goto out; + }/* alloc I/O data area */ psf_data =kzalloc (usrparm.psf_data_len,GFP_KERNEL |GFP_DMA ); rssd_result =kzalloc (usrparm.rssd_result_len,GFP_KERNEL |GFP_DMA );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 15/183 Input: pwm-vibra - prevent unbalanced regulator
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 3ca232df9921f083c3b37ba5fbc76f4d9046268b ]
pwm_vibrator_stop disables the regulator, but it can be called from multiple places, even when the regulator is already disabled. Fix this by using regulator_is_enabled check when starting and stopping device.
--- drivers/input/misc/pwm-vibra.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
drivers/input/misc/pwm-vibra.c +12 -5
@@ -34,6 +34,7 @@ struct pwm_vibrator {struct work_struct play_work;u16 level;u32 direction_duty_cycle; +bool vcc_on; };static int pwm_vibrator_start (struct pwm_vibrator *vibrator)
@@ -42,10 +43,13 @@ static int pwm_vibrator_start(struct pwm_vibrator *vibrator)struct pwm_state state;int err; - err =regulator_enable (vibrator->vcc); -if (err) { -dev_err (pdev,"failed to enable regulator: %d" , err); -return err; +if (!vibrator->vcc_on) { + err =regulator_enable (vibrator->vcc); +if (err) { +dev_err (pdev,"failed to enable regulator: %d" , err); +return err; + } + vibrator->vcc_on = true; }pwm_get_state (vibrator->pwm, &state);
@@ -76,7 +80,10 @@ static int pwm_vibrator_start(struct pwm_vibrator *vibrator)static void pwm_vibrator_stop (struct pwm_vibrator *vibrator) { -regulator_disable (vibrator->vcc); +if (vibrator->vcc_on) { +regulator_disable (vibrator->vcc); + vibrator->vcc_on = false; + }if (vibrator->pwm_dir)pwm_disable (vibrator->pwm_dir);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 16/183 Input: pwm-vibra - stop regulator after disabling pwm, not before
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 94803aef3533676194c772383472636c453e3147 ]
This patch fixes order of disable calls in pwm_vibrator_stop. Currently when starting device, we first enable vcc regulator and then setup and enable pwm. When stopping, we should do this in oposite order, so first disable pwm and then disable regulator.
Previously order was the same as in start.
--- drivers/input/misc/pwm-vibra.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/input/misc/pwm-vibra.c +4 -4
@@ -80,14 +80,14 @@ static int pwm_vibrator_start(struct pwm_vibrator *vibrator)static void pwm_vibrator_stop (struct pwm_vibrator *vibrator) { +if (vibrator->pwm_dir) +pwm_disable (vibrator->pwm_dir); +pwm_disable (vibrator->pwm); +if (vibrator->vcc_on) {regulator_disable (vibrator->vcc); vibrator->vcc_on = false; } - -if (vibrator->pwm_dir) -pwm_disable (vibrator->pwm_dir); -pwm_disable (vibrator->pwm); }static void pwm_vibrator_play_work (struct work_struct *work)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 17/183 ARM: OMAP2+: Variable "reg" in function omap4_dsi_mux_pads() could be uninitialized
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit dc30e70391376ba3987aeb856ae6d9c0706534f1 ]
In function omap4_dsi_mux_pads(), local variable "reg" could be uninitialized if function regmap_read() returns -EINVAL. However, it will be used directly in the later context, which is potentially unsafe.
--- arch/arm/mach-omap2/display.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/arm/mach-omap2/display.c +6 -1
@@ -84,6 +84,7 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)u32 enable_mask, enable_shift;u32 pipd_mask, pipd_shift;u32 reg; +int ret;if (dsi_id ==0 ) { enable_mask =OMAP4_DSI1_LANEENABLE_MASK ;
@@ -99,7 +100,11 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)return -ENODEV ; } -regmap_read (omap4_dsi_mux_syscon,OMAP4_DSIPHY_SYSCON_OFFSET , ®); + ret =regmap_read (omap4_dsi_mux_syscon, +OMAP4_DSIPHY_SYSCON_OFFSET , + ®); +if (ret) +return ret; reg &= ~enable_mask; reg &= ~pipd_mask;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 18/183 ASoC: dapm: fix out-of-bounds accesses to DAPM lookup tables
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c16e12010060c6c7a31f08b4a99513064cb53b7d ]
KASAN reports and additional traces point to out-of-bounds accesses to the dapm_up_seq and dapm_down_seq lookup tables. The indices used are larger than the array definition.
Fix by adding missing entries for the new widget types in these two lookup tables, and align them with PGA values.
Also the sequences for the following widgets were not defined. Since their values defaulted to zero, assign them explicitly
snd_soc_dapm_input
snd_soc_dapm_output
snd_soc_dapm_vmid
snd_soc_dapm_siggen
snd_soc_dapm_sink
--- sound/soc/soc-dapm.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
sound/soc/soc-dapm.c +24 -0
@@ -75,12 +75,16 @@ static int dapm_up_seq[] = { [snd_soc_dapm_clock_supply] = 1, [snd_soc_dapm_supply] = 2, [snd_soc_dapm_micbias] = 3, + [snd_soc_dapm_vmid] = 3, [snd_soc_dapm_dai_link] = 2, [snd_soc_dapm_dai_in] = 4, [snd_soc_dapm_dai_out] = 4, [snd_soc_dapm_aif_in] = 4, [snd_soc_dapm_aif_out] = 4, [snd_soc_dapm_mic] = 5, + [snd_soc_dapm_siggen] = 5, + [snd_soc_dapm_input] = 5, + [snd_soc_dapm_output] = 5, [snd_soc_dapm_mux] = 6, [snd_soc_dapm_demux] = 6, [snd_soc_dapm_dac] = 7,
@@ -88,11 +92,19 @@ static int dapm_up_seq[] = { [snd_soc_dapm_mixer] = 8, [snd_soc_dapm_mixer_named_ctl] = 8, [snd_soc_dapm_pga] = 9, + [snd_soc_dapm_buffer] = 9, + [snd_soc_dapm_scheduler] = 9, + [snd_soc_dapm_effect] = 9, + [snd_soc_dapm_src] = 9, + [snd_soc_dapm_asrc] = 9, + [snd_soc_dapm_encoder] = 9, + [snd_soc_dapm_decoder] = 9, [snd_soc_dapm_adc] = 10, [snd_soc_dapm_out_drv] = 11, [snd_soc_dapm_hp] = 11, [snd_soc_dapm_spk] = 11, [snd_soc_dapm_line] = 11, + [snd_soc_dapm_sink] = 11, [snd_soc_dapm_kcontrol] = 12, [snd_soc_dapm_post] = 13, };
@@ -105,13 +117,25 @@ static int dapm_down_seq[] = { [snd_soc_dapm_spk] = 3, [snd_soc_dapm_line] = 3, [snd_soc_dapm_out_drv] = 3, + [snd_soc_dapm_sink] = 3, [snd_soc_dapm_pga] = 4, + [snd_soc_dapm_buffer] = 4, + [snd_soc_dapm_scheduler] = 4, + [snd_soc_dapm_effect] = 4, + [snd_soc_dapm_src] = 4, + [snd_soc_dapm_asrc] = 4, + [snd_soc_dapm_encoder] = 4, + [snd_soc_dapm_decoder] = 4, [snd_soc_dapm_switch] = 5, [snd_soc_dapm_mixer_named_ctl] = 5, [snd_soc_dapm_mixer] = 5, [snd_soc_dapm_dac] = 6, [snd_soc_dapm_mic] = 7, + [snd_soc_dapm_siggen] = 7, + [snd_soc_dapm_input] = 7, + [snd_soc_dapm_output] = 7, [snd_soc_dapm_micbias] = 8, + [snd_soc_dapm_vmid] = 8, [snd_soc_dapm_mux] = 9, [snd_soc_dapm_demux] = 9, [snd_soc_dapm_aif_in] = 10,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 19/183 ASoC: rsnd: fixup rsnd_ssi_master_clk_start() user count check
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d9111d36024de07784f2e1ba2ccf70b16035f378 ]
commit 4d230d1271064 ("ASoC: rsnd: fixup not to call clk_get/set under non-atomic") added new rsnd_ssi_prepare() and moved rsnd_ssi_master_clk_start() to .prepare.
But, ssi user count (= ssi->usrcnt) is incremented at .init (= rsnd_ssi_init()).
Because of these timing exchange, ssi->usrcnt check at rsnd_ssi_master_clk_start() should be adjusted. Otherwise, 2nd master clock setup will be no check. This patch fixup this issue.
--- sound/soc/sh/rcar/ssi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/sh/rcar/ssi.c +1 -1
@@ -280,7 +280,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,if (rsnd_ssi_is_multi_slave (mod, io))return 0 ; -if (ssi->usrcnt >1 ) { +if (ssi->usrcnt >0 ) {if (ssi->rate != rate) {dev_err (dev,"SSI parent/child should use same rate\n" );return -EINVAL ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 20/183 KVM: arm/arm64: Reset the VCPU without preemption and vcpu state loaded
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e761a927bc9a7ee6ceb7c4f63d5922dbced87f0d ]
We have two ways to reset a vcpu:
- either through VCPU_INIT
- or through a PSCI_ON call
The first one is easy to reason about. The second one is implemented in a more bizarre way, as it is the vcpu that handles PSCI_ON that resets the vcpu that is being powered-on. As we need to turn the logic around and have the target vcpu to reset itself, we must take some preliminary steps.
Resetting the VCPU state modifies the system register state in memory, but this may interact with vcpu_load/vcpu_put if running with preemption disabled, which in turn may lead to corrupted system register state.
Address this by disabling preemption and doing put/load if required around the reset logic.
--- arch/arm64/kvm/reset.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
arch/arm64/kvm/reset.c +24 -2
@@ -95,16 +95,33 @@ int kvm_arch_dev_ioctl_check_extension(struct kvm *kvm, long ext)* This function finds the right table above and sets the registers on * the virtual CPU struct to their architecturally defined reset * values. +* +* Note: This function can be called from two paths: The KVM_ARM_VCPU_INIT +* ioctl or as part of handling a request issued by another VCPU in the PSCI +* handling code. In the first case, the VCPU will not be loaded, and in the +* second case the VCPU will be loaded. Because this function operates purely +* on the memory-backed valus of system registers, we want to do a full put if +* we were loaded (handling a request) and load the values back at the end of +* the function. Otherwise we leave the state alone. In both cases, we +* disable preemption around the vcpu reset as we would otherwise race with +* preempt notifiers which also call put/load. */ int kvm_reset_vcpu (struct kvm_vcpu *vcpu) {const struct kvm_regs *cpu_reset; +int ret = -EINVAL ; +bool loaded; + +preempt_disable (); + loaded = (vcpu->cpu !=-1 ); +if (loaded) +kvm_arch_vcpu_put (vcpu);switch (vcpu->arch.target) {default :if (test_bit (KVM_ARM_VCPU_EL1_32BIT , vcpu->arch.features)) {if (!cpu_has_32bit_el1 ()) -return -EINVAL ; + goto out; cpu_reset = &default_regs_reset32; }else { cpu_reset = &default_regs_reset;
@@ -127,5 +144,10 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) vcpu->arch.workaround_flags |=VCPU_WORKAROUND_2_FLAG ;/* Reset timer */ -return kvm_timer_vcpu_reset (vcpu); + ret =kvm_timer_vcpu_reset (vcpu); +out: +if (loaded) +kvm_arch_vcpu_load (vcpu,smp_processor_id ()); +preempt_enable (); +return ret; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 21/183 ARM: OMAP2+: fix lack of timer interrupts on CPU1 after hotplug
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 50d6b3cf9403879911e06d69c7ef41e43f8f7b4b ]
If we have a kernel configured for periodic timer interrupts, and we have cpuidle enabled, then we end up with CPU1 losing timer interupts after a hotplug.
This can manifest itself in RCU stall warnings, or userspace becoming unresponsive.
The problem is that the kernel initially wants to use the TWD timer for interrupts, but the TWD loses context when we enter the C3 cpuidle state. Nothing reprograms the TWD after idle.
We have solved this in the past by switching to broadcast timer ticks, and cpuidle44xx switches to that mode at boot time. However, there is nothing to switch from periodic mode local timers after a hotplug operation.
We call tick_broadcast_enter() in omap_enter_idle_coupled(), which one would expect would take care of the issue, but internally this only deals with one-shot local timers - tick_broadcast_enable() on the other hand only deals with periodic local timers. So, we need to call both.
--- arch/arm/mach-omap2/cpuidle44xx.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-)
arch/arm/mach-omap2/cpuidle44xx.c +4 -12
@@ -152,6 +152,10 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev, mpuss_can_lose_context = (cx->mpu_state ==PWRDM_POWER_RET ) && (cx->mpu_logic_state ==PWRDM_POWER_OFF ); +/* Enter broadcast mode for periodic timers */ +tick_broadcast_enable (); + +/* Enter broadcast mode for one-shot timers */ tick_broadcast_enter ();/*
@@ -218,15 +222,6 @@ fail:return index; } -/* -* For each cpu, setup the broadcast timer because local timers -* stops for the states above C1. -*/ -static void omap_setup_broadcast_timer (void *arg) -{ -tick_broadcast_enable (); -} -static struct cpuidle_driver omap4_idle_driver = { .name ="omap4_idle" , .owner =THIS_MODULE ,
@@ -319,8 +314,5 @@ int __init omap4_idle_init(void)if (!cpu_clkdm[0 ] || !cpu_clkdm[1 ])return -ENODEV ; -/* Configure the broadcast timer on each cpu */ -on_each_cpu (omap_setup_broadcast_timer,NULL ,1 ); -return cpuidle_register (idle_driver, cpu_online_mask); }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 22/183 Input: cap11xx - switch to using set_brightness_blocking()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 628442880af8c201d307a45f3862a7a17df8a189 ]
Updating LED state requires access to regmap and therefore we may sleep, so we could not do that directly form set_brightness() method. Historically we used private work to adjust the brightness, but with the introduction of set_brightness_blocking() we no longer need it.
As a bonus, not having our own work item means we do not have use-after-free issue as we neglected to cancel outstanding work on driver unbind.
--- drivers/input/keyboard/cap11xx.c | 35 ++++++++++---------------------- 1 file changed, 11 insertions(+), 24 deletions(-)
drivers/input/keyboard/cap11xx.c +11 -24
@@ -75,9 +75,7 @@struct cap11xx_led {struct cap11xx_priv *priv;struct led_classdev cdev; -struct work_struct work;u32 reg; -enum led_brightness new_brightness; };#endif
@@ -233,30 +231,21 @@ static void cap11xx_input_close(struct input_dev *idev) }#ifdef CONFIG_LEDS_CLASS -static void cap11xx_led_work (struct work_struct *work) +static int cap11xx_led_set (struct led_classdev *cdev, +enum led_brightness value) { - struct cap11xx_led *led = container_of(work, struct cap11xx_led, work); + struct cap11xx_led *led = container_of(cdev, struct cap11xx_led, cdev);struct cap11xx_priv *priv = led->priv; -int value = led->new_brightness;/* -* All LEDs share the same duty cycle as this is a HW limitation. -* Brightness levels per LED are either 0 (OFF) and 1 (ON). +* All LEDs share the same duty cycle as this is a HW +* limitation. Brightness levels per LED are either +* 0 (OFF) and 1 (ON). */ -regmap_update_bits (priv->regmap,CAP11XX_REG_LED_OUTPUT_CONTROL , -BIT (led->reg), value ?BIT (led->reg) :0 ); -} - -static void cap11xx_led_set (struct led_classdev *cdev, -enum led_brightness value) -{ - struct cap11xx_led *led = container_of(cdev, struct cap11xx_led, cdev); - -if (led->new_brightness == value) -return ; - - led->new_brightness = value; -schedule_work (&led->work); +return regmap_update_bits (priv->regmap, +CAP11XX_REG_LED_OUTPUT_CONTROL , +BIT (led->reg), + value ?BIT (led->reg) :0 ); } static int cap11xx_init_leds(struct device *dev,
@@ -299,7 +288,7 @@ static int cap11xx_init_leds(struct device *dev, led->cdev.default_trigger =of_get_property (child,"linux,default-trigger" ,NULL ); led->cdev.flags =0 ; - led->cdev.brightness_set = cap11xx_led_set; + led->cdev.brightness_set_blocking = cap11xx_led_set; led->cdev.max_brightness =1 ; led->cdev.brightness =LED_OFF ;
@@ -312,8 +301,6 @@ static int cap11xx_init_leds(struct device *dev, led->reg = reg; led->priv = priv; -INIT_WORK (&led->work, cap11xx_led_work); - error =devm_led_classdev_register (dev, &led->cdev);if (error) {of_node_put (child);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 23/183 Input: ps2-gpio - flush TX work when closing port
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 33a841ce5cef4ca6c18ad333248b6d273f54c839 ]
To ensure that TX work is not running after serio port has been torn down, let's flush it when closing the port.
--- drivers/input/serio/ps2-gpio.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/serio/ps2-gpio.c +1 -0
@@ -76,6 +76,7 @@ static void ps2_gpio_close(struct serio *serio) {struct ps2_gpio_data *drvdata = serio->port_data; +flush_delayed_work (&drvdata->tx_work);disable_irq (drvdata->irq); }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 24/183 Input: matrix_keypad - use flush_delayed_work()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a342083abe576db43594a32d458a61fa81f7cb32 ]
We should be using flush_delayed_work() instead of flush_work() in matrix_keypad_stop() to ensure that we are not missing work that is scheduled but not yet put in the workqueue (i.e. its delay timer has not expired yet).
--- drivers/input/keyboard/matrix_keypad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/keyboard/matrix_keypad.c +1 -1
@@ -222,7 +222,7 @@ static void matrix_keypad_stop(struct input_dev *dev) keypad->stopped = true;spin_unlock_irq (&keypad->lock); -flush_work (&keypad->work.work); +flush_delayed_work (&keypad->work);/* * matrix_keypad_scan() will leave IRQs enabled; * we should disable them now.
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 25/183 mac80211: Fix Tx aggregation session tear down with ITXQs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6157ca0d6bfe437691b1e98a62e2efe12b6714da ]
When mac80211 requests the low level driver to stop an ongoing Tx aggregation, the low level driver is expected to call ieee80211_stop_tx_ba_cb_irqsafe() to indicate that it is ready to stop the session. The callback in turn schedules a worker to complete the session tear down, which in turn also handles the relevant state for the intermediate Tx queue.
However, as this flow in asynchronous, the intermediate queue should be stopped and not continue servicing frames, as in such a case frames that are dequeued would be marked as part of an aggregation, although the aggregation is already been stopped.
Fix this by stopping the intermediate Tx queue, before calling the low level driver to stop the Tx aggregation.
--- net/mac80211/agg-tx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/mac80211/agg-tx.c +3 -1
@@ -8,7 +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 +* Copyright (C) 2018 - 2019 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
@@ -361,6 +361,8 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,set_bit (HT_AGG_STATE_STOPPING , &tid_tx->state); +ieee80211_agg_stop_txq (sta, tid); +spin_unlock_bh (&sta->lock); ht_dbg(sta->sdata, "Tx BA session stop requested for %pM tid %u\n",
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 26/183 ipvs: fix dependency on nf_defrag_ipv6
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 098e13f5b21d3398065fce8780f07a3ef62f4812 ]
ipvs relies on nf_defrag_ipv6 module to manage IPv6 fragmentation, but lacks proper Kconfig dependencies and does not explicitly request defrag features.
As a result, if netfilter hooks are not loaded, when IPv6 fragmented packet are handled by ipvs only the first fragment makes through.
Fix it properly declaring the dependency on Kconfig and registering netfilter hooks on ip_vs_add_service() and ip_vs_new_dest().
--- net/netfilter/ipvs/Kconfig | 1 + net/netfilter/ipvs/ip_vs_core.c | 10 ++++------ net/netfilter/ipvs/ip_vs_ctl.c | 10 ++++++++++ 3 files changed, 15 insertions(+), 6 deletions(-)
net/netfilter/ipvs/Kconfig +1 -0
@@ -29,6 +29,7 @@ config IP_VS_IPV6 bool "IPv6 support for IPVS" depends on IPV6 = y || IP_VS = IPV6 select IP6_NF_IPTABLES + select NF_DEFRAG_IPV6 ---help--- Add IPv6 support to IPVS.
net/netfilter/ipvs/ip_vs_core.c +4 -6
@@ -1524,14 +1524,12 @@ ip_vs_try_to_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,/* sorry, all this trouble for a no-hit :) */ IP_VS_DBG_PKT (12 , af, pp, skb, iph->off,"ip_vs_in: packet continues traversal as normal" ); -if (iph->fragoffs) { -/* Fragment that couldn't be mapped to a conn entry -* is missing module nf_defrag_ipv6 -*/ -IP_VS_DBG_RL ("Unhandled frag, load nf_defrag_ipv6\n" ); + +/* Fragment couldn't be mapped to a conn entry */ +if (iph->fragoffs)IP_VS_DBG_PKT (7 , af, pp, skb, iph->off,"unhandled fragment" ); - } + *verdict =NF_ACCEPT ;return 0 ; }
net/netfilter/ipvs/ip_vs_ctl.c +10 -0
@@ -43,6 +43,7 @@#ifdef CONFIG_IP_VS_IPV6 #include <net/ipv6.h> #include <net/ip6_route.h> +#include <net/netfilter/ipv6/nf_defrag_ipv6.h> #endif #include <net/route.h> #include <net/sock.h>
@@ -888,6 +889,7 @@ ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest, {struct ip_vs_dest *dest;unsigned int atype, i; +int ret =0 ;EnterFunction (2 );
@@ -898,6 +900,10 @@ ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest, atype & IPV6_ADDR_LINKLOCAL) && !__ip_vs_addr_is_local_v6(svc->ipvs->net, &udest->addr.in6)) return -EINVAL; + + ret =nf_defrag_ipv6_enable (svc->ipvs->net); +if (ret) +return ret; } else#endif {
@@ -1221,6 +1227,10 @@ ip_vs_add_service(struct netns_ipvs *ipvs, struct ip_vs_service_user_kern *u, ret = -EINVAL ; goto out_err; } + + ret =nf_defrag_ipv6_enable (ipvs->net); +if (ret) + goto out_err; }#endif
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 27/183 floppy: check_events callback should not return a negative number
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 96d7cb932e826219ec41ac02e5af037ffae6098c ]
floppy_check_events() is supposed to return bit flags to say which events occured. We should return zero to say that no event flags are set. Only BIT(0) and BIT(1) are used in the caller. And .check_events interface also expect to return an unsigned int value.
However, after commit a0c80efe5956, it may return -EINTR (-4u). Here, both BIT(0) and BIT(1) are cleared. So this patch shouldn't affect runtime, but it obviously is still worth fixing.
--- drivers/block/floppy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/block/floppy.c +1 -1
@@ -4079,7 +4079,7 @@ static unsigned int floppy_check_events(struct gendisk *disk,if (time_after (jiffies,UDRS ->last_checked +UDP ->checkfreq)) {if (lock_fdc (drive)) -return -EINTR ; +return 0 ;poll_drive (false,0 );process_fd_request (); }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 28/183 NFS: Dont use page_file_mapping after removing the page
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d2ceb7e57086750ea6198a31fd942d98099a0786 ]
If nfs_page_async_flush() removes the page from the mapping, then we can't use page_file_mapping() on it as nfs_updatepate() is wont to do when receiving an error. Instead, push the mapping to the stack before the page is possibly truncated.
--- fs/nfs/write.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
fs/nfs/write.c +6 -5
@@ -236,9 +236,9 @@ out: }/* A writeback failed: mark the page as bad, and invalidate the page cache */ -static void nfs_set_pageerror (struct page *page) +static void nfs_set_pageerror (struct address_space *mapping) { -nfs_zap_mapping (page_file_mapping (page)->host,page_file_mapping (page)); +nfs_zap_mapping (mapping->host, mapping); }/*
@@ -994,7 +994,7 @@ static void nfs_write_completion(struct nfs_pgio_header *hdr)nfs_list_remove_request (req);if (test_bit (NFS_IOHDR_ERROR , &hdr->flags) && (hdr->good_bytes < bytes)) { -nfs_set_pageerror (req->wb_page); +nfs_set_pageerror (page_file_mapping (req->wb_page));nfs_context_set_write_error (req->wb_context, hdr->error); goto remove_req; }
@@ -1330,7 +1330,8 @@ int nfs_updatepage(struct file *file, struct page *page, unsigned int offset, unsigned int count) {struct nfs_open_context *ctx =nfs_file_open_context (file); -struct inode *inode =page_file_mapping (page)->host; +struct address_space *mapping =page_file_mapping (page); +struct inode *inode = mapping->host;int status =0 ;nfs_inc_stats (inode,NFSIOS_VFSUPDATEPAGE );
@@ -1348,7 +1349,7 @@ int nfs_updatepage(struct file *file, struct page *page, status =nfs_writepage_setup (ctx, page, offset, count);if (status <0 ) -nfs_set_pageerror (page); +nfs_set_pageerror (mapping);else __set_page_dirty_nobuffers (page); out:
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 29/183 mm/gup: fix gup_pmd_range() for dax
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 414fd080d125408cb15d04ff4907e1dd8145c8c7 ]
For dax pmd, pmd_trans_huge() returns false but pmd_huge() returns true on x86. So the function works as long as hugetlb is configured. However, dax doesn't depend on hugetlb.
--- mm/gup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
mm/gup.c +2 -1
@@ -1643,7 +1643,8 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,if (!pmd_present (pmd))return 0 ; -if (unlikely (pmd_trans_huge (pmd) ||pmd_huge (pmd))) { +if (unlikely (pmd_trans_huge (pmd) ||pmd_huge (pmd) || +pmd_devmap (pmd))) {/* * NUMA hinting faults need to be handled in the GUP * slowpath for accounting purposes and so that they
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 30/183 Revert "mm: use early_pfn_to_nid in page_ext_init"
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2f1ee0913ce58efe7f18fbd518bd54c598559b89 ]
This reverts commit fe53ca54270a ("mm: use early_pfn_to_nid in page_ext_init").
When booting a system with "page_owner=on",
start_kernel
page_ext_init
invoke_init_callbacks
init_section_page_ext
init_page_owner
init_early_allocated_pages
init_zones_in_node
init_pages_in_zone
lookup_page_ext
page_to_nid
The issue here is that page_to_nid() will not work since some page flags have no node information until later in page_alloc_init_late() due to DEFERRED_STRUCT_PAGE_INIT. Hence, it could trigger an out-of-bounds access with an invalid nid.
UBSAN: Undefined behaviour in ./include/linux/mm.h:1104:50 index 7 is out of range for type 'zone [5]'
Also, kernel will panic since flags were poisoned earlier with,
CONFIG_DEBUG_VM_PGFLAGS=yCONFIG_NODE_NOT_IN_PAGE_FLAGS=n
start_kernel
setup_arch
pagetable_init
paging_init
sparse_init
sparse_init_nid
memblock_alloc_try_nid_raw
It did not handle it well in init_pages_in_zone() which ends up calling page_to_nid().
page:ffffea0004200000 is uninitialized and poisoned
raw: ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff raw: ffffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffff page dumped because: VM_BUG_ON_PAGE(PagePoisoned(p)) page_owner info is not active (free page?) kernel BUG at include/linux/mm.h:990! RIP: 0010:init_page_owner+0x486/0x520
This means that assumptions behind commit fe53ca54270a ("mm: use early_pfn_to_nid in page_ext_init") are incomplete. Therefore, revert the commit for now. A proper way to move the page_owner initialization to sooner is to hook into memmap initialization.
--- init/main.c | 3 ++- mm/page_ext.c | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-)
init/main.c +2 -1
@@ -663,7 +663,6 @@ asmlinkage __visible void __init start_kernel(void) initrd_start = 0; }#endif -page_ext_init ();kmemleak_init ();debug_objects_mem_init ();setup_per_cpu_pageset ();
@@ -1069,6 +1068,8 @@ static noinline void __init kernel_init_freeable(void)sched_init_smp ();page_alloc_init_late (); +/* Initialize page ext after all struct pages are initialized. */ +page_ext_init ();do_basic_setup ();
mm/page_ext.c +1 -3
@@ -396,10 +396,8 @@ void __init page_ext_init(void)* We know some arch can have a nodes layout such as * -------------pfn--------------> * N0 | N1 | N2 | N0 | N1 | N2|.... -* -* Take into account DEFERRED_STRUCT_PAGE_INIT. */ -if (early_pfn_to_nid (pfn) != nid) +if (pfn_to_nid (pfn) != nid)continue ;if (init_section_page_ext (pfn, nid)) goto oom;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 31/183 mm: page_alloc: fix ref bias in page_frag_alloc() for 1-byte allocs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2c2ade81741c66082f8211f0b96cf509cc4c0218 ]
The basic idea behind ->pagecnt_bias is: If we pre-allocate the maximum number of references that we might need to create in the fastpath later, the bump-allocation fastpath only has to modify the non-atomic bias value that tracks the number of extra references we hold instead of the atomic refcount. The maximum number of allocations we can serve (under the assumption that no allocation is made with size 0) is nc->size, so that's the bias used.
However, even when all memory in the allocation has been given away, a reference to the page is still held; and in the offset < 0 slowpath, the page may be reused if everyone else has dropped their references. This means that the necessary number of references is actually nc->size+1.
Luckily, from a quick grep, it looks like the only path that can call page_frag_alloc(fragsz=1) is TAP with the IFF_NAPI_FRAGS flag, which requires CAP_NET_ADMIN in the init namespace and is only intended to be used for kernel testing and fuzzing.
To test for this issue, put a WARN_ON(page_ref_count(page) == 0) in the offset < 0 path, below the virt_to_page() call, and then repeatedly call writev() on a TAP device with IFF_TAP|IFF_NO_PI|IFF_NAPI_FRAGS|IFF_NAPI, with a vector consisting of 15 elements containing 1 byte each.
--- mm/page_alloc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
mm/page_alloc.c +4 -4
@@ -4325,11 +4325,11 @@ refill:/* Even if we own the page, we do not use atomic_set(). * This would break get_page_unless_zero() users. */ -page_ref_add (page, size -1 ); +page_ref_add (page, size);/* reset page count bias and offset to start of new frag */ nc->pfmemalloc =page_is_pfmemalloc (page); - nc->pagecnt_bias = size; + nc->pagecnt_bias = size +1 ; nc->offset = size; }
@@ -4345,10 +4345,10 @@ refill: size = nc->size;#endif /* OK, page count is 0, we can safely set it */ -set_page_count (page, size); +set_page_count (page, size +1 );/* reset page count bias and offset to start of new frag */ - nc->pagecnt_bias = size; + nc->pagecnt_bias = size +1 ; offset = size - fragsz; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 32/183 net: hns: Fix object reference leaks in hns_dsaf_roce_reset()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c969c6e7ab8cb42b5c787c567615474fdbad9d6a ]
The of_find_device_by_node() takes a reference to the underlying device structure, we should release that reference.
--- drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c +2 -0
@@ -3074,6 +3074,7 @@ int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool dereset) dsaf_dev =dev_get_drvdata (&pdev->dev);if (!dsaf_dev) {dev_err (&pdev->dev,"dsaf_dev is NULL\n" ); +put_device (&pdev->dev);return -ENODEV ; }
@@ -3081,6 +3082,7 @@ int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool dereset)if (AE_IS_VER1 (dsaf_dev->dsaf_ver)) {dev_err (dsaf_dev->dev,"%s v1 chip doesn't support RoCE!\n" , dsaf_dev->ae_dev.name); +put_device (&pdev->dev);return -ENODEV ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 33/183 i2c: cadence: Fix the hold bit setting
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d358def706880defa4c9e87381c5bf086a97d5f9 ]
In case the hold bit is not needed we are carrying the old values. Fix the same by resetting the bit when not needed.
Fixes the sporadic i2c bus lockups on National Instruments Zynq-based devices.
--- drivers/i2c/busses/i2c-cadence.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-cadence.c +7 -2
@@ -382,8 +382,10 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id)* Check for the message size against FIFO depth and set the * 'hold bus' bit if it is greater than FIFO depth. */ -if (id->recv_count >CDNS_I2C_FIFO_DEPTH ) +if ((id->recv_count >CDNS_I2C_FIFO_DEPTH ) || id->bus_hold_flag) ctrl_reg |=CDNS_I2C_CR_HOLD ; +else + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD ;cdns_i2c_writereg (ctrl_reg,CDNS_I2C_CR_OFFSET );
@@ -440,8 +442,11 @@ static void cdns_i2c_msend(struct cdns_i2c *id)* Check for the message size against FIFO depth and set the * 'hold bus' bit if it is greater than FIFO depth. */ -if (id->send_count >CDNS_I2C_FIFO_DEPTH ) +if ((id->send_count >CDNS_I2C_FIFO_DEPTH ) || id->bus_hold_flag) ctrl_reg |=CDNS_I2C_CR_HOLD ; +else + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD ; +cdns_i2c_writereg (ctrl_reg,CDNS_I2C_CR_OFFSET );/* Clear the interrupts in interrupt status register. */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 34/183 i2c: bcm2835: Clear current buffer pointers and counts after a transfer
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit f275a4659484716259cc46268d9043424e51cf0f ]
The driver's interrupt handler checks whether a message is currently being handled with the curr_msg pointer. When it is NULL, the interrupt is considered to be unexpected. Similarly, the i2c_start_transfer routine checks for the remaining number of messages to handle in num_msgs.
However, these values are never cleared and always keep the message and number relevant to the latest transfer (which might be done already and the underlying message memory might have been freed).
When an unexpected interrupt hits with the DONE bit set, the isr will then try to access the flags field of the curr_msg structure, leading to a fatal page fault.
The msg_buf and msg_buf_remaining fields are also never cleared at the end of the transfer, which can lead to similar pitfalls.
Fix these issues by introducing a cleanup function and always calling it after a transfer is finished.
--- drivers/i2c/busses/i2c-bcm2835.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/i2c/busses/i2c-bcm2835.c +12 -0
@@ -191,6 +191,15 @@ static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev)bcm2835_i2c_writel (i2c_dev,BCM2835_I2C_C , c); } +static void bcm2835_i2c_finish_transfer (struct bcm2835_i2c_dev *i2c_dev) +{ + i2c_dev->curr_msg =NULL ; + i2c_dev->num_msgs =0 ; + + i2c_dev->msg_buf =NULL ; + i2c_dev->msg_buf_remaining =0 ; +} +/* * Note about I2C_C_CLEAR on error: * The I2C_C_CLEAR on errors will take some time to resolve -- if you were in
@@ -291,6 +300,9 @@ static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], time_left =wait_for_completion_timeout (&i2c_dev->completion, adap->timeout); + +bcm2835_i2c_finish_transfer (i2c_dev); +if (!time_left) {bcm2835_i2c_writel (i2c_dev,BCM2835_I2C_C ,BCM2835_I2C_C_CLEAR );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 35/183 auxdisplay: ht16k33: fix potential user-after-free on module unload
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 69ef9bc54715fb1cb7786ada15774e469e822209 ]
On module unload/remove, we need to ensure that work does not run after we have freed resources. Concretely, cancel_delayed_work() may return while the callback function is still running.
Quoted 1 line
From
kernel/workqueue.c:
The work callback function may still be running on return, unless it returns true and the work doesn't re-arm itself. Explicitly flush or use cancel_delayed_work_sync() to wait on it.
--- drivers/auxdisplay/ht16k33.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/auxdisplay/ht16k33.c +1 -1
@@ -517,7 +517,7 @@ static int ht16k33_remove(struct i2c_client *client)struct ht16k33_priv *priv =i2c_get_clientdata (client);struct ht16k33_fbdev *fbdev = &priv->fbdev; -cancel_delayed_work (&fbdev->work); +cancel_delayed_work_sync (&fbdev->work);unregister_framebuffer (fbdev->info);framebuffer_release (fbdev->info);free_page ((unsigned long ) fbdev->buffer);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 36/183 Input: st-keyscan - fix potential zalloc NULL dereference
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2439d37e1bf8a34d437573c086572abe0f3f1b15 ]
This patch fixes the following static checker warning:
drivers/input/keyboard/st-keyscan.c:156 keyscan_probe()
error: potential zalloc NULL dereference: 'keypad_data->input_dev'
--- drivers/input/keyboard/st-keyscan.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/input/keyboard/st-keyscan.c +2 -2
@@ -153,6 +153,8 @@ static int keyscan_probe(struct platform_device *pdev) input_dev->id.bustype =BUS_HOST ; + keypad_data->input_dev = input_dev; + error =keypad_matrix_key_parse_dt (keypad_data);if (error)return error;
@@ -168,8 +170,6 @@ static int keyscan_probe(struct platform_device *pdev)input_set_drvdata (input_dev, keypad_data); - keypad_data->input_dev = input_dev; - res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); keypad_data->base =devm_ioremap_resource (&pdev->dev, res);if (IS_ERR (keypad_data->base))
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 37/183 clk: sunxi-ng: v3s: Fix TCON reset de-assert bit
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 5c59801f7018acba11b12de59017a3fcdcf7421d ]
According to the datasheet and the reference code from Allwinner, the bit used to de-assert the TCON reset is bit 4, not bit 3.
Fix it in the V3s CCU driver.
--- drivers/clk/sunxi-ng/ccu-sun8i-v3s.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +1 -1
@@ -542,7 +542,7 @@ static struct ccu_reset_map sun8i_v3s_ccu_resets[] = { [RST_BUS_OHCI0] = { 0x2c0, BIT(29) }, [RST_BUS_VE] = { 0x2c4, BIT(0) }, - [RST_BUS_TCON0] = { 0x2c4, BIT(3) }, + [RST_BUS_TCON0] = { 0x2c4, BIT(4) }, [RST_BUS_CSI] = { 0x2c4, BIT(8) }, [RST_BUS_DE] = { 0x2c4, BIT(12) }, [RST_BUS_DBG] = { 0x2c4, BIT(31) },
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 38/183 clk: sunxi: A31: Fix wrong AHB gate number
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ee0b27a3a4da0b0ed2318aa092f8856896e9450b ]
According to the manual the gate clock for MMC3 is at bit 11, and NAND1 is controlled by bit 12.
Fix the gate bit definitions in the clock driver.
--- drivers/clk/sunxi-ng/ccu-sun6i-a31.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/sunxi-ng/ccu-sun6i-a31.c +2 -2
@@ -252,9 +252,9 @@ static SUNXI_CCU_GATE(ahb1_mmc1_clk, "ahb1-mmc1", "ahb1", static SUNXI_CCU_GATE(ahb1_mmc2_clk, "ahb1-mmc2", "ahb1", 0x060, BIT(10), 0); static SUNXI_CCU_GATE(ahb1_mmc3_clk, "ahb1-mmc3", "ahb1", - 0x060, BIT(12), 0); + 0x060, BIT(11), 0); static SUNXI_CCU_GATE(ahb1_nand1_clk, "ahb1-nand1", "ahb1", - 0x060, BIT(13), 0); + 0x060, BIT(12), 0); static SUNXI_CCU_GATE(ahb1_nand0_clk, "ahb1-nand0", "ahb1", 0x060, BIT(13), 0); static SUNXI_CCU_GATE(ahb1_sdram_clk, "ahb1-sdram", "ahb1",
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 39/183 esp: Skip TX bytes accounting when sending from a request socket
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 09db51241118aeb06e1c8cd393b45879ce099b36 ]
On ESP output, sk_wmem_alloc is incremented for the added padding if a socket is associated to the skb. When replying with TCP SYNACKs over IPsec, the associated sk is a casted request socket, only. Increasing sk_wmem_alloc on a request socket results in a write at an arbitrary struct offset. In the best case, this produces the following WARNING:
WARNING: CPU: 1 PID: 0 at lib/refcount.c:102 esp_output_head+0x2e4/0x308 [esp4] refcount_t: addition on 0; use-after-free. CPU: 1 PID: 0 Comm: swapper/1 Not tainted 5.0.0-rc3 #2 Hardware name: Marvell Armada 380/385 (Device Tree)
[...]
[<bf0ff354>] (esp_output_head [esp4]) from [<bf1006a4>] (esp_output+0xb8/0x180 [esp4]) [<bf1006a4>] (esp_output [esp4]) from [<c05dee64>] (xfrm_output_resume+0x558/0x664) [<c05dee64>] (xfrm_output_resume) from [<c05d07b0>] (xfrm4_output+0x44/0xc4) [<c05d07b0>] (xfrm4_output) from [<c05956bc>] (tcp_v4_send_synack+0xa8/0xe8) [<c05956bc>] (tcp_v4_send_synack) from [<c0586ad8>] (tcp_conn_request+0x7f4/0x948) [<c0586ad8>] (tcp_conn_request) from [<c058c404>] (tcp_rcv_state_process+0x2a0/0xe64) [<c058c404>] (tcp_rcv_state_process) from [<c05958ac>] (tcp_v4_do_rcv+0xf0/0x1f4) [<c05958ac>] (tcp_v4_do_rcv) from [<c0598a4c>] (tcp_v4_rcv+0xdb8/0xe20) [<c0598a4c>] (tcp_v4_rcv) from [<c056eb74>] (ip_protocol_deliver_rcu+0x2c/0x2dc) [<c056eb74>] (ip_protocol_deliver_rcu) from [<c056ee6c>] (ip_local_deliver_finish+0x48/0x54) [<c056ee6c>] (ip_local_deliver_finish) from [<c056eecc>] (ip_local_deliver+0x54/0xec) [<c056eecc>] (ip_local_deliver) from [<c056efac>] (ip_rcv+0x48/0xb8) [<c056efac>] (ip_rcv) from [<c0519c2c>] (__netif_receive_skb_one_core+0x50/0x6c) [...]
The issue triggers only when not using TCP syncookies, as for syncookies no socket is associated.
--- net/ipv4/esp4.c | 2 +- net/ipv6/esp6.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv4/esp4.c +1 -1
@@ -307,7 +307,7 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info * skb->len += tailen; skb->data_len += tailen; skb->truesize += tailen; -if (sk) +if (sk &&sk_fullsock (sk))refcount_add (tailen, &sk->sk_wmem_alloc); goto out;
net/ipv6/esp6.c +1 -1
@@ -275,7 +275,7 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info skb->len += tailen; skb->data_len += tailen; skb->truesize += tailen; -if (sk) +if (sk &&sk_fullsock (sk))refcount_add (tailen, &sk->sk_wmem_alloc); goto out;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 40/183 ARM: 8824/1: fix a migrating irq bug when hotplug cpu
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 1b5ba350784242eb1f899bcffd95d2c7cff61e84 ]
Arm TC2 fails cpu hotplug stress test.
This issue was tracked down to a missing copy of the new affinity cpumask for the vexpress-spc interrupt into struct irq_common_data.affinity when the interrupt is migrated in migrate_one_irq().
Fix it by replacing the arm specific hotplug cpu migration with the generic irq code.
This is the counterpart implementation to commit 217d453d473c ("arm64:
fix a migrating irq bug when hotplug cpu").
Tested with cpu hotplug stress test on Arm TC2 (multi_v7_defconfig plus CONFIG_ARM_BIG_LITTLE_CPUFREQ=y and CONFIG_ARM_VEXPRESS_SPC_CPUFREQ=y). The vexpress-spc interrupt (irq=22) on this board is affine to CPU0. Its affinity cpumask now changes correctly e.g. from 0 to 1-4 when CPU0 is hotplugged out.
--- arch/arm/Kconfig | 1 + arch/arm/include/asm/irq.h | 1 - arch/arm/kernel/irq.c | 62 -------------------------------------- arch/arm/kernel/smp.c | 2 +- 4 files changed, 2 insertions(+), 64 deletions(-)
arch/arm/Kconfig +1 -0
@@ -1447,6 +1447,7 @@ config NR_CPUS config HOTPLUG_CPU bool "Support for hot-pluggable CPUs" depends on SMP + select GENERIC_IRQ_MIGRATION help Say Y here to experiment with turning CPUs off and on. CPUs can be controlled through /sys/devices/system/cpu.
arch/arm/include/asm/irq.h +0 -1
@@ -25,7 +25,6 @@#ifndef __ASSEMBLY__struct irqaction ;struct pt_regs ; -extern void migrate_irqs (void );extern void asm_do_IRQ (unsigned int ,struct pt_regs *);void handle_IRQ (unsigned int ,struct pt_regs *);
arch/arm/kernel/irq.c +0 -62
71 lines not on this page · raw message
arch/arm/kernel/smp.c +1 -1
@@ -254,7 +254,7 @@ int __cpu_disable(void)/* * OK - migrate IRQs away from this CPU */ -migrate_irqs (); +irq_migrate_all_off_this_cpu ();/* * Flush user cache and TLB mappings, and then remove this CPU
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 41/183 af_key: unconditionally clone on broadcast
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit fc2d5cfdcfe2ab76b263d91429caa22451123085 ]
Attempting to avoid cloning the skb when broadcasting by inflating the refcount with sock_hold/sock_put while under RCU lock is dangerous and violates RCU principles. It leads to subtle race conditions when attempting to free the SKB, as we may reference sockets that have already been freed by the stack.
Unable to handle kernel paging request at virtual address 6b6b6b6b6b6c4b [006b6b6b6b6b6c4b] address between user and kernel address ranges Internal error: Oops: 96000004 [#1] PREEMPT SMP task: fffffff78f65b380 task.stack: ffffff8049a88000 pc : sock_rfree+0x38/0x6c lr : skb_release_head_state+0x6c/0xcc Process repro (pid: 7117, stack limit = 0xffffff8049a88000) Call trace: sock_rfree+0x38/0x6c skb_release_head_state+0x6c/0xcc skb_release_all+0x1c/0x38 __kfree_skb+0x1c/0x30 kfree_skb+0xd0/0xf4 pfkey_broadcast+0x14c/0x18c pfkey_sendmsg+0x1d8/0x408 sock_sendmsg+0x44/0x60 ___sys_sendmsg+0x1d0/0x2a8 __sys_sendmsg+0x64/0xb4 SyS_sendmsg+0x34/0x4c el0_svc_naked+0x34/0x38 Kernel panic - not syncing: Fatal exception
--- net/key/af_key.c | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-)
net/key/af_key.c +15 -25
@@ -196,30 +196,22 @@ static int pfkey_release(struct socket *sock)return 0 ; } -static int pfkey_broadcast_one (struct sk_buff *skb,struct sk_buff **skb2, -gfp_t allocation,struct sock *sk) +static int pfkey_broadcast_one (struct sk_buff *skb,gfp_t allocation, +struct sock *sk) {int err = -ENOBUFS ; -sock_hold (sk); -if (*skb2 ==NULL ) { -if (refcount_read (&skb->users) !=1 ) { - *skb2 =skb_clone (skb, allocation); - }else { - *skb2 = skb; -refcount_inc (&skb->users); - } - } -if (*skb2 !=NULL ) { -if (atomic_read (&sk->sk_rmem_alloc) <= sk->sk_rcvbuf) { -skb_set_owner_r (*skb2, sk); -skb_queue_tail (&sk->sk_receive_queue, *skb2); - sk->sk_data_ready (sk); - *skb2 =NULL ; - err =0 ; - } +if (atomic_read (&sk->sk_rmem_alloc) > sk->sk_rcvbuf) +return err; + + skb =skb_clone (skb, allocation); + +if (skb) { +skb_set_owner_r (skb, sk); +skb_queue_tail (&sk->sk_receive_queue, skb); + sk->sk_data_ready (sk); + err =0 ; } -sock_put (sk);return err; }
@@ -234,7 +226,6 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, {struct netns_pfkey *net_pfkey =net_generic (net, pfkey_net_id);struct sock *sk; -struct sk_buff *skb2 =NULL ;int err = -ESRCH ;/* XXX Do we need something like netlink_overrun? I think
@@ -253,7 +244,7 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation,* socket. */ if (pfk->promisc) -pfkey_broadcast_one (skb, &skb2,GFP_ATOMIC , sk); +pfkey_broadcast_one (skb,GFP_ATOMIC , sk);/* the exact target will be processed later */ if (sk == one_sk)
@@ -268,7 +259,7 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation,continue ; } - err2 =pfkey_broadcast_one (skb, &skb2,GFP_ATOMIC , sk); + err2 =pfkey_broadcast_one (skb,GFP_ATOMIC , sk);/* Error is cleared after successful sending to at least one * registered KM */
@@ -278,9 +269,8 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation,rcu_read_unlock ();if (one_sk !=NULL ) - err =pfkey_broadcast_one (skb, &skb2, allocation, one_sk); + err =pfkey_broadcast_one (skb, allocation, one_sk); -kfree_skb (skb2);kfree_skb (skb);return err; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 42/183 assoc_array: Fix shortcut creation
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit bb2ba2d75a2d673e76ddaf13a9bd30d6a8b1bb08 ]
Fix the creation of shortcuts for which the length of the index key value is an exact multiple of the machine word size. The problem is that the code that blanks off the unused bits of the shortcut value malfunctions if the number of bits in the last word equals machine word size. This is due to the "<<" operator being given a shift of zero in this case, and so the mask that should be all zeros is all ones instead. This causes the subsequent masking operation to clear everything rather than clearing nothing.
Ordinarily, the presence of the hash at the beginning of the tree index key makes the issue very hard to test for, but in this case, it was encountered due to a development mistake that caused the hash output to be either 0 (keyring) or 1 (non-keyring) only. This made it susceptible to the keyctl/unlink/valid test in the keyutils package.
The fix is simply to skip the blanking if the shift would be 0. For example, an index key that is 64 bits long would produce a 0 shift and thus a 'blank' of all 1s. This would then be inverted and AND'd onto the index_key, incorrectly clearing the entire last word.
--- lib/assoc_array.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
lib/assoc_array.c +5 -3
@@ -781,9 +781,11 @@ all_leaves_cluster_together: new_s0->index_key[i] = ops->get_key_chunk (index_key, i *ASSOC_ARRAY_KEY_CHUNK_SIZE ); - blank =ULONG_MAX << (level &ASSOC_ARRAY_KEY_CHUNK_MASK ); -pr_devel ("blank off [%zu] %d: %lx\n" , keylen -1 , level, blank); - new_s0->index_key[keylen -1 ] &= ~blank; +if (level &ASSOC_ARRAY_KEY_CHUNK_MASK ) { + blank =ULONG_MAX << (level &ASSOC_ARRAY_KEY_CHUNK_MASK ); +pr_devel ("blank off [%zu] %d: %lx\n" , keylen -1 , level, blank); + new_s0->index_key[keylen -1 ] &= ~blank; + }/* This now reduces to a node splitting exercise for which we'll need * to regenerate the disparity table.
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 43/183 keys: Fix dependency loop between construction record and auth key
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 822ad64d7e46a8e2c8b8a796738d7b657cbb146d ]
In the request_key() upcall mechanism there's a dependency loop by which if a key type driver overrides the ->request_key hook and the userspace side manages to lose the authorisation key, the auth key and the internal construction record (struct key_construction) can keep each other pinned.
Fix this by the following changes:
(1) Killing off the construction record and using the auth key instead.
(2) Including the operation name in the auth key payload and making the payload available outside of security/keys/.
(3) The ->request_key hook is given the authkey instead of the cons record and operation name.
Changes (2) and (3) allow the auth key to naturally be cleaned up if the keyring it is in is destroyed or cleared or the auth key is unlinked.
--- fs/nfs/nfs4idmap.c | 31 ++++++------ include/keys/request_key_auth-type.h | 36 ++++++++++++++ include/linux/key-type.h | 22 +++------ security/keys/internal.h | 13 +---- security/keys/keyctl.c | 1 + security/keys/process_keys.c | 1 + security/keys/request_key.c | 72 +++++++++++----------------- security/keys/request_key_auth.c | 16 ++++--- 8 files changed, 100 insertions(+), 92 deletions(-) create mode 100644 include/keys/request_key_auth-type.h
fs/nfs/nfs4idmap.c +17 -14
@@ -44,6 +44,7 @@#include <linux/keyctl.h> #include <linux/key-type.h> #include <keys/user-type.h> +#include <keys/request_key_auth-type.h> #include <linux/module.h> #include "internal.h"
@@ -59,7 +60,7 @@ static struct key_type key_type_id_resolver_legacy;struct idmap_legacy_upcalldata {struct rpc_pipe_msg pipe_msg;struct idmap_msg idmap_msg; -struct key_construction *key_cons; +struct key *authkey;struct idmap *idmap; };
@@ -384,7 +385,7 @@ static const match_table_t nfs_idmap_tokens = { { Opt_find_err, NULL } }; -static int nfs_idmap_legacy_upcall (struct key_construction *,const char *,void *); +static int nfs_idmap_legacy_upcall (struct key *,void *);static ssize_t idmap_pipe_downcall (struct file *,const char __user *,size_t );static void idmap_release_pipe (struct inode *);
@@ -545,11 +546,12 @@ nfs_idmap_prepare_pipe_upcall(struct idmap *idmap,static void nfs_idmap_complete_pipe_upcall_locked (struct idmap *idmap,int ret) { -struct key_construction *cons = idmap->idmap_upcall_data->key_cons; +struct key *authkey = idmap->idmap_upcall_data->authkey;kfree (idmap->idmap_upcall_data); idmap->idmap_upcall_data =NULL ; -complete_request_key (cons, ret); +complete_request_key (authkey, ret); +key_put (authkey); } static void
@@ -559,15 +561,14 @@ nfs_idmap_abort_pipe_upcall(struct idmap *idmap, int ret)nfs_idmap_complete_pipe_upcall_locked (idmap, ret); } -static int nfs_idmap_legacy_upcall (struct key_construction *cons, -const char *op, -void *aux) +static int nfs_idmap_legacy_upcall (struct key *authkey,void *aux) {struct idmap_legacy_upcalldata *data; +struct request_key_auth *rka =get_request_key_auth (authkey);struct rpc_pipe_msg *msg;struct idmap_msg *im;struct idmap *idmap = (struct idmap *)aux; -struct key *key = cons->key; +struct key *key = rka->target_key;int ret = -ENOKEY ;if (!aux)
@@ -582,7 +583,7 @@ static int nfs_idmap_legacy_upcall(struct key_construction *cons, msg = &data->pipe_msg; im = &data->idmap_msg; data->idmap = idmap; - data->key_cons = cons; + data->authkey =key_get (authkey); ret =nfs_idmap_prepare_message (key->description, idmap, im, msg);if (ret <0 )
@@ -600,7 +601,7 @@ static int nfs_idmap_legacy_upcall(struct key_construction *cons, out2:kfree (data); out1: -complete_request_key (cons, ret); +complete_request_key (authkey, ret);return ret; }
@@ -647,9 +648,10 @@ out:static ssize_t idmap_pipe_downcall (struct file *filp,const char __user *src,size_t mlen) { +struct request_key_auth *rka;struct rpc_inode *rpci =RPC_I (file_inode (filp));struct idmap *idmap = (struct idmap *)rpci->private; -struct key_construction *cons; +struct key *authkey;struct idmap_msg im;size_t namelen_in;int ret = -ENOKEY ;
@@ -661,7 +663,8 @@ idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)if (idmap->idmap_upcall_data ==NULL ) goto out_noupcall; - cons = idmap->idmap_upcall_data->key_cons; + authkey = idmap->idmap_upcall_data->authkey; + rka =get_request_key_auth (authkey);if (mlen !=sizeof (im)) { ret = -ENOSPC ;
@@ -686,9 +689,9 @@ idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) ret =nfs_idmap_read_and_verify_message (&im, &idmap->idmap_upcall_data->idmap_msg, - cons->key, cons->authkey); + rka->target_key, authkey);if (ret >=0 ) { -key_set_timeout (cons->key, nfs_idmap_cache_timeout); +key_set_timeout (rka->target_key, nfs_idmap_cache_timeout); ret = mlen; }
include/keys/request_key_auth-type.h new file +36 -0
@@ -0,0 +1,36 @@ +/* request_key authorisation token key type +* +* Copyright (C) 2005 Red Hat, Inc. All Rights Reserved. +* Written by David Howells ([email protected]) +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public Licence +* as published by the Free Software Foundation; either version +* 2 of the Licence, or (at your option) any later version. +*/ + +#ifndef _KEYS_REQUEST_KEY_AUTH_TYPE_H +#define _KEYS_REQUEST_KEY_AUTH_TYPE_H + +#include <linux/key.h> + +/* +* Authorisation record for request_key(). +*/ +struct request_key_auth { +struct key *target_key; +struct key *dest_keyring; +const struct cred *cred; +void *callout_info; +size_t callout_len; +pid_t pid; +char op[8 ]; +} __randomize_layout; + +static inline struct request_key_auth *get_request_key_auth (const struct key *key) +{ +return key->payload.data[0 ]; +} + + +#endif /* _KEYS_REQUEST_KEY_AUTH_TYPE_H */
include/linux/key-type.h +6 -16
@@ -17,15 +17,6 @@#ifdef CONFIG_KEYS -/* -* key under-construction record -* - passed to the request_key actor if supplied -*/ -struct key_construction { -struct key *key;/* key being constructed */ -struct key *authkey;/* authorisation for key being constructed */ -}; -/* * Pre-parsed payload, used by key add, update and instantiate. *
@@ -47,8 +38,7 @@ struct key_preparsed_payload {time_t expiry;/* Expiry time of key */ } __randomize_layout; -typedef int (*request_key_actor_t )(struct key_construction *key, -const char *op,void *aux); +typedef int (*request_key_actor_t )(struct key *auth_key,void *aux);/* * Preparsed matching criterion.
@@ -170,20 +160,20 @@ extern int key_instantiate_and_link(struct key *key,const void *data, size_t datalen, struct key *keyring, - struct key *instkey); + struct key *authkey);extern int key_reject_and_link (struct key *key,unsigned timeout,unsigned error,struct key *keyring, -struct key *instkey); -extern void complete_request_key (struct key_construction *cons,int error); +struct key *authkey); +extern void complete_request_key (struct key *authkey,int error);static inline int key_negate_and_link (struct key *key,unsigned timeout,struct key *keyring, -struct key *instkey) +struct key *authkey) { -return key_reject_and_link (key, timeout,ENOKEY , keyring, instkey); +return key_reject_and_link (key, timeout,ENOKEY , keyring, authkey); }extern int generic_key_instantiate (struct key *key,struct key_preparsed_payload *prep);
security/keys/internal.h +1 -12
@@ -188,20 +188,9 @@ static inline int key_permission(const key_ref_t key_ref, unsigned perm)return key_task_permission (key_ref,current_cred (), perm); } -/* -* Authorisation record for request_key(). -*/ -struct request_key_auth { -struct key *target_key; -struct key *dest_keyring; -const struct cred *cred; -void *callout_info; -size_t callout_len; -pid_t pid; -} __randomize_layout; -extern struct key_type key_type_request_key_auth;extern struct key *request_key_auth_new (struct key *target, +const char *op,const void *callout_info,size_t callout_len,struct key *dest_keyring);
security/keys/keyctl.c +1 -0
@@ -26,6 +26,7 @@#include <linux/security.h> #include <linux/uio.h> #include <linux/uaccess.h> +#include <keys/request_key_auth-type.h> #include "internal.h" #define KEY_MAX_DESC_SIZE 4096
security/keys/process_keys.c +1 -0
@@ -20,6 +20,7 @@#include <linux/security.h> #include <linux/user_namespace.h> #include <linux/uaccess.h> +#include <keys/request_key_auth-type.h> #include "internal.h" /* Session keyring create vs join semaphore */
security/keys/request_key.c +29 -43
144 lines not on this page · raw message
security/keys/request_key_auth.c +9 -7
@@ -18,7 +18,7 @@#include <linux/slab.h> #include <linux/uaccess.h> #include "internal.h" -#include <keys/user-type.h> +#include <keys/request_key_auth-type.h> static int request_key_auth_preparse (struct key_preparsed_payload *);static void request_key_auth_free_preparse (struct key_preparsed_payload *);
@@ -69,7 +69,7 @@ static int request_key_auth_instantiate(struct key *key,static void request_key_auth_describe (const struct key *key,struct seq_file *m) { -struct request_key_auth *rka = key->payload.data[0 ]; +struct request_key_auth *rka =get_request_key_auth (key);seq_puts (m,"key:" );seq_puts (m, key->description);
@@ -84,7 +84,7 @@ static void request_key_auth_describe(const struct key *key,static long request_key_auth_read (const struct key *key,char __user *buffer,size_t buflen) { -struct request_key_auth *rka = key->payload.data[0 ]; +struct request_key_auth *rka =get_request_key_auth (key);size_t datalen;long ret;
@@ -110,7 +110,7 @@ static long request_key_auth_read(const struct key *key,*/ static void request_key_auth_revoke (struct key *key) { -struct request_key_auth *rka = key->payload.data[0 ]; +struct request_key_auth *rka =get_request_key_auth (key);kenter ("{%d}" , key->serial);
@@ -137,7 +137,7 @@ static void free_request_key_auth(struct request_key_auth *rka)*/ static void request_key_auth_destroy (struct key *key) { -struct request_key_auth *rka = key->payload.data[0 ]; +struct request_key_auth *rka =get_request_key_auth (key);kenter ("{%d}" , key->serial);
@@ -148,8 +148,9 @@ static void request_key_auth_destroy(struct key *key)* Create an authorisation token for /sbin/request-key or whoever to gain * access to the caller's security data. */ -struct key *request_key_auth_new (struct key *target,const void *callout_info, -size_t callout_len,struct key *dest_keyring) +struct key *request_key_auth_new (struct key *target,const char *op, +const void *callout_info,size_t callout_len, +struct key *dest_keyring) {struct request_key_auth *rka, *irka;const struct cred *cred = current->cred;
@@ -167,6 +168,7 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info,if (!rka->callout_info) goto error_free_rka; rka->callout_len = callout_len; +strlcpy (rka->op, op,sizeof (rka->op));/* see if the calling process is already servicing the key request of * another process */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 44/183 scsi: libiscsi: Fix race between iscsi_xmit_task and iscsi_complete_task
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 79edd00dc6a96644d76b4a1cb97d94d49e026768 ]
When a target sends Check Condition, whilst initiator is busy xmiting re-queued data, could lead to race between iscsi_complete_task() and iscsi_xmit_task() and eventually crashing with the following kernel backtrace.
[3326150.987523] ALERT: BUG: unable to handle kernel NULL pointer dereference at 0000000000000078 [3326150.987549] ALERT: IP: [<ffffffffa05ce70d>] iscsi_xmit_task+0x2d/0xc0 [libiscsi] [3326150.987571] WARN: PGD 569c8067 PUD 569c9067 PMD 0 [3326150.987582] WARN: Oops: 0002 [#1] SMP [3326150.987593] WARN: Modules linked in: tun nfsv3 nfs fscache dm_round_robin [3326150.987762] WARN: CPU: 2 PID: 8399 Comm: kworker/u32:1 Tainted: G O 4.4.0+2 #1 [3326150.987774] WARN: Hardware name: Dell Inc. PowerEdge R720/0W7JN5, BIOS 2.5.4 01/22/2016 [3326150.987790] WARN: Workqueue: iscsi_q_13 iscsi_xmitworker [libiscsi] [3326150.987799] WARN: task: ffff8801d50f3800 ti: ffff8801f5458000 task.ti: ffff8801f5458000 [3326150.987810] WARN: RIP: e030:[<ffffffffa05ce70d>] [<ffffffffa05ce70d>] iscsi_xmit_task+0x2d/0xc0 [libiscsi] [3326150.987825] WARN: RSP: e02b:ffff8801f545bdb0 EFLAGS: 00010246 [3326150.987831] WARN: RAX: 00000000ffffffc3 RBX: ffff880282d2ab20 RCX: ffff88026b6ac480 [3326150.987842] WARN: RDX: 0000000000000000 RSI: 00000000fffffe01 RDI: ffff880282d2ab20 [3326150.987852] WARN: RBP: ffff8801f545bdc8 R08: 0000000000000000 R09: 0000000000000008 [3326150.987862] WARN: R10: 0000000000000000 R11: 000000000000fe88 R12: 0000000000000000 [3326150.987872] WARN: R13: ffff880282d2abe8 R14: ffff880282d2abd8 R15: ffff880282d2ac08 [3326150.987890] WARN: FS: 00007f5a866b4840(0000) GS:ffff88028a640000(0000) knlGS:0000000000000000 [3326150.987900] WARN: CS: e033 DS: 0000 ES: 0000 CR0: 0000000080050033 [3326150.987907] WARN: CR2: 0000000000000078 CR3: 0000000070244000 CR4: 0000000000042660 [3326150.987918] WARN: Stack: [3326150.987924] WARN: ffff880282d2ad58 ffff880282d2ab20 ffff880282d2abe8 ffff8801f545be18 [3326150.987938] WARN: ffffffffa05cea90 ffff880282d2abf8 ffff88026b59cc80 ffff88026b59cc00 [3326150.987951] WARN: ffff88022acf32c0 ffff880289491800 ffff880255a80800 0000000000000400 [3326150.987964] WARN: Call Trace: [3326150.987975] WARN: [<ffffffffa05cea90>] iscsi_xmitworker+0x2f0/0x360 [libiscsi] [3326150.987988] WARN: [<ffffffff8108862c>] process_one_work+0x1fc/0x3b0 [3326150.987997] WARN: [<ffffffff81088f95>] worker_thread+0x2a5/0x470 [3326150.988006] WARN: [<ffffffff8159cad8>] ? __schedule+0x648/0x870 [3326150.988015] WARN: [<ffffffff81088cf0>] ? rescuer_thread+0x300/0x300 [3326150.988023] WARN: [<ffffffff8108ddf5>] kthread+0xd5/0xe0 [3326150.988031] WARN: [<ffffffff8108dd20>] ? kthread_stop+0x110/0x110 [3326150.988040] WARN: [<ffffffff815a0bcf>] ret_from_fork+0x3f/0x70 [3326150.988048] WARN: [<ffffffff8108dd20>] ? kthread_stop+0x110/0x110 [3326150.988127] ALERT: RIP [<ffffffffa05ce70d>] iscsi_xmit_task+0x2d/0xc0 [libiscsi] [3326150.988138] WARN: RSP <ffff8801f545bdb0> [3326150.988144] WARN: CR2: 0000000000000078 [3326151.020366] WARN: ---[ end trace 1c60974d4678d81b ]---
Commit 6f8830f5bbab ("scsi: libiscsi: add lock around task lists to fix list corruption regression") introduced "taskqueuelock" to fix list corruption during the race, but this wasn't enough.
Re-setting of conn->task to NULL, could race with iscsi_xmit_task(). iscsi_complete_task()
{
....
if (conn->task == task)
conn->task = NULL;
}conn->task in iscsi_xmit_task() could be NULL and so will be task. __iscsi_get_task(task) will crash (NullPtr de-ref), trying to access refcount.
iscsi_xmit_task()
{
struct iscsi_task *task = conn->task;
__iscsi_get_task(task);
}This commit will take extra conn->session->back_lock in iscsi_xmit_task() to ensure iscsi_xmit_task() waits for iscsi_complete_task(), if iscsi_complete_task() wins the race. If iscsi_xmit_task() wins the race, iscsi_xmit_task() increments task->refcount
(__iscsi_get_task) ensuring iscsi_complete_task() will not iscsi_free_task().
--- drivers/scsi/libiscsi.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/scsi/libiscsi.c +6 -0
@@ -1449,7 +1449,13 @@ static int iscsi_xmit_task(struct iscsi_conn *conn)if (test_bit (ISCSI_SUSPEND_BIT , &conn->suspend_tx))return -ENODATA ; +spin_lock_bh (&conn->session->back_lock); +if (conn->task ==NULL ) { +spin_unlock_bh (&conn->session->back_lock); +return -ENODATA ; + }__iscsi_get_task (task); +spin_unlock_bh (&conn->session->back_lock);spin_unlock_bh (&conn->session->frwd_lock); rc = conn->session->tt->xmit_task (task);spin_lock_bh (&conn->session->frwd_lock);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 45/183 net: systemport: Fix reception of BPDUs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a40061ea2e39494104602b3048751341bda374a1 ]
SYSTEMPORT has its RXCHK parser block that attempts to validate the packet structures, unfortunately setting the L2 header check bit will cause Bridge PDUs (BPDUs) to be incorrectly rejected because they look like LLC/SNAP packets with a non-IPv4 or non-IPv6 Ethernet Type.
--- drivers/net/ethernet/broadcom/bcmsysport.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/broadcom/bcmsysport.c +4 -0
@@ -134,6 +134,10 @@ static int bcm_sysport_set_rx_csum(struct net_device *dev, priv->rx_chk_en = !!(wanted &NETIF_F_RXCSUM ); reg =rxchk_readl (priv,RXCHK_CONTROL ); +/* Clear L2 header checks, which would prevent BPDUs +* from being received. +*/ + reg &= ~RXCHK_L2_HDR_DIS ;if (priv->rx_chk_en) reg |=RXCHK_EN ;else
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 46/183 pinctrl: meson: meson8b: fix the sdxc_a data 1..3 pins
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c17abcfa93bf0be5e48bb011607d237ac2bfc839 ]
Fix the mismatch between the "sdxc_d13_1_a" pin group definition from meson8b_cbus_groups and the entry in sdxc_a_groups ("sdxc_d0_13_1_a"). This makes it possible to use "sdxc_d13_1_a" in device-tree files to route the MMC data 1..3 pins to GPIOX_1..3.
--- drivers/pinctrl/meson/pinctrl-meson8b.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/meson/pinctrl-meson8b.c +1 -1
@@ -668,7 +668,7 @@ static const char * const sd_a_groups[] = {static const char *const sdxc_a_groups[] = {"sdxc_d0_0_a" ,"sdxc_d13_0_a" ,"sdxc_d47_a" ,"sdxc_clk_a" , -"sdxc_cmd_a" ,"sdxc_d0_1_a" ,"sdxc_d0_13_1_a" +"sdxc_cmd_a" ,"sdxc_d0_1_a" ,"sdxc_d13_1_a" };static const char *const pcm_a_groups[] = {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 47/183 qmi_wwan: apply SET_DTR quirk to Sierra WP7607
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 97dc47a1308a3af46a09b1546cfb869f2e382a81 ]
The 1199:68C0 USB ID is reused by Sierra WP7607 which requires the DTR quirk to be detected. Apply QMI_QUIRK_SET_DTR unconditionally as already done for other IDs shared between different devices.
--- drivers/net/usb/qmi_wwan.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/usb/qmi_wwan.c +2 -2
@@ -1193,8 +1193,8 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ {QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */ - {QMI_FIXED_INTF(0x1199, 0x68c0, 8)}, /* Sierra Wireless MC7304/MC7354 */ - {QMI_FIXED_INTF(0x1199, 0x68c0, 10)}, /* Sierra Wireless MC7304/MC7354 */ + {QMI_QUIRK_SET_DTR(0x1199, 0x68c0, 8)}, /* Sierra Wireless MC7304/MC7354, WP76xx */ + {QMI_QUIRK_SET_DTR(0x1199, 0x68c0, 10)},/* Sierra Wireless MC7304/MC7354 */ {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ {QMI_FIXED_INTF(0x1199, 0x9041, 8)}, /* Sierra Wireless MC7305/MC7355 */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 48/183 net: mv643xx_eth: disable clk on error path in mv643xx_eth_shared_probe()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e928b5d6b75e239feb9c6d5488974b6646a0ebc8 ]
If mv643xx_eth_shared_of_probe() fails, mv643xx_eth_shared_probe() leaves clk enabled.
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/net/ethernet/marvell/mv643xx_eth.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/ethernet/marvell/mv643xx_eth.c +6 -1
@@ -2886,7 +2886,7 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev) ret =mv643xx_eth_shared_of_probe (pdev);if (ret) -return ret; + goto err_put_clk; pd =dev_get_platdata (&pdev->dev); msp->tx_csum_limit = (pd != NULL && pd->tx_csum_limit) ?
@@ -2894,6 +2894,11 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev)infer_hw_params (msp);return 0 ; + +err_put_clk: +if (!IS_ERR (msp->clk)) +clk_disable_unprepare (msp->clk); +return ret; }static int mv643xx_eth_shared_remove (struct platform_device *pdev)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 49/183 mailbox: bcm-flexrm-mailbox: Fix FlexRM ring flush timeout issue
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d7bf31a0f85faaf63c63c39d55154825a1eaaea9 ]
RING_CONTROL reg was not written due to wrong address, hence all the subsequent ring flush was timing out.
--- drivers/mailbox/bcm-flexrm-mailbox.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mailbox/bcm-flexrm-mailbox.c +2 -2
@@ -1381,9 +1381,9 @@ static void flexrm_shutdown(struct mbox_chan *chan)/* Clear ring flush state */ timeout =1000 ;/* timeout of 1s */ -writel_relaxed (0x0 , ring +RING_CONTROL ); +writel_relaxed (0x0 , ring->regs +RING_CONTROL ); do { - if (!(readl_relaxed(ring + RING_FLUSH_DONE) & + if (!(readl_relaxed(ring->regs + RING_FLUSH_DONE) & FLUSH_DONE_MASK)) break; mdelay(1);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 50/183 ASoC: topology: free created components in tplg load error
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 304017d31df36fb61eb2ed3ebf65fb6870b3c731 ]
Topology resources are no longer needed if any element failed to load.
--- sound/soc/soc-topology.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
sound/soc/soc-topology.c +7 -1
@@ -2513,6 +2513,7 @@ int snd_soc_tplg_component_load(struct snd_soc_component *comp, struct snd_soc_tplg_ops *ops, const struct firmware *fw, u32 id) { struct soc_tplg tplg; +int ret;/* setup parsing context */ memset (&tplg,0 ,sizeof (tplg));
@@ -2526,7 +2527,12 @@ int snd_soc_tplg_component_load(struct snd_soc_component *comp, tplg.bytes_ext_ops = ops->bytes_ext_ops; tplg.bytes_ext_ops_count = ops->bytes_ext_ops_count; -return soc_tplg_load (&tplg); + ret =soc_tplg_load (&tplg); +/* free the created components if fail to load topology */ +if (ret) +snd_soc_tplg_component_remove (comp,SND_SOC_TPLG_INDEX_ALL ); + +return ret; }EXPORT_SYMBOL_GPL (snd_soc_tplg_component_load);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 51/183 qed: Fix iWARP syn packet mac address validation.
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8be3dadf04050c2907760ec1955ca1c8fbc25585 ]
The ll2 forwards all syn packets to the driver without validating the mac address. Add validation check in the driver's iWARP listener flow and drop the packet if it isn't intended for the device.
--- drivers/net/ethernet/qlogic/qed/qed_iwarp.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/ethernet/qlogic/qed/qed_iwarp.c +9 -0
@@ -1651,6 +1651,15 @@ qed_iwarp_parse_rx_pkt(struct qed_hwfn *p_hwfn, eth_hlen =ETH_HLEN + (vlan_valid ?sizeof (u32) :0 ); +if (!ether_addr_equal (ethh->h_dest, + p_hwfn->p_rdma_info->iwarp.mac_addr)) { +DP_VERBOSE (p_hwfn, +QED_MSG_RDMA , +"Got unexpected mac %pM instead of %pM\n" , + ethh->h_dest, p_hwfn->p_rdma_info->iwarp.mac_addr); +return -EINVAL ; + } +ether_addr_copy (remote_mac_addr, ethh->h_source);ether_addr_copy (local_mac_addr, ethh->h_dest);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 52/183 arm64: Relax GIC version check during early boot
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 74698f6971f25d045301139413578865fc2bd8f9 ]
Updates to the GIC architecture allow ID_AA64PFR0_EL1.GIC to have values other than 0 or 1. At the moment, Linux is quite strict in the way it handles this field at early boot stage (cpufeature is fine) and will refuse to use the system register CPU interface if it doesn't find the value 1.
--- arch/arm64/kernel/head.S | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/arm64/kernel/head.S +1 -2
@@ -442,8 +442,7 @@ set_hcr: /* GICv3 system register access */ mrs x0, id_aa64pfr0_el1 ubfx x0, x0, #24, #4 - cmp x0, #1 - b.ne 3f + cbz x0, 3f mrs_s x0, SYS_ICC_SRE_EL2 orr x0, x0, #ICC_SRE_EL2_SRE // Set ICC_SRE_EL2.SRE==1
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 53/183 net: marvell: mvneta: fix DMA debug warning
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a8fef9ba58c9966ddb1fec916d8d8137c9d8bc89 ]
Booting 4.20 on SolidRun Clearfog issues this warning with DMA API debug enabled:
WARNING: CPU: 0 PID: 555 at kernel/dma/debug.c:1230 check_sync+0x514/0x5bc mvneta f1070000.ethernet: DMA-API: device driver tries to sync DMA memory it has not allocated [device address=0x000000002dd7dc00] [size=240 bytes] Modules linked in: ahci mv88e6xxx dsa_core xhci_plat_hcd xhci_hcd devlink armada_thermal marvell_cesa des_generic ehci_orion phy_armada38x_comphy mcp3021 spi_orion evbug sfp mdio_i2c ip_tables x_tables CPU: 0 PID: 555 Comm: bridge-network- Not tainted 4.20.0+ #291 Hardware name: Marvell Armada 380/385 (Device Tree) [<c0019638>] (unwind_backtrace) from [<c0014888>] (show_stack+0x10/0x14) [<c0014888>] (show_stack) from [<c07f54e0>] (dump_stack+0x9c/0xd4) [<c07f54e0>] (dump_stack) from [<c00312bc>] (__warn+0xf8/0x124) [<c00312bc>] (__warn) from [<c00313b0>] (warn_slowpath_fmt+0x38/0x48) [<c00313b0>] (warn_slowpath_fmt) from [<c00b0370>] (check_sync+0x514/0x5bc) [<c00b0370>] (check_sync) from [<c00b04f8>] (debug_dma_sync_single_range_for_cpu+0x6c/0x74) [<c00b04f8>] (debug_dma_sync_single_range_for_cpu) from [<c051bd14>] (mvneta_poll+0x298/0xf58) [<c051bd14>] (mvneta_poll) from [<c0656194>] (net_rx_action+0x128/0x424) [<c0656194>] (net_rx_action) from [<c000a230>] (__do_softirq+0xf0/0x540) [<c000a230>] (__do_softirq) from [<c00386e0>] (irq_exit+0x124/0x144) [<c00386e0>] (irq_exit) from [<c009b5e0>] (__handle_domain_irq+0x58/0xb0) [<c009b5e0>] (__handle_domain_irq) from [<c03a63c4>] (gic_handle_irq+0x48/0x98) [<c03a63c4>] (gic_handle_irq) from [<c0009a10>] (__irq_svc+0x70/0x98)
...
This appears to be caused by mvneta_rx_hwbm() calling dma_sync_single_range_for_cpu() with the wrong struct device pointer, as the buffer manager device pointer is used to map and unmap the buffer. Fix this.
--- drivers/net/ethernet/marvell/mvneta.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/marvell/mvneta.c +1 -1
@@ -2102,7 +2102,7 @@ err_drop_frame:if (unlikely (!skb)) goto err_drop_frame_ret_pool; - dma_sync_single_range_for_cpu(dev->dev.parent, + dma_sync_single_range_for_cpu(&pp->bm_priv->pdev->dev, rx_desc->buf_phys_addr, MVNETA_MH_SIZE + NET_SKB_PAD, rx_bytes,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 54/183 tmpfs: fix link accounting when a tmpfile is linked in
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 1062af920c07f5b54cf5060fde3339da6df0cf6b ]
tmpfs has a peculiarity of accounting hard links as if they were separate inodes: so that when the number of inodes is limited, as it is by default, a user cannot soak up an unlimited amount of unreclaimable dcache memory just by repeatedly linking a file.
But when v3.11 added O_TMPFILE, and the ability to use linkat() on the fd, we missed accommodating this new case in tmpfs: "df -i" shows that an extra "inode" remains accounted after the file is unlinked and the fd closed and the actual inode evicted. If a user repeatedly links tmpfiles into a tmpfs, the limit will be hit (ENOSPC) even after they are deleted.
Just skip the extra reservation from shmem_link() in this case: there's a sense in which this first link of a tmpfile is then cheaper than a hard link of another file, but the accounting works out, and there's still good limiting, so no need to do anything more complicated.
--- mm/shmem.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
mm/shmem.c +7 -3
@@ -3102,10 +3102,14 @@ static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct dentr* No ordinary (disk based) filesystem counts links as inodes; * but each new link needs a new dentry, pinning lowmem, and * tmpfs dentries cannot be pruned until they are unlinked. +* But if an O_TMPFILE file is linked into the tmpfs, the +* first link must skip that, to get the accounting right. */ - ret =shmem_reserve_inode (inode->i_sb); -if (ret) - goto out; +if (inode->i_nlink) { + ret =shmem_reserve_inode (inode->i_sb); +if (ret) + goto out; + } dir->i_size +=BOGO_DIRENT_SIZE ; inode->i_ctime = dir->i_ctime = dir->i_mtime =current_time (inode);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 55/183 ixgbe: fix older devices that do not support IXGBE_MRQC_L3L4TXSWEN
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 156a67a9065e3339be85f811d1b13b920e50d73b ]
The enabling L3/L4 filtering for transmit switched packets for all devices caused unforeseen issue on older devices when trying to send UDP traffic in an ordered sequence. This bit was originally intended for X550 devices, which supported this feature, so limit the scope of this bit to only X550 devices.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +5 -2
@@ -3827,8 +3827,11 @@ static void ixgbe_setup_mrqc(struct ixgbe_adapter *adapter)else mrqc =IXGBE_MRQC_VMDQRSS64EN ; -/* Enable L3/L4 for Tx Switched packets */ - mrqc |=IXGBE_MRQC_L3L4TXSWEN ; +/* Enable L3/L4 for Tx Switched packets only for X550, +* older devices do not support this feature +*/ +if (hw->mac.type >= ixgbe_mac_X550) + mrqc |=IXGBE_MRQC_L3L4TXSWEN ; }else {if (tcs >4 ) mrqc =IXGBE_MRQC_RTRSS8TCEN ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 56/183 ARCv2: lib: memcpy: fix doing prefetchw outside of buffer
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit f8a15f97664178f27dfbf86a38f780a532cb6df0 ]
ARCv2 optimized memcpy uses PREFETCHW instruction for prefetching the next cache line but doesn't ensure that the line is not past the end of the buffer. PRETECHW changes the line ownership and marks it dirty, which can cause data corruption if this area is used for DMA IO.
Fix the issue by avoiding the PREFETCHW. This leads to performance degradation but it is OK as we'll introduce new memcpy implementation optimized for unaligned memory access using.
We also cut off all PREFETCH instructions at they are quite useless here:
* we call PREFETCH right before LOAD instruction call.
* we copy 16 or 32 bytes of data (depending on CONFIG_ARC_HAS_LL64) in a main logical loop. so we call PREFETCH 4 times (or 2 times) for each L1 cache line (in case of 64B L1 cache Line which is default case). Obviously this is not optimal.
--- arch/arc/lib/memcpy-archs.S | 14 -------------- 1 file changed, 14 deletions(-)
arch/arc/lib/memcpy-archs.S +0 -14
@@ -25,15 +25,11 @@ #endif #ifdef CONFIG_ARC_HAS_LL64 -# define PREFETCH_READ(RX) prefetch [RX, 56] -# define PREFETCH_WRITE(RX) prefetchw [RX, 64] # define LOADX(DST,RX) ldd.ab DST, [RX, 8] # define STOREX(SRC,RX) std.ab SRC, [RX, 8] # define ZOLSHFT 5 # define ZOLAND 0x1F #else -# define PREFETCH_READ(RX) prefetch [RX, 28] -# define PREFETCH_WRITE(RX) prefetchw [RX, 32] # define LOADX(DST,RX) ld.ab DST, [RX, 4] # define STOREX(SRC,RX) st.ab SRC, [RX, 4] # define ZOLSHFT 4
@@ -41,8 +37,6 @@ #endif ENTRY_CFI(memcpy) - prefetch [r1] ; Prefetch the read location - prefetchw [r0] ; Prefetch the write location mov.f 0, r2 ;;; if size is zero jz.d [blink]
@@ -72,8 +66,6 @@ ENTRY_CFI(memcpy) lpnz @.Lcopy32_64bytes ;; LOOP START LOADX (r6, r1) - PREFETCH_READ (r1) - PREFETCH_WRITE (r3) LOADX (r8, r1) LOADX (r10, r1) LOADX (r4, r1)
@@ -117,9 +109,7 @@ ENTRY_CFI(memcpy) lpnz @.Lcopy8bytes_1 ;; LOOP START ld.ab r6, [r1, 4] - prefetch [r1, 28] ;Prefetch the next read location ld.ab r8, [r1,4] - prefetchw [r3, 32] ;Prefetch the next write location SHIFT_1 (r7, r6, 24) or r7, r7, r5
@@ -162,9 +152,7 @@ ENTRY_CFI(memcpy) lpnz @.Lcopy8bytes_2 ;; LOOP START ld.ab r6, [r1, 4] - prefetch [r1, 28] ;Prefetch the next read location ld.ab r8, [r1,4] - prefetchw [r3, 32] ;Prefetch the next write location SHIFT_1 (r7, r6, 16) or r7, r7, r5
@@ -204,9 +192,7 @@ ENTRY_CFI(memcpy) lpnz @.Lcopy8bytes_3 ;; LOOP START ld.ab r6, [r1, 4] - prefetch [r1, 28] ;Prefetch the next read location ld.ab r8, [r1,4] - prefetchw [r3, 32] ;Prefetch the next write location SHIFT_1 (r7, r6, 8) or r7, r7, r5
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 57/183 ARC: uacces: remove lp_start, lp_end from clobber list
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d5e3c55e01d8b1774b37b4647c30fb22f1d39077 ]
Newer ARC gcc handles lp_start, lp_end in a different way and doesn't like them in the clobber list.
--- arch/arc/include/asm/uaccess.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/arc/include/asm/uaccess.h +4 -4
@@ -207,7 +207,7 @@ raw_copy_from_user(void *to, const void __user *from, unsigned long n)*/ "=&r" (tmp), "+r" (to), "+r" (from) : - : "lp_count", "lp_start", "lp_end", "memory"); + : "lp_count", "memory"); return n; }
@@ -433,7 +433,7 @@ raw_copy_to_user(void __user *to, const void *from, unsigned long n)*/ "=&r" (tmp), "+r" (to), "+r" (from) : - : "lp_count", "lp_start", "lp_end", "memory"); + : "lp_count", "memory"); return n; }
@@ -653,7 +653,7 @@ static inline unsigned long __arc_clear_user(void __user *to, unsigned long n)" .previous \n" : "+r"(d_char), "+r"(res) : "i"(0) - : "lp_count", "lp_start", "lp_end", "memory"); + : "lp_count", "memory"); return res; }
@@ -686,7 +686,7 @@ __arc_strncpy_from_user(char *dst, const char __user *src, long count) " .previous \n" : "+r"(res), "+r"(dst), "+r"(src), "=r"(val) : "g"(-EFAULT), "r"(count) - : "lp_count", "lp_start", "lp_end", "memory"); + : "lp_count", "memory");return res; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 58/183 ARCv2: support manual regfile save on interrupts
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e494239a007e601448110ac304fe055951f9de3b ]
There's a hardware bug which affects the HSDK platform, triggered by micro-ops for auto-saving regfile on taken interrupt. The workaround is to inhibit autosave.
--- arch/arc/Kconfig | 8 +++++ arch/arc/include/asm/entry-arcv2.h | 54 ++++++++++++++++++++++++++++++ arch/arc/kernel/entry-arcv2.S | 4 ++- arch/arc/kernel/intc-arcv2.c | 2 ++ arch/arc/plat-hsdk/Kconfig | 1 + 5 files changed, 68 insertions(+), 1 deletion(-)
arch/arc/Kconfig +8 -0
@@ -417,6 +417,14 @@ config ARC_HAS_ACCL_REGS (also referred to as r58:r59). These can also be used by gcc as GPR so kernel needs to save/restore per process +config ARC_IRQ_NO_AUTOSAVE + bool "Disable hardware autosave regfile on interrupts" + default n + help + On HS cores, taken interrupt auto saves the regfile on stack. + This is programmable and can be optionally disabled in which case + software INTERRUPT_PROLOGUE/EPILGUE do the needed work + endif # ISA_ARCV2 endmenu # "ARC CPU Configuration"
arch/arc/include/asm/entry-arcv2.h +54 -0
66 lines not on this page · raw message
arch/arc/kernel/entry-arcv2.S +3 -1
@@ -209,7 +209,9 @@ restore_regs: ;####### Return from Intr ####### debug_marker_l1: - bbit1.nt r0, STATUS_DE_BIT, .Lintr_ret_to_delay_slot + ; bbit1.nt r0, STATUS_DE_BIT, .Lintr_ret_to_delay_slot + btst r0, STATUS_DE_BIT ; Z flag set if bit clear + bnz .Lintr_ret_to_delay_slot ; branch if STATUS_DE_BIT set .Lisr_ret_fast_path: ; Handle special case #1: (Entry via Exception, Return via IRQ)
arch/arc/kernel/intc-arcv2.c +2 -0
@@ -49,11 +49,13 @@ void arc_init_IRQ(void) *(unsigned int *)&ictrl =0 ; +#ifndef CONFIG_ARC_IRQ_NO_AUTOSAVE ictrl.save_nr_gpr_pairs =6 ;/* r0 to r11 (r12 saved manually) */ ictrl.save_blink =1 ; ictrl.save_lp_regs =1 ;/* LP_COUNT, LP_START, LP_END */ ictrl.save_u_to_u =0 ;/* user ctxt saved on kernel stack */ ictrl.save_idx_regs =1 ;/* JLI, LDI, EI */ +#endif WRITE_AUX (AUX_IRQ_CTRL , ictrl);
arch/arc/plat-hsdk/Kconfig +1 -0
@@ -9,5 +9,6 @@ menuconfig ARC_SOC_HSDK bool "ARC HS Development Kit SOC" depends on ISA_ARCV2 select ARC_HAS_ACCL_REGS + select ARC_IRQ_NO_AUTOSAVE select CLK_HSDK select RESET_HSDK
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 59/183 phonet: fix building with clang
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6321aa197547da397753757bd84c6ce64b3e3d89 ]
clang warns about overflowing the data[] member in the struct pnpipehdr:
net/phonet/pep.c:295:8: warning: array index 4 is past the end of the array (which contains 1 element) [-Warray-bounds]
if (hdr->data[4] == PEP_IND_READY)
^ ~
include/net/phonet/pep.h:66:3: note: array 'data' declared here
u8 data[1];Using a flexible array member at the end of the struct avoids the warning, but since we cannot have a flexible array member inside of the union, each index now has to be moved back by one, which makes it a little uglier.
--- include/net/phonet/pep.h | 5 +++-- net/phonet/pep.c | 32 ++++++++++++++++---------------- 2 files changed, 19 insertions(+), 18 deletions(-)
include/net/phonet/pep.h +3 -2
@@ -63,10 +63,11 @@ struct pnpipehdr {u8 state_after_reset;/* reset request */ u8 error_code;/* any response */ u8 pep_type;/* status indication */ -u8 data[1 ]; +u8 data0;/* anything else */ }; +u8 data[]; }; -#define other_pep_type data[1] +#define other_pep_type data[0]static inline struct pnpipehdr *pnp_hdr (struct sk_buff *skb) {
net/phonet/pep.c +16 -16
@@ -132,7 +132,7 @@ static int pep_indicate(struct sock *sk, u8 id, u8 code, ph->utid =0 ; ph->message_id = id; ph->pipe_handle = pn->pipe_handle; - ph->data[0 ] = code; + ph->error_code = code;return pn_skb_send (sk, skb,NULL ); }
@@ -153,7 +153,7 @@ static int pipe_handler_request(struct sock *sk, u8 id, u8 code, ph->utid = id;/* whatever */ ph->message_id = id; ph->pipe_handle = pn->pipe_handle; - ph->data[0 ] = code; + ph->error_code = code;return pn_skb_send (sk, skb,NULL ); }
@@ -208,7 +208,7 @@ static int pep_ctrlreq_error(struct sock *sk, struct sk_buff *oskb, u8 code,struct pnpipehdr *ph;struct sockaddr_pn dst;u8 data[4 ] = { - oph->data[0 ],/* PEP type */ + oph->pep_type,/* PEP type */ code,/* error code, at an unusual offset */ PAD ,PAD , };
@@ -221,7 +221,7 @@ static int pep_ctrlreq_error(struct sock *sk, struct sk_buff *oskb, u8 code, ph->utid = oph->utid; ph->message_id =PNS_PEP_CTRL_RESP ; ph->pipe_handle = oph->pipe_handle; - ph->data[0 ] = oph->data[1 ];/* CTRL id */ + ph->data0 = oph->data[0 ];/* CTRL id */ pn_skb_get_src_sockaddr (oskb, &dst);return pn_skb_send (sk, skb, &dst);
@@ -272,17 +272,17 @@ static int pipe_rcv_status(struct sock *sk, struct sk_buff *skb)return -EINVAL ; hdr =pnp_hdr (skb); -if (hdr->data[0 ] !=PN_PEP_TYPE_COMMON ) { +if (hdr->pep_type !=PN_PEP_TYPE_COMMON ) {net_dbg_ratelimited ("Phonet unknown PEP type: %u\n" , - (unsigned int )hdr->data[0 ]); + (unsigned int )hdr->pep_type);return -EOPNOTSUPP ; } -switch (hdr->data[1 ]) { +switch (hdr->data[0 ]) {case PN_PEP_IND_FLOW_CONTROL :switch (pn->tx_fc) {case PN_LEGACY_FLOW_CONTROL : -switch (hdr->data[4 ]) { +switch (hdr->data[3 ]) {case PEP_IND_BUSY :atomic_set (&pn->tx_credits,0 );break ;
@@ -292,7 +292,7 @@ static int pipe_rcv_status(struct sock *sk, struct sk_buff *skb) }break ;case PN_ONE_CREDIT_FLOW_CONTROL : -if (hdr->data[4 ] ==PEP_IND_READY ) +if (hdr->data[3 ] ==PEP_IND_READY )atomic_set (&pn->tx_credits, wake =1 );break ; }
@@ -301,12 +301,12 @@ static int pipe_rcv_status(struct sock *sk, struct sk_buff *skb)case PN_PEP_IND_ID_MCFC_GRANT_CREDITS :if (pn->tx_fc !=PN_MULTI_CREDIT_FLOW_CONTROL )break ; -atomic_add (wake = hdr->data[4 ], &pn->tx_credits); +atomic_add (wake = hdr->data[3 ], &pn->tx_credits);break ;default :net_dbg_ratelimited ("Phonet unknown PEP indication: %u\n" , - (unsigned int )hdr->data[1 ]); + (unsigned int )hdr->data[0 ]);return -EOPNOTSUPP ; }if (wake)
@@ -318,7 +318,7 @@ static int pipe_rcv_created(struct sock *sk, struct sk_buff *skb) {struct pep_sock *pn =pep_sk (sk);struct pnpipehdr *hdr =pnp_hdr (skb); -u8 n_sb = hdr->data[0 ]; +u8 n_sb = hdr->data0; pn->rx_fc = pn->tx_fc =PN_LEGACY_FLOW_CONTROL ;__skb_pull (skb,sizeof (*hdr));
@@ -506,7 +506,7 @@ static int pep_connresp_rcv(struct sock *sk, struct sk_buff *skb)return -ECONNREFUSED ;/* Parse sub-blocks */ - n_sb = hdr->data[4 ]; + n_sb = hdr->data[3 ];while (n_sb >0 ) {u8 type, buf[6 ], len =sizeof (buf);const u8 *data =pep_get_sb (skb, &type, &len, buf);
@@ -739,7 +739,7 @@ static int pipe_do_remove(struct sock *sk) ph->utid =0 ; ph->message_id =PNS_PIPE_REMOVE_REQ ; ph->pipe_handle = pn->pipe_handle; - ph->data[0 ] =PAD ; + ph->data0 =PAD ;return pn_skb_send (sk, skb,NULL ); }
@@ -817,7 +817,7 @@ static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp, peer_type = hdr->other_pep_type <<8 ;/* Parse sub-blocks (options) */ - n_sb = hdr->data[4 ]; + n_sb = hdr->data[3 ];while (n_sb >0 ) {u8 type, buf[1 ], len =sizeof (buf);const u8 *data =pep_get_sb (skb, &type, &len, buf);
@@ -1109,7 +1109,7 @@ static int pipe_skb_send(struct sock *sk, struct sk_buff *skb) ph->utid =0 ;if (pn->aligned) { ph->message_id =PNS_PIPE_ALIGNED_DATA ; - ph->data[0 ] =0 ;/* padding */ + ph->data0 =0 ;/* padding */ }else ph->message_id =PNS_PIPE_DATA ; ph->pipe_handle = pn->pipe_handle;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 60/183 mac80211_hwsim: propagate genlmsg_reply return code
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 17407715240456448e4989bee46ffc93991add83 ]
genlmsg_reply can fail, so propagate its return code
--- drivers/net/wireless/mac80211_hwsim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mac80211_hwsim.c +1 -1
@@ -3241,7 +3241,7 @@ static int hwsim_get_radio_nl(struct sk_buff *msg, struct genl_info *info) goto out_err; } -genlmsg_reply (skb, info); + res =genlmsg_reply (skb, info);break ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 61/183 net: thunderx: make CFG_DONE message to run through generic send-ack sequence
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0dd563b9a62c4cbabf5d4fd6596440c2491e72b1 ]
At the end of NIC VF initialization VF sends CFG_DONE message to PF without using nicvf_msg_send_to_pf routine. This potentially could re-write data in mailbox. This commit is to implement common way of sending CFG_DONE message by the same way with other configuration messages by using nicvf_send_msg_to_pf() routine.
--- drivers/net/ethernet/cavium/thunder/nic_main.c | 2 +- drivers/net/ethernet/cavium/thunder/nicvf_main.c | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-)
drivers/net/ethernet/cavium/thunder/nic_main.c +1 -1
@@ -1030,7 +1030,7 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)case NIC_MBOX_MSG_CFG_DONE :/* Last message of VF config msg sequence */ nic_enable_vf (nic, vf, true); - goto unlock; +break ;case NIC_MBOX_MSG_SHUTDOWN :/* First msg in VF teardown sequence */ if (vf >= nic->num_vf_en)
drivers/net/ethernet/cavium/thunder/nicvf_main.c +12 -3
@@ -166,6 +166,17 @@ static int nicvf_check_pf_ready(struct nicvf *nic)return 1 ; } +static void nicvf_send_cfg_done (struct nicvf *nic) +{ +union nic_mbx mbx = {}; + + mbx.msg.msg =NIC_MBOX_MSG_CFG_DONE ; +if (nicvf_send_msg_to_pf (nic, &mbx)) { +netdev_err (nic->netdev, +"PF didn't respond to CFG DONE msg\n" ); + } +} +static void nicvf_read_bgx_stats (struct nicvf *nic,struct bgx_stats_msg *bgx) {if (bgx->rx)
@@ -1329,7 +1340,6 @@ int nicvf_open(struct net_device *netdev)struct nicvf *nic =netdev_priv (netdev);struct queue_set *qs = nic->qs;struct nicvf_cq_poll *cq_poll =NULL ; -union nic_mbx mbx = {};netif_carrier_off (netdev);
@@ -1419,8 +1429,7 @@ int nicvf_open(struct net_device *netdev)nicvf_enable_intr (nic,NICVF_INTR_RBDR , qidx);/* Send VF config done msg to PF */ - mbx.msg.msg =NIC_MBOX_MSG_CFG_DONE ; -nicvf_write_to_mbx (nic, &mbx); +nicvf_send_cfg_done (nic);return 0 ; cleanup:
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 62/183 nfp: bpf: fix code-gen bug on BPF_ALU | BPF_XOR | BPF_K
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 71c190249f0ced5b26377ea6bf829ab3af77a40c ]
The intended optimization should be A ^ 0 = A, not A ^ -1 = A.
--- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/netronome/nfp/bpf/jit.c +1 -1
@@ -1017,7 +1017,7 @@ static int xor_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)static int xor_imm (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta) { -return wrp_alu32_imm (nfp_prog, meta,ALU_OP_XOR , !~meta->insn.imm); +return wrp_alu32_imm (nfp_prog, meta,ALU_OP_XOR , !meta->insn.imm); }static int and_reg (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 63/183 nfp: bpf: fix ALU32 high bits clearance bug
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit f036ebd9bfbe1e91a3d855e85e05fc5ff156b641 ]
NFP BPF JIT compiler is doing a couple of small optimizations when jitting ALU imm instructions, some of these optimizations could save code-gen, for example:
A & -1 = A A | 0 = A A ^ 0 = A
However, for ALU32, high 32-bit of the 64-bit register should still be cleared according to ISA semantics.
--- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)
drivers/net/ethernet/netronome/nfp/bpf/jit.c +6 -11
@@ -756,15 +756,10 @@ wrp_alu64_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,static int wrp_alu32_imm (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta, -enum alu_op alu_op,bool skip) +enum alu_op alu_op) {const struct bpf_insn *insn = &meta->insn; -if (skip) { - meta->skip = true; -return 0 ; - } -wrp_alu_imm (nfp_prog, insn->dst_reg *2 , alu_op, insn->imm);wrp_immed (nfp_prog,reg_both (insn->dst_reg *2 +1 ),0 );
@@ -1017,7 +1012,7 @@ static int xor_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)static int xor_imm (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta) { -return wrp_alu32_imm (nfp_prog, meta,ALU_OP_XOR , !meta->insn.imm); +return wrp_alu32_imm (nfp_prog, meta,ALU_OP_XOR ); }static int and_reg (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta)
@@ -1027,7 +1022,7 @@ static int and_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)static int and_imm (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta) { -return wrp_alu32_imm (nfp_prog, meta,ALU_OP_AND , !~meta->insn.imm); +return wrp_alu32_imm (nfp_prog, meta,ALU_OP_AND ); }static int or_reg (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta)
@@ -1037,7 +1032,7 @@ static int or_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)static int or_imm (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta) { -return wrp_alu32_imm (nfp_prog, meta,ALU_OP_OR , !meta->insn.imm); +return wrp_alu32_imm (nfp_prog, meta,ALU_OP_OR ); }static int add_reg (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta)
@@ -1047,7 +1042,7 @@ static int add_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)static int add_imm (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta) { -return wrp_alu32_imm (nfp_prog, meta,ALU_OP_ADD , !meta->insn.imm); +return wrp_alu32_imm (nfp_prog, meta,ALU_OP_ADD ); }static int sub_reg (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta)
@@ -1057,7 +1052,7 @@ static int sub_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)static int sub_imm (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta) { -return wrp_alu32_imm (nfp_prog, meta,ALU_OP_SUB , !meta->insn.imm); +return wrp_alu32_imm (nfp_prog, meta,ALU_OP_SUB ); }static int shl_imm (struct nfp_prog *nfp_prog,struct nfp_insn_meta *meta)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 64/183 net: set static variable an initial value in atl2_probe()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4593403fa516a5a4cffe6883c5062d60932cbfbe ]
cards_found is a static variable, but when it enters atl2_probe(), cards_found is set to zero, the value is not consistent with last probe, so next behavior is not our expect.
--- drivers/net/ethernet/atheros/atlx/atl2.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/ethernet/atheros/atlx/atl2.c +1 -3
@@ -1334,13 +1334,11 @@ static int atl2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) {struct net_device *netdev;struct atl2_adapter *adapter; -static int cards_found; +static int cards_found =0 ;unsigned long mmio_start;int mmio_len;int err; - cards_found =0 ; - err =pci_enable_device (pdev);if (err)return err;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 65/183 tmpfs: fix uninitialized return value in shmem_link
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 29b00e609960ae0fcff382f4c7079dd0874a5311 ]
When we made the shmem_reserve_inode call in shmem_link conditional, we forgot to update the declaration for ret so that it always has a known value. Dan Carpenter pointed out this deficiency in the original patch.
--- mm/shmem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/shmem.c +1 -1
@@ -3096,7 +3096,7 @@ static int shmem_create(struct inode *dir, struct dentry *dentry, umode_t mode,static int shmem_link (struct dentry *old_dentry,struct inode *dir,struct dentry *dentry) {struct inode *inode =d_inode (old_dentry); -int ret; +int ret =0 ;/* * No ordinary (disk based) filesystem counts links as inodes;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 66/183 media: videobuf2-v4l2: drop WARN_ON in vb2_warn_zero_bytesused()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Verkuil <[email protected]>
commit 5e99456c20f712dcc13d9f6ca4278937d5367355 upstream.
Userspace shouldn't set bytesused to 0 for output buffers. vb2_warn_zero_bytesused() warns about this (only once!), but it also calls WARN_ON(1), which is confusing since it is not immediately clear that it warns about a 0 value for bytesused.
Just drop the WARN_ON as it serves no purpose.
--- drivers/media/v4l2-core/videobuf2-v4l2.c | 1 - 1 file changed, 1 deletion(-)
drivers/media/v4l2-core/videobuf2-v4l2.c +0 -1
@@ -145,7 +145,6 @@ static void vb2_warn_zero_bytesused(strureturn ; check_once = true; -WARN_ON (1 );pr_warn ("use of bytesused == 0 is deprecated and will be removed in the future,\n" );if (vb->vb2_queue->allow_zero_bytesused)
Greg Kroah-Hartman
maintainerPATCH 67/183 stm class: Prevent division by zero
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Shishkin <[email protected]>
commit bf7cbaae0831252b416f375ca9b1027ecd4642dd upstream.
Using STP_POLICY_ID_SET ioctl command with dummy_stm device, or any STM device that supplies zero mmio channel size, will trigger a division by zero bug in the kernel.
Prevent this by disallowing channel widths other than 1 for such devices.
--- drivers/hwtracing/stm/core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/hwtracing/stm/core.c +5 -3
@@ -561,7 +561,7 @@ static int stm_char_policy_set_ioctl(str {struct stm_device *stm = stmf->stm;struct stp_policy_id *id; -int ret = -EINVAL ; +int ret = -EINVAL , wlimit =1 ;u32 size;if (stmf->output.nr_chans)
@@ -589,8 +589,10 @@ static int stm_char_policy_set_ioctl(strif (id->__reserved_0 || id->__reserved_1) goto err_free; -if (id->width <1 || - id->width >PAGE_SIZE / stm->data->sw_mmiosz) +if (stm->data->sw_mmiosz) + wlimit =PAGE_SIZE / stm->data->sw_mmiosz; + +if (id->width <1 || id->width > wlimit) goto err_free; ret =stm_file_assign (stmf, id->id, id->width);
Greg Kroah-Hartman
maintainerPATCH 68/183 libnvdimm/label: Clear updating flag after label-set update
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit 966d23a006ca7b44ac8cf4d0c96b19785e0c3da0 upstream.
The UEFI 2.7 specification sets expectations that the 'updating' flag is eventually cleared. To date, the libnvdimm core has never adhered to that protocol. The policy of the core matches the policy of other multi-device info-block formats like MD-Software-RAID that expect administrator intervention on inconsistent info-blocks, not automatic invalidation.
However, some pre-boot environments may unfortunately attempt to "clean up" the labels and invalidate a set when it fails to find at least one "non-updating" label in the set. Clear the updating flag after set updates to minimize the window of vulnerability to aggressive pre-boot environments.
Ideally implementations would not write to the label area outside of creating namespaces.
Note that this only minimizes the window, it does not close it as the system can still crash while clearing the flag and the set can be subsequently deleted / invalidated by the pre-boot environment.
--- drivers/nvdimm/label.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)
drivers/nvdimm/label.c +18 -5
@@ -616,7 +616,7 @@ static const guid_t *to_abstraction_guidstatic int __pmem_label_update (struct nd_region *nd_region,struct nd_mapping *nd_mapping,struct nd_namespace_pmem *nspm, -int pos) +int pos,unsigned long flags) {struct nd_namespace_common *ndns = &nspm->nsio.common;struct nd_interleave_set *nd_set = nd_region->nd_set;
@@ -657,7 +657,7 @@ static int __pmem_label_update(struct ndmemcpy (nd_label->uuid, nspm->uuid,NSLABEL_UUID_LEN );if (nspm->alt_name)memcpy (nd_label->name, nspm->alt_name,NSLABEL_NAME_LEN ); - nd_label->flags =__cpu_to_le32 (NSLABEL_FLAG_UPDATING ); + nd_label->flags =__cpu_to_le32 (flags); nd_label->nlabel =__cpu_to_le16 (nd_region->ndr_mappings); nd_label->position =__cpu_to_le16 (pos); nd_label->isetcookie =__cpu_to_le64 (cookie);
@@ -1111,13 +1111,13 @@ static int del_labels(struct nd_mappingint nd_pmem_namespace_label_update (struct nd_region *nd_region,struct nd_namespace_pmem *nspm,resource_size_t size) { -int i; +int i, rc;for (i =0 ; i < nd_region->ndr_mappings; i++) {struct nd_mapping *nd_mapping = &nd_region->mapping[i];struct nvdimm_drvdata *ndd =to_ndd (nd_mapping);struct resource *res; -int rc, count =0 ; +int count =0 ;if (size ==0 ) { rc =del_labels (nd_mapping, nspm->uuid);
@@ -1135,7 +1135,20 @@ int nd_pmem_namespace_label_update(strucif (rc <0 )return rc; - rc =__pmem_label_update (nd_region, nd_mapping, nspm, i); + rc =__pmem_label_update (nd_region, nd_mapping, nspm, i, +NSLABEL_FLAG_UPDATING ); +if (rc) +return rc; + } + +if (size ==0 ) +return 0 ; + +/* Clear the UPDATING flag per UEFI 2.7 expectations */ +for (i =0 ; i < nd_region->ndr_mappings; i++) { +struct nd_mapping *nd_mapping = &nd_region->mapping[i]; + + rc =__pmem_label_update (nd_region, nd_mapping, nspm, i,0 );if (rc)return rc; }
Greg Kroah-Hartman
maintainerPATCH 69/183 libnvdimm, pfn: Fix over-trim in trim_pfn_device()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yang <[email protected]>
commit f101ada7da6551127d192c2f1742c1e9e0f62799 upstream.
When trying to see whether current nd_region intersects with others, trim_pfn_device() has already calculated the *size* to be expanded to SECTION size.
Do not double append 'adjust' to 'size' when calculating whether the end of a region collides with the next pmem region.
--- drivers/nvdimm/pfn_devs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvdimm/pfn_devs.c +1 -1
@@ -618,7 +618,7 @@ static void trim_pfn_device(struct nd_pfif (region_intersects (start, size,IORESOURCE_SYSTEM_RAM ,IORES_DESC_NONE ) ==REGION_MIXED || !IS_ALIGNED (end, nd_pfn->align) - ||nd_region_conflict (nd_region, start, size + adjust)) + ||nd_region_conflict (nd_region, start, size)) *end_trunc = end -phys_pmem_align_down (nd_pfn, end); }
Greg Kroah-Hartman
maintainerPATCH 70/183 libnvdimm/pmem: Honor force_raw for legacy pmem regions
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit fa7d2e639cd90442d868dfc6ca1d4cc9d8bf206e upstream.
For recovery, where non-dax access is needed to a given physical address range, and testing, allow the 'force_raw' attribute to override the default establishment of a dev_pagemap.
Otherwise without this capability it is possible to end up with a namespace that can not be activated due to corrupted info-block, and one that can not be repaired due to a section collision.
--- drivers/nvdimm/namespace_devs.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/nvdimm/namespace_devs.c +4 -0
@@ -138,6 +138,7 @@ bool nd_is_uuid_unique(struct device *debool pmem_should_map_pages (struct device *dev) {struct nd_region *nd_region =to_nd_region (dev->parent); +struct nd_namespace_common *ndns =to_ndns (dev);struct nd_namespace_io *nsio;if (!IS_ENABLED (CONFIG_ZONE_DEVICE ))
@@ -149,6 +150,9 @@ bool pmem_should_map_pages(struct deviceif (is_nd_pfn (dev) ||is_nd_btt (dev))return false; +if (ndns->force_raw) +return false; + nsio =to_nd_namespace_io (dev); if (region_intersects(nsio->res.start, resource_size(&nsio->res), IORESOURCE_SYSTEM_RAM,
Greg Kroah-Hartman
maintainerPATCH 71/183 libnvdimm: Fix altmap reservation size calculation
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver O'Halloran <[email protected]>
commit 07464e88365e9236febaca9ed1a2e2006d8bc952 upstream.
Libnvdimm reserves the first 8K of pfn and devicedax namespaces to store a superblock describing the namespace. This 8K reservation is contained within the altmap area which the kernel uses for the vmemmap backing for the pages within the namespace. The altmap allows for some pages at the start of the altmap area to be reserved and that mechanism is used to protect the superblock from being re-used as vmemmap backing.
The number of PFNs to reserve is calculated using:
PHYS_PFN(SZ_8K)
Which is implemented as:
#define PHYS_PFN(x) ((unsigned long)((x) >> PAGE_SHIFT))
So on systems where PAGE_SIZE is greater than 8K the reservation size is truncated to zero and the superblock area is re-used as vmemmap backing. As a result all the namespace information stored in the superblock (i.e. if it's a PFN or DAX namespace) is lost and the namespace needs to be re-created to get access to the contents.
This patch fixes this by using PFN_UP() rather than PHYS_PFN() to ensure that at least one page is reserved. On systems with a 4K pages size this patch should have no effect.
--- drivers/nvdimm/pfn_devs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvdimm/pfn_devs.c +1 -1
@@ -535,7 +535,7 @@ static unsigned long init_altmap_base(restatic unsigned long init_altmap_reserve (resource_size_t base) { -unsigned long reserve =PHYS_PFN (SZ_8K ); +unsigned long reserve =PFN_UP (SZ_8K );unsigned long base_pfn =PHYS_PFN (base); reserve += base_pfn -PFN_SECTION_ALIGN_DOWN (base_pfn);
Greg Kroah-Hartman
maintainerPATCH 72/183 fix cgroup_do_mount() handling of failure exits
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 399504e21a10be16dd1408ba0147367d9d82a10c upstream.
same story as with last May fixes in sysfs (7b745a4e4051 "unfuck sysfs_mount()"); new_sb is left uninitialized in case of early errors in kernfs_mount_ns() and papering over it by treating any error from kernfs_mount_ns() as equivalent to !new_ns ends up conflating the cases when objects had never been transferred to a superblock with ones when that has happened and resulting new superblock had been dropped. Easily fixed (same way as in sysfs case). Additionally, there's a superblock leak on kernfs_node_dentry() failure *and* a dentry leak inside kernfs_node_dentry() itself - the latter on probably impossible errors, but the former not impossible to trigger (as the matter of fact, injecting allocation failures at that point *does* trigger it).
--- fs/kernfs/mount.c | 8 ++++++-- kernel/cgroup/cgroup.c | 9 ++++++--- 2 files changed, 12 insertions(+), 5 deletions(-)
fs/kernfs/mount.c +6 -2
@@ -196,8 +196,10 @@ struct dentry *kernfs_node_dentry(structreturn dentry; knparent =find_next_ancestor (kn,NULL ); -if (WARN_ON (!knparent)) +if (WARN_ON (!knparent)) { +dput (dentry);return ERR_PTR (-EINVAL ); + } do { struct dentry *dtmp;
@@ -206,8 +208,10 @@ struct dentry *kernfs_node_dentry(structif (kn == knparent)return dentry; kntmp =find_next_ancestor (kn, knparent); -if (WARN_ON (!kntmp)) +if (WARN_ON (!kntmp)) { +dput (dentry);return ERR_PTR (-EINVAL ); + } dtmp =lookup_one_len_unlocked (kntmp->name, dentry,strlen (kntmp->name));dput (dentry);
kernel/cgroup/cgroup.c +6 -3
@@ -1942,7 +1942,7 @@ struct dentry *cgroup_do_mount(struct fi struct cgroup_namespace *ns) {struct dentry *dentry; -bool new_sb; +bool new_sb = false; dentry =kernfs_mount (fs_type, flags, root->kf_root, magic, &new_sb);
@@ -1952,6 +1952,7 @@ struct dentry *cgroup_do_mount(struct fi*/ if (!IS_ERR (dentry) && ns != &init_cgroup_ns) {struct dentry *nsdentry; +struct super_block *sb = dentry->d_sb;struct cgroup *cgrp;mutex_lock (&cgroup_mutex);
@@ -1962,12 +1963,14 @@ struct dentry *cgroup_do_mount(struct fispin_unlock_irq (&css_set_lock);mutex_unlock (&cgroup_mutex); - nsdentry =kernfs_node_dentry (cgrp->kn, dentry->d_sb); + nsdentry =kernfs_node_dentry (cgrp->kn, sb);dput (dentry); +if (IS_ERR (nsdentry)) +deactivate_locked_super (sb); dentry = nsdentry; } -if (IS_ERR (dentry) || !new_sb) +if (!new_sb)cgroup_put (&root->cgrp);return dentry;
Greg Kroah-Hartman
maintainerPATCH 73/183 crypto: arm/crct10dif - revert to C code for short inputs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit 62fecf295e3c48be1b5f17c440b93875b9adb4d6 upstream.
The SIMD routine ported from x86 used to have a special code path for inputs < 16 bytes, which got lost somewhere along the way. Instead, the current glue code aligns the input pointer to permit the NEON routine to use special versions of the vld1 instructions that assume 16 byte alignment, but this could result in inputs of less than 16 bytes to be passed in. This not only fails the new extended tests that Eric has implemented, it also results in the code reading past the end of the input, which could potentially result in crashes when dealing with less than 16 bytes of input at the end of a page which is followed by an unmapped page.
So update the glue code to only invoke the NEON routine if the input is at least 16 bytes.
--- arch/arm/crypto/crct10dif-ce-core.S | 14 +++++++------- arch/arm/crypto/crct10dif-ce-glue.c | 23 ++++++----------------- 2 files changed, 13 insertions(+), 24 deletions(-)
arch/arm/crypto/crct10dif-ce-core.S +7 -7
@@ -124,10 +124,10 @@ ENTRY(crc_t10dif_pmull) vext.8 q10, qzr, q0, #4 // receive the initial 64B data, xor the initial crc value - vld1.64 {q0-q1}, [arg2, :128]! - vld1.64 {q2-q3}, [arg2, :128]! - vld1.64 {q4-q5}, [arg2, :128]! - vld1.64 {q6-q7}, [arg2, :128]! + vld1.64 {q0-q1}, [arg2]! + vld1.64 {q2-q3}, [arg2]! + vld1.64 {q4-q5}, [arg2]! + vld1.64 {q6-q7}, [arg2]! CPU_LE( vrev64.8 q0, q0 ) CPU_LE( vrev64.8 q1, q1 ) CPU_LE( vrev64.8 q2, q2 )
@@ -167,7 +167,7 @@ CPU_LE( vrev64.8 q7, q7 ) _fold_64_B_loop: .macro fold64, reg1, reg2 - vld1.64 {q11-q12}, [arg2, :128]! + vld1.64 {q11-q12}, [arg2]! vmull.p64 q8, \reg1\()h, d21 vmull.p64 \reg1, \reg1\()l, d20
@@ -238,7 +238,7 @@ _16B_reduction_loop: vmull.p64 q7, d15, d21 veor.8 q7, q7, q8 - vld1.64 {q0}, [arg2, :128]! + vld1.64 {q0}, [arg2]! CPU_LE( vrev64.8 q0, q0 ) vswp d0, d1 veor.8 q7, q7, q0
@@ -335,7 +335,7 @@ _less_than_128: vmov.i8 q0, #0 vmov s3, arg1_low32 // get the initial crc value - vld1.64 {q7}, [arg2, :128]! + vld1.64 {q7}, [arg2]! CPU_LE( vrev64.8 q7, q7 ) vswp d14, d15 veor.8 q7, q7, q0
arch/arm/crypto/crct10dif-ce-glue.c +6 -17
@@ -35,26 +35,15 @@ static int crct10dif_update(struct shash unsigned int length) {u16 *crc =shash_desc_ctx (desc); -unsigned int l; -if (!may_use_simd ()) { - *crc =crc_t10dif_generic (*crc, data, length); +if (length >=CRC_T10DIF_PMULL_CHUNK_SIZE &&may_use_simd ()) { +kernel_neon_begin (); + *crc =crc_t10dif_pmull (*crc, data, length); +kernel_neon_end (); }else { -if (unlikely ((u32 )data %CRC_T10DIF_PMULL_CHUNK_SIZE )) { - l =min_t (u32, length,CRC_T10DIF_PMULL_CHUNK_SIZE - - ((u32 )data %CRC_T10DIF_PMULL_CHUNK_SIZE )); - - *crc =crc_t10dif_generic (*crc, data, l); - - length -= l; - data += l; - } -if (length >0 ) { -kernel_neon_begin (); - *crc =crc_t10dif_pmull (*crc, data, length); -kernel_neon_end (); - } + *crc =crc_t10dif_generic (*crc, data, length); } +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 74/183 crypto: arm64/crct10dif - revert to C code for short inputs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit d72b9d4acd548251f55b16843fc7a05dc5c80de8 upstream.
The SIMD routine ported from x86 used to have a special code path for inputs < 16 bytes, which got lost somewhere along the way. Instead, the current glue code aligns the input pointer to 16 bytes, which is not really necessary on this architecture (although it could be beneficial to performance to expose aligned data to the the NEON routine), but this could result in inputs of less than 16 bytes to be passed in. This not only fails the new extended tests that Eric has implemented, it also results in the code reading past the end of the input, which could potentially result in crashes when dealing with less than 16 bytes of input at the end of a page which is followed by an unmapped page.
So update the glue code to only invoke the NEON routine if the input is at least 16 bytes.
--- arch/arm64/crypto/crct10dif-ce-glue.c | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-)
arch/arm64/crypto/crct10dif-ce-glue.c +6 -19
@@ -36,26 +36,13 @@ static int crct10dif_update(struct shash unsigned int length) {u16 *crc =shash_desc_ctx (desc); -unsigned int l; -if (unlikely ((u64 )data %CRC_T10DIF_PMULL_CHUNK_SIZE )) { - l =min_t (u32, length,CRC_T10DIF_PMULL_CHUNK_SIZE - - ((u64 )data %CRC_T10DIF_PMULL_CHUNK_SIZE )); - - *crc =crc_t10dif_generic (*crc, data, l); - - length -= l; - data += l; - } - -if (length >0 ) { -if (may_use_simd ()) { -kernel_neon_begin (); - *crc =crc_t10dif_pmull (*crc, data, length); -kernel_neon_end (); - }else { - *crc =crc_t10dif_generic (*crc, data, length); - } +if (length >=CRC_T10DIF_PMULL_CHUNK_SIZE &&may_use_simd ()) { +kernel_neon_begin (); + *crc =crc_t10dif_pmull (*crc, data, length); +kernel_neon_end (); + }else { + *crc =crc_t10dif_generic (*crc, data, length); }return 0 ;
Greg Kroah-Hartman
maintainerPATCH 75/183 crypto: hash - set CRYPTO_TFM_NEED_KEY if ->setkey() fails
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit ba7d7433a0e998c902132bd47330e355a1eaa894 upstream.
Some algorithms have a ->setkey() method that is not atomic, in the sense that setting a key can fail after changes were already made to the tfm context. In this case, if a key was already set the tfm can end up in a state that corresponds to neither the old key nor the new key.
It's not feasible to make all ->setkey() methods atomic, especially ones that have to key multiple sub-tfms. Therefore, make the crypto API set CRYPTO_TFM_NEED_KEY if ->setkey() fails and the algorithm requires a key, to prevent the tfm from being used until a new key is set.
Note: we can't set CRYPTO_TFM_NEED_KEY for OPTIONAL_KEY algorithms, so ->setkey() for those must nevertheless be atomic. That's fine for now since only the crc32 and crc32c algorithms set OPTIONAL_KEY, and it's not intended that OPTIONAL_KEY be used much.
[Cc stable mainly because when introducing the NEED_KEY flag I changed
AF_ALG to rely on it; and unlike in-kernel crypto API users, AF_ALG previously didn't have this problem. So these "incompletely keyed" states became theoretically accessible via AF_ALG -- though, the opportunities for causing real mischief seem pretty limited.]
--- crypto/ahash.c | 28 +++++++++++++++++++--------- crypto/shash.c | 18 +++++++++++++----- 2 files changed, 32 insertions(+), 14 deletions(-)
crypto/ahash.c +19 -9
@@ -190,6 +190,21 @@ static int ahash_setkey_unaligned(structreturn ret; } +static int ahash_nosetkey (struct crypto_ahash *tfm,const u8 *key, +unsigned int keylen) +{ +return -ENOSYS ; +} + +static void ahash_set_needkey (struct crypto_ahash *tfm) +{ +const struct hash_alg_common *alg =crypto_hash_alg_common (tfm); + +if (tfm->setkey != ahash_nosetkey && + !(alg->base.cra_flags &CRYPTO_ALG_OPTIONAL_KEY )) +crypto_ahash_set_flags (tfm,CRYPTO_TFM_NEED_KEY ); +} +int crypto_ahash_setkey (struct crypto_ahash *tfm,const u8 *key,unsigned int keylen) {
@@ -201,20 +216,16 @@ int crypto_ahash_setkey(struct crypto_ahelse err = tfm->setkey (tfm, key, keylen); -if (err) +if (unlikely (err)) { +ahash_set_needkey (tfm);return err; + }crypto_ahash_clear_flags (tfm,CRYPTO_TFM_NEED_KEY );return 0 ; }EXPORT_SYMBOL_GPL (crypto_ahash_setkey); -static int ahash_nosetkey (struct crypto_ahash *tfm,const u8 *key, -unsigned int keylen) -{ -return -ENOSYS ; -} -static inline unsigned int ahash_align_buffer_size (unsigned len,unsigned long mask) {
@@ -483,8 +494,7 @@ static int crypto_ahash_init_tfm(structif (alg->setkey) { hash->setkey = alg->setkey; -if (!(alg->halg.base.cra_flags &CRYPTO_ALG_OPTIONAL_KEY )) -crypto_ahash_set_flags (hash,CRYPTO_TFM_NEED_KEY ); +ahash_set_needkey (hash); }if (alg->export) hash->export = alg->export;
crypto/shash.c +13 -5
@@ -53,6 +53,13 @@ static int shash_setkey_unaligned(structreturn err; } +static void shash_set_needkey (struct crypto_shash *tfm,struct shash_alg *alg) +{ +if (crypto_shash_alg_has_setkey (alg) && + !(alg->base.cra_flags &CRYPTO_ALG_OPTIONAL_KEY )) +crypto_shash_set_flags (tfm,CRYPTO_TFM_NEED_KEY ); +} +int crypto_shash_setkey (struct crypto_shash *tfm,const u8 *key,unsigned int keylen) {
@@ -65,8 +72,10 @@ int crypto_shash_setkey(struct crypto_shelse err = shash->setkey (tfm, key, keylen); -if (err) +if (unlikely (err)) { +shash_set_needkey (tfm, shash);return err; + }crypto_shash_clear_flags (tfm,CRYPTO_TFM_NEED_KEY );return 0 ;
@@ -368,7 +377,8 @@ int crypto_init_shash_ops_async(struct c crt->final = shash_async_final; crt->finup = shash_async_finup; crt->digest = shash_async_digest; - crt->setkey = shash_async_setkey; +if (crypto_shash_alg_has_setkey (alg)) + crt->setkey = shash_async_setkey;crypto_ahash_set_flags (crt,crypto_shash_get_flags (shash) &CRYPTO_TFM_NEED_KEY );
@@ -390,9 +400,7 @@ static int crypto_shash_init_tfm(struct hash->descsize = alg->descsize; -if (crypto_shash_alg_has_setkey (alg) && - !(alg->base.cra_flags &CRYPTO_ALG_OPTIONAL_KEY )) -crypto_shash_set_flags (hash,CRYPTO_TFM_NEED_KEY ); +shash_set_needkey (hash, alg);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 76/183 crypto: testmgr - skip crc32c context test for ahash algorithms
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit eb5e6730db98fcc4b51148b4a819fa4bf864ae54 upstream.
Instantiating "cryptd(crc32c)" causes a crypto self-test failure because the crypto_alloc_shash() in alg_test_crc32c() fails. This is because cryptd(crc32c) is an ahash algorithm, not a shash algorithm; so it can only be accessed through the ahash API, unlike shash algorithms which can be accessed through both the ahash and shash APIs.
As the test is testing the shash descriptor format which is only applicable to shash algorithms, skip it for ahash algorithms.
(Note that it's still important to fix crypto self-test failures even
for weird algorithm instantiations like cryptd(crc32c) that no one would really use; in fips_enabled mode unprivileged users can use them to panic the kernel, and also they prevent treating a crypto self-test failure as a bug when fuzzing the kernel.)
--- crypto/testmgr.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
crypto/testmgr.c +10 -4
@@ -1839,14 +1839,21 @@ static int alg_test_crc32c(const struct err =alg_test_hash (desc, driver, type, mask);if (err) - goto out; +return err; tfm =crypto_alloc_shash (driver, type, mask);if (IS_ERR (tfm)) { +if (PTR_ERR (tfm) == -ENOENT ) { +/* +* This crc32c implementation is only available through +* ahash API, not the shash API, so the remaining part +* of the test is not applicable to it. +*/ +return 0 ; + }printk (KERN_ERR "alg: crc32c: Failed to load transform for %s: " "%ld\n" , driver,PTR_ERR (tfm)); - err =PTR_ERR (tfm); - goto out; +return PTR_ERR (tfm); } do {
@@ -1873,7 +1880,6 @@ static int alg_test_crc32c(const structcrypto_free_shash (tfm); -out:return err; }
Greg Kroah-Hartman
maintainerPATCH 77/183 crypto: arm64/aes-ccm - fix logical bug in AAD MAC handling
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit eaf46edf6ea89675bd36245369c8de5063a0272c upstream.
The NEON MAC calculation routine fails to handle the case correctly where there is some data in the buffer, and the input fills it up exactly. In this case, we enter the loop at the end with w8 == 0, while a negative value is assumed, and so the loop carries on until the increment of the 32-bit counter wraps around, which is quite obviously wrong.
So omit the loop altogether in this case, and exit right away.
--- arch/arm64/crypto/aes-ce-ccm-core.S | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/arm64/crypto/aes-ce-ccm-core.S +3 -2
@@ -74,12 +74,13 @@ ENTRY(ce_aes_ccm_auth_data) beq 10f ext v0.16b, v0.16b, v0.16b, #1 /* rotate out the mac bytes */ b 7b -8: mov w7, w8 +8: cbz w8, 91f + mov w7, w8 add w8, w8, #16 9: ext v1.16b, v1.16b, v1.16b, #1 adds w7, w7, #1 bne 9b - eor v0.16b, v0.16b, v1.16b +91: eor v0.16b, v0.16b, v1.16b st1 {v0.16b}, [x0] 10: str w8, [x3] ret
Greg Kroah-Hartman
maintainerPATCH 78/183 crypto: arm64/aes-ccm - fix bugs in non-NEON fallback routine
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit 969e2f59d589c15f6aaf306e590dde16f12ea4b3 upstream.
Commit 5092fcf34908 ("crypto: arm64/aes-ce-ccm: add non-SIMD generic fallback") introduced C fallback code to replace the NEON routines when invoked from a context where the NEON is not available (i.e., from the context of a softirq taken while the NEON is already being used in kernel process context)
Fix two logical flaws in the MAC calculation of the associated data.
--- arch/arm64/crypto/aes-ce-ccm-glue.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
arch/arm64/crypto/aes-ce-ccm-glue.c +1 -3
@@ -123,7 +123,7 @@ static void ccm_update_mac(struct crypto abytes -= added; } -while (abytes >AES_BLOCK_SIZE ) { +while (abytes >=AES_BLOCK_SIZE ) {__aes_arm64_encrypt (key->key_enc, mac, mac,num_rounds (key));crypto_xor (mac, in,AES_BLOCK_SIZE );
@@ -137,8 +137,6 @@ static void ccm_update_mac(struct crypto num_rounds(key));crypto_xor (mac, in, abytes); *macp = abytes; - }else { - *macp =0 ; } } }
Greg Kroah-Hartman
maintainerPATCH 79/183 CIFS: Do not reset lease state to NONE on lease break
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pavel Shilovsky <[email protected]>
commit 7b9b9edb49ad377b1e06abf14354c227e9ac4b06 upstream.
Currently on lease break the client sets a caching level twice:
when oplock is detected and when oplock is processed. While the 1st attempt sets the level to the value provided by the server, the 2nd one resets the level to None unconditionally. This happens because the oplock/lease processing code was changed to avoid races between page cache flushes and oplock breaks. The commit c11f1df5003d534 ("cifs: Wait for writebacks to complete before attempting write.") fixed the races for oplocks but didn't apply the same changes for leases resulting in overwriting the server granted value to None. Fix this by properly processing lease breaks.
--- fs/cifs/smb2misc.c | 17 ++++++++++++++--- fs/cifs/smb2ops.c | 15 ++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-)
fs/cifs/smb2misc.c +14 -3
@@ -479,7 +479,6 @@ smb2_tcon_has_lease(struct cifs_tcon *tc__u8 lease_state;struct list_head *tmp;struct cifsFileInfo *cfile; -struct TCP_Server_Info *server = tcon->ses->server;struct cifs_pending_open *open;struct cifsInodeInfo *cinode; int ack_req = le32_to_cpu(rsp->Flags &
@@ -499,13 +498,25 @@ smb2_tcon_has_lease(struct cifs_tcon *tccifs_dbg (FYI ,"lease key match, lease break 0x%x\n" ,le32_to_cpu (rsp->NewLeaseState)); - server->ops->set_oplock_level (cinode, lease_state,0 ,NULL ); -if (ack_req) cfile->oplock_break_cancelled = false;else cfile->oplock_break_cancelled = true; +set_bit (CIFS_INODE_PENDING_OPLOCK_BREAK , &cinode->flags); + +/* +* Set or clear flags depending on the lease state being READ. +* HANDLE caching flag should be added when the client starts +* to defer closing remote file handles with HANDLE leases. +*/ +if (lease_state &SMB2_LEASE_READ_CACHING_HE ) +set_bit (CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , + &cinode->flags); +else +clear_bit (CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , + &cinode->flags); +queue_work (cifsoplockd_wq, &cfile->oplock_break);kfree (lw);return true;
fs/cifs/smb2ops.c +12 -3
@@ -1933,6 +1933,15 @@ smb2_downgrade_oplock(struct TCP_Server_ }static void +smb21_downgrade_oplock (struct TCP_Server_Info *server, +struct cifsInodeInfo *cinode,bool set_level2) +{ + server->ops->set_oplock_level (cinode, + set_level2 ?SMB2_LEASE_READ_CACHING_HE : +0 ,0 ,NULL ); +} + +static void smb2_set_oplock_level (struct cifsInodeInfo *cinode,__u32 oplock,unsigned int epoch,bool *purge_cache) {
@@ -2917,7 +2926,7 @@ struct smb_version_operations smb21_oper .print_stats = smb2_print_stats, .is_oplock_break = smb2_is_valid_oplock_break, .handle_cancelled_mid = smb2_handle_cancelled_mid, - .downgrade_oplock = smb2_downgrade_oplock, + .downgrade_oplock = smb21_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,
@@ -3012,7 +3021,7 @@ struct smb_version_operations smb30_oper .dump_share_caps = smb2_dump_share_caps, .is_oplock_break = smb2_is_valid_oplock_break, .handle_cancelled_mid = smb2_handle_cancelled_mid, - .downgrade_oplock = smb2_downgrade_oplock, + .downgrade_oplock = smb21_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,
@@ -3117,7 +3126,7 @@ struct smb_version_operations smb311_ope .dump_share_caps = smb2_dump_share_caps, .is_oplock_break = smb2_is_valid_oplock_break, .handle_cancelled_mid = smb2_handle_cancelled_mid, - .downgrade_oplock = smb2_downgrade_oplock, + .downgrade_oplock = smb21_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,
Greg Kroah-Hartman
maintainerPATCH 80/183 CIFS: Fix read after write for files with read caching
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pavel Shilovsky <[email protected]>
commit 6dfbd84684700cb58b34e8602c01c12f3d2595c8 upstream.
When we have a READ lease for a file and have just issued a write operation to the server we need to purge the cache and set oplock/lease level to NONE to avoid reading stale data. Currently we do that only if a write operation succedeed thus not covering cases when a request was sent to the server but a negative error code was returned later for some other reasons (e.g. -EIOCBQUEUED or -EINTR). Fix this by turning off caching regardless of the error code being returned.
The patches fixes generic tests 075 and 112 from the xfs-tests.
--- fs/cifs/file.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/cifs/file.c +7 -5
@@ -2889,14 +2889,16 @@ cifs_strict_writev(struct kiocb *iocb, s* these pages but not on the region from pos to ppos+len-1. */ written =cifs_user_writev (iocb, from); -if (written >0 &&CIFS_CACHE_READ (cinode)) { +if (CIFS_CACHE_READ (cinode)) {/* -* Windows 7 server can delay breaking level2 oplock if a write -* request comes - break it on the client to prevent reading -* an old data. +* We have read level caching and we have just sent a write +* request to the server thus making data in the cache stale. +* Zap the cache and set oplock/lease level to NONE to avoid +* reading stale data from the cache. All subsequent read +* operations will read new data from the server. */ cifs_zap_mapping (inode); -cifs_dbg (FYI ,"Set no oplock for inode=%p after a write operation\n" , +cifs_dbg (FYI ,"Set Oplock/Lease to NONE for inode=%p after write\n" , inode); cinode->oplock =0 ; }
Greg Kroah-Hartman
maintainerPATCH 81/183 tracing: Use strncpy instead of memcpy for string keys in hist triggers
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom Zanussi <[email protected]>
commit 9f0bbf3115ca9f91f43b7c74e9ac7d79f47fc6c2 upstream.
Because there may be random garbage beyond a string's null terminator, it's not correct to copy the the complete character array for use as a hist trigger key. This results in multiple histogram entries for the 'same' string key.
So, in the case of a string key, use strncpy instead of memcpy to avoid copying in the extra bytes.
Before, using the gdbus entries in the following hist trigger as an example:
# echo 'hist:key=comm' > /sys/kernel/debug/tracing/events/sched/sched_waking/trigger # cat /sys/kernel/debug/tracing/events/sched/sched_waking/hist
...
{ comm: ImgDecoder #4 } hitcount: 203
{ comm: gmain } hitcount: 213
{ comm: gmain } hitcount: 216
{ comm: StreamTrans #73 } hitcount: 221
{ comm: mozStorage #3 } hitcount: 230
{ comm: gdbus } hitcount: 233
{ comm: StyleThread#5 } hitcount: 253
{ comm: gdbus } hitcount: 256
{ comm: gdbus } hitcount: 260
{ comm: StyleThread#4 } hitcount: 271...
# cat /sys/kernel/debug/tracing/events/sched/sched_waking/hist | egrep gdbus | wc -l 51
After:
# cat /sys/kernel/debug/tracing/events/sched/sched_waking/hist | egrep gdbus | wc -l 1
--- kernel/trace/trace_events_hist.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/trace/trace_events_hist.c +3 -2
@@ -872,9 +872,10 @@ static inline void add_to_key(char *comp/* ensure NULL-termination */ if (size > key_field->size -1 ) size = key_field->size -1 ; - } -memcpy (compound_key + key_field->offset, key, size); +strncpy (compound_key + key_field->offset, (char *)key, size); + }else +memcpy (compound_key + key_field->offset, key, size); }static void event_hist_trigger (struct event_trigger_data *data,void *rec)
Greg Kroah-Hartman
maintainerPATCH 82/183 tracing: Do not free iter->trace in fail path of tracing_open_pipe()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: zhangyi (F) <[email protected]>
commit e7f0c424d0806b05d6f47be9f202b037eb701707 upstream.
Commit d716ff71dd12 ("tracing: Remove taking of trace_types_lock in pipe files") use the current tracer instead of the copy in tracing_open_pipe(), but it forget to remove the freeing sentence in the error path.
There's an error path that can call kfree(iter->trace) after the iter->trace was assigned to tr->current_trace, which would be bad to free.
--- kernel/trace/trace.c | 1 - 1 file changed, 1 deletion(-)
kernel/trace/trace.c +0 -1
@@ -5604,7 +5604,6 @@ out:return ret; fail: -kfree (iter->trace);kfree (iter);__trace_array_put (tr);mutex_unlock (&trace_types_lock);
Greg Kroah-Hartman
maintainerPATCH 83/183 xen: fix dom0 boot on huge systems
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juergen Gross <[email protected]>
commit 01bd2ac2f55a1916d81dace12fa8d7ae1c79b5ea upstream.
Commit f7c90c2aa40048 ("x86/xen: don't write ptes directly in 32-bit PV guests") introduced a regression for booting dom0 on huge systems with lots of RAM (in the TB range).
Reason is that on those hosts the p2m list needs to be moved early in the boot process and this requires temporary page tables to be created. Said commit modified xen_set_pte_init() to use a hypercall for writing a PTE, but this requires the page table being in the direct mapped area, which is not the case for the temporary page tables used in xen_relocate_p2m().
As the page tables are completely written before being linked to the actual address space instead of set_pte() a plain write to memory can be used in xen_relocate_p2m().
--- arch/x86/xen/mmu_pv.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
arch/x86/xen/mmu_pv.c +6 -7
@@ -2080,10 +2080,10 @@ void __init xen_relocate_p2m(void) pt =early_memremap (pt_phys,PAGE_SIZE );clear_page (pt);for (idx_pte =0 ; - idx_pte <min (n_pte,PTRS_PER_PTE ); - idx_pte++) { -set_pte (pt + idx_pte, -pfn_pte (p2m_pfn,PAGE_KERNEL )); + idx_pte <min (n_pte,PTRS_PER_PTE ); + idx_pte++) { + pt[idx_pte] =pfn_pte (p2m_pfn, +PAGE_KERNEL ); p2m_pfn++; } n_pte -=PTRS_PER_PTE ;
@@ -2091,8 +2091,7 @@ void __init xen_relocate_p2m(void)make_lowmem_page_readonly (__va (pt_phys));pin_pagetable_pfn (MMUEXT_PIN_L1_TABLE ,PFN_DOWN (pt_phys)); -set_pmd (pmd + idx_pt, -__pmd (_PAGE_TABLE | pt_phys)); + pmd[idx_pt] =__pmd (_PAGE_TABLE | pt_phys); pt_phys +=PAGE_SIZE ; } n_pt -=PTRS_PER_PMD ;
@@ -2100,7 +2099,7 @@ void __init xen_relocate_p2m(void)make_lowmem_page_readonly (__va (pmd_phys));pin_pagetable_pfn (MMUEXT_PIN_L2_TABLE ,PFN_DOWN (pmd_phys)); -set_pud (pud + idx_pmd,__pud (_PAGE_TABLE | pmd_phys)); + pud[idx_pmd] =__pud (_PAGE_TABLE | pmd_phys); pmd_phys +=PAGE_SIZE ; } n_pmd -=PTRS_PER_PUD ;
Greg Kroah-Hartman
maintainerPATCH 84/183 ACPI / device_sysfs: Avoid OF modalias creation for removed device
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit f16eb8a4b096514ac06fb25bf599dcc792899b3d upstream.
If SSDT overlay is loaded via ConfigFS and then unloaded the device, we would like to have OF modalias for, already gone. Thus, acpi_get_name() returns no allocated buffer for such case and kernel crashes afterwards:
ACPI: Host-directed Dynamic ACPI Table Unload ads7950 spi-PRP0001:00: Dropping the link to regulator.0
BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 #PF error: [normal kernel read fault] PGD 80000000070d6067 P4D 80000000070d6067 PUD 70d0067 PMD 0 Oops: 0000 [#1] SMP PTI CPU: 0 PID: 40 Comm: kworker/u4:2 Not tainted 5.0.0+ #96 Hardware name: Intel Corporation Merrifield/BODEGA BAY, BIOS 542 2015.01.21:18.19.48 Workqueue: kacpi_hotplug acpi_device_del_work_fn RIP: 0010:create_of_modalias.isra.1+0x4c/0x150 Code: 00 00 48 89 44 24 18 31 c0 48 8d 54 24 08 48 c7 44 24 10 00 00 00 00 48 c7 44 24 08 ff ff ff ff e8 7a b0 03 00 48 8b 4c 24 10 <0f> b6 01 84 c0 74 27 48 c7 c7 00 09 f4 a5 0f b6 f0 8d 50 20 f6 04 RSP: 0000:ffffa51040297c10 EFLAGS: 00010246 RAX: 0000000000001001 RBX: 0000000000000785 RCX: 0000000000000000 RDX: 0000000000001001 RSI: 0000000000000286 RDI: ffffa2163dc042e0 RBP: ffffa216062b1196 R08: 0000000000001001 R09: ffffa21639873000 R10: ffffffffa606761d R11: 0000000000000001 R12: ffffa21639873218 R13: ffffa2163deb5060 R14: ffffa216063d1010 R15: 0000000000000000 FS: 0000000000000000(0000) GS:ffffa2163e000000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000000 CR3: 0000000007114000 CR4: 00000000001006f0 Call Trace: __acpi_device_uevent_modalias+0xb0/0x100 spi_uevent+0xd/0x40
...
In order to fix above let create_of_modalias() check the status returned by acpi_get_name() and bail out in case of failure.
--- drivers/acpi/device_sysfs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/acpi/device_sysfs.c +5 -1
@@ -202,11 +202,15 @@ static int create_of_modalias(struct acp {struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER };const union acpi_object *of_compatible, *obj; +acpi_status status;int len, count;int i, nval;char *c; -acpi_get_name (acpi_dev->handle,ACPI_SINGLE_NAME , &buf); + status =acpi_get_name (acpi_dev->handle,ACPI_SINGLE_NAME , &buf); +if (ACPI_FAILURE (status)) +return -ENODEV ; +/* DT strings are all in lower case */ for (c = buf.pointer; *c !='\0' ; c++) *c =tolower (*c);
Greg Kroah-Hartman
maintainerPATCH 85/183 mmc: sdhci-esdhc-imx: fix HS400 timing issue
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: BOUGH CHEN <[email protected]>
commit de0a0decf2edfc5b0c782915f4120cf990a9bd13 upstream.
Now tuning reset will be done when the timing is MMC_TIMING_LEGACY/ MMC_TIMING_MMC_HS/MMC_TIMING_SD_HS. But for timing MMC_TIMING_MMC_HS, we can not do tuning reset, otherwise HS400 timing is not right.
Here is the process of init HS400, first finish tuning in HS200 mode, then switch to HS mode and 8 bit DDR mode, finally switch to HS400 mode. If we do tuning reset in HS mode, this will cause HS400 mode lost the tuning setting, which will cause CRC error.
--- drivers/mmc/host/sdhci-esdhc-imx.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/sdhci-esdhc-imx.c +1 -0
@@ -961,6 +961,7 @@ static void esdhc_set_uhs_signaling(strucase MMC_TIMING_UHS_SDR25 :case MMC_TIMING_UHS_SDR50 :case MMC_TIMING_UHS_SDR104 : +case MMC_TIMING_MMC_HS :case MMC_TIMING_MMC_HS200 :writel (m, host->ioaddr +ESDHC_MIX_CTRL );break ;
Greg Kroah-Hartman
maintainerPATCH 86/183 spi: ti-qspi: Fix mmap read when more than one CS in use
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vignesh R <[email protected]>
commit 673c865efbdc5fec3cc525c46d71844d42c60072 upstream.
Commit 4dea6c9b0b64 ("spi: spi-ti-qspi: add mmap mode read support") has has got order of parameter wrong when calling regmap_update_bits() to select CS for mmap access. Mask and value arguments are interchanged. Code will work on a system with single slave, but fails when more than one CS is in use. Fix this by correcting the order of parameters when calling regmap_update_bits().
--- drivers/spi/spi-ti-qspi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/spi/spi-ti-qspi.c +3 -3
@@ -490,8 +490,8 @@ static void ti_qspi_enable_memory_map(stti_qspi_write (qspi,MM_SWITCH ,QSPI_SPI_SWITCH_REG );if (qspi->ctrl_base) {regmap_update_bits (qspi->ctrl_base, qspi->ctrl_reg, -MEM_CS_EN (spi->chip_select), -MEM_CS_MASK ); +MEM_CS_MASK , +MEM_CS_EN (spi->chip_select)); } qspi->mmap_enabled = true; }
@@ -503,7 +503,7 @@ static void ti_qspi_disable_memory_map(sti_qspi_write (qspi,0 ,QSPI_SPI_SWITCH_REG );if (qspi->ctrl_base)regmap_update_bits (qspi->ctrl_base, qspi->ctrl_reg, -0 ,MEM_CS_MASK ); +MEM_CS_MASK ,0 ); qspi->mmap_enabled = false; }
Greg Kroah-Hartman
maintainerPATCH 87/183 spi: pxa2xx: Setup maximum supported DMA transfer length
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit ef070b4e4aa25bb5f8632ad196644026c11903bf upstream.
When the commit b6ced294fb61
("spi: pxa2xx: Switch to SPI core DMA mapping functionality")
switches to SPI core provided DMA helpers, it missed to setup maximum supported DMA transfer length for the controller and thus users mistakenly try to send more data than supported with the following warning:
ili9341 spi-PRP0001:01: DMA disabled for transfer length 153600 greater than 65536
Setup maximum supported DMA transfer length in order to make users know the limit.
--- drivers/spi/spi-pxa2xx.c | 1 + 1 file changed, 1 insertion(+)
drivers/spi/spi-pxa2xx.c +1 -0
@@ -1698,6 +1698,7 @@ static int pxa2xx_spi_probe(struct platf platform_info->enable_dma = false; }else { master->can_dma = pxa2xx_spi_can_dma; + master->max_dma_len =MAX_DMA_LEN ; } }
Greg Kroah-Hartman
maintainerPATCH 88/183 regulator: s2mps11: Fix steps for buck7, buck8 and LDO35
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 56b5d4ea778c1b0989c5cdb5406d4a488144c416 upstream.
LDO35 uses 25 mV step, not 50 mV. Bucks 7 and 8 use 12.5 mV step instead of 6.25 mV. Wrong step caused over-voltage (LDO35) or under-voltage (buck7 and 8) if regulators were used (e.g. on Exynos5420 Arndale Octa board).
--- drivers/regulator/s2mps11.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/regulator/s2mps11.c +3 -3
@@ -376,7 +376,7 @@ static const struct regulator_desc s2mpsregulator_desc_s2mps11_ldo (32 ,STEP_50_MV ),regulator_desc_s2mps11_ldo (33 ,STEP_50_MV ),regulator_desc_s2mps11_ldo (34 ,STEP_50_MV ), -regulator_desc_s2mps11_ldo (35 ,STEP_50_MV ), +regulator_desc_s2mps11_ldo (35 ,STEP_25_MV ),regulator_desc_s2mps11_ldo (36 ,STEP_50_MV ),regulator_desc_s2mps11_ldo (37 ,STEP_50_MV ), regulator_desc_s2mps11_ldo(38, STEP_50_MV),
@@ -386,8 +386,8 @@ static const struct regulator_desc s2mpsregulator_desc_s2mps11_buck1_4 (4 ), regulator_desc_s2mps11_buck5,regulator_desc_s2mps11_buck67810 (6 ,MIN_600_MV ,STEP_6_25_MV ), -regulator_desc_s2mps11_buck67810 (7 ,MIN_600_MV ,STEP_6_25_MV ), -regulator_desc_s2mps11_buck67810 (8 ,MIN_600_MV ,STEP_6_25_MV ), +regulator_desc_s2mps11_buck67810 (7 ,MIN_600_MV ,STEP_12_5_MV ), +regulator_desc_s2mps11_buck67810 (8 ,MIN_600_MV ,STEP_12_5_MV ), regulator_desc_s2mps11_buck9, regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV), };
Greg Kroah-Hartman
maintainerPATCH 89/183 regulator: max77620: Initialize values for DT properties
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Zhang <[email protected]>
commit 0ab66b3c326ef8f77dae9f528118966365757c0c upstream.
If regulator DT node doesn't exist, its of_parse_cb callback function isn't called. Then all values for DT properties are filled with zero. This leads to wrong register update for FPS and POK settings.
--- drivers/regulator/max77620-regulator.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/regulator/max77620-regulator.c +9 -1
@@ -1,7 +1,7 @@/* * Maxim MAX77620 Regulator driver * -* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. +* Copyright (c) 2016-2018, NVIDIA CORPORATION. All rights reserved. * * Author: Mallikarjun Kasoju <[email protected]> * Laxman Dewangan <[email protected]>
@@ -803,6 +803,14 @@ static int max77620_regulator_probe(stru rdesc = &rinfo[id].desc; pmic->rinfo[id] = &max77620_regs_info[id]; pmic->enable_power_mode[id] =MAX77620_POWER_MODE_NORMAL ; + pmic->reg_pdata[id].active_fps_src =-1 ; + pmic->reg_pdata[id].active_fps_pd_slot =-1 ; + pmic->reg_pdata[id].active_fps_pu_slot =-1 ; + pmic->reg_pdata[id].suspend_fps_src =-1 ; + pmic->reg_pdata[id].suspend_fps_pd_slot =-1 ; + pmic->reg_pdata[id].suspend_fps_pu_slot =-1 ; + pmic->reg_pdata[id].power_ok =-1 ; + pmic->reg_pdata[id].ramp_rate_setting =-1 ; ret =max77620_read_slew_rate (pmic, id);if (ret <0 )
Greg Kroah-Hartman
maintainerPATCH 90/183 regulator: s2mpa01: Fix step values for some LDOs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stuart Menefy <[email protected]>
commit 28c4f730d2a44f2591cb104091da29a38dac49fe upstream.
The step values for some of the LDOs appears to be incorrect, resulting in incorrect voltages (or at least, ones which are different from the Samsung 3.4 vendor kernel).
--- drivers/regulator/s2mpa01.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/regulator/s2mpa01.c +5 -5
@@ -304,13 +304,13 @@ static const struct regulator_desc regulregulator_desc_ldo (2 ,STEP_50_MV ),regulator_desc_ldo (3 ,STEP_50_MV ),regulator_desc_ldo (4 ,STEP_50_MV ), -regulator_desc_ldo (5 ,STEP_50_MV ), +regulator_desc_ldo (5 ,STEP_25_MV ),regulator_desc_ldo (6 ,STEP_25_MV ),regulator_desc_ldo (7 ,STEP_50_MV ),regulator_desc_ldo (8 ,STEP_50_MV ),regulator_desc_ldo (9 ,STEP_50_MV ),regulator_desc_ldo (10 ,STEP_50_MV ), -regulator_desc_ldo (11 ,STEP_25_MV ), +regulator_desc_ldo (11 ,STEP_50_MV ),regulator_desc_ldo (12 ,STEP_50_MV ),regulator_desc_ldo (13 ,STEP_50_MV ), regulator_desc_ldo(14, STEP_50_MV),
@@ -321,11 +321,11 @@ static const struct regulator_desc regulregulator_desc_ldo (19 ,STEP_50_MV ),regulator_desc_ldo (20 ,STEP_50_MV ),regulator_desc_ldo (21 ,STEP_50_MV ), -regulator_desc_ldo (22 ,STEP_25_MV ), -regulator_desc_ldo (23 ,STEP_25_MV ), +regulator_desc_ldo (22 ,STEP_50_MV ), +regulator_desc_ldo (23 ,STEP_50_MV ),regulator_desc_ldo (24 ,STEP_50_MV ),regulator_desc_ldo (25 ,STEP_50_MV ), -regulator_desc_ldo (26 ,STEP_50_MV ), +regulator_desc_ldo (26 ,STEP_25_MV ),regulator_desc_buck1_4 (1 ),regulator_desc_buck1_4 (2 ), regulator_desc_buck1_4(3),
Greg Kroah-Hartman
maintainerPATCH 91/183 clocksource/drivers/exynos_mct: Move one-shot check from tick clear to ISR
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stuart Menefy <[email protected]>
commit a5719a40aef956ba704f2aa1c7b977224d60fa96 upstream.
When a timer tick occurs and the clock is in one-shot mode, the timer needs to be stopped to prevent it triggering subsequent interrupts. Currently this code is in exynos4_mct_tick_clear(), but as it is only needed when an ISR occurs move it into exynos4_mct_tick_isr(), leaving exynos4_mct_tick_clear() just doing what its name suggests it should.
--- drivers/clocksource/exynos_mct.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
drivers/clocksource/exynos_mct.c +11 -11
@@ -388,6 +388,13 @@ static void exynos4_mct_tick_start(unsigexynos4_mct_write (tmp, mevt->base +MCT_L_TCON_OFFSET ); } +static void exynos4_mct_tick_clear (struct mct_clock_event_device *mevt) +{ +/* Clear the MCT tick interrupt */ +if (readl_relaxed (reg_base + mevt->base +MCT_L_INT_CSTAT_OFFSET ) &1 ) +exynos4_mct_write (0x1 , mevt->base +MCT_L_INT_CSTAT_OFFSET ); +} +static int exynos4_tick_set_next_event (unsigned long cycles,struct clock_event_device *evt) {
@@ -420,8 +427,11 @@ static int set_state_periodic(struct cloreturn 0 ; } -static void exynos4_mct_tick_clear (struct mct_clock_event_device *mevt) +static irqreturn_t exynos4_mct_tick_isr (int irq,void *dev_id) { +struct mct_clock_event_device *mevt = dev_id; +struct clock_event_device *evt = &mevt->evt; +/* * This is for supporting oneshot mode. * Mct would generate interrupt periodically
@@ -430,16 +440,6 @@ static void exynos4_mct_tick_clear(strucif (!clockevent_state_periodic (&mevt->evt))exynos4_mct_tick_stop (mevt); -/* Clear the MCT tick interrupt */ -if (readl_relaxed (reg_base + mevt->base +MCT_L_INT_CSTAT_OFFSET ) &1 ) -exynos4_mct_write (0x1 , mevt->base +MCT_L_INT_CSTAT_OFFSET ); -} - -static irqreturn_t exynos4_mct_tick_isr (int irq,void *dev_id) -{ -struct mct_clock_event_device *mevt = dev_id; -struct clock_event_device *evt = &mevt->evt; -exynos4_mct_tick_clear (mevt); evt->event_handler (evt);
Greg Kroah-Hartman
maintainerPATCH 92/183 clocksource/drivers/exynos_mct: Clear timer interrupt when shutdown
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stuart Menefy <[email protected]>
commit d2f276c8d3c224d5b493c42b6cf006ae4e64fb1c upstream.
When shutting down the timer, ensure that after we have stopped the timer any pending interrupts are cleared. This fixes a problem when suspending, as interrupts are disabled before the timer is stopped, so the timer interrupt may still be asserted, preventing the system entering a low power state when the wfi is executed.
--- drivers/clocksource/exynos_mct.c | 1 + 1 file changed, 1 insertion(+)
drivers/clocksource/exynos_mct.c +1 -0
@@ -411,6 +411,7 @@ static int set_state_shutdown(struct clo mevt = container_of(evt, struct mct_clock_event_device, evt);exynos4_mct_tick_stop (mevt); +exynos4_mct_tick_clear (mevt);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 93/183 s390/setup: fix early warning messages
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
commit 8727638426b0aea59d7f904ad8ddf483f9234f88 upstream.
The setup_lowcore() function creates a new prefix page for the boot CPU. The PSW mask for the system_call, external interrupt, i/o interrupt and the program check handler have the DAT bit set in this new prefix page.
At the time setup_lowcore is called the system still runs without virtual address translation, the paging_init() function creates the kernel page table and loads the CR13 with the kernel ASCE.
Any code between setup_lowcore() and the end of paging_init() that has a BUG or WARN statement will create a program check that can not be handled correctly as there is no kernel page table yet.
To allow early WARN statements initially setup the lowcore with DAT off and set the DAT bit only after paging_init() has completed.
--- arch/s390/kernel/setup.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-)
arch/s390/kernel/setup.c +23 -9
@@ -300,7 +300,7 @@ early_param("vmalloc", parse_vmalloc); void *restart_stack __section(.data); -static void __init setup_lowcore (void ) +static void __init setup_lowcore_dat_off (void ) {struct lowcore *lc;
@@ -311,19 +311,16 @@ static void __init setup_lowcore(void) lc =memblock_virt_alloc_low (sizeof (*lc),sizeof (*lc)); lc->restart_psw.mask =PSW_KERNEL_BITS ; lc->restart_psw.addr = (unsigned long ) restart_int_handler; - lc->external_new_psw.mask =PSW_KERNEL_BITS | -PSW_MASK_DAT |PSW_MASK_MCHECK ; + lc->external_new_psw.mask =PSW_KERNEL_BITS |PSW_MASK_MCHECK ; lc->external_new_psw.addr = (unsigned long ) ext_int_handler; lc->svc_new_psw.mask =PSW_KERNEL_BITS | -PSW_MASK_DAT |PSW_MASK_IO |PSW_MASK_EXT |PSW_MASK_MCHECK ; +PSW_MASK_IO |PSW_MASK_EXT |PSW_MASK_MCHECK ; lc->svc_new_psw.addr = (unsigned long ) system_call; - lc->program_new_psw.mask =PSW_KERNEL_BITS | -PSW_MASK_DAT |PSW_MASK_MCHECK ; + lc->program_new_psw.mask =PSW_KERNEL_BITS |PSW_MASK_MCHECK ; lc->program_new_psw.addr = (unsigned long ) pgm_check_handler; lc->mcck_new_psw.mask =PSW_KERNEL_BITS ; lc->mcck_new_psw.addr = (unsigned long ) mcck_int_handler; - lc->io_new_psw.mask =PSW_KERNEL_BITS | -PSW_MASK_DAT |PSW_MASK_MCHECK ; + lc->io_new_psw.mask =PSW_KERNEL_BITS |PSW_MASK_MCHECK ; lc->io_new_psw.addr = (unsigned long ) io_int_handler; lc->clock_comparator = clock_comparator_max; lc->kernel_stack = ((unsigned long ) &init_thread_union)
@@ -391,6 +388,17 @@ static void __init setup_lowcore(void) lowcore_ptr[0 ] = lc; } +static void __init setup_lowcore_dat_on (void ) +{ +struct lowcore *lc; + + lc = lowcore_ptr[0 ]; + lc->external_new_psw.mask |=PSW_MASK_DAT ; + lc->svc_new_psw.mask |=PSW_MASK_DAT ; + lc->program_new_psw.mask |=PSW_MASK_DAT ; + lc->io_new_psw.mask |=PSW_MASK_DAT ; +} +static struct resource code_resource = { .name ="Kernel code" , .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM ,
@@ -948,7 +956,7 @@ void __init setup_arch(char **cmdline_p)#endif setup_resources (); -setup_lowcore (); +setup_lowcore_dat_off ();smp_fill_possible_mask ();cpu_detect_mhz_feature ();cpu_init ();
@@ -961,6 +969,12 @@ void __init setup_arch(char **cmdline_p)*/ paging_init (); +/* +* After paging_init created the kernel page table, the new PSWs +* in lowcore can now run with DAT enabled. +*/ +setup_lowcore_dat_on (); +/* Setup default console */ conmode_default ();set_preferred_console ();
Greg Kroah-Hartman
maintainerPATCH 94/183 s390/virtio: handle find on invalid queue gracefully
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Halil Pasic <[email protected]>
commit 3438b2c039b4bf26881786a1f3450f016d66ad11 upstream.
A queue with a capacity of zero is clearly not a valid virtio queue. Some emulators report zero queue size if queried with an invalid queue index. Instead of crashing in this case let us just return -ENOENT. To make that work properly, let us fix the notifier cleanup logic as well.
--- drivers/s390/virtio/virtio_ccw.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/s390/virtio/virtio_ccw.c +3 -1
@@ -275,6 +275,8 @@ static void virtio_ccw_drop_indicators(s {struct virtio_ccw_vq_info *info; +if (!vcdev->airq_info) +return ;list_for_each_entry (info, &vcdev->virtqueues, node)drop_airq_indicator (info->vq, vcdev->airq_info); }
@@ -416,7 +418,7 @@ static int virtio_ccw_read_vq_conf(struc ret =ccw_io_helper (vcdev, ccw,VIRTIO_CCW_DOING_READ_VQ_CONF );if (ret)return ret; -return vcdev->config_block->num; +return vcdev->config_block->num ?: -ENOENT ; }static void virtio_ccw_del_vq (struct virtqueue *vq,struct ccw1 *ccw)
Greg Kroah-Hartman
maintainerPATCH 95/183 scsi: virtio_scsi: dont send sc payload with tmfs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Franciosi <[email protected]>
commit 3722e6a52174d7c3a00e6f5efd006ca093f346c1 upstream.
The virtio scsi spec defines struct virtio_scsi_ctrl_tmf as a set of device-readable records and a single device-writable response entry:
struct virtio_scsi_ctrl_tmf
{
// Device-readable part
le32 type;
le32 subtype;
u8 lun[8];
le64 id;
// Device-writable part
u8 response;
}The above should be organised as two descriptor entries (or potentially more if using VIRTIO_F_ANY_LAYOUT), but without any extra data after "le64 id" or after "u8 response".
The Linux driver doesn't respect that, with virtscsi_abort() and virtscsi_device_reset() setting cmd->sc before calling virtscsi_tmf(). It results in the original scsi command payload (or writable buffers) added to the tmf.
This fixes the problem by leaving cmd->sc zeroed out, which makes virtscsi_kick_cmd() add the tmf to the control vq without any payload.
--- drivers/scsi/virtio_scsi.c | 2 -- 1 file changed, 2 deletions(-)
drivers/scsi/virtio_scsi.c +0 -2
@@ -638,7 +638,6 @@ static int virtscsi_device_reset(structreturn FAILED ;memset (cmd,0 ,sizeof (*cmd)); - cmd->sc = sc; cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req ){ .type =VIRTIO_SCSI_T_TMF , .subtype = cpu_to_virtio32(vscsi->vdev,
@@ -697,7 +696,6 @@ static int virtscsi_abort(struct scsi_cmreturn FAILED ;memset (cmd,0 ,sizeof (*cmd)); - cmd->sc = sc; cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req ){ .type =VIRTIO_SCSI_T_TMF , .subtype =VIRTIO_SCSI_T_TMF_ABORT_TASK ,
Greg Kroah-Hartman
maintainerPATCH 96/183 scsi: aacraid: Fix performance issue on logical drives
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sagar Biradar <[email protected]>
commit 0015437cc046e5ec2b57b00ff8312b8d432eac7c upstream.
Fix performance issue where the queue depth for SmartIOC logical volumes is set to 1, and allow the usual logical volume code to be executed
--- drivers/scsi/aacraid/linit.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/scsi/aacraid/linit.c +8 -5
@@ -413,13 +413,16 @@ static int aac_slave_configure(struct scif (chn <AAC_MAX_BUSES && tid <AAC_MAX_TARGETS && aac->sa_firmware) { devtype = aac->hba_map[chn][tid].devtype; -if (devtype ==AAC_DEVTYPE_NATIVE_RAW ) +if (devtype ==AAC_DEVTYPE_NATIVE_RAW ) { depth = aac->hba_map[chn][tid].qd_limit; -else if (devtype ==AAC_DEVTYPE_ARC_RAW ) + set_timeout =1 ; + goto common_config; + } +if (devtype ==AAC_DEVTYPE_ARC_RAW ) { set_qd_dev_type = true; - - set_timeout =1 ; - goto common_config; + set_timeout =1 ; + goto common_config; + } }if (aac->jbod && (sdev->type ==TYPE_DISK ))
Greg Kroah-Hartman
maintainerPATCH 97/183 scsi: sd: Optimal I/O size should be a multiple of physical block size
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin K. Petersen <[email protected]>
commit a83da8a4509d3ebfe03bb7fffce022e4d5d4764f upstream.
It was reported that some devices report an OPTIMAL TRANSFER LENGTH of 0xFFFF blocks. That looks bogus, especially for a device with a 4096-byte physical block size.
Ignore OPTIMAL TRANSFER LENGTH if it is not a multiple of the device's reported physical block size.
To make the sanity checking conditionals more readable--and to facilitate printing warnings--relocate the checking to a helper function. No functional change aside from the printks.
Cc: <[email protected]>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=199759
--- drivers/scsi/sd.c | 59 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 9 deletions(-)
drivers/scsi/sd.c +50 -9
@@ -3077,6 +3077,55 @@ static void sd_read_security(struct scsi sdkp->security =1 ; } +/* +* Determine the device's preferred I/O size for reads and writes +* unless the reported value is unreasonably small, large, not a +* multiple of the physical block size, or simply garbage. +*/ +static bool sd_validate_opt_xfer_size (struct scsi_disk *sdkp, +unsigned int dev_max) +{ +struct scsi_device *sdp = sdkp->device; +unsigned int opt_xfer_bytes = +logical_to_bytes (sdp, sdkp->opt_xfer_blocks); + +if (sdkp->opt_xfer_blocks > dev_max) { +sd_first_printk (KERN_WARNING , sdkp, +"Optimal transfer size %u logical blocks " \ +"> dev_max (%u logical blocks)\n" , + sdkp->opt_xfer_blocks, dev_max); +return false; + } + +if (sdkp->opt_xfer_blocks >SD_DEF_XFER_BLOCKS ) { +sd_first_printk (KERN_WARNING , sdkp, +"Optimal transfer size %u logical blocks " \ +"> sd driver limit (%u logical blocks)\n" , + sdkp->opt_xfer_blocks,SD_DEF_XFER_BLOCKS ); +return false; + } + +if (opt_xfer_bytes <PAGE_SIZE ) { +sd_first_printk (KERN_WARNING , sdkp, +"Optimal transfer size %u bytes < " \ +"PAGE_SIZE (%u bytes)\n" , + opt_xfer_bytes, (unsigned int )PAGE_SIZE ); +return false; + } + +if (opt_xfer_bytes & (sdkp->physical_block_size -1 )) { +sd_first_printk (KERN_WARNING , sdkp, +"Optimal transfer size %u bytes not a " \ +"multiple of physical block size (%u bytes)\n" , + opt_xfer_bytes, sdkp->physical_block_size); +return false; + } + +sd_first_printk (KERN_INFO , sdkp,"Optimal transfer size %u bytes\n" , + opt_xfer_bytes); +return true; +} +/** * sd_revalidate_disk - called the first time a new disk is seen, * performs disk spin up, read_capacity, etc.
@@ -3146,15 +3195,7 @@ static int sd_revalidate_disk(struct gen dev_max =min_not_zero (dev_max, sdkp->max_xfer_blocks); q->limits.max_dev_sectors =logical_to_sectors (sdp, dev_max); -/* -* Determine the device's preferred I/O size for reads and writes -* unless the reported value is unreasonably small, large, or -* garbage. -*/ -if (sdkp->opt_xfer_blocks && - sdkp->opt_xfer_blocks <= dev_max && - sdkp->opt_xfer_blocks <=SD_DEF_XFER_BLOCKS && -logical_to_bytes (sdp, sdkp->opt_xfer_blocks) >=PAGE_SIZE ) { +if (sd_validate_opt_xfer_size (sdkp, dev_max)) { q->limits.io_opt =logical_to_bytes (sdp, sdkp->opt_xfer_blocks); rw_max =logical_to_sectors (sdp, sdkp->opt_xfer_blocks); }else
Greg Kroah-Hartman
maintainerPATCH 98/183 scsi: target/iscsi: Avoid iscsit_release_commands_from_conn() deadlock
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
commit 32e36bfbcf31452a854263e7c7f32fbefc4b44d8 upstream.
When using SCSI passthrough in combination with the iSCSI target driver then cmd->t_state_lock may be obtained from interrupt context. Hence, all code that obtains cmd->t_state_lock from thread context must disable interrupts first. This patch avoids that lockdep reports the following:
WARNING: inconsistent lock state
4.18.0-dbg+ #1 Not tainted
--------------------------------
inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage.
iscsi_ttx/1800 [HC1[1]:SC0[2]:HE0:SE0] takes:000000006e7b0ceb (&(&cmd->t_state_lock)->rlock){?...}, at: target_complete_cmd+0x47/0x2c0 [target_core_mod] {HARDIRQ-ON-W} state was registered at:
lock_acquire+0xd2/0x260 _raw_spin_lock+0x32/0x50 iscsit_close_connection+0x97e/0x1020 [iscsi_target_mod] iscsit_take_action_for_connection_exit+0x108/0x200 [iscsi_target_mod] iscsi_target_rx_thread+0x180/0x190 [iscsi_target_mod] kthread+0x1cf/0x1f0 ret_from_fork+0x24/0x30 irq event stamp: 1281 hardirqs last enabled at (1279): [<ffffffff970ade79>] __local_bh_enable_ip+0xa9/0x160 hardirqs last disabled at (1281): [<ffffffff97a008a5>] interrupt_entry+0xb5/0xd0 softirqs last enabled at (1278): [<ffffffff977cd9a1>] lock_sock_nested+0x51/0xc0 softirqs last disabled at (1280): [<ffffffffc07a6e04>] ip6_finish_output2+0x124/0xe40 [ipv6]
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
---- lock(&(&cmd->t_state_lock)->rlock);
<Interrupt>
lock(&(&cmd->t_state_lock)->rlock);
--- drivers/target/iscsi/iscsi_target.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/target/iscsi/iscsi_target.c +2 -2
@@ -4077,9 +4077,9 @@ static void iscsit_release_commands_fromstruct se_cmd *se_cmd = &cmd->se_cmd;if (se_cmd->se_tfo !=NULL ) { -spin_lock (&se_cmd->t_state_lock); +spin_lock_irq (&se_cmd->t_state_lock); se_cmd->transport_state |=CMD_T_FABRIC_STOP ; -spin_unlock (&se_cmd->t_state_lock); +spin_unlock_irq (&se_cmd->t_state_lock); } }spin_unlock_bh (&conn->cmd_lock);
Greg Kroah-Hartman
maintainerPATCH 99/183 fs/devpts: always delete dcache dentry-s in dput()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Varad Gautam <[email protected]>
commit 73052b0daee0b750b39af18460dfec683e4f5887 upstream.
d_delete only unhashes an entry if it is reached with dentry->d_lockref.count != 1. Prior to commit 8ead9dd54716 ("devpts:
more pty driver interface cleanups"), d_delete was called on a dentry from devpts_pty_kill with two references held, which would trigger the unhashing, and the subsequent dputs would release it.
Commit 8ead9dd54716 reworked devpts_pty_kill to stop acquiring the second reference from d_find_alias, and the d_delete call left the dentries still on the hashed list without actually ever being dropped from dcache before explicit cleanup. This causes the number of negative dentries for devpts to pile up, and an ls /dev/pts invocation can take seconds to return.
Provide always_delete_dentry() from simple_dentry_operations as .d_delete for devpts, to make the dentry be dropped from dcache.
Without this cleanup, the number of dentries in /dev/pts/ can be grown arbitrarily as:
python -c 'import pty; pty.spawn(["ls", "/dev/pts"])'
A systemtap probe on dcache_readdir to count d_subdirs shows this count to increase with each pty spawn invocation above:
probe kernel.function("dcache_readdir") {
subdirs = &@cast($file->f_path->dentry, "dentry")->d_subdirs;
p = subdirs;
p = @cast(p, "list_head")->next;
i = 0
while (p != subdirs) {
p = @cast(p, "list_head")->next;
i = i+1;
}
printf("number of dentries: %d\n", i);
}--- fs/devpts/inode.c | 1 + 1 file changed, 1 insertion(+)
fs/devpts/inode.c +1 -0
@@ -439,6 +439,7 @@ devpts_fill_super(struct super_block *s, s->s_blocksize_bits =10 ; s->s_magic =DEVPTS_SUPER_MAGIC ; s->s_op = &devpts_sops; + s->s_d_op = &simple_dentry_operations; s->s_time_gran =1 ; error = -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 100/183 splice: dont merge into linked buffers
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jann Horn <[email protected]>
commit a0ce2f0aa6ad97c3d4927bf2ca54bcebdf062d55 upstream.
Before this patch, it was possible for two pipes to affect each other after data had been transferred between them with tee():
============
$ cat tee_test.c
int main(void) {
int pipe_a[2];
if (pipe(pipe_a)) err(1, "pipe");
int pipe_b[2];
if (pipe(pipe_b)) err(1, "pipe");
if (write(pipe_a[1], "abcd", 4) != 4) err(1, "write"); if (tee(pipe_a[0], pipe_b[1], 2, 0) != 2) err(1, "tee"); if (write(pipe_b[1], "xx", 2) != 2) err(1, "write");
char buf[5];
if (read(pipe_a[0], buf, 4) != 4) err(1, "read"); buf[4] = 0;
printf("got back: '%s'\n", buf);
}
$ gcc -o tee_test tee_test.c $ ./tee_test got back: 'abxx' $ ============
As suggested by Al Viro, fix it by creating a separate type for non-mergeable pipe buffers, then changing the types of buffers in splice_pipe_to_pipe() and link_pipe().
--- fs/pipe.c | 14 ++++++++++++++ fs/splice.c | 4 ++++ include/linux/pipe_fs_i.h | 1 + 3 files changed, 19 insertions(+)
fs/pipe.c +14 -0
@@ -239,6 +239,14 @@ static const struct pipe_buf_operations .get = generic_pipe_buf_get, }; +static const struct pipe_buf_operations anon_pipe_buf_nomerge_ops = { + .can_merge =0 , + .confirm = generic_pipe_buf_confirm, + .release = anon_pipe_buf_release, + .steal = anon_pipe_buf_steal, + .get = generic_pipe_buf_get, +}; +static const struct pipe_buf_operations packet_pipe_buf_ops = { .can_merge =0 , .confirm = generic_pipe_buf_confirm,
@@ -247,6 +255,12 @@ static const struct pipe_buf_operations .get = generic_pipe_buf_get, }; +void pipe_buf_mark_unmergeable (struct pipe_buffer *buf) +{ +if (buf->ops == &anon_pipe_buf_ops) + buf->ops = &anon_pipe_buf_nomerge_ops; +} +static ssize_t pipe_read (struct kiocb *iocb,struct iov_iter *to) {
fs/splice.c +4 -0
@@ -1580,6 +1580,8 @@ retry:*/ obuf->flags &= ~PIPE_BUF_FLAG_GIFT ; +pipe_buf_mark_unmergeable (obuf); + obuf->len = len; opipe->nrbufs++; ibuf->offset += obuf->len;
@@ -1654,6 +1656,8 @@ static int link_pipe(struct pipe_inode_i*/ obuf->flags &= ~PIPE_BUF_FLAG_GIFT ; +pipe_buf_mark_unmergeable (obuf); +if (obuf->len > len) obuf->len = len;
include/linux/pipe_fs_i.h +1 -0
@@ -183,6 +183,7 @@ void generic_pipe_buf_get(struct pipe_inint generic_pipe_buf_confirm (struct pipe_inode_info *,struct pipe_buffer *);int generic_pipe_buf_steal (struct pipe_inode_info *,struct pipe_buffer *);void generic_pipe_buf_release (struct pipe_inode_info *,struct pipe_buffer *); +void pipe_buf_mark_unmergeable (struct pipe_buffer *buf);extern const struct pipe_buf_operations nosteal_pipe_buf_ops;
Greg Kroah-Hartman
maintainerPATCH 101/183 m68k: Add -ffreestanding to CFLAGS
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Finn Thain <[email protected]>
commit 28713169d879b67be2ef2f84dcf54905de238294 upstream.
This patch fixes a build failure when using GCC 8.1:
/usr/bin/ld: block/partitions/ldm.o: in function `ldm_parse_tocblock':block/partitions/ldm.c:153: undefined reference to `strcmp'
This is caused by a new optimization which effectively replaces a strncmp() call with a strcmp() call. This affects a number of strncmp() call sites in the kernel.
The entire class of optimizations is avoided with -fno-builtin, which gets enabled by -ffreestanding. This may avoid possible future build failures in case new optimizations appear in future compilers.
I haven't done any performance measurements with this patch but I did count the function calls in a defconfig build. For example, there are now 23 more sprintf() calls and 39 fewer strcpy() calls. The effect on the other libc functions is smaller.
If this harms performance we can tackle that regression by optimizing the call sites, ideally using semantic patches. That way, clang and ICC builds might benfit too.
Cc: [email protected]
Reference: https://marc.info/?l=linux-m68k&m=154514816222244&w=2
--- arch/m68k/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/m68k/Makefile +4 -1
@@ -58,7 +58,10 @@ cpuflags-$(CONFIG_M5206e) := $(call cc-o cpuflags-$(CONFIG_M5206) := $(call cc-option,-mcpu=5206,-m5200) KBUILD_AFLAGS += $(cpuflags-y) -KBUILD_CFLAGS += $(cpuflags-y) -pipe +KBUILD_CFLAGS += $(cpuflags-y) + +KBUILD_CFLAGS += -pipe -ffreestanding + ifdef CONFIG_MMU # without -fno-strength-reduce the 53c7xx.c driver fails ;-( KBUILD_CFLAGS += -fno-strength-reduce -ffixed-a2
Greg Kroah-Hartman
maintainerPATCH 102/183 Btrfs: setup a nofs context for memory allocation at __btrfs_set_acl
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit a0873490660246db587849a9e172f2b7b21fa88a upstream.
We are holding a transaction handle when setting an acl, therefore we can not allocate the xattr value buffer using GFP_KERNEL, as we could deadlock if reclaim is triggered by the allocation, therefore setup a nofs context.
--- fs/btrfs/acl.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/btrfs/acl.c +9 -0
@@ -22,6 +22,7 @@#include <linux/posix_acl_xattr.h> #include <linux/posix_acl.h> #include <linux/sched.h> +#include <linux/sched/mm.h> #include <linux/slab.h> #include "ctree.h"
@@ -89,8 +90,16 @@ static int __btrfs_set_acl(struct btrfs_ }if (acl) { +unsigned int nofs_flag; + size =posix_acl_xattr_size (acl->a_count); +/* +* We're holding a transaction handle, so use a NOFS memory +* allocation context to avoid deadlock if reclaim happens. +*/ + nofs_flag =memalloc_nofs_save (); value =kmalloc (size,GFP_KERNEL ); +memalloc_nofs_restore (nofs_flag);if (!value) { ret = -ENOMEM ; goto out;
Greg Kroah-Hartman
maintainerPATCH 103/183 btrfs: ensure that a DUP or RAID1 block group has exactly two stripes
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Thumshirn <[email protected]>
commit 349ae63f40638a28c6fce52e8447c2d14b84cc0c upstream.
We recently had a customer issue with a corrupted filesystem. When trying to mount this image btrfs panicked with a division by zero in calc_stripe_length().
The corrupt chunk had a 'num_stripes' value of 1. calc_stripe_length() takes this value and divides it by the number of copies the RAID profile is expected to have to calculate the amount of data stripes. As a DUP profile is expected to have 2 copies this division resulted in 1/2 = 0. Later then the 'data_stripes' variable is used as a divisor in the stripe length calculation which results in a division by 0 and thus a kernel panic.
When encountering a filesystem with a DUP block group and a 'num_stripes' value unequal to 2, refuse mounting as the image is corrupted and will lead to unexpected behaviour.
Code inspection showed a RAID1 block group has the same issues.
--- fs/btrfs/volumes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/btrfs/volumes.c +2 -2
@@ -6420,10 +6420,10 @@ static int btrfs_check_chunk_valid(struc }if ((type &BTRFS_BLOCK_GROUP_RAID10 && sub_stripes !=2 ) || - (type &BTRFS_BLOCK_GROUP_RAID1 && num_stripes <1 ) || + (type &BTRFS_BLOCK_GROUP_RAID1 && num_stripes !=2 ) || (type &BTRFS_BLOCK_GROUP_RAID5 && num_stripes <2 ) || (type &BTRFS_BLOCK_GROUP_RAID6 && num_stripes <3 ) || - (type &BTRFS_BLOCK_GROUP_DUP && num_stripes >2 ) || + (type &BTRFS_BLOCK_GROUP_DUP && num_stripes !=2 ) || ((type &BTRFS_BLOCK_GROUP_PROFILE_MASK ) ==0 && num_stripes !=1 )) { btrfs_err(fs_info,
Greg Kroah-Hartman
maintainerPATCH 104/183 Btrfs: fix corruption reading shared and compressed extents after hole punching
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit 8e928218780e2f1cf2f5891c7575e8f0b284fcce upstream.
In the past we had data corruption when reading compressed extents that are shared within the same file and they are consecutive, this got fixed by commit 005efedf2c7d0 ("Btrfs: fix read corruption of compressed and shared extents") and by commit 808f80b46790f ("Btrfs: update fix for read corruption of compressed and shared extents"). However there was a case that was missing in those fixes, which is when the shared and compressed extents are referenced with a non-zero offset. The following shell script creates a reproducer for this issue:
#!/bin/bash
mkfs.btrfs -f /dev/sdc &> /dev/null
mount -o compress /dev/sdc /mnt/sdc
# Create a file with 3 consecutive compressed extents, each has an
# uncompressed size of 128Kb and a compressed size of 4Kb.
for ((i = 1; i <= 3; i++)); do
head -c 4096 /dev/zero
for ((j = 1; j <= 31; j++)); do
head -c 4096 /dev/zero | tr '\0' "\377"
done
done > /mnt/sdc/foobar
syncecho "Digest after file creation: $(md5sum /mnt/sdc/foobar)"
# Clone the first extent into offsets 128K and 256K. xfs_io -c "reflink /mnt/sdc/foobar 0 128K 128K" /mnt/sdc/foobar xfs_io -c "reflink /mnt/sdc/foobar 0 256K 128K" /mnt/sdc/foobar sync
echo "Digest after cloning: $(md5sum /mnt/sdc/foobar)"
# Punch holes into the regions that are already full of zeroes. xfs_io -c "fpunch 0 4K" /mnt/sdc/foobar
xfs_io -c "fpunch 128K 4K" /mnt/sdc/foobar
xfs_io -c "fpunch 256K 4K" /mnt/sdc/foobar
sync
echo "Digest after hole punching: $(md5sum /mnt/sdc/foobar)" echo "Dropping page cache..." sysctl -q vm.drop_caches=1 echo "Digest after hole punching: $(md5sum /mnt/sdc/foobar)"
umount /dev/sdc
When running the script we get the following output:
Digest after file creation: 5a0888d80d7ab1fd31c229f83a3bbcc8 /mnt/sdc/foobar
linked 131072/131072 bytes at offset 131072
128 KiB, 1 ops; 0.0033 sec (36.960 MiB/sec and 295.6830 ops/sec) linked 131072/131072 bytes at offset 262144
128 KiB, 1 ops; 0.0015 sec (78.567 MiB/sec and 628.5355 ops/sec)
Digest after cloning: 5a0888d80d7ab1fd31c229f83a3bbcc8 /mnt/sdc/foobar Digest after hole punching: 5a0888d80d7ab1fd31c229f83a3bbcc8 /mnt/sdc/foobar
Dropping page cache...
Digest after hole punching: fba694ae8664ed0c2e9ff8937e7f1484 /mnt/sdc/foobar
This happens because after reading all the pages of the extent in the range from 128K to 256K for example, we read the hole at offset 256K and then when reading the page at offset 260K we don't submit the existing bio, which is responsible for filling all the page in the range 128K to 256K only, therefore adding the pages from range 260K to 384K to the existing bio and submitting it after iterating over the entire range. Once the bio completes, the uncompressed data fills only the pages in the range 128K to 256K because there's no more data read from disk, leaving the pages in the range 260K to 384K unfilled. It is just a slightly different variant of what was solved by commit 005efedf2c7d0 ("Btrfs: fix read corruption of compressed and shared extents").
Fix this by forcing a bio submit, during readpages(), whenever we find a compressed extent map for a page that is different from the extent map for the previous page or has a different starting offset (in case it's the same compressed extent), instead of the extent map's original start offset.
A test case for fstests follows soon.
--- fs/btrfs/extent_io.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/btrfs/extent_io.c +2 -2
@@ -3014,11 +3014,11 @@ static int __do_readpage(struct extent_i*/ if (test_bit (EXTENT_FLAG_COMPRESSED , &em->flags) && prev_em_start && *prev_em_start != (u64)-1 && - *prev_em_start != em->orig_start) + *prev_em_start != em->start) force_bio_submit = true;if (prev_em_start) - *prev_em_start = em->orig_start; + *prev_em_start = em->start;free_extent_map (em); em =NULL ;
Greg Kroah-Hartman
maintainerPATCH 105/183 crypto: pcbc - remove bogus memcpy()s with src == dest
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit 251b7aea34ba3c4d4fdfa9447695642eb8b8b098 upstream.
The memcpy()s in the PCBC implementation use walk->iv as both the source and destination, which has undefined behavior. These memcpy()'s are actually unneeded, because walk->iv is already used to hold the previous plaintext block XOR'd with the previous ciphertext block. Thus, walk->iv is already updated to its final value.
So remove the broken and unnecessary memcpy()s.
--- crypto/pcbc.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)
crypto/pcbc.c +4 -10
@@ -50,7 +50,7 @@ static int crypto_pcbc_encrypt_segment(sunsigned int nbytes = walk->nbytes;u8 *src = walk->src.virt.addr;u8 *dst = walk->dst.virt.addr; -u8 *iv = walk->iv; +u8 *const iv = walk->iv; do { crypto_xor(iv, src, bsize);
@@ -71,7 +71,7 @@ static int crypto_pcbc_encrypt_inplace(sint bsize =crypto_cipher_blocksize (tfm);unsigned int nbytes = walk->nbytes;u8 *src = walk->src.virt.addr; -u8 *iv = walk->iv; +u8 *const iv = walk->iv;u8 tmpbuf[bsize]; do {
@@ -83,8 +83,6 @@ static int crypto_pcbc_encrypt_inplace(s src += bsize; }while ((nbytes -= bsize) >= bsize); -memcpy (walk->iv, iv, bsize); -return nbytes; }
@@ -120,7 +118,7 @@ static int crypto_pcbc_decrypt_segment(sunsigned int nbytes = walk->nbytes;u8 *src = walk->src.virt.addr;u8 *dst = walk->dst.virt.addr; -u8 *iv = walk->iv; +u8 *const iv = walk->iv; do { crypto_cipher_decrypt_one(tfm, dst, src);
@@ -131,8 +129,6 @@ static int crypto_pcbc_decrypt_segment(s dst += bsize; }while ((nbytes -= bsize) >= bsize); -memcpy (walk->iv, iv, bsize); -return nbytes; }
@@ -143,7 +139,7 @@ static int crypto_pcbc_decrypt_inplace(sint bsize =crypto_cipher_blocksize (tfm);unsigned int nbytes = walk->nbytes;u8 *src = walk->src.virt.addr; -u8 *iv = walk->iv; +u8 *const iv = walk->iv;u8 tmpbuf[bsize]__aligned(__alignof__(u32)) ; do {
@@ -155,8 +151,6 @@ static int crypto_pcbc_decrypt_inplace(s src += bsize; }while ((nbytes -= bsize) >= bsize); -memcpy (walk->iv, iv, bsize); -return nbytes; }
Greg Kroah-Hartman
maintainerPATCH 106/183 libertas_tf: dont set URB_ZERO_PACKET on IN USB transfer
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lubomir Rintel <[email protected]>
commit 607076a904c435f2677fadaadd4af546279db68b upstream.
It doesn't make sense and the USB core warns on each submit of such URB, easily flooding the message buffer with tracebacks.
Analogous issue was fixed in regular libertas driver in commit 6528d8804780 ("libertas: don't set URB_ZERO_PACKET on IN USB transfer").
--- drivers/net/wireless/marvell/libertas_tf/if_usb.c | 2 -- 1 file changed, 2 deletions(-)
drivers/net/wireless/marvell/libertas_tf/if_usb.c +0 -2
@@ -433,8 +433,6 @@ static int __if_usb_submit_rx_urb(structskb_tail_pointer (skb), MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); - cardp->rx_urb->transfer_flags |=URB_ZERO_PACKET ; -lbtf_deb_usb2 (&cardp->udev->dev,"Pointer for rx_urb %p\n" , cardp->rx_urb); ret =usb_submit_urb (cardp->rx_urb,GFP_ATOMIC );
Greg Kroah-Hartman
maintainerPATCH 107/183 irqchip/gic-v3-its: Avoid parsing _indirect_ twice for Device table
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zenghui Yu <[email protected]>
commit 8d565748b6035eeda18895c213396a4c9fac6a4c upstream.
In current logic, its_parse_indirect_baser() will be invoked twice when allocating Device tables. Add a *break* to omit the unnecessary and annoying (might be ...) invoking.
--- drivers/irqchip/irq-gic-v3-its.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/irqchip/irq-gic-v3-its.c +2 -0
@@ -1708,6 +1708,8 @@ static int its_alloc_tables(struct its_n indirect =its_parse_indirect_baser (its, baser, psz, &order, its->device_ids); +break ; +case GITS_BASER_TYPE_VCPU : indirect = its_parse_indirect_baser(its, baser, psz, &order,
Greg Kroah-Hartman
maintainerPATCH 108/183 x86/kprobes: Prohibit probing on optprobe template code
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masami Hiramatsu <[email protected]>
commit 0192e6535ebe9af68614198ced4fd6d37b778ebf upstream.
Prohibit probing on optprobe template code, since it is not a code but a template instruction sequence. If we modify this template, copied template must be broken.
--- arch/x86/kernel/kprobes/opt.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/x86/kernel/kprobes/opt.c +5 -0
@@ -141,6 +141,11 @@ asm (void optprobe_template_func (void );STACK_FRAME_NON_STANDARD (optprobe_template_func); +NOKPROBE_SYMBOL (optprobe_template_func); +NOKPROBE_SYMBOL (optprobe_template_entry); +NOKPROBE_SYMBOL (optprobe_template_val); +NOKPROBE_SYMBOL (optprobe_template_call); +NOKPROBE_SYMBOL (optprobe_template_end);#define TMPL_MOVE_IDX \ ((long)&optprobe_template_val - (long)&optprobe_template_entry)
Greg Kroah-Hartman
maintainerPATCH 109/183 cpufreq: tegra124: add missing of_node_put()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yangtao Li <[email protected]>
commit 446fae2bb5395f3028d8e3aae1508737e5a72ea1 upstream.
of_cpu_device_node_get() will increase the refcount of device_node, it is necessary to call of_node_put() at the end to release the refcount.
--- drivers/cpufreq/tegra124-cpufreq.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/cpufreq/tegra124-cpufreq.c +2 -0
@@ -134,6 +134,8 @@ static int tegra124_cpufreq_probe(structplatform_set_drvdata (pdev, priv); +of_node_put (np); +return 0 ; out_switch_to_pllx:
Greg Kroah-Hartman
maintainerPATCH 110/183 cpufreq: pxa2xx: remove incorrect __init annotation
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 9505b98ccddc454008ca7efff90044e3e857c827 upstream.
pxa_cpufreq_init_voltages() is marked __init but usually inlined into the non-__init pxa_cpufreq_init() function. When building with clang, it can stay as a standalone function in a discarded section, and produce this warning:
WARNING: vmlinux.o(.text+0x616a00): Section mismatch in reference from the function pxa_cpufreq_init() to the function .init.text:pxa_cpufreq_init_voltages() The function pxa_cpufreq_init() references
the function __init pxa_cpufreq_init_voltages().
This is often because pxa_cpufreq_init lacks a __init
annotation or the annotation of pxa_cpufreq_init_voltages is wrong.
--- drivers/cpufreq/pxa2xx-cpufreq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/cpufreq/pxa2xx-cpufreq.c +2 -2
@@ -192,7 +192,7 @@ static int pxa_cpufreq_change_voltage(coreturn ret; } -static void __init pxa_cpufreq_init_voltages (void ) +static void pxa_cpufreq_init_voltages (void ) { vcc_core =regulator_get (NULL ,"vcc_core" );if (IS_ERR (vcc_core)) {
@@ -208,7 +208,7 @@ static int pxa_cpufreq_change_voltage(coreturn 0 ; } -static void __init pxa_cpufreq_init_voltages (void ) { } +static void pxa_cpufreq_init_voltages (void ) { }#endif static void find_freq_tables(struct cpufreq_frequency_table **freq_table,
Greg Kroah-Hartman
maintainerPATCH 111/183 ext4: add mask of ext4 flags to swap
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: yangerkun <[email protected]>
commit abdc644e8cbac2e9b19763680e5a7cf9bab2bee7 upstream.
The reason is that while swapping two inode, we swap the flags too. Some flags such as EXT4_JOURNAL_DATA_FL can really confuse the things since we're not resetting the address operations structure. The simplest way to keep things sane is to restrict the flags that can be swapped.
--- fs/ext4/ext4.h | 3 +++ fs/ext4/ioctl.c | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-)
fs/ext4/ext4.h +3 -0
@@ -426,6 +426,9 @@ struct flex_groups {/* Flags that are appropriate for non-directories/regular files. */ #define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL) +/* The only flags that should be swapped */ +#define EXT4_FL_SHOULD_SWAP (EXT4_HUGE_FILE_FL | EXT4_EXTENTS_FL) +/* Mask out flags that are inappropriate for the given type of inode. */ static inline __u32 ext4_mask_flags (umode_t mode,__u32 flags) {
fs/ext4/ioctl.c +5 -1
@@ -61,6 +61,7 @@ static void swap_inode_data(struct inodeloff_t isize;struct ext4_inode_info *ei1;struct ext4_inode_info *ei2; +unsigned long tmp; ei1 =EXT4_I (inode1); ei2 =EXT4_I (inode2);
@@ -73,7 +74,10 @@ static void swap_inode_data(struct inodeswap (inode1->i_mtime, inode2->i_mtime);memswap (ei1->i_data, ei2->i_data,sizeof (ei1->i_data)); -swap (ei1->i_flags, ei2->i_flags); + tmp = ei1->i_flags &EXT4_FL_SHOULD_SWAP ; + ei1->i_flags = (ei2->i_flags &EXT4_FL_SHOULD_SWAP ) | + (ei1->i_flags & ~EXT4_FL_SHOULD_SWAP ); + ei2->i_flags = tmp | (ei2->i_flags & ~EXT4_FL_SHOULD_SWAP );swap (ei1->i_disksize, ei2->i_disksize);ext4_es_remove_extent (inode1,0 ,EXT_MAX_BLOCKS );ext4_es_remove_extent (inode2,0 ,EXT_MAX_BLOCKS );
Greg Kroah-Hartman
maintainerPATCH 112/183 ext4: fix crash during online resizing
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
commit f96c3ac8dfc24b4e38fc4c2eba5fea2107b929d1 upstream.
When computing maximum size of filesystem possible with given number of group descriptor blocks, we forget to include s_first_data_block into the number of blocks. Thus for filesystems with non-zero s_first_data_block it can happen that computed maximum filesystem size is actually lower than current filesystem size which confuses the code and eventually leads to a BUG_ON in ext4_alloc_group_tables() hitting on flex_gd->count == 0. The problem can be reproduced like:
truncate -s 100g /tmp/image
mkfs.ext4 -b 1024 -E resize=262144 /tmp/image 32768 mount -t ext4 -o loop /tmp/image /mnt resize2fs /dev/loop0 262145
resize2fs /dev/loop0 300000
Fix the problem by properly including s_first_data_block into the computed number of filesystem blocks.
--- fs/ext4/resize.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/ext4/resize.c +2 -1
@@ -1930,7 +1930,8 @@ retry:le16_to_cpu (es->s_reserved_gdt_blocks); n_group = n_desc_blocks *EXT4_DESC_PER_BLOCK (sb); n_blocks_count = (ext4_fsblk_t )n_group * -EXT4_BLOCKS_PER_GROUP (sb); +EXT4_BLOCKS_PER_GROUP (sb) + +le32_to_cpu (es->s_first_data_block); n_group--;/* set to last group number */ }
Greg Kroah-Hartman
maintainerPATCH 113/183 IB/hfi1: Close race condition on user context disable and close
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 bc5add09764c123f58942a37c8335247e683d234 upstream.
When disabling and removing a receive context, it is possible for an asynchronous event (i.e IRQ) to occur. Because of this, there is a race between cleaning up the context, and the context being used by the asynchronous event.
cpu 0 (context cleanup)
rc->ref_count-- (ref_count == 0)
hfi1_rcd_free()
cpu 1 (IRQ (with rcd index))
rcd_get_by_index()
lock
ref_count+++ <-- reference count race (WARNING)
return rcd
unlockcpu 0
hfi1_free_ctxtdata() <-- incorrect free location lock
remove rcd from array
unlock
free rcd
This race will cause the following WARNING trace:
WARNING: CPU: 0 PID: 175027 at include/linux/kref.h:52 hfi1_rcd_get_by_index+0x84/0xa0 [hfi1] CPU: 0 PID: 175027 Comm: IMB-MPI1 Kdump: loaded Tainted: G OE ------------ 3.10.0-957.el7.x86_64 #1 Hardware name: Intel Corporation S2600KP/S2600KP, BIOS SE5C610.86B.11.01.0076.C4.111920150602 11/19/2015 Call Trace: dump_stack+0x19/0x1b __warn+0xd8/0x100 warn_slowpath_null+0x1d/0x20 hfi1_rcd_get_by_index+0x84/0xa0 [hfi1] is_rcv_urgent_int+0x24/0x90 [hfi1] general_interrupt+0x1b6/0x210 [hfi1] __handle_irq_event_percpu+0x44/0x1c0 handle_irq_event_percpu+0x32/0x80 handle_irq_event+0x3c/0x60 handle_edge_irq+0x7f/0x150 handle_irq+0xe4/0x1a0 do_IRQ+0x4d/0xf0 common_interrupt+0x162/0x162
The race can also lead to a use after free which could be similar to:
general protection fault: 0000 1 SMP CPU: 71 PID: 177147 Comm: IMB-MPI1 Kdump: loaded Tainted: G W OE ------------ 3.10.0-957.el7.x86_64 #1 Hardware name: Intel Corporation S2600KP/S2600KP, BIOS SE5C610.86B.11.01.0076.C4.111920150602 11/19/2015 task: ffff9962a8098000 ti: ffff99717a508000 task.ti: ffff99717a508000 __kmalloc+0x94/0x230 Call Trace: ? hfi1_user_sdma_process_request+0x9c8/0x1250 [hfi1] hfi1_user_sdma_process_request+0x9c8/0x1250 [hfi1] hfi1_aio_write+0xba/0x110 [hfi1] do_sync_readv_writev+0x7b/0xd0 do_readv_writev+0xce/0x260 ? handle_mm_fault+0x39d/0x9b0 ? pick_next_task_fair+0x5f/0x1b0 ? sched_clock_cpu+0x85/0xc0 ? __schedule+0x13a/0x890 vfs_writev+0x35/0x60 SyS_writev+0x7f/0x110 system_call_fastpath+0x22/0x27
Use the appropriate kref API to verify access.
Reorder context cleanup to ensure context removal before cleanup occurs correctly.
--- drivers/infiniband/hw/hfi1/hfi.h | 2 +- drivers/infiniband/hw/hfi1/init.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-)
drivers/infiniband/hw/hfi1/hfi.h +1 -1
@@ -1398,7 +1398,7 @@ void hfi1_init_pportdata(struct pci_dev struct hfi1_devdata *dd, u8 hw_pidx, u8 port);void hfi1_free_ctxtdata (struct hfi1_devdata *dd,struct hfi1_ctxtdata *rcd);int hfi1_rcd_put (struct hfi1_ctxtdata *rcd); -void hfi1_rcd_get (struct hfi1_ctxtdata *rcd); +int hfi1_rcd_get (struct hfi1_ctxtdata *rcd);struct hfi1_ctxtdata *hfi1_rcd_get_by_index (struct hfi1_devdata *dd,u16 ctxt);int handle_receive_interrupt (struct hfi1_ctxtdata *rcd,int thread);int handle_receive_interrupt_nodma_rtail (struct hfi1_ctxtdata *rcd,int thread);
drivers/infiniband/hw/hfi1/init.c +9 -5
@@ -215,12 +215,12 @@ static void hfi1_rcd_free(struct kref *kstruct hfi1_ctxtdata *rcd = container_of(kref, struct hfi1_ctxtdata, kref); -hfi1_free_ctxtdata (rcd->dd, rcd); -spin_lock_irqsave (&rcd->dd->uctxt_lock, flags); rcd->dd->rcd[rcd->ctxt] =NULL ;spin_unlock_irqrestore (&rcd->dd->uctxt_lock, flags); +hfi1_free_ctxtdata (rcd->dd, rcd); +kfree (rcd); }
@@ -243,10 +243,13 @@ int hfi1_rcd_put(struct hfi1_ctxtdata *r* @rcd: pointer to an initialized rcd data structure * * Use this to get a reference after the init. +* +* Return : reflect kref_get_unless_zero(), which returns non-zero on +* increment, otherwise 0. */ -void hfi1_rcd_get (struct hfi1_ctxtdata *rcd) +int hfi1_rcd_get (struct hfi1_ctxtdata *rcd) { -kref_get (&rcd->kref); +return kref_get_unless_zero (&rcd->kref); }/**
@@ -305,7 +308,8 @@ struct hfi1_ctxtdata *hfi1_rcd_get_by_inspin_lock_irqsave (&dd->uctxt_lock, flags);if (dd->rcd[ctxt]) { rcd = dd->rcd[ctxt]; -hfi1_rcd_get (rcd); +if (!hfi1_rcd_get (rcd)) + rcd =NULL ; }spin_unlock_irqrestore (&dd->uctxt_lock, flags);
Greg Kroah-Hartman
maintainerPATCH 114/183 cxl: Wrap iterations over afu slices inside afu_list_lock
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vaibhav Jain <[email protected]>
commit edeb304f659792fb5bab90d7d6f3408b4c7301fb upstream.
Within cxl module, iteration over array 'adapter->afu' may be racy at few points as it might be simultaneously read during an EEH and its contents being set to NULL while driver is being unloaded or unbound from the adapter. This might result in a NULL pointer to 'struct afu' being de-referenced during an EEH thereby causing a kernel oops.
This patch fixes this by making sure that all access to the array 'adapter->afu' is wrapped within the context of spin-lock 'adapter->afu_list_lock'.
--- drivers/misc/cxl/guest.c | 2 ++ drivers/misc/cxl/pci.c | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 9 deletions(-)
drivers/misc/cxl/guest.c +2 -0
@@ -267,6 +267,7 @@ static int guest_reset(struct cxl *adaptint i, rc;pr_devel ("Adapter reset request\n" ); +spin_lock (&adapter->afu_list_lock);for (i =0 ; i < adapter->slices; i++) {if ((afu = adapter->afu[i])) { pci_error_handlers(afu, CXL_ERROR_DETECTED_EVENT,
@@ -283,6 +284,7 @@ static int guest_reset(struct cxl *adaptpci_error_handlers (afu,CXL_RESUME_EVENT ,0 ); } } +spin_unlock (&adapter->afu_list_lock);return rc; }
drivers/misc/cxl/pci.c +30 -9
@@ -2050,7 +2050,7 @@ static pci_ers_result_t cxl_vphb_error_d/* There should only be one entry, but go through the list * anyway */ -if (afu->phb ==NULL ) +if (afu ==NULL || afu->phb ==NULL )return result;list_for_each_entry (afu_dev, &afu->phb->bus->devices, bus_list) {
@@ -2077,7 +2077,8 @@ static pci_ers_result_t cxl_pci_error_de {struct cxl *adapter =pci_get_drvdata (pdev);struct cxl_afu *afu; -pci_ers_result_t result =PCI_ERS_RESULT_NEED_RESET , afu_result; +pci_ers_result_t result =PCI_ERS_RESULT_NEED_RESET ; +pci_ers_result_t afu_result =PCI_ERS_RESULT_NEED_RESET ;int i;/* At this point, we could still have an interrupt pending.
@@ -2088,6 +2089,7 @@ static pci_ers_result_t cxl_pci_error_de/* If we're permanently dead, give up. */ if (state == pci_channel_io_perm_failure) { +spin_lock (&adapter->afu_list_lock);for (i =0 ; i < adapter->slices; i++) { afu = adapter->afu[i];/*
@@ -2096,6 +2098,7 @@ static pci_ers_result_t cxl_pci_error_de*/ cxl_vphb_error_detected (afu, state); } +spin_unlock (&adapter->afu_list_lock);return PCI_ERS_RESULT_DISCONNECT ; }
@@ -2177,11 +2180,17 @@ static pci_ers_result_t cxl_pci_error_de* * In slot_reset, free the old resources and allocate new ones. * * In resume, clear the flag to allow things to start. */ + +/* Make sure no one else changes the afu list */ +spin_lock (&adapter->afu_list_lock); +for (i =0 ; i < adapter->slices; i++) { afu = adapter->afu[i]; - afu_result =cxl_vphb_error_detected (afu, state); +if (afu ==NULL ) +continue ; + afu_result =cxl_vphb_error_detected (afu, state);cxl_context_detach_all (afu); cxl_ops->afu_deactivate_mode (afu, afu->current_mode);pci_deconfigure_afu (afu);
@@ -2193,6 +2202,7 @@ static pci_ers_result_t cxl_pci_error_de (result == PCI_ERS_RESULT_NEED_RESET)) result =PCI_ERS_RESULT_NONE ; } +spin_unlock (&adapter->afu_list_lock);/* should take the context lock here */ if (cxl_adapter_context_lock (adapter) !=0 )
@@ -2225,14 +2235,18 @@ static pci_ers_result_t cxl_pci_slot_res*/ cxl_adapter_context_unlock (adapter); +spin_lock (&adapter->afu_list_lock);for (i =0 ; i < adapter->slices; i++) { afu = adapter->afu[i]; +if (afu ==NULL ) +continue ; +if (pci_configure_afu (afu, adapter, pdev)) - goto err; + goto err_unlock;if (cxl_afu_select_best_mode (afu)) - goto err; + goto err_unlock;if (afu->phb ==NULL )continue ;
@@ -2244,16 +2258,16 @@ static pci_ers_result_t cxl_pci_slot_res ctx =cxl_get_context (afu_dev);if (ctx &&cxl_release_context (ctx)) - goto err; + goto err_unlock; ctx =cxl_dev_context_init (afu_dev);if (IS_ERR (ctx)) - goto err; + goto err_unlock; afu_dev->dev.archdata.cxl_ctx = ctx;if (cxl_ops->afu_check_and_enable (afu)) - goto err; + goto err_unlock; afu_dev->error_state = pci_channel_io_normal;
@@ -2274,8 +2288,13 @@ static pci_ers_result_t cxl_pci_slot_res result =PCI_ERS_RESULT_DISCONNECT ; } } + +spin_unlock (&adapter->afu_list_lock);return result; +err_unlock: +spin_unlock (&adapter->afu_list_lock); + err:/* All the bits that happen in both error_detected and cxl_remove * should be idempotent, so we don't need to worry about leaving a mix
@@ -2296,10 +2315,11 @@ static void cxl_pci_resume(struct pci_de* This is not the place to be checking if everything came back up * properly, because there's no return value: do that in slot_reset. */ +spin_lock (&adapter->afu_list_lock);for (i =0 ; i < adapter->slices; i++) { afu = adapter->afu[i]; -if (afu->phb ==NULL ) +if (afu ==NULL || afu->phb ==NULL )continue ;list_for_each_entry (afu_dev, &afu->phb->bus->devices, bus_list) {
@@ -2308,6 +2328,7 @@ static void cxl_pci_resume(struct pci_de afu_dev->driver->err_handler->resume (afu_dev); } } +spin_unlock (&adapter->afu_list_lock); }static const struct pci_error_handlers cxl_err_handler = {
Greg Kroah-Hartman
maintainerPATCH 115/183 ext2: Fix underflow in ext2_max_size()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
commit 1c2d14212b15a60300a2d4f6364753e87394c521 upstream.
When ext2 filesystem is created with 64k block size, ext2_max_size() will return value less than 0. Also, we cannot write any file in this fs since the sb->maxbytes is less than 0. The core of the problem is that the size of block index tree for such large block size is more than i_blocks can carry. So fix the computation to count with this possibility.
File size limits computed with the new function for the full range of possible block sizes look like:
bits file_size
10 17247252480
11 275415851008
12 2196873666560 13 2197948973056 14 2198486220800 15 2198754754560 16 2198888906752
--- fs/ext2/super.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-)
fs/ext2/super.c +26 -15
@@ -754,7 +754,8 @@ static loff_t ext2_max_size(int bits) {loff_t res =EXT2_NDIR_BLOCKS ;int meta_blocks; -loff_t upper_limit; +unsigned int upper_limit; +unsigned int ppb =1 << (bits-2 );/* This is calculated to be the largest file size for a * dense, file such that the total number of
@@ -768,24 +769,34 @@ static loff_t ext2_max_size(int bits)/* total blocks in file system block size */ upper_limit >>= (bits -9 ); - -/* indirect blocks */ - meta_blocks =1 ; -/* double indirect blocks */ - meta_blocks +=1 + (1LL << (bits-2 )); -/* tripple indirect blocks */ - meta_blocks +=1 + (1LL << (bits-2 )) + (1LL << (2 *(bits-2 ))); - - upper_limit -= meta_blocks; - upper_limit <<= bits; - +/* Compute how many blocks we can address by block tree */ res +=1LL << (bits-2 ); res +=1LL << (2 *(bits-2 )); res +=1LL << (3 *(bits-2 )); +/* Does block tree limit file size? */ +if (res < upper_limit) + goto check_lfs; + + res = upper_limit; +/* How many metadata blocks are needed for addressing upper_limit? */ + upper_limit -=EXT2_NDIR_BLOCKS ; +/* indirect blocks */ + meta_blocks =1 ; + upper_limit -= ppb; +/* double indirect blocks */ +if (upper_limit < ppb * ppb) { + meta_blocks +=1 +DIV_ROUND_UP (upper_limit, ppb); + res -= meta_blocks; + goto check_lfs; + } + meta_blocks +=1 + ppb; + upper_limit -= ppb * ppb; +/* tripple indirect blocks for the rest */ + meta_blocks +=1 +DIV_ROUND_UP (upper_limit, ppb) + +DIV_ROUND_UP (upper_limit, ppb*ppb); + res -= meta_blocks; +check_lfs: res <<= bits; -if (res > upper_limit) - res = upper_limit; -if (res >MAX_LFS_FILESIZE ) res =MAX_LFS_FILESIZE ;
Greg Kroah-Hartman
maintainerPATCH 116/183 clk: uniphier: Fix update register for CPU-gear
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kunihiko Hayashi <[email protected]>
commit 521282237b9d78b9bff423ec818becd4c95841c2 upstream.
Need to set the update bit in UNIPHIER_CLK_CPUGEAR_UPD to update the CPU-gear value.
--- drivers/clk/uniphier/clk-uniphier-cpugear.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/uniphier/clk-uniphier-cpugear.c +1 -1
@@ -47,7 +47,7 @@ static int uniphier_clk_cpugear_set_parereturn ret; ret =regmap_write_bits (gear->regmap, - gear->regbase +UNIPHIER_CLK_CPUGEAR_SET , + gear->regbase +UNIPHIER_CLK_CPUGEAR_UPD ,UNIPHIER_CLK_CPUGEAR_UPD_BIT ,UNIPHIER_CLK_CPUGEAR_UPD_BIT );if (ret)
Greg Kroah-Hartman
maintainerPATCH 117/183 clk: clk-twl6040: Fix imprecise external abort for pdmclk
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
commit 5ae51d67aec95f6f9386aa8dd5db424964895575 upstream.
I noticed that modprobe clk-twl6040 can fail after a cold boot with:
abe_cm:clk:0010:0: failed to enable
...
Unhandled fault: imprecise external abort (0x1406) at 0xbe896b20
WARNING: CPU: 1 PID: 29 at drivers/clk/clk.c:828 clk_core_disable_lock+0x18/0x24
...
(clk_core_disable_lock) from [<c0123534>] (_disable_clocks+0x18/0x90) (_disable_clocks) from [<c0124040>] (_idle+0x17c/0x244) (_idle) from [<c0125ad4>] (omap_hwmod_idle+0x24/0x44) (omap_hwmod_idle) from [<c053a038>] (sysc_runtime_suspend+0x48/0x108) (sysc_runtime_suspend) from [<c06084c4>] (__rpm_callback+0x144/0x1d8) (__rpm_callback) from [<c0608578>] (rpm_callback+0x20/0x80) (rpm_callback) from [<c0607034>] (rpm_suspend+0x120/0x694) (rpm_suspend) from [<c0607a78>] (__pm_runtime_idle+0x60/0x84) (__pm_runtime_idle) from [<c053aaf0>] (sysc_probe+0x874/0xf2c) (sysc_probe) from [<c05fecd4>] (platform_drv_probe+0x48/0x98)
After searching around for a similar issue, I came across an earlier fix that never got merged upstream in the Android tree for glass-omap-xrr02. There is patch "MFD: twl6040-codec: Implement PDMCLK cold temp errata" by Misael Lopez Cruz <[email protected]>.
Based on my observations, this fix is also needed when cold booting devices, and not just for deeper idle modes. Since we now have a clock driver for pdmclk, let's fix the issue in twl6040_pdmclk_prepare().
--- drivers/clk/clk-twl6040.c | 53 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-)
drivers/clk/clk-twl6040.c +51 -2
@@ -41,6 +41,43 @@ static int twl6040_pdmclk_is_prepared(streturn pdmclk->enabled; } +static int twl6040_pdmclk_reset_one_clock (struct twl6040_pdmclk *pdmclk, +unsigned int reg) +{ +const u8 reset_mask =TWL6040_HPLLRST ;/* Same for HPPLL and LPPLL */ +int ret; + + ret =twl6040_set_bits (pdmclk->twl6040, reg, reset_mask); +if (ret <0 ) +return ret; + + ret =twl6040_clear_bits (pdmclk->twl6040, reg, reset_mask); +if (ret <0 ) +return ret; + +return 0 ; +} + +/* +* TWL6040A2 Phoenix Audio IC erratum #6: "PDM Clock Generation Issue At +* Cold Temperature". This affects cold boot and deeper idle states it +* seems. The workaround consists of resetting HPPLL and LPPLL. +*/ +static int twl6040_pdmclk_quirk_reset_clocks (struct twl6040_pdmclk *pdmclk) +{ +int ret; + + ret =twl6040_pdmclk_reset_one_clock (pdmclk,TWL6040_REG_HPPLLCTL ); +if (ret) +return ret; + + ret =twl6040_pdmclk_reset_one_clock (pdmclk,TWL6040_REG_LPPLLCTL ); +if (ret) +return ret; + +return 0 ; +} +static int twl6040_pdmclk_prepare (struct clk_hw *hw) { struct twl6040_pdmclk *pdmclk = container_of(hw, struct twl6040_pdmclk,
@@ -48,8 +85,20 @@ static int twl6040_pdmclk_prepare(structint ret; ret =twl6040_power (pdmclk->twl6040,1 ); -if (!ret) - pdmclk->enabled =1 ; +if (ret) +return ret; + + ret =twl6040_pdmclk_quirk_reset_clocks (pdmclk); +if (ret) + goto out_err; + + pdmclk->enabled =1 ; + +return 0 ; + +out_err: +dev_err (pdmclk->dev,"%s: error %i\n" , __func__, ret); +twl6040_power (pdmclk->twl6040,0 );return ret; }
Greg Kroah-Hartman
maintainerPATCH 118/183 clk: ingenic: Fix round_rate misbehaving with non-integer dividers
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Cercueil <[email protected]>
commit bc5d922c93491878c44c9216e9d227c7eeb81d7f upstream.
Take a parent rate of 180 MHz, and a requested rate of 4.285715 MHz. This results in a theorical divider of 41.999993 which is then rounded up to 42. The .round_rate function would then return (180 MHz / 42) as the clock, rounded down, so 4.285714 MHz.
Calling clk_set_rate on 4.285714 MHz would round the rate again, and give a theorical divider of 42,0000028, now rounded up to 43, and the rate returned would be (180 MHz / 43) which is 4.186046 MHz, aka. not what we requested.
Fix this by rounding up the divisions.
--- drivers/clk/ingenic/cgu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/clk/ingenic/cgu.c +5 -5
@@ -364,16 +364,16 @@ ingenic_clk_round_rate(struct clk_hw *hwstruct ingenic_clk *ingenic_clk =to_ingenic_clk (hw);struct ingenic_cgu *cgu = ingenic_clk->cgu;const struct ingenic_cgu_clk_info *clk_info; -long rate = *parent_rate; +unsigned int div =1 ; clk_info = &cgu->clock_info[ingenic_clk->idx];if (clk_info->type &CGU_CLK_DIV ) - rate /=ingenic_clk_calc_div (clk_info, *parent_rate, req_rate); + div =ingenic_clk_calc_div (clk_info, *parent_rate, req_rate);else if (clk_info->type &CGU_CLK_FIXDIV ) - rate /= clk_info->fixdiv.div; + div = clk_info->fixdiv.div; -return rate; +return DIV_ROUND_UP (*parent_rate, div); } static int
@@ -393,7 +393,7 @@ ingenic_clk_set_rate(struct clk_hw *hw,if (clk_info->type &CGU_CLK_DIV ) { div =ingenic_clk_calc_div (clk_info, parent_rate, req_rate); - rate = parent_rate / div; + rate =DIV_ROUND_UP (parent_rate, div);if (rate != req_rate)return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 119/183 clk: ingenic: Fix doc of ingenic_cgu_div_info
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Cercueil <[email protected]>
commit 7ca4c922aad2e3c46767a12f80d01c6b25337b59 upstream.
The 'div' field does not represent a number of bits used to divide (understand: right-shift) the divider, but a number itself used to divide the divider.
--- drivers/clk/ingenic/cgu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/ingenic/cgu.h +1 -1
@@ -78,7 +78,7 @@ struct ingenic_cgu_mux_info {* @reg: offset of the divider control register within the CGU * @shift: number of bits to left shift the divide value by (ie. the index of * the lowest bit of the divide value within its control register) -* @div: number of bits to divide the divider value by (i.e. if the +* @div: number to divide the divider value by (i.e. if the * effective divider value is the value written to the register * multiplied by some constant) * @bits: the size of the divide value in bits
Greg Kroah-Hartman
maintainerPATCH 120/183 usb: chipidea: tegra: Fix missed ci_hdrc_remove_device()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Osipenko <[email protected]>
commit 563b9372f7ec57e44e8f9a8600c5107d7ffdd166 upstream.
The ChipIdea's platform device need to be unregistered on Tegra's driver module removal.
--- drivers/usb/chipidea/ci_hdrc_tegra.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/chipidea/ci_hdrc_tegra.c +1 -0
@@ -133,6 +133,7 @@ static int tegra_udc_remove(struct platf {struct tegra_udc *udc =platform_get_drvdata (pdev); +ci_hdrc_remove_device (udc->dev);usb_phy_set_suspend (udc->phy,1 );clk_disable_unprepare (udc->clk);
Greg Kroah-Hartman
maintainerPATCH 121/183 nfit: acpi_nfit_ctl(): Check out_obj->type in the right place
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dexuan Cui <[email protected]>
commit 43f89877f26671c6309cd87d7364b1a3e66e71cf upstream.
In the case of ND_CMD_CALL, we should also check out_obj->type.
The patch uses out_obj->type, which is a short alias to out_obj->package.type.
--- drivers/acpi/nfit/core.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/acpi/nfit/core.c +7 -7
@@ -329,6 +329,13 @@ int acpi_nfit_ctl(struct nvdimm_bus_descreturn -EINVAL ; } +if (out_obj->type !=ACPI_TYPE_BUFFER ) { +dev_dbg (dev,"%s unexpected output object type cmd: %s type: %d\n" , + dimm_name, cmd_name, out_obj->type); + rc = -EINVAL ; + goto out; + } +if (call_pkg) { call_pkg->nd_fw_size = out_obj->buffer.length; memcpy(call_pkg->nd_payload + call_pkg->nd_size_in,
@@ -347,13 +354,6 @@ int acpi_nfit_ctl(struct nvdimm_bus_descreturn 0 ; } -if (out_obj->package.type !=ACPI_TYPE_BUFFER ) { -dev_dbg (dev,"%s:%s unexpected output object type cmd: %s type: %d\n" , - __func__, dimm_name, cmd_name, out_obj->type); - rc = -EINVAL ; - goto out; - } -dev_dbg (dev,"%s:%s cmd: %s output length: %d\n" , __func__, dimm_name, cmd_name, out_obj->buffer.length); print_hex_dump_debug(cmd_name, DUMP_PREFIX_OFFSET, 4, 4,
Greg Kroah-Hartman
maintainerPATCH 122/183 mm: hwpoison: fix thp split handing in soft_offline_in_use_page()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: zhongjiang <[email protected]>
commit 46612b751c4941c5c0472ddf04027e877ae5990f upstream.
When soft_offline_in_use_page() runs on a thp tail page after pmd is split, we trigger the following VM_BUG_ON_PAGE():
Memory failure: 0x3755ff: non anonymous thp
__get_any_page: 0x3755ff: unknown zero refcount page type 2fffff80000000 Soft offlining pfn 0x34d805 at process virtual address 0x20fff000 page:ffffea000d360140 count:0 mapcount:0 mapping:0000000000000000 index:0x1
flags: 0x2fffff80000000()
raw: 002fffff80000000 ffffea000d360108 ffffea000d360188 0000000000000000 raw: 0000000000000001 0000000000000000 00000000ffffffff 0000000000000000 page dumped because: VM_BUG_ON_PAGE(page_ref_count(page) == 0) ------------[ cut here ]------------ kernel BUG at ./include/linux/mm.h:519!
soft_offline_in_use_page() passed refcount and page lock from tail page to head page, which is not needed because we can pass any subpage to split_huge_page().
Naoya had fixed a similar issue in c3901e722b29 ("mm: hwpoison: fix thp split handling in memory_failure()"). But he missed fixing soft offline.
--- mm/memory-failure.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
mm/memory-failure.c +6 -8
@@ -1701,19 +1701,17 @@ static int soft_offline_in_use_page(strustruct page *hpage =compound_head (page);if (!PageHuge (page) &&PageTransHuge (hpage)) { -lock_page (hpage); -if (!PageAnon (hpage) ||unlikely (split_huge_page (hpage))) { -unlock_page (hpage); -if (!PageAnon (hpage)) +lock_page (page); +if (!PageAnon (page) ||unlikely (split_huge_page (page))) { +unlock_page (page); +if (!PageAnon (page))pr_info ("soft offline: %#lx: non anonymous thp\n" ,page_to_pfn (page));else pr_info ("soft offline: %#lx: thp split failed\n" ,page_to_pfn (page)); -put_hwpoison_page (hpage); +put_hwpoison_page (page);return -EBUSY ; } -unlock_page (hpage); -get_hwpoison_page (page); -put_hwpoison_page (hpage); +unlock_page (page); }if (PageHuge (page))
Greg Kroah-Hartman
maintainerPATCH 123/183 mm/vmalloc: fix size check for remap_vmalloc_range_partial()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roman Penyaev <[email protected]>
commit 401592d2e095947344e10ec0623adbcd58934dd4 upstream.
When VM_NO_GUARD is not set area->size includes adjacent guard page, thus for correct size checking get_vm_area_size() should be used, but not area->size.
This fixes possible kernel oops when userspace tries to mmap an area on 1 page bigger than was allocated by vmalloc_user() call: the size check inside remap_vmalloc_range_partial() accounts non-existing guard page also, so check successfully passes but vmalloc_to_page() returns NULL (guard page does not physically exist).
The following code pattern example should trigger an oops:
static int oops_mmap(struct file *file, struct vm_area_struct *vma)
{
void *mem; mem = vmalloc_user(4096);
BUG_ON(!mem);
/* Do not care about mem leak */
return remap_vmalloc_range(vma, mem, 0);}
And userspace simply mmaps size + PAGE_SIZE:
mmap(NULL, 8192, PROT_WRITE|PROT_READ, MAP_PRIVATE, fd, 0);
Possible candidates for oops which do not have any explicit size checks:
*** drivers/media/usb/stkwebcam/stk-webcam.c: v4l_stk_mmap[789] ret = remap_vmalloc_range(vma, sbuf->buffer, 0);
Or the following one:
*** drivers/video/fbdev/core/fbmem.c
static int
fb_mmap(struct file *file, struct vm_area_struct * vma)
...
res = fb->fb_mmap(info, vma);Where fb_mmap callback calls remap_vmalloc_range() directly without any explicit checks:
*** drivers/video/fbdev/vfb.c
static int vfb_mmap(struct fb_info *info,
struct vm_area_struct *vma)
{
return remap_vmalloc_range(vma, (void *)info->fix.smem_start, vma->vm_pgoff);
}--- mm/vmalloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/vmalloc.c +1 -1
@@ -2262,7 +2262,7 @@ int remap_vmalloc_range_partial(struct vif (!(area->flags &VM_USERMAP ))return -EINVAL ; -if (kaddr + size > area->addr + area->size) +if (kaddr + size > area->addr +get_vm_area_size (area))return -EINVAL ; do {
Greg Kroah-Hartman
maintainerPATCH 124/183 kernel/sysctl.c: add missing range check in do_proc_dointvec_minmax_conv
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zev Weiss <[email protected]>
commit 8cf7630b29701d364f8df4a50e4f1f5e752b2778 upstream.
This bug has apparently existed since the introduction of this function in the pre-git era (4500e91754d3 in Thomas Gleixner's history.git, "[NET]: Add proc_dointvec_userhz_jiffies, use it for proper handling of neighbour sysctls.").
As a minimal fix we can simply duplicate the corresponding check in do_proc_dointvec_conv().
--- kernel/sysctl.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
kernel/sysctl.c +10 -1
@@ -2530,7 +2530,16 @@ static int do_proc_dointvec_minmax_conv( {struct do_proc_dointvec_minmax_conv_param *param = data;if (write) { -int val = *negp ? -*lvalp : *lvalp; +int val; +if (*negp) { +if (*lvalp > (unsigned long )INT_MAX +1 ) +return -EINVAL ; + val = -*lvalp; + }else { +if (*lvalp > (unsigned long )INT_MAX ) +return -EINVAL ; + val = *lvalp; + }if ((param->min && *param->min > val) || (param->max && *param->max < val))return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 125/183 device property: Fix the length used in PROPERTY_ENTRY_STRING()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heikki Krogerus <[email protected]>
commit 2b6e492467c78183bb629bb0a100ea3509b615a5 upstream.
With string type property entries we need to use sizeof(const char *) instead of the number of characters as the length of the entry.
If the string was shorter then sizeof(const char *), attempts to read it would have failed with -EOVERFLOW. The problem has been hidden because all build-in string properties have had a string longer then 8 characters until now.
--- include/linux/property.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/property.h +1 -1
@@ -252,7 +252,7 @@ struct property_entry {#define PROPERTY_ENTRY_STRING (_name_, _val_) \ (struct property_entry) { \ .name = _name_, \ - .length = sizeof(_val_), \ + .length = sizeof(const char *), \ .is_string = true, \ { .value = { .str = _val_ } }, \ }
Greg Kroah-Hartman
maintainerPATCH 126/183 intel_th: Dont reference unassigned outputs
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Shishkin <[email protected]>
commit 9ed3f22223c33347ed963e7c7019cf2956dd4e37 upstream.
When an output port driver is removed, also remove references to it from any masters. Failing to do this causes a NULL ptr dereference when configuring another output port:
Quoted 8 lines
BUG: unable to handle kernel NULL pointer dereference at 000000000000000d RIP: 0010:master_attr_store+0x9d/0x160 [intel_th_gth] Call Trace: dev_attr_store+0x1b/0x30 sysfs_kf_write+0x3c/0x50 kernfs_fop_write+0x125/0x1a0 __vfs_write+0x3a/0x190 ? __vfs_write+0x5/0x190
Quoted 8 lines
? _cond_resched+0x1a/0x50 ? rcu_all_qs+0x5/0xb0 ? __vfs_write+0x5/0x190 vfs_write+0xb8/0x1b0 ksys_write+0x55/0xc0 __x64_sys_write+0x1a/0x20 do_syscall_64+0x5a/0x140 entry_SYSCALL_64_after_hwframe+0x44/0xa9
--- drivers/hwtracing/intel_th/gth.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/hwtracing/intel_th/gth.c +4 -0
@@ -615,6 +615,7 @@ static void intel_th_gth_unassign(struct {struct gth_device *gth =dev_get_drvdata (&thdev->dev);int port = othdev->output.port; +int master;if (thdev->host_mode)return ;
@@ -623,6 +624,9 @@ static void intel_th_gth_unassign(struct othdev->output.port =-1 ; othdev->output.active = false; gth->output[port].output =NULL ; +for (master =0 ; master <TH_CONFIGURABLE_MASTERS ; master++) +if (gth->master[master] == port) + gth->master[master] =-1 ;spin_unlock (>h->gth_lock); }
Greg Kroah-Hartman
maintainerPATCH 127/183 parport_pc: fix find_superio io compare code, should use equal test.
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: QiaoChong <[email protected]>
commit 21698fd57984cd28207d841dbdaa026d6061bceb upstream.
In the original code before 181bf1e815a2 the loop was continuing until it finds the first matching superios[i].io and p->base.
But after 181bf1e815a2 the logic changed and the loop now returns the pointer to the first mismatched array element which is then used in get_superio_dma() and get_superio_irq() and thus returning the wrong value.
Fix the condition so that it now returns the correct pointer.
--- drivers/parport/parport_pc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/parport/parport_pc.c +1 -1
@@ -1377,7 +1377,7 @@ static struct superio_struct *find_super {int i;for (i =0 ; i <NR_SUPERIOS ; i++) -if (superios[i].io != p->base) +if (superios[i].io == p->base)return &superios[i];return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 128/183 i2c: tegra: fix maximum transfer size
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sowjanya Komatineni <[email protected]>
commit f4e3f4ae1d9c9330de355f432b69952e8cef650c upstream.
Tegra186 and prior supports maximum 4K bytes per packet transfer including 12 bytes of packet header.
This patch fixes max write length limit to account packet header size for transfers.
--- drivers/i2c/busses/i2c-tegra.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-tegra.c +1 -1
@@ -794,7 +794,7 @@ static const struct i2c_algorithm tegra_/* payload size is only 12 bit */ static const struct i2c_adapter_quirks tegra_i2c_quirks = { .max_read_len =4096 , - .max_write_len =4096 , + .max_write_len =4096 -12 , };static const struct tegra_i2c_hw_feature tegra20_i2c_hw = {
Greg Kroah-Hartman
maintainerPATCH 129/183 crypto: arm64/aes-neonbs - fix returning final keystream block
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit 12455e320e19e9cc7ad97f4ab89c280fe297387c upstream.
The arm64 NEON bit-sliced implementation of AES-CTR fails the improved skcipher tests because it sometimes produces the wrong ciphertext. The bug is that the final keystream block isn't returned from the assembly code when the number of non-final blocks is zero. This can happen if the input data ends a few bytes after a page boundary. In this case the last bytes get "encrypted" by XOR'ing them with uninitialized memory.
Fix the assembly code to return the final keystream block when needed.
--- arch/arm64/crypto/aes-neonbs-core.S | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/arm64/crypto/aes-neonbs-core.S +4 -1
@@ -940,7 +940,7 @@ CPU_LE( rev x8, x8 ) 8: next_ctr v0 cbnz x4, 99b -0: st1 {v0.16b}, [x5] + st1 {v0.16b}, [x5] ldp x29, x30, [sp], #16 ret
@@ -948,6 +948,9 @@ CPU_LE( rev x8, x8 ) * If we are handling the tail of the input (x6 != NULL), return the * final keystream block back to the caller. */ +0: cbz x6, 8b + st1 {v0.16b}, [x6] + b 8b 1: cbz x6, 8b st1 {v1.16b}, [x6] b 8b
Greg Kroah-Hartman
maintainerPATCH 130/183 drm/i915: Relax mmap VMA check
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ca22f32a6296cbfa29de56328c8505560a18cfa8 ]
Legacy behaviour was to allow non-page-aligned mmap requests, as does the linux mmap(2) implementation by virtue of automatically rounding up for the caller.
To avoid breaking legacy userspace relax the newly introduced fix.
--- drivers/gpu/drm/i915/i915_gem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_gem.c +2 -1
@@ -1640,7 +1640,8 @@ __vma_matches(struct vm_area_struct *vmaif (vma->vm_file != filp)return false; -return vma->vm_start == addr && (vma->vm_end - vma->vm_start) == size; +return vma->vm_start == addr && + (vma->vm_end - vma->vm_start) ==PAGE_ALIGN (size); }/**
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Greg Kroah-Hartman
maintainerPATCH 131/183 serial: uartps: Fix stuck ISR if RX disabled with non-empty FIFO
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anssi Hannula <[email protected]>
commit 7abab1605139bc41442864c18f9573440f7ca105 upstream.
If RX is disabled while there are still unprocessed bytes in RX FIFO, cdns_uart_handle_rx() called from interrupt handler will get stuck in the receive loop as read bytes will not get removed from the RX FIFO and CDNS_UART_SR_RXEMPTY bit will never get set.
Avoid the stuck handler by checking first if RX is disabled. port->lock protects against race with RX-disabling functions.
This HW behavior was mentioned by Nathan Rossi in 43e98facc4a3 ("tty:
xuartps: Fix RX hang, and TX corruption in termios call") which fixed a similar issue in cdns_uart_set_termios().
The behavior can also be easily verified by e.g. setting CDNS_UART_CR_RX_DIS at the beginning of cdns_uart_handle_rx() - the following loop will then get stuck.
Resetting the FIFO using RXRST would not set RXEMPTY either so simply issuing a reset after RX-disable would not work.
I observe this frequently on a ZynqMP board during heavy RX load at 1M baudrate when the reader process exits and thus RX gets disabled.
--- drivers/tty/serial/xilinx_uartps.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/tty/serial/xilinx_uartps.c +7 -1
@@ -366,7 +366,13 @@ static irqreturn_t cdns_uart_isr(int irqcdns_uart_handle_tx (dev_id); isrstatus &= ~CDNS_UART_IXR_TXEMPTY ; } -if (isrstatus &CDNS_UART_IXR_RXMASK ) + +/* +* Skip RX processing if RX is disabled as RXEMPTY will never be set +* as read bytes will not be removed from the FIFO. +*/ +if (isrstatus &CDNS_UART_IXR_RXMASK && + !(readl (port->membase +CDNS_UART_CR ) &CDNS_UART_CR_RX_DIS ))cdns_uart_handle_rx (dev_id, isrstatus);spin_unlock (&port->lock);
Greg Kroah-Hartman
maintainerPATCH 132/183 serial: 8250_of: assume reg-shift of 2 for mrvl,mmp-uart
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lubomir Rintel <[email protected]>
commit f4817843e39ce78aace0195a57d4e8500a65a898 upstream.
There are two other drivers that bind to mrvl,mmp-uart and both of them assume register shift of 2 bits. There are device trees that lack the property and rely on that assumption.
If this driver wins the race to bind to those devices, it should behave the same as the older deprecated driver.
--- drivers/tty/serial/8250/8250_of.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/tty/serial/8250/8250_of.c +4 -0
@@ -105,6 +105,10 @@ static int of_platform_serial_setup(struif (of_property_read_u32 (np,"reg-offset" , &prop) ==0 ) port->mapbase += prop; +/* Compatibility with the deprecated pxa driver and 8250_pxa drivers. */ +if (of_device_is_compatible (np,"mrvl,mmp-uart" )) + port->regshift =2 ; +/* Check for registers offset within the devices address range */ if (of_property_read_u32 (np,"reg-shift" , &prop) ==0 ) port->regshift = prop;
Greg Kroah-Hartman
maintainerPATCH 133/183 serial: 8250_pci: Fix number of ports for ACCES serial cards
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jay Dolan <[email protected]>
commit b896b03bc7fce43a07012cc6bf5e2ab2fddf3364 upstream.
Have the correct number of ports created for ACCES serial cards. Two port cards show up as four ports, and four port cards show up as eight.
--- drivers/tty/serial/8250/8250_pci.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-)
drivers/tty/serial/8250/8250_pci.c +18 -18
@@ -4580,10 +4580,10 @@ static const struct pci_device_id serial*/ {PCI_VENDOR_ID_ACCESIO ,PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_pericom_PI7C9X7954 },
@@ -4592,10 +4592,10 @@ static const struct pci_device_id serial pbn_pericom_PI7C9X7954 }, {PCI_VENDOR_ID_ACCESIO ,PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_pericom_PI7C9X7954 },
@@ -4604,10 +4604,10 @@ static const struct pci_device_id serial pbn_pericom_PI7C9X7954 }, {PCI_VENDOR_ID_ACCESIO ,PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_pericom_PI7C9X7954 },
@@ -4616,13 +4616,13 @@ static const struct pci_device_id serial pbn_pericom_PI7C9X7954 }, {PCI_VENDOR_ID_ACCESIO ,PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7951 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_pericom_PI7C9X7954 },
@@ -4631,16 +4631,16 @@ static const struct pci_device_id serial pbn_pericom_PI7C9X7954 }, {PCI_VENDOR_ID_ACCESIO ,PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_pericom_PI7C9X7954 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_pericom_PI7C9X7954 },
@@ -4649,13 +4649,13 @@ static const struct pci_device_id serial pbn_pericom_PI7C9X7954 }, {PCI_VENDOR_ID_ACCESIO ,PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7954 }, + pbn_pericom_PI7C9X7952 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7958 }, + pbn_pericom_PI7C9X7954 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7958 }, + pbn_pericom_PI7C9X7954 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_pericom_PI7C9X7958 },
@@ -4664,19 +4664,19 @@ static const struct pci_device_id serial pbn_pericom_PI7C9X7958 }, {PCI_VENDOR_ID_ACCESIO ,PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7958 }, + pbn_pericom_PI7C9X7954 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_pericom_PI7C9X7958 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7958 }, + pbn_pericom_PI7C9X7954 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , pbn_pericom_PI7C9X7958 }, { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , - pbn_pericom_PI7C9X7958 }, + pbn_pericom_PI7C9X7954 },/* * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke) */
Greg Kroah-Hartman
maintainerPATCH 134/183 serial: 8250_pci: Have ACCES cards that use the four port Pericom PI7C9X7954 chip use the pci_pericom_setup()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jay Dolan <[email protected]>
commit 78d3820b9bd39028727c6aab7297b63c093db343 upstream.
The four port Pericom chips have the fourth port at the wrong address. Make use of quirk to fix it.
--- drivers/tty/serial/8250/8250_pci.c | 105 +++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+)
drivers/tty/serial/8250/8250_pci.c +105 -0
@@ -2033,6 +2033,111 @@ static struct pci_serial_quirk pci_seria .setup = pci_default_setup, .exit = pci_plx9050_exit, }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S, + .device = PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, + { + .vendor = PCI_VENDOR_ID_ACCESIO, + .device = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .setup = pci_pericom_setup, + }, /* * SBS Technologies, Inc., PMC-OCTALPRO 232 */
Greg Kroah-Hartman
maintainerPATCH 135/183 jbd2: clear dirty flag when revoking a buffer from an older transaction
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: zhangyi (F) <[email protected]>
commit 904cdbd41d749a476863a0ca41f6f396774f26e4 upstream.
Now, we capture a data corruption problem on ext4 while we're truncating an extent index block. Imaging that if we are revoking a buffer which has been journaled by the committing transaction, the buffer's jbddirty flag will not be cleared in jbd2_journal_forget(), so the commit code will set the buffer dirty flag again after refile the buffer.
fsx kjournald2
jbd2_journal_commit_transactionjbd2_journal_revoke commit phase 1~5...
jbd2_journal_forget
belongs to older transaction commit phase 6
jbddirty not clear __jbd2_journal_refile_buffer
__jbd2_journal_unfile_buffer
test_clear_buffer_jbddirty
mark_buffer_dirty
Finally, if the freed extent index block was allocated again as data block by some other files, it may corrupt the file data after writing cached pages later, such as during unmount time. (In general, clean_bdev_aliases() related helpers should be invoked after re-allocation to prevent the above corruption, but unfortunately we missed it when zeroout the head of extra extent blocks in ext4_ext_handle_unwritten_extents()).
This patch mark buffer as freed and set j_next_transaction to the new transaction when it already belongs to the committing transaction in jbd2_journal_forget(), so that commit code knows it should clear dirty bits when it is done with the buffer.
This problem can be reproduced by xfstests generic/455 easily with seeds (3246 3247 3248 3249).
--- fs/jbd2/transaction.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
fs/jbd2/transaction.c +12 -5
@@ -1581,14 +1581,21 @@ int jbd2_journal_forget (handle_t *handl/* However, if the buffer is still owned by a prior * (committing) transaction, we can't drop it yet... */ JBUFFER_TRACE (jh,"belongs to older transaction" ); -/* ... but we CAN drop it from the new transaction if we -* have also modified it since the original commit. */ +/* ... but we CAN drop it from the new transaction through +* marking the buffer as freed and set j_next_transaction to +* the new transaction, so that not only the commit code +* knows it should clear dirty bits when it is done with the +* buffer, but also the buffer can be checkpointed only +* after the new transaction commits. */ -if (jh->b_next_transaction) { -J_ASSERT (jh->b_next_transaction == transaction); +set_buffer_freed (bh); + +if (!jh->b_next_transaction) {spin_lock (&journal->j_list_lock); - jh->b_next_transaction =NULL ; + jh->b_next_transaction = transaction;spin_unlock (&journal->j_list_lock); + }else { +J_ASSERT (jh->b_next_transaction == transaction);/* * only drop a reference if this transaction modified
Greg Kroah-Hartman
maintainerPATCH 136/183 jbd2: fix compile warning when using JBUFFER_TRACE
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: zhangyi (F) <[email protected]>
commit 01215d3edb0f384ddeaa5e4a22c1ae5ff634149f upstream.
The jh pointer may be used uninitialized in the two cases below and the compiler complain about it when enabling JBUFFER_TRACE macro, fix them.
In file included from fs/jbd2/transaction.c:19:0:fs/jbd2/transaction.c: In function ‘jbd2_journal_get_undo_access’:./include/linux/jbd2.h:1637:38: warning: ‘jh’ is used uninitialized in this function [-Wuninitialized]
#define JBUFFER_TRACE(jh, info) do { printk("%s: %d\n", __func__, jh->b_jcount);} while (0)
^
fs/jbd2/transaction.c:1219:23: note: ‘jh’ was declared here
struct journal_head *jh;
^
In file included from fs/jbd2/transaction.c:19:0:
fs/jbd2/transaction.c: In function ‘jbd2_journal_dirty_metadata’:
./include/linux/jbd2.h:1637:38: warning: ‘jh’ may be used uninitialized in this function [-Wmaybe-uninitialized]
#define JBUFFER_TRACE(jh, info) do { printk("%s: %d\n", __func__, jh->b_jcount);} while (0)
^
fs/jbd2/transaction.c:1332:23: note: ‘jh’ was declared here
struct journal_head *jh;
^--- fs/jbd2/transaction.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
fs/jbd2/transaction.c +8 -8
@@ -1224,11 +1224,12 @@ int jbd2_journal_get_undo_access(handle_struct journal_head *jh;char *committed_data =NULL ; -JBUFFER_TRACE (jh,"entry" );if (jbd2_write_access_granted (handle, bh, true))return 0 ; jh =jbd2_journal_add_journal_head (bh); +JBUFFER_TRACE (jh,"entry" ); +/* * Do this first --- it can drop the journal lock, so we want to * make sure that obtaining the committed_data is done
@@ -1339,15 +1340,17 @@ int jbd2_journal_dirty_metadata(handle_tif (is_handle_aborted (handle))return -EROFS ; -if (!buffer_jbd (bh)) { - ret = -EUCLEAN ; - goto out; - } +if (!buffer_jbd (bh)) +return -EUCLEAN ; +/* * We don't grab jh reference here since the buffer must be part * of the running transaction. */ jh =bh2jh (bh); +jbd_debug (5 ,"journal_head %p\n" , jh); +JBUFFER_TRACE (jh,"entry" ); +/* * This and the following assertions are unreliable since we may see jh * in inconsistent state unless we grab bh_state lock. But this is
@@ -1381,9 +1384,6 @@ int jbd2_journal_dirty_metadata(handle_t } journal = transaction->t_journal; -jbd_debug (5 ,"journal_head %p\n" , jh); -JBUFFER_TRACE (jh,"entry" ); -jbd_lock_bh_state (bh);if (jh->b_modified ==0 ) {
Greg Kroah-Hartman
maintainerPATCH 137/183 security/selinux: fix SECURITY_LSM_NATIVE_LABELS on reused superblock
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: J. Bruce Fields <[email protected]>
commit 3815a245b50124f0865415dcb606a034e97494d4 upstream.
In the case when we're reusing a superblock, selinux_sb_clone_mnt_opts() fails to set set_kern_flags, with the result that nfs_clone_sb_security() incorrectly clears NFS_CAP_SECURITY_LABEL.
The result is that if you mount the same NFS filesystem twice, NFS security labels are turned off, even if they would work fine if you mounted the filesystem only once.
("fixes" may be not exactly the right tag, it may be more like "fixed-other-cases-but-missed-this-one".)
--- security/selinux/hooks.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
security/selinux/hooks.c +4 -1
@@ -1000,8 +1000,11 @@ static int selinux_sb_clone_mnt_opts(conBUG_ON (!(oldsbsec->flags &SE_SBINITIALIZED ));/* if fs is reusing a sb, make sure that the contexts match */ -if (newsbsec->flags &SE_SBINITIALIZED ) +if (newsbsec->flags &SE_SBINITIALIZED ) { +if ((kern_flags &SECURITY_LSM_NATIVE_LABELS ) && !set_context) + *set_kern_flags |=SECURITY_LSM_NATIVE_LABELS ;return selinux_cmp_sb_context (oldsb, newsb); + }mutex_lock (&newsbsec->lock);
Greg Kroah-Hartman
maintainerPATCH 138/183 powerpc/32: Clear on-stack exception marker upon exception return
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
commit 9580b71b5a7863c24a9bd18bcd2ad759b86b1eff upstream.
Clear the on-stack STACK_FRAME_REGS_MARKER on exception exit in order to avoid confusing stacktrace like the one below.
Call Trace:
[c0e9dca0] [c01c42a0] print_address_description+0x64/0x2bc (unreliable)
[c0e9dcd0] [c01c4684] kasan_report+0xfc/0x180
[c0e9dd10] [c0895130] memchr+0x24/0x74
[c0e9dd30] [c00a9e38] msg_print_text+0x124/0x574
[c0e9dde0] [c00ab710] console_unlock+0x114/0x4f8
[c0e9de40] [c00adc60] vprintk_emit+0x188/0x1c4
--- interrupt: c0e9df00 at 0x400f330
LR = init_stack+0x1f00/0x2000
[c0e9de80] [c00ae3c4] printk+0xa8/0xcc (unreliable)
[c0e9df20] [c0c27e44] early_irq_init+0x38/0x108
[c0e9df50] [c0c15434] start_kernel+0x310/0x488
[c0e9dff0] [00003484] 0x3484With this patch the trace becomes:
Call Trace: [c0e9dca0] [c01c42c0] print_address_description+0x64/0x2bc (unreliable) [c0e9dcd0] [c01c46a4] kasan_report+0xfc/0x180 [c0e9dd10] [c0895150] memchr+0x24/0x74 [c0e9dd30] [c00a9e58] msg_print_text+0x124/0x574 [c0e9dde0] [c00ab730] console_unlock+0x114/0x4f8 [c0e9de40] [c00adc80] vprintk_emit+0x188/0x1c4 [c0e9de80] [c00ae3e4] printk+0xa8/0xcc [c0e9df20] [c0c27e44] early_irq_init+0x38/0x108 [c0e9df50] [c0c15434] start_kernel+0x310/0x488 [c0e9dff0] [00003484] 0x3484
--- arch/powerpc/kernel/entry_32.S | 9 +++++++++ 1 file changed, 9 insertions(+)
arch/powerpc/kernel/entry_32.S +9 -0
@@ -726,6 +726,9 @@ fast_exception_return: mtcr r10 lwz r10,_LINK(r11) mtlr r10 + /* Clear the exception_marker on the stack to avoid confusing stacktrace */ + li r10, 0 + stw r10, 8(r11) REST_GPR(10, r11) #ifdef CONFIG_PPC_8xx_PERF_EVENT mtspr SPRN_NRI, r0
@@ -963,6 +966,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRE mtcrf 0xFF,r10 mtlr r11 + /* Clear the exception_marker on the stack to avoid confusing stacktrace */ + li r10, 0 + stw r10, 8(r1) /* * Once we put values in SRR0 and SRR1, we are in a state * where exceptions are not recoverable, since taking an
@@ -1002,6 +1008,9 @@ exc_exit_restart_end: mtlr r11 lwz r10,_CCR(r1) mtcrf 0xff,r10 + /* Clear the exception_marker on the stack to avoid confusing stacktrace */ + li r10, 0 + stw r10, 8(r1) REST_2GPRS(9, r1) .globl exc_exit_restart exc_exit_restart:
Greg Kroah-Hartman
maintainerPATCH 139/183 powerpc/wii: properly disable use of BATs when requested.
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
commit 6d183ca8baec983dc4208ca45ece3c36763df912 upstream.
'nobats' kernel parameter or some options like CONFIG_DEBUG_PAGEALLOC deny the use of BATS for mapping memory.
This patch makes sure that the specific wii RAM mapping function takes it into account as well.
--- arch/powerpc/platforms/embedded6xx/wii.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/powerpc/platforms/embedded6xx/wii.c +4 -0
@@ -104,6 +104,10 @@ unsigned long __init wii_mmu_mapin_mem2(/* MEM2 64MB@0x10000000 */ delta = wii_hole_start + wii_hole_size; size = top - delta; + +if (__map_without_bats) +return delta; +for (bl =128 <<10 ; bl < max_size; bl <<=1 ) {if (bl *2 > size)break ;
Greg Kroah-Hartman
maintainerPATCH 140/183 powerpc/powernv: Make opal log only readable by root
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jordan Niethe <[email protected]>
commit 7b62f9bd2246b7d3d086e571397c14ba52645ef1 upstream.
Currently the opal log is globally readable. It is kernel policy to limit the visibility of physical addresses / kernel pointers to root. Given this and the fact the opal log may contain this information it would be better to limit the readability to root.
--- arch/powerpc/platforms/powernv/opal-msglog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/powernv/opal-msglog.c +1 -1
@@ -98,7 +98,7 @@ static ssize_t opal_msglog_read(struct f }static struct bin_attribute opal_msglog_attr = { - .attr = {.name ="msglog" , .mode =0444 }, + .attr = {.name ="msglog" , .mode =0400 }, .read = opal_msglog_read };
Greg Kroah-Hartman
maintainerPATCH 141/183 powerpc/83xx: Also save/restore SPRG4-7 during suspend
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
commit 36da5ff0bea2dc67298150ead8d8471575c54c7d upstream.
The 83xx has 8 SPRG registers and uses at least SPRG4 for DTLB handling LRU.
--- arch/powerpc/platforms/83xx/suspend-asm.S | 34 +++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-)
arch/powerpc/platforms/83xx/suspend-asm.S +27 -7
@@ -26,13 +26,13 @@ #define SS_MSR 0x74 #define SS_SDR1 0x78 #define SS_LR 0x7c -#define SS_SPRG 0x80 /* 4 SPRGs */ -#define SS_DBAT 0x90 /* 8 DBATs */ -#define SS_IBAT 0xd0 /* 8 IBATs */ -#define SS_TB 0x110 -#define SS_CR 0x118 -#define SS_GPREG 0x11c /* r12-r31 */ -#define STATE_SAVE_SIZE 0x16c +#define SS_SPRG 0x80 /* 8 SPRGs */ +#define SS_DBAT 0xa0 /* 8 DBATs */ +#define SS_IBAT 0xe0 /* 8 IBATs */ +#define SS_TB 0x120 +#define SS_CR 0x128 +#define SS_GPREG 0x12c /* r12-r31 */ +#define STATE_SAVE_SIZE 0x17c .section .data .align 5
@@ -103,6 +103,16 @@ _GLOBAL(mpc83xx_enter_deep_sleep) stw r7, SS_SPRG+12(r3) stw r8, SS_SDR1(r3) + mfspr r4, SPRN_SPRG4 + mfspr r5, SPRN_SPRG5 + mfspr r6, SPRN_SPRG6 + mfspr r7, SPRN_SPRG7 + + stw r4, SS_SPRG+16(r3) + stw r5, SS_SPRG+20(r3) + stw r6, SS_SPRG+24(r3) + stw r7, SS_SPRG+28(r3) + mfspr r4, SPRN_DBAT0U mfspr r5, SPRN_DBAT0L mfspr r6, SPRN_DBAT1U
@@ -493,6 +503,16 @@ mpc83xx_deep_resume: mtspr SPRN_IBAT7U, r6 mtspr SPRN_IBAT7L, r7 + lwz r4, SS_SPRG+16(r3) + lwz r5, SS_SPRG+20(r3) + lwz r6, SS_SPRG+24(r3) + lwz r7, SS_SPRG+28(r3) + + mtspr SPRN_SPRG4, r4 + mtspr SPRN_SPRG5, r5 + mtspr SPRN_SPRG6, r6 + mtspr SPRN_SPRG7, r7 + lwz r4, SS_SPRG+0(r3) lwz r5, SS_SPRG+4(r3) lwz r6, SS_SPRG+8(r3)
Greg Kroah-Hartman
maintainerPATCH 142/183 powerpc: Fix 32-bit KVM-PR lockup and host crash with MacOS guest
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Cave-Ayland <[email protected]>
commit fe1ef6bcdb4fca33434256a802a3ed6aacf0bd2f upstream.
Commit 8792468da5e1 "powerpc: Add the ability to save FPU without giving it up" unexpectedly removed the MSR_FE0 and MSR_FE1 bits from the bitmask used to update the MSR of the previous thread in __giveup_fpu() causing a KVM-PR MacOS guest to lockup and panic the host kernel.
Leaving FE0/1 enabled means unrelated processes might receive FPEs when they're not expecting them and crash. In particular if this happens to init the host will then panic.
eg (transcribed):
qemu-system-ppc[837]: unhandled signal 8 at 12cc9ce4 nip 12cc9ce4 lr 12cc9ca4 code 0 systemd[1]: unhandled signal 8 at 202f02e0 nip 202f02e0 lr 001003d4 code 0
Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
Reinstate these bits to the MSR bitmask to enable MacOS guests to run under 32-bit KVM-PR once again without issue.
--- arch/powerpc/kernel/process.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kernel/process.c +1 -1
@@ -156,7 +156,7 @@ void __giveup_fpu(struct task_struct *tssave_fpu (tsk); msr = tsk->thread.regs->msr; - msr &= ~MSR_FP ; + msr &= ~(MSR_FP |MSR_FE0 |MSR_FE1 );#ifdef CONFIG_VSX if (cpu_has_feature (CPU_FTR_VSX )) msr &= ~MSR_VSX ;
Greg Kroah-Hartman
maintainerPATCH 143/183 powerpc/ptrace: Simplify vr_get/set() to avoid GCC warning
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 ca6d5149d2ad0a8d2f9c28cbe379802260a0a5e0 upstream.
GCC 8 warns about the logic in vr_get/set(), which with -Werror breaks the build:
In function ‘user_regset_copyin’,
inlined from ‘vr_set’ at arch/powerpc/kernel/ptrace.c:628:9:
include/linux/regset.h:295:4: error: ‘memcpy’ offset [-527, -529] is out of the bounds [0, 16] of object ‘vrsave’ with type ‘union <anonymous>’ [-Werror=array-bounds] arch/powerpc/kernel/ptrace.c: In function ‘vr_set’:
arch/powerpc/kernel/ptrace.c:623:5: note: ‘vrsave’ declared here
} vrsave;
This has been identified as a regression in GCC, see GCC bug 88273.
However we can avoid the warning and also simplify the logic and make it more robust.
Currently we pass -1 as end_pos to user_regset_copyout(). This says "copy up to the end of the regset".
The definition of the regset is:
[REGSET_VMX] = {
.core_note_type = NT_PPC_VMX, .n = 34,
.size = sizeof(vector128), .align = sizeof(vector128),
.active = vr_active, .get = vr_get, .set = vr_set
},The end is calculated as (n * size), ie. 34 * sizeof(vector128).
In vr_get/set() we pass start_pos as 33 * sizeof(vector128), meaning we can copy up to sizeof(vector128) into/out-of vrsave.
The on-stack vrsave is defined as:
union {
elf_vrreg_t reg;
u32 word;} vrsave;
And elf_vrreg_t is:
typedef __vector128 elf_vrreg_t;
So there is no bug, but we rely on all those sizes lining up, otherwise we would have a kernel stack exposure/overwrite on our hands.
Rather than relying on that we can pass an explict end_pos based on the sizeof(vrsave). The result should be exactly the same but it's more obviously not over-reading/writing the stack and it avoids the compiler warning.
--- arch/powerpc/kernel/ptrace.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/powerpc/kernel/ptrace.c +8 -2
@@ -547,6 +547,7 @@ static int vr_get(struct task_struct *ta/* * Copy out only the low-order word of vrsave. */ +int start, end;union {elf_vrreg_t reg;u32 word;
@@ -555,8 +556,10 @@ static int vr_get(struct task_struct *ta vrsave.word = target->thread.vrsave; + start =33 *sizeof (vector128); + end = start +sizeof (vrsave); ret =user_regset_copyout (&pos, &count, &kbuf, &ubuf, &vrsave, -33 *sizeof (vector128),-1 ); + start, end); }return ret;
@@ -594,6 +597,7 @@ static int vr_set(struct task_struct *ta/* * We use only the first word of vrsave. */ +int start, end;union {elf_vrreg_t reg;u32 word;
@@ -602,8 +606,10 @@ static int vr_set(struct task_struct *ta vrsave.word = target->thread.vrsave; + start =33 *sizeof (vector128); + end = start +sizeof (vrsave); ret =user_regset_copyin (&pos, &count, &kbuf, &ubuf, &vrsave, -33 *sizeof (vector128),-1 ); + start, end);if (!ret) target->thread.vrsave = vrsave.word; }
Greg Kroah-Hartman
maintainerPATCH 144/183 powerpc/hugetlb: Dont do runtime allocation of 16G pages in LPAR configuration
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aneesh Kumar K.V <[email protected]>
commit 35f2806b481f5b9207f25e1886cba5d1c4d12cc7 upstream.
We added runtime allocation of 16G pages in commit 4ae279c2c96a ("powerpc/mm/hugetlb: Allow runtime allocation of 16G.") That was done to enable 16G allocation on PowerNV and KVM config. In case of KVM config, we mostly would have the entire guest RAM backed by 16G hugetlb pages for this to work. PAPR do support partial backing of guest RAM with hugepages via ibm,expected#pages node of memory node in the device tree. This means rest of the guest RAM won't be backed by 16G contiguous pages in the host and hence a hash page table insertion can fail in such case.
An example error message will look like
hash-mmu: mm: Hashing failure ! EA=0x7efc00000000 access=0x8000000000000006 current=readback
hash-mmu: trap=0x300 vsid=0x67af789 ssize=1 base psize=14 psize 14 pte=0xc000000400000386
readback[12260]: unhandled signal 7 at 00007efc00000000 nip 00000000100012d0 lr 000000001000127c code 2
This patch address that by preventing runtime allocation of 16G hugepages in LPAR config. To allocate 16G hugetlb one need to kernel command line hugepagesz=16G hugepages=<number of 16G pages>
With radix translation mode we don't run into this issue.
This change will prevent runtime allocation of 16G hugetlb pages on kvm with hash translation mode. However, with the current upstream it was observed that 16G hugetlbfs backed guest doesn't boot at all.
We observe boot failure with the below message:
[131354.647546] KVM: map_vrma at 0 failed, ret=-4
That means this patch is not resulting in an observable regression. Once we fix the boot issue with 16G hugetlb backed memory, we need to use ibm,expected#pages memory node attribute to indicate 16G page reservation to the guest. This will also enable partial backing of guest RAM with 16G pages.
--- arch/powerpc/include/asm/book3s/64/hugetlb.h | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/powerpc/include/asm/book3s/64/hugetlb.h +8 -0
@@ -55,6 +55,14 @@ static inline pte_t arch_make_huge_pte(p#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE static inline bool gigantic_page_supported (void ) { +/* +* We used gigantic page reservation with hypervisor assist in some case. +* We cannot use runtime allocation of gigantic pages in those platforms +* This is hash translation mode LPARs. +*/ +if (firmware_has_feature (FW_FEATURE_LPAR ) && !radix_enabled ()) +return false; +return true; }#endif
Greg Kroah-Hartman
maintainerPATCH 145/183 powerpc/traps: fix recoverability of machine check handling on book3s/32
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
commit 0bbea75c476b77fa7d7811d6be911cc7583e640f upstream.
Looks like book3s/32 doesn't set RI on machine check, so checking RI before calling die() will always be fatal allthought this is not an issue in most cases.
--- arch/powerpc/kernel/traps.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/powerpc/kernel/traps.c +4 -4
@@ -694,15 +694,15 @@ void machine_check_exception(struct pt_rif (check_io_access (regs)) goto bail; -/* Must die if the interrupt is not recoverable */ -if (!(regs->msr &MSR_RI )) -nmi_panic (regs,"Unrecoverable Machine check" ); -if (!nested)nmi_exit ();die ("Machine check" , regs,SIGBUS ); +/* Must die if the interrupt is not recoverable */ +if (!(regs->msr &MSR_RI )) +nmi_panic (regs,"Unrecoverable Machine check" ); +return ; bail:
Greg Kroah-Hartman
maintainerPATCH 146/183 powerpc/traps: Fix the message printed when stack overflows
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
commit 9bf3d3c4e4fd82c7174f4856df372ab2a71005b9 upstream.
Today's message is useless:
[ 42.253267] Kernel stack overflow in process (ptrval), r1=c65500b0
This patch fixes it:
[ 66.905235] Kernel stack overflow in process sh[356], r1=c65560b0
--- arch/powerpc/kernel/traps.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/kernel/traps.c +2 -2
@@ -1292,8 +1292,8 @@ void slb_miss_bad_addr(struct pt_regs *rvoid StackOverflow (struct pt_regs *regs) { -printk (KERN_CRIT "Kernel stack overflow in process %p, r1=%lx\n" , - current, regs->gpr[1 ]); +pr_crit ("Kernel stack overflow in process %s[%d], r1=%lx\n" , + current->comm,task_pid_nr (current), regs->gpr[1 ]);debugger (regs);show_regs (regs);panic ("kernel stack overflow" );
Greg Kroah-Hartman
maintainerPATCH 147/183 ARM: s3c24xx: Fix boolean expressions in osiris_dvs_notify
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 e2477233145f2156434afb799583bccd878f3e9f upstream.
Fix boolean expressions by using logical AND operator '&&' instead of bitwise operator '&'.
This issue was detected with the help of Coccinelle.
--- arch/arm/mach-s3c24xx/mach-osiris-dvs.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/arm/mach-s3c24xx/mach-osiris-dvs.c +4 -4
@@ -70,16 +70,16 @@ static int osiris_dvs_notify(struct notiswitch (val) {case CPUFREQ_PRECHANGE : -if (old_dvs & !new_dvs || - cur_dvs & !new_dvs) { +if ((old_dvs && !new_dvs) || + (cur_dvs && !new_dvs)) {pr_debug ("%s: exiting dvs\n" , __func__); cur_dvs = false;gpio_set_value (OSIRIS_GPIO_DVS ,1 ); }break ;case CPUFREQ_POSTCHANGE : -if (!old_dvs & new_dvs || - !cur_dvs & new_dvs) { +if ((!old_dvs && new_dvs) || + (!cur_dvs && new_dvs)) {pr_debug ("entering dvs\n" ); cur_dvs = true;gpio_set_value (OSIRIS_GPIO_DVS ,0 );
Greg Kroah-Hartman
maintainerPATCH 148/183 arm64: Fix HCR.TGE status for NMI contexts
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Julien Thierry <[email protected]>
commit 5870970b9a828d8693aa6d15742573289d7dbcd0 upstream.
When using VHE, the host needs to clear HCR_EL2.TGE bit in order to interact with guest TLBs, switching from EL2&0 translation regime to EL1&0.
However, some non-maskable asynchronous event could happen while TGE is cleared like SDEI. Because of this address translation operations relying on EL2&0 translation regime could fail (tlb invalidation, userspace access, ...).
Fix this by properly setting HCR_EL2.TGE when entering NMI context and clear it if necessary when returning to the interrupted context.
--- arch/arm64/include/asm/hardirq.h | 31 +++++++++++++++++++++++++++++++ arch/arm64/kernel/irq.c | 3 +++ include/linux/hardirq.h | 7 +++++++ 3 files changed, 41 insertions(+)
arch/arm64/include/asm/hardirq.h +31 -0
@@ -17,8 +17,12 @@#define __ASM_HARDIRQ_H#include <linux/cache.h> +#include <linux/percpu.h> #include <linux/threads.h> +#include <asm/barrier.h> #include <asm/irq.h> +#include <asm/kvm_arm.h> +#include <asm/sysreg.h> #define NR_IPI 7
@@ -37,6 +41,33 @@ u64 smp_irq_stat_cpu(unsigned int cpu);#define __ARCH_IRQ_EXIT_IRQS_DISABLED 1 +struct nmi_ctx { +u64 hcr; +}; + +DECLARE_PER_CPU(struct nmi_ctx, nmi_contexts); + +#define arch_nmi_enter () \ + do { \ + if (is_kernel_in_hyp_mode()) { \ + struct nmi_ctx *nmi_ctx = this_cpu_ptr(&nmi_contexts); \ + nmi_ctx->hcr = read_sysreg(hcr_el2); \ + if (!(nmi_ctx->hcr & HCR_TGE)) { \ + write_sysreg(nmi_ctx->hcr | HCR_TGE, hcr_el2); \ + isb(); \ + } \ + } \ + } while (0) + +#define arch_nmi_exit () \ + do { \ + if (is_kernel_in_hyp_mode()) { \ + struct nmi_ctx *nmi_ctx = this_cpu_ptr(&nmi_contexts); \ + if (!(nmi_ctx->hcr & HCR_TGE)) \ + write_sysreg(nmi_ctx->hcr, hcr_el2); \ + } \ + } while (0) +static inline void ack_bad_irq (unsigned int irq) {extern unsigned long irq_err_count;
arch/arm64/kernel/irq.c +3 -0
@@ -32,6 +32,9 @@unsigned long irq_err_count; +/* Only access this in an NMI enter/exit */ +DEFINE_PER_CPU(struct nmi_ctx, nmi_contexts); + DEFINE_PER_CPU(unsigned long *, irq_stack_ptr);int arch_show_interrupts (struct seq_file *p,int prec)
include/linux/hardirq.h +7 -0
@@ -60,8 +60,14 @@ extern void irq_enter(void);*/ extern void irq_exit (void ); +#ifndef arch_nmi_enter +#define arch_nmi_enter () do { } while (0) +#define arch_nmi_exit () do { } while (0) +#endif +#define nmi_enter () \ do { \ + arch_nmi_enter(); \ printk_nmi_enter(); \ lockdep_off(); \ ftrace_nmi_enter(); \
@@ -80,6 +86,7 @@ extern void irq_exit(void);ftrace_nmi_exit (); \lockdep_on (); \printk_nmi_exit (); \ +arch_nmi_exit (); \ } while (0)#endif /* LINUX_HARDIRQ_H */
Greg Kroah-Hartman
maintainerPATCH 149/183 arm64: debug: Ensure debug handlers check triggering exception level
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 6bd288569b50bc89fa5513031086746968f585cb upstream.
Debug exception handlers may be called for exceptions generated both by user and kernel code. In many cases, this is checked explicitly, but in other cases things either happen to work by happy accident or they go slightly wrong. For example, executing 'brk #4' from userspace will enter the kprobes code and be ignored, but the instruction will be retried forever in userspace instead of delivering a SIGTRAP.
Fix this issue in the most stable-friendly fashion by simply adding explicit checks of the triggering exception level to all of our debug exception handlers.
--- arch/arm64/kernel/kgdb.c | 14 ++++++++++---- arch/arm64/kernel/probes/kprobes.c | 6 ++++++ 2 files changed, 16 insertions(+), 4 deletions(-)
arch/arm64/kernel/kgdb.c +10 -4
@@ -233,27 +233,33 @@ int kgdb_arch_handle_exception(int excepstatic int kgdb_brk_fn (struct pt_regs *regs,unsigned int esr) { +if (user_mode (regs)) +return DBG_HOOK_ERROR ; +kgdb_handle_exception (1 ,SIGTRAP ,0 , regs); -return 0 ; +return DBG_HOOK_HANDLED ; }NOKPROBE_SYMBOL (kgdb_brk_fn) static int kgdb_compiled_brk_fn(struct pt_regs *regs, unsigned int esr) { +if (user_mode (regs)) +return DBG_HOOK_ERROR ; + compiled_break =1 ;kgdb_handle_exception (1 ,SIGTRAP ,0 , regs); -return 0 ; +return DBG_HOOK_HANDLED ; }NOKPROBE_SYMBOL (kgdb_compiled_brk_fn);static int kgdb_step_brk_fn (struct pt_regs *regs,unsigned int esr) { -if (!kgdb_single_step) +if (user_mode (regs) || !kgdb_single_step)return DBG_HOOK_ERROR ;kgdb_handle_exception (1 ,SIGTRAP ,0 , regs); -return 0 ; +return DBG_HOOK_HANDLED ; }NOKPROBE_SYMBOL (kgdb_step_brk_fn);
arch/arm64/kernel/probes/kprobes.c +6 -0
@@ -458,6 +458,9 @@ kprobe_single_step_handler(struct pt_regstruct kprobe_ctlblk *kcb =get_kprobe_ctlblk ();int retval; +if (user_mode (regs)) +return DBG_HOOK_ERROR ; +/* return error if this is not our step */ retval =kprobe_ss_hit (kcb,instruction_pointer (regs));
@@ -474,6 +477,9 @@ kprobe_single_step_handler(struct pt_regint __kprobes kprobe_breakpoint_handler (struct pt_regs *regs,unsigned int esr) { +if (user_mode (regs)) +return DBG_HOOK_ERROR ; +kprobe_handler (regs);return DBG_HOOK_HANDLED ; }
Greg Kroah-Hartman
maintainerPATCH 150/183 arm64: KVM: Fix architecturally invalid reset value for FPEXC32_EL2
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Martin <[email protected]>
commit c88b093693ccbe41991ef2e9b1d251945e6e54ed upstream.
Due to what looks like a typo dating back to the original addition of FPEXC32_EL2 handling, KVM currently initialises this register to an architecturally invalid value.
As a result, the VECITR field (RES1) in bits [10:8] is initialised with 0, and the two reserved (RES0) bits [6:5] are initialised with
1. (In the Common VFP Subarchitecture as specified by ARMv7-A, these two bits were IMP DEF. ARMv8-A removes them.)
This patch changes the reset value from 0x70 to 0x700, which reflects the architectural constraints and is presumably what was originally intended.
--- arch/arm64/kvm/sys_regs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/kvm/sys_regs.c +1 -1
@@ -1079,7 +1079,7 @@ static const struct sys_reg_desc sys_reg { SYS_DESC(SYS_DACR32_EL2), NULL, reset_unknown, DACR32_EL2 }, { SYS_DESC(SYS_IFSR32_EL2), NULL, reset_unknown, IFSR32_EL2 }, - { SYS_DESC(SYS_FPEXC32_EL2), NULL, reset_val, FPEXC32_EL2, 0x70 }, + { SYS_DESC(SYS_FPEXC32_EL2), NULL, reset_val, FPEXC32_EL2, 0x700 }, }; static bool trap_dbgidr(struct kvm_vcpu *vcpu,
Greg Kroah-Hartman
maintainerPATCH 151/183 dm: fix to_sector() for 32bit
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit 0bdb50c531f7377a9da80d3ce2d61f389c84cb30 upstream.
A dm-raid array with devices larger than 4GB won't assemble on a 32 bit host since _check_data_dev_sectors() was added in 4.16. This is because to_sector() treats its argument as an "unsigned long" which is 32bits (4GB) on a 32bit host. Using "unsigned long long" is more correct.
Kernels as early as 4.2 can have other problems due to to_sector() being used on the size of a device.
--- include/linux/device-mapper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/device-mapper.h +1 -1
@@ -630,7 +630,7 @@ do { \*/ #define dm_target_offset (ti, sector) ((sector) - (ti)->begin) -static inline sector_t to_sector (unsigned long n) +static inline sector_t to_sector (unsigned long long n) {return (n >>SECTOR_SHIFT ); }
Greg Kroah-Hartman
maintainerPATCH 152/183 dm integrity: limit the rate of error messages
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 225557446856448039a9e495da37b72c20071ef2 upstream.
When using dm-integrity underneath md-raid, some tests with raid auto-correction trigger large amounts of integrity failures - and all these failures print an error message. These messages can bring the system to a halt if the system is using serial console.
Fix this by limiting the rate of error messages - it improves the speed of raid recovery and avoids the hang.
--- drivers/md/dm-integrity.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/md/dm-integrity.c +4 -4
@@ -1276,8 +1276,8 @@ again: checksums_ptr - checksums, !dio->write ? TAG_CMP : TAG_WRITE);if (unlikely (r)) {if (r >0 ) { -DMERR ("Checksum failed at sector 0x%llx" , - (unsigned long long )(sector - ((r + ic->tag_size -1 ) / ic->tag_size))); +DMERR_LIMIT ("Checksum failed at sector 0x%llx" , + (unsigned long long )(sector - ((r + ic->tag_size -1 ) / ic->tag_size))); r = -EILSEQ ;atomic64_inc (&ic->number_of_mismatches); }
@@ -1469,8 +1469,8 @@ retry_kmap:integrity_sector_checksum (ic, logical_sector, mem + bv.bv_offset, checksums_onstack);if (unlikely (memcmp (checksums_onstack,journal_entry_tag (ic, je), ic->tag_size))) { -DMERR ("Checksum failed when reading from journal, at sector 0x%llx" , - (unsigned long long )logical_sector); +DMERR_LIMIT ("Checksum failed when reading from journal, at sector 0x%llx" , + (unsigned long long )logical_sector); } }#endif
Greg Kroah-Hartman
maintainerPATCH 153/183 cpcap-charger: generate events for userspace
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pavel Machek <[email protected]>
commit fd10606f93a149a9f3d37574e5385b083b4a7b32 upstream.
The driver doesn't generate uevents on charger connect/disconnect. This leads to UPower not detecting when AC is on or off... and that is bad.
Reported by Arthur D. on github (
https://github.com/maemo-leste/bugtracker/issues/206 ), thanks to Merlijn Wajer for suggesting a fix.
--- drivers/power/supply/cpcap-charger.c | 1 + 1 file changed, 1 insertion(+)
drivers/power/supply/cpcap-charger.c +1 -0
@@ -458,6 +458,7 @@ static void cpcap_usb_detect(struct work goto out_err; } +power_supply_changed (ddata->usb);return ; out_err:
Greg Kroah-Hartman
maintainerPATCH 154/183 NFS: Fix I/O request leakages
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit f57dcf4c72113c745d83f1c65f7291299f65c14f upstream.
When we fail to add the request to the I/O queue, we currently leave it to the caller to free the failed request. However since some of the requests that fail are actually created by nfs_pageio_add_request() itself, and are not passed back the caller, this leads to a leakage issue, which can again cause page locks to leak.
This commit addresses the leakage by freeing the created requests on error, using desc->pg_completion_ops->error_cleanup()
--- fs/nfs/pagelist.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-)
fs/nfs/pagelist.c +21 -5
@@ -988,6 +988,17 @@ static void nfs_pageio_doio(struct nfs_p } } +static void +nfs_pageio_cleanup_request (struct nfs_pageio_descriptor *desc, +struct nfs_page *req) +{ +LIST_HEAD (head); + +nfs_list_remove_request (req); +nfs_list_add_request (req, &head); + desc->pg_completion_ops->error_cleanup (&head); +} +/** * nfs_pageio_add_request - Attempt to coalesce a request into a page list. * @desc: destination io descriptor
@@ -1025,10 +1036,8 @@ static int __nfs_pageio_add_request(strunfs_page_group_unlock (req); desc->pg_moreio =1 ;nfs_pageio_doio (desc); -if (desc->pg_error <0 ) -return 0 ; -if (mirror->pg_recoalesce) -return 0 ; +if (desc->pg_error <0 || mirror->pg_recoalesce) + goto out_cleanup_subreq;/* retry add_request for this subreq */ nfs_page_group_lock (req);continue ;
@@ -1061,6 +1070,10 @@ err_ptr: desc->pg_error =PTR_ERR (subreq);nfs_page_group_unlock (req);return 0 ; +out_cleanup_subreq: +if (req != subreq) +nfs_pageio_cleanup_request (desc, subreq); +return 0 ; }static int nfs_do_recoalesce (struct nfs_pageio_descriptor *desc)
@@ -1168,11 +1181,14 @@ int nfs_pageio_add_request(struct nfs_paif (nfs_pgio_has_mirroring (desc)) desc->pg_mirror_idx = midx;if (!nfs_pageio_add_request_mirror (desc, dupreq)) - goto out_failed; + goto out_cleanup_subreq; }return 1 ; +out_cleanup_subreq: +if (req != dupreq) +nfs_pageio_cleanup_request (desc, dupreq); out_failed:/* remember fatal errors */ if (nfs_error_is_fatal (desc->pg_error))
Greg Kroah-Hartman
maintainerPATCH 155/183 NFS: Fix an I/O request leakage in nfs_do_recoalesce
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit 4d91969ed4dbcefd0e78f77494f0cb8fada9048a upstream.
Whether we need to exit early, or just reprocess the list, we must not lost track of the request which failed to get recoalesced.
--- fs/nfs/pagelist.c | 1 - 1 file changed, 1 deletion(-)
fs/nfs/pagelist.c +0 -1
@@ -1092,7 +1092,6 @@ static int nfs_do_recoalesce(struct nfs_struct nfs_page *req; req = list_first_entry(&head, struct nfs_page, wb_list); -nfs_list_remove_request (req);if (__nfs_pageio_add_request (desc, req))continue ;if (desc->pg_error <0 ) {
Greg Kroah-Hartman
maintainerPATCH 156/183 NFS: Dont recoalesce on error in nfs_pageio_complete_mirror()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit 8127d82705998568b52ac724e28e00941538083d upstream.
If the I/O completion failed with a fatal error, then we should just exit nfs_pageio_complete_mirror() rather than try to recoalesce.
--- fs/nfs/pagelist.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/pagelist.c +1 -1
@@ -1213,7 +1213,7 @@ static void nfs_pageio_complete_mirror(s desc->pg_mirror_idx = mirror_idx;for (;;) {nfs_pageio_doio (desc); -if (!mirror->pg_recoalesce) +if (desc->pg_error <0 || !mirror->pg_recoalesce)break ;if (!nfs_do_recoalesce (desc))break ;
Greg Kroah-Hartman
maintainerPATCH 157/183 nfsd: fix memory corruption caused by readdir
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit b602345da6cbb135ba68cf042df8ec9a73da7981 upstream.
If the result of an NFSv3 readdir{,plus} request results in the "offset" on one entry having to be split across 2 pages, and is sized so that the next directory entry doesn't fit in the requested size, then memory corruption can happen.
When encode_entry() is called after encoding the last entry that fits, it notices that ->offset and ->offset1 are set, and so stores the offset value in the two pages as required. It clears ->offset1 but *does not* clear ->offset.
Normally this omission doesn't matter as encode_entry_baggage() will be called, and will set ->offset to a suitable value (not on a page boundary).
But in the case where cd->buflen < elen and nfserr_toosmall is returned, ->offset is not reset.
This means that nfsd3proc_readdirplus will see ->offset with a value 4 bytes before the end of a page, and ->offset1 set to NULL. It will try to write 8bytes to ->offset.
If we are lucky, the next page will be read-only, and the system will
BUG: unable to handle kernel paging request at...
If we are unlucky, some innocent page will have the first 4 bytes corrupted.
nfsd3proc_readdir() doesn't even check for ->offset1, it just blindly writes 8 bytes to the offset wherever it is.
Fix this by clearing ->offset after it is used, and copying the ->offset handling code from nfsd3_proc_readdirplus into nfsd3_proc_readdir.
(Note that the commit hash in the Fixes tag is from the 'history'
tree - this bug predates git).
Fixes-URL: https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/?id=0b1d57cf7654
--- fs/nfsd/nfs3proc.c | 16 ++++++++++++++-- fs/nfsd/nfs3xdr.c | 1 + 2 files changed, 15 insertions(+), 2 deletions(-)
fs/nfsd/nfs3proc.c +14 -2
@@ -446,8 +446,19 @@ nfsd3_proc_readdir(struct svc_rqst *rqst &resp->common, nfs3svc_encode_entry);memcpy (resp->verf, argp->verf,8 ); resp->count = resp->buffer - argp->buffer; -if (resp->offset) -xdr_encode_hyper (resp->offset, argp->cookie); +if (resp->offset) { +loff_t offset = argp->cookie; + +if (unlikely (resp->offset1)) { +/* we ended up with offset on a page boundary */ + *resp->offset =htonl (offset >>32 ); + *resp->offset1 =htonl (offset &0xffffffff ); + resp->offset1 =NULL ; + }else { +xdr_encode_hyper (resp->offset, offset); + } + resp->offset =NULL ; + }RETURN_STATUS (nfserr); }
@@ -516,6 +527,7 @@ nfsd3_proc_readdirplus(struct svc_rqst * }else {xdr_encode_hyper (resp->offset, offset); } + resp->offset =NULL ; }RETURN_STATUS (nfserr);
fs/nfsd/nfs3xdr.c +1 -0
@@ -922,6 +922,7 @@ encode_entry(struct readdir_cd *ccd, con }else {xdr_encode_hyper (cd->offset, offset64); } + cd->offset =NULL ; }/*
Greg Kroah-Hartman
maintainerPATCH 158/183 nfsd: fix wrong check in write_v4_end_grace()
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yihao Wu <[email protected]>
commit dd838821f0a29781b185cd8fb8e48d5c177bd838 upstream.
Commit 62a063b8e7d1 "nfsd4: fix crash on writing v4_end_grace before nfsd startup" is trying to fix a NULL dereference issue, but it mistakenly checks if the nfsd server is started. So fix it.
--- fs/nfsd/nfsctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfsd/nfsctl.c +1 -1
@@ -1126,7 +1126,7 @@ static ssize_t write_v4_end_grace(structcase 'Y' :case 'y' :case '1' : -if (nn->nfsd_serv) +if (!nn->nfsd_serv)return -EBUSY ;nfsd4_end_grace (nn);break ;
Greg Kroah-Hartman
maintainerPATCH 159/183 NFSv4.1: Reinitialise sequence results before retransmitting a request
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit c1dffe0bf7f9c3d57d9f237a7cb2a81e62babd2b upstream.
If we have to retransmit a request, we should ensure that we reinitialise the sequence results structure, since in the event of a signal we need to treat the request as if it had not been sent.
--- fs/nfs/nfs4proc.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
fs/nfs/nfs4proc.c +8 -4
@@ -914,6 +914,13 @@ nfs4_sequence_process_interrupted(struct#endif /* !CONFIG_NFS_V4_1 */ +static void nfs41_sequence_res_init (struct nfs4_sequence_res *res) +{ + res->sr_timestamp = jiffies; + res->sr_status_flags =0 ; + res->sr_status =1 ; +} + static void nfs4_sequence_attach_slot(struct nfs4_sequence_args *args, struct nfs4_sequence_res *res,
@@ -925,10 +932,6 @@ void nfs4_sequence_attach_slot(struct nf args->sa_slot = slot; res->sr_slot = slot; - res->sr_timestamp = jiffies; - res->sr_status_flags =0 ; - res->sr_status =1 ; - } int nfs4_setup_sequence(struct nfs_client *client,
@@ -974,6 +977,7 @@ int nfs4_setup_sequence(struct nfs_clientrace_nfs4_setup_sequence (session, args); out_start: +nfs41_sequence_res_init (res);rpc_call_start (task);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 160/183 PM / wakeup: Rework wakeup source timer cancellation
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
commit 1fad17fb1bbcd73159c2b992668a6957ecc5af8a upstream.
If wakeup_source_add() is called right after wakeup_source_remove() for the same wakeup source, timer_setup() may be called for a potentially scheduled timer which is incorrect.
To avoid that, move the wakeup source timer cancellation from wakeup_source_drop() to wakeup_source_remove().
Moreover, make wakeup_source_remove() clear the timer function after canceling the timer to let wakeup_source_not_registered() treat unregistered wakeup sources in the same way as the ones that have never been registered.
--- drivers/base/power/wakeup.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/base/power/wakeup.c +7 -1
@@ -113,7 +113,6 @@ void wakeup_source_drop(struct wakeup_soif (!ws)return ; -del_timer_sync (&ws->timer);__pm_relax (ws); }EXPORT_SYMBOL_GPL (wakeup_source_drop);
@@ -201,6 +200,13 @@ void wakeup_source_remove(struct wakeup_list_del_rcu (&ws->entry);spin_unlock_irqrestore (&events_lock, flags);synchronize_srcu (&wakeup_srcu); + +del_timer_sync (&ws->timer); +/* +* Clear timer.function to make wakeup_source_not_registered() treat +* this wakeup source as not registered. +*/ + ws->timer.function =NULL ; }EXPORT_SYMBOL_GPL (wakeup_source_remove);
Greg Kroah-Hartman
maintainerPATCH 161/183 bcache: never writeback a discard operation
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Axtens <[email protected]>
commit 9951379b0ca88c95876ad9778b9099e19a95d566 upstream.
Some users see panics like the following when performing fstrim on a bcached volume:
[ 529.803060] BUG: unable to handle kernel NULL pointer dereference at 0000000000000008 [ 530.183928] #PF error: [normal kernel read fault] [ 530.412392] PGD 8000001f42163067 P4D 8000001f42163067 PUD 1f42168067 PMD 0 [ 530.750887] Oops: 0000 [#1] SMP PTI [ 530.920869] CPU: 10 PID: 4167 Comm: fstrim Kdump: loaded Not tainted 5.0.0-rc1+ #3 [ 531.290204] Hardware name: HP ProLiant DL360 Gen9/ProLiant DL360 Gen9, BIOS P89 12/27/2015 [ 531.693137] RIP: 0010:blk_queue_split+0x148/0x620 [ 531.922205] Code: 60 38 89 55 a0 45 31 db 45 31 f6 45 31 c9 31 ff 89 4d 98 85 db 0f 84 7f 04 00 00 44 8b 6d 98 4c 89 ee 48 c1 e6 04 49 03 70 78 <8b> 46 08 44 8b 56 0c 48 8b 16 44 29 e0 39 d8 48 89 55 a8 0f 47 c3 [ 532.838634] RSP: 0018:ffffb9b708df39b0 EFLAGS: 00010246 [ 533.093571] RAX: 00000000ffffffff RBX: 0000000000046000 RCX: 0000000000000000 [ 533.441865] RDX: 0000000000000200 RSI: 0000000000000000 RDI: 0000000000000000 [ 533.789922] RBP: ffffb9b708df3a48 R08: ffff940d3b3fdd20 R09: 0000000000000000 [ 534.137512] R10: ffffb9b708df3958 R11: 0000000000000000 R12: 0000000000000000 [ 534.485329] R13: 0000000000000000 R14: 0000000000000000 R15: ffff940d39212020 [ 534.833319] FS: 00007efec26e3840(0000) GS:ffff940d1f480000(0000) knlGS:0000000000000000 [ 535.224098] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 535.504318] CR2: 0000000000000008 CR3: 0000001f4e256004 CR4: 00000000001606e0 [ 535.851759] Call Trace: [ 535.970308] ? mempool_alloc_slab+0x15/0x20 [ 536.174152] ? bch_data_insert+0x42/0xd0 [bcache] [ 536.403399] blk_mq_make_request+0x97/0x4f0 [ 536.607036] generic_make_request+0x1e2/0x410 [ 536.819164] submit_bio+0x73/0x150 [ 536.980168] ? submit_bio+0x73/0x150 [ 537.149731] ? bio_associate_blkg_from_css+0x3b/0x60 [ 537.391595] ? _cond_resched+0x1a/0x50 [ 537.573774] submit_bio_wait+0x59/0x90 [ 537.756105] blkdev_issue_discard+0x80/0xd0 [ 537.959590] ext4_trim_fs+0x4a9/0x9e0 [ 538.137636] ? ext4_trim_fs+0x4a9/0x9e0 [ 538.324087] ext4_ioctl+0xea4/0x1530 [ 538.497712] ? _copy_to_user+0x2a/0x40 [ 538.679632] do_vfs_ioctl+0xa6/0x600 [ 538.853127] ? __do_sys_newfstat+0x44/0x70 [ 539.051951] ksys_ioctl+0x6d/0x80 [ 539.212785] __x64_sys_ioctl+0x1a/0x20 [ 539.394918] do_syscall_64+0x5a/0x110 [ 539.568674] entry_SYSCALL_64_after_hwframe+0x44/0xa9
We have observed it where both:
1) LVM/devmapper is involved (bcache backing device is LVM volume) and
2) writeback cache is involved (bcache cache_mode is writeback)
On one machine, we can reliably reproduce it with:
# echo writeback > /sys/block/bcache0/bcache/cache_mode
(not sure whether above line is required)
# mount /dev/bcache0 /test
# for i in {0..10}; do
file="$(mktemp /test/zero.XXX)"
dd if=/dev/zero of="$file" bs=1M count=256
sync
rm $file
done
# fstrim -v /testObserving this with tracepoints on, we see the following writes:
fstrim-18019 [022] .... 91107.302026: bcache_write: 73f95583-561c-408f-a93a-4cbd2498f5c8 inode 0 DS 4260112 + 196352 hit 0 bypass 1 fstrim-18019 [022] .... 91107.302050: bcache_write: 73f95583-561c-408f-a93a-4cbd2498f5c8 inode 0 DS 4456464 + 262144 hit 0 bypass 1 fstrim-18019 [022] .... 91107.302075: bcache_write: 73f95583-561c-408f-a93a-4cbd2498f5c8 inode 0 DS 4718608 + 81920 hit 0 bypass 1 fstrim-18019 [022] .... 91107.302094: bcache_write: 73f95583-561c-408f-a93a-4cbd2498f5c8 inode 0 DS 5324816 + 180224 hit 0 bypass 1 fstrim-18019 [022] .... 91107.302121: bcache_write: 73f95583-561c-408f-a93a-4cbd2498f5c8 inode 0 DS 5505040 + 262144 hit 0 bypass 1 fstrim-18019 [022] .... 91107.302145: bcache_write: 73f95583-561c-408f-a93a-4cbd2498f5c8 inode 0 DS 5767184 + 81920 hit 0 bypass 1 fstrim-18019 [022] .... 91107.308777: bcache_write: 73f95583-561c-408f-a93a-4cbd2498f5c8 inode 0 DS 6373392 + 180224 hit 1 bypass 0
<crash>
Note the final one has different hit/bypass flags.
This is because in should_writeback(), we were hitting a case where the partial stripe condition was returning true and so should_writeback() was returning true early.
If that hadn't been the case, it would have hit the would_skip test, and as would_skip == s->iop.bypass == true, should_writeback() would have returned false.
Looking at the git history from 'commit 72c270612bd3 ("bcache: Write out full stripes")', it looks like the idea was to optimise for raid5/6:
* If a stripe is already dirty, force writes to that stripe to writeback mode - to help build up full stripes of dirty data
To fix this issue, make sure that should_writeback() on a discard op never returns true.
More details of debugging:
https://www.spinics.net/lists/linux-bcache/msg06996.html
Previous reports:
- https://bugzilla.kernel.org/show_bug.cgi?id=201051
- https://bugzilla.kernel.org/show_bug.cgi?id=196103
- https://www.spinics.net/lists/linux-bcache/msg06885.html
(Coly Li: minor modification to follow maximum 75 chars per line rule)
--- drivers/md/bcache/writeback.h | 3 +++ 1 file changed, 3 insertions(+)
drivers/md/bcache/writeback.h +3 -0
@@ -69,6 +69,9 @@ static inline bool should_writeback(stru in_use > CUTOFF_WRITEBACK_SYNC)return false; +if (bio_op (bio) ==REQ_OP_DISCARD ) +return false; +if (dc->partial_stripes_expensive &&bcache_dev_stripe_dirty (dc, bio->bi_iter.bi_sector,bio_sectors (bio)))
Greg Kroah-Hartman
maintainerPATCH 162/183 x86/unwind/orc: Fix ORC unwind table alignment
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josh Poimboeuf <[email protected]>
commit f76a16adc485699f95bb71fce114f97c832fe664 upstream.
The .orc_unwind section is a packed array of 6-byte structs. It's currently aligned to 6 bytes, which is causing warnings in the LLD linker.
Six isn't a power of two, so it's not a valid alignment value. The actual alignment doesn't matter much because it's an array of packed structs. An alignment of two is sufficient. In reality it always gets aligned to four bytes because it comes immediately after the 4-byte-aligned .orc_unwind_ip section.
--- include/asm-generic/vmlinux.lds.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/asm-generic/vmlinux.lds.h +1 -1
@@ -696,7 +696,7 @@ KEEP(*(.orc_unwind_ip)) \ VMLINUX_SYMBOL(__stop_orc_unwind_ip) = .; \ } \ - . = ALIGN(6); \ + . = ALIGN(2); \ .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) { \ VMLINUX_SYMBOL(__start_orc_unwind) = .; \ KEEP(*(.orc_unwind)) \
Greg Kroah-Hartman
maintainerPATCH 163/183 perf intel-pt: Fix CYC timestamp calculation after OVF
In reply to Greg Kroah-Hartman4.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit 03997612904866abe7cdcc992784ef65cb3a4b81 upstream.
CYC packet timestamp calculation depends upon CBR which was being cleared upon overflow (OVF). That can cause errors due to failing to synchronize with sideband events. Even if a CBR change has been lost, the old CBR is still a better estimate than zero. So remove the clearing of CBR.
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 1 - 1 file changed, 1 deletion(-)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +0 -1
@@ -1389,7 +1389,6 @@ static int intel_pt_overflow(struct inte {intel_pt_log ("ERROR: Buffer overflow\n" );intel_pt_clear_tx_flags (decoder); - decoder->cbr =0 ; decoder->timestamp_insn_cnt =0 ; decoder->pkt_state =INTEL_PT_STATE_ERR_RESYNC ; decoder->overflow = true;