4.4.181-stable review
Subsystems (7)
Greg Kroah-Hartman
maintainercover 4.4.181-stable review
This is the start of the stable review cycle for the 4.4.181 release. There are 241 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 Tue 11 Jun 2019 04:39:53 PM UTC. 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.4.181-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.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.4.181-rc1
Kirill Smelkov <[email protected]>
fuse: Add FOPEN_STREAM to use stream_open()
Kirill Smelkov <[email protected]>
fs: stream_open - opener for stream-like files so that read and write can run simultaneously without deadlock
Patrik Jakobsson <[email protected]>
drm/gma500/cdv: Check vbt config bits when detecting lvds panels
Dan Carpenter <[email protected]>
genwqe: Prevent an integer overflow in the ioctl
Paul Burton <[email protected]>
MIPS: pistachio: Build uImage.gz by default
Miklos Szeredi <[email protected]>
fuse: fallocate: fix return with locked inode
John David Anglin <[email protected]>
parisc: Use implicit space register selection for loading the coherence index of I/O pdirs
Linus Torvalds <[email protected]>
rcu: locking and unlocking need to always be at least barriers
Paolo Abeni <[email protected]>
pktgen: do not sleep with the thread lock held.
Zhu Yanjun <[email protected]>
net: rds: fix memory leak in rds_ib_flush_mr_pool
Erez Alfasi <[email protected]>
net/mlx4_en: ethtool, Remove unsupported SFP EEPROM high pages query
David Ahern <[email protected]>
neighbor: Call __ipv4_neigh_lookup_noref in neigh_xmit
Vivien Didelot <[email protected]>
ethtool: fix potential userspace buffer overflow
Nadav Amit <[email protected]>
media: uvcvideo: Fix uvc_alloc_entity() allocation alignment
Peter Chen <[email protected]>
usb: gadget: fix request length error for isoc transfer
Bjørn Mork <[email protected]>
net: cdc_ncm: GetNtbFormat endian fix
Greg Kroah-Hartman <[email protected]>
Revert "x86/build: Move _etext to actual end of .text"
Oleg Nesterov <[email protected]>
userfaultfd: don't pin the user memory in userfaultfd_file_create()
Arend van Spriel <[email protected]>
brcmfmac: add subtype check for event handling in data path
Arend Van Spriel <[email protected]>
brcmfmac: add length checks in scheduled scan result handler
Gavin Li <[email protected]>
brcmfmac: fix incorrect event channel deduction
Arend van Spriel <[email protected]>
brcmfmac: revise handling events in receive path
Franky Lin <[email protected]>
brcmfmac: screening firmware event packet
Hante Meuleman <[email protected]>
brcmfmac: Add length checks on firmware events
Daniel Axtens <[email protected]>
bnx2x: disable GSO where gso_size is too big for hardware
Daniel Axtens <[email protected]>
net: create skb_gso_validate_mac_len()
Todd Kjos <[email protected]>
binder: replace "%p" with "%pK"
Ben Hutchings <[email protected]>
binder: Replace "%p" with "%pK" for stable
Roberto Bergantinos Corpas <[email protected]>
CIFS: cifs_read_allocate_pages: don't iterate through whole page array on ENOMEM
Zhenliang Wei <[email protected]>
kernel/signal.c: trace_signal_deliver when signal_group_exit
Jiri Slaby <[email protected]>
memcg: make it work on sparse non-0-node systems
Joe Burmeister <[email protected]>
tty: max310x: Fix external crystal register setup
Jorge Ramirez-Ortiz <[email protected]>
tty: serial: msm_serial: Fix XON/XOFF
Lyude Paul <[email protected]>
drm/nouveau/i2c: Disable i2c bus access after ->fini()
Kailang Yang <[email protected]>
ALSA: hda/realtek - Set default power save node to 0
Filipe Manana <[email protected]>
Btrfs: fix race updating log root item during fsync
Steffen Maier <[email protected]>
scsi: zfcp: fix to prevent port_remove with pure auto scan LUNs (only sdevs)
Steffen Maier <[email protected]>
scsi: zfcp: fix missing zfcp_port reference put on -EBUSY from port_remove
Mauro Carvalho Chehab <[email protected]>
media: smsusb: better handle optional alignment
Alan Stern <[email protected]>
media: usb: siano: Fix false-positive "uninitialized variable" warning
Alan Stern <[email protected]>
media: usb: siano: Fix general protection fault in smsusb
Oliver Neukum <[email protected]>
USB: rio500: fix memory leak in close after disconnect
Oliver Neukum <[email protected]>
USB: rio500: refuse more than one device at a time
Maximilian Luz <[email protected]>
USB: Add LPM quirk for Surface Dock GigE adapter
Oliver Neukum <[email protected]>
USB: sisusbvga: fix oops in error path of sisusb_probe
Alan Stern <[email protected]>
USB: Fix slab-out-of-bounds write in usb_get_bos_descriptor
Carsten Schmid <[email protected]>
usb: xhci: avoid null pointer deref when bos field is NULL
Andrey Smirnov <[email protected]>
xhci: Convert xhci_handshake() to use readl_poll_timeout_atomic()
Rasmus Villemoes <[email protected]>
include/linux/bitops.h: sanitize rotate primitives
James Clarke <[email protected]>
sparc64: Fix regression in non-hypervisor TLB flush xcall
Junwei Hu <[email protected]>
tipc: fix modprobe tipc failed after switch order of device registration -v2
David S. Miller <[email protected]>
Revert "tipc: fix modprobe tipc failed after switch order of device registration"
Konrad Rzeszutek Wilk <[email protected]>
xen/pciback: Don't disable PCI_COMMAND on PCI device reset.
Daniel Axtens <[email protected]>
crypto: vmx - ghash: do nosimd fallback manually
Antoine Tenart <[email protected]>
net: mvpp2: fix bad MVPP2_TXQ_SCHED_TOKEN_CNTR_REG queue value
Michael Chan <[email protected]>
bnxt_en: Fix aggregation buffer leak under OOM condition.
Chris Packham <[email protected]>
tipc: Avoid copying bytes beyond the supplied data
Kloetzke Jan <[email protected]>
usbnet: fix kernel crash after disconnect
Jisheng Zhang <[email protected]>
net: stmmac: fix reset gpio free missing
Eric Dumazet <[email protected]>
net-gro: fix use-after-free read in napi_gro_frags()
Eric Dumazet <[email protected]>
llc: fix skb leak in llc_build_and_send_ui_pkt()
Mike Manning <[email protected]>
ipv6: Consider sk_bound_dev_if when binding a raw socket to an address
Arnd Bergmann <[email protected]>
ASoC: davinci-mcasp: Fix clang warning without CONFIG_PM
Chris Lesiak <[email protected]>
spi: Fix zero length xfer bug
Geert Uytterhoeven <[email protected]>
spi: rspi: Fix sequencer reset during initialization
Aditya Pakki <[email protected]>
spi : spi-topcliff-pch: Fix to handle empty DMA buffers
James Smart <[email protected]>
scsi: lpfc: Fix SLI3 commands being issued on SLI4 devices
Arnd Bergmann <[email protected]>
media: saa7146: avoid high stack usage with clang
Arnd Bergmann <[email protected]>
media: go7007: avoid clang frame overflow warning with KASAN
James Hutchinson <[email protected]>
media: m88ds3103: serialize reset messages in m88ds3103_set_frontend
Arnd Bergmann <[email protected]>
scsi: qla4xxx: avoid freeing unallocated dma memory
Tony Lindgren <[email protected]>
usb: core: Add PM runtime calls to usb_hcd_platform_shutdown
Paul E. McKenney <[email protected]>
rcutorture: Fix cleanup path for invalid torture_type strings
Kangjie Lu <[email protected]>
tty: ipwireless: fix missing checks for ioremap
Pankaj Gupta <[email protected]>
virtio_console: initialize vtermno value for ports
Dan Carpenter <[email protected]>
media: wl128x: prevent two potential buffer overflows
Sowjanya Komatineni <[email protected]>
spi: tegra114: reset controller on probe
Gustavo A. R. Silva <[email protected]>
cxgb3/l2t: Fix undefined behaviour
Wen Yang <[email protected]>
ASoC: fsl_utils: fix a leaked reference by adding missing of_node_put
Wen Yang <[email protected]>
ASoC: eukrea-tlv320: fix a leaked reference by adding missing of_node_put
Nicolas Saenz Julienne <[email protected]>
HID: core: move Usage Page concatenation to Main item
Chengguang Xu <[email protected]>
chardev: add additional check for minor range overlap
Peter Zijlstra <[email protected]>
x86/ia32: Fix ia32_restore_sigcontext() AC leak
Wen Yang <[email protected]>
arm64: cpu_ops: fix a leaked reference by adding missing of_node_put
Stanley Chu <[email protected]>
scsi: ufs: Avoid configuring regulator with undefined voltage range
Stanley Chu <[email protected]>
scsi: ufs: Fix regulator load and icc-level configuration
Piotr Figiel <[email protected]>
brcmfmac: fix race during disconnect when USB completion is in progress
Piotr Figiel <[email protected]>
brcmfmac: convert dev_init_lock mutex to completion
Arnd Bergmann <[email protected]>
b43: shut up clang -Wuninitialized variable warning
Kangjie Lu <[email protected]>
brcmfmac: fix missing checks for kmemdup
Kangjie Lu <[email protected]>
rtlwifi: fix a potential NULL pointer dereference
Nathan Chancellor <[email protected]>
iio: common: ssp_sensors: Initialize calculated_time in ssp_common_process_data
Kangjie Lu <[email protected]>
iio: hmc5843: fix potential NULL pointer dereferences
Lars-Peter Clausen <[email protected]>
iio: ad_sigma_delta: Properly handle SPI bus locking vs CS assertion
Kees Cook <[email protected]>
x86/build: Keep local relocations with ld.lld
Wen Yang <[email protected]>
cpufreq: pmac32: fix possible object reference leak
Wen Yang <[email protected]>
cpufreq/pasemi: fix possible object reference leak
Wen Yang <[email protected]>
cpufreq: ppc_cbe: fix possible object reference leak
Arnd Bergmann <[email protected]>
s390: cio: fix cio_irb declaration
Charles Keepax <[email protected]>
extcon: arizona: Disable mic detect if running when driver is removed
Ulf Hansson <[email protected]>
PM / core: Propagate dev->power.wakeup_path when no callbacks
Yinbo Zhu <[email protected]>
mmc: sdhci-of-esdhc: add erratum eSDHC-A001 and A-008358 support
Yinbo Zhu <[email protected]>
mmc: sdhci-of-esdhc: add erratum eSDHC5 support
Kangjie Lu <[email protected]>
mmc_spi: add a status check for spi_sync_locked
John Garry <[email protected]>
scsi: libsas: Do discovery on empty PHY to update PHY info
Guenter Roeck <[email protected]>
hwmon: (f71805f) Use request_muxed_region for Super-IO accesses
Guenter Roeck <[email protected]>
hwmon: (pc87427) Use request_muxed_region for Super-IO accesses
Guenter Roeck <[email protected]>
hwmon: (smsc47b397) Use request_muxed_region for Super-IO accesses
Guenter Roeck <[email protected]>
hwmon: (smsc47m1) Use request_muxed_region for Super-IO accesses
Guenter Roeck <[email protected]>
hwmon: (vt1211) Use request_muxed_region for Super-IO accesses
Colin Ian King <[email protected]>
RDMA/cxgb4: Fix null pointer dereference on alloc_skb failure
Nicholas Nunley <[email protected]>
i40e: don't allow changes to HW VLAN stripping on active port VLANs
Thomas Gleixner <[email protected]>
x86/irq/64: Limit IST stack overflow check to #DB stack
Alan Stern <[email protected]>
USB: core: Don't unbind interfaces following device reset failure
Konstantin Khlebnikov <[email protected]>
sched/core: Handle overflow in cpu_shares_write_u64
Konstantin Khlebnikov <[email protected]>
sched/core: Check quota and period overflow at usec to nsec conversion
Nathan Lynch <[email protected]>
powerpc/numa: improve control of topology updates
Dan Carpenter <[email protected]>
media: pvrusb2: Prevent a buffer overflow
Shuah Khan <[email protected]>
media: au0828: Fix NULL pointer dereference in au0828_analog_stream_enable()
Wenwen Wang <[email protected]>
audit: fix a memory leak bug
Akinobu Mita <[email protected]>
media: ov2659: make S_FMT succeed even if requested format doesn't match
Hans Verkuil <[email protected]>
media: au0828: stop video streaming only when last user stops
Janusz Krzysztofik <[email protected]>
media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
Philipp Zabel <[email protected]>
media: coda: clear error return value before picture run
Nicolas Ferre <[email protected]>
dmaengine: at_xdmac: remove BUG_ON macro in tasklet
Wen Yang <[email protected]>
pinctrl: pistachio: fix leaked of_node references
Hans de Goede <[email protected]>
HID: logitech-hidpp: use RAP instead of FAP to get the protocol version
Peter Zijlstra <[email protected]>
mm/uaccess: Use 'unsigned long' to placate UBSAN warnings on older GCC versions
Jiri Kosina <[email protected]>
x86/mm: Remove in_nmi() warning from 64-bit implementation of vmalloc_fault()
Sebastian Andrzej Siewior <[email protected]>
smpboot: Place the __percpu annotation correctly
Kees Cook <[email protected]>
x86/build: Move _etext to actual end of .text
Arnd Bergmann <[email protected]>
bcache: avoid clang -Wunintialized warning
Coly Li <[email protected]>
bcache: add failure check to run_cache_set() for journal replay
Tang Junhui <[email protected]>
bcache: fix failure in journal relplay
Coly Li <[email protected]>
bcache: return error immediately in bch_journal_replay()
Kangjie Lu <[email protected]>
net: cw1200: fix a NULL pointer dereference
Dan Carpenter <[email protected]>
mwifiex: prevent an array overflow
Daniel Baluta <[email protected]>
ASoC: fsl_sai: Update is_slave_mode with correct value
Sergey Matyukevich <[email protected]>
mac80211/cfg80211: update bss channel on channel switch
Sugar Zhang <[email protected]>
dmaengine: pl330: _stop: clear interrupt status
Mariusz Bialonczyk <[email protected]>
w1: fix the resume command API
Sven Van Asbroeck <[email protected]>
rtc: 88pm860x: prevent use-after-free on device remove
Dan Carpenter <[email protected]>
brcm80211: potential NULL dereference in brcmf_cfg80211_vndr_cmds_dcmd_handler()
Flavio Suligoi <[email protected]>
spi: pxa2xx: fix SCR (divisor) calculation
Arnd Bergmann <[email protected]>
ASoC: imx: fix fiq dependencies
Bo YU <[email protected]>
powerpc/boot: Fix missing check of lseek() return value
Raul E Rangel <[email protected]>
mmc: core: Verify SD bus width
YueHaibing <[email protected]>
cxgb4: Fix error path in cxgb4_init_module
Ross Lagerwall <[email protected]>
gfs2: Fix lru_count going negative
Arnaldo Carvalho de Melo <[email protected]>
tools include: Adopt linux/bits.h
Arnaldo Carvalho de Melo <[email protected]>
perf tools: No need to include bitops.h in util.h
YueHaibing <[email protected]>
at76c50x-usb: Don't register led_trigger if usb_register_driver failed
YueHaibing <[email protected]>
ssb: Fix possible NULL pointer dereference in ssb_host_pcmcia_exit
Alexander Potapenko <[email protected]>
media: vivid: use vfree() instead of kfree() for dev->bitmap_cap
YueHaibing <[email protected]>
media: cpia2: Fix use-after-free in cpia2_exit
Jiufei Xue <[email protected]>
fbdev: fix WARNING in __alloc_pages_nodemask bug
Mike Kravetz <[email protected]>
hugetlb: use same fault hash key for shared and private mappings
Shile Zhang <[email protected]>
fbdev: fix divide error in fb_var_to_videomode
Tobin C. Harding <[email protected]>
btrfs: sysfs: don't leak memory when failing add fsid
Filipe Manana <[email protected]>
Btrfs: fix race between ranged fsync and writeback of adjacent ranges
Andreas Gruenbacher <[email protected]>
gfs2: Fix sign extension bug in gfs2_update_stats
Daniel Axtens <[email protected]>
crypto: vmx - CTR: always increment IV as quadword
Martin K. Petersen <[email protected]>
Revert "scsi: sd: Keep disk read-only when re-reading partition"
Andrea Parri <[email protected]>
bio: fix improper use of smp_mb__before_atomic()
Paolo Bonzini <[email protected]>
KVM: x86: fix return value for reserved EFER
Jan Kara <[email protected]>
ext4: do not delete unlinked inode from orphan list on failed truncate
Yifeng Li <[email protected]>
fbdev: sm712fb: fix memory frequency by avoiding a switch/case fallthrough
Nikolay Borisov <[email protected]>
btrfs: Honour FITRIM range constraints during free space trim
Nigel Croxon <[email protected]>
md/raid: raid5 preserve the writeback action after the parity check
Song Liu <[email protected]>
Revert "Don't jump to compute_result state from check_result state"
Arnaldo Carvalho de Melo <[email protected]>
perf bench numa: Add define for RUSAGE_THREAD if not present
Al Viro <[email protected]>
ufs: fix braino in ufs_get_inode_gid() for solaris UFS flavour
Andrey Smirnov <[email protected]>
power: supply: sysfs: prevent endless uevent loop with CONFIG_POWER_SUPPLY_DEBUG
Andrew Jones <[email protected]>
KVM: arm/arm64: Ensure vcpu target is unset on reset failure
Steffen Klassert <[email protected]>
xfrm4: Fix uninitialized memory read in _decode_session4
Jeremy Sowden <[email protected]>
vti4: ipip tunnel deregistration fixes.
Su Yanjun <[email protected]>
xfrm6_tunnel: Fix potential panic when unloading xfrm6_tunnel module
YueHaibing <[email protected]>
xfrm: policy: Fix out-of-bound array accesses in __xfrm_policy_unlink
Mikulas Patocka <[email protected]>
dm delay: fix a crash when invalid device is specified
James Prestwood <[email protected]>
PCI: Mark Atheros AR9462 to avoid bus reset
Yifeng Li <[email protected]>
fbdev: sm712fb: fix crashes and garbled display during DPMS modesetting
Yifeng Li <[email protected]>
fbdev: sm712fb: use 1024x768 by default on non-MIPS, fix garbled display
Yifeng Li <[email protected]>
fbdev: sm712fb: fix support for 1024x768-16 mode
Yifeng Li <[email protected]>
fbdev: sm712fb: fix crashes during framebuffer writes by correctly mapping VRAM
Yifeng Li <[email protected]>
fbdev: sm712fb: fix boot screen glitch when sm712fb replaces VGA
Yifeng Li <[email protected]>
fbdev: sm712fb: fix white screen of death on reboot, don't set CR3B-CR3F
Yifeng Li <[email protected]>
fbdev: sm712fb: fix VRAM detection, don't set SR70/71/74/75
Yifeng Li <[email protected]>
fbdev: sm712fb: fix brightness control on reboot, don't set SR30
Adrian Hunter <[email protected]>
perf intel-pt: Fix sample timestamp wrt non-taken branches
Adrian Hunter <[email protected]>
perf intel-pt: Fix improved sample timestamp
Adrian Hunter <[email protected]>
perf intel-pt: Fix instructions sampling rate
Dmitry Osipenko <[email protected]>
memory: tegra: Fix integer overflow on tick value calculation
Elazar Leibovich <[email protected]>
tracing: Fix partial reading of trace event's id file
Jeff Layton <[email protected]>
ceph: flush dirty inodes before proceeding with remount
Dmitry Osipenko <[email protected]>
iommu/tegra-smmu: Fix invalid ASID bits on Tegra30/114
Liu Bo <[email protected]>
fuse: honor RLIMIT_FSIZE in fuse_file_fallocate
Miklos Szeredi <[email protected]>
fuse: fix writepages on 32bit
Dmitry Osipenko <[email protected]>
clk: tegra: Fix PLLM programming on Tegra124+ when PMC overrides divider
ZhangXiaoxu <[email protected]>
NFS4: Fix v4.0 client state corruption when mount
Janusz Krzysztofik <[email protected]>
media: ov6650: Fix sensor possibly not detected on probe
Christoph Probst <[email protected]>
cifs: fix strcat buffer overflow and reduce raciness in smb21_set_oplock_level()
Phong Tran <[email protected]>
of: fix clang -Wunsequenced for be32_to_cpu()
Alexander Shishkin <[email protected]>
intel_th: msu: Fix single mode with IOMMU
Yufen Yu <[email protected]>
md: add mddev->pers to avoid potential NULL pointer dereference
Tingwei Zhang <[email protected]>
stm class: Fix channel free in stm output free path
Junwei Hu <[email protected]>
tipc: fix modprobe tipc failed after switch order of device registration
Junwei Hu <[email protected]>
tipc: switch order of device registration to fix a crash
YueHaibing <[email protected]>
ppp: deflate: Fix possible crash in deflate_init
Yunjian Wang <[email protected]>
net/mlx4_core: Change the error print to info print
Eric Dumazet <[email protected]>
net: avoid weird emergency message
Sean Christopherson <[email protected]>
KVM: x86: Skip EFER vs. guest CPUID checks for host-initiated writes
Michał Wadowski <[email protected]>
ALSA: hda/realtek - Fix for Lenovo B50-70 inverted internal microphone bug
Sriram Rajagopalan <[email protected]>
ext4: zero out the unused memory region in the extent tree block
Jiufei Xue <[email protected]>
fs/writeback.c: use rcu_barrier() to wait for inflight wb switches going into workqueue when umount
Tejun Heo <[email protected]>
writeback: synchronize sync(2) against cgroup writeback membership switches
Eric Biggers <[email protected]>
crypto: arm/aes-neonbs - don't access already-freed walk.iv
Eric Biggers <[email protected]>
crypto: salsa20 - don't access already-freed walk.iv
Eric Biggers <[email protected]>
crypto: chacha20poly1305 - set cra_name correctly
Eric Biggers <[email protected]>
crypto: gcm - fix incompatibility between "gcm" and "gcm_base"
Wei Yongjun <[email protected]>
crypto: gcm - Fix error return code in crypto_gcm_create_common()
Kamlakant Patel <[email protected]>
ipmi:ssif: compare block number correctly for multi-part return messages
Coly Li <[email protected]>
bcache: never set KEY_PTRS of journal key to 0 in journal_reclaim()
Liang Chen <[email protected]>
bcache: fix a race between cache register and cacheset unregister
Filipe Manana <[email protected]>
Btrfs: do not start a transaction at iterate_extent_inodes()
Debabrata Banerjee <[email protected]>
ext4: fix ext4_show_options for file systems w/o journal
Kirill Tkhai <[email protected]>
ext4: actually request zeroing of inode table after grow
Sergei Trofimovich <[email protected]>
tty/vt: fix write/write race in ioctl(KDSKBSENT) handler
Steve Twiss <[email protected]>
mfd: da9063: Fix OTP control register names to match datasheets for DA9063/63L
Shuning Zhang <[email protected]>
ocfs2: fix ocfs2 read inode data panic in ocfs2_iget
Jiri Kosina <[email protected]>
mm/mincore.c: make mincore() more conservative
Curtis Malainey <[email protected]>
ASoC: RT5677-SPI: Disable 16Bit SPI Transfers
Jon Hunter <[email protected]>
ASoC: max98090: Fix restore of DAPM Muxes
Kailang Yang <[email protected]>
ALSA: hda/realtek - EAPD turn on later
Hui Wang <[email protected]>
ALSA: hda/hdmi - Consider eld_valid when reporting jack event
Wenwen Wang <[email protected]>
ALSA: usb-audio: Fix a memory leak bug
Eric Biggers <[email protected]>
crypto: x86/crct10dif-pcl - fix use via crypto_shash_digest()
Eric Biggers <[email protected]>
crypto: crct10dif-generic - fix use via crypto_shash_digest()
Daniel Axtens <[email protected]>
crypto: vmx - fix copy-paste error in CTR mode
Wen Yang <[email protected]>
ARM: exynos: Fix a leaked reference by adding missing of_node_put
Andy Lutomirski <[email protected]>
x86/speculation/mds: Improve CPU buffer clear documentation
Andy Lutomirski <[email protected]>
x86/speculation/mds: Revert CPU buffer clear on double fault exit
-------------
Diffstat:
Documentation/x86/mds.rst | 44 +-- Makefile | 4 +- arch/arm/crypto/aesbs-glue.c | 4 + arch/arm/kvm/arm.c | 11 +- arch/arm/mach-exynos/firmware.c | 1 + arch/arm/mach-exynos/suspend.c | 2 + arch/arm64/kernel/cpu_ops.c | 1 + arch/mips/pistachio/Platform | 1 + arch/powerpc/boot/addnote.c | 6 +- arch/powerpc/mm/numa.c | 18 +- arch/sparc/mm/ultra.S | 4 +- arch/x86/Makefile | 2 +- arch/x86/crypto/crct10dif-pclmul_glue.c | 13 +- arch/x86/ia32/ia32_signal.c | 29 +- arch/x86/kernel/irq_64.c | 19 +- arch/x86/kernel/traps.c | 8 - arch/x86/kvm/x86.c | 31 +- arch/x86/mm/fault.c | 2 - crypto/chacha20poly1305.c | 4 +- crypto/crct10dif_generic.c | 11 +- crypto/gcm.c | 36 +- crypto/salsa20_generic.c | 2 +- drivers/android/binder.c | 36 +- drivers/base/power/main.c | 4 + drivers/char/ipmi/ipmi_ssif.c | 6 +- drivers/char/virtio_console.c | 3 +- drivers/clk/tegra/clk-pll.c | 4 +- drivers/cpufreq/pasemi-cpufreq.c | 1 + drivers/cpufreq/pmac32-cpufreq.c | 2 + drivers/cpufreq/ppc_cbe_cpufreq.c | 1 + drivers/crypto/vmx/aesp8-ppc.pl | 6 +- drivers/crypto/vmx/ghash.c | 218 +++++-------- drivers/dma/at_xdmac.c | 6 +- drivers/dma/pl330.c | 10 +- drivers/extcon/extcon-arizona.c | 10 + drivers/gpu/drm/gma500/cdv_intel_lvds.c | 3 + drivers/gpu/drm/gma500/intel_bios.c | 3 + drivers/gpu/drm/gma500/psb_drv.h | 1 + drivers/gpu/drm/nouveau/include/nvkm/subdev/i2c.h | 2 + drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c | 26 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h | 2 + drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c | 15 + drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c | 21 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.h | 1 + drivers/hid/hid-core.c | 36 +- drivers/hid/hid-logitech-hidpp.c | 17 +- drivers/hwmon/f71805f.c | 15 +- drivers/hwmon/pc87427.c | 14 +- drivers/hwmon/smsc47b397.c | 13 +- drivers/hwmon/smsc47m1.c | 28 +- drivers/hwmon/vt1211.c | 15 +- drivers/hwtracing/intel_th/msu.c | 35 +- drivers/hwtracing/stm/core.c | 2 +- drivers/iio/adc/ad_sigma_delta.c | 16 +- drivers/iio/common/ssp_sensors/ssp_iio.c | 2 +- drivers/infiniband/hw/cxgb4/cm.c | 2 + drivers/iommu/tegra-smmu.c | 25 +- drivers/md/bcache/alloc.c | 5 +- drivers/md/bcache/journal.c | 37 ++- drivers/md/bcache/super.c | 19 +- drivers/md/dm-delay.c | 3 +- drivers/md/md.c | 6 +- drivers/md/raid5.c | 29 +- drivers/media/dvb-frontends/m88ds3103.c | 9 +- drivers/media/i2c/ov2659.c | 6 +- drivers/media/i2c/soc_camera/ov6650.c | 27 +- drivers/media/pci/saa7146/hexium_gemini.c | 5 +- drivers/media/pci/saa7146/hexium_orion.c | 5 +- drivers/media/platform/coda/coda-bit.c | 3 + drivers/media/platform/vivid/vivid-vid-cap.c | 2 +- drivers/media/radio/wl128x/fmdrv_common.c | 7 +- drivers/media/usb/au0828/au0828-video.c | 16 +- drivers/media/usb/cpia2/cpia2_v4l.c | 3 +- drivers/media/usb/go7007/go7007-fw.c | 4 +- drivers/media/usb/pvrusb2/pvrusb2-hdw.c | 2 + drivers/media/usb/pvrusb2/pvrusb2-hdw.h | 1 + drivers/media/usb/siano/smsusb.c | 33 +- drivers/media/usb/uvc/uvc_driver.c | 2 +- drivers/memory/tegra/mc.c | 2 +- drivers/misc/genwqe/card_dev.c | 2 + drivers/misc/genwqe/card_utils.c | 4 + drivers/mmc/core/sd.c | 8 + drivers/mmc/host/mmc_spi.c | 4 + drivers/mmc/host/sdhci-of-esdhc.c | 5 + drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 18 + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 + drivers/net/ethernet/chelsio/cxgb3/l2t.h | 2 +- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 15 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 8 + drivers/net/ethernet/marvell/mvpp2.c | 10 +- drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 4 +- drivers/net/ethernet/mellanox/mlx4/mcg.c | 2 +- drivers/net/ethernet/mellanox/mlx4/port.c | 5 - drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | 3 +- drivers/net/ppp/ppp_deflate.c | 20 +- drivers/net/usb/cdc_ncm.c | 4 +- drivers/net/usb/usbnet.c | 6 + drivers/net/wireless/at76c50x-usb.c | 4 +- drivers/net/wireless/b43/phy_lp.c | 6 +- drivers/net/wireless/brcm80211/brcmfmac/bus.h | 4 +- drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 23 +- drivers/net/wireless/brcm80211/brcmfmac/core.c | 45 ++- drivers/net/wireless/brcm80211/brcmfmac/fweh.c | 57 +--- drivers/net/wireless/brcm80211/brcmfmac/fweh.h | 82 ++++- drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c | 42 ++- drivers/net/wireless/brcm80211/brcmfmac/p2p.c | 10 + drivers/net/wireless/brcm80211/brcmfmac/sdio.c | 32 +- drivers/net/wireless/brcm80211/brcmfmac/usb.c | 29 +- drivers/net/wireless/brcm80211/brcmfmac/vendor.c | 5 +- drivers/net/wireless/cw1200/main.c | 5 + drivers/net/wireless/mwifiex/cfp.c | 3 + drivers/net/wireless/realtek/rtlwifi/base.c | 5 + drivers/parisc/ccio-dma.c | 4 +- drivers/parisc/sba_iommu.c | 3 +- drivers/pci/quirks.c | 1 + drivers/pinctrl/pinctrl-pistachio.c | 2 + drivers/power/power_supply_sysfs.c | 6 - drivers/rtc/rtc-88pm860x.c | 2 +- drivers/s390/cio/cio.h | 2 +- drivers/s390/scsi/zfcp_ext.h | 1 + drivers/s390/scsi/zfcp_scsi.c | 9 + drivers/s390/scsi/zfcp_sysfs.c | 55 +++- drivers/s390/scsi/zfcp_unit.c | 8 +- drivers/scsi/libsas/sas_expander.c | 5 + drivers/scsi/lpfc/lpfc_hbadisc.c | 11 +- drivers/scsi/qla4xxx/ql4_os.c | 2 +- drivers/scsi/sd.c | 3 +- drivers/scsi/ufs/ufshcd.c | 28 +- drivers/spi/spi-pxa2xx.c | 8 +- drivers/spi/spi-rspi.c | 9 +- drivers/spi/spi-tegra114.c | 32 +- drivers/spi/spi-topcliff-pch.c | 15 +- drivers/spi/spi.c | 2 + drivers/ssb/bridge_pcmcia_80211.c | 9 +- drivers/staging/iio/magnetometer/hmc5843_i2c.c | 7 +- drivers/staging/iio/magnetometer/hmc5843_spi.c | 7 +- drivers/tty/ipwireless/main.c | 8 + drivers/tty/serial/max310x.c | 2 +- drivers/tty/serial/msm_serial.c | 5 +- drivers/tty/vt/keyboard.c | 33 +- drivers/usb/core/config.c | 4 +- drivers/usb/core/hcd.c | 3 + drivers/usb/core/hub.c | 5 +- drivers/usb/core/quirks.c | 3 + drivers/usb/host/xhci.c | 24 +- drivers/usb/misc/rio500.c | 41 ++- drivers/usb/misc/sisusbvga/sisusb.c | 15 +- drivers/video/fbdev/core/fbcmap.c | 2 + drivers/video/fbdev/core/modedb.c | 3 + drivers/video/fbdev/sm712.h | 12 +- drivers/video/fbdev/sm712fb.c | 243 +++++++++++--- drivers/w1/w1_io.c | 3 +- drivers/xen/xen-pciback/pciback_ops.c | 2 - drivers/xen/xenbus/xenbus_dev_frontend.c | 2 +- fs/btrfs/backref.c | 18 +- fs/btrfs/extent-tree.c | 25 +- fs/btrfs/file.c | 12 + fs/btrfs/sysfs.c | 7 +- fs/btrfs/tree-log.c | 8 +- fs/ceph/super.c | 7 + fs/char_dev.c | 6 + fs/cifs/file.c | 4 +- fs/cifs/smb2ops.c | 14 +- fs/ext4/extents.c | 17 +- fs/ext4/inode.c | 2 +- fs/ext4/ioctl.c | 2 +- fs/ext4/super.c | 2 +- fs/fs-writeback.c | 51 ++- fs/fuse/file.c | 13 +- fs/gfs2/glock.c | 22 +- fs/gfs2/lock_dlm.c | 9 +- fs/hugetlbfs/inode.c | 8 +- fs/nfs/nfs4state.c | 4 + fs/ocfs2/export.c | 30 +- fs/open.c | 18 + fs/read_write.c | 5 +- fs/ufs/util.h | 2 +- fs/userfaultfd.c | 41 ++- include/linux/backing-dev-defs.h | 1 + include/linux/bio.h | 2 +- include/linux/bitops.h | 16 +- include/linux/fs.h | 4 + include/linux/hid.h | 1 + include/linux/hugetlb.h | 4 +- include/linux/iio/adc/ad_sigma_delta.h | 1 + include/linux/list_lru.h | 1 + include/linux/mfd/da9063/registers.h | 6 +- include/linux/of.h | 4 +- include/linux/rcupdate.h | 6 +- include/linux/sched.h | 7 +- include/linux/skbuff.h | 30 ++ include/linux/smpboot.h | 2 +- include/linux/usb/gadget.h | 4 +- include/uapi/linux/fuse.h | 2 + include/uapi/linux/tipc_config.h | 10 +- kernel/auditfilter.c | 12 +- kernel/rcu/rcutorture.c | 5 + kernel/sched/core.c | 9 +- kernel/signal.c | 2 + kernel/trace/trace_events.c | 3 - lib/strncpy_from_user.c | 5 +- lib/strnlen_user.c | 4 +- mm/backing-dev.c | 1 + mm/hugetlb.c | 19 +- mm/list_lru.c | 8 +- mm/mincore.c | 23 +- net/core/dev.c | 4 +- net/core/ethtool.c | 5 +- net/core/neighbour.c | 9 +- net/core/pktgen.c | 11 + net/ipv4/ip_vti.c | 5 +- net/ipv4/xfrm4_policy.c | 24 +- net/ipv6/raw.c | 2 + net/ipv6/xfrm6_tunnel.c | 4 + net/llc/llc_output.c | 2 + net/mac80211/mlme.c | 3 - net/rds/ib_rdma.c | 10 +- net/sched/sch_tbf.c | 10 - net/tipc/core.c | 32 +- net/tipc/subscr.c | 14 +- net/tipc/subscr.h | 5 +- net/wireless/nl80211.c | 5 + net/xfrm/xfrm_user.c | 2 +- scripts/coccinelle/api/stream_open.cocci | 363 +++++++++++++++++++++ sound/pci/hda/patch_hdmi.c | 6 +- sound/pci/hda/patch_realtek.c | 7 +- sound/soc/codecs/max98090.c | 12 +- sound/soc/codecs/rt5677-spi.c | 35 +- sound/soc/davinci/davinci-mcasp.c | 2 + sound/soc/fsl/Kconfig | 9 +- sound/soc/fsl/eukrea-tlv320.c | 4 +- sound/soc/fsl/fsl_sai.c | 2 + sound/soc/fsl/fsl_utils.c | 1 + sound/usb/mixer.c | 2 + tools/include/linux/bitops.h | 7 +- tools/include/linux/bits.h | 26 ++ tools/perf/bench/numa.c | 4 + .../perf/util/intel-pt-decoder/intel-pt-decoder.c | 31 +- tools/perf/util/string.c | 1 + tools/perf/util/util.h | 1 - 240 files changed, 2424 insertions(+), 950 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/241 x86/speculation/mds: Revert CPU buffer clear on double fault exit
From: Andy Lutomirski <[email protected]>
commit 88640e1dcd089879530a49a8d212d1814678dfe7 upstream.
The double fault ESPFIX path doesn't return to user mode at all -- it returns back to the kernel by simulating a #GP fault. prepare_exit_to_usermode() will run on the way out of general_protection before running user code.
--- Documentation/x86/mds.rst | 7 ------- arch/x86/kernel/traps.c | 8 -------- 2 files changed, 15 deletions(-)
Documentation/x86/mds.rst +0 -7
@@ -158,13 +158,6 @@ Mitigation points mitigated on the return from do_nmi() to provide almost complete coverage. - - Double fault (#DF): - - A double fault is usually fatal, but the ESPFIX workaround, which can - be triggered from user space through modify_ldt(2) is a recoverable - double fault. #DF uses the paranoid exit path, so explicit mitigation - in the double fault handler is required. - - Machine Check Exception (#MC): Another corner case is a #MC which hits between the CPU buffer clear
arch/x86/kernel/traps.c +0 -8
@@ -61,7 +61,6 @@#include <asm/alternative.h> #include <asm/fpu/xstate.h> #include <asm/trace/mpx.h> -#include <asm/nospec-branch.h> #include <asm/mpx.h> #include <asm/vm86.h>
@@ -338,13 +337,6 @@ dotraplinkage void do_double_fault(struc regs->ip = (unsigned long )general_protection; regs->sp = (unsigned long )&normal_regs->orig_ax; -/* -* This situation can be triggered by userspace via -* modify_ldt(2) and the return does not take the regular -* user space exit, so a CPU buffer clear is required when -* MDS mitigation is enabled. -*/ -mds_user_clear_cpu_buffers (); return; }#endif
Greg Kroah-Hartman
maintainerPATCH 2/241 x86/speculation/mds: Improve CPU buffer clear documentation
In reply to Greg Kroah-HartmanFrom: Andy Lutomirski <[email protected]>
commit 9d8d0294e78a164d407133dea05caf4b84247d6a upstream.
On x86_64, all returns to usermode go through prepare_exit_to_usermode(), with the sole exception of do_nmi(). This even includes machine checks -- this was added several years ago to support MCE recovery. Update the documentation.
--- Documentation/x86/mds.rst | 39 +++++++-------------------------------- 1 file changed, 7 insertions(+), 32 deletions(-)
Documentation/x86/mds.rst +7 -32
@@ -142,38 +142,13 @@ Mitigation points mds_user_clear. The mitigation is invoked in prepare_exit_to_usermode() which covers - most of the kernel to user space transitions. There are a few exceptions - which are not invoking prepare_exit_to_usermode() on return to user - space. These exceptions use the paranoid exit code. - - - Non Maskable Interrupt (NMI): - - Access to sensible data like keys, credentials in the NMI context is - mostly theoretical: The CPU can do prefetching or execute a - misspeculated code path and thereby fetching data which might end up - leaking through a buffer. - - But for mounting other attacks the kernel stack address of the task is - already valuable information. So in full mitigation mode, the NMI is - mitigated on the return from do_nmi() to provide almost complete - coverage. - - - Machine Check Exception (#MC): - - Another corner case is a #MC which hits between the CPU buffer clear - invocation and the actual return to user. As this still is in kernel - space it takes the paranoid exit path which does not clear the CPU - buffers. So the #MC handler repopulates the buffers to some - extent. Machine checks are not reliably controllable and the window is - extremly small so mitigation would just tick a checkbox that this - theoretical corner case is covered. To keep the amount of special - cases small, ignore #MC. - - - Debug Exception (#DB): - - This takes the paranoid exit path only when the INT1 breakpoint is in - kernel space. #DB on a user space address takes the regular exit path, - so no extra mitigation required. + all but one of the kernel to user space transitions. The exception + is when we return from a Non Maskable Interrupt (NMI), which is + handled directly in do_nmi(). + + (The reason that NMI is special is that prepare_exit_to_usermode() can + enable IRQs. In NMI context, NMIs are blocked, and we don't want to + enable IRQs with NMIs blocked.) 2. C-State transition
Greg Kroah-Hartman
maintainerPATCH 3/241 ARM: exynos: Fix a leaked reference by adding missing of_node_put
In reply to Greg Kroah-HartmanFrom: Wen Yang <[email protected]>
commit 629266bf7229cd6a550075f5961f95607b823b59 upstream.
The call to of_get_next_child returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage.
Detected by coccinelle with warnings like:
arch/arm/mach-exynos/firmware.c:201:2-8: ERROR: missing of_node_put;
acquired a node pointer with refcount incremented on line 193, but without a corresponding object release within this function.
--- arch/arm/mach-exynos/firmware.c | 1 + arch/arm/mach-exynos/suspend.c | 2 ++ 2 files changed, 3 insertions(+)
arch/arm/mach-exynos/firmware.c +1 -0
@@ -207,6 +207,7 @@ void __init exynos_firmware_init(void)return ; addr =of_get_address (nd,0 ,NULL ,NULL ); +of_node_put (nd);if (!addr) {pr_err ("%s: No address specified.\n" , __func__);return ;
arch/arm/mach-exynos/suspend.c +2 -0
@@ -725,8 +725,10 @@ void __init exynos_pm_init(void)if (WARN_ON (!of_find_property (np,"interrupt-controller" ,NULL ))) {pr_warn ("Outdated DT detected, suspend/resume will NOT work\n" ); +of_node_put (np);return ; } +of_node_put (np); pm_data = (const struct exynos_pm_data *) match->data;
Greg Kroah-Hartman
maintainerPATCH 4/241 crypto: vmx - fix copy-paste error in CTR mode
In reply to Greg Kroah-HartmanFrom: Daniel Axtens <[email protected]>
commit dcf7b48212c0fab7df69e84fab22d6cb7c8c0fb9 upstream.
The original assembly imported from OpenSSL has two copy-paste errors in handling CTR mode. When dealing with a 2 or 3 block tail, the code branches to the CBC decryption exit path, rather than to the CTR exit path.
This leads to corruption of the IV, which leads to subsequent blocks being corrupted.
This can be detected with libkcapi test suite, which is available at
https://github.com/smuellerDD/libkcapi
--- drivers/crypto/vmx/aesp8-ppc.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/crypto/vmx/aesp8-ppc.pl +2 -2
@@ -1795,7 +1795,7 @@ Lctr32_enc8x_three: stvx_u $out1,$x10,$out stvx_u $out2,$x20,$out addi $out,$out,0x30 - b Lcbc_dec8x_done + b Lctr32_enc8x_done .align 5 Lctr32_enc8x_two:
@@ -1807,7 +1807,7 @@ Lctr32_enc8x_two: stvx_u $out0,$x00,$out stvx_u $out1,$x10,$out addi $out,$out,0x20 - b Lcbc_dec8x_done + b Lctr32_enc8x_done .align 5 Lctr32_enc8x_one:
Greg Kroah-Hartman
maintainerPATCH 5/241 crypto: crct10dif-generic - fix use via crypto_shash_digest()
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
commit 307508d1072979f4435416f87936f87eaeb82054 upstream.
The ->digest() method of crct10dif-generic reads the current CRC value from the shash_desc context. But this value is uninitialized, causing crypto_shash_digest() to compute the wrong result. Fix it.
Probably this wasn't noticed before because lib/crc-t10dif.c only uses crypto_shash_update(), not crypto_shash_digest(). Likewise, crypto_shash_digest() is not yet tested by the crypto self-tests because those only test the ahash API which only uses shash init/update/final.
This bug was detected by my patches that improve testmgr to fuzz algorithms against their generic implementation.
--- crypto/crct10dif_generic.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
crypto/crct10dif_generic.c +4 -7
@@ -65,10 +65,9 @@ static int chksum_final(struct shash_desreturn 0 ; } -static int __chksum_finup (__u16 *crcp,const u8 *data,unsigned int len, -u8 *out) +static int __chksum_finup (__u16 crc,const u8 *data,unsigned int len,u8 *out) { - *(__u16 *)out =crc_t10dif_generic (*crcp, data, len); + *(__u16 *)out =crc_t10dif_generic (crc, data, len);return 0 ; }
@@ -77,15 +76,13 @@ static int chksum_finup(struct shash_des {struct chksum_desc_ctx *ctx =shash_desc_ctx (desc); -return __chksum_finup (&ctx->crc, data, len, out); +return __chksum_finup (ctx->crc, data, len, out); }static int chksum_digest (struct shash_desc *desc,const u8 *data,unsigned int length,u8 *out) { -struct chksum_desc_ctx *ctx =shash_desc_ctx (desc); - -return __chksum_finup (&ctx->crc, data, length, out); +return __chksum_finup (0 , data, length, out); }static struct shash_alg alg = {
Greg Kroah-Hartman
maintainerPATCH 6/241 crypto: x86/crct10dif-pcl - fix use via crypto_shash_digest()
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
commit dec3d0b1071a0f3194e66a83d26ecf4aa8c5910e upstream.
The ->digest() method of crct10dif-pclmul reads the current CRC value from the shash_desc context. But this value is uninitialized, causing crypto_shash_digest() to compute the wrong result. Fix it.
Probably this wasn't noticed before because lib/crc-t10dif.c only uses crypto_shash_update(), not crypto_shash_digest(). Likewise, crypto_shash_digest() is not yet tested by the crypto self-tests because those only test the ahash API which only uses shash init/update/final.
--- arch/x86/crypto/crct10dif-pclmul_glue.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
arch/x86/crypto/crct10dif-pclmul_glue.c +5 -8
@@ -76,15 +76,14 @@ static int chksum_final(struct shash_desreturn 0 ; } -static int __chksum_finup (__u16 *crcp,const u8 *data,unsigned int len, -u8 *out) +static int __chksum_finup (__u16 crc,const u8 *data,unsigned int len,u8 *out) {if (irq_fpu_usable ()) {kernel_fpu_begin (); - *(__u16 *)out =crc_t10dif_pcl (*crcp, data, len); + *(__u16 *)out =crc_t10dif_pcl (crc, data, len);kernel_fpu_end (); }else - *(__u16 *)out =crc_t10dif_generic (*crcp, data, len); + *(__u16 *)out =crc_t10dif_generic (crc, data, len);return 0 ; }
@@ -93,15 +92,13 @@ static int chksum_finup(struct shash_des {struct chksum_desc_ctx *ctx =shash_desc_ctx (desc); -return __chksum_finup (&ctx->crc, data, len, out); +return __chksum_finup (ctx->crc, data, len, out); }static int chksum_digest (struct shash_desc *desc,const u8 *data,unsigned int length,u8 *out) { -struct chksum_desc_ctx *ctx =shash_desc_ctx (desc); - -return __chksum_finup (&ctx->crc, data, length, out); +return __chksum_finup (0 , data, length, out); }static struct shash_alg alg = {
Greg Kroah-Hartman
maintainerPATCH 7/241 ALSA: usb-audio: Fix a memory leak bug
In reply to Greg Kroah-HartmanFrom: Wenwen Wang <[email protected]>
commit cb5173594d50c72b7bfa14113dfc5084b4d2f726 upstream.
In parse_audio_selector_unit(), the string array 'namelist' is allocated through kmalloc_array(), and each string pointer in this array, i.e., 'namelist[]', is allocated through kmalloc() in the following for loop. Then, a control instance 'kctl' is created by invoking snd_ctl_new1(). If an error occurs during the creation process, the string array 'namelist', including all string pointers in the array 'namelist[]', should be freed, before the error code ENOMEM is returned. However, the current code does not free 'namelist[]', resulting in memory leaks.
To fix the above issue, free all string pointers 'namelist[]' in a loop.
--- sound/usb/mixer.c | 2 ++ 1 file changed, 2 insertions(+)
sound/usb/mixer.c +2 -0
@@ -2112,6 +2112,8 @@ static int parse_audio_selector_unit(str kctl =snd_ctl_new1 (&mixer_selectunit_ctl, cval);if (! kctl) {usb_audio_err (state->chip,"cannot malloc kcontrol\n" ); +for (i =0 ; i < desc->bNrInPins; i++) +kfree (namelist[i]);kfree (namelist);kfree (cval);return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 8/241 ALSA: hda/hdmi - Consider eld_valid when reporting jack event
In reply to Greg Kroah-HartmanFrom: Hui Wang <[email protected]>
commit 7f641e26a6df9269cb25dd7a4b0a91d6586ed441 upstream.
On the machines with AMD GPU or Nvidia GPU, we often meet this issue:
after s3, there are 4 HDMI/DP audio devices in the gnome-sound-setting even there is no any monitors plugged.
When this problem happens, we check the /proc/asound/cardX/eld#N.M, we will find the monitor_present=1, eld_valid=0.
The root cause is BIOS or GPU driver makes the PRESENCE valid even no monitor plugged, and of course the driver will not get the valid eld_data subsequently.
In this situation, we should not report the jack_plugged event, to do so, let us change the function hdmi_present_sense_via_verbs(). In this function, it reads the pin_sense via snd_hda_pin_sense(), after calling this function, the jack_dirty is 0, and before exiting via_verbs(), we change the shadow pin_sense according to both monitor_present and eld_valid, then in the snd_hda_jack_report_sync(), since the jack_dirty is still 0, it will report jack event according to this modified shadow pin_sense.
After this change, the driver will not report Jack_is_plugged event through hdmi_present_sense_via_verbs() if monitor_present is 1 and eld_valid is 0.
--- sound/pci/hda/patch_hdmi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
sound/pci/hda/patch_hdmi.c +4 -2
@@ -1636,9 +1636,11 @@ static bool hdmi_present_sense(struct hd ret = !repoll || !pin_eld->monitor_present || pin_eld->eld_valid; jack =snd_hda_jack_tbl_get (codec, pin_nid); -if (jack) +if (jack) { jack->block_report = !ret; - + jack->pin_sense = (eld->monitor_present && eld->eld_valid) ? +AC_PINSENSE_PRESENCE :0 ; + }mutex_unlock (&per_pin->lock);snd_hda_power_down_pm (codec);return ret;
Greg Kroah-Hartman
maintainerPATCH 9/241 ALSA: hda/realtek - EAPD turn on later
In reply to Greg Kroah-HartmanFrom: Kailang Yang <[email protected]>
commit 607ca3bd220f4022e6f5356026b19dafc363863a upstream.
Let EAPD turn on after set pin output.
[ NOTE: This change is supposed to reduce the possible click noises at
(runtime) PM resume. The functionality should be same (i.e. the verbs are executed correctly) no matter which order is, so this should be safe to apply for all codecs -- tiwai ]
--- sound/pci/hda/patch_realtek.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +1 -2
@@ -772,11 +772,10 @@ static int alc_init(struct hda_codec *coif (spec->init_hook) spec->init_hook (codec); +snd_hda_gen_init (codec);alc_fix_pll (codec);alc_auto_init_amp (codec, spec->init_amp); -snd_hda_gen_init (codec); -snd_hda_apply_fixup (codec,HDA_FIXUP_ACT_INIT );return 0 ;
Greg Kroah-Hartman
maintainerPATCH 10/241 ASoC: max98090: Fix restore of DAPM Muxes
In reply to Greg Kroah-HartmanFrom: Jon Hunter <[email protected]>
commit ecb2795c08bc825ebd604997e5be440b060c5b18 upstream.
The max98090 driver defines 3 DAPM muxes; one for the right line output (LINMOD Mux), one for the left headphone mixer source (MIXHPLSEL Mux) and one for the right headphone mixer source (MIXHPRSEL Mux). The same bit is used for the mux as well as the DAPM enable, and although the mux can be correctly configured, after playback has completed, the mux will be reset during the disable phase. This is preventing the state of these muxes from being saved and restored correctly on system reboot. Fix this by marking these muxes as SND_SOC_NOPM.
Note this has been verified this on the Tegra124 Nyan Big which features the MAX98090 codec.
--- sound/soc/codecs/max98090.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
sound/soc/codecs/max98090.c +6 -6
@@ -1209,14 +1209,14 @@ static const struct snd_soc_dapm_widget &max98090_right_rcv_mixer_controls[0], ARRAY_SIZE(max98090_right_rcv_mixer_controls)), -SND_SOC_DAPM_MUX ("LINMOD Mux" ,M98090_REG_LOUTR_MIXER , -M98090_LINMOD_SHIFT ,0 , &max98090_linmod_mux), +SND_SOC_DAPM_MUX ("LINMOD Mux" ,SND_SOC_NOPM ,0 ,0 , + &max98090_linmod_mux), -SND_SOC_DAPM_MUX ("MIXHPLSEL Mux" ,M98090_REG_HP_CONTROL , -M98090_MIXHPLSEL_SHIFT ,0 , &max98090_mixhplsel_mux), +SND_SOC_DAPM_MUX ("MIXHPLSEL Mux" ,SND_SOC_NOPM ,0 ,0 , + &max98090_mixhplsel_mux), -SND_SOC_DAPM_MUX ("MIXHPRSEL Mux" ,M98090_REG_HP_CONTROL , -M98090_MIXHPRSEL_SHIFT ,0 , &max98090_mixhprsel_mux), +SND_SOC_DAPM_MUX ("MIXHPRSEL Mux" ,SND_SOC_NOPM ,0 ,0 , + &max98090_mixhprsel_mux),SND_SOC_DAPM_PGA ("HP Left Out" ,M98090_REG_OUTPUT_ENABLE , M98090_HPLEN_SHIFT, 0, NULL, 0),
Greg Kroah-Hartman
maintainerPATCH 11/241 ASoC: RT5677-SPI: Disable 16Bit SPI Transfers
In reply to Greg Kroah-HartmanFrom: Curtis Malainey <[email protected]>
commit a46eb523220e242affb9a6bc9bb8efc05f4f7459 upstream.
The current algorithm allows 3 types of transfers, 16bit, 32bit and burst. According to Realtek, 16bit transfers have a special restriction in that it is restricted to the memory region of0x18020000 ~ 0x18021000. This region is the memory location of the I2C registers. The current algorithm does not uphold this restriction and therefore fails to complete writes.
Since this has been broken for some time it likely no one is using it. Better to simply disable the 16 bit writes. This will allow users to properly load firmware over SPI without data corruption.
--- sound/soc/codecs/rt5677-spi.c | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-)
sound/soc/codecs/rt5677-spi.c +16 -19
@@ -60,13 +60,15 @@ static DEFINE_MUTEX(spi_mutex);* RT5677_SPI_READ/WRITE_32: Transfer 4 bytes * RT5677_SPI_READ/WRITE_BURST: Transfer any multiples of 8 bytes * -* For example, reading 260 bytes at 0x60030002 uses the following commands: -* 0x60030002 RT5677_SPI_READ_16 2 bytes +* Note: +* 16 Bit writes and reads are restricted to the address range +* 0x18020000 ~ 0x18021000 +* +* For example, reading 256 bytes at 0x60030004 uses the following commands: * 0x60030004 RT5677_SPI_READ_32 4 bytes * 0x60030008 RT5677_SPI_READ_BURST 240 bytes * 0x600300F8 RT5677_SPI_READ_BURST 8 bytes * 0x60030100 RT5677_SPI_READ_32 4 bytes -* 0x60030104 RT5677_SPI_READ_16 2 bytes * * Input: * @read: true for read commands; false for write commands
@@ -81,15 +83,13 @@ static u8 rt5677_spi_select_cmd(bool rea {u8 cmd; -if (align ==2 || align ==6 || remain ==2 ) { - cmd =RT5677_SPI_READ_16 ; - *len =2 ; - }else if (align ==4 || remain <=6 ) { +if (align ==4 || remain <=4 ) { cmd =RT5677_SPI_READ_32 ; *len =4 ; }else { cmd =RT5677_SPI_READ_BURST ; - *len =min_t (u32, remain & ~7 ,RT5677_SPI_BURST_LEN ); + *len = (((remain -1 ) >>3 ) +1 ) <<3 ; + *len =min_t (u32, *len,RT5677_SPI_BURST_LEN ); }return read ? cmd : cmd +1 ; }
@@ -110,7 +110,7 @@ static void rt5677_spi_reverse(u8 *dst, } } -/* Read DSP address space using SPI. addr and len have to be 2-byte aligned. */ +/* Read DSP address space using SPI. addr and len have to be 4-byte aligned. */ int rt5677_spi_read (u32 addr,void *rxbuf,size_t len) {u32 offset;
@@ -126,7 +126,7 @@ int rt5677_spi_read(u32 addr, void *rxbuif (!g_spi)return -ENODEV ; -if ((addr &1 ) || (len &1 )) { +if ((addr &3 ) || (len &3 )) {dev_err (&g_spi->dev,"Bad read align 0x%x(%zu)\n" , addr, len);return -EACCES ; }
@@ -161,13 +161,13 @@ int rt5677_spi_read(u32 addr, void *rxbu }EXPORT_SYMBOL_GPL (rt5677_spi_read); -/* Write DSP address space using SPI. addr has to be 2-byte aligned. -* If len is not 2-byte aligned, an extra byte of zero is written at the end +/* Write DSP address space using SPI. addr has to be 4-byte aligned. +* If len is not 4-byte aligned, then extra zeros are written at the end * as padding. */ int rt5677_spi_write (u32 addr,const void *txbuf,size_t len) { -u32 offset, len_with_pad = len; +u32 offset;int status =0 ;struct spi_transfer t;struct spi_message m;
@@ -180,22 +180,19 @@ int rt5677_spi_write(u32 addr, const voiif (!g_spi)return -ENODEV ; -if (addr &1 ) { +if (addr &3 ) {dev_err (&g_spi->dev,"Bad write align 0x%x(%zu)\n" , addr, len);return -EACCES ; } -if (len &1 ) - len_with_pad = len +1 ; -memset (&t,0 ,sizeof (t)); t.tx_buf = buf; t.speed_hz =RT5677_SPI_FREQ ;spi_message_init_with_transfers (&m, &t,1 ); -for (offset =0 ; offset < len_with_pad;) { +for (offset =0 ; offset < len;) { spi_cmd =rt5677_spi_select_cmd (false, (addr + offset) &7 , - len_with_pad - offset, &t.len); + len - offset, &t.len);/* Construct SPI message header */ buf[0 ] = spi_cmd;
Greg Kroah-Hartman
maintainerPATCH 12/241 mm/mincore.c: make mincore() more conservative
In reply to Greg Kroah-HartmanFrom: Jiri Kosina <[email protected]>
commit 134fca9063ad4851de767d1768180e5dede9a881 upstream.
The semantics of what mincore() considers to be resident is not completely clear, but Linux has always (since 2.3.52, which is when mincore() was initially done) treated it as "page is available in page cache".
That's potentially a problem, as that [in]directly exposes meta-information about pagecache / memory mapping state even about memory not strictly belonging to the process executing the syscall, opening possibilities for sidechannel attacks.
Change the semantics of mincore() so that it only reveals pagecache information for non-anonymous mappings that belog to files that the calling process could (if it tried to) successfully open for writing; otherwise we'd be including shared non-exclusive mappings, which
- is the sidechannel
- is not the usecase for mincore(), as that's primarily used for data, not (shared) text
--- mm/mincore.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
mm/mincore.c +22 -1
@@ -165,6 +165,22 @@ out:return 0 ; } +static inline bool can_do_mincore (struct vm_area_struct *vma) +{ +if (vma_is_anonymous (vma)) +return true; +if (!vma->vm_file) +return false; +/* +* Reveal pagecache information only for non-anonymous mappings that +* correspond to the files the calling process could (if tried) open +* for writing; otherwise we'd be including shared non-exclusive +* mappings, which opens a side channel. +*/ +return inode_owner_or_capable (file_inode (vma->vm_file)) || +inode_permission (file_inode (vma->vm_file),MAY_WRITE ) ==0 ; +} +/* * Do a chunk of "sys_mincore()". We've already checked * all the arguments, we hold the mmap semaphore: we should
@@ -185,8 +201,13 @@ static long do_mincore(unsigned long add vma =find_vma (current->mm, addr);if (!vma || addr < vma->vm_start)return -ENOMEM ; - mincore_walk.mm = vma->vm_mm; end =min (vma->vm_end, addr + (pages <<PAGE_SHIFT )); +if (!can_do_mincore (vma)) { +unsigned long pages =DIV_ROUND_UP (end - addr,PAGE_SIZE ); +memset (vec,1 , pages); +return pages; + } + mincore_walk.mm = vma->vm_mm; err =walk_page_range (addr, end, &mincore_walk);if (err <0 )return err;
Greg Kroah-Hartman
maintainerPATCH 13/241 ocfs2: fix ocfs2 read inode data panic in ocfs2_iget
In reply to Greg Kroah-HartmanFrom: Shuning Zhang <[email protected]>
commit e091eab028f9253eac5c04f9141bbc9d170acab3 upstream.
In some cases, ocfs2_iget() reads the data of inode, which has been deleted for some reason. That will make the system panic. So We should judge whether this inode has been deleted, and tell the caller that the inode is a bad inode.
For example, the ocfs2 is used as the backed of nfs, and the client is nfsv3. This issue can be reproduced by the following steps.
on the nfs server side,
..../patha/pathb
Step 1: The process A was scheduled before calling the function fh_verify.
Step 2: The process B is removing the 'pathb', and just completed the call to function dput. Then the dentry of 'pathb' has been deleted from the dcache, and all ancestors have been deleted also. The relationship of dentry and inode was deleted through the function hlist_del_init. The following is the call stack. dentry_iput->hlist_del_init(&dentry->d_u.d_alias)
At this time, the inode is still in the dcache.
Step 3: The process A call the function ocfs2_get_dentry, which get the inode from dcache. Then the refcount of inode is 1. The following is the call stack. nfsd3_proc_getacl->fh_verify->exportfs_decode_fh->fh_to_dentry(ocfs2_get_dentry)
Step 4: Dirty pages are flushed by bdi threads. So the inode of 'patha' is evicted, and this directory was deleted. But the inode of 'pathb' can't be evicted, because the refcount of the inode was 1.
Step 5: The process A keep running, and call the function reconnect_path(in exportfs_decode_fh), which call function ocfs2_get_parent of ocfs2. Get the block number of parent directory(patha) by the name of ... Then read the data from disk by the block number. But this inode has been deleted, so the system panic.
Process A Process B
1. in nfsd3_proc_getacl | 2. | dput 3. fh_to_dentry(ocfs2_get_dentry) | 4. bdi flush dirty cache | 5. ocfs2_iget |
[283465.542049] OCFS2: ERROR (device sdp): ocfs2_validate_inode_block:
Invalid dinode #580640: OCFS2_VALID_FL not set
[283465.545490] Kernel panic - not syncing: OCFS2: (device sdp): panic forced
after error
[283465.546889] CPU: 5 PID: 12416 Comm: nfsd Tainted: G W 4.1.12-124.18.6.el6uek.bug28762940v3.x86_64 #2 [283465.548382] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 09/21/2015 [283465.549657] 0000000000000000 ffff8800a56fb7b8 ffffffff816e839c ffffffffa0514758 [283465.550392] 000000000008dc20 ffff8800a56fb838 ffffffff816e62d3 0000000000000008 [283465.551056] ffff880000000010 ffff8800a56fb848 ffff8800a56fb7e8 ffff88005df9f000 [283465.551710] Call Trace: [283465.552516] [<ffffffff816e839c>] dump_stack+0x63/0x81 [283465.553291] [<ffffffff816e62d3>] panic+0xcb/0x21b [283465.554037] [<ffffffffa04e66b0>] ocfs2_handle_error+0xf0/0xf0 [ocfs2] [283465.554882] [<ffffffffa04e7737>] __ocfs2_error+0x67/0x70 [ocfs2] [283465.555768] [<ffffffffa049c0f9>] ocfs2_validate_inode_block+0x229/0x230 [ocfs2] [283465.556683] [<ffffffffa047bcbc>] ocfs2_read_blocks+0x46c/0x7b0 [ocfs2] [283465.557408] [<ffffffffa049bed0>] ? ocfs2_inode_cache_io_unlock+0x20/0x20 [ocfs2] [283465.557973] [<ffffffffa049f0eb>] ocfs2_read_inode_block_full+0x3b/0x60 [ocfs2] [283465.558525] [<ffffffffa049f5ba>] ocfs2_iget+0x4aa/0x880 [ocfs2] [283465.559082] [<ffffffffa049146e>] ocfs2_get_parent+0x9e/0x220 [ocfs2] [283465.559622] [<ffffffff81297c05>] reconnect_path+0xb5/0x300 [283465.560156] [<ffffffff81297f46>] exportfs_decode_fh+0xf6/0x2b0 [283465.560708] [<ffffffffa062faf0>] ? nfsd_proc_getattr+0xa0/0xa0 [nfsd] [283465.561262] [<ffffffff810a8196>] ? prepare_creds+0x26/0x110 [283465.561932] [<ffffffffa0630860>] fh_verify+0x350/0x660 [nfsd] [283465.562862] [<ffffffffa0637804>] ? nfsd_cache_lookup+0x44/0x630 [nfsd] [283465.563697] [<ffffffffa063a8b9>] nfsd3_proc_getattr+0x69/0xf0 [nfsd] [283465.564510] [<ffffffffa062cf60>] nfsd_dispatch+0xe0/0x290 [nfsd] [283465.565358] [<ffffffffa05eb892>] ? svc_tcp_adjust_wspace+0x12/0x30 [sunrpc] [283465.566272] [<ffffffffa05ea652>] svc_process_common+0x412/0x6a0 [sunrpc] [283465.567155] [<ffffffffa05eaa03>] svc_process+0x123/0x210 [sunrpc] [283465.568020] [<ffffffffa062c90f>] nfsd+0xff/0x170 [nfsd] [283465.568962] [<ffffffffa062c810>] ? nfsd_destroy+0x80/0x80 [nfsd] [283465.570112] [<ffffffff810a622b>] kthread+0xcb/0xf0 [283465.571099] [<ffffffff810a6160>] ? kthread_create_on_node+0x180/0x180 [283465.572114] [<ffffffff816f11b8>] ret_from_fork+0x58/0x90 [283465.573156] [<ffffffff810a6160>] ? kthread_create_on_node+0x180/0x180
--- fs/ocfs2/export.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-)
fs/ocfs2/export.c +29 -1
@@ -148,16 +148,24 @@ static struct dentry *ocfs2_get_parent(su64 blkno;struct dentry *parent;struct inode *dir =d_inode (child); +int set;trace_ocfs2_get_parent (child, child->d_name.len, child->d_name.name, (unsigned long long )OCFS2_I (dir)->ip_blkno); + status =ocfs2_nfs_sync_lock (OCFS2_SB (dir->i_sb),1 ); +if (status <0 ) { +mlog (ML_ERROR ,"getting nfs sync lock(EX) failed %d\n" , status); + parent =ERR_PTR (status); + goto bail; + } + status =ocfs2_inode_lock (dir,NULL ,0 );if (status <0 ) {if (status != -ENOENT )mlog_errno (status); parent =ERR_PTR (status); - goto bail; + goto unlock_nfs_sync; } status =ocfs2_lookup_ino_from_name (dir,".." ,2 , &blkno);
@@ -166,11 +174,31 @@ static struct dentry *ocfs2_get_parent(s goto bail_unlock; } + status =ocfs2_test_inode_bit (OCFS2_SB (dir->i_sb), blkno, &set); +if (status <0 ) { +if (status == -EINVAL ) { + status = -ESTALE ; + }else +mlog (ML_ERROR ,"test inode bit failed %d\n" , status); + parent =ERR_PTR (status); + goto bail_unlock; + } + +trace_ocfs2_get_dentry_test_bit (status, set); +if (!set) { + status = -ESTALE ; + parent =ERR_PTR (status); + goto bail_unlock; + } + parent =d_obtain_alias (ocfs2_iget (OCFS2_SB (dir->i_sb), blkno,0 ,0 )); bail_unlock:ocfs2_inode_unlock (dir,0 ); +unlock_nfs_sync: +ocfs2_nfs_sync_unlock (OCFS2_SB (dir->i_sb),1 ); + bail:trace_ocfs2_get_parent_end (parent);
Greg Kroah-Hartman
maintainerPATCH 14/241 mfd: da9063: Fix OTP control register names to match datasheets for DA9063/63L
In reply to Greg Kroah-HartmanFrom: Steve Twiss <[email protected]>
commit 6b4814a9451add06d457e198be418bf6a3e6a990 upstream.
Mismatch between what is found in the Datasheets for DA9063 and DA9063L provided by Dialog Semiconductor, and the register names provided in the MFD registers file. The changes are for the OTP (one-time-programming) control registers. The two naming errors are OPT instead of OTP, and COUNT instead of CONT (i.e. control).
--- include/linux/mfd/da9063/registers.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
include/linux/mfd/da9063/registers.h +3 -3
@@ -215,9 +215,9 @@/* DA9063 Configuration registers */ /* OTP */ -#define DA9063_REG_OPT_COUNT 0x101 -#define DA9063_REG_OPT_ADDR 0x102 -#define DA9063_REG_OPT_DATA 0x103 +#define DA9063_REG_OTP_CONT 0x101 +#define DA9063_REG_OTP_ADDR 0x102 +#define DA9063_REG_OTP_DATA 0x103/* Customer Trim and Configuration */ #define DA9063_REG_T_OFFSET 0x104
Greg Kroah-Hartman
maintainerPATCH 15/241 tty/vt: fix write/write race in ioctl(KDSKBSENT) handler
In reply to Greg Kroah-HartmanFrom: Sergei Trofimovich <[email protected]>
commit 46ca3f735f345c9d87383dd3a09fa5d43870770e upstream.
The bug manifests as an attempt to access deallocated memory:
BUG: unable to handle kernel paging request at ffff9c8735448000
#PF error: [PROT] [WRITE]
PGD 288a05067 P4D 288a05067 PUD 288a07067 PMD 7f60c2063 PTE 80000007f5448161
Oops: 0003 [#1] PREEMPT SMP
CPU: 6 PID: 388 Comm: loadkeys Tainted: G C 5.0.0-rc6-00153-g5ded5871030e #91
Hardware name: Gigabyte Technology Co., Ltd. To be filled by O.E.M./H77M-D3H, BIOS F12 11/14/2013
RIP: 0010:__memmove+0x81/0x1a0
Code: 4c 89 4f 10 4c 89 47 18 48 8d 7f 20 73 d4 48 83 c2 20 e9 a2 00 00 00 66 90 48 89 d1 4c 8b 5c 16 f8 4c 8d 54 17 f8 48 c1 e9 03 <f3> 48 a5 4d 89 1a e9 0c 01 00 00 0f 1f 40 00 48 89 d1 4c 8b 1e 49
RSP: 0018:ffffa1b9002d7d08 EFLAGS: 00010203
RAX: ffff9c873541af43 RBX: ffff9c873541af43 RCX: 00000c6f105cd6bf
RDX: 0000637882e986b6 RSI: ffff9c8735447ffb RDI: ffff9c8735447ffb
RBP: ffff9c8739cd3800 R08: ffff9c873b802f00 R09: 00000000fffff73b
R10: ffffffffb82b35f1 R11: 00505b1b004d5b1b R12: 0000000000000000
R13: ffff9c873541af3d R14: 000000000000000b R15: 000000000000000c
FS: 00007f450c390580(0000) GS:ffff9c873f180000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffff9c8735448000 CR3: 00000007e213c002 CR4: 00000000000606e0
Call Trace:
vt_do_kdgkb_ioctl+0x34d/0x440
vt_ioctl+0xba3/0x1190
? __bpf_prog_run32+0x39/0x60
? mem_cgroup_commit_charge+0x7b/0x4e0
tty_ioctl+0x23f/0x920
? preempt_count_sub+0x98/0xe0
? __seccomp_filter+0x67/0x600
do_vfs_ioctl+0xa2/0x6a0
? syscall_trace_enter+0x192/0x2d0
ksys_ioctl+0x3a/0x70
__x64_sys_ioctl+0x16/0x20
do_syscall_64+0x54/0xe0
entry_SYSCALL_64_after_hwframe+0x49/0xbeThe bug manifests on systemd systems with multiple vtcon devices:
# cat /sys/devices/virtual/vtconsole/vtcon0/name (S) dummy device # cat /sys/devices/virtual/vtconsole/vtcon1/name (M) frame buffer device
There systemd runs 'loadkeys' tool in tapallel for each vtcon instance. This causes two parallel ioctl(KDSKBSENT) calls to race into adding the same entry into 'func_table' array at:
drivers/tty/vt/keyboard.c:vt_do_kdgkb_ioctl()
The function has no locking around writes to 'func_table'.
The simplest reproducer is to have initrams with the following init on a 8-CPU machine x86_64:
#!/bin/sh
loadkeys -q windowkeys ru4 &
loadkeys -q windowkeys ru4 &
loadkeys -q windowkeys ru4 &
loadkeys -q windowkeys ru4 &
loadkeys -q windowkeys ru4 &
loadkeys -q windowkeys ru4 &
loadkeys -q windowkeys ru4 &
loadkeys -q windowkeys ru4 &
wait
The change adds lock on write path only. Reads are still racy.
--- drivers/tty/vt/keyboard.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-)
drivers/tty/vt/keyboard.c +27 -6
@@ -121,6 +121,7 @@ static const int NR_TYPES = ARRAY_SIZE(mstatic struct input_handler kbd_handler;static DEFINE_SPINLOCK (kbd_event_lock);static DEFINE_SPINLOCK (led_lock); +static DEFINE_SPINLOCK (func_buf_lock);/* guard 'func_buf' and friends */ static unsigned long key_down[BITS_TO_LONGS (KEY_CNT )];/* keyboard key bitmap */ static unsigned char shift_down[NR_SHIFT ];/* shift state counters.. */ static bool dead_key_next;
@@ -1969,11 +1970,12 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbchar *p;u_char *q;u_char __user *up; -int sz; +int sz, fnw_sz;int delta;char *first_free, *fj, *fnw;int i, j, k;int ret; +unsigned long flags;if (!capable (CAP_SYS_TTY_CONFIG )) perm =0 ;
@@ -2016,7 +2018,14 @@ int vt_do_kdgkb_ioctl(int cmd, struct kb goto reterr; } + fnw =NULL ; + fnw_sz =0 ; +/* race aginst other writers */ + again: +spin_lock_irqsave (&func_buf_lock, flags); q = func_table[i]; + +/* fj pointer to next entry after 'q' */ first_free = funcbufptr + (funcbufsize - funcbufleft);for (j = i+1 ; j <MAX_NR_FUNC && !func_table[j]; j++) ;
@@ -2024,10 +2033,12 @@ int vt_do_kdgkb_ioctl(int cmd, struct kb fj = func_table[j]; else fj = first_free; - +/* buffer usage increase by new entry */ delta = (q ? -strlen (q) :1 ) +strlen (kbs->kb_string); +if (delta <= funcbufleft) {/* it fits in current buf */ if (j <MAX_NR_FUNC ) { +/* make enough space for new entry at 'fj' */ memmove (fj + delta, fj, first_free - fj);for (k = j; k <MAX_NR_FUNC ; k++)if (func_table[k])
@@ -2040,20 +2051,28 @@ int vt_do_kdgkb_ioctl(int cmd, struct kb sz =256 ;while (sz < funcbufsize - funcbufleft + delta) sz <<=1 ; - fnw =kmalloc (sz,GFP_KERNEL ); -if (!fnw) { - ret = -ENOMEM ; - goto reterr; +if (fnw_sz != sz) { +spin_unlock_irqrestore (&func_buf_lock, flags); +kfree (fnw); + fnw =kmalloc (sz,GFP_KERNEL ); + fnw_sz = sz; +if (!fnw) { + ret = -ENOMEM ; + goto reterr; + } + goto again; }if (!q) func_table[i] = fj; +/* copy data before insertion point to new location */ if (fj > funcbufptr)memmove (fnw, funcbufptr, fj - funcbufptr);for (k =0 ; k < j; k++)if (func_table[k]) func_table[k] = fnw + (func_table[k] - funcbufptr); +/* copy data after insertion point to new location */ if (first_free > fj) {memmove (fnw + (fj - funcbufptr) + delta, fj, first_free - fj);for (k = j; k <MAX_NR_FUNC ; k++)
@@ -2066,7 +2085,9 @@ int vt_do_kdgkb_ioctl(int cmd, struct kb funcbufleft = funcbufleft - delta + sz - funcbufsize; funcbufsize = sz; } +/* finally insert item itself */ strcpy (func_table[i], kbs->kb_string); +spin_unlock_irqrestore (&func_buf_lock, flags);break ; } ret =0 ;
Greg Kroah-Hartman
maintainerPATCH 16/241 ext4: actually request zeroing of inode table after grow
In reply to Greg Kroah-HartmanFrom: Kirill Tkhai <[email protected]>
commit 310a997fd74de778b9a4848a64be9cda9f18764a upstream.
It is never possible, that number of block groups decreases, since only online grow is supported.
But after a growing occured, we have to zero inode tables for just created new block groups.
--- fs/ext4/ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/ioctl.c +1 -1
@@ -577,7 +577,7 @@ group_add_out:if (err ==0 ) err = err2;mnt_drop_write_file (filp); -if (!err && (o_group >EXT4_SB (sb)->s_groups_count) && +if (!err && (o_group <EXT4_SB (sb)->s_groups_count) &&ext4_has_group_desc_csum (sb) &&test_opt (sb,INIT_INODE_TABLE )) err =ext4_register_li_request (sb, o_group);
Greg Kroah-Hartman
maintainerPATCH 17/241 ext4: fix ext4_show_options for file systems w/o journal
In reply to Greg Kroah-HartmanFrom: Debabrata Banerjee <[email protected]>
commit 50b29d8f033a7c88c5bc011abc2068b1691ab755 upstream.
Instead of removing EXT4_MOUNT_JOURNAL_CHECKSUM from s_def_mount_opt as I assume was intended, all other options were blown away leading to _ext4_show_options() output being incorrect.
--- fs/ext4/super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/super.c +1 -1
@@ -3867,7 +3867,7 @@ static int ext4_fill_super(struct super_ "data=, fs mounted w/o journal"); goto failed_mount_wq; } - sbi->s_def_mount_opt &=EXT4_MOUNT_JOURNAL_CHECKSUM ; + sbi->s_def_mount_opt &= ~EXT4_MOUNT_JOURNAL_CHECKSUM ;clear_opt (sb,JOURNAL_CHECKSUM );clear_opt (sb,DATA_FLAGS ); sbi->s_journal =NULL ;
Greg Kroah-Hartman
maintainerPATCH 18/241 Btrfs: do not start a transaction at iterate_extent_inodes()
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit bfc61c36260ca990937539cd648ede3cd749bc10 upstream.
When finding out which inodes have references on a particular extent, done by backref.c:iterate_extent_inodes(), from the BTRFS_IOC_LOGICAL_INO (both v1 and v2) ioctl and from scrub we use the transaction join API to grab a reference on the currently running transaction, since in order to give accurate results we need to inspect the delayed references of the currently running transaction.
However, if there is currently no running transaction, the join operation will create a new transaction. This is inefficient as the transaction will eventually be committed, doing unnecessary IO and introducing a potential point of failure that will lead to a transaction abort due to -ENOSPC, as recently reported [1].
That's because the join, creates the transaction but does not reserve any space, so when attempting to update the root item of the root passed to btrfs_join_transaction(), during the transaction commit, we can end up failling with -ENOSPC. Users of a join operation are supposed to actually do some filesystem changes and reserve space by some means, which is not the case of iterate_extent_inodes(), it is a read-only operation for all contextes from which it is called.
The reported [1] -ENOSPC failure stack trace is the following:
heisenberg kernel: ------------[ cut here ]------------
heisenberg kernel: BTRFS: Transaction aborted (error -28)
heisenberg kernel: WARNING: CPU: 0 PID: 7137 at fs/btrfs/root-tree.c:136 btrfs_update_root+0x22b/0x320 [btrfs]
(...)
heisenberg kernel: CPU: 0 PID: 7137 Comm: btrfs-transacti Not tainted 4.19.0-4-amd64 #1 Debian 4.19.28-2 heisenberg kernel: Hardware name: FUJITSU LIFEBOOK U757/FJNB2A5, BIOS Version 1.21 03/19/2018 heisenberg kernel: RIP: 0010:btrfs_update_root+0x22b/0x320 [btrfs]
(...)
heisenberg kernel: RSP: 0018:ffffb5448828bd40 EFLAGS: 00010286
heisenberg kernel: RAX: 0000000000000000 RBX: ffff8ed56bccef50 RCX: 0000000000000006 heisenberg kernel: RDX: 0000000000000007 RSI: 0000000000000092 RDI: ffff8ed6bda166a0 heisenberg kernel: RBP: 00000000ffffffe4 R08: 00000000000003df R09: 0000000000000007 heisenberg kernel: R10: 0000000000000000 R11: 0000000000000001 R12: ffff8ed63396a078 heisenberg kernel: R13: ffff8ed092d7c800 R14: ffff8ed64f5db028 R15: ffff8ed6bd03d068 heisenberg kernel: FS: 0000000000000000(0000) GS:ffff8ed6bda00000(0000) knlGS:0000000000000000 heisenberg kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
heisenberg kernel: CR2: 00007f46f75f8000 CR3: 0000000310a0a002 CR4: 00000000003606f0 heisenberg kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 heisenberg kernel: DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 heisenberg kernel: Call Trace:
heisenberg kernel: commit_fs_roots+0x166/0x1d0 [btrfs] heisenberg kernel: ? _cond_resched+0x15/0x30 heisenberg kernel: ? btrfs_run_delayed_refs+0xac/0x180 [btrfs] heisenberg kernel: btrfs_commit_transaction+0x2bd/0x870 [btrfs] heisenberg kernel: ? start_transaction+0x9d/0x3f0 [btrfs] heisenberg kernel: transaction_kthread+0x147/0x180 [btrfs] heisenberg kernel: ? btrfs_cleanup_transaction+0x530/0x530 [btrfs] heisenberg kernel: kthread+0x112/0x130 heisenberg kernel: ? kthread_bind+0x30/0x30 heisenberg kernel: ret_from_fork+0x35/0x40
heisenberg kernel: ---[ end trace 05de912e30e012d9 ]---
So fix that by using the attach API, which does not create a transaction when there is currently no running transaction.
[1] https://lore.kernel.org/linux-btrfs/[email protected]/
--- fs/btrfs/backref.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
fs/btrfs/backref.c +12 -6
@@ -1685,13 +1685,19 @@ int iterate_extent_inodes(struct btrfs_f extent_item_objectid);if (!search_commit_root) { - trans =btrfs_join_transaction (fs_info->extent_root); -if (IS_ERR (trans)) -return PTR_ERR (trans); + trans =btrfs_attach_transaction (fs_info->extent_root); +if (IS_ERR (trans)) { +if (PTR_ERR (trans) != -ENOENT && +PTR_ERR (trans) != -EROFS ) +return PTR_ERR (trans); + trans =NULL ; + } + } + +if (trans)btrfs_get_tree_mod_seq (fs_info, &tree_mod_seq_elem); - }else { +else down_read (&fs_info->commit_root_sem); - } ret = btrfs_find_all_leafs(trans, fs_info, extent_item_objectid, tree_mod_seq_elem.seq, &refs,
@@ -1721,7 +1727,7 @@ int iterate_extent_inodes(struct btrfs_ffree_leaf_list (refs); out: -if (!search_commit_root) { +if (trans) {btrfs_put_tree_mod_seq (fs_info, &tree_mod_seq_elem);btrfs_end_transaction (trans, fs_info->extent_root); }else {
Greg Kroah-Hartman
maintainerPATCH 19/241 bcache: fix a race between cache register and cacheset unregister
In reply to Greg Kroah-HartmanFrom: Liang Chen <[email protected]>
commit a4b732a248d12cbdb46999daf0bf288c011335eb upstream.
There is a race between cache device register and cache set unregister. For an already registered cache device, register_bcache will call bch_is_open to iterate through all cachesets and check every cache there. The race occurs if cache_set_free executes at the same time and clears the caches right before ca is dereferenced in bch_is_open_cache. To close the race, let's make sure the clean up work is protected by the bch_register_lock as well.
This issue can be reproduced as follows,
while true; do echo /dev/XXX> /sys/fs/bcache/register ; done& while true; do echo 1> /sys/block/XXX/bcache/set/unregister ; done &
and results in the following oops,
[ +0.000053] BUG: unable to handle kernel NULL pointer dereference at 0000000000000998 [ +0.000457] #PF error: [normal kernel read fault] [ +0.000464] PGD 800000003ca9d067 P4D 800000003ca9d067 PUD 3ca9c067 PMD 0 [ +0.000388] Oops: 0000 [#1] SMP PTI [ +0.000269] CPU: 1 PID: 3266 Comm: bash Not tainted 5.0.0+ #6 [ +0.000346] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.11.0-2.fc28 04/01/2014 [ +0.000472] RIP: 0010:register_bcache+0x1829/0x1990 [bcache] [ +0.000344] Code: b0 48 83 e8 50 48 81 fa e0 e1 10 c0 0f 84 a9 00 00 00 48 89 c6 48 89 ca 0f b7 ba 54 04 00 00 4c 8b 82 60 0c 00 00 85 ff 74 2f <49> 3b a8 98 09 00 00 74 4e 44 8d 47 ff 31 ff 49 c1 e0 03 eb 0d [ +0.000839] RSP: 0018:ffff92ee804cbd88 EFLAGS: 00010202 [ +0.000328] RAX: ffffffffc010e190 RBX: ffff918b5c6b5000 RCX: ffff918b7d8e0000 [ +0.000399] RDX: ffff918b7d8e0000 RSI: ffffffffc010e190 RDI: 0000000000000001 [ +0.000398] RBP: ffff918b7d318340 R08: 0000000000000000 R09: ffffffffb9bd2d7a [ +0.000385] R10: ffff918b7eb253c0 R11: ffffb95980f51200 R12: ffffffffc010e1a0 [ +0.000411] R13: fffffffffffffff2 R14: 000000000000000b R15: ffff918b7e232620 [ +0.000384] FS: 00007f955bec2740(0000) GS:ffff918b7eb00000(0000) knlGS:0000000000000000 [ +0.000420] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ +0.000801] CR2: 0000000000000998 CR3: 000000003cad6000 CR4: 00000000001406e0 [ +0.000837] Call Trace: [ +0.000682] ? _cond_resched+0x10/0x20 [ +0.000691] ? __kmalloc+0x131/0x1b0 [ +0.000710] kernfs_fop_write+0xfa/0x170 [ +0.000733] __vfs_write+0x2e/0x190 [ +0.000688] ? inode_security+0x10/0x30 [ +0.000698] ? selinux_file_permission+0xd2/0x120 [ +0.000752] ? security_file_permission+0x2b/0x100 [ +0.000753] vfs_write+0xa8/0x1a0 [ +0.000676] ksys_write+0x4d/0xb0 [ +0.000699] do_syscall_64+0x3a/0xf0 [ +0.000692] entry_SYSCALL_64_after_hwframe+0x44/0xa9
--- drivers/md/bcache/super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/bcache/super.c +1 -1
@@ -1355,6 +1355,7 @@ static void cache_set_free(struct closurbch_btree_cache_free (c);bch_journal_free (c); +mutex_lock (&bch_register_lock);for_each_cache (ca, c, i)if (ca) { ca->set =NULL ;
@@ -1377,7 +1378,6 @@ static void cache_set_free(struct closurmempool_destroy (c->search);kfree (c->devices); -mutex_lock (&bch_register_lock);list_del (&c->list);mutex_unlock (&bch_register_lock);
Greg Kroah-Hartman
maintainerPATCH 20/241 bcache: never set KEY_PTRS of journal key to 0 in journal_reclaim()
In reply to Greg Kroah-HartmanFrom: Coly Li <[email protected]>
commit 1bee2addc0c8470c8aaa65ef0599eeae96dd88bc upstream.
In journal_reclaim() ja->cur_idx of each cache will be update to reclaim available journal buckets. Variable 'int n' is used to count how many cache is successfully reclaimed, then n is set to c->journal.key by SET_KEY_PTRS(). Later in journal_write_unlocked(), a for_each_cache() loop will write the jset data onto each cache.
The problem is, if all jouranl buckets on each cache is full, the following code in journal_reclaim(),
529 for_each_cache(ca, c, iter) {
530 struct journal_device *ja = &ca->journal;
531 unsigned int next = (ja->cur_idx + 1) % ca->sb.njournal_buckets;
532
533 /* No space available on this device */
534 if (next == ja->discard_idx)
535 continue;
536
537 ja->cur_idx = next;
538 k->ptr[n++] = MAKE_PTR(0,
539 bucket_to_sector(c, ca->sb.d[ja->cur_idx]),
540 ca->sb.nr_this_dev);
541 }
542
543 bkey_init(k);
544 SET_KEY_PTRS(k, n);
If there is no available bucket to reclaim, the if() condition at line 534 will always true, and n remains 0. Then at line 544, SET_KEY_PTRS() will set KEY_PTRS field of c->journal.key to 0.
Setting KEY_PTRS field of c->journal.key to 0 is wrong. Because in journal_write_unlocked() the journal data is written in following loop,
649 for (i = 0; i < KEY_PTRS(k); i++) {
650-671 submit journal data to cache device
672 }
If KEY_PTRS field is set to 0 in jouranl_reclaim(), the journal data won't be written to cache device here. If system crahed or rebooted before bkeys of the lost journal entries written into btree nodes, data corruption will be reported during bcache reload after rebooting the system.
Indeed there is only one cache in a cache set, there is no need to set KEY_PTRS field in journal_reclaim() at all. But in order to keep the for_each_cache() logic consistent for now, this patch fixes the above problem by not setting 0 KEY_PTRS of journal key, if there is no bucket available to reclaim.
--- drivers/md/bcache/journal.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/md/bcache/journal.c +7 -4
@@ -513,11 +513,11 @@ static void journal_reclaim(struct cache ca->sb.nr_this_dev); } -bkey_init (k); -SET_KEY_PTRS (k, n); - -if (n) +if (n) { +bkey_init (k); +SET_KEY_PTRS (k, n); c->journal.blocks_free = c->sb.bucket_size >> c->block_bits; + } out:if (!journal_full (&c->journal))__closure_wake_up (&c->journal.wait);
@@ -641,6 +641,9 @@ static void journal_write_unlocked(struc ca->journal.seq[ca->journal.cur_idx] = w->data->seq; } +/* If KEY_PTRS(k) == 0, this jset gets lost in air */ +BUG_ON (i ==0 ); +atomic_dec_bug (&fifo_back (&c->journal.pin));bch_journal_next (&c->journal);journal_reclaim (c);
Greg Kroah-Hartman
maintainerPATCH 21/241 ipmi:ssif: compare block number correctly for multi-part return messages
In reply to Greg Kroah-HartmanFrom: Kamlakant Patel <[email protected]>
commit 55be8658c7e2feb11a5b5b33ee031791dbd23a69 upstream.
According to ipmi spec, block number is a number that is incremented, starting with 0, for each new block of message data returned using the middle transaction.
Here, the 'blocknum' is data[0] which always starts from zero(0) and 'ssif_info->multi_pos' starts from 1.
So, we need to add +1 to blocknum while comparing with multi_pos.
Message-Id: <[email protected]>
--- drivers/char/ipmi/ipmi_ssif.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/char/ipmi/ipmi_ssif.c +5 -1
@@ -695,12 +695,16 @@ static void msg_done_handler(struct ssif/* End of read */ len = ssif_info->multi_len; data = ssif_info->data; - }else if (blocknum != ssif_info->multi_pos) { + }else if (blocknum +1 != ssif_info->multi_pos) {/* * Out of sequence block, just abort. Block * numbers start at zero for the second block, * but multi_pos starts at one, so the +1. */ +if (ssif_info->ssif_debug &SSIF_DEBUG_MSG ) +dev_dbg (&ssif_info->client->dev, +"Received message out of sequence, expected %u, got %u\n" , + ssif_info->multi_pos -1 , blocknum); result = -EIO ; }else {ssif_inc_stat (ssif_info, received_message_parts);
Greg Kroah-Hartman
maintainerPATCH 22/241 crypto: gcm - Fix error return code in crypto_gcm_create_common()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
commit 9b40f79c08e81234d759f188b233980d7e81df6c upstream.
Fix to return error code -EINVAL from the invalid alg ivsize error handling case instead of 0, as done elsewhere in this function.
--- crypto/gcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
crypto/gcm.c +1 -1
@@ -670,11 +670,11 @@ static int crypto_gcm_create_common(stru ctr =crypto_skcipher_spawn_alg (&ctx->ctr);/* We only support 16-byte blocks. */ + err = -EINVAL ;if (ctr->cra_ablkcipher.ivsize !=16 ) goto out_put_ctr;/* Not a stream cipher? */ - err = -EINVAL ;if (ctr->cra_blocksize !=1 ) goto out_put_ctr;
Greg Kroah-Hartman
maintainerPATCH 23/241 crypto: gcm - fix incompatibility between "gcm" and "gcm_base"
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
commit f699594d436960160f6d5ba84ed4a222f20d11cd upstream.
GCM instances can be created by either the "gcm" template, which only allows choosing the block cipher, e.g. "gcm(aes)"; or by "gcm_base", which allows choosing the ctr and ghash implementations, e.g. "gcm_base(ctr(aes-generic),ghash-generic)".
However, a "gcm_base" instance prevents a "gcm" instance from being registered using the same implementations. Nor will the instance be found by lookups of "gcm". This can be used as a denial of service. Moreover, "gcm_base" instances are never tested by the crypto self-tests, even if there are compatible "gcm" tests.
The root cause of these problems is that instances of the two templates use different cra_names. Therefore, fix these problems by making "gcm_base" instances set the same cra_name as "gcm" instances, e.g. "gcm(aes)" instead of "gcm_base(ctr(aes-generic),ghash-generic)".
This requires extracting the block cipher name from the name of the ctr algorithm. It also requires starting to verify that the algorithms are really ctr and ghash, not something else entirely. But it would be bizarre if anyone were actually using non-gcm-compatible algorithms with gcm_base, so this shouldn't break anyone in practice.
--- crypto/gcm.c | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-)
crypto/gcm.c +11 -23
@@ -616,7 +616,6 @@ static void crypto_gcm_free(struct aead_static int crypto_gcm_create_common (struct crypto_template *tmpl,struct rtattr **tb, -const char *full_name,const char *ctr_name,const char *ghash_name) {
@@ -657,7 +656,8 @@ static int crypto_gcm_create_common(stru goto err_free_inst; err = -EINVAL ; -if (ghash->digestsize !=16 ) +if (strcmp (ghash->base.cra_name,"ghash" ) !=0 || + ghash->digestsize !=16 ) goto err_drop_ghash;crypto_set_skcipher_spawn (&ctx->ctr,aead_crypto_instance (inst));
@@ -669,24 +669,24 @@ static int crypto_gcm_create_common(stru ctr =crypto_skcipher_spawn_alg (&ctx->ctr); -/* We only support 16-byte blocks. */ +/* The skcipher algorithm must be CTR mode, using 16-byte blocks. */ err = -EINVAL ; -if (ctr->cra_ablkcipher.ivsize !=16 ) +if (strncmp (ctr->cra_name,"ctr(" ,4 ) !=0 || + ctr->cra_ablkcipher.ivsize !=16 || + ctr->cra_blocksize !=1 ) goto out_put_ctr; -/* Not a stream cipher? */ -if (ctr->cra_blocksize !=1 ) + err = -ENAMETOOLONG ; +if (snprintf (inst->alg.base.cra_name,CRYPTO_MAX_ALG_NAME , +"gcm(%s" , ctr->cra_name +4 ) >=CRYPTO_MAX_ALG_NAME ) goto out_put_ctr; - err = -ENAMETOOLONG ;if (snprintf (inst->alg.base.cra_driver_name,CRYPTO_MAX_ALG_NAME ,"gcm_base(%s,%s)" , ctr->cra_driver_name, ghash_alg->cra_driver_name) >=CRYPTO_MAX_ALG_NAME ) goto out_put_ctr; -memcpy (inst->alg.base.cra_name, full_name,CRYPTO_MAX_ALG_NAME ); - inst->alg.base.cra_flags = (ghash->base.cra_flags | ctr->cra_flags) &CRYPTO_ALG_ASYNC ; inst->alg.base.cra_priority = (ghash->base.cra_priority +
@@ -727,7 +727,6 @@ static int crypto_gcm_create(struct cryp {const char *cipher_name;char ctr_name[CRYPTO_MAX_ALG_NAME ]; -char full_name[CRYPTO_MAX_ALG_NAME ]; cipher_name =crypto_attr_alg_name (tb[1 ]);if (IS_ERR (cipher_name))
@@ -737,12 +736,7 @@ static int crypto_gcm_create(struct cryp CRYPTO_MAX_ALG_NAME)return -ENAMETOOLONG ; -if (snprintf (full_name,CRYPTO_MAX_ALG_NAME ,"gcm(%s)" , cipher_name) >= -CRYPTO_MAX_ALG_NAME ) -return -ENAMETOOLONG ; - -return crypto_gcm_create_common (tmpl, tb, full_name, - ctr_name,"ghash" ); +return crypto_gcm_create_common (tmpl, tb, ctr_name,"ghash" ); }static struct crypto_template crypto_gcm_tmpl = {
@@ -756,7 +750,6 @@ static int crypto_gcm_base_create(struct {const char *ctr_name;const char *ghash_name; -char full_name[CRYPTO_MAX_ALG_NAME ]; ctr_name =crypto_attr_alg_name (tb[1 ]);if (IS_ERR (ctr_name))
@@ -766,12 +759,7 @@ static int crypto_gcm_base_create(structif (IS_ERR (ghash_name))return PTR_ERR (ghash_name); -if (snprintf (full_name,CRYPTO_MAX_ALG_NAME ,"gcm_base(%s,%s)" , - ctr_name, ghash_name) >=CRYPTO_MAX_ALG_NAME ) -return -ENAMETOOLONG ; - -return crypto_gcm_create_common (tmpl, tb, full_name, - ctr_name, ghash_name); +return crypto_gcm_create_common (tmpl, tb, ctr_name, ghash_name); }static struct crypto_template crypto_gcm_base_tmpl = {
Greg Kroah-Hartman
maintainerPATCH 24/241 crypto: chacha20poly1305 - set cra_name correctly
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
commit 5e27f38f1f3f45a0c938299c3a34a2d2db77165a upstream.
If the rfc7539 template is instantiated with specific implementations, e.g. "rfc7539(chacha20-generic,poly1305-generic)" rather than "rfc7539(chacha20,poly1305)", then the implementation names end up included in the instance's cra_name. This is incorrect because it then prevents all users from allocating "rfc7539(chacha20,poly1305)", if the highest priority implementations of chacha20 and poly1305 were selected. Also, the self-tests aren't run on an instance allocated in this way.
Fix it by setting the instance's cra_name from the underlying algorithms' actual cra_names, rather than from the requested names. This matches what other templates do.
--- crypto/chacha20poly1305.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
crypto/chacha20poly1305.c +2 -2
@@ -637,8 +637,8 @@ static int chachapoly_create(struct cryp err = -ENAMETOOLONG ;if (snprintf (inst->alg.base.cra_name,CRYPTO_MAX_ALG_NAME , -"%s(%s,%s)" , name, chacha_name, - poly_name) >=CRYPTO_MAX_ALG_NAME ) +"%s(%s,%s)" , name, chacha->cra_name, + poly->cra_name) >=CRYPTO_MAX_ALG_NAME ) goto out_drop_chacha; if (snprintf(inst->alg.base.cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s(%s,%s)", name, chacha->cra_driver_name,
Greg Kroah-Hartman
maintainerPATCH 25/241 crypto: salsa20 - dont access already-freed walk.iv
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
commit edaf28e996af69222b2cb40455dbb5459c2b875a upstream.
If the user-provided IV needs to be aligned to the algorithm's alignmask, then skcipher_walk_virt() copies the IV into a new aligned buffer walk.iv. But skcipher_walk_virt() can fail afterwards, and then if the caller unconditionally accesses walk.iv, it's a use-after-free.
salsa20-generic doesn't set an alignmask, so currently it isn't affected by this despite unconditionally accessing walk.iv. However this is more subtle than desired, and it was actually broken prior to the alignmask being removed by commit b62b3db76f73 ("crypto: salsa20-generic - cleanup and convert to skcipher API").
Since salsa20-generic does not update the IV and does not need any IV alignment, update it to use req->iv instead of walk.iv.
--- crypto/salsa20_generic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
crypto/salsa20_generic.c +1 -1
@@ -186,7 +186,7 @@ static int encrypt(struct blkcipher_descblkcipher_walk_init (&walk, dst, src, nbytes); err =blkcipher_walk_virt_block (desc, &walk,64 ); -salsa20_ivsetup (ctx, walk.iv); +salsa20_ivsetup (ctx, desc->info);while (walk.nbytes >=64 ) { salsa20_encrypt_bytes(ctx, walk.dst.virt.addr,
Greg Kroah-Hartman
maintainerPATCH 26/241 crypto: arm/aes-neonbs - dont access already-freed walk.iv
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
commit 767f015ea0b7ab9d60432ff6cd06b664fd71f50f upstream.
If the user-provided IV needs to be aligned to the algorithm's alignmask, then skcipher_walk_virt() copies the IV into a new aligned buffer walk.iv. But skcipher_walk_virt() can fail afterwards, and then if the caller unconditionally accesses walk.iv, it's a use-after-free.
arm32 xts-aes-neonbs doesn't set an alignmask, so currently it isn't affected by this despite unconditionally accessing walk.iv. However this is more subtle than desired, and it was actually broken prior to the alignmask being removed by commit cc477bf64573 ("crypto: arm/aes - replace bit-sliced OpenSSL NEON code"). Thus, update xts-aes-neonbs to start checking the return value of skcipher_walk_virt().
--- arch/arm/crypto/aesbs-glue.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm/crypto/aesbs-glue.c +4 -0
@@ -259,6 +259,8 @@ static int aesbs_xts_encrypt(struct blkcblkcipher_walk_init (&walk, dst, src, nbytes); err =blkcipher_walk_virt_block (desc, &walk,8 *AES_BLOCK_SIZE ); +if (err) +return err;/* generate the initial tweak */ AES_encrypt (walk.iv, walk.iv, &ctx->twkey);
@@ -283,6 +285,8 @@ static int aesbs_xts_decrypt(struct blkcblkcipher_walk_init (&walk, dst, src, nbytes); err =blkcipher_walk_virt_block (desc, &walk,8 *AES_BLOCK_SIZE ); +if (err) +return err;/* generate the initial tweak */ AES_encrypt (walk.iv, walk.iv, &ctx->twkey);
Greg Kroah-Hartman
maintainerPATCH 27/241 writeback: synchronize sync(2) against cgroup writeback membership switches
In reply to Greg Kroah-HartmanFrom: Tejun Heo <[email protected]>
commit 7fc5854f8c6efae9e7624970ab49a1eac2faefb1 upstream.
sync_inodes_sb() can race against cgwb (cgroup writeback) membership switches and fail to writeback some inodes. For example, if an inode switches to another wb while sync_inodes_sb() is in progress, the new wb might not be visible to bdi_split_work_to_wbs() at all or the inode might jump from a wb which hasn't issued writebacks yet to one which already has.
This patch adds backing_dev_info->wb_switch_rwsem to synchronize cgwb switch path against sync_inodes_sb() so that sync_inodes_sb() is guaranteed to see all the target wbs and inodes can't jump wbs to escape syncing.
v2: Fixed misplaced rwsem init. Spotted by Jiufei.
--- fs/fs-writeback.c | 40 +++++++++++++++++++++++++++++++++++++-- include/linux/backing-dev-defs.h | 1 mm/backing-dev.c | 1 3 files changed, 40 insertions(+), 2 deletions(-)
fs/fs-writeback.c +38 -2
@@ -331,11 +331,22 @@ struct inode_switch_wbs_context {struct work_struct work; }; +static void bdi_down_write_wb_switch_rwsem (struct backing_dev_info *bdi) +{ +down_write (&bdi->wb_switch_rwsem); +} + +static void bdi_up_write_wb_switch_rwsem (struct backing_dev_info *bdi) +{ +up_write (&bdi->wb_switch_rwsem); +} +static void inode_switch_wbs_work_fn (struct work_struct *work) {struct inode_switch_wbs_context *isw = container_of(work, struct inode_switch_wbs_context, work);struct inode *inode = isw->inode; +struct backing_dev_info *bdi =inode_to_bdi (inode);struct address_space *mapping = inode->i_mapping;struct bdi_writeback *old_wb = inode->i_wb;struct bdi_writeback *new_wb = isw->new_wb;
@@ -344,6 +355,12 @@ static void inode_switch_wbs_work_fn(strvoid **slot;/* +* If @inode switches cgwb membership while sync_inodes_sb() is +* being issued, sync_inodes_sb() might miss it. Synchronize. +*/ +down_read (&bdi->wb_switch_rwsem); + +/* * By the time control reaches here, RCU grace period has passed * since I_WB_SWITCH assertion and all wb stat update transactions * between unlocked_inode_to_wb_begin/end() are guaranteed to be
@@ -435,6 +452,8 @@ skip_switch:spin_unlock (&new_wb->list_lock);spin_unlock (&old_wb->list_lock); +up_read (&bdi->wb_switch_rwsem); +if (switched) {wb_wakeup (new_wb);wb_put (old_wb);
@@ -475,9 +494,18 @@ static void inode_switch_wbs(struct inodif (inode->i_state &I_WB_SWITCH )return ; +/* +* Avoid starting new switches while sync_inodes_sb() is in +* progress. Otherwise, if the down_write protected issue path +* blocks heavily, we might end up starting a large number of +* switches which will block on the rwsem. +*/ +if (!down_read_trylock (&bdi->wb_switch_rwsem)) +return ; + isw =kzalloc (sizeof (*isw),GFP_ATOMIC );if (!isw) -return ; + goto out_unlock;/* find and pin the new wb */ rcu_read_lock ();
@@ -511,12 +539,14 @@ static void inode_switch_wbs(struct inod* Let's continue after I_WB_SWITCH is guaranteed to be visible. */ call_rcu (&isw->rcu_head, inode_switch_wbs_rcu_fn); -return ; + goto out_unlock; out_free:if (isw->new_wb)wb_put (isw->new_wb);kfree (isw); +out_unlock: +up_read (&bdi->wb_switch_rwsem); }/**
@@ -896,6 +926,9 @@ fs_initcall(cgroup_writeback_init);#else /* CONFIG_CGROUP_WRITEBACK */ +static void bdi_down_write_wb_switch_rwsem (struct backing_dev_info *bdi) { } +static void bdi_up_write_wb_switch_rwsem (struct backing_dev_info *bdi) { } +static struct bdi_writeback *locked_inode_to_wb_and_lock_list (struct inode *inode) __releases(&inode->i_lock)
@@ -2341,8 +2374,11 @@ void sync_inodes_sb(struct super_block *return ;WARN_ON (!rwsem_is_locked (&sb->s_umount)); +/* protect against inode wb switch, see inode_switch_wbs_work_fn() */ +bdi_down_write_wb_switch_rwsem (bdi);bdi_split_work_to_wbs (bdi, &work, false);wb_wait_for_completion (bdi, &done); +bdi_up_write_wb_switch_rwsem (bdi);wait_sb_inodes (sb); }
include/linux/backing-dev-defs.h +1 -0
@@ -157,6 +157,7 @@ struct backing_dev_info {struct radix_tree_root cgwb_tree;/* radix tree of active cgroup wbs */ struct rb_root cgwb_congested_tree;/* their congested states */ atomic_t usage_cnt;/* counts both cgwbs and cgwb_contested's */ +struct rw_semaphore wb_switch_rwsem;/* no cgwb switch while syncing */ #else struct bdi_writeback_congested *wb_congested;#endif
mm/backing-dev.c +1 -0
@@ -669,6 +669,7 @@ static int cgwb_bdi_init(struct backing_INIT_RADIX_TREE (&bdi->cgwb_tree,GFP_ATOMIC ); bdi->cgwb_congested_tree =RB_ROOT ;atomic_set (&bdi->usage_cnt,1 ); +init_rwsem (&bdi->wb_switch_rwsem); ret =wb_init (&bdi->wb, bdi,1 ,GFP_KERNEL );if (!ret) {
Greg Kroah-Hartman
maintainerPATCH 28/241 fs/writeback.c: use rcu_barrier() to wait for inflight wb switches going into workqueue when umount
In reply to Greg Kroah-HartmanFrom: Jiufei Xue <[email protected]>
commit ec084de929e419e51bcdafaafe567d9e7d0273b7 upstream.
synchronize_rcu() didn't wait for call_rcu() callbacks, so inode wb switch may not go to the workqueue after synchronize_rcu(). Thus previous scheduled switches was not finished even flushing the workqueue, which will cause a NULL pointer dereferenced followed below.
VFS: Busy inodes after unmount of vdd. Self-destruct in 5 seconds. Have a nice day...
BUG: unable to handle kernel NULL pointer dereference at 0000000000000278
evict+0xb3/0x180
iput+0x1b0/0x230
inode_switch_wbs_work_fn+0x3c0/0x6a0
worker_thread+0x4e/0x490
? process_one_work+0x410/0x410
kthread+0xe6/0x100
ret_from_fork+0x39/0x50Replace the synchronize_rcu() call with a rcu_barrier() to wait for all pending callbacks to finish. And inc isw_nr_in_flight after call_rcu() in inode_switch_wbs() to make more sense.
--- fs/fs-writeback.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
fs/fs-writeback.c +8 -3
@@ -530,8 +530,6 @@ static void inode_switch_wbs(struct inodihold (inode); isw->inode = inode; -atomic_inc (&isw_nr_in_flight); -/* * In addition to synchronizing among switchers, I_WB_SWITCH tells * the RCU protected stat update paths to grab the mapping's
@@ -539,6 +537,9 @@ static void inode_switch_wbs(struct inod* Let's continue after I_WB_SWITCH is guaranteed to be visible. */ call_rcu (&isw->rcu_head, inode_switch_wbs_rcu_fn); + +atomic_inc (&isw_nr_in_flight); + goto out_unlock; out_free:
@@ -910,7 +911,11 @@ restart:void cgroup_writeback_umount (void ) {if (atomic_read (&isw_nr_in_flight)) { -synchronize_rcu (); +/* +* Use rcu_barrier() to wait for all pending callbacks to +* ensure that all in-flight wb switches are in the workqueue. +*/ +rcu_barrier ();flush_workqueue (isw_wq); } }
Greg Kroah-Hartman
maintainerPATCH 29/241 ext4: zero out the unused memory region in the extent tree block
In reply to Greg Kroah-HartmanFrom: Sriram Rajagopalan <[email protected]>
commit 592acbf16821288ecdc4192c47e3774a4c48bb64 upstream.
This commit zeroes out the unused memory region in the buffer_head corresponding to the extent metablock after writing the extent header and the corresponding extent node entries.
This is done to prevent random uninitialized data from getting into the filesystem when the extent block is synced.
This fixes CVE-2019-11833.
--- fs/ext4/extents.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
fs/ext4/extents.c +15 -2
@@ -1049,6 +1049,7 @@ static int ext4_ext_split(handle_t *hand__le32 border;ext4_fsblk_t *ablocks =NULL ;/* array of allocated blocks */ int err =0 ; +size_t ext_size =0 ;/* make decision: where to split? */ /* FIXME: now decision is simplest: at current extent */
@@ -1140,6 +1141,10 @@ static int ext4_ext_split(handle_t *handle16_add_cpu (&neh->eh_entries, m); } +/* zero out unused area in the extent block */ + ext_size =sizeof (struct ext4_extent_header ) + +sizeof (struct ext4_extent ) *le16_to_cpu (neh->eh_entries); +memset (bh->b_data + ext_size,0 , inode->i_sb->s_blocksize - ext_size);ext4_extent_block_csum_set (inode, neh);set_buffer_uptodate (bh);unlock_buffer (bh);
@@ -1219,6 +1224,11 @@ static int ext4_ext_split(handle_t *hand sizeof(struct ext4_extent_idx) * m);le16_add_cpu (&neh->eh_entries, m); } +/* zero out unused area in the extent block */ + ext_size =sizeof (struct ext4_extent_header ) + + (sizeof (struct ext4_extent ) *le16_to_cpu (neh->eh_entries)); +memset (bh->b_data + ext_size,0 , + inode->i_sb->s_blocksize - ext_size);ext4_extent_block_csum_set (inode, neh);set_buffer_uptodate (bh);unlock_buffer (bh);
@@ -1284,6 +1294,7 @@ static int ext4_ext_grow_indepth(handle_ext4_fsblk_t newblock, goal =0 ;struct ext4_super_block *es =EXT4_SB (inode->i_sb)->s_es;int err =0 ; +size_t ext_size =0 ;/* Try to prepend new index to old one */ if (ext_depth (inode))
@@ -1309,9 +1320,11 @@ static int ext4_ext_grow_indepth(handle_ goto out; } + ext_size =sizeof (EXT4_I (inode)->i_data);/* move top-level index/leaf into new block */ -memmove (bh->b_data,EXT4_I (inode)->i_data, -sizeof (EXT4_I (inode)->i_data)); +memmove (bh->b_data,EXT4_I (inode)->i_data, ext_size); +/* zero out unused area in the extent block */ +memset (bh->b_data + ext_size,0 , inode->i_sb->s_blocksize - ext_size);/* set size of new block */ neh =ext_block_hdr (bh);
Greg Kroah-Hartman
maintainerPATCH 30/241 ALSA: hda/realtek - Fix for Lenovo B50-70 inverted internal microphone bug
In reply to Greg Kroah-HartmanFrom: Michał Wadowski <[email protected]>
commit 56df90b631fc027fe28b70d41352d820797239bb upstream.
Add patch for realtek codec in Lenovo B50-70 that fixes inverted internal microphone channel.
Device IdeaPad Y410P has the same PCI SSID as Lenovo B50-70, but first one is about fix the noise and it didn't seem help in a later kernel version.
So I replaced IdeaPad Y410P device description with B50-70 and apply inverted microphone fix.
Bugzilla: https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1524215
--- sound/pci/hda/patch_realtek.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/patch_realtek.c +1 -1
@@ -5778,7 +5778,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x3112 ,"ThinkCentre AIO" ,ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY ),SND_PCI_QUIRK (0x17aa ,0x3902 ,"Lenovo E50-80" ,ALC269_FIXUP_DMIC_THINKPAD_ACPI ),SND_PCI_QUIRK (0x17aa ,0x3977 ,"IdeaPad S210" ,ALC283_FIXUP_INT_MIC ), -SND_PCI_QUIRK (0x17aa ,0x3978 ,"IdeaPad Y410P" ,ALC269_FIXUP_NO_SHUTUP ), +SND_PCI_QUIRK (0x17aa ,0x3978 ,"Lenovo B50-70" ,ALC269_FIXUP_DMIC_THINKPAD_ACPI ),SND_PCI_QUIRK (0x17aa ,0x5013 ,"Thinkpad" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ),SND_PCI_QUIRK (0x17aa ,0x501a ,"Thinkpad" ,ALC283_FIXUP_INT_MIC ), SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
Greg Kroah-Hartman
maintainerPATCH 31/241 KVM: x86: Skip EFER vs. guest CPUID checks for host-initiated writes
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 11988499e62b310f3bf6f6d0a807a06d3f9ccc96 upstream.
KVM allows userspace to violate consistency checks related to the guest's CPUID model to some degree. Generally speaking, userspace has carte blanche when it comes to guest state so long as jamming invalid state won't negatively affect the host.
Currently this is seems to be a non-issue as most of the interesting EFER checks are missing, e.g. NX and LME, but those will be added shortly. Proactively exempt userspace from the CPUID checks so as not to break userspace.
Note, the efer_reserved_bits check still applies to userspace writes as that mask reflects the host's capabilities, e.g. KVM shouldn't allow a guest to run with NX=1 if it has been disabled in the host.
--- arch/x86/kvm/x86.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-)
arch/x86/kvm/x86.c +22 -11
@@ -990,11 +990,8 @@ static u32 emulated_msrs[] = {static unsigned num_emulated_msrs; -bool kvm_valid_efer (struct kvm_vcpu *vcpu,u64 efer) +static bool __kvm_valid_efer (struct kvm_vcpu *vcpu,u64 efer) { -if (efer & efer_reserved_bits) -return false; -if (efer &EFER_FFXSR ) {struct kvm_cpuid_entry2 *feat;
@@ -1012,19 +1009,33 @@ bool kvm_valid_efer(struct kvm_vcpu *vcp }return true; + +} +bool kvm_valid_efer (struct kvm_vcpu *vcpu,u64 efer) +{ +if (efer & efer_reserved_bits) +return false; + +return __kvm_valid_efer (vcpu, efer); }EXPORT_SYMBOL_GPL (kvm_valid_efer); -static int set_efer (struct kvm_vcpu *vcpu,u64 efer) +static int set_efer (struct kvm_vcpu *vcpu,struct msr_data *msr_info) {u64 old_efer = vcpu->arch.efer; +u64 efer = msr_info->data; -if (!kvm_valid_efer (vcpu, efer)) -return 1 ; +if (efer & efer_reserved_bits) +return false; -if (is_paging (vcpu) - && (vcpu->arch.efer &EFER_LME ) != (efer &EFER_LME )) -return 1 ; +if (!msr_info->host_initiated) { +if (!__kvm_valid_efer (vcpu, efer)) +return 1 ; + +if (is_paging (vcpu) && + (vcpu->arch.efer &EFER_LME ) != (efer &EFER_LME )) +return 1 ; + } efer &= ~EFER_LMA ; efer |= vcpu->arch.efer &EFER_LMA ;
@@ -2055,7 +2066,7 @@ int kvm_set_msr_common(struct kvm_vcpu *break ;case MSR_EFER : -return set_efer (vcpu, data); +return set_efer (vcpu, msr_info);case MSR_K7_HWCR : data &= ~(u64 )0x40 ;/* ignore flush filter disable */ data &= ~(u64 )0x100 ;/* ignore ignne emulation enable */
Greg Kroah-Hartman
maintainerPATCH 32/241 net: avoid weird emergency message
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit d7c04b05c9ca14c55309eb139430283a45c4c25f ]
When host is under high stress, it is very possible thread running netdev_wait_allrefs() returns from msleep(250) 10 seconds late.
This leads to these messages in the syslog :
[...] unregister_netdevice: waiting for syz_tun to become free. Usage count = 0
If the device refcount is zero, the wait is over.
--- net/core/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/dev.c +1 -1
@@ -6986,7 +6986,7 @@ static void netdev_wait_allrefs(struct n refcnt =netdev_refcnt_read (dev); -if (time_after (jiffies, warning_time +10 *HZ )) { +if (refcnt &&time_after (jiffies, warning_time +10 *HZ )) {pr_emerg ("unregister_netdevice: waiting for %s to become free. Usage count = %d\n" , dev->name, refcnt); warning_time = jiffies;
Greg Kroah-Hartman
maintainerPATCH 33/241 net/mlx4_core: Change the error print to info print
In reply to Greg Kroah-HartmanFrom: Yunjian Wang <[email protected]>
[ Upstream commit 00f9fec48157f3734e52130a119846e67a12314b ]
The error print within mlx4_flow_steer_promisc_add() should be a info print.
--- drivers/net/ethernet/mellanox/mlx4/mcg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx4/mcg.c +1 -1
@@ -1485,7 +1485,7 @@ int mlx4_flow_steer_promisc_add(struct m rule.port = port; rule.qpn = qpn;INIT_LIST_HEAD (&rule.list); -mlx4_err (dev,"going promisc on %x\n" , port); +mlx4_info (dev,"going promisc on %x\n" , port);return mlx4_flow_attach (dev, &rule, regid_p); }
Greg Kroah-Hartman
maintainerPATCH 34/241 ppp: deflate: Fix possible crash in deflate_init
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
[ Upstream commit 3ebe1bca58c85325c97a22d4fc3f5b5420752e6f ]
BUG: unable to handle kernel paging request at ffffffffa018f000 PGD 3270067 P4D 3270067 PUD 3271063 PMD 2307eb067 PTE 0 Oops: 0000 [#1] PREEMPT SMP CPU: 0 PID: 4138 Comm: modprobe Not tainted 5.1.0-rc7+ #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.3-0-ge2fc41e-prebuilt.qemu-project.org 04/01/2014 RIP: 0010:ppp_register_compressor+0x3e/0xd0 [ppp_generic] Code: 98 4a 3f e2 48 8b 15 c1 67 00 00 41 8b 0c 24 48 81 fa 40 f0 19 a0 75 0e eb 35 48 8b 12 48 81 fa 40 f0 19 a0 74 RSP: 0018:ffffc90000d93c68 EFLAGS: 00010287 RAX: ffffffffa018f000 RBX: ffffffffa01a3000 RCX: 000000000000001a RDX: ffff888230c750a0 RSI: 0000000000000000 RDI: ffffffffa019f000 RBP: ffffc90000d93c80 R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: ffffffffa0194080 R13: ffff88822ee1a700 R14: 0000000000000000 R15: ffffc90000d93e78 FS: 00007f2339557540(0000) GS:ffff888237a00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffffffffa018f000 CR3: 000000022bde4000 CR4: 00000000000006f0 Call Trace: ? 0xffffffffa01a3000 deflate_init+0x11/0x1000 [ppp_deflate] ? 0xffffffffa01a3000 do_one_initcall+0x6c/0x3cc ? kmem_cache_alloc_trace+0x248/0x3b0 do_init_module+0x5b/0x1f1 load_module+0x1db1/0x2690 ? m_show+0x1d0/0x1d0 __do_sys_finit_module+0xc5/0xd0 __x64_sys_finit_module+0x15/0x20 do_syscall_64+0x6b/0x1d0 entry_SYSCALL_64_after_hwframe+0x49/0xbe
If ppp_deflate fails to register in deflate_init, module initialization failed out, however ppp_deflate_draft may has been regiestred and not unregistered before return.
Then the seconed modprobe will trigger crash like this.
--- drivers/net/ppp/ppp_deflate.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
drivers/net/ppp/ppp_deflate.c +14 -6
@@ -610,12 +610,20 @@ static struct compressor ppp_deflate_drastatic int __init deflate_init (void ) { -int answer =ppp_register_compressor (&ppp_deflate); -if (answer ==0 ) -printk (KERN_INFO -"PPP Deflate Compression module registered\n" ); -ppp_register_compressor (&ppp_deflate_draft); -return answer; +int rc; + + rc =ppp_register_compressor (&ppp_deflate); +if (rc) +return rc; + + rc =ppp_register_compressor (&ppp_deflate_draft); +if (rc) { +ppp_unregister_compressor (&ppp_deflate); +return rc; + } + +pr_info ("PPP Deflate Compression module registered\n" ); +return 0 ; } static void __exit deflate_cleanup(void)
Greg Kroah-Hartman
maintainerPATCH 35/241 tipc: switch order of device registration to fix a crash
In reply to Greg Kroah-HartmanFrom: Junwei Hu <[email protected]>
[ Upstream commit 7e27e8d6130c5e88fac9ddec4249f7f2337fe7f8 ]
When tipc is loaded while many processes try to create a TIPC socket, a crash occurs:
PANIC: Unable to handle kernel paging request at virtual address "dfff20000000021d"
pc : tipc_sk_create+0x374/0x1180 [tipc] lr : tipc_sk_create+0x374/0x1180 [tipc] Exception class = DABT (current EL), IL = 32 bits Call trace: tipc_sk_create+0x374/0x1180 [tipc] __sock_create+0x1cc/0x408 __sys_socket+0xec/0x1f0 __arm64_sys_socket+0x74/0xa8 ...
This is due to race between sock_create and unfinished register_pernet_device. tipc_sk_insert tries to do "net_generic(net, tipc_net_id)".
but tipc_net_id is not initialized yet.
So switch the order of the two to close the race.
This can be reproduced with multiple processes doing socket(AF_TIPC, ...) and one process doing module removal.
--- net/tipc/core.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
net/tipc/core.c +7 -7
@@ -126,10 +126,6 @@ static int __init tipc_init(void)if (err) goto out_netlink_compat; - err =tipc_socket_init (); -if (err) - goto out_socket; - err =tipc_register_sysctl ();if (err) goto out_sysctl;
@@ -138,6 +134,10 @@ static int __init tipc_init(void)if (err) goto out_pernet; + err =tipc_socket_init (); +if (err) + goto out_socket; + err =tipc_bearer_setup ();if (err) goto out_bearer;
@@ -145,12 +145,12 @@ static int __init tipc_init(void)pr_info ("Started in single node mode\n" );return 0 ; out_bearer: +tipc_socket_stop (); +out_socket:unregister_pernet_subsys (&tipc_net_ops); out_pernet:tipc_unregister_sysctl (); out_sysctl: -tipc_socket_stop (); -out_socket:tipc_netlink_compat_stop (); out_netlink_compat:tipc_netlink_stop ();
@@ -162,10 +162,10 @@ out_netlink: static void __exit tipc_exit(void) {tipc_bearer_cleanup (); +tipc_socket_stop ();unregister_pernet_subsys (&tipc_net_ops);tipc_netlink_stop ();tipc_netlink_compat_stop (); -tipc_socket_stop ();tipc_unregister_sysctl ();pr_info ("Deactivated\n" );
Greg Kroah-Hartman
maintainerPATCH 36/241 tipc: fix modprobe tipc failed after switch order of device registration
In reply to Greg Kroah-HartmanFrom: Junwei Hu <[email protected]>
[ Upstream commit 532b0f7ece4cb2ffd24dc723ddf55242d1188e5e ]
Error message printed:
modprobe: ERROR: could not insert 'tipc': Address family not supported by protocol.
when modprobe tipc after the following patch: switch order of device registration, commit 7e27e8d6130c
("tipc: switch order of device registration to fix a crash")
Because sock_create_kern(net, AF_TIPC, ...) is called by tipc_topsrv_create_listener() in the initialization process of tipc_net_ops, tipc_socket_init() must be execute before that.
I move tipc_socket_init() into function tipc_init_net().
("tipc: switch order of device registration to fix a crash")
--- net/tipc/core.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
net/tipc/core.c +7 -7
@@ -61,6 +61,10 @@ static int __net_init tipc_init_net(struINIT_LIST_HEAD (&tn->node_list);spin_lock_init (&tn->node_list_lock); + err =tipc_socket_init (); +if (err) + goto out_socket; + err =tipc_sk_rht_init (net);if (err) goto out_sk_rht;
@@ -87,6 +91,8 @@ out_subscr: out_nametbl:tipc_sk_rht_destroy (net); out_sk_rht: +tipc_socket_stop (); +out_socket:return err; }
@@ -97,6 +103,7 @@ static void __net_exit tipc_exit_net(strtipc_bcast_stop (net);tipc_nametbl_stop (net);tipc_sk_rht_destroy (net); +tipc_socket_stop (); }static struct pernet_operations tipc_net_ops = {
@@ -134,10 +141,6 @@ static int __init tipc_init(void)if (err) goto out_pernet; - err =tipc_socket_init (); -if (err) - goto out_socket; - err =tipc_bearer_setup ();if (err) goto out_bearer;
@@ -145,8 +148,6 @@ static int __init tipc_init(void)pr_info ("Started in single node mode\n" );return 0 ; out_bearer: -tipc_socket_stop (); -out_socket:unregister_pernet_subsys (&tipc_net_ops); out_pernet:tipc_unregister_sysctl ();
@@ -162,7 +163,6 @@ out_netlink: static void __exit tipc_exit(void) {tipc_bearer_cleanup (); -tipc_socket_stop ();unregister_pernet_subsys (&tipc_net_ops);tipc_netlink_stop ();tipc_netlink_compat_stop ();
Greg Kroah-Hartman
maintainerPATCH 37/241 stm class: Fix channel free in stm output free path
In reply to Greg Kroah-HartmanFrom: Tingwei Zhang <[email protected]>
commit ee496da4c3915de3232b5f5cd20e21ae3e46fe8d upstream.
Number of free masters is not set correctly in stm free path. Fix this by properly adding the number of output channels before setting them to 0 in stm_output_disclaim().
Currently it is equivalent to doing nothing sincemaster->nr_free is incremented by 0.
--- drivers/hwtracing/stm/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwtracing/stm/core.c +1 -1
@@ -210,8 +210,8 @@ stm_output_disclaim(struct stm_device *sbitmap_release_region (&master->chan_map[0 ], output->channel,ilog2 (output->nr_chans)); - output->nr_chans =0 ; master->nr_free += output->nr_chans; + output->nr_chans =0 ; }/*
Greg Kroah-Hartman
maintainerPATCH 38/241 md: add mddev->pers to avoid potential NULL pointer dereference
In reply to Greg Kroah-HartmanFrom: Yufen Yu <[email protected]>
commit ee37e62191a59d253fc916b9fc763deb777211e2 upstream.
When doing re-add, we need to ensure rdev->mddev->pers is not NULL, which can avoid potential NULL pointer derefence in fallowing add_bound_rdev().
--- drivers/md/md.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/md/md.c +4 -2
@@ -2690,8 +2690,10 @@ state_store(struct md_rdev *rdev, const err =0 ; } }else if (cmd_match (buf,"re-add" )) { -if (test_bit (Faulty, &rdev->flags) && (rdev->raid_disk ==-1 ) && - rdev->saved_raid_disk >=0 ) { +if (!rdev->mddev->pers) + err = -EINVAL ; +else if (test_bit (Faulty, &rdev->flags) && (rdev->raid_disk ==-1 ) && + rdev->saved_raid_disk >=0 ) {/* clear_bit is performed _after_ all the devices * have their local Faulty bit cleared. If any writes * happen in the meantime in the local node, they
Greg Kroah-Hartman
maintainerPATCH 39/241 intel_th: msu: Fix single mode with IOMMU
In reply to Greg Kroah-HartmanFrom: Alexander Shishkin <[email protected]>
commit 4e0eaf239fb33ebc671303e2b736fa043462e2f4 upstream.
Currently, the pages that are allocated for the single mode of MSC are not mapped into the device's dma space and the code is incorrectly using *_to_phys() in place of a dma address. This fails with IOMMU enabled and is otherwise bad practice.
Fix the single mode buffer allocation to map the pages into the device's DMA space.
--- drivers/hwtracing/intel_th/msu.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-)
drivers/hwtracing/intel_th/msu.c +32 -3
@@ -90,6 +90,7 @@ struct msc_iter {* @reg_base: register window base address * @thdev: intel_th_device pointer * @win_list: list of windows in multiblock mode +* @single_sgt: single mode buffer * @nr_pages: total number of pages allocated for this buffer * @single_sz: amount of data in single mode * @single_wrap: single mode wrap occurred
@@ -110,6 +111,7 @@ struct msc {struct intel_th_device *thdev;struct list_head win_list; +struct sg_table single_sgt;unsigned long nr_pages;unsigned long single_sz; unsigned int single_wrap : 1;
@@ -610,22 +612,45 @@ static void intel_th_msc_deactivate(stru*/ static int msc_buffer_contig_alloc (struct msc *msc,unsigned long size) { +unsigned long nr_pages = size >>PAGE_SHIFT ;unsigned int order =get_order (size);struct page *page; +int ret;if (!size)return 0 ; + ret =sg_alloc_table (&msc->single_sgt,1 ,GFP_KERNEL ); +if (ret) + goto err_out; + + ret = -ENOMEM ; page =alloc_pages (GFP_KERNEL | __GFP_ZERO, order);if (!page) -return -ENOMEM ; + goto err_free_sgt;split_page (page, order); - msc->nr_pages = size >>PAGE_SHIFT ; +sg_set_buf (msc->single_sgt.sgl,page_address (page), size); + + ret =dma_map_sg (msc_dev (msc)->parent->parent, msc->single_sgt.sgl,1 , +DMA_FROM_DEVICE ); +if (ret <0 ) + goto err_free_pages; + + msc->nr_pages = nr_pages; msc->base =page_address (page); - msc->base_addr =page_to_phys (page); + msc->base_addr =sg_dma_address (msc->single_sgt.sgl);return 0 ; + +err_free_pages: +__free_pages (page, order); + +err_free_sgt: +sg_free_table (&msc->single_sgt); + +err_out: +return ret; }/**
@@ -636,6 +661,10 @@ static void msc_buffer_contig_free(struc {unsigned long off; +dma_unmap_sg (msc_dev (msc)->parent->parent, msc->single_sgt.sgl, +1 ,DMA_FROM_DEVICE ); +sg_free_table (&msc->single_sgt); +for (off =0 ; off < msc->nr_pages <<PAGE_SHIFT ; off +=PAGE_SIZE ) {struct page *page =virt_to_page (msc->base + off);
Greg Kroah-Hartman
maintainerPATCH 40/241 of: fix clang -Wunsequenced for be32_to_cpu()
In reply to Greg Kroah-HartmanFrom: Phong Tran <[email protected]>
commit 440868661f36071886ed360d91de83bd67c73b4f upstream.
Now, make the loop explicit to avoid clang warning.
./include/linux/of.h:238:37: warning: multiple unsequenced modifications to 'cell' [-Wunsequenced]
r = (r << 32) | be32_to_cpu(*(cell++));
^~
./include/linux/byteorder/generic.h:95:21: note: expanded from macro
'be32_to_cpu'
^
./include/uapi/linux/byteorder/little_endian.h:40:59: note: expanded
from macro '__be32_to_cpu'
^
./include/uapi/linux/swab.h:118:21: note: expanded from macro '__swab32'
___constant_swab32(x) : \
^
./include/uapi/linux/swab.h:18:12: note: expanded from macro
'___constant_swab32'
(((__u32)(x) & (__u32)0x000000ffUL) << 24) | \
^--- include/linux/of.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/of.h +2 -2
@@ -199,8 +199,8 @@ extern struct device_node *of_find_all_nstatic inline u64 of_read_number (const __be32 *cell,int size) {u64 r =0 ; -while (size--) - r = (r <<32 ) |be32_to_cpu (*(cell++)); +for (; size--; cell++) + r = (r <<32 ) |be32_to_cpu (*cell);return r; }
Greg Kroah-Hartman
maintainerPATCH 41/241 cifs: fix strcat buffer overflow and reduce raciness in smb21_set_oplock_level()
In reply to Greg Kroah-HartmanFrom: Christoph Probst <[email protected]>
commit 6a54b2e002c9d00b398d35724c79f9fe0d9b38fb upstream.
Change strcat to strncpy in the "None" case to fix a buffer overflow when cinode->oplock is reset to 0 by another thread accessing the same cinode. It is never valid to append "None" to any other message.
Consolidate multiple writes to cinode->oplock to reduce raciness.
--- fs/cifs/smb2ops.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
fs/cifs/smb2ops.c +8 -6
@@ -1329,26 +1329,28 @@ smb21_set_oplock_level(struct cifsInodeI unsigned int epoch, bool *purge_cache) { char message[5] = {0}; +unsigned int new_oplock =0 ; oplock &=0xFF ;if (oplock ==SMB2_OPLOCK_LEVEL_NOCHANGE )return ; - cinode->oplock =0 ;if (oplock &SMB2_LEASE_READ_CACHING_HE ) { - cinode->oplock |=CIFS_CACHE_READ_FLG ; + new_oplock |=CIFS_CACHE_READ_FLG ;strcat (message,"R" ); }if (oplock &SMB2_LEASE_HANDLE_CACHING_HE ) { - cinode->oplock |=CIFS_CACHE_HANDLE_FLG ; + new_oplock |=CIFS_CACHE_HANDLE_FLG ;strcat (message,"H" ); }if (oplock &SMB2_LEASE_WRITE_CACHING_HE ) { - cinode->oplock |=CIFS_CACHE_WRITE_FLG ; + new_oplock |=CIFS_CACHE_WRITE_FLG ;strcat (message,"W" ); } -if (!cinode->oplock) -strcat (message,"None" ); +if (!new_oplock) +strncpy (message,"None" ,sizeof (message)); + + cinode->oplock = new_oplock;cifs_dbg (FYI ,"%s Lease granted on inode %p\n" , message, &cinode->vfs_inode); }
RE: [PATCH 4.4 041/241] cifs: fix strcat buffer overflow and reduce raciness in smb21_set_oplock_level()
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: Sunday, June 9, 2019 9:40 AM
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Christoph Probst <[email protected]>; Pavel Shilovskiy <[email protected]>; Steven French <[email protected]>
Subject: [PATCH 4.4 041/241] cifs: fix strcat buffer overflow and reduce raciness in smb21_set_oplock_level()
From: Christoph Probst <[email protected]>
commit 6a54b2e002c9d00b398d35724c79f9fe0d9b38fb upstream.
Change strcat to strncpy in the "None" case to fix a buffer overflow when cinode->oplock is reset to 0 by another thread accessing the same cinode. It is never valid to append "None" to any other message.
Consolidate multiple writes to cinode->oplock to reduce raciness.
--------------------------------
Hi Greg,
This patch has been queued for 4.4.y and has already been merged into 5.1.y (5.1.5). Are you going to apply it to other stable kernels: 4.9, 4.14, 4.19?
Best regards,
Pavel Shilovsky
Greg Kroah-Hartman
maintainerRe: [PATCH 4.4 041/241] cifs: fix strcat buffer overflow and reduce raciness in smb21_set_oplock_level()
Quoted 21 lines · Pavel Shilovskiy
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: Sunday, June 9, 2019 9:40 AM
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Christoph Probst <[email protected]>; Pavel Shilovskiy <[email protected]>; Steven French <[email protected]>
Subject: [PATCH 4.4 041/241] cifs: fix strcat buffer overflow and reduce raciness insmb21_set_oplock_level()From: Christoph Probst <[email protected]>
commit
6a54b2e002c9d00b398d35724c79f9fe0d9b38fbupstream.Change strcat to strncpy in the "None" case to fix a buffer overflow when
cinode->oplockis reset to 0 by another thread accessing the same cinode. It is never valid to append "None" to any other message.Consolidate multiple writes to
cinode->oplockto reduce raciness.Signed-off-by Christoph Probst <[email protected]>Reviewed-by Pavel Shilovsky <[email protected]>Signed-off-by Steve French <[email protected]>CC Stable <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>
Quoted 7 lines
--------------------------------
Hi Greg,
This patch has been queued for 4.4.y and has already been merged into 5.1.y (5.1.5). Are you going to apply it to other stable kernels: 4.9, 4.14, 4.19?
It is already in the 4.9.179, 4.14.122, 4.19.46, 5.0.19, and 5.1.5 released kernels. So I don't think I can merge it into them again :)
thanks,
greg k-h
RE: [PATCH 4.4 041/241] cifs: fix strcat buffer overflow and reduce raciness in smb21_set_oplock_level()
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: Tuesday, June 11, 2019 12:20 AM
To: Pavel Shilovskiy <[email protected]>
Cc: [email protected]; [email protected]; Christoph Probst <[email protected]>; Steven French <[email protected]>
Subject: Re: [PATCH 4.4 041/241] cifs: fix strcat buffer overflow and reduce raciness in smb21_set_oplock_level()
Quoted 25 lines · Pavel Shilovskiy
-----Original Message-----
From: Greg Kroah-Hartman <[email protected]>
Sent: Sunday, June 9, 2019 9:40 AM
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Christoph Probst <[email protected]>; Pavel Shilovskiy <[email protected]>; Steven French <[email protected]>
Subject: [PATCH 4.4 041/241] cifs: fix strcat buffer overflow and reduce raciness insmb21_set_oplock_level()From: Christoph Probst <[email protected]>
commit
6a54b2e002c9d00b398d35724c79f9fe0d9b38fbupstream.Change strcat to strncpy in the "None" case to fix a buffer overflow when
cinode->oplockis reset to 0 by another thread accessing the same cinode. It is never valid to append "None" to any other message.Consolidate multiple writes to
cinode->oplockto reduce raciness.Signed-off-by Christoph Probst <[email protected]>Reviewed-by Pavel Shilovsky <[email protected]>Signed-off-by Steve French <[email protected]>CC Stable <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>
Quoted 7 lines
--------------------------------
Hi Greg,
This patch has been queued for 4.4.y and has already been merged into 5.1.y (5.1.5). Are you going to apply it to other stable kernels: 4.9, 4.14, 4.19?
It is already in the 4.9.179, 4.14.122, 4.19.46, 5.0.19, and 5.1.5 released kernels. So I don't think I can merge it into them again :)
thanks,
greg k-h
---------------------------------
You are right, I missed it somehow. Thanks for clarifying!
Best regards,
Pavel Shilovsky
Greg Kroah-Hartman
maintainerPATCH 42/241 media: ov6650: Fix sensor possibly not detected on probe
In reply to Greg Kroah-HartmanFrom: Janusz Krzysztofik <[email protected]>
commit 933c1320847f5ed6b61a7d10f0a948aa98ccd7b0 upstream.
After removal of clock_start() from before soc_camera_init_i2c() in soc_camera_probe() by commit 9aea470b399d ("[media] soc-camera: switch I2C subdevice drivers to use v4l2-clk") introduced in v3.11, the ov6650 driver could no longer probe the sensor successfully because its clock was no longer turned on in advance. The issue was initially worked around by adding that missing clock_start() equivalent to OMAP1 camera interface driver - the only user of this sensor - but a propoer fix should be rather implemented in the sensor driver code itself.
Fix the issue by inserting a delay between the clock is turned on and the sensor I2C registers are read for the first time.
Tested on Amstrad Delta with now out of tree but still locally maintained omap1_camera host driver.
--- drivers/media/i2c/soc_camera/ov6650.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/i2c/soc_camera/ov6650.c +2 -0
@@ -843,6 +843,8 @@ static int ov6650_video_probe(struct i2cif (ret <0 )return ret; +msleep (20 ); +/* * check and show product ID and manufacturer ID */
Greg Kroah-Hartman
maintainerPATCH 43/241 NFS4: Fix v4.0 client state corruption when mount
In reply to Greg Kroah-HartmanFrom: ZhangXiaoxu <[email protected]>
commit f02f3755dbd14fb935d24b14650fff9ba92243b8 upstream.
stat command with soft mount never return after server is stopped.
When alloc a new client, the state of the client will be set to NFS4CLNT_LEASE_EXPIRED.
When the server is stopped, the state manager will work, and accord the state to recover. But the state is NFS4CLNT_LEASE_EXPIRED, it will drain the slot table and lead other task to wait queue, until the client recovered. Then the stat command is hung.
When discover server trunking, the client will renew the lease, but check the client state, it lead the client state corruption.
So, we need to call state manager to recover it when detect server ip trunking.
--- fs/nfs/nfs4state.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/nfs/nfs4state.c +4 -0
@@ -140,6 +140,10 @@ int nfs40_discover_server_trunking(struc/* Sustain the lease, even if it's empty. If the clientid4 * goes stale it's of no use for trunking discovery. */ nfs4_schedule_state_renewal (*result); + +/* If the client state need to recover, do it. */ +if (clp->cl_state) +nfs4_schedule_state_manager (clp); } out:return status;
Greg Kroah-Hartman
maintainerPATCH 44/241 clk: tegra: Fix PLLM programming on Tegra124+ when PMC overrides divider
In reply to Greg Kroah-HartmanFrom: Dmitry Osipenko <[email protected]>
commit 40db569d6769ffa3864fd1b89616b1a7323568a8 upstream.
There are wrongly set parenthesis in the code that are resulting in a wrong configuration being programmed for PLLM. The original fix was made by Danny Huang in the downstream kernel. The patch was tested on Nyan Big Tegra124 chromebook, PLLM rate changing works correctly now and system doesn't lock up after changing the PLLM rate due to EMC scaling.
--- drivers/clk/tegra/clk-pll.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/tegra/clk-pll.c +2 -2
@@ -492,8 +492,8 @@ static void _update_pll_mnp(struct tegrapll_override_writel (val, params->pmc_divp_reg, pll); val =pll_override_readl (params->pmc_divnm_reg, pll); - val &= ~(divm_mask (pll) << div_nmp->override_divm_shift) | - ~(divn_mask (pll) << div_nmp->override_divn_shift); + val &= ~((divm_mask (pll) << div_nmp->override_divm_shift) | + (divn_mask (pll) << div_nmp->override_divn_shift)); val |= (cfg->m << div_nmp->override_divm_shift) | (cfg->n << div_nmp->override_divn_shift);pll_override_writel (val, params->pmc_divnm_reg, pll);
Greg Kroah-Hartman
maintainerPATCH 45/241 fuse: fix writepages on 32bit
In reply to Greg Kroah-HartmanFrom: Miklos Szeredi <[email protected]>
commit 9de5be06d0a89ca97b5ab902694d42dfd2bb77d2 upstream.
Writepage requests were cropped to i_size & 0xffffffff, which meant that mmaped writes to any file larger than 4G might be silently discarded.
Fix by storing the file size in a properly sized variable (loff_t instead of size_t).
--- fs/fuse/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/fuse/file.c +1 -1
@@ -1533,7 +1533,7 @@ __acquires(fc->lock) {struct fuse_conn *fc =get_fuse_conn (inode);struct fuse_inode *fi =get_fuse_inode (inode); -size_t crop =i_size_read (inode); +loff_t crop =i_size_read (inode);struct fuse_req *req;while (fi->writectr >=0 && !list_empty (&fi->queued_writes)) {
Greg Kroah-Hartman
maintainerPATCH 46/241 fuse: honor RLIMIT_FSIZE in fuse_file_fallocate
In reply to Greg Kroah-HartmanFrom: Liu Bo <[email protected]>
commit 0cbade024ba501313da3b7e5dd2a188a6bc491b5 upstream.
fstests generic/228 reported this failure that fuse fallocate does not honor what 'ulimit -f' has set.
This adds the necessary inode_newsize_ok() check.
--- fs/fuse/file.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/fuse/file.c +7 -0
@@ -2947,6 +2947,13 @@ static long fuse_file_fallocate(struct f } } +if (!(mode &FALLOC_FL_KEEP_SIZE ) && + offset + length >i_size_read (inode)) { + err =inode_newsize_ok (inode, offset + length); +if (err) +return err; + } +if (!(mode &FALLOC_FL_KEEP_SIZE ))set_bit (FUSE_I_SIZE_UNSTABLE , &fi->state);
Greg Kroah-Hartman
maintainerPATCH 47/241 iommu/tegra-smmu: Fix invalid ASID bits on Tegra30/114
In reply to Greg Kroah-HartmanFrom: Dmitry Osipenko <[email protected]>
commit 43a0541e312f7136e081e6bf58f6c8a2e9672688 upstream.
Both Tegra30 and Tegra114 have 4 ASID's and the corresponding bitfield of the TLB_FLUSH register differs from later Tegra generations that have 128 ASID's.
In a result the PTE's are now flushed correctly from TLB and this fixes problems with graphics (randomly failing tests) on Tegra30.
--- drivers/iommu/tegra-smmu.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
drivers/iommu/tegra-smmu.c +18 -7
@@ -91,7 +91,6 @@ static inline u32 smmu_readl(struct tegr#define SMMU_TLB_FLUSH_VA_MATCH_ALL (0 << 0)#define SMMU_TLB_FLUSH_VA_MATCH_SECTION (2 << 0)#define SMMU_TLB_FLUSH_VA_MATCH_GROUP (3 << 0) -#define SMMU_TLB_FLUSH_ASID (x) (((x) & 0x7f) << 24)#define SMMU_TLB_FLUSH_VA_SECTION (addr) ((((addr) & 0xffc00000) >> 12) | \ SMMU_TLB_FLUSH_VA_MATCH_SECTION)#define SMMU_TLB_FLUSH_VA_GROUP (addr) ((((addr) & 0xffffc000) >> 12) | \
@@ -194,8 +193,12 @@ static inline void smmu_flush_tlb_asid(s {u32 value; - value =SMMU_TLB_FLUSH_ASID_MATCH |SMMU_TLB_FLUSH_ASID (asid) | -SMMU_TLB_FLUSH_VA_MATCH_ALL ; +if (smmu->soc->num_asids ==4 ) + value = (asid &0x3 ) <<29 ; +else + value = (asid &0x7f ) <<24 ; + + value |=SMMU_TLB_FLUSH_ASID_MATCH |SMMU_TLB_FLUSH_VA_MATCH_ALL ;smmu_writel (smmu, value,SMMU_TLB_FLUSH ); }
@@ -205,8 +208,12 @@ static inline void smmu_flush_tlb_sectio {u32 value; - value =SMMU_TLB_FLUSH_ASID_MATCH |SMMU_TLB_FLUSH_ASID (asid) | -SMMU_TLB_FLUSH_VA_SECTION (iova); +if (smmu->soc->num_asids ==4 ) + value = (asid &0x3 ) <<29 ; +else + value = (asid &0x7f ) <<24 ; + + value |=SMMU_TLB_FLUSH_ASID_MATCH |SMMU_TLB_FLUSH_VA_SECTION (iova);smmu_writel (smmu, value,SMMU_TLB_FLUSH ); }
@@ -216,8 +223,12 @@ static inline void smmu_flush_tlb_group( {u32 value; - value =SMMU_TLB_FLUSH_ASID_MATCH |SMMU_TLB_FLUSH_ASID (asid) | -SMMU_TLB_FLUSH_VA_GROUP (iova); +if (smmu->soc->num_asids ==4 ) + value = (asid &0x3 ) <<29 ; +else + value = (asid &0x7f ) <<24 ; + + value |=SMMU_TLB_FLUSH_ASID_MATCH |SMMU_TLB_FLUSH_VA_GROUP (iova);smmu_writel (smmu, value,SMMU_TLB_FLUSH ); }
Greg Kroah-Hartman
maintainerPATCH 48/241 ceph: flush dirty inodes before proceeding with remount
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
commit 00abf69dd24f4444d185982379c5cc3bb7b6d1fc upstream.
xfstest generic/452 was triggering a "Busy inodes after umount" warning. ceph was allowing the mount to go read-only without first flushing out dirty inodes in the cache. Ensure we sync out the filesystem before allowing a remount to proceed.
--- fs/ceph/super.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/ceph/super.c +7 -0
@@ -712,6 +712,12 @@ static void ceph_umount_begin(struct supreturn ; } +static int ceph_remount (struct super_block *sb,int *flags,char *data) +{ +sync_filesystem (sb); +return 0 ; +} +static const struct super_operations ceph_super_ops = { .alloc_inode = ceph_alloc_inode, .destroy_inode = ceph_destroy_inode,
@@ -719,6 +725,7 @@ static const struct super_operations cep .drop_inode = ceph_drop_inode, .sync_fs = ceph_sync_fs, .put_super = ceph_put_super, + .remount_fs = ceph_remount, .show_options = ceph_show_options, .statfs = ceph_statfs, .umount_begin = ceph_umount_begin,
Greg Kroah-Hartman
maintainerPATCH 49/241 tracing: Fix partial reading of trace events id file
In reply to Greg Kroah-HartmanFrom: Elazar Leibovich <[email protected]>
commit cbe08bcbbe787315c425dde284dcb715cfbf3f39 upstream.
When reading only part of the id file, the ppos isn't tracked correctly. This is taken care by simple_read_from_buffer.
Reading a single byte, and then the next byte would result EOF.
While this seems like not a big deal, this breaks abstractions that reads information from files unbuffered. See for example
https://github.com/golang/go/issues/29399
This code was mentioned as problematic in commit cd458ba9d5a5
("tracing: Do not (ab)use trace_seq in event_id_read()")
An example C code that show this bug is:
#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv) {
if (argc < 2)
return 1;
int fd = open(argv[1], O_RDONLY);
char c;
read(fd, &c, 1);
printf("First %c\n", c);
read(fd, &c, 1);
printf("Second %c\n", c);
}Then run with, e.g.
sudo ./a.out /sys/kernel/debug/tracing/events/tcp/tcp_set_state/id
You'll notice you're getting the first character twice, instead of the first two characters in the id file.
--- kernel/trace/trace_events.c | 3 --- 1 file changed, 3 deletions(-)
kernel/trace/trace_events.c +0 -3
@@ -1288,9 +1288,6 @@ event_id_read(struct file *filp, char __char buf[32 ];int len; -if (*ppos) -return 0 ; -if (unlikely (!id))return -ENODEV ;
Greg Kroah-Hartman
maintainerPATCH 50/241 memory: tegra: Fix integer overflow on tick value calculation
In reply to Greg Kroah-HartmanFrom: Dmitry Osipenko <[email protected]>
commit b906c056b6023c390f18347169071193fda57dde upstream.
Multiplying the Memory Controller clock rate by the tick count results in an integer overflow and in result the truncated tick value is being programmed into hardware, such that the GR3D memory client performance is reduced by two times.
--- drivers/memory/tegra/mc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/memory/tegra/mc.c +1 -1
@@ -72,7 +72,7 @@ static int tegra_mc_setup_latency_allowau32 value;/* compute the number of MC clock cycles per tick */ - tick = mc->tick *clk_get_rate (mc->clk); + tick = (unsigned long long )mc->tick *clk_get_rate (mc->clk);do_div (tick,NSEC_PER_SEC ); value =readl (mc->regs +MC_EMEM_ARB_CFG );
Greg Kroah-Hartman
maintainerPATCH 51/241 perf intel-pt: Fix instructions sampling rate
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit 7ba8fa20e26eb3c0c04d747f7fd2223694eac4d5 upstream.
The timestamp used to determine if an instruction sample is made, is an estimate based on the number of instructions since the last known timestamp. A consequence is that it might go backwards, which results in extra samples. Change it so that a sample is only made when the timestamp goes forwards.
Note this does not affect a sampling period of 0 or sampling periods specified as a count of instructions.
Example:
Before:
$ perf script --itrace=i10us ls 13812 [003] 2167315.222583: 3270 instructions:u: 7fac71e2e494 __GI___tunables_init+0xf4 (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222667: 30902 instructions:u: 7fac71e2da0f _dl_cache_libcmp+0x2f (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222667: 10 instructions:u: 7fac71e2d9ff _dl_cache_libcmp+0x1f (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222667: 8 instructions:u: 7fac71e2d9ea _dl_cache_libcmp+0xa (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222667: 14 instructions:u: 7fac71e2d9ea _dl_cache_libcmp+0xa (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222667: 6 instructions:u: 7fac71e2d9ff _dl_cache_libcmp+0x1f (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222667: 14 instructions:u: 7fac71e2d9ff _dl_cache_libcmp+0x1f (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222667: 4 instructions:u: 7fac71e2dab2 _dl_cache_libcmp+0xd2 (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222728: 16423 instructions:u: 7fac71e2477a _dl_map_object_deps+0x1ba (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222734: 12731 instructions:u: 7fac71e27938 _dl_name_match_p+0x68 (/lib/x86_64-linux-gnu/ld-2.28.so) ...
After:
$ perf script --itrace=i10us ls 13812 [003] 2167315.222583: 3270 instructions:u: 7fac71e2e494 __GI___tunables_init+0xf4 (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222667: 30902 instructions:u: 7fac71e2da0f _dl_cache_libcmp+0x2f (/lib/x86_64-linux-gnu/ld-2.28.so) ls 13812 [003] 2167315.222728: 16479 instructions:u: 7fac71e2477a _dl_map_object_deps+0x1ba (/lib/x86_64-linux-gnu/ld-2.28.so) ...
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +10 -3
@@ -854,16 +854,20 @@ static uint64_t intel_pt_next_period(str timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; masked_timestamp = timestamp & decoder->period_mask;if (decoder->continuous_period) { -if (masked_timestamp != decoder->last_masked_timestamp) +if (masked_timestamp > decoder->last_masked_timestamp)return 1 ; }else { timestamp +=1 ; masked_timestamp = timestamp & decoder->period_mask; -if (masked_timestamp != decoder->last_masked_timestamp) { +if (masked_timestamp > decoder->last_masked_timestamp) { decoder->last_masked_timestamp = masked_timestamp; decoder->continuous_period = true; } } + +if (masked_timestamp < decoder->last_masked_timestamp) +return decoder->period_ticks; +return decoder->period_ticks - (timestamp - masked_timestamp); }
@@ -892,7 +896,10 @@ static void intel_pt_sample_insn(structcase INTEL_PT_PERIOD_TICKS : timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; masked_timestamp = timestamp & decoder->period_mask; - decoder->last_masked_timestamp = masked_timestamp; +if (masked_timestamp > decoder->last_masked_timestamp) + decoder->last_masked_timestamp = masked_timestamp; +else + decoder->last_masked_timestamp += decoder->period_ticks;break ;case INTEL_PT_PERIOD_NONE :case INTEL_PT_PERIOD_MTC :
Greg Kroah-Hartman
maintainerPATCH 52/241 perf intel-pt: Fix improved sample timestamp
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit 61b6e08dc8e3ea80b7485c9b3f875ddd45c8466b upstream.
The decoder uses its current timestamp in samples. Usually that is a timestamp that has already passed, but in some cases it is a timestamp for a branch that the decoder is walking towards, and consequently hasn't reached.
The intel_pt_sample_time() function decides which is which, but was not handling TNT packets exactly correctly.
In the case of TNT, the timestamp applies to the first branch, so the decoder must first walk to that branch.
That means intel_pt_sample_time() should return true for TNT, and this patch makes that change. However, if the first branch is a non-taken branch (i.e. a 'N'), then intel_pt_sample_time() needs to return false for subsequent taken branches in the same TNT packet.
To handle that, introduce a new state INTEL_PT_STATE_TNT_CONT to distinguish the cases.
Note that commit 3f04d98e972b5 ("perf intel-pt: Improve sample timestamp") was also a stable fix and appears, for example, in v4.4 stable tree as commit a4ebb58fd124 ("perf intel-pt: Improve sample timestamp").
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +10 -3
@@ -58,6 +58,7 @@ enum intel_pt_pkt_state {INTEL_PT_STATE_NO_IP ,INTEL_PT_STATE_ERR_RESYNC ,INTEL_PT_STATE_IN_SYNC , +INTEL_PT_STATE_TNT_CONT ,INTEL_PT_STATE_TNT ,INTEL_PT_STATE_TIP , INTEL_PT_STATE_TIP_PGD,
@@ -72,8 +73,9 @@ static inline bool intel_pt_sample_time(case INTEL_PT_STATE_NO_IP :case INTEL_PT_STATE_ERR_RESYNC :case INTEL_PT_STATE_IN_SYNC : -case INTEL_PT_STATE_TNT : +case INTEL_PT_STATE_TNT_CONT :return true; +case INTEL_PT_STATE_TNT :case INTEL_PT_STATE_TIP :case INTEL_PT_STATE_TIP_PGD :case INTEL_PT_STATE_FUP :
@@ -1148,7 +1150,9 @@ static int intel_pt_walk_tnt(struct intereturn -ENOENT ; } decoder->tnt.count -=1 ; -if (!decoder->tnt.count) +if (decoder->tnt.count) + decoder->pkt_state =INTEL_PT_STATE_TNT_CONT ; +else decoder->pkt_state =INTEL_PT_STATE_IN_SYNC ; decoder->tnt.payload <<=1 ; decoder->state.from_ip = decoder->ip;
@@ -1179,7 +1183,9 @@ static int intel_pt_walk_tnt(struct inteif (intel_pt_insn.branch ==INTEL_PT_BR_CONDITIONAL ) { decoder->tnt.count -=1 ; -if (!decoder->tnt.count) +if (decoder->tnt.count) + decoder->pkt_state =INTEL_PT_STATE_TNT_CONT ; +else decoder->pkt_state =INTEL_PT_STATE_IN_SYNC ;if (decoder->tnt.payload &BIT63 ) { decoder->tnt.payload <<=1 ;
@@ -2123,6 +2129,7 @@ const struct intel_pt_state *intel_pt_de err =intel_pt_walk_trace (decoder);break ;case INTEL_PT_STATE_TNT : +case INTEL_PT_STATE_TNT_CONT : err =intel_pt_walk_tnt (decoder);if (err == -EAGAIN ) err =intel_pt_walk_trace (decoder);
Greg Kroah-Hartman
maintainerPATCH 53/241 perf intel-pt: Fix sample timestamp wrt non-taken branches
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
commit 1b6599a9d8e6c9f7e9b0476012383b1777f7fc93 upstream.
The sample timestamp is updated to ensure that the timestamp represents the time of the sample and not a branch that the decoder is still walking towards. The sample timestamp is updated when the decoder returns, but the decoder does not return for non-taken branches. Update the sample timestamp then also.
Note that commit 3f04d98e972b5 ("perf intel-pt: Improve sample timestamp") was also a stable fix and appears, for example, in v4.4 stable tree as commit a4ebb58fd124 ("perf intel-pt: Improve sample timestamp").
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +4 -1
@@ -1205,8 +1205,11 @@ static int intel_pt_walk_tnt(struct intereturn 0 ; } decoder->ip += intel_pt_insn.length; -if (!decoder->tnt.count) +if (!decoder->tnt.count) { + decoder->sample_timestamp = decoder->timestamp; + decoder->sample_insn_cnt = decoder->timestamp_insn_cnt;return -EAGAIN ; + } decoder->tnt.payload <<=1 ;continue ; }
Greg Kroah-Hartman
maintainerPATCH 54/241 fbdev: sm712fb: fix brightness control on reboot, dont set SR30
In reply to Greg Kroah-HartmanFrom: Yifeng Li <[email protected]>
commit 5481115e25e42b9215f2619452aa99c95f08492f upstream.
On a Thinkpad s30 (Pentium III / i440MX, Lynx3DM), rebooting with sm712fb framebuffer driver would cause the role of brightness up/down button to swap.
Experiments showed the FPR30 register caused this behavior. Moreover, even if this register don't have side-effect on other systems, over- writing it is also highly questionable, since it was originally configurated by the motherboard manufacturer by hardwiring pull-down resistors to indicate the type of LCD panel. We should not mess with it.
Stop writing to the SR30 (a.k.a FPR30) register.
--- drivers/video/fbdev/sm712fb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/fbdev/sm712fb.c +2 -2
@@ -1144,8 +1144,8 @@ static void sm7xx_set_timing(struct smtc/* init SEQ register SR30 - SR75 */ for (i =0 ; i <SIZE_SR30_SR75 ; i++) -if ((i +0x30 ) !=0x62 && (i +0x30 ) !=0x6a && - (i +0x30 ) !=0x6b ) +if ((i +0x30 ) !=0x30 && (i +0x30 ) !=0x62 && + (i +0x30 ) !=0x6a && (i +0x30 ) !=0x6b )smtc_seqw (i +0x30 , vgamode[j].init_sr30_sr75[i]);
Greg Kroah-Hartman
maintainerPATCH 55/241 fbdev: sm712fb: fix VRAM detection, dont set SR70/71/74/75
In reply to Greg Kroah-HartmanFrom: Yifeng Li <[email protected]>
commit dcf9070595e100942c539e229dde4770aaeaa4e9 upstream.
On a Thinkpad s30 (Pentium III / i440MX, Lynx3DM), the amount of Video RAM is not detected correctly by the xf86-video-siliconmotion driver. This is because sm712fb overwrites the GPR71 Scratch Pad Register, which is set by BIOS on x86 and used to indicate amount of VRAM.
Other Scratch Pad Registers, including GPR70/74/75, don't have the same side-effect, but overwriting to them is still questionable, as they are not related to modesetting.
Stop writing to SR70/71/74/75 (a.k.a GPR70/71/74/75).
--- drivers/video/fbdev/sm712fb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/video/fbdev/sm712fb.c +3 -1
@@ -1145,7 +1145,9 @@ static void sm7xx_set_timing(struct smtc/* init SEQ register SR30 - SR75 */ for (i =0 ; i <SIZE_SR30_SR75 ; i++)if ((i +0x30 ) !=0x30 && (i +0x30 ) !=0x62 && - (i +0x30 ) !=0x6a && (i +0x30 ) !=0x6b ) + (i +0x30 ) !=0x6a && (i +0x30 ) !=0x6b && + (i +0x30 ) !=0x70 && (i +0x30 ) !=0x71 && + (i +0x30 ) !=0x74 && (i +0x30 ) !=0x75 )smtc_seqw (i +0x30 , vgamode[j].init_sr30_sr75[i]);
Greg Kroah-Hartman
maintainerPATCH 56/241 fbdev: sm712fb: fix white screen of death on reboot, dont set CR3B-CR3F
In reply to Greg Kroah-HartmanFrom: Yifeng Li <[email protected]>
commit 8069053880e0ee3a75fd6d7e0a30293265fe3de4 upstream.
On a Thinkpad s30 (Pentium III / i440MX, Lynx3DM), rebooting with sm712fb framebuffer driver would cause a white screen of death on the next POST, presumably the proper timings for the LCD panel was not reprogrammed properly by the BIOS.
Experiments showed a few CRTC Scratch Registers, including CRT3D, CRT3E and CRT3F may be used internally by BIOS as some flags. CRT3B is a hardware testing register, we shouldn't mess with it. CRT3C has blanking signal and line compare control, which is not needed for this driver.
Stop writing to CR3B-CR3F (a.k.a CRT3B-CRT3F) registers. Even if these registers don't have side-effect on other systems, writing to them is also highly questionable.
--- drivers/video/fbdev/sm712fb.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/video/fbdev/sm712fb.c +5 -1
@@ -1172,8 +1172,12 @@ static void sm7xx_set_timing(struct smtcsmtc_crtcw (i, vgamode[j].init_cr00_cr18[i]);/* init CRTC register CR30 - CR4D */ -for (i =0 ; i <SIZE_CR30_CR4D ; i++) +for (i =0 ; i <SIZE_CR30_CR4D ; i++) { +if ((i +0x30 ) >=0x3B && (i +0x30 ) <=0x3F ) +/* side-effect, don't write to CR3B-CR3F */ +continue ;smtc_crtcw (i +0x30 , vgamode[j].init_cr30_cr4d[i]); + }/* init CRTC register CR90 - CRA7 */ for (i =0 ; i <SIZE_CR90_CRA7 ; i++)
Greg Kroah-Hartman
maintainerPATCH 57/241 fbdev: sm712fb: fix boot screen glitch when sm712fb replaces VGA
In reply to Greg Kroah-HartmanFrom: Yifeng Li <[email protected]>
commit ec1587d5073f29820e358f3a383850d61601d981 upstream.
When the machine is booted in VGA mode, loading sm712fb would cause a glitch of random pixels shown on the screen. To prevent it from happening, we first clear the entire framebuffer, and we also need to stop calling smtcfb_setmode() during initialization, the fbdev layer will call it for us later when it's ready.
--- drivers/video/fbdev/sm712fb.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/video/fbdev/sm712fb.c +5 -1
@@ -1492,7 +1492,11 @@ static int smtcfb_pci_probe(struct pci_dif (err) goto failed; -smtcfb_setmode (sfb); +/* +* The screen would be temporarily garbled when sm712fb takes over +* vesafb or VGA text mode. Zero the framebuffer. +*/ +memset_io (sfb->lfb,0 , sfb->fb->fix.smem_len); err =register_framebuffer (info);if (err <0 )
Greg Kroah-Hartman
maintainerPATCH 58/241 fbdev: sm712fb: fix crashes during framebuffer writes by correctly mapping VRAM
In reply to Greg Kroah-HartmanFrom: Yifeng Li <[email protected]>
commit 9e0e59993df0601cddb95c4f6c61aa3d5e753c00 upstream.
On a Thinkpad s30 (Pentium III / i440MX, Lynx3DM), running fbtest or X will crash the machine instantly, because the VRAM/framebuffer is not mapped correctly.
On SM712, the framebuffer starts at the beginning of address space, but SM720's framebuffer starts at the 1 MiB offset from the beginning. However, sm712fb fails to take this into account, as a result, writing to the framebuffer will destroy all the registers and kill the system immediately. Another problem is the driver assumes 8 MiB of VRAM for SM720, but some SM720 system, such as this IBM Thinkpad, only has 4 MiB of VRAM.
Fix this problem by removing the hardcoded VRAM size, adding a function to query the amount of VRAM from register MCR76 on SM720, and adding proper framebuffer offset.
Please note that the memory map may have additional problems on Big-Endian system, which is not available for testing by myself. But I highly suspect that the original code is also broken on Big-Endian machines for SM720, so at least we are not making the problem worse. More, the driver also assumed SM710/SM712 has 4 MiB of VRAM, but it has a 2 MiB version as well, and used in earlier laptops, such as IBM Thinkpad 240X, the driver would probably crash on them. I've never seen one of those machines and cannot fix it, but I have documented these problems in the comments.
--- drivers/video/fbdev/sm712.h | 5 ---- drivers/video/fbdev/sm712fb.c | 48 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 9 deletions(-)
drivers/video/fbdev/sm712.h +0 -5
@@ -19,11 +19,6 @@#define SCREEN_Y_RES 600#define SCREEN_BPP 16 -/*Assume SM712 graphics chip has 4MB VRAM */ -#define SM712_VIDEOMEMORYSIZE 0x00400000 -/*Assume SM722 graphics chip has 8MB VRAM */ -#define SM722_VIDEOMEMORYSIZE 0x00800000 -#define dac_reg (0x3c8)#define dac_val (0x3c9)
drivers/video/fbdev/sm712fb.c +44 -4
82 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 59/241 fbdev: sm712fb: fix support for 1024x768-16 mode
In reply to Greg Kroah-HartmanFrom: Yifeng Li <[email protected]>
commit 6053d3a4793e5bde6299ac5388e76a3bf679ff65 upstream.
In order to support the 1024x600 panel on Yeeloong Loongson MIPS laptop, the original 1024x768-16 table was modified to 1024x600-16, without leaving the original. It causes problem on x86 laptop as the 1024x768-16 support was still claimed but not working.
Fix it by introducing the 1024x768-16 mode.
--- drivers/video/fbdev/sm712fb.c | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+)
drivers/video/fbdev/sm712fb.c +59 -0
@@ -530,6 +530,65 @@ static const struct modeinit vgamode[] =0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x15 ,0x03 , }, }, + { /* 1024 x 768 16Bpp 60Hz */ +1024 ,768 ,16 ,60 , +/* Init_MISC */ +0xEB , + { /* Init_SR0_SR4 */ +0x03 ,0x01 ,0x0F ,0x03 ,0x0E , + }, + { /* Init_SR10_SR24 */ +0xF3 ,0xB6 ,0xC0 ,0xDD ,0x00 ,0x0E ,0x17 ,0x2C , +0x99 ,0x02 ,0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0xC4 ,0x30 ,0x02 ,0x01 ,0x01 , + }, + { /* Init_SR30_SR75 */ +0x38 ,0x03 ,0x20 ,0x09 ,0xC0 ,0x3A ,0x3A ,0x3A , +0x3A ,0x3A ,0x3A ,0x3A ,0x00 ,0x00 ,0x03 ,0xFF , +0x00 ,0xFC ,0x00 ,0x00 ,0x20 ,0x18 ,0x00 ,0xFC , +0x20 ,0x0C ,0x44 ,0x20 ,0x00 ,0x00 ,0x00 ,0x3A , +0x06 ,0x68 ,0xA7 ,0x7F ,0x83 ,0x24 ,0xFF ,0x03 , +0x0F ,0x60 ,0x59 ,0x3A ,0x3A ,0x00 ,0x00 ,0x3A , +0x01 ,0x80 ,0x7E ,0x1A ,0x1A ,0x00 ,0x00 ,0x00 , +0x50 ,0x03 ,0x74 ,0x14 ,0x3B ,0x0D ,0x09 ,0x02 , +0x04 ,0x45 ,0x30 ,0x30 ,0x40 ,0x20 , + }, + { /* Init_SR80_SR93 */ +0xFF ,0x07 ,0x00 ,0xFF ,0xFF ,0xFF ,0xFF ,0x3A , +0xF7 ,0x00 ,0x00 ,0x00 ,0xFF ,0xFF ,0x3A ,0x3A , +0x00 ,0x00 ,0x00 ,0x00 , + }, + { /* Init_SRA0_SRAF */ +0x00 ,0xFB ,0x9F ,0x01 ,0x00 ,0xED ,0xED ,0xED , +0x7B ,0xFB ,0xFF ,0xFF ,0x97 ,0xEF ,0xBF ,0xDF , + }, + { /* Init_GR00_GR08 */ +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x40 ,0x05 ,0x0F , +0xFF , + }, + { /* Init_AR00_AR14 */ +0x00 ,0x01 ,0x02 ,0x03 ,0x04 ,0x05 ,0x06 ,0x07 , +0x08 ,0x09 ,0x0A ,0x0B ,0x0C ,0x0D ,0x0E ,0x0F , +0x41 ,0x00 ,0x0F ,0x00 ,0x00 , + }, + { /* Init_CR00_CR18 */ +0xA3 ,0x7F ,0x7F ,0x00 ,0x85 ,0x16 ,0x24 ,0xF5 , +0x00 ,0x60 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x03 ,0x09 ,0xFF ,0x80 ,0x40 ,0xFF ,0x00 ,0xE3 , +0xFF , + }, + { /* Init_CR30_CR4D */ +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x80 ,0x02 ,0x20 , +0x00 ,0x00 ,0x00 ,0x40 ,0x00 ,0xFF ,0xBF ,0xFF , +0xA3 ,0x7F ,0x00 ,0x86 ,0x15 ,0x24 ,0xFF ,0x00 , +0x01 ,0x07 ,0xE5 ,0x20 ,0x7F ,0xFF , + }, + { /* Init_CR90_CRA7 */ +0x55 ,0xD9 ,0x5D ,0xE1 ,0x86 ,0x1B ,0x8E ,0x26 , +0xDA ,0x8D ,0xDE ,0x94 ,0x00 ,0x00 ,0x18 ,0x00 , +0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x03 ,0x15 ,0x03 , + }, + }, { /* mode#5: 1024 x 768 24Bpp 60Hz */1024 ,768 ,24 ,60 , /* Init_MISC */
Greg Kroah-Hartman
maintainerPATCH 60/241 fbdev: sm712fb: use 1024x768 by default on non-MIPS, fix garbled display
In reply to Greg Kroah-HartmanFrom: Yifeng Li <[email protected]>
commit 4ed7d2ccb7684510ec5f7a8f7ef534bc6a3d55b2 upstream.
Loongson MIPS netbooks use 1024x600 LCD panels, which is the original target platform of this driver, but nearly all old x86 laptops have 1024x768. Lighting 768 panels using 600's timings would partially garble the display. Since it's not possible to distinguish them reliably, we change the default to 768, but keep 600 as-is on MIPS.
Further, earlier laptops, such as IBM Thinkpad 240X, has a 800x600 LCD panel, this driver would probably garbled those display. As we don't have one for testing, the original behavior of the driver is kept as-is, but the problem has been documented is the comments.
--- drivers/video/fbdev/sm712.h | 7 +++-- drivers/video/fbdev/sm712fb.c | 53 +++++++++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 16 deletions(-)
drivers/video/fbdev/sm712.h +4 -3
@@ -15,9 +15,10 @@#define FB_ACCEL_SMI_LYNX 88 -#define SCREEN_X_RES 1024 -#define SCREEN_Y_RES 600 -#define SCREEN_BPP 16 +#define SCREEN_X_RES 1024 +#define SCREEN_Y_RES_PC 768 +#define SCREEN_Y_RES_NETBOOK 600 +#define SCREEN_BPP 16#define dac_reg (0x3c8)#define dac_val (0x3c9)
drivers/video/fbdev/sm712fb.c +40 -13
71 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 61/241 fbdev: sm712fb: fix crashes and garbled display during DPMS modesetting
In reply to Greg Kroah-HartmanFrom: Yifeng Li <[email protected]>
commit f627caf55b8e735dcec8fa6538e9668632b55276 upstream.
On a Thinkpad s30 (Pentium III / i440MX, Lynx3DM), blanking the display or starting the X server will crash and freeze the system, or garble the display.
Experiments showed this problem can mostly be solved by adjusting the order of register writes. Also, sm712fb failed to consider the difference of clock frequency when unblanking the display, and programs the clock for SM712 to SM720.
Fix them by adjusting the order of register writes, and adding an additional check for SM720 for programming the clock frequency.
--- drivers/video/fbdev/sm712fb.c | 64 ++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 26 deletions(-)
drivers/video/fbdev/sm712fb.c +38 -26
@@ -886,67 +886,79 @@ static inline unsigned int chan_to_fieldstatic int smtc_blank (int blank_mode,struct fb_info *info) { +struct smtcfb_info *sfb = info->par; +/* clear DPMS setting */ switch (blank_mode) {case FB_BLANK_UNBLANK :/* Screen On: HSync: On, VSync : On */ + +switch (sfb->chip_id) { +case 0x710 : +case 0x712 : +smtc_seqw (0x6a ,0x16 ); +smtc_seqw (0x6b ,0x02 ); +case 0x720 : +smtc_seqw (0x6a ,0x0d ); +smtc_seqw (0x6b ,0x02 ); +break ; + } + +smtc_seqw (0x23 , (smtc_seqr (0x23 ) & (~0xc0 )));smtc_seqw (0x01 , (smtc_seqr (0x01 ) & (~0x20 ))); -smtc_seqw (0x6a ,0x16 ); -smtc_seqw (0x6b ,0x02 );smtc_seqw (0x21 , (smtc_seqr (0x21 ) &0x77 ));smtc_seqw (0x22 , (smtc_seqr (0x22 ) & (~0x30 ))); -smtc_seqw (0x23 , (smtc_seqr (0x23 ) & (~0xc0 ))); -smtc_seqw (0x24 , (smtc_seqr (0x24 ) |0x01 ));smtc_seqw (0x31 , (smtc_seqr (0x31 ) |0x03 )); +smtc_seqw (0x24 , (smtc_seqr (0x24 ) |0x01 ));break ;case FB_BLANK_NORMAL :/* Screen Off: HSync: On, VSync : On Soft blank */ +smtc_seqw (0x24 , (smtc_seqr (0x24 ) |0x01 )); +smtc_seqw (0x31 , ((smtc_seqr (0x31 ) & (~0x07 )) |0x00 )); +smtc_seqw (0x23 , (smtc_seqr (0x23 ) & (~0xc0 )));smtc_seqw (0x01 , (smtc_seqr (0x01 ) & (~0x20 ))); +smtc_seqw (0x22 , (smtc_seqr (0x22 ) & (~0x30 )));smtc_seqw (0x6a ,0x16 );smtc_seqw (0x6b ,0x02 ); -smtc_seqw (0x22 , (smtc_seqr (0x22 ) & (~0x30 ))); -smtc_seqw (0x23 , (smtc_seqr (0x23 ) & (~0xc0 ))); -smtc_seqw (0x24 , (smtc_seqr (0x24 ) |0x01 )); -smtc_seqw (0x31 , ((smtc_seqr (0x31 ) & (~0x07 )) |0x00 ));break ;case FB_BLANK_VSYNC_SUSPEND :/* Screen On: HSync: On, VSync : Off */ +smtc_seqw (0x24 , (smtc_seqr (0x24 ) & (~0x01 ))); +smtc_seqw (0x31 , ((smtc_seqr (0x31 ) & (~0x07 )) |0x00 )); +smtc_seqw (0x23 , ((smtc_seqr (0x23 ) & (~0xc0 )) |0x20 ));smtc_seqw (0x01 , (smtc_seqr (0x01 ) |0x20 )); -smtc_seqw (0x20 , (smtc_seqr (0x20 ) & (~0xB0 ))); -smtc_seqw (0x6a ,0x0c ); -smtc_seqw (0x6b ,0x02 );smtc_seqw (0x21 , (smtc_seqr (0x21 ) |0x88 )); +smtc_seqw (0x20 , (smtc_seqr (0x20 ) & (~0xB0 )));smtc_seqw (0x22 , ((smtc_seqr (0x22 ) & (~0x30 )) |0x20 )); -smtc_seqw (0x23 , ((smtc_seqr (0x23 ) & (~0xc0 )) |0x20 )); -smtc_seqw (0x24 , (smtc_seqr (0x24 ) & (~0x01 ))); -smtc_seqw (0x31 , ((smtc_seqr (0x31 ) & (~0x07 )) |0x00 ));smtc_seqw (0x34 , (smtc_seqr (0x34 ) |0x80 )); +smtc_seqw (0x6a ,0x0c ); +smtc_seqw (0x6b ,0x02 );break ;case FB_BLANK_HSYNC_SUSPEND :/* Screen On: HSync: Off, VSync : On */ +smtc_seqw (0x24 , (smtc_seqr (0x24 ) & (~0x01 ))); +smtc_seqw (0x31 , ((smtc_seqr (0x31 ) & (~0x07 )) |0x00 )); +smtc_seqw (0x23 , ((smtc_seqr (0x23 ) & (~0xc0 )) |0xD8 ));smtc_seqw (0x01 , (smtc_seqr (0x01 ) |0x20 )); -smtc_seqw (0x20 , (smtc_seqr (0x20 ) & (~0xB0 ))); -smtc_seqw (0x6a ,0x0c ); -smtc_seqw (0x6b ,0x02 );smtc_seqw (0x21 , (smtc_seqr (0x21 ) |0x88 )); +smtc_seqw (0x20 , (smtc_seqr (0x20 ) & (~0xB0 )));smtc_seqw (0x22 , ((smtc_seqr (0x22 ) & (~0x30 )) |0x10 )); -smtc_seqw (0x23 , ((smtc_seqr (0x23 ) & (~0xc0 )) |0xD8 )); -smtc_seqw (0x24 , (smtc_seqr (0x24 ) & (~0x01 ))); -smtc_seqw (0x31 , ((smtc_seqr (0x31 ) & (~0x07 )) |0x00 ));smtc_seqw (0x34 , (smtc_seqr (0x34 ) |0x80 )); +smtc_seqw (0x6a ,0x0c ); +smtc_seqw (0x6b ,0x02 );break ;case FB_BLANK_POWERDOWN :/* Screen On: HSync: Off, VSync : Off */ +smtc_seqw (0x24 , (smtc_seqr (0x24 ) & (~0x01 ))); +smtc_seqw (0x31 , ((smtc_seqr (0x31 ) & (~0x07 )) |0x00 )); +smtc_seqw (0x23 , ((smtc_seqr (0x23 ) & (~0xc0 )) |0xD8 ));smtc_seqw (0x01 , (smtc_seqr (0x01 ) |0x20 )); -smtc_seqw (0x20 , (smtc_seqr (0x20 ) & (~0xB0 ))); -smtc_seqw (0x6a ,0x0c ); -smtc_seqw (0x6b ,0x02 );smtc_seqw (0x21 , (smtc_seqr (0x21 ) |0x88 )); +smtc_seqw (0x20 , (smtc_seqr (0x20 ) & (~0xB0 )));smtc_seqw (0x22 , ((smtc_seqr (0x22 ) & (~0x30 )) |0x30 )); -smtc_seqw (0x23 , ((smtc_seqr (0x23 ) & (~0xc0 )) |0xD8 )); -smtc_seqw (0x24 , (smtc_seqr (0x24 ) & (~0x01 ))); -smtc_seqw (0x31 , ((smtc_seqr (0x31 ) & (~0x07 )) |0x00 ));smtc_seqw (0x34 , (smtc_seqr (0x34 ) |0x80 )); +smtc_seqw (0x6a ,0x0c ); +smtc_seqw (0x6b ,0x02 );break ;default :return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 62/241 PCI: Mark Atheros AR9462 to avoid bus reset
In reply to Greg Kroah-HartmanFrom: James Prestwood <[email protected]>
commit 6afb7e26978da5e86e57e540fdce65c8b04f398a upstream.
When using PCI passthrough with this device, the host machine locks up completely when starting the VM, requiring a hard reboot. Add a quirk to avoid bus resets on this device.
--- drivers/pci/quirks.c | 1 + 1 file changed, 1 insertion(+)
drivers/pci/quirks.c +1 -0
@@ -3141,6 +3141,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ADECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_ATHEROS ,0x0032 , quirk_no_bus_reset);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_ATHEROS ,0x003c , quirk_no_bus_reset);DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_ATHEROS ,0x0033 , quirk_no_bus_reset); +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_ATHEROS ,0x0034 , quirk_no_bus_reset);static void quirk_no_pm_reset (struct pci_dev *dev) {
Greg Kroah-Hartman
maintainerPATCH 63/241 dm delay: fix a crash when invalid device is specified
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit 81bc6d150ace6250503b825d9d0c10f7bbd24095 upstream.
When the target line contains an invalid device, delay_ctr() will call delay_dtr() with NULL workqueue. Attempting to destroy the NULL workqueue causes a crash.
--- drivers/md/dm-delay.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/md/dm-delay.c +2 -1
@@ -222,7 +222,8 @@ static void delay_dtr(struct dm_target * {struct delay_c *dc = ti->private; -destroy_workqueue (dc->kdelayd_wq); +if (dc->kdelayd_wq) +destroy_workqueue (dc->kdelayd_wq);dm_put_device (ti, dc->dev_read);
Greg Kroah-Hartman
maintainerPATCH 64/241 xfrm: policy: Fix out-of-bound array accesses in __xfrm_policy_unlink
In reply to Greg Kroah-Hartman[ Upstream commit b805d78d300bcf2c83d6df7da0c818b0fee41427 ]
UBSAN report this:
UBSAN: Undefined behaviour in net/xfrm/xfrm_policy.c:1289:24 index 6 is out of range for type 'unsigned int [6]' CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.4.162-514.55.6.9.x86_64+ #13 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014 0000000000000000 1466cf39b41b23c9 ffff8801f6b07a58 ffffffff81cb35f4 0000000041b58ab3 ffffffff83230f9c ffffffff81cb34e0 ffff8801f6b07a80 ffff8801f6b07a20 1466cf39b41b23c9 ffffffff851706e0 ffff8801f6b07ae8 Call Trace: <IRQ> [<ffffffff81cb35f4>] __dump_stack lib/dump_stack.c:15 [inline] <IRQ> [<ffffffff81cb35f4>] dump_stack+0x114/0x1a0 lib/dump_stack.c:51 [<ffffffff81d94225>] ubsan_epilogue+0x12/0x8f lib/ubsan.c:164 [<ffffffff81d954db>] __ubsan_handle_out_of_bounds+0x16e/0x1b2 lib/ubsan.c:382 [<ffffffff82a25acd>] __xfrm_policy_unlink+0x3dd/0x5b0 net/xfrm/xfrm_policy.c:1289 [<ffffffff82a2e572>] xfrm_policy_delete+0x52/0xb0 net/xfrm/xfrm_policy.c:1309 [<ffffffff82a3319b>] xfrm_policy_timer+0x30b/0x590 net/xfrm/xfrm_policy.c:243 [<ffffffff813d3927>] call_timer_fn+0x237/0x990 kernel/time/timer.c:1144 [<ffffffff813d8e7e>] __run_timers kernel/time/timer.c:1218 [inline] [<ffffffff813d8e7e>] run_timer_softirq+0x6ce/0xb80 kernel/time/timer.c:1401 [<ffffffff8120d6f9>] __do_softirq+0x299/0xe10 kernel/softirq.c:273 [<ffffffff8120e676>] invoke_softirq kernel/softirq.c:350 [inline] [<ffffffff8120e676>] irq_exit+0x216/0x2c0 kernel/softirq.c:391 [<ffffffff82c5edab>] exiting_irq arch/x86/include/asm/apic.h:652 [inline] [<ffffffff82c5edab>] smp_apic_timer_interrupt+0x8b/0xc0 arch/x86/kernel/apic/apic.c:926 [<ffffffff82c5c985>] apic_timer_interrupt+0xa5/0xb0 arch/x86/entry/entry_64.S:735 <EOI> [<ffffffff81188096>] ? native_safe_halt+0x6/0x10 arch/x86/include/asm/irqflags.h:52 [<ffffffff810834d7>] arch_safe_halt arch/x86/include/asm/paravirt.h:111 [inline] [<ffffffff810834d7>] default_idle+0x27/0x430 arch/x86/kernel/process.c:446 [<ffffffff81085f05>] arch_cpu_idle+0x15/0x20 arch/x86/kernel/process.c:437 [<ffffffff8132abc3>] default_idle_call+0x53/0x90 kernel/sched/idle.c:92 [<ffffffff8132b32d>] cpuidle_idle_call kernel/sched/idle.c:156 [inline] [<ffffffff8132b32d>] cpu_idle_loop kernel/sched/idle.c:251 [inline] [<ffffffff8132b32d>] cpu_startup_entry+0x60d/0x9a0 kernel/sched/idle.c:299 [<ffffffff8113e119>] start_secondary+0x3c9/0x560 arch/x86/kernel/smpboot.c:245
The issue is triggered as this:
xfrm_add_policy
-->verify_newpolicy_info //check the index provided by user with XFRM_POLICY_MAX
//In my case, the index is 0x6E6BB6, so it pass the check.
-->xfrm_policy_construct //copy the user's policy and set xfrm_policy_timer
-->xfrm_policy_insert
--> __xfrm_policy_link //use the orgin dir, in my case is 2
--> xfrm_gen_index //generate policy index, there is 0x6E6BB6then xfrm_policy_timer be fired
xfrm_policy_timer
--> xfrm_policy_id2dir //get dir from (policy index & 7), in my case is 6 --> xfrm_policy_delete
--> __xfrm_policy_unlink //access policy_count[dir], trigger out of range access
Add xfrm_policy_id2dir check in verify_newpolicy_info, make sure the computed dir is valid, to fix the issue.
--- net/xfrm/xfrm_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/xfrm/xfrm_user.c +1 -1
@@ -1340,7 +1340,7 @@ static int verify_newpolicy_info(struct ret =verify_policy_dir (p->dir);if (ret)return ret; -if (p->index && ((p->index &XFRM_POLICY_MAX ) != p->dir)) +if (p->index && (xfrm_policy_id2dir (p->index) != p->dir))return -EINVAL ;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 65/241 xfrm6_tunnel: Fix potential panic when unloading xfrm6_tunnel module
In reply to Greg Kroah-Hartman[ Upstream commit 6ee02a54ef990a71bf542b6f0a4e3321de9d9c66 ]
When unloading xfrm6_tunnel module, xfrm6_tunnel_fini directly frees the xfrm6_tunnel_spi_kmem. Maybe someone has gotten the xfrm6_tunnel_spi, so need to wait it.
--- net/ipv6/xfrm6_tunnel.c | 4 ++++ 1 file changed, 4 insertions(+)
net/ipv6/xfrm6_tunnel.c +4 -0
@@ -391,6 +391,10 @@ static void __exit xfrm6_tunnel_fini(voixfrm6_tunnel_deregister (&xfrm6_tunnel_handler,AF_INET6 );xfrm_unregister_type (&xfrm6_tunnel_type,AF_INET6 );unregister_pernet_subsys (&xfrm6_tunnel_net_ops); +/* Someone maybe has gotten the xfrm6_tunnel_spi. +* So need to wait it. +*/ +rcu_barrier ();kmem_cache_destroy (xfrm6_tunnel_spi_kmem); }
Greg Kroah-Hartman
maintainerPATCH 66/241 vti4: ipip tunnel deregistration fixes.
In reply to Greg Kroah-Hartman[ Upstream commit 5483844c3fc18474de29f5d6733003526e0a9f78 ]
If tunnel registration failed during module initialization, the module would fail to deregister the IPPROTO_COMP protocol and would attempt to deregister the tunnel.
The tunnel was not deregistered during module-exit.
--- net/ipv4/ip_vti.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/ipv4/ip_vti.c +3 -2
@@ -648,9 +648,9 @@ static int __init vti_init(void)return err; rtnl_link_failed: -xfrm4_protocol_deregister (&vti_ipcomp4_protocol,IPPROTO_COMP ); -xfrm_tunnel_failed:xfrm4_tunnel_deregister (&ipip_handler,AF_INET ); +xfrm_tunnel_failed: +xfrm4_protocol_deregister (&vti_ipcomp4_protocol,IPPROTO_COMP ); xfrm_proto_comp_failed:xfrm4_protocol_deregister (&vti_ah4_protocol,IPPROTO_AH ); xfrm_proto_ah_failed:
@@ -666,6 +666,7 @@ pernet_dev_failed: static void __exit vti_fini(void) {rtnl_link_unregister (&vti_link_ops); +xfrm4_tunnel_deregister (&ipip_handler,AF_INET );xfrm4_protocol_deregister (&vti_ipcomp4_protocol,IPPROTO_COMP );xfrm4_protocol_deregister (&vti_ah4_protocol,IPPROTO_AH );xfrm4_protocol_deregister (&vti_esp4_protocol,IPPROTO_ESP );
Greg Kroah-Hartman
maintainerPATCH 67/241 xfrm4: Fix uninitialized memory read in _decode_session4
In reply to Greg Kroah-Hartman[ Upstream commit 8742dc86d0c7a9628117a989c11f04a9b6b898f3 ]
We currently don't reload pointers pointing into skb header after doing pskb_may_pull() in _decode_session4(). So in case pskb_may_pull() changed the pointers, we read from random memory. Fix this by putting all the needed infos on the stack, so that we don't need to access the header pointers after doing pskb_may_pull().
--- net/ipv4/xfrm4_policy.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)
net/ipv4/xfrm4_policy.c +13 -11
@@ -108,7 +108,8 @@ static void _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) { const struct iphdr *iph = ip_hdr(skb); -u8 *xprth =skb_network_header (skb) + iph->ihl *4 ; +int ihl = iph->ihl; +u8 *xprth =skb_network_header (skb) + ihl *4 ;struct flowi4 *fl4 = &fl->u.ip4;int oif =0 ;
@@ -119,6 +120,11 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) fl4->flowi4_mark = skb->mark; fl4->flowi4_oif = reverse ? skb->skb_iif : oif; + fl4->flowi4_proto = iph->protocol; + fl4->daddr = reverse ? iph->saddr : iph->daddr; + fl4->saddr = reverse ? iph->daddr : iph->saddr; + fl4->flowi4_tos = iph->tos; +if (!ip_is_fragment (iph)) {switch (iph->protocol) {case IPPROTO_UDP :
@@ -130,7 +136,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 4 - skb->data)) {__be16 *ports; - xprth =skb_network_header (skb) + iph->ihl *4 ; + xprth =skb_network_header (skb) + ihl *4 ; ports = (__be16 *)xprth; fl4->fl4_sport = ports[!!reverse];
@@ -143,7 +149,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 2 - skb->data)) {u8 *icmp; - xprth =skb_network_header (skb) + iph->ihl *4 ; + xprth =skb_network_header (skb) + ihl *4 ; icmp = xprth; fl4->fl4_icmp_type = icmp[0 ];
@@ -156,7 +162,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 4 - skb->data)) {__be32 *ehdr; - xprth =skb_network_header (skb) + iph->ihl *4 ; + xprth =skb_network_header (skb) + ihl *4 ; ehdr = (__be32 *)xprth; fl4->fl4_ipsec_spi = ehdr[0 ];
@@ -168,7 +174,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 8 - skb->data)) {__be32 *ah_hdr; - xprth =skb_network_header (skb) + iph->ihl *4 ; + xprth =skb_network_header (skb) + ihl *4 ; ah_hdr = (__be32 *)xprth; fl4->fl4_ipsec_spi = ah_hdr[1 ];
@@ -180,7 +186,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) pskb_may_pull(skb, xprth + 4 - skb->data)) {__be16 *ipcomp_hdr; - xprth =skb_network_header (skb) + iph->ihl *4 ; + xprth =skb_network_header (skb) + ihl *4 ; ipcomp_hdr = (__be16 *)xprth; fl4->fl4_ipsec_spi =htonl (ntohs (ipcomp_hdr[1 ]));
@@ -193,7 +199,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)__be16 *greflags;__be32 *gre_hdr; - xprth =skb_network_header (skb) + iph->ihl *4 ; + xprth =skb_network_header (skb) + ihl *4 ; greflags = (__be16 *)xprth; gre_hdr = (__be32 *)xprth;
@@ -210,10 +216,6 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)break ; } } - fl4->flowi4_proto = iph->protocol; - fl4->daddr = reverse ? iph->saddr : iph->daddr; - fl4->saddr = reverse ? iph->daddr : iph->saddr; - fl4->flowi4_tos = iph->tos; }static inline int xfrm4_garbage_collect (struct dst_ops *ops)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 68/241 KVM: arm/arm64: Ensure vcpu target is unset on reset failure
In reply to Greg Kroah-Hartman[ Upstream commit 811328fc3222f7b55846de0cd0404339e2e1e6d7 ]
A failed KVM_ARM_VCPU_INIT should not set the vcpu target, as the vcpu target is used by kvm_vcpu_initialized() to determine if other vcpu ioctls may proceed. We need to set the target before calling kvm_reset_vcpu(), but if that call fails, we should then unset it and clear the feature bitmap while we're at it.
--- arch/arm/kvm/arm.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
arch/arm/kvm/arm.c +8 -3
@@ -744,7 +744,7 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvstatic int kvm_vcpu_set_target (struct kvm_vcpu *vcpu,const struct kvm_vcpu_init *init) { -unsigned int i; +unsigned int i, ret;int phys_target =kvm_target_cpu ();if (init->target != phys_target)
@@ -779,9 +779,14 @@ static int kvm_vcpu_set_target(struct kv vcpu->arch.target = phys_target;/* Now we know what it is, we can reset it. */ -return kvm_reset_vcpu (vcpu); -} + ret =kvm_reset_vcpu (vcpu); +if (ret) { + vcpu->arch.target =-1 ; +bitmap_zero (vcpu->arch.features,KVM_VCPU_MAX_FEATURES ); + } +return ret; +}static int kvm_arch_vcpu_ioctl_vcpu_init (struct kvm_vcpu *vcpu,struct kvm_vcpu_init *init)
Greg Kroah-Hartman
maintainerPATCH 69/241 power: supply: sysfs: prevent endless uevent loop with CONFIG_POWER_SUPPLY_DEBUG
In reply to Greg Kroah-Hartman[ Upstream commit 349ced9984ff540ce74ca8a0b2e9b03dc434b9dd ]
Fix a similar endless event loop as was done in commit 8dcf32175b4e ("i2c: prevent endless uevent loop with CONFIG_I2C_DEBUG_CORE"):
The culprit is the dev_dbg printk in the i2c uevent handler. If this is activated (for instance by CONFIG_I2C_DEBUG_CORE) it results in an endless loop with systemd-journald.
This happens if user-space scans the system log and reads the uevent file to get information about a newly created device, which seems fair use to me. Unfortunately reading the "uevent" file uses the same function that runs for creating the uevent for a new device, generating the next syslog entry
Both CONFIG_I2C_DEBUG_CORE and CONFIG_POWER_SUPPLY_DEBUG were reported in https://bugs.freedesktop.org/show_bug.cgi?id=76886 but only former seems to have been fixed. Drop debug prints as it was done in I2C subsystem to resolve the issue.
--- drivers/power/power_supply_sysfs.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/power/power_supply_sysfs.c +0 -6
@@ -277,15 +277,11 @@ int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env)char *prop_buf;char *attrname; -dev_dbg (dev,"uevent\n" ); -if (!psy || !psy->desc) {dev_dbg (dev,"No power supply yet\n" );return ret; } -dev_dbg (dev,"POWER_SUPPLY_NAME=%s\n" , psy->desc->name); - ret =add_uevent_var (env,"POWER_SUPPLY_NAME=%s" , psy->desc->name);if (ret)return ret;
@@ -321,8 +317,6 @@ int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env) goto out; } -dev_dbg (dev,"prop %s=%s\n" , attrname, prop_buf); - ret =add_uevent_var (env,"POWER_SUPPLY_%s=%s" , attrname, prop_buf);kfree (attrname);if (ret)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 70/241 ufs: fix braino in ufs_get_inode_gid() for solaris UFS flavour
In reply to Greg Kroah-Hartman[ Upstream commit 4e9036042fedaffcd868d7f7aa948756c48c637d ]
To choose whether to pick the GID from the old (16bit) or new (32bit) field, we should check if the old gid field is set to 0xffff. Mainline checks the old *UID* field instead - cut'n'paste from the corresponding code in ufs_get_inode_uid().
--- fs/ufs/util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ufs/util.h +1 -1
@@ -228,7 +228,7 @@ ufs_get_inode_gid(struct super_block *sb, struct ufs_inode *inode)case UFS_UID_44BSD :return fs32_to_cpu (sb, inode->ui_u3.ui_44.ui_gid);case UFS_UID_EFT : -if (inode->ui_u1.oldids.ui_suid ==0xFFFF ) +if (inode->ui_u1.oldids.ui_sgid ==0xFFFF )return fs32_to_cpu (sb, inode->ui_u3.ui_sun.ui_gid);/* Fall through */ default :
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 71/241 perf bench numa: Add define for RUSAGE_THREAD if not present
In reply to Greg Kroah-Hartman[ Upstream commit bf561d3c13423fc54daa19b5d49dc15fafdb7acc ]
While cross building perf to the ARC architecture on a fedora 30 host, we were failing with:
CC /tmp/build/perf/bench/numa.o
bench/numa.c: In function ?worker_thread?:
bench/numa.c:1261:12: error: ?RUSAGE_THREAD? undeclared (first use in this function); did you mean ?SIGEV_THREAD??
getrusage(RUSAGE_THREAD, &rusage);
^~~~~~~~~~~~~
SIGEV_THREAD bench/numa.c:1261:12: note: each undeclared identifier is reported only once for each function it appears in
[perfbuilder at 60d5802468f6 perf]$ /arc_gnu_2019.03-rc1_prebuilt_uclibc_le_archs_linux_install/bin/arc-linux-gcc --version | head -1 arc-linux-gcc (ARCv2 ISA Linux uClibc toolchain 2019.03-rc1) 8.3.1 20190225
[perfbuilder at 60d5802468f6 perf]$
Trying to reproduce a report by Vineet, I noticed that, with just cross-built zlib and numactl libraries, I ended up with the above failure.
So, since RUSAGE_THREAD is available as a define, check for that and numactl libraries, I ended up with the above failure.
So, since RUSAGE_THREAD is available as a define in the system headers, check if it is defined in the 'perf bench numa' sources and define it if not.
Now it builds and I have to figure out if the problem reported by Vineet only takes place if we have libelf or some other library available.
--- tools/perf/bench/numa.c | 4 ++++ 1 file changed, 4 insertions(+)
tools/perf/bench/numa.c +4 -0
@@ -32,6 +32,10 @@#include <numa.h> #include <numaif.h> +#ifndef RUSAGE_THREAD +# define RUSAGE_THREAD 1 +#endif +/* * Regular printout to the terminal, supressed if -q is specified: */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 72/241 Revert "Dont jump to compute_result state from check_result state"
In reply to Greg Kroah-HartmanFrom: Song Liu <[email protected]>
commit a25d8c327bb41742dbd59f8c545f59f3b9c39983 upstream.
This reverts commit 4f4fd7c5798bbdd5a03a60f6269cf1177fbd11ef.
--- drivers/md/raid5.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)
drivers/md/raid5.c +15 -4
@@ -3897,15 +3897,26 @@ static void handle_parity_checks6(structcase check_state_check_result: sh->check_state = check_state_idle; -if (s->failed >1 ) -break ;/* handle a successful check operation, if parity is correct * we are done. Otherwise update the mismatch count and repair * parity if !MD_RECOVERY_CHECK */ if (sh->ops.zero_sum_result ==0 ) { -/* Any parity checked was correct */ -set_bit (STRIPE_INSYNC , &sh->state); +/* both parities are correct */ +if (!s->failed) +set_bit (STRIPE_INSYNC , &sh->state); +else { +/* in contrast to the raid5 case we can validate +* parity, but still have a failure to write +* back +*/ + sh->check_state = check_state_compute_result; +/* Returning at this point means that we may go +* off and bring p and/or q uptodate again so +* we make sure to check zero_sum_result again +* to verify if p or q need writeback +*/ + } }else {atomic64_add (STRIPE_SECTORS , &conf->mddev->resync_mismatches);if (test_bit (MD_RECOVERY_CHECK , &conf->mddev->recovery))
Greg Kroah-Hartman
maintainerPATCH 73/241 md/raid: raid5 preserve the writeback action after the parity check
In reply to Greg Kroah-HartmanFrom: Nigel Croxon <[email protected]>
commit b2176a1dfb518d870ee073445d27055fea64dfb8 upstream.
The problem is that any 'uptodate' vs 'disks' check is not precise in this path. Put a "WARN_ON(!test_bit(R5_UPTODATE, &dev->flags)" on the device that might try to kick off writes and then skip the action. Better to prevent the raid driver from taking unexpected action *and* keep the system alive vs killing the machine with BUG_ON.
Note: fixed warning reported by kbuild test robot <[email protected]>
--- drivers/md/raid5.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/md/raid5.c +9 -1
@@ -3861,7 +3861,7 @@ static void handle_parity_checks6(struct/* now write out any block on a failed drive, * or P or Q if they were recomputed */ -BUG_ON (s->uptodate < disks -1 );/* We don't need Q to recover */ + dev =NULL ;if (s->failed ==2 ) { dev = &sh->dev[s->failed_num[1 ]]; s->locked++;
@@ -3886,6 +3886,14 @@ static void handle_parity_checks6(structset_bit (R5_LOCKED , &dev->flags);set_bit (R5_Wantwrite, &dev->flags); } +if (WARN_ONCE (dev && !test_bit (R5_UPTODATE , &dev->flags), +"%s: disk%td not up to date\n" , +mdname (conf->mddev), + dev - (struct r5dev *) &sh->dev)) { +clear_bit (R5_LOCKED , &dev->flags); +clear_bit (R5_Wantwrite, &dev->flags); + s->locked--; + }clear_bit (STRIPE_DEGRADED , &sh->state);set_bit (STRIPE_INSYNC , &sh->state);
Greg Kroah-Hartman
maintainerPATCH 74/241 btrfs: Honour FITRIM range constraints during free space trim
In reply to Greg Kroah-HartmanFrom: Nikolay Borisov <[email protected]>
commit c2d1b3aae33605a61cbab445d8ae1c708ccd2698 upstream.
Up until now trimming the freespace was done irrespective of what the arguments of the FITRIM ioctl were. For example fstrim's -o/-l arguments will be entirely ignored. Fix it by correctly handling those paramter. This requires breaking if the found freespace extent is after the end of the passed range as well as completing trim after trimming fstrim_range::len bytes.
--- fs/btrfs/extent-tree.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-)
fs/btrfs/extent-tree.c +19 -6
@@ -10730,9 +10730,9 @@ int btrfs_error_unpin_extent_range(struc* transaction. */ static int btrfs_trim_free_extents (struct btrfs_device *device, -u64 minlen,u64 *trimmed) +struct fstrim_range *range,u64 *trimmed) { -u64 start =0 , len =0 ; +u64 start = range->start, len =0 ;int ret; *trimmed =0 ;
@@ -10768,8 +10768,8 @@ static int btrfs_trim_free_extents(strucatomic_inc (&trans->use_count);spin_unlock (&fs_info->trans_lock); - ret =find_free_dev_extent_start (trans, device, minlen, start, - &start, &len); + ret =find_free_dev_extent_start (trans, device, range->minlen, + start, &start, &len);if (trans)btrfs_put_transaction (trans);
@@ -10781,6 +10781,16 @@ static int btrfs_trim_free_extents(strucbreak ; } +/* If we are out of the passed range break */ +if (start > range->start + range->len -1 ) { +mutex_unlock (&fs_info->chunk_mutex); + ret =0 ; +break ; + } + + start =max (range->start, start); + len =min (range->len, len); + ret =btrfs_issue_discard (device->bdev, start, len, &bytes);up_read (&fs_info->commit_root_sem);mutex_unlock (&fs_info->chunk_mutex);
@@ -10791,6 +10801,10 @@ static int btrfs_trim_free_extents(struc start += len; *trimmed += bytes; +/* We've trimmed enough */ +if (*trimmed >= range->len) +break ; +if (fatal_signal_pending (current)) { ret = -ERESTARTSYS ;break ;
@@ -10857,8 +10871,7 @@ int btrfs_trim_fs(struct btrfs_root *roomutex_lock (&root->fs_info->fs_devices->device_list_mutex); devices = &root->fs_info->fs_devices->devices;list_for_each_entry (device, devices, dev_list) { - ret =btrfs_trim_free_extents (device, range->minlen, - &group_trimmed); + ret =btrfs_trim_free_extents (device, range, &group_trimmed);if (ret)break ;
Greg Kroah-Hartman
maintainerPATCH 75/241 fbdev: sm712fb: fix memory frequency by avoiding a switch/case fallthrough
In reply to Greg Kroah-HartmanFrom: Yifeng Li <[email protected]>
commit 9dc20113988b9a75ea6b3abd68dc45e2d73ccdab upstream.
A fallthrough in switch/case was introduced in f627caf55b8e ("fbdev:
sm712fb: fix crashes and garbled display during DPMS modesetting"), due to my copy-paste error, which would cause the memory clock frequency for SM720 to be programmed to SM712.
Since it only reprograms the clock to a different frequency, it's only a benign issue without visible side-effect, so it also evaded Sudip Mukherjee's code review and regression tests. scripts/checkpatch.pl also failed to discover the issue, possibly due to nested switch statements.
This issue was found by Stephen Rothwell by building linux-next with -Wimplicit-fallthrough.
--- drivers/video/fbdev/sm712fb.c | 1 + 1 file changed, 1 insertion(+)
drivers/video/fbdev/sm712fb.c +1 -0
@@ -898,6 +898,7 @@ static int smtc_blank(int blank_mode, stcase 0x712 :smtc_seqw (0x6a ,0x16 );smtc_seqw (0x6b ,0x02 ); +break ;case 0x720 :smtc_seqw (0x6a ,0x0d );smtc_seqw (0x6b ,0x02 );
Greg Kroah-Hartman
maintainerPATCH 76/241 ext4: do not delete unlinked inode from orphan list on failed truncate
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
commit ee0ed02ca93ef1ecf8963ad96638795d55af2c14 upstream.
It is possible that unlinked inode enters ext4_setattr() (e.g. if somebody calls ftruncate(2) on unlinked but still open file). In such case we should not delete the inode from the orphan list if truncate fails. Note that this is mostly a theoretical concern as filesystem is corrupted if we reach this path anyway but let's be consistent in our orphan handling.
--- fs/ext4/inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/inode.c +1 -1
@@ -4944,7 +4944,7 @@ int ext4_setattr(struct dentry *dentry,up_write (&EXT4_I (inode)->i_data_sem);ext4_journal_stop (handle);if (error) { -if (orphan) +if (orphan && inode->i_nlink)ext4_orphan_del (NULL , inode); goto err_out; }
Greg Kroah-Hartman
maintainerPATCH 77/241 KVM: x86: fix return value for reserved EFER
In reply to Greg Kroah-HartmanFrom: Paolo Bonzini <[email protected]>
commit 66f61c92889ff3ca365161fb29dd36d6354682ba upstream.
Commit 11988499e62b ("KVM: x86: Skip EFER vs. guest CPUID checks for host-initiated writes", 2019-04-02) introduced a "return false" in a function returning int, and anyway set_efer has a "nonzero on error" conventon so it should be returning 1.
--- arch/x86/kvm/x86.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/x86.c +1 -1
@@ -1026,7 +1026,7 @@ static int set_efer(struct kvm_vcpu *vcpu64 efer = msr_info->data;if (efer & efer_reserved_bits) -return false; +return 1 ;if (!msr_info->host_initiated) {if (!__kvm_valid_efer (vcpu, efer))
Greg Kroah-Hartman
maintainerPATCH 78/241 bio: fix improper use of smp_mb__before_atomic()
In reply to Greg Kroah-HartmanFrom: Andrea Parri <[email protected]>
commit f381c6a4bd0ae0fde2d6340f1b9bb0f58d915de6 upstream.
This barrier only applies to the read-modify-write operations; in particular, it does not apply to the atomic_set() primitive.
Replace the barrier with an smp_mb().
--- include/linux/bio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/bio.h +1 -1
@@ -290,7 +290,7 @@ static inline void bio_cnt_set(struct bi {if (count !=1 ) { bio->bi_flags |= (1 <<BIO_REFFED ); -smp_mb__before_atomic (); +smp_mb (); }atomic_set (&bio->__bi_cnt, count); }
Greg Kroah-Hartman
maintainerPATCH 79/241 Revert "scsi: sd: Keep disk read-only when re-reading partition"
In reply to Greg Kroah-HartmanFrom: Martin K. Petersen <[email protected]>
commit 8acf608e602f6ec38b7cc37b04c80f1ce9a1a6cc upstream.
This reverts commit 20bd1d026aacc5399464f8328f305985c493cde3.
This patch introduced regressions for devices that come online in read-only state and subsequently switch to read-write.
Given how the partition code is currently implemented it is not possible to persist the read-only flag across a device revalidate call. This may need to get addressed in the future since it is common for user applications to proactively call BLKRRPART.
Reverting this commit will re-introduce a regression where a device-initiated revalidate event will cause the admin state to be forgotten. A separate patch will address this issue.
--- drivers/scsi/sd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/sd.c +1 -2
@@ -2396,7 +2396,6 @@ sd_read_write_protect_flag(struct scsi_dint res;struct scsi_device *sdp = sdkp->device;struct scsi_mode_data data; -int disk_ro =get_disk_ro (sdkp->disk);int old_wp = sdkp->write_prot;set_disk_ro (sdkp->disk,0 );
@@ -2437,7 +2436,7 @@ sd_read_write_protect_flag(struct scsi_d "Test WP failed, assume Write Enabled\n"); }else { sdkp->write_prot = ((data.device_specific &0x80 ) !=0 ); -set_disk_ro (sdkp->disk, sdkp->write_prot || disk_ro); +set_disk_ro (sdkp->disk, sdkp->write_prot);if (sdkp->first_scan || old_wp != sdkp->write_prot) {sd_printk (KERN_NOTICE , sdkp,"Write Protect is %s\n" , sdkp->write_prot ?"on" :"off" );
Greg Kroah-Hartman
maintainerPATCH 80/241 crypto: vmx - CTR: always increment IV as quadword
In reply to Greg Kroah-HartmanFrom: Daniel Axtens <[email protected]>
commit 009b30ac7444c17fae34c4f435ebce8e8e2b3250 upstream.
The kernel self-tests picked up an issue with CTR mode:
alg: skcipher: p8_aes_ctr encryption test failed (wrong result) on test vector 3, cfg="uneven misaligned splits, may sleep"
Test vector 3 has an IV of FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD, so after 3 increments it should wrap around to 0.
In the aesp8-ppc code from OpenSSL, there are two paths that increment IVs: the bulk (8 at a time) path, and the individual path which is used when there are fewer than 8 AES blocks to process.
In the bulk path, the IV is incremented with vadduqm: "Vector Add Unsigned Quadword Modulo", which does 128-bit addition.
In the individual path, however, the IV is incremented with
vadduwm: "Vector Add Unsigned Word Modulo", which instead does 4 32-bit additions. Thus the IV would instead become FFFFFFFFFFFFFFFFFFFFFFFF00000000, throwing off the result.
Use vadduqm.
This was probably a typo originally, what with q and w being adjacent. It is a pretty narrow edge case: I am really impressed by the quality of the kernel self-tests!
--- drivers/crypto/vmx/aesp8-ppc.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/vmx/aesp8-ppc.pl +1 -1
@@ -1298,7 +1298,7 @@ Loop_ctr32_enc: addi $idx,$idx,16 bdnz Loop_ctr32_enc - vadduwm $ivec,$ivec,$one + vadduqm $ivec,$ivec,$one vmr $dat,$inptail lvx $inptail,0,$inp addi $inp,$inp,16
Greg Kroah-Hartman
maintainerPATCH 81/241 gfs2: Fix sign extension bug in gfs2_update_stats
In reply to Greg Kroah-HartmanFrom: Andreas Gruenbacher <[email protected]>
commit 5a5ec83d6ac974b12085cd99b196795f14079037 upstream.
Commit 4d207133e9c3 changed the types of the statistic values in struct gfs2_lkstats from s64 to u64. Because of that, what should be a signed value in gfs2_update_stats turned into an unsigned value. When shifted right, we end up with a large positive value instead of a small negative value, which results in an incorrect variance estimate.
--- fs/gfs2/lock_dlm.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
fs/gfs2/lock_dlm.c +5 -4
@@ -32,9 +32,10 @@ extern struct workqueue_struct *gfs2_con* @delta is the difference between the current rtt sample and the * running average srtt. We add 1/8 of that to the srtt in order to * update the current srtt estimate. The variance estimate is a bit -* more complicated. We subtract the abs value of the @delta from -* the current variance estimate and add 1/4 of that to the running -* total. +* more complicated. We subtract the current variance estimate from +* the abs value of the @delta and add 1/4 of that to the running +* total. That's equivalent to 3/4 of the current variance +* estimate plus 1/4 of the abs of @delta. * * Note that the index points at the array entry containing the smoothed * mean value, and the variance is always in the following entry
@@ -50,7 +51,7 @@ static inline void gfs2_update_stats(strs64 delta = sample - s->stats[index]; s->stats[index] += (delta >>3 ); index++; - s->stats[index] += ((abs (delta) - s->stats[index]) >>2 ); + s->stats[index] += (s64)(abs (delta) - s->stats[index]) >>2 ; }/**
Greg Kroah-Hartman
maintainerPATCH 82/241 Btrfs: fix race between ranged fsync and writeback of adjacent ranges
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
commit 0c713cbab6200b0ab6473b50435e450a6e1de85d upstream.
When we do a full fsync (the bit BTRFS_INODE_NEEDS_FULL_SYNC is set in the inode) that happens to be ranged, which happens during a msync() or writes for files opened with O_SYNC for example, we can end up with a corrupt log, due to different file extent items representing ranges that overlap with each other, or hit some assertion failures.
When doing a ranged fsync we only flush delalloc and wait for ordered exents within that range. If while we are logging items from our inode ordered extents for adjacent ranges complete, we end up in a race that can make us insert the file extent items that overlap with others we logged previously and the assertion failures.
For example, if tree-log.c:copy_items() receives a leaf that has the following file extents items, all with a length of 4K and therefore there is an implicit hole in the range 68K to 72K - 1:
(257 EXTENT_ITEM 64K), (257 EXTENT_ITEM 72K), (257 EXTENT_ITEM 76K), ...
It copies them to the log tree. However due to the need to detect implicit holes, it may release the path, in order to look at the previous leaf to detect an implicit hole, and then later it will search again in the tree for the first file extent item key, with the goal of locking again the leaf (which might have changed due to concurrent changes to other inodes).
However when it locks again the leaf containing the first key, the key corresponding to the extent at offset 72K may not be there anymore since there is an ordered extent for that range that is finishing (that is, somewhere in the middle of btrfs_finish_ordered_io()), and it just removed the file extent item but has not yet replaced it with a new file extent item, so the part of copy_items() that does hole detection will decide that there is a hole in the range starting from 68K to 76K - 1, and therefore insert a file extent item to represent that hole, having a key offset of 68K. After that we now have a log tree with 2 different extent items that have overlapping ranges:
1) The file extent item copied before copy_items() released the path, which has a key offset of 72K and a length of 4K, representing the file range 72K to 76K - 1.
2) And a file extent item representing a hole that has a key offset of 68K and a length of 8K, representing the range 68K to 76K - 1. This item was inserted after releasing the path, and overlaps with the extent item inserted before.
The overlapping extent items can cause all sorts of unpredictable and incorrect behaviour, either when replayed or if a fast (non full) fsync happens later, which can trigger a BUG_ON() when calling btrfs_set_item_key_safe() through __btrfs_drop_extents(), producing a trace like the following:
[61666.783269] ------------[ cut here ]------------ [61666.783943] kernel BUG at fs/btrfs/ctree.c:3182! [61666.784644] invalid opcode: 0000 [#1] PREEMPT SMP (...) [61666.786253] task: ffff880117b88c40 task.stack: ffffc90008168000 [61666.786253] RIP: 0010:btrfs_set_item_key_safe+0x7c/0xd2 [btrfs] [61666.786253] RSP: 0018:ffffc9000816b958 EFLAGS: 00010246 [61666.786253] RAX: 0000000000000000 RBX: 000000000000000f RCX: 0000000000030000 [61666.786253] RDX: 0000000000000000 RSI: ffffc9000816ba4f RDI: ffffc9000816b937 [61666.786253] RBP: ffffc9000816b998 R08: ffff88011dae2428 R09: 0000000000001000 [61666.786253] R10: 0000160000000000 R11: 6db6db6db6db6db7 R12: ffff88011dae2418 [61666.786253] R13: ffffc9000816ba4f R14: ffff8801e10c4118 R15: ffff8801e715c000 [61666.786253] FS: 00007f6060a18700(0000) GS:ffff88023f5c0000(0000) knlGS:0000000000000000 [61666.786253] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [61666.786253] CR2: 00007f6060a28000 CR3: 0000000213e69000 CR4: 00000000000006e0 [61666.786253] Call Trace: [61666.786253] __btrfs_drop_extents+0x5e3/0xaad [btrfs] [61666.786253] ? time_hardirqs_on+0x9/0x14 [61666.786253] btrfs_log_changed_extents+0x294/0x4e0 [btrfs] [61666.786253] ? release_extent_buffer+0x38/0xb4 [btrfs] [61666.786253] btrfs_log_inode+0xb6e/0xcdc [btrfs] [61666.786253] ? lock_acquire+0x131/0x1c5 [61666.786253] ? btrfs_log_inode_parent+0xee/0x659 [btrfs] [61666.786253] ? arch_local_irq_save+0x9/0xc [61666.786253] ? btrfs_log_inode_parent+0x1f5/0x659 [btrfs] [61666.786253] btrfs_log_inode_parent+0x223/0x659 [btrfs] [61666.786253] ? arch_local_irq_save+0x9/0xc [61666.786253] ? lockref_get_not_zero+0x2c/0x34 [61666.786253] ? rcu_read_unlock+0x3e/0x5d [61666.786253] btrfs_log_dentry_safe+0x60/0x7b [btrfs] [61666.786253] btrfs_sync_file+0x317/0x42c [btrfs] [61666.786253] vfs_fsync_range+0x8c/0x9e [61666.786253] SyS_msync+0x13c/0x1c9 [61666.786253] entry_SYSCALL_64_fastpath+0x18/0xad
A sample of a corrupt log tree leaf with overlapping extents I got from running btrfs/072:
item 14 key (295 108 200704) itemoff 2599 itemsize 53
extent data disk bytenr 0 nr 0
extent data offset 0 nr 458752 ram 458752
item 15 key (295 108 659456) itemoff 2546 itemsize 53
extent data disk bytenr 4343541760 nr 770048
extent data offset 606208 nr 163840 ram 770048
item 16 key (295 108 663552) itemoff 2493 itemsize 53
extent data disk bytenr 4343541760 nr 770048
extent data offset 610304 nr 155648 ram 770048
item 17 key (295 108 819200) itemoff 2440 itemsize 53
extent data disk bytenr 4334788608 nr 4096
extent data offset 0 nr 4096 ram 4096The file extent item at offset 659456 (item 15) ends at offset 823296 (659456 + 163840) while the next file extent item (item 16) starts at offset 663552.
Another different problem that the race can trigger is a failure in the assertions at tree-log.c:copy_items(), which expect that the first file extent item key we found before releasing the path exists after we have released path and that the last key we found before releasing the path also exists after releasing the path:
$ cat -n fs/btrfs/tree-log.c
4080 if (need_find_last_extent) {
4081 /* btrfs_prev_leaf could return 1 without releasing the path */
4082 btrfs_release_path(src_path);
4083 ret = btrfs_search_slot(NULL, inode->root, &first_key,
4084 src_path, 0, 0);
4085 if (ret < 0)
4086 return ret;
4087 ASSERT(ret == 0);
(...)
4103 if (i >= btrfs_header_nritems(src_path->nodes[0])) {
4104 ret = btrfs_next_leaf(inode->root, src_path);
4105 if (ret < 0)
4106 return ret;
4107 ASSERT(ret == 0);
4108 src = src_path->nodes[0];
4109 i = 0;
4110 need_find_last_extent = true;
4111 }
(...)The second assertion implicitly expects that the last key before the path release still exists, because the surrounding while loop only stops after we have found that key. When this assertion fails it produces a stack like this:
[139590.037075] assertion failed: ret == 0, file: fs/btrfs/tree-log.c, line: 4107 [139590.037406] ------------[ cut here ]------------ [139590.037707] kernel BUG at fs/btrfs/ctree.h:3546! [139590.038034] invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC PTI [139590.038340] CPU: 1 PID: 31841 Comm: fsstress Tainted: G W 5.0.0-btrfs-next-46 #1 (...) [139590.039354] RIP: 0010:assfail.constprop.24+0x18/0x1a [btrfs] (...) [139590.040397] RSP: 0018:ffffa27f48f2b9b0 EFLAGS: 00010282 [139590.040730] RAX: 0000000000000041 RBX: ffff897c635d92c8 RCX: 0000000000000000 [139590.041105] RDX: 0000000000000000 RSI: ffff897d36a96868 RDI: ffff897d36a96868 [139590.041470] RBP: ffff897d1b9a0708 R08: 0000000000000000 R09: 0000000000000000 [139590.041815] R10: 0000000000000008 R11: 0000000000000000 R12: 0000000000000013 [139590.042159] R13: 0000000000000227 R14: ffff897cffcbba88 R15: 0000000000000001 [139590.042501] FS: 00007f2efc8dee80(0000) GS:ffff897d36a80000(0000) knlGS:0000000000000000 [139590.042847] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [139590.043199] CR2: 00007f8c064935e0 CR3: 0000000232252002 CR4: 00000000003606e0 [139590.043547] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [139590.043899] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [139590.044250] Call Trace: [139590.044631] copy_items+0xa3f/0x1000 [btrfs] [139590.045009] ? generic_bin_search.constprop.32+0x61/0x200 [btrfs] [139590.045396] btrfs_log_inode+0x7b3/0xd70 [btrfs] [139590.045773] btrfs_log_inode_parent+0x2b3/0xce0 [btrfs] [139590.046143] ? do_raw_spin_unlock+0x49/0xc0 [139590.046510] btrfs_log_dentry_safe+0x4a/0x70 [btrfs] [139590.046872] btrfs_sync_file+0x3b6/0x440 [btrfs] [139590.047243] btrfs_file_write_iter+0x45b/0x5c0 [btrfs] [139590.047592] __vfs_write+0x129/0x1c0 [139590.047932] vfs_write+0xc2/0x1b0 [139590.048270] ksys_write+0x55/0xc0 [139590.048608] do_syscall_64+0x60/0x1b0 [139590.048946] entry_SYSCALL_64_after_hwframe+0x49/0xbe [139590.049287] RIP: 0033:0x7f2efc4be190 (...) [139590.050342] RSP: 002b:00007ffe743243a8 EFLAGS: 00000246 ORIG_RAX: 0000000000000001 [139590.050701] RAX: ffffffffffffffda RBX: 0000000000008d58 RCX: 00007f2efc4be190 [139590.051067] RDX: 0000000000008d58 RSI: 00005567eca0f370 RDI: 0000000000000003 [139590.051459] RBP: 0000000000000024 R08: 0000000000000003 R09: 0000000000008d60 [139590.051863] R10: 0000000000000078 R11: 0000000000000246 R12: 0000000000000003 [139590.052252] R13: 00000000003d3507 R14: 00005567eca0f370 R15: 0000000000000000 (...) [139590.055128] ---[ end trace 193f35d0215cdeeb ]---
So fix this race between a full ranged fsync and writeback of adjacent ranges by flushing all delalloc and waiting for all ordered extents to complete before logging the inode. This is the simplest way to solve the problem because currently the full fsync path does not deal with ranges at all (it assumes a full range from 0 to LLONG_MAX) and it always needs to look at adjacent ranges for hole detection. For use cases of ranged fsyncs this can make a few fsyncs slower but on the other hand it can make some following fsyncs to other ranges do less work or no need to do anything at all. A full fsync is rare anyway and happens only once after loading/creating an inode and once after less common operations such as a shrinking truncate.
This is an issue that exists for a long time, and was often triggered by generic/127, because it does mmap'ed writes and msync (which triggers a ranged fsync). Adding support for the tree checker to detect overlapping extents (next patch in the series) and trigger a WARN() when such cases are found, and then calling btrfs_check_leaf_full() at the end of btrfs_insert_file_extent() made the issue much easier to detect. Running btrfs/072 with that change to the tree checker and making fsstress open files always with O_SYNC made it much easier to trigger the issue (as triggering it with generic/127 is very rare).
--- fs/btrfs/file.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
fs/btrfs/file.c +12 -0
@@ -1901,6 +1901,18 @@ int btrfs_sync_file(struct file *file, lu64 len;/* +* If the inode needs a full sync, make sure we use a full range to +* avoid log tree corruption, due to hole detection racing with ordered +* extent completion for adjacent ranges, and assertion failures during +* hole detection. +*/ +if (test_bit (BTRFS_INODE_NEEDS_FULL_SYNC , + &BTRFS_I (inode)->runtime_flags)) { + start =0 ; + end =LLONG_MAX ; + } + +/* * The range length can be represented by u64, we have to do the typecasts * to avoid signed overflow if it's [0, LLONG_MAX] eg. from fsync() */
Greg Kroah-Hartman
maintainerPATCH 83/241 btrfs: sysfs: dont leak memory when failing add fsid
In reply to Greg Kroah-HartmanFrom: Tobin C. Harding <[email protected]>
commit e32773357d5cc271b1d23550b3ed026eb5c2a468 upstream.
A failed call to kobject_init_and_add() must be followed by a call to kobject_put(). Currently in the error path when adding fs_devices we are missing this call. This could be fixed by calling btrfs_sysfs_remove_fsid() if btrfs_sysfs_add_fsid() returns an error or by adding a call to kobject_put() directly in btrfs_sysfs_add_fsid(). Here we choose the second option because it prevents the slightly unusual error path handling requirements of kobject from leaking out into btrfs functions.
Add a call to kobject_put() in the error path of kobject_add_and_init(). This causes the release method to be called if kobject_init_and_add() fails. open_tree() is the function that calls btrfs_sysfs_add_fsid() and the error code in this function is already written with the assumption that the release method is called during the error path of open_tree() (as seen by the call to btrfs_sysfs_remove_fsid() under the fail_fsdev_sysfs label).
--- fs/btrfs/sysfs.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
fs/btrfs/sysfs.c +6 -1
@@ -733,7 +733,12 @@ int btrfs_sysfs_add_fsid(struct btrfs_fs fs_devs->fsid_kobj.kset = btrfs_kset; error =kobject_init_and_add (&fs_devs->fsid_kobj, &btrfs_ktype, parent,"%pU" , fs_devs->fsid); -return error; +if (error) { +kobject_put (&fs_devs->fsid_kobj); +return error; + } + +return 0 ; }int btrfs_sysfs_add_mounted (struct btrfs_fs_info *fs_info)
Greg Kroah-Hartman
maintainerPATCH 84/241 fbdev: fix divide error in fb_var_to_videomode
In reply to Greg Kroah-HartmanFrom: Shile Zhang <[email protected]>
commit cf84807f6dd0be5214378e66460cfc9187f532f9 upstream.
To fix following divide-by-zero error found by Syzkaller:
divide error: 0000 [#1] SMP PTI
CPU: 7 PID: 8447 Comm: test Kdump: loaded Not tainted 4.19.24-8.al7.x86_64 #1 Hardware name: Alibaba Cloud Alibaba Cloud ECS, BIOS rel-1.12.0-0-ga698c8995f-prebuilt.qemu.org 04/01/2014 RIP: 0010:fb_var_to_videomode+0xae/0xc0 Code: 04 44 03 46 78 03 4e 7c 44 03 46 68 03 4e 70 89 ce d1 ee 69 c0 e8 03 00 00 f6 c2 01 0f 45 ce 83 e2 02 8d 34 09 0f 45 ce 31 d2 <41> f7 f0 31 d2 f7 f1 89 47 08 f3 c3 66 0f 1f 44 00 00 0f 1f 44 00 RSP: 0018:ffffb7e189347bf0 EFLAGS: 00010246 RAX: 00000000e1692410 RBX: ffffb7e189347d60 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffb7e189347c10 RBP: ffff99972a091c00 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000100 R13: 0000000000010000 R14: 00007ffd66baf6d0 R15: 0000000000000000 FS: 00007f2054d11740(0000) GS:ffff99972fbc0000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f205481fd20 CR3: 00000004288a0001 CR4: 00000000001606a0 Call Trace: fb_set_var+0x257/0x390 ? lookup_fast+0xbb/0x2b0 ? fb_open+0xc0/0x140 ? chrdev_open+0xa6/0x1a0 do_fb_ioctl+0x445/0x5a0 do_vfs_ioctl+0x92/0x5f0 ? __alloc_fd+0x3d/0x160 ksys_ioctl+0x60/0x90 __x64_sys_ioctl+0x16/0x20 do_syscall_64+0x5b/0x190 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f20548258d7 Code: 44 00 00 48 8b 05 b9 15 2d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 89 15 2d 00 f7 d8 64 89 01 48
It can be triggered easily with following test code:
#include <linux/fb.h>
#include <fcntl.h>
#include <sys/ioctl.h>
int main(void)
{
struct fb_var_screeninfo var = {.activate = 0x100, .pixclock = 60};
int fd = open("/dev/fb0", O_RDWR);
if (fd < 0)
return 1; if (ioctl(fd, FBIOPUT_VSCREENINFO, &var))
return 1;
return 0;}
--- drivers/video/fbdev/core/modedb.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/video/fbdev/core/modedb.c +3 -0
@@ -933,6 +933,9 @@ void fb_var_to_videomode(struct fb_videoif (var->vmode &FB_VMODE_DOUBLE ) vtotal *=2 ; +if (!htotal || !vtotal) +return ; + hfreq = pixclock/htotal; mode->refresh = hfreq/vtotal; }
Greg Kroah-Hartman
maintainerPATCH 85/241 hugetlb: use same fault hash key for shared and private mappings
In reply to Greg Kroah-HartmanFrom: Mike Kravetz <[email protected]>
commit 1b426bac66e6cc83c9f2d92b96e4e72acf43419a upstream.
hugetlb uses a fault mutex hash table to prevent page faults of the same pages concurrently. The key for shared and private mappings is different. Shared keys off address_space and file index. Private keys off mm and virtual address. Consider a private mappings of a populated hugetlbfs file. A fault will map the page from the file and if needed do a COW to map a writable page.
Hugetlbfs hole punch uses the fault mutex to prevent mappings of file pages. It uses the address_space file index key. However, private mappings will use a different key and could race with this code to map the file page. This causes problems (BUG) for the page cache remove code as it expects the page to be unmapped. A sample stack is:
page dumped because: VM_BUG_ON_PAGE(page_mapped(page)) kernel BUG at mm/filemap.c:169! ... RIP: 0010:unaccount_page_cache_page+0x1b8/0x200 ... Call Trace: __delete_from_page_cache+0x39/0x220 delete_from_page_cache+0x45/0x70 remove_inode_hugepages+0x13c/0x380 ? __add_to_page_cache_locked+0x162/0x380 hugetlbfs_fallocate+0x403/0x540 ? _cond_resched+0x15/0x30 ? __inode_security_revalidate+0x5d/0x70 ? selinux_file_permission+0x100/0x130 vfs_fallocate+0x13f/0x270 ksys_fallocate+0x3c/0x80 __x64_sys_fallocate+0x1a/0x20 do_syscall_64+0x5b/0x180 entry_SYSCALL_64_after_hwframe+0x44/0xa9
There seems to be another potential COW issue/race with this approach of different private and shared keys as noted in commit 8382d914ebf7 ("mm, hugetlb: improve page-fault scalability").
Since every hugetlb mapping (even anon and private) is actually a file mapping, just use the address_space index key for all mappings. This results in potentially more hash collisions. However, this should not be the common case.
--- fs/hugetlbfs/inode.c | 8 ++------ include/linux/hugetlb.h | 4 +--- mm/hugetlb.c | 19 +++++-------------- 3 files changed, 8 insertions(+), 23 deletions(-)
fs/hugetlbfs/inode.c +2 -6
@@ -414,9 +414,7 @@ static void remove_inode_hugepages(strucif (next >= end)break ; - hash =hugetlb_fault_mutex_hash (h, current->mm, - &pseudo_vma, - mapping, next,0 ); + hash =hugetlb_fault_mutex_hash (h, mapping, next,0 );mutex_lock (&hugetlb_fault_mutex_table[hash]);lock_page (page);
@@ -569,7 +567,6 @@ static long hugetlbfs_fallocate(struct fstruct address_space *mapping = inode->i_mapping;struct hstate *h =hstate_inode (inode);struct vm_area_struct pseudo_vma; -struct mm_struct *mm = current->mm;loff_t hpage_size =huge_page_size (h);unsigned long hpage_shift =huge_page_shift (h);pgoff_t start, index, end;
@@ -633,8 +630,7 @@ static long hugetlbfs_fallocate(struct f addr = index * hpage_size;/* mutex taken here, fault path and hole punch */ - hash =hugetlb_fault_mutex_hash (h, mm, &pseudo_vma, mapping, - index, addr); + hash =hugetlb_fault_mutex_hash (h, mapping, index, addr);mutex_lock (&hugetlb_fault_mutex_table[hash]);/* See if already present in mapping to avoid alloc/free */
include/linux/hugetlb.h +1 -3
@@ -91,9 +91,7 @@ void putback_active_hugepage(struct pagevoid free_huge_page (struct page *page);void hugetlb_fix_reserve_counts (struct inode *inode,bool restore_reserve);extern struct mutex *hugetlb_fault_mutex_table; -u32 hugetlb_fault_mutex_hash (struct hstate *h,struct mm_struct *mm, -struct vm_area_struct *vma, -struct address_space *mapping, +u32 hugetlb_fault_mutex_hash (struct hstate *h,struct address_space *mapping,pgoff_t idx,unsigned long address);#ifdef CONFIG_ARCH_WANT_HUGE_PMD_SHARE
mm/hugetlb.c +5 -14
@@ -3703,21 +3703,14 @@ backout_unlocked: }#ifdef CONFIG_SMP -u32 hugetlb_fault_mutex_hash (struct hstate *h,struct mm_struct *mm, -struct vm_area_struct *vma, -struct address_space *mapping, +u32 hugetlb_fault_mutex_hash (struct hstate *h,struct address_space *mapping,pgoff_t idx,unsigned long address) {unsigned long key[2 ];u32 hash; -if (vma->vm_flags &VM_SHARED ) { - key[0 ] = (unsigned long ) mapping; - key[1 ] = idx; - }else { - key[0 ] = (unsigned long ) mm; - key[1 ] = address >>huge_page_shift (h); - } + key[0 ] = (unsigned long ) mapping; + key[1 ] = idx; hash =jhash2 ((u32 *)&key,sizeof (key)/sizeof (u32),0 );
@@ -3728,9 +3721,7 @@ u32 hugetlb_fault_mutex_hash(struct hsta* For uniprocesor systems we always use a single mutex, so just * return 0 and avoid the hashing overhead. */ -u32 hugetlb_fault_mutex_hash (struct hstate *h,struct mm_struct *mm, -struct vm_area_struct *vma, -struct address_space *mapping, +u32 hugetlb_fault_mutex_hash (struct hstate *h,struct address_space *mapping,pgoff_t idx,unsigned long address) {return 0 ;
@@ -3776,7 +3767,7 @@ int hugetlb_fault(struct mm_struct *mm,* get spurious allocation failures if two CPUs race to instantiate * the same page in the page cache. */ - hash =hugetlb_fault_mutex_hash (h, mm, vma, mapping, idx, address); + hash =hugetlb_fault_mutex_hash (h, mapping, idx, address);mutex_lock (&hugetlb_fault_mutex_table[hash]); entry =huge_ptep_get (ptep);
Greg Kroah-Hartman
maintainerPATCH 86/241 fbdev: fix WARNING in __alloc_pages_nodemask bug
In reply to Greg Kroah-HartmanFrom: Jiufei Xue <[email protected]>
commit 8c40292be9169a9cbe19aadd1a6fc60cbd1af82f upstream.
Syzkaller hit 'WARNING in __alloc_pages_nodemask' bug.
WARNING: CPU: 1 PID: 1473 at mm/page_alloc.c:4377 __alloc_pages_nodemask+0x4da/0x2130 Kernel panic - not syncing: panic_on_warn set ... Call Trace: alloc_pages_current+0xb1/0x1e0 kmalloc_order+0x1f/0x60 kmalloc_order_trace+0x1d/0x120 fb_alloc_cmap_gfp+0x85/0x2b0 fb_set_user_cmap+0xff/0x370 do_fb_ioctl+0x949/0xa20 fb_ioctl+0xdd/0x120 do_vfs_ioctl+0x186/0x1070 ksys_ioctl+0x89/0xa0 __x64_sys_ioctl+0x74/0xb0 do_syscall_64+0xc8/0x550 entry_SYSCALL_64_after_hwframe+0x49/0xbe
This is a warning about order >= MAX_ORDER and the order is from userspace ioctl. Add flag __NOWARN to silence this warning.
--- drivers/video/fbdev/core/fbcmap.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/video/fbdev/core/fbcmap.c +2 -0
@@ -94,6 +94,8 @@ int fb_alloc_cmap_gfp(struct fb_cmap *cmint size = len *sizeof (u16);int ret = -ENOMEM ; + flags |= __GFP_NOWARN; +if (cmap->len != len) {fb_dealloc_cmap (cmap);if (!len)
Greg Kroah-Hartman
maintainerPATCH 87/241 media: cpia2: Fix use-after-free in cpia2_exit
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
commit dea37a97265588da604c6ba80160a287b72c7bfd upstream.
Syzkaller report this:
BUG: KASAN: use-after-free in sysfs_remove_file_ns+0x5f/0x70 fs/sysfs/file.c:468
Read of size 8 at addr ffff8881f59a6b70 by task syz-executor.0/8363
CPU: 0 PID: 8363 Comm: syz-executor.0 Not tainted 5.0.0-rc8+ #3
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0xfa/0x1ce lib/dump_stack.c:113
print_address_description+0x65/0x270 mm/kasan/report.c:187
kasan_report+0x149/0x18d mm/kasan/report.c:317
sysfs_remove_file_ns+0x5f/0x70 fs/sysfs/file.c:468
sysfs_remove_file include/linux/sysfs.h:519 [inline]
driver_remove_file+0x40/0x50 drivers/base/driver.c:122
usb_remove_newid_files drivers/usb/core/driver.c:212 [inline]
usb_deregister+0x12a/0x3b0 drivers/usb/core/driver.c:1005
cpia2_exit+0xa/0x16 [cpia2]
__do_sys_delete_module kernel/module.c:1018 [inline]
__se_sys_delete_module kernel/module.c:961 [inline]
__x64_sys_delete_module+0x3dc/0x5e0 kernel/module.c:961
do_syscall_64+0x147/0x600 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
RIP: 0033:0x462e99
Code: f7 d8 64 89 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007f86f3754c58 EFLAGS: 00000246 ORIG_RAX: 00000000000000b0
RAX: ffffffffffffffda RBX: 000000000073bf00 RCX: 0000000000462e99
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000020000300
RBP: 0000000000000002 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 00007f86f37556bc
R13: 00000000004bcca9 R14: 00000000006f6b48 R15: 00000000ffffffff
Allocated by task 8363:
set_track mm/kasan/common.c:85 [inline]
__kasan_kmalloc.constprop.3+0xa0/0xd0 mm/kasan/common.c:495
kmalloc include/linux/slab.h:545 [inline]
kzalloc include/linux/slab.h:740 [inline]
bus_add_driver+0xc0/0x610 drivers/base/bus.c:651
driver_register+0x1bb/0x3f0 drivers/base/driver.c:170
usb_register_driver+0x267/0x520 drivers/usb/core/driver.c:965
0xffffffffc1b4817c
do_one_initcall+0xfa/0x5ca init/main.c:887
do_init_module+0x204/0x5f6 kernel/module.c:3460
load_module+0x66b2/0x8570 kernel/module.c:3808
__do_sys_finit_module+0x238/0x2a0 kernel/module.c:3902
do_syscall_64+0x147/0x600 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
Freed by task 8363:
set_track mm/kasan/common.c:85 [inline]
__kasan_slab_free+0x130/0x180 mm/kasan/common.c:457
slab_free_hook mm/slub.c:1430 [inline]
slab_free_freelist_hook mm/slub.c:1457 [inline]
slab_free mm/slub.c:3005 [inline]
kfree+0xe1/0x270 mm/slub.c:3957
kobject_cleanup lib/kobject.c:662 [inline]
kobject_release lib/kobject.c:691 [inline]
kref_put include/linux/kref.h:67 [inline]
kobject_put+0x146/0x240 lib/kobject.c:708
bus_remove_driver+0x10e/0x220 drivers/base/bus.c:732
driver_unregister+0x6c/0xa0 drivers/base/driver.c:197
usb_register_driver+0x341/0x520 drivers/usb/core/driver.c:980
0xffffffffc1b4817c
do_one_initcall+0xfa/0x5ca init/main.c:887
do_init_module+0x204/0x5f6 kernel/module.c:3460
load_module+0x66b2/0x8570 kernel/module.c:3808
__do_sys_finit_module+0x238/0x2a0 kernel/module.c:3902
do_syscall_64+0x147/0x600 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
The buggy address belongs to the object at ffff8881f59a6b40
which belongs to the cache kmalloc-256 of size 256
The buggy address is located 48 bytes inside of
256-byte region [ffff8881f59a6b40, ffff8881f59a6c40)
The buggy address belongs to the page:
page:ffffea0007d66980 count:1 mapcount:0 mapping:ffff8881f6c02e00 index:0x0
flags: 0x2fffc0000000200(slab)
raw: 02fffc0000000200 dead000000000100 dead000000000200 ffff8881f6c02e00
raw: 0000000000000000 00000000800c000c 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff8881f59a6a00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff8881f59a6a80: 00 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc
>ffff8881f59a6b00: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
^
ffff8881f59a6b80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff8881f59a6c00: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fccpia2_init does not check return value of cpia2_init, if it failed in usb_register_driver, there is already cleanup using driver_unregister. No need call cpia2_usb_cleanup on module exit.
--- drivers/media/usb/cpia2/cpia2_v4l.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/media/usb/cpia2/cpia2_v4l.c +1 -2
@@ -1248,8 +1248,7 @@ static int __init cpia2_init(void)LOG ("%s v%s\n" ,ABOUT ,CPIA_VERSION );check_parameters (); -cpia2_usb_init (); -return 0 ; +return cpia2_usb_init (); }
Greg Kroah-Hartman
maintainerPATCH 88/241 media: vivid: use vfree() instead of kfree() for dev->bitmap_cap
In reply to Greg Kroah-HartmanFrom: Alexander Potapenko <[email protected]>
commit dad7e270ba712ba1c99cd2d91018af6044447a06 upstream.
syzkaller reported crashes on kfree() called from vivid_vid_cap_s_selection(). This looks like a simple typo, as dev->bitmap_cap is allocated with vzalloc() throughout the file.
parts")
--- drivers/media/platform/vivid/vivid-vid-cap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/platform/vivid/vivid-vid-cap.c +1 -1
@@ -993,7 +993,7 @@ int vivid_vid_cap_s_selection(struct filrect_map_inside (&s->r, &dev->fmt_cap_rect);if (dev->bitmap_cap && (compose->width != s->r.width || compose->height != s->r.height)) { -kfree (dev->bitmap_cap); +vfree (dev->bitmap_cap); dev->bitmap_cap =NULL ; } *compose = s->r;
Greg Kroah-Hartman
maintainerPATCH 89/241 ssb: Fix possible NULL pointer dereference in ssb_host_pcmcia_exit
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
commit b2c01aab9646ed8ffb7c549afe55d5349c482425 upstream.
Syzkaller report this:
kasan: GPF could be caused by NULL-ptr deref or user memory access
general protection fault: 0000 [#1] SMP KASAN PTI CPU: 0 PID: 4492 Comm: syz-executor.0 Not tainted 5.0.0-rc7+ #45 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014 RIP: 0010:sysfs_remove_file_ns+0x27/0x70 fs/sysfs/file.c:468 Code: 00 00 00 41 54 55 48 89 fd 53 49 89 d4 48 89 f3 e8 ee 76 9c ff 48 8d 7d 30 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <80> 3c 02 00 75 2d 48 89 da 48 b8 00 00 00 00 00 fc ff df 48 8b 6d RSP: 0018:ffff8881e9d9fc00 EFLAGS: 00010206 RAX: dffffc0000000000 RBX: ffffffff900367e0 RCX: ffffffff81a95952 RDX: 0000000000000006 RSI: ffffc90001405000 RDI: 0000000000000030 RBP: 0000000000000000 R08: fffffbfff1fa22ed R09: fffffbfff1fa22ed R10: 0000000000000001 R11: fffffbfff1fa22ec R12: 0000000000000000 R13: ffffffffc1abdac0 R14: 1ffff1103d3b3f8b R15: 0000000000000000 FS: 00007fe409dc1700(0000) GS:ffff8881f1200000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000001b2d721000 CR3: 00000001e98b6005 CR4: 00000000007606f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: sysfs_remove_file include/linux/sysfs.h:519 [inline] driver_remove_file+0x40/0x50 drivers/base/driver.c:122 pcmcia_remove_newid_file drivers/pcmcia/ds.c:163 [inline] pcmcia_unregister_driver+0x7d/0x2b0 drivers/pcmcia/ds.c:209 ssb_modexit+0xa/0x1b [ssb] __do_sys_delete_module kernel/module.c:1018 [inline] __se_sys_delete_module kernel/module.c:961 [inline] __x64_sys_delete_module+0x3dc/0x5e0 kernel/module.c:961 do_syscall_64+0x147/0x600 arch/x86/entry/common.c:290 entry_SYSCALL_64_after_hwframe+0x49/0xbe RIP: 0033:0x462e99 Code: f7 d8 64 89 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007fe409dc0c58 EFLAGS: 00000246 ORIG_RAX: 00000000000000b0 RAX: ffffffffffffffda RBX: 000000000073bf00 RCX: 0000000000462e99 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 00000000200000c0 RBP: 0000000000000002 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00007fe409dc16bc R13: 00000000004bccaa R14: 00000000006f6bc8 R15: 00000000ffffffff Modules linked in: ssb(-) 3c59x nvme_core macvlan tap pata_hpt3x3 rt2x00pci null_blk tsc40 pm_notifier_error_inject notifier_error_inject mdio cdc_wdm nf_reject_ipv4 ath9k_common ath9k_hw ath pppox ppp_generic slhc ehci_platform wl12xx wlcore tps6507x_ts ioc4 nf_synproxy_core ide_gd_mod ax25 can_dev iwlwifi can_raw atm tm2_touchkey can_gw can sundance adp5588_keys rt2800mmio rt2800lib rt2x00mmio rt2x00lib eeprom_93cx6 pn533 lru_cache elants_i2c ip_set nfnetlink gameport tipc hampshire nhc_ipv6 nhc_hop nhc_udp nhc_fragment nhc_routing nhc_mobility nhc_dest 6lowpan silead brcmutil nfc mt76_usb mt76 mac80211 iptable_security iptable_raw iptable_mangle iptable_nat nf_nat_ipv4 nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 iptable_filter bpfilter ip6_vti ip_gre sit hsr veth vxcan batman_adv cfg80211 rfkill chnl_net caif nlmon vcan bridge stp llc ip6_gre ip6_tunnel tunnel6 tun joydev mousedev serio_raw ide_pci_generic piix floppy ide_core sch_fq_codel ip_tables x_tables ipv6 [last unloaded: 3c59x] Dumping ftrace buffer: (ftrace buffer empty) ---[ end trace 3913cbf8011e1c05 ]---
In ssb_modinit, it does not fail SSB init when ssb_host_pcmcia_init failed, however in ssb_modexit, ssb_host_pcmcia_exit calls pcmcia_unregister_driver unconditionally, which may tigger a NULL pointer dereference issue as above.
--- drivers/ssb/bridge_pcmcia_80211.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/ssb/bridge_pcmcia_80211.c +7 -2
@@ -113,16 +113,21 @@ static struct pcmcia_driver ssb_host_pcm .resume = ssb_host_pcmcia_resume, }; +static int pcmcia_init_failed; +/* * These are not module init/exit functions! * The module_pcmcia_driver() helper cannot be used here. */ int ssb_host_pcmcia_init (void ) { -return pcmcia_register_driver (&ssb_host_pcmcia_driver); + pcmcia_init_failed =pcmcia_register_driver (&ssb_host_pcmcia_driver); + +return pcmcia_init_failed; }void ssb_host_pcmcia_exit (void ) { -pcmcia_unregister_driver (&ssb_host_pcmcia_driver); +if (!pcmcia_init_failed) +pcmcia_unregister_driver (&ssb_host_pcmcia_driver); }
Greg Kroah-Hartman
maintainerPATCH 90/241 at76c50x-usb: Dont register led_trigger if usb_register_driver failed
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
commit 09ac2694b0475f96be895848687ebcbba97eeecf upstream.
Syzkaller report this:
[ 1213.468581] BUG: unable to handle kernel paging request at fffffbfff83bf338 [ 1213.469530] #PF error: [normal kernel read fault] [ 1213.469530] PGD 237fe4067 P4D 237fe4067 PUD 237e60067 PMD 1c868b067 PTE 0 [ 1213.473514] Oops: 0000 [#1] SMP KASAN PTI [ 1213.473514] CPU: 0 PID: 6321 Comm: syz-executor.0 Tainted: G C 5.1.0-rc3+ #8 [ 1213.473514] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014 [ 1213.473514] RIP: 0010:strcmp+0x31/0xa0 [ 1213.473514] Code: 00 00 00 00 fc ff df 55 53 48 83 ec 08 eb 0a 84 db 48 89 ef 74 5a 4c 89 e6 48 89 f8 48 89 fa 48 8d 6f 01 48 c1 e8 03 83 e2 07 <42> 0f b6 04 28 38 d0 7f 04 84 c0 75 50 48 89 f0 48 89 f2 0f b6 5d [ 1213.473514] RSP: 0018:ffff8881f2b7f950 EFLAGS: 00010246 [ 1213.473514] RAX: 1ffffffff83bf338 RBX: ffff8881ea6f7240 RCX: ffffffff825350c6 [ 1213.473514] RDX: 0000000000000000 RSI: ffffffffc1ee19c0 RDI: ffffffffc1df99c0 [ 1213.473514] RBP: ffffffffc1df99c1 R08: 0000000000000001 R09: 0000000000000004 [ 1213.473514] R10: 0000000000000000 R11: ffff8881de353f00 R12: ffff8881ee727900 [ 1213.473514] R13: dffffc0000000000 R14: 0000000000000001 R15: ffffffffc1eeaaf0 [ 1213.473514] FS: 00007fa66fa01700(0000) GS:ffff8881f7200000(0000) knlGS:0000000000000000 [ 1213.473514] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1213.473514] CR2: fffffbfff83bf338 CR3: 00000001ebb9e005 CR4: 00000000007606f0 [ 1213.473514] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 1213.473514] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 1213.473514] PKRU: 55555554 [ 1213.473514] Call Trace: [ 1213.473514] led_trigger_register+0x112/0x3f0 [ 1213.473514] led_trigger_register_simple+0x7a/0x110 [ 1213.473514] ? 0xffffffffc1c10000 [ 1213.473514] at76_mod_init+0x77/0x1000 [at76c50x_usb] [ 1213.473514] do_one_initcall+0xbc/0x47d [ 1213.473514] ? perf_trace_initcall_level+0x3a0/0x3a0 [ 1213.473514] ? kasan_unpoison_shadow+0x30/0x40 [ 1213.473514] ? kasan_unpoison_shadow+0x30/0x40 [ 1213.473514] do_init_module+0x1b5/0x547 [ 1213.473514] load_module+0x6405/0x8c10 [ 1213.473514] ? module_frob_arch_sections+0x20/0x20 [ 1213.473514] ? kernel_read_file+0x1e6/0x5d0 [ 1213.473514] ? find_held_lock+0x32/0x1c0 [ 1213.473514] ? cap_capable+0x1ae/0x210 [ 1213.473514] ? __do_sys_finit_module+0x162/0x190 [ 1213.473514] __do_sys_finit_module+0x162/0x190 [ 1213.473514] ? __ia32_sys_init_module+0xa0/0xa0 [ 1213.473514] ? __mutex_unlock_slowpath+0xdc/0x690 [ 1213.473514] ? wait_for_completion+0x370/0x370 [ 1213.473514] ? vfs_write+0x204/0x4a0 [ 1213.473514] ? do_syscall_64+0x18/0x450 [ 1213.473514] do_syscall_64+0x9f/0x450 [ 1213.473514] entry_SYSCALL_64_after_hwframe+0x49/0xbe [ 1213.473514] RIP: 0033:0x462e99 [ 1213.473514] Code: f7 d8 64 89 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48 [ 1213.473514] RSP: 002b:00007fa66fa00c58 EFLAGS: 00000246 ORIG_RAX: 0000000000000139 [ 1213.473514] RAX: ffffffffffffffda RBX: 000000000073bf00 RCX: 0000000000462e99 [ 1213.473514] RDX: 0000000000000000 RSI: 0000000020000300 RDI: 0000000000000003 [ 1213.473514] RBP: 00007fa66fa00c70 R08: 0000000000000000 R09: 0000000000000000 [ 1213.473514] R10: 0000000000000000 R11: 0000000000000246 R12: 00007fa66fa016bc [ 1213.473514] R13: 00000000004bcefa R14: 00000000006f6fb0 R15: 0000000000000004
If usb_register failed, no need to call led_trigger_register_simple.
--- drivers/net/wireless/at76c50x-usb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/at76c50x-usb.c +2 -2
@@ -2582,8 +2582,8 @@ static int __init at76_mod_init(void)if (result <0 ) printk(KERN_ERR DRIVER_NAME": usb_register failed (status %d)\n" , result); - -led_trigger_register_simple ("at76_usb-tx" , &ledtrig_tx); +else +led_trigger_register_simple ("at76_usb-tx" , &ledtrig_tx);return result; }
Greg Kroah-Hartman
maintainerPATCH 91/241 perf tools: No need to include bitops.h in util.h
In reply to Greg Kroah-HartmanFrom: Arnaldo Carvalho de Melo <[email protected]>
commit 6dcca6df4b73d409628c7b4464c63d4eb9d4d13a upstream.
When we switched to the kernel's roundup_pow_of_two we forgot to remove this include from util.h, do it now.
[bwh: Backported to 4.4 as dependency of "tools include: Adopt linux/bits.h":
- Include <linux/compiler.h> in util/string.c to avoid build regression
- Adjust context]
--- tools/perf/util/string.c | 1 + tools/perf/util/util.h | 1 - 2 files changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/string.c +1 -0
@@ -1,4 +1,5 @@#include "util.h" +#include <linux/compiler.h> #include "linux/string.h" #define K 1024LL
tools/perf/util/util.h +0 -1
@@ -76,7 +76,6 @@#include <sys/ttydefaults.h> #include <api/fs/tracing_path.h> #include <termios.h> -#include <linux/bitops.h> #include <termios.h> extern const char *graph_line;
Greg Kroah-Hartman
maintainerPATCH 92/241 tools include: Adopt linux/bits.h
In reply to Greg Kroah-HartmanFrom: Arnaldo Carvalho de Melo <[email protected]>
commit ba4aa02b417f08a0bee5e7b8ed70cac788a7c854 upstream.
So that we reduce the difference of tools/include/linux/bitops.h to the original kernel file, include/linux/bitops.h, trying to remove the need to define BITS_PER_LONG, to avoid clashes with asm/bitsperlong.h.
And the things removed from tools/include/linux/bitops.h are really in linux/bits.h, so that we can have a copy and then tools/perf/check_headers.sh will tell us when new stuff gets added to linux/bits.h so that we can check if it is useful and if any adjustment needs to be done to the tools/{include,arch}/ copies.
[bwh: Backported to 4.4 as dependency of "x86/msr-index: Cleanup bit defines":
- Drop change in check-headers.sh
- Adjust context]
--- tools/include/linux/bitops.h | 7 ++----- tools/include/linux/bits.h | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 tools/include/linux/bits.h
tools/include/linux/bitops.h +2 -5
@@ -3,17 +3,14 @@#include <asm/types.h> #include <linux/kernel.h> -#include <linux/compiler.h> -#ifndef __WORDSIZE#define __WORDSIZE (__SIZEOF_LONG__ * 8)#endif #define BITS_PER_LONG __WORDSIZE +#include <linux/bits.h> +#include <linux/compiler.h> -#define BIT_MASK (nr) (1UL << ((nr) % BITS_PER_LONG)) -#define BIT_WORD (nr) ((nr) / BITS_PER_LONG) -#define BITS_PER_BYTE 8#define BITS_TO_LONGS (nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))#define BITS_TO_U64 (nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64))#define BITS_TO_U32 (nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32))
tools/include/linux/bits.h new file +26 -0
@@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __LINUX_BITS_H +#define __LINUX_BITS_H +#include <asm/bitsperlong.h> + +#define BIT (nr) (1UL << (nr)) +#define BIT_ULL (nr) (1ULL << (nr)) +#define BIT_MASK (nr) (1UL << ((nr) % BITS_PER_LONG)) +#define BIT_WORD (nr) ((nr) / BITS_PER_LONG) +#define BIT_ULL_MASK (nr) (1ULL << ((nr) % BITS_PER_LONG_LONG)) +#define BIT_ULL_WORD (nr) ((nr) / BITS_PER_LONG_LONG) +#define BITS_PER_BYTE 8 + +/* +* Create a contiguous bitmask starting at bit position @l and ending at +* position @h. For example +* GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000. +*/ +#define GENMASK (h, l) \ + (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) + +#define GENMASK_ULL (h, l) \ + (((~0ULL) - (1ULL << (l)) + 1) & \ + (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h)))) + +#endif /* __LINUX_BITS_H */
Greg Kroah-Hartman
maintainerPATCH 93/241 gfs2: Fix lru_count going negative
In reply to Greg Kroah-Hartman[ Upstream commit 7881ef3f33bb80f459ea6020d1e021fc524a6348 ]
Under certain conditions, lru_count may drop below zero resulting in a large amount of log spam like this:
vmscan: shrink_slab: gfs2_dump_glock+0x3b0/0x630 [gfs2] \
negative objects to delete nr=-1
This happens as follows:
1) A glock is moved from lru_list to the dispose list and lru_count is decremented.
2) The dispose function calls cond_resched() and drops the lru lock.
3) Another thread takes the lru lock and tries to add the same glock to lru_list, checking if the glock is on an lru list.
4) It is on a list (actually the dispose list) and so it avoids incrementing lru_count.
5) The glock is moved to lru_list.
5) The original thread doesn't dispose it because it has been re-added to the lru list but the lru_count has still decreased by one.
Fix by checking if the LRU flag is set on the glock rather than checking if the glock is on some list and rearrange the code so that the LRU flag is added/removed precisely when the glock is added/removed from lru_list.
--- fs/gfs2/glock.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
fs/gfs2/glock.c +13 -9
@@ -136,22 +136,26 @@ static int demote_ok(const struct gfs2_glock *gl)void gfs2_glock_add_to_lru (struct gfs2_glock *gl) { +if (!(gl->gl_ops->go_flags &GLOF_LRU )) +return ; +spin_lock (&lru_lock); -if (!list_empty (&gl->gl_lru)) -list_del_init (&gl->gl_lru); -else +list_del (&gl->gl_lru); +list_add_tail (&gl->gl_lru, &lru_list); + +if (!test_bit (GLF_LRU , &gl->gl_flags)) { +set_bit (GLF_LRU , &gl->gl_flags);atomic_inc (&lru_count); + } -list_add_tail (&gl->gl_lru, &lru_list); -set_bit (GLF_LRU , &gl->gl_flags);spin_unlock (&lru_lock); }static void gfs2_glock_remove_from_lru (struct gfs2_glock *gl) {spin_lock (&lru_lock); -if (!list_empty (&gl->gl_lru)) { +if (test_bit (GLF_LRU , &gl->gl_flags)) {list_del_init (&gl->gl_lru);atomic_dec (&lru_count);clear_bit (GLF_LRU , &gl->gl_flags);
@@ -1040,8 +1044,7 @@ void gfs2_glock_dq(struct gfs2_holder *gh) !test_bit(GLF_DEMOTE, &gl->gl_flags)) fast_path =1 ; } -if (!test_bit (GLF_LFLUSH , &gl->gl_flags) &&demote_ok (gl) && - (glops->go_flags &GLOF_LRU )) +if (!test_bit (GLF_LFLUSH , &gl->gl_flags) &&demote_ok (gl))gfs2_glock_add_to_lru (gl);trace_gfs2_glock_queue (gh,0 );
@@ -1341,6 +1344,7 @@ __acquires(&lru_lock)if (!spin_trylock (&gl->gl_lockref.lock)) { add_back_to_lru:list_add (&gl->gl_lru, &lru_list); +set_bit (GLF_LRU , &gl->gl_flags);atomic_inc (&lru_count);continue ; }
@@ -1348,7 +1352,6 @@ __acquires(&lru_lock)spin_unlock (&gl->gl_lockref.lock); goto add_back_to_lru; } -clear_bit (GLF_LRU , &gl->gl_flags); gl->gl_lockref.count++;if (demote_ok (gl))handle_callback (gl,LM_ST_UNLOCKED ,0 , false);
@@ -1384,6 +1387,7 @@ static long gfs2_scan_glock_lru(int nr)if (!test_bit (GLF_LOCK , &gl->gl_flags)) {list_move (&gl->gl_lru, &dispose);atomic_dec (&lru_count); +clear_bit (GLF_LRU , &gl->gl_flags); freed++;continue ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 94/241 cxgb4: Fix error path in cxgb4_init_module
In reply to Greg Kroah-Hartman[ Upstream commit a3147770bea76c8dbad73eca3a24c2118da5e719 ]
BUG: unable to handle kernel paging request at ffffffffa016a270 PGD 3270067 P4D 3270067 PUD 3271063 PMD 230bbd067 PTE 0 Oops: 0000 [#1 CPU: 0 PID: 6134 Comm: modprobe Not tainted 5.1.0+ #33 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.3-0-ge2fc41e-prebuilt.qemu-project.org 04/01/2014 RIP: 0010:atomic_notifier_chain_register+0x24/0x60 Code: 1f 80 00 00 00 00 55 48 89 e5 41 54 49 89 f4 53 48 89 fb e8 ae b4 38 01 48 8b 53 38 48 8d 4b 38 48 85 d2 74 20 45 8b 44 24 10 <44> 3b 42 10 7e 08 eb 13 44 39 42 10 7c 0d 48 8d 4a 08 48 8b 52 08 RSP: 0018:ffffc90000e2bc60 EFLAGS: 00010086 RAX: 0000000000000292 RBX: ffffffff83467240 RCX: ffffffff83467278 RDX: ffffffffa016a260 RSI: ffffffff83752140 RDI: ffffffff83467240 RBP: ffffc90000e2bc70 R08: 0000000000000000 R09: 0000000000000001 R10: 0000000000000000 R11: 00000000014fa61f R12: ffffffffa01c8260 R13: ffff888231091e00 R14: 0000000000000000 R15: ffffc90000e2be78 FS: 00007fbd8d7cd540(0000) GS:ffff888237a00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffffffffa016a270 CR3: 000000022c7e3000 CR4: 00000000000006f0 Call Trace: register_inet6addr_notifier+0x13/0x20 cxgb4_init_module+0x6c/0x1000 [cxgb4 ? 0xffffffffa01d7000 do_one_initcall+0x6c/0x3cc ? do_init_module+0x22/0x1f1 ? rcu_read_lock_sched_held+0x97/0xb0 ? kmem_cache_alloc_trace+0x325/0x3b0 do_init_module+0x5b/0x1f1 load_module+0x1db1/0x2690 ? m_show+0x1d0/0x1d0 __do_sys_finit_module+0xc5/0xd0 __x64_sys_finit_module+0x15/0x20 do_syscall_64+0x6b/0x1d0 entry_SYSCALL_64_after_hwframe+0x49/0xbe
If pci_register_driver fails, register inet6addr_notifier is pointless. This patch fix the error path in cxgb4_init_module.
--- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +12 -3
@@ -5061,15 +5061,24 @@ static int __init cxgb4_init_module(void) ret =pci_register_driver (&cxgb4_driver);if (ret <0 ) -debugfs_remove (cxgb4_debugfs_root); + goto err_pci;#if IS_ENABLED (CONFIG_IPV6 )if (!inet6addr_registered) { -register_inet6addr_notifier (&cxgb4_inet6addr_notifier); - inet6addr_registered = true; + ret =register_inet6addr_notifier (&cxgb4_inet6addr_notifier); +if (ret) +pci_unregister_driver (&cxgb4_driver); +else + inet6addr_registered = true; }#endif +if (ret ==0 ) +return ret; + +err_pci: +debugfs_remove (cxgb4_debugfs_root); +return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 95/241 mmc: core: Verify SD bus width
In reply to Greg Kroah-Hartman[ Upstream commit 9e4be8d03f50d1b25c38e2b59e73b194c130df7d ]
The SD Physical Layer Spec says the following: Since the SD Memory Card shall support at least the two bus modes 1-bit or 4-bit width, then any SD Card shall set at least bits 0 and 2 (SD_BUS_WIDTH="0101").
This change verifies the card has specified a bus width.
AMD SDHC Device 7806 can get into a bad state after a card disconnect where anything transferred via the DATA lines will always result in a zero filled buffer. Currently the driver will continue without error if the HC is in this condition. A block device will be created, but reading from it will result in a zero buffer. This makes it seem like the SD device has been erased, when in actuality the data is never getting copied from the DATA lines to the data buffer.
SCR is the first command in the SD initialization sequence that uses the DATA lines. By checking that the response was invalid, we can abort mounting the card.
--- drivers/mmc/core/sd.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/mmc/core/sd.c +8 -0
@@ -216,6 +216,14 @@ static int mmc_decode_scr(struct mmc_card *card)if (scr->sda_spec3) scr->cmds =UNSTUFF_BITS (resp,32 ,2 ); + +/* SD Spec says: any SD Card shall set at least bits 0 and 2 */ +if (!(scr->bus_widths &SD_SCR_BUS_WIDTH_1 ) || + !(scr->bus_widths &SD_SCR_BUS_WIDTH_4 )) { +pr_err ("%s: invalid bus width\n" ,mmc_hostname (card->host)); +return -EINVAL ; + } +return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 96/241 powerpc/boot: Fix missing check of lseek() return value
In reply to Greg Kroah-Hartman[ Upstream commit 5d085ec04a000fefb5182d3b03ee46ca96d8389b ]
This is detected by Coverity scan: CID: 1440481
--- arch/powerpc/boot/addnote.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/powerpc/boot/addnote.c +5 -1
@@ -223,7 +223,11 @@ main(int ac, char **av)PUT_16 (E_PHNUM , np +2 );/* write back */ -lseek (fd, (long )0 ,SEEK_SET ); + i =lseek (fd, (long )0 ,SEEK_SET ); +if (i <0 ) { +perror ("lseek" ); +exit (1 ); + } i =write (fd, buf, n);if (i <0 ) {perror ("write" );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 97/241 ASoC: imx: fix fiq dependencies
In reply to Greg Kroah-Hartman[ Upstream commit ea751227c813ab833609afecfeedaf0aa26f327e ]
During randconfig builds, I occasionally run into an invalid configuration of the freescale FIQ sound support:
WARNING: unmet direct dependencies detected for SND_SOC_IMX_PCM_FIQ
Depends on [m]: SOUND [=y] && !UML && SND [=y] && SND_SOC [=y] && SND_IMX_SOC [=m]
Selected by [y]:
- SND_SOC_FSL_SPDIF [=y] && SOUND [=y] && !UML && SND [=y] && SND_SOC [=y] && SND_IMX_SOC [=m]!=n && (MXC_TZIC [=n] || MXC_AVIC [=y])
sound/soc/fsl/imx-ssi.o: In function `imx_ssi_remove':
imx-ssi.c:(.text+0x28): undefined reference to imx_pcm_fiq_exit' sound/soc/fsl/imx-ssi.o: In function imx_ssi_probe':
imx-ssi.c:(.text+0xa64): undefined reference to `imx_pcm_fiq_init'
The Kconfig warning is a result of the symbol being defined inside of the "if SND_IMX_SOC" block, and is otherwise harmless. The link error is more tricky and happens with SND_SOC_IMX_SSI=y, which may or may not imply FIQ support. However, if SND_SOC_FSL_SSI is set to =m at the same time, that selects SND_SOC_IMX_PCM_FIQ as a loadable module dependency, which then causes a link failure from imx-ssi.
The solution here is to make SND_SOC_IMX_PCM_FIQ built-in whenever one of its potential users is built-in.
--- sound/soc/fsl/Kconfig | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
sound/soc/fsl/Kconfig +5 -4
@@ -171,16 +171,17 @@ config SND_MPC52xx_SOC_EFIKA endif # SND_POWERPC_SOC +config SND_SOC_IMX_PCM_FIQ + tristate + default y if SND_SOC_IMX_SSI=y && (SND_SOC_FSL_SSI=m || SND_SOC_FSL_SPDIF=m) && (MXC_TZIC || MXC_AVIC) + select FIQ + if SND_IMX_SOC config SND_SOC_IMX_SSI tristate select SND_SOC_FSL_UTILS -config SND_SOC_IMX_PCM_FIQ - tristate - select FIQ - comment "SoC Audio support for Freescale i.MX boards:" config SND_MXC_SOC_WM1133_EV1
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 98/241 spi: pxa2xx: fix SCR (divisor) calculation
In reply to Greg Kroah-Hartman[ Upstream commit 29f2133717c527f492933b0622a4aafe0b3cbe9e ]
Calculate the divisor for the SCR (Serial Clock Rate), avoiding that the SSP transmission rate can be greater than the device rate.
When the division between the SSP clock and the device rate generates a reminder, we have to increment by one the divisor.
In this way the resulting SSP clock will never be greater than the device SPI max frequency.
For example, with:
- ssp_clk = 50 MHz
- dev freq = 15 MHz
without this patch the SSP clock will be greater than 15 MHz:
- 25 MHz for PXA25x_SSP and CE4100_SSP
- 16,56 MHz for the others
Instead, with this patch, we have in both case an SSP clock of 12.5MHz, so the max rate of the SPI device clock is respected.
--- drivers/spi/spi-pxa2xx.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/spi/spi-pxa2xx.c +6 -2
@@ -859,10 +859,14 @@ static unsigned int ssp_get_clk_div(struct driver_data *drv_data, int rate) rate =min_t (int, ssp_clk, rate); +/* +* Calculate the divisor for the SCR (Serial Clock Rate), avoiding +* that the SSP transmission rate can be greater than the device rate +*/ if (ssp->type == PXA25x_SSP || ssp->type ==CE4100_SSP ) -return (ssp_clk / (2 * rate) -1 ) &0xff ; +return (DIV_ROUND_UP (ssp_clk,2 * rate) -1 ) &0xff ;else -return (ssp_clk / rate -1 ) &0xfff ; +return (DIV_ROUND_UP (ssp_clk, rate) -1 ) &0xfff ; } static unsigned int pxa2xx_ssp_get_clk_div(struct driver_data *drv_data,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 99/241 brcm80211: potential NULL dereference in brcmf_cfg80211_vndr_cmds_dcmd_handler()
In reply to Greg Kroah-Hartman[ Upstream commit e025da3d7aa4770bb1d1b3b0aa7cc4da1744852d ]
If "ret_len" is negative then it could lead to a NULL dereference.
The "ret_len" value comes from nl80211_vendor_cmd(), if it's negative then we don't allocate the "dcmd_buf" buffer. Then we pass "ret_len" to brcmf_fil_cmd_data_set() where it is cast to a very high u32 value. Most of the functions in that call tree check whether the buffer we pass is NULL but there are at least a couple places which don't such as brcmf_dbg_hex_dump() and brcmf_msgbuf_query_dcmd(). We memcpy() to and from the buffer so it would result in a NULL dereference.
The fix is to change the types so that "ret_len" can't be negative. (If we memcpy() zero bytes to NULL, that's a no-op and doesn't cause an issue).
--- drivers/net/wireless/brcm80211/brcmfmac/vendor.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/wireless/brcm80211/brcmfmac/vendor.c +3 -2
@@ -35,9 +35,10 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,struct brcmf_if *ifp;const struct brcmf_vndr_dcmd_hdr *cmdhdr = data;struct sk_buff *reply; -int ret, payload, ret_len; +unsigned int payload, ret_len;void *dcmd_buf =NULL , *wr_pointer;u16 msglen, maxmsglen =PAGE_SIZE -0x100 ; +int ret;if (len <sizeof (*cmdhdr)) {brcmf_err ("vendor command too short: %d\n" , len);
@@ -65,7 +66,7 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,brcmf_err ("oversize return buffer %d\n" , ret_len); ret_len =BRCMF_DCMD_MAXLEN ; } - payload =max (ret_len, len) +1 ; + payload = max_t(unsigned int, ret_len, len) + 1; dcmd_buf =vzalloc (payload);if (NULL == dcmd_buf)return -ENOMEM ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 100/241 rtc: 88pm860x: prevent use-after-free on device remove
In reply to Greg Kroah-Hartman[ Upstream commit f22b1ba15ee5785aa028384ebf77dd39e8e47b70 ]
The device's remove() attempts to shut down the delayed_work scheduled on the kernel-global workqueue by calling flush_scheduled_work().
Unfortunately, flush_scheduled_work() does not prevent the delayed_work from re-scheduling itself. The delayed_work might run after the device has been removed, and touch the already de-allocated info structure. This is a potential use-after-free.
Fix by calling cancel_delayed_work_sync() during remove(): this ensures that the delayed work is properly cancelled, is no longer running, and is not able to re-schedule itself.
This issue was detected with the help of Coccinelle.
--- drivers/rtc/rtc-88pm860x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rtc/rtc-88pm860x.c +1 -1
@@ -414,7 +414,7 @@ static int pm860x_rtc_remove(struct platform_device *pdev)struct pm860x_rtc_info *info =platform_get_drvdata (pdev);#ifdef VRTC_CALIBRATION -flush_scheduled_work (); +cancel_delayed_work_sync (&info->calib_work);/* disable measurement */ pm860x_set_bits (info->i2c,PM8607_MEAS_EN2 ,MEAS2_VRTC ,0 );#endif /* VRTC_CALIBRATION */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 101/241 w1: fix the resume command API
In reply to Greg Kroah-Hartman[ Upstream commit 62909da8aca048ecf9fbd7e484e5100608f40a63 ]
Quoted 1 line
From the DS2408 datasheet [1]:
"Resume Command function checks the status of the RC flag and, if it is set,
directly transfers control to the control functions, similar to a Skip ROM command. The only way to set the RC flag is through successfully executing the Match ROM, Search ROM, Conditional Search ROM, or Overdrive-Match ROM command"
The function currently works perfectly fine in a multidrop bus, but when we have only a single slave connected, then only a Skip ROM is used and Match ROM is not called at all. This is leading to problems e.g. with single one DS2408 connected, as the Resume Command is not working properly and the device is responding with failing results after the Resume Command.
This commit is fixing this by using a Skip ROM instead in those cases. The bandwidth / performance advantage is exactly the same.
Refs:
[1] https://datasheets.maximintegrated.com/en/ds/DS2408.pdf
--- drivers/w1/w1_io.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/w1/w1_io.c +1 -2
@@ -437,8 +437,7 @@ int w1_reset_resume_command(struct w1_master *dev)if (w1_reset_bus (dev))return -1 ; -/* This will make only the last matched slave perform a skip ROM. */ -w1_write_8 (dev,W1_RESUME_CMD ); +w1_write_8 (dev, dev->slave_count >1 ?W1_RESUME_CMD :W1_SKIP_ROM );return 0 ; }EXPORT_SYMBOL_GPL (w1_reset_resume_command);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 102/241 dmaengine: pl330: _stop: clear interrupt status
In reply to Greg Kroah-Hartman[ Upstream commit 2da254cc7908105a60a6bb219d18e8dced03dcb9 ]
This patch kill instructs the DMAC to immediately terminate execution of a thread. and then clear the interrupt status, at last, stop generating interrupts for DMA_SEV. to guarantee the next dma start is clean. otherwise, one interrupt maybe leave to next start and make some mistake.
we can reporduce the problem as follows:
DMASEV: modify the event-interrupt resource, and if the INTEN sets function as interrupt, the DMAC will set irq<event_num> HIGH to generate interrupt. write INTCLR to clear interrupt.
DMA EXECUTING INSTRUCTS DMA TERMINATE | | | | ... _stop | | | spin_lock_irqsave DMASEV | | | | mask INTEN | | | DMAKILL | | | spin_unlock_irqrestore
in above case, a interrupt was left, and if we unmask INTEN, the DMAC will set irq<event_num> HIGH to generate interrupt.
to fix this, do as follows:
DMA EXECUTING INSTRUCTS DMA TERMINATE | | | | ... _stop | | | spin_lock_irqsave DMASEV | | | | DMAKILL | | | clear INTCLR | mask INTEN | | | spin_unlock_irqrestore
--- drivers/dma/pl330.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/dma/pl330.c +7 -3
@@ -1006,6 +1006,7 @@ static void _stop(struct pl330_thread *thrd) {void __iomem *regs = thrd->dmac->base;u8 insn[6 ] = {0 ,0 ,0 ,0 ,0 ,0 }; +u32 inten =readl (regs +INTEN );if (_state (thrd) ==PL330_STATE_FAULT_COMPLETING )UNTIL (thrd,PL330_STATE_FAULTING |PL330_STATE_KILLING );
@@ -1018,10 +1019,13 @@ static void _stop(struct pl330_thread *thrd)_emit_KILL (0 , insn); -/* Stop generating interrupts for SEV */ -writel (readl (regs +INTEN ) & ~(1 << thrd->ev), regs +INTEN ); -_execute_DBGINSN (thrd, insn,is_manager (thrd)); + +/* clear the event */ +if (inten & (1 << thrd->ev)) +writel (1 << thrd->ev, regs +INTCLR ); +/* Stop generating interrupts for SEV */ +writel (inten & ~(1 << thrd->ev), regs +INTEN ); }/* Start doing req 'idx' of thread 'thrd' */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 103/241 mac80211/cfg80211: update bss channel on channel switch
In reply to Greg Kroah-Hartman[ Upstream commit 5dc8cdce1d722c733f8c7af14c5fb595cfedbfa8 ]
FullMAC STAs have no way to update bss channel after CSA channel switch completion. As a result, user-space tools may provide inconsistent channel info. For instance, consider the following two commands:
$ sudo iw dev wlan0 link $ sudo iw dev wlan0 info The latter command gets channel info from the hardware, so most probably its output will be correct. However the former command gets channel info from scan cache, so its output will contain outdated channel info. In fact, current bss channel info will not be updated until the next [re-]connect.
Note that mac80211 STAs have a workaround for this, but it requires access to internal cfg80211 data, see ieee80211_chswitch_work:
/* XXX: shouldn't really modify cfg80211-owned data! */ ifmgd->associated->channel = sdata->csa_chandef.chan;
This patch suggests to convert mac80211 workaround into cfg80211 behavior and to update current bss channel in cfg80211_ch_switch_notify.
--- net/mac80211/mlme.c | 3 --- net/wireless/nl80211.c | 5 +++++ 2 files changed, 5 insertions(+), 3 deletions(-)
net/mac80211/mlme.c +0 -3
@@ -1104,9 +1104,6 @@ static void ieee80211_chswitch_work(struct work_struct *work) goto out; } -/* XXX: shouldn't really modify cfg80211-owned data! */ - ifmgd->associated->channel = sdata->csa_chandef.chan; - ifmgd->csa_waiting_bcn = true;ieee80211_sta_reset_beacon_monitor (sdata);
net/wireless/nl80211.c +5 -0
@@ -12788,6 +12788,11 @@ void cfg80211_ch_switch_notify(struct net_device *dev, wdev->chandef = *chandef; wdev->preset_chandef = *chandef; + +if (wdev->iftype ==NL80211_IFTYPE_STATION && + !WARN_ON (!wdev->current_bss)) + wdev->current_bss->pub.channel = chandef->chan; +nl80211_ch_switch_notify (rdev, dev, chandef,GFP_KERNEL ,NL80211_CMD_CH_SWITCH_NOTIFY ,0 ); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 104/241 ASoC: fsl_sai: Update is_slave_mode with correct value
In reply to Greg Kroah-Hartman[ Upstream commit ddb351145a967ee791a0fb0156852ec2fcb746ba ]
is_slave_mode defaults to false because sai structure that contains it is kzalloc'ed.
Anyhow, if we decide to set the following configuration SAI slave -> SAI master, is_slave_mode will remain set on true although SAI being master it should be set to false.
Fix this by updating is_slave_mode for each call of fsl_sai_set_dai_fmt.
--- sound/soc/fsl/fsl_sai.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/fsl/fsl_sai.c +2 -0
@@ -260,12 +260,14 @@ static int fsl_sai_set_dai_fmt_tr(struct snd_soc_dai *cpu_dai,case SND_SOC_DAIFMT_CBS_CFS : val_cr2 |=FSL_SAI_CR2_BCD_MSTR ; val_cr4 |=FSL_SAI_CR4_FSD_MSTR ; + sai->is_slave_mode = false;break ;case SND_SOC_DAIFMT_CBM_CFM : sai->is_slave_mode = true;break ;case SND_SOC_DAIFMT_CBS_CFM : val_cr2 |=FSL_SAI_CR2_BCD_MSTR ; + sai->is_slave_mode = false;break ;case SND_SOC_DAIFMT_CBM_CFS : val_cr4 |=FSL_SAI_CR4_FSD_MSTR ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 105/241 mwifiex: prevent an array overflow
In reply to Greg Kroah-Hartman[ Upstream commit b4c35c17227fe437ded17ce683a6927845f8c4a4 ]
The "rate_index" is only used as an index into the phist_data->rx_rate[] array in the mwifiex_hist_data_set() function. That array has MWIFIEX_MAX_AC_RX_RATES (74) elements and it's used to generate some debugfs information. The "rate_index" variable comes from the network skb->data[] and it is a u8 so it's in the 0-255 range. We need to cap it to prevent an array overflow.
--- drivers/net/wireless/mwifiex/cfp.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/mwifiex/cfp.c +3 -0
@@ -533,5 +533,8 @@ u8 mwifiex_adjust_data_rate(struct mwifiex_private *priv, rate_index = (rx_rate >MWIFIEX_RATE_INDEX_OFDM0 ) ? rx_rate -1 : rx_rate; +if (rate_index >=MWIFIEX_MAX_AC_RX_RATES ) + rate_index =MWIFIEX_MAX_AC_RX_RATES -1 ; +return rate_index; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 106/241 net: cw1200: fix a NULL pointer dereference
In reply to Greg Kroah-Hartman[ Upstream commit 0ed2a005347400500a39ea7c7318f1fea57fb3ca ]
In case create_singlethread_workqueue fails, the fix free the hardware and returns NULL to avoid NULL pointer dereference.
--- drivers/net/wireless/cw1200/main.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/wireless/cw1200/main.c +5 -0
@@ -345,6 +345,11 @@ static struct ieee80211_hw *cw1200_init_common(const u8 *macaddr,mutex_init (&priv->wsm_cmd_mux);mutex_init (&priv->conf_mutex); priv->workqueue =create_singlethread_workqueue ("cw1200_wq" ); +if (!priv->workqueue) { +ieee80211_free_hw (hw); +return NULL ; + } +sema_init (&priv->scan.lock,1 );INIT_WORK (&priv->scan.work, cw1200_scan_work);INIT_DELAYED_WORK (&priv->scan.probe_work, cw1200_probe_work);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 107/241 bcache: return error immediately in bch_journal_replay()
In reply to Greg Kroah-Hartman[ Upstream commit 68d10e6979a3b59e3cd2e90bfcafed79c4cf180a ]
When failure happens inside bch_journal_replay(), calling cache_set_err_on() and handling the failure in async way is not a good idea. Because after bch_journal_replay() returns, registering code will continue to execute following steps, and unregistering code triggered by cache_set_err_on() is running in same time. First it is unnecessary to handle failure and unregister cache set in an async way, second there might be potential race condition to run register and unregister code for same cache set.
So in this patch, if failure happens in bch_journal_replay(), we don't call cache_set_err_on(), and just print out the same error message to kernel message buffer, then return -EIO immediately caller. Then caller can detect such failure and handle it in synchrnozied way.
--- drivers/md/bcache/journal.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/md/bcache/journal.c +6 -3
@@ -322,9 +322,12 @@ int bch_journal_replay(struct cache_set *s, struct list_head *list)list_for_each_entry (i, list, list) {BUG_ON (i->pin &&atomic_read (i->pin) !=1 ); -cache_set_err_on (n != i->j.seq, s, -"bcache: journal entries %llu-%llu missing! (replaying %llu-%llu)" , - n, i->j.seq -1 , start, end); +if (n != i->j.seq) { +pr_err ("bcache: journal entries %llu-%llu missing! (replaying %llu-%llu)" , + n, i->j.seq -1 , start, end); + ret = -EIO ; + goto err; + } for (k = i->j.start; k < bset_bkey_last(&i->j);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 108/241 bcache: fix failure in journal relplay
In reply to Greg Kroah-Hartman[ Upstream commit 631207314d88e9091be02fbdd1fdadb1ae2ed79a ]
journal replay failed with messages:
Sep 10 19:10:43 ceph kernel: bcache: error on
bb379a64-e44e-4812-b91d-a5599871a3b1: bcache: journal entries 2057493-2057567 missing! (replaying 2057493-2076601), disabling caching
The reason is in journal_reclaim(), when discard is enabled, we send discard command and reclaim those journal buckets whose seq is old than the last_seq_now, but before we write a journal with last_seq_now, the machine is restarted, so the journal with the last_seq_now is not written to the journal bucket, and the last_seq_wrote in the newest journal is old than last_seq_now which we expect to be, so when we doing replay, journals from last_seq_wrote to last_seq_now are missing.
It's hard to write a journal immediately after journal_reclaim(), and it harmless if those missed journal are caused by discarding since those journals are already wrote to btree node. So, if miss seqs are started from the beginning journal, we treat it as normal, and only print a message to show the miss journal, and point out it maybe caused by discarding.
Patch v2 add a judgement condition to ignore the missed journal only when discard enabled as Coly suggested.
(Coly Li: rebase the patch with other changes in bch_journal_replay())
--- drivers/md/bcache/journal.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-)
drivers/md/bcache/journal.c +21 -4
@@ -309,6 +309,18 @@ void bch_journal_mark(struct cache_set *c, struct list_head *list) } } +bool is_discard_enabled (struct cache_set *s) +{ +struct cache *ca; +unsigned int i; + +for_each_cache (ca, s, i) +if (ca->discard) +return true; + +return false; +} +int bch_journal_replay (struct cache_set *s,struct list_head *list) {int ret =0 , keys =0 , entries =0 ;
@@ -323,10 +335,15 @@ int bch_journal_replay(struct cache_set *s, struct list_head *list)BUG_ON (i->pin &&atomic_read (i->pin) !=1 );if (n != i->j.seq) { -pr_err ("bcache: journal entries %llu-%llu missing! (replaying %llu-%llu)" , - n, i->j.seq -1 , start, end); - ret = -EIO ; - goto err; +if (n == start &&is_discard_enabled (s)) +pr_info ("bcache: journal entries %llu-%llu may be discarded! (replaying %llu-%llu)" , + n, i->j.seq -1 , start, end); +else { +pr_err ("bcache: journal entries %llu-%llu missing! (replaying %llu-%llu)" , + n, i->j.seq -1 , start, end); + ret = -EIO ; + goto err; + } } for (k = i->j.start;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 109/241 bcache: add failure check to run_cache_set() for journal replay
In reply to Greg Kroah-Hartman[ Upstream commit ce3e4cfb59cb382f8e5ce359238aa580d4ae7778 ]
Currently run_cache_set() has no return value, if there is failure in bch_journal_replay(), the caller of run_cache_set() has no idea about such failure and just continue to execute following code after run_cache_set(). The internal failure is triggered inside bch_journal_replay() and being handled in async way. This behavior is inefficient, while failure handling inside bch_journal_replay(), cache register code is still running to start the cache set. Registering and unregistering code running as same time may introduce some rare race condition, and make the code to be more hard to be understood.
This patch adds return value to run_cache_set(), and returns -EIO if bch_journal_rreplay() fails. Then caller of run_cache_set() may detect such failure and stop registering code flow immedidately inside register_cache_set().
If journal replay fails, run_cache_set() can report error immediately to register_cache_set(). This patch makes the failure handling for bch_journal_replay() be in synchronized way, easier to understand and debug, and avoid poetential race condition for register-and-unregister in same time.
--- drivers/md/bcache/super.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
drivers/md/bcache/super.c +12 -5
@@ -1558,7 +1558,7 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)return NULL ; } -static void run_cache_set (struct cache_set *c) +static int run_cache_set (struct cache_set *c) {const char *err ="cannot allocate memory" ;struct cached_dev *dc, *t;
@@ -1650,7 +1650,9 @@ static void run_cache_set(struct cache_set *c)if (j->version <BCACHE_JSET_VERSION_UUID )__uuid_write (c); -bch_journal_replay (c, &journal); + err ="bcache: replay journal failed" ; +if (bch_journal_replay (c, &journal)) + goto err; }else {pr_notice ("invalidating existing data" );
@@ -1718,11 +1720,13 @@ static void run_cache_set(struct cache_set *c)flash_devs_run (c);set_bit (CACHE_SET_RUNNING , &c->flags); -return ; +return 0 ; err:closure_sync (&cl);/* XXX: test this, it's broken */ bch_cache_set_error (c,"%s" , err); + +return -EIO ; }static bool can_attach_cache (struct cache *ca,struct cache_set *c)
@@ -1786,8 +1790,11 @@ static const char *register_cache_set(struct cache *ca) ca->set->cache[ca->sb.nr_this_dev] = ca; c->cache_by_alloc[c->caches_loaded++] = ca; -if (c->caches_loaded == c->sb.nr_in_set) -run_cache_set (c); +if (c->caches_loaded == c->sb.nr_in_set) { + err ="failed to run cache set" ; +if (run_cache_set (c) <0 ) + goto err; + }return NULL ; err:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 110/241 bcache: avoid clang -Wunintialized warning
In reply to Greg Kroah-Hartman[ Upstream commit 78d4eb8ad9e1d413449d1b7a060f50b6efa81ebd ]
clang has identified a code path in which it thinks a variable may be unused:
drivers/md/bcache/alloc.c:333:4: error: variable 'bucket' is used uninitialized whenever 'if' condition is false
[-Werror,-Wsometimes-uninitialized]
fifo_pop(&ca->free_inc, bucket);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'
#define fifo_pop(fifo, i) fifo_pop_front(fifo, (i))
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/bcache/util.h:189:6: note: expanded from macro 'fifo_pop_front'
if (_r) { \
^~
drivers/md/bcache/alloc.c:343:46: note: uninitialized use occurs here
allocator_wait(ca, bch_allocator_push(ca, bucket));
^~~~~~
drivers/md/bcache/alloc.c:287:7: note: expanded from macro 'allocator_wait'
if (cond) \
^~~~
drivers/md/bcache/alloc.c:333:4: note: remove the 'if' if its condition is always true
fifo_pop(&ca->free_inc, bucket);
^
drivers/md/bcache/util.h:219:27: note: expanded from macro 'fifo_pop'
#define fifo_pop(fifo, i) fifo_pop_front(fifo, (i))
^
drivers/md/bcache/util.h:189:2: note: expanded from macro 'fifo_pop_front'
if (_r) { \
^
drivers/md/bcache/alloc.c:331:15: note: initialize the variable 'bucket' to silence this warning
long bucket;
^This cannot happen in practice because we only enter the loop if there is at least one element in the list.
Slightly rearranging the code makes this clearer to both the reader and the compiler, which avoids the warning.
--- drivers/md/bcache/alloc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/md/bcache/alloc.c +3 -2
@@ -324,10 +324,11 @@ static int bch_allocator_thread(void *arg)* possibly issue discards to them, then we add the bucket to * the free list: */ -while (!fifo_empty (&ca->free_inc)) { +while (1 ) {long bucket; -fifo_pop (&ca->free_inc, bucket); +if (!fifo_pop (&ca->free_inc, bucket)) +break ;if (ca->discard) {mutex_unlock (&ca->set->bucket_lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 111/241 x86/build: Move _etext to actual end of .text
In reply to Greg Kroah-Hartman[ Upstream commit 392bef709659abea614abfe53cf228e7a59876a4 ]
When building x86 with Clang LTO and CFI, CFI jump regions are automatically added to the end of the .text section late in linking. As a result, the _etext position was being labelled before the appended jump regions, causing confusion about where the boundaries of the executable region actually are in the running kernel, and broke at least the fault injection code. This moves the _etext mark to outside (and immediately after) the .text area, as it already the case on other architectures (e.g. arm64, arm).
--- arch/x86/kernel/vmlinux.lds.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/x86/kernel/vmlinux.lds.S +3 -3
@@ -110,11 +110,11 @@ SECTIONS *(.text.__x86.indirect_thunk) __indirect_thunk_end = .; #endif - - /* End of text section */ - _etext = .; } :text = 0x9090 + /* End of text section */ + _etext = .; + NOTES :text :note EXCEPTION_TABLE(16) :text = 0x9090
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 112/241 smpboot: Place the __percpu annotation correctly
In reply to Greg Kroah-Hartman[ Upstream commit d4645d30b50d1691c26ff0f8fa4e718b08f8d3bb ]
The test robot reported a wrong assignment of a per-CPU variable which it detected by using sparse and sent a report. The assignment itself is correct. The annotation for sparse was wrong and hence the report. The first pointer is a "normal" pointer and points to the per-CPU memory area. That means that the __percpu annotation has to be moved.
Move the __percpu annotation to pointer which points to the per-CPU area. This change affects only the sparse tool (and is ignored by the compiler).
--- include/linux/smpboot.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/smpboot.h +1 -1
@@ -30,7 +30,7 @@ struct smpboot_thread_data;* @thread_comm: The base name of the thread */ struct smp_hotplug_thread { -struct task_struct __percpu **store; +struct task_struct *__percpu *store;struct list_head list;int (*thread_should_run)(unsigned int cpu);void (*thread_fn)(unsigned int cpu);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 113/241 x86/mm: Remove in_nmi() warning from 64-bit implementation of vmalloc_fault()
In reply to Greg Kroah-Hartman[ Upstream commit a65c88e16f32aa9ef2e8caa68ea5c29bd5eb0ff0 ]
In-NMI warnings have been added to vmalloc_fault() via:
ebc8827f75 ("x86: Barf when vmalloc and kmemcheck faults happen in NMI")
back in the time when our NMI entry code could not cope with nested NMIs.
These days, it's perfectly fine to take a fault in NMI context and we don't have to care about the fact that IRET from the fault handler might cause NMI nesting.
This warning has already been removed from 32-bit implementation of vmalloc_fault() in:
6863ea0cda8 ("x86/mm: Remove in_nmi() warning from vmalloc_fault()")
but the 64-bit version was omitted.
Remove the bogus warning also from 64-bit implementation of vmalloc_fault().
--- arch/x86/mm/fault.c | 2 -- 1 file changed, 2 deletions(-)
arch/x86/mm/fault.c +0 -2
@@ -373,8 +373,6 @@ static noinline int vmalloc_fault(unsigned long address)if (!(address >=VMALLOC_START && address <VMALLOC_END ))return -1 ; -WARN_ON_ONCE (in_nmi ()); -/* * Copy kernel mappings over when needed. This can also * happen within a race in page table update. In the later
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 114/241 mm/uaccess: Use unsigned long to placate UBSAN warnings on older GCC versions
In reply to Greg Kroah-Hartman[ Upstream commit 29da93fea3ea39ab9b12270cc6be1b70ef201c9e ]
Randy reported objtool triggered on his (GCC-7.4) build:
lib/strncpy_from_user.o: warning: objtool: strncpy_from_user()+0x315: call to __ubsan_handle_add_overflow() with UACCESS enabled lib/strnlen_user.o: warning: objtool: strnlen_user()+0x337: call to __ubsan_handle_sub_overflow() with UACCESS enabled
This is due to UBSAN generating signed-overflow-UB warnings where it should not. Prior to GCC-8 UBSAN ignored -fwrapv (which the kernel uses through -fno-strict-overflow).
Make the functions use 'unsigned long' throughout.
--- lib/strncpy_from_user.c | 5 +++-- lib/strnlen_user.c | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-)
lib/strncpy_from_user.c +3 -2
@@ -20,10 +20,11 @@* hit it), 'max' is the address space maximum (and we return * -EFAULT if we hit it). */ -static inline long do_strncpy_from_user (char *dst,const char __user *src,long count,unsigned long max) +static inline long do_strncpy_from_user (char *dst,const char __user *src, +unsigned long count,unsigned long max) {const struct word_at_a_time constants =WORD_AT_A_TIME_CONSTANTS ; -long res =0 ; +unsigned long res =0 ;/* * Truncate 'max' to the user-specified limit, so that
lib/strnlen_user.c +2 -2
@@ -27,7 +27,7 @@static inline long do_strnlen_user (const char __user *src,unsigned long count,unsigned long max) {const struct word_at_a_time constants =WORD_AT_A_TIME_CONSTANTS ; -long align, res =0 ; +unsigned long align, res =0 ;unsigned long c;/*
@@ -41,7 +41,7 @@ static inline long do_strnlen_user(const char __user *src, unsigned long count,* Do everything aligned. But that means that we * need to also expand the maximum.. */ - align = (sizeof (long ) -1 ) & (unsigned long )src; + align = (sizeof (unsigned long ) -1 ) & (unsigned long )src; src -= align; max += align;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 115/241 HID: logitech-hidpp: use RAP instead of FAP to get the protocol version
In reply to Greg Kroah-Hartman[ Upstream commit 096377525cdb8251e4656085efc988bdf733fb4c ]
According to the logitech_hidpp_2.0_specification_draft_2012-06-04.pdf doc:
https://lekensteyn.nl/files/logitech/logitech_hidpp_2.0_specification_draft_2012-06-04.pdf
We should use a register-access-protocol request using the short input / output report ids. This is necessary because 27MHz HID++ receivers have a max-packetsize on their HIP++ endpoint of 8, so they cannot support long reports. Using a feature-access-protocol request (which is always long or very-long) with these will cause a timeout error, followed by the hidpp driver treating the device as not being HID++ capable.
This commit fixes this by switching to using a rap request to get the protocol version.
Besides being tested with a (046d:c517) 27MHz receiver with various 27MHz keyboards and mice, this has also been tested to not cause regressions on a non-unifying dual-HID++ nano receiver (046d:c534) with k270 and m185 HID++-2.0 devices connected and on a unifying/dj receiver (046d:c52b) with a HID++-2.0 Logitech Rechargeable Touchpad T650.
--- drivers/hid/hid-logitech-hidpp.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/hid/hid-logitech-hidpp.c +13 -4
@@ -414,13 +414,16 @@ static int hidpp_root_get_feature(struct hidpp_device *hidpp, u16 feature,static int hidpp_root_get_protocol_version (struct hidpp_device *hidpp) { +const u8 ping_byte =0x5a ; +u8 ping_data[3 ] = {0 ,0 , ping_byte };struct hidpp_report response;int ret; - ret =hidpp_send_fap_command_sync (hidpp, + ret =hidpp_send_rap_command_sync (hidpp, +REPORT_ID_HIDPP_SHORT ,HIDPP_PAGE_ROOT_IDX ,CMD_ROOT_GET_PROTOCOL_VERSION , -NULL ,0 , &response); + ping_data,sizeof (ping_data), &response);if (ret ==HIDPP_ERROR_INVALID_SUBID ) { hidpp->protocol_major =1 ;
@@ -440,8 +443,14 @@ static int hidpp_root_get_protocol_version(struct hidpp_device *hidpp)if (ret)return ret; - hidpp->protocol_major = response.fap.params[0 ]; - hidpp->protocol_minor = response.fap.params[1 ]; +if (response.rap.params[2 ] != ping_byte) { +hid_err (hidpp->hid_dev,"%s: ping mismatch 0x%02x != 0x%02x\n" , + __func__, response.rap.params[2 ], ping_byte); +return -EPROTO ; + } + + hidpp->protocol_major = response.rap.params[0 ]; + hidpp->protocol_minor = response.rap.params[1 ];return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 116/241 pinctrl: pistachio: fix leaked of_node references
In reply to Greg Kroah-Hartman[ Upstream commit 44a4455ac2c6b0981eace683a2b6eccf47689022 ]
The call to of_get_child_by_name returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage.
Detected by coccinelle with the following warnings:
./drivers/pinctrl/pinctrl-pistachio.c:1422:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 1360, but without a corresponding object release within this function.
--- drivers/pinctrl/pinctrl-pistachio.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pinctrl/pinctrl-pistachio.c +2 -0
@@ -1373,6 +1373,7 @@ static int pistachio_gpio_register(struct pistachio_pinctrl *pctl)if (!of_find_property (child,"gpio-controller" ,NULL )) {dev_err (pctl->dev,"No gpio-controller property for bank %u\n" , i); +of_node_put (child); ret = -ENODEV ; goto err; }
@@ -1380,6 +1381,7 @@ static int pistachio_gpio_register(struct pistachio_pinctrl *pctl) irq =irq_of_parse_and_map (child,0 );if (irq <0 ) {dev_err (pctl->dev,"No IRQ for bank %u: %d\n" , i, irq); +of_node_put (child); ret = irq; goto err; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 117/241 dmaengine: at_xdmac: remove BUG_ON macro in tasklet
In reply to Greg Kroah-Hartman[ Upstream commit e2c114c06da2d9ffad5b16690abf008d6696f689 ]
Even if this case shouldn't happen when controller is properly programmed, it's still better to avoid dumping a kernel Oops for this.
As the sequence may happen only for debugging purposes, log the error and just finish the tasklet call.
--- drivers/dma/at_xdmac.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/dma/at_xdmac.c +5 -1
@@ -1608,7 +1608,11 @@ static void at_xdmac_tasklet(unsigned long data) struct at_xdmac_desc, xfer_node);dev_vdbg (chan2dev (&atchan->chan),"%s: desc 0x%p\n" , __func__, desc); -BUG_ON (!desc->active_xfer); +if (!desc->active_xfer) { +dev_err (chan2dev (&atchan->chan),"Xfer not active: exiting" ); +spin_unlock_bh (&atchan->lock); +return ; + } txd = &desc->tx_dma_desc;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 118/241 media: coda: clear error return value before picture run
In reply to Greg Kroah-Hartman[ Upstream commit bbeefa7357a648afe70e7183914c87c3878d528d ]
The error return value is not written by some firmware codecs, such as MPEG-2 decode on CodaHx4. Clear the error return value before starting the picture run to avoid misinterpreting unrelated values returned by sequence initialization as error return value.
--- drivers/media/platform/coda/coda-bit.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/media/platform/coda/coda-bit.c +3 -0
@@ -1829,6 +1829,9 @@ static int coda_prepare_decode(struct coda_ctx *ctx)/* Clear decode success flag */ coda_write (dev,0 ,CODA_RET_DEC_PIC_SUCCESS ); +/* Clear error return value */ +coda_write (dev,0 ,CODA_RET_DEC_PIC_ERR_MB ); +trace_coda_dec_pic_run (ctx, meta);coda_command_async (ctx,CODA_COMMAND_PIC_RUN );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 119/241 media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
In reply to Greg Kroah-Hartman[ Upstream commit ccdd85d518d8b9320ace1d87271f0ba2175f21fa ]
In preparation for adding asynchronous subdevice support to the driver, don't acquire v4l2_clk from the driver .probe() callback as that may fail if the clock is provided by a bridge driver which may be not yet initialized. Move the v4l2_clk_get() to ov6650_video_probe() helper which is going to be converted to v4l2_subdev_internal_ops.registered() callback, executed only when the bridge driver is ready.
--- drivers/media/i2c/soc_camera/ov6650.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-)
drivers/media/i2c/soc_camera/ov6650.c +14 -11
@@ -839,9 +839,16 @@ static int ov6650_video_probe(struct i2c_client *client)u8 pidh, pidl, midh, midl;int ret; + priv->clk =v4l2_clk_get (&client->dev,NULL ); +if (IS_ERR (priv->clk)) { + ret =PTR_ERR (priv->clk); +dev_err (&client->dev,"v4l2_clk request err: %d\n" , ret); +return ret; + } + ret =ov6650_s_power (&priv->subdev,1 );if (ret <0 ) -return ret; + goto eclkput;msleep (20 );
@@ -878,6 +885,11 @@ static int ov6650_video_probe(struct i2c_client *client) done:ov6650_s_power (&priv->subdev,0 ); +if (!ret) +return 0 ; +eclkput: +v4l2_clk_put (priv->clk); +return ret; }
@@ -1035,18 +1047,9 @@ static int ov6650_probe(struct i2c_client *client, priv->code =MEDIA_BUS_FMT_YUYV8_2X8 ; priv->colorspace =V4L2_COLORSPACE_JPEG ; - priv->clk =v4l2_clk_get (&client->dev,NULL ); -if (IS_ERR (priv->clk)) { - ret =PTR_ERR (priv->clk); - goto eclkget; - } - ret =ov6650_video_probe (client); -if (ret) { -v4l2_clk_put (priv->clk); -eclkget: +if (ret)v4l2_ctrl_handler_free (&priv->hdl); - }return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 120/241 media: au0828: stop video streaming only when last user stops
In reply to Greg Kroah-Hartman[ Upstream commit f604f0f5afb88045944567f604409951b5eb6af8 ]
If the application was streaming from both videoX and vbiX, and streaming from videoX was stopped, then the vbi streaming also stopped.
The cause being that stop_streaming for video stopped the subdevs as well, instead of only doing that if dev->streaming_users reached 0.
au0828_stop_vbi_streaming was also wrong since it didn't stop the subdevs at all when dev->streaming_users reached 0.
--- drivers/media/usb/au0828/au0828-video.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/media/usb/au0828/au0828-video.c +8 -5
@@ -799,9 +799,9 @@ int au0828_start_analog_streaming(struct vb2_queue *vq, unsigned int count)return rc; } +v4l2_device_call_all (&dev->v4l2_dev,0 , video, s_stream,1 ); +if (vq->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE ) { -v4l2_device_call_all (&dev->v4l2_dev,0 , video, - s_stream,1 ); dev->vid_timeout_running =1 ;mod_timer (&dev->vid_timeout, jiffies + (HZ /10 )); }else if (vq->type ==V4L2_BUF_TYPE_VBI_CAPTURE ) {
@@ -821,10 +821,11 @@ static void au0828_stop_streaming(struct vb2_queue *vq)dprintk (1 ,"au0828_stop_streaming called %d\n" , dev->streaming_users); -if (dev->streaming_users-- ==1 ) +if (dev->streaming_users-- ==1 ) {au0828_uninit_isoc (dev); +v4l2_device_call_all (&dev->v4l2_dev,0 , video, s_stream,0 ); + } -v4l2_device_call_all (&dev->v4l2_dev,0 , video, s_stream,0 ); dev->vid_timeout_running =0 ;del_timer_sync (&dev->vid_timeout);
@@ -853,8 +854,10 @@ void au0828_stop_vbi_streaming(struct vb2_queue *vq)dprintk (1 ,"au0828_stop_vbi_streaming called %d\n" , dev->streaming_users); -if (dev->streaming_users-- ==1 ) +if (dev->streaming_users-- ==1 ) {au0828_uninit_isoc (dev); +v4l2_device_call_all (&dev->v4l2_dev,0 , video, s_stream,0 ); + }spin_lock_irqsave (&dev->slock, flags);if (dev->isoc_ctl.vbi_buf !=NULL ) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 121/241 media: ov2659: make S_FMT succeed even if requested format doesnt match
In reply to Greg Kroah-Hartman[ Upstream commit bccb89cf9cd07a0690d519696a00c00a973b3fe4 ]
This driver returns an error if unsupported media bus pixel code is requested by VIDIOC_SUBDEV_S_FMT.
But according to Documentation/media/uapi/v4l/vidioc-subdev-g-fmt.rst,
Drivers must not return an error solely because the requested format doesn't match the device capabilities. They must instead modify the format to match what the hardware can provide.
So select default format code and return success in that case.
This is detected by v4l2-compliance.
--- drivers/media/i2c/ov2659.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/media/i2c/ov2659.c +4 -2
@@ -1117,8 +1117,10 @@ static int ov2659_set_fmt(struct v4l2_subdev *sd,if (ov2659_formats[index].code == mf->code)break ; -if (index <0 ) -return -EINVAL ; +if (index <0 ) { + index =0 ; + mf->code = ov2659_formats[index].code; + } mf->colorspace =V4L2_COLORSPACE_SRGB ; mf->code = ov2659_formats[index].code;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 122/241 audit: fix a memory leak bug
In reply to Greg Kroah-Hartman[ Upstream commit 70c4cf17e445264453bc5323db3e50aa0ac9e81f ]
In audit_rule_change(), audit_data_to_entry() is firstly invoked to translate the payload data to the kernel's rule representation. In audit_data_to_entry(), depending on the audit field type, an audit tree may be created in audit_make_tree(), which eventually invokes kmalloc() to allocate the tree. Since this tree is a temporary tree, it will be then freed in the following execution, e.g., audit_add_rule() if the message type is AUDIT_ADD_RULE or audit_del_rule() if the message type is AUDIT_DEL_RULE. However, if the message type is neither AUDIT_ADD_RULE nor AUDIT_DEL_RULE, i.e., the default case of the switch statement, this temporary tree is not freed.
To fix this issue, only allocate the tree when the type is AUDIT_ADD_RULE or AUDIT_DEL_RULE.
--- kernel/auditfilter.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
kernel/auditfilter.c +7 -5
@@ -1095,22 +1095,24 @@ int audit_rule_change(int type, __u32 portid, int seq, void *data,int err =0 ;struct audit_entry *entry; - entry =audit_data_to_entry (data, datasz); -if (IS_ERR (entry)) -return PTR_ERR (entry); -switch (type) {case AUDIT_ADD_RULE : + entry =audit_data_to_entry (data, datasz); +if (IS_ERR (entry)) +return PTR_ERR (entry); err =audit_add_rule (entry);audit_log_rule_change ("add_rule" , &entry->rule, !err);break ;case AUDIT_DEL_RULE : + entry =audit_data_to_entry (data, datasz); +if (IS_ERR (entry)) +return PTR_ERR (entry); err =audit_del_rule (entry);audit_log_rule_change ("remove_rule" , &entry->rule, !err);break ;default : - err = -EINVAL ;WARN_ON (1 ); +return -EINVAL ; }if (err || type ==AUDIT_DEL_RULE ) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 123/241 media: au0828: Fix NULL pointer dereference in au0828_analog_stream_enable()
In reply to Greg Kroah-Hartman[ Upstream commit 898bc40bfcc26abb6e06e960d6d4754c36c58b50 ]
Fix au0828_analog_stream_enable() to check if device is in the right state first. When unbind happens while bind is in progress, usbdev pointer could be invalid in au0828_analog_stream_enable() and a call to usb_ifnum_to_if() will result in the null pointer dereference.
This problem is found with the new media_dev_allocator.sh test.
kernel: [ 590.359623] BUG: unable to handle kernel NULL pointer dereference at 00000000000004e8
kernel: [ 590.359627] #PF error: [normal kernel read fault]
kernel: [ 590.359629] PGD 0 P4D 0
kernel: [ 590.359632] Oops: 0000 [#1] SMP PTI
kernel: [ 590.359634] CPU: 3 PID: 1458 Comm: v4l_id Not tainted 5.1.0-rc2+ #30
kernel: [ 590.359636] Hardware name: Dell Inc. OptiPlex 7 90/0HY9JP, BIOS A18 09/24/2013
kernel: [ 590.359641] RIP: 0010:usb_ifnum_to_if+0x6/0x60
kernel: [ 590.359643] Code: 5d 41 5e 41 5f 5d c3 48 83 c4
10 b8 fa ff ff ff 5b 41 5c 41 5d 41 5e 41 5f 5d c3 b8 fa ff ff ff c3 0f 1f 00 6
6 66 66 66 90 55 <48> 8b 97 e8 04 00 00 48 89 e5 48 85 d2 74 41 0f b6 4a 04 84 c
9 74
kernel: [ 590.359645] RSP: 0018:ffffad3cc3c1fc00 EFLAGS: 00010246
kernel: [ 590.359646] RAX: 0000000000000000 RBX: ffff8ded b1f3c000 RCX: 1f377e4500000000
kernel: [ 590.359648] RDX: ffff8dedfa3a6b50 RSI: 00000000 00000000 RDI: 0000000000000000
kernel: [ 590.359649] RBP: ffffad3cc3c1fc28 R08: 00000000 8574acc2 R09: ffff8dedfa3a6b50
kernel: [ 590.359650] R10: 0000000000000001 R11: 00000000 00000000 R12: 0000000000000000
kernel: [ 590.359652] R13: ffff8dedb1f3f0f0 R14: ffffffff adcf7ec0 R15: 0000000000000000
kernel: [ 590.359654] FS: 00007f7917198540(0000) GS:ffff 8dee258c0000(0000) knlGS:0000000000000000
kernel: [ 590.359655] CS: 0010 DS: 0000 ES: 0000 CR0: 00 00000080050033
kernel: [ 590.359657] CR2: 00000000000004e8 CR3: 00000001 a388e002 CR4: 00000000000606e0
kernel: [ 590.359658] Call Trace:
kernel: [ 590.359664] ? au0828_analog_stream_enable+0x2c/0x180
kernel: [ 590.359666] au0828_v4l2_open+0xa4/0x110
kernel: [ 590.359670] v4l2_open+0x8b/0x120
kernel: [ 590.359674] chrdev_open+0xa6/0x1c0
kernel: [ 590.359676] ? cdev_put.part.3+0x20/0x20
kernel: [ 590.359678] do_dentry_open+0x1f6/0x360
kernel: [ 590.359681] vfs_open+0x2f/0x40
kernel: [ 590.359684] path_openat+0x299/0xc20
kernel: [ 590.359688] do_filp_open+0x9b/0x110
kernel: [ 590.359695] ? _raw_spin_unlock+0x27/0x40
kernel: [ 590.359697] ? __alloc_fd+0xb2/0x160
kernel: [ 590.359700] do_sys_open+0x1ba/0x260
kernel: [ 590.359702] ? do_sys_open+0x1ba/0x260
kernel: [ 590.359712] __x64_sys_openat+0x20/0x30
kernel: [ 590.359715] do_syscall_64+0x5a/0x120
kernel: [ 590.359718] entry_SYSCALL_64_after_hwframe+0x44/0xa9
--- drivers/media/usb/au0828/au0828-video.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/media/usb/au0828/au0828-video.c +3 -0
@@ -711,6 +711,9 @@ static int au0828_analog_stream_enable(struct au0828_dev *d)dprintk (1 ,"au0828_analog_stream_enable called\n" ); +if (test_bit (DEV_DISCONNECTED , &d->dev_state)) +return -ENODEV ; + iface =usb_ifnum_to_if (d->usbdev,0 );if (iface && iface->cur_altsetting->desc.bAlternateSetting !=5 ) {dprintk (1 ,"Changing intf#0 to alt 5\n" );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 124/241 media: pvrusb2: Prevent a buffer overflow
In reply to Greg Kroah-Hartman[ Upstream commit c1ced46c7b49ad7bc064e68d966e0ad303f917fb ]
The ctrl_check_input() function is called from pvr2_ctrl_range_check(). It's supposed to validate user supplied input and return true or false depending on whether the input is valid or not. The problem is that negative shifts or shifts greater than 31 are undefined in C. In practice with GCC they result in shift wrapping so this function returns true for some inputs which are not valid and this could result in a buffer overflow:
drivers/media/usb/pvrusb2/pvrusb2-ctrl.c:205 pvr2_ctrl_get_valname()
warn: uncapped user index 'names[val]'
The cptr->hdw->input_allowed_mask mask is configured in pvr2_hdw_create() and the highest valid bit is BIT(4).
--- drivers/media/usb/pvrusb2/pvrusb2-hdw.c | 2 ++ drivers/media/usb/pvrusb2/pvrusb2-hdw.h | 1 + 2 files changed, 3 insertions(+)
drivers/media/usb/pvrusb2/pvrusb2-hdw.c +2 -0
@@ -670,6 +670,8 @@ static int ctrl_get_input(struct pvr2_ctrl *cptr,int *vp)static int ctrl_check_input (struct pvr2_ctrl *cptr,int v) { +if (v <0 || v >PVR2_CVAL_INPUT_MAX ) +return 0 ;return ((1 << v) & cptr->hdw->input_allowed_mask) !=0 ; }
drivers/media/usb/pvrusb2/pvrusb2-hdw.h +1 -0
@@ -54,6 +54,7 @@#define PVR2_CVAL_INPUT_COMPOSITE 2#define PVR2_CVAL_INPUT_SVIDEO 3#define PVR2_CVAL_INPUT_RADIO 4 +#define PVR2_CVAL_INPUT_MAX PVR2_CVAL_INPUT_RADIOenum pvr2_config { pvr2_config_empty,/* No configuration */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 125/241 powerpc/numa: improve control of topology updates
In reply to Greg Kroah-Hartman[ Upstream commit 2d4d9b308f8f8dec68f6dbbff18c68ec7c6bd26f ]
When booted with "topology_updates=no", or when "off" is written to /proc/powerpc/topology_updates, NUMA reassignments are inhibited for PRRN and VPHN events. However, migration and suspend unconditionally re-enable reassignments via start_topology_update(). This is incoherent.
Check the topology_updates_enabled flag in start/stop_topology_update() so that callers of those APIs need not be aware of whether reassignments are enabled. This allows the administrative decision on reassignments to remain in force across migrations and suspensions.
--- arch/powerpc/mm/numa.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
arch/powerpc/mm/numa.c +12 -6
@@ -1611,6 +1611,9 @@ int start_topology_update(void) {int rc =0 ; +if (!topology_updates_enabled) +return 0 ; +if (firmware_has_feature (FW_FEATURE_PRRN )) {if (!prrn_enabled) { prrn_enabled =1 ;
@@ -1640,6 +1643,9 @@ int stop_topology_update(void) {int rc =0 ; +if (!topology_updates_enabled) +return 0 ; +if (prrn_enabled) { prrn_enabled =0 ;#ifdef CONFIG_SMP
@@ -1685,11 +1691,13 @@ static ssize_t topology_write(struct file *file, const char __user *buf, kbuf[read_len] ='\0' ; -if (!strncmp (kbuf,"on" ,2 )) +if (!strncmp (kbuf,"on" ,2 )) { + topology_updates_enabled = true;start_topology_update (); -else if (!strncmp (kbuf,"off" ,3 )) + }else if (!strncmp (kbuf,"off" ,3 )) {stop_topology_update (); -else + topology_updates_enabled = false; + }else return -EINVAL ;return count;
@@ -1704,9 +1712,7 @@ static const struct file_operations topology_ops = {static int topology_update_init (void ) { -/* Do not poll for changes if disabled at boot */ -if (topology_updates_enabled) -start_topology_update (); +start_topology_update ();if (!proc_create ("powerpc/topology_updates" ,0644 ,NULL , &topology_ops))return -ENOMEM ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 126/241 sched/core: Check quota and period overflow at usec to nsec conversion
In reply to Greg Kroah-Hartman[ Upstream commit 1a8b4540db732ca16c9e43ac7c08b1b8f0b252d8 ]
Large values could overflow u64 and pass following sanity checks.
# echo 18446744073750000 > cpu.cfs_period_us # cat cpu.cfs_period_us 40448
# echo 18446744073750000 > cpu.cfs_quota_us # cat cpu.cfs_quota_us 40448
After this patch they will fail with -EINVAL.
--- kernel/sched/core.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
kernel/sched/core.c +6 -1
@@ -8460,8 +8460,10 @@ int tg_set_cfs_quota(struct task_group *tg, long cfs_quota_us) period =ktime_to_ns (tg->cfs_bandwidth.period);if (cfs_quota_us <0 ) quota =RUNTIME_INF ; -else +else if ((u64 )cfs_quota_us <=U64_MAX /NSEC_PER_USEC ) quota = (u64 )cfs_quota_us *NSEC_PER_USEC ; +else +return -EINVAL ;return tg_set_cfs_bandwidth (tg, period, quota); }
@@ -8483,6 +8485,9 @@ int tg_set_cfs_period(struct task_group *tg, long cfs_period_us) {u64 quota, period; +if ((u64 )cfs_period_us >U64_MAX /NSEC_PER_USEC ) +return -EINVAL ; + period = (u64 )cfs_period_us *NSEC_PER_USEC ; quota = tg->cfs_bandwidth.quota;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 127/241 sched/core: Handle overflow in cpu_shares_write_u64
In reply to Greg Kroah-Hartman[ Upstream commit 5b61d50ab4ef590f5e1d4df15cd2cea5f5715308 ]
Bit shift in scale_load() could overflow shares. This patch saturates it to MAX_SHARES like following sched_group_set_shares().
Example:
# echo 9223372036854776832 > cpu.shares # cat cpu.shares
Before patch: 1024
After pattch: 262144
--- kernel/sched/core.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/sched/core.c +2 -0
@@ -8361,6 +8361,8 @@ static void cpu_cgroup_attach(struct cgroup_taskset *tset)static int cpu_shares_write_u64 (struct cgroup_subsys_state *css,struct cftype *cftype,u64 shareval) { +if (shareval >scale_load_down (ULONG_MAX )) + shareval =MAX_SHARES ;return sched_group_set_shares (css_tg (css),scale_load (shareval)); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 128/241 USB: core: Dont unbind interfaces following device reset failure
In reply to Greg Kroah-Hartman[ Upstream commit 381419fa720060ba48b7bbc483be787d5b1dca6f ]
The SCSI core does not like to have devices or hosts unregistered while error recovery is in progress. Trying to do so can lead to
self-deadlock: Part of the removal code tries to obtain a lock already held by the error handler.
This can cause problems for the usb-storage and uas drivers, because their error handler routines perform a USB reset, and if the reset fails then the USB core automatically goes on to unbind all drivers from the device's interfaces -- all while still in the context of the SCSI error handler.
As it turns out, practically all the scenarios leading to a USB reset failure end up causing a device disconnect (the main error pathway in usb_reset_and_verify_device(), at the end of the routine, calls hub_port_logical_disconnect() before returning). As a result, the hub_wq thread will soon become aware of the problem and will unbind all the device's drivers in its own context, not in the error-handler's context.
This means that usb_reset_device() does not need to call usb_unbind_and_rebind_marked_interfaces() in cases where usb_reset_and_verify_device() has returned an error, because hub_wq will take care of everything anyway.
This particular problem was observed in somewhat artificial circumstances, by using usbfs to tell a hub to power-down a port connected to a USB-3 mass storage device using the UAS protocol. With the port turned off, the currently executing command timed out and the error handler started running. The USB reset naturally failed, because the hub port was off, and the error handler deadlocked as described above. Not carrying out the call to usb_unbind_and_rebind_marked_interfaces() fixes this issue.
--- drivers/usb/core/hub.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/usb/core/hub.c +4 -1
@@ -5637,7 +5637,10 @@ int usb_reset_device(struct usb_device *udev) cintf->needs_binding =1 ; } } -usb_unbind_and_rebind_marked_interfaces (udev); + +/* If the reset failed, hub_wq will unbind drivers later */ +if (ret ==0 ) +usb_unbind_and_rebind_marked_interfaces (udev); }usb_autosuspend_device (udev);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 129/241 x86/irq/64: Limit IST stack overflow check to #DB stack
In reply to Greg Kroah-Hartman[ Upstream commit 7dbcf2b0b770eeb803a416ee8dcbef78e6389d40 ]
Commit
37fe6a42b343 ("x86: Check stack overflow in detail")
added a broad check for the full exception stack area, i.e. it considers the full exception stack area as valid.
That's wrong in two aspects:
1) It does not check the individual areas one by one
2) #DF, NMI and #MCE are not enabling interrupts which means that a regular device interrupt cannot happen in their context. In fact if a device interrupt hits one of those IST stacks that's a bug because some code path enabled interrupts while handling the exception.
Limit the check to the #DB stack and consider all other IST stacks as 'overflow' or invalid.
--- arch/x86/kernel/irq_64.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
arch/x86/kernel/irq_64.c +14 -5
@@ -25,9 +25,18 @@ int sysctl_panic_on_stackoverflow;/* * Probabilistic stack overflow check: * -* Only check the stack in process context, because everything else -* runs on the big interrupt stacks. Checking reliably is too expensive, -* so we just check from interrupts. +* Regular device interrupts can enter on the following stacks: +* +* - User stack +* +* - Kernel task stack +* +* - Interrupt stack if a device driver reenables interrupts +* which should only happen in really old drivers. +* +* - Debug IST stack +* +* All other contexts are invalid. */ static inline void stack_overflow_check (struct pt_regs *regs) {
@@ -53,8 +62,8 @@ static inline void stack_overflow_check(struct pt_regs *regs)return ; oist =this_cpu_ptr (&orig_ist); - estack_top = (u64 )oist->ist[0 ] -EXCEPTION_STKSZ +STACK_TOP_MARGIN ; - estack_bottom = (u64 )oist->ist[N_EXCEPTION_STACKS -1 ]; + estack_bottom = (u64 )oist->ist[DEBUG_STACK ]; + estack_top = estack_bottom -DEBUG_STKSZ +STACK_TOP_MARGIN ;if (regs->sp >= estack_top && regs->sp <= estack_bottom)return ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 130/241 i40e: dont allow changes to HW VLAN stripping on active port VLANs
In reply to Greg Kroah-Hartman[ Upstream commit bfb0ebed53857cfc57f11c63fa3689940d71c1c8 ]
Modifying the VLAN stripping options when a port VLAN is configured will break traffic for the VSI, and conceptually doesn't make sense, so don't allow this.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/ethernet/intel/i40e/i40e_main.c +8 -0
@@ -2263,6 +2263,10 @@ void i40e_vlan_stripping_enable(struct i40e_vsi *vsi)struct i40e_vsi_context ctxt;i40e_status ret; +/* Don't modify stripping options if a port VLAN is active */ +if (vsi->info.pvid) +return ; +if ((vsi->info.valid_sections &cpu_to_le16 (I40E_AQ_VSI_PROP_VLAN_VALID )) && ((vsi->info.port_vlan_flags &I40E_AQ_VSI_PVLAN_MODE_MASK ) ==0 ))
@@ -2293,6 +2297,10 @@ void i40e_vlan_stripping_disable(struct i40e_vsi *vsi)struct i40e_vsi_context ctxt;i40e_status ret; +/* Don't modify stripping options if a port VLAN is active */ +if (vsi->info.pvid) +return ; + if ((vsi->info.valid_sections & cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID)) && ((vsi->info.port_vlan_flags & I40E_AQ_VSI_PVLAN_EMOD_MASK) ==
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 131/241 RDMA/cxgb4: Fix null pointer dereference on alloc_skb failure
In reply to Greg Kroah-Hartman[ Upstream commit a6d2a5a92e67d151c98886babdc86d530d27111c ]
Currently if alloc_skb fails to allocate the skb a null skb is passed to t4_set_arp_err_handler and this ends up dereferencing the null skb. Avoid the NULL pointer dereference by checking for a NULL skb and returning early.
Addresses-Coverity: ("Dereference null return")
--- drivers/infiniband/hw/cxgb4/cm.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/hw/cxgb4/cm.c +2 -0
@@ -360,6 +360,8 @@ static struct sk_buff *get_skb(struct sk_buff *skb, int len, gfp_t gfp)skb_reset_transport_header (skb); }else { skb =alloc_skb (len, gfp); +if (!skb) +return NULL ; }t4_set_arp_err_handler (skb,NULL ,NULL );return skb;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 132/241 hwmon: (vt1211) Use request_muxed_region for Super-IO accesses
In reply to Greg Kroah-Hartman[ Upstream commit 14b97ba5c20056102b3dd22696bf17b057e60976 ]
Super-IO accesses may fail on a system with no or unmapped LPC bus.
Also, other drivers may attempt to access the LPC bus at the same time, resulting in undefined behavior.
Use request_muxed_region() to ensure that IO access on the requested address space is supported, and to ensure that access by multiple drivers is synchronized.
--- drivers/hwmon/vt1211.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/hwmon/vt1211.c +12 -3
@@ -226,15 +226,21 @@ static inline void superio_select(int sio_cip, int ldn)outb (ldn, sio_cip +1 ); } -static inline void superio_enter (int sio_cip) +static inline int superio_enter (int sio_cip) { +if (!request_muxed_region (sio_cip,2 ,DRVNAME )) +return -EBUSY ; +outb (0x87 , sio_cip);outb (0x87 , sio_cip); + +return 0 ; }static inline void superio_exit (int sio_cip) {outb (0xaa , sio_cip); +release_region (sio_cip,2 ); }/* ---------------------------------------------------------------------
@@ -1282,11 +1288,14 @@ static int __init vt1211_device_add(unsigned short address)static int __init vt1211_find (int sio_cip,unsigned short *address) { -int err = -ENODEV ; +int err;int devid; -superio_enter (sio_cip); + err =superio_enter (sio_cip); +if (err) +return err; + err = -ENODEV ; devid = force_id ? force_id :superio_inb (sio_cip,SIO_VT1211_DEVID );if (devid !=SIO_VT1211_ID ) goto EXIT;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 133/241 hwmon: (smsc47m1) Use request_muxed_region for Super-IO accesses
In reply to Greg Kroah-Hartman[ Upstream commit d6410408ad2a798c4cc685252c1baa713be0ad69 ]
Super-IO accesses may fail on a system with no or unmapped LPC bus.
Also, other drivers may attempt to access the LPC bus at the same time, resulting in undefined behavior.
Use request_muxed_region() to ensure that IO access on the requested address space is supported, and to ensure that access by multiple drivers is synchronized.
--- drivers/hwmon/smsc47m1.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-)
drivers/hwmon/smsc47m1.c +19 -9
@@ -73,16 +73,21 @@ superio_inb(int reg)/* logical device for fans is 0x0A */ #define superio_select () superio_outb(0x07, 0x0A) -static inline void +static inline int superio_enter (void ) { +if (!request_muxed_region (REG ,2 ,DRVNAME )) +return -EBUSY ; +outb (0x55 ,REG ); +return 0 ; }static inline void superio_exit (void ) {outb (0xAA ,REG ); +release_region (REG ,2 ); }#define SUPERIO_REG_ACT 0x30
@@ -531,8 +536,12 @@ static int __init smsc47m1_find(struct smsc47m1_sio_data *sio_data) {u8 val;unsigned short addr; +int err; + + err =superio_enter (); +if (err) +return err; -superio_enter (); val = force_id ? force_id :superio_inb (SUPERIO_REG_DEVID );/*
@@ -608,13 +617,14 @@ static int __init smsc47m1_find(struct smsc47m1_sio_data *sio_data)static void smsc47m1_restore (const struct smsc47m1_sio_data *sio_data) {if ((sio_data->activate &0x01 ) ==0 ) { -superio_enter (); -superio_select (); - -pr_info ("Disabling device\n" ); -superio_outb (SUPERIO_REG_ACT , sio_data->activate); - -superio_exit (); +if (!superio_enter ()) { +superio_select (); +pr_info ("Disabling device\n" ); +superio_outb (SUPERIO_REG_ACT , sio_data->activate); +superio_exit (); + }else { +pr_warn ("Failed to disable device\n" ); + } } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 134/241 hwmon: (smsc47b397) Use request_muxed_region for Super-IO accesses
In reply to Greg Kroah-Hartman[ Upstream commit 8c0826756744c0ac1df600a5e4cca1a341b13101 ]
Super-IO accesses may fail on a system with no or unmapped LPC bus.
Also, other drivers may attempt to access the LPC bus at the same time, resulting in undefined behavior.
Use request_muxed_region() to ensure that IO access on the requested address space is supported, and to ensure that access by multiple drivers is synchronized.
--- drivers/hwmon/smsc47b397.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/hwmon/smsc47b397.c +11 -2
@@ -72,14 +72,19 @@ static inline void superio_select(int ld)superio_outb (0x07 , ld); } -static inline void superio_enter (void ) +static inline int superio_enter (void ) { +if (!request_muxed_region (REG ,2 ,DRVNAME )) +return -EBUSY ; +outb (0x55 ,REG ); +return 0 ; }static inline void superio_exit (void ) {outb (0xAA ,REG ); +release_region (REG ,2 ); }#define SUPERIO_REG_DEVID 0x20
@@ -300,8 +305,12 @@ static int __init smsc47b397_find(void)u8 id, rev;char *name;unsigned short addr; +int err; + + err =superio_enter (); +if (err) +return err; -superio_enter (); id = force_id ? force_id :superio_inb (SUPERIO_REG_DEVID );switch (id) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 135/241 hwmon: (pc87427) Use request_muxed_region for Super-IO accesses
In reply to Greg Kroah-Hartman[ Upstream commit 755a9b0f8aaa5639ba5671ca50080852babb89ce ]
Super-IO accesses may fail on a system with no or unmapped LPC bus.
Also, other drivers may attempt to access the LPC bus at the same time, resulting in undefined behavior.
Use request_muxed_region() to ensure that IO access on the requested address space is supported, and to ensure that access by multiple drivers is synchronized.
--- drivers/hwmon/pc87427.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
drivers/hwmon/pc87427.c +13 -1
@@ -106,6 +106,13 @@ static const char *logdev_str[2] = { DRVNAME " FMC", DRVNAME " HMC" };#define LD_IN 1#define LD_TEMP 1 +static inline int superio_enter (int sioaddr) +{ +if (!request_muxed_region (sioaddr,2 ,DRVNAME )) +return -EBUSY ; +return 0 ; +} +static inline void superio_outb (int sioaddr,int reg,int val) {outb (reg, sioaddr);
@@ -122,6 +129,7 @@ static inline void superio_exit(int sioaddr) {outb (0x02 , sioaddr);outb (0x02 , sioaddr +1 ); +release_region (sioaddr,2 ); }/*
@@ -1220,7 +1228,11 @@ static int __init pc87427_find(int sioaddr, struct pc87427_sio_data *sio_data) {u16 val;u8 cfg, cfg_b; -int i, err =0 ; +int i, err; + + err =superio_enter (sioaddr); +if (err) +return err;/* Identify device */ val = force_id ? force_id :superio_inb (sioaddr,SIOREG_DEVID );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 136/241 hwmon: (f71805f) Use request_muxed_region for Super-IO accesses
In reply to Greg Kroah-Hartman[ Upstream commit 73e6ff71a7ea924fb7121d576a2d41e3be3fc6b5 ]
Super-IO accesses may fail on a system with no or unmapped LPC bus.
Unable to handle kernel paging request at virtual address ffffffbffee0002e pgd = ffffffc1d68d4000 [ffffffbffee0002e] *pgd=0000000000000000, *pud=0000000000000000 Internal error: Oops: 94000046 [#1] PREEMPT SMP Modules linked in: f71805f(+) hwmon CPU: 3 PID: 1659 Comm: insmod Not tainted 4.5.0+ #88 Hardware name: linux,dummy-virt (DT) task: ffffffc1f6665400 ti: ffffffc1d6418000 task.ti: ffffffc1d6418000 PC is at f71805f_find+0x6c/0x358 [f71805f]
Also, other drivers may attempt to access the LPC bus at the same time, resulting in undefined behavior.
Use request_muxed_region() to ensure that IO access on the requested address space is supported, and to ensure that access by multiple drivers is synchronized.
--- drivers/hwmon/f71805f.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/hwmon/f71805f.c +12 -3
@@ -96,17 +96,23 @@ superio_select(int base, int ld)outb (ld, base +1 ); } -static inline void +static inline int superio_enter (int base) { +if (!request_muxed_region (base,2 ,DRVNAME )) +return -EBUSY ; +outb (0x87 , base);outb (0x87 , base); + +return 0 ; }static inline void superio_exit (int base) {outb (0xaa , base); +release_region (base,2 ); }/*
@@ -1561,7 +1567,7 @@ static int __init f71805f_device_add(unsigned short address,static int __init f71805f_find (int sioaddr,unsigned short *address,struct f71805f_sio_data *sio_data) { -int err = -ENODEV ; +int err;u16 devid;static const char *const names[] = {
@@ -1569,8 +1575,11 @@ static int __init f71805f_find(int sioaddr, unsigned short *address, "F71872F/FG or F71806F/FG", }; -superio_enter (sioaddr); + err =superio_enter (sioaddr); +if (err) +return err; + err = -ENODEV ; devid =superio_inw (sioaddr,SIO_REG_MANID );if (devid !=SIO_FINTEK_ID ) goto exit;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 137/241 scsi: libsas: Do discovery on empty PHY to update PHY info
In reply to Greg Kroah-Hartman[ Upstream commit d8649fc1c5e40e691d589ed825998c36a947491c ]
When we discover the PHY is empty in sas_rediscover_dev(), the PHY information (like negotiated linkrate) is not updated.
As such, for a user examining sysfs for that PHY, they would see incorrect values:
root@(none)$ cd /sys/class/sas_phy/phy-0:0:20 root@(none)$ more negotiated_linkrate 3.0 Gbit root@(none)$ echo 0 > enable root@(none)$ more negotiated_linkrate 3.0 Gbit
So fix this, simply discover the PHY again, even though we know it's empty; in the above example, this gives us:
root@(none)$ more negotiated_linkrate Phy disabled
We must do this after unregistering the device associated with the PHY (in sas_unregister_devs_sas_addr()).
--- drivers/scsi/libsas/sas_expander.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/scsi/libsas/sas_expander.c +5 -0
@@ -2027,6 +2027,11 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last)if ((SAS_ADDR (sas_addr) ==0 ) || (res == -ECOMM )) { phy->phy_state =PHY_EMPTY ;sas_unregister_devs_sas_addr (dev, phy_id, last); +/* +* Even though the PHY is empty, for convenience we discover +* the PHY to update the PHY info, like negotiated linkrate. +*/ +sas_ex_phy_discover (dev, phy_id);return res; }else if (SAS_ADDR (sas_addr) ==SAS_ADDR (phy->attached_sas_addr) &&dev_type_flutter (type, phy->attached_dev_type)) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 138/241 mmc_spi: add a status check for spi_sync_locked
In reply to Greg Kroah-Hartman[ Upstream commit 611025983b7976df0183390a63a2166411d177f1 ]
In case spi_sync_locked fails, the fix reports the error and returns the error code upstream.
--- drivers/mmc/host/mmc_spi.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/mmc/host/mmc_spi.c +4 -0
@@ -819,6 +819,10 @@ mmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t, } status =spi_sync_locked (spi, &host->m); +if (status <0 ) { +dev_dbg (&spi->dev,"read error %d\n" , status); +return status; + }if (host->dma_dev) { dma_sync_single_for_cpu(host->dma_dev,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 139/241 mmc: sdhci-of-esdhc: add erratum eSDHC5 support
In reply to Greg Kroah-Hartman[ Upstream commit a46e42712596b51874f04c73f1cdf1017f88df52 ]
Software writing to the Transfer Type configuration register (system clock domain) can cause a setup/hold violation in the CRC flops (card clock domain), which can cause write accesses to be sent with corrupt CRC values. This issue occurs only for write preceded by read. this erratum is to fix this issue.
--- drivers/mmc/host/sdhci-of-esdhc.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/mmc/host/sdhci-of-esdhc.c +3 -0
@@ -624,6 +624,9 @@ static int sdhci_esdhc_probe(struct platform_device *pdev)if (esdhc->vendor_ver >VENDOR_V_22 ) host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ ; +if (of_find_compatible_node (NULL ,NULL ,"fsl,p2020-esdhc" )) + host->quirks2 |=SDHCI_QUIRK_RESET_AFTER_REQUEST ; + if (of_device_is_compatible(np, "fsl,p5040-esdhc") || of_device_is_compatible(np, "fsl,p5020-esdhc") || of_device_is_compatible(np, "fsl,p4080-esdhc") ||
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 140/241 mmc: sdhci-of-esdhc: add erratum eSDHC-A001 and A-008358 support
In reply to Greg Kroah-Hartman[ Upstream commit 05cb6b2a66fa7837211a060878e91be5eb10cb07 ]
eSDHC-A001: The data timeout counter (SYSCTL[DTOCV]) is not reliable for DTOCV values 0x4(2^17 SD clock), 0x8(2^21 SD clock), and 0xC(2^25 SD clock). The data timeout counter can count from 2^13–2^27, but for values 2^17, 2^21, and 2^25, the timeout counter counts for only 2^13 SD clocks.
A-008358: The data timeout counter value loaded into the timeout counter is less than expected and can result into early timeout error in case of eSDHC data transactions. The table below shows the expected vs actual timeout period for different values of SYSCTL[DTOCV]:
these two erratum has the same quirk to control it, and set SDHCI_QUIRK_RESET_AFTER_REQUEST to fix above issue.
--- drivers/mmc/host/sdhci-of-esdhc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/mmc/host/sdhci-of-esdhc.c +3 -1
@@ -624,8 +624,10 @@ static int sdhci_esdhc_probe(struct platform_device *pdev)if (esdhc->vendor_ver >VENDOR_V_22 ) host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ ; -if (of_find_compatible_node (NULL ,NULL ,"fsl,p2020-esdhc" )) +if (of_find_compatible_node (NULL ,NULL ,"fsl,p2020-esdhc" )) { host->quirks2 |=SDHCI_QUIRK_RESET_AFTER_REQUEST ; + host->quirks2 |=SDHCI_QUIRK_BROKEN_TIMEOUT_VAL ; + } if (of_device_is_compatible(np, "fsl,p5040-esdhc") || of_device_is_compatible(np, "fsl,p5020-esdhc") ||
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 141/241 PM / core: Propagate dev->power.wakeup_path when no callbacks
In reply to Greg Kroah-Hartman[ Upstream commit dc351d4c5f4fe4d0f274d6d660227be0c3a03317 ]
The dev->power.direct_complete flag may become set in device_prepare() in case the device don't have any PM callbacks (dev->power.no_pm_callbacks is set). This leads to a broken behaviour, when there is child having wakeup enabled and relies on its parent to be used in the wakeup path.
More precisely, when the direct complete path becomes selected for the child in __device_suspend(), the propagation of the dev->power.wakeup_path becomes skipped as well.
Let's address this problem, by checking if the device is a part the wakeup path or has wakeup enabled, then prevent the direct complete path from being used.
--- drivers/base/power/main.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/base/power/main.c +4 -0
@@ -1378,6 +1378,10 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)if (dev->power.syscore) goto Complete; +/* Avoid direct_complete to let wakeup_path propagate. */ +if (device_may_wakeup (dev) || dev->power.wakeup_path) + dev->power.direct_complete = false; +if (dev->power.direct_complete) {if (pm_runtime_status_suspended (dev)) {pm_runtime_disable (dev);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 142/241 extcon: arizona: Disable mic detect if running when driver is removed
In reply to Greg Kroah-Hartman[ Upstream commit 00053de52231117ddc154042549f2256183ffb86 ]
Microphone detection provides the button detection features on the Arizona CODECs as such it will be running if the jack is currently inserted. If the driver is unbound whilst the jack is still inserted this will cause warnings from the regulator framework as the MICVDD regulator is put but was never disabled.
Correct this by disabling microphone detection on driver removal and if the microphone detection was running disable the regulator and put the runtime reference that was currently held.
--- drivers/extcon/extcon-arizona.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/extcon/extcon-arizona.c +10 -0
@@ -1616,6 +1616,16 @@ static int arizona_extcon_remove(struct platform_device *pdev)struct arizona_extcon_info *info =platform_get_drvdata (pdev);struct arizona *arizona = info->arizona;int jack_irq_rise, jack_irq_fall; +bool change; + +regmap_update_bits_check (arizona->regmap,ARIZONA_MIC_DETECT_1 , +ARIZONA_MICD_ENA ,0 , + &change); + +if (change) { +regulator_disable (info->micvdd); +pm_runtime_put (info->dev); + }gpiod_put (info->micd_pol_gpio);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 143/241 s390: cio: fix cio_irb declaration
In reply to Greg Kroah-Hartman[ Upstream commit e91012ee855ad9f5ef2ab106a3de51db93fe4d0c ]
clang points out that the declaration of cio_irb does not match the definition exactly, it is missing the alignment attribute:
../drivers/s390/cio/cio.c:50:1: warning: section does not match previous declaration [-Wsection] DEFINE_PER_CPU_ALIGNED(struct irb, cio_irb);
^../include/linux/percpu-defs.h:150:2: note: expanded from macro 'DEFINE_PER_CPU_ALIGNED'
DEFINE_PER_CPU_SECTION(type, name, PER_CPU_ALIGNED_SECTION) \
^
../include/linux/percpu-defs.h:93:9: note: expanded from macro 'DEFINE_PER_CPU_SECTION'
extern __PCPU_ATTRS(sec) __typeof__(type) name; \
^
../include/linux/percpu-defs.h:49:26: note: expanded from macro '__PCPU_ATTRS'
__percpu __attribute__((section(PER_CPU_BASE_SECTION sec))) \
^../drivers/s390/cio/cio.h:118:1: note: previous attribute is here DECLARE_PER_CPU(struct irb, cio_irb);
^../include/linux/percpu-defs.h:111:2: note: expanded from macro 'DECLARE_PER_CPU'
DECLARE_PER_CPU_SECTION(type, name, "")
^../include/linux/percpu-defs.h:87:9: note: expanded from macro 'DECLARE_PER_CPU_SECTION'
extern __PCPU_ATTRS(sec) __typeof__(type) name
^../include/linux/percpu-defs.h:49:26: note: expanded from macro '__PCPU_ATTRS'
__percpu __attribute__((section(PER_CPU_BASE_SECTION sec))) \
^Use DECLARE_PER_CPU_ALIGNED() here, to make the two match.
--- drivers/s390/cio/cio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/s390/cio/cio.h +1 -1
@@ -102,7 +102,7 @@ struct subchannel {struct schib_config config; } __attribute__ ((aligned(8))); -DECLARE_PER_CPU(struct irb, cio_irb); +DECLARE_PER_CPU_ALIGNED(struct irb, cio_irb);#define to_subchannel (n) container_of(n, struct subchannel, dev)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 144/241 cpufreq: ppc_cbe: fix possible object reference leak
In reply to Greg Kroah-Hartman[ Upstream commit 233298032803f2802fe99892d0de4ab653bfece4 ]
The call to of_get_cpu_node returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage.
Detected by coccinelle with the following warnings:
./drivers/cpufreq/ppc_cbe_cpufreq.c:89:2-8: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 76, but without a corresponding object release within this function. ./drivers/cpufreq/ppc_cbe_cpufreq.c:89:2-8: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 76, but without a corresponding object release within this function.
--- drivers/cpufreq/ppc_cbe_cpufreq.c | 1 + 1 file changed, 1 insertion(+)
drivers/cpufreq/ppc_cbe_cpufreq.c +1 -0
@@ -86,6 +86,7 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)if (!cbe_get_cpu_pmd_regs (policy->cpu) || !cbe_get_cpu_mic_tm_regs (policy->cpu)) {pr_info ("invalid CBE regs pointers for cpufreq\n" ); +of_node_put (cpu);return -EINVAL ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 145/241 cpufreq/pasemi: fix possible object reference leak
In reply to Greg Kroah-Hartman[ Upstream commit a9acc26b75f652f697e02a9febe2ab0da648a571 ]
The call to of_get_cpu_node returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage.
Detected by coccinelle with the following warnings:
./drivers/cpufreq/pasemi-cpufreq.c:212:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 147, but without a corresponding object release within this function. ./drivers/cpufreq/pasemi-cpufreq.c:220:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 147, but without a corresponding object release within this function.
--- drivers/cpufreq/pasemi-cpufreq.c | 1 + 1 file changed, 1 insertion(+)
drivers/cpufreq/pasemi-cpufreq.c +1 -0
@@ -146,6 +146,7 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy) cpu =of_get_cpu_node (policy->cpu,NULL ); +of_node_put (cpu);if (!cpu) goto out;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 146/241 cpufreq: pmac32: fix possible object reference leak
In reply to Greg Kroah-Hartman[ Upstream commit 8d10dc28a9ea6e8c02e825dab28699f3c72b02d9 ]
The call to of_find_node_by_name returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage.
Detected by coccinelle with the following warnings:
./drivers/cpufreq/pmac32-cpufreq.c:557:2-8: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 552, but without a corresponding object release within this function. ./drivers/cpufreq/pmac32-cpufreq.c:569:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 552, but without a corresponding object release within this function. ./drivers/cpufreq/pmac32-cpufreq.c:598:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 587, but without a corresponding object release within this function.
--- drivers/cpufreq/pmac32-cpufreq.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/cpufreq/pmac32-cpufreq.c +2 -0
@@ -549,6 +549,7 @@ static int pmac_cpufreq_init_7447A(struct device_node *cpunode) volt_gpio_np =of_find_node_by_name (NULL ,"cpu-vcore-select" );if (volt_gpio_np) voltage_gpio =read_gpio (volt_gpio_np); +of_node_put (volt_gpio_np);if (!voltage_gpio){printk (KERN_ERR "cpufreq: missing cpu-vcore-select gpio\n" );return 1 ;
@@ -585,6 +586,7 @@ static int pmac_cpufreq_init_750FX(struct device_node *cpunode)if (volt_gpio_np) voltage_gpio =read_gpio (volt_gpio_np); +of_node_put (volt_gpio_np); pvr =mfspr (SPRN_PVR ); has_cpu_l2lve = !((pvr &0xf00 ) ==0x100 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 147/241 x86/build: Keep local relocations with ld.lld
In reply to Greg Kroah-Hartman[ Upstream commit 7c21383f3429dd70da39c0c7f1efa12377a47ab6 ]
The LLVM linker (ld.lld) defaults to removing local relocations, which causes KASLR boot failures. ld.bfd and ld.gold already handle this correctly. This adds the explicit instruction "--discard-none" during the link phase. There is no change in output for ld.bfd and ld.gold, but ld.lld now produces an image with all the needed relocations.
--- arch/x86/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/Makefile +1 -1
@@ -47,7 +47,7 @@ export REALMODE_CFLAGS export BITS ifdef CONFIG_X86_NEED_RELOCS - LDFLAGS_vmlinux := --emit-relocs + LDFLAGS_vmlinux := --emit-relocs --discard-none endif #
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 148/241 iio: ad_sigma_delta: Properly handle SPI bus locking vs CS assertion
In reply to Greg Kroah-Hartman[ Upstream commit df1d80aee963480c5c2938c64ec0ac3e4a0df2e0 ]
For devices from the SigmaDelta family we need to keep CS low when doing a conversion, since the device will use the MISO line as a interrupt to indicate that the conversion is complete.
This is why the driver locks the SPI bus and when the SPI bus is locked keeps as long as a conversion is going on. The current implementation gets one small detail wrong though. CS is only de-asserted after the SPI bus is unlocked. This means it is possible for a different SPI device on the same bus to send a message which would be wrongfully be addressed to the SigmaDelta device as well. Make sure that the last SPI transfer that is done while holding the SPI bus lock de-asserts the CS signal.
--- drivers/iio/adc/ad_sigma_delta.c | 16 +++++++++++----- include/linux/iio/adc/ad_sigma_delta.h | 1 + 2 files changed, 12 insertions(+), 5 deletions(-)
drivers/iio/adc/ad_sigma_delta.c +11 -5
@@ -62,7 +62,7 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,struct spi_transfer t = { .tx_buf = data, .len = size +1 , - .cs_change = sigma_delta->bus_locked, + .cs_change = sigma_delta->keep_cs_asserted, };struct spi_message m;int ret;
@@ -217,6 +217,7 @@ static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,spi_bus_lock (sigma_delta->spi->master); sigma_delta->bus_locked = true; + sigma_delta->keep_cs_asserted = true;reinit_completion (&sigma_delta->completion); ret =ad_sigma_delta_set_mode (sigma_delta, mode);
@@ -234,9 +235,10 @@ static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta, ret =0 ; } out: + sigma_delta->keep_cs_asserted = false; +ad_sigma_delta_set_mode (sigma_delta,AD_SD_MODE_IDLE ); sigma_delta->bus_locked = false;spi_bus_unlock (sigma_delta->spi->master); -ad_sigma_delta_set_mode (sigma_delta,AD_SD_MODE_IDLE );return ret; }
@@ -288,6 +290,7 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,spi_bus_lock (sigma_delta->spi->master); sigma_delta->bus_locked = true; + sigma_delta->keep_cs_asserted = true;reinit_completion (&sigma_delta->completion);ad_sigma_delta_set_mode (sigma_delta,AD_SD_MODE_SINGLE );
@@ -297,9 +300,6 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev, ret =wait_for_completion_interruptible_timeout ( &sigma_delta->completion,HZ ); - sigma_delta->bus_locked = false; -spi_bus_unlock (sigma_delta->spi->master); -if (ret ==0 ) ret = -EIO ;if (ret <0 )
@@ -315,7 +315,10 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev, sigma_delta->irq_dis = true; } + sigma_delta->keep_cs_asserted = false;ad_sigma_delta_set_mode (sigma_delta,AD_SD_MODE_IDLE ); + sigma_delta->bus_locked = false; +spi_bus_unlock (sigma_delta->spi->master);mutex_unlock (&indio_dev->mlock);if (ret)
@@ -352,6 +355,8 @@ static int ad_sd_buffer_postenable(struct iio_dev *indio_dev)spi_bus_lock (sigma_delta->spi->master); sigma_delta->bus_locked = true; + sigma_delta->keep_cs_asserted = true; + ret =ad_sigma_delta_set_mode (sigma_delta,AD_SD_MODE_CONTINUOUS );if (ret) goto err_unlock;
@@ -380,6 +385,7 @@ static int ad_sd_buffer_postdisable(struct iio_dev *indio_dev) sigma_delta->irq_dis = true; } + sigma_delta->keep_cs_asserted = false;ad_sigma_delta_set_mode (sigma_delta,AD_SD_MODE_IDLE ); sigma_delta->bus_locked = false;
include/linux/iio/adc/ad_sigma_delta.h +1 -0
@@ -66,6 +66,7 @@ struct ad_sigma_delta {bool irq_dis;bool bus_locked; +bool keep_cs_asserted;uint8_t comm;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 149/241 iio: hmc5843: fix potential NULL pointer dereferences
In reply to Greg Kroah-Hartman[ Upstream commit 536cc27deade8f1ec3c1beefa60d5fbe0f6fcb28 ]
devm_regmap_init_i2c may fail and return NULL. The fix returns the error when it fails.
--- drivers/staging/iio/magnetometer/hmc5843_i2c.c | 7 ++++++- drivers/staging/iio/magnetometer/hmc5843_spi.c | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-)
drivers/staging/iio/magnetometer/hmc5843_i2c.c +6 -1
@@ -59,8 +59,13 @@ static const struct regmap_config hmc5843_i2c_regmap_config = {static int hmc5843_i2c_probe (struct i2c_client *cli,const struct i2c_device_id *id) { +struct regmap *regmap =devm_regmap_init_i2c (cli, + &hmc5843_i2c_regmap_config); +if (IS_ERR (regmap)) +return PTR_ERR (regmap); +return hmc5843_common_probe (&cli->dev, -devm_regmap_init_i2c (cli, &hmc5843_i2c_regmap_config), + regmap, id->driver_data, id->name); }
drivers/staging/iio/magnetometer/hmc5843_spi.c +6 -1
@@ -59,6 +59,7 @@ static const struct regmap_config hmc5843_spi_regmap_config = {static int hmc5843_spi_probe (struct spi_device *spi) {int ret; +struct regmap *regmap;const struct spi_device_id *id =spi_get_device_id (spi); spi->mode =SPI_MODE_3 ;
@@ -68,8 +69,12 @@ static int hmc5843_spi_probe(struct spi_device *spi)if (ret)return ret; + regmap =devm_regmap_init_spi (spi, &hmc5843_spi_regmap_config); +if (IS_ERR (regmap)) +return PTR_ERR (regmap); +return hmc5843_common_probe (&spi->dev, -devm_regmap_init_spi (spi, &hmc5843_spi_regmap_config), + regmap, id->driver_data, id->name); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 150/241 iio: common: ssp_sensors: Initialize calculated_time in ssp_common_process_data
In reply to Greg Kroah-Hartman[ Upstream commit 6f9ca1d3eb74b81f811a87002de2d51640d135b1 ]
When building with -Wsometimes-uninitialized, Clang warns:
drivers/iio/common/ssp_sensors/ssp_iio.c:95:6: warning: variable 'calculated_time' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
While it isn't wrong, this will never be a problem because iio_push_to_buffers_with_timestamp only uses calculated_time on the same condition that it is assigned (when scan_timestamp is not zero). While iio_push_to_buffers_with_timestamp is marked as inline, Clang does inlining in the optimization stage, which happens after the semantic analysis phase (plus inline is merely a hint to the compiler).
Fix this by just zero initializing calculated_time.
--- drivers/iio/common/ssp_sensors/ssp_iio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/common/ssp_sensors/ssp_iio.c +1 -1
@@ -80,7 +80,7 @@ int ssp_common_process_data(struct iio_dev *indio_dev, void *buf, unsigned int len, int64_t timestamp) {__le32 time; -int64_t calculated_time; +int64_t calculated_time =0 ;struct ssp_sensor_data *spd =iio_priv (indio_dev);if (indio_dev->scan_bytes ==0 )
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 151/241 rtlwifi: fix a potential NULL pointer dereference
In reply to Greg Kroah-Hartman[ Upstream commit 765976285a8c8db3f0eb7f033829a899d0c2786e ]
In case alloc_workqueue fails, the fix reports the error and returns to avoid NULL pointer dereference.
--- drivers/net/wireless/realtek/rtlwifi/base.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/wireless/realtek/rtlwifi/base.c +5 -0
@@ -466,6 +466,11 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)/* <2> work queue */ rtlpriv->works.hw = hw; rtlpriv->works.rtl_wq =alloc_workqueue ("%s" ,0 ,0 , rtlpriv->cfg->name); +if (unlikely (!rtlpriv->works.rtl_wq)) { +pr_err ("Failed to allocate work queue\n" ); +return ; + } +INIT_DELAYED_WORK (&rtlpriv->works.watchdog_wq, (void *)rtl_watchdog_wq_callback); INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 152/241 brcmfmac: fix missing checks for kmemdup
In reply to Greg Kroah-Hartman[ Upstream commit 46953f97224d56a12ccbe9c6acaa84ca0dab2780 ]
In case kmemdup fails, the fix sets conn_info->req_ie_len and conn_info->resp_ie_len to zero to avoid buffer overflows.
--- drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c +4 -0
@@ -4836,6 +4836,8 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg, conn_info->req_ie =kmemdup (cfg->extra_buf, conn_info->req_ie_len,GFP_KERNEL ); +if (!conn_info->req_ie) + conn_info->req_ie_len =0 ; }else { conn_info->req_ie_len =0 ; conn_info->req_ie =NULL ;
@@ -4852,6 +4854,8 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg, conn_info->resp_ie =kmemdup (cfg->extra_buf, conn_info->resp_ie_len,GFP_KERNEL ); +if (!conn_info->resp_ie) + conn_info->resp_ie_len =0 ; }else { conn_info->resp_ie_len =0 ; conn_info->resp_ie =NULL ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 153/241 b43: shut up clang -Wuninitialized variable warning
In reply to Greg Kroah-Hartman[ Upstream commit d825db346270dbceef83b7b750dbc29f1d7dcc0e ]
Clang warns about what is clearly a case of passing an uninitalized variable into a static function:
drivers/net/wireless/broadcom/b43/phy_lp.c:1852:23: error: variable 'gains' is uninitialized when used here
[-Werror,-Wuninitialized]
lpphy_papd_cal(dev, gains, 0, 1, 30);
^~~~~
drivers/net/wireless/broadcom/b43/phy_lp.c:1838:2: note: variable 'gains' is declared here
struct lpphy_tx_gains gains, oldgains;
^1 error generated.
However, this function is empty, and its arguments are never evaluated, so gcc in contrast does not warn here. Both compilers behave in a reasonable way as far as I can tell, so we should change the code to avoid the warning everywhere.
We could just eliminate the lpphy_papd_cal() function entirely, given that it has had the TODO comment in it for 10 years now and is rather unlikely to ever get done. I'm doing a simpler change here, and just pass the 'oldgains' variable in that has been initialized, based on the guess that this is what was originally meant.
--- drivers/net/wireless/b43/phy_lp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/wireless/b43/phy_lp.c +3 -3
@@ -1834,7 +1834,7 @@ static void lpphy_papd_cal(struct b43_wldev *dev, struct lpphy_tx_gains gains,static void lpphy_papd_cal_txpwr (struct b43_wldev *dev) {struct b43_phy_lp *lpphy = dev->phy.lp; -struct lpphy_tx_gains gains, oldgains; +struct lpphy_tx_gains oldgains;int old_txpctl, old_afe_ovr, old_rf, old_bbmult;lpphy_read_tx_pctl_mode_from_hardware (dev);
@@ -1848,9 +1848,9 @@ static void lpphy_papd_cal_txpwr(struct b43_wldev *dev)lpphy_set_tx_power_control (dev,B43_LPPHY_TXPCTL_OFF );if (dev->dev->chip_id ==0x4325 && dev->dev->chip_rev ==0 ) -lpphy_papd_cal (dev, gains,0 ,1 ,30 ); +lpphy_papd_cal (dev, oldgains,0 ,1 ,30 );else -lpphy_papd_cal (dev, gains,0 ,1 ,65 ); +lpphy_papd_cal (dev, oldgains,0 ,1 ,65 );if (old_afe_ovr)lpphy_set_tx_gains (dev, oldgains);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 154/241 brcmfmac: convert dev_init_lock mutex to completion
In reply to Greg Kroah-Hartman[ Upstream commit a9fd0953fa4a62887306be28641b4b0809f3b2fd ]
Leaving dev_init_lock mutex locked in probe causes BUG and a WARNING when kernel is compiled with CONFIG_PROVE_LOCKING. Convert mutex to completion which silences those warnings and improves code readability.
Fix below errors when connecting the USB WiFi dongle:
brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43143 for chip BCM43143/2
BUG: workqueue leaked lock or atomic: kworker/0:2/0x00000000/434
last function: hub_event
1 lock held by kworker/0:2/434:
#0: 18d5dcdf (&devinfo->dev_init_lock){+.+.}, at: brcmf_usb_probe+0x78/0x550 [brcmfmac]
CPU: 0 PID: 434 Comm: kworker/0:2 Not tainted 4.19.23-00084-g454a789-dirty #123
Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
Workqueue: usb_hub_wq hub_event
[<8011237c>] (unwind_backtrace) from [<8010d74c>] (show_stack+0x10/0x14)
[<8010d74c>] (show_stack) from [<809c4324>] (dump_stack+0xa8/0xd4)
[<809c4324>] (dump_stack) from [<8014195c>] (process_one_work+0x710/0x808)
[<8014195c>] (process_one_work) from [<80141a80>] (worker_thread+0x2c/0x564)
[<80141a80>] (worker_thread) from [<80147bcc>] (kthread+0x13c/0x16c)
[<80147bcc>] (kthread) from [<801010b4>] (ret_from_fork+0x14/0x20)
Exception stack(0xed1d9fb0 to 0xed1d9ff8)9fa0: 00000000 00000000 00000000 00000000
9fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 9fe0: 00000000 00000000 00000000 00000000 00000013 00000000
======================================================
WARNING: possible circular locking dependency detected 4.19.23-00084-g454a789-dirty #123 Not tainted
------------------------------------------------------
kworker/0:2/434 is trying to acquire lock:e29cf799 ((wq_completion)"events"){+.+.}, at: process_one_work+0x174/0x808
but task is already holding lock:18d5dcdf (&devinfo->dev_init_lock){+.+.}, at: brcmf_usb_probe+0x78/0x550 [brcmfmac]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (&devinfo->dev_init_lock){+.+.}:
mutex_lock_nested+0x1c/0x24
brcmf_usb_probe+0x78/0x550 [brcmfmac]
usb_probe_interface+0xc0/0x1bc
really_probe+0x228/0x2c0
__driver_attach+0xe4/0xe8
bus_for_each_dev+0x68/0xb4
bus_add_driver+0x19c/0x214
driver_register+0x78/0x110
usb_register_driver+0x84/0x148
process_one_work+0x228/0x808
worker_thread+0x2c/0x564
kthread+0x13c/0x16c
ret_from_fork+0x14/0x20
(null)-> #1 (brcmf_driver_work){+.+.}:
worker_thread+0x2c/0x564
kthread+0x13c/0x16c
ret_from_fork+0x14/0x20
(null)-> #0 ((wq_completion)"events"){+.+.}:
process_one_work+0x1b8/0x808
worker_thread+0x2c/0x564
kthread+0x13c/0x16c
ret_from_fork+0x14/0x20
(null)other info that might help us debug this:
Chain exists of: (wq_completion)"events" --> brcmf_driver_work --> &devinfo->dev_init_lock Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&devinfo->dev_init_lock);
lock(brcmf_driver_work);
lock(&devinfo->dev_init_lock);lock((wq_completion)"events");
*** DEADLOCK ***
1 lock held by kworker/0:2/434:
#0: 18d5dcdf (&devinfo->dev_init_lock){+.+.}, at: brcmf_usb_probe+0x78/0x550 [brcmfmac]
stack backtrace: CPU: 0 PID: 434 Comm: kworker/0:2 Not tainted 4.19.23-00084-g454a789-dirty #123 Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree) Workqueue: events request_firmware_work_func [<8011237c>] (unwind_backtrace) from [<8010d74c>] (show_stack+0x10/0x14) [<8010d74c>] (show_stack) from [<809c4324>] (dump_stack+0xa8/0xd4) [<809c4324>] (dump_stack) from [<80172838>] (print_circular_bug+0x210/0x330) [<80172838>] (print_circular_bug) from [<80175940>] (__lock_acquire+0x160c/0x1a30) [<80175940>] (__lock_acquire) from [<8017671c>] (lock_acquire+0xe0/0x268) [<8017671c>] (lock_acquire) from [<80141404>] (process_one_work+0x1b8/0x808) [<80141404>] (process_one_work) from [<80141a80>] (worker_thread+0x2c/0x564) [<80141a80>] (worker_thread) from [<80147bcc>] (kthread+0x13c/0x16c) [<80147bcc>] (kthread) from [<801010b4>] (ret_from_fork+0x14/0x20) Exception stack(0xed1d9fb0 to 0xed1d9ff8)
9fa0: 00000000 00000000 00000000 00000000
9fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 9fe0: 00000000 00000000 00000000 00000000 00000013 00000000
--- drivers/net/wireless/brcm80211/brcmfmac/usb.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
drivers/net/wireless/brcm80211/brcmfmac/usb.c +8 -9
@@ -144,7 +144,7 @@ struct brcmf_usbdev_info {struct usb_device *usbdev;struct device *dev; -struct mutex dev_init_lock; +struct completion dev_init_done;int ctl_in_pipe, ctl_out_pipe;struct urb *ctl_urb;/* URB for control endpoint */
@@ -1226,11 +1226,11 @@ static void brcmf_usb_probe_phase2(struct device *dev,if (ret) goto error; -mutex_unlock (&devinfo->dev_init_lock); +complete (&devinfo->dev_init_done);return ; error:brcmf_dbg (TRACE ,"failed: dev=%s, err=%d\n" ,dev_name (dev), ret); -mutex_unlock (&devinfo->dev_init_lock); +complete (&devinfo->dev_init_done);device_release_driver (dev); }
@@ -1268,7 +1268,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)if (ret) goto fail;/* we are done */ -mutex_unlock (&devinfo->dev_init_lock); +complete (&devinfo->dev_init_done);return 0 ; } bus->chip = bus_pub->devid;
@@ -1322,11 +1322,10 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) devinfo->usbdev = usb; devinfo->dev = &usb->dev; -/* Take an init lock, to protect for disconnect while still loading. +/* Init completion, to protect for disconnect while still loading. * Necessary because of the asynchronous firmware load construction */ -mutex_init (&devinfo->dev_init_lock); -mutex_lock (&devinfo->dev_init_lock); +init_completion (&devinfo->dev_init_done);usb_set_intfdata (intf, devinfo);
@@ -1402,7 +1401,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)return 0 ; fail: -mutex_unlock (&devinfo->dev_init_lock); +complete (&devinfo->dev_init_done);kfree (devinfo);usb_set_intfdata (intf,NULL );return ret;
@@ -1417,7 +1416,7 @@ brcmf_usb_disconnect(struct usb_interface *intf) devinfo = (struct brcmf_usbdev_info *)usb_get_intfdata (intf);if (devinfo) { -mutex_lock (&devinfo->dev_init_lock); +wait_for_completion (&devinfo->dev_init_done);/* Make sure that devinfo still exists. Firmware probe routines * may have released the device and cleared the intfdata. */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 155/241 brcmfmac: fix race during disconnect when USB completion is in progress
In reply to Greg Kroah-Hartman[ Upstream commit db3b9e2e1d58080d0754bdf9293dabf8c6491b67 ]
It was observed that rarely during USB disconnect happening shortly after connect (before full initialization completes) usb_hub_wq would wait forever for the dev_init_lock to be unlocked. dev_init_lock would remain locked though because of infinite wait during usb_kill_urb:
[ 2730.656472] kworker/0:2 D 0 260 2 0x00000000 [ 2730.660700] Workqueue: events request_firmware_work_func [ 2730.664807] [<809dca20>] (__schedule) from [<809dd164>] (schedule+0x4c/0xac) [ 2730.670587] [<809dd164>] (schedule) from [<8069af44>] (usb_kill_urb+0xdc/0x114) [ 2730.676815] [<8069af44>] (usb_kill_urb) from [<7f258b50>] (brcmf_usb_free_q+0x34/0xa8 [brcmfmac]) [ 2730.684833] [<7f258b50>] (brcmf_usb_free_q [brcmfmac]) from [<7f2517d4>] (brcmf_detach+0xa0/0xb8 [brcmfmac]) [ 2730.693557] [<7f2517d4>] (brcmf_detach [brcmfmac]) from [<7f251a34>] (brcmf_attach+0xac/0x3d8 [brcmfmac]) [ 2730.702094] [<7f251a34>] (brcmf_attach [brcmfmac]) from [<7f2587ac>] (brcmf_usb_probe_phase2+0x468/0x4a0 [brcmfmac]) [ 2730.711601] [<7f2587ac>] (brcmf_usb_probe_phase2 [brcmfmac]) from [<7f252888>] (brcmf_fw_request_done+0x194/0x220 [brcmfmac]) [ 2730.721795] [<7f252888>] (brcmf_fw_request_done [brcmfmac]) from [<805748e4>] (request_firmware_work_func+0x4c/0x88) [ 2730.731125] [<805748e4>] (request_firmware_work_func) from [<80141474>] (process_one_work+0x228/0x808) [ 2730.739223] [<80141474>] (process_one_work) from [<80141a80>] (worker_thread+0x2c/0x564) [ 2730.746105] [<80141a80>] (worker_thread) from [<80147bcc>] (kthread+0x13c/0x16c) [ 2730.752227] [<80147bcc>] (kthread) from [<801010b4>] (ret_from_fork+0x14/0x20)
[ 2733.099695] kworker/0:3 D 0 1065 2 0x00000000 [ 2733.103926] Workqueue: usb_hub_wq hub_event [ 2733.106914] [<809dca20>] (__schedule) from [<809dd164>] (schedule+0x4c/0xac) [ 2733.112693] [<809dd164>] (schedule) from [<809e2a8c>] (schedule_timeout+0x214/0x3e4) [ 2733.119621] [<809e2a8c>] (schedule_timeout) from [<809dde2c>] (wait_for_common+0xc4/0x1c0) [ 2733.126810] [<809dde2c>] (wait_for_common) from [<7f258d00>] (brcmf_usb_disconnect+0x1c/0x4c [brcmfmac]) [ 2733.135206] [<7f258d00>] (brcmf_usb_disconnect [brcmfmac]) from [<8069e0c8>] (usb_unbind_interface+0x5c/0x1e4) [ 2733.143943] [<8069e0c8>] (usb_unbind_interface) from [<8056d3e8>] (device_release_driver_internal+0x164/0x1fc) [ 2733.152769] [<8056d3e8>] (device_release_driver_internal) from [<8056c078>] (bus_remove_device+0xd0/0xfc) [ 2733.161138] [<8056c078>] (bus_remove_device) from [<8056977c>] (device_del+0x11c/0x310) [ 2733.167939] [<8056977c>] (device_del) from [<8069cba8>] (usb_disable_device+0xa0/0x1cc) [ 2733.174743] [<8069cba8>] (usb_disable_device) from [<8069507c>] (usb_disconnect+0x74/0x1dc) [ 2733.181823] [<8069507c>] (usb_disconnect) from [<80695e88>] (hub_event+0x478/0xf88) [ 2733.188278] [<80695e88>] (hub_event) from [<80141474>] (process_one_work+0x228/0x808) [ 2733.194905] [<80141474>] (process_one_work) from [<80141a80>] (worker_thread+0x2c/0x564) [ 2733.201724] [<80141a80>] (worker_thread) from [<80147bcc>] (kthread+0x13c/0x16c) [ 2733.207913] [<80147bcc>] (kthread) from [<801010b4>] (ret_from_fork+0x14/0x20)
It was traced down to a case where usb_kill_urb would be called on an URB structure containing more or less random data, including large number in its use_count. During the debugging it appeared that in brcmf_usb_free_q() the traversal over URBs' lists is not synchronized with operations on those lists in brcmf_usb_rx_complete() leading to handling brcmf_usbdev_info structure (holding lists' head) as lists' element and in result causing above problem.
Fix it by walking through all URBs during brcmf_cancel_all_urbs using the arrays of requests instead of linked lists.
--- drivers/net/wireless/brcm80211/brcmfmac/usb.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/net/wireless/brcm80211/brcmfmac/usb.c +8 -2
@@ -669,12 +669,18 @@ static int brcmf_usb_up(struct device *dev)static void brcmf_cancel_all_urbs (struct brcmf_usbdev_info *devinfo) { +int i; +if (devinfo->ctl_urb)usb_kill_urb (devinfo->ctl_urb);if (devinfo->bulk_urb)usb_kill_urb (devinfo->bulk_urb); -brcmf_usb_free_q (&devinfo->tx_postq, true); -brcmf_usb_free_q (&devinfo->rx_postq, true); +if (devinfo->tx_reqs) +for (i =0 ; i < devinfo->bus_pub.ntxq; i++) +usb_kill_urb (devinfo->tx_reqs[i].urb); +if (devinfo->rx_reqs) +for (i =0 ; i < devinfo->bus_pub.nrxq; i++) +usb_kill_urb (devinfo->rx_reqs[i].urb); }static void brcmf_usb_down (struct device *dev)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 156/241 scsi: ufs: Fix regulator load and icc-level configuration
In reply to Greg Kroah-Hartman[ Upstream commit 0487fff76632ec023d394a05b82e87a971db8c03 ]
Currently if a regulator has "<name>-fixed-regulator" property in device tree, it will skip current limit initialization. This lead to a zero "max_uA" value in struct ufs_vreg.
However, "regulator_set_load" operation shall be required on regulators which have valid current limits, otherwise a zero "max_uA" set by "regulator_set_load" may cause unexpected behavior when this regulator is enabled or set as high power mode.
Similarly, in device's icc_level configuration flow, the target icc_level shall be updated if regulator also has valid current limit, otherwise a wrong icc_level will be calculated by zero "max_uA" and thus causes unexpected results after it is written to device.
--- drivers/scsi/ufs/ufshcd.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/scsi/ufs/ufshcd.c +12 -3
@@ -4144,19 +4144,19 @@ static u32 ufshcd_find_max_sup_active_icc_level(struct ufs_hba *hba, goto out; } -if (hba->vreg_info.vcc) +if (hba->vreg_info.vcc && hba->vreg_info.vcc->max_uA) icc_level =ufshcd_get_max_icc_level ( hba->vreg_info.vcc->max_uA,POWER_DESC_MAX_ACTV_ICC_LVLS -1 , &desc_buf[PWR_DESC_ACTIVE_LVLS_VCC_0 ]); -if (hba->vreg_info.vccq) +if (hba->vreg_info.vccq && hba->vreg_info.vccq->max_uA) icc_level =ufshcd_get_max_icc_level ( hba->vreg_info.vccq->max_uA, icc_level, &desc_buf[PWR_DESC_ACTIVE_LVLS_VCCQ_0 ]); -if (hba->vreg_info.vccq2) +if (hba->vreg_info.vccq2 && hba->vreg_info.vccq2->max_uA) icc_level = ufshcd_get_max_icc_level( hba->vreg_info.vccq2->max_uA, icc_level,
@@ -4390,6 +4390,15 @@ static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg,if (!vreg)return 0 ; +/* +* "set_load" operation shall be required on those regulators +* which specifically configured current limitation. Otherwise +* zero max_uA may cause unexpected behavior when regulator is +* enabled or set as high power mode. +*/ +if (!vreg->max_uA) +return 0 ; + ret =regulator_set_load (vreg->reg, ua);if (ret <0 ) { dev_err(dev, "%s: %s set load (ua=%d) failed, err=%d\n",
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 157/241 scsi: ufs: Avoid configuring regulator with undefined voltage range
In reply to Greg Kroah-Hartman[ Upstream commit 3b141e8cfd54ba3e5c610717295b2a02aab26a05 ]
For regulators used by UFS, vcc, vccq and vccq2 will have voltage range initialized by ufshcd_populate_vreg(), however other regulators may have undefined voltage range if dt-bindings have no such definition.
In above undefined case, both "min_uV" and "max_uV" fields in ufs_vreg struct will be zero values and these values will be configured on regulators in different power modes.
Currently this may have no harm if both "min_uV" and "max_uV" always keep "zero values" because regulator_set_voltage() will always bypass such invalid values and return "good" results.
However improper values shall be fixed to avoid potential bugs. Simply bypass voltage configuration if voltage range is not defined.
--- drivers/scsi/ufs/ufshcd.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/scsi/ufs/ufshcd.c +8 -5
@@ -4434,12 +4434,15 @@ static int ufshcd_config_vreg(struct device *dev, name = vreg->name;if (regulator_count_voltages (reg) >0 ) { - min_uV = on ? vreg->min_uV :0 ; - ret =regulator_set_voltage (reg, min_uV, vreg->max_uV); -if (ret) { -dev_err (dev,"%s: %s set voltage failed, err=%d\n" , +if (vreg->min_uV && vreg->max_uV) { + min_uV = on ? vreg->min_uV :0 ; + ret =regulator_set_voltage (reg, min_uV, vreg->max_uV); +if (ret) { +dev_err (dev, +"%s: %s set voltage failed, err=%d\n" , __func__, name, ret); - goto out; + goto out; + } } uA_load = on ? vreg->max_uA :0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 158/241 arm64: cpu_ops: fix a leaked reference by adding missing of_node_put
In reply to Greg Kroah-Hartman[ Upstream commit 92606ec9285fb84cd9b5943df23f07d741384bfc ]
The call to of_get_next_child returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage.
Detected by coccinelle with the following warnings:
./arch/arm64/kernel/cpu_ops.c:102:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 69, but without a corresponding object release within this function.
--- arch/arm64/kernel/cpu_ops.c | 1 + 1 file changed, 1 insertion(+)
arch/arm64/kernel/cpu_ops.c +1 -0
@@ -73,6 +73,7 @@ static const char *__init cpu_read_enable_method(int cpu)pr_err ("%s: missing enable-method property\n" , dn->full_name); } +of_node_put (dn); }else { enable_method =acpi_get_enable_method (cpu);if (!enable_method)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 159/241 x86/ia32: Fix ia32_restore_sigcontext() AC leak
In reply to Greg Kroah-Hartman[ Upstream commit 67a0514afdbb8b2fc70b771b8c77661a9cb9d3a9 ]
Objtool spotted that we call native_load_gs_index() with AC set. Re-arrange the code to avoid that.
--- arch/x86/ia32/ia32_signal.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-)
arch/x86/ia32/ia32_signal.c +17 -12
@@ -60,9 +60,8 @@ } while (0)#define RELOAD_SEG (seg) { \ - unsigned int pre = GET_SEG(seg); \ + unsigned int pre = (seg) | 3; \ unsigned int cur = get_user_seg(seg); \ - pre |= 3; \ if (pre != cur) \ set_user_seg(seg, pre); \ }
@@ -71,6 +70,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, struct sigcontext_32 __user *sc) {unsigned int tmpflags, err =0 ; +u16 gs, fs, es, ds;void __user *buf;u32 tmp;
@@ -78,16 +78,10 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, current->restart_block.fn = do_no_restart_syscall; get_user_try { -/* -* Reload fs and gs if they have changed in the signal -* handler. This does not handle long fs/gs base changes in -* the handler, but does not clobber them at least in the -* normal case. -*/ -RELOAD_SEG (gs); -RELOAD_SEG (fs); -RELOAD_SEG (ds); -RELOAD_SEG (es); + gs =GET_SEG (gs); + fs =GET_SEG (fs); + ds =GET_SEG (ds); + es =GET_SEG (es);COPY (di);COPY (si);COPY (bp);COPY (sp);COPY (bx);COPY (dx);COPY (cx);COPY (ip);COPY (ax);
@@ -105,6 +99,17 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, buf =compat_ptr (tmp); }get_user_catch (err); +/* +* Reload fs and gs if they have changed in the signal +* handler. This does not handle long fs/gs base changes in +* the handler, but does not clobber them at least in the +* normal case. +*/ +RELOAD_SEG (gs); +RELOAD_SEG (fs); +RELOAD_SEG (ds); +RELOAD_SEG (es); + err |=fpu__restore_sig (buf,1 );force_iret ();
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 160/241 chardev: add additional check for minor range overlap
In reply to Greg Kroah-Hartman[ Upstream commit de36e16d1557a0b6eb328bc3516359a12ba5c25c ]
Current overlap checking cannot correctly handle a case which is baseminor < existing baseminor && baseminor + minorct > existing baseminor + minorct.
--- fs/char_dev.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/char_dev.c +6 -0
@@ -130,6 +130,12 @@ __register_chrdev_region(unsigned int major, unsigned int baseminor, ret = -EBUSY ; goto out; } + +if (new_min < old_min && new_max > old_max) { + ret = -EBUSY ; + goto out; + } + } cd->next = *cp;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 161/241 HID: core: move Usage Page concatenation to Main item
In reply to Greg Kroah-Hartman[ Upstream commit 58e75155009cc800005629955d3482f36a1e0eec ]
As seen on some USB wireless keyboards manufactured by Primax, the HID parser was using some assumptions that are not always true. In this case it's s the fact that, inside the scope of a main item, an Usage Page will always precede an Usage.
The spec is not pretty clear as 6.2.2.7 states "Any usage that follows is interpreted as a Usage ID and concatenated with the Usage Page". While 6.2.2.8 states "When the parser encounters a main item it concatenates the last declared Usage Page with a Usage to form a complete usage value." Being somewhat contradictory it was decided to match Window's implementation, which follows 6.2.2.8.
In summary, the patch moves the Usage Page concatenation from the local item parsing function to the main item parsing function.
--- drivers/hid/hid-core.c | 36 ++++++++++++++++++++++++------------ include/linux/hid.h | 1 + 2 files changed, 25 insertions(+), 12 deletions(-)
drivers/hid/hid-core.c +24 -12
@@ -200,13 +200,14 @@ static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type)* Add a usage to the temporary parser table. */ -static int hid_add_usage (struct hid_parser *parser,unsigned usage) +static int hid_add_usage (struct hid_parser *parser,unsigned usage,u8 size) {if (parser->local.usage_index >=HID_MAX_USAGES ) {hid_err (parser->device,"usage index exceeded\n" );return -1 ; } parser->local.usage[parser->local.usage_index] = usage; + parser->local.usage_size[parser->local.usage_index] = size; parser->local.collection_index[parser->local.usage_index] = parser->collection_stack_ptr ? parser->collection_stack[parser->collection_stack_ptr -1 ] :0 ;
@@ -463,10 +464,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)return 0 ; } -if (item->size <=2 ) - data = (parser->global.usage_page <<16 ) + data; - -return hid_add_usage (parser, data); +return hid_add_usage (parser, data, item->size);case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM :
@@ -475,9 +473,6 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)return 0 ; } -if (item->size <=2 ) - data = (parser->global.usage_page <<16 ) + data; - parser->local.usage_minimum = data;return 0 ;
@@ -488,9 +483,6 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)return 0 ; } -if (item->size <=2 ) - data = (parser->global.usage_page <<16 ) + data; - count = data - parser->local.usage_minimum;if (count + parser->local.usage_index >=HID_MAX_USAGES ) {/*
@@ -510,7 +502,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item) }for (n = parser->local.usage_minimum; n <= data; n++) -if (hid_add_usage (parser, n)) { +if (hid_add_usage (parser, n, item->size)) {dbg_hid ("hid_add_usage failed\n" );return -1 ; }
@@ -524,6 +516,22 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)return 0 ; } +/* +* Concatenate Usage Pages into Usages where relevant: +* As per specification, 6.2.2.8: "When the parser encounters a main item it +* concatenates the last declared Usage Page with a Usage to form a complete +* usage value." +*/ + +static void hid_concatenate_usage_page (struct hid_parser *parser) +{ +int i; + +for (i =0 ; i < parser->local.usage_index; i++) +if (parser->local.usage_size[i] <=2 ) + parser->local.usage[i] += parser->global.usage_page <<16 ; +} +/* * Process a main item. */
@@ -533,6 +541,8 @@ static int hid_parser_main(struct hid_parser *parser, struct hid_item *item)__u32 data;int ret; +hid_concatenate_usage_page (parser); + data =item_udata (item);switch (item->tag) {
@@ -746,6 +756,8 @@ static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)__u32 data;int i; +hid_concatenate_usage_page (parser); + data =item_udata (item);switch (item->tag) {
include/linux/hid.h +1 -0
@@ -372,6 +372,7 @@ struct hid_global {struct hid_local {unsigned usage[HID_MAX_USAGES ];/* usage array */ +u8 usage_size[HID_MAX_USAGES ];/* usage size array */ unsigned collection_index[HID_MAX_USAGES ];/* collection index array */ unsigned usage_index;unsigned usage_minimum;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 162/241 ASoC: eukrea-tlv320: fix a leaked reference by adding missing of_node_put
In reply to Greg Kroah-Hartman[ Upstream commit b820d52e7eed7b30b2dfef5f4213a2bc3cbea6f3 ]
The call to of_parse_phandle returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage.
Detected by coccinelle with the following warnings:
./sound/soc/fsl/eukrea-tlv320.c:121:3-9: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 102, but without a correspo nding object release within this function.
./sound/soc/fsl/eukrea-tlv320.c:127:3-9: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 102, but without a correspo nding object release within this function.
--- sound/soc/fsl/eukrea-tlv320.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/fsl/eukrea-tlv320.c +2 -2
@@ -119,13 +119,13 @@ static int eukrea_tlv320_probe(struct platform_device *pdev)if (ret) {dev_err (&pdev->dev,"fsl,mux-int-port node missing or invalid.\n" ); -return ret; + goto err; } ret =of_property_read_u32 (np,"fsl,mux-ext-port" , &ext_port);if (ret) {dev_err (&pdev->dev,"fsl,mux-ext-port node missing or invalid.\n" ); -return ret; + goto err; }/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 163/241 ASoC: fsl_utils: fix a leaked reference by adding missing of_node_put
In reply to Greg Kroah-Hartman[ Upstream commit c705247136a523488eac806bd357c3e5d79a7acd ]
The call to of_parse_phandle returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage.
Detected by coccinelle with the following warnings:
./sound/soc/fsl/fsl_utils.c:74:2-8: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 38, but without a corresponding object release within this function.
--- sound/soc/fsl/fsl_utils.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/fsl/fsl_utils.c +1 -0
@@ -75,6 +75,7 @@ int fsl_asoc_get_dma_channel(struct device_node *ssi_np, iprop =of_get_property (dma_np,"cell-index" ,NULL );if (!iprop) {of_node_put (dma_np); +of_node_put (dma_channel_np);return -EINVAL ; } *dma_id =be32_to_cpup (iprop);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 164/241 cxgb3/l2t: Fix undefined behaviour
In reply to Greg Kroah-Hartman[ Upstream commit 76497732932f15e7323dc805e8ea8dc11bb587cf ]
The use of zero-sized array causes undefined behaviour when it is not the last member in a structure. As it happens to be in this case.
Also, the current code makes use of a language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as this one is a flexible array member, introduced in C99:
struct foo {
int stuff;
struct boo array[];
};By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last. Which is beneficial to cultivate a high-quality code.
--- drivers/net/ethernet/chelsio/cxgb3/l2t.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/chelsio/cxgb3/l2t.h +1 -1
@@ -75,8 +75,8 @@ struct l2t_data {struct l2t_entry *rover;/* starting point for next allocation */ atomic_t nfree;/* number of free entries */ rwlock_t lock; -struct l2t_entry l2tab[0 ];struct rcu_head rcu_head;/* to handle rcu cleanup */ +struct l2t_entry l2tab[]; }; typedef void (*arp_failure_handler_func)(struct t3cdev * dev,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 165/241 spi: tegra114: reset controller on probe
In reply to Greg Kroah-Hartman[ Upstream commit 019194933339b3e9b486639c8cb3692020844d65 ]
Fixes: SPI driver can be built as module so perform SPI controller reset on probe to make sure it is in valid state before initiating transfer.
--- drivers/spi/spi-tegra114.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-)
drivers/spi/spi-tegra114.c +18 -14
@@ -1067,27 +1067,19 @@ static int tegra_spi_probe(struct platform_device *pdev) spi_irq =platform_get_irq (pdev,0 ); tspi->irq = spi_irq; - ret =request_threaded_irq (tspi->irq, tegra_spi_isr, - tegra_spi_isr_thread,IRQF_ONESHOT , -dev_name (&pdev->dev), tspi); -if (ret <0 ) { -dev_err (&pdev->dev,"Failed to register ISR for IRQ %d\n" , - tspi->irq); - goto exit_free_master; - } tspi->clk =devm_clk_get (&pdev->dev,"spi" );if (IS_ERR (tspi->clk)) {dev_err (&pdev->dev,"can not get clock\n" ); ret =PTR_ERR (tspi->clk); - goto exit_free_irq; + goto exit_free_master; } tspi->rst =devm_reset_control_get (&pdev->dev,"spi" );if (IS_ERR (tspi->rst)) {dev_err (&pdev->dev,"can not get reset\n" ); ret =PTR_ERR (tspi->rst); - goto exit_free_irq; + goto exit_free_master; } tspi->max_buf_size =SPI_FIFO_DEPTH <<2 ;
@@ -1095,7 +1087,7 @@ static int tegra_spi_probe(struct platform_device *pdev) ret =tegra_spi_init_dma_param (tspi, true);if (ret <0 ) - goto exit_free_irq; + goto exit_free_master; ret =tegra_spi_init_dma_param (tspi, false);if (ret <0 ) goto exit_rx_dma_free;
@@ -1117,18 +1109,32 @@ static int tegra_spi_probe(struct platform_device *pdev)dev_err (&pdev->dev,"pm runtime get failed, e = %d\n" , ret); goto exit_pm_disable; } + +reset_control_assert (tspi->rst); +udelay (2 ); +reset_control_deassert (tspi->rst); tspi->def_command1_reg =SPI_M_S ;tegra_spi_writel (tspi, tspi->def_command1_reg,SPI_COMMAND1 );pm_runtime_put (&pdev->dev); + ret =request_threaded_irq (tspi->irq, tegra_spi_isr, + tegra_spi_isr_thread,IRQF_ONESHOT , +dev_name (&pdev->dev), tspi); +if (ret <0 ) { +dev_err (&pdev->dev,"Failed to register ISR for IRQ %d\n" , + tspi->irq); + goto exit_pm_disable; + } master->dev.of_node = pdev->dev.of_node; ret =devm_spi_register_master (&pdev->dev, master);if (ret <0 ) {dev_err (&pdev->dev,"can not register to master err %d\n" , ret); - goto exit_pm_disable; + goto exit_free_irq; }return ret; +exit_free_irq: +free_irq (spi_irq, tspi); exit_pm_disable:pm_runtime_disable (&pdev->dev);if (!pm_runtime_status_suspended (&pdev->dev))
@@ -1136,8 +1142,6 @@ static int tegra_spi_probe(struct platform_device *pdev)tegra_spi_deinit_dma_param (tspi, false); exit_rx_dma_free:tegra_spi_deinit_dma_param (tspi, true); -exit_free_irq: -free_irq (spi_irq, tspi); exit_free_master:spi_master_put (master);return ret;
Signature · 1 line
2.20.1