4.0.2-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 4.0.2-stable review
This is the start of the stable review cycle for the 4.0.2 release. There are 220 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 Mon May 4 18:58:12 UTC 2015. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.0/stable-review/patch-4.0.2-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.0.2-rc1
Florian Westphal <[email protected]>
netfilter: bridge: really save frag_max_size between PRE and POST_ROUTING
Daniel Borkmann <[email protected]>
netfilter: x_tables: fix cgroup matching on non-full sks
Junjie Mao <[email protected]>
driver core: bus: Goto appropriate labels on failure in bus_add_device
Linus Walleij <[email protected]>
drivers: platform: parse IRQ flags from resources
Dan Carpenter <[email protected]>
memstick: mspro_block: add missing curly braces
Nishanth Menon <[email protected]>
C6x: time: Ensure consistency in __init
Vutla, Lokesh <[email protected]>
crypto: omap-aes - Fix support for unequal lengths
Nicolas Iooss <[email protected]>
wl18xx: show rx_frames_per_rates as an array as it really is
mancha security <[email protected]>
lib: memzero_explicit: use barrier instead of OPTIMIZER_HIDE_VAR
David Rientjes <[email protected]>
mm, thp: really limit transparent hugepage allocation to local node
Daniel Borkmann <[email protected]>
ebpf: verifier: check that call reg with ARG_ANYTHING is initialized
Johannes Berg <[email protected]>
mac80211: send AP probe as unicast again
Sabrina Dubroca <[email protected]>
e1000: add dummy allocator to fix race condition between mtu change and netpoll
Juri Lelli <[email protected]>
sched/deadline: Always enqueue on previous rq when dl_task_timer() fires
Anna Schumaker <[email protected]>
NFS: Add a stub for GETDEVICELIST
Peng Tao <[email protected]>
nfs: remove WARN_ON_ONCE from nfs_direct_good_bytes
Peng Tao <[email protected]>
nfs: fix DIO good bytes calculation
Jeff Layton <[email protected]>
nfs: fix high load average due to callback thread sleeping
Giuseppe Cantavenera <[email protected]>
nfsd: fix nsfd startup race triggering BUG_ON
Mark Salter <[email protected]>
nfsd: eliminate NFSD_DEBUG
J. Bruce Fields <[email protected]>
nfsd4: disallow SEEK with special stateids
J. Bruce Fields <[email protected]>
nfsd4: fix READ permission checking
J. Bruce Fields <[email protected]>
nfsd4: disallow ALLOCATE with special stateids
Nicolas Iooss <[email protected]>
Revert "nfs: replace nfs_add_stats with nfs_inc_stats when add one"
Al Viro <[email protected]>
RCU pathwalk breakage when running into a symlink overmounting something
Dmitry Torokhov <[email protected]>
drm/i915: cope with large i2c transfers
Imre Deak <[email protected]>
drm/i915: vlv: fix save/restore of GFX_MAX_REQ_COUNT reg
Laurent Pinchart <[email protected]>
drm: adv7511: Fix nested sleep when reading EDID
Laurent Pinchart <[email protected]>
drm: adv7511: Fix DDC error interrupt handling
Daniel Vetter <[email protected]>
drm/i915: Dont enable CS_PARSER_ERROR interrupts at all
Krzysztof Kozlowski <[email protected]>
drm/exynos: Enable DP clock to fix display on Exynos5250 and other
Alex Deucher <[email protected]>
drm/radeon: fix doublescan modes (v2)
Mark Brown <[email protected]>
i2c: core: Export bus recovery functions
Charles Keepax <[email protected]>
i2c: Mark adapter devices with pm_runtime_no_callbacks
Dmitry Torokhov <[email protected]>
i2c: rk3x: report number of messages transmitted
Wolfram Sang <[email protected]>
i2c: mux: use proper dev when removing "channel-X" symlinks
Joonsoo Kim <[email protected]>
tracing: Fix incorrect enabling of trace events by boot cmdline
Rabin Vincent <[email protected]>
tracing: Handle ftrace_dump() atomic context in graph_trace_open()
Sagi Grimberg <[email protected]>
IB/iser: Fix wrong calculation of protection buffer length
Erez Shitrit <[email protected]>
IB/mlx4: Fix WQE LSO segment calculation
Yann Droneaud <[email protected]>
IB/core: don't disallow registering region starting at 0x0
Yann Droneaud <[email protected]>
IB/core: disallow registering 0-sized memory region
Ezequiel Garcia <[email protected]>
stk1160: Make sure current buffer is released
Sifan Naeem <[email protected]>
rc: img-ir: fix error in parameters passed to irq_free()
James Bottomley <[email protected]>
mvsas: fix panic on expander attached SATA devices
K. Y. Srinivasan <[email protected]>
Drivers: hv: vmbus: Fix a bug in the error path in vmbus_open()
Martin K. Petersen <[email protected]>
sd: Fix missing ATO tag check
Martin K. Petersen <[email protected]>
sd: Unregister integrity profile
Peter Hurley <[email protected]>
serial: 8250: Check UART_SCR is writable
Uwe Kleine-König <[email protected]>
serial: imx: Fix clearing of receiver overrun flag
Ken Xue <[email protected]>
serial: 8250_dw: add support for AMD SOC Carrizo
Ben Collins <[email protected]>
dm crypt: fix deadlock when async crypto algorithm returns -EBUSY
Stephen Boyd <[email protected]>
clk: qcom: Fix ipq806x LCC frequency tables
Archit Taneja <[email protected]>
clk: qcom: fix RCG M/N counter configuration
Stephen Boyd <[email protected]>
clk: qcom: Properly change rates for ahbix clock
Stephen Boyd <[email protected]>
clk: qcom: Fix i2c frequency table
Thierry Reding <[email protected]>
clk: tegra: Use the proper parent for plld_dsi
Thierry Reding <[email protected]>
clk: tegra: Register the proper number of resets
Bartlomiej Zolnierkiewicz <[email protected]>
clk: samsung: exynos4: Disable ARMCLK down feature on Exynos4210 SoC
Gregory CLEMENT <[email protected]>
gpio: mvebu: Fix mask/unmask managment per irq chip type
Max Filippov <[email protected]>
xtensa: ISS: fix locking in TAP network adapter
Max Filippov <[email protected]>
xtensa: provide __NR_sync_file_range2 instead of __NR_sync_file_range
Max Filippov <[email protected]>
xtensa: xtfpga: fix hardware lockup caused by LCD driver
Rafael J. Wysocki <[email protected]>
ACPI / scan: Annotate physical_node_lock in acpi_scan_is_offline()
Rafael J. Wysocki <[email protected]>
ACPICA: Store GPE register enable masks upfront
Octavian Purdila <[email protected]>
ACPICA: Tables: Don't release ACPI_MTX_TABLES in acpi_tb_install_standard_table().
Lv Zheng <[email protected]>
ACPICA: Utilities: split IO address types from data type models.
Howard Mitchell <[email protected]>
ASoC: pcm512x: Fix divide by zero issue
Howard Mitchell <[email protected]>
ASoC: pcm512x: Add 'Analogue' prefix to analogue volume controls
Manish Badarkhe <[email protected]>
ASoC: davinci-evm: drop un-necessary remove function
Sergej Sawazki <[email protected]>
ASoC: wm8741: Fix rates constraints values
Pascal Huerst <[email protected]>
ASoC: cs4271: Increase delay time after reset
Michael Ellerman <[email protected]>
powerpc/cell: Fix cell iommu after it_page_shift changes
Michael Ellerman <[email protected]>
powerpc/cell: Fix crash in iic_setup_cpu() after per_cpu changes
Dave Olson <[email protected]>
powerpc: Fix missing L2 cache size in /sys/devices/system/cpu
Anton Blanchard <[email protected]>
powerpc, jump_label: Include linux/jump_label.h to get HAVE_JUMP_LABEL define
Gavin Shan <[email protected]>
powerpc/powernv: Don't map M64 segments using M32DT
Will Deacon <[email protected]>
arm64: errata: add workaround for cortex-a53 erratum #845719
Mark Rutland <[email protected]>
arm64: apply alternatives for !SMP kernels
Steve Capper <[email protected]>
arm64: Adjust EFI libstub object include logic
Mark Rutland <[email protected]>
arm64: head.S: ensure visibility of page tables
Bo Yan <[email protected]>
arm64: fix midr range for Cortex-A57 erratum 832075
Alexander Ploumistos <[email protected]>
Bluetooth: ath3k: Add support Atheros AR5B195 combo Mini PCIe card
Sagi Grimberg <[email protected]>
iser-target: Fix possible deadlock in RDMA_CM connection error
Sagi Grimberg <[email protected]>
iser-target: Fix session hang in case of an rdma read DIF error
Akinobu Mita <[email protected]>
target/file: Fix SG table for prot_buf initialization
Akinobu Mita <[email protected]>
target/file: Fix UNMAP with DIF protection support
Akinobu Mita <[email protected]>
target/file: Fix BUG() when CONFIG_DEBUG_SG=y and DIF protection enabled
Nicholas Bellinger <[email protected]>
target: Fix COMPARE_AND_WRITE with SG_TO_MEM_NOALLOC handling
Nicholas Bellinger <[email protected]>
iscsi-target: Convert iscsi_thread_set usage to kthread.h
K. Y. Srinivasan <[email protected]>
scsi: storvsc: Fix a bug in copy_from_bounce_buffer()
Brian Norris <[email protected]>
UBI: fix check for "too many bytes"
Brian Norris <[email protected]>
UBI: initialize LEB number variable
Brian Norris <[email protected]>
UBI: fix out of bounds write
Brian Norris <[email protected]>
UBI: account for bitflips in both the VID header and data
Thomas D <[email protected]>
tools/power turbostat: Use $(CURDIR) instead of $(PWD) and add support for O= option in Makefile
Steven Rostedt (Red Hat) <[email protected]>
tools lib traceevent kbuffer: Remove extra update to data pointer in PADDING
Anton Blanchard <[email protected]>
powerpc/perf: Cap 64bit userspace backtraces to PERF_MAX_STACK_DEPTH
Vinson Lee <[email protected]>
perf tools: Work around lack of sched_getcpu in glibc < 2.6.
H.J. Lu <[email protected]>
perf tools: Fix perf-read-vdsox32 not building and lib64 install dir
Vinson Lee <[email protected]>
perf symbols: Define STT_GNU_IFUNC for glibc 2.9 and older.
Jarkko Sakkinen <[email protected]>
tpm: fix: sanitized code paths in tpm_chip_register()
Eric W. Biederman <[email protected]>
mnt: Update detach_mounts to leave mounts connected
Eric W. Biederman <[email protected]>
mnt: Fix the error check in __detach_mounts
Eric W. Biederman <[email protected]>
mnt: Honor MNT_LOCKED when detaching mounts
Eric W. Biederman <[email protected]>
mnt: Factor umount_mnt from umount_tree
Eric W. Biederman <[email protected]>
mnt: Factor out unhash_mnt from detach_mnt and umount_tree
Eric W. Biederman <[email protected]>
mnt: Don't propagate unmounts to locked mounts
Eric W. Biederman <[email protected]>
mnt: On an unmount propagate clearing of MNT_LOCKED
Eric W. Biederman <[email protected]>
mnt: Delay removal from the mount hash.
Eric W. Biederman <[email protected]>
mnt: Add MNT_UMOUNT flag
Eric W. Biederman <[email protected]>
mnt: In umount_tree reuse mnt_list instead of mnt_hash
Eric W. Biederman <[email protected]>
mnt: Don't propagate umounts in __detach_mounts
Eric W. Biederman <[email protected]>
mnt: Improve the umount_tree flags
Lukas Czerner <[email protected]>
ext4: make fsync to sync parent dir in no-journal for real this time
Marek Vasut <[email protected]>
rtlwifi: rtl8192cu: Add new device ID
Larry Finger <[email protected]>
rtlwifi: rtl8192cu: Add new USB ID
Christophe Ricard <[email protected]>
NFC: st21nfcb: Retry i2c_master_send if it returns a negative value
Nicolas Ferre <[email protected]>
net/macb: fix the peripheral version test
Len Brown <[email protected]>
intel_idle: Update support for Silvermont Core in Baytrail SOC
Oleg Nesterov <[email protected]>
ptrace: fix race between ptrace_resume() and wait_task_stopped()
Michael Davidson <[email protected]>
fs/binfmt_elf.c: fix bug in loading of PIE binaries
Johan Hovold <[email protected]>
mfd: core: Fix platform-device name collisions
Hans de Goede <[email protected]>
Input: alps - fix touchpad buttons getting stuck when used with trackpoint
Ulrik De Bie <[email protected]>
Input: elantech - fix absolute mode setting on some ASUS laptops
Hui Wang <[email protected]>
ALSA: hda - fix headset mic detection problem for one more machine
Kailang Yang <[email protected]>
ALSA: hda/realtek - Fix Headphone Mic doesn't recording for ALC256
David Henningsson <[email protected]>
ALSA: hda - fix "num_steps = 0" error on ALC256
Jo-Philipp Wich <[email protected]>
ALSA: hda/realtek - Enable the ALC292 dock fixup on the Thinkpad T450
Michael Gernoth <[email protected]>
ALSA: emu10k1: don't deadlock in proc-functions
Adam Honse <[email protected]>
ALSA: usb-audio: Don't attempt to get Microsoft Lifecam Cinema sample rate
Yves-Alexis Perez <[email protected]>
ALSA: hda - Add dock support for ThinkPad X250 (17aa:2226)
Boris Brezillon <[email protected]>
clk: at91: usb: propagate rate modification to the parent clk
Felipe Balbi <[email protected]>
usb: core: hub: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: isp1760: hcd: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: dwc2: hcd: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: host: sl811: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: host: ehci: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: host: xhci: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: host: isp116x: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: host: r8a66597: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: host: fotg210: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: host: uhci: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: host: fusbh200: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: host: oxu210hp: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: musb: use new USB_RESUME_TIMEOUT
Felipe Balbi <[email protected]>
usb: define a generic USB_RESUME_TIMEOUT macro
Axel Lin <[email protected]>
usb: phy: Find the right match in devm_usb_phy_match
Felipe Balbi <[email protected]>
usb: musb: core: fix TX/RX endpoint order
Andreas Faerber <[email protected]>
ARM: dts: fix mmc node updates for exynos5250-spring
Sebastian Hesselbarth <[email protected]>
ARM: dts: dove: Fix uart[23] reg property
Nicolas Ferre <[email protected]>
ARM: at91/dt: sama5d3 xplained: add phy address for macb1
Charles Keepax <[email protected]>
ARM: S3C64XX: Use fixed IRQ bases to avoid conflicts on Cragganmore
Gregory CLEMENT <[email protected]>
ARM: mvebu: Disable CPU Idle on Armada 38x
Andrey Ryabinin <[email protected]>
ARM: 8320/1: fix integer overflow in ELF_ET_DYN_BASE
Russell King <[email protected]>
ARM: fix broken hibernation
Andrew Elble <[email protected]>
NFS: fix BUG() crash in notify_change() with patch to chown_common()
Oliver Neukum <[email protected]>
HID: add quirk for PIXART OEM mouse used by HP
Oliver Neukum <[email protected]>
HID: add HP OEM mouse to quirk ALWAYS_POLL
Krzysztof Kozlowski <[email protected]>
power_supply: ipaq_micro_battery: Check return values in probe
Krzysztof Kozlowski <[email protected]>
power_supply: ipaq_micro_battery: Fix leaking workqueue
Krzysztof Kozlowski <[email protected]>
power_supply: lp8788-charger: Fix leaked power supply on probe fail
Krzysztof Kozlowski <[email protected]>
power_supply: twl4030_madc: Check return value of power_supply_register
Steven Rostedt <[email protected]>
ring-buffer: Replace this_cpu_*() with __this_cpu_*()
Krzysztof Kozlowski <[email protected]>
compal-laptop: Check return value of power_supply_register
Krzysztof Kozlowski <[email protected]>
compal-laptop: Fix leaking hwmon device
Ian Abbott <[email protected]>
spi: spidev: fix possible arithmetic overflow for multi-transfer message
Lucas Stach <[email protected]>
spi: imx: read back the RX/TX watermark levels earlier
Chen-Yu Tsai <[email protected]>
mmc: sunxi: Use devm_reset_control_get_optional() for reset control
Geert Uytterhoeven <[email protected]>
mmc: tmio: Remove bogus un-initialization in tmio_mmc_host_free()
Oliver Neukum <[email protected]>
cdc-wdm: fix endianness bug in debug statements
Sudeep Holla <[email protected]>
drivers/base: cacheinfo: validate device node for all the caches
Christoph Hellwig <[email protected]>
megaraid_sas: use raw_smp_processor_id()
NeilBrown <[email protected]>
md/raid0: fix bug with chunksize not a power of 2.
Malcolm Priestley <[email protected]>
staging: vt6655: use ieee80211_tx_info to select packet type.
Alistair Strachan <[email protected]>
staging: android: sync: Fix memory corruption in sync_timeline_signal().
Sudip Mukherjee <[email protected]>
staging: panel: fix lcd type
Huacai Chen <[email protected]>
MIPS: Hibernate: flush TLB entries earlier
Huacai Chen <[email protected]>
MIPS: Loongson-3: Add IRQF_NO_SUSPEND to Cascade irqaction
Markos Chandras <[email protected]>
MIPS: unaligned: Fix regular load/store instruction emulation for EVA
Markos Chandras <[email protected]>
MIPS: unaligned: Surround load/store macros in do {} while statements
Markos Chandras <[email protected]>
MIPS: unaligned: Prevent EVA instructions on kernel unaligned accesses
Markos Chandras <[email protected]>
MIPS: asm: asm-eva: Introduce kernel load/store variants
Markos Chandras <[email protected]>
MIPS: Malta: Detect and fix bad memsize values
James Hogan <[email protected]>
MIPS: lose_fpu(): Disable FPU when MSA enabled
James Hogan <[email protected]>
MIPS: KVM: Handle MSA Disabled exceptions from guest
Ben Serebrin <[email protected]>
KVM: VMX: Preserve host CR4.MCE value while in guest mode.
Andre Przywara <[email protected]>
KVM: arm/arm64: check IRQ number on userland injection
Radim Krčmář <[email protected]>
KVM: use slowpath for cross page cached accesses
Heiko Carstens <[email protected]>
s390/hibernate: fix save and restore of kernel text section
Jens Freimann <[email protected]>
KVM: s390: fix get_all_floating_irqs
Ekaterina Tumanova <[email protected]>
KVM: s390: Zero out current VMDB of STSI before including level3 data.
David Hildenbrand <[email protected]>
KVM: s390: reinjection of irqs can fail in the tpi handler
David Hildenbrand <[email protected]>
KVM: s390: fix handling of write errors in the tpi handler
Andrzej Pietrasiewicz <[email protected]>
usb: gadget: printer: enqueue printer's response for setup request
Scott Wood <[email protected]>
powerpc/hugetlb: Call mm_dec_nr_pmds() in hugetlb_free_pmd_range()
Gerald Schaefer <[email protected]>
mm/hugetlb: use pmd_page() in follow_huge_pmd()
Filipe Manana <[email protected]>
Btrfs: fix inode eviction infinite loop after extent_same ioctl
Filipe Manana <[email protected]>
Btrfs: fix inode eviction infinite loop after cloning into it
David Sterba <[email protected]>
btrfs: don't accept bare namespace as a valid xattr
Filipe Manana <[email protected]>
Btrfs: fix log tree corruption when fs mounted with -o discard
Nadav Amit <[email protected]>
KVM: x86: Fix MSR_IA32_BNDCFGS in msrs_to_save
Linus Torvalds <[email protected]>
x86: fix special __probe_kernel_write() tail zeroing case
Peter Zijlstra <[email protected]>
perf/x86/intel: Fix Core2,Atom,NHM,WSM cycles:pp events
Mike Galbraith <[email protected]>
sched/idle/x86: Optimize unnecessary mwait_idle() resched IPIs
Len Brown <[email protected]>
sched/idle/x86: Restore mwait_idle() to fix boot hangs, to improve power savings and to improve performance
Radim Krčmář <[email protected]>
x86: vdso: fix pvclock races with task migration
Marcelo Tosatti <[email protected]>
x86: kvm: Revert "remove sched notifier for cross-cpu migrations"
Andy Lutomirski <[email protected]>
x86/asm/decoder: Fix and enforce max instruction size in the insn decoder
Gu Zheng <[email protected]>
md: fix md io stats accounting broken
Amir Vadai <[email protected]>
net/mlx4_en: Prevent setting invalid RSS hash function
Eric Dumazet <[email protected]>
net: rfs: fix crash in get_rps_cpus()
Alexey Khoroshilov <[email protected]>
pxa168: fix double deallocation of managed resources
Eric Dumazet <[email protected]>
net: fix crash in build_skb()
Eric Dumazet <[email protected]>
net: do not deplete pfmemalloc reserve
Eric Dumazet <[email protected]>
tcp: avoid looping in tcp_send_fin()
Eric Dumazet <[email protected]>
tcp: fix possible deadlock in tcp_send_fin()
Tom Herbert <[email protected]>
ppp: call skb_checksum_complete_unset in ppp_receive_frame
Tom Herbert <[email protected]>
net: add skb_checksum_complete_unset
Sebastian Pöhn <[email protected]>
ip_forward: Drop frames with attached skb->sk
-------------
Diffstat:
Documentation/networking/scaling.txt | 2 +- Documentation/virtual/kvm/devices/s390_flic.txt | 3 + Makefile | 4 +- arch/arm/boot/dts/at91-sama5d3_xplained.dts | 6 + arch/arm/boot/dts/dove.dtsi | 4 +- arch/arm/boot/dts/exynos5250-spring.dts | 16 +- arch/arm/include/asm/elf.h | 2 +- arch/arm/include/uapi/asm/kvm.h | 8 +- arch/arm/kernel/hibernate.c | 5 +- arch/arm/kernel/process.c | 10 +- arch/arm/kernel/reboot.h | 6 + arch/arm/kvm/arm.c | 3 +- arch/arm/mach-mvebu/pmsu.c | 16 +- arch/arm/mach-s3c64xx/crag6410.h | 1 + arch/arm/mach-s3c64xx/mach-crag6410.c | 1 + arch/arm64/Kconfig | 25 ++ arch/arm64/Makefile | 2 +- arch/arm64/include/asm/cpufeature.h | 3 +- arch/arm64/include/asm/smp_plat.h | 2 + arch/arm64/include/uapi/asm/kvm.h | 8 +- arch/arm64/kernel/cpu_errata.c | 11 +- arch/arm64/kernel/entry.S | 20 ++ arch/arm64/kernel/head.S | 1 + arch/arm64/kernel/setup.c | 12 + arch/arm64/kernel/smp.c | 2 +- arch/c6x/kernel/time.c | 2 +- arch/mips/include/asm/asm-eva.h | 137 ++++++--- arch/mips/include/asm/fpu.h | 1 + arch/mips/include/asm/kvm_host.h | 2 + arch/mips/kernel/unaligned.c | 340 ++++++++++++++------- arch/mips/kvm/emulate.c | 1 + arch/mips/kvm/mips.c | 4 + arch/mips/kvm/trap_emul.c | 28 ++ arch/mips/loongson/loongson-3/irq.c | 1 + arch/mips/mti-malta/malta-memory.c | 6 + arch/mips/power/hibernate.S | 3 +- arch/powerpc/kernel/cacheinfo.c | 44 ++- arch/powerpc/mm/hugetlbpage.c | 1 + arch/powerpc/perf/callchain.c | 2 +- arch/powerpc/platforms/cell/interrupt.c | 2 +- arch/powerpc/platforms/cell/iommu.c | 2 +- arch/powerpc/platforms/powernv/opal-wrappers.S | 2 +- arch/powerpc/platforms/powernv/pci-ioda.c | 3 +- arch/powerpc/platforms/pseries/hvCall.S | 2 +- arch/powerpc/platforms/pseries/lpar.c | 2 +- arch/s390/kernel/suspend.c | 4 + arch/s390/kvm/interrupt.c | 62 ++-- arch/s390/kvm/kvm-s390.h | 4 +- arch/s390/kvm/priv.c | 42 ++- arch/x86/include/asm/insn.h | 2 +- arch/x86/include/asm/mwait.h | 8 + arch/x86/include/asm/pvclock.h | 1 + arch/x86/kernel/cpu/perf_event_intel_ds.c | 8 + arch/x86/kernel/process.c | 51 ++++ arch/x86/kernel/pvclock.c | 44 +++ arch/x86/kvm/vmx.c | 12 +- arch/x86/kvm/x86.c | 10 +- arch/x86/lib/insn.c | 7 + arch/x86/lib/usercopy_64.c | 2 +- arch/x86/vdso/vclock_gettime.c | 34 ++- arch/xtensa/Kconfig | 30 ++ arch/xtensa/include/uapi/asm/unistd.h | 2 +- arch/xtensa/platforms/iss/network.c | 29 +- arch/xtensa/platforms/xtfpga/Makefile | 3 +- .../platforms/xtfpga/include/platform/hardware.h | 3 - .../xtensa/platforms/xtfpga/include/platform/lcd.h | 15 + arch/xtensa/platforms/xtfpga/lcd.c | 55 ++-- drivers/acpi/acpica/evgpe.c | 5 +- drivers/acpi/acpica/hwgpe.c | 11 +- drivers/acpi/acpica/tbinstal.c | 1 - drivers/acpi/scan.c | 6 +- drivers/base/bus.c | 4 +- drivers/base/cacheinfo.c | 13 +- drivers/base/platform.c | 9 + drivers/bluetooth/ath3k.c | 1 + drivers/bluetooth/btusb.c | 1 + drivers/char/tpm/tpm-chip.c | 66 ++-- drivers/clk/at91/clk-usb.c | 64 +++- drivers/clk/qcom/clk-rcg.c | 62 ++++ drivers/clk/qcom/clk-rcg.h | 1 + drivers/clk/qcom/clk-rcg2.c | 2 +- drivers/clk/qcom/gcc-ipq806x.c | 2 +- drivers/clk/qcom/lcc-ipq806x.c | 23 +- drivers/clk/samsung/clk-exynos4.c | 11 +- drivers/clk/tegra/clk-tegra124.c | 14 +- drivers/clk/tegra/clk.c | 2 +- drivers/crypto/omap-aes.c | 14 +- drivers/gpio/gpio-mvebu.c | 24 +- drivers/gpu/drm/exynos/exynos_dp_core.c | 10 + drivers/gpu/drm/exynos/exynos_drm_fimd.c | 19 ++ drivers/gpu/drm/exynos/exynos_drm_fimd.h | 15 + drivers/gpu/drm/i2c/adv7511.c | 102 ++++--- drivers/gpu/drm/i915/i915_drv.c | 4 +- drivers/gpu/drm/i915/i915_irq.c | 8 +- drivers/gpu/drm/i915/i915_reg.h | 1 + drivers/gpu/drm/i915/intel_i2c.c | 66 +++- drivers/gpu/drm/radeon/atombios_crtc.c | 8 +- drivers/hid/hid-ids.h | 4 + drivers/hid/usbhid/hid-quirks.c | 2 + drivers/hv/channel.c | 7 +- drivers/i2c/busses/i2c-rk3x.c | 2 +- drivers/i2c/i2c-core.c | 5 + drivers/i2c/i2c-mux.c | 8 +- drivers/idle/intel_idle.c | 14 +- drivers/infiniband/core/umem.c | 7 +- drivers/infiniband/hw/mlx4/qp.c | 3 +- drivers/infiniband/ulp/iser/iser_initiator.c | 4 +- drivers/infiniband/ulp/isert/ib_isert.c | 20 +- drivers/input/mouse/alps.c | 5 +- drivers/input/mouse/elantech.c | 22 ++ drivers/input/mouse/elantech.h | 1 + drivers/md/dm-crypt.c | 12 +- drivers/md/md.c | 6 +- drivers/md/raid0.c | 3 +- drivers/media/rc/img-ir/img-ir-core.c | 2 +- drivers/media/usb/stk1160/stk1160-v4l.c | 17 +- drivers/memstick/core/mspro_block.c | 3 +- drivers/mfd/mfd-core.c | 2 +- drivers/mmc/host/sunxi-mmc.c | 4 +- drivers/mmc/host/tmio_mmc_pio.c | 2 - drivers/mtd/ubi/attach.c | 2 +- drivers/mtd/ubi/cdev.c | 2 +- drivers/mtd/ubi/eba.c | 3 +- drivers/mtd/ubi/wl.c | 2 +- drivers/net/ethernet/cadence/macb.c | 2 +- drivers/net/ethernet/intel/e1000/e1000_main.c | 10 +- drivers/net/ethernet/marvell/pxa168_eth.c | 16 +- drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 29 +- drivers/net/ppp/ppp_generic.c | 1 + drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | 2 + drivers/net/wireless/ti/wl18xx/debugfs.c | 2 +- drivers/net/wireless/ti/wlcore/debugfs.h | 4 +- drivers/nfc/st21nfcb/i2c.c | 4 +- drivers/platform/x86/compal-laptop.c | 10 +- drivers/power/ipaq_micro_battery.c | 22 +- drivers/power/lp8788-charger.c | 4 +- drivers/power/twl4030_madc_battery.c | 7 +- drivers/scsi/megaraid/megaraid_sas_fusion.c | 9 +- drivers/scsi/mvsas/mv_sas.c | 5 +- drivers/scsi/sd.c | 1 + drivers/scsi/sd_dif.c | 2 +- drivers/scsi/storvsc_drv.c | 15 +- drivers/spi/spi-imx.c | 4 +- drivers/spi/spidev.c | 5 +- drivers/staging/android/sync.c | 2 +- drivers/staging/panel/panel.c | 12 +- drivers/staging/vt6655/rxtx.c | 14 +- drivers/target/iscsi/iscsi_target.c | 104 +++---- drivers/target/iscsi/iscsi_target_erl0.c | 13 +- drivers/target/iscsi/iscsi_target_login.c | 59 +++- drivers/target/target_core_file.c | 122 +++++--- drivers/target/target_core_sbc.c | 15 +- drivers/target/target_core_transport.c | 37 ++- drivers/tty/serial/8250/8250_core.c | 3 +- drivers/tty/serial/8250/8250_dw.c | 1 + drivers/tty/serial/imx.c | 8 +- drivers/usb/class/cdc-wdm.c | 12 +- drivers/usb/core/hub.c | 4 +- drivers/usb/dwc2/hcd.c | 2 +- drivers/usb/gadget/legacy/printer.c | 9 + drivers/usb/host/ehci-hcd.c | 10 +- drivers/usb/host/ehci-hub.c | 9 +- drivers/usb/host/fotg210-hcd.c | 2 +- drivers/usb/host/fusbh200-hcd.c | 3 +- drivers/usb/host/isp116x-hcd.c | 2 +- drivers/usb/host/oxu210hp-hcd.c | 7 +- drivers/usb/host/r8a66597-hcd.c | 2 +- drivers/usb/host/sl811-hcd.c | 2 +- drivers/usb/host/uhci-hub.c | 5 +- drivers/usb/host/xhci-ring.c | 2 +- drivers/usb/isp1760/isp1760-hcd.c | 2 +- drivers/usb/musb/musb_core.c | 51 ++-- drivers/usb/musb/musb_virthub.c | 2 +- drivers/usb/phy/phy.c | 4 +- fs/binfmt_elf.c | 9 +- fs/btrfs/extent-tree.c | 5 +- fs/btrfs/ioctl.c | 8 + fs/btrfs/xattr.c | 53 +++- fs/ext4/namei.c | 20 +- fs/lockd/svcsubs.c | 2 +- fs/namei.c | 6 +- fs/namespace.c | 123 +++++--- fs/nfs/callback.c | 6 +- fs/nfs/direct.c | 31 +- fs/nfs/nfs4xdr.c | 6 + fs/nfs/read.c | 2 +- fs/nfs/write.c | 2 +- fs/nfsd/nfs4proc.c | 4 + fs/nfsd/nfs4state.c | 2 +- fs/nfsd/nfs4xdr.c | 12 +- fs/nfsd/nfsctl.c | 16 +- fs/nfsd/nfsd.h | 2 +- fs/open.c | 2 +- fs/pnode.c | 60 +++- fs/pnode.h | 7 +- include/acpi/actypes.h | 24 +- include/acpi/platform/acenv.h | 1 + include/dt-bindings/clock/tegra124-car-common.h | 2 +- include/linux/bpf.h | 4 +- include/linux/mount.h | 1 + include/linux/sched.h | 8 + include/linux/skbuff.h | 13 + include/linux/usb.h | 26 ++ include/target/iscsi/iscsi_target_core.h | 7 + include/target/target_core_base.h | 2 +- include/uapi/linux/nfsd/debug.h | 8 - include/video/samsung_fimd.h | 6 + kernel/bpf/verifier.c | 5 +- kernel/ptrace.c | 20 ++ kernel/sched/core.c | 15 + kernel/sched/deadline.c | 4 +- kernel/trace/ring_buffer.c | 11 +- kernel/trace/trace_events.c | 9 +- kernel/trace/trace_functions_graph.c | 8 +- lib/string.c | 2 +- mm/huge_memory.c | 9 +- mm/hugetlb.c | 3 +- mm/mempolicy.c | 3 +- net/bridge/br_netfilter.c | 17 +- net/core/dev.c | 12 +- net/core/skbuff.c | 30 +- net/ipv4/ip_forward.c | 3 + net/ipv4/tcp_output.c | 64 ++-- net/mac80211/mlme.c | 2 +- net/netfilter/xt_cgroup.c | 2 +- net/netlink/af_netlink.c | 6 +- sound/pci/emu10k1/emuproc.c | 12 - sound/pci/hda/patch_realtek.c | 32 +- sound/soc/codecs/cs4271.c | 4 +- sound/soc/codecs/pcm512x.c | 8 +- sound/soc/codecs/wm8741.c | 8 +- sound/soc/davinci/davinci-evm.c | 10 - sound/usb/quirks.c | 1 + tools/lib/traceevent/kbuffer-parse.c | 1 - tools/perf/config/Makefile | 4 +- tools/perf/tests/make | 2 +- tools/perf/util/cloexec.c | 6 + tools/perf/util/cloexec.h | 6 + tools/perf/util/symbol-elf.c | 4 + tools/power/x86/turbostat/Makefile | 6 +- virt/kvm/arm/vgic.c | 3 + virt/kvm/kvm_main.c | 4 +- 242 files changed, 2402 insertions(+), 1007 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/220 ip_forward: Drop frames with attached skb->sk
4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Sebastian=20P=C3=B6hn?= <[email protected]>
[ Upstream commit 2ab957492d13bb819400ac29ae55911d50a82a13 ]
Initial discussion was:
[FYI] xfrm: Don't lookup sk_policy for timewait sockets
Forwarded frames should not have a socket attached. Especially tw sockets will lead to panics later-on in the stack.
This was observed with TPROXY assigning a tw socket and broken policy routing (misconfigured). As a result frame enters forwarding path instead of input. We cannot solve this in TPROXY as it cannot know that policy routing is broken.
v2:
Remove useless comment
--- net/ipv4/ip_forward.c | 3 +++ 1 file changed, 3 insertions(+)
net/ipv4/ip_forward.c +3 -0
@@ -82,6 +82,9 @@ int ip_forward(struct sk_buff *skb)if (skb->pkt_type !=PACKET_HOST ) goto drop; +if (unlikely (skb->sk)) + goto drop; +if (skb_warn_if_lro (skb)) goto drop;
Greg Kroah-Hartman
maintainerPATCH 2/220 net: add skb_checksum_complete_unset
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom Herbert <[email protected]>
[ Upstream commit 4e18b9adf2f910ec4d30b811a74a5b626e6c6125 ]
This function changes ip_summed to CHECKSUM_NONE if CHECKSUM_COMPLETE is set. This is called to discard checksum-complete when packet is being modified and checksum is not pulled for headers in a layer.
--- include/linux/skbuff.h | 12 ++++++++++++ 1 file changed, 12 insertions(+)
include/linux/skbuff.h +12 -0
@@ -3013,6 +3013,18 @@ static inline bool __skb_checksum_valida*/ #define CHECKSUM_BREAK 76 +/* Unset checksum-complete +* +* Unset checksum complete can be done when packet is being modified +* (uncompressed for instance) and checksum-complete value is +* invalidated. +*/ +static inline void skb_checksum_complete_unset (struct sk_buff *skb) +{ +if (skb->ip_summed ==CHECKSUM_COMPLETE ) + skb->ip_summed =CHECKSUM_NONE ; +} +/* Validate (init) checksum based on checksum complete. * * Return values:
Greg Kroah-Hartman
maintainerPATCH 3/220 ppp: call skb_checksum_complete_unset in ppp_receive_frame
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom Herbert <[email protected]>
[ Upstream commit 3dfb05340ec6676e6fc71a9ae87bbbe66d3c2998 ]
Call checksum_complete_unset in PPP receive to discard checksum-complete value. PPP does not pull checksum for headers and also modifies packet as in VJ compression.
--- drivers/net/ppp/ppp_generic.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ppp/ppp_generic.c +1 -0
@@ -1716,6 +1716,7 @@ ppp_receive_frame(struct ppp *ppp, struc {/* note: a 0-length skb is used as an error indication */ if (skb->len >0 ) { +skb_checksum_complete_unset (skb);#ifdef CONFIG_PPP_MULTILINK /* XXX do channel-level decompression here */ if (PPP_PROTO (skb) ==PPP_MP )
Greg Kroah-Hartman
maintainerPATCH 4/220 tcp: fix possible deadlock in tcp_send_fin()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit d83769a580f1132ac26439f50068a29b02be535e ]
Using sk_stream_alloc_skb() in tcp_send_fin() is dangerous in case a huge process is killed by OOM, and tcp_mem[2] is hit.
To be able to free memory we need to make progress, so this patch allows FIN packets to not care about tcp_mem[2], if skb allocation succeeded.
In a follow-up patch, we might abort tcp_send_fin() infinite loop in case TIF_MEMDIE is set on this thread, as memory allocator did its best getting extra memory already.
This patch reverts d22e15371811 ("tcp: fix tcp fin memory accounting")
--- net/ipv4/tcp_output.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
net/ipv4/tcp_output.c +19 -1
@@ -2751,6 +2751,21 @@ begin_fwd: } } +/* We allow to exceed memory limits for FIN packets to expedite +* connection tear down and (memory) recovery. +* Otherwise tcp_send_fin() could loop forever. +*/ +static void sk_forced_wmem_schedule (struct sock *sk,int size) +{ +int amt, status; + +if (size <= sk->sk_forward_alloc) +return ; + amt =sk_mem_pages (size); + sk->sk_forward_alloc += amt *SK_MEM_QUANTUM ; +sk_memory_allocated_add (sk, amt, &status); +} +/* Send a fin. The caller locks the socket for us. This cannot be * allowed to fail queueing a FIN frame under any circumstances. */
@@ -2773,11 +2788,14 @@ void tcp_send_fin(struct sock *sk) }else {/* Socket is locked, keep trying until memory is available. */ for (;;) { - skb =sk_stream_alloc_skb (sk,0 , sk->sk_allocation); + skb =alloc_skb_fclone (MAX_TCP_HEADER , + sk->sk_allocation);if (skb)break ;yield (); } +skb_reserve (skb,MAX_TCP_HEADER ); +sk_forced_wmem_schedule (sk, skb->truesize);/* FIN eats a sequence byte, write_seq advanced by tcp_queue_skb(). */ tcp_init_nondata_skb (skb, tp->write_seq,TCPHDR_ACK |TCPHDR_FIN );
Greg Kroah-Hartman
maintainerPATCH 5/220 tcp: avoid looping in tcp_send_fin()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 845704a535e9b3c76448f52af1b70e4422ea03fd ]
Presence of an unbound loop in tcp_send_fin() had always been hard to explain when analyzing crash dumps involving gigantic dying processes with millions of sockets.
Lets try a different strategy :
In case of memory pressure, try to add the FIN flag to last packet in write queue, even if packet was already sent. TCP stack will be able to deliver this FIN after a timeout event. Note that this FIN being delivered by a retransmit, it also carries a Push flag given our current implementation.
By checking sk_under_memory_pressure(), we anticipate that cooking many FIN packets might deplete tcp memory.
In the case we could not allocate a packet, even with __GFP_WAIT allocation, then not sending a FIN seems quite reasonable if it allows to get rid of this socket, free memory, and not block the process from eventually doing other useful work.
--- net/ipv4/tcp_output.c | 50 +++++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 21 deletions(-)
net/ipv4/tcp_output.c +29 -21
@@ -2753,7 +2753,8 @@ begin_fwd:/* We allow to exceed memory limits for FIN packets to expedite * connection tear down and (memory) recovery. -* Otherwise tcp_send_fin() could loop forever. +* Otherwise tcp_send_fin() could be tempted to either delay FIN +* or even be forced to close flow without any FIN. */ static void sk_forced_wmem_schedule (struct sock *sk,int size) {
@@ -2766,33 +2767,40 @@ static void sk_forced_wmem_schedule(strusk_memory_allocated_add (sk, amt, &status); } -/* Send a fin. The caller locks the socket for us. This cannot be -* allowed to fail queueing a FIN frame under any circumstances. +/* Send a FIN. The caller locks the socket for us. +* We should try to send a FIN packet really hard, but eventually give up. */ void tcp_send_fin (struct sock *sk) { +struct sk_buff *skb, *tskb =tcp_write_queue_tail (sk);struct tcp_sock *tp =tcp_sk (sk); -struct sk_buff *skb =tcp_write_queue_tail (sk); -int mss_now; -/* Optimization, tack on the FIN if we have a queue of -* unsent frames. But be careful about outgoing SACKS -* and IP options. +/* Optimization, tack on the FIN if we have one skb in write queue and +* this skb was not yet sent, or we are under memory pressure. +* Note: in the latter case, FIN packet will be sent after a timeout, +* as TCP stack thinks it has already been transmitted. */ - mss_now =tcp_current_mss (sk); - -if (tcp_send_head (sk) !=NULL ) { -TCP_SKB_CB (skb)->tcp_flags |=TCPHDR_FIN ; -TCP_SKB_CB (skb)->end_seq++; +if (tskb && (tcp_send_head (sk) ||sk_under_memory_pressure (sk))) { +coalesce: +TCP_SKB_CB (tskb)->tcp_flags |=TCPHDR_FIN ; +TCP_SKB_CB (tskb)->end_seq++; tp->write_seq++; +if (!tcp_send_head (sk)) { +/* This means tskb was already sent. +* Pretend we included the FIN on previous transmit. +* We need to set tp->snd_nxt to the value it would have +* if FIN had been sent. This is because retransmit path +* does not change tp->snd_nxt. +*/ + tp->snd_nxt++; +return ; + } }else { -/* Socket is locked, keep trying until memory is available. */ -for (;;) { - skb =alloc_skb_fclone (MAX_TCP_HEADER , - sk->sk_allocation); -if (skb) -break ; -yield (); + skb =alloc_skb_fclone (MAX_TCP_HEADER , sk->sk_allocation); +if (unlikely (!skb)) { +if (tskb) + goto coalesce; +return ; }skb_reserve (skb,MAX_TCP_HEADER );sk_forced_wmem_schedule (sk, skb->truesize);
@@ -2801,7 +2809,7 @@ void tcp_send_fin(struct sock *sk) TCPHDR_ACK | TCPHDR_FIN);tcp_queue_skb (sk, skb); } -__tcp_push_pending_frames (sk, mss_now,TCP_NAGLE_OFF ); +__tcp_push_pending_frames (sk,tcp_current_mss (sk),TCP_NAGLE_OFF ); }/* We get here when a process closes a file descriptor (either due to
Greg Kroah-Hartman
maintainerPATCH 6/220 net: do not deplete pfmemalloc reserve
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 79930f5892e134c6da1254389577fffb8bd72c66 ]
build_skb() should look at the page pfmemalloc status. If set, this means page allocator allocated this page in the expectation it would help to free other pages. Networking stack can do that only if skb->pfmemalloc is also set.
Also, we must refrain using high order pages from the pfmemalloc reserve, so __page_frag_refill() must also use __GFP_NOMEMALLOC for them. Under memory pressure, using order-0 pages is probably the best strategy.
--- net/core/skbuff.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
net/core/skbuff.c +7 -2
@@ -311,7 +311,11 @@ struct sk_buff *build_skb(void *data, unmemset (skb,0 , offsetof(struct sk_buff , tail)); skb->truesize =SKB_TRUESIZE (size); - skb->head_frag = frag_size !=0 ; +if (frag_size) { + skb->head_frag =1 ; +if (virt_to_head_page (data)->pfmemalloc) + skb->pfmemalloc =1 ; + }atomic_set (&skb->users,1 ); skb->head = data; skb->data = data;
@@ -348,7 +352,8 @@ static struct page *__page_frag_refill(sgfp_t gfp = gfp_mask;if (order) { - gfp_mask |= __GFP_COMP | __GFP_NOWARN | __GFP_NORETRY; + gfp_mask |= __GFP_COMP | __GFP_NOWARN | __GFP_NORETRY | + __GFP_NOMEMALLOC; page =alloc_pages_node (NUMA_NO_NODE , gfp_mask, order); nc->frag.size =PAGE_SIZE << (page ? order :0 ); }
Greg Kroah-Hartman
maintainerPATCH 7/220 net: fix crash in build_skb()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 2ea2f62c8bda242433809c7f4e9eae1c52c40bbe ]
When I added pfmemalloc support in build_skb(), I forgot netlink was using build_skb() with a vmalloc() area.
In this patch I introduce __build_skb() for netlink use, and build_skb() is a wrapper handling both skb->head_frag and skb->pfmemalloc
This means netlink no longer has to hack skb->head_frag
[ 1567.700067] kernel BUG at arch/x86/mm/physaddr.c:26! [ 1567.700067] invalid opcode: 0000 [#1] PREEMPT SMP KASAN [ 1567.700067] Dumping ftrace buffer: [ 1567.700067] (ftrace buffer empty) [ 1567.700067] Modules linked in: [ 1567.700067] CPU: 9 PID: 16186 Comm: trinity-c182 Not tainted 4.0.0-next-20150424-sasha-00037-g4796e21 #2167 [ 1567.700067] task: ffff880127efb000 ti: ffff880246770000 task.ti: ffff880246770000 [ 1567.700067] RIP: __phys_addr (arch/x86/mm/physaddr.c:26 (discriminator 3)) [ 1567.700067] RSP: 0018:ffff8802467779d8 EFLAGS: 00010202 [ 1567.700067] RAX: 000041000ed8e000 RBX: ffffc9008ed8e000 RCX: 000000000000002c [ 1567.700067] RDX: 0000000000000004 RSI: 0000000000000000 RDI: ffffffffb3fd6049 [ 1567.700067] RBP: ffff8802467779f8 R08: 0000000000000019 R09: ffff8801d0168000 [ 1567.700067] R10: ffff8801d01680c7 R11: ffffed003a02d019 R12: ffffc9000ed8e000 [ 1567.700067] R13: 0000000000000f40 R14: 0000000000001180 R15: ffffc9000ed8e000 [ 1567.700067] FS: 00007f2a7da3f700(0000) GS:ffff8801d1000000(0000) knlGS:0000000000000000 [ 1567.700067] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1567.700067] CR2: 0000000000738308 CR3: 000000022e329000 CR4: 00000000000007e0 [ 1567.700067] Stack: [ 1567.700067] ffffc9000ed8e000 ffff8801d0168000 ffffc9000ed8e000 ffff8801d0168000 [ 1567.700067] ffff880246777a28 ffffffffad7c0a21 0000000000001080 ffff880246777c08 [ 1567.700067] ffff88060d302e68 ffff880246777b58 ffff880246777b88 ffffffffad9a6821 [ 1567.700067] Call Trace: [ 1567.700067] build_skb (include/linux/mm.h:508 net/core/skbuff.c:316) [ 1567.700067] netlink_sendmsg (net/netlink/af_netlink.c:1633 net/netlink/af_netlink.c:2329) [ 1567.774369] ? sched_clock_cpu (kernel/sched/clock.c:311) [ 1567.774369] ? netlink_unicast (net/netlink/af_netlink.c:2273) [ 1567.774369] ? netlink_unicast (net/netlink/af_netlink.c:2273) [ 1567.774369] sock_sendmsg (net/socket.c:614 net/socket.c:623) [ 1567.774369] sock_write_iter (net/socket.c:823) [ 1567.774369] ? sock_sendmsg (net/socket.c:806) [ 1567.774369] __vfs_write (fs/read_write.c:479 fs/read_write.c:491) [ 1567.774369] ? get_lock_stats (kernel/locking/lockdep.c:249) [ 1567.774369] ? default_llseek (fs/read_write.c:487) [ 1567.774369] ? vtime_account_user (kernel/sched/cputime.c:701) [ 1567.774369] ? rw_verify_area (fs/read_write.c:406 (discriminator 4)) [ 1567.774369] vfs_write (fs/read_write.c:539) [ 1567.774369] SyS_write (fs/read_write.c:586 fs/read_write.c:577) [ 1567.774369] ? SyS_read (fs/read_write.c:577) [ 1567.774369] ? __this_cpu_preempt_check (lib/smp_processor_id.c:63) [ 1567.774369] ? trace_hardirqs_on_caller (kernel/locking/lockdep.c:2594 kernel/locking/lockdep.c:2636) [ 1567.774369] ? trace_hardirqs_on_thunk (arch/x86/lib/thunk_64.S:42) [ 1567.774369] system_call_fastpath (arch/x86/kernel/entry_64.S:261)
--- include/linux/skbuff.h | 1 + net/core/skbuff.c | 31 ++++++++++++++++++++++--------- net/netlink/af_netlink.c | 6 ++---- 3 files changed, 25 insertions(+), 13 deletions(-)
include/linux/skbuff.h +1 -0
@@ -769,6 +769,7 @@ bool skb_try_coalesce(struct sk_buff *tostruct sk_buff *__alloc_skb (unsigned int size,gfp_t priority,int flags,int node); +struct sk_buff *__build_skb (void *data,unsigned int frag_size);struct sk_buff *build_skb (void *data,unsigned int frag_size);static inline struct sk_buff *alloc_skb (unsigned int size,gfp_t priority)
net/core/skbuff.c +22 -9
@@ -280,13 +280,14 @@ nodata:EXPORT_SYMBOL (__alloc_skb);/** -* build_skb - build a network buffer +* __build_skb - build a network buffer * @data: data buffer provided by caller -* @frag_size: size of fragment, or 0 if head was kmalloced +* @frag_size: size of data, or 0 if head was kmalloced * * Allocate a new &sk_buff. Caller provides space holding head and * skb_shared_info. @data must have been allocated by kmalloc() only if -* @frag_size is 0, otherwise data should come from the page allocator. +* @frag_size is 0, otherwise data should come from the page allocator +* or vmalloc() * The return is the new skb buffer. * On a failure the return is %NULL, and @data is not freed. * Notes :
@@ -297,7 +298,7 @@ EXPORT_SYMBOL(__alloc_skb);* before giving packet to stack. * RX rings only contains data buffers, not full skbs. */ -struct sk_buff *build_skb (void *data,unsigned int frag_size) +struct sk_buff *__build_skb (void *data,unsigned int frag_size) {struct skb_shared_info *shinfo;struct sk_buff *skb;
@@ -311,11 +312,6 @@ struct sk_buff *build_skb(void *data, unmemset (skb,0 , offsetof(struct sk_buff , tail)); skb->truesize =SKB_TRUESIZE (size); -if (frag_size) { - skb->head_frag =1 ; -if (virt_to_head_page (data)->pfmemalloc) - skb->pfmemalloc =1 ; - }atomic_set (&skb->users,1 ); skb->head = data; skb->data = data;
@@ -332,6 +328,23 @@ struct sk_buff *build_skb(void *data, unreturn skb; } + +/* build_skb() is wrapper over __build_skb(), that specifically +* takes care of skb->head and skb->pfmemalloc +* This means that if @frag_size is not zero, then @data must be backed +* by a page fragment, not kmalloc() or vmalloc() +*/ +struct sk_buff *build_skb (void *data,unsigned int frag_size) +{ +struct sk_buff *skb =__build_skb (data, frag_size); + +if (skb && frag_size) { + skb->head_frag =1 ; +if (virt_to_head_page (data)->pfmemalloc) + skb->pfmemalloc =1 ; + } +return skb; +}EXPORT_SYMBOL (build_skb);struct netdev_alloc_cache {
net/netlink/af_netlink.c +2 -4
@@ -1616,13 +1616,11 @@ static struct sk_buff *netlink_alloc_larif (data ==NULL )return NULL ; - skb =build_skb (data, size); + skb =__build_skb (data, size);if (skb ==NULL )vfree (data); -else { - skb->head_frag =0 ; +else skb->destructor = netlink_skb_destructor; - }return skb; }
Greg Kroah-Hartman
maintainerPATCH 8/220 pxa168: fix double deallocation of managed resources
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Khoroshilov <[email protected]>
[ Upstream commit 0e03fd3e335d272bee88fe733d5fd13f5c5b7140 ]
Commit 43d3ddf87a57 ("net: pxa168_eth: add device tree support") starts to use managed resources by adding devm_clk_get() and devm_ioremap_resource(), but it leaves explicit iounmap() and clock_put() in pxa168_eth_remove() and in failure handling code of pxa168_eth_probe(). As a result double free can happen.
The patch removes explicit resource deallocation. Also it converts clk_disable() to clk_disable_unprepare() to make it symmetrical with clk_prepare_enable().
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/net/ethernet/marvell/pxa168_eth.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)
drivers/net/ethernet/marvell/pxa168_eth.c +5 -11
@@ -1508,7 +1508,8 @@ static int pxa168_eth_probe(struct platf np =of_parse_phandle (pdev->dev.of_node,"phy-handle" ,0 );if (!np) {dev_err (&pdev->dev,"missing phy-handle\n" ); -return -EINVAL ; + err = -EINVAL ; + goto err_netdev; }of_property_read_u32 (np,"reg" , &pep->phy_addr); pep->phy_intf =of_get_phy_mode (pdev->dev.of_node);
@@ -1526,7 +1527,7 @@ static int pxa168_eth_probe(struct platf pep->smi_bus =mdiobus_alloc ();if (pep->smi_bus ==NULL ) { err = -ENOMEM ; - goto err_base; + goto err_netdev; } pep->smi_bus->priv = pep; pep->smi_bus->name ="pxa168_eth smi" ;
@@ -1551,13 +1552,10 @@ err_mdiobus:mdiobus_unregister (pep->smi_bus); err_free_mdio:mdiobus_free (pep->smi_bus); -err_base: -iounmap (pep->base); err_netdev:free_netdev (dev); err_clk: -clk_disable (clk); -clk_put (clk); +clk_disable_unprepare (clk);return err; }
@@ -1574,13 +1572,9 @@ static int pxa168_eth_remove(struct platif (pep->phy)phy_disconnect (pep->phy);if (pep->clk) { -clk_disable (pep->clk); -clk_put (pep->clk); - pep->clk =NULL ; +clk_disable_unprepare (pep->clk); } -iounmap (pep->base); - pep->base =NULL ;mdiobus_unregister (pep->smi_bus);mdiobus_free (pep->smi_bus);unregister_netdev (dev);
Greg Kroah-Hartman
maintainerPATCH 9/220 net: rfs: fix crash in get_rps_cpus()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit a31196b07f8034eba6a3487a1ad1bb5ec5cd58a5 ]
Commit 567e4b79731c ("net: rfs: add hash collision detection") had one mistake :
RPS_NO_CPU is no longer the marker for invalid cpu in set_rps_cpu() and get_rps_cpu(), as @next_cpu was the result of an AND with rps_cpu_mask
This bug showed up on a host with 72 cpus :next_cpu was 0x7f, and the code was trying to access percpu data of an non existent cpu.
In a follow up patch, we might get rid of compares against nr_cpu_ids, if we init the tables with 0. This is silly to test for a very unlikely condition that exists only shortly after table initialization, as we got rid of rps_reset_sock_flow() and similar functions that were writing this RPS_NO_CPU magic value at flow dismantle : When table is old enough, it never contains this value anymore.
--- Documentation/networking/scaling.txt | 2 +- net/core/dev.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-)
Documentation/networking/scaling.txt +1 -1
@@ -282,7 +282,7 @@ following is true: - The current CPU's queue head counter >= the recorded tail counter value in rps_dev_flow[i] -- The current CPU is unset (equal to RPS_NO_CPU) +- The current CPU is unset (>= nr_cpu_ids) - The current CPU is offline After this check, the packet is sent to the (possibly updated) current
net/core/dev.c +6 -6
@@ -3041,7 +3041,7 @@ static struct rps_dev_flow * set_rps_cpu(struct net_device *dev, struct sk_buff *skb, struct rps_dev_flow *rflow, u16 next_cpu) { - if (next_cpu != RPS_NO_CPU) { + if (next_cpu < nr_cpu_ids) { #ifdef CONFIG_RFS_ACCEL struct netdev_rx_queue *rxqueue;struct rps_dev_flow_table *flow_table;
@@ -3146,7 +3146,7 @@ static int get_rps_cpu(struct net_device* If the desired CPU (where last recvmsg was done) is * different from current CPU (one in the rx-queue flow * table entry), switch if one of the following holds: -* - Current CPU is unset (equal to RPS_NO_CPU). +* - Current CPU is unset (>= nr_cpu_ids). * - Current CPU is offline. * - The current CPU's queue tail has advanced beyond the * last packet that was enqueued using this table entry.
@@ -3154,14 +3154,14 @@ static int get_rps_cpu(struct net_device* have been dequeued, thus preserving in order delivery. */ if (unlikely (tcpu != next_cpu) && - (tcpu ==RPS_NO_CPU || !cpu_online (tcpu) || + (tcpu >= nr_cpu_ids || !cpu_online (tcpu) || ((int )(per_cpu (softnet_data, tcpu).input_queue_head - rflow->last_qtail)) >=0 )) { tcpu = next_cpu; rflow =set_rps_cpu (dev, skb, rflow, next_cpu); } -if (tcpu !=RPS_NO_CPU &&cpu_online (tcpu)) { +if (tcpu < nr_cpu_ids &&cpu_online (tcpu)) { *rflowp = rflow; cpu = tcpu; goto done;
@@ -3202,14 +3202,14 @@ bool rps_may_expire_flow(struct net_devistruct rps_dev_flow_table *flow_table;struct rps_dev_flow *rflow;bool expire = true; -int cpu; +unsigned int cpu;rcu_read_lock (); flow_table =rcu_dereference (rxqueue->rps_flow_table);if (flow_table && flow_id <= flow_table->mask) { rflow = &flow_table->flows[flow_id]; cpu =ACCESS_ONCE (rflow->cpu); -if (rflow->filter == filter_id && cpu !=RPS_NO_CPU && +if (rflow->filter == filter_id && cpu < nr_cpu_ids && ((int )(per_cpu (softnet_data, cpu).input_queue_head - rflow->last_qtail) < (int )(10 * flow_table->mask)))
Greg Kroah-Hartman
maintainerPATCH 10/220 net/mlx4_en: Prevent setting invalid RSS hash function
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amir Vadai <[email protected]>
[ Upstream commit b37069090b7c5615610a8aa6b36533d67b364d38 ]
mlx4_en_check_rxfh_func() was checking for hardware support before setting a known RSS hash function, but didn't do any check before setting unknown RSS hash function. Need to make it fail on such values. In this occasion, moved the actual setting of the new value from the check function into mlx4_en_set_rxfh().
--- drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 29 +++++++++++++----------- 1 file changed, 16 insertions(+), 13 deletions(-)
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +16 -13
@@ -981,20 +981,21 @@ static int mlx4_en_check_rxfh_func(strucstruct mlx4_en_priv *priv =netdev_priv (dev);/* check if requested function is supported by the device */ -if ((hfunc ==ETH_RSS_HASH_TOP && - !(priv->mdev->dev->caps.flags2 &MLX4_DEV_CAP_FLAG2_RSS_TOP )) || - (hfunc ==ETH_RSS_HASH_XOR && - !(priv->mdev->dev->caps.flags2 &MLX4_DEV_CAP_FLAG2_RSS_XOR ))) -return -EINVAL ; +if (hfunc ==ETH_RSS_HASH_TOP ) { +if (!(priv->mdev->dev->caps.flags2 &MLX4_DEV_CAP_FLAG2_RSS_TOP )) +return -EINVAL ; +if (!(dev->features &NETIF_F_RXHASH )) +en_warn (priv,"Toeplitz hash function should be used in conjunction with RX hashing for optimal performance\n" ); +return 0 ; + }else if (hfunc ==ETH_RSS_HASH_XOR ) { +if (!(priv->mdev->dev->caps.flags2 &MLX4_DEV_CAP_FLAG2_RSS_XOR )) +return -EINVAL ; +if (dev->features &NETIF_F_RXHASH ) +en_warn (priv,"Enabling both XOR Hash function and RX Hashing can limit RPS functionality\n" ); +return 0 ; + } - priv->rss_hash_fn = hfunc; -if (hfunc ==ETH_RSS_HASH_TOP && !(dev->features &NETIF_F_RXHASH )) -en_warn (priv, -"Toeplitz hash function should be used in conjunction with RX hashing for optimal performance\n" ); -if (hfunc ==ETH_RSS_HASH_XOR && (dev->features &NETIF_F_RXHASH )) -en_warn (priv, -"Enabling both XOR Hash function and RX Hashing can limit RPS functionality\n" ); -return 0 ; +return -EINVAL ; } static int mlx4_en_get_rxfh(struct net_device *dev, u32 *ring_index, u8 *key,
@@ -1068,6 +1069,8 @@ static int mlx4_en_set_rxfh(struct net_d priv->prof->rss_rings = rss_rings;if (key)memcpy (priv->rss_key, key,MLX4_EN_RSS_KEY_SIZE ); +if (hfunc !=ETH_RSS_HASH_NO_CHANGE ) + priv->rss_hash_fn = hfunc;if (port_up) { err =mlx4_en_start_port (dev);
Greg Kroah-Hartman
maintainerPATCH 11/220 md: fix md io stats accounting broken
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gu Zheng <[email protected]>
commit 74672d069b298b03e9f657fd70915e055739882e upstream.
Simon reported the md io stats accounting issue:
"
I'm seeing "iostat -x -k 1" print this after a RAID1 rebuild on 4.0-rc5. It's not abnormal other than it's 3-disk, with one being SSD (sdc) and the other two being write-mostly:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 345.00 0.00 0.00 0.00 0.00 100.00 md2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 58779.00 0.00 0.00 0.00 0.00 100.00 md1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12.00 0.00 0.00 0.00 0.00 100.00
"
The cause is commit "18c0b223cf9901727ef3b02da6711ac930b4e5d4" uses the generic_start_io_acct to account the disk stats rather than the open code, but it also introduced the increase to .in_flight[rw] which is needless to md. So we re-use the open code here to fix it.
--- drivers/md/md.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/md/md.c +5 -1
@@ -249,6 +249,7 @@ static void md_make_request(struct requeconst int rw =bio_data_dir (bio);struct mddev *mddev = q->queuedata;unsigned int sectors; +int cpu;if (mddev ==NULL || mddev->pers ==NULL || !mddev->ready) {
@@ -284,7 +285,10 @@ static void md_make_request(struct reque sectors =bio_sectors (bio); mddev->pers->make_request (mddev, bio); -generic_start_io_acct (rw, sectors, &mddev->gendisk->part0); + cpu =part_stat_lock (); +part_stat_inc (cpu, &mddev->gendisk->part0, ios[rw]); +part_stat_add (cpu, &mddev->gendisk->part0, sectors[rw], sectors); +part_stat_unlock ();if (atomic_dec_and_test (&mddev->active_io) && mddev->suspended)wake_up (&mddev->sb_wait);
Greg Kroah-Hartman
maintainerPATCH 12/220 x86/asm/decoder: Fix and enforce max instruction size in the insn decoder
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Lutomirski <[email protected]>
commit 91e5ed49fca09c2b83b262b9757d1376ee2b46c3 upstream.
x86 instructions cannot exceed 15 bytes, and the instruction decoder should enforce that. Prior to 6ba48ff46f76, the instruction length limit was implicitly set to 16, which was an approximation of 15, but there is currently no limit at all.
Fix MAX_INSN_SIZE (it should be 15, not 16), and fix the decoder to reject instructions that exceed MAX_INSN_SIZE.
Other than potentially confusing some of the decoder sanity checks, I'm not aware of any actual problems that omitting this check would cause, nor am I aware of any practical problems caused by the MAX_INSN_SIZE error.
--- arch/x86/include/asm/insn.h | 2 +- arch/x86/lib/insn.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-)
arch/x86/include/asm/insn.h +1 -1
@@ -69,7 +69,7 @@ struct insn {const insn_byte_t *next_byte; }; -#define MAX_INSN_SIZE 16 +#define MAX_INSN_SIZE 15#define X86_MODRM_MOD (modrm) (((modrm) & 0xc0) >> 6)#define X86_MODRM_REG (modrm) (((modrm) & 0x38) >> 3)
arch/x86/lib/insn.c +7 -0
@@ -52,6 +52,13 @@*/ void insn_init (struct insn *insn,const void *kaddr,int buf_len,int x86_64) { +/* +* Instructions longer than MAX_INSN_SIZE (15 bytes) are invalid +* even if the input buffer is long enough to hold them. +*/ +if (buf_len >MAX_INSN_SIZE ) + buf_len =MAX_INSN_SIZE ; +memset (insn,0 ,sizeof (*insn)); insn->kaddr = kaddr; insn->end_kaddr = kaddr + buf_len;
Greg Kroah-Hartman
maintainerPATCH 13/220 x86: kvm: Revert "remove sched notifier for cross-cpu migrations"
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcelo Tosatti <[email protected]>
commit 0a4e6be9ca17c54817cf814b4b5aa60478c6df27 upstream.
The following point:
2. per-CPU pvclock time info is updated if the underlying CPU changes.
Is not true anymore since "KVM: x86: update pvclock area conditionally, on cpu migration".
Add task migration notification back.
Problem noticed by Andy Lutomirski.
--- arch/x86/include/asm/pvclock.h | 1 arch/x86/kernel/pvclock.c | 44 +++++++++++++++++++++++++++++++++++++++++ arch/x86/vdso/vclock_gettime.c | 16 +++++++------- include/linux/sched.h | 8 +++++++ kernel/sched/core.c | 15 +++++++++++++ 5 files changed, 76 insertions(+), 8 deletions(-)
arch/x86/include/asm/pvclock.h +1 -0
@@ -95,6 +95,7 @@ unsigned __pvclock_read_cycles(const strstruct pvclock_vsyscall_time_info {struct pvclock_vcpu_time_info pvti; +u32 migrate_count; } __attribute__((__aligned__ (SMP_CACHE_BYTES )));#define PVTI_SIZE sizeof(struct pvclock_vsyscall_time_info)
arch/x86/kernel/pvclock.c +44 -0
63 lines not on this page · raw message
arch/x86/vdso/vclock_gettime.c +8 -8
@@ -82,18 +82,15 @@ static notrace cycle_t vread_pvclock(intcycle_t ret;u64 last;u32 version; +u32 migrate_count;u8 flags;unsigned cpu, cpu1;/* -* Note: hypervisor must guarantee that: -* 1. cpu ID number maps 1:1 to per-CPU pvclock time info. -* 2. that per-CPU pvclock time info is updated if the -* underlying CPU changes. -* 3. that version is increased whenever underlying CPU -* changes. -* +* When looping to get a consistent (time-info, tsc) pair, we +* also need to deal with the possibility we can switch vcpus, +* so make sure we always re-fetch time-info for the current vcpu. */ do { cpu = __getcpu() & VGETCPU_CPU_MASK;
@@ -104,6 +101,8 @@ static notrace cycle_t vread_pvclock(int pvti =get_pvti (cpu); + migrate_count = pvti->migrate_count; + version =__pvclock_read_cycles (&pvti->pvti, &ret, &flags);/*
@@ -115,7 +114,8 @@ static notrace cycle_t vread_pvclock(int cpu1 =__getcpu () &VGETCPU_CPU_MASK ; }while (unlikely (cpu != cpu1 || (pvti->pvti.version &1 ) || - pvti->pvti.version != version)); + pvti->pvti.version != version || + pvti->migrate_count != migrate_count));if (unlikely (!(flags &PVCLOCK_TSC_STABLE_BIT ))) *mode =VCLOCK_NONE ;
include/linux/sched.h +8 -0
@@ -176,6 +176,14 @@ extern void get_iowait_load(unsigned lonextern void calc_global_load (unsigned long ticks);extern void update_cpu_load_nohz (void ); +/* Notifier for when a task gets migrated to a new CPU */ +struct task_migration_notifier { +struct task_struct *task; +int from_cpu; +int to_cpu; +}; +extern void register_task_migration_notifier (struct notifier_block *n); +extern unsigned long get_parent_ip (unsigned long addr);extern void dump_cpu_task (int cpu);
kernel/sched/core.c +15 -0
@@ -996,6 +996,13 @@ void check_preempt_curr(struct rq *rq, srq_clock_skip_update (rq, true); } +static ATOMIC_NOTIFIER_HEAD (task_migration_notifier); + +void register_task_migration_notifier (struct notifier_block *n) +{ +atomic_notifier_chain_register (&task_migration_notifier, n); +} +#ifdef CONFIG_SMP void set_task_cpu (struct task_struct *p,unsigned int new_cpu) {
@@ -1026,10 +1033,18 @@ void set_task_cpu(struct task_struct *p,trace_sched_migrate_task (p, new_cpu);if (task_cpu (p) != new_cpu) { +struct task_migration_notifier tmn; +if (p->sched_class->migrate_task_rq) p->sched_class->migrate_task_rq (p, new_cpu); p->se.nr_migrations++;perf_sw_event_sched (PERF_COUNT_SW_CPU_MIGRATIONS ,1 ,0 ); + + tmn.task = p; + tmn.from_cpu =task_cpu (p); + tmn.to_cpu = new_cpu; + +atomic_notifier_call_chain (&task_migration_notifier,0 , &tmn); }__set_task_cpu (p, new_cpu);
Greg Kroah-Hartman
maintainerPATCH 15/220 sched/idle/x86: Restore mwait_idle() to fix boot hangs, to improve power savings and to improve performance
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Len Brown <[email protected]>
commit b253149b843f89cd300cbdbea27ce1f847506f99 upstream.
In Linux-3.9 we removed the mwait_idle() loop:
69fb3676df33 ("x86 idle: remove mwait_idle() and "idle=mwait" cmdline param")
The reasoning was that modern machines should be sufficiently happy during the boot process using the default_idle() HALT loop, until cpuidle loads and either acpi_idle or intel_idle invoke the newer MWAIT-with-hints idle loop.
But two machines reported problems:
1. Certain Core2-era machines support MWAIT-C1 and HALT only. MWAIT-C1 is preferred for optimal power and performance. But if they support just C1, cpuidle never loads and so they use the boot-time default idle loop forever.
2. Some laptops will boot-hang if HALT is used, but will boot successfully if MWAIT is used. This appears to be a hidden assumption in BIOS SMI, that is presumably valid on the proprietary OS where the BIOS was validated.
https://bugzilla.kernel.org/show_bug.cgi?id=60770
So here we effectively revert the patch above, restoring the mwait_idle() loop. However, we don't bother restoring the idle=mwait cmdline parameter, since it appears to add no value.
Maintainer notes:
For 3.9, simply revert 69fb3676df
for 3.10, patch -F3 applies, fuzz needed due to __cpuinit use in context For 3.11, 3.12, 3.13, this patch applies cleanly
--- arch/x86/include/asm/mwait.h | 8 +++++++ arch/x86/kernel/process.c | 47 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+)
arch/x86/include/asm/mwait.h +8 -0
@@ -30,6 +30,14 @@ static inline void __mwait(unsigned long :: "a" (eax), "c" (ecx)); } +static inline void __sti_mwait (unsigned long eax,unsigned long ecx) +{ +trace_hardirqs_on (); +/* "mwait %eax, %ecx;" */ + asmvolatile ("sti; .byte 0x0f, 0x01, 0xc9;" + ::"a" (eax),"c" (ecx)); +} +/* * This uses new MONITOR/MWAIT instructions on P4 processors with PNI, * which can obviate IPI to trigger checking of need_resched.
arch/x86/kernel/process.c +47 -0
65 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 16/220 sched/idle/x86: Optimize unnecessary mwait_idle() resched IPIs
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Galbraith <[email protected]>
commit f8e617f4582995f7c25ef25b4167213120ad122b upstream.
To fully take advantage of MWAIT, apparently the CLFLUSH instruction needs another quirk on certain CPUs: proper barriers around it on certain machines.
On a Q6600 SMP system, pipe-test scheduling performance, cross core, improves significantly:
3.8.13 487.2 KHz 1.000 3.13.0-master 415.5 KHz .852 3.13.0-master+ 415.2 KHz .852 + restore mwait_idle 3.13.0-master++ 488.5 KHz 1.002 + restore mwait_idle + IPI fix
Since X86_BUG_CLFLUSH_MONITOR is already a quirk, don't create a separate quirk for the extra smp_mb()s.
--- arch/x86/kernel/process.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
arch/x86/kernel/process.c +8 -4
@@ -429,18 +429,22 @@ static int prefer_mwait_c1_over_halt(constatic void mwait_idle (void ) { -if (!need_resched ()) { -if (this_cpu_has (X86_BUG_CLFLUSH_MONITOR )) +if (!current_set_polling_and_test ()) { +if (this_cpu_has (X86_BUG_CLFLUSH_MONITOR )) { +smp_mb ();/* quirk */ clflush ((void *)¤t_thread_info ()->flags); +smp_mb ();/* quirk */ + }__monitor ((void *)¤t_thread_info ()->flags,0 ,0 ); -smp_mb ();if (!need_resched ())__sti_mwait (0 ,0 );else local_irq_enable (); - }else + }else {local_irq_enable (); + } +__current_clr_polling (); }void select_idle_routine (const struct cpuinfo_x86 *c)
Greg Kroah-Hartman
maintainerPATCH 17/220 perf/x86/intel: Fix Core2,Atom,NHM,WSM cycles:pp events
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
commit 517e6341fa123ec3a2f9ea78ad547be910529881 upstream.
Ingo reported that cycles:pp didn't work for him on some machines.
It turns out that in this commit:
af4bdcf675cf perf/x86/intel: Disallow flags for most Core2/Atom/Nehalem/Westmere events
Andi forgot to explicitly allow that event when he disabled event flags for PEBS on those uarchs.
--- arch/x86/kernel/cpu/perf_event_intel_ds.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/x86/kernel/cpu/perf_event_intel_ds.c +8 -0
@@ -557,6 +557,8 @@ struct event_constraint intel_core2_pebsINTEL_FLAGS_UEVENT_CONSTRAINT (0x00c5 ,0x1 ),/* BR_INST_RETIRED.MISPRED */ INTEL_FLAGS_UEVENT_CONSTRAINT (0x1fc7 ,0x1 ),/* SIMD_INST_RETURED.ANY */ INTEL_FLAGS_EVENT_CONSTRAINT (0xcb ,0x1 ),/* MEM_LOAD_RETIRED.* */ +/* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ +INTEL_FLAGS_EVENT_CONSTRAINT (0x108000c0 ,0x01 ), EVENT_CONSTRAINT_END };
@@ -564,6 +566,8 @@ struct event_constraint intel_atom_pebs_INTEL_FLAGS_UEVENT_CONSTRAINT (0x00c0 ,0x1 ),/* INST_RETIRED.ANY */ INTEL_FLAGS_UEVENT_CONSTRAINT (0x00c5 ,0x1 ),/* MISPREDICTED_BRANCH_RETIRED */ INTEL_FLAGS_EVENT_CONSTRAINT (0xcb ,0x1 ),/* MEM_LOAD_RETIRED.* */ +/* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ +INTEL_FLAGS_EVENT_CONSTRAINT (0x108000c0 ,0x01 ), EVENT_CONSTRAINT_END };
@@ -587,6 +591,8 @@ struct event_constraint intel_nehalem_peINTEL_FLAGS_UEVENT_CONSTRAINT (0x20c8 ,0xf ),/* ITLB_MISS_RETIRED */ INTEL_FLAGS_EVENT_CONSTRAINT (0xcb ,0xf ),/* MEM_LOAD_RETIRED.* */ INTEL_FLAGS_EVENT_CONSTRAINT (0xf7 ,0xf ),/* FP_ASSIST.* */ +/* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ +INTEL_FLAGS_EVENT_CONSTRAINT (0x108000c0 ,0x0f ), EVENT_CONSTRAINT_END };
@@ -602,6 +608,8 @@ struct event_constraint intel_westmere_pINTEL_FLAGS_UEVENT_CONSTRAINT (0x20c8 ,0xf ),/* ITLB_MISS_RETIRED */ INTEL_FLAGS_EVENT_CONSTRAINT (0xcb ,0xf ),/* MEM_LOAD_RETIRED.* */ INTEL_FLAGS_EVENT_CONSTRAINT (0xf7 ,0xf ),/* FP_ASSIST.* */ +/* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ +INTEL_FLAGS_EVENT_CONSTRAINT (0x108000c0 ,0x0f ), EVENT_CONSTRAINT_END };
Greg Kroah-Hartman
maintainerPATCH 18/220 x86: fix special __probe_kernel_write() tail zeroing case
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Torvalds <[email protected]>
commit d869844bd081081bf537e806a44811884230643e upstream.
Commit cae2a173fe94 ("x86: clean up/fix 'copy_in_user()' tail zeroing") fixed the failure case tail zeroing of one special case of the x86-64 generic user-copy routine, namely when used for the user-to-user case ("copy_in_user()").
But in the process it broke an even more unusual case: using the user copy routine for kernel-to-kernel copying.
Now, normally kernel-kernel copies are obviously done using memcpy(), but we have a couple of special cases when we use the user-copy functions. One is when we pass a kernel buffer to a regular user-buffer routine, using set_fs(KERNEL_DS). That's a "normal" case, and continued to work fine, because it never takes any faults (with the possible exception of a silent and successful vmalloc fault).
But Jan Beulich pointed out another, very unusual, special case: when we use the user-copy routines not because it's a path that expects a user pointer, but for a couple of ftrace/kgdb cases that want to do a kernel copy, but do so using "unsafe" buffers, and use the user-copy routine to gracefully handle faults. IOW, for probe_kernel_write().
And that broke for the case of a faulting kernel destination, because we saw the kernel destination and wanted to try to clear the tail of the buffer. Which doesn't work, since that's what faults.
This only triggers for things like kgdb and ftrace users (eg trying setting a breakpoint on read-only memory), but it's definitely a bug. The fix is to not compare against the kernel address start (TASK_SIZE), but instead use the same limits "access_ok()" uses.
--- arch/x86/lib/usercopy_64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/lib/usercopy_64.c +1 -1
@@ -82,7 +82,7 @@ copy_user_handle_tail(char *to, char *frclac ();/* If the destination is a kernel buffer, we always clear the end */ -if ((unsigned long )to >=TASK_SIZE_MAX ) +if (!__addr_ok (to))memset (to,0 , len);return len; }
Greg Kroah-Hartman
maintainerPATCH 19/220 KVM: x86: Fix MSR_IA32_BNDCFGS in msrs_to_save
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nadav Amit <[email protected]>
commit 9e9c3fe40bcd28e3f98f0ad8408435f4503f2781 upstream.
kvm_init_msr_list is currently called before hardware_setup. As a result, vmx_mpx_supported always returns false when kvm_init_msr_list checks whether to save MSR_IA32_BNDCFGS.
Move kvm_init_msr_list after vmx_hardware_setup is called to fix this issue.
Message-Id: <[email protected]>
--- arch/x86/kvm/x86.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/x86/kvm/x86.c +8 -2
@@ -5775,7 +5775,6 @@ int kvm_arch_init(void *opaque)kvm_set_mmio_spte_mask (); kvm_x86_ops = ops; -kvm_init_msr_list ();kvm_mmu_set_mask_ptes (PT_USER_MASK ,PT_ACCESSED_MASK ,PT_DIRTY_MASK ,PT64_NX_MASK ,0 );
@@ -7209,7 +7208,14 @@ void kvm_arch_hardware_disable(void)int kvm_arch_hardware_setup (void ) { -return kvm_x86_ops->hardware_setup (); +int r; + + r = kvm_x86_ops->hardware_setup (); +if (r !=0 ) +return r; + +kvm_init_msr_list (); +return 0 ; }void kvm_arch_hardware_unsetup (void )
Greg Kroah-Hartman
maintainerPATCH 20/220 Btrfs: fix log tree corruption when fs mounted with -o discard
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit dcc82f4783ad91d4ab654f89f37ae9291cdc846a upstream.
While committing a transaction we free the log roots before we write the new super block. Freeing the log roots implies marking the disk location of every node/leaf (metadata extent) as pinned before the new super block is written. This is to prevent the disk location of log metadata extents from being reused before the new super block is written, otherwise we would have a corrupted log tree if before the new super block is written a crash/reboot happens and the location of any log tree metadata extent ended up being reused and rewritten.
Even though we pinned the log tree's metadata extents, we were issuing a discard against them if the fs was mounted with the -o discard option, resulting in corruption of the log tree if a crash/reboot happened before writing the new super block - the next time the fs was mounted, during the log replay process we would find nodes/leafs of the log btree with a content full of zeroes, causing the process to fail and require the use of the tool btrfs-zero-log to wipeout the log tree (and all data previously fsynced becoming lost forever).
Fix this by not doing a discard when pinning an extent. The discard will be done later when it's safe (after the new super block is committed) at extent-tree.c:btrfs_finish_extent_commit().
--- fs/btrfs/extent-tree.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
fs/btrfs/extent-tree.c +2 -3
@@ -6956,12 +6956,11 @@ static int __btrfs_free_reserved_extent(return -ENOSPC ; } -if (btrfs_test_opt (root,DISCARD )) - ret =btrfs_discard_extent (root, start, len,NULL ); -if (pin)pin_down_extent (root, cache, start, len,1 );else { +if (btrfs_test_opt (root,DISCARD )) + ret =btrfs_discard_extent (root, start, len,NULL );btrfs_add_free_space (cache, start, len);btrfs_update_reserved_bytes (cache, len,RESERVE_FREE , delalloc); }
Greg Kroah-Hartman
maintainerPATCH 21/220 btrfs: dont accept bare namespace as a valid xattr
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Sterba <[email protected]>
commit 3c3b04d10ff1811a27f86684ccd2f5ba6983211d upstream.
Due to insufficient check in btrfs_is_valid_xattr, this unexpectedly works:
$ touch file $ setfattr -n user. -v 1 file $ getfattr -d file user.="1"
ie. the missing attribute name after the namespace.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=94291
--- fs/btrfs/xattr.c | 53 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 14 deletions(-)
fs/btrfs/xattr.c +39 -14
@@ -364,22 +364,42 @@ const struct xattr_handler *btrfs_xattr_/* * Check if the attribute is in a supported namespace. * -* This applied after the check for the synthetic attributes in the system +* This is applied after the check for the synthetic attributes in the system * namespace. */ -static bool btrfs_is_valid_xattr (const char *name) +static int btrfs_is_valid_xattr (const char *name) { -return !strncmp (name,XATTR_SECURITY_PREFIX , -XATTR_SECURITY_PREFIX_LEN ) || - !strncmp (name,XATTR_SYSTEM_PREFIX ,XATTR_SYSTEM_PREFIX_LEN ) || - !strncmp (name,XATTR_TRUSTED_PREFIX ,XATTR_TRUSTED_PREFIX_LEN ) || - !strncmp (name,XATTR_USER_PREFIX ,XATTR_USER_PREFIX_LEN ) || - !strncmp (name,XATTR_BTRFS_PREFIX ,XATTR_BTRFS_PREFIX_LEN ); +int len =strlen (name); +int prefixlen =0 ; + +if (!strncmp (name,XATTR_SECURITY_PREFIX , +XATTR_SECURITY_PREFIX_LEN )) + prefixlen =XATTR_SECURITY_PREFIX_LEN ; +else if (!strncmp (name,XATTR_SYSTEM_PREFIX ,XATTR_SYSTEM_PREFIX_LEN )) + prefixlen =XATTR_SYSTEM_PREFIX_LEN ; +else if (!strncmp (name,XATTR_TRUSTED_PREFIX ,XATTR_TRUSTED_PREFIX_LEN )) + prefixlen =XATTR_TRUSTED_PREFIX_LEN ; +else if (!strncmp (name,XATTR_USER_PREFIX ,XATTR_USER_PREFIX_LEN )) + prefixlen =XATTR_USER_PREFIX_LEN ; +else if (!strncmp (name,XATTR_BTRFS_PREFIX ,XATTR_BTRFS_PREFIX_LEN )) + prefixlen =XATTR_BTRFS_PREFIX_LEN ; +else +return -EOPNOTSUPP ; + +/* +* The name cannot consist of just prefix +*/ +if (len <= prefixlen) +return -EINVAL ; + +return 0 ; }ssize_t btrfs_getxattr (struct dentry *dentry,const char *name,void *buffer,size_t size) { +int ret; +/* * If this is a request for a synthetic attribute in the system.* * namespace use the generic infrastructure to resolve a handler
@@ -388,8 +408,9 @@ ssize_t btrfs_getxattr(struct dentry *deif (!strncmp (name,XATTR_SYSTEM_PREFIX ,XATTR_SYSTEM_PREFIX_LEN ))return generic_getxattr (dentry, name, buffer, size); -if (!btrfs_is_valid_xattr (name)) -return -EOPNOTSUPP ; + ret =btrfs_is_valid_xattr (name); +if (ret) +return ret;return __btrfs_getxattr (dentry->d_inode, name, buffer, size); }
@@ -397,6 +418,7 @@ int btrfs_setxattr(struct dentry *dentry size_t size, int flags) {struct btrfs_root *root =BTRFS_I (dentry->d_inode)->root; +int ret;/* * The permission on security.* and system.* is not checked
@@ -413,8 +435,9 @@ int btrfs_setxattr(struct dentry *dentryif (!strncmp (name,XATTR_SYSTEM_PREFIX ,XATTR_SYSTEM_PREFIX_LEN ))return generic_setxattr (dentry, name, value, size, flags); -if (!btrfs_is_valid_xattr (name)) -return -EOPNOTSUPP ; + ret =btrfs_is_valid_xattr (name); +if (ret) +return ret;if (!strncmp (name,XATTR_BTRFS_PREFIX ,XATTR_BTRFS_PREFIX_LEN )) return btrfs_set_prop(dentry->d_inode, name,
@@ -430,6 +453,7 @@ int btrfs_setxattr(struct dentry *dentryint btrfs_removexattr (struct dentry *dentry,const char *name) {struct btrfs_root *root =BTRFS_I (dentry->d_inode)->root; +int ret;/* * The permission on security.* and system.* is not checked
@@ -446,8 +470,9 @@ int btrfs_removexattr(struct dentry *denif (!strncmp (name,XATTR_SYSTEM_PREFIX ,XATTR_SYSTEM_PREFIX_LEN ))return generic_removexattr (dentry, name); -if (!btrfs_is_valid_xattr (name)) -return -EOPNOTSUPP ; + ret =btrfs_is_valid_xattr (name); +if (ret) +return ret;if (!strncmp (name,XATTR_BTRFS_PREFIX ,XATTR_BTRFS_PREFIX_LEN )) return btrfs_set_prop(dentry->d_inode, name,
Greg Kroah-Hartman
maintainerPATCH 22/220 Btrfs: fix inode eviction infinite loop after cloning into it
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit ccccf3d67294714af2d72a6fd6fd7d73b01c9329 upstream.
If we attempt to clone a 0 length region into a file we can end up inserting a range in the inode's extent_io tree with a start offset that is greater then the end offset, which triggers immediately the following warning:
[ 3914.619057] WARNING: CPU: 17 PID: 4199 at fs/btrfs/extent_io.c:435 insert_state+0x4b/0x10b [btrfs]() [ 3914.620886] BTRFS: end < start 4095 4096 (...) [ 3914.638093] Call Trace: [ 3914.638636] [<ffffffff81425fd9>] dump_stack+0x4c/0x65 [ 3914.639620] [<ffffffff81045390>] warn_slowpath_common+0xa1/0xbb [ 3914.640789] [<ffffffffa03ca44f>] ? insert_state+0x4b/0x10b [btrfs] [ 3914.642041] [<ffffffff810453f0>] warn_slowpath_fmt+0x46/0x48 [ 3914.643236] [<ffffffffa03ca44f>] insert_state+0x4b/0x10b [btrfs] [ 3914.644441] [<ffffffffa03ca729>] __set_extent_bit+0x107/0x3f4 [btrfs] [ 3914.645711] [<ffffffffa03cb256>] lock_extent_bits+0x65/0x1bf [btrfs] [ 3914.646914] [<ffffffff8142b2fb>] ? _raw_spin_unlock+0x28/0x33 [ 3914.648058] [<ffffffffa03cbac4>] ? test_range_bit+0xcc/0xde [btrfs] [ 3914.650105] [<ffffffffa03cb3c3>] lock_extent+0x13/0x15 [btrfs] [ 3914.651361] [<ffffffffa03db39e>] lock_extent_range+0x3d/0xcd [btrfs] [ 3914.652761] [<ffffffffa03de1fe>] btrfs_ioctl_clone+0x278/0x388 [btrfs] [ 3914.654128] [<ffffffff811226dd>] ? might_fault+0x58/0xb5 [ 3914.655320] [<ffffffffa03e0909>] btrfs_ioctl+0xb51/0x2195 [btrfs] (...) [ 3914.669271] ---[ end trace 14843d3e2e622fc1 ]---
This later makes the inode eviction handler enter an infinite loop that keeps dumping the following warning over and over:
[ 3915.117629] WARNING: CPU: 22 PID: 4228 at fs/btrfs/extent_io.c:435 insert_state+0x4b/0x10b [btrfs]() [ 3915.119913] BTRFS: end < start 4095 4096 (...) [ 3915.137394] Call Trace: [ 3915.137913] [<ffffffff81425fd9>] dump_stack+0x4c/0x65 [ 3915.139154] [<ffffffff81045390>] warn_slowpath_common+0xa1/0xbb [ 3915.140316] [<ffffffffa03ca44f>] ? insert_state+0x4b/0x10b [btrfs] [ 3915.141505] [<ffffffff810453f0>] warn_slowpath_fmt+0x46/0x48 [ 3915.142709] [<ffffffffa03ca44f>] insert_state+0x4b/0x10b [btrfs] [ 3915.143849] [<ffffffffa03ca729>] __set_extent_bit+0x107/0x3f4 [btrfs] [ 3915.145120] [<ffffffffa038c1e3>] ? btrfs_kill_super+0x17/0x23 [btrfs] [ 3915.146352] [<ffffffff811548f6>] ? deactivate_locked_super+0x3b/0x50 [ 3915.147565] [<ffffffffa03cb256>] lock_extent_bits+0x65/0x1bf [btrfs] [ 3915.148785] [<ffffffff8142b7e2>] ? _raw_write_unlock+0x28/0x33 [ 3915.149931] [<ffffffffa03bc325>] btrfs_evict_inode+0x196/0x482 [btrfs] [ 3915.151154] [<ffffffff81168904>] evict+0xa0/0x148 [ 3915.152094] [<ffffffff811689e5>] dispose_list+0x39/0x43 [ 3915.153081] [<ffffffff81169564>] evict_inodes+0xdc/0xeb [ 3915.154062] [<ffffffff81154418>] generic_shutdown_super+0x49/0xef [ 3915.155193] [<ffffffff811546d1>] kill_anon_super+0x13/0x1e [ 3915.156274] [<ffffffffa038c1e3>] btrfs_kill_super+0x17/0x23 [btrfs] (...) [ 3915.167404] ---[ end trace 14843d3e2e622fc2 ]---
So just bail out of the clone ioctl if the length of the region to clone is zero, without locking any extent range, in order to prevent this issue (same behaviour as a pwrite with a 0 length for example).
This is trivial to reproduce. For example, the steps for the test I just made for fstests:
mkfs.btrfs -f SCRATCH_DEV
mount SCRATCH_DEV $SCRATCH_MNT
touch $SCRATCH_MNT/foo
touch $SCRATCH_MNT/bar
$CLONER_PROG -s 0 -d 4096 -l 0 $SCRATCH_MNT/foo $SCRATCH_MNT/bar umount $SCRATCH_MNT
A test case for fstests follows soon.
--- fs/btrfs/ioctl.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/btrfs/ioctl.c +5 -0
@@ -3626,6 +3626,11 @@ static noinline long btrfs_ioctl_clone(sif (off + len == src->i_size) len =ALIGN (src->i_size, bs) - off; +if (len ==0 ) { + ret =0 ; + goto out_unlock; + } +/* verify the end result is block aligned */ if (!IS_ALIGNED (off, bs) || !IS_ALIGNED (off + len, bs) || !IS_ALIGNED (destoff, bs))
Greg Kroah-Hartman
maintainerPATCH 23/220 Btrfs: fix inode eviction infinite loop after extent_same ioctl
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit 113e8283869b9855c8b999796aadd506bbac155f upstream.
If we pass a length of 0 to the extent_same ioctl, we end up locking an extent range with a start offset greater then its end offset (if the destination file's offset is greater than zero). This results in a warning from extent_io.c:insert_state through the following call chain:
btrfs_extent_same()
btrfs_double_lock()
lock_extent_range()
lock_extent(inode->io_tree, offset, offset + len - 1)
lock_extent_bits()
__set_extent_bit()
insert_state()
--> WARN_ON(end < start)This leads to an infinite loop when evicting the inode. This is the same problem that my previous patch titled
"Btrfs: fix inode eviction infinite loop after cloning into it" addressed but for the extent_same ioctl instead of the clone ioctl.
--- fs/btrfs/ioctl.c | 3 +++ 1 file changed, 3 insertions(+)
fs/btrfs/ioctl.c +3 -0
@@ -2897,6 +2897,9 @@ static int btrfs_extent_same(struct inodif (src == dst)return -EINVAL ; +if (len ==0 ) +return 0 ; +btrfs_double_lock (src, loff, dst, dst_loff, len); ret =extent_same_check_offsets (src, loff, len);
Greg Kroah-Hartman
maintainerPATCH 24/220 mm/hugetlb: use pmd_page() in follow_huge_pmd()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerald Schaefer <[email protected]>
commit 97534127012f0e396eddea4691f4c9b170aed74b upstream.
Commit 61f77eda9bbf ("mm/hugetlb: reduce arch dependent code around follow_huge_*") broke follow_huge_pmd() on s390, where pmd and pte layout differ and using pte_page() on a huge pmd will return wrong results. Using pmd_page() instead fixes this.
All architectures that were touched by that commit have pmd_page() defined, so this should not break anything on other architectures.
--- mm/hugetlb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
mm/hugetlb.c +1 -2
@@ -3735,8 +3735,7 @@ retry:if (!pmd_huge (*pmd)) goto out;if (pmd_present (*pmd)) { - page =pte_page (*(pte_t *)pmd) + - ((address & ~PMD_MASK ) >>PAGE_SHIFT ); + page =pmd_page (*pmd) + ((address & ~PMD_MASK ) >>PAGE_SHIFT );if (flags &FOLL_GET )get_page (page); }else {
Greg Kroah-Hartman
maintainerPATCH 25/220 powerpc/hugetlb: Call mm_dec_nr_pmds() in hugetlb_free_pmd_range()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Scott Wood <[email protected]>
commit 50c6a665b383cb5839e45d04e36faeeefaffa052 upstream.
Commit dc6c9a35b66b5 ("mm: account pmd page tables to the process") added a counter that is incremented whenever a PMD is allocated and decremented whenever a PMD is freed. For hugepages on PPC, common code is used to allocated PMDs, but arch-specific code is used to free PMDs.
This results in kernel output such as "BUG: non-zero nr_pmds on freeing
mm: 1" when using hugepages.
Update the PPC hugepage PMD freeing code to decrement the count, just as the above commit did for free_pmd_range().
--- arch/powerpc/mm/hugetlbpage.c | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/mm/hugetlbpage.c +1 -0
@@ -581,6 +581,7 @@ static void hugetlb_free_pmd_range(struc pmd =pmd_offset (pud, start);pud_clear (pud);pmd_free_tlb (tlb, pmd, start); +mm_dec_nr_pmds (tlb->mm); } static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
Greg Kroah-Hartman
maintainerPATCH 26/220 usb: gadget: printer: enqueue printers response for setup request
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrzej Pietrasiewicz <[email protected]>
commit eb132ccbdec5df46e29c9814adf76075ce83576b upstream.
Function-specific setup requests should be handled in such a way, that apart from filling in the data buffer, the requests are also actually
enqueued: if function-specific setup is called from composte_setup(), the "usb_ep_queue()" block of code in composite_setup() is skipped.
The printer function lacks this part and it results in e.g. get device id requests failing: the host expects some response, the device prepares it but does not equeue it for sending to the host, so the host finally asserts timeout.
This patch adds enqueueing the prepared responses.
--- drivers/usb/gadget/legacy/printer.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/usb/gadget/legacy/printer.c +9 -0
@@ -1031,6 +1031,15 @@ unknown:break ; }/* host either stalls (value < 0) or reports success */ +if (value >=0 ) { + req->length = value; + req->zero = value < wLength; + value =usb_ep_queue (cdev->gadget->ep0, req,GFP_ATOMIC ); +if (value <0 ) { +ERROR (dev,"%s:%d Error!\n" , __func__, __LINE__); + req->status =0 ; + } + }return value; }
Greg Kroah-Hartman
maintainerPATCH 27/220 KVM: s390: fix handling of write errors in the tpi handler
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
commit 261520dcfcba93ca5dfe671b88ffab038cd940c8 upstream.
If the I/O interrupt could not be written to the guest provided area (e.g. access exception), a program exception was injected into the guest but "inti" wasn't freed, therefore resulting in a memory leak.
In addition, the I/O interrupt wasn't reinjected. Therefore the dequeued interrupt is lost.
This patch fixes the problem while cleaning up the function and making the cc and rc logic easier to handle.
--- arch/s390/kvm/priv.c | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-)
arch/s390/kvm/priv.c +23 -17
@@ -229,18 +229,19 @@ static int handle_tpi(struct kvm_vcpu *vstruct kvm_s390_interrupt_info *inti;unsigned long len;u32 tpi_data[3 ]; -int cc, rc; +int rc;u64 addr; - rc =0 ; addr =kvm_s390_get_base_disp_s (vcpu);if (addr &3 )return kvm_s390_inject_program_int (vcpu,PGM_SPECIFICATION ); - cc =0 ; + inti =kvm_s390_get_io_int (vcpu->kvm, vcpu->arch.sie_block->gcr[6 ],0 ); -if (!inti) - goto no_interrupt; - cc =1 ; +if (!inti) { +kvm_s390_set_psw_cc (vcpu,0 ); +return 0 ; + } + tpi_data[0 ] = inti->io.subchannel_id <<16 | inti->io.subchannel_nr; tpi_data[1 ] = inti->io.io_int_parm; tpi_data[2 ] = inti->io.io_int_word;
@@ -251,30 +252,35 @@ static int handle_tpi(struct kvm_vcpu *v*/ len =sizeof (tpi_data) -4 ; rc =write_guest (vcpu, addr, &tpi_data, len); -if (rc) -return kvm_s390_inject_prog_cond (vcpu, rc); +if (rc) { + rc =kvm_s390_inject_prog_cond (vcpu, rc); + goto reinject_interrupt; + } }else {/* * Store the three-word I/O interruption code into * the appropriate lowcore area. */ len =sizeof (tpi_data); -if (write_guest_lc (vcpu, __LC_SUBCHANNEL_ID, &tpi_data, len)) +if (write_guest_lc (vcpu, __LC_SUBCHANNEL_ID, &tpi_data, len)) { +/* failed writes to the low core are not recoverable */ rc = -EFAULT ; + goto reinject_interrupt; + } } + +/* irq was successfully handed to the guest */ +kfree (inti); +kvm_s390_set_psw_cc (vcpu,1 ); +return 0 ; +reinject_interrupt:/* * If we encounter a problem storing the interruption code, the * instruction is suppressed from the guest's view: reinject the * interrupt. */ -if (!rc) -kfree (inti); -else -kvm_s390_reinject_io_int (vcpu->kvm, inti); -no_interrupt: -/* Set condition code and we're done. */ -if (!rc) -kvm_s390_set_psw_cc (vcpu, cc); +kvm_s390_reinject_io_int (vcpu->kvm, inti); +/* don't set the cc, a pgm irq was injected or we drop to user space */ return rc ? -EFAULT :0 ; }
Greg Kroah-Hartman
maintainerPATCH 28/220 KVM: s390: reinjection of irqs can fail in the tpi handler
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hildenbrand <[email protected]>
commit 15462e37ca848abac7477dece65f8af25febd744 upstream.
The reinjection of an I/O interrupt can fail if the list is at the limit and between the dequeue and the reinjection, another I/O interrupt is injected (e.g. if user space floods kvm with I/O interrupts).
This patch avoids this memory leak and returns -EFAULT in this special case. This error is not recoverable, so let's fail hard. This can later be avoided by not dequeuing the interrupt but working directly on the locked list.
--- arch/s390/kvm/interrupt.c | 4 ++-- arch/s390/kvm/kvm-s390.h | 4 ++-- arch/s390/kvm/priv.c | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-)
arch/s390/kvm/interrupt.c +2 -2
@@ -1332,10 +1332,10 @@ int kvm_s390_inject_vm(struct kvm *kvm,return rc; } -void kvm_s390_reinject_io_int (struct kvm *kvm, +int kvm_s390_reinject_io_int (struct kvm *kvm,struct kvm_s390_interrupt_info *inti) { -__inject_vm (kvm, inti); +return __inject_vm (kvm, inti); } int s390int_to_s390irq(struct kvm_s390_interrupt *s390int,
arch/s390/kvm/kvm-s390.h +2 -2
@@ -151,8 +151,8 @@ int __must_check kvm_s390_inject_vcpu(stint __must_check kvm_s390_inject_program_int (struct kvm_vcpu *vcpu,u16 code);struct kvm_s390_interrupt_info *kvm_s390_get_io_int (struct kvm *kvm,u64 cr6,u64 schid); -void kvm_s390_reinject_io_int (struct kvm *kvm, -struct kvm_s390_interrupt_info *inti); +int kvm_s390_reinject_io_int (struct kvm *kvm, +struct kvm_s390_interrupt_info *inti);int kvm_s390_mask_adapter (struct kvm *kvm,unsigned int id,bool masked);/* implemented in intercept.c */
arch/s390/kvm/priv.c +4 -1
@@ -279,7 +279,10 @@ reinject_interrupt:* instruction is suppressed from the guest's view: reinject the * interrupt. */ -kvm_s390_reinject_io_int (vcpu->kvm, inti); +if (kvm_s390_reinject_io_int (vcpu->kvm, inti)) { +kfree (inti); + rc = -EFAULT ; + }/* don't set the cc, a pgm irq was injected or we drop to user space */ return rc ? -EFAULT :0 ; }
Greg Kroah-Hartman
maintainerPATCH 29/220 KVM: s390: Zero out current VMDB of STSI before including level3 data.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ekaterina Tumanova <[email protected]>
commit b75f4c9afac2604feb971441116c07a24ecca1ec upstream.
s390 documentation requires words 0 and 10-15 to be reserved and stored as zeros. As we fill out all other fields, we can memset the full structure.
--- arch/s390/kvm/priv.c | 1 + 1 file changed, 1 insertion(+)
arch/s390/kvm/priv.c +1 -0
@@ -476,6 +476,7 @@ static void handle_stsi_3_2_2(struct kvmfor (n = mem->count -1 ; n >0 ; n--)memcpy (&mem->vm[n], &mem->vm[n -1 ],sizeof (mem->vm[0 ])); +memset (&mem->vm[0 ],0 ,sizeof (mem->vm[0 ])); mem->vm[0 ].cpus_total = cpus; mem->vm[0 ].cpus_configured = cpus; mem->vm[0 ].cpus_standby =0 ;
Greg Kroah-Hartman
maintainerPATCH 30/220 KVM: s390: fix get_all_floating_irqs
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Freimann <[email protected]>
commit 94aa033efcac47b09db22cb561e135baf37b7887 upstream.
This fixes a bug introduced with commit c05c4186bbe4 ("KVM: s390:
add floating irq controller").
get_all_floating_irqs() does copy_to_user() while holding a spin lock. Let's fix this by filling a temporary buffer first and copy it to userspace after giving up the lock.
--- Documentation/virtual/kvm/devices/s390_flic.txt | 3 + arch/s390/kvm/interrupt.c | 58 +++++++++++++----------- 2 files changed, 35 insertions(+), 26 deletions(-)
Documentation/virtual/kvm/devices/s390_flic.txt +3 -0
@@ -27,6 +27,9 @@ Groups: Copies all floating interrupts into a buffer provided by userspace. When the buffer is too small it returns -ENOMEM, which is the indication for userspace to try again with a bigger buffer. + -ENOBUFS is returned when the allocation of a kernelspace buffer has + failed. + -EFAULT is returned when copying data to userspace failed. All interrupts remain pending, i.e. are not deleted from the list of currently pending interrupts. attr->addr contains the userspace address of the buffer into which all
arch/s390/kvm/interrupt.c +32 -26
106 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 31/220 s390/hibernate: fix save and restore of kernel text section
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
commit d74419495633493c9cd3f2bbeb7f3529d0edded6 upstream.
Sebastian reported a crash caused by a jump label mismatch after resume. This happens because we do not save the kernel text section during suspend and therefore also do not restore it during resume, but use the kernel image that restores the old system.
This means that after a suspend/resume cycle we lost all modifications done to the kernel text section.
The reason for this is the pfn_is_nosave() function, which incorrectly returns that read-only pages don't need to be saved. This is incorrect since we mark the kernel text section read-only.
We still need to make sure to not save and restore pages contained within NSS and DCSS segment.
To fix this add an extra case for the kernel text section and only save those pages if they are not contained within an NSS segment.
Fixes the following crash (and the above bugs as well):
Jump label code mismatch at netif_receive_skb_internal+0x28/0xd0
Found: c0 04 00 00 00 00 Expected: c0 f4 00 00 00 11 New: c0 04 00 00 00 00 Kernel panic - not syncing: Corrupted kernel text CPU: 0 PID: 9 Comm: migration/0 Not tainted 3.19.0-01975-gb1b096e70f23 #4 Call Trace: [<0000000000113972>] show_stack+0x72/0xf0 [<000000000081f15e>] dump_stack+0x6e/0x90 [<000000000081c4e8>] panic+0x108/0x2b0 [<000000000081be64>] jump_label_bug.isra.2+0x104/0x108 [<0000000000112176>] __jump_label_transform+0x9e/0xd0 [<00000000001121e6>] __sm_arch_jump_label_transform+0x3e/0x50 [<00000000001d1136>] multi_cpu_stop+0x12e/0x170 [<00000000001d1472>] cpu_stopper_thread+0xb2/0x168 [<000000000015d2ac>] smpboot_thread_fn+0x134/0x1b0 [<0000000000158baa>] kthread+0x10a/0x110 [<0000000000824a86>] kernel_thread_starter+0x6/0xc
--- arch/s390/kernel/suspend.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/s390/kernel/suspend.c +4 -0
@@ -138,6 +138,8 @@ int pfn_is_nosave(unsigned long pfn) {unsigned long nosave_begin_pfn =PFN_DOWN (__pa (&__nosave_begin));unsigned long nosave_end_pfn =PFN_DOWN (__pa (&__nosave_end)); +unsigned long eshared_pfn =PFN_DOWN (__pa (&_eshared)) -1 ; +unsigned long stext_pfn =PFN_DOWN (__pa (&_stext));/* Always save lowcore pages (LC protection might be enabled). */ if (pfn <=LC_PAGES )
@@ -145,6 +147,8 @@ int pfn_is_nosave(unsigned long pfn)if (pfn >= nosave_begin_pfn && pfn < nosave_end_pfn)return 1 ;/* Skip memory holes and read-only pages (NSS, DCSS, ...). */ +if (pfn >= stext_pfn && pfn <= eshared_pfn) +return ipl_info.type ==IPL_TYPE_NSS ?1 :0 ;if (tprot (PFN_PHYS (pfn)))return 1 ;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 33/220 KVM: arm/arm64: check IRQ number on userland injection
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andre Przywara <[email protected]>
commit fd1d0ddf2ae92fb3df42ed476939861806c5d785 upstream.
When userland injects a SPI via the KVM_IRQ_LINE ioctl we currently only check it against a fixed limit, which historically is set to 127. With the new dynamic IRQ allocation the effective limit may actually be smaller (64).
So when now a malicious or buggy userland injects a SPI in that range, we spill over on our VGIC bitmaps and bytemaps memory. I could trigger a host kernel NULL pointer dereference with current mainline by injecting some bogus IRQ number from a hacked kvmtool:
-----------------
....
DEBUG: kvm_vgic_inject_irq(kvm, cpu=0, irq=114, level=1)
DEBUG: vgic_update_irq_pending(kvm, cpu=0, irq=114, level=1)
DEBUG: IRQ #114 still in the game, writing to bytemap now...
Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = ffffffc07652e000 [00000000] *pgd=00000000f658b003, *pud=00000000f658b003, *pmd=0000000000000000 Internal error: Oops: 96000006 [#1] PREEMPT SMP Modules linked in: CPU: 1 PID: 1053 Comm: lkvm-msi-irqinj Not tainted 4.0.0-rc7+ #3027 Hardware name: FVP Base (DT) task: ffffffc0774e9680 ti: ffffffc0765a8000 task.ti: ffffffc0765a8000 PC is at kvm_vgic_inject_irq+0x234/0x310 LR is at kvm_vgic_inject_irq+0x30c/0x310 pc : [<ffffffc0000ae0a8>] lr : [<ffffffc0000ae180>] pstate: 80000145
.....
So this patch fixes this by checking the SPI number against the actual limit. Also we remove the former legacy hard limit of 127 in the ioctl code.
[maz: wrap KVM_ARM_IRQ_GIC_MAX with #ifndef __KERNEL__, as suggested by Christopher Covington]
--- arch/arm/include/uapi/asm/kvm.h | 8 +++++++- arch/arm/kvm/arm.c | 3 +-- arch/arm64/include/uapi/asm/kvm.h | 8 +++++++- virt/kvm/arm/vgic.c | 3 +++ 4 files changed, 18 insertions(+), 4 deletions(-)
arch/arm/include/uapi/asm/kvm.h +7 -1
@@ -195,8 +195,14 @@ struct kvm_arch_memory_slot {#define KVM_ARM_IRQ_CPU_IRQ 0#define KVM_ARM_IRQ_CPU_FIQ 1 -/* Highest supported SPI, from VGIC_NR_IRQS */ +/* +* This used to hold the highest supported SPI, but it is now obsolete +* and only here to provide source code level compatibility with older +* userland. The highest SPI number can be set via KVM_DEV_ARM_VGIC_GRP_NR_IRQS. +*/ +#ifndef __KERNEL__#define KVM_ARM_IRQ_GIC_MAX 127 +#endif /* PSCI interface */ #define KVM_PSCI_FN_BASE 0x95c1ba5e
arch/arm/kvm/arm.c +1 -2
@@ -651,8 +651,7 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvif (!irqchip_in_kernel (kvm))return -ENXIO ; -if (irq_num <VGIC_NR_PRIVATE_IRQS || - irq_num >KVM_ARM_IRQ_GIC_MAX ) +if (irq_num <VGIC_NR_PRIVATE_IRQS )return -EINVAL ;return kvm_vgic_inject_irq (kvm,0 , irq_num, level);
arch/arm64/include/uapi/asm/kvm.h +7 -1
@@ -188,8 +188,14 @@ struct kvm_arch_memory_slot {#define KVM_ARM_IRQ_CPU_IRQ 0#define KVM_ARM_IRQ_CPU_FIQ 1 -/* Highest supported SPI, from VGIC_NR_IRQS */ +/* +* This used to hold the highest supported SPI, but it is now obsolete +* and only here to provide source code level compatibility with older +* userland. The highest SPI number can be set via KVM_DEV_ARM_VGIC_GRP_NR_IRQS. +*/ +#ifndef __KERNEL__#define KVM_ARM_IRQ_GIC_MAX 127 +#endif /* PSCI interface */ #define KVM_PSCI_FN_BASE 0x95c1ba5e
virt/kvm/arm/vgic.c +3 -0
@@ -1371,6 +1371,9 @@ int kvm_vgic_inject_irq(struct kvm *kvm, goto out; } +if (irq_num >= kvm->arch.vgic.nr_irqs) +return -EINVAL ; + vcpu_id =vgic_update_irq_pending (kvm, cpuid, irq_num, level);if (vcpu_id >=0 ) {/* kick the specified vcpu */
Greg Kroah-Hartman
maintainerPATCH 34/220 KVM: VMX: Preserve host CR4.MCE value while in guest mode.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Serebrin <[email protected]>
commit 085e68eeafbf76e21848ad5bafaecec88a11dd64 upstream.
The host's decision to enable machine check exceptions should remain in force during non-root mode. KVM was writing 0 to cr4 on VCPU reset and passed a slightly-modified 0 to the vmcs.guest_cr4 value.
Tested: Built.
On earlier version, tested by injecting machine check while a guest is spinning.
Before the change, if guest CR4.MCE==0, then the machine check is escalated to Catastrophic Error (CATERR) and the machine dies. If guest CR4.MCE==1, then the machine check causes VMEXIT and is handled normally by host Linux. After the change, injecting a machine check causes normal Linux machine check handling.
--- arch/x86/kvm/vmx.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
arch/x86/kvm/vmx.c +10 -2
@@ -3621,8 +3621,16 @@ static void vmx_set_cr3(struct kvm_vcpustatic int vmx_set_cr4 (struct kvm_vcpu *vcpu,unsigned long cr4) { -unsigned long hw_cr4 = cr4 | (to_vmx (vcpu)->rmode.vm86_active ? -KVM_RMODE_VM_CR4_ALWAYS_ON :KVM_PMODE_VM_CR4_ALWAYS_ON ); +/* +* Pass through host's Machine Check Enable value to hw_cr4, which +* is in force while we are in guest mode. Do not let guests control +* this bit, even if host CR4.MCE == 0. +*/ +unsigned long hw_cr4 = + (cr4_read_shadow () &X86_CR4_MCE ) | + (cr4 & ~X86_CR4_MCE ) | + (to_vmx (vcpu)->rmode.vm86_active ? +KVM_RMODE_VM_CR4_ALWAYS_ON :KVM_PMODE_VM_CR4_ALWAYS_ON );if (cr4 &X86_CR4_VMXE ) {/*
Greg Kroah-Hartman
maintainerPATCH 35/220 MIPS: KVM: Handle MSA Disabled exceptions from guest
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
commit 98119ad53376885819d93dfb8737b6a9a61ca0ba upstream.
Guest user mode can generate a guest MSA Disabled exception on an MSA capable core by simply trying to execute an MSA instruction. Since this exception is unknown to KVM it will be passed on to the guest kernel. However guest Linux kernels prior to v3.15 do not set up an exception handler for the MSA Disabled exception as they don't support any MSA capable cores. This results in a guest OS panic.
Since an older processor ID may be being emulated, and MSA support is not advertised to the guest, the correct behaviour is to generate a Reserved Instruction exception in the guest kernel so it can send the guest process an illegal instruction signal (SIGILL), as would happen with a non-MSA-capable core.
Fix this as minimally as reasonably possible by preventing kvm_mips_check_privilege() from relaying MSA Disabled exceptions from guest user mode to the guest kernel, and handling the MSA Disabled exception by emulating a Reserved Instruction exception in the guest, via a new handle_msa_disabled() KVM callback.
--- arch/mips/include/asm/kvm_host.h | 2 ++ arch/mips/kvm/emulate.c | 1 + arch/mips/kvm/mips.c | 4 ++++ arch/mips/kvm/trap_emul.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+)
arch/mips/include/asm/kvm_host.h +2 -0
@@ -322,6 +322,7 @@ enum mips_mmu_types {#define T_TRAP 13/* Trap instruction */ #define T_VCEI 14/* Virtual coherency exception */ #define T_FPE 15/* Floating point exception */ +#define T_MSADIS 21/* MSA disabled exception */ #define T_WATCH 23/* Watch address reference */ #define T_VCED 31/* Virtual coherency data */
@@ -578,6 +579,7 @@ struct kvm_mips_callbacks {int (*handle_syscall)(struct kvm_vcpu *vcpu);int (*handle_res_inst)(struct kvm_vcpu *vcpu);int (*handle_break)(struct kvm_vcpu *vcpu); +int (*handle_msa_disabled)(struct kvm_vcpu *vcpu);int (*vm_init)(struct kvm *kvm);int (*vcpu_init)(struct kvm_vcpu *vcpu);int (*vcpu_setup)(struct kvm_vcpu *vcpu);
arch/mips/kvm/emulate.c +1 -0
@@ -2176,6 +2176,7 @@ enum emulation_result kvm_mips_check_pricase T_SYSCALL :case T_BREAK :case T_RES_INST : +case T_MSADIS :break ;case T_COP_UNUSABLE :
arch/mips/kvm/mips.c +4 -0
@@ -1119,6 +1119,10 @@ int kvm_mips_handle_exit(struct kvm_run ret = kvm_mips_callbacks->handle_break (vcpu);break ; +case T_MSADIS : + ret = kvm_mips_callbacks->handle_msa_disabled (vcpu); +break ; +default : kvm_err("Exception Code: %d, not yet handled, @ PC: %p, inst: 0x%08x BadVaddr: %#lx Status: %#lx\n", exccode, opc, kvm_get_inst(opc, vcpu), badvaddr,
arch/mips/kvm/trap_emul.c +28 -0
@@ -330,6 +330,33 @@ static int kvm_trap_emul_handle_break(streturn ret; } +static int kvm_trap_emul_handle_msa_disabled (struct kvm_vcpu *vcpu) +{ +struct kvm_run *run = vcpu->run; +uint32_t __user *opc = (uint32_t __user *) vcpu->arch.pc; +unsigned long cause = vcpu->arch.host_cp0_cause; +enum emulation_result er =EMULATE_DONE ; +int ret =RESUME_GUEST ; + +/* No MSA supported in guest, guest reserved instruction exception */ + er =kvm_mips_emulate_ri_exc (cause, opc, run, vcpu); + +switch (er) { +case EMULATE_DONE : + ret =RESUME_GUEST ; +break ; + +case EMULATE_FAIL : + run->exit_reason =KVM_EXIT_INTERNAL_ERROR ; + ret =RESUME_HOST ; +break ; + +default : +BUG (); + } +return ret; +} +static int kvm_trap_emul_vm_init (struct kvm *kvm) {return 0 ;
@@ -470,6 +497,7 @@ static struct kvm_mips_callbacks kvm_tra .handle_syscall = kvm_trap_emul_handle_syscall, .handle_res_inst = kvm_trap_emul_handle_res_inst, .handle_break = kvm_trap_emul_handle_break, + .handle_msa_disabled = kvm_trap_emul_handle_msa_disabled, .vm_init = kvm_trap_emul_vm_init, .vcpu_init = kvm_trap_emul_vcpu_init,
Greg Kroah-Hartman
maintainerPATCH 36/220 MIPS: lose_fpu(): Disable FPU when MSA enabled
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
commit acaf6a97d623af123314c2f8ce4cf7254f6b2fc1 upstream.
The lose_fpu() function only disables the FPU in CP0_Status.CU1 if the FPU is in use and MSA isn't enabled.
This isn't necessarily a problem because KSTK_STATUS(current), the version of CP0_Status stored on the kernel stack on entry from user mode, does always get updated and gets restored when returning to user mode, but I don't think it was intended, and it is inconsistent with the case of only the FPU being in use. Sometimes leaving the FPU enabled may also mask kernel bugs where FPU operations are executed when the FPU might not be enabled.
So lets disable the FPU in the MSA case too.
Patchwork: https://patchwork.linux-mips.org/patch/9323/
--- arch/mips/include/asm/fpu.h | 1 + 1 file changed, 1 insertion(+)
arch/mips/include/asm/fpu.h +1 -0
@@ -170,6 +170,7 @@ static inline void lose_fpu(int save) }disable_msa ();clear_thread_flag (TIF_USEDMSA ); +__disable_fpu (); }else if (is_fpu_owner ()) {if (save)_save_fp (current);
Greg Kroah-Hartman
maintainerPATCH 37/220 MIPS: Malta: Detect and fix bad memsize values
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markos Chandras <[email protected]>
commit f7f8aea4b97c4d48e42f02cb37026bee445f239f upstream.
memsize denotes the amount of RAM we can access from kseg{0,1} and that should be up to 256M. In case the bootloader reports a value higher than that (perhaps reporting all the available RAM) it's best if we fix it ourselves and just warn the user about that. This is usually a problem with the bootloader and/or its environment.
[[email protected]: Remove useless parens as suggested bei Sergei. Reformat long pr_warn statement to fit into 80 column limit.]
Patchwork: https://patchwork.linux-mips.org/patch/9362/
--- arch/mips/mti-malta/malta-memory.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/mips/mti-malta/malta-memory.c +6 -0
@@ -53,6 +53,12 @@ fw_memblock_t * __init fw_getmdesc(int epr_warn ("memsize not set in YAMON, set to default (32Mb)\n" ); physical_memsize =0x02000000 ; }else { +if (memsize > (256 <<20 )) {/* memsize should be capped to 256M */ +pr_warn ("Unsupported memsize value (0x%lx) detected! " +"Using 0x10000000 (256M) instead\n" , + memsize); + memsize =256 <<20 ; + }/* If ememsize is set, then set physical_memsize to that */ physical_memsize = ememsize ? : memsize; }
Greg Kroah-Hartman
maintainerPATCH 38/220 MIPS: asm: asm-eva: Introduce kernel load/store variants
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markos Chandras <[email protected]>
commit 60cd7e08e453bc6828ac4b539f949e4acd80f143 upstream.
Introduce new macros for kernel load/store variants which will be used to perform regular kernel space load/store operations in EVA mode.
Patchwork: https://patchwork.linux-mips.org/patch/9500/
--- arch/mips/include/asm/asm-eva.h | 137 +++++++++++++++++++++++++++------------- 1 file changed, 93 insertions(+), 44 deletions(-)
arch/mips/include/asm/asm-eva.h +93 -44
@@ -11,6 +11,36 @@#define __ASM_ASM_EVA_H#ifndef __ASSEMBLY__ + +/* Kernel variants */ + +#define kernel_cache (op, base) "cache " op ", " base "\n" +#define kernel_ll (reg, addr) "ll " reg ", " addr "\n" +#define kernel_sc (reg, addr) "sc " reg ", " addr "\n" +#define kernel_lw (reg, addr) "lw " reg ", " addr "\n" +#define kernel_lwl (reg, addr) "lwl " reg ", " addr "\n" +#define kernel_lwr (reg, addr) "lwr " reg ", " addr "\n" +#define kernel_lh (reg, addr) "lh " reg ", " addr "\n" +#define kernel_lb (reg, addr) "lb " reg ", " addr "\n" +#define kernel_lbu (reg, addr) "lbu " reg ", " addr "\n" +#define kernel_sw (reg, addr) "sw " reg ", " addr "\n" +#define kernel_swl (reg, addr) "swl " reg ", " addr "\n" +#define kernel_swr (reg, addr) "swr " reg ", " addr "\n" +#define kernel_sh (reg, addr) "sh " reg ", " addr "\n" +#define kernel_sb (reg, addr) "sb " reg ", " addr "\n" + +#ifdef CONFIG_32BIT +/* +* No 'sd' or 'ld' instructions in 32-bit but the code will +* do the correct thing +*/ +#define kernel_sd (reg, addr) user_sw(reg, addr) +#define kernel_ld (reg, addr) user_lw(reg, addr) +#else +#define kernel_sd (reg, addr) "sd " reg", " addr "\n" +#define kernel_ld (reg, addr) "ld " reg", " addr "\n" +#endif /* CONFIG_32BIT */ +#ifdef CONFIG_EVA #define __BUILD_EVA_INSN (insn, reg, addr) \
@@ -41,37 +71,60 @@#else -#define user_cache (op, base) "cache " op ", " base "\n" -#define user_ll (reg, addr) "ll " reg ", " addr "\n" -#define user_sc (reg, addr) "sc " reg ", " addr "\n" -#define user_lw (reg, addr) "lw " reg ", " addr "\n" -#define user_lwl (reg, addr) "lwl " reg ", " addr "\n" -#define user_lwr (reg, addr) "lwr " reg ", " addr "\n" -#define user_lh (reg, addr) "lh " reg ", " addr "\n" -#define user_lb (reg, addr) "lb " reg ", " addr "\n" -#define user_lbu (reg, addr) "lbu " reg ", " addr "\n" -#define user_sw (reg, addr) "sw " reg ", " addr "\n" -#define user_swl (reg, addr) "swl " reg ", " addr "\n" -#define user_swr (reg, addr) "swr " reg ", " addr "\n" -#define user_sh (reg, addr) "sh " reg ", " addr "\n" -#define user_sb (reg, addr) "sb " reg ", " addr "\n" +#define user_cache (op, base) kernel_cache(op, base) +#define user_ll (reg, addr) kernel_ll(reg, addr) +#define user_sc (reg, addr) kernel_sc(reg, addr) +#define user_lw (reg, addr) kernel_lw(reg, addr) +#define user_lwl (reg, addr) kernel_lwl(reg, addr) +#define user_lwr (reg, addr) kernel_lwr(reg, addr) +#define user_lh (reg, addr) kernel_lh(reg, addr) +#define user_lb (reg, addr) kernel_lb(reg, addr) +#define user_lbu (reg, addr) kernel_lbu(reg, addr) +#define user_sw (reg, addr) kernel_sw(reg, addr) +#define user_swl (reg, addr) kernel_swl(reg, addr) +#define user_swr (reg, addr) kernel_swr(reg, addr) +#define user_sh (reg, addr) kernel_sh(reg, addr) +#define user_sb (reg, addr) kernel_sb(reg, addr)#ifdef CONFIG_32BIT -/* -* No 'sd' or 'ld' instructions in 32-bit but the code will -* do the correct thing -*/ -#define user_sd (reg, addr) user_sw(reg, addr) -#define user_ld (reg, addr) user_lw(reg, addr) +#define user_sd (reg, addr) kernel_sw(reg, addr) +#define user_ld (reg, addr) kernel_lw(reg, addr)#else -#define user_sd (reg, addr) "sd " reg", " addr "\n" -#define user_ld (reg, addr) "ld " reg", " addr "\n" +#define user_sd (reg, addr) kernel_sd(reg, addr) +#define user_ld (reg, addr) kernel_ld(reg, addr)#endif /* CONFIG_32BIT */ #endif /* CONFIG_EVA */ #else /* __ASSEMBLY__ */ +#define kernel_cache (op, base) cache op, base +#define kernel_ll (reg, addr) ll reg, addr +#define kernel_sc (reg, addr) sc reg, addr +#define kernel_lw (reg, addr) lw reg, addr +#define kernel_lwl (reg, addr) lwl reg, addr +#define kernel_lwr (reg, addr) lwr reg, addr +#define kernel_lh (reg, addr) lh reg, addr +#define kernel_lb (reg, addr) lb reg, addr +#define kernel_lbu (reg, addr) lbu reg, addr +#define kernel_sw (reg, addr) sw reg, addr +#define kernel_swl (reg, addr) swl reg, addr +#define kernel_swr (reg, addr) swr reg, addr +#define kernel_sh (reg, addr) sh reg, addr +#define kernel_sb (reg, addr) sb reg, addr + +#ifdef CONFIG_32BIT +/* +* No 'sd' or 'ld' instructions in 32-bit but the code will +* do the correct thing +*/ +#define kernel_sd (reg, addr) user_sw(reg, addr) +#define kernel_ld (reg, addr) user_lw(reg, addr) +#else +#define kernel_sd (reg, addr) sd reg, addr +#define kernel_ld (reg, addr) ld reg, addr +#endif /* CONFIG_32BIT */ +#ifdef CONFIG_EVA #define __BUILD_EVA_INSN (insn, reg, addr) \
@@ -101,31 +154,27 @@#define user_sd (reg, addr) user_sw(reg, addr)#else -#define user_cache (op, base) cache op, base -#define user_ll (reg, addr) ll reg, addr -#define user_sc (reg, addr) sc reg, addr -#define user_lw (reg, addr) lw reg, addr -#define user_lwl (reg, addr) lwl reg, addr -#define user_lwr (reg, addr) lwr reg, addr -#define user_lh (reg, addr) lh reg, addr -#define user_lb (reg, addr) lb reg, addr -#define user_lbu (reg, addr) lbu reg, addr -#define user_sw (reg, addr) sw reg, addr -#define user_swl (reg, addr) swl reg, addr -#define user_swr (reg, addr) swr reg, addr -#define user_sh (reg, addr) sh reg, addr -#define user_sb (reg, addr) sb reg, addr +#define user_cache (op, base) kernel_cache(op, base) +#define user_ll (reg, addr) kernel_ll(reg, addr) +#define user_sc (reg, addr) kernel_sc(reg, addr) +#define user_lw (reg, addr) kernel_lw(reg, addr) +#define user_lwl (reg, addr) kernel_lwl(reg, addr) +#define user_lwr (reg, addr) kernel_lwr(reg, addr) +#define user_lh (reg, addr) kernel_lh(reg, addr) +#define user_lb (reg, addr) kernel_lb(reg, addr) +#define user_lbu (reg, addr) kernel_lbu(reg, addr) +#define user_sw (reg, addr) kernel_sw(reg, addr) +#define user_swl (reg, addr) kernel_swl(reg, addr) +#define user_swr (reg, addr) kernel_swr(reg, addr) +#define user_sh (reg, addr) kernel_sh(reg, addr) +#define user_sb (reg, addr) kernel_sb(reg, addr)#ifdef CONFIG_32BIT -/* -* No 'sd' or 'ld' instructions in 32-bit but the code will -* do the correct thing -*/ -#define user_sd (reg, addr) user_sw(reg, addr) -#define user_ld (reg, addr) user_lw(reg, addr) +#define user_sd (reg, addr) kernel_sw(reg, addr) +#define user_ld (reg, addr) kernel_lw(reg, addr)#else -#define user_sd (reg, addr) sd reg, addr -#define user_ld (reg, addr) ld reg, addr +#define user_sd (reg, addr) kernel_sd(reg, addr) +#define user_ld (reg, addr) kernel_sd(reg, addr)#endif /* CONFIG_32BIT */ #endif /* CONFIG_EVA */
Greg Kroah-Hartman
maintainerPATCH 39/220 MIPS: unaligned: Prevent EVA instructions on kernel unaligned accesses
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markos Chandras <[email protected]>
commit eeb538950367e3966cbf0237ab1a1dc30e059818 upstream.
Commit c1771216ab48 ("MIPS: kernel: unaligned: Handle unaligned accesses for EVA") allowed unaligned accesses to be emulated for EVA. However, when emulating regular load/store unaligned accesses, we need to use the appropriate "address space" instructions for that. Previously, an unaligned load/store instruction in kernel space would have used the corresponding EVA instructions to emulate it which led to segmentation faults because of the address translation that happens with EVA instructions. This is now fixed by using the EVA instruction only when emulating EVA unaligned accesses.
Patchwork: https://patchwork.linux-mips.org/patch/9501/
--- arch/mips/kernel/unaligned.c | 172 +++++++++++++++++++++++-------------------- 1 file changed, 94 insertions(+), 78 deletions(-)
arch/mips/kernel/unaligned.c +94 -78
@@ -109,10 +109,10 @@ static u32 unaligned_action;extern void show_registers (struct pt_regs *regs);#ifdef __BIG_ENDIAN -#define LoadHW (addr, value, res) \ +#define _LoadHW (addr, value, res, type) \ __asm__ __volatile__ (".set\tnoat\n" \ - "1:\t"user_lb("%0", "0(%2)")"\n" \ - "2:\t"user_lbu("$1", "1(%2)")"\n\t" \ + "1:\t"type##_lb("%0", "0(%2)")"\n" \ + "2:\t"type##_lbu("$1", "1(%2)")"\n\t"\ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ "li\t%1, 0\n" \
@@ -130,10 +130,10 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#ifndef CONFIG_CPU_MIPSR6 -#define LoadW (addr, value, res) \ +#define _LoadW (addr, value, res, type) \ __asm__ __volatile__ ( \ - "1:\t"user_lwl("%0", "(%2)")"\n" \ - "2:\t"user_lwr("%0", "3(%2)")"\n\t" \ + "1:\t"type##_lwl("%0", "(%2)")"\n" \ + "2:\t"type##_lwr("%0", "3(%2)")"\n\t"\ "li\t%1, 0\n" \ "3:\n\t" \ ".insn\n\t" \
@@ -149,18 +149,18 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#else /* MIPSR6 has no lwl instruction */ -#define LoadW (addr, value, res) \ +#define _LoadW (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tpush\n" \ ".set\tnoat\n\t" \ - "1:"user_lb("%0", "0(%2)")"\n\t" \ - "2:"user_lbu("$1", "1(%2)")"\n\t" \ + "1:"type##_lb("%0", "0(%2)")"\n\t" \ + "2:"type##_lbu("$1", "1(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ - "3:"user_lbu("$1", "2(%2)")"\n\t" \ + "3:"type##_lbu("$1", "2(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ - "4:"user_lbu("$1", "3(%2)")"\n\t" \ + "4:"type##_lbu("$1", "3(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ "li\t%1, 0\n" \
@@ -181,11 +181,11 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#endif /* CONFIG_CPU_MIPSR6 */ -#define LoadHWU (addr, value, res) \ +#define _LoadHWU (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tnoat\n" \ - "1:\t"user_lbu("%0", "0(%2)")"\n" \ - "2:\t"user_lbu("$1", "1(%2)")"\n\t" \ + "1:\t"type##_lbu("%0", "0(%2)")"\n" \ + "2:\t"type##_lbu("$1", "1(%2)")"\n\t"\ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ "li\t%1, 0\n" \
@@ -204,10 +204,10 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#ifndef CONFIG_CPU_MIPSR6 -#define LoadWU (addr, value, res) \ +#define _LoadWU (addr, value, res, type) \ __asm__ __volatile__ ( \ - "1:\t"user_lwl("%0", "(%2)")"\n" \ - "2:\t"user_lwr("%0", "3(%2)")"\n\t" \ + "1:\t"type##_lwl("%0", "(%2)")"\n" \ + "2:\t"type##_lwr("%0", "3(%2)")"\n\t"\ "dsll\t%0, %0, 32\n\t" \ "dsrl\t%0, %0, 32\n\t" \ "li\t%1, 0\n" \
@@ -224,7 +224,7 @@ extern void show_registers(struct pt_reg : "=&r" (value), "=r" (res) \ : "r" (addr), "i" (-EFAULT)); -#define LoadDW (addr, value, res) \ +#define _LoadDW (addr, value, res) \ __asm__ __volatile__ ( \ "1:\tldl\t%0, (%2)\n" \ "2:\tldr\t%0, 7(%2)\n\t" \
@@ -243,18 +243,18 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#else /* MIPSR6 has not lwl and ldl instructions */ -#define LoadWU (addr, value, res) \ +#define _LoadWU (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \ - "1:"user_lbu("%0", "0(%2)")"\n\t" \ - "2:"user_lbu("$1", "1(%2)")"\n\t" \ + "1:"type##_lbu("%0", "0(%2)")"\n\t" \ + "2:"type##_lbu("$1", "1(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ - "3:"user_lbu("$1", "2(%2)")"\n\t" \ + "3:"type##_lbu("$1", "2(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ - "4:"user_lbu("$1", "3(%2)")"\n\t" \ + "4:"type##_lbu("$1", "3(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ "li\t%1, 0\n" \
@@ -274,7 +274,7 @@ extern void show_registers(struct pt_reg : "=&r" (value), "=r" (res) \ : "r" (addr), "i" (-EFAULT)); -#define LoadDW (addr, value, res) \ +#define _LoadDW (addr, value, res) \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -323,12 +323,12 @@ extern void show_registers(struct pt_reg#endif /* CONFIG_CPU_MIPSR6 */ -#define StoreHW (addr, value, res) \ +#define _StoreHW (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tnoat\n" \ - "1:\t"user_sb("%1", "1(%2)")"\n" \ + "1:\t"type##_sb("%1", "1(%2)")"\n" \ "srl\t$1, %1, 0x8\n" \ - "2:\t"user_sb("$1", "0(%2)")"\n" \ + "2:\t"type##_sb("$1", "0(%2)")"\n" \ ".set\tat\n\t" \ "li\t%0, 0\n" \ "3:\n\t" \
@@ -345,10 +345,10 @@ extern void show_registers(struct pt_reg : "r" (value), "r" (addr), "i" (-EFAULT));#ifndef CONFIG_CPU_MIPSR6 -#define StoreW (addr, value, res) \ +#define _StoreW (addr, value, res, type) \ __asm__ __volatile__ ( \ - "1:\t"user_swl("%1", "(%2)")"\n" \ - "2:\t"user_swr("%1", "3(%2)")"\n\t" \ + "1:\t"type##_swl("%1", "(%2)")"\n" \ + "2:\t"type##_swr("%1", "3(%2)")"\n\t"\ "li\t%0, 0\n" \ "3:\n\t" \ ".insn\n\t" \
@@ -363,7 +363,7 @@ extern void show_registers(struct pt_reg : "=r" (res) \ : "r" (value), "r" (addr), "i" (-EFAULT)); -#define StoreDW (addr, value, res) \ +#define _StoreDW (addr, value, res) \ __asm__ __volatile__ ( \ "1:\tsdl\t%1,(%2)\n" \ "2:\tsdr\t%1, 7(%2)\n\t" \
@@ -382,17 +382,17 @@ extern void show_registers(struct pt_reg : "r" (value), "r" (addr), "i" (-EFAULT));#else /* MIPSR6 has no swl and sdl instructions */ -#define StoreW (addr, value, res) \ +#define _StoreW (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \ - "1:"user_sb("%1", "3(%2)")"\n\t" \ + "1:"type##_sb("%1", "3(%2)")"\n\t" \ "srl\t$1, %1, 0x8\n\t" \ - "2:"user_sb("$1", "2(%2)")"\n\t" \ + "2:"type##_sb("$1", "2(%2)")"\n\t" \ "srl\t$1, $1, 0x8\n\t" \ - "3:"user_sb("$1", "1(%2)")"\n\t" \ + "3:"type##_sb("$1", "1(%2)")"\n\t" \ "srl\t$1, $1, 0x8\n\t" \ - "4:"user_sb("$1", "0(%2)")"\n\t" \ + "4:"type##_sb("$1", "0(%2)")"\n\t" \ ".set\tpop\n\t" \ "li\t%0, 0\n" \ "10:\n\t" \
@@ -456,10 +456,10 @@ extern void show_registers(struct pt_reg#else /* __BIG_ENDIAN */ -#define LoadHW (addr, value, res) \ +#define _LoadHW (addr, value, res, type) \ __asm__ __volatile__ (".set\tnoat\n" \ - "1:\t"user_lb("%0", "1(%2)")"\n" \ - "2:\t"user_lbu("$1", "0(%2)")"\n\t" \ + "1:\t"type##_lb("%0", "1(%2)")"\n" \ + "2:\t"type##_lbu("$1", "0(%2)")"\n\t"\ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ "li\t%1, 0\n" \
@@ -477,10 +477,10 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#ifndef CONFIG_CPU_MIPSR6 -#define LoadW (addr, value, res) \ +#define _LoadW (addr, value, res, type) \ __asm__ __volatile__ ( \ - "1:\t"user_lwl("%0", "3(%2)")"\n" \ - "2:\t"user_lwr("%0", "(%2)")"\n\t" \ + "1:\t"type##_lwl("%0", "3(%2)")"\n" \ + "2:\t"type##_lwr("%0", "(%2)")"\n\t"\ "li\t%1, 0\n" \ "3:\n\t" \ ".insn\n\t" \
@@ -496,18 +496,18 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#else /* MIPSR6 has no lwl instruction */ -#define LoadW (addr, value, res) \ +#define _LoadW (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tpush\n" \ ".set\tnoat\n\t" \ - "1:"user_lb("%0", "3(%2)")"\n\t" \ - "2:"user_lbu("$1", "2(%2)")"\n\t" \ + "1:"type##_lb("%0", "3(%2)")"\n\t" \ + "2:"type##_lbu("$1", "2(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ - "3:"user_lbu("$1", "1(%2)")"\n\t" \ + "3:"type##_lbu("$1", "1(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ - "4:"user_lbu("$1", "0(%2)")"\n\t" \ + "4:"type##_lbu("$1", "0(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ "li\t%1, 0\n" \
@@ -529,11 +529,11 @@ extern void show_registers(struct pt_reg#endif /* CONFIG_CPU_MIPSR6 */ -#define LoadHWU (addr, value, res) \ +#define _LoadHWU (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tnoat\n" \ - "1:\t"user_lbu("%0", "1(%2)")"\n" \ - "2:\t"user_lbu("$1", "0(%2)")"\n\t" \ + "1:\t"type##_lbu("%0", "1(%2)")"\n" \ + "2:\t"type##_lbu("$1", "0(%2)")"\n\t"\ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ "li\t%1, 0\n" \
@@ -552,10 +552,10 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#ifndef CONFIG_CPU_MIPSR6 -#define LoadWU (addr, value, res) \ +#define _LoadWU (addr, value, res, type) \ __asm__ __volatile__ ( \ - "1:\t"user_lwl("%0", "3(%2)")"\n" \ - "2:\t"user_lwr("%0", "(%2)")"\n\t" \ + "1:\t"type##_lwl("%0", "3(%2)")"\n" \ + "2:\t"type##_lwr("%0", "(%2)")"\n\t"\ "dsll\t%0, %0, 32\n\t" \ "dsrl\t%0, %0, 32\n\t" \ "li\t%1, 0\n" \
@@ -572,7 +572,7 @@ extern void show_registers(struct pt_reg : "=&r" (value), "=r" (res) \ : "r" (addr), "i" (-EFAULT)); -#define LoadDW (addr, value, res) \ +#define _LoadDW (addr, value, res) \ __asm__ __volatile__ ( \ "1:\tldl\t%0, 7(%2)\n" \ "2:\tldr\t%0, (%2)\n\t" \
@@ -591,18 +591,18 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#else /* MIPSR6 has not lwl and ldl instructions */ -#define LoadWU (addr, value, res) \ +#define _LoadWU (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \ - "1:"user_lbu("%0", "3(%2)")"\n\t" \ - "2:"user_lbu("$1", "2(%2)")"\n\t" \ + "1:"type##_lbu("%0", "3(%2)")"\n\t" \ + "2:"type##_lbu("$1", "2(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ - "3:"user_lbu("$1", "1(%2)")"\n\t" \ + "3:"type##_lbu("$1", "1(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ - "4:"user_lbu("$1", "0(%2)")"\n\t" \ + "4:"type##_lbu("$1", "0(%2)")"\n\t" \ "sll\t%0, 0x8\n\t" \ "or\t%0, $1\n\t" \ "li\t%1, 0\n" \
@@ -622,7 +622,7 @@ extern void show_registers(struct pt_reg : "=&r" (value), "=r" (res) \ : "r" (addr), "i" (-EFAULT)); -#define LoadDW (addr, value, res) \ +#define _LoadDW (addr, value, res) \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -670,12 +670,12 @@ extern void show_registers(struct pt_reg : "r" (addr), "i" (-EFAULT));#endif /* CONFIG_CPU_MIPSR6 */ -#define StoreHW (addr, value, res) \ +#define _StoreHW (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tnoat\n" \ - "1:\t"user_sb("%1", "0(%2)")"\n" \ + "1:\t"type##_sb("%1", "0(%2)")"\n" \ "srl\t$1,%1, 0x8\n" \ - "2:\t"user_sb("$1", "1(%2)")"\n" \ + "2:\t"type##_sb("$1", "1(%2)")"\n" \ ".set\tat\n\t" \ "li\t%0, 0\n" \ "3:\n\t" \
@@ -691,10 +691,10 @@ extern void show_registers(struct pt_reg : "=r" (res) \ : "r" (value), "r" (addr), "i" (-EFAULT));#ifndef CONFIG_CPU_MIPSR6 -#define StoreW (addr, value, res) \ +#define _StoreW (addr, value, res, type) \ __asm__ __volatile__ ( \ - "1:\t"user_swl("%1", "3(%2)")"\n" \ - "2:\t"user_swr("%1", "(%2)")"\n\t" \ + "1:\t"type##_swl("%1", "3(%2)")"\n" \ + "2:\t"type##_swr("%1", "(%2)")"\n\t"\ "li\t%0, 0\n" \ "3:\n\t" \ ".insn\n\t" \
@@ -709,7 +709,7 @@ extern void show_registers(struct pt_reg : "=r" (res) \ : "r" (value), "r" (addr), "i" (-EFAULT)); -#define StoreDW (addr, value, res) \ +#define _StoreDW (addr, value, res) \ __asm__ __volatile__ ( \ "1:\tsdl\t%1, 7(%2)\n" \ "2:\tsdr\t%1, (%2)\n\t" \
@@ -728,17 +728,17 @@ extern void show_registers(struct pt_reg : "r" (value), "r" (addr), "i" (-EFAULT));#else /* MIPSR6 has no swl and sdl instructions */ -#define StoreW (addr, value, res) \ +#define _StoreW (addr, value, res, type) \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \ - "1:"user_sb("%1", "0(%2)")"\n\t" \ + "1:"type##_sb("%1", "0(%2)")"\n\t" \ "srl\t$1, %1, 0x8\n\t" \ - "2:"user_sb("$1", "1(%2)")"\n\t" \ + "2:"type##_sb("$1", "1(%2)")"\n\t" \ "srl\t$1, $1, 0x8\n\t" \ - "3:"user_sb("$1", "2(%2)")"\n\t" \ + "3:"type##_sb("$1", "2(%2)")"\n\t" \ "srl\t$1, $1, 0x8\n\t" \ - "4:"user_sb("$1", "3(%2)")"\n\t" \ + "4:"type##_sb("$1", "3(%2)")"\n\t" \ ".set\tpop\n\t" \ "li\t%0, 0\n" \ "10:\n\t" \
@@ -757,7 +757,7 @@ extern void show_registers(struct pt_reg : "r" (value), "r" (addr), "i" (-EFAULT) \ : "memory"); -#define StoreDW (addr, value, res) \ +#define _StoreDW (addr, value, res) \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -801,6 +801,22 @@ extern void show_registers(struct pt_reg#endif /* CONFIG_CPU_MIPSR6 */ #endif +#define LoadHWU (addr, value, res) _LoadHWU(addr, value, res, kernel) +#define LoadHWUE (addr, value, res) _LoadHWU(addr, value, res, user) +#define LoadWU (addr, value, res) _LoadWU(addr, value, res, kernel) +#define LoadWUE (addr, value, res) _LoadWU(addr, value, res, user) +#define LoadHW (addr, value, res) _LoadHW(addr, value, res, kernel) +#define LoadHWE (addr, value, res) _LoadHW(addr, value, res, user) +#define LoadW (addr, value, res) _LoadW(addr, value, res, kernel) +#define LoadWE (addr, value, res) _LoadW(addr, value, res, user) +#define LoadDW (addr, value, res) _LoadDW(addr, value, res) + +#define StoreHW (addr, value, res) _StoreHW(addr, value, res, kernel) +#define StoreHWE (addr, value, res) _StoreHW(addr, value, res, user) +#define StoreW (addr, value, res) _StoreW(addr, value, res, kernel) +#define StoreWE (addr, value, res) _StoreW(addr, value, res, user) +#define StoreDW (addr, value, res) _StoreDW(addr, value, res) +static void emulate_load_store_insn (struct pt_regs *regs,void __user *addr,unsigned int __user *pc) {
@@ -872,7 +888,7 @@ static void emulate_load_store_insn(struset_fs (seg); goto sigbus; } -LoadHW (addr, value, res); +LoadHWE (addr, value, res);if (res) {set_fs (seg); goto fault;
@@ -885,7 +901,7 @@ static void emulate_load_store_insn(struset_fs (seg); goto sigbus; } -LoadW (addr, value, res); +LoadWE (addr, value, res);if (res) {set_fs (seg); goto fault;
@@ -898,7 +914,7 @@ static void emulate_load_store_insn(struset_fs (seg); goto sigbus; } -LoadHWU (addr, value, res); +LoadHWUE (addr, value, res);if (res) {set_fs (seg); goto fault;
@@ -913,7 +929,7 @@ static void emulate_load_store_insn(stru }compute_return_epc (regs); value = regs->regs[insn.spec3_format.rt]; -StoreHW (addr, value, res); +StoreHWE (addr, value, res);if (res) {set_fs (seg); goto fault;
@@ -926,7 +942,7 @@ static void emulate_load_store_insn(stru }compute_return_epc (regs); value = regs->regs[insn.spec3_format.rt]; -StoreW (addr, value, res); +StoreWE (addr, value, res);if (res) {set_fs (seg); goto fault;
Greg Kroah-Hartman
maintainerPATCH 40/220 MIPS: unaligned: Surround load/store macros in do {} while statements
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markos Chandras <[email protected]>
commit 3563c32d6532ece53c9dd8905a8e41983ef9952f upstream.
It's best to surround such complex macros with do {} while statements so they can appear as independent logical blocks when used within other control blocks.
Patchwork: https://patchwork.linux-mips.org/patch/9502/
--- arch/mips/kernel/unaligned.c | 116 +++++++++++++++++++++++++++++++++---------- 1 file changed, 90 insertions(+), 26 deletions(-)
arch/mips/kernel/unaligned.c +90 -26
@@ -110,6 +110,7 @@ extern void show_registers(struct pt_reg#ifdef __BIG_ENDIAN#define _LoadHW (addr, value, res, type) \ +do { \ __asm__ __volatile__ (".set\tnoat\n" \ "1:\t"type##_lb("%0", "0(%2)")"\n" \ "2:\t"type##_lbu("$1", "1(%2)")"\n\t"\
@@ -127,10 +128,12 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0)#ifndef CONFIG_CPU_MIPSR6 #define _LoadW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ "1:\t"type##_lwl("%0", "(%2)")"\n" \ "2:\t"type##_lwr("%0", "3(%2)")"\n\t"\
@@ -146,10 +149,13 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0) +#else /* MIPSR6 has no lwl instruction */ #define _LoadW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n" \ ".set\tnoat\n\t" \
@@ -178,10 +184,13 @@ extern void show_registers(struct pt_reg STR(PTR)"\t4b, 11b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0) +#endif /* CONFIG_CPU_MIPSR6 */ #define _LoadHWU (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tnoat\n" \ "1:\t"type##_lbu("%0", "0(%2)")"\n" \
@@ -201,10 +210,12 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0)#ifndef CONFIG_CPU_MIPSR6 #define _LoadWU (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ "1:\t"type##_lwl("%0", "(%2)")"\n" \ "2:\t"type##_lwr("%0", "3(%2)")"\n\t"\
@@ -222,9 +233,11 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0)#define _LoadDW (addr, value, res) \ +do { \ __asm__ __volatile__ ( \ "1:\tldl\t%0, (%2)\n" \ "2:\tldr\t%0, 7(%2)\n\t" \
@@ -240,10 +253,13 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0) +#else /* MIPSR6 has not lwl and ldl instructions */ #define _LoadWU (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -272,9 +288,11 @@ extern void show_registers(struct pt_reg STR(PTR)"\t4b, 11b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0)#define _LoadDW (addr, value, res) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -319,11 +337,14 @@ extern void show_registers(struct pt_reg STR(PTR)"\t8b, 11b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0) +#endif /* CONFIG_CPU_MIPSR6 */ #define _StoreHW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tnoat\n" \ "1:\t"type##_sb("%1", "1(%2)")"\n" \
@@ -342,10 +363,12 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=r" (res) \ - : "r" (value), "r" (addr), "i" (-EFAULT)); + : "r" (value), "r" (addr), "i" (-EFAULT));\ +} while(0)#ifndef CONFIG_CPU_MIPSR6 #define _StoreW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ "1:\t"type##_swl("%1", "(%2)")"\n" \ "2:\t"type##_swr("%1", "3(%2)")"\n\t"\
@@ -361,9 +384,11 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=r" (res) \ - : "r" (value), "r" (addr), "i" (-EFAULT)); + : "r" (value), "r" (addr), "i" (-EFAULT)); \ +} while(0)#define _StoreDW (addr, value, res) \ +do { \ __asm__ __volatile__ ( \ "1:\tsdl\t%1,(%2)\n" \ "2:\tsdr\t%1, 7(%2)\n\t" \
@@ -379,10 +404,13 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=r" (res) \ - : "r" (value), "r" (addr), "i" (-EFAULT)); + : "r" (value), "r" (addr), "i" (-EFAULT)); \ +} while(0) +#else /* MIPSR6 has no swl and sdl instructions */ #define _StoreW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -409,9 +437,11 @@ extern void show_registers(struct pt_reg".previous" \ : "=&r" (res) \: " r" (value), " r" (addr), " i" (-EFAULT) \ - : "memory"); + : "memory"); \ +} while(0) #define StoreDW(addr, value, res) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -451,12 +481,15 @@ extern void show_registers(struct pt_reg ".previous" \ : "=&r" (res) \ : "r" (value), "r" (addr), "i" (-EFAULT) \ - : "memory"); + : "memory"); \ +} while(0) + #endif /* CONFIG_CPU_MIPSR6 */ #else /* __BIG_ENDIAN */ #define _LoadHW(addr, value, res, type) \ +do { \ __asm__ __volatile__ (".set\tnoat\n" \ "1:\t"type##_lb("%0", "1(%2)")"\n" \ "2:\t"type##_lbu("$1", "0(%2)")"\n\t"\
@@ -474,10 +507,12 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0)#ifndef CONFIG_CPU_MIPSR6 #define _LoadW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ "1:\t"type##_lwl("%0", "3(%2)")"\n" \ "2:\t"type##_lwr("%0", "(%2)")"\n\t"\
@@ -493,10 +528,13 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0) +#else /* MIPSR6 has no lwl instruction */ #define _LoadW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n" \ ".set\tnoat\n\t" \
@@ -525,11 +563,14 @@ extern void show_registers(struct pt_reg STR(PTR)"\t4b, 11b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0) +#endif /* CONFIG_CPU_MIPSR6 */ #define _LoadHWU (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tnoat\n" \ "1:\t"type##_lbu("%0", "1(%2)")"\n" \
@@ -549,10 +590,12 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0)#ifndef CONFIG_CPU_MIPSR6 #define _LoadWU (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ "1:\t"type##_lwl("%0", "3(%2)")"\n" \ "2:\t"type##_lwr("%0", "(%2)")"\n\t"\
@@ -570,9 +613,11 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0)#define _LoadDW (addr, value, res) \ +do { \ __asm__ __volatile__ ( \ "1:\tldl\t%0, 7(%2)\n" \ "2:\tldr\t%0, (%2)\n\t" \
@@ -588,10 +633,13 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0) +#else /* MIPSR6 has not lwl and ldl instructions */ #define _LoadWU (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -620,9 +668,11 @@ extern void show_registers(struct pt_reg STR(PTR)"\t4b, 11b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0)#define _LoadDW (addr, value, res) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -667,10 +717,12 @@ extern void show_registers(struct pt_reg STR(PTR)"\t8b, 11b\n\t" \ ".previous" \ : "=&r" (value), "=r" (res) \ - : "r" (addr), "i" (-EFAULT)); + : "r" (addr), "i" (-EFAULT)); \ +} while(0)#endif /* CONFIG_CPU_MIPSR6 */ #define _StoreHW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tnoat\n" \ "1:\t"type##_sb("%1", "0(%2)")"\n" \
@@ -689,9 +741,12 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=r" (res) \ - : "r" (value), "r" (addr), "i" (-EFAULT)); + : "r" (value), "r" (addr), "i" (-EFAULT));\ +} while(0) +#ifndef CONFIG_CPU_MIPSR6 #define _StoreW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ "1:\t"type##_swl("%1", "3(%2)")"\n" \ "2:\t"type##_swr("%1", "(%2)")"\n\t"\
@@ -707,9 +762,11 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=r" (res) \ - : "r" (value), "r" (addr), "i" (-EFAULT)); + : "r" (value), "r" (addr), "i" (-EFAULT)); \ +} while(0)#define _StoreDW (addr, value, res) \ +do { \ __asm__ __volatile__ ( \ "1:\tsdl\t%1, 7(%2)\n" \ "2:\tsdr\t%1, (%2)\n\t" \
@@ -725,10 +782,13 @@ extern void show_registers(struct pt_reg STR(PTR)"\t2b, 4b\n\t" \ ".previous" \ : "=r" (res) \ - : "r" (value), "r" (addr), "i" (-EFAULT)); + : "r" (value), "r" (addr), "i" (-EFAULT)); \ +} while(0) +#else /* MIPSR6 has no swl and sdl instructions */ #define _StoreW (addr, value, res, type) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -755,9 +815,11 @@ extern void show_registers(struct pt_reg".previous" \ : "=&r" (res) \: " r" (value), " r" (addr), " i" (-EFAULT) \ - : "memory"); + : "memory"); \ +} while(0) #define _StoreDW(addr, value, res) \ +do { \ __asm__ __volatile__ ( \ ".set\tpush\n\t" \ ".set\tnoat\n\t" \
@@ -797,7 +859,9 @@ extern void show_registers(struct pt_reg ".previous" \ : "=&r" (res) \ : "r" (value), "r" (addr), "i" (-EFAULT) \ - : "memory"); + : "memory"); \ +} while(0) + #endif /* CONFIG_CPU_MIPSR6 */ #endif
Greg Kroah-Hartman
maintainerPATCH 41/220 MIPS: unaligned: Fix regular load/store instruction emulation for EVA
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markos Chandras <[email protected]>
commit 6eae35485b26f9e51ab896eb8a936bed9908fdf6 upstream.
When emulating a regular lh/lw/lhu/sh/sw we need to use the appropriate instruction if we are in EVA mode. This is necessary for userspace applications which trigger alignment exceptions. In such case, the userspace load/store instruction needs to be emulated with the correct eva/non-eva instruction by the kernel emulator.
Patchwork: https://patchwork.linux-mips.org/patch/9503/
--- arch/mips/kernel/unaligned.c | 52 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 5 deletions(-)
arch/mips/kernel/unaligned.c +47 -5
@@ -1023,7 +1023,15 @@ static void emulate_load_store_insn(struif (!access_ok (VERIFY_READ , addr,2 )) goto sigbus; -LoadHW (addr, value, res); +if (config_enabled (CONFIG_EVA )) { +if (segment_eq (get_fs (),get_ds ())) +LoadHW (addr, value, res); +else +LoadHWE (addr, value, res); + }else { +LoadHW (addr, value, res); + } +if (res) goto fault;compute_return_epc (regs);
@@ -1034,7 +1042,15 @@ static void emulate_load_store_insn(struif (!access_ok (VERIFY_READ , addr,4 )) goto sigbus; -LoadW (addr, value, res); +if (config_enabled (CONFIG_EVA )) { +if (segment_eq (get_fs (),get_ds ())) +LoadW (addr, value, res); +else +LoadWE (addr, value, res); + }else { +LoadW (addr, value, res); + } +if (res) goto fault;compute_return_epc (regs);
@@ -1045,7 +1061,15 @@ static void emulate_load_store_insn(struif (!access_ok (VERIFY_READ , addr,2 )) goto sigbus; -LoadHWU (addr, value, res); +if (config_enabled (CONFIG_EVA )) { +if (segment_eq (get_fs (),get_ds ())) +LoadHWU (addr, value, res); +else +LoadHWUE (addr, value, res); + }else { +LoadHWU (addr, value, res); + } +if (res) goto fault;compute_return_epc (regs);
@@ -1104,7 +1128,16 @@ static void emulate_load_store_insn(strucompute_return_epc (regs); value = regs->regs[insn.i_format.rt]; -StoreHW (addr, value, res); + +if (config_enabled (CONFIG_EVA )) { +if (segment_eq (get_fs (),get_ds ())) +StoreHW (addr, value, res); +else +StoreHWE (addr, value, res); + }else { +StoreHW (addr, value, res); + } +if (res) goto fault;break ;
@@ -1115,7 +1148,16 @@ static void emulate_load_store_insn(strucompute_return_epc (regs); value = regs->regs[insn.i_format.rt]; -StoreW (addr, value, res); + +if (config_enabled (CONFIG_EVA )) { +if (segment_eq (get_fs (),get_ds ())) +StoreW (addr, value, res); +else +StoreWE (addr, value, res); + }else { +StoreW (addr, value, res); + } +if (res) goto fault;break ;
Greg Kroah-Hartman
maintainerPATCH 42/220 MIPS: Loongson-3: Add IRQF_NO_SUSPEND to Cascade irqaction
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit 0add9c2f1cff9f3f1f2eb7e9babefa872a9d14b9 upstream.
HPET irq is routed to i8259 and then to MIPS CPU irq (cascade). After commit a3e6c1eff5 (MIPS: IRQ: Fix disable_irq on CPU IRQs), if without IRQF_NO_SUSPEND in cascade_irqaction, HPET interrupts will lost during suspend. The result is machine cannot be waken up.
Patchwork: https://patchwork.linux-mips.org/patch/9528/
--- arch/mips/loongson/loongson-3/irq.c | 1 + 1 file changed, 1 insertion(+)
arch/mips/loongson/loongson-3/irq.c +1 -0
@@ -44,6 +44,7 @@ void mach_irq_dispatch(unsigned int pendstatic struct irqaction cascade_irqaction = { .handler = no_action, + .flags =IRQF_NO_SUSPEND , .name ="cascade" , };
Greg Kroah-Hartman
maintainerPATCH 43/220 MIPS: Hibernate: flush TLB entries earlier
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit a843d00d038b11267279e3b5388222320f9ddc1d upstream.
We found that TLB mismatch not only happens after kernel resume, but also happens during snapshot restore. So move it to the beginning of swsusp_arch_suspend().
Patchwork: https://patchwork.linux-mips.org/patch/9621/
--- arch/mips/power/hibernate.S | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/mips/power/hibernate.S +2 -1
@@ -30,6 +30,8 @@ LEAF(swsusp_arch_suspend) END(swsusp_arch_suspend) LEAF(swsusp_arch_resume) + /* Avoid TLB mismatch during and after kernel resume */ + jal local_flush_tlb_all PTR_L t0, restore_pblist 0: PTR_L t1, PBE_ADDRESS(t0) /* source */
@@ -43,7 +45,6 @@ LEAF(swsusp_arch_resume) bne t1, t3, 1b PTR_L t0, PBE_NEXT(t0) bnez t0, 0b - jal local_flush_tlb_all /* Avoid TLB mismatch after kernel resume */ PTR_LA t0, saved_regs PTR_L ra, PT_R31(t0) PTR_L sp, PT_R29(t0)
Greg Kroah-Hartman
maintainerPATCH 44/220 staging: panel: fix lcd type
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudip Mukherjee <[email protected]>
commit 2c20d92dad5db6440cfa88d811b69fd605240ce4 upstream.
the lcd type as defined in the Kconfig is not matching in the code. as a result the rs, rw and en pins were getting interchanged. Kconfig defines the value of PANEL_LCD to be 1 if we select custom configuration but in the code LCD_TYPE_CUSTOM is defined as 5.
my hardware is LCD_TYPE_CUSTOM, but the pins were assigned to it as pins of LCD_TYPE_OLD, and it was not working.
Now values are corrected with referenece to the values defined in Kconfig and it is working.
checked on JHD204A lcd with LCD_TYPE_CUSTOM configuration.
--- drivers/staging/panel/panel.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/staging/panel/panel.c +6 -6
@@ -335,11 +335,11 @@ static unsigned char lcd_bits[LCD_PORTS]* LCD types */ #define LCD_TYPE_NONE 0 -#define LCD_TYPE_OLD 1 -#define LCD_TYPE_KS0074 2 -#define LCD_TYPE_HANTRONIX 3 -#define LCD_TYPE_NEXCOM 4 -#define LCD_TYPE_CUSTOM 5 +#define LCD_TYPE_CUSTOM 1 +#define LCD_TYPE_OLD 2 +#define LCD_TYPE_KS0074 3 +#define LCD_TYPE_HANTRONIX 4 +#define LCD_TYPE_NEXCOM 5/* * keypad types
@@ -502,7 +502,7 @@ MODULE_PARM_DESC(keypad_type,static int lcd_type =NOT_SET ;module_param (lcd_type, int,0000 );MODULE_PARM_DESC (lcd_type, -"LCD type: 0=none, 1=old //, 2=serial ks0074, 3=hantronix //, 4=nexcom //, 5=compiled-in" ); +"LCD type: 0=none, 1=compiled-in, 2=old, 3=serial ks0074, 4=hantronix, 5=nexcom" );static int lcd_height =NOT_SET ;module_param (lcd_height, int,0000 );
Greg Kroah-Hartman
maintainerPATCH 45/220 staging: android: sync: Fix memory corruption in sync_timeline_signal().
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alistair Strachan <[email protected]>
commit 8e43c9c75faf2902955bd2ecd7a50a8cc41cb00a upstream.
The android_fence_release() function checks for active sync points by calling list_empty() on the list head embedded on the sync point. However, it is only valid to use list_empty() on nodes that have been initialized with INIT_LIST_HEAD() or list_del_init().
Because the list entry has likely been removed from the active list by sync_timeline_signal(), there is a good chance that this WARN_ON_ONCE() will be hit due to dangling pointers pointing at freed memory (even though the sync drivers did nothing wrong) and memory corruption will ensue as the list entry is removed for a second time, corrupting the active list.
This problem can be reproduced quite easily with CONFIG_DEBUG_LIST=y and fences with more than one sync point.
--- drivers/staging/android/sync.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/android/sync.c +1 -1
@@ -114,7 +114,7 @@ void sync_timeline_signal(struct sync_tilist_for_each_entry_safe (pt, next, &obj->active_list_head, active_list) {if (fence_is_signaled_locked (&pt->base)) -list_del (&pt->active_list); +list_del_init (&pt->active_list); }spin_unlock_irqrestore (&obj->child_list_lock, flags);
Greg Kroah-Hartman
maintainerPATCH 46/220 staging: vt6655: use ieee80211_tx_info to select packet type.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Malcolm Priestley <[email protected]>
commit a6388e68321a1e0a0f408379c2a36396807745b3 upstream.
Information for packet type is in ieee80211_tx_info
band IEEE80211_BAND_5GHZ for PK_TYPE_11A.
IEEE80211_TX_RC_USE_CTS_PROTECT via tx_rate flags selects PK_TYPE_11GB
This ensures that the packet is always the right type.
--- drivers/staging/vt6655/rxtx.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/staging/vt6655/rxtx.c +11 -3
@@ -1308,10 +1308,18 @@ int vnt_generate_fifo_header(struct vnt_ priv->hw->conf.chandef.chan->hw_value); } -if (current_rate >RATE_11M ) - pkt_type = (u8 )priv->byPacketType; -else +if (current_rate >RATE_11M ) { +if (info->band ==IEEE80211_BAND_5GHZ ) { + pkt_type =PK_TYPE_11A ; + }else { +if (tx_rate->flags &IEEE80211_TX_RC_USE_CTS_PROTECT ) + pkt_type =PK_TYPE_11GB ; +else + pkt_type =PK_TYPE_11GA ; + } + }else { pkt_type =PK_TYPE_11B ; + }/*Set fifo controls */ if (pkt_type ==PK_TYPE_11A )
Greg Kroah-Hartman
maintainerPATCH 47/220 md/raid0: fix bug with chunksize not a power of 2.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit 47d68979cc968535cb87f3e5f2e6a3533ea48fbd upstream.
Since commit 20d0189b1012a37d2533a87fb451f7852f2418d1 in v3.14-rc1 RAID0 has performed incorrect calculations when the chunksize is not a power of 2.
This happens because "sector_div()" modifies its first argument, but this wasn't taken into account in the patch.
So restore that first arg before re-using the variable.
--- drivers/md/raid0.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/md/raid0.c +2 -1
@@ -313,7 +313,7 @@ static struct strip_zone *find_zone(stru/* * remaps the bio to the target device. we separate two flows. -* power 2 flow and a general flow for the sake of perfromance +* power 2 flow and a general flow for the sake of performance */ static struct md_rdev *map_sector (struct mddev *mddev,struct strip_zone *zone,sector_t sector,sector_t *sector_offset)
@@ -524,6 +524,7 @@ static void raid0_make_request(struct md split = bio; } + sector = bio->bi_iter.bi_sector; zone =find_zone (mddev->private, §or); tmp_dev =map_sector (mddev, zone, sector, §or); split->bi_bdev = tmp_dev->bdev;
Greg Kroah-Hartman
maintainerPATCH 48/220 megaraid_sas: use raw_smp_processor_id()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
commit 16b8528d20607925899b1df93bfd8fbab98d267c upstream.
We only want to steer the I/O completion towards a queue, but don't actually access any per-CPU data, so the raw_ version is fine to use and avoids the warnings when using smp_processor_id().
--- drivers/scsi/megaraid/megaraid_sas_fusion.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/scsi/megaraid/megaraid_sas_fusion.c +6 -3
@@ -1584,11 +1584,11 @@ megasas_build_ldio_fusion(struct megasas fp_possible = io_info.fpOkForIo; } -/* Use smp_processor_id() for now until cmd->request->cpu is CPU +/* Use raw_smp_processor_id() for now until cmd->request->cpu is CPU id by default, not CPU group id, otherwise all MSI-X queues won't be utilized */ cmd->request_desc->SCSIIO.MSIxIndex = instance->msix_vectors ? -smp_processor_id () % instance->msix_vectors :0 ; +raw_smp_processor_id () % instance->msix_vectors :0 ;if (fp_possible) { megasas_set_pd_lba(io_request, scp->cmd_len, &io_info, scp,
@@ -1693,7 +1693,10 @@ megasas_build_dcdb_fusion(struct megasas << MR_RAID_CTX_RAID_FLAGS_IO_SUB_TYPE_SHIFT; cmd->request_desc->SCSIIO.DevHandle = io_request->DevHandle; cmd->request_desc->SCSIIO.MSIxIndex = - instance->msix_vectors ?smp_processor_id () % instance->msix_vectors :0 ; + instance->msix_vectors ? +raw_smp_processor_id () % + instance->msix_vectors : +0 ; os_timeout_value = scmd->request->timeout /HZ ; if (instance->secure_jbod_support &&
Greg Kroah-Hartman
maintainerPATCH 49/220 drivers/base: cacheinfo: validate device node for all the caches
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudeep Holla <[email protected]>
commit 8a7d95f95c95f396decbd4cda6d4903fc4664946 upstream.
On architectures that depend on DT for obtaining cache hierarcy, we need to validate the device node for all the cache indices, failing to do so might result in wrong information being exposed to the userspace.
This is quite possible on initial/incomplete versions of the device trees. In such cases, it's better to bail out if all the required device nodes are not present.
This patch adds checks for the validation of device node for all the caches and doesn't initialise the cacheinfo if there's any error.
--- drivers/base/cacheinfo.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/base/cacheinfo.c +11 -2
@@ -62,15 +62,21 @@ static int cache_setup_of_node(unsignedreturn -ENOENT ; } -while (np && index <cache_leaves (cpu)) { +while (index <cache_leaves (cpu)) { this_leaf = this_cpu_ci->info_list + index;if (this_leaf->level !=1 ) np =of_find_next_cache_node (np);else np =of_node_get (np);/* cpu node itself */ +if (!np) +break ; this_leaf->of_node = np; index++; } + +if (index !=cache_leaves (cpu))/* not all OF nodes populated */ +return -ENOENT ; +return 0 ; }
@@ -189,8 +195,11 @@ static int detect_cache_attributes(unsig* will be set up here only if they are not populated already */ ret =cache_shared_cpu_map_setup (cpu); -if (ret) +if (ret) { +pr_warn ("Unable to detect cache hierarcy from DT for CPU %d\n" , + cpu); goto free_ci; + }return 0 ; free_ci:
Greg Kroah-Hartman
maintainerPATCH 50/220 cdc-wdm: fix endianness bug in debug statements
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
commit 323ece54e0761198946ecd0c2091f1d2bfdfcb64 upstream.
Values directly from descriptors given in debug statements must be converted to native endianness.
--- drivers/usb/class/cdc-wdm.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/usb/class/cdc-wdm.c +7 -5
@@ -245,7 +245,7 @@ static void wdm_int_callback(struct urbcase USB_CDC_NOTIFY_RESPONSE_AVAILABLE :dev_dbg (&desc->intf->dev,"NOTIFY_RESPONSE_AVAILABLE received: index %d len %d" , - dr->wIndex, dr->wLength); +le16_to_cpu (dr->wIndex),le16_to_cpu (dr->wLength));break ;case USB_CDC_NOTIFY_NETWORK_CONNECTION :
@@ -262,7 +262,9 @@ static void wdm_int_callback(struct urbclear_bit (WDM_POLL_RUNNING , &desc->flags);dev_err (&desc->intf->dev,"unknown notification %d received: index %d len %d\n" , - dr->bNotificationType, dr->wIndex, dr->wLength); + dr->bNotificationType, +le16_to_cpu (dr->wIndex), +le16_to_cpu (dr->wLength)); goto exit; }
@@ -408,7 +410,7 @@ static ssize_t wdm_write USB_RECIP_INTERFACE); req->bRequest =USB_CDC_SEND_ENCAPSULATED_COMMAND ; req->wValue =0 ; - req->wIndex = desc->inum; + req->wIndex = desc->inum;/* already converted */ req->wLength =cpu_to_le16 (count);set_bit (WDM_IN_USE , &desc->flags); desc->outbuf = buf;
@@ -422,7 +424,7 @@ static ssize_t wdm_write rv =usb_translate_errors (rv); }else {dev_dbg (&desc->intf->dev,"Tx URB has been submitted index=%d" , - req->wIndex); +le16_to_cpu (req->wIndex)); } out:usb_autopm_put_interface (desc->intf);
@@ -820,7 +822,7 @@ static int wdm_create(struct usb_interfa desc->irq->bRequestType = (USB_DIR_IN |USB_TYPE_CLASS |USB_RECIP_INTERFACE ); desc->irq->bRequest =USB_CDC_GET_ENCAPSULATED_RESPONSE ; desc->irq->wValue =0 ; - desc->irq->wIndex = desc->inum; + desc->irq->wIndex = desc->inum;/* already converted */ desc->irq->wLength =cpu_to_le16 (desc->wMaxCommand); usb_fill_control_urb(
Greg Kroah-Hartman
maintainerPATCH 51/220 mmc: tmio: Remove bogus un-initialization in tmio_mmc_host_free()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit 13a6a2ed1f5e77ae47c2b1a8e3bf22b2fa2d56ba upstream.
If CONFIG_DEBUG_SLAB=y:
sh_mobile_sdhi ee100000.sd: Got CD GPIO
sh_mobile_sdhi ee100000.sd: Got WP GPIO
platform ee100000.sd: Driver sh_mobile_sdhi requests probe deferral
...
Slab corruption (Not tainted): kmalloc-1024 start=ed8b3c00, len=1024
2d0: 00 00 00 00 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b ....kkkkkkkkkkkk
Prev obj: start=ed8b3800, len=1024
000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkkStruct tmio_mmc_host is embedded inside struct mmc_host, and thus is freed by the call to mmc_free_host(). Hence it must not be written to afterwards, as that will corrupt freed (and perhaps already reused) memory.
--- drivers/mmc/host/tmio_mmc_pio.c | 2 -- 1 file changed, 2 deletions(-)
drivers/mmc/host/tmio_mmc_pio.c +0 -2
@@ -1073,8 +1073,6 @@ EXPORT_SYMBOL(tmio_mmc_host_alloc);void tmio_mmc_host_free (struct tmio_mmc_host *host) {mmc_free_host (host->mmc); - - host->mmc =NULL ; }EXPORT_SYMBOL (tmio_mmc_host_free);
Greg Kroah-Hartman
maintainerPATCH 53/220 spi: imx: read back the RX/TX watermark levels earlier
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lucas Stach <[email protected]>
commit f511ab09dfb0fe7b2335eccac51ff9f001a32e4a upstream.
They are used to decide if the controller can do DMA on a buffer of a specific length and thus are needed before any transfer is attempted.
This fixes a memory leak where the SPI core uses the drivers can_dma() callback to determine if a buffer needs to be mapped. As the watermark levels aren't correct at that point the driver falsely claims to be able to DMA the buffer when it fact it isn't.
After the transfer has been done the core uses the same callback to determine if it needs to unmap the buffers. As the driver now correctly claims to not being able to DMA the buffer the core doesn't attempt to unmap the buffer which leaves the SGT leaking.
--- drivers/spi/spi-imx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/spi/spi-imx.c +2 -2
@@ -370,8 +370,6 @@ static int __maybe_unused mx51_ecspi_conif (spi_imx->dma_is_inited) { dma =readl (spi_imx->base +MX51_ECSPI_DMA ); - spi_imx->tx_wml =spi_imx_get_fifosize (spi_imx) /2 ; - spi_imx->rx_wml =spi_imx_get_fifosize (spi_imx) /2 ; spi_imx->rxt_wml =spi_imx_get_fifosize (spi_imx) /2 ; rx_wml_cfg = spi_imx->rx_wml <<MX51_ECSPI_DMA_RX_WML_OFFSET ; tx_wml_cfg = spi_imx->tx_wml <<MX51_ECSPI_DMA_TX_WML_OFFSET ;
@@ -868,6 +866,8 @@ static int spi_imx_sdma_init(struct devi master->max_dma_len =MAX_SDMA_BD_BYTES ; spi_imx->bitbang.master->flags =SPI_MASTER_MUST_RX |SPI_MASTER_MUST_TX ; + spi_imx->tx_wml =spi_imx_get_fifosize (spi_imx) /2 ; + spi_imx->rx_wml =spi_imx_get_fifosize (spi_imx) /2 ; spi_imx->dma_is_inited =1 ;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 54/220 spi: spidev: fix possible arithmetic overflow for multi-transfer message
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit f20fbaad7620af2df36a1f9d1c9ecf48ead5b747 upstream.
spidev_message() sums the lengths of the individual SPI transfers to determine the overall SPI message length. It restricts the total length, returning an error if too long, but it does not check for arithmetic overflow. For example, if the SPI message consisted of two transfers and the first has a length of 10 and the second has a length of (__u32)(-1), the total length would be seen as 9, even though the second transfer is actually very long. If the second transfer specifies a null rx_buf and a non-null tx_buf, the copy_from_user() could overrun the spidev's pre-allocated tx buffer before it reaches an invalid user memory address. Fix it by checking that neither the total nor the individual transfer lengths exceed the maximum allowed value.
Thanks to Dan Carpenter for reporting the potential integer overflow.
--- drivers/spi/spidev.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/spi/spidev.c +4 -1
@@ -245,7 +245,10 @@ static int spidev_message(struct spidev_ k_tmp->len = u_tmp->len; total += k_tmp->len; -if (total > bufsiz) { +/* Check total length of transfers. Also check each +* transfer length to avoid arithmetic overflow. +*/ +if (total > bufsiz || k_tmp->len > bufsiz) { status = -EMSGSIZE ; goto done; }
Greg Kroah-Hartman
maintainerPATCH 55/220 compal-laptop: Fix leaking hwmon device
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit ad774702f1705c04e5fa492b793d8d477a504fa6 upstream.
The commit c2be45f09bb0 ("compal-laptop: Use devm_hwmon_device_register_with_groups") wanted to change the registering of hwmon device to resource-managed version. It mostly did it except the main thing - it forgot to use devm-like function so the hwmon device leaked after device removal or probe failure.
--- drivers/platform/x86/compal-laptop.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/platform/x86/compal-laptop.c +3 -3
@@ -1026,9 +1026,9 @@ static int compal_probe(struct platform_if (err)return err; - hwmon_dev =hwmon_device_register_with_groups (&pdev->dev, -"compal" , data, - compal_hwmon_groups); + hwmon_dev =devm_hwmon_device_register_with_groups (&pdev->dev, +"compal" , data, + compal_hwmon_groups);if (IS_ERR (hwmon_dev)) { err =PTR_ERR (hwmon_dev); goto remove;
Greg Kroah-Hartman
maintainerPATCH 56/220 compal-laptop: Check return value of power_supply_register
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 1915a718b1872edffcb13e5436a9f7302d3d36f0 upstream.
The return value of power_supply_register() call was not checked and even on error probe() function returned 0. If registering failed then during unbind the driver tried to unregister power supply which was not actually registered.
This could lead to memory corruption because power_supply_unregister() unconditionally cleans up given power supply.
Fix this by checking return status of power_supply_register() call. In case of failure, clean up sysfs entries and fail the probe.
--- drivers/platform/x86/compal-laptop.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/platform/x86/compal-laptop.c +3 -1
@@ -1036,7 +1036,9 @@ static int compal_probe(struct platform_/* Power supply */ initialize_power_supply_data (data); -power_supply_register (&compal_device->dev, &data->psy); + err =power_supply_register (&compal_device->dev, &data->psy); +if (err <0 ) + goto remove;platform_set_drvdata (pdev, data);
Greg Kroah-Hartman
maintainerPATCH 57/220 ring-buffer: Replace this_cpu_*() with __this_cpu_*()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit 80a9b64e2c156b6523e7a01f2ba6e5d86e722814 upstream.
It has come to my attention that this_cpu_read/write are horrible on architectures other than x86. Worse yet, they actually disable preemption or interrupts! This caused some unexpected tracing results on ARM.
101.356868: preempt_count_add <-ring_buffer_lock_reserve 101.356870: preempt_count_sub <-ring_buffer_lock_reserve
The ring_buffer_lock_reserve has recursion protection that requires accessing a per cpu variable. But since preempt_disable() is traced, it too got traced while accessing the variable that is suppose to prevent recursion like this.
The generic version of this_cpu_read() and write() are:
#define this_cpu_generic_read(pcp) \
({ typeof(pcp) ret__; \
preempt_disable(); \
ret__ = *this_cpu_ptr(&(pcp)); \
preempt_enable(); \
ret__; \})
#define this_cpu_generic_to_op(pcp, val, op) \
do { \
unsigned long flags; \
raw_local_irq_save(flags); \
*__this_cpu_ptr(&(pcp)) op val; \
raw_local_irq_restore(flags); \} while (0)
Which is unacceptable for locations that know they are within preempt disabled or interrupt disabled locations.
Paul McKenney stated that __this_cpu_() versions produce much better code on other architectures than this_cpu_() does, if we know that the call is done in a preempt disabled location.
I also changed the recursive_unlock() to use two local variables instead of accessing the per_cpu variable twice.
--- kernel/trace/ring_buffer.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
kernel/trace/ring_buffer.c +5 -6
@@ -2679,7 +2679,7 @@ static DEFINE_PER_CPU(unsigned int, curr static __always_inline int trace_recursive_lock(void) { -unsigned int val =this_cpu_read (current_context); +unsigned int val =__this_cpu_read (current_context);int bit;if (in_interrupt ()) {
@@ -2696,18 +2696,17 @@ static __always_inline int trace_recursireturn 1 ; val |= (1 << bit); -this_cpu_write (current_context, val); +__this_cpu_write (current_context, val);return 0 ; } static __always_inline void trace_recursive_unlock(void) { -unsigned int val =this_cpu_read (current_context); +unsigned int val =__this_cpu_read (current_context); - val--; - val &=this_cpu_read (current_context); -this_cpu_write (current_context, val); + val &= val & (val -1 ); +__this_cpu_write (current_context, val); }#else
Greg Kroah-Hartman
maintainerPATCH 58/220 power_supply: twl4030_madc: Check return value of power_supply_register
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 68c3ed6fa7e0d69529ced772d650ab128916a81d upstream.
The return value of power_supply_register() call was not checked and even on error probe() function returned 0. If registering failed then during unbind the driver tried to unregister power supply which was not actually registered.
This could lead to memory corruption because power_supply_unregister() unconditionally cleans up given power supply.
--- drivers/power/twl4030_madc_battery.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/power/twl4030_madc_battery.c +5 -2
@@ -192,6 +192,7 @@ static int twl4030_madc_battery_probe(st {struct twl4030_madc_battery *twl4030_madc_bat;struct twl4030_madc_bat_platform_data *pdata = pdev->dev.platform_data; +int ret =0 ; twl4030_madc_bat =kzalloc (sizeof (*twl4030_madc_bat),GFP_KERNEL );if (!twl4030_madc_bat)
@@ -216,9 +217,11 @@ static int twl4030_madc_battery_probe(st twl4030_madc_bat->pdata = pdata;platform_set_drvdata (pdev, twl4030_madc_bat); -power_supply_register (&pdev->dev, &twl4030_madc_bat->psy); + ret =power_supply_register (&pdev->dev, &twl4030_madc_bat->psy); +if (ret <0 ) +kfree (twl4030_madc_bat); -return 0 ; +return ret; }static int twl4030_madc_battery_remove (struct platform_device *pdev)
Greg Kroah-Hartman
maintainerPATCH 59/220 power_supply: lp8788-charger: Fix leaked power supply on probe fail
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit a7117f81e8391e035c49b3440792f7e6cea28173 upstream.
Driver forgot to unregister charger power supply if registering of battery supply failed in probe(). In such case the memory associated with power supply leaked.
--- drivers/power/lp8788-charger.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/power/lp8788-charger.c +3 -1
@@ -417,8 +417,10 @@ static int lp8788_psy_register(struct pl pchg->battery.num_properties =ARRAY_SIZE (lp8788_battery_prop); pchg->battery.get_property = lp8788_battery_get_property; -if (power_supply_register (&pdev->dev, &pchg->battery)) +if (power_supply_register (&pdev->dev, &pchg->battery)) { +power_supply_unregister (&pchg->charger);return -EPERM ; + }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 60/220 power_supply: ipaq_micro_battery: Fix leaking workqueue
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit f852ec461e24504690445e7d281cbe806df5ccef upstream.
Driver allocates singlethread workqueue in probe but it is not destroyed during removal.
--- drivers/power/ipaq_micro_battery.c | 1 + 1 file changed, 1 insertion(+)
drivers/power/ipaq_micro_battery.c +1 -0
@@ -251,6 +251,7 @@ static int micro_batt_remove(struct platpower_supply_unregister (µ_ac_power);power_supply_unregister (µ_batt_power);cancel_delayed_work_sync (&mb->update); +destroy_workqueue (mb->wq);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 61/220 power_supply: ipaq_micro_battery: Check return values in probe
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit a2c1d531854c4319610f1d83351213b47a633969 upstream.
The return values of create_singlethread_workqueue() and power_supply_register() calls were not checked and even on error probe() function returned 0.
1. If allocation of workqueue failed (returning NULL) then further accesses could lead to NULL pointer dereference. The queue_delayed_work() expects workqueue to be non-NULL.
2. If registration of power supply failed then during unbind the driver tried to unregister power supply which was not actually registered. This could lead to memory corruption because power_supply_unregister() unconditionally cleans up given power supply.
--- drivers/power/ipaq_micro_battery.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
drivers/power/ipaq_micro_battery.c +19 -2
@@ -226,6 +226,7 @@ static struct power_supply micro_ac_powestatic int micro_batt_probe (struct platform_device *pdev) {struct micro_battery *mb; +int ret; mb =devm_kzalloc (&pdev->dev,sizeof (*mb),GFP_KERNEL );if (!mb)
@@ -233,14 +234,30 @@ static int micro_batt_probe(struct platf mb->micro =dev_get_drvdata (pdev->dev.parent); mb->wq =create_singlethread_workqueue ("ipaq-battery-wq" ); +if (!mb->wq) +return -ENOMEM ; +INIT_DELAYED_WORK (&mb->update, micro_battery_work);platform_set_drvdata (pdev, mb);queue_delayed_work (mb->wq, &mb->update,1 ); -power_supply_register (&pdev->dev, µ_batt_power); -power_supply_register (&pdev->dev, µ_ac_power); + + ret =power_supply_register (&pdev->dev, µ_batt_power); +if (ret <0 ) + goto batt_err; + + ret =power_supply_register (&pdev->dev, µ_ac_power); +if (ret <0 ) + goto ac_err;dev_info (&pdev->dev,"iPAQ micro battery driver\n" );return 0 ; + +ac_err: +power_supply_unregister (µ_ac_power); +batt_err: +cancel_delayed_work_sync (&mb->update); +destroy_workqueue (mb->wq); +return ret; }static int micro_batt_remove (struct platform_device *pdev)
Greg Kroah-Hartman
maintainerPATCH 62/220 HID: add HP OEM mouse to quirk ALWAYS_POLL
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
commit 7a8e53c414c8183e8735e3b08d9a776200e6e665 upstream.
This mouse needs QUIRK_ALWAYS_POLL.
--- drivers/hid/hid-ids.h | 3 +++ drivers/hid/usbhid/hid-quirks.c | 1 + 2 files changed, 4 insertions(+)
drivers/hid/hid-ids.h +3 -0
@@ -459,6 +459,9 @@#define USB_DEVICE_ID_UGCI_FLYING 0x0020#define USB_DEVICE_ID_UGCI_FIGHTING 0x0030 +#define USB_VENDOR_ID_HP 0x03f0 +#define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE 0x0a4a +#define USB_VENDOR_ID_HUION 0x256c#define USB_DEVICE_ID_HUION_TABLET 0x006e
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -78,6 +78,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, + { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL }, { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077, HID_QUIRK_ALWAYS_POLL }, { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS },
Greg Kroah-Hartman
maintainerPATCH 63/220 HID: add quirk for PIXART OEM mouse used by HP
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
commit b70b82580248b5393241c986082842ec05a2b7d7 upstream.
This mouse is also known under other IDs. It needs the quirk or will disconnect in runlevel 1 or 3.
--- drivers/hid/hid-ids.h | 1 + drivers/hid/usbhid/hid-quirks.c | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -461,6 +461,7 @@#define USB_VENDOR_ID_HP 0x03f0#define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE 0x0a4a +#define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE 0x134a#define USB_VENDOR_ID_HUION 0x256c#define USB_DEVICE_ID_HUION_TABLET 0x006e
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -79,6 +79,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL }, + { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL }, { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077, HID_QUIRK_ALWAYS_POLL }, { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS },
Greg Kroah-Hartman
maintainerPATCH 64/220 NFS: fix BUG() crash in notify_change() with patch to chown_common()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Elble <[email protected]>
commit c1b8940b42bb6487b10f2267a96b486276ce9ff7 upstream.
We have observed a BUG() crash in fs/attr.c:notify_change(). The crash occurs during an rsync into a filesystem that is exported via NFS.
1.) fs/attr.c:notify_change() modifies the caller's version of attr. 2.) 6de0ec00ba8d ("VFS: make notify_change pass ATTR_KILL_S*ID to
setattr operations") introduced a BUG() restriction such that "no function will ever call notify_change() with both ATTR_MODE and ATTR_KILL_S*ID set". Under some circumstances though, it will have assisted in setting the caller's version of attr to this very combination.
3.) 27ac0ffeac80 ("locks: break delegations on any attribute
modification") introduced code to handle breaking delegations. This can result in notify_change() being re-called. attr _must_ be explicitly reset to avoid triggering the BUG() established in #2.
4.) The path that that triggers this is via fs/open.c:chmod_common().
The combination of attr flags set here and in the first call to notify_change() along with a later failed break_deleg_wait() results in notify_change() being called again via retry_deleg without resetting attr.
Solution is to move retry_deleg in chmod_common() a bit further up to ensure attr is completely reset.
There are other places where this seemingly could occur, such as fs/utimes.c:utimes_common(), but the attr flags are not initially set in such a way to trigger this.
--- fs/open.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/open.c +1 -1
@@ -570,6 +570,7 @@ static int chown_common(struct path *pat uid =make_kuid (current_user_ns (), user); gid =make_kgid (current_user_ns (), group); +retry_deleg: newattrs.ia_valid =ATTR_CTIME ;if (user != (uid_t) -1 ) {if (!uid_valid (uid))
@@ -586,7 +587,6 @@ static int chown_common(struct path *patif (!S_ISDIR (inode->i_mode)) newattrs.ia_valid |=ATTR_KILL_SUID |ATTR_KILL_SGID |ATTR_KILL_PRIV ; -retry_deleg:mutex_lock (&inode->i_mutex); error =security_path_chown (path, uid, gid);if (!error)
Greg Kroah-Hartman
maintainerPATCH 65/220 ARM: fix broken hibernation
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Russell King <[email protected]>
commit 767bf7e7a1e82a81c59778348d156993d0a6175d upstream.
Normally, when a CPU wants to clear a cache line to zero in the external L2 cache, it would generate bus cycles to write each word as it would do with any other data access.
However, a Cortex A9 connected to a L2C-310 has a specific feature where the CPU can detect this operation, and signal that it wants to zero an entire cache line. This feature, known as Full Line of Zeros (FLZ), involves a non-standard AXI signalling mechanism which only the L2C-310 can properly interpret.
There are separate enable bits in both the L2C-310 and the Cortex A9 - the L2C-310 needs to be enabled and have the FLZ enable bit set in the auxiliary control register before the Cortex A9 has this feature enabled.
Unfortunately, the suspend code was not respecting this - it's not obvious from the code:
swsusp_arch_suspend()
cpu_suspend() /* saves the Cortex A9 auxiliary control register */
arch_save_image()
soft_restart() /* turns off FLZ in Cortex A9, and disables L2C */
cpu_resume() /* restores the Cortex A9 registers, inc auxcr */
At this point, we end up with the L2C disabled, but the Cortex A9 with FLZ enabled - which means any memset() or zeroing of a full cache line will fail to take effect.
A similar issue exists in the resume path, but it's slightly more complex:
swsusp_arch_suspend()
cpu_suspend() /* saves the Cortex A9 auxiliary control register */
arch_save_image() /* image with A9 auxcr saved */
...swsusp_arch_resume()
call_with_stack()
arch_restore_image() /* restores image with A9 auxcr saved above */ soft_restart() /* turns off FLZ in Cortex A9, and disables L2C */
cpu_resume() /* restores the Cortex A9 registers, inc auxcr */
Again, here we end up with the L2C disabled, but Cortex A9 FLZ enabled.
There's no need to turn off the L2C in either of these two paths; there are benefits from not doing so - for example, the page copies will be faster with the L2C enabled.
Hence, fix this by providing a variant of soft_restart() which can be used without turning the L2 cache controller off, and use it in both of these paths to keep the L2C enabled across the respective resume transitions.
--- arch/arm/kernel/hibernate.c | 5 +++-- arch/arm/kernel/process.c | 10 ++++++++-- arch/arm/kernel/reboot.h | 6 ++++++ 3 files changed, 17 insertions(+), 4 deletions(-)
arch/arm/kernel/hibernate.c +3 -2
@@ -22,6 +22,7 @@#include <asm/suspend.h> #include <asm/memory.h> #include <asm/sections.h> +#include "reboot.h" int pfn_is_nosave (unsigned long pfn) {
@@ -61,7 +62,7 @@ static int notrace arch_save_image(unsig ret =swsusp_save ();if (ret ==0 ) -soft_restart (virt_to_phys (cpu_resume)); +_soft_restart (virt_to_phys (cpu_resume), false);return ret; }
@@ -86,7 +87,7 @@ static void notrace arch_restore_image(vfor (pbe = restore_pblist; pbe; pbe = pbe->next)copy_page (pbe->orig_address, pbe->address); -soft_restart (virt_to_phys (cpu_resume)); +_soft_restart (virt_to_phys (cpu_resume), false); } static u64 resume_stack[PAGE_SIZE/2/sizeof(u64)] __nosavedata;
arch/arm/kernel/process.c +8 -2
@@ -41,6 +41,7 @@#include <asm/system_misc.h> #include <asm/mach/time.h> #include <asm/tls.h> +#include "reboot.h" #ifdef CONFIG_CC_STACKPROTECTOR #include <linux/stackprotector.h>
@@ -95,7 +96,7 @@ static void __soft_restart(void *addr)BUG (); } -void soft_restart (unsigned long addr) +void _soft_restart (unsigned long addr,bool disable_l2) {u64 *stack = soft_restart_stack +ARRAY_SIZE (soft_restart_stack);
@@ -104,7 +105,7 @@ void soft_restart(unsigned long addr)local_fiq_disable ();/* Disable the L2 if we're the last man standing. */ -if (num_online_cpus () ==1 ) +if (disable_l2)outer_disable ();/* Change to the new stack and continue with the reset. */
@@ -114,6 +115,11 @@ void soft_restart(unsigned long addr)BUG (); } +void soft_restart (unsigned long addr) +{ +_soft_restart (addr,num_online_cpus () ==1 ); +} +/* * Function pointers to optional machine specific functions */
arch/arm/kernel/reboot.h new file +6 -0
@@ -0,0 +1,6 @@ +#ifndef REBOOT_H +#define REBOOT_H + +extern void _soft_restart (unsigned long addr,bool disable_l2); + +#endif
Greg Kroah-Hartman
maintainerPATCH 66/220 ARM: 8320/1: fix integer overflow in ELF_ET_DYN_BASE
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Ryabinin <[email protected]>
commit 8defb3367fcd19d1af64c07792aade0747b54e0f upstream.
Usually ELF_ET_DYN_BASE is 2/3 of TASK_SIZE. With 3G/1G user/kernel split this is not so, because 2*TASK_SIZE overflows 32 bits, so the actual value of ELF_ET_DYN_BASE is:
(2 * TASK_SIZE / 3) = 0x2a000000
When ASLR is disabled PIE binaries will load at ELF_ET_DYN_BASE address. On 32bit platforms AddressSanitzer uses addresses [0x20000000 - 0x40000000] for shadow memory [1]. So ASan doesn't work for PIE binaries when ASLR disabled as it fails to map shadow memory.
Also after Kees's 'split ET_DYN ASLR from mmap ASLR' patchset PIE binaries has a high chance of loading somewhere in between [0x2a000000 - 0x40000000] even if ASLR enabled. This makes ASan with PIE absolutely incompatible.
Fix overflow by dividing TASK_SIZE prior to multiplying. After this patch ELF_ET_DYN_BASE equals to (for CONFIG_VMSPLIT_3G=y):
(TASK_SIZE / 3 * 2) = 0x7f555554
[1] https://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm#Mapping
--- arch/arm/include/asm/elf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/include/asm/elf.h +1 -1
@@ -115,7 +115,7 @@ int dump_task_regs(struct task_struct *tthe loader. We need to make sure that it is out of the way of the program that it will "exec", and that there is sufficient room for the brk. */ -#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) +#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)/* When the program starts, a1 contains a pointer to a function to be registered with atexit, as per the SVR4 ABI. A value of 0 means we
Greg Kroah-Hartman
maintainerPATCH 67/220 ARM: mvebu: Disable CPU Idle on Armada 38x
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gregory CLEMENT <[email protected]>
commit 548ae94c1cc7fc120848757249b9a542b1080ffb upstream.
On Armada 38x SoCs, under heavy I/O load, the system hangs when CPU Idle is enabled. Waiting for a solution to this issue, this patch disables the CPU Idle support for this SoC.
As CPU Hot plug support also uses some of the CPU Idle functions it is also affected by the same issue. This patch disables it also for the Armada 38x SoCs.
--- arch/arm/mach-mvebu/pmsu.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
arch/arm/mach-mvebu/pmsu.c +15 -1
@@ -415,6 +415,9 @@ static __init int armada_38x_cpuidle_inivoid __iomem *mpsoc_base;u32 reg; +pr_warn ("CPU idle is currently broken on Armada 38x: disabling" ); +return 0 ; + np =of_find_compatible_node (NULL ,NULL ,"marvell,armada-380-coherency-fabric" );if (!np)
@@ -476,6 +479,16 @@ static int __init mvebu_v7_cpu_pm_init(vreturn 0 ;of_node_put (np); +/* +* Currently the CPU idle support for Armada 38x is broken, as +* the CPU hotplug uses some of the CPU idle functions it is +* broken too, so let's disable it +*/ +if (of_machine_is_compatible ("marvell,armada380" )) { +cpu_hotplug_disable (); +pr_warn ("CPU hotplug support is currently broken on Armada 38x: disabling" ); + } +if (of_machine_is_compatible ("marvell,armadaxp" )) ret =armada_xp_cpuidle_init ();else if (of_machine_is_compatible ("marvell,armada370" ))
@@ -489,7 +502,8 @@ static int __init mvebu_v7_cpu_pm_init(vreturn ret;mvebu_v7_pmsu_enable_l2_powerdown_onidle (); -platform_device_register (&mvebu_v7_cpuidle_device); +if (mvebu_v7_cpuidle_device.name) +platform_device_register (&mvebu_v7_cpuidle_device);cpu_pm_register_notifier (&mvebu_v7_cpu_pm_notifier);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 68/220 ARM: S3C64XX: Use fixed IRQ bases to avoid conflicts on Cragganmore
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Keepax <[email protected]>
commit 4e330ae4ab2915444f1e6dca1358a910aa259362 upstream.
There are two PMICs on Cragganmore, currently one dynamically assign its IRQ base and the other uses a fixed base. It is possible for the statically assigned PMIC to fail if its IRQ is taken by the dynamically assigned one. Fix this by statically assigning both the IRQ bases.
--- arch/arm/mach-s3c64xx/crag6410.h | 1 + arch/arm/mach-s3c64xx/mach-crag6410.c | 1 + 2 files changed, 2 insertions(+)
arch/arm/mach-s3c64xx/crag6410.h +1 -0
@@ -14,6 +14,7 @@#include <mach/gpio-samsung.h> #define GLENFARCLAS_PMIC_IRQ_BASE IRQ_BOARD_START +#define BANFF_PMIC_IRQ_BASE (IRQ_BOARD_START + 64)#define PCA935X_GPIO_BASE GPIO_BOARD_START#define CODEC_GPIO_BASE (GPIO_BOARD_START + 8)
arch/arm/mach-s3c64xx/mach-crag6410.c +1 -0
@@ -554,6 +554,7 @@ static struct wm831x_touch_pdata touch_pstatic struct wm831x_pdata crag_pmic_pdata = { .wm831x_num =1 , + .irq_base =BANFF_PMIC_IRQ_BASE , .gpio_base =BANFF_PMIC_GPIO_BASE , .soft_shutdown = true,
Greg Kroah-Hartman
maintainerPATCH 69/220 ARM: at91/dt: sama5d3 xplained: add phy address for macb1
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Ferre <[email protected]>
commit 98b80987c940956da48f0c703f60340128bb8521 upstream.
After 57a38effa598 (net: phy: micrel: disable broadcast for KSZ8081/KSZ8091) the macb1 interface refuses to work properly because it tries
to cling to address 0 which isn't able to communicate in broadcast with the mac anymore. The micrel phy on the board is actually configured to show up at address 1.
Adding the phy node and its real address fixes the issue.
--- arch/arm/boot/dts/at91-sama5d3_xplained.dts | 6 ++++++ 1 file changed, 6 insertions(+)
arch/arm/boot/dts/at91-sama5d3_xplained.dts +6 -0
@@ -167,7 +167,13 @@ macb1: ethernet@f802c000 { phy-mode = "rmii"; + #address-cells = <1>; + #size-cells = <0>; status = "okay"; + + ethernet-phy@1 { + reg = <0x1>; + }; }; dbgu: serial@ffffee00 {
Greg Kroah-Hartman
maintainerPATCH 70/220 ARM: dts: dove: Fix uart[23] reg property
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Hesselbarth <[email protected]>
commit a74cd13b807029397f7232449df929bac11fb228 upstream.
Fix Dove's register addresses of uart2 and uart3 nodes that seem to be broken since ages due to a copy-and-paste error.
--- arch/arm/boot/dts/dove.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/dove.dtsi +2 -2
@@ -154,7 +154,7 @@ uart2: serial@12200 { compatible = "ns16550a"; - reg = <0x12000 0x100>; + reg = <0x12200 0x100>; reg-shift = <2>; interrupts = <9>; clocks = <&core_clk 0>;
@@ -163,7 +163,7 @@ uart3: serial@12300 { compatible = "ns16550a"; - reg = <0x12100 0x100>; + reg = <0x12300 0x100>; reg-shift = <2>; interrupts = <10>; clocks = <&core_clk 0>;
Greg Kroah-Hartman
maintainerPATCH 71/220 ARM: dts: fix mmc node updates for exynos5250-spring
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Faerber <[email protected]>
commit 7e9e20b1faab02357501553d7f4e3efec1b4cfd3 upstream.
Resolve a merge conflict with mmc refactoring aaa25a5a33cb ("ARM: dts:
unuse the slot-node and deprecate the supports-highspeed for dw-mmc in exynos") by dropping the slot@0 nodes, moving its bus-width property to the mmc node and replacing supports-highspeed with cap-{mmc,sd}-highspeed, matching exynos5250-snow.
--- arch/arm/boot/dts/exynos5250-spring.dts | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-)
arch/arm/boot/dts/exynos5250-spring.dts +4 -12
@@ -429,7 +429,6 @@ &mmc_0 { status = "okay"; num-slots = <1>; - supports-highspeed; broken-cd; card-detect-delay = <200>; samsung,dw-mshc-ciu-div = <3>;
@@ -437,11 +436,8 @@ samsung,dw-mshc-ddr-timing = <1 2>; pinctrl-names = "default"; pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_bus4 &sd0_bus8>; - - slot@0 { - reg = <0>; - bus-width = <8>; - }; + bus-width = <8>; + cap-mmc-highspeed; }; /*
@@ -451,7 +447,6 @@ &mmc_1 { status = "okay"; num-slots = <1>; - supports-highspeed; broken-cd; card-detect-delay = <200>; samsung,dw-mshc-ciu-div = <3>;
@@ -459,11 +454,8 @@ samsung,dw-mshc-ddr-timing = <1 2>; pinctrl-names = "default"; pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_cd &sd1_bus4>; - - slot@0 { - reg = <0>; - bus-width = <4>; - }; + bus-width = <4>; + cap-sd-highspeed; }; &pinctrl_0 {
Greg Kroah-Hartman
maintainerPATCH 72/220 usb: musb: core: fix TX/RX endpoint order
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit e3c93e1a3f35be4cf1493d3ccfb0c6d9209e4922 upstream.
As per Mentor Graphics' documentation, we should always handle TX endpoints before RX endpoints.
This patch fixes that error while also updating some hard-to-read comments which were scattered around musb_interrupt().
This patch should be backported as far back as possible since this error has been in the driver since it's conception.
--- drivers/usb/musb/musb_core.c | 44 +++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-)
drivers/usb/musb/musb_core.c +26 -18
@@ -1597,16 +1597,30 @@ irqreturn_t musb_interrupt(struct musb *is_host_active (musb) ?"host" :"peripheral" , musb->int_usb, musb->int_tx, musb->int_rx); -/* the core can interrupt us for multiple reasons; docs have -* a generic interrupt flowchart to follow +/** +* According to Mentor Graphics' documentation, flowchart on page 98, +* IRQ should be handled as follows: +* +* . Resume IRQ +* . Session Request IRQ +* . VBUS Error IRQ +* . Suspend IRQ +* . Connect IRQ +* . Disconnect IRQ +* . Reset/Babble IRQ +* . SOF IRQ (we're not using this one) +* . Endpoint 0 IRQ +* . TX Endpoints +* . RX Endpoints +* +* We will be following that flowchart in order to avoid any problems +* that might arise with internal Finite State Machine. */ +if (musb->int_usb) retval |=musb_stage0_irq (musb, musb->int_usb, devctl); -/* "stage 1" is handling endpoint irqs */ - -/* handle endpoint 0 first */ if (musb->int_tx &1 ) {if (is_host_active (musb)) retval |=musb_h_ep0_irq (musb);
@@ -1614,37 +1628,31 @@ irqreturn_t musb_interrupt(struct musb * retval |=musb_g_ep0_irq (musb); } -/* RX on endpoints 1-15 */ - reg = musb->int_rx >>1 ; + reg = musb->int_tx >>1 ; ep_num =1 ;while (reg) {if (reg &1 ) { -/* musb_ep_select(musb->mregs, ep_num); */ -/* REVISIT just retval = ep->rx_irq(...) */ retval =IRQ_HANDLED ;if (is_host_active (musb)) -musb_host_rx (musb, ep_num); +musb_host_tx (musb, ep_num);else -musb_g_rx (musb, ep_num); +musb_g_tx (musb, ep_num); } - reg >>=1 ; ep_num++; } -/* TX on endpoints 1-15 */ - reg = musb->int_tx >>1 ; + reg = musb->int_rx >>1 ; ep_num =1 ;while (reg) {if (reg &1 ) { -/* musb_ep_select(musb->mregs, ep_num); */ -/* REVISIT just retval |= ep->tx_irq(...) */ retval =IRQ_HANDLED ;if (is_host_active (musb)) -musb_host_tx (musb, ep_num); +musb_host_rx (musb, ep_num);else -musb_g_tx (musb, ep_num); +musb_g_rx (musb, ep_num); } + reg >>=1 ; ep_num++; }
Greg Kroah-Hartman
maintainerPATCH 73/220 usb: phy: Find the right match in devm_usb_phy_match
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Axel Lin <[email protected]>
commit 869aee0f31429fa9d94d5aef539602b73ae0cf4b upstream.
The res parameter passed to devm_usb_phy_match() is the location where the pointer to the usb_phy is stored, hence it needs to be dereferenced before comparing to the match data in order to find the correct match.
--- drivers/usb/phy/phy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/phy/phy.c +3 -1
@@ -81,7 +81,9 @@ static void devm_usb_phy_release(structstatic int devm_usb_phy_match (struct device *dev,void *res,void *match_data) { -return res == match_data; +struct usb_phy **phy = res; + +return *phy == match_data; }/**
Greg Kroah-Hartman
maintainerPATCH 74/220 usb: define a generic USB_RESUME_TIMEOUT macro
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 62f0342de1f012f3e90607d39e20fce811391169 upstream.
Every USB Host controller should use this new macro to define for how long resume signalling should be driven on the bus.
Currently, almost every single USB controller is using a 20ms timeout for resume signalling.
That's problematic for two reasons:
a) sometimes that 20ms timer expires a little before 20ms, which makes us fail certification
b) some (many) devices actually need more than 20ms resume signalling.
Sure, in case of (b) we can state that the device is against the USB spec, but the fact is that we have no control over which device the certification lab will use. We also have no control over which host they will use. Most likely they'll be using a Windows PC which, again, we have no control over how that USB stack is written and how long resume signalling they are using.
At the end of the day, we must make sure Linux passes electrical compliance when working as Host or as Device and currently we don't pass compliance as host because we're driving resume signallig for exactly 20ms and that confuses certification test setup resulting in Certification failure.
--- include/linux/usb.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
include/linux/usb.h +26 -0
@@ -205,6 +205,32 @@ void usb_put_intf(struct usb_interface *#define USB_MAXINTERFACES 32#define USB_MAXIADS (USB_MAXINTERFACES/2) +/* +* USB Resume Timer: Every Host controller driver should drive the resume +* signalling on the bus for the amount of time defined by this macro. +* +* That way we will have a 'stable' behavior among all HCDs supported by Linux. +* +* Note that the USB Specification states we should drive resume for *at least* +* 20 ms, but it doesn't give an upper bound. This creates two possible +* situations which we want to avoid: +* +* (a) sometimes an msleep(20) might expire slightly before 20 ms, which causes +* us to fail USB Electrical Tests, thus failing Certification +* +* (b) Some (many) devices actually need more than 20 ms of resume signalling, +* and while we can argue that's against the USB Specification, we don't have +* control over which devices a certification laboratory will be using for +* certification. If CertLab uses a device which was tested against Windows and +* that happens to have relaxed resume signalling rules, we might fall into +* situations where we fail interoperability and electrical tests. +* +* In order to avoid both conditions, we're using a 40 ms resume timeout, which +* should cope with both LPJ calibration errors and devices not following every +* detail of the USB Specification. +*/ +#define USB_RESUME_TIMEOUT 40/* ms */ +/** * struct usb_interface_cache - long-term representation of a device interface * @num_altsetting: number of altsettings defined.
Greg Kroah-Hartman
maintainerPATCH 75/220 usb: musb: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 309be239369609929d5d3833ee043f7c5afc95d1 upstream.
Make sure we're using the new macro, so our resume signaling will always pass certification.
Based on original work by Bin Liu <Bin Liu <[email protected]>>
--- drivers/usb/musb/musb_core.c | 7 ++++--- drivers/usb/musb/musb_virthub.c | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/usb/musb/musb_core.c +4 -3
@@ -99,6 +99,7 @@#include <linux/platform_device.h> #include <linux/io.h> #include <linux/dma-mapping.h> +#include <linux/usb.h> #include "musb_core.h"
@@ -562,7 +563,7 @@ static irqreturn_t musb_stage0_irq(struc (USB_PORT_STAT_C_SUSPEND <<16 ) |MUSB_PORT_STAT_RESUME ; musb->rh_timer = jiffies - +msecs_to_jiffies (20 ); + +msecs_to_jiffies (USB_RESUME_TIMEOUT ); musb->need_finish_resume =1 ; musb->xceiv->otg->state =OTG_STATE_A_HOST ;
@@ -2471,7 +2472,7 @@ static int musb_resume(struct device *deif (musb->need_finish_resume) { musb->need_finish_resume =0 ;schedule_delayed_work (&musb->finish_resume_work, -msecs_to_jiffies (20 )); +msecs_to_jiffies (USB_RESUME_TIMEOUT )); }/*
@@ -2514,7 +2515,7 @@ static int musb_runtime_resume(struct deif (musb->need_finish_resume) { musb->need_finish_resume =0 ;schedule_delayed_work (&musb->finish_resume_work, -msecs_to_jiffies (20 )); +msecs_to_jiffies (USB_RESUME_TIMEOUT )); }return 0 ;
drivers/usb/musb/musb_virthub.c +1 -1
@@ -136,7 +136,7 @@ void musb_port_suspend(struct musb *musb/* later, GetPortStatus will stop RESUME signaling */ musb->port1_status |=MUSB_PORT_STAT_RESUME ;schedule_delayed_work (&musb->finish_resume_work, -msecs_to_jiffies (20 )); +msecs_to_jiffies (USB_RESUME_TIMEOUT )); } }
Greg Kroah-Hartman
maintainerPATCH 76/220 usb: host: oxu210hp: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 84c0d178eb9f3a3ae4d63dc97a440266cf17f7f5 upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/host/oxu210hp-hcd.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/usb/host/oxu210hp-hcd.c +4 -3
@@ -2500,11 +2500,12 @@ static irqreturn_t oxu210_hcd_irq(struct || oxu->reset_done[i] != 0)continue ; -/* start 20 msec resume signaling from this port, -* and make hub_wq collect PORT_STAT_C_SUSPEND to +/* start USB_RESUME_TIMEOUT resume signaling from this +* port, and make hub_wq collect PORT_STAT_C_SUSPEND to * stop that signaling. */ - oxu->reset_done[i] = jiffies +msecs_to_jiffies (20 ); + oxu->reset_done[i] = jiffies + +msecs_to_jiffies (USB_RESUME_TIMEOUT );oxu_dbg (oxu,"port %d remote wakeup\n" , i +1 );mod_timer (&hcd->rh_timer, oxu->reset_done[i]); }
Greg Kroah-Hartman
maintainerPATCH 77/220 usb: host: fusbh200: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 595227db1f2d98bfc33f02a55842f268e12b247d upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/host/fusbh200-hcd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/usb/host/fusbh200-hcd.c +1 -2
@@ -1550,10 +1550,9 @@ static int fusbh200_hub_control (if ((temp &PORT_PE ) ==0 ) goto error; -/* resume signaling for 20 msec */ fusbh200_writel (fusbh200, temp |PORT_RESUME , status_reg); fusbh200->reset_done[wIndex] = jiffies - +msecs_to_jiffies (20 ); + +msecs_to_jiffies (USB_RESUME_TIMEOUT );break ;case USB_PORT_FEAT_C_SUSPEND :clear_bit (wIndex, &fusbh200->port_c_suspend);
Greg Kroah-Hartman
maintainerPATCH 78/220 usb: host: uhci: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit b8fb6f79f76f478acbbffccc966daa878f172a0a upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/host/uhci-hub.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/usb/host/uhci-hub.c +3 -2
@@ -166,7 +166,7 @@ static void uhci_check_ports(struct uhci/* Port received a wakeup request */ set_bit (port, &uhci->resuming_ports); uhci->ports_timeout = jiffies + -msecs_to_jiffies (25 ); +msecs_to_jiffies (USB_RESUME_TIMEOUT );usb_hcd_start_port_resume ( &uhci_to_hcd (uhci)->self, port);
@@ -338,7 +338,8 @@ static int uhci_hub_control(struct usb_huhci_finish_suspend (uhci, port, port_addr);/* USB v2.0 7.1.7.5 */ - uhci->ports_timeout = jiffies +msecs_to_jiffies (50 ); + uhci->ports_timeout = jiffies + +msecs_to_jiffies (USB_RESUME_TIMEOUT );break ;case USB_PORT_FEAT_POWER :/* UHCI has no power switching */
Greg Kroah-Hartman
maintainerPATCH 79/220 usb: host: fotg210: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 7e136bb71a08e8b8be3bc492f041d9b0bea3856d upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/fotg210-hcd.c +1 -1
@@ -1595,7 +1595,7 @@ static int fotg210_hub_control(/* resume signaling for 20 msec */ fotg210_writel (fotg210, temp |PORT_RESUME , status_reg); fotg210->reset_done[wIndex] = jiffies - +msecs_to_jiffies (20 ); + +msecs_to_jiffies (USB_RESUME_TIMEOUT );break ;case USB_PORT_FEAT_C_SUSPEND :clear_bit (wIndex, &fotg210->port_c_suspend);
Greg Kroah-Hartman
maintainerPATCH 80/220 usb: host: r8a66597: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 7a606ac29752a3e571b83f9b3fceb1eaa1d37781 upstream.
While this driver was already using a 50ms resume timeout, let's make sure everybody uses the same macro so it's easy to fix later should anything go wrong.
It also gives a more "stable" expectation to Linux users.
--- drivers/usb/host/r8a66597-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/r8a66597-hcd.c +1 -1
@@ -2301,7 +2301,7 @@ static int r8a66597_bus_resume(struct us rh->port &= ~USB_PORT_STAT_SUSPEND ; rh->port |=USB_PORT_STAT_C_SUSPEND <<16 ;r8a66597_mdfy (r8a66597,RESUME ,RESUME |UACT , dvstctr_reg); -msleep (50 ); +msleep (USB_RESUME_TIMEOUT );r8a66597_mdfy (r8a66597,UACT ,RESUME |UACT , dvstctr_reg); }
Greg Kroah-Hartman
maintainerPATCH 81/220 usb: host: isp116x: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 8c0ae6574ccfd3d619876a65829aad74c9d22ba5 upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/host/isp116x-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/isp116x-hcd.c +1 -1
@@ -1490,7 +1490,7 @@ static int isp116x_bus_resume(struct usbspin_unlock_irq (&isp116x->lock); hcd->state =HC_STATE_RESUMING ; -msleep (20 ); +msleep (USB_RESUME_TIMEOUT );/* Go operational */ spin_lock_irq (&isp116x->lock);
Greg Kroah-Hartman
maintainerPATCH 82/220 usb: host: xhci: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit b9e451885deb6262dbaf5cd14aa77d192d9ac759 upstream.
Make sure we're using the new macro, so our resume signaling will always pass certification.
--- drivers/usb/host/xhci-ring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/xhci-ring.c +1 -1
@@ -1574,7 +1574,7 @@ static void handle_port_status(struct xh }else {xhci_dbg (xhci,"resume HS port %d\n" , port_id); bus_state->resume_done[faked_port_index] = jiffies + -msecs_to_jiffies (20 ); +msecs_to_jiffies (USB_RESUME_TIMEOUT );set_bit (faked_port_index, &bus_state->resuming_ports);mod_timer (&hcd->rh_timer, bus_state->resume_done[faked_port_index]);
Greg Kroah-Hartman
maintainerPATCH 83/220 usb: host: ehci: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit ea16328f80ca8d74434352157f37ef60e2f55ce2 upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/host/ehci-hcd.c | 10 +++++----- drivers/usb/host/ehci-hub.c | 9 ++++++--- 2 files changed, 11 insertions(+), 8 deletions(-)
drivers/usb/host/ehci-hcd.c +5 -5
@@ -792,12 +792,12 @@ static irqreturn_t ehci_irq (struct usb_ ehci->reset_done[i] == 0))continue ; -/* start 20 msec resume signaling from this port, -* and make hub_wq collect PORT_STAT_C_SUSPEND to -* stop that signaling. Use 5 ms extra for safety, -* like usb_port_resume() does. +/* start USB_RESUME_TIMEOUT msec resume signaling from +* this port, and make hub_wq collect +* PORT_STAT_C_SUSPEND to stop that signaling. */ - ehci->reset_done[i] = jiffies +msecs_to_jiffies (25 ); + ehci->reset_done[i] = jiffies + +msecs_to_jiffies (USB_RESUME_TIMEOUT );set_bit (i, &ehci->resuming_ports);ehci_dbg (ehci,"port %d remote wakeup\n" , i +1 );usb_hcd_start_port_resume (&hcd->self, i);
drivers/usb/host/ehci-hub.c +6 -3
@@ -471,10 +471,13 @@ static int ehci_bus_resume (struct usb_hehci_writel (ehci, temp, &ehci->regs->port_status [i]); } -/* msleep for 20ms only if code is trying to resume port */ +/* +* msleep for USB_RESUME_TIMEOUT ms only if code is trying to resume +* port +*/ if (resume_needed) {spin_unlock_irq (&ehci->lock); -msleep (20 ); +msleep (USB_RESUME_TIMEOUT );spin_lock_irq (&ehci->lock);if (ehci->shutdown) goto shutdown;
@@ -942,7 +945,7 @@ int ehci_hub_control( temp &= ~PORT_WAKE_BITS ;ehci_writel (ehci, temp |PORT_RESUME , status_reg); ehci->reset_done[wIndex] = jiffies - +msecs_to_jiffies (20 ); + +msecs_to_jiffies (USB_RESUME_TIMEOUT );set_bit (wIndex, &ehci->resuming_ports);usb_hcd_start_port_resume (&hcd->self, wIndex);break ;
Greg Kroah-Hartman
maintainerPATCH 84/220 usb: host: sl811: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 08debfb13b199716da6153940c31968c556b195d upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/host/sl811-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/sl811-hcd.c +1 -1
@@ -1259,7 +1259,7 @@ sl811h_hub_control(sl811_write (sl811,SL11H_CTLREG1 , sl811->ctrl1);mod_timer (&sl811->timer, jiffies - +msecs_to_jiffies (20 )); + +msecs_to_jiffies (USB_RESUME_TIMEOUT ));break ;case USB_PORT_FEAT_POWER :port_power (sl811,0 );
Greg Kroah-Hartman
maintainerPATCH 85/220 usb: dwc2: hcd: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 74bd7b69801819707713b88e9d0bc074efa2f5e7 upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/dwc2/hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/dwc2/hcd.c +1 -1
@@ -1521,7 +1521,7 @@ static int dwc2_hcd_hub_control(struct ddev_dbg (hsotg->dev,"ClearPortFeature USB_PORT_FEAT_SUSPEND\n" );writel (0 , hsotg->regs +PCGCTL ); -usleep_range (20000 ,40000 ); +msleep (USB_RESUME_TIMEOUT ); hprt0 =dwc2_read_hprt0 (hsotg); hprt0 |=HPRT0_RES ;
Greg Kroah-Hartman
maintainerPATCH 86/220 usb: isp1760: hcd: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit 59c9904cce77b55892e15f40791f1e66e4d3a1e6 upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/isp1760/isp1760-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/isp1760/isp1760-hcd.c +1 -1
@@ -1869,7 +1869,7 @@ static int isp1760_hub_control(struct usreg_write32 (hcd->regs,HC_PORTSC1 , temp |PORT_RESUME ); priv->reset_done = jiffies + -msecs_to_jiffies (20 ); +msecs_to_jiffies (USB_RESUME_TIMEOUT ); }break ;case USB_PORT_FEAT_C_SUSPEND :
Greg Kroah-Hartman
maintainerPATCH 87/220 usb: core: hub: use new USB_RESUME_TIMEOUT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Balbi <[email protected]>
commit bbc78c07a51f6fd29c227b1220a9016e585358ba upstream.
Make sure we're using the new macro, so our
resume signaling will always pass certification.
--- drivers/usb/core/hub.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/core/hub.c +2 -2
@@ -3406,10 +3406,10 @@ int usb_port_resume(struct usb_device *uif (status) {dev_dbg (&port_dev->dev,"can't resume, status %d\n" , status); }else { -/* drive resume for at least 20 msec */ +/* drive resume for USB_RESUME_TIMEOUT msec */ dev_dbg (&udev->dev,"usb %sresume\n" , (PMSG_IS_AUTO (msg) ?"auto-" :"" )); -msleep (25 ); +msleep (USB_RESUME_TIMEOUT );/* Virtual root hubs can trigger on GET_PORT_STATUS to * stop resume signaling. Then finish the resume
Greg Kroah-Hartman
maintainerPATCH 88/220 clk: at91: usb: propagate rate modification to the parent clk
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit 4591243102faa8de92da320edea47219901461e9 upstream.
The at91sam9n12 and at91sam9x5 usb clocks do not propagate rate modification requests to their parents.
This causes a bug when the PLLB is left uninitialized by the bootloader (PLL multiplier set to 0, or in other words, PLL rate = 0 Hz).
Implement the determinate_rate method and propagate the change rate request to the parent clk.
--- drivers/clk/at91/clk-usb.c | 72 +++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 19 deletions(-)
drivers/clk/at91/clk-usb.c +53 -19
@@ -56,22 +56,55 @@ static unsigned long at91sam9x5_clk_usb_return DIV_ROUND_CLOSEST (parent_rate, (usbdiv +1 )); } -static long at91sam9x5_clk_usb_round_rate (struct clk_hw *hw,unsigned long rate, -unsigned long *parent_rate) -{ -unsigned long div; - -if (!rate) -return -EINVAL ; - -if (rate >= *parent_rate) -return *parent_rate; - - div =DIV_ROUND_CLOSEST (*parent_rate, rate); -if (div >SAM9X5_USB_MAX_DIV +1 ) - div =SAM9X5_USB_MAX_DIV +1 ; +static long at91sam9x5_clk_usb_determine_rate (struct clk_hw *hw, +unsigned long rate, +unsigned long min_rate, +unsigned long max_rate, +unsigned long *best_parent_rate, +struct clk_hw **best_parent_hw) +{ +struct clk *parent =NULL ; +long best_rate = -EINVAL ; +unsigned long tmp_rate; +int best_diff =-1 ; +int tmp_diff; +int i; + +for (i =0 ; i <__clk_get_num_parents (hw->clk); i++) { +int div; + + parent =clk_get_parent_by_index (hw->clk, i); +if (!parent) +continue ; + +for (div =1 ; div <SAM9X5_USB_MAX_DIV +2 ; div++) { +unsigned long tmp_parent_rate; + + tmp_parent_rate = rate * div; + tmp_parent_rate =__clk_round_rate (parent, + tmp_parent_rate); + tmp_rate =DIV_ROUND_CLOSEST (tmp_parent_rate, div); +if (tmp_rate < rate) + tmp_diff = rate - tmp_rate; +else + tmp_diff = tmp_rate - rate; + +if (best_diff <0 || best_diff > tmp_diff) { + best_rate = tmp_rate; + best_diff = tmp_diff; + *best_parent_rate = tmp_parent_rate; + *best_parent_hw =__clk_get_hw (parent); + } + +if (!best_diff || tmp_rate < rate) +break ; + } + +if (!best_diff) +break ; + } -return DIV_ROUND_CLOSEST (*parent_rate, div); +return best_rate; }static int at91sam9x5_clk_usb_set_parent (struct clk_hw *hw,u8 index)
@@ -121,7 +154,7 @@ static int at91sam9x5_clk_usb_set_rate(sstatic const struct clk_ops at91sam9x5_usb_ops = { .recalc_rate = at91sam9x5_clk_usb_recalc_rate, - .round_rate = at91sam9x5_clk_usb_round_rate, + .determine_rate = at91sam9x5_clk_usb_determine_rate, .get_parent = at91sam9x5_clk_usb_get_parent, .set_parent = at91sam9x5_clk_usb_set_parent, .set_rate = at91sam9x5_clk_usb_set_rate,
@@ -159,7 +192,7 @@ static const struct clk_ops at91sam9n12_ .disable = at91sam9n12_clk_usb_disable, .is_enabled = at91sam9n12_clk_usb_is_enabled, .recalc_rate = at91sam9x5_clk_usb_recalc_rate, - .round_rate = at91sam9x5_clk_usb_round_rate, + .determine_rate = at91sam9x5_clk_usb_determine_rate, .set_rate = at91sam9x5_clk_usb_set_rate, };
@@ -179,7 +212,8 @@ at91sam9x5_clk_register_usb(struct at91_ init.ops = &at91sam9x5_usb_ops; init.parent_names = parent_names; init.num_parents = num_parents; - init.flags =CLK_SET_RATE_GATE |CLK_SET_PARENT_GATE ; + init.flags =CLK_SET_RATE_GATE |CLK_SET_PARENT_GATE | +CLK_SET_RATE_PARENT ; usb->hw.init = &init; usb->pmc = pmc;
@@ -207,7 +241,7 @@ at91sam9n12_clk_register_usb(struct at91 init.ops = &at91sam9n12_usb_ops; init.parent_names = &parent_name; init.num_parents =1 ; - init.flags =CLK_SET_RATE_GATE ; + init.flags =CLK_SET_RATE_GATE |CLK_SET_RATE_PARENT ; usb->hw.init = &init; usb->pmc = pmc;
Greg Kroah-Hartman
maintainerPATCH 89/220 ALSA: hda - Add dock support for ThinkPad X250 (17aa:2226)
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yves-Alexis Perez <[email protected]>
commit c0278669fb61596cc1a10ab8686d27c37269c37b upstream.
This model uses the same dock port as the previous generation.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -5047,6 +5047,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x2212 ,"Thinkpad T440" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x2214 ,"Thinkpad X240" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x2215 ,"Thinkpad" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ), +SND_PCI_QUIRK (0x17aa ,0x2226 ,"ThinkPad X250" ,ALC292_FIXUP_TPT440_DOCK ),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, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Greg Kroah-Hartman
maintainerPATCH 90/220 ALSA: usb-audio: Dont attempt to get Microsoft Lifecam Cinema sample rate
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Honse <[email protected]>
commit eef0342cf32689f77d78ee3302999e5caaa6a8f3 upstream.
Adds Microsoft LifeCam Cinema USB ID to the snd_usb_get_sample_rate_quirk list as the Lifecam Cinema does not appear to support getting the sample rate.
Fixes the issue where the LifeCam Cinema would wait for USB timeout and log the message "cannot get freq at ep 0x82" when accessed.
Addresses bug report https://bugzilla.kernel.org/show_bug.cgi?id=95961.
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1115,6 +1115,7 @@ bool snd_usb_get_sample_rate_quirk(struc {/* devices which do not support reading the sample rate. */ switch (chip->usb_id) { +case USB_ID (0x045E ,0x075D ):/* MS Lifecam Cinema */ case USB_ID (0x045E ,0x076D ):/* MS Lifecam HD-5000 */ case USB_ID (0x04D8 ,0xFEEA ):/* Benchmark DAC1 Pre */ return true;
Greg Kroah-Hartman
maintainerPATCH 91/220 ALSA: emu10k1: dont deadlock in proc-functions
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Gernoth <[email protected]>
commit 91bf0c2dcb935a87e5c0795f5047456b965fd143 upstream.
The functions snd_emu10k1_proc_spdif_read and snd_emu1010_fpga_read acquire the emu_lock before accessing the FPGA. The function used to access the FPGA (snd_emu1010_fpga_read) also tries to take the emu_lock which causes a deadlock.
Remove the outer locking in the proc-functions (guarding only the already safe fpga read) to prevent this deadlock.
[removed superfluous flags variables too -- tiwai]
--- sound/pci/emu10k1/emuproc.c | 12 ------------ 1 file changed, 12 deletions(-)
sound/pci/emu10k1/emuproc.c +0 -12
@@ -241,31 +241,22 @@ static void snd_emu10k1_proc_spdif_read(struct snd_emu10k1 *emu = entry->private_data;u32 value;u32 value2; -unsigned long flags;u32 rate;if (emu->card_capabilities->emu_model) { -spin_lock_irqsave (&emu->emu_lock, flags);snd_emu1010_fpga_read (emu,0x38 , &value); -spin_unlock_irqrestore (&emu->emu_lock, flags);if ((value &0x1 ) ==0 ) { -spin_lock_irqsave (&emu->emu_lock, flags);snd_emu1010_fpga_read (emu,0x2a , &value);snd_emu1010_fpga_read (emu,0x2b , &value2); -spin_unlock_irqrestore (&emu->emu_lock, flags); rate =0x1770000 / (((value <<5 ) | value2)+1 );snd_iprintf (buffer,"ADAT Locked : %u\n" , rate); }else {snd_iprintf (buffer,"ADAT Unlocked\n" ); } -spin_lock_irqsave (&emu->emu_lock, flags);snd_emu1010_fpga_read (emu,0x20 , &value); -spin_unlock_irqrestore (&emu->emu_lock, flags);if ((value &0x4 ) ==0 ) { -spin_lock_irqsave (&emu->emu_lock, flags);snd_emu1010_fpga_read (emu,0x28 , &value);snd_emu1010_fpga_read (emu,0x29 , &value2); -spin_unlock_irqrestore (&emu->emu_lock, flags); rate =0x1770000 / (((value <<5 ) | value2)+1 );snd_iprintf (buffer,"SPDIF Locked : %d\n" , rate); }else {
@@ -410,14 +401,11 @@ static void snd_emu_proc_emu1010_reg_rea {struct snd_emu10k1 *emu = entry->private_data;u32 value; -unsigned long flags;int i;snd_iprintf (buffer,"EMU1010 Registers:\n\n" );for (i =0 ; i <0x40 ; i+=1 ) { -spin_lock_irqsave (&emu->emu_lock, flags);snd_emu1010_fpga_read (emu, i, &value); -spin_unlock_irqrestore (&emu->emu_lock, flags);snd_iprintf (buffer,"%02X: %08X, %02X\n" , i, value, (value >>8 ) &0x7f ); } }
Greg Kroah-Hartman
maintainerPATCH 92/220 ALSA: hda/realtek - Enable the ALC292 dock fixup on the Thinkpad T450
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jo-Philipp Wich <[email protected]>
commit f2aa111041ce36b94e651d882458dea502e76721 upstream.
The Lenovo Thinkpad T450 requires the ALC292_FIXUP_TPT440_DOCK as well in order to get working sound output on the docking stations headphone jack.
Patch tested on a Thinkpad T450 (20BVCTO1WW) using kernel 4.0-rc7 in conjunction with a ThinkPad Ultradock.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -5054,6 +5054,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x501a ,"Thinkpad" ,ALC283_FIXUP_INT_MIC ),SND_PCI_QUIRK (0x17aa ,0x501e ,"Thinkpad L440" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x5026 ,"Thinkpad" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ), +SND_PCI_QUIRK (0x17aa ,0x5034 ,"Thinkpad T450" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x5036 ,"Thinkpad T450s" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x5109 ,"Thinkpad" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ), SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
Greg Kroah-Hartman
maintainerPATCH 93/220 ALSA: hda - fix "num_steps = 0" error on ALC256
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Henningsson <[email protected]>
commit 7d1b6e29327428993ba568bdd8c66734070f45e0 upstream.
The ALC256 does not have a mixer nid at 0x0b, and there's no loopback path (the output pins are directly connected to the DACs).
This commit fixes an "num_steps = 0 for NID=0xb (ctl = Beep Playback Volume)" error (and as a result, problems with amixer/alsamixer).
If there's pcbeep functionality, it certainly isn't controlled by setting an amp on 0x0b, so disable beep functionality (at least for now).
--- sound/pci/hda/patch_realtek.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +3 -2
@@ -5565,6 +5565,7 @@ static int patch_alc269(struct hda_codecbreak ;case 0x10ec0256 : spec->codec_variant =ALC269_TYPE_ALC256 ; + spec->gen.mixer_nid =0 ;/* ALC256 does not have any loopback mixer path */ break ; }
@@ -5578,8 +5579,8 @@ static int patch_alc269(struct hda_codecif (err <0 ) goto error; -if (!spec->gen.no_analog && spec->gen.beep_nid) -set_beep_amp (spec,0x0b ,0x04 ,HDA_INPUT ); +if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) +set_beep_amp (spec, spec->gen.mixer_nid,0x04 ,HDA_INPUT ); codec->patch_ops = alc_patch_ops;#ifdef CONFIG_PM
Greg Kroah-Hartman
maintainerPATCH 94/220 ALSA: hda/realtek - Fix Headphone Mic doesnt recording for ALC256
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
commit d32b66668c702aed0e330dc5ca186afbadcdacf8 upstream.
Switch default pcbeep path to Line in path.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -5566,6 +5566,7 @@ static int patch_alc269(struct hda_codeccase 0x10ec0256 : spec->codec_variant =ALC269_TYPE_ALC256 ; spec->gen.mixer_nid =0 ;/* ALC256 does not have any loopback mixer path */ +alc_update_coef_idx (codec,0x36 ,1 <<13 ,1 <<5 );/* Switch pcbeep path to Line in path*/ break ; }
Greg Kroah-Hartman
maintainerPATCH 95/220 ALSA: hda - fix headset mic detection problem for one more machine
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Wang <[email protected]>
commit e8191a8e475551b277d85cd76c3f0f52fdf42e86 upstream.
We have two machines with alc256 codec in the pin quirk table, so moving the common pins to ALC256_STANDARD_PINS.
--- sound/pci/hda/patch_realtek.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-)
sound/pci/hda/patch_realtek.c +15 -9
@@ -5144,6 +5144,16 @@ static const struct hda_model_fixup alc2 {0x1b, 0x411111f0}, \ {0x1e, 0x411111f0} +#define ALC256_STANDARD_PINS \ + {0x12, 0x90a60140}, \ + {0x14, 0x90170110}, \ + {0x19, 0x411111f0}, \ + {0x1a, 0x411111f0}, \ + {0x1b, 0x411111f0}, \ + {0x1d, 0x40700001}, \ + {0x1e, 0x411111f0}, \ + {0x21, 0x02211020} +#define ALC282_STANDARD_PINS \ {0x14, 0x90170110}, \ {0x18, 0x411111f0}, \
@@ -5237,15 +5247,11 @@ static const struct snd_hda_pin_quirk al {0x1d, 0x40700001}, {0x21, 0x02211050}), SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, - {0x12, 0x90a60140}, - {0x13, 0x40000000}, - {0x14, 0x90170110}, - {0x19, 0x411111f0}, - {0x1a, 0x411111f0}, - {0x1b, 0x411111f0}, - {0x1d, 0x40700001}, - {0x1e, 0x411111f0}, - {0x21, 0x02211020}), + ALC256_STANDARD_PINS, + {0x13, 0x40000000}), + SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, + ALC256_STANDARD_PINS, + {0x13, 0x411111f0}), SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, {0x12, 0x90a60130}, {0x13, 0x40000000},
Greg Kroah-Hartman
maintainerPATCH 96/220 Input: elantech - fix absolute mode setting on some ASUS laptops
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ulrik De Bie <[email protected]>
commit bd884149aca61de269fd9bad83fe2a4232ffab21 upstream.
On ASUS TP500LN and X750JN, the touchpad absolute mode is reset each time set_rate is done.
In order to fix this, we will verify the firmware version, and if it matches the one in those laptops, the set_rate function is overloaded with a function elantech_set_rate_restore_reg_07 that performs the set_rate with the original function, followed by a restore of reg_07 (the register that sets the absolute mode on elantech v4 hardware).
Also the ASUS TP500LN and X750JN firmware version, capabilities, and button constellation is added to elantech.c
--- drivers/input/mouse/elantech.c | 22 ++++++++++++++++++++++ drivers/input/mouse/elantech.h | 1 + 2 files changed, 23 insertions(+)
drivers/input/mouse/elantech.c +22 -0
@@ -893,6 +893,21 @@ static psmouse_ret_t elantech_process_by }/* +* This writes the reg_07 value again to the hardware at the end of every +* set_rate call because the register loses its value. reg_07 allows setting +* absolute mode on v4 hardware +*/ +static void elantech_set_rate_restore_reg_07 (struct psmouse *psmouse, +unsigned int rate) +{ +struct elantech_data *etd = psmouse->private; + + etd->original_set_rate (psmouse, rate); +if (elantech_write_reg (psmouse,0x07 , etd->reg_07)) +psmouse_err (psmouse,"restoring reg_07 failed\n" ); +} + +/* * Put the touchpad into absolute mode */ static int elantech_set_absolute_mode (struct psmouse *psmouse)
@@ -1094,6 +1109,8 @@ static int elantech_get_resolution_v4(st* Asus K53SV 0x450f01 78, 15, 0c 2 hw buttons * Asus G46VW 0x460f02 00, 18, 0c 2 hw buttons * Asus G750JX 0x360f00 00, 16, 0c 2 hw buttons +* Asus TP500LN 0x381f17 10, 14, 0e clickpad +* Asus X750JN 0x381f17 10, 14, 0e clickpad * Asus UX31 0x361f00 20, 15, 0e clickpad * Asus UX32VD 0x361f02 00, 15, 0e clickpad * Avatar AVIU-145A2 0x361f00 ? clickpad
@@ -1635,6 +1652,11 @@ int elantech_init(struct psmouse *psmous goto init_fail; } +if (etd->fw_version ==0x381f17 ) { + etd->original_set_rate = psmouse->set_rate; + psmouse->set_rate = elantech_set_rate_restore_reg_07; + } +if (elantech_set_input_params (psmouse)) {psmouse_err (psmouse,"failed to query touchpad range.\n" ); goto init_fail;
drivers/input/mouse/elantech.h +1 -0
@@ -142,6 +142,7 @@ struct elantech_data {struct finger_pos mt[ETP_MAX_FINGERS ];unsigned char parity[256 ];int (*send_cmd)(struct psmouse *psmouse,unsigned char c,unsigned char *param); +void (*original_set_rate)(struct psmouse *psmouse,unsigned int rate); };#ifdef CONFIG_MOUSE_PS2_ELANTECH
Greg Kroah-Hartman
maintainerPATCH 98/220 mfd: core: Fix platform-device name collisions
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit a77c50b44cfb663ad03faba9800fec19bdf83577 upstream.
Since commit 6e3f62f0793e ("mfd: core: Fix platform-device id generation") we honour PLATFORM_DEVID_AUTO and PLATFORM_DEVID_NONE when registering mfd-devices.
Unfortunately, some mfd-drivers rely on the old behaviour of generating platform-device ids by adding the cell id also to the special value of PLATFORM_DEVID_NONE. The resulting platform ids are not only used to generate device-unique names, but are also used instead of the cell id to identify cells when probing subdevices.
These drivers should be updated to use PLATFORM_DEVID_AUTO, which would also allow more than one device to be registered without resorting to hacks (see for example wm831x), but lets fix the regression first by partially reverting the above mentioned commit with respect to PLATFORM_DEVID_NONE.
--- drivers/mfd/mfd-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mfd/mfd-core.c +1 -1
@@ -128,7 +128,7 @@ static int mfd_add_device(struct deviceint platform_id;int r; -if (id <0 ) +if (id ==PLATFORM_DEVID_AUTO ) platform_id = id;else platform_id = id + cell->id;
Greg Kroah-Hartman
maintainerPATCH 99/220 fs/binfmt_elf.c: fix bug in loading of PIE binaries
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Davidson <[email protected]>
commit a87938b2e246b81b4fb713edb371a9fa3c5c3c86 upstream.
With CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE enabled, and a normal top-down address allocation strategy, load_elf_binary() will attempt to map a PIE binary into an address range immediately below mm->mmap_base.
Unfortunately, load_elf_ binary() does not take account of the need to allocate sufficient space for the entire binary which means that, while the first PT_LOAD segment is mapped below mm->mmap_base, the subsequent PT_LOAD segment(s) end up being mapped above mm->mmap_base into the are that is supposed to be the "gap" between the stack and the binary.
Since the size of the "gap" on x86_64 is only guaranteed to be 128MB this means that binaries with large data segments > 128MB can end up mapping part of their data segment over their stack resulting in corruption of the stack (and the data segment once the binary starts to run).
Any PIE binary with a data segment > 128MB is vulnerable to this although address randomization means that the actual gap between the stack and the end of the binary is normally greater than 128MB. The larger the data segment of the binary the higher the probability of failure.
Fix this by calculating the total size of the binary in the same way as load_elf_interp().
--- fs/binfmt_elf.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
fs/binfmt_elf.c +8 -1
@@ -862,6 +862,7 @@ static int load_elf_binary(struct linux_ i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {int elf_prot =0 , elf_flags;unsigned long k, vaddr; +unsigned long total_size =0 ;if (elf_ppnt->p_type !=PT_LOAD )continue ;
@@ -924,10 +925,16 @@ static int load_elf_binary(struct linux_#else load_bias =ELF_PAGESTART (ELF_ET_DYN_BASE - vaddr);#endif + total_size =total_mapping_size (elf_phdata, + loc->elf_ex.e_phnum); +if (!total_size) { + error = -EINVAL ; + goto out_free_dentry; + } } error =elf_map (bprm->file, load_bias + vaddr, elf_ppnt, - elf_prot, elf_flags,0 ); + elf_prot, elf_flags, total_size);if (BAD_ADDR (error)) { retval =IS_ERR ((void *)error) ?PTR_ERR ((void *)error) : -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 100/220 ptrace: fix race between ptrace_resume() and wait_task_stopped()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleg Nesterov <[email protected]>
commit b72c186999e689cb0b055ab1c7b3cd8fffbeb5ed upstream.
ptrace_resume() is called when the tracee is still __TASK_TRACED. We set tracee->exit_code and then wake_up_state() changes tracee->state. If the tracer's sub-thread does wait() in between, task_stopped_code(ptrace => T) wrongly looks like another report from tracee.
This confuses debugger, and since wait_task_stopped() clears ->exit_code the tracee can miss a signal.
Test-case:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ptrace.h>
#include <pthread.h>
#include <assert.h>
int pid;
void *waiter(void *arg)
{
int stat;
for (;;) {
assert(pid == wait(&stat));
assert(WIFSTOPPED(stat));
if (WSTOPSIG(stat) == SIGHUP)
continue;
assert(WSTOPSIG(stat) == SIGCONT);
printf("ERR! extra/wrong report:%x\n", stat);
}
}
int main(void)
{
pthread_t thread;
pid = fork();
if (!pid) {
assert(ptrace(PTRACE_TRACEME, 0,0,0) == 0);
for (;;)
kill(getpid(), SIGHUP);
}
assert(pthread_create(&thread, NULL, waiter, NULL) == 0);
for (;;)
ptrace(PTRACE_CONT, pid, 0, SIGCONT);
return 0;
}Note for stable: the bug is very old, but without 9899d11f6544 "ptrace:
ensure arch_ptrace/ptrace_request can never race with SIGKILL" the fix should use lock_task_sighand(child).
--- kernel/ptrace.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
kernel/ptrace.c +20 -0
@@ -697,6 +697,8 @@ static int ptrace_peek_siginfo(struct tastatic int ptrace_resume (struct task_struct *child,long request,unsigned long data) { +bool need_siglock; +if (!valid_signal (data))return -EIO ;
@@ -724,8 +726,26 @@ static int ptrace_resume(struct task_struser_disable_single_step (child); } +/* +* Change ->exit_code and ->state under siglock to avoid the race +* with wait_task_stopped() in between; a non-zero ->exit_code will +* wrongly look like another report from tracee. +* +* Note that we need siglock even if ->exit_code == data and/or this +* status was not reported yet, the new status must not be cleared by +* wait_task_stopped() after resume. +* +* If data == 0 we do not care if wait_task_stopped() reports the old +* status and clears the code too; this can't race with the tracee, it +* takes siglock after resume. +*/ + need_siglock = data && !thread_group_empty (current); +if (need_siglock) +spin_lock_irq (&child->sighand->siglock); child->exit_code = data;wake_up_state (child, __TASK_TRACED); +if (need_siglock) +spin_unlock_irq (&child->sighand->siglock);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 101/220 intel_idle: Update support for Silvermont Core in Baytrail SOC
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Len Brown <[email protected]>
commit d7ef76717322c8e2df7d4360b33faa9466cb1a0d upstream.
On some Silvermont-Core/Baytrail-SOC systems,
C1E latency is higher than original specifications. Although C1E is still enumerated in CPUID.MWAIT.EDX, we delete the state from intel_idle to avoid latency impact.
Under some conditions, the latency of the C6N-BYT and C6S-BYT states may exceed the specified values of 40 and 140 usec, respectively. Increase those values to 300 and 500 usec; to assure
that the hardware does not violate constraints that may be set by the Linux PM_QOS sub-system.
Also increase the C7-BYT target residency to 4.0 ms from 1.5 ms.
--- drivers/idle/intel_idle.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-)
drivers/idle/intel_idle.c +3 -11
@@ -218,18 +218,10 @@ static struct cpuidle_state byt_cstates[ .enter = &intel_idle, .enter_freeze = intel_idle_freeze, }, { - .name = "C1E-BYT", - .desc = "MWAIT 0x01", - .flags = MWAIT2flg(0x01), - .exit_latency = 15, - .target_residency = 30, - .enter = &intel_idle, - .enter_freeze = intel_idle_freeze, }, - { .name = "C6N-BYT", .desc = "MWAIT 0x58", .flags = MWAIT2flg(0x58) | CPUIDLE_FLAG_TLB_FLUSHED, - .exit_latency = 40, + .exit_latency = 300, .target_residency = 275, .enter = &intel_idle, .enter_freeze = intel_idle_freeze, },
@@ -237,7 +229,7 @@ static struct cpuidle_state byt_cstates[ .name = "C6S-BYT", .desc = "MWAIT 0x52", .flags = MWAIT2flg(0x52) | CPUIDLE_FLAG_TLB_FLUSHED, - .exit_latency = 140, + .exit_latency = 500, .target_residency = 560, .enter = &intel_idle, .enter_freeze = intel_idle_freeze, },
@@ -246,7 +238,7 @@ static struct cpuidle_state byt_cstates[ .desc = "MWAIT 0x60", .flags = MWAIT2flg(0x60) | CPUIDLE_FLAG_TLB_FLUSHED, .exit_latency = 1200, - .target_residency = 1500, + .target_residency = 4000, .enter = &intel_idle, .enter_freeze = intel_idle_freeze, }, {
Greg Kroah-Hartman
maintainerPATCH 102/220 net/macb: fix the peripheral version test
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Ferre <[email protected]>
commit 361918970b7426bba97a64678ef2b2679c37199b upstream.
We currently need two checks of the peripheral version in MACB_MID register. One of them got out of sync after modification by 8a013a9c71b2 (net: macb:
Include multi queue support for xilinx ZynqMP ethernet version). Fix this in macb_configure_caps() so that xilinx ZynqMP will be considered as a GEM flavor.
ethernet version")
--- drivers/net/ethernet/cadence/macb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/cadence/macb.c +1 -1
@@ -2165,7 +2165,7 @@ static void macb_configure_caps(struct m } } -if (MACB_BFEXT (IDNUM ,macb_readl (bp,MID )) ==0x2 ) +if (MACB_BFEXT (IDNUM ,macb_readl (bp,MID )) >=0x2 ) bp->caps |=MACB_CAPS_MACB_IS_GEM ;if (macb_is_gem (bp)) {
Greg Kroah-Hartman
maintainerPATCH 103/220 NFC: st21nfcb: Retry i2c_master_send if it returns a negative value
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Ricard <[email protected]>
commit d4a41d10b2cb5890aeda6b2912973b2a754b05b1 upstream.
i2c_master_send may return many negative values different than -EREMOTEIO.
In case an i2c transaction is NACK'ed, on raspberry pi B+ kernel 3.18, -EIO is generated instead.
--- drivers/nfc/st21nfcb/i2c.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/nfc/st21nfcb/i2c.c +2 -2
@@ -109,7 +109,7 @@ static int st21nfcb_nci_i2c_write(void *return phy->ndlc->hard_fault; r =i2c_master_send (client, skb->data, skb->len); -if (r == -EREMOTEIO ) {/* Retry, chip was in standby */ +if (r <0 ) {/* Retry, chip was in standby */ usleep_range (1000 ,4000 ); r =i2c_master_send (client, skb->data, skb->len); }
@@ -148,7 +148,7 @@ static int st21nfcb_nci_i2c_read(structstruct i2c_client *client = phy->i2c_dev; r =i2c_master_recv (client, buf,ST21NFCB_NCI_I2C_MIN_SIZE ); -if (r == -EREMOTEIO ) {/* Retry, chip was in standby */ +if (r <0 ) {/* Retry, chip was in standby */ usleep_range (1000 ,4000 ); r =i2c_master_recv (client, buf,ST21NFCB_NCI_I2C_MIN_SIZE ); }
Greg Kroah-Hartman
maintainerPATCH 104/220 rtlwifi: rtl8192cu: Add new USB ID
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit 2f92b314f4daff2117847ac5343c54d3d041bf78 upstream.
USB ID 2001:330d is used for a D-Link DWA-131.
--- drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +1 -0
@@ -377,6 +377,7 @@ static struct usb_device_id rtl8192c_usb {RTL_USB_DEVICE(0x2001, 0x3307, rtl92cu_hal_cfg)}, /*D-Link-Cameo*/ {RTL_USB_DEVICE(0x2001, 0x3309, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/ {RTL_USB_DEVICE(0x2001, 0x330a, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/ + {RTL_USB_DEVICE(0x2001, 0x330d, rtl92cu_hal_cfg)}, /*D-Link DWA-131 */ {RTL_USB_DEVICE(0x2019, 0xab2b, rtl92cu_hal_cfg)}, /*Planex -Abocom*/ {RTL_USB_DEVICE(0x20f4, 0x624d, rtl92cu_hal_cfg)}, /*TRENDNet*/ {RTL_USB_DEVICE(0x2357, 0x0100, rtl92cu_hal_cfg)}, /*TP-Link WN8200ND*/
Greg Kroah-Hartman
maintainerPATCH 105/220 rtlwifi: rtl8192cu: Add new device ID
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Vasut <[email protected]>
commit 9374e7d2fdcad3c36dafc8d3effd554bc702c4b6 upstream.
Add new ID for ASUS N10 WiFi dongle.
--- drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +1 -0
@@ -321,6 +321,7 @@ static struct usb_device_id rtl8192c_usb {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ {RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/ + {RTL_USB_DEVICE(0x0b05, 0x17ba, rtl92cu_hal_cfg)}, /*ASUS-Edimax*/ {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
Greg Kroah-Hartman
maintainerPATCH 106/220 ext4: make fsync to sync parent dir in no-journal for real this time
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Czerner <[email protected]>
commit e12fb97222fc41e8442896934f76d39ef99b590a upstream.
Previously commit 14ece1028b3ed53ffec1b1213ffc6acaf79ad77c added a support for for syncing parent directory of newly created inodes to make sure that the inode is not lost after a power failure in no-journal mode.
However this does not work in majority of cases, namely:
- if the directory has inline data
- if the directory is already indexed
- if the directory already has at least one block and:
- the new entry fits into it
- or we've successfully converted it to indexed
So in those cases we might lose the inode entirely even after fsync in the no-journal mode. This also includes ext2 default mode obviously.
I've noticed this while running xfstest generic/321 and even though the test should fail (we need to run fsck after a crash in no-journal mode) I could not find a newly created entries even when if it was fsynced before.
Fix this by adjusting the ext4_add_entry() successful exit paths to set the inode EXT4_STATE_NEWENTRY so that fsync has the chance to fsync the parent directory as well.
--- fs/ext4/namei.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
fs/ext4/namei.c +11 -9
@@ -1865,7 +1865,7 @@ static int ext4_add_entry(handle_t *hand struct inode *inode) {struct inode *dir = dentry->d_parent->d_inode; -struct buffer_head *bh; +struct buffer_head *bh =NULL ;struct ext4_dir_entry_2 *de;struct ext4_dir_entry_tail *t;struct super_block *sb;
@@ -1889,14 +1889,14 @@ static int ext4_add_entry(handle_t *handreturn retval;if (retval ==1 ) { retval =0 ; -return retval; + goto out; } }if (is_dx (dir)) { retval =ext4_dx_add_entry (handle, dentry, inode);if (!retval || (retval !=ERR_BAD_DX_DIR )) -return retval; + goto out;ext4_clear_inode_flag (dir,EXT4_INODE_INDEX ); dx_fallback++;ext4_mark_inode_dirty (handle, dir);
@@ -1908,14 +1908,15 @@ static int ext4_add_entry(handle_t *handreturn PTR_ERR (bh); retval =add_dirent_to_buf (handle, dentry, inode,NULL , bh); -if (retval != -ENOSPC ) { -brelse (bh); -return retval; - } +if (retval != -ENOSPC ) + goto out;if (blocks ==1 && !dx_fallback && -EXT4_HAS_COMPAT_FEATURE (sb,EXT4_FEATURE_COMPAT_DIR_INDEX )) -return make_indexed_dir (handle, dentry, inode, bh); +EXT4_HAS_COMPAT_FEATURE (sb,EXT4_FEATURE_COMPAT_DIR_INDEX )) { + retval =make_indexed_dir (handle, dentry, inode, bh); + bh =NULL ;/* make_indexed_dir releases bh */ + goto out; + }brelse (bh); } bh =ext4_append (handle, dir, &block);
@@ -1931,6 +1932,7 @@ static int ext4_add_entry(handle_t *hand } retval =add_dirent_to_buf (handle, dentry, inode, de, bh); +out:brelse (bh);if (retval ==0 )ext4_set_inode_state (inode,EXT4_STATE_NEWENTRY );
Greg Kroah-Hartman
maintainerPATCH 107/220 mnt: Improve the umount_tree flags
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit e819f152104c9f7c9fe50e1aecce6f5d4bf06d65 upstream.
- Remove the unneeded declaration from pnode.h
- Mark umount_tree static as it has no callers outside of namespace.c
- Define an enumeration of umount_tree's flags.
- Pass umount_tree's flags in by name
This removes the magic numbers 0, 1 and 2 making the code a little clearer and makes it possible for there to be lazy unmounts that don't propagate. Which is what __detach_mounts actually wants for example.
--- fs/namespace.c | 31 ++++++++++++++++--------------- fs/pnode.h | 1 - 2 files changed, 16 insertions(+), 16 deletions(-)
fs/namespace.c +16 -15
@@ -1319,14 +1319,15 @@ static inline void namespace_lock(void)down_write (&namespace_sem); } +enum umount_tree_flags { +UMOUNT_SYNC =1 , +UMOUNT_PROPAGATE =2 , +};/* * mount_lock must be held * namespace_sem must be held for write -* how = 0 => just this tree, don't propagate -* how = 1 => propagate; we know that nobody else has reference to any victims -* how = 2 => lazy umount */ -void umount_tree (struct mount *mnt,int how) +static void umount_tree (struct mount *mnt,enum umount_tree_flags how) {HLIST_HEAD (tmp_list);struct mount *p;
@@ -1339,7 +1340,7 @@ void umount_tree(struct mount *mnt, inthlist_for_each_entry (p, &tmp_list, mnt_hash)list_del_init (&p->mnt_child); -if (how) +if (how &UMOUNT_PROPAGATE )propagate_umount (&tmp_list);while (!hlist_empty (&tmp_list)) {
@@ -1349,7 +1350,7 @@ void umount_tree(struct mount *mnt, intlist_del_init (&p->mnt_list);__touch_mnt_namespace (p->mnt_ns); p->mnt_ns =NULL ; -if (how <2 ) +if (how &UMOUNT_SYNC ) p->mnt.mnt_flags |=MNT_SYNC_UMOUNT ;pin_insert_group (&p->mnt_umount, &p->mnt_parent->mnt, &unmounted);
@@ -1447,14 +1448,14 @@ static int do_umount(struct mount *mnt,if (flags &MNT_DETACH ) {if (!list_empty (&mnt->mnt_list)) -umount_tree (mnt,2 ); +umount_tree (mnt,UMOUNT_PROPAGATE ); retval =0 ; }else {shrink_submounts (mnt); retval = -EBUSY ;if (!propagate_mount_busy (mnt,2 )) {if (!list_empty (&mnt->mnt_list)) -umount_tree (mnt,1 ); +umount_tree (mnt,UMOUNT_PROPAGATE |UMOUNT_SYNC ); retval =0 ; } }
@@ -1486,7 +1487,7 @@ void __detach_mounts(struct dentry *dentlock_mount_hash ();while (!hlist_empty (&mp->m_list)) { mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list); -umount_tree (mnt,2 ); +umount_tree (mnt,UMOUNT_PROPAGATE ); }unlock_mount_hash ();put_mountpoint (mp);
@@ -1648,7 +1649,7 @@ struct mount *copy_tree(struct mount *mn out:if (res) {lock_mount_hash (); -umount_tree (res,0 ); +umount_tree (res,UMOUNT_SYNC );unlock_mount_hash (); }return q;
@@ -1672,7 +1673,7 @@ void drop_collected_mounts(struct vfsmou {namespace_lock ();lock_mount_hash (); -umount_tree (real_mount (mnt),0 ); +umount_tree (real_mount (mnt),UMOUNT_SYNC );unlock_mount_hash ();namespace_unlock (); }
@@ -1855,7 +1856,7 @@ static int attach_recursive_mnt(struct m out_cleanup_ids:while (!hlist_empty (&tree_list)) { child = hlist_entry(tree_list.first, struct mount, mnt_hash); -umount_tree (child,0 ); +umount_tree (child,UMOUNT_SYNC ); }unlock_mount_hash ();cleanup_group_ids (source_mnt,NULL );
@@ -2035,7 +2036,7 @@ static int do_loopback(struct path *path err =graft_tree (mnt, parent, mp);if (err) {lock_mount_hash (); -umount_tree (mnt,0 ); +umount_tree (mnt,UMOUNT_SYNC );unlock_mount_hash (); } out2:
@@ -2406,7 +2407,7 @@ void mark_mounts_for_expiry(struct list_while (!list_empty (&graveyard)) { mnt = list_first_entry(&graveyard, struct mount, mnt_expire);touch_mnt_namespace (mnt->mnt_ns); -umount_tree (mnt,1 ); +umount_tree (mnt,UMOUNT_PROPAGATE |UMOUNT_SYNC ); }unlock_mount_hash ();namespace_unlock ();
@@ -2477,7 +2478,7 @@ static void shrink_submounts(struct moun m = list_first_entry(&graveyard, struct mount, mnt_expire);touch_mnt_namespace (m->mnt_ns); -umount_tree (m,1 ); +umount_tree (m,UMOUNT_PROPAGATE |UMOUNT_SYNC ); } } }
fs/pnode.h +0 -1
@@ -47,7 +47,6 @@ int get_dominating_id(struct mount *mnt,unsigned int mnt_get_count (struct mount *mnt);void mnt_set_mountpoint (struct mount *,struct mountpoint *,struct mount *); -void umount_tree (struct mount *,int );struct mount *copy_tree (struct mount *,struct dentry *,int );bool is_path_reachable (struct mount *,struct dentry *,const struct path *root);
Greg Kroah-Hartman
maintainerPATCH 108/220 mnt: Dont propagate umounts in __detach_mounts
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit 8318e667f176f7ea34451a1a530634e293f216ac upstream.
Invoking mount propagation from __detach_mounts is inefficient and wrong.
It is inefficient because __detach_mounts already walks the list of mounts that where something needs to be done, and mount propagation walks some subset of those mounts again.
It is actively wrong because if the dentry that is passed to __detach_mounts is not part of the path to a mount that mount should not be affected.
change_mnt_propagation(p,MS_PRIVATE) modifies the mount propagation tree of a master mount so it's slaves are connected to another master if possible. Which means even removing a mount from the middle of a mount tree with __detach_mounts will not deprive any mount propagated mount events.
--- fs/namespace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/namespace.c +1 -1
@@ -1487,7 +1487,7 @@ void __detach_mounts(struct dentry *dentlock_mount_hash ();while (!hlist_empty (&mp->m_list)) { mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list); -umount_tree (mnt,UMOUNT_PROPAGATE ); +umount_tree (mnt,0 ); }unlock_mount_hash ();put_mountpoint (mp);
Greg Kroah-Hartman
maintainerPATCH 109/220 mnt: In umount_tree reuse mnt_list instead of mnt_hash
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit c003b26ff98ca04a180ff34c38c007a3998d62f9 upstream.
umount_tree builds a list of mounts that need to be unmounted. Utilize mnt_list for this purpose instead of mnt_hash. This begins to allow keeping a mount on the mnt_hash after it is unmounted, which is necessary for a properly functioning MNT_LOCKED implementation.
The fact that mnt_list is an ordinary list makding available list_move is nice bonus.
--- fs/namespace.c | 20 +++++++++++--------- fs/pnode.c | 6 +++--- fs/pnode.h | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-)
fs/namespace.c +11 -9
@@ -1329,23 +1329,25 @@ enum umount_tree_flags {*/ static void umount_tree (struct mount *mnt,enum umount_tree_flags how) { -HLIST_HEAD (tmp_list); +LIST_HEAD (tmp_list);struct mount *p; -for (p = mnt; p; p =next_mnt (p, mnt)) { -hlist_del_init_rcu (&p->mnt_hash); -hlist_add_head (&p->mnt_hash, &tmp_list); - } +/* Gather the mounts to umount */ +for (p = mnt; p; p =next_mnt (p, mnt)) +list_move (&p->mnt_list, &tmp_list); -hlist_for_each_entry (p, &tmp_list, mnt_hash) +/* Hide the mounts from lookup_mnt and mnt_mounts */ +list_for_each_entry (p, &tmp_list, mnt_list) { +hlist_del_init_rcu (&p->mnt_hash);list_del_init (&p->mnt_child); + } +/* Add propogated mounts to the tmp_list */ if (how &UMOUNT_PROPAGATE )propagate_umount (&tmp_list); -while (!hlist_empty (&tmp_list)) { - p = hlist_entry(tmp_list.first, struct mount, mnt_hash); -hlist_del_init_rcu (&p->mnt_hash); +while (!list_empty (&tmp_list)) { + p = list_first_entry(&tmp_list, struct mount, mnt_list);list_del_init (&p->mnt_expire);list_del_init (&p->mnt_list);__touch_mnt_namespace (p->mnt_ns);
fs/pnode.c +3 -3
@@ -384,7 +384,7 @@ static void __propagate_umount(struct moif (child &&list_empty (&child->mnt_mounts)) {list_del_init (&child->mnt_child);hlist_del_init_rcu (&child->mnt_hash); -hlist_add_before_rcu (&child->mnt_hash, &mnt->mnt_hash); +list_move_tail (&child->mnt_list, &mnt->mnt_list); } } }
@@ -396,11 +396,11 @@ static void __propagate_umount(struct mo* * vfsmount lock must be held for write */ -int propagate_umount (struct hlist_head *list) +int propagate_umount (struct list_head *list) {struct mount *mnt; -hlist_for_each_entry (mnt, list, mnt_hash) +list_for_each_entry (mnt, list, mnt_list)__propagate_umount (mnt);return 0 ; }
fs/pnode.h +1 -1
@@ -40,7 +40,7 @@ static inline void set_mnt_shared(structvoid change_mnt_propagation (struct mount *,int );int propagate_mnt (struct mount *,struct mountpoint *,struct mount *,struct hlist_head *); -int propagate_umount (struct hlist_head *); +int propagate_umount (struct list_head *);int propagate_mount_busy (struct mount *,int );void mnt_release_group_id (struct mount *);int get_dominating_id (struct mount *mnt,const struct path *root);
Greg Kroah-Hartman
maintainerPATCH 110/220 mnt: Add MNT_UMOUNT flag
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit 590ce4bcbfb4e0462a720a4ad901e84416080bba upstream.
In some instances it is necessary to know if the the unmounting process has begun on a mount. Add MNT_UMOUNT to make that reliably testable.
This fix gets used in fixing locked mounts in MNT_DETACH
--- fs/namespace.c | 4 +++- fs/pnode.c | 1 + include/linux/mount.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-)
fs/namespace.c +3 -1
@@ -1333,8 +1333,10 @@ static void umount_tree(struct mount *mnstruct mount *p;/* Gather the mounts to umount */ -for (p = mnt; p; p =next_mnt (p, mnt)) +for (p = mnt; p; p =next_mnt (p, mnt)) { + p->mnt.mnt_flags |=MNT_UMOUNT ;list_move (&p->mnt_list, &tmp_list); + }/* Hide the mounts from lookup_mnt and mnt_mounts */ list_for_each_entry (p, &tmp_list, mnt_list) {
fs/pnode.c +1 -0
@@ -384,6 +384,7 @@ static void __propagate_umount(struct moif (child &&list_empty (&child->mnt_mounts)) {list_del_init (&child->mnt_child);hlist_del_init_rcu (&child->mnt_hash); + child->mnt.mnt_flags |=MNT_UMOUNT ;list_move_tail (&child->mnt_list, &mnt->mnt_list); } }
include/linux/mount.h +1 -0
@@ -61,6 +61,7 @@ struct mnt_namespace;#define MNT_DOOMED 0x1000000#define MNT_SYNC_UMOUNT 0x2000000#define MNT_MARKED 0x4000000 +#define MNT_UMOUNT 0x8000000struct vfsmount {struct dentry *mnt_root;/* root of the mounted tree */
Greg Kroah-Hartman
maintainerPATCH 111/220 mnt: Delay removal from the mount hash.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit 411a938b5abc9cb126c41cccf5975ae464fe0f3e upstream.
- Modify __lookup_mnt_hash_last to ignore mounts that have MNT_UMOUNTED set.
- Don't remove mounts from the mount hash table in propogate_umount
- Don't remove mounts from the mount hash table in umount_tree before the entire list of mounts to be umounted is selected.
- Remove mounts from the mount hash table as the last thing that happens in the case where a mount has a parent in umount_tree. Mounts without parents are not hashed (by definition).
This paves the way for delaying removal from the mount hash table even farther and fixing the MNT_LOCKED vs MNT_DETACH issue.
--- fs/namespace.c | 13 ++++++++----- fs/pnode.c | 1 - 2 files changed, 8 insertions(+), 6 deletions(-)
fs/namespace.c +8 -5
@@ -632,14 +632,17 @@ struct mount *__lookup_mnt(struct vfsmou*/ struct mount *__lookup_mnt_last (struct vfsmount *mnt,struct dentry *dentry) { -struct mount *p, *res; - res = p =__lookup_mnt (mnt, dentry); +struct mount *p, *res =NULL ; + p =__lookup_mnt (mnt, dentry);if (!p) goto out; +if (!(p->mnt.mnt_flags &MNT_UMOUNT )) + res = p;hlist_for_each_entry_continue (p, mnt_hash) {if (&p->mnt_parent->mnt != mnt || p->mnt_mountpoint != dentry)break ; - res = p; +if (!(p->mnt.mnt_flags &MNT_UMOUNT )) + res = p; } out:return res;
@@ -1338,9 +1341,8 @@ static void umount_tree(struct mount *mnlist_move (&p->mnt_list, &tmp_list); } -/* Hide the mounts from lookup_mnt and mnt_mounts */ +/* Hide the mounts from mnt_mounts */ list_for_each_entry (p, &tmp_list, mnt_list) { -hlist_del_init_rcu (&p->mnt_hash);list_del_init (&p->mnt_child); }
@@ -1367,6 +1369,7 @@ static void umount_tree(struct mount *mn p->mnt_mountpoint = p->mnt.mnt_root; p->mnt_parent = p; p->mnt_mp =NULL ; +hlist_del_init_rcu (&p->mnt_hash); }change_mnt_propagation (p,MS_PRIVATE ); }
fs/pnode.c +0 -1
@@ -383,7 +383,6 @@ static void __propagate_umount(struct mo*/ if (child &&list_empty (&child->mnt_mounts)) {list_del_init (&child->mnt_child); -hlist_del_init_rcu (&child->mnt_hash); child->mnt.mnt_flags |=MNT_UMOUNT ;list_move_tail (&child->mnt_list, &mnt->mnt_list); }
Greg Kroah-Hartman
maintainerPATCH 112/220 mnt: On an unmount propagate clearing of MNT_LOCKED
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit 5d88457eb5b86b475422dc882f089203faaeedb5 upstream.
A prerequisite of calling umount_tree is that the point where the tree is mounted at is valid to unmount.
If we are propagating the effect of the unmount clear MNT_LOCKED in every instance where the same filesystem is mounted on the same mountpoint in the mount tree, as we know (by virtue of the fact that umount_tree was called) that it is safe to reveal what is at that mountpoint.
--- fs/namespace.c | 3 +++ fs/pnode.c | 20 ++++++++++++++++++++ fs/pnode.h | 1 + 3 files changed, 24 insertions(+)
fs/namespace.c +3 -0
@@ -1335,6 +1335,9 @@ static void umount_tree(struct mount *mnLIST_HEAD (tmp_list);struct mount *p; +if (how &UMOUNT_PROPAGATE ) +propagate_mount_unlock (mnt); +/* Gather the mounts to umount */ for (p = mnt; p; p =next_mnt (p, mnt)) { p->mnt.mnt_flags |=MNT_UMOUNT ;
fs/pnode.c +20 -0
@@ -362,6 +362,26 @@ int propagate_mount_busy(struct mount *m }/* +* Clear MNT_LOCKED when it can be shown to be safe. +* +* mount_lock lock must be held for write +*/ +void propagate_mount_unlock (struct mount *mnt) +{ +struct mount *parent = mnt->mnt_parent; +struct mount *m, *child; + +BUG_ON (parent == mnt); + +for (m =propagation_next (parent, parent); m; + m =propagation_next (m, parent)) { + child =__lookup_mnt_last (&m->mnt, mnt->mnt_mountpoint); +if (child) + child->mnt.mnt_flags &= ~MNT_LOCKED ; + } +} + +/* * NOTE: unmounting 'mnt' naturally propagates to all other mounts its * parent propagates to. */
fs/pnode.h +1 -0
@@ -42,6 +42,7 @@ int propagate_mnt(struct mount *, struct struct hlist_head *);int propagate_umount (struct list_head *);int propagate_mount_busy (struct mount *,int ); +void propagate_mount_unlock (struct mount *);void mnt_release_group_id (struct mount *);int get_dominating_id (struct mount *mnt,const struct path *root);unsigned int mnt_get_count (struct mount *mnt);
Greg Kroah-Hartman
maintainerPATCH 113/220 mnt: Dont propagate unmounts to locked mounts
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit 0c56fe31420ca599c90240315f7959bf1b4eb6ce upstream.
If the first mount in shared subtree is locked don't unmount the shared subtree.
This is ensured by walking through the mounts parents before children and marking a mount as unmountable if it is not locked or it is locked but it's parent is marked.
This allows recursive mount detach to propagate through a set of mounts when unmounting them would not reveal what is under any locked mount.
--- fs/pnode.c | 32 +++++++++++++++++++++++++++++--- fs/pnode.h | 1 + 2 files changed, 30 insertions(+), 3 deletions(-)
fs/pnode.c +29 -3
@@ -382,6 +382,26 @@ void propagate_mount_unlock(struct mount }/* +* Mark all mounts that the MNT_LOCKED logic will allow to be unmounted. +*/ +static void mark_umount_candidates (struct mount *mnt) +{ +struct mount *parent = mnt->mnt_parent; +struct mount *m; + +BUG_ON (parent == mnt); + +for (m =propagation_next (parent, parent); m; + m =propagation_next (m, parent)) { +struct mount *child =__lookup_mnt_last (&m->mnt, + mnt->mnt_mountpoint); +if (child && (!IS_MNT_LOCKED (child) ||IS_MNT_MARKED (m))) { +SET_MNT_MARK (child); + } + } +} + +/* * NOTE: unmounting 'mnt' naturally propagates to all other mounts its * parent propagates to. */
@@ -398,10 +418,13 @@ static void __propagate_umount(struct mostruct mount *child =__lookup_mnt_last (&m->mnt, mnt->mnt_mountpoint);/* -* umount the child only if the child has no -* other children +* umount the child only if the child has no children +* and the child is marked safe to unmount. */ -if (child &&list_empty (&child->mnt_mounts)) { +if (!child || !IS_MNT_MARKED (child)) +continue ; +CLEAR_MNT_MARK (child); +if (list_empty (&child->mnt_mounts)) {list_del_init (&child->mnt_child); child->mnt.mnt_flags |=MNT_UMOUNT ;list_move_tail (&child->mnt_list, &mnt->mnt_list);
@@ -420,6 +443,9 @@ int propagate_umount(struct list_head *l {struct mount *mnt; +list_for_each_entry_reverse (mnt, list, mnt_list) +mark_umount_candidates (mnt); +list_for_each_entry (mnt, list, mnt_list)__propagate_umount (mnt);return 0 ;
fs/pnode.h +1 -0
@@ -19,6 +19,7 @@#define IS_MNT_MARKED (m) ((m)->mnt.mnt_flags & MNT_MARKED)#define SET_MNT_MARK (m) ((m)->mnt.mnt_flags |= MNT_MARKED)#define CLEAR_MNT_MARK (m) ((m)->mnt.mnt_flags &= ~MNT_MARKED) +#define IS_MNT_LOCKED (m) ((m)->mnt.mnt_flags & MNT_LOCKED)#define CL_EXPIRE 0x01#define CL_SLAVE 0x02
Greg Kroah-Hartman
maintainerPATCH 114/220 mnt: Factor out unhash_mnt from detach_mnt and umount_tree
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit 7bdb11de8ee4f4ae195e2fa19efd304e0b36c63b upstream.
Create a function unhash_mnt that contains the common code between detach_mnt and umount_tree, and use unhash_mnt in place of the common code. This add a unncessary list_del_init(mnt->mnt_child) into umount_tree but given that mnt_child is already empty this extra line is a noop.
--- fs/namespace.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
fs/namespace.c +12 -9
@@ -798,10 +798,8 @@ static void __touch_mnt_namespace(struct/* * vfsmount lock must be held for write */ -static void detach_mnt (struct mount *mnt,struct path *old_path) +static void unhash_mnt (struct mount *mnt) { - old_path->dentry = mnt->mnt_mountpoint; - old_path->mnt = &mnt->mnt_parent->mnt; mnt->mnt_parent = mnt; mnt->mnt_mountpoint = mnt->mnt.mnt_root;list_del_init (&mnt->mnt_child);
@@ -814,6 +812,16 @@ static void detach_mnt(struct mount *mnt/* * vfsmount lock must be held for write */ +static void detach_mnt (struct mount *mnt,struct path *old_path) +{ + old_path->dentry = mnt->mnt_mountpoint; + old_path->mnt = &mnt->mnt_parent->mnt; +unhash_mnt (mnt); +} + +/* +* vfsmount lock must be held for write +*/ void mnt_set_mountpoint (struct mount *mnt,struct mountpoint *mp,struct mount *child_mnt)
@@ -1364,15 +1372,10 @@ static void umount_tree(struct mount *mnpin_insert_group (&p->mnt_umount, &p->mnt_parent->mnt, &unmounted);if (mnt_has_parent (p)) { -hlist_del_init (&p->mnt_mp_list); -put_mountpoint (p->mnt_mp);mnt_add_count (p->mnt_parent,-1 );/* old mountpoint will be dropped when we can do that */ p->mnt_ex_mountpoint = p->mnt_mountpoint; - p->mnt_mountpoint = p->mnt.mnt_root; - p->mnt_parent = p; - p->mnt_mp =NULL ; -hlist_del_init_rcu (&p->mnt_hash); +unhash_mnt (p); }change_mnt_propagation (p,MS_PRIVATE ); }
Greg Kroah-Hartman
maintainerPATCH 115/220 mnt: Factor umount_mnt from umount_tree
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit 6a46c5735c29175da55b2fa9d53775182422cdd7 upstream.
For future use factor out a function umount_mnt from umount_tree. This function unhashes a mount and remembers where the mount was mounted so that eventually when the code makes it to a sleeping context the mountpoint can be dput.
--- fs/namespace.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
fs/namespace.c +11 -3
@@ -822,6 +822,16 @@ static void detach_mnt(struct mount *mnt/* * vfsmount lock must be held for write */ +static void umount_mnt (struct mount *mnt) +{ +/* old mountpoint will be dropped when we can do that */ + mnt->mnt_ex_mountpoint = mnt->mnt_mountpoint; +unhash_mnt (mnt); +} + +/* +* vfsmount lock must be held for write +*/ void mnt_set_mountpoint (struct mount *mnt,struct mountpoint *mp,struct mount *child_mnt)
@@ -1373,9 +1383,7 @@ static void umount_tree(struct mount *mnpin_insert_group (&p->mnt_umount, &p->mnt_parent->mnt, &unmounted);if (mnt_has_parent (p)) {mnt_add_count (p->mnt_parent,-1 ); -/* old mountpoint will be dropped when we can do that */ - p->mnt_ex_mountpoint = p->mnt_mountpoint; -unhash_mnt (p); +umount_mnt (p); }change_mnt_propagation (p,MS_PRIVATE ); }
Greg Kroah-Hartman
maintainerPATCH 116/220 mnt: Honor MNT_LOCKED when detaching mounts
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit ce07d891a0891d3c0d0c2d73d577490486b809e1 upstream.
Modify umount(MNT_DETACH) to keep mounts in the hash table that are locked to their parent mounts, when the parent is lazily unmounted.
In mntput_no_expire detach the children from the hash table, depending on mnt_pin_kill in cleanup_mnt to decrement the mnt_count of the children.
In __detach_mounts if there are any mounts that have been unmounted but still are on the list of mounts of a mountpoint, remove their children from the mount hash table and those children to the unmounted list so they won't linger potentially indefinitely waiting for their final mntput, now that the mounts serve no purpose.
--- fs/namespace.c | 29 ++++++++++++++++++++++++++--- fs/pnode.h | 2 ++ 2 files changed, 28 insertions(+), 3 deletions(-)
fs/namespace.c +26 -3
@@ -1099,6 +1099,13 @@ static void mntput_no_expire(struct mounrcu_read_unlock ();list_del (&mnt->mnt_instance); + +if (unlikely (!list_empty (&mnt->mnt_mounts))) { +struct mount *p, *tmp; +list_for_each_entry_safe (p, tmp, &mnt->mnt_mounts, mnt_child) { +umount_mnt (p); + } + }unlock_mount_hash ();if (likely (!(mnt->mnt.mnt_flags &MNT_INTERNAL ))) {
@@ -1372,6 +1379,7 @@ static void umount_tree(struct mount *mnpropagate_umount (&tmp_list);while (!list_empty (&tmp_list)) { +bool disconnect; p = list_first_entry(&tmp_list, struct mount, mnt_list);list_del_init (&p->mnt_expire);list_del_init (&p->mnt_list);
@@ -1380,10 +1388,18 @@ static void umount_tree(struct mount *mnif (how &UMOUNT_SYNC ) p->mnt.mnt_flags |=MNT_SYNC_UMOUNT ; -pin_insert_group (&p->mnt_umount, &p->mnt_parent->mnt, &unmounted); + disconnect = !IS_MNT_LOCKED_AND_LAZY (p); + +pin_insert_group (&p->mnt_umount, &p->mnt_parent->mnt, + disconnect ? &unmounted :NULL );if (mnt_has_parent (p)) {mnt_add_count (p->mnt_parent,-1 ); -umount_mnt (p); +if (!disconnect) { +/* Don't forget about p */ +list_add_tail (&p->mnt_child, &p->mnt_parent->mnt_mounts); + }else { +umount_mnt (p); + } }change_mnt_propagation (p,MS_PRIVATE ); }
@@ -1508,7 +1524,14 @@ void __detach_mounts(struct dentry *dentlock_mount_hash ();while (!hlist_empty (&mp->m_list)) { mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list); -umount_tree (mnt,0 ); +if (mnt->mnt.mnt_flags &MNT_UMOUNT ) { +struct mount *p, *tmp; +list_for_each_entry_safe (p, tmp, &mnt->mnt_mounts, mnt_child) { +hlist_add_head (&p->mnt_umount.s_list, &unmounted); +umount_mnt (p); + } + } +else umount_tree (mnt,0 ); }unlock_mount_hash ();put_mountpoint (mp);
fs/pnode.h +2 -0
@@ -20,6 +20,8 @@#define SET_MNT_MARK (m) ((m)->mnt.mnt_flags |= MNT_MARKED)#define CLEAR_MNT_MARK (m) ((m)->mnt.mnt_flags &= ~MNT_MARKED)#define IS_MNT_LOCKED (m) ((m)->mnt.mnt_flags & MNT_LOCKED) +#define IS_MNT_LOCKED_AND_LAZY (m) \ + (((m)->mnt.mnt_flags & (MNT_LOCKED|MNT_SYNC_UMOUNT)) == MNT_LOCKED)#define CL_EXPIRE 0x01#define CL_SLAVE 0x02
Greg Kroah-Hartman
maintainerPATCH 117/220 mnt: Fix the error check in __detach_mounts
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit f53e57975151f54ad8caa1b0ac8a78091cd5700a upstream.
lookup_mountpoint can return either NULL or an error value. Update the test in __detach_mounts to test for an error value to avoid pathological cases causing a NULL pointer dereferences.
The callers of __detach_mounts should prevent it from ever being called on an unlinked dentry but don't take any chances.
--- fs/namespace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/namespace.c +1 -1
@@ -1518,7 +1518,7 @@ void __detach_mounts(struct dentry *dentnamespace_lock (); mp =lookup_mountpoint (dentry); -if (!mp) +if (IS_ERR_OR_NULL (mp)) goto out_unlock;lock_mount_hash ();
Greg Kroah-Hartman
maintainerPATCH 118/220 mnt: Update detach_mounts to leave mounts connected
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit e0c9c0afd2fc958ffa34b697972721d81df8a56f upstream.
Now that it is possible to lazily unmount an entire mount tree and leave the individual mounts connected to each other add a new flag UMOUNT_CONNECTED to umount_tree to force this behavior and use this flag in detach_mounts.
This closes a bug where the deletion of a file or directory could trigger an unmount and reveal data under a mount point.
--- fs/namespace.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
fs/namespace.c +6 -2
@@ -1350,6 +1350,7 @@ static inline void namespace_lock(void)enum umount_tree_flags {UMOUNT_SYNC =1 ,UMOUNT_PROPAGATE =2 , +UMOUNT_CONNECTED =4 , };/* * mount_lock must be held
@@ -1388,7 +1389,10 @@ static void umount_tree(struct mount *mnif (how &UMOUNT_SYNC ) p->mnt.mnt_flags |=MNT_SYNC_UMOUNT ; - disconnect = !IS_MNT_LOCKED_AND_LAZY (p); + disconnect = !(((how &UMOUNT_CONNECTED ) && +mnt_has_parent (p) && + (p->mnt_parent->mnt.mnt_flags &MNT_UMOUNT )) || +IS_MNT_LOCKED_AND_LAZY (p));pin_insert_group (&p->mnt_umount, &p->mnt_parent->mnt, disconnect ? &unmounted :NULL );
@@ -1531,7 +1535,7 @@ void __detach_mounts(struct dentry *dentumount_mnt (p); } } -else umount_tree (mnt,0 ); +else umount_tree (mnt,UMOUNT_CONNECTED ); }unlock_mount_hash ();put_mountpoint (mp);
Greg Kroah-Hartman
maintainerPATCH 119/220 tpm: fix: sanitized code paths in tpm_chip_register()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Sakkinen <[email protected]>
commit 34d47b6322087665be33ca3aa81775b143a4d7ac upstream.
I started to work with PPI interface so that it would be available under character device sysfs directory and realized that chip registeration was still too messy.
In TPM 1.x in some rare scenarios (errors that almost never occur) wrong order in deinitialization steps was taken in teardown. I reproduced these scenarios by manually inserting error codes in the place of the corresponding function calls.
The key problem is that the teardown is messy with two separate code paths (this was inherited when moving code from tpm-interface.c).
Moved TPM 1.x specific register/unregister functionality to own helper functions and added single code path for teardown in tpm_chip_register(). Now the code paths have been fixed and it should be easier to review later on this part of the code.
--- drivers/char/tpm/tpm-chip.c | 66 ++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 24 deletions(-)
drivers/char/tpm/tpm-chip.c +42 -24
@@ -170,6 +170,41 @@ static void tpm_dev_del_device(struct tpdevice_unregister (&chip->dev); } +static int tpm1_chip_register (struct tpm_chip *chip) +{ +int rc; + +if (chip->flags &TPM_CHIP_FLAG_TPM2 ) +return 0 ; + + rc =tpm_sysfs_add_device (chip); +if (rc) +return rc; + + rc =tpm_add_ppi (chip); +if (rc) { +tpm_sysfs_del_device (chip); +return rc; + } + + chip->bios_dir =tpm_bios_log_setup (chip->devname); + +return 0 ; +} + +static void tpm1_chip_unregister (struct tpm_chip *chip) +{ +if (chip->flags &TPM_CHIP_FLAG_TPM2 ) +return ; + +if (chip->bios_dir) +tpm_bios_log_teardown (chip->bios_dir); + +tpm_remove_ppi (chip); + +tpm_sysfs_del_device (chip); +} +/* * tpm_chip_register() - create a character device for the TPM chip * @chip: TPM chip to use.
@@ -185,22 +220,13 @@ int tpm_chip_register(struct tpm_chip *c {int rc; -/* Populate sysfs for TPM1 devices. */ -if (!(chip->flags &TPM_CHIP_FLAG_TPM2 )) { - rc =tpm_sysfs_add_device (chip); -if (rc) - goto del_misc; - - rc =tpm_add_ppi (chip); -if (rc) - goto del_sysfs; - - chip->bios_dir =tpm_bios_log_setup (chip->devname); - } + rc =tpm1_chip_register (chip); +if (rc) +return rc; rc =tpm_dev_add_device (chip);if (rc) -return rc; + goto out_err;/* Make the chip available. */ spin_lock (&driver_lock);
@@ -210,10 +236,8 @@ int tpm_chip_register(struct tpm_chip *c chip->flags |=TPM_CHIP_FLAG_REGISTERED ;return 0 ; -del_sysfs: -tpm_sysfs_del_device (chip); -del_misc: -tpm_dev_del_device (chip); +out_err: +tpm1_chip_unregister (chip);return rc; }EXPORT_SYMBOL_GPL (tpm_chip_register);
@@ -238,13 +262,7 @@ void tpm_chip_unregister(struct tpm_chipspin_unlock (&driver_lock);synchronize_rcu (); -if (!(chip->flags &TPM_CHIP_FLAG_TPM2 )) { -if (chip->bios_dir) -tpm_bios_log_teardown (chip->bios_dir); -tpm_remove_ppi (chip); -tpm_sysfs_del_device (chip); - } - +tpm1_chip_unregister (chip);tpm_dev_del_device (chip); }EXPORT_SYMBOL_GPL (tpm_chip_unregister);
Greg Kroah-Hartman
maintainerPATCH 121/220 perf tools: Fix perf-read-vdsox32 not building and lib64 install dir
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "H.J. Lu" <[email protected]>
commit 76aea7731e7050c066943a1d7456ec6510702601 upstream.
Commit:
c6e5e9fbc3ea ("perf tools: Fix building error in x86_64 when dwarf unwind is on")
removed the definition of IS_X86_64 but not all places using it, with the consequence that perf-read-vdsox32 would not be built anymore, and the default lib install directory was 'lib' instead of 'lib64'.
Also needs to go to v3.19.
--- tools/perf/config/Makefile | 4 ++-- tools/perf/tests/make | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
tools/perf/config/Makefile +2 -2
@@ -651,7 +651,7 @@ ifeq (${IS_64_BIT}, 1) NO_PERF_READ_VDSO32 := 1 endif endif - ifneq (${IS_X86_64}, 1) + ifneq ($(ARCH), x86) NO_PERF_READ_VDSOX32 := 1 endif ifndef NO_PERF_READ_VDSOX32
@@ -699,7 +699,7 @@ sysconfdir = $(prefix)/etc ETC_PERFCONFIG = etc/perfconfig endif ifndef lib -ifeq ($(IS_X86_64),1) +ifeq ($(ARCH)$(IS_64_BIT), x861) lib = lib64 else lib = lib
tools/perf/tests/make +1 -1
@@ -5,7 +5,7 @@ include config/Makefile.arch # FIXME looks like x86 is the only arch running tests ;-) # we need some IS_(32/64) flag to make this generic -ifeq ($(IS_X86_64),1) +ifeq ($(ARCH)$(IS_64_BIT), x861) lib = lib64 else lib = lib
Greg Kroah-Hartman
maintainerPATCH 123/220 powerpc/perf: Cap 64bit userspace backtraces to PERF_MAX_STACK_DEPTH
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Blanchard <[email protected]>
commit 9a5cbce421a283e6aea3c4007f141735bf9da8c3 upstream.
We cap 32bit userspace backtraces to PERF_MAX_STACK_DEPTH (currently 127), but we forgot to do the same for 64bit backtraces.
--- arch/powerpc/perf/callchain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/perf/callchain.c +1 -1
@@ -243,7 +243,7 @@ static void perf_callchain_user_64(struc sp = regs->gpr[1 ];perf_callchain_store (entry, next_ip); -for (;;) { +while (entry->nr <PERF_MAX_STACK_DEPTH ) { fp = (unsigned long __user *) sp;if (!valid_user_sp (sp,1 ) ||read_user_stack_64 (fp, &next_sp))return ;
Greg Kroah-Hartman
maintainerPATCH 124/220 tools lib traceevent kbuffer: Remove extra update to data pointer in PADDING
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Steven Rostedt (Red Hat)" <[email protected]>
commit c5e691928bf166ac03430e957038b60adba3cf6c upstream.
When a event PADDING is hit (a deleted event that is still in the ring buffer), translate_data() sets the length of the padding and also updates the data pointer which is passed back to the caller.
This is unneeded because the caller also updates the data pointer with the passed back length. translate_data() should not update the pointer, only set the length.
--- tools/lib/traceevent/kbuffer-parse.c | 1 - 1 file changed, 1 deletion(-)
tools/lib/traceevent/kbuffer-parse.c +0 -1
@@ -372,7 +372,6 @@ translate_data(struct kbuffer *kbuf, voiswitch (type_len) {case KBUFFER_TYPE_PADDING : *length =read_4 (kbuf, data); - data += *length;break ;case KBUFFER_TYPE_TIME_EXTEND :
Greg Kroah-Hartman
maintainerPATCH 125/220 tools/power turbostat: Use $(CURDIR) instead of $(PWD) and add support for O= option in Makefile
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas D <[email protected]>
commit f82263c6989c31ae9b94cecddffb29dcbec38710 upstream.
Since commit ee0778a30153
("tools/power: turbostat: make Makefile a bit more capable") turbostat's Makefile is using
[...] BUILD_OUTPUT := $(PWD) [...]
which obviously causes trouble when building "turbostat" with
make -C /usr/src/linux/tools/power/x86/turbostat ARCH=x86 turbostat
because GNU make does not update nor guarantee that $PWD is set.
This patch changes the Makefile to use $CURDIR instead, which GNU make guarantees to set and update (i.e. when using "make -C ...") and also adds support for the O= option (see "make help" in your root of your kernel source tree for more details).
--- tools/power/x86/turbostat/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
tools/power/x86/turbostat/Makefile +5 -1
@@ -1,8 +1,12 @@ CC = $(CROSS_COMPILE)gcc -BUILD_OUTPUT := $(PWD) +BUILD_OUTPUT := $(CURDIR) PREFIX := /usr DESTDIR := +ifeq ("$(origin O)", "command line") + BUILD_OUTPUT := $(O) +endif + turbostat : turbostat.c CFLAGS += -Wall CFLAGS += -DMSRHEADER='"../../../../arch/x86/include/uapi/asm/msr-index.h"'
Greg Kroah-Hartman
maintainerPATCH 126/220 UBI: account for bitflips in both the VID header and data
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Norris <[email protected]>
commit 8eef7d70f7c6772c3490f410ee2bceab3b543fa1 upstream.
We are completely discarding the earlier value of 'bitflips', which could reflect a bitflip found in ubi_io_read_vid_hdr(). Let's use the bitwise OR of header and data 'bitflip' statuses instead.
Coverity CID #1226856
--- drivers/mtd/ubi/attach.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/attach.c +1 -1
@@ -410,7 +410,7 @@ int ubi_compare_lebs(struct ubi_device * second_is_newer = !second_is_newer; }else {dbg_bld ("PEB %d CRC is OK" , pnum); - bitflips = !!err; + bitflips |= !!err; }mutex_unlock (&ubi->buf_mutex);
Greg Kroah-Hartman
maintainerPATCH 127/220 UBI: fix out of bounds write
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Norris <[email protected]>
commit d74adbdb9abf0d2506a6c4afa534d894f28b763f upstream.
If aeb->len >= vol->reserved_pebs, we should not be writing aeb into the PEB->LEB mapping.
Caught by Coverity, CID #711212.
--- drivers/mtd/ubi/eba.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/mtd/ubi/eba.c +2 -1
@@ -1419,7 +1419,8 @@ int ubi_eba_init(struct ubi_device *ubi,* during re-size. */ ubi_move_aeb_to_list (av, aeb, &ai->erase); - vol->eba_tbl[aeb->lnum] = aeb->pnum; + else + vol->eba_tbl[aeb->lnum] = aeb->pnum; } }
Greg Kroah-Hartman
maintainerPATCH 128/220 UBI: initialize LEB number variable
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Norris <[email protected]>
commit f16db8071ce18819fbd705ddcc91c6f392fb61f8 upstream.
In some of the 'out_not_moved' error paths, lnum may be used uninitialized. Don't ignore the warning; let's fix it.
This uninitialized variable doesn't have much visible effect in the end, since we just schedule the PEB for erasure, and its LEB number doesn't really matter (it just gets printed in debug messages). But let's get it straight anyway.
Coverity CID #113449
--- drivers/mtd/ubi/wl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/wl.c +1 -1
@@ -1002,7 +1002,7 @@ static int wear_leveling_worker(struct u int shutdown) {int err, scrubbing =0 , torture =0 , protect =0 , erroneous =0 ; -int vol_id =-1 ,uninitialized_var (lnum ); +int vol_id =-1 , lnum =-1 ;#ifdef CONFIG_MTD_UBI_FASTMAP int anchor = wrk->anchor;#endif
Greg Kroah-Hartman
maintainerPATCH 129/220 UBI: fix check for "too many bytes"
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Norris <[email protected]>
commit 299d0c5b27346a77a0777c993372bf8777d4f2e5 upstream.
The comparison from the previous line seems to have been erroneously (partially) copied-and-pasted onto the next. The second line should be checking req.bytes, not req.lnum.
Coverity CID #139400
--- drivers/mtd/ubi/cdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/cdev.c +1 -1
@@ -455,7 +455,7 @@ static long vol_cdev_ioctl(struct file */* Validate the request */ err = -EINVAL ;if (req.lnum <0 || req.lnum >= vol->reserved_pebs || - req.bytes <0 || req.lnum >= vol->usable_leb_size) + req.bytes <0 || req.bytes > vol->usable_leb_size)break ; err =get_exclusive (desc);
Greg Kroah-Hartman
maintainerPATCH 130/220 scsi: storvsc: Fix a bug in copy_from_bounce_buffer()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "K. Y. Srinivasan" <[email protected]>
commit 8de580742fee8bc34d116f57a20b22b9a5f08403 upstream.
We may exit this function without properly freeing up the maapings we may have acquired. Fix the bug.
--- drivers/scsi/storvsc_drv.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/scsi/storvsc_drv.c +8 -7
@@ -746,21 +746,22 @@ static unsigned int copy_to_bounce_buffeif (bounce_sgl[j].length ==PAGE_SIZE ) {/* full..move to next entry */ sg_kunmap_atomic (bounce_addr); + bounce_addr =0 ; j++; + } -/* if we need to use another bounce buffer */ -if (srclen || i != orig_sgl_count -1 ) - bounce_addr =sg_kmap_atomic (bounce_sgl,j); +/* if we need to use another bounce buffer */ +if (srclen && bounce_addr ==0 ) + bounce_addr =sg_kmap_atomic (bounce_sgl, j); - }else if (srclen ==0 && i == orig_sgl_count -1 ) { -/* unmap the last bounce that is < PAGE_SIZE */ -sg_kunmap_atomic (bounce_addr); - } }sg_kunmap_atomic (src_addr - orig_sgl[i].offset); } +if (bounce_addr) +sg_kunmap_atomic (bounce_addr); +local_irq_restore (flags);return total_copied;
Greg Kroah-Hartman
maintainerPATCH 131/220 iscsi-target: Convert iscsi_thread_set usage to kthread.h
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 88dcd2dab5c23b1c9cfc396246d8f476c872f0ca upstream.
This patch converts iscsi-target code to use modern kthread.h API callers for creating RX/TX threads for each new iscsi_conn descriptor, and releasing associated RX/TX threads during connection shutdown.
This is done using iscsit_start_kthreads() -> kthread_run() to start new kthreads from within iscsi_post_login_handler(), and invoking kthread_stop() from existing iscsit_close_connection() code.
Also, convert iscsit_logout_post_handler_closesession() code to use cmpxchg when determing when iscsit_cause_connection_reinstatement() needs to sleep waiting for completion.
--- drivers/target/iscsi/iscsi_target.c | 104 ++++++++++++------------------ drivers/target/iscsi/iscsi_target_erl0.c | 13 ++- drivers/target/iscsi/iscsi_target_login.c | 59 +++++++++++++++-- include/target/iscsi/iscsi_target_core.h | 7 ++ 4 files changed, 114 insertions(+), 69 deletions(-)
drivers/target/iscsi/iscsi_target.c +45 -59
@@ -537,7 +537,7 @@ static struct iscsit_transport iscsi_tarstatic int __init iscsi_target_init_module (void ) { -int ret =0 ; +int ret =0 , size;pr_debug ("iSCSI-Target " ISCSIT_VERSION "\n" );
@@ -546,6 +546,7 @@ static int __init iscsi_target_init_modupr_err ("Unable to allocate memory for iscsit_global\n" );return -1 ; } +spin_lock_init (&iscsit_global->ts_bitmap_lock);mutex_init (&auth_id_lock);spin_lock_init (&sess_idr_lock);idr_init (&tiqn_idr);
@@ -555,15 +556,11 @@ static int __init iscsi_target_init_moduif (ret <0 ) goto out; - ret =iscsi_thread_set_init (); -if (ret <0 ) + size =BITS_TO_LONGS (ISCSIT_BITMAP_BITS ) *sizeof (long ); + iscsit_global->ts_bitmap =vzalloc (size); +if (!iscsit_global->ts_bitmap) { +pr_err ("Unable to allocate iscsit_global->ts_bitmap\n" ); goto configfs_out; - -if (iscsi_allocate_thread_sets (TARGET_THREAD_SET_COUNT ) != -TARGET_THREAD_SET_COUNT ) { -pr_err ("iscsi_allocate_thread_sets() returned" -" unexpected value!\n" ); - goto ts_out1; } lio_qr_cache = kmem_cache_create("lio_qr_cache",
@@ -572,7 +569,7 @@ static int __init iscsi_target_init_moduif (!lio_qr_cache) {pr_err ("nable to kmem_cache_create() for" " lio_qr_cache\n" ); - goto ts_out2; + goto bitmap_out; } lio_dr_cache = kmem_cache_create("lio_dr_cache",
@@ -617,10 +614,8 @@ dr_out:kmem_cache_destroy (lio_dr_cache); qr_out:kmem_cache_destroy (lio_qr_cache); -ts_out2: -iscsi_deallocate_thread_sets (); -ts_out1: -iscsi_thread_set_free (); +bitmap_out: +vfree (iscsit_global->ts_bitmap); configfs_out:iscsi_target_deregister_configfs (); out:
@@ -630,8 +625,6 @@ out: static void __exit iscsi_target_cleanup_module(void) { -iscsi_deallocate_thread_sets (); -iscsi_thread_set_free ();iscsit_release_discovery_tpg ();iscsit_unregister_transport (&iscsi_target_transport);kmem_cache_destroy (lio_qr_cache);
@@ -641,6 +634,7 @@ static void __exit iscsi_target_cleanup_iscsi_target_deregister_configfs (); +vfree (iscsit_global->ts_bitmap);kfree (iscsit_global); }
@@ -3715,17 +3709,16 @@ static int iscsit_send_reject(void iscsit_thread_get_cpumask (struct iscsi_conn *conn) { -struct iscsi_thread_set *ts = conn->thread_set;int ord, cpu;/* -* thread_id is assigned from iscsit_global->ts_bitmap from -* within iscsi_thread_set.c:iscsi_allocate_thread_sets() +* bitmap_id is assigned from iscsit_global->ts_bitmap from +* within iscsit_start_kthreads() * -* Here we use thread_id to determine which CPU that this -* iSCSI connection's iscsi_thread_set will be scheduled to +* Here we use bitmap_id to determine which CPU that this +* iSCSI connection's RX/TX threads will be scheduled to * execute upon. */ - ord = ts->thread_id %cpumask_weight (cpu_online_mask); + ord = conn->bitmap_id %cpumask_weight (cpu_online_mask);for_each_online_cpu (cpu) {if (ord-- ==0 ) {cpumask_set_cpu (cpu, conn->conn_cpumask);
@@ -3914,7 +3907,7 @@ check_rsp_state:switch (state) {case ISTATE_SEND_LOGOUTRSP :if (!iscsit_logout_post_handler (cmd, conn)) - goto restart; +return -ECONNRESET ;/* fall through */ case ISTATE_SEND_STATUS :case ISTATE_SEND_ASYNCMSG :
@@ -3942,8 +3935,6 @@ check_rsp_state: err:return -1 ; -restart: -return -EAGAIN ; }static int iscsit_handle_response_queue (struct iscsi_conn *conn)
@@ -3970,21 +3961,13 @@ static int iscsit_handle_response_queue(int iscsi_target_tx_thread (void *arg) {int ret =0 ; -struct iscsi_conn *conn; -struct iscsi_thread_set *ts = arg; +struct iscsi_conn *conn = arg;/* * Allow ourselves to be interrupted by SIGINT so that a * connection recovery / failure event can be triggered externally. */ allow_signal (SIGINT ); -restart: - conn =iscsi_tx_thread_pre_handler (ts); -if (!conn) - goto out; - - ret =0 ; -while (!kthread_should_stop ()) {/* * Ensure that both TX and RX per connection kthreads
@@ -3993,11 +3976,9 @@ restart:iscsit_thread_check_cpumask (conn, current,1 );wait_event_interruptible (conn->queues_wq, - !iscsit_conn_all_queues_empty (conn) || - ts->status ==ISCSI_THREAD_SET_RESET ); + !iscsit_conn_all_queues_empty (conn)); -if ((ts->status ==ISCSI_THREAD_SET_RESET ) || -signal_pending (current)) +if (signal_pending (current)) goto transport_err; get_immediate:
@@ -4008,15 +3989,14 @@ get_immediate: ret =iscsit_handle_response_queue (conn);if (ret ==1 ) goto get_immediate; -else if (ret == -EAGAIN ) - goto restart; +else if (ret == -ECONNRESET ) + goto out;else if (ret <0 ) goto transport_err; } transport_err:iscsit_take_action_for_connection_exit (conn); - goto restart; out:return 0 ; }
@@ -4111,8 +4091,7 @@ int iscsi_target_rx_thread(void *arg)int ret;u8 buffer[ISCSI_HDR_LEN ], opcode;u32 checksum =0 , digest =0 ; -struct iscsi_conn *conn =NULL ; -struct iscsi_thread_set *ts = arg; +struct iscsi_conn *conn = arg;struct kvec iov;/* * Allow ourselves to be interrupted by SIGINT so that a
@@ -4120,11 +4099,6 @@ int iscsi_target_rx_thread(void *arg)*/ allow_signal (SIGINT ); -restart: - conn =iscsi_rx_thread_pre_handler (ts); -if (!conn) - goto out; -if (conn->conn_transport->transport_type ==ISCSI_INFINIBAND ) {struct completion comp;int rc;
@@ -4134,7 +4108,7 @@ restart:if (rc <0 ) goto transport_err; - goto out; + goto transport_err; }while (!kthread_should_stop ()) {
@@ -4210,8 +4184,6 @@ transport_err:if (!signal_pending (current))atomic_set (&conn->transport_failed,1 );iscsit_take_action_for_connection_exit (conn); - goto restart; -out:return 0 ; }
@@ -4273,7 +4245,24 @@ int iscsit_close_connection(if (conn->conn_transport->transport_type ==ISCSI_TCP )complete (&conn->conn_logout_comp); -iscsi_release_thread_set (conn); +if (!strcmp (current->comm,ISCSI_RX_THREAD_NAME )) { +if (conn->tx_thread && +cmpxchg (&conn->tx_thread_active, true, false)) { +send_sig (SIGINT , conn->tx_thread,1 ); +kthread_stop (conn->tx_thread); + } + }else if (!strcmp (current->comm,ISCSI_TX_THREAD_NAME )) { +if (conn->rx_thread && +cmpxchg (&conn->rx_thread_active, true, false)) { +send_sig (SIGINT , conn->rx_thread,1 ); +kthread_stop (conn->rx_thread); + } + } + +spin_lock (&iscsit_global->ts_bitmap_lock); +bitmap_release_region (iscsit_global->ts_bitmap, conn->bitmap_id, +get_order (1 )); +spin_unlock (&iscsit_global->ts_bitmap_lock);iscsit_stop_timers_for_cmds (conn);iscsit_stop_nopin_response_timer (conn);
@@ -4551,15 +4540,13 @@ static void iscsit_logout_post_handler_c struct iscsi_conn *conn) {struct iscsi_session *sess = conn->sess; - -iscsi_set_thread_clear (conn,ISCSI_CLEAR_TX_THREAD ); -iscsi_set_thread_set_signal (conn,ISCSI_SIGNAL_TX_THREAD ); +int sleep =cmpxchg (&conn->tx_thread_active, true, false);atomic_set (&conn->conn_logout_remove,0 );complete (&conn->conn_logout_comp);iscsit_dec_conn_usage_count (conn); -iscsit_stop_session (sess,1 ,1 ); +iscsit_stop_session (sess, sleep, sleep);iscsit_dec_session_usage_count (sess);target_put_session (sess->se_sess); }
@@ -4567,13 +4554,12 @@ static void iscsit_logout_post_handler_cstatic void iscsit_logout_post_handler_samecid (struct iscsi_conn *conn) { -iscsi_set_thread_clear (conn,ISCSI_CLEAR_TX_THREAD ); -iscsi_set_thread_set_signal (conn,ISCSI_SIGNAL_TX_THREAD ); +int sleep =cmpxchg (&conn->tx_thread_active, true, false);atomic_set (&conn->conn_logout_remove,0 );complete (&conn->conn_logout_comp); -iscsit_cause_connection_reinstatement (conn,1 ); +iscsit_cause_connection_reinstatement (conn, sleep);iscsit_dec_conn_usage_count (conn); }
drivers/target/iscsi/iscsi_target_erl0.c +8 -5
@@ -860,7 +860,10 @@ void iscsit_connection_reinstatement_rcf }spin_unlock_bh (&conn->state_lock); -iscsi_thread_set_force_reinstatement (conn); +if (conn->tx_thread && conn->tx_thread_active) +send_sig (SIGINT , conn->tx_thread,1 ); +if (conn->rx_thread && conn->rx_thread_active) +send_sig (SIGINT , conn->rx_thread,1 ); sleep:wait_for_completion (&conn->conn_wait_rcfr_comp);
@@ -885,10 +888,10 @@ void iscsit_cause_connection_reinstatemereturn ; } -if (iscsi_thread_set_force_reinstatement (conn) <0 ) { -spin_unlock_bh (&conn->state_lock); -return ; - } +if (conn->tx_thread && conn->tx_thread_active) +send_sig (SIGINT , conn->tx_thread,1 ); +if (conn->rx_thread && conn->rx_thread_active) +send_sig (SIGINT , conn->rx_thread,1 );atomic_set (&conn->connection_reinstatement,1 );if (!sleep) {
drivers/target/iscsi/iscsi_target_login.c +54 -5
91 lines not on this page · raw message
include/target/iscsi/iscsi_target_core.h +7 -0
@@ -602,6 +602,11 @@ struct iscsi_conn {struct iscsi_session *sess;/* Pointer to thread_set in use for this conn's threads */ struct iscsi_thread_set *thread_set; +int bitmap_id; +int rx_thread_active; +struct task_struct *rx_thread; +int tx_thread_active; +struct task_struct *tx_thread;/* list_head for session connection list */ struct list_head conn_list; }____cacheline_aligned ;
@@ -871,10 +876,12 @@ struct iscsit_global {/* Unique identifier used for the authentication daemon */ u32 auth_id;u32 inactive_ts; +#define ISCSIT_BITMAP_BITS 262144/* Thread Set bitmap count */ int ts_bitmap_count;/* Thread Set bitmap pointer */ unsigned long *ts_bitmap; +spinlock_t ts_bitmap_lock;/* Used for iSCSI discovery session authentication */ struct iscsi_node_acl discovery_acl;struct iscsi_portal_group *discovery_tpg;
Greg Kroah-Hartman
maintainerPATCH 132/220 target: Fix COMPARE_AND_WRITE with SG_TO_MEM_NOALLOC handling
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit c8e639852ad720499912acedfd6b072325fd2807 upstream.
This patch fixes a bug for COMPARE_AND_WRITE handling with fabrics using SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC.
It adds the missing allocation for cmd->t_bidi_data_sg within transport_generic_new_cmd() that is used by COMPARE_AND_WRITE for the initial READ payload, even if the fabric is already providing a pre-allocated buffer for cmd->t_data_sg.
Also, fix zero-length COMPARE_AND_WRITE handling within the compare_and_write_callback() and target_complete_ok_work() to queue the response, skipping the initial READ.
This fixes COMPARE_AND_WRITE emulation with loopback, vhost, and xen-backend fabric drivers using SG_TO_MEM_NOALLOC.
--- drivers/target/target_core_sbc.c | 15 ++++++++----- drivers/target/target_core_transport.c | 37 +++++++++++++++++++++++++++++---- include/target/target_core_base.h | 2 - 3 files changed, 44 insertions(+), 10 deletions(-)
drivers/target/target_core_sbc.c +10 -5
@@ -312,7 +312,7 @@ sbc_setup_write_same(struct se_cmd *cmd,return 0 ; } -static sense_reason_t xdreadwrite_callback (struct se_cmd *cmd) +static sense_reason_t xdreadwrite_callback (struct se_cmd *cmd,bool success) {unsigned char *buf, *addr;struct scatterlist *sg;
@@ -376,7 +376,7 @@ sbc_execute_rw(struct se_cmd *cmd) cmd->data_direction); } -static sense_reason_t compare_and_write_post (struct se_cmd *cmd) +static sense_reason_t compare_and_write_post (struct se_cmd *cmd,bool success) {struct se_device *dev = cmd->se_dev;
@@ -399,7 +399,7 @@ static sense_reason_t compare_and_write_return TCM_NO_SENSE ; } -static sense_reason_t compare_and_write_callback (struct se_cmd *cmd) +static sense_reason_t compare_and_write_callback (struct se_cmd *cmd,bool success) {struct se_device *dev = cmd->se_dev;struct scatterlist *write_sg =NULL , *sg;
@@ -414,11 +414,16 @@ static sense_reason_t compare_and_write_/* * Handle early failure in transport_generic_request_failure(), -* which will not have taken ->caw_mutex yet.. +* which will not have taken ->caw_sem yet.. */ -if (!cmd->t_data_sg || !cmd->t_bidi_data_sg) +if (!success && (!cmd->t_data_sg || !cmd->t_bidi_data_sg))return TCM_NO_SENSE ;/* +* Handle special case for zero-length COMPARE_AND_WRITE +*/ +if (!cmd->data_length) + goto out; +/* * Immediately exit + release dev->caw_sem if command has already * been failed with a non-zero SCSI status. */
drivers/target/target_core_transport.c +33 -4
@@ -1615,11 +1615,11 @@ void transport_generic_request_failure(stransport_complete_task_attr (cmd);/* * Handle special case for COMPARE_AND_WRITE failure, where the -* callback is expected to drop the per device ->caw_mutex. +* callback is expected to drop the per device ->caw_sem. */ if ((cmd->se_cmd_flags &SCF_COMPARE_AND_WRITE ) && cmd->transport_complete_callback) - cmd->transport_complete_callback (cmd); + cmd->transport_complete_callback (cmd, false);switch (sense_reason) {case TCM_NON_EXISTENT_LUN :
@@ -1975,8 +1975,12 @@ static void target_complete_ok_work(struif (cmd->transport_complete_callback) {sense_reason_t rc; - rc = cmd->transport_complete_callback (cmd); + rc = cmd->transport_complete_callback (cmd, true);if (!rc && !(cmd->se_cmd_flags &SCF_COMPARE_AND_WRITE_POST )) { +if ((cmd->se_cmd_flags &SCF_COMPARE_AND_WRITE ) && + !cmd->data_length) + goto queue_rsp; +return ; }else if (rc) { ret = transport_send_check_condition_and_sense(cmd,
@@ -1990,6 +1994,7 @@ static void target_complete_ok_work(stru } } +queue_rsp:switch (cmd->data_direction) {case DMA_FROM_DEVICE :spin_lock (&cmd->se_lun->lun_sep_lock);
@@ -2094,6 +2099,16 @@ static inline void transport_reset_sgl_ostatic inline void transport_free_pages (struct se_cmd *cmd) {if (cmd->se_cmd_flags &SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC ) { +/* +* Release special case READ buffer payload required for +* SG_TO_MEM_NOALLOC to function with COMPARE_AND_WRITE +*/ +if (cmd->se_cmd_flags &SCF_COMPARE_AND_WRITE ) { +transport_free_sgl (cmd->t_bidi_data_sg, + cmd->t_bidi_data_nents); + cmd->t_bidi_data_sg =NULL ; + cmd->t_bidi_data_nents =0 ; + }transport_reset_sgl_orig (cmd);return ; }
@@ -2246,6 +2261,7 @@ sense_reason_t transport_generic_new_cmd(struct se_cmd *cmd) {int ret =0 ; +bool zero_flag = !(cmd->se_cmd_flags &SCF_SCSI_DATA_CDB );/* * Determine is the TCM fabric module has already allocated physical
@@ -2254,7 +2270,6 @@ transport_generic_new_cmd(struct se_cmd*/ if (!(cmd->se_cmd_flags &SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC ) && cmd->data_length) { -bool zero_flag = !(cmd->se_cmd_flags &SCF_SCSI_DATA_CDB );if ((cmd->se_cmd_flags &SCF_BIDI ) || (cmd->se_cmd_flags &SCF_COMPARE_AND_WRITE )) {
@@ -2285,6 +2300,20 @@ transport_generic_new_cmd(struct se_cmd cmd->data_length, zero_flag);if (ret <0 )return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ; + }else if ((cmd->se_cmd_flags &SCF_COMPARE_AND_WRITE ) && + cmd->data_length) { +/* +* Special case for COMPARE_AND_WRITE with fabrics +* using SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC. +*/ +u32 caw_length = cmd->t_task_nolb * + cmd->se_dev->dev_attrib.block_size; + + ret =target_alloc_sgl (&cmd->t_bidi_data_sg, + &cmd->t_bidi_data_nents, + caw_length, zero_flag); +if (ret <0 ) +return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ; }/* * If this command is not a write we can execute it right here,
include/target/target_core_base.h +1 -1
@@ -524,7 +524,7 @@ struct se_cmd {sense_reason_t (*execute_cmd)(struct se_cmd *);sense_reason_t (*execute_rw)(struct se_cmd *,struct scatterlist *,u32 ,enum dma_data_direction ); -sense_reason_t (*transport_complete_callback)(struct se_cmd *); +sense_reason_t (*transport_complete_callback)(struct se_cmd *,bool );unsigned char *t_task_cdb;unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE ];
Greg Kroah-Hartman
maintainerPATCH 133/220 target/file: Fix BUG() when CONFIG_DEBUG_SG=y and DIF protection enabled
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akinobu Mita <[email protected]>
commit 38da0f49e8aa1649af397d53f88e163d0e60c058 upstream.
When CONFIG_DEBUG_SG=y and DIF protection support enabled, kernel BUG()s are triggered due to the following two issues:
1) prot_sg is not initialized by sg_init_table().
When CONFIG_DEBUG_SG=y, scatterlist helpers check sg entry has a correct magic value.
2) vmalloc'ed buffer is passed to sg_set_buf().
sg_set_buf() uses virt_to_page() to convert virtual address to struct page, but it doesn't work with vmalloc address. vmalloc_to_page() should be used instead. As prot_buf isn't usually too large, so fix it by allocating prot_buf by kmalloc instead of vmalloc.
--- drivers/target/target_core_file.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/target/target_core_file.c +8 -7
@@ -274,7 +274,7 @@ static int fd_do_prot_rw(struct se_cmd * se_dev->prot_length;if (!is_write) { - fd_prot->prot_buf =vzalloc (prot_size); + fd_prot->prot_buf =kzalloc (prot_size,GFP_KERNEL );if (!fd_prot->prot_buf) {pr_err ("Unable to allocate fd_prot->prot_buf\n" );return -ENOMEM ;
@@ -286,9 +286,10 @@ static int fd_do_prot_rw(struct se_cmd * fd_prot->prot_sg_nents, GFP_KERNEL);if (!fd_prot->prot_sg) {pr_err ("Unable to allocate fd_prot->prot_sg\n" ); -vfree (fd_prot->prot_buf); +kfree (fd_prot->prot_buf);return -ENOMEM ; } +sg_init_table (fd_prot->prot_sg, fd_prot->prot_sg_nents); size = prot_size;for_each_sg (fd_prot->prot_sg, sg, fd_prot->prot_sg_nents, i) {
@@ -318,7 +319,7 @@ static int fd_do_prot_rw(struct se_cmd *if (is_write || ret <0 ) {kfree (fd_prot->prot_sg); -vfree (fd_prot->prot_buf); +kfree (fd_prot->prot_buf); }return ret;
@@ -658,11 +659,11 @@ fd_execute_rw(struct se_cmd *cmd, struct 0, fd_prot.prot_sg, 0);if (rc) {kfree (fd_prot.prot_sg); -vfree (fd_prot.prot_buf); +kfree (fd_prot.prot_buf);return rc; }kfree (fd_prot.prot_sg); -vfree (fd_prot.prot_buf); +kfree (fd_prot.prot_buf); } }else {memset (&fd_prot,0 ,sizeof (struct fd_prot ));
@@ -678,7 +679,7 @@ fd_execute_rw(struct se_cmd *cmd, struct 0, fd_prot.prot_sg, 0);if (rc) {kfree (fd_prot.prot_sg); -vfree (fd_prot.prot_buf); +kfree (fd_prot.prot_buf);return rc; } }
@@ -714,7 +715,7 @@ fd_execute_rw(struct se_cmd *cmd, structif (ret <0 ) {kfree (fd_prot.prot_sg); -vfree (fd_prot.prot_buf); +kfree (fd_prot.prot_buf);return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ; }
Greg Kroah-Hartman
maintainerPATCH 134/220 target/file: Fix UNMAP with DIF protection support
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akinobu Mita <[email protected]>
commit 64d240b721b21e266ffde645ec965c3b6d1c551f upstream.
When UNMAP command is issued with DIF protection support enabled, the protection info for the unmapped region is remain unchanged. So READ command for the region causes data integrity failure.
This fixes it by invalidating protection info for the unmapped region by filling with 0xff pattern. This change also adds helper function fd_do_prot_fill() in order to reduce code duplication with existing fd_format_prot().
--- drivers/target/target_core_file.c | 86 ++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 25 deletions(-)
drivers/target/target_core_file.c +61 -25
@@ -550,6 +550,56 @@ fd_execute_write_same(struct se_cmd *cmdreturn 0 ; } +static int +fd_do_prot_fill (struct se_device *se_dev,sector_t lba,sector_t nolb, +void *buf,size_t bufsize) +{ +struct fd_dev *fd_dev =FD_DEV (se_dev); +struct file *prot_fd = fd_dev->fd_prot_file; +sector_t prot_length, prot; +loff_t pos = lba * se_dev->prot_length; + +if (!prot_fd) { +pr_err ("Unable to locate fd_dev->fd_prot_file\n" ); +return -ENODEV ; + } + + prot_length = nolb * se_dev->prot_length; + +for (prot =0 ; prot < prot_length;) { +sector_t len =min_t (sector_t, bufsize, prot_length - prot); +ssize_t ret =kernel_write (prot_fd, buf, len, pos + prot); + +if (ret != len) { +pr_err ("vfs_write to prot file failed: %zd\n" , ret); +return ret <0 ? ret : -ENODEV ; + } + prot += ret; + } + +return 0 ; +} + +static int +fd_do_prot_unmap (struct se_cmd *cmd,sector_t lba,sector_t nolb) +{ +void *buf; +int rc; + + buf = (void *)__get_free_page (GFP_KERNEL ); +if (!buf) { +pr_err ("Unable to allocate FILEIO prot buf\n" ); +return -ENOMEM ; + } +memset (buf,0xff ,PAGE_SIZE ); + + rc =fd_do_prot_fill (cmd->se_dev, lba, nolb, buf,PAGE_SIZE ); + +free_page ((unsigned long )buf); + +return rc; +} +static sense_reason_t fd_do_unmap (struct se_cmd *cmd,void *priv,sector_t lba,sector_t nolb) {
@@ -557,6 +607,12 @@ fd_do_unmap(struct se_cmd *cmd, void *prstruct inode *inode = file->f_mapping->host;int ret; +if (cmd->se_dev->dev_attrib.pi_prot_type) { + ret =fd_do_prot_unmap (cmd, lba, nolb); +if (ret) +return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ; + } +if (S_ISBLK (inode->i_mode)) {/* The backend is block device, use discard */ struct block_device *bdev = inode->i_bdev;
@@ -879,48 +935,28 @@ static int fd_init_prot(struct se_devicestatic int fd_format_prot (struct se_device *dev) { -struct fd_dev *fd_dev =FD_DEV (dev); -struct file *prot_fd = fd_dev->fd_prot_file; -sector_t prot_length, prot;unsigned char *buf; -loff_t pos =0 ;int unit_size =FDBD_FORMAT_UNIT_SIZE * dev->dev_attrib.block_size; -int rc, ret =0 , size, len; +int ret;if (!dev->dev_attrib.pi_prot_type) {pr_err ("Unable to format_prot while pi_prot_type == 0\n" );return -ENODEV ; } -if (!prot_fd) { -pr_err ("Unable to locate fd_dev->fd_prot_file\n" ); -return -ENODEV ; - } buf =vzalloc (unit_size);if (!buf) {pr_err ("Unable to allocate FILEIO prot buf\n" );return -ENOMEM ; } - prot_length = (dev->transport->get_blocks (dev) +1 ) * dev->prot_length; - size = prot_length;pr_debug ("Using FILEIO prot_length: %llu\n" , - (unsigned long long )prot_length); + (unsigned long long )(dev->transport->get_blocks (dev) +1 ) * + dev->prot_length);memset (buf,0xff , unit_size); -for (prot =0 ; prot < prot_length; prot += unit_size) { - len =min (unit_size, size); - rc =kernel_write (prot_fd, buf, len, pos); -if (rc != len) { -pr_err ("vfs_write to prot file failed: %d\n" , rc); - ret = -ENODEV ; - goto out; - } - pos += len; - size -= len; - } - -out: + ret =fd_do_prot_fill (dev,0 , dev->transport->get_blocks (dev) +1 , + buf, unit_size);vfree (buf);return ret; }
Greg Kroah-Hartman
maintainerPATCH 135/220 target/file: Fix SG table for prot_buf initialization
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akinobu Mita <[email protected]>
commit c836777830428372074d5129ac513e1472c99791 upstream.
In fd_do_prot_rw(), it allocates prot_buf which is used to copy from se_cmd->t_prot_sg by sbc_dif_copy_prot(). The SG table for prot_buf is also initialized by allocating 'se_cmd->t_prot_nents' entries of scatterlist and setting the data length of each entry to PAGE_SIZE at most.
However if se_cmd->t_prot_sg contains a clustered entry (i.e. sg->length > PAGE_SIZE), the SG table for prot_buf can't be initialized correctly and sbc_dif_copy_prot() can't copy to prot_buf. (This actually happened with TCM loopback fabric module)
As prot_buf is allocated by kzalloc() and it's physically contiguous, we only need a single scatterlist entry.
--- drivers/target/target_core_file.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-)
drivers/target/target_core_file.c +6 -15
@@ -264,11 +264,10 @@ static int fd_do_prot_rw(struct se_cmd *struct se_device *se_dev = cmd->se_dev;struct fd_dev *dev =FD_DEV (se_dev);struct file *prot_fd = dev->fd_prot_file; -struct scatterlist *sg;loff_t pos = (cmd->t_task_lba * se_dev->prot_length);unsigned char *buf; -u32 prot_size, len, size; -int rc, ret =1 , i; +u32 prot_size; +int rc, ret =1 ; prot_size = (cmd->data_length / se_dev->dev_attrib.block_size) * se_dev->prot_length;
@@ -281,24 +280,16 @@ static int fd_do_prot_rw(struct se_cmd * } buf = fd_prot->prot_buf; - fd_prot->prot_sg_nents = cmd->t_prot_nents; - fd_prot->prot_sg =kzalloc (sizeof (struct scatterlist ) * - fd_prot->prot_sg_nents,GFP_KERNEL ); + fd_prot->prot_sg_nents =1 ; + fd_prot->prot_sg =kzalloc (sizeof (struct scatterlist ), +GFP_KERNEL );if (!fd_prot->prot_sg) {pr_err ("Unable to allocate fd_prot->prot_sg\n" );kfree (fd_prot->prot_buf);return -ENOMEM ; }sg_init_table (fd_prot->prot_sg, fd_prot->prot_sg_nents); - size = prot_size; - -for_each_sg (fd_prot->prot_sg, sg, fd_prot->prot_sg_nents, i) { - - len =min_t (u32,PAGE_SIZE , size); -sg_set_buf (sg, buf, len); - size -= len; - buf += len; - } +sg_set_buf (fd_prot->prot_sg, buf, prot_size); }if (is_write) {
Greg Kroah-Hartman
maintainerPATCH 136/220 iser-target: Fix session hang in case of an rdma read DIF error
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sagi Grimberg <[email protected]>
commit 364189f0ada5478e4faf8a552d6071a650d757cd upstream.
This hang was a result of a missing command put when a DIF error occurred during a rdma read (and we sent an CHECK_CONDITION error without passing it to the backend).
--- drivers/infiniband/ulp/isert/ib_isert.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/infiniband/ulp/isert/ib_isert.c +4 -2
@@ -1861,11 +1861,13 @@ isert_completion_rdma_read(struct iser_t cmd->i_state =ISTATE_RECEIVED_LAST_DATAOUT ;spin_unlock_bh (&cmd->istate_lock); -if (ret) +if (ret) { +target_put_sess_cmd (se_cmd->se_sess, se_cmd);transport_send_check_condition_and_sense (se_cmd, se_cmd->pi_err,0 ); -else + }else {target_execute_cmd (se_cmd); + } } static void
Greg Kroah-Hartman
maintainerPATCH 137/220 iser-target: Fix possible deadlock in RDMA_CM connection error
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sagi Grimberg <[email protected]>
commit 4a579da2586bd3b79b025947ea24ede2bbfede62 upstream.
Before we reach to connection established we may get an error event. In this case the core won't teardown this connection (never established it), so we take care of freeing it ourselves.
--- drivers/infiniband/ulp/isert/ib_isert.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/infiniband/ulp/isert/ib_isert.c +9 -5
@@ -222,7 +222,7 @@ fail:static void isert_free_rx_descriptors (struct isert_conn *isert_conn) { -struct ib_device *ib_dev = isert_conn->conn_cm_id->device; +struct ib_device *ib_dev = isert_conn->conn_device->ib_device;struct iser_rx_desc *rx_desc;int i;
@@ -719,8 +719,8 @@ out:static void isert_connect_release (struct isert_conn *isert_conn) { -struct ib_device *ib_dev = isert_conn->conn_cm_id->device;struct isert_device *device = isert_conn->conn_device; +struct ib_device *ib_dev = device->ib_device;isert_dbg ("conn %p\n" , isert_conn);
@@ -728,7 +728,8 @@ isert_connect_release(struct isert_connisert_conn_free_fastreg_pool (isert_conn);isert_free_rx_descriptors (isert_conn); -rdma_destroy_id (isert_conn->conn_cm_id); +if (isert_conn->conn_cm_id) +rdma_destroy_id (isert_conn->conn_cm_id);if (isert_conn->conn_qp) {struct isert_comp *comp = isert_conn->conn_qp->recv_cq->cq_context;
@@ -878,12 +879,15 @@ isert_disconnected_handler(struct rdma_creturn 0 ; } -static void +static int isert_connect_error (struct rdma_cm_id *cma_id) {struct isert_conn *isert_conn = cma_id->qp->qp_context; + isert_conn->conn_cm_id =NULL ;isert_put_conn (isert_conn); + +return -1 ; } static int
@@ -912,7 +916,7 @@ isert_cma_handler(struct rdma_cm_id *cmacase RDMA_CM_EVENT_REJECTED :/* FALLTHRU */ case RDMA_CM_EVENT_UNREACHABLE :/* FALLTHRU */ case RDMA_CM_EVENT_CONNECT_ERROR : -isert_connect_error (cma_id); + ret =isert_connect_error (cma_id);break ;default :isert_err ("Unhandled RDMA CMA event: %d\n" , event->event);
Greg Kroah-Hartman
maintainerPATCH 138/220 Bluetooth: ath3k: Add support Atheros AR5B195 combo Mini PCIe card
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Ploumistos <[email protected]>
commit 2eeff0b4317a02f0e281df891d990194f0737aae upstream.
Add 04f2:aff1 to ath3k.c supported devices list and btusb.c blacklist, so that the device can load the ath3k firmware and re-enumerate itself as an AR3011 device.
T: Bus=05 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=04f2 ProdID=aff1 Rev= 0.01 C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms
--- drivers/bluetooth/ath3k.c | 1 + drivers/bluetooth/btusb.c | 1 + 2 files changed, 2 insertions(+)
drivers/bluetooth/ath3k.c +1 -0
@@ -65,6 +65,7 @@ static const struct usb_device_id ath3k_/* Atheros AR3011 with sflash firmware*/ { USB_DEVICE(0x0489, 0xE027) }, { USB_DEVICE(0x0489, 0xE03D) }, + { USB_DEVICE(0x04F2, 0xAFF1) }, { USB_DEVICE(0x0930, 0x0215) }, { USB_DEVICE(0x0CF3, 0x3002) }, { USB_DEVICE(0x0CF3, 0xE019) },
drivers/bluetooth/btusb.c +1 -0
@@ -159,6 +159,7 @@ static const struct usb_device_id blackl/* Atheros 3011 with sflash firmware */ { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE }, + { USB_DEVICE(0x04f2, 0xaff1), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE },
Greg Kroah-Hartman
maintainerPATCH 139/220 arm64: fix midr range for Cortex-A57 erratum 832075
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bo Yan <[email protected]>
commit 6d1966dfd6e0ad2f8aa4b664ae1a62e33abe1998 upstream.
Register MIDR_EL1 is masked to get variant and revision fields, then compared against midr_range_min and midr_range_max when checking whether CPU is affected by any particular erratum. However, variant and revision fields in MIDR_EL1 are separated by 16 bits, so the min and max of midr range should be constructed accordingly, otherwise the patch will not be applied when variant field is non-0.
--- arch/arm64/kernel/cpu_errata.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/kernel/cpu_errata.c +2 -1
@@ -88,7 +88,8 @@ struct arm64_cpu_capabilities arm64_erra/* Cortex-A57 r0p0 - r1p2 */ .desc = "ARM erratum 832075", .capability = ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE, - MIDR_RANGE(MIDR_CORTEX_A57, 0x00, 0x12), + MIDR_RANGE(MIDR_CORTEX_A57, 0x00, + (1 << MIDR_VARIANT_SHIFT) | 2), },#endif {
Greg Kroah-Hartman
maintainerPATCH 140/220 arm64: head.S: ensure visibility of page tables
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
commit 91d57155dc5ab4b311624b7ee570339b6af19ad5 upstream.
After writing the page tables, we use __inval_cache_range to invalidate any stale cache entries. Strongly Ordered memory accesses are not ordered w.r.t. cache maintenance instructions, and hence explicit memory barriers are required to provide this ordering. However, __inval_cache_range was written to be used on Normal Cacheable memory once the MMU and caches are on, and does not have any barriers prior to the DC instructions.
This patch adds a DMB between the page tables being written and the corresponding cachelines being invalidated, ensuring that the invalidation makes the new data visible to subsequent cacheable accesses. A barrier is not required before the prior invalidate as we do not access the page table memory area prior to this, and earlier barriers in preserve_boot_args and set_cpu_boot_mode_flag ensures ordering w.r.t. any stores performed prior to entering Linux.
--- arch/arm64/kernel/head.S | 1 + 1 file changed, 1 insertion(+)
arch/arm64/kernel/head.S +1 -0
@@ -426,6 +426,7 @@ __create_page_tables: */ mov x0, x25 add x1, x26, #SWAPPER_DIR_SIZE + dmb sy bl __inval_cache_range mov lr, x27
Greg Kroah-Hartman
maintainerPATCH 141/220 arm64: Adjust EFI libstub object include logic
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steve Capper <[email protected]>
commit ad08fd494bf00c03ae372e0bbd9cefa37bf608d6 upstream.
Commit f4f75ad5 ("efi: efistub: Convert into static library") introduced a static library for EFI stub, libstub.
The EFI libstub directory is referenced by the kernel build system via a obj subdirectory rule in:drivers/firmware/efi/Makefile
Unfortunately, arm64 also references the EFI libstub via:
libs-$(CONFIG_EFI_STUB) += drivers/firmware/efi/libstub/
If we're unlucky, the kernel build system can enter libstub via two simultaneous threads resulting in build failures such as:
fixdep: error opening depfile: drivers/firmware/efi/libstub/.efi-stub-helper.o.d: No such file or directory scripts/Makefile.build:257: recipe for target 'drivers/firmware/efi/libstub/efi-stub-helper.o' failed make[1]: *** [drivers/firmware/efi/libstub/efi-stub-helper.o] Error 2
Makefile:939: recipe for target 'drivers/firmware/efi/libstub' failed
make: *** [drivers/firmware/efi/libstub] Error 2
make: *** Waiting for unfinished jobs....
This patch adjusts the arm64 Makefile to reference the compiled library explicitly (as is currently done in x86), rather than the directory.
--- arch/arm64/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/Makefile +1 -1
@@ -48,7 +48,7 @@ core-$(CONFIG_KVM) += arch/arm64/kvm/ core-$(CONFIG_XEN) += arch/arm64/xen/ core-$(CONFIG_CRYPTO) += arch/arm64/crypto/ libs-y := arch/arm64/lib/ $(libs-y) -libs-$(CONFIG_EFI_STUB) += drivers/firmware/efi/libstub/ +core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a # Default target when executing plain make KBUILD_IMAGE := Image.gz
Greg Kroah-Hartman
maintainerPATCH 142/220 arm64: apply alternatives for !SMP kernels
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
commit 137650aad96c9594683445e41afa8ac5a2097520 upstream.
Currently we only perform alternative patching for kernels built with CONFIG_SMP, as we call apply_alternatives_all() in smp.c, which is only built for CONFIG_SMP. Thus !SMP kernels may not have necessary alternatives patched in.
This patch ensures that we call apply_alternatives_all() once all CPUs are booted, even for !SMP kernels, by having the smp_init_cpus() stub call this for !SMP kernels via up_late_init. A new wrapper, do_post_cpus_up_work, is added so we can hook other calls here later (e.g. boot mode logging).
--- arch/arm64/Kconfig | 4 ++++ arch/arm64/include/asm/smp_plat.h | 2 ++ arch/arm64/kernel/setup.c | 12 ++++++++++++ arch/arm64/kernel/smp.c | 2 +- 4 files changed, 19 insertions(+), 1 deletion(-)
arch/arm64/Kconfig +4 -0
@@ -470,6 +470,10 @@ config HOTPLUG_CPU source kernel/Kconfig.preempt +config UP_LATE_INIT + def_bool y + depends on !SMP + config HZ int default 100
arch/arm64/include/asm/smp_plat.h +2 -0
@@ -40,4 +40,6 @@ static inline u32 mpidr_hash_size(void)extern u64 __cpu_logical_map[NR_CPUS ];#define cpu_logical_map (cpu) __cpu_logical_map[cpu] +void __init do_post_cpus_up_work (void ); +#endif /* __ASM_SMP_PLAT_H */
arch/arm64/kernel/setup.c +12 -0
@@ -207,6 +207,18 @@ static void __init smp_build_mpidr_hash( }#endif +void __init do_post_cpus_up_work (void ) +{ +apply_alternatives_all (); +} + +#ifdef CONFIG_UP_LATE_INIT +void __init up_late_init (void ) +{ +do_post_cpus_up_work (); +} +#endif /* CONFIG_UP_LATE_INIT */ +static void __init setup_processor (void ) {struct cpu_info *cpu_info;
arch/arm64/kernel/smp.c +1 -1
@@ -309,7 +309,7 @@ void cpu_die(void)void __init smp_cpus_done (unsigned int max_cpus) {pr_info ("SMP: Total of %d processors activated.\n" ,num_online_cpus ()); -apply_alternatives_all (); +do_post_cpus_up_work (); }void __init smp_prepare_boot_cpu (void )
Greg Kroah-Hartman
maintainerPATCH 143/220 arm64: errata: add workaround for cortex-a53 erratum #845719
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
commit 905e8c5dcaa147163672b06fe9dcb5abaacbc711 upstream.
When running a compat (AArch32) userspace on Cortex-A53, a load at EL0 from a virtual address that matches the bottom 32 bits of the virtual address used by a recent load at (AArch64) EL1 might return incorrect data.
This patch works around the issue by writing to the contextidr_el1 register on the exception return path when returning to a 32-bit task. This workaround is patched in at runtime based on the MIDR value of the processor.
--- arch/arm64/Kconfig | 21 +++++++++++++++++++++ arch/arm64/include/asm/cpufeature.h | 3 ++- arch/arm64/kernel/cpu_errata.c | 8 ++++++++ arch/arm64/kernel/entry.S | 20 ++++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-)
arch/arm64/Kconfig +21 -0
@@ -361,6 +361,27 @@ config ARM64_ERRATUM_832075 If unsure, say Y. +config ARM64_ERRATUM_845719 + bool "Cortex-A53: 845719: a load might read incorrect data" + depends on COMPAT + default y + help + This option adds an alternative code sequence to work around ARM + erratum 845719 on Cortex-A53 parts up to r0p4. + + When running a compat (AArch32) userspace on an affected Cortex-A53 + part, a load at EL0 from a virtual address that matches the bottom 32 + bits of the virtual address used by a recent load at (AArch64) EL1 + might return incorrect data. + + The workaround is to write the contextidr_el1 register on exception + return to a 32-bit task. + Please note that this does not necessarily enable the workaround, + as it depends on the alternative framework, which will only patch + the kernel if an affected CPU is detected. + + If unsure, say Y. + endmenu
arch/arm64/include/asm/cpufeature.h +2 -1
@@ -23,8 +23,9 @@#define ARM64_WORKAROUND_CLEAN_CACHE 0#define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE 1 +#define ARM64_WORKAROUND_845719 2 -#define ARM64_NCAPS 2 +#define ARM64_NCAPS 3#ifndef __ASSEMBLY__
arch/arm64/kernel/cpu_errata.c +8 -0
@@ -92,6 +92,14 @@ struct arm64_cpu_capabilities arm64_erra (1 << MIDR_VARIANT_SHIFT) | 2), },#endif +#ifdef CONFIG_ARM64_ERRATUM_845719 + { +/* Cortex-A53 r0p[01234] */ + .desc = "ARM erratum 845719", + .capability = ARM64_WORKAROUND_845719, + MIDR_RANGE(MIDR_CORTEX_A53, 0x00, 0x04), + }, +#endif { } };
arch/arm64/kernel/entry.S +20 -0
@@ -21,8 +21,10 @@ #include <linux/init.h> #include <linux/linkage.h> +#include <asm/alternative-asm.h> #include <asm/assembler.h> #include <asm/asm-offsets.h> +#include <asm/cpufeature.h> #include <asm/errno.h> #include <asm/esr.h> #include <asm/thread_info.h>
@@ -120,6 +122,24 @@ ct_user_enter ldr x23, [sp, #S_SP] // load return stack pointer msr sp_el0, x23 + +#ifdef CONFIG_ARM64_ERRATUM_845719 + alternative_insn \ + "nop", \ + "tbz x22, #4, 1f", \ + ARM64_WORKAROUND_845719 +#ifdef CONFIG_PID_IN_CONTEXTIDR + alternative_insn \ + "nop; nop", \ + "mrs x29, contextidr_el1; msr contextidr_el1, x29; 1:", \ + ARM64_WORKAROUND_845719 +#else + alternative_insn \ + "nop", \ + "msr contextidr_el1, xzr; 1:", \ + ARM64_WORKAROUND_845719 +#endif +#endif .endif msr elr_el1, x21 // set up the return data msr spsr_el1, x22
Greg Kroah-Hartman
maintainerPATCH 144/220 powerpc/powernv: Dont map M64 segments using M32DT
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gavin Shan <[email protected]>
commit 027fa02f84e851e21daffdf8900d6117071890f8 upstream.
If M64 has been supported, the prefetchable 64-bits memory resources shouldn't be mapped to the corresponding PE# via M32DT. Unfortunately, we're doing that in pnv_ioda_setup_pe_seg() wrongly. The issue was introduced by commit 262af55 ("powerpc/powernv: Enable M64 aperatus for PHB3"). The patch fixes the issue by simply skipping M64 resources when updating to M32DT.
--- arch/powerpc/platforms/powernv/pci-ioda.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/powerpc/platforms/powernv/pci-ioda.c +2 -1
@@ -1777,7 +1777,8 @@ static void pnv_ioda_setup_pe_seg(struct region.start += phb->ioda.io_segsize; index++; } - }else if (res->flags &IORESOURCE_MEM ) { + }else if ((res->flags &IORESOURCE_MEM ) && + !pnv_pci_is_mem_pref_64 (res->flags)) { region.start = res->start - hose->mem_offset[0 ] - phb->ioda.m32_pci_base;
Greg Kroah-Hartman
maintainerPATCH 145/220 powerpc, jump_label: Include linux/jump_label.h to get HAVE_JUMP_LABEL define
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Blanchard <[email protected]>
commit 58995a9a5b292458f94a2356b8c878230fa56fe0 upstream.
Commit 1bc9e47aa8e4 ("powerpc/jump_label: Use HAVE_JUMP_LABEL") converted uses of CONFIG_JUMP_LABEL to HAVE_JUMP_LABEL in some assembly files.
HAVE_JUMP_LABEL is defined in linux/jump_label.h, so we need to include this or we always get the non jump label fallback code.
--- arch/powerpc/platforms/powernv/opal-wrappers.S | 2 +- arch/powerpc/platforms/pseries/hvCall.S | 2 +- arch/powerpc/platforms/pseries/lpar.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/platforms/powernv/opal-wrappers.S +1 -1
@@ -9,11 +9,11 @@ * 2 of the License, or (at your option) any later version. */ +#include <linux/jump_label.h> #include <asm/ppc_asm.h> #include <asm/hvcall.h> #include <asm/asm-offsets.h> #include <asm/opal.h> -#include <asm/jump_label.h> .section ".text"
arch/powerpc/platforms/pseries/hvCall.S +1 -1
@@ -7,12 +7,12 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ +#include <linux/jump_label.h> #include <asm/hvcall.h> #include <asm/processor.h> #include <asm/ppc_asm.h> #include <asm/asm-offsets.h> #include <asm/ptrace.h> -#include <asm/jump_label.h> .section ".text"
arch/powerpc/platforms/pseries/lpar.c +1 -1
@@ -26,7 +26,7 @@#include <linux/dma-mapping.h> #include <linux/console.h> #include <linux/export.h> -#include <linux/static_key.h> +#include <linux/jump_label.h> #include <asm/processor.h> #include <asm/mmu.h> #include <asm/page.h>
Greg Kroah-Hartman
maintainerPATCH 146/220 powerpc: Fix missing L2 cache size in /sys/devices/system/cpu
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Olson <[email protected]>
commit f7e9e358362557c3aa2c1ec47490f29fe880a09e upstream.
This problem appears to have been introduced in 2.6.29 by commit 93197a36a9c1 "Rewrite sysfs processor cache info code".
This caused lscpu to error out on at least e500v2 devices, eg:
error: cannot open /sys/devices/system/cpu/cpu0/cache/index2/size: No such file or directory
Some embedded powerpc systems use cache-size in DTS for the unified L2 cache size, not d-cache-size, so we need to allow for both DTS names. Added a new CACHE_TYPE_UNIFIED_D cache_type_info structure to handle this.
--- arch/powerpc/kernel/cacheinfo.c | 44 ++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-)
arch/powerpc/kernel/cacheinfo.c +34 -10
@@ -61,12 +61,22 @@ struct cache_type_info { };/* These are used to index the cache_type_info array. */ -#define CACHE_TYPE_UNIFIED 0 -#define CACHE_TYPE_INSTRUCTION 1 -#define CACHE_TYPE_DATA 2 +#define CACHE_TYPE_UNIFIED 0/* cache-size, cache-block-size, etc. */ +#define CACHE_TYPE_UNIFIED_D 1/* d-cache-size, d-cache-block-size, etc */ +#define CACHE_TYPE_INSTRUCTION 2 +#define CACHE_TYPE_DATA 3static const struct cache_type_info cache_type_info[] = { { +/* Embedded systems that use cache-size, cache-block-size, +* etc. for the Unified (typically L2) cache. */ + .name ="Unified" , + .size_prop ="cache-size" , + .line_size_props = {"cache-line-size" , +"cache-block-size" , }, + .nr_sets_prop ="cache-sets" , + }, + {/* PowerPC Processor binding says the [di]-cache-* * must be equal on unified caches, so just use * d-cache properties. */
@@ -293,7 +303,8 @@ static struct cache *cache_find_first_si {struct cache *iter; -if (cache->type ==CACHE_TYPE_UNIFIED ) +if (cache->type ==CACHE_TYPE_UNIFIED || + cache->type ==CACHE_TYPE_UNIFIED_D )return cache;list_for_each_entry (iter, &cache_list, list)
@@ -324,16 +335,29 @@ static bool cache_node_is_unified(constreturn of_get_property (np,"cache-unified" ,NULL ); } -static struct cache *cache_do_one_devnode_unified (struct device_node *node, -int level) +/* +* Unified caches can have two different sets of tags. Most embedded +* use cache-size, etc. for the unified cache size, but open firmware systems +* use d-cache-size, etc. Check on initialization for which type we have, and +* return the appropriate structure type. Assume it's embedded if it isn't +* open firmware. If it's yet a 3rd type, then there will be missing entries +* in /sys/devices/system/cpu/cpu0/cache/index2/, and this code will need +* to be extended further. +*/ +static int cache_is_unified_d (const struct device_node *np) { -struct cache *cache; +return of_get_property (np, + cache_type_info[CACHE_TYPE_UNIFIED_D ].size_prop,NULL ) ? +CACHE_TYPE_UNIFIED_D :CACHE_TYPE_UNIFIED ; +} +/* +*/ +static struct cache *cache_do_one_devnode_unified (struct device_node *node,int level) +{pr_debug ("creating L%d ucache for %s\n" , level, node->full_name); - cache =new_cache (CACHE_TYPE_UNIFIED , level, node); - -return cache; +return new_cache (cache_is_unified_d (node), level, node); } static struct cache *cache_do_one_devnode_split(struct device_node *node,
Greg Kroah-Hartman
maintainerPATCH 147/220 powerpc/cell: Fix crash in iic_setup_cpu() after per_cpu changes
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit b0dd00addc5035f87ec9c5820dacc1ebc7fcb3e6 upstream.
The conversion from __get_cpu_var() to this_cpu_ptr() in iic_setup_cpu() is wrong. It causes an oops at boot.
We need the per-cpu address of struct cpu_iic, not cpu_iic.regs->prio.
Sparse noticed this, because we pass a non-iomem pointer to out_be64(), but we obviously don't check the sparse results often enough.
--- arch/powerpc/platforms/cell/interrupt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/cell/interrupt.c +1 -1
@@ -163,7 +163,7 @@ static unsigned int iic_get_irq(void)void iic_setup_cpu (void ) { -out_be64 (this_cpu_ptr (&cpu_iic.regs->prio),0xff ); +out_be64 (&this_cpu_ptr (&cpu_iic)->regs->prio,0xff ); }u8 iic_get_target_id (int cpu)
Greg Kroah-Hartman
maintainerPATCH 148/220 powerpc/cell: Fix cell iommu after it_page_shift changes
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 7261b956b276aa97fbf60d00f1d7717d2ea6ee78 upstream.
The patch to add it_page_shift incorrectly changed the increment of uaddr to use it_page_shift, rather then (1 << it_page_shift).
This broke booting on at least some Cell blades, as the iommu was basically non-functional.
--- arch/powerpc/platforms/cell/iommu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/cell/iommu.c +1 -1
@@ -197,7 +197,7 @@ static int tce_build_cell(struct iommu_t io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); -for (i =0 ; i < npages; i++, uaddr += tbl->it_page_shift) +for (i =0 ; i < npages; i++, uaddr += (1 << tbl->it_page_shift)) io_pte[i] = base_pte | (__pa (uaddr) & CBE_IOPTE_RPN_Mask);mb ();
Greg Kroah-Hartman
maintainerPATCH 149/220 ASoC: cs4271: Increase delay time after reset
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pascal Huerst <[email protected]>
commit 74ff960222d90999508b4ba0d3449f796695b6d5 upstream.
The delay time after a reset in the codec probe callback was too short, and did not work on certain hw because the codec needs more time to power on. This increases the delay time from 1us to 1ms.
--- sound/soc/codecs/cs4271.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/codecs/cs4271.c +2 -2
@@ -561,10 +561,10 @@ static int cs4271_codec_probe(struct sndif (gpio_is_valid (cs4271->gpio_nreset)) {/* Reset codec */ gpio_direction_output (cs4271->gpio_nreset,0 ); -udelay (1 ); +mdelay (1 );gpio_set_value (cs4271->gpio_nreset,1 );/* Give the codec time to wake up */ -udelay (1 ); +mdelay (1 ); } ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2,
Greg Kroah-Hartman
maintainerPATCH 150/220 ASoC: wm8741: Fix rates constraints values
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergej Sawazki <[email protected]>
commit 8787041d9bb832b9449b1eb878cedcebce42c61a upstream.
The WM8741 DAC supports the following typical audio sampling rates:
44.1kHz, 88.2kHz, 176.4kHz (eg: with a master clock of 22.5792MHz) 32kHz, 48kHz, 96kHz, 192kHz (eg: with a master clock of 24.576MHz)
For the rates lists, we should use 82000 instead of 88235, 176400 instead of 1764000 and 192000 instead of 19200 (seems to be a typo).
--- sound/soc/codecs/wm8741.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
sound/soc/codecs/wm8741.c +4 -4
@@ -123,7 +123,7 @@ static struct { };static const unsigned int rates_11289[] = { -44100 ,88235 , +44100 ,88200 , };static const struct snd_pcm_hw_constraint_list constraints_11289 = {
@@ -150,7 +150,7 @@ static const struct snd_pcm_hw_constrain };static const unsigned int rates_16934[] = { -44100 ,88235 , +44100 ,88200 , };static const struct snd_pcm_hw_constraint_list constraints_16934 = {
@@ -168,7 +168,7 @@ static const struct snd_pcm_hw_constrain };static const unsigned int rates_22579[] = { -44100 ,88235 ,1764000 +44100 ,88200 ,176400 };static const struct snd_pcm_hw_constraint_list constraints_22579 = {
@@ -186,7 +186,7 @@ static const struct snd_pcm_hw_constrain };static const unsigned int rates_36864[] = { -48000 ,96000 ,19200 +48000 ,96000 ,192000 };static const struct snd_pcm_hw_constraint_list constraints_36864 = {
Greg Kroah-Hartman
maintainerPATCH 151/220 ASoC: davinci-evm: drop un-necessary remove function
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manish Badarkhe <[email protected]>
commit a57069e33fbc6625f39e1b09c88ea44629a35206 upstream.
As davinci card gets registered using 'devm_' api there is no need to unregister the card in 'remove' function.
Hence drop the 'remove' function.
--- sound/soc/davinci/davinci-evm.c | 10 ---------- 1 file changed, 10 deletions(-)
sound/soc/davinci/davinci-evm.c +0 -10
@@ -425,18 +425,8 @@ static int davinci_evm_probe(struct platreturn ret; } -static int davinci_evm_remove (struct platform_device *pdev) -{ -struct snd_soc_card *card =platform_get_drvdata (pdev); - -snd_soc_unregister_card (card); - -return 0 ; -} -static struct platform_driver davinci_evm_driver = { .probe = davinci_evm_probe, - .remove = davinci_evm_remove, .driver = { .name ="davinci_evm" , .pm = &snd_soc_pm_ops,
Greg Kroah-Hartman
maintainerPATCH 152/220 ASoC: pcm512x: Add Analogue prefix to analogue volume controls
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Howard Mitchell <[email protected]>
commit 4d9b13c7cc803fbde59d7e998f7de2b9a2101c7e upstream.
This is to ensure that 'alsactl restore' does not apply default initialisation as the chip reset defaults are preferred.
--- sound/soc/codecs/pcm512x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/codecs/pcm512x.c +2 -2
@@ -304,9 +304,9 @@ static const struct soc_enum pcm512x_vedstatic const struct snd_kcontrol_new pcm512x_controls[] = {SOC_DOUBLE_R_TLV ("Digital Playback Volume" , PCM512x_DIGITAL_VOLUME_2, PCM512x_DIGITAL_VOLUME_3,0 ,255 ,1 , digital_tlv), -SOC_DOUBLE_TLV ("Playback Volume" , PCM512x_ANALOG_GAIN_CTRL, +SOC_DOUBLE_TLV ("Analogue Playback Volume" , PCM512x_ANALOG_GAIN_CTRL, PCM512x_LAGN_SHIFT, PCM512x_RAGN_SHIFT,1 ,1 , analog_tlv), -SOC_DOUBLE_TLV ("Playback Boost Volume" , PCM512x_ANALOG_GAIN_BOOST, +SOC_DOUBLE_TLV ("Analogue Playback Boost Volume" , PCM512x_ANALOG_GAIN_BOOST, PCM512x_AGBL_SHIFT, PCM512x_AGBR_SHIFT,1 ,0 , boost_tlv),SOC_DOUBLE ("Digital Playback Switch" , PCM512x_MUTE, PCM512x_RQML_SHIFT, PCM512x_RQMR_SHIFT,1 ,1 ),
Greg Kroah-Hartman
maintainerPATCH 153/220 ASoC: pcm512x: Fix divide by zero issue
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Howard Mitchell <[email protected]>
commit f073faa73626f41db7050a69edd5074c53ce6d6c upstream.
If den=1 and pllin_rate>20MHz then den and num are adjusted to 0 causing a divide by zero error a few lines further on. Therefore this patch correctly scales num and den such that pllin_rate/den < 20MHz as required in the device data sheet.
--- sound/soc/codecs/pcm512x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/codecs/pcm512x.c +2 -2
@@ -576,8 +576,8 @@ static int pcm512x_find_pll_coeff(struct/* pllin_rate / P (or here, den) cannot be greater than 20 MHz */ if (pllin_rate / den >20000000 && num <8 ) { - num *=20000000 / (pllin_rate / den); - den *=20000000 / (pllin_rate / den); + num *=DIV_ROUND_UP (pllin_rate / den,20000000 ); + den *=DIV_ROUND_UP (pllin_rate / den,20000000 ); }dev_dbg (dev,"num / den = %lu / %lu\n" , num, den);
Greg Kroah-Hartman
maintainerPATCH 154/220 ACPICA: Utilities: split IO address types from data type models.
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lv Zheng <[email protected]>
commit 2b8760100e1de69b6ff004c986328a82947db4ad upstream.
ACPICA commit aacf863cfffd46338e268b7415f7435cae93b451
It is reported that on a physically 64-bit addressed machine, 32-bit kernel can trigger crashes in accessing the memory regions that are beyond the 32-bit boundary. The region field's start address should still be 32-bit compliant, but after a calculation (adding some offsets), it may exceed the 32-bit boundary. This case is rare and buggy, but there are real BIOSes leaked with such issues (see References below).
This patch fixes this gap by always defining IO addresses as 64-bit, and allows OSPMs to optimize it for a real 32-bit machine to reduce the size of the internal objects.
Internal acpi_physical_address usages in the structures that can be fixed by this change include:
1. struct acpi_object_region:
acpi_physical_address address;
2. struct acpi_address_range:
acpi_physical_address start_address;
acpi_physical_address end_address;
3. struct acpi_mem_space_context;
acpi_physical_address address;
4. struct acpi_table_desc
acpi_physical_address address;See known issues 1 for other usages.
Note that acpi_io_address which is used for ACPI_PROCESSOR may also suffer from same problem, so this patch changes it accordingly.
For iasl, it will enforce acpi_physical_address as 32-bit to generate 32-bit OSPM compatible tables on 32-bit platforms, we need to define ACPI_32BIT_PHYSICAL_ADDRESS for it in acenv.h.
Known issues:
1. Cleanup of mapped virtual address
In struct acpi_mem_space_context, acpi_physical_address is used as a virtual address:
acpi_physical_address mapped_physical_address;
It is better to introduce acpi_virtual_address or use acpi_size instead. This patch doesn't make such a change. Because this should be done along with a change to acpi_os_map_memory()/acpi_os_unmap_memory(). There should be no functional problem to leave this unchanged except that only this structure is enlarged unexpectedly.
Reference: https://bugzilla.kernel.org/show_bug.cgi?id=87971
Reference: https://bugzilla.kernel.org/show_bug.cgi?id=79501
--- include/acpi/actypes.h | 20 ++++++++++++++++++++ include/acpi/platform/acenv.h | 1 + 2 files changed, 21 insertions(+)
include/acpi/actypes.h +20 -0
@@ -199,9 +199,29 @@ typedef int s32;typedef s32 acpi_native_int ;typedef u32 acpi_size ; + +#ifdef ACPI_32BIT_PHYSICAL_ADDRESS + +/* +* OSPMs can define this to shrink the size of the structures for 32-bit +* none PAE environment. ASL compiler may always define this to generate +* 32-bit OSPM compliant tables. +*/ typedef u32 acpi_io_address ;typedef u32 acpi_physical_address ; +#else /* ACPI_32BIT_PHYSICAL_ADDRESS */ + +/* +* It is reported that, after some calculations, the physical addresses can +* wrap over the 32-bit boundary on 32-bit PAE environment. +* https://bugzilla.kernel.org/show_bug.cgi?id=87971 +*/ +typedef u64 acpi_io_address ; +typedef u64 acpi_physical_address ; + +#endif /* ACPI_32BIT_PHYSICAL_ADDRESS */ +#define ACPI_MAX_PTR ACPI_UINT32_MAX#define ACPI_SIZE_MAX ACPI_UINT32_MAX
include/acpi/platform/acenv.h +1 -0
@@ -76,6 +76,7 @@#define ACPI_LARGE_NAMESPACE_NODE #define ACPI_DATA_TABLE_DISASSEMBLY #define ACPI_SINGLE_THREADED +#define ACPI_32BIT_PHYSICAL_ADDRESS #endif /* acpi_exec configuration. Multithreaded with full AML debugger */
Greg Kroah-Hartman
maintainerPATCH 155/220 ACPICA: Tables: Dont release ACPI_MTX_TABLES in acpi_tb_install_standard_table().
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Octavian Purdila <[email protected]>
commit 77ddc2fe08329e375505bc36a3df3233fe57317b upstream.
ACPICA commit c70434d4da13e65b6163c79a5aa16b40193631c7
ACPI_MTX_TABLES is acquired and released by the callers of acpi_tb_install_standard_table() so releasing it in the function itself is causing the following error in Linux kernel if the table is reloaded:
ACPI Error: Mutex [0x2] is not acquired, cannot release (20141107/utmutex-321)
Call Trace: [<ffffffff81b0bd48>] dump_stack+0x4f/0x7b [<ffffffff81546bf5>] acpi_ut_release_mutex+0x47/0x67 [<ffffffff81544357>] acpi_load_table+0x73/0xcb
--- drivers/acpi/acpica/tbinstal.c | 1 - 1 file changed, 1 deletion(-)
drivers/acpi/acpica/tbinstal.c +0 -1
@@ -346,7 +346,6 @@ acpi_tb_install_standard_table(acpi_phys*/ acpi_tb_uninstall_table (&new_table_desc); *table_index = i; - (void )acpi_ut_release_mutex (ACPI_MTX_TABLES );return_ACPI_STATUS (AE_OK ); } }
Greg Kroah-Hartman
maintainerPATCH 156/220 ACPICA: Store GPE register enable masks upfront
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Rafael J. Wysocki" <[email protected]>
commit 0ee0d34985ceffe4036319e1e46df8bff591b9e3 upstream.
It is reported that ACPI interrupts do not work any more on Dell Latitude D600 after commit c50f13c672df (ACPICA: Save current masks of enabled GPEs after enable register writes). The problem turns out to be related to the fact that the enable_mask and enable_for_run GPE bit masks are not in sync (in the absence of any system suspend/resume events) for at least one GPE register on that machine.
Address this problem by writing the enable_for_run mask into enable_mask as soon as enable_for_run is updated instead of doing that only after the subsequent register write has succeeded. For consistency, update acpi_hw_gpe_enable_write() to store the bit mask to be written into the GPE register in enable_mask unconditionally before the write.
Since the ACPI_GPE_SAVE_MASK flag is not necessary any more after that, drop it along with the symbols depending on it.
--- drivers/acpi/acpica/evgpe.c | 5 +++-- drivers/acpi/acpica/hwgpe.c | 11 ++++------- include/acpi/actypes.h | 4 ---- 3 files changed, 7 insertions(+), 13 deletions(-)
drivers/acpi/acpica/evgpe.c +3 -2
@@ -92,6 +92,7 @@ acpi_ev_update_gpe_enable_mask(struct acACPI_SET_BIT (gpe_register_info->enable_for_run, (u8 )register_bit); } + gpe_register_info->enable_mask = gpe_register_info->enable_for_run;return_ACPI_STATUS (AE_OK ); }
@@ -123,7 +124,7 @@ acpi_status acpi_ev_enable_gpe(struct ac/* Enable the requested GPE */ - status =acpi_hw_low_set_gpe (gpe_event_info,ACPI_GPE_ENABLE_SAVE ); + status =acpi_hw_low_set_gpe (gpe_event_info,ACPI_GPE_ENABLE );return_ACPI_STATUS (status); }
@@ -202,7 +203,7 @@ acpi_ev_remove_gpe_reference(struct acpiif (ACPI_SUCCESS (status)) { status =acpi_hw_low_set_gpe (gpe_event_info, -ACPI_GPE_DISABLE_SAVE ); +ACPI_GPE_DISABLE ); }if (ACPI_FAILURE (status)) {
drivers/acpi/acpica/hwgpe.c +4 -7
@@ -89,6 +89,8 @@ u32 acpi_hw_get_gpe_register_bit(struct* RETURN: Status * * DESCRIPTION: Enable or disable a single GPE in the parent enable register. +* The enable_mask field of the involved GPE register must be +* updated by the caller if necessary. * ******************************************************************************/
@@ -119,7 +121,7 @@ acpi_hw_low_set_gpe(struct acpi_gpe_even/* Set or clear just the bit that corresponds to this GPE */ register_bit =acpi_hw_get_gpe_register_bit (gpe_event_info); -switch (action & ~ACPI_GPE_SAVE_MASK ) { +switch (action) {case ACPI_GPE_CONDITIONAL_ENABLE :/* Only enable if the corresponding enable_mask bit is set */
@@ -149,9 +151,6 @@ acpi_hw_low_set_gpe(struct acpi_gpe_even/* Write the updated enable mask */ status =acpi_hw_write (enable_mask, &gpe_register_info->enable_address); -if (ACPI_SUCCESS (status) && (action &ACPI_GPE_SAVE_MASK )) { - gpe_register_info->enable_mask = (u8 )enable_mask; - }return (status); }
@@ -286,10 +285,8 @@ acpi_hw_gpe_enable_write(u8 enable_mask, {acpi_status status; + gpe_register_info->enable_mask = enable_mask; status =acpi_hw_write (enable_mask, &gpe_register_info->enable_address); -if (ACPI_SUCCESS (status)) { - gpe_register_info->enable_mask = enable_mask; - }return (status); }
include/acpi/actypes.h +0 -4
@@ -756,10 +756,6 @@ typedef u32 acpi_event_status;#define ACPI_GPE_ENABLE 0#define ACPI_GPE_DISABLE 1#define ACPI_GPE_CONDITIONAL_ENABLE 2 -#define ACPI_GPE_SAVE_MASK 4 - -#define ACPI_GPE_ENABLE_SAVE (ACPI_GPE_ENABLE | ACPI_GPE_SAVE_MASK) -#define ACPI_GPE_DISABLE_SAVE (ACPI_GPE_DISABLE | ACPI_GPE_SAVE_MASK)/* * GPE info flags - Per GPE
Greg Kroah-Hartman
maintainerPATCH 157/220 ACPI / scan: Annotate physical_node_lock in acpi_scan_is_offline()
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Rafael J. Wysocki" <[email protected]>
commit 4c533c801d1c9b5c38458a0e7516e0cf50643782 upstream.
acpi_scan_is_offline() may be called under the physical_node_lock lock of the given device object's parent, so prevent lockdep from complaining about that by annotating that instance with SINGLE_DEPTH_NESTING.
--- drivers/acpi/scan.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/acpi/scan.c +5 -1
@@ -298,7 +298,11 @@ bool acpi_scan_is_offline(struct acpi_destruct acpi_device_physical_node *pn;bool offline = true; -mutex_lock (&adev->physical_node_lock); +/* +* acpi_container_offline() calls this for all of the container's +* children under the container's physical_node_lock lock. +*/ +mutex_lock_nested (&adev->physical_node_lock,SINGLE_DEPTH_NESTING );list_for_each_entry (pn, &adev->physical_node_list, node)if (device_supports_offline (pn->dev) && !pn->dev->offline) {
Greg Kroah-Hartman
maintainerPATCH 158/220 xtensa: xtfpga: fix hardware lockup caused by LCD driver
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Filippov <[email protected]>
commit 4949009eb8d40a441dcddcd96e101e77d31cf1b2 upstream.
LCD driver is always built for the XTFPGA platform, but its base address is not configurable, and is wrong for ML605/KC705. Its initialization locks up KC705 board hardware.
Make the whole driver optional, and its base address and bus width configurable. Implement 4-bit bus access method.
--- arch/xtensa/Kconfig | 30 ++++++++ arch/xtensa/platforms/xtfpga/Makefile | 3 arch/xtensa/platforms/xtfpga/include/platform/hardware.h | 3 arch/xtensa/platforms/xtfpga/include/platform/lcd.h | 15 ++++ arch/xtensa/platforms/xtfpga/lcd.c | 55 +++++++++------ 5 files changed, 81 insertions(+), 25 deletions(-)
arch/xtensa/Kconfig +30 -0
@@ -428,6 +428,36 @@ config DEFAULT_MEM_SIZE If unsure, leave the default value here. +config XTFPGA_LCD + bool "Enable XTFPGA LCD driver" + depends on XTENSA_PLATFORM_XTFPGA + default n + help + There's a 2x16 LCD on most of XTFPGA boards, kernel may output + progress messages there during bootup/shutdown. It may be useful + during board bringup. + + If unsure, say N. + +config XTFPGA_LCD_BASE_ADDR + hex "XTFPGA LCD base address" + depends on XTFPGA_LCD + default "0x0d0c0000" + help + Base address of the LCD controller inside KIO region. + Different boards from XTFPGA family have LCD controller at different + addresses. Please consult prototyping user guide for your board for + the correct address. Wrong address here may lead to hardware lockup. + +config XTFPGA_LCD_8BIT_ACCESS + bool "Use 8-bit access to XTFPGA LCD" + depends on XTFPGA_LCD + default n + help + LCD may be connected with 4- or 8-bit interface, 8-bit access may + only be used with 8-bit interface. Please consult prototyping user + guide for your board for the correct interface width. + endmenu menu "Executable file formats"
arch/xtensa/platforms/xtfpga/Makefile +2 -1
@@ -6,4 +6,5 @@ # # Note 2! The CFLAGS definitions are in the main makefile... -obj-y = setup.o lcd.o +obj-y += setup.o +obj-$(CONFIG_XTFPGA_LCD) += lcd.o
arch/xtensa/platforms/xtfpga/include/platform/hardware.h +0 -3
@@ -40,9 +40,6 @@/* UART */ #define DUART16552_PADDR (XCHAL_KIO_PADDR + 0x0D050020) -/* LCD instruction and data addresses. */ -#define LCD_INSTR_ADDR ((char *)IOADDR(0x0D040000)) -#define LCD_DATA_ADDR ((char *)IOADDR(0x0D040004))/* Misc. */ #define XTFPGA_FPGAREGS_VADDR IOADDR(0x0D020000)
arch/xtensa/platforms/xtfpga/include/platform/lcd.h +15 -0
@@ -11,10 +11,25 @@#ifndef __XTENSA_XTAVNET_LCD_H#define __XTENSA_XTAVNET_LCD_H +#ifdef CONFIG_XTFPGA_LCD /* Display string STR at position POS on the LCD. */ void lcd_disp_at_pos (char *str,unsigned char pos);/* Shift the contents of the LCD display left or right. */ void lcd_shiftleft (void );void lcd_shiftright (void ); +#else +static inline void lcd_disp_at_pos (char *str,unsigned char pos) +{ +} + +static inline void lcd_shiftleft (void ) +{ +} + +static inline void lcd_shiftright (void ) +{ +} +#endif +#endif
arch/xtensa/platforms/xtfpga/lcd.c +34 -21
107 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 159/220 xtensa: provide __NR_sync_file_range2 instead of __NR_sync_file_range
In reply to Greg Kroah-Hartman4.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Filippov <[email protected]>
commit 01e84c70fe40c8111f960987bcf7f931842e6d07 upstream.
xtensa actually uses sync_file_range2 implementation, so it should define __NR_sync_file_range2 as other architectures that use that function. That fixes userspace interface (that apparently never worked) and avoids special-casing xtensa in libc implementations. See the thread ending at
http://lists.busybox.net/pipermail/uclibc/2015-February/048833.html
for more details.
--- arch/xtensa/include/uapi/asm/unistd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/xtensa/include/uapi/asm/unistd.h +1 -1
@@ -715,7 +715,7 @@ __SYSCALL(323, sys_process_vm_writev, 6) __SYSCALL(324, sys_name_to_handle_at, 5)#define __NR_open_by_handle_at 325 __SYSCALL(325, sys_open_by_handle_at, 3) -#define __NR_sync_file_range 326 +#define __NR_sync_file_range2 326 __SYSCALL(326, sys_sync_file_range2, 6)#define __NR_perf_event_open 327__SYSCALL (327 , sys_perf_event_open,5 )