4.1.5-stable review
Greg Kroah-Hartman
maintainercover 4.1.5-stable review
This is the start of the stable review cycle for the 4.1.5 release. There are 123 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 Aug 10 22:06:48 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.x/stable-review/patch-4.1.5-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.1.5-rc1
Dave Chinner <[email protected]>
xfs: remote attributes need to be considered data
Dave Chinner <[email protected]>
xfs: remote attribute headers contain an invalid LSN
Kamil Dudka <[email protected]>
drm/nouveau/drm/nv04-nv40/instmem: protect access to priv->heap by mutex
Kamil Dudka <[email protected]>
drm/nouveau: hold mutex when calling nouveau_abi16_fini()
Ben Skeggs <[email protected]>
drm/nouveau/kms/nv50-: guard against enabling cursor on disabled heads
Ilia Mirkin <[email protected]>
drm/nouveau/fbcon/nv11-: correctly account for ring space usage
Roland Dreier <[email protected]>
qla2xxx: kill sessions/log out initiator on RSCN and port down events
Kanoj Sarcar <[email protected]>
qla2xxx: fix command initialization in target mode.
Himanshu Madhani <[email protected]>
qla2xxx: Remove msleep in qlt_send_term_exchange
Quinn Tran <[email protected]>
qla2xxx: release request queue reservation.
Saurav Kashyap <[email protected]>
qla2xxx: Fix hardware lock/unlock issue causing kernel panic.
Lukasz Anaczkowski <[email protected]>
intel_pstate: Add get_scaling cpu_defaults param to Knights Landing
Nicholas Bellinger <[email protected]>
iscsi-target: Fix iser explicit logout TX kthread leak
Nicholas Bellinger <[email protected]>
iscsi-target: Fix iscsit_start_kthreads failure OOPs
Nicholas Bellinger <[email protected]>
iscsi-target: Fix use-after-free during TPG session shutdown
Jason Gunthorpe <[email protected]>
IB/ipoib: Fix CONFIG_INFINIBAND_IPOIB_CM
Trond Myklebust <[email protected]>
NFS: Fix a memory leak in nfs_do_recoalesce
Trond Myklebust <[email protected]>
NFSv4: We must set NFS_OPEN_STATE flag in nfs_resync_open_stateid_locked
Andy Shevchenko <[email protected]>
avr32: handle NULL as a valid clock object
Trond Myklebust <[email protected]>
NFS: Don't revalidate the mapping if both size and change attr are up to date
Guenter Roeck <[email protected]>
hwmon: (nct7904) Rename pwm attributes to match hwmon ABI
Guenter Roeck <[email protected]>
hwmon: (nct7802) Fix integer overflow seen when writing voltage limits
Marc-André Lureau <[email protected]>
vhost: actually track log eventfd file
Matt Fleming <[email protected]>
perf/x86/intel/cqm: Return cached counter value from IRQ context
Arnaldo Carvalho de Melo <[email protected]>
perf hists browser: Take the --comm, --dsos, etc filters into account
Ming Lei <[email protected]>
blk-mq: set default timeout as 30 seconds
Peter Hurley <[email protected]>
n_tty: signal and flush atomically
Wengang Wang <[email protected]>
rds: rds_ib_device.refcount overflow
Vineet Gupta <[email protected]>
ARC: Make ARC bitops "safer" (add anti-optimization)
Vineet Gupta <[email protected]>
ARC: Reduce bitops lines of code using macros
Dmitry Skorodumov <[email protected]>
x86/efi: Use all 64 bit of efi_memmap in setup_e820()
Ricardo Neri <[email protected]>
efi: Check for NULL efi kernel parameters
Ard Biesheuvel <[email protected]>
arm64/efi: map the entire UEFI vendor string before reading it
Tony Luck <[email protected]>
efi: Handle memory error structures produced based on old versions of standard
Dave Hansen <[email protected]>
x86/mm: Add parenthesis for TLB tracepoint size calculation
Tomas Winkler <[email protected]>
mei: prevent unloading mei hw modules while the device is opened.
Zhuang Jin Can <[email protected]>
xhci: do not report PLC when link is in internal resume state
Zhuang Jin Can <[email protected]>
xhci: prevent bus_suspend if SS port resuming in phase 1
Zhuang Jin Can <[email protected]>
xhci: report U3 when link is in resume state
Brian Campbell <[email protected]>
xhci: Calculate old endpoints correctly on device reset
Peter Hurley <[email protected]>
serial: core: Fix crashes while echoing when closing
David Jander <[email protected]>
Revert "serial: imx: initialized DMA w/o HW flow enabled"
Oliver Neukum <[email protected]>
usb-storage: ignore ZTE MF 823 card reader in mode 0x1225
Lior Amsalem <[email protected]>
ata: pmp: add quirk for Marvell 4140 SATA PMP
Krzysztof Kozlowski <[email protected]>
regulator: s2mps11: Fix GPIO suspend enable shift wrapping bug
Tejun Heo <[email protected]>
blkcg: fix gendisk reference leak in blkg_conf_prep()
Bernhard Bender <[email protected]>
Input: usbtouchscreen - avoid unresponsive TSC-30 touch screen
Oleksij Rempel <[email protected]>
Input: zforce - don't overwrite the stack
Chris Metcalf <[email protected]>
tile: use free_bootmem_late() for initrd
Sascha Hauer <[email protected]>
spi: imx: Fix small DMA transfers
Sifan Naeem <[email protected]>
spi: img-spfi: fix support for speeds up to 1/4th input clock
NeilBrown <[email protected]>
md/raid1: fix test for 'was read error from last working device'.
Emmanuel Grumbach <[email protected]>
iwlwifi: pcie: prepare the device before accessing it
Liad Kaufman <[email protected]>
iwlwifi: nvm: remove mac address byte swapping in 8000 family
Emmanuel Grumbach <[email protected]>
iwlwifi: mvm: fix antenna selection when BT is active
Antonio Borneo <[email protected]>
HID: cp2112: fix to force single data-report reply
Jingju Hou <[email protected]>
mmc: sdhci-pxav3: fix platform_data is not initialized
Joakim Tjernlund <[email protected]>
mmc: sdhci-esdhc: Make 8BIT bus work
Peng Fan <[email protected]>
mmc: sdhci check parameters before call dma_free_coherent
Kishon Vijay Abraham I <[email protected]>
mmc: omap_hsmmc: Fix DTO and DCRC handling
Alex Williamson <[email protected]>
iommu/vt-d: Fix VM domain ID leak
Steven Rostedt (Red Hat) <[email protected]>
ftrace: Fix breakage of set_ftrace_pid
Eric W. Biederman <[email protected]>
mnt: In detach_mounts detach the appropriate unmounted mount
Eric W. Biederman <[email protected]>
mnt: Clarify and correct the disconnect logic in umount_tree
Uwe Kleine-König <[email protected]>
Subject: pinctrl: imx1-core: Fix debug output in .pin_config_set callback
Tom Hughes <[email protected]>
mac80211: clear subdir_stations when removing debugfs
Pankaj Dev <[email protected]>
drivers: clk: st: Incorrect register offset used for lock_status
Gabriel Fernandez <[email protected]>
drivers: clk: st: Fix mux bit-setting for Cortex A9 clocks
Giuseppe Cavallaro <[email protected]>
drivers: clk: st: Fix flexgen lock init
Seymour, Shane M <[email protected]>
st: null pointer dereference panic caused by use after kref_put by st_open
Tony Battersby <[email protected]>
scsi: fix memory leak with scsi-mq
Jens Axboe <[email protected]>
scsi: fix host max depth checking for the 'queue_depth' sysfs interface
Marc Zyngier <[email protected]>
irqchip/gicv3-its: Fix mapping of LPIs to collections
Mike Snitzer <[email protected]>
Revert "dm: only run the queue on completion if congested or no requests pending"
Peter Zijlstra <[email protected]>
x86, perf: Fix static_key bug in load_mm_cr4()
Takashi Iwai <[email protected]>
ALSA: hda - Fix MacBook Pro 5,2 quirk
Yao-Wen Mao <[email protected]>
ALSA: usb-audio: add dB range mapping for some devices
Takashi Iwai <[email protected]>
ALSA: hda - Apply a fixup to Dell Vostro 5480
Takashi Iwai <[email protected]>
ALSA: hda - Apply fixup for another Toshiba Satellite S50D
David Henningsson <[email protected]>
ALSA: hda - Add headset mic pin quirk for a Dell device
Aaron Plattner <[email protected]>
ALSA: hda - Add new GPU codec ID 0x10de007d to snd-hda
Maruthi Srinivas Bayyavarapu <[email protected]>
ALSA: hda: add new AMD PCI IDs with proper driver caps
Mateusz Sylwestrzak <[email protected]>
ALSA: hda - Add headset mic support for Acer Aspire V5-573G
Takashi Iwai <[email protected]>
ALSA: pcm: Fix lockdep warning with nonatomic PCM ops
Takashi Iwai <[email protected]>
ALSA: line6: Fix -EBUSY error during active monitoring
Dominic Sacré <[email protected]>
ALSA: usb-audio: Add MIDI support for Steinberg MI2/MI4
Thomas Gleixner <[email protected]>
genirq: Prevent resend to interrupts marked IRQ_NESTED_THREAD
Haggai Eran <[email protected]>
dma-debug: skip debug_dma_assert_idle() when disabled
Mike Snitzer <[email protected]>
bio integrity: do not assume bio_integrity_pool exists if bioset exists
Michal Marek <[email protected]>
kbuild: Allow arch Makefiles to override {cpp,ld,c}flags
Alexey Brodkin <[email protected]>
ARC: make sure instruction_pointer() returns unsigned value
Vineet Gupta <[email protected]>
ARC: Override toplevel default -O2 with -O3
Heiko Carstens <[email protected]>
s390/cachinfo: add missing facility check to init_cache_level()
Michael Holzheu <[email protected]>
s390/bpf: clear correct BPF accumulator register
Heiko Carstens <[email protected]>
s390/nmi: fix vector register corruption
Martin Schwidefsky <[email protected]>
s390/sclp: clear upper register halves in _sclp_print_early
Heiko Carstens <[email protected]>
s390/process: fix sfpc inline assembly
Vutla, Lokesh <[email protected]>
crypto: omap-des - Fix unmapping of dma channels
Andrey Ryabinin <[email protected]>
x86/kasan: Fix boot crash on AMD processors
Andrey Ryabinin <[email protected]>
x86/kasan: Flush TLBs after switching CR3
Alexander Popov <[email protected]>
x86/kasan: Fix KASAN shadow region page tables
Andrey Ryabinin <[email protected]>
x86/init: Clear 'init_level4_pgt' earlier
Al Viro <[email protected]>
freeing unlinked file indefinitely delayed
Stefan Agner <[email protected]>
can: mcp251x: fix resume when device is down
Sergei Shtylyov <[email protected]>
can: rcar_can: print signed IRQ #
J.D. Schroeder <[email protected]>
can: c_can: Fix default pinmux glitch at init
Sergei Shtylyov <[email protected]>
can: rcar_can: fix IRQ check
Oliver Hartkopp <[email protected]>
can: replace timestamp as unique skb attribute
Markos Chandras <[email protected]>
MIPS: fpu.h: Allow 64-bit FPU on a 64-bit MIPS R6 CPU
Paul Burton <[email protected]>
MIPS: Require O32 FP64 support for MIPS64 with O32 compat
Markos Chandras <[email protected]>
MIPS: c-r4k: Fix cache flushing for MT cores
Markos Chandras <[email protected]>
MIPS: Fix erroneous JR emulation for MIPS R6
Lucas Stach <[email protected]>
ARM: imx6: gpc: always enable PU domain if CONFIG_PM is not set
Marek Szyprowski <[email protected]>
ARM: 8404/1: dma-mapping: fix off-by-one error in bitmap size check
Roger Quadros <[email protected]>
ARM: dts: am57xx-beagle-x15: Provide supply for usb2_phy2
Roger Quadros <[email protected]>
ARM: dts: dra7x-evm: Prevent glitch on DCAN1 pinmux
Robert Jarzmik <[email protected]>
ARM: pxa: fix dm9000 platform data regression
Christophe Jaillet <[email protected]>
parisc: mm: Fix a memory leak related to pmd not attached to the pgd
John David Anglin <[email protected]>
parisc: Fix some PTE/TLB race conditions and optimize __flush_tlb_range based on timing results
Dmitry Torokhov <[email protected]>
Revert "Input: synaptics - allocate 3 slots to keep stability in image sensors"
Shreyas B. Prabhu <[email protected]>
powerpc/powernv: Fix race in updating core_idle_state
Daniel Axtens <[email protected]>
cxl: Check if afu is not null in cxl_slbia
Ian Munsie <[email protected]>
cxl: Fix off by one error allowing subsequent mmap page to be accessed
-------------
Diffstat:
Documentation/hwmon/nct7904 | 4 +- Documentation/kbuild/makefiles.txt | 8 + Makefile | 13 +- arch/arc/Makefile | 3 +- arch/arc/include/asm/bitops.h | 468 ++++++--------------- arch/arc/include/asm/ptrace.h | 2 +- arch/arm/boot/dts/am57xx-beagle-x15.dts | 4 + arch/arm/boot/dts/dra7-evm.dts | 5 +- arch/arm/boot/dts/dra72-evm.dts | 5 +- arch/arm/mach-imx/gpc.c | 27 +- arch/arm/mach-pxa/capc7117.c | 3 + arch/arm/mach-pxa/cm-x2xx.c | 3 + arch/arm/mach-pxa/cm-x300.c | 2 + arch/arm/mach-pxa/colibri-pxa270.c | 3 + arch/arm/mach-pxa/em-x270.c | 2 + arch/arm/mach-pxa/icontrol.c | 3 + arch/arm/mach-pxa/trizeps4.c | 3 + arch/arm/mach-pxa/vpac270.c | 3 + arch/arm/mach-pxa/zeus.c | 2 + arch/arm/mm/dma-mapping.c | 2 +- arch/arm64/kernel/efi.c | 4 +- arch/avr32/mach-at32ap/clock.c | 20 +- arch/mips/Kconfig | 1 + arch/mips/include/asm/fpu.h | 2 +- arch/mips/include/asm/smp.h | 1 + arch/mips/kernel/smp.c | 44 +- arch/mips/math-emu/cp1emu.c | 2 +- arch/mips/mm/c-r4k.c | 14 +- arch/parisc/include/asm/pgalloc.h | 3 +- arch/parisc/include/asm/pgtable.h | 55 ++- arch/parisc/include/asm/tlbflush.h | 53 +-- arch/parisc/kernel/cache.c | 105 +++-- arch/parisc/kernel/entry.S | 163 ++++--- arch/parisc/kernel/traps.c | 4 - arch/powerpc/kernel/idle_power7.S | 31 +- arch/s390/include/asm/ctl_reg.h | 5 +- arch/s390/kernel/cache.c | 2 + arch/s390/kernel/nmi.c | 51 ++- arch/s390/kernel/process.c | 2 +- arch/s390/kernel/sclp.S | 4 + arch/s390/net/bpf_jit_comp.c | 14 +- arch/tile/kernel/setup.c | 2 +- arch/x86/boot/compressed/eboot.c | 4 + arch/x86/include/asm/kasan.h | 8 +- arch/x86/include/asm/mmu_context.h | 2 +- arch/x86/kernel/cpu/perf_event_intel_cqm.c | 8 + arch/x86/kernel/head64.c | 10 +- arch/x86/kernel/head_64.S | 29 -- arch/x86/mm/kasan_init_64.c | 44 +- arch/x86/mm/tlb.c | 2 +- arch/x86/platform/efi/efi.c | 5 + block/bio-integrity.c | 4 +- block/blk-cgroup.c | 6 +- block/blk-mq.c | 2 +- drivers/ata/libata-pmp.c | 7 + drivers/clk/st/clk-flexgen.c | 2 + drivers/clk/st/clkgen-fsyn.c | 2 +- drivers/clk/st/clkgen-mux.c | 2 +- drivers/cpufreq/intel_pstate.c | 1 + drivers/crypto/omap-des.c | 3 - drivers/firmware/efi/cper.c | 15 +- drivers/firmware/efi/efi.c | 5 + drivers/gpu/drm/nouveau/nouveau_drm.c | 2 + drivers/gpu/drm/nouveau/nv04_fbcon.c | 2 +- drivers/gpu/drm/nouveau/nv50_display.c | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c | 8 + drivers/hid/hid-cp2112.c | 2 + drivers/hwmon/nct7802.c | 2 +- drivers/hwmon/nct7904.c | 57 +-- drivers/infiniband/ulp/ipoib/ipoib_verbs.c | 3 +- drivers/input/mouse/synaptics.c | 2 +- drivers/input/touchscreen/usbtouchscreen.c | 3 + drivers/input/touchscreen/zforce_ts.c | 2 +- drivers/iommu/intel-iommu.c | 9 +- drivers/irqchip/irq-gic-v3-its.c | 111 +++-- drivers/md/dm.c | 8 +- drivers/md/raid1.c | 2 +- drivers/misc/cxl/context.c | 4 +- drivers/misc/cxl/main.c | 2 +- drivers/misc/mei/main.c | 2 +- drivers/mmc/host/omap_hsmmc.c | 8 +- drivers/mmc/host/sdhci-esdhc.h | 2 +- drivers/mmc/host/sdhci-pxav3.c | 1 + drivers/mmc/host/sdhci.c | 7 +- drivers/net/can/c_can/c_can.c | 10 +- drivers/net/can/dev.c | 7 +- drivers/net/can/rcar_can.c | 7 +- drivers/net/can/slcan.c | 2 +- drivers/net/can/spi/mcp251x.c | 13 +- drivers/net/can/vcan.c | 3 - drivers/net/wireless/iwlwifi/iwl-nvm-parse.c | 12 +- drivers/net/wireless/iwlwifi/mvm/tx.c | 2 +- drivers/net/wireless/iwlwifi/pcie/trans.c | 6 + drivers/pinctrl/freescale/pinctrl-imx1-core.c | 3 +- drivers/regulator/s2mps11.c | 14 +- drivers/scsi/qla2xxx/qla_dbg.c | 2 +- drivers/scsi/qla2xxx/qla_init.c | 141 +++++-- drivers/scsi/qla2xxx/qla_target.c | 48 +-- drivers/scsi/scsi_error.c | 2 +- drivers/scsi/scsi_lib.c | 6 +- drivers/scsi/scsi_sysfs.c | 2 +- drivers/scsi/st.c | 2 +- drivers/spi/spi-img-spfi.c | 2 + drivers/spi/spi-imx.c | 5 +- drivers/target/iscsi/iscsi_target.c | 48 ++- drivers/target/iscsi/iscsi_target_login.c | 45 +- drivers/target/iscsi/iscsi_target_login.h | 3 +- drivers/target/iscsi/iscsi_target_nego.c | 34 +- drivers/tty/n_tty.c | 16 +- drivers/tty/serial/imx.c | 15 +- drivers/tty/serial/serial_core.c | 3 +- drivers/usb/host/xhci-hub.c | 22 +- drivers/usb/host/xhci-ring.c | 3 + drivers/usb/host/xhci.c | 3 + drivers/usb/host/xhci.h | 1 + drivers/usb/storage/unusual_devs.h | 12 + drivers/vhost/vhost.c | 1 + fs/dcache.c | 7 +- fs/namespace.c | 42 +- fs/nfs/inode.c | 8 +- fs/nfs/nfs4proc.c | 3 + fs/nfs/pagelist.c | 5 +- fs/pnode.h | 2 - fs/xfs/libxfs/xfs_attr_remote.c | 44 +- fs/xfs/xfs_log_recover.c | 11 +- include/linux/can/skb.h | 2 + include/linux/cper.h | 22 +- include/linux/ftrace.h | 3 + include/target/iscsi/iscsi_target_core.h | 1 + kernel/irq/resend.c | 18 +- kernel/trace/ftrace.c | 52 ++- lib/dma-debug.c | 3 + net/can/af_can.c | 12 +- net/can/bcm.c | 2 + net/can/raw.c | 7 +- net/mac80211/debugfs_netdev.c | 1 + net/rds/ib_rdma.c | 4 +- sound/core/pcm_native.c | 2 +- sound/pci/hda/hda_intel.c | 8 + sound/pci/hda/patch_hdmi.c | 2 + sound/pci/hda/patch_realtek.c | 16 +- sound/pci/hda/patch_sigmatel.c | 3 +- sound/usb/line6/pcm.c | 9 +- sound/usb/mixer_maps.c | 24 ++ sound/usb/quirks-table.h | 68 +++ tools/perf/ui/browsers/hists.c | 2 +- 146 files changed, 1457 insertions(+), 970 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/123 cxl: Fix off by one error allowing subsequent mmap page to be accessed
4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Munsie <[email protected]>
commit 10a5894f2dedd8a26b3132497445b314c0d952c4 upstream.
It was discovered that if a process mmaped their problem state area they were able to access one page more than expected, potentially allowing them to access the problem state area of an unrelated process.
This was due to a simple off by one error in the mmap fault handler introduced in 0712dc7e73e59d79bcead5d5520acf4e9e917e87 ("cxl: Fix issues when unmapping contexts"), which is fixed in this patch.
--- drivers/misc/cxl/context.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/misc/cxl/context.c +2 -2
@@ -113,11 +113,11 @@ static int cxl_mmap_fault(struct vm_areaif (ctx->afu->current_mode ==CXL_MODE_DEDICATED ) { area = ctx->afu->psn_phys; -if (offset > ctx->afu->adapter->ps_size) +if (offset >= ctx->afu->adapter->ps_size)return VM_FAULT_SIGBUS ; }else { area = ctx->psn_phys; -if (offset > ctx->psn_size) +if (offset >= ctx->psn_size)return VM_FAULT_SIGBUS ; }
Greg Kroah-Hartman
maintainerPATCH 2/123 cxl: Check if afu is not null in cxl_slbia
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Axtens <[email protected]>
commit 2c069a118fe1d80c47dca84e1561045fc7f3cc9e upstream.
The pointer to an AFU in the adapter's list of AFUs can be null if we're in the process of removing AFUs. The afu_list_lock doesn't guard against this.
Say we have 2 slices, and we're in the process of removing cxl.
- We remove the AFUs in order (see cxl_remove). In cxl_remove_afu for AFU 0, we take the lock, set adapter->afu[0] = NULL, and release the lock.
- Then we get an slbia. In cxl_slbia we take the lock, and set afu = adapter->afu[0], which is NULL.
- Therefore our attempt to check afu->enabled will blow up.
Therefore, check if afu is a null pointer before dereferencing it.
--- drivers/misc/cxl/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/cxl/main.c +1 -1
@@ -73,7 +73,7 @@ static inline void cxl_slbia_core(structspin_lock (&adapter->afu_list_lock);for (slice =0 ; slice < adapter->slices; slice++) { afu = adapter->afu[slice]; -if (!afu->enabled) +if (!afu || !afu->enabled)continue ;rcu_read_lock ();idr_for_each_entry (&afu->contexts_idr, ctx, id)
Greg Kroah-Hartman
maintainerPATCH 3/123 powerpc/powernv: Fix race in updating core_idle_state
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Shreyas B. Prabhu" <[email protected]>
commit b32aadc1a8ed84afbe924cd2ced31cd6a2e67074 upstream.
core_idle_state is maintained for each core. It uses 0-7 bits to track whether a thread in the core has entered fastsleep or winkle. 8th bit is used as a lock bit.
The lock bit is set in these 2 scenarios-
- The thread is first in subcore to wakeup from sleep/winkle.
- If its the last thread in the core about to enter sleep/winkle
While the lock bit is set, if any other thread in the core wakes up, it loops until the lock bit is cleared before proceeding in the wakeup path. This helps prevent race conditions w.r.t fastsleep workaround and prevents threads from switching to process context before core/subcore resources are restored.
But, in the path to sleep/winkle entry, we currently don't check for lock-bit. This exposes us to following race when running with subcore on-
First thread in the subcorea Another thread in the same
waking up core entering sleep/winkle
lwarx r15,0,r14 ori r15,r15,PNV_CORE_IDLE_LOCK_BIT stwcx. r15,0,r14
[Code to restore subcore state]
lwarx r15,0,r14 [clear thread bit] stwcx. r15,0,r14
andi. r15,r15,PNV_CORE_IDLE_THREAD_BITS
stw r15,0(r14)
Here, after the thread entering sleep clears its thread bit in core_idle_state, the value is overwritten by the thread waking up. In such cases when the core enters fastsleep, code mistakes an idle thread as running. Because of this, the first thread waking up from fastsleep which is supposed to resync timebase skips it. So we can end up having a core with stale timebase value.
This patch fixes the above race by looping on the lock bit even while entering the idle states.
--- arch/powerpc/kernel/idle_power7.S | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-)
arch/powerpc/kernel/idle_power7.S +21 -10
@@ -52,6 +52,22 @@ .text /* + * Used by threads when the lock bit of core_idle_state is set. + * Threads will spin in HMT_LOW until the lock bit is cleared. + * r14 - pointer to core_idle_state + * r15 - used to load contents of core_idle_state + */ + +core_idle_lock_held: + HMT_LOW +3: lwz r15,0(r14) + andi. r15,r15,PNV_CORE_IDLE_LOCK_BIT + bne 3b + HMT_MEDIUM + lwarx r15,0,r14 + blr + +/* * Pass requested state in r3: * r3 - PNV_THREAD_NAP/SLEEP/WINKLE *
@@ -150,6 +166,10 @@ power7_enter_nap_mode: ld r14,PACA_CORE_IDLE_STATE_PTR(r13) lwarx_loop1: lwarx r15,0,r14 + + andi. r9,r15,PNV_CORE_IDLE_LOCK_BIT + bnel core_idle_lock_held + andc r15,r15,r7 /* Clear thread bit */ andi. r15,r15,PNV_CORE_IDLE_THREAD_BITS
@@ -294,7 +314,7 @@ lwarx_loop2: * workaround undo code or resyncing timebase or restoring context * In either case loop until the lock bit is cleared. */ - bne core_idle_lock_held + bnel core_idle_lock_held cmpwi cr2,r15,0 lbz r4,PACA_SUBCORE_SIBLING_MASK(r13)
@@ -319,15 +339,6 @@ lwarx_loop2: isync b common_exit -core_idle_lock_held: - HMT_LOW -core_idle_lock_loop: - lwz r15,0(14) - andi. r9,r15,PNV_CORE_IDLE_LOCK_BIT - bne core_idle_lock_loop - HMT_MEDIUM - b lwarx_loop2 - first_thread_in_subcore: /* First thread in subcore to wakeup */ ori r15,r15,PNV_CORE_IDLE_LOCK_BIT
Greg Kroah-Hartman
maintainerPATCH 4/123 Revert "Input: synaptics - allocate 3 slots to keep stability in image sensors"
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
commit dbf3c370862d73fcd2c74ca55e254bb02143238d upstream.
This reverts commit 63c4fda3c0bb841b1aad1298fc7fe94058fc79f8 as it causes issues with detecting 3-finger taps.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=100481
--- drivers/input/mouse/synaptics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/mouse/synaptics.c +1 -1
@@ -1199,7 +1199,7 @@ static void set_input_params(struct psmo ABS_MT_POSITION_Y);/* Image sensors can report per-contact pressure */ input_set_abs_params (dev,ABS_MT_PRESSURE ,0 ,255 ,0 ,0 ); -input_mt_init_slots (dev,3 ,INPUT_MT_POINTER |INPUT_MT_TRACK ); +input_mt_init_slots (dev,2 ,INPUT_MT_POINTER |INPUT_MT_TRACK );/* Image sensors can signal 4 and 5 finger clicks */ __set_bit (BTN_TOOL_QUADTAP , dev->keybit);
Greg Kroah-Hartman
maintainerPATCH 5/123 parisc: Fix some PTE/TLB race conditions and optimize __flush_tlb_range based on timing results
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: John David Anglin <[email protected]>
commit 01ab60570427caa24b9debc369e452e86cd9beb4 upstream.
The increased use of pdtlb/pitlb instructions seemed to increase the frequency of random segmentation faults building packages. Further, we had a number of cases where TLB inserts would repeatedly fail and all forward progress would stop. The Haskell ghc package caused a lot of trouble in this area. The final indication of a race in pte handling was this syslog entry on sibaris (C8000):
swap_free: Unused swap offset entry 00000004
BUG: Bad page map in process mysqld pte:00000100 pmd:019bbec5 addr:00000000ec464000 vm_flags:00100073 anon_vma:0000000221023828 mapping: (null) index:ec464 CPU: 1 PID: 9176 Comm: mysqld Not tainted 4.0.0-2-parisc64-smp #1 Debian 4.0.5-1 Backtrace: [<0000000040173eb0>] show_stack+0x20/0x38 [<0000000040444424>] dump_stack+0x9c/0x110 [<00000000402a0d38>] print_bad_pte+0x1a8/0x278 [<00000000402a28b8>] unmap_single_vma+0x3d8/0x770 [<00000000402a4090>] zap_page_range+0xf0/0x198 [<00000000402ba2a4>] SyS_madvise+0x404/0x8c0
Note that the pte value is 0 except for the accessed bit 0x100. This bit shouldn't be set without the present bit.
It should be noted that the madvise system call is probably a trigger for many of the random segmentation faults.
In looking at the kernel code, I found the following problems:
1) The pte_clear define didn't take TLB lock when clearing a pte.
2) We didn't test pte present bit inside lock in exception support.
3) The pte and tlb locks needed to merged in order to ensure consistency between page table and TLB. This also has the effect of serializing TLB broadcasts on SMP systems.
The attached change implements the above and a few other tweaks to try to improve performance. Based on the timing code, TLB purges are very slow (e.g., ~ 209 cycles per page on rp3440). Thus, I think it beneficial to test the split_tlb variable to avoid duplicate purges. Probably, all PA 2.0 machines have combined TLBs.
I dropped using __flush_tlb_range in flush_tlb_mm as I realized all applications and most threads have a stack size that is too large to make this useful. I added some comments to this effect.
Since implementing 1 through 3, I haven't had any random segmentation faults on mx3210 (rp3440) in about one week of building code and running as a Debian buildd.
--- arch/parisc/include/asm/pgtable.h | 57 ++++++++---- arch/parisc/include/asm/tlbflush.h | 53 ++++++------ arch/parisc/kernel/cache.c | 105 +++++++++++++++-------- arch/parisc/kernel/entry.S | 163 +++++++++++++++++-------------------- arch/parisc/kernel/traps.c | 4 5 files changed, 213 insertions(+), 169 deletions(-)
arch/parisc/include/asm/pgtable.h +38 -19
@@ -16,7 +16,7 @@#include <asm/processor.h> #include <asm/cache.h> -extern spinlock_t pa_dbit_lock; +extern spinlock_t pa_tlb_lock;/* * kern_addr_valid(ADDR) tests if ADDR is pointing to valid kernel
@@ -33,6 +33,19 @@ extern spinlock_t pa_dbit_lock;*/ #define kern_addr_valid (addr) (1) +/* Purge data and instruction TLB entries. Must be called holding +* the pa_tlb_lock. The TLB purge instructions are slow on SMP +* machines since the purge must be broadcast to all CPUs. +*/ + +static inline void purge_tlb_entries (struct mm_struct *mm,unsigned long addr) +{ +mtsp (mm->context,1 ); +pdtlb (addr); +if (unlikely (split_tlb)) +pitlb (addr); +} +/* Certain architectures need to do special things when PTEs * within a page table are directly modified. Thus, the following * hook is made available.
@@ -42,15 +55,20 @@ extern spinlock_t pa_dbit_lock; *(pteptr) = (pteval); \ } while(0) -extern void purge_tlb_entries(struct mm_struct *, unsigned long); - -#define set_pte_at (mm, addr, ptep, pteval) \ - do { \ +#define pte_inserted (x) \ + ((pte_val(x) & (_PAGE_PRESENT|_PAGE_ACCESSED)) \ + == (_PAGE_PRESENT|_PAGE_ACCESSED)) + +#define set_pte_at (mm, addr, ptep, pteval) \ + do { \ + pte_t old_pte; \ unsigned long flags; \ - spin_lock_irqsave(&pa_dbit_lock, flags); \ - set_pte(ptep, pteval); \ - purge_tlb_entries(mm, addr); \ - spin_unlock_irqrestore(&pa_dbit_lock, flags); \ + spin_lock_irqsave(&pa_tlb_lock, flags); \ + old_pte = *ptep; \ + set_pte(ptep, pteval); \ + if (pte_inserted(old_pte)) \ + purge_tlb_entries(mm, addr); \ + spin_unlock_irqrestore(&pa_tlb_lock, flags); \ } while (0)#endif /* !__ASSEMBLY__ */
@@ -268,7 +286,7 @@ extern unsigned long *empty_zero_page;#define pte_none (x) (pte_val(x) == 0)#define pte_present (x) (pte_val(x) & _PAGE_PRESENT) -#define pte_clear (mm,addr,xp) do { pte_val(*(xp)) = 0; } while (0) +#define pte_clear (mm, addr, xp) set_pte_at(mm, addr, xp, __pte(0))#define pmd_flag (x) (pmd_val(x) & PxD_FLAG_MASK)#define pmd_address (x) ((unsigned long)(pmd_val(x) &~ PxD_FLAG_MASK) << PxD_VALUE_SHIFT)
@@ -435,15 +453,15 @@ static inline int ptep_test_and_clear_yoif (!pte_young (*ptep))return 0 ; -spin_lock_irqsave (&pa_dbit_lock, flags); +spin_lock_irqsave (&pa_tlb_lock, flags); pte = *ptep;if (!pte_young (pte)) { -spin_unlock_irqrestore (&pa_dbit_lock, flags); +spin_unlock_irqrestore (&pa_tlb_lock, flags);return 0 ; }set_pte (ptep,pte_mkold (pte));purge_tlb_entries (vma->vm_mm, addr); -spin_unlock_irqrestore (&pa_dbit_lock, flags); +spin_unlock_irqrestore (&pa_tlb_lock, flags);return 1 ; }
@@ -453,11 +471,12 @@ static inline pte_t ptep_get_and_clear(spte_t old_pte;unsigned long flags; -spin_lock_irqsave (&pa_dbit_lock, flags); +spin_lock_irqsave (&pa_tlb_lock, flags); old_pte = *ptep; -pte_clear (mm,addr,ptep); -purge_tlb_entries (mm, addr); -spin_unlock_irqrestore (&pa_dbit_lock, flags); +set_pte (ptep,__pte (0 )); +if (pte_inserted (old_pte)) +purge_tlb_entries (mm, addr); +spin_unlock_irqrestore (&pa_tlb_lock, flags);return old_pte; }
@@ -465,10 +484,10 @@ static inline pte_t ptep_get_and_clear(sstatic inline void ptep_set_wrprotect (struct mm_struct *mm,unsigned long addr,pte_t *ptep) {unsigned long flags; -spin_lock_irqsave (&pa_dbit_lock, flags); +spin_lock_irqsave (&pa_tlb_lock, flags);set_pte (ptep,pte_wrprotect (*ptep));purge_tlb_entries (mm, addr); -spin_unlock_irqrestore (&pa_dbit_lock, flags); +spin_unlock_irqrestore (&pa_tlb_lock, flags); }#define pte_same (A ,B ) (pte_val(A) == pte_val(B))
arch/parisc/include/asm/tlbflush.h +29 -24
87 lines not on this page · raw message
arch/parisc/kernel/cache.c +67 -38
141 lines not on this page · raw message
arch/parisc/kernel/entry.S +79 -84
398 lines not on this page · raw message
arch/parisc/kernel/traps.c +0 -4
@@ -43,10 +43,6 @@#include "../math-emu/math-emu.h" /* for handle_fpe() */ -#if defined(CONFIG_SMP ) || defined(CONFIG_DEBUG_SPINLOCK ) -DEFINE_SPINLOCK (pa_dbit_lock); -#endif -static void parisc_show_stack (struct task_struct *task,unsigned long *sp,struct pt_regs *regs);
Greg Kroah-Hartman
maintainerPATCH 6/123 parisc: mm: Fix a memory leak related to pmd not attached to the pgd
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Jaillet <[email protected]>
commit 4c4ac9a48ac512c6b5a6cca06cfad2ad96e8caaa upstream.
Commit 0e0da48dee8d ("parisc: mm: don't count preallocated pmds") introduced a memory leak.
After this commit, the 'return' statement in pmd_free is executed in all cases. Even for pmd that are not attached to the pgd. So 'free_pages' can never be called anymore, leading to a memory leak.
--- arch/parisc/include/asm/pgalloc.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/parisc/include/asm/pgalloc.h +2 -1
@@ -72,7 +72,7 @@ static inline pmd_t *pmd_alloc_one(strucstatic inline void pmd_free (struct mm_struct *mm,pmd_t *pmd) { -if (pmd_flag (*pmd) & PxD_FLAG_ATTACHED) +if (pmd_flag (*pmd) & PxD_FLAG_ATTACHED) {/* * This is the permanent pmd attached to the pgd; * cannot free it.
@@ -81,6 +81,7 @@ static inline void pmd_free(struct mm_st*/ mm_inc_nr_pmds (mm);return ; + }free_pages ((unsigned long )pmd,PMD_ORDER ); }
Greg Kroah-Hartman
maintainerPATCH 7/123 ARM: pxa: fix dm9000 platform data regression
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Jarzmik <[email protected]>
commit a927ef895e288e79f1bfed221f27d7bfa37e907f upstream.
Since dm9000 driver added support for a vcc regulator, platform data based platforms have their ethernet broken, as the regulator claiming returns -EPROBE_DEFER and prevents dm9000 loading.
This patch fixes this for all pxa boards using dm9000, by using the specific regulator_has_full_constraints() function.
This was discovered and tested on the cm-x300 board.
--- arch/arm/mach-pxa/capc7117.c | 3 +++ arch/arm/mach-pxa/cm-x2xx.c | 3 +++ arch/arm/mach-pxa/cm-x300.c | 2 ++ arch/arm/mach-pxa/colibri-pxa270.c | 3 +++ arch/arm/mach-pxa/em-x270.c | 2 ++ arch/arm/mach-pxa/icontrol.c | 3 +++ arch/arm/mach-pxa/trizeps4.c | 3 +++ arch/arm/mach-pxa/vpac270.c | 3 +++ arch/arm/mach-pxa/zeus.c | 2 ++ 9 files changed, 24 insertions(+)
arch/arm/mach-pxa/capc7117.c +3 -0
@@ -24,6 +24,7 @@#include <linux/ata_platform.h> #include <linux/serial_8250.h> #include <linux/gpio.h> +#include <linux/regulator/machine.h> #include <asm/mach-types.h> #include <asm/mach/arch.h>
@@ -144,6 +145,8 @@ static void __init capc7117_init(void)capc7117_uarts_init ();capc7117_ide_init (); + +regulator_has_full_constraints (); } MACHINE_START(CAPC7117,
arch/arm/mach-pxa/cm-x2xx.c +3 -0
@@ -13,6 +13,7 @@#include <linux/syscore_ops.h> #include <linux/irq.h> #include <linux/gpio.h> +#include <linux/regulator/machine.h> #include <linux/dm9000.h> #include <linux/leds.h>
@@ -466,6 +467,8 @@ static void __init cmx2xx_init(void)cmx2xx_init_ac97 ();cmx2xx_init_touchscreen ();cmx2xx_init_leds (); + +regulator_has_full_constraints (); }static void __init cmx2xx_init_irq (void )
arch/arm/mach-pxa/cm-x300.c +2 -0
@@ -835,6 +835,8 @@ static void __init cm_x300_init(void)cm_x300_init_ac97 ();cm_x300_init_wi2wi ();cm_x300_init_bl (); + +regulator_has_full_constraints (); }static void __init cm_x300_fixup (struct tag *tags,char **cmdline)
arch/arm/mach-pxa/colibri-pxa270.c +3 -0
@@ -18,6 +18,7 @@#include <linux/mtd/partitions.h> #include <linux/mtd/physmap.h> #include <linux/platform_device.h> +#include <linux/regulator/machine.h> #include <linux/ucb1400.h> #include <asm/mach/arch.h>
@@ -294,6 +295,8 @@ static void __init colibri_pxa270_init(vprintk (KERN_ERR "Illegal colibri_pxa270_baseboard type %d\n" , colibri_pxa270_baseboard); } + +regulator_has_full_constraints (); }/* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either
arch/arm/mach-pxa/em-x270.c +2 -0
@@ -1306,6 +1306,8 @@ static void __init em_x270_init(void)em_x270_init_i2c ();em_x270_init_camera ();em_x270_userspace_consumers_init (); + +regulator_has_full_constraints (); }MACHINE_START (EM_X270 ,"Compulab EM-X270" )
arch/arm/mach-pxa/icontrol.c +3 -0
@@ -26,6 +26,7 @@#include <linux/spi/spi.h> #include <linux/spi/pxa2xx_spi.h> #include <linux/can/platform/mcp251x.h> +#include <linux/regulator/machine.h> #include "generic.h"
@@ -185,6 +186,8 @@ static void __init icontrol_init(void)mxm_8x10_mmc_init ();icontrol_can_init (); + +regulator_has_full_constraints (); }MACHINE_START (ICONTROL ,"iControl/SafeTcam boards using Embedian MXM-8x10 CoM" )
arch/arm/mach-pxa/trizeps4.c +3 -0
@@ -26,6 +26,7 @@#include <linux/dm9000.h> #include <linux/mtd/physmap.h> #include <linux/mtd/partitions.h> +#include <linux/regulator/machine.h> #include <linux/i2c/pxa-i2c.h> #include <asm/types.h>
@@ -534,6 +535,8 @@ static void __init trizeps4_init(void)BCR_writew (trizeps_conxs_bcr);board_backlight_power (1 ); + +regulator_has_full_constraints (); }static void __init trizeps4_map_io (void )
arch/arm/mach-pxa/vpac270.c +3 -0
@@ -24,6 +24,7 @@#include <linux/dm9000.h> #include <linux/ucb1400.h> #include <linux/ata_platform.h> +#include <linux/regulator/machine.h> #include <linux/regulator/max1586.h> #include <linux/i2c/pxa-i2c.h>
@@ -711,6 +712,8 @@ static void __init vpac270_init(void)vpac270_ts_init ();vpac270_rtc_init ();vpac270_ide_init (); + +regulator_has_full_constraints (); }MACHINE_START (VPAC270 ,"Voipac PXA270" )
arch/arm/mach-pxa/zeus.c +2 -0
@@ -868,6 +868,8 @@ static void __init zeus_init(void)i2c_register_board_info (0 ,ARRAY_AND_SIZE (zeus_i2c_devices));pxa2xx_set_spi_info (3 , &pxa2xx_spi_ssp3_master_info);spi_register_board_info (zeus_spi_board_info,ARRAY_SIZE (zeus_spi_board_info)); + +regulator_has_full_constraints (); }static struct map_desc zeus_io_desc[]__initdata = {
Greg Kroah-Hartman
maintainerPATCH 8/123 ARM: dts: dra7x-evm: Prevent glitch on DCAN1 pinmux
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roger Quadros <[email protected]>
commit 2acb5c301edf39ab6d066687ce70da1166e4de9e upstream.
Driver core sets "default" pinmux on on probe and CAN driver sets "sleep" pinmux during register. This causes a small window where the CAN pins are in "default" state with the DCAN module being disabled.
Change the "default" state to be like sleep so this glitch is avoided. Add a new "active" state that is used by the driver when CAN is actually active.
--- arch/arm/boot/dts/dra7-evm.dts | 5 +++-- arch/arm/boot/dts/dra72-evm.dts | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
arch/arm/boot/dts/dra7-evm.dts +3 -2
@@ -686,7 +686,8 @@ &dcan1 { status = "ok"; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&dcan1_pins_default>; + pinctrl-names = "default", "sleep", "active"; + pinctrl-0 = <&dcan1_pins_sleep>; pinctrl-1 = <&dcan1_pins_sleep>; + pinctrl-2 = <&dcan1_pins_default>; };
arch/arm/boot/dts/dra72-evm.dts +3 -2
@@ -497,9 +497,10 @@ &dcan1 { status = "ok"; - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&dcan1_pins_default>; + pinctrl-names = "default", "sleep", "active"; + pinctrl-0 = <&dcan1_pins_sleep>; pinctrl-1 = <&dcan1_pins_sleep>; + pinctrl-2 = <&dcan1_pins_default>; }; &qspi {
Greg Kroah-Hartman
maintainerPATCH 9/123 ARM: dts: am57xx-beagle-x15: Provide supply for usb2_phy2
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roger Quadros <[email protected]>
commit 9ab402aed38b95d9ce453108622be0fc6f167568 upstream.
Without this USB2 breaks if USB1 is disabled or USB1 initializes after USB2 e.g. due to deferred probing.
--- arch/arm/boot/dts/am57xx-beagle-x15.dts | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm/boot/dts/am57xx-beagle-x15.dts +4 -0
@@ -544,6 +544,10 @@ phy-supply = <&ldousb_reg>; }; +&usb2_phy2 { + phy-supply = <&ldousb_reg>; +}; + &usb1 { dr_mode = "host"; pinctrl-names = "default";
Greg Kroah-Hartman
maintainerPATCH 10/123 ARM: 8404/1: dma-mapping: fix off-by-one error in bitmap size check
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Szyprowski <[email protected]>
commit 462859aa7bbe1ac83ec4377a0a06fe60778f3f27 upstream.
nr_bitmaps member of mapping structure stores the number of already allocated bitmaps and it is interpreted as loop iterator (it starts from 0 not from 1), so a comparison against number of possible bitmap extensions should include this fact. This patch fixes this by changing the extension failure condition. This issue has been introduced by commit 4d852ef8c2544ce21ae41414099a7504c61164a0 ("arm: dma-mapping: Add support to extend DMA IOMMU mappings").
--- arch/arm/mm/dma-mapping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mm/dma-mapping.c +1 -1
@@ -1953,7 +1953,7 @@ static int extend_iommu_mapping(struct d {int next_bitmap; -if (mapping->nr_bitmaps > mapping->extensions) +if (mapping->nr_bitmaps >= mapping->extensions)return -EINVAL ; next_bitmap = mapping->nr_bitmaps;
Greg Kroah-Hartman
maintainerPATCH 11/123 ARM: imx6: gpc: always enable PU domain if CONFIG_PM is not set
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lucas Stach <[email protected]>
commit d438462c20a300139c2e5e65b96cadaa21b58d9a upstream.
If CONFIG_PM is not set the PU power domain needs to be enabled always, otherwise there are two failure scenarios which will hang the system if one of the devices in the PU domain is accessed.
1. New DTs (4.1+) drop the "always-on" property from the PU regulator, so if it isn't properly enabled by the GPC code it will be disabled at the end of boot.
2. If the bootloader already disabled the PU domain the GPC explicitly needs to enable it again, even if the kernel doesn't do any power management. This is a bit hypothetical, as it requires to boot a mainline kernel on a downstream bootloader, as no mainline bootloader disables the PM domains.
--- arch/arm/mach-imx/gpc.c | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-)
arch/arm/mach-imx/gpc.c +6 -21
@@ -291,8 +291,6 @@ void __init imx_gpc_check_dt(void) } } -#ifdef CONFIG_PM_GENERIC_DOMAINS -static void _imx6q_pm_pu_power_off (struct generic_pm_domain *genpd) {int iso, iso2sw;
@@ -399,7 +397,6 @@ static struct genpd_onecell_data imx_gpcstatic int imx_gpc_genpd_init (struct device *dev,struct regulator *pu_reg) {struct clk *clk; -bool is_off;int i; imx6q_pu_domain.reg = pu_reg;
@@ -416,18 +413,13 @@ static int imx_gpc_genpd_init(struct dev } imx6q_pu_domain.num_clks = i; - is_off =IS_ENABLED (CONFIG_PM ); -if (is_off) { -_imx6q_pm_pu_power_off (&imx6q_pu_domain.base); - }else { -/* -* Enable power if compiled without CONFIG_PM in case the -* bootloader disabled it. -*/ -imx6q_pm_pu_power_on (&imx6q_pu_domain.base); - } +/* Enable power always in case bootloader disabled it. */ +imx6q_pm_pu_power_on (&imx6q_pu_domain.base); -pm_genpd_init (&imx6q_pu_domain.base,NULL , is_off); +if (!IS_ENABLED (CONFIG_PM_GENERIC_DOMAINS )) +return 0 ; + +pm_genpd_init (&imx6q_pu_domain.base,NULL , false);return of_genpd_add_provider_onecell (dev->of_node, &imx_gpc_onecell_data);
@@ -437,13 +429,6 @@ clk_err:return -EINVAL ; } -#else -static inline int imx_gpc_genpd_init (struct device *dev,struct regulator *reg) -{ -return 0 ; -} -#endif /* CONFIG_PM_GENERIC_DOMAINS */ -static int imx_gpc_probe (struct platform_device *pdev) {struct regulator *pu_reg;
Greg Kroah-Hartman
maintainerPATCH 12/123 MIPS: Fix erroneous JR emulation for MIPS R6
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markos Chandras <[email protected]>
commit 143fefc8f315cd10e046e6860913c421c3385cb1 upstream.
Commit 5f9f41c474befb4ebbc40b27f65bb7d649241581 ("MIPS: kernel: Prepare the JR instruction for emulation on MIPS R6") added support for emulating the JR instruction on MIPS R6 cores but that introduced a bug which could be triggered when hitting a JALR opcode because the code used the wrong field in the 'r_format' struct to determine the instruction opcode. This lead to crashes because an emulated JALR instruction was treated as a JR one when the R6 emulator was turned off.
Patchwork: https://patchwork.linux-mips.org/patch/10583/
--- arch/mips/math-emu/cp1emu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/math-emu/cp1emu.c +1 -1
@@ -451,7 +451,7 @@ static int isBranchInstr(struct pt_regs/* Fall through */ case jr_op:/* For R6, JR already emulated in jalr_op */ -if (NO_R6EMU && insn.r_format.opcode == jr_op) +if (NO_R6EMU && insn.r_format.func == jr_op)break ; *contpc = regs->regs[insn.r_format.rs];return 1 ;
Greg Kroah-Hartman
maintainerPATCH 13/123 MIPS: c-r4k: Fix cache flushing for MT cores
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markos Chandras <[email protected]>
commit cccf34e9411c41b0cbfb41980fe55fc8e7c98fd2 upstream.
MT_SMP is not the only SMP option for MT cores. The MT_SMP option allows more than one VPE per core to appear as a secondary CPU in the system. Because of how CM works, it propagates the address-based cache ops to the secondary cores but not the index-based ones. Because of that, the code does not use IPIs to flush the L1 caches on secondary cores because the CM would have done that already. However, the CM functionality is independent of the type of SMP kernel so even in non-MT kernels, IPIs are not necessary. As a result of which, we change the conditional to depend on the CM presence. Moreover, since VPEs on the same core share the same L1 caches, there is no need to send an IPI on all of them so we calculate a suitable cpumask with only one VPE per core.
Patchwork: https://patchwork.linux-mips.org/patch/10654/
--- arch/mips/include/asm/smp.h | 1 + arch/mips/kernel/smp.c | 44 +++++++++++++++++++++++++++++++++++++++++++- arch/mips/mm/c-r4k.c | 14 +++++++++++--- 3 files changed, 55 insertions(+), 4 deletions(-)
arch/mips/include/asm/smp.h +1 -0
@@ -23,6 +23,7 @@extern int smp_num_siblings;extern cpumask_t cpu_sibling_map[];extern cpumask_t cpu_core_map[]; +extern cpumask_t cpu_foreign_map;#define raw_smp_processor_id () (current_thread_info()->cpu)
arch/mips/kernel/smp.c +43 -1
76 lines not on this page · raw message
arch/mips/mm/c-r4k.c +11 -3
@@ -37,6 +37,7 @@#include <asm/cacheflush.h> /* for run_uncached() */ #include <asm/traps.h> #include <asm/dma-coherence.h> +#include <asm/mips-cm.h> /* * Special Variant of smp_call_function for use by cache functions:
@@ -51,9 +52,16 @@ static inline void r4k_on_each_cpu(void {preempt_disable (); -#ifndef CONFIG_MIPS_MT_SMP -smp_call_function (func, info,1 ); -#endif +/* +* The Coherent Manager propagates address-based cache ops to other +* cores but not index-based ops. However, r4k_on_each_cpu is used +* in both cases so there is no easy way to tell what kind of op is +* executed to the other cores. The best we can probably do is +* to restrict that call when a CM is not present because both +* CM-based SMP protocols (CMP & CPS) restrict index-based cache ops. +*/ +if (!mips_cm_present ()) +smp_call_function_many (&cpu_foreign_map, func, info,1 );func (info);preempt_enable (); }
Re: [4.1,013/123] MIPS: c-r4k: Fix cache flushing for MT cores
Quoted 3 lines · On 08/08/2015 03:08 PM, [email protected] wrote:
4.1-stable review patch. If anyone has any objections, please let me know.
Yes, I have objection. Please look into excepts from my mail exchange with Markos:
Quoted 35 lines · Markos Chandras
arch/mips/mm/c-r4k.c static inline void r4k_on_each_cpu(void (*func) (void *info), void *info) · line 58
Quoted 13 lines
arch/mips/mm/c-r4k.c +2
-3@@ -51,9 +51,8 @@ static inline void r4k_on_each_cpu(void (*func) (void *info), void *info) {preempt_disable (); -#ifndef CONFIG_MIPS_MT_SMP -smp_call_function (func, info,1 ); -#endif +if (config_enabled (CONFIG_SMP )) +smp_call_function_many (&cpu_foreign_map, func, info,1 );func (info);preempt_enable (); }You can NOT do this because
r4k_on_each_cpu()is still used for non-MIPS/IMG processors for SAFE INDEX cache flushes -cpu_has_safe_index_cacheops(it is not safe in CM/CM2/CM3 environment).And a little explanation and history:
The function
r4k_on_each_cpu()can NOT be used simultaneously for index cacheops and address cacheops because both have a different rules in applying in other cores and that is different in inter-core HW blocks of various vendors. CM propogates address cacheops from core-to-core (no IPI calls are needed) but another vendors may do not
- this is indicated byCONFIG_MIPS_MT_SMP(and a dropped nowCONFIG_MIPS_MT_SMTC).Unfortunately, before 2.6.35.9 this function was used for index cacheops too in any kernel and that is WRONG, at least for CM-based systems.
So, I splitted index and address cacheops and wrote a functionsr4k_indexop_on_each_cpuand put it in use in at least in dlm-2.6.35.9 and it finally made a way to dev-linux-mti-3.6. This is a famous patch named:MIPS: Cache flush functions are reworked.
This patch is a preparation for EVA support in kernel.
However, it also fixes a bug then index cacheop was not ran on multiple CPUs with unsafe index cacheops (
flush_cache_vmap,flush_icache_range,flush_cache_range,__flush_cache_all).
Quoted 9 lines
Additionally, it optimizes a usage of index and address cacheops for address range flushes depending from address range size.
Because of that reasons it is a separate patch from EVA support.
Signed-off-by Leonid Yegoshin <[email protected]>Signed-off-by Steven J. Hill <[email protected]>(cherry picked from commit 6b05dd71da1136fbad0ce642790c4c99343f05e7)
(history is skipped)
Note: the replacement of
if (config_enabled(CONFIG_SMP))
to
if (!mips_cm_present())
doesn't solve a problem - in CM-based environment the index cache ops MUST be delivered to other core via IPI.
- Leonid.
[email protected]
maintainerRe: [4.1,013/123] MIPS: c-r4k: Fix cache flushing for MT cores
Quoted 63 lines · Leonid Yegoshin
Quoted 3 lines · On 08/08/2015 03:08 PM, [email protected] wrote:
4.1-stable review patch. If anyone has any objections, please let me know.
Yes, I have objection. Please look into excepts from my mail exchange with Markos:
Quoted 42 lines · Markos Chandras
arch/mips/mm/c-r4k.c static inline void r4k_on_each_cpu(void (*func) (void *info), void *info) · line 57
Quoted 12 lines
arch/mips/mm/c-r4k.c +2
-3@@ -51,9 +51,8 @@ static inline void r4k_on_each_cpu(void (*func) (void *info), void *info) {preempt_disable (); -#ifndef CONFIG_MIPS_MT_SMP -smp_call_function (func, info,1 ); -#endif +if (config_enabled (CONFIG_SMP )) +smp_call_function_many (&cpu_foreign_map, func, info,1 );func (info);preempt_enable (); }You can NOT do this because
r4k_on_each_cpu()is still used for non-MIPS/IMG processors for SAFE INDEX cache flushes -cpu_has_safe_index_cacheops(it is not safe in CM/CM2/CM3 environment).And a little explanation and history:
The function
r4k_on_each_cpu()can NOT be used simultaneously for index cacheops and address cacheops because both have a different rules in applying in other cores and that is different in inter-core HW blocks of various vendors. CM propogates address cacheops from core-to-core (no IPI calls are needed) but another vendors may do not - this is indicated byCONFIG_MIPS_MT_SMP(and a dropped nowCONFIG_MIPS_MT_SMTC).Unfortunately, before 2.6.35.9 this function was used for index cacheops too in any kernel and that is WRONG, at least for CM-based systems. So, I splitted index and address cacheops and wrote a functions
r4k_indexop_on_each_cpuand put it in use in at least in dlm-2.6.35.9 and it finally made a way to dev-linux-mti-3.6. This is a famous patch named:MIPS: Cache flush functions are reworked.
This patch is a preparation for EVA support in kernel.
However, it also fixes a bug then index cacheop was not ran on multiple CPUs with unsafe index cacheops (
flush_cache_vmap,flush_icache_range,flush_cache_range,__flush_cache_all).Quoted 9 lines
Additionally, it optimizes a usage of index and address cacheops for address range flushes depending from address range size.
Because of that reasons it is a separate patch from EVA support.
Signed-off-by Leonid Yegoshin <[email protected]>Signed-off-by Steven J. Hill <[email protected]>(cherry picked from commit 6b05dd71da1136fbad0ce642790c4c99343f05e7)(history is skipped)
Note: the replacement of
Quoted 7 lines
if (
config_enabled(CONFIG_SMP))to
if (!mips_cm_present())doesn't solve a problem - in CM-based environment the index cache ops MUST be delivered to other core via IPI.
So, this is broken in Linus's tree too? Or is it fixed there, and if so, what is the git commit id?
thanks,
greg k-h
Re: [4.1,013/123] MIPS: c-r4k: Fix cache flushing for MT cores
Quoted 3 lines · On 08/10/2015 11:49 AM, [email protected] wrote:
Quoted 1 line · Leonid Yegoshin
So, this is broken in Linus's tree too?
Yes.
Quoted 2 lines
Or is it fixed there, and if
so, what is the git commit id?
There is no an accepted fix. My old patch is in
It was a precursor for my EVA set of patches since2.6.35.9 but was never accepted and was lost during redesign of EVA by Markos.
- Leonid.
Re: [4.1,013/123] MIPS: c-r4k: Fix cache flushing for MT cores
Quoted 10 lines · Leonid Yegoshin
Quoted 3 lines · On 08/10/2015 11:49 AM, [email protected] wrote:
Quoted 1 line · Leonid Yegoshin
So, this is broken in Linus's tree too?
Yes.
Quoted 2 lines
Or is it fixed there, and if
so, what is the git commit id?
Quoted 9 lines
There is no an accepted fix. My old patch is in
It was a precursor for my EVA set of patches since2.6.35.9 but was never accepted and was lost during redesign of EVA by Markos.
- Leonid.
I hope you realize that blocking this patch from the stable trees does not actually fix the problem. The patch may not be perfect but it's better than what we had before.
Signature · 1 line
markos
[email protected]
maintainerRe: [4.1,013/123] MIPS: c-r4k: Fix cache flushing for MT cores
In reply to Leonid YegoshinQuoted 6 lines · Leonid Yegoshin
Quoted 3 lines · On 08/10/2015 11:49 AM, [email protected] wrote:
Quoted 1 line · Leonid Yegoshin
So, this is broken in Linus's tree too?
Yes.
Great, as long as I am consistent, that's all that I care about :)
Quoted 9 lines
Quoted 2 lines
Or is it fixed there, and if
so, what is the git commit id?There is no an accepted fix. My old patch is in
It was a precursor for my EVA set of patches since2.6.35.9 but was never accepted and was lost during redesign of EVA by Markos.
Please work with the mips developers to get this accepted, and mark it for -stable as well.
thanks,
greg k-h
Re: [4.1,013/123] MIPS: c-r4k: Fix cache flushing for MT cores
Quoted 8 lines · On 08/10/2015 12:19 PM, [email protected] wrote:
Quoted 4 lines · Leonid Yegoshin
Quoted 2 lines · On 08/10/2015 11:49 AM, [email protected] wrote:
On Mon, Aug 10, 2015 at 11:36:34AM -0700, Leonid Yegoshin wrote:
So, this is broken in Linus's tree too?Yes.
Great, as long as I am consistent, that's all that I care about :)
You asked "If anyone has any objections, please let me know" and I did that.
- Leonid.
Greg Kroah-Hartman
maintainerPATCH 14/123 MIPS: Require O32 FP64 support for MIPS64 with O32 compat
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
commit 4e9d324d4288b082497c30bc55b8ad13acc7cf01 upstream.
MIPS32r6 code requires FP64 (ie. FR=1) support. Building a kernel with support for MIPS32r6 binaries but without support for O32 with FP64 is therefore a problem which can lead to incorrectly executed userland.
CONFIG_MIPS_O32_FP64_SUPPORT is already selected when the kernel is configured for MIPS32r6, but not when the kernel is configured for MIPS64r6 with O32 compat support. Select CONFIG_MIPS_O32_FP64_SUPPORT in such configurations to prevent building kernels which execute MIPS32r6 userland incorrectly.
Patchwork: https://patchwork.linux-mips.org/patch/10674/
--- arch/mips/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/mips/Kconfig +1 -0
@@ -1417,6 +1417,7 @@ config CPU_MIPS64_R6 select CPU_SUPPORTS_HIGHMEM select CPU_SUPPORTS_MSA select GENERIC_CSUM + select MIPS_O32_FP64_SUPPORT if MIPS32_O32 help Choose this option to build a kernel for release 6 or later of the MIPS64 architecture. New MIPS processors, starting with the Warrior
Greg Kroah-Hartman
maintainerPATCH 15/123 MIPS: fpu.h: Allow 64-bit FPU on a 64-bit MIPS R6 CPU
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markos Chandras <[email protected]>
commit fcc53b5f6c38acbf5d311ffc3e0da517491c6f7b upstream.
Commit 6134d94923d0 ("MIPS: asm: fpu: Allow 64-bit FPU on MIPS32 R6") added support for 64-bit FPU on a 32-bit MIPS R6 processor but it missed the 64-bit CPU case leading to FPU failures when requesting FR=1 mode (which is always the case for MIPS R6 userland) when running a 32-bit kernel on a 64-bit CPU. We also fix the MIPS R2 case.
Patchwork: https://patchwork.linux-mips.org/patch/10734/
--- arch/mips/include/asm/fpu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/include/asm/fpu.h +1 -1
@@ -74,7 +74,7 @@ static inline int __enable_fpu(enum fpu_ goto fr_common;case FPU_64BIT : -#if !(defined(CONFIG_CPU_MIPS32_R2 ) || defined(CONFIG_CPU_MIPS32_R6 ) \ +#if !(defined(CONFIG_CPU_MIPSR2 ) || defined(CONFIG_CPU_MIPSR6 ) \ || defined(CONFIG_64BIT ))/* we only have a 32-bit FPU */ return SIGFPE ;
Greg Kroah-Hartman
maintainerPATCH 16/123 can: replace timestamp as unique skb attribute
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Hartkopp <[email protected]>
commit d3b58c47d330de8c29898fe9746f7530408f8a59 upstream.
Commit 514ac99c64b "can: fix multiple delivery of a single CAN frame for overlapping CAN filters" requires the skb->tstamp to be set to check for identical CAN skbs.
Without timestamping to be required by user space applications this timestamp was not generated which lead to commit 36c01245eb8 "can: fix loss of CAN frames in raw_rcv" - which forces the timestamp to be set in all CAN related skbuffs by introducing several __net_timestamp() calls.
This forces e.g. out of tree drivers which are not using alloc_can{,fd}_skb() to add __net_timestamp() after skbuff creation to prevent the frame loss fixed in mainline Linux.
This patch removes the timestamp dependency and uses an atomic counter to create an unique identifier together with the skbuff pointer.
Btw: the new skbcnt element introduced in struct can_skb_priv has to be initialized with zero in out-of-tree drivers which are not using alloc_can{,fd}_skb() too.
--- drivers/net/can/dev.c | 7 ++----- drivers/net/can/slcan.c | 2 +- drivers/net/can/vcan.c | 3 --- include/linux/can/skb.h | 2 ++ net/can/af_can.c | 12 +++++++----- net/can/bcm.c | 2 ++ net/can/raw.c | 7 ++++--- 7 files changed, 18 insertions(+), 17 deletions(-)
drivers/net/can/dev.c +2 -5
@@ -440,9 +440,6 @@ unsigned int can_get_echo_skb(struct netstruct can_frame *cf = (struct can_frame *)skb->data;u8 dlc = cf->can_dlc; -if (!(skb->tstamp.tv64)) -__net_timestamp (skb); -netif_rx (priv->echo_skb[idx]); priv->echo_skb[idx] =NULL ;
@@ -578,7 +575,6 @@ struct sk_buff *alloc_can_skb(struct netif (unlikely (!skb))return NULL ; -__net_timestamp (skb); skb->protocol =htons (ETH_P_CAN ); skb->pkt_type =PACKET_BROADCAST ; skb->ip_summed =CHECKSUM_UNNECESSARY ;
@@ -589,6 +585,7 @@ struct sk_buff *alloc_can_skb(struct netcan_skb_reserve (skb);can_skb_prv (skb)->ifindex = dev->ifindex; +can_skb_prv (skb)->skbcnt =0 ; *cf = (struct can_frame *)skb_put (skb,sizeof (struct can_frame ));memset (*cf,0 ,sizeof (struct can_frame ));
@@ -607,7 +604,6 @@ struct sk_buff *alloc_canfd_skb(struct nif (unlikely (!skb))return NULL ; -__net_timestamp (skb); skb->protocol =htons (ETH_P_CANFD ); skb->pkt_type =PACKET_BROADCAST ; skb->ip_summed =CHECKSUM_UNNECESSARY ;
@@ -618,6 +614,7 @@ struct sk_buff *alloc_canfd_skb(struct ncan_skb_reserve (skb);can_skb_prv (skb)->ifindex = dev->ifindex; +can_skb_prv (skb)->skbcnt =0 ; *cfd = (struct canfd_frame *)skb_put (skb,sizeof (struct canfd_frame ));memset (*cfd,0 ,sizeof (struct canfd_frame ));
drivers/net/can/slcan.c +1 -1
@@ -207,7 +207,6 @@ static void slc_bump(struct slcan *sl)if (!skb)return ; -__net_timestamp (skb); skb->dev = sl->dev; skb->protocol =htons (ETH_P_CAN ); skb->pkt_type =PACKET_BROADCAST ;
@@ -215,6 +214,7 @@ static void slc_bump(struct slcan *sl)can_skb_reserve (skb);can_skb_prv (skb)->ifindex = sl->dev->ifindex; +can_skb_prv (skb)->skbcnt =0 ;memcpy (skb_put (skb,sizeof (struct can_frame )), &cf,sizeof (struct can_frame ));
drivers/net/can/vcan.c +0 -3
@@ -78,9 +78,6 @@ static void vcan_rx(struct sk_buff *skb, skb->dev = dev; skb->ip_summed =CHECKSUM_UNNECESSARY ; -if (!(skb->tstamp.tv64)) -__net_timestamp (skb); -netif_rx_ni (skb); }
include/linux/can/skb.h +2 -0
@@ -27,10 +27,12 @@/** * struct can_skb_priv - private additional data inside CAN sk_buffs * @ifindex: ifindex of the first interface the CAN frame appeared on +* @skbcnt: atomic counter to have an unique id together with skb pointer * @cf: align to the following CAN frame at skb->data */ struct can_skb_priv {int ifindex; +int skbcnt;struct can_frame cf[0 ]; };
net/can/af_can.c +7 -5
@@ -89,6 +89,8 @@ struct timer_list can_stattimer; /* tistruct s_stats can_stats;/* packet statistics */ struct s_pstats can_pstats;/* receive list statistics */ +static atomic_t skbcounter =ATOMIC_INIT (0 ); +/* * af_can socket functions */
@@ -310,12 +312,8 @@ int can_send(struct sk_buff *skb, int loreturn err; } -if (newskb) { -if (!(newskb->tstamp.tv64)) -__net_timestamp (newskb); - +if (newskb)netif_rx_ni (newskb); - }/* update statistics */ can_stats.tx_frames++;
@@ -683,6 +681,10 @@ static void can_receive(struct sk_buff * can_stats.rx_frames++; can_stats.rx_frames_delta++; +/* create non-zero unique skb identifier together with *skb */ +while (!(can_skb_prv (skb)->skbcnt)) +can_skb_prv (skb)->skbcnt =atomic_inc_return (&skbcounter); +rcu_read_lock ();/* deliver the packet to sockets listening on all devices */
net/can/bcm.c +2 -0
@@ -261,6 +261,7 @@ static void bcm_can_tx(struct bcm_op *opcan_skb_reserve (skb);can_skb_prv (skb)->ifindex = dev->ifindex; +can_skb_prv (skb)->skbcnt =0 ;memcpy (skb_put (skb,CFSIZ ), cf,CFSIZ );
@@ -1217,6 +1218,7 @@ static int bcm_tx_send(struct msghdr *ms }can_skb_prv (skb)->ifindex = dev->ifindex; +can_skb_prv (skb)->skbcnt =0 ; skb->dev = dev;can_skb_set_owner (skb, sk); err =can_send (skb,1 );/* send with loopback */
net/can/raw.c +4 -3
@@ -75,7 +75,7 @@ MODULE_ALIAS("can-proto-1");*/ struct uniqframe { -ktime_t tstamp; +int skbcnt;const struct sk_buff *skb;unsigned int join_rx_count; };
@@ -133,7 +133,7 @@ static void raw_rcv(struct sk_buff *oskb/* eliminate multiple filter matches for the same skb */ if (this_cpu_ptr (ro->uniq)->skb == oskb && -ktime_equal (this_cpu_ptr (ro->uniq)->tstamp, oskb->tstamp)) { +this_cpu_ptr (ro->uniq)->skbcnt ==can_skb_prv (oskb)->skbcnt) {if (ro->join_filters) {this_cpu_inc (ro->uniq->join_rx_count);/* drop frame until all enabled filters matched */
@@ -144,7 +144,7 @@ static void raw_rcv(struct sk_buff *oskb } }else {this_cpu_ptr (ro->uniq)->skb = oskb; -this_cpu_ptr (ro->uniq)->tstamp = oskb->tstamp; +this_cpu_ptr (ro->uniq)->skbcnt =can_skb_prv (oskb)->skbcnt;this_cpu_ptr (ro->uniq)->join_rx_count =1 ;/* drop first frame to check all enabled filters? */ if (ro->join_filters && ro->count >1 )
@@ -749,6 +749,7 @@ static int raw_sendmsg(struct socket *socan_skb_reserve (skb);can_skb_prv (skb)->ifindex = dev->ifindex; +can_skb_prv (skb)->skbcnt =0 ; err =memcpy_from_msg (skb_put (skb, size), msg, size);if (err <0 )
Greg Kroah-Hartman
maintainerPATCH 17/123 can: rcar_can: fix IRQ check
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergei Shtylyov <[email protected]>
commit 5e63e6baa159fa8c787cf783dbf3d77fbea97331 upstream.
rcar_can_probe() regards 0 as a wrong IRQ #, despite platform_get_irq() that it calls returns negative error code in that case. This leads to the following being printed to the console when attempting to open the device:
error requesting interrupt fffffffa
because rcar_can_open() calls request_irq() with a negative IRQ #, and that function naturally fails with -EINVAL.
Check for the negative error codes instead and propagate them upstream instead of just returning -ENODEV.
--- drivers/net/can/rcar_can.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/can/rcar_can.c +2 -1
@@ -758,8 +758,9 @@ static int rcar_can_probe(struct platfor } irq =platform_get_irq (pdev,0 ); -if (!irq) { +if (irq <0 ) {dev_err (&pdev->dev,"No IRQ resource\n" ); + err = irq; goto fail; }
Greg Kroah-Hartman
maintainerPATCH 18/123 can: c_can: Fix default pinmux glitch at init
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: "J.D. Schroeder" <[email protected]>
commit 033365191136c97f88c81b7bd0011414db28bb4e upstream.
The previous change 3973c526ae9c (net: can: c_can: Disable pins when CAN interface is down) causes a slight glitch on the pinctrl settings when used. Since commit ab78029 (drivers/pinctrl: grab default handles from device core), the device core will automatically set the default pins. This causes the pins to be momentarily set to the default and then to the sleep state in register_c_can_dev(). By adding an optional "enable" state, boards can set the default pin state to be disabled and avoid the glitch when the switch from default to sleep first occurs. If the "enable" state is not available c_can_pinctrl_select_state() falls back to using the "default" pinctrl state.
[Roger Q] - Forward port to v4.2 and use pinctrl_get_select().
--- drivers/net/can/c_can/c_can.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/net/can/c_can/c_can.c +8 -2
@@ -592,6 +592,7 @@ static int c_can_start(struct net_device {struct c_can_priv *priv =netdev_priv (dev);int err; +struct pinctrl *p;/* basic c_can configuration */ err =c_can_chip_config (dev);
@@ -604,8 +605,13 @@ static int c_can_start(struct net_device priv->can.state =CAN_STATE_ERROR_ACTIVE ; -/* activate pins */ -pinctrl_pm_select_default_state (dev->dev.parent); +/* Attempt to use "active" if available else use "default" */ + p =pinctrl_get_select (priv->device,"active" ); +if (!IS_ERR (p)) +pinctrl_put (p); +else +pinctrl_pm_select_default_state (priv->device); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 19/123 can: rcar_can: print signed IRQ #
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergei Shtylyov <[email protected]>
commit c1a4c87b06fa564d6e2760a12d4e5a09badc684b upstream.
Printing IRQ # using "%x" and "%u" unsigned formats isn't quite correct as 'ndev->irq' is of type *int*, so the "%d" format needs to be used instead.
While fixing this, beautify the dev_info() message in rcar_can_probe() a bit.
--- drivers/net/can/rcar_can.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/can/rcar_can.c +2 -2
@@ -526,7 +526,7 @@ static int rcar_can_open(struct net_devinapi_enable (&priv->napi); err =request_irq (ndev->irq, rcar_can_interrupt,0 , ndev->name, ndev);if (err) { -netdev_err (ndev,"error requesting interrupt %x\n" , ndev->irq); +netdev_err (ndev,"error requesting interrupt %d\n" , ndev->irq); goto out_close; }can_led_event (ndev,CAN_LED_EVENT_OPEN );
@@ -824,7 +824,7 @@ static int rcar_can_probe(struct platfordevm_can_led_init (ndev); -dev_info (&pdev->dev,"device registered (reg_base=%p, irq=%u)\n" , +dev_info (&pdev->dev,"device registered (regs @ %p, IRQ%d)\n" , priv->regs, ndev->irq);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 20/123 can: mcp251x: fix resume when device is down
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Agner <[email protected]>
commit 25b401c1816ae64bcc5dcb1d39ab41812522a0ce upstream.
If a valid power regulator or a dummy regulator is used (which happens to be the case when no regulator is specified), restart_work is queued no matter whether the device was running or not at suspend time. Since work queues get initialized in the ndo_open callback, resuming leads to a NULL pointer exception.
Reverse exactly the steps executed at suspend time:
- Enable the power regulator in any case
- Enable the transceiver regulator if the device was running, even in case we have a power regulator
- Queue restart_work only in case the device was running
--- drivers/net/can/spi/mcp251x.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/net/can/spi/mcp251x.c +6 -7
@@ -1221,17 +1221,16 @@ static int __maybe_unused mcp251x_can_restruct spi_device *spi =to_spi_device (dev);struct mcp251x_priv *priv =spi_get_drvdata (spi); -if (priv->after_suspend &AFTER_SUSPEND_POWER ) { +if (priv->after_suspend &AFTER_SUSPEND_POWER )mcp251x_power_enable (priv->power,1 ); + +if (priv->after_suspend &AFTER_SUSPEND_UP ) { +mcp251x_power_enable (priv->transceiver,1 );queue_work (priv->wq, &priv->restart_work); }else { -if (priv->after_suspend &AFTER_SUSPEND_UP ) { -mcp251x_power_enable (priv->transceiver,1 ); -queue_work (priv->wq, &priv->restart_work); - }else { - priv->after_suspend =0 ; - } + priv->after_suspend =0 ; } + priv->force_quit =0 ;enable_irq (spi->irq);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 21/123 freeing unlinked file indefinitely delayed
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 75a6f82a0d10ef8f13cd8fe7212911a0252ab99e upstream.
Normally opening a file, unlinking it and then closing will have
the inode freed upon close() (provided that it's not otherwise busy and has no remaining links, of course). However, there's one case where that does *not* happen. Namely, if you open it by fhandle with cold dcache, then unlink() and close().
In normal case you get d_delete() in unlink(2) notice that dentry
is busy and unhash it; on the final dput() it will be forcibly evicted from dcache, triggering iput() and inode removal. In this case, though, we end up with *two* dentries - disconnected (created by open-by-fhandle) and regular one (used by unlink()). The latter will have its reference to inode dropped just fine, but the former will not - it's considered hashed (it is on the ->s_anon list), so it will stay around until the memory pressure will finally do it in. As the result, we have the final iput() delayed indefinitely. It's trivial to reproduce -
void flush_dcache(void)
{
system("mount -o remount,rw /");
}static char buf[20 * 1024 * 1024];
main()
{
int fd;
union {
struct file_handle f;
char buf[MAX_HANDLE_SZ];
} x;
int m;
x.f.handle_bytes = sizeof(x);
chdir("/root");
mkdir("foo", 0700);
fd = open("foo/bar", O_CREAT | O_RDWR, 0600);
close(fd);
name_to_handle_at(AT_FDCWD, "foo/bar", &x.f, &m, 0);
flush_dcache();
fd = open_by_handle_at(AT_FDCWD, &x.f, O_RDWR);
unlink("foo/bar");
write(fd, buf, sizeof(buf));
system("df ."); /* 20Mb eaten */
close(fd);
system("df ."); /* should've freed those 20Mb */
flush_dcache();
system("df ."); /* should be the same as #2 */
}will spit out something like
Filesystem 1K-blocks Used Available Use% Mounted on/dev/root 322023 303843 1131 100% /
Filesystem 1K-blocks Used Available Use% Mounted on/dev/root 322023 303843 1131 100% /
Filesystem 1K-blocks Used Available Use% Mounted on/dev/root 322023 283282 21692 93% /
- inode gets freed only when dentry is finally evicted (here we trigger than by remount; normally it would've happened in response to memory pressure hell knows when).
--- fs/dcache.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/dcache.c +5 -2
@@ -642,7 +642,7 @@ static inline bool fast_dput(struct dent/* * If we have a d_op->d_delete() operation, we sould not -* let the dentry count go to zero, so use "put__or_lock". +* let the dentry count go to zero, so use "put_or_lock". */ if (unlikely (dentry->d_flags &DCACHE_OP_DELETE ))return lockref_put_or_lock (&dentry->d_lockref);
@@ -697,7 +697,7 @@ static inline bool fast_dput(struct dent*/ smp_rmb (); d_flags =ACCESS_ONCE (dentry->d_flags); - d_flags &=DCACHE_REFERENCED |DCACHE_LRU_LIST ; + d_flags &=DCACHE_REFERENCED |DCACHE_LRU_LIST |DCACHE_DISCONNECTED ;/* Nothing to do? Dropping the reference was all we needed? */ if (d_flags == (DCACHE_REFERENCED |DCACHE_LRU_LIST ) && !d_unhashed (dentry))
@@ -776,6 +776,9 @@ repeat:if (unlikely (d_unhashed (dentry))) goto kill_it; +if (unlikely (dentry->d_flags &DCACHE_DISCONNECTED )) + goto kill_it; +if (unlikely (dentry->d_flags &DCACHE_OP_DELETE )) {if (dentry->d_op->d_delete (dentry)) goto kill_it;
Greg Kroah-Hartman
maintainerPATCH 22/123 x86/init: Clear init_level4_pgt earlier
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Ryabinin <[email protected]>
commit d0f77d4d04b222a817925d33ba3589b190bfa863 upstream.
Currently x86_64_start_kernel() has two KASAN related function calls. The first call maps shadow to early_level4_pgt, the second maps shadow to init_level4_pgt.
If we move clear_page(init_level4_pgt) earlier, we could hide KASAN low level detail from generic x86_64 initialization code. The next patch will do it.
--- arch/x86/kernel/head64.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/kernel/head64.c +2 -1
@@ -166,6 +166,8 @@ asmlinkage __visible void __init x86_64_/* clear bss before set_intr_gate with early_idt_handler */ clear_bss (); +clear_page (init_level4_pgt); +for (i =0 ; i <NUM_EXCEPTION_VECTORS ; i++)set_intr_gate (i, early_idt_handler_array[i]);load_idt ((const struct desc_ptr *)&idt_descr);
@@ -177,7 +179,6 @@ asmlinkage __visible void __init x86_64_*/ load_ucode_bsp (); -clear_page (init_level4_pgt);/* set init_level4_pgt kernel high mapping*/ init_level4_pgt[511 ] = early_level4_pgt[511 ];
Greg Kroah-Hartman
maintainerPATCH 23/123 x86/kasan: Fix KASAN shadow region page tables
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Popov <[email protected]>
commit 5d5aa3cfca5cf74cd928daf3674642e6004328d1 upstream.
Currently KASAN shadow region page tables created without respect of physical offset (phys_base). This causes kernel halt when phys_base is not zero.
So let's initialize KASAN shadow region page tables in kasan_early_init() using __pa_nodebug() which considers phys_base.
This patch also separates x86_64_start_kernel() from KASAN low level details by moving kasan_map_early_shadow(init_level4_pgt) into kasan_early_init().
Remove the comment before clear_bss() which stopped bringing much profit to the code readability. Otherwise describing all the new order dependencies would be too verbose.
--- arch/x86/include/asm/kasan.h | 8 ++------ arch/x86/kernel/head64.c | 7 ++----- arch/x86/kernel/head_64.S | 29 ----------------------------- arch/x86/mm/kasan_init_64.c | 36 ++++++++++++++++++++++++++++++++++-- 4 files changed, 38 insertions(+), 42 deletions(-)
arch/x86/include/asm/kasan.h +2 -6
@@ -14,15 +14,11 @@#ifndef __ASSEMBLY__ -extern pte_t kasan_zero_pte[]; -extern pte_t kasan_zero_pmd[]; -extern pte_t kasan_zero_pud[]; -#ifdef CONFIG_KASAN -void __init kasan_map_early_shadow (pgd_t *pgd); +void __init kasan_early_init (void );void __init kasan_init (void );#else -static inline void kasan_map_early_shadow (pgd_t *pgd) { } +static inline void kasan_early_init (void ) { }static inline void kasan_init (void ) { }#endif
arch/x86/kernel/head64.c +2 -5
@@ -161,13 +161,12 @@ asmlinkage __visible void __init x86_64_/* Kill off the identity-map trampoline */ reset_early_page_tables (); -kasan_map_early_shadow (early_level4_pgt); - -/* clear bss before set_intr_gate with early_idt_handler */ clear_bss ();clear_page (init_level4_pgt); +kasan_early_init (); +for (i =0 ; i <NUM_EXCEPTION_VECTORS ; i++)set_intr_gate (i, early_idt_handler_array[i]);load_idt ((const struct desc_ptr *)&idt_descr);
@@ -182,8 +181,6 @@ asmlinkage __visible void __init x86_64_/* set init_level4_pgt kernel high mapping*/ init_level4_pgt[511 ] = early_level4_pgt[511 ]; -kasan_map_early_shadow (init_level4_pgt); -x86_64_start_reservations (real_mode_data); }
arch/x86/kernel/head_64.S +0 -29
@@ -516,38 +516,9 @@ ENTRY(phys_base) /* This must match the first entry in level2_kernel_pgt */ .quad 0x0000000000000000 -#ifdef CONFIG_KASAN -#define FILL(VAL, COUNT) \ - .rept (COUNT) ; \ - .quad (VAL) ; \ - .endr - -NEXT_PAGE(kasan_zero_pte) - FILL(kasan_zero_page - __START_KERNEL_map + _KERNPG_TABLE, 512) -NEXT_PAGE(kasan_zero_pmd) - FILL(kasan_zero_pte - __START_KERNEL_map + _KERNPG_TABLE, 512) -NEXT_PAGE(kasan_zero_pud) - FILL(kasan_zero_pmd - __START_KERNEL_map + _KERNPG_TABLE, 512) - -#undef FILL -#endif - - #include "../../x86/xen/xen-head.S" __PAGE_ALIGNED_BSS NEXT_PAGE(empty_zero_page) .skip PAGE_SIZE -#ifdef CONFIG_KASAN -/* - * This page used as early shadow. We don't use empty_zero_page - * at early stages, stack instrumentation could write some garbage - * to this page. - * Latter we reuse it as zero shadow for large ranges of memory - * that allowed to access, but not instrumented by kasan - * (vmalloc/vmemmap ...). - */ -NEXT_PAGE(kasan_zero_page) - .skip PAGE_SIZE -#endif
arch/x86/mm/kasan_init_64.c +34 -2
@@ -11,7 +11,19 @@extern pgd_t early_level4_pgt[PTRS_PER_PGD ];extern struct range pfn_mapped[E820_X_MAX ]; -extern unsigned char kasan_zero_page[PAGE_SIZE ]; +static pud_t kasan_zero_pud[PTRS_PER_PUD] __page_aligned_bss; +static pmd_t kasan_zero_pmd[PTRS_PER_PMD] __page_aligned_bss; +static pte_t kasan_zero_pte[PTRS_PER_PTE] __page_aligned_bss; + +/* +* This page used as early shadow. We don't use empty_zero_page +* at early stages, stack instrumentation could write some garbage +* to this page. +* Latter we reuse it as zero shadow for large ranges of memory +* that allowed to access, but not instrumented by kasan +* (vmalloc/vmemmap ...). +*/ +static unsigned char kasan_zero_page[PAGE_SIZE] __page_aligned_bss;static int __init map_range (struct range *range) {
@@ -36,7 +48,7 @@ static void __init clear_pgds(unsigned lpgd_clear (pgd_offset_k (start)); } -void __init kasan_map_early_shadow (pgd_t *pgd) +static void __init kasan_map_early_shadow (pgd_t *pgd) {int i;unsigned long start =KASAN_SHADOW_START ;
@@ -166,6 +178,26 @@ static struct notifier_block kasan_die_n };#endif +void __init kasan_early_init (void ) +{ +int i; +pteval_t pte_val =__pa_nodebug (kasan_zero_page) | __PAGE_KERNEL; +pmdval_t pmd_val =__pa_nodebug (kasan_zero_pte) | _KERNPG_TABLE; +pudval_t pud_val =__pa_nodebug (kasan_zero_pmd) | _KERNPG_TABLE; + +for (i =0 ; i <PTRS_PER_PTE ; i++) + kasan_zero_pte[i] =__pte (pte_val); + +for (i =0 ; i <PTRS_PER_PMD ; i++) + kasan_zero_pmd[i] =__pmd (pmd_val); + +for (i =0 ; i <PTRS_PER_PUD ; i++) + kasan_zero_pud[i] =__pud (pud_val); + +kasan_map_early_shadow (early_level4_pgt); +kasan_map_early_shadow (init_level4_pgt); +} +void __init kasan_init (void ) {int i;
Greg Kroah-Hartman
maintainerPATCH 24/123 x86/kasan: Flush TLBs after switching CR3
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Ryabinin <[email protected]>
commit 241d2c54c62fa0939fc9a9512b48ac3434e90a89 upstream.
load_cr3() doesn't cause tlb_flush if PGE enabled.
This may cause tons of false positive reports spamming the kernel to death.
To fix this __flush_tlb_all() should be called explicitly after CR3 changed.
--- arch/x86/mm/kasan_init_64.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/mm/kasan_init_64.c +2 -0
@@ -208,6 +208,7 @@ void __init kasan_init(void)memcpy (early_level4_pgt, init_level4_pgt,sizeof (early_level4_pgt));load_cr3 (early_level4_pgt); +__flush_tlb_all ();clear_pgds (KASAN_SHADOW_START ,KASAN_SHADOW_END );
@@ -234,5 +235,6 @@ void __init kasan_init(void)memset (kasan_zero_page,0 ,PAGE_SIZE );load_cr3 (init_level4_pgt); +__flush_tlb_all (); init_task.kasan_depth =0 ; }
Greg Kroah-Hartman
maintainerPATCH 25/123 x86/kasan: Fix boot crash on AMD processors
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Ryabinin <[email protected]>
commit d4f86beacc21d538dc41e1fc75a22e084f547edf upstream.
While populating zero shadow wrong bits in upper level page tables used. __PAGE_KERNEL_RO that was used for pgd/pud/pmd has _PAGE_BIT_GLOBAL set. Global bit is present only in the lowest level of the page translation hierarchy (ptes), and it should be zero in upper levels.
This bug seems doesn't cause any troubles on Intel cpus, while on AMDs it cause kernel crash on boot.
Use _KERNPG_TABLE bits for pgds/puds/pmds to fix this.
--- arch/x86/mm/kasan_init_64.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/x86/mm/kasan_init_64.c +3 -3
@@ -85,7 +85,7 @@ static int __init zero_pmd_populate(pud_while (IS_ALIGNED (addr,PMD_SIZE ) && addr +PMD_SIZE <= end) {WARN_ON (!pmd_none (*pmd));set_pmd (pmd,__pmd (__pa_nodebug (kasan_zero_pte) - | __PAGE_KERNEL_RO)); + | _KERNPG_TABLE)); addr +=PMD_SIZE ; pmd =pmd_offset (pud, addr); }
@@ -111,7 +111,7 @@ static int __init zero_pud_populate(pgd_while (IS_ALIGNED (addr,PUD_SIZE ) && addr +PUD_SIZE <= end) {WARN_ON (!pud_none (*pud));set_pud (pud,__pud (__pa_nodebug (kasan_zero_pmd) - | __PAGE_KERNEL_RO)); + | _KERNPG_TABLE)); addr +=PUD_SIZE ; pud =pud_offset (pgd, addr); }
@@ -136,7 +136,7 @@ static int __init zero_pgd_populate(unsiwhile (IS_ALIGNED (addr,PGDIR_SIZE ) && addr +PGDIR_SIZE <= end) {WARN_ON (!pgd_none (*pgd));set_pgd (pgd,__pgd (__pa_nodebug (kasan_zero_pud) - | __PAGE_KERNEL_RO)); + | _KERNPG_TABLE)); addr +=PGDIR_SIZE ; pgd =pgd_offset_k (addr); }
Greg Kroah-Hartman
maintainerPATCH 26/123 crypto: omap-des - Fix unmapping of dma channels
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Vutla, Lokesh" <[email protected]>
commit acb33cc541d7a5495b16a133702d4c401ea4e294 upstream.
dma_unmap_sg() is being called twice after completing the task. Looks like this is a copy paste error when creating des driver.
With this the following warn appears during boot:
[ 4.210457] ------------[ cut here ]------------ [ 4.215114] WARNING: CPU: 0 PID: 0 at lib/dma-debug.c:1080 check_unmap+0x710/0x9a0() [ 4.222899] omap-des 480a5000.des: DMA-API: device driver tries to free DMA memory it has not allocated [device address=0x00000000ab2ce000] [size=8 bytes] [ 4.236785] Modules linked in: [ 4.239860] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.14.39-02999-g1bc045a-dirty #182 [ 4.247918] [<c001678c>] (unwind_backtrace) from [<c0012574>] (show_stack+0x10/0x14) [ 4.255710] [<c0012574>] (show_stack) from [<c05a37e8>] (dump_stack+0x84/0xb8) [ 4.262977] [<c05a37e8>] (dump_stack) from [<c0046464>] (warn_slowpath_common+0x68/0x8c) [ 4.271107] [<c0046464>] (warn_slowpath_common) from [<c004651c>] (warn_slowpath_fmt+0x30/0x40) [ 4.279854] [<c004651c>] (warn_slowpath_fmt) from [<c02d50a4>] (check_unmap+0x710/0x9a0) [ 4.287991] [<c02d50a4>] (check_unmap) from [<c02d5478>] (debug_dma_unmap_sg+0x90/0x19c) [ 4.296128] [<c02d5478>] (debug_dma_unmap_sg) from [<c04a77d8>] (omap_des_done_task+0x1cc/0x3e4) [ 4.304963] [<c04a77d8>] (omap_des_done_task) from [<c004a090>] (tasklet_action+0x84/0x124) [ 4.313370] [<c004a090>] (tasklet_action) from [<c004a4ac>] (__do_softirq+0xf0/0x20c) [ 4.321235] [<c004a4ac>] (__do_softirq) from [<c004a840>] (irq_exit+0x98/0xec) [ 4.328500] [<c004a840>] (irq_exit) from [<c000f9ac>] (handle_IRQ+0x50/0xb0) [ 4.335589] [<c000f9ac>] (handle_IRQ) from [<c0008688>] (gic_handle_irq+0x28/0x5c)
Removing the duplicate call to dma_unmap_sg().
--- drivers/crypto/omap-des.c | 3 --- 1 file changed, 3 deletions(-)
drivers/crypto/omap-des.c +0 -3
@@ -536,9 +536,6 @@ static int omap_des_crypt_dma_stop(strucdmaengine_terminate_all (dd->dma_lch_in);dmaengine_terminate_all (dd->dma_lch_out); -dma_unmap_sg (dd->dev, dd->in_sg, dd->in_sg_len,DMA_TO_DEVICE ); -dma_unmap_sg (dd->dev, dd->out_sg, dd->out_sg_len,DMA_FROM_DEVICE ); -return err; }
Greg Kroah-Hartman
maintainerPATCH 27/123 s390/process: fix sfpc inline assembly
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
commit e47994dd44bcb4a77b4152bd0eada585934703c0 upstream.
The sfpc inline assembly within execve_tail() may incorrectly set bits 28-31 of the sfpc instruction to a value which is not zero. These bits however are currently unused and therefore should be zero so we won't get surprised if these bits will be used in the future.
Therefore remove the second operand from the inline assembly.
--- arch/s390/kernel/process.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/kernel/process.c +1 -1
@@ -163,7 +163,7 @@ int copy_thread(unsigned long clone_flag asmlinkage void execve_tail(void) { current->thread.fp_regs.fpc =0 ; - asmvolatile ("sfpc %0,%0" : :"d" (0 )); + asmvolatile ("sfpc %0" : :"d" (0 )); }/*
Greg Kroah-Hartman
maintainerPATCH 28/123 s390/sclp: clear upper register halves in _sclp_print_early
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
commit f9c87a6f46d508eae0d9ae640be98d50f237f827 upstream.
If the kernel is compiled with gcc 5.1 and the XZ compression option the decompress_kernel function calls _sclp_print_early in 64-bit mode while the content of the upper register half of %r6 is non-zero. This causes a specification exception on the servc instruction in _sclp_servc.
The _sclp_print_early function saves and restores the upper registers halves but it fails to clear them for the 31-bit code of the mini sclp driver.
--- arch/s390/kernel/sclp.S | 4 ++++ 1 file changed, 4 insertions(+)
arch/s390/kernel/sclp.S +4 -0
@@ -270,6 +270,8 @@ ENTRY(_sclp_print_early) jno .Lesa2 ahi %r15,-80 stmh %r6,%r15,96(%r15) # store upper register halves + basr %r13,0 + lmh %r0,%r15,.Lzeroes-.(%r13) # clear upper register halves .Lesa2: lr %r10,%r2 # save string pointer lhi %r2,0
@@ -291,6 +293,8 @@ ENTRY(_sclp_print_early) .Lesa3: lm %r6,%r15,120(%r15) # restore registers br %r14 +.Lzeroes: + .fill 64,4,0 .LwritedataS4: .long 0x00760005 # SCLP command for write data
Greg Kroah-Hartman
maintainerPATCH 29/123 s390/nmi: fix vector register corruption
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
commit cad49cfc44a5160e3fa09b18e4e7f7cacd13f27d upstream.
If a machine check happens, the machine has the vector facility installed and the extended save area exists, the cpu will save vector register contents into the extended save area. This is regardless of control register 0 contents, which enables and disables the vector facility during runtime.
On each machine check we should validate the vector registers. The current code however tries to validate the registers only if the running task is using vector registers in user space.
However even the current code is broken and causes vector register corruption on machine checks, if user space uses them:
the prefix area contains a pointer (absolute address) to the machine check extended save area. In order to save some space the save area was put into an unused area of the second prefix page.
When validating vector register contents the code uses the absolute address of the extended save area, which is wrong. Due to prefixing the vector instructions will then access contents using absolute addresses instead of real addresses, where the machine stored the contents.
If the above would work there is still the problem that register validition would only happen if user space uses vector registers. If kernel space uses them also, this may also lead to vector register content corruption:
if the kernel makes use of vector instructions, but the current running user space context does not, the machine check handler will validate floating point registers instead of vector registers.
Given the fact that writing to a floating point register may change the upper halve of the corresponding vector register, we also experience vector register corruption in this case.
Fix all of these issues, and always validate vector registers on each machine check, if the machine has the vector facility installed and the extended save area is defined.
--- arch/s390/include/asm/ctl_reg.h | 5 +++ arch/s390/kernel/nmi.c | 51 +++++++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 22 deletions(-)
arch/s390/include/asm/ctl_reg.h +4 -1
@@ -57,7 +57,10 @@ union ctlreg0 { unsigned long lap : 1; /* Low-address-protection control */ unsigned long : 4; unsigned long edat : 1; /* Enhanced-DAT-enablement control */ - unsigned long : 23; + unsigned long : 4; + unsigned long afp : 1; /* AFP-register control */ + unsigned long vx : 1; /* Vector enablement control */ + unsigned long : 17; }; };
arch/s390/kernel/nmi.c +30 -21
70 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 30/123 s390/bpf: clear correct BPF accumulator register
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Holzheu <[email protected]>
commit 30342fe65e511007672437741158d493472f427f upstream.
Currently we assumed the following BPF to eBPF register mapping:
- BPF_REG_A -> BPF_REG_7
- BPF_REG_X -> BPF_REG_8
Unfortunately this mapping is wrong. The correct mapping is:
- BPF_REG_A -> BPF_REG_0
- BPF_REG_X -> BPF_REG_7
So clear the correct registers and use the BPF_REG_A and BPF_REG_X macros instead of BPF_REG_0/7.
--- arch/s390/net/bpf_jit_comp.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
arch/s390/net/bpf_jit_comp.c +7 -7
@@ -415,13 +415,13 @@ static void bpf_jit_prologue(struct bpf_EMIT6_DISP_LH (0xe3000000 ,0x0004 ,REG_SKB_DATA ,REG_0 ,BPF_REG_1 , offsetof(struct sk_buff , data)); } -/* BPF compatibility: clear A (%b7) and X (%b8) registers */ -if (REG_SEEN (BPF_REG_7 )) -/* lghi %b7,0 */ -EMIT4_IMM (0xa7090000 ,BPF_REG_7 ,0 ); -if (REG_SEEN (BPF_REG_8 )) -/* lghi %b8,0 */ -EMIT4_IMM (0xa7090000 ,BPF_REG_8 ,0 ); +/* BPF compatibility: clear A (%b0) and X (%b7) registers */ +if (REG_SEEN (BPF_REG_A )) +/* lghi %ba,0 */ +EMIT4_IMM (0xa7090000 ,BPF_REG_A ,0 ); +if (REG_SEEN (BPF_REG_X )) +/* lghi %bx,0 */ +EMIT4_IMM (0xa7090000 ,BPF_REG_X ,0 ); }/*
Greg Kroah-Hartman
maintainerPATCH 31/123 s390/cachinfo: add missing facility check to init_cache_level()
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
commit 0b991f5cdcd6201e5401f83ca3a672343c3bfc49 upstream.
Stephen Powell reported the following crash on a z890 machine:
Kernel BUG at 00000000001219d0 [verbose debug info unavailable] illegal operation: 0001 ilc:3 [#1] SMP Krnl PSW : 0704e00180000000 00000000001219d0 (init_cache_level+0x38/0xe0) R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:3 CC:2 PM:0 EA:3 Krnl Code: 00000000001219c2: a7840056 brc 8,121a6e 00000000001219c6: a7190000 lghi %r1,0 #00000000001219ca: eb101000004c ecag %r1,%r0,0(%r1) >00000000001219d0: a7390000 lghi %r3,0 00000000001219d4: e310f0a00024 stg %r1,160(%r15) 00000000001219da: a7080000 lhi %r0,0 00000000001219de: a7b9f000 lghi %r11,-4096 00000000001219e2: c0a0002899d9 larl %r10,634d94 Call Trace: [<0000000000478ee2>] detect_cache_attributes+0x2a/0x2b8 [<000000000097c9b0>] cacheinfo_sysfs_init+0x60/0xc8 [<00000000001001c0>] do_one_initcall+0x98/0x1c8 [<000000000094fdc2>] kernel_init_freeable+0x212/0x2d8 [<000000000062352e>] kernel_init+0x26/0x118 [<000000000062fd2e>] kernel_thread_starter+0x6/0xc
The illegal operation was executed because of a missing facility check, which should have made sure that the ECAG execution would only be executed on machines which have the general-instructions-extension facility installed.
--- arch/s390/kernel/cache.c | 2 ++ 1 file changed, 2 insertions(+)
arch/s390/kernel/cache.c +2 -0
@@ -138,6 +138,8 @@ int init_cache_level(unsigned int cpu)union cache_topology ct;enum cache_type ctype; +if (!test_facility (34 )) +return -EOPNOTSUPP ;if (!this_cpu_ci)return -EINVAL ; ct.raw =ecag (EXTRACT_TOPOLOGY ,0 ,0 );
Greg Kroah-Hartman
maintainerPATCH 32/123 ARC: Override toplevel default -O2 with -O3
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vineet Gupta <[email protected]>
commit 97709069214eb75312c14946803b9da4d3814203 upstream.
ARC kernels have historically been built with -O3, despite top level Makefile defaulting to -O2. This was facilitated by implicitly ordering of arch makefile include AFTER top level assigned -O2.
An upstream fix to top level a1c48bb160f ("Makefile: Fix unrecognized cross-compiler command line options") changed the ordering, making ARC -O3 defunct.
Fix that by NOT relying on any ordering whatsoever and use the proper arch override facility now present in kbuild (ARCH_*FLAGS)
Depends-on: ("kbuild: Allow arch Makefiles to override {cpp,ld,c}flags")
--- arch/arc/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arc/Makefile +2 -1
@@ -43,7 +43,8 @@ endif ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE # Generic build system uses -O2, we want -O3 -cflags-y += -O3 +# Note: No need to add to cflags-y as that happens anyways +ARCH_CFLAGS += -O3 endif # small data is default for elf32 tool-chain. If not usable, disable it
Greg Kroah-Hartman
maintainerPATCH 33/123 ARC: make sure instruction_pointer() returns unsigned value
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Brodkin <[email protected]>
commit f51e2f1911122879eefefa4c592dea8bf794b39c upstream.
Currently instruction_pointer() returns pt_regs->ret and so return value is of type "long", which implicitly stands for "signed long".
While that's perfectly fine when dealing with 32-bit values if return value of instruction_pointer() gets assigned to 64-bit variable sign extension may happen.
And at least in one real use-case it happens already.
In perf_prepare_sample() return value of perf_instruction_pointer() (which is an alias to instruction_pointer() in case of ARC) is assigned to (struct perf_sample_data)->ip (which type is "u64").
And what we see if instuction pointer points to user-space application that in case of ARC lays below 0x8000_0000 "ip" gets set properly with leading 32 zeros. But if instruction pointer points to kernel address space that starts from 0x8000_0000 then "ip" is set with 32 leadig "f"-s. I.e. id instruction_pointer() returns 0x8100_0000, "ip" will be assigned with 0xffff_ffff__8100_0000. Which is obviously wrong.
In particular that issuse broke output of perf, because perf was unable to associate addresses like 0xffff_ffff__8100_0000 with anything from /proc/kallsyms.
That's what we used to see:
----------->8----------
6.27% ls [unknown] [k] 0xffffffff8046c5cc 2.96% ls libuClibc-0.9.34-git.so [.] memcpy 2.25% ls libuClibc-0.9.34-git.so [.] memset 1.66% ls [unknown] [k] 0xffffffff80666536 1.54% ls libuClibc-0.9.34-git.so [.] 0x000224d6 1.18% ls libuClibc-0.9.34-git.so [.] 0x00022472
----------->8----------
With that change perf output looks much better now:
----------->8----------
8.21% ls [kernel.kallsyms] [k] memset 3.52% ls libuClibc-0.9.34-git.so [.] memcpy 2.11% ls libuClibc-0.9.34-git.so [.] malloc 1.88% ls libuClibc-0.9.34-git.so [.] memset 1.64% ls [kernel.kallsyms] [k] _raw_spin_unlock_irqrestore 1.41% ls [kernel.kallsyms] [k] __d_lookup_rcu
----------->8----------
--- arch/arc/include/asm/ptrace.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arc/include/asm/ptrace.h +1 -1
@@ -63,7 +63,7 @@ struct callee_regs {long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13; }; -#define instruction_pointer (regs) ((regs)->ret) +#define instruction_pointer (regs) (unsigned long)((regs)->ret)#define profile_pc (regs) instruction_pointer(regs)/* return 1 if user mode or 0 if kernel mode */
Greg Kroah-Hartman
maintainerPATCH 34/123 kbuild: Allow arch Makefiles to override {cpp,ld,c}flags
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Marek <[email protected]>
commit 61754c18752ffb78145671e94f053fb202fff041 upstream.
Since commit a1c48bb1 (Makefile: Fix unrecognized cross-compiler command line options), the arch Makefile is included earlier by the main Makefile, preventing the arc architecture to set its -O3 compiler option. Since there might be more use cases for an arch Makefile to fine-tune the options, add support for ARCH_CPPFLAGS, ARCH_AFLAGS and ARCH_CFLAGS variables that are appended to the respective kbuild variables. The user still has the final say via the KCPPFLAGS, KAFLAGS and KCFLAGS variables.
--- Documentation/kbuild/makefiles.txt | 8 ++++++++ Makefile | 9 +++++---- 2 files changed, 13 insertions(+), 4 deletions(-)
Documentation/kbuild/makefiles.txt +8 -0
@@ -952,6 +952,14 @@ When kbuild executes, the following step $(KBUILD_ARFLAGS) set by the top level Makefile to "D" (deterministic mode) if this option is supported by $(AR). + ARCH_CPPFLAGS, ARCH_AFLAGS, ARCH_CFLAGS Overrides the kbuild defaults + + These variables are appended to the KBUILD_CPPFLAGS, + KBUILD_AFLAGS, and KBUILD_CFLAGS, respectively, after the + top-level Makefile has set any other flags. This provides a + means for an architecture to override the defaults. + + --- 6.2 Add prerequisites to archheaders: The archheaders: rule is used to generate header files that
Makefile +5 -4
@@ -783,10 +783,11 @@ endif include scripts/Makefile.kasan include scripts/Makefile.extrawarn -# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments -KBUILD_CPPFLAGS += $(KCPPFLAGS) -KBUILD_AFLAGS += $(KAFLAGS) -KBUILD_CFLAGS += $(KCFLAGS) +# Add any arch overrides and user supplied CPPFLAGS, AFLAGS and CFLAGS as the +# last assignments +KBUILD_CPPFLAGS += $(ARCH_CPPFLAGS) $(KCPPFLAGS) +KBUILD_AFLAGS += $(ARCH_AFLAGS) $(KAFLAGS) +KBUILD_CFLAGS += $(ARCH_CFLAGS) $(KCFLAGS) # Use --build-id when available. LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
Greg Kroah-Hartman
maintainerPATCH 35/123 bio integrity: do not assume bio_integrity_pool exists if bioset exists
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
commit bb8bd38b9a1685334b73e8c62e128cbedb875867 upstream.
bio_integrity_alloc() and bio_integrity_free() assume that if a bio was allocated from a bioset that that bioset also had its bio_integrity_pool allocated using bioset_integrity_create(). This is a very bad assumption given that bioset_create() and bioset_integrity_create() are completely disjoint. Not all callers of bioset_create() have been trained to also call bioset_integrity_create() -- and they may not care to be.
Fix this by falling back to kmalloc'ing 'struct bio_integrity_payload' rather than force all bioset consumers to (wastefully) preallocate a bio_integrity_pool that they very likely won't actually need (given the niche nature of the current block integrity support).
Otherwise, a NULL pointer "Kernel BUG" with a trace like the following will be observed (as seen on s390x using zfcp storage) because dm-io doesn't use bioset_integrity_create() when creating its bioset:
[ 791.643338] Call Trace:
[ 791.643339] ([<00000003df98b848>] 0x3df98b848)
[ 791.643341] [<00000000002c5de8>] bio_integrity_alloc+0x48/0xf8
[ 791.643348] [<00000000002c6486>] bio_integrity_prep+0xae/0x2f0
[ 791.643349] [<0000000000371e38>] blk_queue_bio+0x1c8/0x3d8
[ 791.643355] [<000000000036f8d0>] generic_make_request+0xc0/0x100
[ 791.643357] [<000000000036f9b2>] submit_bio+0xa2/0x198
[ 791.643406] [<000003ff801f9774>] dispatch_io+0x15c/0x3b0 [dm_mod]
[ 791.643419] [<000003ff801f9b3e>] dm_io+0x176/0x2f0 [dm_mod]
[ 791.643423] [<000003ff8074b28a>] do_reads+0x13a/0x1a8 [dm_mirror]
[ 791.643425] [<000003ff8074b43a>] do_mirror+0x142/0x298 [dm_mirror]
[ 791.643428] [<0000000000154fca>] process_one_work+0x18a/0x3f8
[ 791.643432] [<000000000015598a>] worker_thread+0x132/0x3b0
[ 791.643435] [<000000000015d49a>] kthread+0xd2/0xd8
[ 791.643438] [<00000000005bc0ca>] kernel_thread_starter+0x6/0xc
[ 791.643446] [<00000000005bc0c4>] kernel_thread_starter+0x0/0xc--- block/bio-integrity.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
block/bio-integrity.c +2 -2
@@ -51,7 +51,7 @@ struct bio_integrity_payload *bio_integrunsigned long idx =BIO_POOL_NONE ;unsigned inline_vecs; -if (!bs) { +if (!bs || !bs->bio_integrity_pool) { bip =kmalloc (sizeof (struct bio_integrity_payload ) +sizeof (struct bio_vec ) * nr_vecs, gfp_mask); inline_vecs = nr_vecs;
@@ -104,7 +104,7 @@ void bio_integrity_free(struct bio *bio)kfree (page_address (bip->bip_vec->bv_page) + bip->bip_vec->bv_offset); -if (bs) { +if (bs && bs->bio_integrity_pool) {if (bip->bip_slab !=BIO_POOL_NONE )bvec_free (bs->bvec_integrity_pool, bip->bip_vec, bip->bip_slab);
Greg Kroah-Hartman
maintainerPATCH 36/123 dma-debug: skip debug_dma_assert_idle() when disabled
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haggai Eran <[email protected]>
commit c9d120b0b2b5069cb2ae62f8eac0cef31c8544be upstream.
If dma-debug is disabled due to a memory error, DMA unmaps do not affect the dma_active_cacheline radix tree anymore, and debug_dma_assert_idle() can print false warnings.
Disable debug_dma_assert_idle() when dma_debug_disabled() is true.
--- lib/dma-debug.c | 3 +++ 1 file changed, 3 insertions(+)
lib/dma-debug.c +3 -0
@@ -574,6 +574,9 @@ void debug_dma_assert_idle(struct page *unsigned long flags;phys_addr_t cln; +if (dma_debug_disabled ()) +return ; +if (!page)return ;
Greg Kroah-Hartman
maintainerPATCH 39/123 ALSA: line6: Fix -EBUSY error during active monitoring
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 4d0e677523a999e1dec28e55cc314c47ba09ca12 upstream.
When a monitor stream is active, the next PCM stream access results in EBUSY error because of the check in line6_stream_start(). Fix this by just skipping the submission of pending URBs when the stream is already running instead.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=101431
--- sound/usb/line6/pcm.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
sound/usb/line6/pcm.c +2 -7
@@ -186,12 +186,8 @@ static int line6_stream_start(struct sndint ret =0 ;spin_lock_irqsave (&pstr->lock, flags); -if (!test_and_set_bit (type, &pstr->running)) { -if (pstr->active_urbs || pstr->unlink_urbs) { - ret = -EBUSY ; - goto error; - } - +if (!test_and_set_bit (type, &pstr->running) && + !(pstr->active_urbs || pstr->unlink_urbs)) { pstr->count =0 ;/* Submit all currently available URBs */ if (direction ==SNDRV_PCM_STREAM_PLAYBACK )
@@ -199,7 +195,6 @@ static int line6_stream_start(struct sndelse ret =line6_submit_audio_in_all_urbs (line6pcm); } - error:if (ret <0 )clear_bit (type, &pstr->running);spin_unlock_irqrestore (&pstr->lock, flags);
Greg Kroah-Hartman
maintainerPATCH 40/123 ALSA: pcm: Fix lockdep warning with nonatomic PCM ops
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 67756e3191c90e7c0b94b8b2fb63de255b6cd337 upstream.
With the nonatomic PCM ops, the system may spew lockdep warnings like:
=============================================
[ INFO: possible recursive locking detected ]
4.2.0-rc1-jeejaval3 #12 Not tainted
---------------------------------------------
aplay/4029 is trying to acquire lock:
(snd_pcm_link_rwsem){.+.+.+}, at: [<ffffffff816fd473>] snd_pcm_stream_lock+0x43/0x60
but task is already holding lock:
(snd_pcm_link_rwsem){.+.+.+}, at: [<ffffffff816fcf29>] snd_pcm_action_nonatomic+0x29/0x80
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
---- lock(snd_pcm_link_rwsem);
lock(snd_pcm_link_rwsem);
Although this is false-positive as the rwsem is taken always as read-only for these code paths, it's certainly annoying to see this at any occasion. A simple fix is to use down_read_nested() in snd_pcm_stream_lock() that can be called inside another lock.
--- sound/core/pcm_native.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/core/pcm_native.c +1 -1
@@ -85,7 +85,7 @@ static DECLARE_RWSEM(snd_pcm_link_rwsem)void snd_pcm_stream_lock (struct snd_pcm_substream *substream) {if (substream->pcm->nonatomic) { -down_read (&snd_pcm_link_rwsem); +down_read_nested (&snd_pcm_link_rwsem,SINGLE_DEPTH_NESTING );mutex_lock (&substream->self_group.mutex); }else {read_lock (&snd_pcm_link_rwlock);
Greg Kroah-Hartman
maintainerPATCH 41/123 ALSA: hda - Add headset mic support for Acer Aspire V5-573G
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mateusz Sylwestrzak <[email protected]>
commit 0420694dddeb9e269a1ab2129a0119a5cea294a4 upstream.
Acer Aspire V5 with the ALC282 codec is given the wrong value for the 0x19 PIN by the laptop's BIOS. Overriding it with the correct value adds support for the headset microphone which would not otherwise be visible in the system.
The fix is based on commit 7819717b1134 with a similar quirk for Acer Aspire with the ALC269 codec.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=96201
--- sound/pci/hda/patch_realtek.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/patch_realtek.c +1 -1
@@ -5004,7 +5004,7 @@ static const struct hda_fixup alc269_fix { 0x14, 0x90170110 }, { 0x17, 0x40000008 }, { 0x18, 0x411111f0 }, - { 0x19, 0x411111f0 }, + { 0x19, 0x01a1913c }, { 0x1a, 0x411111f0 }, { 0x1b, 0x411111f0 }, { 0x1d, 0x40f89b2d },
Greg Kroah-Hartman
maintainerPATCH 42/123 ALSA: hda: add new AMD PCI IDs with proper driver caps
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maruthi Srinivas Bayyavarapu <[email protected]>
commit 5022813ddb28b7679e8285812d52aaeb7e1e7657 upstream.
Fixes audio problems on newer asics
--- sound/pci/hda/hda_intel.c | 8 ++++++++ 1 file changed, 8 insertions(+)
sound/pci/hda/hda_intel.c +8 -0
@@ -2056,6 +2056,8 @@ static const struct pci_device_id azx_id/* ATI HDMI */ { PCI_DEVICE(0x1002, 0x1308), .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, + { PCI_DEVICE(0x1002, 0x157a), + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, { PCI_DEVICE(0x1002, 0x793b), .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, { PCI_DEVICE(0x1002, 0x7919),
@@ -2110,8 +2112,14 @@ static const struct pci_device_id azx_id .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, { PCI_DEVICE(0x1002, 0xaab0), .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, + { PCI_DEVICE(0x1002, 0xaac0), + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, { PCI_DEVICE(0x1002, 0xaac8), .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, + { PCI_DEVICE(0x1002, 0xaad8), + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, + { PCI_DEVICE(0x1002, 0xaae8), + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, /* VIA VT8251/VT8237A */ { PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Greg Kroah-Hartman
maintainerPATCH 43/123 ALSA: hda - Add new GPU codec ID 0x10de007d to snd-hda
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaron Plattner <[email protected]>
commit 6c3d91193d829bf58a35a10650415b05a736ca6c upstream.
Vendor ID 0x10de007d is used by a yet-to-be-named GPU chip.
This chip also has the 2-ch audio swapping bug, so patch_nvhdmi is appropriate here.
--- sound/pci/hda/patch_hdmi.c | 2 ++ 1 file changed, 2 insertions(+)
sound/pci/hda/patch_hdmi.c +2 -0
@@ -3333,6 +3333,7 @@ static const struct hda_codec_preset snd { .id = 0x10de0070, .name = "GPU 70 HDMI/DP", .patch = patch_nvhdmi }, { .id = 0x10de0071, .name = "GPU 71 HDMI/DP", .patch = patch_nvhdmi }, { .id = 0x10de0072, .name = "GPU 72 HDMI/DP", .patch = patch_nvhdmi }, +{ .id = 0x10de007d, .name = "GPU 7d HDMI/DP", .patch = patch_nvhdmi }, { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, { .id = 0x11069f80, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi }, { .id = 0x11069f81, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi },
@@ -3396,6 +3397,7 @@ MODULE_ALIAS("snd-hda-codec-id:10de0067"MODULE_ALIAS ("snd-hda-codec-id:10de0070" );MODULE_ALIAS ("snd-hda-codec-id:10de0071" );MODULE_ALIAS ("snd-hda-codec-id:10de0072" ); +MODULE_ALIAS ("snd-hda-codec-id:10de007d" );MODULE_ALIAS ("snd-hda-codec-id:10de8001" );MODULE_ALIAS ("snd-hda-codec-id:11069f80" );MODULE_ALIAS ("snd-hda-codec-id:11069f81" );
Greg Kroah-Hartman
maintainerPATCH 44/123 ALSA: hda - Add headset mic pin quirk for a Dell device
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Henningsson <[email protected]>
commit cba59972a1191a0c1647a52fe745eed7a4b34b38 upstream.
Without this patch, the headset mic will not work on this machine.
--- sound/pci/hda/patch_realtek.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
sound/pci/hda/patch_realtek.c +11 -0
@@ -5382,6 +5382,17 @@ static const struct snd_hda_pin_quirk al {0x1d, 0x40700001}, {0x21, 0x02211030}), SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, + {0x12, 0x40000000}, + {0x14, 0x90170130}, + {0x17, 0x411111f0}, + {0x18, 0x411111f0}, + {0x19, 0x411111f0}, + {0x1a, 0x411111f0}, + {0x1b, 0x01014020}, + {0x1d, 0x4054c029}, + {0x1e, 0x411111f0}, + {0x21, 0x0221103f}), + SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, {0x12, 0x90a60160}, {0x14, 0x90170120}, {0x17, 0x90170140},
Greg Kroah-Hartman
maintainerPATCH 45/123 ALSA: hda - Apply fixup for another Toshiba Satellite S50D
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit b9d9c9efc292dd0ffe172780f915ed74eba3556c upstream.
Toshiba Satellite S50D has another model with a different PCI SSID (1179:fa93) while the previous fixup was for 1179:fa91. Adjust the fixup entry with SND_PCI_QUIRK_MASK() to match with both devices.
--- sound/pci/hda/patch_sigmatel.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/pci/hda/patch_sigmatel.c +2 -1
@@ -2920,7 +2920,8 @@ static const struct snd_pci_quirk stac92SND_PCI_QUIRK (PCI_VENDOR_ID_HP ,0x148a ,"HP Mini" ,STAC_92HD83XXX_HP_LED ),SND_PCI_QUIRK_VENDOR (PCI_VENDOR_ID_HP ,"HP" ,STAC_92HD83XXX_HP ), -SND_PCI_QUIRK (PCI_VENDOR_ID_TOSHIBA ,0xfa91 , +/* match both for 0xfa91 and 0xfa93 */ +SND_PCI_QUIRK_MASK (PCI_VENDOR_ID_TOSHIBA ,0xfffd ,0xfa91 , "Toshiba Satellite S50D", STAC_92HD83XXX_GPIO10_EAPD), {} /* terminator */ };
Greg Kroah-Hartman
maintainerPATCH 46/123 ALSA: hda - Apply a fixup to Dell Vostro 5480
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 3a05d12f46cb95a6a685114819363a56e6170996 upstream.
Dell Vostro 5480 (1028:069a) needs the very same quirk used for Vostro 5470 model to make bass speakers properly working.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -5114,6 +5114,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1028 ,0x064a ,"Dell" ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x064b ,"Dell" ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x0665 ,"Dell XPS 13" ,ALC288_FIXUP_DELL_XPS_13 ), +SND_PCI_QUIRK (0x1028 ,0x069a ,"Dell Vostro 5480" ,ALC290_FIXUP_SUBWOOFER_HSJACK ),SND_PCI_QUIRK (0x1028 ,0x06c7 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x06d9 ,"Dell" ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Greg Kroah-Hartman
maintainerPATCH 47/123 ALSA: usb-audio: add dB range mapping for some devices
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yao-Wen Mao <[email protected]>
commit 2d1cb7f658fb9c3ba8f9dab8aca297d4dfdec835 upstream.
Add the correct dB ranges of Bose Companion 5 and Drangonfly DAC 1.2.
--- sound/usb/mixer_maps.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
sound/usb/mixer_maps.c +24 -0
@@ -341,6 +341,20 @@ static const struct usbmix_name_map scms { 0 } }; +/* Bose companion 5, the dB conversion factor is 16 instead of 256 */ +static struct usbmix_dB_map bose_companion5_dB = {-5006 ,-6 }; +static struct usbmix_name_map bose_companion5_map[] = { + {3 ,NULL , .dB = &bose_companion5_dB }, + {0 }/* terminator */ +}; + +/* Dragonfly DAC 1.2, the dB conversion factor is 1 instead of 256 */ +static struct usbmix_dB_map dragonfly_1_2_dB = {0 ,5000 }; +static struct usbmix_name_map dragonfly_1_2_map[] = { + {7 ,NULL , .dB = &dragonfly_1_2_dB }, + {0 }/* terminator */ +}; +/* * Control map entries */
@@ -451,6 +465,16 @@ static struct usbmix_ctl_map usbmix_ctl_ .id = USB_ID(0x25c4, 0x0003), .map = scms_usb3318_map, }, + { +/* Bose Companion 5 */ + .id = USB_ID(0x05a7, 0x1020), + .map = bose_companion5_map, + }, + { +/* Dragonfly DAC 1.2 */ + .id = USB_ID(0x21b4, 0x0081), + .map = dragonfly_1_2_map, + }, { 0 } /* terminator */ };
Greg Kroah-Hartman
maintainerPATCH 48/123 ALSA: hda - Fix MacBook Pro 5,2 quirk
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 649ccd08534ee26deb2e5b08509800d0e95167f5 upstream.
MacBook Pro 5,2 with ALC889 codec had already a fixup entry, but this seems not working correctly, a fix for pin NID 0x15 is needed in addition. It's equivalent with the fixup for MacBook Air 1,1, so use this instead.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=102131
--- sound/pci/hda/patch_realtek.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/patch_realtek.c +1 -1
@@ -2224,7 +2224,7 @@ static const struct snd_pci_quirk alc882SND_PCI_QUIRK (0x106b ,0x4300 ,"iMac 9,1" ,ALC889_FIXUP_IMAC91_VREF ),SND_PCI_QUIRK (0x106b ,0x4600 ,"MacbookPro 5,2" ,ALC889_FIXUP_IMAC91_VREF ),SND_PCI_QUIRK (0x106b ,0x4900 ,"iMac 9,1 Aluminum" ,ALC889_FIXUP_IMAC91_VREF ), -SND_PCI_QUIRK (0x106b ,0x4a00 ,"Macbook 5,2" ,ALC889_FIXUP_IMAC91_VREF ), +SND_PCI_QUIRK (0x106b ,0x4a00 ,"Macbook 5,2" ,ALC889_FIXUP_MBA11_VREF ),SND_PCI_QUIRK (0x1071 ,0x8258 ,"Evesham Voyaeger" ,ALC882_FIXUP_EAPD ), SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
Greg Kroah-Hartman
maintainerPATCH 49/123 x86, perf: Fix static_key bug in load_mm_cr4()
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
commit a833581e372a4adae2319d8dc379493edbc444e9 upstream.
Mikulas reported his K6-3 not booting. This is because the static_key API confusion struck and bit Andy, this wants to be static_key_false().
--- arch/x86/include/asm/mmu_context.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/include/asm/mmu_context.h +1 -1
@@ -23,7 +23,7 @@ extern struct static_key rdpmc_always_avstatic inline void load_mm_cr4 (struct mm_struct *mm) { -if (static_key_true (&rdpmc_always_available) || +if (static_key_false (&rdpmc_always_available) ||atomic_read (&mm->context.perf_rdpmc_allowed))cr4_set_bits (X86_CR4_PCE );else
Greg Kroah-Hartman
maintainerPATCH 50/123 Revert "dm: only run the queue on completion if congested or no requests pending"
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
commit 621739b00e16ca2d80411dc9b111cb15b91f3ba9 upstream.
This reverts commit 9a0e609e3fd8a95c96629b9fbde6b8c5b9a1456a. (Resolved a conflict during revert due to commit bfebd1cdb4 that came after)
This revert is motivated by a couple failure reports on request-based DM multipath testbeds:
1) Netapp reported that their multipath fault injection test under heavy IO load can stall longer than 300 seconds.
2) IBM reported elevated lock contention in their testbed (likely due to increased back pressure due to IO not being dispatched as quickly):
https://www.redhat.com/archives/dm-devel/2015-July/msg00057.html
--- drivers/md/dm.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/md/dm.c +2 -6
@@ -1053,13 +1053,10 @@ static struct dm_rq_target_io *tio_from_*/ static void rq_completed (struct mapped_device *md,int rw,bool run_queue) { -int nr_requests_pending; -atomic_dec (&md->pending[rw]);/* nudge anyone waiting on suspend queue */ - nr_requests_pending =md_in_flight (md); -if (!nr_requests_pending) +if (!md_in_flight (md))wake_up (&md->wait);/*
@@ -1071,8 +1068,7 @@ static void rq_completed(struct mapped_dif (run_queue) {if (md->queue->mq_ops)blk_mq_run_hw_queues (md->queue, true); -else if (!nr_requests_pending || - (nr_requests_pending >= md->queue->nr_congestion_on)) +else blk_run_queue_async (md->queue); }
Greg Kroah-Hartman
maintainerPATCH 51/123 irqchip/gicv3-its: Fix mapping of LPIs to collections
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Zyngier <[email protected]>
commit 591e5bec13f15feb13fc445b6c9c59954711c4ac upstream.
The GICv3 ITS architecture allows a given [DevID, EventID] pair to be translated to a [LPI, Collection] pair, where DevID is the device writing the MSI, EventID is the payload being written, LPI is the actual interrupt number, and Collection is roughly equivalent to a target CPU.
Each LPI can be mapped to a separate collection, but the ITS driver insists on maintaining the collection on a device basis, instead of doing it on a per interrupt basis.
This is obviously flawed, and this patch fixes it by adding a per interrupt index that indicates which collection number is in use.
--- drivers/irqchip/irq-gic-v3-its.c | 111 ++++++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 36 deletions(-)
drivers/irqchip/irq-gic-v3-its.c +75 -36
@@ -75,6 +75,13 @@ struct its_node {#define ITS_ITT_ALIGN SZ_256 +struct event_lpi_map { +unsigned long *lpi_map; +u16 *col_map; +irq_hw_number_t lpi_base; +int nr_lpis; +}; +/* * The ITS view of a device - belongs to an ITS, a collection, owns an * interrupt translation table, and a list of interrupts.
@@ -82,11 +89,8 @@ struct its_node {struct its_device {struct list_head entry;struct its_node *its; -struct its_collection *collection; +struct event_lpi_map event_map;void *itt; -unsigned long *lpi_map; -irq_hw_number_t lpi_base; -int nr_lpis;u32 nr_ites;u32 device_id; };
@@ -99,6 +103,14 @@ static struct rdists *gic_rdists;#define gic_data_rdist () (raw_cpu_ptr(gic_rdists->rdist))#define gic_data_rdist_rd_base () (gic_data_rdist()->rd_base) +static struct its_collection *dev_event_to_col (struct its_device *its_dev, +u32 event) +{ +struct its_node *its = its_dev->its; + +return its->collections + its_dev->event_map.col_map[event]; +} +/* * ITS command descriptors - parameters to be encoded in a command * block.
@@ -134,7 +146,7 @@ struct its_cmd_desc {struct {struct its_device *dev;struct its_collection *col; -u32 id; +u32 event_id; } its_movi_cmd;struct {
@@ -241,7 +253,7 @@ static struct its_collection *its_build_its_fixup_cmd (cmd); -return desc->its_mapd_cmd.dev->collection; +return NULL ; } static struct its_collection *its_build_mapc_cmd(struct its_cmd_block *cmd,
@@ -260,52 +272,72 @@ static struct its_collection *its_build_static struct its_collection *its_build_mapvi_cmd (struct its_cmd_block *cmd,struct its_cmd_desc *desc) { +struct its_collection *col; + + col =dev_event_to_col (desc->its_mapvi_cmd.dev, + desc->its_mapvi_cmd.event_id); +its_encode_cmd (cmd,GITS_CMD_MAPVI );its_encode_devid (cmd, desc->its_mapvi_cmd.dev->device_id);its_encode_event_id (cmd, desc->its_mapvi_cmd.event_id);its_encode_phys_id (cmd, desc->its_mapvi_cmd.phys_id); -its_encode_collection (cmd, desc->its_mapvi_cmd.dev->collection->col_id); +its_encode_collection (cmd, col->col_id);its_fixup_cmd (cmd); -return desc->its_mapvi_cmd.dev->collection; +return col; }static struct its_collection *its_build_movi_cmd (struct its_cmd_block *cmd,struct its_cmd_desc *desc) { +struct its_collection *col; + + col =dev_event_to_col (desc->its_movi_cmd.dev, + desc->its_movi_cmd.event_id); +its_encode_cmd (cmd,GITS_CMD_MOVI );its_encode_devid (cmd, desc->its_movi_cmd.dev->device_id); -its_encode_event_id (cmd, desc->its_movi_cmd.id); +its_encode_event_id (cmd, desc->its_movi_cmd.event_id);its_encode_collection (cmd, desc->its_movi_cmd.col->col_id);its_fixup_cmd (cmd); -return desc->its_movi_cmd.dev->collection; +return col; }static struct its_collection *its_build_discard_cmd (struct its_cmd_block *cmd,struct its_cmd_desc *desc) { +struct its_collection *col; + + col =dev_event_to_col (desc->its_discard_cmd.dev, + desc->its_discard_cmd.event_id); +its_encode_cmd (cmd,GITS_CMD_DISCARD );its_encode_devid (cmd, desc->its_discard_cmd.dev->device_id);its_encode_event_id (cmd, desc->its_discard_cmd.event_id);its_fixup_cmd (cmd); -return desc->its_discard_cmd.dev->collection; +return col; }static struct its_collection *its_build_inv_cmd (struct its_cmd_block *cmd,struct its_cmd_desc *desc) { +struct its_collection *col; + + col =dev_event_to_col (desc->its_inv_cmd.dev, + desc->its_inv_cmd.event_id); +its_encode_cmd (cmd,GITS_CMD_INV );its_encode_devid (cmd, desc->its_inv_cmd.dev->device_id);its_encode_event_id (cmd, desc->its_inv_cmd.event_id);its_fixup_cmd (cmd); -return desc->its_inv_cmd.dev->collection; +return col; } static struct its_collection *its_build_invall_cmd(struct its_cmd_block *cmd,
@@ -497,7 +529,7 @@ static void its_send_movi(struct its_dev desc.its_movi_cmd.dev = dev; desc.its_movi_cmd.col = col; - desc.its_movi_cmd.id = id; + desc.its_movi_cmd.event_id = id;its_send_single_command (dev->its, its_build_movi_cmd, &desc); }
@@ -528,7 +560,7 @@ static void its_send_invall(struct its_nstatic inline u32 its_get_event_id (struct irq_data *d) {struct its_device *its_dev =irq_data_get_irq_chip_data (d); -return d->hwirq - its_dev->lpi_base; +return d->hwirq - its_dev->event_map.lpi_base; }static void lpi_set_config (struct irq_data *d,bool enable)
@@ -583,7 +615,7 @@ static int its_set_affinity(struct irq_d target_col = &its_dev->its->collections[cpu];its_send_movi (its_dev, target_col, id); - its_dev->collection = target_col; + its_dev->event_map.col_map[id] = cpu;return IRQ_SET_MASK_OK_DONE ; }
@@ -713,8 +745,10 @@ out:return bitmap; } -static void its_lpi_free (unsigned long *bitmap,int base,int nr_ids) +static void its_lpi_free (struct event_lpi_map *map) { +int base = map->lpi_base; +int nr_ids = map->nr_lpis;int lpi;spin_lock (&lpi_lock);
@@ -731,7 +765,8 @@ static void its_lpi_free(unsigned long *spin_unlock (&lpi_lock); -kfree (bitmap); +kfree (map->lpi_map); +kfree (map->col_map); }/*
@@ -1099,11 +1134,11 @@ static struct its_device *its_create_devstruct its_device *dev;unsigned long *lpi_map;unsigned long flags; +u16 *col_map =NULL ;void *itt;int lpi_base;int nr_lpis;int nr_ites; -int cpu;int sz; dev =kzalloc (sizeof (*dev),GFP_KERNEL );
@@ -1117,20 +1152,24 @@ static struct its_device *its_create_dev sz =max (sz,ITS_ITT_ALIGN ) +ITS_ITT_ALIGN -1 ; itt =kzalloc (sz,GFP_KERNEL ); lpi_map =its_lpi_alloc_chunks (nvecs, &lpi_base, &nr_lpis); +if (lpi_map) + col_map =kzalloc (sizeof (*col_map) * nr_lpis,GFP_KERNEL ); -if (!dev || !itt || !lpi_map) { +if (!dev || !itt || !lpi_map || !col_map) {kfree (dev);kfree (itt);kfree (lpi_map); +kfree (col_map);return NULL ; } dev->its = its; dev->itt = itt; dev->nr_ites = nr_ites; - dev->lpi_map = lpi_map; - dev->lpi_base = lpi_base; - dev->nr_lpis = nr_lpis; + dev->event_map.lpi_map = lpi_map; + dev->event_map.col_map = col_map; + dev->event_map.lpi_base = lpi_base; + dev->event_map.nr_lpis = nr_lpis; dev->device_id = dev_id;INIT_LIST_HEAD (&dev->entry);
@@ -1138,10 +1177,6 @@ static struct its_device *its_create_devlist_add (&dev->entry, &its->its_device_list);raw_spin_unlock_irqrestore (&its->lock, flags); -/* Bind the device to the first possible CPU */ - cpu =cpumask_first (cpu_online_mask); - dev->collection = &its->collections[cpu]; -/* Map device to its ITT */ its_send_mapd (dev,1 );
@@ -1163,12 +1198,13 @@ static int its_alloc_device_irq(struct i {int idx; - idx =find_first_zero_bit (dev->lpi_map, dev->nr_lpis); -if (idx == dev->nr_lpis) + idx =find_first_zero_bit (dev->event_map.lpi_map, + dev->event_map.nr_lpis); +if (idx == dev->event_map.nr_lpis)return -ENOSPC ; - *hwirq = dev->lpi_base + idx; -set_bit (idx, dev->lpi_map); + *hwirq = dev->event_map.lpi_base + idx; +set_bit (idx, dev->event_map.lpi_map);return 0 ; }
@@ -1288,7 +1324,8 @@ static int its_irq_domain_alloc(struct iirq_domain_set_hwirq_and_chip (domain, virq + i, hwirq, &its_irq_chip, its_dev);dev_dbg (info->scratchpad[1 ].ptr,"ID:%d pID:%d vID:%d\n" , - (int )(hwirq - its_dev->lpi_base), (int )hwirq, virq + i); + (int )(hwirq - its_dev->event_map.lpi_base), + (int )hwirq, virq + i); }return 0 ;
@@ -1300,6 +1337,9 @@ static void its_irq_domain_activate(strustruct its_device *its_dev =irq_data_get_irq_chip_data (d);u32 event =its_get_event_id (d); +/* Bind the LPI to the first possible CPU */ + its_dev->event_map.col_map[event] =cpumask_first (cpu_online_mask); +/* Map the GIC IRQ and event to the device */ its_send_mapvi (its_dev, d->hwirq, event); }
@@ -1327,17 +1367,16 @@ static void its_irq_domain_free(struct iu32 event =its_get_event_id (data);/* Mark interrupt index as unused */ -clear_bit (event, its_dev->lpi_map); +clear_bit (event, its_dev->event_map.lpi_map);/* Nuke the entry in the domain */ irq_domain_reset_irq_data (data); }/* If all interrupts have been freed, start mopping the floor */ -if (bitmap_empty (its_dev->lpi_map, its_dev->nr_lpis)) { -its_lpi_free (its_dev->lpi_map, - its_dev->lpi_base, - its_dev->nr_lpis); +if (bitmap_empty (its_dev->event_map.lpi_map, + its_dev->event_map.nr_lpis)) { +its_lpi_free (&its_dev->event_map);/* Unmap device/itt */ its_send_mapd (its_dev,0 );
Greg Kroah-Hartman
maintainerPATCH 52/123 scsi: fix host max depth checking for the queue_depth sysfs interface
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
commit 1278dd6809b11dc298e19d81ac0916275f7318c1 upstream.
Commit 1e6f2416044c0 changed the scsi sysfs 'queue_depth' code to rejects depths higher than the scsi host template setting. But lots of hosts set this to 1, and update the settings in the scsi host when the controller/devices probing happens.
This breaks (at least) mpt2sas and mpt3sas runtime setting of queue depth, returning EINVAL for all settings but '1'. And once it's set to 1, there's no way to go back up.
--- drivers/scsi/scsi_sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/scsi_sysfs.c +1 -1
@@ -859,7 +859,7 @@ sdev_store_queue_depth(struct device *de depth =simple_strtoul (buf,NULL ,0 ); -if (depth <1 || depth > sht->can_queue) +if (depth <1 || depth > sdev->host->can_queue)return -EINVAL ; retval = sht->change_queue_depth (sdev, depth);
Greg Kroah-Hartman
maintainerPATCH 53/123 scsi: fix memory leak with scsi-mq
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Battersby <[email protected]>
commit 0c958ecc69c277b25f38f72bc6d18ab145e8167c upstream.
Fix a memory leak with scsi-mq triggered by commands with large data transfer length.
__sg_alloc_table() sets both table->nents and table->orig_nents to the same value. When the scatterlist is DMA-mapped, table->nents is overwritten with the (possibly smaller) size of the DMA-mapped scatterlist, while table->orig_nents retains the original size of the allocated scatterlist. scsi_free_sgtable() should therefore check orig_nents instead of nents, and all code that initializes sdb->table without calling __sg_alloc_table() should set both nents and orig_nents.
--- drivers/scsi/scsi_error.c | 2 +- drivers/scsi/scsi_lib.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/scsi/scsi_error.c +1 -1
@@ -944,7 +944,7 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd scmd->sdb.length); scmd->sdb.table.sgl = &ses->sense_sgl; scmd->sc_data_direction =DMA_FROM_DEVICE ; - scmd->sdb.table.nents =1 ; + scmd->sdb.table.nents = scmd->sdb.table.orig_nents =1 ; scmd->cmnd[0 ] =REQUEST_SENSE ; scmd->cmnd[4 ] = scmd->sdb.length; scmd->cmd_len =COMMAND_SIZE (scmd->cmnd[0 ]);
drivers/scsi/scsi_lib.c +3 -3
@@ -583,7 +583,7 @@ static struct scatterlist *scsi_sg_allocstatic void scsi_free_sgtable (struct scsi_data_buffer *sdb,bool mq) { -if (mq && sdb->table.nents <=SCSI_MAX_SG_SEGMENTS ) +if (mq && sdb->table.orig_nents <=SCSI_MAX_SG_SEGMENTS )return ;__sg_free_table (&sdb->table,SCSI_MAX_SG_SEGMENTS , mq, scsi_sg_free); }
@@ -597,8 +597,8 @@ static int scsi_alloc_sgtable(struct scsif (mq) {if (nents <=SCSI_MAX_SG_SEGMENTS ) { - sdb->table.nents = nents; -sg_init_table (sdb->table.sgl, sdb->table.nents); + sdb->table.nents = sdb->table.orig_nents = nents; +sg_init_table (sdb->table.sgl, nents);return 0 ; } first_chunk = sdb->table.sgl;
Greg Kroah-Hartman
maintainerPATCH 55/123 drivers: clk: st: Fix flexgen lock init
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giuseppe Cavallaro <[email protected]>
commit 0f4f2afd4402883a51ad27a1d9e046643bb1e3cb upstream.
While proving lock, the following warning happens and it is fixed after initializing lock in the setup function
INFO: trying to register non-static key.
the code is fine but needs lockdep annotation.
turning off the locking correctness validator.
CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.10.27-02861-g39df285-dirty #33 [<c00154ac>] (unwind_backtrace+0x0/0xf4) from [<c0011b50>] (show_stack+0x10/0x14) [<c0011b50>] (show_stack+0x10/0x14) from [<c00689ac>] (__lock_acquire+0x900/0xb14) [<c00689ac>] (__lock_acquire+0x900/0xb14) from [<c0069394>] (lock_acquire+0x68/0x7c) [<c0069394>] (lock_acquire+0x68/0x7c) from [<c04958f8>] (_raw_spin_lock_irqsave+0x48/0x5c) [<c04958f8>] (_raw_spin_lock_irqsave+0x48/0x5c) from [<c0381e6c>] (clk_gate_endisable+0x28/0x88) [<c0381e6c>] (clk_gate_endisable+0x28/0x88) from [<c0381ee0>] (clk_gate_enable+0xc/0x14) [<c0381ee0>] (clk_gate_enable+0xc/0x14) from [<c0386c68>] (flexgen_enable+0x28/0x40) [<c0386c68>] (flexgen_enable+0x28/0x40) from [<c037f260>] (__clk_enable+0x5c/0x9c) [<c037f260>] (__clk_enable+0x5c/0x9c) from [<c037f558>] (clk_enable+0x18/0x2c) [<c037f558>] (clk_enable+0x18/0x2c) from [<c064a1dc>] (st_lpc_of_register+0xc0/0x248) [<c064a1dc>] (st_lpc_of_register+0xc0/0x248) from [<c0649e44>] (clocksource_of_init+0x34/0x58) [<c0649e44>] (clocksource_of_init+0x34/0x58) from [<c0637ddc>] (sti_timer_init+0x10/0x18) [<c0637ddc>] (sti_timer_init+0x10/0x18) from [<c06343f8>] (time_init+0x20/0x30) [<c06343f8>] (time_init+0x20/0x30) from [<c0632984>] (start_kernel+0x20c/0x2e8) [<c0632984>] (start_kernel+0x20c/0x2e8) from [<40008074>] (0x40008074)
--- drivers/clk/st/clk-flexgen.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/clk/st/clk-flexgen.c +2 -0
@@ -303,6 +303,8 @@ void __init st_of_flexgen_setup(struct dif (!rlock) goto err; +spin_lock_init (rlock); +for (i =0 ; i < clk_data->clk_num; i++) {struct clk *clk;const char *clk_name;
Greg Kroah-Hartman
maintainerPATCH 56/123 drivers: clk: st: Fix mux bit-setting for Cortex A9 clocks
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gabriel Fernandez <[email protected]>
commit 3be6d8ce639d92e60d144fb99dd74a53fe3799bb upstream.
This patch fixes the mux bit-setting for ClockgenA9.
--- drivers/clk/st/clkgen-mux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/st/clkgen-mux.c +1 -1
@@ -582,7 +582,7 @@ static struct clkgen_mux_data stih416_a9 };static struct clkgen_mux_data stih407_a9_mux_data = { .offset =0x1a4 , - .shift =1 , + .shift =0 , .width =2 , };
Greg Kroah-Hartman
maintainerPATCH 57/123 drivers: clk: st: Incorrect register offset used for lock_status
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pankaj Dev <[email protected]>
commit 56551da9255f20ffd3a9711728a1a3ad4b7100af upstream.
Incorrect register offset used for sthi407 clockgenC
--- drivers/clk/st/clkgen-fsyn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/st/clkgen-fsyn.c +1 -1
@@ -340,7 +340,7 @@ static const struct clkgen_quadfs_data sCLKGEN_FIELD (0x30c ,0xf ,20 ), CLKGEN_FIELD(0x310, 0xf, 20) }, .lockstatus_present = true, - .lock_status = CLKGEN_FIELD(0x2A0, 0x1, 24), + .lock_status = CLKGEN_FIELD(0x2f0, 0x1, 24), .powerup_polarity = 1, .standby_polarity = 1, .pll_ops = &st_quadfs_pll_c32_ops,
Greg Kroah-Hartman
maintainerPATCH 58/123 mac80211: clear subdir_stations when removing debugfs
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom Hughes <[email protected]>
commit 4479004e6409087d1b4986881dc98c6c15dffb28 upstream.
If we don't do this, and we then fail to recreate the debugfs directory during a mode change, then we will fail later trying to add stations to this now bogus directory:
BUG: unable to handle kernel NULL pointer dereference at 0000006c IP: [<c0a92202>] mutex_lock+0x12/0x30 Call Trace: [<c0678ab4>] start_creating+0x44/0xc0 [<c0679203>] debugfs_create_dir+0x13/0xf0 [<f8a938ae>] ieee80211_sta_debugfs_add+0x6e/0x490 [mac80211]
--- net/mac80211/debugfs_netdev.c | 1 + 1 file changed, 1 insertion(+)
net/mac80211/debugfs_netdev.c +1 -0
@@ -723,6 +723,7 @@ void ieee80211_debugfs_remove_netdev(strdebugfs_remove_recursive (sdata->vif.debugfs_dir); sdata->vif.debugfs_dir =NULL ; + sdata->debugfs.subdir_stations =NULL ; }void ieee80211_debugfs_rename_netdev (struct ieee80211_sub_if_data *sdata)
Greg Kroah-Hartman
maintainerPATCH 60/123 mnt: Clarify and correct the disconnect logic in umount_tree
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit f2d0a123bcf16d1a9cf7942ddc98e0ef77862c2b upstream.
rmdir mntpoint will result in an infinite loop when there is a mount locked on the mountpoint in another mount namespace.
This is because the logic to test to see if a mount should be disconnected in umount_tree is buggy.
Move the logic to decide if a mount should remain connected to it's mountpoint into it's own function disconnect_mount so that clarity of expression instead of terseness of expression becomes a virtue.
When the conditions where it is invalid to leave a mount connected are first ruled out, the logic for deciding if a mount should be disconnected becomes much clearer and simpler.
--- fs/namespace.c | 35 +++++++++++++++++++++++++++++++---- fs/pnode.h | 2 -- 2 files changed, 31 insertions(+), 6 deletions(-)
fs/namespace.c +31 -4
@@ -1350,6 +1350,36 @@ enum umount_tree_flags {UMOUNT_PROPAGATE =2 , UMOUNT_CONNECTED = 4, }; + +static bool disconnect_mount (struct mount *mnt,enum umount_tree_flags how) +{ +/* Leaving mounts connected is only valid for lazy umounts */ +if (how &UMOUNT_SYNC ) +return true; + +/* A mount without a parent has nothing to be connected to */ +if (!mnt_has_parent (mnt)) +return true; + +/* Because the reference counting rules change when mounts are +* unmounted and connected, umounted mounts may not be +* connected to mounted mounts. +*/ +if (!(mnt->mnt_parent->mnt.mnt_flags &MNT_UMOUNT )) +return true; + +/* Has it been requested that the mount remain connected? */ +if (how &UMOUNT_CONNECTED ) +return false; + +/* Is the mount locked such that it needs to remain connected? */ +if (IS_MNT_LOCKED (mnt)) +return false; + +/* By default disconnect the mount */ +return true; +} +/* * mount_lock must be held * namespace_sem must be held for write
@@ -1387,10 +1417,7 @@ static void umount_tree(struct mount *mnif (how &UMOUNT_SYNC ) p->mnt.mnt_flags |=MNT_SYNC_UMOUNT ; - disconnect = !(((how &UMOUNT_CONNECTED ) && -mnt_has_parent (p) && - (p->mnt_parent->mnt.mnt_flags &MNT_UMOUNT )) || -IS_MNT_LOCKED_AND_LAZY (p)); + disconnect =disconnect_mount (p, how);pin_insert_group (&p->mnt_umount, &p->mnt_parent->mnt, disconnect ? &unmounted :NULL );
fs/pnode.h +0 -2
@@ -20,8 +20,6 @@#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 61/123 mnt: In detach_mounts detach the appropriate unmounted mount
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit fe78fcc85a2046c51f1535710996860557eeec20 upstream.
The handling of in detach_mounts of unmounted but connected mounts is buggy and can lead to an infinite loop.
Correct the handling of unmounted mounts in detach_mount. When the mountpoint of an unmounted but connected mount is connected to a dentry, and that dentry is deleted we need to disconnect that mount from the parent mount and the deleted dentry.
Nothing changes for the unmounted and connected children. They can be safely ignored.
--- fs/namespace.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
fs/namespace.c +2 -5
@@ -1554,11 +1554,8 @@ void __detach_mounts(struct dentry *dentwhile (!hlist_empty (&mp->m_list)) { mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list);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); - } +hlist_add_head (&mnt->mnt_umount.s_list, &unmounted); +umount_mnt (mnt); }else umount_tree (mnt,UMOUNT_CONNECTED ); }
Greg Kroah-Hartman
maintainerPATCH 62/123 ftrace: Fix breakage of set_ftrace_pid
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Steven Rostedt (Red Hat)" <[email protected]>
commit e3eea1404f5ff7a2ceb7b5e7ba412a6fd94f2935 upstream.
Commit 4104d326b670 ("ftrace: Remove global function list and call function directly") simplified the ftrace code by removing the global_ops list with a new design. But this cleanup also broke the filtering of PIDs that are added to the set_ftrace_pid file.
Add back the proper hooks to have pid filtering working once again.
--- include/linux/ftrace.h | 3 ++ kernel/trace/ftrace.c | 52 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 37 insertions(+), 18 deletions(-)
include/linux/ftrace.h +3 -0
@@ -116,6 +116,7 @@ ftrace_func_t ftrace_ops_get_func(struct* SAVE_REGS. If another ops with this flag set is already registered * for any of the functions that this ops will be registered for, then * this ops will fail to register or set_filter_ip. +* PID - Is affected by set_ftrace_pid (allows filtering on those pids) */ enum {FTRACE_OPS_FL_ENABLED =1 <<0 ,
@@ -132,6 +133,7 @@ enum {FTRACE_OPS_FL_MODIFYING =1 <<11 ,FTRACE_OPS_FL_ALLOC_TRAMP =1 <<12 ,FTRACE_OPS_FL_IPMODIFY =1 <<13 , + FTRACE_OPS_FL_PID = 1 << 14, };#ifdef CONFIG_DYNAMIC_FTRACE
@@ -159,6 +161,7 @@ struct ftrace_ops {struct ftrace_ops *next;unsigned long flags;void *private; +ftrace_func_t saved_func;int __percpu *disabled;#ifdef CONFIG_DYNAMIC_FTRACE int nr_trampolines;
kernel/trace/ftrace.c +34 -18
127 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 63/123 iommu/vt-d: Fix VM domain ID leak
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Williamson <[email protected]>
commit 46ebb7af7b93792de65e124e1ab8b89a108a41f2 upstream.
This continues the attempt to fix commit fb170fb4c548 ("iommu/vt-d:
Introduce helper functions to make code symmetric for readability"). The previous attempt in commit 71684406905f ("iommu/vt-d: Detach domain *only* from attached iommus") overlooked the fact that dmar_domain.iommu_bmp gets cleared for VM domains when devices are detached:
intel_iommu_detach_device
domain_remove_one_dev_info
domain_detach_iommu
The domain is detached from the iommu, but the iommu is still attached to the domain, for whatever reason. Thus when we get to domain_exit(), we can't rely on iommu_bmp for VM domains to find the active iommus, we must check them all. Without that, the corresponding bit in intel_iommu.domain_ids doesn't get cleared and repeated VM domain creation and destruction will run out of domain IDs. Meanwhile we still can't call iommu_detach_domain() on arbitrary non-VM domains or we risk clearing in-use domain IDs, as 71684406905f attempted to address.
It's tempting to modify iommu_detach_domain() to test the domain iommu_bmp, but the call ordering from domain_remove_one_dev_info() prevents it being able to work as fb170fb4c548 seems to have intended. Caching of unused VM domains on the iommu object seems to be the root of the problem, but this code is far too fragile for that kind of rework to be proposed for stable, so we simply revert this chunk to its state prior to fb170fb4c548.
code symmetric for readability")
iommus")
--- drivers/iommu/intel-iommu.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/iommu/intel-iommu.c +6 -3
@@ -1756,8 +1756,9 @@ static int domain_init(struct dmar_domaistatic void domain_exit (struct dmar_domain *domain) { +struct dmar_drhd_unit *drhd; +struct intel_iommu *iommu;struct page *freelist =NULL ; -int i;/* Domain 0 is reserved, so dont process it */ if (!domain)
@@ -1777,8 +1778,10 @@ static void domain_exit(struct dmar_doma/* clear attached or cached domains */ rcu_read_lock (); -for_each_set_bit (i, domain->iommu_bmp, g_num_of_iommus) -iommu_detach_domain (domain, g_iommus[i]); +for_each_active_iommu (iommu, drhd) +if (domain_type_is_vm (domain) || +test_bit (iommu->seq_id, domain->iommu_bmp)) +iommu_detach_domain (domain, iommu);rcu_read_unlock ();dma_free_pagelist (freelist);
Greg Kroah-Hartman
maintainerPATCH 64/123 mmc: omap_hsmmc: Fix DTO and DCRC handling
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kishon Vijay Abraham I <[email protected]>
commit 408806f740497c5d71f9c305b3d6aad260ff186d upstream.
DTO/DCRC errors were not being informed to the mmc core since commit ae4bf788ee9b ("mmc: omap_hsmmc: consolidate error report handling of HSMMC IRQ"). This commit made sure 'end_trans' is never set on DTO/DCRC errors. This is because after this commit 'host->data' is checked after it has been cleared to NULL by omap_hsmmc_dma_cleanup().
Because 'end_trans' is never set, omap_hsmmc_xfer_done() is never invoked making core layer not to be aware of DTO/DCRC errors. Because of this any command invoked after DTO/DCRC error leads to a hang.
Fix this by checking for 'host->data' before it is actually cleared.
HSMMC IRQ")
--- drivers/mmc/host/omap_hsmmc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/mmc/host/omap_hsmmc.c +4 -4
@@ -1062,6 +1062,10 @@ static void omap_hsmmc_do_irq(struct omaif (status & (CTO_EN |CCRC_EN )) end_cmd =1 ; +if (host->data || host->response_busy) { + end_trans = !end_cmd; + host->response_busy =0 ; + }if (status & (CTO_EN |DTO_EN ))hsmmc_command_incomplete (host, -ETIMEDOUT , end_cmd);else if (status & (CCRC_EN |DCRC_EN ))
@@ -1081,10 +1085,6 @@ static void omap_hsmmc_do_irq(struct oma }dev_dbg (mmc_dev (host->mmc),"AC12 err: 0x%x\n" , ac12); } -if (host->data || host->response_busy) { - end_trans = !end_cmd; - host->response_busy =0 ; - } }OMAP_HSMMC_WRITE (host->base,STAT , status);
Greg Kroah-Hartman
maintainerPATCH 65/123 mmc: sdhci check parameters before call dma_free_coherent
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
commit 7ac020366b0a436d726408841160b5dc32c19214 upstream.
We should not call dma_free_coherent if host->adma_table is NULL, otherwise may trigger panic.
--- drivers/mmc/host/sdhci.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/mmc/host/sdhci.c +5 -2
@@ -3037,8 +3037,11 @@ int sdhci_add_host(struct sdhci_host *ho GFP_KERNEL); host->align_buffer =kmalloc (host->align_buffer_sz,GFP_KERNEL );if (!host->adma_table || !host->align_buffer) { -dma_free_coherent (mmc_dev (mmc), host->adma_table_sz, - host->adma_table, host->adma_addr); +if (host->adma_table) +dma_free_coherent (mmc_dev (mmc), + host->adma_table_sz, + host->adma_table, + host->adma_addr);kfree (host->align_buffer);pr_warn ("%s: Unable to allocate ADMA buffers - falling back to standard DMA\n" ,mmc_hostname (mmc));
Greg Kroah-Hartman
maintainerPATCH 66/123 mmc: sdhci-esdhc: Make 8BIT bus work
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joakim Tjernlund <[email protected]>
commit 8e91125ff3f57f15c6568e2a6d32743b3f7815e4 upstream.
Support for 8BIT bus with was added some time ago to sdhci-esdhc but then missed to remove the 8BIT from the reserved bit mask which made 8BIT non functional.
--- drivers/mmc/host/sdhci-esdhc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mmc/host/sdhci-esdhc.h +1 -1
@@ -45,6 +45,6 @@#define ESDHC_DMA_SYSCTL 0x40c#define ESDHC_DMA_SNOOP 0x00000040 -#define ESDHC_HOST_CONTROL_RES 0x05 +#define ESDHC_HOST_CONTROL_RES 0x01#endif /* _DRIVERS_MMC_SDHCI_ESDHC_H */
Greg Kroah-Hartman
maintainerPATCH 67/123 mmc: sdhci-pxav3: fix platform_data is not initialized
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jingju Hou <[email protected]>
commit 9cd76049f0d90ae241f5ad80e311489824527000 upstream.
pdev->dev.platform_data is not initialized if match is true in function sdhci_pxav3_probe. Just local variable pdata is assigned the return value from function pxav3_get_mmc_pdata().
static int sdhci_pxav3_probe(struct platform_device *pdev) {
struct sdhci_pxa_platdata *pdata = pdev->dev.platform_data;
...
if (match) {
ret = mmc_of_parse(host->mmc);
if (ret)
goto err_of_parse;
sdhci_get_of_property(pdev);
pdata = pxav3_get_mmc_pdata(dev);
}
...
}--- drivers/mmc/host/sdhci-pxav3.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/sdhci-pxav3.c +1 -0
@@ -411,6 +411,7 @@ static int sdhci_pxav3_probe(struct plat goto err_of_parse;sdhci_get_of_property (pdev); pdata =pxav3_get_mmc_pdata (dev); + pdev->dev.platform_data = pdata; }else if (pdata) {/* on-chip device */ if (pdata->flags &PXA_FLAG_CARD_PERMANENT )
Greg Kroah-Hartman
maintainerPATCH 68/123 HID: cp2112: fix to force single data-report reply
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antonio Borneo <[email protected]>
commit 6debce6f4e787a8eb4cec94e7afa85fb4f40db27 upstream.
Current implementation of cp2112_raw_event() only accepts one data report at a time. If last received data report is not fully handled yet, a new incoming data report will overwrite it. In such case we don't guaranteed to propagate the correct incoming data.
The trivial fix implemented here forces a single report at a time by requesting in cp2112_read() no more than 61 byte of data, which is the payload size of a single data report.
--- drivers/hid/hid-cp2112.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/hid/hid-cp2112.c +2 -0
@@ -356,6 +356,8 @@ static int cp2112_read(struct cp2112_devstruct cp2112_force_read_report report;int ret; +if (size >sizeof (dev->read_data)) + size =sizeof (dev->read_data); report.report =CP2112_DATA_READ_FORCE_SEND ; report.length =cpu_to_be16 (size);
Greg Kroah-Hartman
maintainerPATCH 69/123 iwlwifi: mvm: fix antenna selection when BT is active
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
commit 923a8c1d8069104726bde55c37cec66324ccc328 upstream.
When BT is active, we want to avoid the shared antenna for management frame to make sure we don't disturb BT. There was a bug in that code because it chose the antenna BIT(ANT_A) where ANT_A is already a bitmap (0x1). This means that the antenna chosen in the end was ANT_B. While this is not optimal on devices with 2 antennas (it'd disturb BT), it is critical on single antenna devices like 3160 which couldn't connect at all when BT was active.
This fixes:
https://bugzilla.kernel.org/show_bug.cgi?id=97181
--- drivers/net/wireless/iwlwifi/mvm/tx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/iwlwifi/mvm/tx.c +1 -1
@@ -225,7 +225,7 @@ void iwl_mvm_set_tx_cmd_rate(struct iwl_if (info->band ==IEEE80211_BAND_2GHZ && !iwl_mvm_bt_coex_is_shared_ant_avail (mvm)) - rate_flags =BIT (mvm->cfg->non_shared_ant) <<RATE_MCS_ANT_POS ; + rate_flags = mvm->cfg->non_shared_ant <<RATE_MCS_ANT_POS ;else rate_flags =BIT (mvm->mgmt_last_antenna_idx) <<RATE_MCS_ANT_POS ;
Greg Kroah-Hartman
maintainerPATCH 70/123 iwlwifi: nvm: remove mac address byte swapping in 8000 family
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liad Kaufman <[email protected]>
commit be88a1ada9b97bb016196b7f4a1fc2fe2f798529 upstream.
This fixes the byte order copying in the MAO (Mac Override Section) section from the PNVM, as the byte swapping is not required anymore in the 8000 family. Due to the byte swapping, the driver was reporting an incorrect MAC adddress.
--- drivers/net/wireless/iwlwifi/iwl-nvm-parse.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c +5 -7
@@ -540,13 +540,11 @@ static void iwl_set_hw_address_family_80 hw_addr = (const u8 *)(mac_override +MAC_ADDRESS_OVERRIDE_FAMILY_8000 ); -/* The byte order is little endian 16 bit, meaning 214365 */ - data->hw_addr[0 ] = hw_addr[1 ]; - data->hw_addr[1 ] = hw_addr[0 ]; - data->hw_addr[2 ] = hw_addr[3 ]; - data->hw_addr[3 ] = hw_addr[2 ]; - data->hw_addr[4 ] = hw_addr[5 ]; - data->hw_addr[5 ] = hw_addr[4 ]; +/* +* Store the MAC address from MAO section. +* No byte swapping is required in MAO section +*/ +memcpy (data->hw_addr, hw_addr,ETH_ALEN );/* * Force the use of the OTP MAC address in case of reserved MAC
Greg Kroah-Hartman
maintainerPATCH 71/123 iwlwifi: pcie: prepare the device before accessing it
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
commit f9e5554cd8ca1d1212ec922755b397a20f737923 upstream.
For 8000 series, we need to access the device to know what firmware to load. Before we do so, we need to prepare the device otherwise we might not be able to access the hardware.
--- drivers/net/wireless/iwlwifi/pcie/trans.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/wireless/iwlwifi/pcie/trans.c +6 -0
@@ -2515,6 +2515,12 @@ struct iwl_trans *iwl_trans_pcie_alloc(s trans->hw_rev = (trans->hw_rev &0xfff0 ) | (CSR_HW_REV_STEP (trans->hw_rev <<2 ) <<2 ); + ret =iwl_pcie_prepare_card_hw (trans); +if (ret) { +IWL_WARN (trans,"Exit HW not ready\n" ); + goto out_pci_disable_msi; + } +/* * in-order to recognize C step driver should read chip version * id located at the AUX bus MISC address space.
Greg Kroah-Hartman
maintainerPATCH 72/123 md/raid1: fix test for was read error from last working device.
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit 34cab6f42003cb06f48f86a86652984dec338ae9 upstream.
When we get a read error from the last working device, we don't try to repair it, and don't fail the device. We simple report a read error to the caller.
However the current test for 'is this the last working device' is wrong.
When there is only one fully working device, it assumes that a non-faulty device is that device. However a spare which is rebuilding would be non-faulty but so not the only working device.
So change the test from "!Faulty" to "In_sync". If ->degraded says there is only one fully working device and this device is in_sync, this must be the one.
This bug has existed since we allowed read_balance to read from a recovering spare in v3.0
--- drivers/md/raid1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/raid1.c +1 -1
@@ -336,7 +336,7 @@ static void raid1_end_read_request(strucspin_lock_irqsave (&conf->device_lock, flags);if (r1_bio->mddev->degraded == conf->raid_disks || (r1_bio->mddev->degraded == conf->raid_disks-1 && - !test_bit (Faulty, &conf->mirrors[mirror].rdev->flags))) +test_bit (In_sync, &conf->mirrors[mirror].rdev->flags))) uptodate =1 ;spin_unlock_irqrestore (&conf->device_lock, flags); }
Greg Kroah-Hartman
maintainerPATCH 73/123 spi: img-spfi: fix support for speeds up to 1/4th input clock
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sifan Naeem <[email protected]>
commit 6a806a214af42ac951e2d85e64d1bf4463482e16 upstream.
Setting the Same Edge bit indicates to the spfi block to receive and transmit data on the same edge of the spfi clock, which in turn doubles the operating frequency of spfi.
The maximum supported frequency is limited to 1/4th of the spfi input clock, but without this bit set the maximum would be 1/8th of the input clock.
The current driver calculates the divisor with maximum speed at 1/4th of the input clock, this would fail if the requested frequency is higher than 1/8 of the input clock. Any requests for 1/8th of the input clock would still pass.
--- drivers/spi/spi-img-spfi.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/spi/spi-img-spfi.c +2 -0
@@ -40,6 +40,7 @@#define SPFI_CONTROL_SOFT_RESET BIT(11)#define SPFI_CONTROL_SEND_DMA BIT(10)#define SPFI_CONTROL_GET_DMA BIT(9) +#define SPFI_CONTROL_SE BIT(8)#define SPFI_CONTROL_TMODE_SHIFT 5#define SPFI_CONTROL_TMODE_MASK 0x7#define SPFI_CONTROL_TMODE_SINGLE 0
@@ -491,6 +492,7 @@ static void img_spfi_config(struct spi_melse if (xfer->tx_nbits ==SPI_NBITS_QUAD && xfer->rx_nbits ==SPI_NBITS_QUAD ) val |=SPFI_CONTROL_TMODE_QUAD <<SPFI_CONTROL_TMODE_SHIFT ; + val |=SPFI_CONTROL_SE ;spfi_writel (spfi, val,SPFI_CONTROL ); }
Greg Kroah-Hartman
maintainerPATCH 74/123 spi: imx: Fix small DMA transfers
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sascha Hauer <[email protected]>
commit f6ee9b582d2db652497b73c1f117591dfb6d3a90 upstream.
DMA transfers must be greater than the watermark level size. spi_imx->rx_wml and spi_imx->tx_wml contain the watermark level in 32bit words whereas struct spi_transfer contains the transfer len in bytes. Fix the check if DMA is possible for a transfer accordingly. This fixes transfers with sizes between 33 and 128 bytes for which previously was claimed that DMA is possible.
--- drivers/spi/spi-imx.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/spi/spi-imx.c +3 -2
@@ -201,8 +201,9 @@ static bool spi_imx_can_dma(struct spi_m {struct spi_imx_data *spi_imx =spi_master_get_devdata (master); -if (spi_imx->dma_is_inited && (transfer->len > spi_imx->rx_wml) - && (transfer->len > spi_imx->tx_wml)) +if (spi_imx->dma_is_inited + && transfer->len > spi_imx->rx_wml *sizeof (u32) + && transfer->len > spi_imx->tx_wml *sizeof (u32))return true;return false; }
Greg Kroah-Hartman
maintainerPATCH 75/123 tile: use free_bootmem_late() for initrd
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Metcalf <[email protected]>
commit 3f81d2447b37ac697b3c600039f2c6b628c06e21 upstream.
We were previously using free_bootmem() and just getting lucky that nothing too bad happened.
--- arch/tile/kernel/setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/tile/kernel/setup.c +1 -1
@@ -1139,7 +1139,7 @@ static void __init load_hv_initrd(void)void __init free_initrd_mem (unsigned long begin,unsigned long end) { -free_bootmem (__pa (begin), end - begin); +free_bootmem_late (__pa (begin), end - begin); }static int __init setup_initrd (char *str)
Greg Kroah-Hartman
maintainerPATCH 76/123 Input: zforce - dont overwrite the stack
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
commit 7d01cd261c76f95913c81554a751968a1d282d3a upstream.
If we get a corrupted packet with PAYLOAD_LENGTH > FRAME_MAXSIZE, we will silently overwrite the stack.
--- drivers/input/touchscreen/zforce_ts.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/touchscreen/zforce_ts.c +1 -1
@@ -430,7 +430,7 @@ static int zforce_read_packet(struct zfo goto unlock; } -if (buf[PAYLOAD_LENGTH ] ==0 ) { +if (buf[PAYLOAD_LENGTH ] ==0 || buf[PAYLOAD_LENGTH ] >FRAME_MAXSIZE ) {dev_err (&client->dev,"invalid payload length: %d\n" , buf[PAYLOAD_LENGTH ]); ret = -EIO ;
Re: [PATCH 4.1 076/123] Input: zforce - dont overwrite the stack
Hi Greg,
Quoted 2 lines · Greg Kroah-Hartman
4.1-stable review patch. If anyone has any objections, please let me know.
This was a bad patch and its reverted n mainline, please drop.
Quoted 30 lines
------------------
From: Oleksij Rempel <[email protected]>
commit
7d01cd261c76f95913c81554a751968a1d282d3aupstream.If we get a corrupted packet with
PAYLOAD_LENGTH>FRAME_MAXSIZE, we will silently overwrite the stack.Signed-off-by Oleksij Rempel <[email protected]>Signed-off-by Dirk Behme <[email protected]>Signed-off-by Dmitry Torokhov <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>---
drivers/input/touchscreen/zforce_ts.c| 2 +-1 file changed, 1 insertion(+), 1 deletion(-)drivers/input/touchscreen/zforce_ts.c +1
-1@@ -430,7 +430,7 @@ static int zforce_read_packet(struct zfo goto unlock; } -if (buf[PAYLOAD_LENGTH ] ==0 ) { +if (buf[PAYLOAD_LENGTH ] ==0 || buf[PAYLOAD_LENGTH ] >FRAME_MAXSIZE ) {dev_err (&client->dev,"invalid payload length: %d\n" , buf[PAYLOAD_LENGTH ]);
Quoted 1 line
ret = -EIO;
Thanks.
Signature · 1 line
Dmitry
Greg Kroah-Hartman
maintainerRe: [PATCH 4.1 076/123] Input: zforce - dont overwrite the stack
Quoted 7 lines · Dmitry Torokhov
Hi Greg,
Quoted 2 lines · Greg Kroah-Hartman
4.1-stable review patch. If anyone has any objections, please let me know.
This was a bad patch and its reverted n mainline, please drop.
Now dropped, thanks for letting me know.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 77/123 Input: usbtouchscreen - avoid unresponsive TSC-30 touch screen
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bernhard Bender <[email protected]>
commit 968491709e5b1aaf429428814fff3d932fa90b60 upstream.
This patch fixes a problem in the usbtouchscreen driver for DMC TSC-30 touch screen. Due to a missing delay between the RESET and SET_RATE commands, the touch screen may become unresponsive during system startup or driver loading.
According to the DMC documentation, a delay is needed after the RESET command to allow the chip to complete its internal initialization. As this delay is not guaranteed, we had a system where the touch screen occasionally did not send any touch data. There was no other indication of the problem.
The patch fixes the problem by adding a 150ms delay between the RESET and SET_RATE commands.
--- drivers/input/touchscreen/usbtouchscreen.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/input/touchscreen/usbtouchscreen.c +3 -0
@@ -627,6 +627,9 @@ static int dmc_tsc10_init(struct usbtouc goto err_out; } +/* TSC-25 data sheet specifies a delay after the RESET command */ +msleep (150 ); +/* set coordinate output rate */ buf[0 ] = buf[1 ] =0xFF ; ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
Greg Kroah-Hartman
maintainerPATCH 78/123 blkcg: fix gendisk reference leak in blkg_conf_prep()
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit 5f6c2d2b7dbb541c1e922538c49fa04c494ae3d7 upstream.
When a blkcg configuration is targeted to a partition rather than a whole device, blkg_conf_prep fails with -EINVAL; unfortunately, it forgets to put the gendisk ref in that case. Fix it.
--- block/blk-cgroup.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
block/blk-cgroup.c +5 -1
@@ -716,8 +716,12 @@ int blkg_conf_prep(struct blkcg *blkcg,return -EINVAL ; disk =get_gendisk (MKDEV (major, minor), &part); -if (!disk || part) +if (!disk)return -EINVAL ; +if (part) { +put_disk (disk); +return -EINVAL ; + }rcu_read_lock ();spin_lock_irq (disk->queue->queue_lock);
Greg Kroah-Hartman
maintainerPATCH 79/123 regulator: s2mps11: Fix GPIO suspend enable shift wrapping bug
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 32c848e33ace75fce388cceff76223d12b46eaa3 upstream.
Status of enabling suspend mode for regulator was stored in bitmap-like long integer.
However since adding support for S2MPU02 the number of regulators exceeded 32 so on devices with more than 32 regulators (S2MPU02 and S2MPS13) overflow happens when shifting the bit. This could lead to enabling suspend mode for completely different regulator than intended or to switching different regulator to other mode (e.g. from always enabled to controlled by PWRHOLD pin). Both cases could result in larger energy usage and issues when suspending to RAM.
--- drivers/regulator/s2mps11.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/regulator/s2mps11.c +10 -4
@@ -34,6 +34,8 @@#include <linux/mfd/samsung/s2mps14.h> #include <linux/mfd/samsung/s2mpu02.h> +/* The highest number of possible regulators for supported devices. */ +#define S2MPS_REGULATOR_MAX S2MPS13_REGULATOR_MAXstruct s2mps11_info {unsigned int rdev_num;int ramp_delay2;
@@ -49,7 +51,7 @@ struct s2mps11_info {* One bit for each S2MPS13/S2MPS14/S2MPU02 regulator whether * the suspend mode was enabled. */ - unsigned long long s2mps14_suspend_state:50; +DECLARE_BITMAP (suspend_state,S2MPS_REGULATOR_MAX );/* Array of size rdev_num with GPIO-s for external sleep control */ int *ext_control_gpio;
@@ -500,7 +502,7 @@ static int s2mps14_regulator_enable(struswitch (s2mps11->dev_type) {case S2MPS13X :case S2MPS14X : -if (s2mps11->s2mps14_suspend_state & (1 <<rdev_get_id (rdev))) +if (test_bit (rdev_get_id (rdev), s2mps11->suspend_state)) val =S2MPS14_ENABLE_SUSPEND ;else if (gpio_is_valid (s2mps11->ext_control_gpio[rdev_get_id (rdev)])) val =S2MPS14_ENABLE_EXT_CONTROL ;
@@ -508,7 +510,7 @@ static int s2mps14_regulator_enable(stru val = rdev->desc->enable_mask;break ;case S2MPU02 : -if (s2mps11->s2mps14_suspend_state & (1 <<rdev_get_id (rdev))) +if (test_bit (rdev_get_id (rdev), s2mps11->suspend_state)) val =S2MPU02_ENABLE_SUSPEND ;else val = rdev->desc->enable_mask;
@@ -562,7 +564,7 @@ static int s2mps14_regulator_set_suspendif (ret <0 )return ret; - s2mps11->s2mps14_suspend_state |= (1 <<rdev_get_id (rdev)); +set_bit (rdev_get_id (rdev), s2mps11->suspend_state);/* * Don't enable suspend mode if regulator is already disabled because * this would effectively for a short time turn on the regulator after
@@ -960,18 +962,22 @@ static int s2mps11_pmic_probe(struct placase S2MPS11X : s2mps11->rdev_num =ARRAY_SIZE (s2mps11_regulators); regulators = s2mps11_regulators; +BUILD_BUG_ON (S2MPS_REGULATOR_MAX < s2mps11->rdev_num);break ;case S2MPS13X : s2mps11->rdev_num =ARRAY_SIZE (s2mps13_regulators); regulators = s2mps13_regulators; +BUILD_BUG_ON (S2MPS_REGULATOR_MAX < s2mps11->rdev_num);break ;case S2MPS14X : s2mps11->rdev_num =ARRAY_SIZE (s2mps14_regulators); regulators = s2mps14_regulators; +BUILD_BUG_ON (S2MPS_REGULATOR_MAX < s2mps11->rdev_num);break ;case S2MPU02 : s2mps11->rdev_num =ARRAY_SIZE (s2mpu02_regulators); regulators = s2mpu02_regulators; +BUILD_BUG_ON (S2MPS_REGULATOR_MAX < s2mps11->rdev_num);break ;default : dev_err(&pdev->dev, "Invalid device type: %u\n",
Greg Kroah-Hartman
maintainerPATCH 80/123 ata: pmp: add quirk for Marvell 4140 SATA PMP
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lior Amsalem <[email protected]>
commit 945b47441d83d2392ac9f984e0267ad521f24268 upstream.
This commit adds the necessary quirk to make the Marvell 4140 SATA PMP work properly. This PMP doesn't like SRST on port number 4 (the host port) so this commit marks this port as not supporting SRST.
--- drivers/ata/libata-pmp.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/ata/libata-pmp.c +7 -0
@@ -460,6 +460,13 @@ static void sata_pmp_quirks(struct ata_pATA_LFLAG_NO_SRST |ATA_LFLAG_ASSUME_ATA ; } + }else if (vendor ==0x11ab && devid ==0x4140 ) { +/* Marvell 4140 quirks */ +ata_for_each_link (link, ap,EDGE ) { +/* port 4 is for SEMB device and it doesn't like SRST */ +if (link->pmp ==4 ) + link->flags |=ATA_LFLAG_DISABLED ; + } } }
Greg Kroah-Hartman
maintainerPATCH 81/123 usb-storage: ignore ZTE MF 823 card reader in mode 0x1225
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
commit 5fb2c782f451a4fb9c19c076e2c442839faf0f76 upstream.
This device automatically switches itself to another mode (0x1405) unless the specific access pattern of Windows is followed in its initial mode. That makes a dirty unmount of the internal storage devices inevitable if they are mounted. So the card reader of such a device should be ignored, lest an unclean removal become inevitable.
This replaces an earlier patch that ignored all LUNs of this device. That patch was overly broad.
--- drivers/usb/storage/unusual_devs.h | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/usb/storage/unusual_devs.h +12 -0
@@ -2065,6 +2065,18 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0 USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NO_READ_DISC_INFO ), +/* Reported by Oliver Neukum <[email protected]> +* This device morphes spontaneously into another device if the access +* pattern of Windows isn't followed. Thus writable media would be dirty +* if the initial instance is used. So the device is limited to its +* virtual CD. +* And yes, the concept that BCD goes up to 9 is not heeded */ +UNUSUAL_DEV (0x19d2 ,0x1225 ,0x0000 ,0xffff , +"ZTE,Incorporated" , +"ZTE WCDMA Technologies MSM" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , + US_FL_SINGLE_LUN ), +/* Reported by Sven Geggus <[email protected]> * This encrypted pen drive returns bogus data for the initial READ(10). */
Greg Kroah-Hartman
maintainerPATCH 82/123 Revert "serial: imx: initialized DMA w/o HW flow enabled"
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Jander <[email protected]>
commit 907eda32a36fcdb979bdb91ea097abb3dd2c23c9 upstream.
This reverts commit 068500e08dc87ea9a453cc4a500cf3ab28d0f936.
According to some tests, SDMA support is broken at least for i.MX6 without HW flow control. Different forms of data-corruption appear either with the ROM firmware for the SDMA controller as well as when loading Freescale provided SDMA firmware versions 1.1 or 3.1.
--- drivers/tty/serial/imx.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
drivers/tty/serial/imx.c +7 -8
@@ -1132,11 +1132,6 @@ static int imx_startup(struct uart_portwhile (!(readl (sport->port.membase +UCR2 ) &UCR2_SRST ) && (--i >0 ))udelay (1 ); -/* Can we enable the DMA support? */ -if (is_imx6q_uart (sport) && !uart_console (port) && - !sport->dma_is_inited) -imx_uart_dma_init (sport); -spin_lock_irqsave (&sport->port.lock, flags);/*
@@ -1145,9 +1140,6 @@ static int imx_startup(struct uart_portwritel (USR1_RTSD , sport->port.membase +USR1 );writel (USR2_ORE , sport->port.membase +USR2 ); -if (sport->dma_is_inited && !sport->dma_is_enabled) -imx_enable_dma (sport); - temp =readl (sport->port.membase +UCR1 ); temp |=UCR1_RRDYEN |UCR1_RTSDEN |UCR1_UARTEN ;
@@ -1318,6 +1310,11 @@ imx_set_termios(struct uart_port *port, }else { ucr2 |=UCR2_CTSC ; } + +/* Can we enable the DMA support? */ +if (is_imx6q_uart (sport) && !uart_console (port) + && !sport->dma_is_inited) +imx_uart_dma_init (sport); }else { termios->c_cflag &= ~CRTSCTS ; }
@@ -1434,6 +1431,8 @@ imx_set_termios(struct uart_port *port,if (UART_ENABLE_MS (&sport->port, termios->c_cflag))imx_enable_ms (&sport->port); +if (sport->dma_is_inited && !sport->dma_is_enabled) +imx_enable_dma (sport);spin_unlock_irqrestore (&sport->port.lock, flags); }
Greg Kroah-Hartman
maintainerPATCH 83/123 serial: core: Fix crashes while echoing when closing
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Hurley <[email protected]>
commit e144c58cad6667876173dd76977e9e6557e34941 upstream.
While closing, new rx data may be received after the input buffers have been flushed but before stop_rx() halts receiving [1]. The new data might not be processed by flush_to_ldisc() until after uart_shutdown() and normal input processing is re-enabled (ie., tty->closing = 0). The race is outlined below:
CPU 0 | CPU 1
|
uart_close() |
tty_port_close_start() |
tty->closing = 1 |
tty_ldisc_flush() |
| => IRQ
| while (LSR & data ready)
| uart_insert_char()
| tty_flip_buffer_push()
| <= EOI
stop_rx() | .
uart_shutdown() | .
free xmit.buf | .
tty_port_tty_set(NULL) | .
tty->closing = 0 | .
| flush_to_ldisc()
| n_tty_receive_buf_common()
| __receive_buf()
| ...
| commit_echoes()
| uart_flush_chars()
| __uart_start()
| ** OOPS on port.tty deref **
tty_ldisc_flush() |Input processing must be prevented from echoing (tty->closing = 1) until _after_ the input buffers have been flushed again at the end of uart_close().
[1] In fact, some input may actually be buffered _after_ stop_rx() since the rx interrupt may have already triggered but not yet been handled when stop_rx() disables rx interrupts.
mutex in uart_close()")
--- drivers/tty/serial/serial_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/tty/serial/serial_core.c +2 -1
@@ -1409,7 +1409,7 @@ static void uart_close(struct tty_structmutex_lock (&port->mutex);uart_shutdown (tty, state);tty_port_tty_set (port,NULL ); - tty->closing =0 ; +spin_lock_irqsave (&port->lock, flags);if (port->blocked_open) {
@@ -1435,6 +1435,7 @@ static void uart_close(struct tty_structmutex_unlock (&port->mutex);tty_ldisc_flush (tty); + tty->closing =0 ; }static void uart_wait_until_sent (struct tty_struct *tty,int timeout)
Greg Kroah-Hartman
maintainerPATCH 84/123 xhci: Calculate old endpoints correctly on device reset
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Campbell <[email protected]>
commit 326124a027abc9a7f43f72dc94f6f0f7a55b02b3 upstream.
When resetting a device the number of active TTs may need to be corrected by xhci_update_tt_active_eps, but the number of old active endpoints supplied to it was always zero, so the number of TTs and the bandwidth reserved for them was not updated, and could rise unnecessarily.
This affected systems using Intel's Patherpoint chipset, which rely on software bandwidth checking. For example, a Lenovo X230 would lose the ability to use ports on the docking station after enough suspend/resume cycles because the bandwidth calculated would rise with every cycle when a suitable device is attached.
The correct number of active endpoints is calculated in the same way as in xhci_reserve_bandwidth.
--- drivers/usb/host/xhci.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/host/xhci.c +3 -0
@@ -3453,6 +3453,9 @@ int xhci_discover_or_reset_device(structreturn -EINVAL ; } +if (virt_dev->tt_info) + old_active_eps = virt_dev->tt_info->active_eps; +if (virt_dev->udev != udev) {/* If the virt_dev and the udev does not match, this virt_dev * may belong to another udev.
Greg Kroah-Hartman
maintainerPATCH 85/123 xhci: report U3 when link is in resume state
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhuang Jin Can <[email protected]>
commit 243292a2ad3dc365849b820a64868927168894ac upstream.
xhci_hub_report_usb3_link_state() returns pls as U0 when the link is in resume state, and this causes usb core to think the link is in U0 while actually it's in resume state. When usb core transfers control request on the link, it fails with TRB error as the link is not ready for transfer.
To fix the issue, report U3 when the link is in resume state, thus usb core knows the link it's not ready for transfer.
--- drivers/usb/host/xhci-hub.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/usb/host/xhci-hub.c +5 -2
@@ -484,10 +484,13 @@ static void xhci_hub_report_usb3_link_stu32 pls = status_reg &PORT_PLS_MASK ;/* resume state is a xHCI internal state. -* Do not report it to usb core. +* Do not report it to usb core, instead, pretend to be U3, +* thus usb core knows it's not ready for transfer */ -if (pls ==XDEV_RESUME ) +if (pls ==XDEV_RESUME ) { + *status |=USB_SS_PORT_LS_U3 ;return ; + }/* When the CAS bit is set then warm reset * should be performed on port
Greg Kroah-Hartman
maintainerPATCH 86/123 xhci: prevent bus_suspend if SS port resuming in phase 1
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhuang Jin Can <[email protected]>
commit fac4271d1126c45ceaceb7f4a336317b771eb121 upstream.
When the link is just waken, it's in Resume state, and driver sets PLS to U0. This refers to Phase 1. Phase 2 refers to when the link has completed the transition from Resume state to U0.
With the fix of xhci: report U3 when link is in resume state, it also exposes an issue that usb3 roothub and controller can suspend right after phase 1, and this causes a hard hang in controller.
To fix the issue, we need to prevent usb3 bus suspend if any port is resuming in phase 1.
--- drivers/usb/host/xhci-hub.c | 6 +++--- drivers/usb/host/xhci-ring.c | 3 +++ drivers/usb/host/xhci.h | 1 + 3 files changed, 7 insertions(+), 3 deletions(-)
drivers/usb/host/xhci-hub.c +3 -3
@@ -1123,10 +1123,10 @@ int xhci_bus_suspend(struct usb_hcd *hcdspin_lock_irqsave (&xhci->lock, flags);if (hcd->self.root_hub->do_remote_wakeup) { -if (bus_state->resuming_ports) { +if (bus_state->resuming_ports ||/* USB2 */ + bus_state->port_remote_wakeup) {/* USB3 */ spin_unlock_irqrestore (&xhci->lock, flags); -xhci_dbg (xhci,"suspend failed because " -"a port is resuming\n" ); +xhci_dbg (xhci,"suspend failed because a port is resuming\n" );return -EBUSY ; } }
drivers/usb/host/xhci-ring.c +3 -0
@@ -1546,6 +1546,9 @@ static void handle_port_status(struct xhusb_hcd_resume_root_hub (hcd); } +if (hcd->speed ==HCD_USB3 && (temp &PORT_PLS_MASK ) ==XDEV_INACTIVE ) + bus_state->port_remote_wakeup &= ~(1 << faked_port_index); +if ((temp &PORT_PLC ) && (temp &PORT_PLS_MASK ) ==XDEV_RESUME ) {xhci_dbg (xhci,"port resume event for port %d\n" , port_id);
drivers/usb/host/xhci.h +1 -0
@@ -285,6 +285,7 @@ struct xhci_op_regs {#define XDEV_U0 (0x0 << 5)#define XDEV_U2 (0x2 << 5)#define XDEV_U3 (0x3 << 5) +#define XDEV_INACTIVE (0x6 << 5)#define XDEV_RESUME (0xf << 5)/* true: port has power (see HCC_PPC) */ #define PORT_POWER (1 << 9)
Greg Kroah-Hartman
maintainerPATCH 87/123 xhci: do not report PLC when link is in internal resume state
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhuang Jin Can <[email protected]>
commit aca3a0489ac019b58cf32794d5362bb284cb9b94 upstream.
Port link change with port in resume state should not be reported to usbcore, as this is an internal state to be handled by xhci driver. Reporting PLC to usbcore may cause usbcore clearing PLC first and port change event irq won't be generated.
--- drivers/usb/host/xhci-hub.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-hub.c +8 -1
@@ -591,7 +591,14 @@ static u32 xhci_get_port_status(struct u status |=USB_PORT_STAT_C_RESET <<16 ;/* USB3.0 only */ if (hcd->speed ==HCD_USB3 ) { -if ((raw_port_status &PORT_PLC )) +/* Port link change with port in resume state should not be +* reported to usbcore, as this is an internal state to be +* handled by xhci driver. Reporting PLC to usbcore may +* cause usbcore clearing PLC first and port change event +* irq won't be generated. +*/ +if ((raw_port_status &PORT_PLC ) && + (raw_port_status &PORT_PLS_MASK ) !=XDEV_RESUME ) status |=USB_PORT_STAT_C_LINK_STATE <<16 ;if ((raw_port_status &PORT_WRC )) status |=USB_PORT_STAT_C_BH_RESET <<16 ;
Greg Kroah-Hartman
maintainerPATCH 88/123 mei: prevent unloading mei hw modules while the device is opened.
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomas Winkler <[email protected]>
commit 154322f47376fed6ab1e4b350aa45fffa15a61aa upstream.
chrdev_open() increases reference counter on cdev->owner. Instead of assigning the owner to mei subsystem, the owner has to be set to the underlaying HW module (mei_me or mei_txe), so once the device is opened the HW module cannot be unloaded.
--- drivers/misc/mei/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/mei/main.c +1 -1
@@ -685,7 +685,7 @@ int mei_register(struct mei_device *dev,/* Fill in the data structures */ devno =MKDEV (MAJOR (mei_devt), dev->minor);cdev_init (&dev->cdev, &mei_fops); - dev->cdev.owner = mei_fops.owner; + dev->cdev.owner = parent->driver->owner;/* Add the device */ ret =cdev_add (&dev->cdev, devno,1 );
Greg Kroah-Hartman
maintainerPATCH 89/123 x86/mm: Add parenthesis for TLB tracepoint size calculation
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Hansen <[email protected]>
commit bbc03778b9954a2ec93baed63718e4df0192f130 upstream.
flush_tlb_info->flush_start/end are both normal virtual addresses. When calculating 'nr_pages' (only used for the tracepoint), I neglected to put parenthesis in.
Thanks to David Koufaty for pointing this out.
--- arch/x86/mm/tlb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/mm/tlb.c +1 -1
@@ -117,7 +117,7 @@ static void flush_tlb_func(void *info) }else {unsigned long addr;unsigned long nr_pages = - f->flush_end - f->flush_start /PAGE_SIZE ; + (f->flush_end - f->flush_start) /PAGE_SIZE ; addr = f->flush_start;while (addr < f->flush_end) {__flush_tlb_single (addr);
Greg Kroah-Hartman
maintainerPATCH 90/123 efi: Handle memory error structures produced based on old versions of standard
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Luck, Tony" <[email protected]>
commit 4c62360d7562a20c996836d163259c87d9378120 upstream.
The memory error record structure includes as its first field a bitmask of which subsequent fields are valid. The allows new fields to be added to the structure while keeping compatibility with older software that parses these records. This mechanism was used between versions 2.2 and 2.3 to add four new fields, growing the size of the structure from 73 bytes to 80. But Linux just added all the new fields so this test:
if (gdata->error_data_length >= sizeof(*mem_err)) cper_print_mem(newpfx, mem_err); else goto err_section_too_small;
now make Linux complain about old format records being too short.
Add a definition for the old format of the structure and use that for the minimum size check. Pass the actual size to cper_print_mem() so it can sanity check the validation_bits field to ensure that if a BIOS using the old format sets bits as if it were new, we won't access fields beyond the end of the structure.
--- drivers/firmware/efi/cper.c | 15 ++++++++++++--- include/linux/cper.h | 22 +++++++++++++++++++++- 2 files changed, 33 insertions(+), 4 deletions(-)
drivers/firmware/efi/cper.c +12 -3
@@ -305,10 +305,17 @@ const char *cper_mem_err_unpack(struct treturn ret; } -static void cper_print_mem (const char *pfx,const struct cper_sec_mem_err *mem) +static void cper_print_mem (const char *pfx,const struct cper_sec_mem_err *mem, +int len) {struct cper_mem_err_compact cmem; +/* Don't trust UEFI 2.1/2.2 structure with bad validation bits */ +if (len ==sizeof (struct cper_sec_mem_err_old ) && + (mem->validation_bits & ~(CPER_MEM_VALID_RANK_NUMBER -1 ))) { +pr_err (FW_WARN "valid bits set for fields beyond structure\n" ); +return ; + }if (mem->validation_bits &CPER_MEM_VALID_ERROR_STATUS )printk ("%s""error_status: 0x%016llx\n" , pfx, mem->error_status);if (mem->validation_bits &CPER_MEM_VALID_PA )
@@ -405,8 +412,10 @@ static void cper_estatus_print_section( }else if (!uuid_le_cmp (*sec_type,CPER_SEC_PLATFORM_MEM )) {struct cper_sec_mem_err *mem_err = (void *)(gdata +1 );printk ("%s""section_type: memory error\n" , newpfx); -if (gdata->error_data_length >=sizeof (*mem_err)) -cper_print_mem (newpfx, mem_err); +if (gdata->error_data_length >= +sizeof (struct cper_sec_mem_err_old )) +cper_print_mem (newpfx, mem_err, + gdata->error_data_length);else goto err_section_too_small; }else if (!uuid_le_cmp (*sec_type,CPER_SEC_PCIE )) {
include/linux/cper.h +21 -1
@@ -340,7 +340,27 @@ struct cper_ia_proc_ctx {__u64 mm_reg_addr; }; -/* Memory Error Section */ +/* Old Memory Error Section UEFI 2.1, 2.2 */ +struct cper_sec_mem_err_old { +__u64 validation_bits; +__u64 error_status; +__u64 physical_addr; +__u64 physical_addr_mask; +__u16 node; +__u16 card; +__u16 module; +__u16 bank; +__u16 device; +__u16 row; +__u16 column; +__u16 bit_pos; +__u64 requestor_id; +__u64 responder_id; +__u64 target_id; +__u8 error_type; +}; + +/* Memory Error Section UEFI >= 2.3 */ struct cper_sec_mem_err {__u64 validation_bits;__u64 error_status;
Greg Kroah-Hartman
maintainerPATCH 91/123 arm64/efi: map the entire UEFI vendor string before reading it
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit f91b1feada0b6f0a4d33648155b3ded2c4e0707e upstream.
At boot, the UTF-16 UEFI vendor string is copied from the system table into a char array with a size of 100 bytes. However, this size of 100 bytes is also used for memremapping() the source, which may not be sufficient if the vendor string exceeds 50 UTF-16 characters, and the placement of the vendor string inside a 4 KB page happens to leave the end unmapped.
So use the correct '100 * sizeof(efi_char16_t)' for the size of the mapping.
--- arch/arm64/kernel/efi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/kernel/efi.c +2 -2
@@ -122,12 +122,12 @@ static int __init uefi_init(void)/* Show what we know for posterity */ c16 =early_memremap (efi_to_phys (efi.systab->fw_vendor), -sizeof (vendor)); +sizeof (vendor) *sizeof (efi_char16_t));if (c16) {for (i =0 ; i < (int )sizeof (vendor) -1 && *c16; ++i) vendor[i] = c16[i]; vendor[i] ='\0' ; -early_memunmap (c16,sizeof (vendor)); +early_memunmap (c16,sizeof (vendor) *sizeof (efi_char16_t)); } pr_info("EFI v%u.%.02u by %s\n",
Greg Kroah-Hartman
maintainerPATCH 92/123 efi: Check for NULL efi kernel parameters
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo Neri <[email protected]>
commit 9115c7589b11349a1c3099758b4bded579ff69e0 upstream.
Even though it is documented how to specifiy efi parameters, it is possible to cause a kernel panic due to a dereference of a NULL pointer when parsing such parameters if "efi" alone is given:
PANIC: early exception 0e rip 10:ffffffff812fb361 error 0 cr2 0
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 4.2.0-rc1+ #450 [ 0.000000] ffffffff81fe20a9 ffffffff81e03d50 ffffffff8184bb0f 00000000000003f8 [ 0.000000] 0000000000000000 ffffffff81e03e08 ffffffff81f371a1 64656c62616e6520 [ 0.000000] 0000000000000069 000000000000005f 0000000000000000 0000000000000000 [ 0.000000] Call Trace: [ 0.000000] [<ffffffff8184bb0f>] dump_stack+0x45/0x57 [ 0.000000] [<ffffffff81f371a1>] early_idt_handler_common+0x81/0xae [ 0.000000] [<ffffffff812fb361>] ? parse_option_str+0x11/0x90 [ 0.000000] [<ffffffff81f4dd69>] arch_parse_efi_cmdline+0x15/0x42 [ 0.000000] [<ffffffff81f376e1>] do_early_param+0x50/0x8a [ 0.000000] [<ffffffff8106b1b3>] parse_args+0x1e3/0x400 [ 0.000000] [<ffffffff81f37a43>] parse_early_options+0x24/0x28 [ 0.000000] [<ffffffff81f37691>] ? loglevel+0x31/0x31 [ 0.000000] [<ffffffff81f37a78>] parse_early_param+0x31/0x3d [ 0.000000] [<ffffffff81f3ae98>] setup_arch+0x2de/0xc08 [ 0.000000] [<ffffffff8109629a>] ? vprintk_default+0x1a/0x20 [ 0.000000] [<ffffffff81f37b20>] start_kernel+0x90/0x423 [ 0.000000] [<ffffffff81f37495>] x86_64_start_reservations+0x2a/0x2c [ 0.000000] [<ffffffff81f37582>] x86_64_start_kernel+0xeb/0xef [ 0.000000] RIP 0xffffffff81ba2efc
This panic is not reproducible with "efi=" as this will result in a non-NULL zero-length string.
Thus, verify that the pointer to the parameter string is not NULL. This is consistent with other parameter-parsing functions which check for NULL pointers.
--- arch/x86/platform/efi/efi.c | 5 +++++ drivers/firmware/efi/efi.c | 5 +++++ 2 files changed, 10 insertions(+)
arch/x86/platform/efi/efi.c +5 -0
@@ -946,6 +946,11 @@ u64 efi_mem_attributes(unsigned long phystatic int __init arch_parse_efi_cmdline (char *str) { +if (!str) { +pr_warn ("need at least one option\n" ); +return -EINVAL ; + } +if (parse_option_str (str,"old_map" ))set_bit (EFI_OLD_MEMMAP , &efi.flags);if (parse_option_str (str,"debug" ))
drivers/firmware/efi/efi.c +5 -0
@@ -57,6 +57,11 @@ bool efi_runtime_disabled(void)static int __init parse_efi_cmdline (char *str) { +if (!str) { +pr_warn ("need at least one option\n" ); +return -EINVAL ; + } +if (parse_option_str (str,"noruntime" )) disable_runtime = true;
Greg Kroah-Hartman
maintainerPATCH 93/123 x86/efi: Use all 64 bit of efi_memmap in setup_e820()
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Skorodumov <[email protected]>
commit 7cc03e48965453b5df1cce5062c826189b04b960 upstream.
The efi_info structure stores low 32 bits of memory map in efi_memmap and high 32 bits in efi_memmap_hi.
While constructing pointer in the setup_e820(), need to take into account all 64 bit of the pointer.
It is because on 64bit machine the function efi_get_memory_map() may return full 64bit pointer and before the patch that pointer was truncated.
The issue is triggered on Parallles virtual machine and fixed with this patch.
--- arch/x86/boot/compressed/eboot.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/x86/boot/compressed/eboot.c +4 -0
@@ -1193,6 +1193,10 @@ static efi_status_t setup_e820(struct bounsigned int e820_type =0 ;unsigned long m = efi->efi_memmap; +#ifdef CONFIG_X86_64 + m |= (u64 )efi->efi_memmap_hi <<32 ; +#endif + d = (efi_memory_desc_t *)(m + (i * efi->efi_memdesc_size));switch (d->type) {case EFI_RESERVED_TYPE :
Greg Kroah-Hartman
maintainerPATCH 94/123 ARC: Reduce bitops lines of code using macros
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vineet Gupta <[email protected]>
commit 04e2eee4b02edcafce96c9c37b31b1a3318291a4 upstream.
No semantical changes !
--- arch/arc/include/asm/bitops.h | 489 ++++++++++++------------------------------ 1 file changed, 150 insertions(+), 339 deletions(-)
arch/arc/include/asm/bitops.h +150 -339
@@ -18,83 +18,50 @@#include <linux/types.h> #include <linux/compiler.h> #include <asm/barrier.h> +#ifndef CONFIG_ARC_HAS_LLSC +#include <asm/smp.h> +#endif -/* -* Hardware assisted read-modify-write using ARC700 LLOCK/SCOND insns. -* The Kconfig glue ensures that in SMP, this is only set if the container -* SoC/platform has cross-core coherent LLOCK/SCOND -*/ #if defined(CONFIG_ARC_HAS_LLSC ) -static inline void set_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned int temp; - - m += nr >>5 ; - -/* -* ARC ISA micro-optimization: -* -* Instructions dealing with bitpos only consider lower 5 bits (0-31) -* e.g (x << 33) is handled like (x << 1) by ASL instruction -* (mem pointer still needs adjustment to point to next word) -* -* Hence the masking to clamp @nr arg can be elided in general. -* -* However if @nr is a constant (above assumed it in a register), -* and greater than 31, gcc can optimize away (x << 33) to 0, -* as overflow, given the 32-bit ISA. Thus masking needs to be done -* for constant @nr, but no code is generated due to const prop. -*/ -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - __asm__ __volatile__( -"1: llock %0, [%1] \n" -" bset %0, %0, %2 \n" -" scond %0, [%1] \n" -" bnz 1b \n" - :"=&r" (temp) - :"r" (m),"ir" (nr) - :"cc" ); -} - -static inline void clear_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned int temp; - - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - __asm__ __volatile__( -"1: llock %0, [%1] \n" -" bclr %0, %0, %2 \n" -" scond %0, [%1] \n" -" bnz 1b \n" - :"=&r" (temp) - :"r" (m),"ir" (nr) - :"cc" ); -} +/* +* Hardware assisted Atomic-R-M-W +*/ -static inline void change_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned int temp; - - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - __asm__ __volatile__( -"1: llock %0, [%1] \n" -" bxor %0, %0, %2 \n" -" scond %0, [%1] \n" -" bnz 1b \n" - :"=&r" (temp) - :"r" (m),"ir" (nr) - :"cc" ); +#define BIT_OP (op, c_op, asm_op) \ +static inline void op##_bit(unsigned long nr, volatile unsigned long *m)\ +{ \ + unsigned int temp; \ + \ + m += nr >> 5; \ + \ +/* \ +* ARC ISA micro-optimization: \ +* \ +* Instructions dealing with bitpos only consider lower 5 bits \ +* e.g (x << 33) is handled like (x << 1) by ASL instruction \ +* (mem pointer still needs adjustment to point to next word) \ +* \ +* Hence the masking to clamp @nr arg can be elided in general. \ +* \ +* However if @nr is a constant (above assumed in a register), \ +* and greater than 31, gcc can optimize away (x << 33) to 0, \ +* as overflow, given the 32-bit ISA. Thus masking needs to be \ +* done for const @nr, but no code is generated due to gcc \ +* const prop. \ +*/ \ +if (__builtin_constant_p (nr)) \ + nr &=0x1f ; \ + \ + __asm__ __volatile__( \ +"1: llock %0, [%1] \n" \ + " " #asm_op " %0, %0, %2 \n" \ +" scond %0, [%1] \n" \ +" bnz 1b \n" \ + :"=&r" (temp)/* Early clobber, to prevent reg reuse */ \ + :"r" (m),/* Not "m": llock only supports reg direct addr mode */ \ +"ir" (nr) \ + : "cc"); \ }/*
@@ -108,91 +75,38 @@ static inline void change_bit(unsigned l* Since ARC lacks a equivalent h/w primitive, the bit is set unconditionally * and the old value of bit is returned */ -static inline int test_and_set_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long old, temp; - - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - -/* -* Explicit full memory barrier needed before/after as -* LLOCK/SCOND themselves don't provide any such semantics -*/ -smp_mb (); - - __asm__ __volatile__( -"1: llock %0, [%2] \n" -" bset %1, %0, %3 \n" -" scond %1, [%2] \n" -" bnz 1b \n" - :"=&r" (old),"=&r" (temp) - :"r" (m),"ir" (nr) - :"cc" ); - -smp_mb (); - -return (old & (1 << nr)) !=0 ; -} - -static inline int -test_and_clear_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned int old, temp; - - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - -smp_mb (); - - __asm__ __volatile__( -"1: llock %0, [%2] \n" -" bclr %1, %0, %3 \n" -" scond %1, [%2] \n" -" bnz 1b \n" - :"=&r" (old),"=&r" (temp) - :"r" (m),"ir" (nr) - :"cc" ); - -smp_mb (); - -return (old & (1 << nr)) !=0 ; -} - -static inline int -test_and_change_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned int old, temp; - - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - -smp_mb (); - - __asm__ __volatile__( -"1: llock %0, [%2] \n" -" bxor %1, %0, %3 \n" -" scond %1, [%2] \n" -" bnz 1b \n" - :"=&r" (old),"=&r" (temp) - :"r" (m),"ir" (nr) - :"cc" ); - -smp_mb (); - -return (old & (1 << nr)) !=0 ; +#define TEST_N_BIT_OP (op, c_op, asm_op) \ +static inline int test_and_##op##_bit(unsigned long nr, volatile unsigned long *m)\ +{ \ + unsigned long old, temp; \ + \ + m += nr >> 5; \ + \ + if (__builtin_constant_p(nr)) \ + nr &= 0x1f; \ + \ +/* \ +* Explicit full memory barrier needed before/after as \ +* LLOCK/SCOND themselves don't provide any such smenatic \ +*/ \ +smp_mb (); \ + \ + __asm__ __volatile__( \ + "1: llock %0, [%2] \n" \ + " " #asm_op " %1, %0, %3 \n" \ + " scond %1, [%2] \n" \ + " bnz 1b \n" \ + : "=&r"(old), "=&r"(temp) \ + : "r"(m), "ir"(nr) \ + : "cc"); \ + \ + smp_mb(); \ + \ + return (old & (1 << nr)) != 0; \ }#else /* !CONFIG_ARC_HAS_LLSC */ -#include <asm/smp.h> -/* * Non hardware assisted Atomic-R-M-W * Locking would change to irq-disabling only (UP) and spinlocks (SMP)
@@ -209,111 +123,43 @@ test_and_change_bit(unsigned long nr, vo* at compile time) */ -static inline void set_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long temp, flags; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - -bitops_lock (flags); - - temp = *m; - *m = temp | (1UL << nr); - -bitops_unlock (flags); -} - -static inline void clear_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long temp, flags; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - -bitops_lock (flags); - - temp = *m; - *m = temp & ~(1UL << nr); - -bitops_unlock (flags); -} - -static inline void change_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long temp, flags; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - -bitops_lock (flags); - - temp = *m; - *m = temp ^ (1UL << nr); - -bitops_unlock (flags); -} - -static inline int test_and_set_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long old, flags; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - -/* -* spin lock/unlock provide the needed smp_mb() before/after -*/ -bitops_lock (flags); - - old = *m; - *m = old | (1 << nr); - -bitops_unlock (flags); - -return (old & (1 << nr)) !=0 ; -} - -static inline int -test_and_clear_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long old, flags; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - -bitops_lock (flags); - - old = *m; - *m = old & ~(1 << nr); - -bitops_unlock (flags); - -return (old & (1 << nr)) !=0 ; -} - -static inline int -test_and_change_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long old, flags; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - -bitops_lock (flags); - - old = *m; - *m = old ^ (1 << nr); - -bitops_unlock (flags); - -return (old & (1 << nr)) !=0 ; +#define BIT_OP (op, c_op, asm_op) \ +static inline void op##_bit(unsigned long nr, volatile unsigned long *m)\ +{ \ + unsigned long temp, flags; \ + m += nr >> 5; \ + \ + if (__builtin_constant_p(nr)) \ + nr &= 0x1f; \ + \ +/* \ +* spin lock/unlock provide the needed smp_mb() before/after \ +*/ \ +bitops_lock (flags); \ + \ + temp = *m; \ + *m = temp c_op (1UL << nr); \ + \ +bitops_unlock (flags); \ +} + +#define TEST_N_BIT_OP (op, c_op, asm_op) \ +static inline int test_and_##op##_bit(unsigned long nr, volatile unsigned long *m)\ +{ \ + unsigned long old, flags; \ + m += nr >> 5; \ + \ + if (__builtin_constant_p(nr)) \ + nr &= 0x1f; \ + \ + bitops_lock(flags); \ + \ + old = *m; \ + *m = old c_op (1 << nr); \ + \ + bitops_unlock(flags); \ + \ + return (old & (1 << nr)) != 0; \ }#endif /* CONFIG_ARC_HAS_LLSC */
@@ -322,86 +168,51 @@ test_and_change_bit(unsigned long nr, vo* Non atomic variants **************************************/ -static inline void __set_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long temp; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - temp = *m; - *m = temp | (1UL << nr); -} - -static inline void __clear_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long temp; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - temp = *m; - *m = temp & ~(1UL << nr); -} - -static inline void __change_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long temp; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - temp = *m; - *m = temp ^ (1UL << nr); -} - -static inline int -__test_and_set_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long old; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - old = *m; - *m = old | (1 << nr); - -return (old & (1 << nr)) !=0 ; -} - -static inline int -__test_and_clear_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long old; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - old = *m; - *m = old & ~(1 << nr); - -return (old & (1 << nr)) !=0 ; -} - -static inline int -__test_and_change_bit (unsigned long nr,volatile unsigned long *m) -{ -unsigned long old; - m += nr >>5 ; - -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - old = *m; - *m = old ^ (1 << nr); - -return (old & (1 << nr)) !=0 ; -} +#define __BIT_OP (op, c_op, asm_op) \ +static inline void __##op##_bit(unsigned long nr, volatile unsigned long *m) \ +{ \ + unsigned long temp; \ + m += nr >> 5; \ + \ + if (__builtin_constant_p(nr)) \ + nr &= 0x1f; \ + \ + temp = *m; \ + *m = temp c_op (1UL << nr); \ +} + +#define __TEST_N_BIT_OP (op, c_op, asm_op) \ +static inline int __test_and_##op##_bit(unsigned long nr, volatile unsigned long *m)\ +{ \ + unsigned long old; \ + m += nr >> 5; \ + \ + if (__builtin_constant_p(nr)) \ + nr &= 0x1f; \ + \ + old = *m; \ + *m = old c_op (1 << nr); \ + \ + return (old & (1 << nr)) != 0; \ +} + +#define BIT_OPS (op, c_op, asm_op) \ + \ +/* set_bit(), clear_bit(), change_bit() */ \ + BIT_OP(op, c_op, asm_op) \ + \ +/* test_and_set_bit(), test_and_clear_bit(), test_and_change_bit() */ \ +TEST_N_BIT_OP (op, c_op, asm_op) \ + \ + /* __set_bit(), __clear_bit(), __change_bit() */ \ +__BIT_OP (op, c_op, asm_op) \ + \ + /* __test_and_set_bit(), __test_and_clear_bit(), __test_and_change_bit() */\ + __TEST_N_BIT_OP(op, c_op, asm_op) + +BIT_OPS(set, |, bset) +BIT_OPS(clear, & ~, bclr) +BIT_OPS(change, ^, bxor)/* * This routine doesn't need to be atomic.
Greg Kroah-Hartman
maintainerPATCH 95/123 ARC: Make ARC bitops "safer" (add anti-optimization)
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vineet Gupta <[email protected]>
commit 80f420842ff42ad61f84584716d74ef635f13892 upstream.
ARCompact/ARCv2 ISA provide that any instructions which deals with bitpos/count operand ASL, LSL, BSET, BCLR, BMSK .... will only consider lower 5 bits. i.e. auto-clamp the pos to 0-31.
ARC Linux bitops exploited this fact by NOT explicitly masking out upper bits for @nr operand in general, saving a bunch of AND/BMSK instructions in generated code around bitops.
While this micro-optimization has worked well over years it is NOT safe as shifting a number with a value, greater than native size is "undefined" per "C" spec.
So as it turns outm EZChip ran into this eventually, in their massive muti-core SMP build with 64 cpus. There was a test_bit() inside a loop from 63 to 0 and gcc was weirdly optimizing away the first iteration (so it was really adhering to standard by implementing undefined behaviour vs. removing all the iterations which were phony i.e. (1 << [63..32])
| for i = 63 to 0 | X = ( 1 << i ) | if X == 0 | continue
So fix the code to do the explicit masking at the expense of generating additional instructions. Fortunately, this can be mitigated to a large extent as gcc has SHIFT_COUNT_TRUNCATED which allows combiner to fold masking into shift operation itself. It is currently not enabled in ARC gcc backend, but could be done after a bit of testing.
Fixes STAR 9000866918 ("unsafe "undefined behavior" code in kernel")
--- arch/arc/include/asm/bitops.h | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-)
arch/arc/include/asm/bitops.h +9 -26
@@ -50,8 +50,7 @@ static inline void op##_bit(unsigned lon* done for const @nr, but no code is generated due to gcc \ * const prop. \ */ \ -if (__builtin_constant_p (nr)) \ - nr &=0x1f ; \ + nr &=0x1f ; \ \ __asm__ __volatile__( \ "1: llock %0, [%1] \n" \
@@ -82,8 +81,7 @@ static inline int test_and_##op##_bit(un \ m += nr >>5 ; \ \ -if (__builtin_constant_p (nr)) \ - nr &=0x1f ; \ + nr &=0x1f ; \ \/* \ * Explicit full memory barrier needed before/after as \
@@ -129,16 +127,13 @@ static inline void op##_bit(unsigned lonunsigned long temp, flags; \ m += nr >>5 ; \ \ -if (__builtin_constant_p (nr)) \ - nr &=0x1f ; \ - \/* \ * spin lock/unlock provide the needed smp_mb() before/after \ */ \bitops_lock (flags); \ \ temp = *m; \ - *m = temp c_op (1UL << nr); \ + *m = temp c_op (1UL << (nr & 0x1f)); \ \bitops_unlock (flags); \ }
@@ -149,17 +144,14 @@ static inline int test_and_##op##_bit(ununsigned long old, flags; \ m += nr >>5 ; \ \ -if (__builtin_constant_p (nr)) \ - nr &=0x1f ; \ - \bitops_lock (flags); \ \ old = *m; \ - *m = old c_op (1 << nr); \ + *m = old c_op (1UL << (nr & 0x1f)); \ \bitops_unlock (flags); \ \ - return (old & (1 << nr)) != 0; \ + return (old & (1UL << (nr & 0x1f))) != 0; \ }#endif /* CONFIG_ARC_HAS_LLSC */
@@ -174,11 +166,8 @@ static inline void __##op##_bit(unsignedunsigned long temp; \ m += nr >>5 ; \ \ -if (__builtin_constant_p (nr)) \ - nr &=0x1f ; \ - \ temp = *m; \ - *m = temp c_op (1UL << nr); \ + *m = temp c_op (1UL << (nr & 0x1f)); \ }#define __TEST_N_BIT_OP (op, c_op, asm_op) \
@@ -187,13 +176,10 @@ static inline int __test_and_##op##_bit(unsigned long old; \ m += nr >>5 ; \ \ -if (__builtin_constant_p (nr)) \ - nr &=0x1f ; \ - \ old = *m; \ - *m = old c_op (1 << nr); \ + *m = old c_op (1UL << (nr & 0x1f)); \ \ -return (old & (1 << nr)) !=0 ; \ +return (old & (1UL << (nr &0x1f ))) !=0 ; \ }#define BIT_OPS (op, c_op, asm_op) \
@@ -224,10 +210,7 @@ test_bit(unsigned int nr, const volatile addr += nr >>5 ; -if (__builtin_constant_p (nr)) - nr &=0x1f ; - - mask =1 << nr; + mask =1UL << (nr &0x1f );return ((mask & *addr) !=0 ); }
Greg Kroah-Hartman
maintainerPATCH 96/123 rds: rds_ib_device.refcount overflow
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wengang Wang <[email protected]>
commit 4fabb59449aa44a585b3603ffdadd4c5f4d0c033 upstream.
There lacks a dropping on rds_ib_device.refcount in case rds_ib_alloc_fmr failed(mr pool running out). this lead to the refcount overflow.
A complain in line 117(see following) is seen. From vmcore:s_ib_rdma_mr_pool_depleted is 2147485544 and rds_ibdev->refcount is -2147475448. That is the evidence the mr pool is used up. so rds_ib_alloc_fmr is very likely to return ERR_PTR(-EAGAIN).
115 void rds_ib_dev_put(struct rds_ib_device *rds_ibdev) 116 {
117 BUG_ON(atomic_read(&rds_ibdev->refcount) <= 0);
118 if (atomic_dec_and_test(&rds_ibdev->refcount))
119 queue_work(rds_wq, &rds_ibdev->free_work);
120 }
fix is to drop refcount when rds_ib_alloc_fmr failed.
--- net/rds/ib_rdma.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/rds/ib_rdma.c +3 -1
@@ -759,8 +759,10 @@ void *rds_ib_get_mr(struct scatterlist * } ibmr =rds_ib_alloc_fmr (rds_ibdev); -if (IS_ERR (ibmr)) +if (IS_ERR (ibmr)) { +rds_ib_dev_put (rds_ibdev);return ibmr; + } ret =rds_ib_map_fmr (rds_ibdev, ibmr, sg, nents);if (ret ==0 )
Greg Kroah-Hartman
maintainerPATCH 97/123 n_tty: signal and flush atomically
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Hurley <[email protected]>
commit 3b19e032295647b7be2aa3be62510db4aaeda759 upstream.
When handling signalling char, claim the termios write lock before signalling waiting readers and writers to prevent further i/o before flushing the echo and output buffers. This prevents a userspace signal handler which may output from racing the terminal flush.
Reference: Bugzilla #99351 ("Output truncated in ssh session after...")
--- drivers/tty/n_tty.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
drivers/tty/n_tty.c +13 -3
@@ -1108,19 +1108,29 @@ static void eraser(unsigned char c, stru* Locking: ctrl_lock */ -static void isig (int sig,struct tty_struct *tty) +static void __isig (int sig,struct tty_struct *tty) { -struct n_tty_data *ldata = tty->disc_data;struct pid *tty_pgrp =tty_get_pgrp (tty);if (tty_pgrp) {kill_pgrp (tty_pgrp, sig,1 );put_pid (tty_pgrp); } +} + +static void isig (int sig,struct tty_struct *tty) +{ +struct n_tty_data *ldata = tty->disc_data; -if (!L_NOFLSH (tty)) { +if (L_NOFLSH (tty)) { +/* signal only */ +__isig (sig, tty); + + }else {/* signal and flush */ up_read (&tty->termios_rwsem);down_write (&tty->termios_rwsem); +__isig (sig, tty); +/* clear echo buffer */ mutex_lock (&ldata->output_lock); ldata->echo_head = ldata->echo_tail =0 ;
Greg Kroah-Hartman
maintainerPATCH 98/123 blk-mq: set default timeout as 30 seconds
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
commit e56f698bd0720e17f10f39e8b0b5b446ad0ab22c upstream.
It is reasonable to set default timeout of request as 30 seconds instead of 30000 ticks, which may be 300 seconds if HZ is 100, for example, some arm64 based systems may choose 100 HZ.
--- block/blk-mq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/blk-mq.c +1 -1
@@ -1968,7 +1968,7 @@ struct request_queue *blk_mq_init_alloca goto err_hctxs;setup_timer (&q->timeout, blk_mq_rq_timer, (unsigned long ) q); -blk_queue_rq_timeout (q, set->timeout ? set->timeout :30000 ); +blk_queue_rq_timeout (q, set->timeout ? set->timeout :30 *HZ ); q->nr_queues = nr_cpu_ids; q->nr_hw_queues = set->nr_hw_queues;
Greg Kroah-Hartman
maintainerPATCH 99/123 perf hists browser: Take the --comm, --dsos, etc filters into account
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
commit 9c0fa8dd3d58de8b688fda758eea1719949c7f0a upstream.
At some point:
commit 2c86c7ca7606
Author: Namhyung Kim <[email protected]>
Date: Mon Mar 17 18:18:54 2014 -0300
perf report: Merge al->filtered with hist_entry->filtered
We stopped dropping samples for things filtered via the --comms, --dsos, --symbols, etc, i.e. things marked as filtered in the symbol resolution routines (thread__find_addr_map(), perf_event__preprocess_sample(), etc).
But then, in:
commit 268397cb2a47
Author: Namhyung Kim <[email protected]>
Date: Tue Apr 22 14:49:31 2014 +0900
perf top/tui: Update nr_entries properly after a filter is applied
We don't take into account entries that were filtered in perf_event__preprocess_sample() and friends, which leads to inconsistency in the browser seek routines, that expects the number of hist_entry->filtered entries to match what it thinks is the number of unfiltered, browsable entries.
So, for instance, when we do:
perf top --symbols ___non_existent_symbol___
the hist_browser__nr_entries() routine thinks there are no filters in place, uses the hists->nr_entries but all entries are filtered, leading to a segfault.
Tested with:
perf top --symbols malloc,free --percentage=relative
Freezing, by pressing 'f', at any time and doing the math on the percentages ends up with 100%, ditto for:
perf top --dsos libpthread-2.20.so,libxul.so --percentage=relative
Both were segfaulting, all fixed now.
More work needed to do away with checking if filters are in place, we should just use the nr_non_filtered_samples counter, no need to conditionally use it or hists.nr_filter, as what the browser does is just show unfiltered stuff. An audit of how it is being accounted is needed, this is the minimal fix.
--- tools/perf/ui/browsers/hists.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/ui/browsers/hists.c +1 -1
@@ -45,7 +45,7 @@ static struct rb_node *hists__filter_entstatic bool hist_browser__has_filter (struct hist_browser *hb) { -return hists__has_filter (hb->hists) || hb->min_pcnt; +return hists__has_filter (hb->hists) || hb->min_pcnt || symbol_conf.has_filter; }static int hist_browser__get_folding (struct hist_browser *browser)
Re: [PATCH 4.1 099/123] perf hists browser: Take the --comm, --dsos, etc filters into account
Quoted 7 lines · Greg Kroah-Hartman
4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
commit
9c0fa8dd3d58de8b688fda758eea1719949c7f0aupstream.
This commit needs upstream commit 0bc2f2f7d080561cc484d2d0a162a9396bed3383 as well to fix the following build error
CC ui/browsers/hists.oui/browsers/hists.c: In function 'hist_browser__has_filter':ui/browsers/hists.c:48:68: error: 'struct symbol_conf' has no member named 'has_filter'
return hists__has_filter(hb->hists) || hb->min_pcnt ||
symbol_conf.has_filter;
^ui/browsers/hists.c:49:1: error: control reaches end of non-void function [-Werror=return-type]
}
^
cc1: all warnings being treated as errors /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:68: recipe for target 'ui/browsers/hists.o' failed make[4]: *** [ui/browsers/hists.o] Error 1 /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:107: recipe for target 'browsers' failed make[3]: *** [browsers] Error 2 /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:107: recipe for target 'ui' failed make[2]: *** [ui] Error 2
Makefile.perf:366: recipe for target 'libperf-in.o' failed
make[1]: *** [libperf-in.o] Error 2
Makefile:68: recipe for target 'all' failed
make: *** [all] Error 2
Greg Kroah-Hartman
maintainerRe: [PATCH 4.1 099/123] perf hists browser: Take the --comm, --dsos, etc filters into account
Quoted 30 lines · Andre Tomt (LKML)
Quoted 7 lines · Greg Kroah-Hartman
4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
commit
9c0fa8dd3d58de8b688fda758eea1719949c7f0aupstream.This commit needs upstream commit
0bc2f2f7d080561cc484d2d0a162a9396bed3383as well to fix the following build errorCC
ui/browsers/hists.oui/browsers/hists.c: In function 'hist_browser__has_filter':ui/browsers/hists.c:48:68: error: 'structsymbol_conf' has no member named 'has_filter'
returnhists__has_filter(hb->hists)||hb->min_pcnt||symbol_conf.has_filter; ^
ui/browsers/hists.c:49:1: error: control reaches end of non-void function [-Werror=return-type]
}
^
cc1: all warnings being treated as errors /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:68: recipe for target 'ui/browsers/hists.o' failed
make[4]: *** [ui/browsers/hists.o] Error 1 /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:107: recipe for target 'browsers' failed
Quoted 9 lines
make[3]: *** [browsers] Error 2 /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:107: recipe for target 'ui' failed
make[2]: *** [ui] Error 2
Makefile.perf:366: recipe for target 'libperf-in.o' failed make[1]: *** [libperf-in.o] Error 2
Makefile:68: recipe for target 'all' failed
make: *** [all] Error 2
Now applied, thanks.
greg k-h
Re: [PATCH 4.1 099/123] perf hists browser: Take the --comm, --dsos, etc filters into account
In reply to Andre Tomt (LKML)Quoted 12 lines · Andre Tomt (LKML)
Quoted 7 lines · Greg Kroah-Hartman
4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
commit
9c0fa8dd3d58de8b688fda758eea1719949c7f0aupstream.This commit needs upstream commit
0bc2f2f7d080561cc484d2d0a162a9396bed3383as well to fix the following build error
Thanks, I'm queuing this commit for the 3.16 kernel as well. Also CC'ing Kamal as it looks like 3.19 needs it too.
Cheers,
--
Lu�s
Quoted 32 lines
CC
ui/browsers/hists.oui/browsers/hists.c: In function 'hist_browser__has_filter':ui/browsers/hists.c:48:68: error: 'structsymbol_conf' has no member named 'has_filter'
returnhists__has_filter(hb->hists)||hb->min_pcnt||symbol_conf.has_filter; ^
ui/browsers/hists.c:49:1: error: control reaches end of non-void function [-Werror=return-type]
}
^
cc1: all warnings being treated as errors /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:68: recipe for target 'ui/browsers/hists.o' failed
make[4]: *** [ui/browsers/hists.o] Error 1 /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:107: recipe for target 'browsers' failed
make[3]: *** [browsers] Error 2 /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:107: recipe for target 'ui' failed
make[2]: *** [ui] Error 2
Makefile.perf:366: recipe for target 'libperf-in.o' failed make[1]: *** [libperf-in.o] Error 2
Makefile:68: recipe for target 'all' failed
make: *** [all] Error 2--
To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 4.1 099/123] perf hists browser: Take the --comm, --dsos, etc filters into account
Quoted 8 lines · Luis Henriques
Quoted 7 lines · Andre Tomt (LKML)
Quoted 6 lines · Greg Kroah-Hartman
4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
Quoted 8 lines
Quoted 5 lines
Quoted 1 line
commit
9c0fa8dd3d58de8b688fda758eea1719949c7f0aupstream.This commit needs upstream commit
0bc2f2f7d080561cc484d2d0a162a9396bed3383as well to fix the following build errorThanks, I'm queuing this commit for the 3.16 kernel as well. Also CC'ing Kamal as it looks like 3.19 needs it too.
Indeed it does. Queued for 3.19-stable also:
0bc2f2f perf symbols: Store if there is a filter in place
Thanks very much Andre.
-Kamal
Quoted 33 lines
Quoted 32 lines
CC
ui/browsers/hists.oui/browsers/hists.c: In function 'hist_browser__has_filter':ui/browsers/hists.c:48:68: error: 'structsymbol_conf' has no member named 'has_filter'
returnhists__has_filter(hb->hists)||hb->min_pcnt||symbol_conf.has_filter; ^
ui/browsers/hists.c:49:1: error: control reaches end of non-void function [-Werror=return-type]
}
^
cc1: all warnings being treated as errors /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:68: recipe for target 'ui/browsers/hists.o' failed
make[4]: *** [ui/browsers/hists.o] Error 1 /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:107: recipe for target 'browsers' failed
make[3]: *** [browsers] Error 2 /disks/build/data/linux-4.1.5-rc1/tools/build/Makefile.build:107: recipe for target 'ui' failed
make[2]: *** [ui] Error 2
Makefile.perf:366: recipe for target 'libperf-in.o' failed make[1]: *** [libperf-in.o] Error 2
Makefile:68: recipe for target 'all' failed
make: *** [all] Error 2--
To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Greg Kroah-Hartman
maintainerPATCH 100/123 perf/x86/intel/cqm: Return cached counter value from IRQ context
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Fleming <[email protected]>
commit 2c534c0da0a68418693e10ce1c4146e085f39518 upstream.
Peter reported the following potential crash which I was able to reproduce with his test program,
[ 148.765788] ------------[ cut here ]------------ [ 148.765796] WARNING: CPU: 34 PID: 2840 at kernel/smp.c:417 smp_call_function_many+0xb6/0x260() [ 148.765797] Modules linked in: [ 148.765800] CPU: 34 PID: 2840 Comm: perf Not tainted 4.2.0-rc1+ #4 [ 148.765803] ffffffff81cdc398 ffff88085f105950 ffffffff818bdfd5 0000000000000007 [ 148.765805] 0000000000000000 ffff88085f105990 ffffffff810e413a 0000000000000000 [ 148.765807] ffffffff82301080 0000000000000022 ffffffff8107f640 ffffffff8107f640 [ 148.765809] Call Trace: [ 148.765810] <NMI> [<ffffffff818bdfd5>] dump_stack+0x45/0x57 [ 148.765818] [<ffffffff810e413a>] warn_slowpath_common+0x8a/0xc0 [ 148.765822] [<ffffffff8107f640>] ? intel_cqm_stable+0x60/0x60 [ 148.765824] [<ffffffff8107f640>] ? intel_cqm_stable+0x60/0x60 [ 148.765825] [<ffffffff810e422a>] warn_slowpath_null+0x1a/0x20 [ 148.765827] [<ffffffff811613f6>] smp_call_function_many+0xb6/0x260 [ 148.765829] [<ffffffff8107f640>] ? intel_cqm_stable+0x60/0x60 [ 148.765831] [<ffffffff81161748>] on_each_cpu_mask+0x28/0x60 [ 148.765832] [<ffffffff8107f6ef>] intel_cqm_event_count+0x7f/0xe0 [ 148.765836] [<ffffffff811cdd35>] perf_output_read+0x2a5/0x400 [ 148.765839] [<ffffffff811d2e5a>] perf_output_sample+0x31a/0x590 [ 148.765840] [<ffffffff811d333d>] ? perf_prepare_sample+0x26d/0x380 [ 148.765841] [<ffffffff811d3497>] perf_event_output+0x47/0x60 [ 148.765843] [<ffffffff811d36c5>] __perf_event_overflow+0x215/0x240 [ 148.765844] [<ffffffff811d4124>] perf_event_overflow+0x14/0x20 [ 148.765847] [<ffffffff8107e7f4>] intel_pmu_handle_irq+0x1d4/0x440 [ 148.765849] [<ffffffff811d07a6>] ? __perf_event_task_sched_in+0x36/0xa0 [ 148.765853] [<ffffffff81219bad>] ? vunmap_page_range+0x19d/0x2f0 [ 148.765854] [<ffffffff81219d11>] ? unmap_kernel_range_noflush+0x11/0x20 [ 148.765859] [<ffffffff814ce6fe>] ? ghes_copy_tofrom_phys+0x11e/0x2a0 [ 148.765863] [<ffffffff8109e5db>] ? native_apic_msr_write+0x2b/0x30 [ 148.765865] [<ffffffff8109e44d>] ? x2apic_send_IPI_self+0x1d/0x20 [ 148.765869] [<ffffffff81065135>] ? arch_irq_work_raise+0x35/0x40 [ 148.765872] [<ffffffff811c8d86>] ? irq_work_queue+0x66/0x80 [ 148.765875] [<ffffffff81075306>] perf_event_nmi_handler+0x26/0x40 [ 148.765877] [<ffffffff81063ed9>] nmi_handle+0x79/0x100 [ 148.765879] [<ffffffff81064422>] default_do_nmi+0x42/0x100 [ 148.765880] [<ffffffff81064563>] do_nmi+0x83/0xb0 [ 148.765884] [<ffffffff818c7c0f>] end_repeat_nmi+0x1e/0x2e [ 148.765886] [<ffffffff811d07a6>] ? __perf_event_task_sched_in+0x36/0xa0 [ 148.765888] [<ffffffff811d07a6>] ? __perf_event_task_sched_in+0x36/0xa0 [ 148.765890] [<ffffffff811d07a6>] ? __perf_event_task_sched_in+0x36/0xa0 [ 148.765891] <<EOE>> [<ffffffff8110ab66>] finish_task_switch+0x156/0x210 [ 148.765898] [<ffffffff818c1671>] __schedule+0x341/0x920 [ 148.765899] [<ffffffff818c1c87>] schedule+0x37/0x80 [ 148.765903] [<ffffffff810ae1af>] ? do_page_fault+0x2f/0x80 [ 148.765905] [<ffffffff818c1f4a>] schedule_user+0x1a/0x50 [ 148.765907] [<ffffffff818c666c>] retint_careful+0x14/0x32 [ 148.765908] ---[ end trace e33ff2be78e14901 ]---
The CQM task events are not safe to be called from within interrupt context because they require performing an IPI to read the counter value on all sockets. And performing IPIs from within IRQ context is a "no-no".
Make do with the last read counter value currently event in event->count when we're invoked in this context.
--- arch/x86/kernel/cpu/perf_event_intel_cqm.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/x86/kernel/cpu/perf_event_intel_cqm.c +8 -0
@@ -934,6 +934,14 @@ static u64 intel_cqm_event_count(structreturn 0 ;/* +* Getting up-to-date values requires an SMP IPI which is not +* possible if we're being called in interrupt context. Return +* the cached values instead. +*/ +if (unlikely (in_interrupt ())) + goto out; + +/* * Notice that we don't perform the reading of an RMID * atomically, because we can't hold a spin lock across the * IPIs.
Greg Kroah-Hartman
maintainerPATCH 102/123 hwmon: (nct7802) Fix integer overflow seen when writing voltage limits
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
commit 9200bc4c28cd8992eb5379345abd6b4f0c93df16 upstream.
Writing a large value into a voltage limit attribute can result in an overflow due to an auto-conversion from unsigned long to unsigned int.
--- drivers/hwmon/nct7802.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/nct7802.c +1 -1
@@ -195,7 +195,7 @@ abort: }static int nct7802_write_voltage (struct nct7802_data *data,int nr,int index, -unsigned int voltage) +unsigned long voltage) {int shift =8 -REG_VOLTAGE_LIMIT_MSB_SHIFT [index -1 ][nr];int err;
Greg Kroah-Hartman
maintainerPATCH 103/123 hwmon: (nct7904) Rename pwm attributes to match hwmon ABI
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
commit 0d6aaffc3a6db642e0a165ba4d17d6d7bbaf5201 upstream.
pwm attributes have well defined names, which should be used.
--- Documentation/hwmon/nct7904 | 4 +-- drivers/hwmon/nct7904.c | 57 ++++++++++++++++++++++---------------------- 2 files changed, 31 insertions(+), 30 deletions(-)
Documentation/hwmon/nct7904 +2 -2
@@ -35,11 +35,11 @@ temp1_input Local temperature (1/1000 d temp[2-9]_input CPU temperatures (1/1000 degree, 0.125 degree resolution) -fan[1-4]_mode R/W, 0/1 for manual or SmartFan mode +pwm[1-4]_enable R/W, 1/2 for manual or SmartFan mode Setting SmartFan mode is supported only if it has been previously configured by BIOS (or configuration EEPROM) -fan[1-4]_pwm R/O in SmartFan mode, R/W in manual control mode +pwm[1-4] R/O in SmartFan mode, R/W in manual control mode The driver checks sensor control registers and does not export the sensors that are not enabled. Anyway, a sensor that is enabled may actually be not
drivers/hwmon/nct7904.c +29 -28
91 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 104/123 NFS: Dont revalidate the mapping if both size and change attr are up to date
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit 85a23cee3f2c928475f31777ead5a71340a12fc3 upstream.
If we've ensured that the size and the change attribute are both correct, then there is no point in marking those attributes as needing revalidation again. Only do so if we know the size is incorrect and was not updated.
--- fs/nfs/inode.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
fs/nfs/inode.c +4 -4
@@ -1242,9 +1242,11 @@ static int nfs_check_inode_attributes(stif (fattr->valid &NFS_ATTR_FATTR_SIZE ) { cur_size =i_size_read (inode); new_isize =nfs_size_to_loff_t (fattr->size); -if (cur_size != new_isize && nfsi->nrequests ==0 ) +if (cur_size != new_isize) invalid |=NFS_INO_INVALID_ATTR |NFS_INO_REVAL_PAGECACHE ; } +if (nfsi->nrequests !=0 ) + invalid &= ~NFS_INO_REVAL_PAGECACHE ;/* Have any file permissions changed? */ if ((fattr->valid &NFS_ATTR_FATTR_MODE ) && (inode->i_mode &S_IALLUGO ) != (fattr->mode &S_IALLUGO ))
@@ -1682,8 +1684,7 @@ static int nfs_update_inode(struct inode invalid |=NFS_INO_INVALID_ATTR |NFS_INO_INVALID_DATA |NFS_INO_INVALID_ACCESS - |NFS_INO_INVALID_ACL - |NFS_INO_REVAL_PAGECACHE ; + |NFS_INO_INVALID_ACL ;if (S_ISDIR (inode->i_mode))nfs_force_lookup_revalidate (inode); inode->i_version = fattr->change_attr;
@@ -1715,7 +1716,6 @@ static int nfs_update_inode(struct inodeif ((nfsi->nrequests ==0 ) || new_isize > cur_isize) {i_size_write (inode, new_isize); invalid |=NFS_INO_INVALID_ATTR |NFS_INO_INVALID_DATA ; - invalid &= ~NFS_INO_REVAL_PAGECACHE ; } dprintk("NFS: isize change on server for file %s/%ld " "(%Ld to %Ld)\n",
Greg Kroah-Hartman
maintainerPATCH 105/123 avr32: handle NULL as a valid clock object
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit 5c02a4206538da12c040b51778d310df84c6bf6c upstream.
Since NULL is used as valid clock object on optional clocks we have to handle this case in avr32 implementation as well.
--- arch/avr32/mach-at32ap/clock.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
arch/avr32/mach-at32ap/clock.c +19 -1
@@ -80,6 +80,9 @@ int clk_enable(struct clk *clk) {unsigned long flags; +if (!clk) +return 0 ; +spin_lock_irqsave (&clk_lock, flags);__clk_enable (clk);spin_unlock_irqrestore (&clk_lock, flags);
@@ -106,6 +109,9 @@ void clk_disable(struct clk *clk) {unsigned long flags; +if (IS_ERR_OR_NULL (clk)) +return ; +spin_lock_irqsave (&clk_lock, flags);__clk_disable (clk);spin_unlock_irqrestore (&clk_lock, flags);
@@ -117,6 +123,9 @@ unsigned long clk_get_rate(struct clk *cunsigned long flags;unsigned long rate; +if (!clk) +return 0 ; +spin_lock_irqsave (&clk_lock, flags); rate = clk->get_rate (clk);spin_unlock_irqrestore (&clk_lock, flags);
@@ -129,6 +138,9 @@ long clk_round_rate(struct clk *clk, uns {unsigned long flags, actual_rate; +if (!clk) +return 0 ; +if (!clk->set_rate)return -ENOSYS ;
@@ -145,6 +157,9 @@ int clk_set_rate(struct clk *clk, unsignunsigned long flags;long ret; +if (!clk) +return 0 ; +if (!clk->set_rate)return -ENOSYS ;
@@ -161,6 +176,9 @@ int clk_set_parent(struct clk *clk, struunsigned long flags;int ret; +if (!clk) +return 0 ; +if (!clk->set_parent)return -ENOSYS ;
@@ -174,7 +192,7 @@ EXPORT_SYMBOL(clk_set_parent);struct clk *clk_get_parent (struct clk *clk) { -return clk->parent; +return !clk ?NULL : clk->parent; }EXPORT_SYMBOL (clk_get_parent);
Greg Kroah-Hartman
maintainerPATCH 106/123 NFSv4: We must set NFS_OPEN_STATE flag in nfs_resync_open_stateid_locked
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit 3c38cbe2ade88240fabb585b408f779ad3b9a31b upstream.
Otherwise, nfs4_select_rw_stateid() will always return the zero stateid instead of the correct open stateid.
--- fs/nfs/nfs4proc.c | 3 +++ 1 file changed, 3 insertions(+)
fs/nfs/nfs4proc.c +3 -0
@@ -1204,12 +1204,15 @@ static bool nfs_need_update_open_stateidstatic void nfs_resync_open_stateid_locked (struct nfs4_state *state) { +if (!(state->n_wronly || state->n_rdonly || state->n_rdwr)) +return ;if (state->n_wronly)set_bit (NFS_O_WRONLY_STATE , &state->flags);if (state->n_rdonly)set_bit (NFS_O_RDONLY_STATE , &state->flags);if (state->n_rdwr)set_bit (NFS_O_RDWR_STATE , &state->flags); +set_bit (NFS_OPEN_STATE , &state->flags); } static void nfs_clear_open_stateid_locked(struct nfs4_state *state,
Greg Kroah-Hartman
maintainerPATCH 107/123 NFS: Fix a memory leak in nfs_do_recoalesce
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit 03d5eb65b53889fe98a5ecddfe205c16e3093190 upstream.
If the function exits early, then we must put those requests that were not processed back onto the &mirror->pg_list so they can be cleaned up by nfs_pgio_error().
--- fs/nfs/pagelist.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/nfs/pagelist.c +4 -1
@@ -1110,8 +1110,11 @@ static int nfs_do_recoalesce(struct nfs_nfs_list_remove_request (req);if (__nfs_pageio_add_request (desc, req))continue ; -if (desc->pg_error <0 ) +if (desc->pg_error <0 ) { +list_splice_tail (&head, &mirror->pg_list); + mirror->pg_recoalesce =1 ;return 0 ; + }break ; } }while (mirror->pg_recoalesce);
Greg Kroah-Hartman
maintainerPATCH 108/123 IB/ipoib: Fix CONFIG_INFINIBAND_IPOIB_CM
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
commit efc1eedbf63a194b3b576fc25776f3f1fa55a4d4 upstream.
If the above is turned off then ipoib_cm_dev_init unconditionally returns ENOSYS, and the newly added error handling in 0b3957 prevents ipoib from coming up at all:
kernel: mlx4_0: ipoib_transport_dev_init failed
kernel: mlx4_0: failed to initialize port 1 (ret = -12)
--- drivers/infiniband/ulp/ipoib/ipoib_verbs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/infiniband/ulp/ipoib/ipoib_verbs.c +2 -1
@@ -176,7 +176,8 @@ int ipoib_transport_dev_init(struct net_else size += ipoib_recvq_size * ipoib_max_conn_qp; }else - goto out_free_wq; +if (ret != -ENOSYS ) + goto out_free_wq; priv->recv_cq =ib_create_cq (priv->ca, ipoib_ib_completion,NULL , dev, size,0 );if (IS_ERR (priv->recv_cq)) {
Greg Kroah-Hartman
maintainerPATCH 109/123 iscsi-target: Fix use-after-free during TPG session shutdown
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 417c20a9bdd1e876384127cf096d8ae8b559066c upstream.
This patch fixes a use-after-free bug in iscsit_release_sessions_for_tpg() where se_portal_group->session_lock was incorrectly released/re-acquired while walking the active se_portal_group->tpg_sess_list.
The can result in a NULL pointer dereference when iscsit_close_session() shutdown happens in the normal path asynchronously to this code, causing a bogus dereference of an already freed list entry to occur.
To address this bug, walk the session list checking for the same state as before, but move entries to a local list to avoid dropping the lock while walking the active list.
As before, signal using iscsi_session->session_restatement=1 for those list entries to be released locally by iscsit_free_session() code.
--- drivers/target/iscsi/iscsi_target.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/target/iscsi/iscsi_target.c +8 -4
@@ -4776,6 +4776,7 @@ int iscsit_release_sessions_for_tpg(strustruct iscsi_session *sess;struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;struct se_session *se_sess, *se_sess_tmp; +LIST_HEAD (free_list);int session_count =0 ;spin_lock_bh (&se_tpg->session_lock);
@@ -4797,14 +4798,17 @@ int iscsit_release_sessions_for_tpg(stru }atomic_set (&sess->session_reinstatement,1 );spin_unlock (&sess->conn_lock); -spin_unlock_bh (&se_tpg->session_lock); -iscsit_free_session (sess); -spin_lock_bh (&se_tpg->session_lock); +list_move_tail (&se_sess->sess_list, &free_list); + } +spin_unlock_bh (&se_tpg->session_lock); +list_for_each_entry_safe (se_sess, se_sess_tmp, &free_list, sess_list) { + sess = (struct iscsi_session *)se_sess->fabric_sess_ptr; + +iscsit_free_session (sess); session_count++; } -spin_unlock_bh (&se_tpg->session_lock);pr_debug ("Released %d iSCSI Session(s) from Target Portal" " Group: %hu\n" , session_count, tpg->tpgt);
Greg Kroah-Hartman
maintainerPATCH 110/123 iscsi-target: Fix iscsit_start_kthreads failure OOPs
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit e54198657b65625085834847ab6271087323ffea upstream.
This patch fixes a regression introduced with the following commit in v4.0-rc1 code, where a iscsit_start_kthreads() failure triggers a NULL pointer dereference OOPs:
commit 88dcd2dab5c23b1c9cfc396246d8f476c872f0ca
Author: Nicholas Bellinger <[email protected]>
Date: Thu Feb 26 22:19:15 2015 -0800
iscsi-target: Convert iscsi_thread_set usage to kthread.h
To address this bug, move iscsit_start_kthreads() immediately preceeding the transmit of last login response, before signaling a successful transition into full-feature-phase within existing iscsi_target_do_tx_login_io() logic.
This ensures that no target-side resource allocation failures can occur after the final login response has been successfully sent.
Also, it adds a iscsi_conn->rx_login_comp to allow the RX thread to sleep to prevent other socket related failures until the final iscsi_post_login_handler() call is able to complete.
--- drivers/target/iscsi/iscsi_target.c | 18 ++++++++++-- drivers/target/iscsi/iscsi_target_login.c | 45 +++++++++++------------------- drivers/target/iscsi/iscsi_target_login.h | 3 +- drivers/target/iscsi/iscsi_target_nego.c | 34 ++++++++++++++++++++++ include/target/iscsi/iscsi_target_core.h | 1 5 files changed, 68 insertions(+), 33 deletions(-)
drivers/target/iscsi/iscsi_target.c +15 -3
@@ -4001,7 +4001,13 @@ get_immediate: } transport_err: -iscsit_take_action_for_connection_exit (conn); +/* +* Avoid the normal connection failure code-path if this connection +* is still within LOGIN mode, and iscsi_np process context is +* responsible for cleaning up the early connection failure. +*/ +if (conn->conn_state !=TARG_CONN_STATE_IN_LOGIN ) +iscsit_take_action_for_connection_exit (conn); out:return 0 ; }
@@ -4093,7 +4099,7 @@ reject:int iscsi_target_rx_thread (void *arg) { -int ret; +int ret, rc;u8 buffer[ISCSI_HDR_LEN ], opcode;u32 checksum =0 , digest =0 ;struct iscsi_conn *conn = arg;
@@ -4103,10 +4109,16 @@ int iscsi_target_rx_thread(void *arg)* connection recovery / failure event can be triggered externally. */ allow_signal (SIGINT ); +/* +* Wait for iscsi_post_login_handler() to complete before allowing +* incoming iscsi/tcp socket I/O, and/or failing the connection. +*/ + rc =wait_for_completion_interruptible (&conn->rx_login_comp); +if (rc <0 ) +return 0 ;if (conn->conn_transport->transport_type ==ISCSI_INFINIBAND ) {struct completion comp; -int rc;init_completion (&comp); rc =wait_for_completion_interruptible (&comp);
drivers/target/iscsi/iscsi_target_login.c +17 -28
118 lines not on this page · raw message
drivers/target/iscsi/iscsi_target_login.h +2 -1
@@ -12,7 +12,8 @@ extern int iscsit_accept_np(struct iscsiextern int iscsit_get_login_rx (struct iscsi_conn *,struct iscsi_login *);extern int iscsit_put_login_tx (struct iscsi_conn *,struct iscsi_login *,u32 );extern void iscsit_free_conn (struct iscsi_np *,struct iscsi_conn *); -extern int iscsi_post_login_handler (struct iscsi_np *,struct iscsi_conn *,u8 ); +extern int iscsit_start_kthreads (struct iscsi_conn *); +extern void iscsi_post_login_handler (struct iscsi_np *,struct iscsi_conn *,u8 );extern void iscsi_target_login_sess_out (struct iscsi_conn *,struct iscsi_np *,bool ,bool );extern int iscsi_target_login_thread (void *);
drivers/target/iscsi/iscsi_target_nego.c +33 -1
@@ -17,6 +17,7 @@******************************************************************************/ #include <linux/ctype.h> +#include <linux/kthread.h> #include <scsi/iscsi_proto.h> #include <target/target_core_base.h> #include <target/target_core_fabric.h>
@@ -361,10 +362,24 @@ static int iscsi_target_do_tx_login_io(s ntohl(login_rsp->statsn), login->rsp_length); padding = ((-login->rsp_length) &3 ); +/* +* Before sending the last login response containing the transition +* bit for full-feature-phase, go ahead and start up TX/RX threads +* now to avoid potential resource allocation failures after the +* final login response has been sent. +*/ +if (login->login_complete) { +int rc =iscsit_start_kthreads (conn); +if (rc) { +iscsit_tx_login_rsp (conn,ISCSI_STATUS_CLS_TARGET_ERR , +ISCSI_LOGIN_STATUS_NO_RESOURCES ); +return -1 ; + } + }if (conn->conn_transport->iscsit_put_login_tx (conn, login, login->rsp_length + padding) <0 ) -return -1 ; + goto err; login->rsp_length =0 ;mutex_lock (&sess->cmdsn_mutex);
@@ -373,6 +388,23 @@ static int iscsi_target_do_tx_login_io(smutex_unlock (&sess->cmdsn_mutex);return 0 ; + +err: +if (login->login_complete) { +if (conn->rx_thread && conn->rx_thread_active) { +send_sig (SIGINT , conn->rx_thread,1 ); +kthread_stop (conn->rx_thread); + } +if (conn->tx_thread && conn->tx_thread_active) { +send_sig (SIGINT , conn->tx_thread,1 ); +kthread_stop (conn->tx_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); + } +return -1 ; }static void iscsi_target_sk_data_ready (struct sock *sk)
include/target/iscsi/iscsi_target_core.h +1 -0
@@ -606,6 +606,7 @@ struct iscsi_conn {int bitmap_id;int rx_thread_active;struct task_struct *rx_thread; +struct completion rx_login_comp;int tx_thread_active;struct task_struct *tx_thread;/* list_head for session connection list */
Greg Kroah-Hartman
maintainerPATCH 111/123 iscsi-target: Fix iser explicit logout TX kthread leak
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 007d038bdf95ccfe2491d0078be54040d110fd06 upstream.
This patch fixes a regression introduced with the following commit in v4.0-rc1 code, where an explicit iser-target logout would result in ->tx_thread_active being incorrectly cleared by the logout post handler, and subsequent TX kthread leak:
commit 88dcd2dab5c23b1c9cfc396246d8f476c872f0ca
Author: Nicholas Bellinger <[email protected]>
Date: Thu Feb 26 22:19:15 2015 -0800
iscsi-target: Convert iscsi_thread_set usage to kthread.h
To address this bug, change iscsit_logout_post_handler_closesession() and iscsit_logout_post_handler_samecid() to only cmpxchg() on ->tx_thread_active for traditional iscsi/tcp connections.
This is required because iscsi/tcp connections are invoking logout post handler logic directly from TX kthread context, while iser connections are invoking logout post handler logic from a seperate workqueue context.
--- drivers/target/iscsi/iscsi_target.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
drivers/target/iscsi/iscsi_target.c +16 -2
@@ -4555,7 +4555,18 @@ static void iscsit_logout_post_handler_c struct iscsi_conn *conn) {struct iscsi_session *sess = conn->sess; -int sleep =cmpxchg (&conn->tx_thread_active, true, false); +int sleep =1 ; +/* +* Traditional iscsi/tcp will invoke this logic from TX thread +* context during session logout, so clear tx_thread_active and +* sleep if iscsit_close_connection() has not already occured. +* +* Since iser-target invokes this logic from it's own workqueue, +* always sleep waiting for RX/TX thread shutdown to complete +* within iscsit_close_connection(). +*/ +if (conn->conn_transport->transport_type ==ISCSI_TCP ) + sleep =cmpxchg (&conn->tx_thread_active, true, false);atomic_set (&conn->conn_logout_remove,0 );complete (&conn->conn_logout_comp);
@@ -4569,7 +4580,10 @@ static void iscsit_logout_post_handler_cstatic void iscsit_logout_post_handler_samecid (struct iscsi_conn *conn) { -int sleep =cmpxchg (&conn->tx_thread_active, true, false); +int sleep =1 ; + +if (conn->conn_transport->transport_type ==ISCSI_TCP ) + sleep =cmpxchg (&conn->tx_thread_active, true, false);atomic_set (&conn->conn_logout_remove,0 );complete (&conn->conn_logout_comp);
Greg Kroah-Hartman
maintainerPATCH 112/123 intel_pstate: Add get_scaling cpu_defaults param to Knights Landing
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukasz Anaczkowski <[email protected]>
commit 69cefc273f942bd7bb347a02e8b5b738d5f6e6f3 upstream.
Scaling for Knights Landing is same as the default scaling (100000). When Knigts Landing support was added to the pstate driver, this parameter was omitted resulting in a kernel panic during boot.
--- drivers/cpufreq/intel_pstate.c | 1 + 1 file changed, 1 insertion(+)
drivers/cpufreq/intel_pstate.c +1 -0
@@ -678,6 +678,7 @@ static struct cpu_defaults knl_params = .get_max = core_get_max_pstate, .get_min = core_get_min_pstate, .get_turbo = knl_get_turbo_pstate, + .get_scaling = core_get_scaling, .set = core_set_pstate, }, };
Greg Kroah-Hartman
maintainerPATCH 113/123 qla2xxx: Fix hardware lock/unlock issue causing kernel panic.
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Saurav Kashyap <[email protected]>
commit ba9f6f64a0ff6b7ecaed72144c179061f8eca378 upstream.
[ Upstream commit ef86cb2059a14b4024c7320999ee58e938873032 ]
This patch fixes a kernel panic for qla2xxx Target core Module driver introduced by a fix in the qla2xxx initiator code.
Commit ef86cb2 ("qla2xxx: Mark port lost when we receive an RSCN for it.") introduced the regression for qla2xxx Target driver.
Stack trace will have following signature
--- <NMI exception stack> ---
[ffff88081faa3cc8] _raw_spin_lock_irqsave at ffffffff815b1f03 [ffff88081faa3cd0] qlt_fc_port_deleted at ffffffffa096ccd0 [qla2xxx] [ffff88081faa3d20] qla2x00_schedule_rport_del at ffffffffa0913831[qla2xxx] [ffff88081faa3d50] qla2x00_mark_device_lost at ffffffffa09159c5[qla2xxx] [ffff88081faa3db0] qla2x00_async_event at ffffffffa0938d59 [qla2xxx] [ffff88081faa3e30] qla24xx_msix_default at ffffffffa093a326 [qla2xxx] [ffff88081faa3e90] handle_irq_event_percpu at ffffffff810a7b8d [ffff88081faa3ee0] handle_irq_event at ffffffff810a7d32 [ffff88081faa3f10] handle_edge_irq at ffffffff810ab6b9 [ffff88081faa3f30] handle_irq at ffffffff8100619c [ffff88081faa3f70] do_IRQ at ffffffff815b4b1c
--- <IRQ stack> ---
--- drivers/scsi/qla2xxx/qla_init.c | 4 ++++ drivers/scsi/qla2xxx/qla_target.c | 6 ------ 2 files changed, 4 insertions(+), 6 deletions(-)
drivers/scsi/qla2xxx/qla_init.c +4 -0
@@ -2924,6 +2924,7 @@ qla2x00_rport_del(void *data)struct fc_rport *rport;scsi_qla_host_t *vha = fcport->vha;unsigned long flags; +unsigned long vha_flags;spin_lock_irqsave (fcport->vha->host->host_lock, flags); rport = fcport->drport ? fcport->drport: fcport->rport;
@@ -2935,7 +2936,9 @@ qla2x00_rport_del(void *data)* Release the target mode FC NEXUS in qla_target.c code * if target mod is enabled. */ +spin_lock_irqsave (&vha->hw->hardware_lock, vha_flags);qlt_fc_port_deleted (vha, fcport); +spin_unlock_irqrestore (&vha->hw->hardware_lock, vha_flags); } }
@@ -3303,6 +3306,7 @@ qla2x00_reg_remote_port(scsi_qla_host_t* Create target mode FC NEXUS in qla_target.c if target mode is * enabled.. */ +qlt_fc_port_added (vha, fcport);spin_lock_irqsave (fcport->vha->host->host_lock, flags);
drivers/scsi/qla2xxx/qla_target.c +0 -6
@@ -782,10 +782,8 @@ void qlt_fc_port_added(struct scsi_qla_hvoid qlt_fc_port_deleted (struct scsi_qla_host *vha,fc_port_t *fcport) { -struct qla_hw_data *ha = vha->hw;struct qla_tgt *tgt = vha->vha_tgt.qla_tgt;struct qla_tgt_sess *sess; -unsigned long flags;if (!vha->hw->tgt.tgt_ops)return ;
@@ -793,14 +791,11 @@ void qlt_fc_port_deleted(struct scsi_qlaif (!tgt || (fcport->port_type !=FCT_INITIATOR ))return ; -spin_lock_irqsave (&ha->hardware_lock, flags);if (tgt->tgt_stop) { -spin_unlock_irqrestore (&ha->hardware_lock, flags);return ; } sess =qlt_find_sess_by_port_name (tgt, fcport->port_name);if (!sess) { -spin_unlock_irqrestore (&ha->hardware_lock, flags);return ; }
@@ -808,7 +803,6 @@ void qlt_fc_port_deleted(struct scsi_qla sess->local =1 ;qlt_schedule_sess_for_deletion (sess, false); -spin_unlock_irqrestore (&ha->hardware_lock, flags); }static inline int test_tgt_sess_count (struct qla_tgt *tgt)
Greg Kroah-Hartman
maintainerPATCH 114/123 qla2xxx: release request queue reservation.
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Quinn Tran <[email protected]>
commit 810e30bc4658e9c069577bde52394a5af872803c upstream.
Request IOCB queue element(s) is reserved during good path IO. Under error condition such as unable to allocate IOCB handle condition, the IOCB count that was reserved is not released.
--- drivers/scsi/qla2xxx/qla_target.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/scsi/qla2xxx/qla_target.c +7 -3
@@ -2341,9 +2341,10 @@ int qlt_xmit_response(struct qla_tgt_cmd res =qlt_build_ctio_crc2_pkt (&prm, vha); else res =qlt_24xx_build_ctio_pkt (&prm, vha); -if (unlikely (res !=0 )) +if (unlikely (res !=0 )) { + vha->req->cnt += full_req_cnt; goto out_unmap_unlock; - + } pkt = (struct ctio7_to_24xx *)prm.pkt;
@@ -2481,8 +2482,11 @@ int qlt_rdy_to_xfer(struct qla_tgt_cmd *else res =qlt_24xx_build_ctio_pkt (&prm, vha); -if (unlikely (res !=0 )) +if (unlikely (res !=0 )) { + vha->req->cnt += prm.req_cnt; goto out_unlock_free_unmap; + } + pkt = (struct ctio7_to_24xx *)prm.pkt; pkt->u.status0.flags |=__constant_cpu_to_le16 (CTIO7_FLAGS_DATA_OUT |CTIO7_FLAGS_STATUS_MODE_0 );
Greg Kroah-Hartman
maintainerPATCH 115/123 qla2xxx: Remove msleep in qlt_send_term_exchange
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Himanshu Madhani <[email protected]>
commit 6bc85dd595a5438b50ec085668e53ef26058bb90 upstream.
Remove unnecessary msleep from qlt_send_term_exchange as it adds latency of 250 msec while sending terminate exchange to an aborted task.
--- drivers/scsi/qla2xxx/qla_target.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/scsi/qla2xxx/qla_target.c +7 -6
@@ -2715,7 +2715,7 @@ static int __qlt_send_term_exchange(strustatic void qlt_send_term_exchange (struct scsi_qla_host *vha,struct qla_tgt_cmd *cmd,struct atio_from_isp *atio,int ha_locked) { -unsigned long flags; +unsigned long flags =0 ;int rc;if (qlt_issue_marker (vha, ha_locked) <0 )
@@ -2731,17 +2731,18 @@ static void qlt_send_term_exchange(struc rc =__qlt_send_term_exchange (vha, cmd, atio);if (rc == -ENOMEM )qlt_alloc_qfull_cmd (vha, atio,0 ,0 ); -spin_unlock_irqrestore (&vha->hw->hardware_lock, flags); done:if (cmd && ((cmd->state !=QLA_TGT_STATE_ABORTED ) || !cmd->cmd_sent_to_fw)) { -if (!ha_locked && !in_interrupt ()) -msleep (250 );/* just in case */ - -qlt_unmap_sg (vha, cmd); +if (cmd->sg_mapped) +qlt_unmap_sg (vha, cmd); vha->hw->tgt.tgt_ops->free_cmd (cmd); } + +if (!ha_locked) +spin_unlock_irqrestore (&vha->hw->hardware_lock, flags); +return ; }
Greg Kroah-Hartman
maintainerPATCH 116/123 qla2xxx: fix command initialization in target mode.
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kanoj Sarcar <[email protected]>
commit 9fce12540cb9f91e7f1f539a80b70f0b388bdae0 upstream.
--- drivers/scsi/qla2xxx/qla_target.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/scsi/qla2xxx/qla_target.c +5 -5
@@ -3346,6 +3346,11 @@ static struct qla_tgt_cmd *qlt_get_tag(s cmd->loop_id = sess->loop_id; cmd->conf_compl_supported = sess->conf_compl_supported; + cmd->cmd_flags =0 ; + cmd->jiffies_at_alloc =get_jiffies_64 (); + + cmd->reset_count = vha->hw->chip_reset; +return cmd; }
@@ -3452,11 +3457,6 @@ static int qlt_handle_cmd_for_atio(strucreturn -ENOMEM ; } - cmd->cmd_flags =0 ; - cmd->jiffies_at_alloc =get_jiffies_64 (); - - cmd->reset_count = vha->hw->chip_reset; - cmd->cmd_in_wq =1 ; cmd->cmd_flags |=BIT_0 ;INIT_WORK (&cmd->work, qlt_do_work);
Greg Kroah-Hartman
maintainerPATCH 117/123 qla2xxx: kill sessions/log out initiator on RSCN and port down events
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roland Dreier <[email protected]>
commit b2032fd567326ad0b2d443bb6d96d2580ec670a5 upstream.
To fix some issues talking to ESX, this patch modifies the qla2xxx driver so that it never logs into remote ports. This has the side effect of getting rid of the "rports" entirely, which means we never log out of initiators and never tear down sessions when an initiator goes away.
This is mostly OK, except that we can run into trouble if we have initiator A assigned FC address X:Y:Z by the fabric talking to us, and then initiator A goes away. Some time (could be a long time) later, initiator B comes along and also gets FC address X:Y:Z (which is available again, because initiator A is gone). If initiator B starts talking to us, then we'll still have the session for initiator A, and since we look up incoming IO based on the FC address X:Y:Z, initiator B will end up using ACLs for initiator A.
Fix this by:
1. Handling RSCN events somewhat differently; instead of completely skipping the processing of fcports, we look through the list, and if an fcport disappears, we tell the target code the tear down the session and tell the HBA FW to release the N_Port handle.
2. Handling "port down" events by flushing all of our sessions. The firmware was already releasing the N_Port handle but we want the target code to drop all the sessions too.
--- drivers/scsi/qla2xxx/qla_dbg.c | 2 drivers/scsi/qla2xxx/qla_init.c | 137 ++++++++++++++++++++++++++++++-------- drivers/scsi/qla2xxx/qla_target.c | 9 +- 3 files changed, 117 insertions(+), 31 deletions(-)
drivers/scsi/qla2xxx/qla_dbg.c +1 -1
@@ -68,7 +68,7 @@* | | | 0xd101-0xd1fe | * | | | 0xd214-0xd2fe | * | Target Mode | 0xe079 | | -* | Target Mode Management | 0xf072 | 0xf002 | +* | Target Mode Management | 0xf080 | 0xf002 | * | | | 0xf046-0xf049 | * | Target Mode Task Management | 0x1000b | | * ----------------------------------------------------------------------
drivers/scsi/qla2xxx/qla_init.c +111 -26
176 lines not on this page · raw message
drivers/scsi/qla2xxx/qla_target.c +5 -4
@@ -113,6 +113,7 @@ static void qlt_abort_cmd_on_host_reset(static void qlt_alloc_qfull_cmd (struct scsi_qla_host *vha,struct atio_from_isp *atio,uint16_t status,int qfull);static void qlt_disable_vha (struct scsi_qla_host *vha); +static void qlt_clear_tgt_db (struct qla_tgt *tgt);/* * Global Variables */
@@ -431,10 +432,10 @@ static int qlt_reset(struct scsi_qla_hos loop_id =le16_to_cpu (n->u.isp24.nport_handle);if (loop_id ==0xFFFF ) { -#if 0 /* FIXME: Re-enable Global event handling.. */ /* Global event */ -atomic_inc (&ha->tgt.qla_tgt->tgt_global_resets_count); -qlt_clear_tgt_db (ha->tgt.qla_tgt); +atomic_inc (&vha->vha_tgt.qla_tgt->tgt_global_resets_count); +qlt_clear_tgt_db (vha->vha_tgt.qla_tgt); +#if 0 /* FIXME: do we need to choose a session here? */ if (!list_empty (&ha->tgt.qla_tgt->sess_list)) { sess =list_entry (ha->tgt.qla_tgt->sess_list.next,typeof (*sess), sess_list_entry);
@@ -788,7 +789,7 @@ void qlt_fc_port_deleted(struct scsi_qlaif (!vha->hw->tgt.tgt_ops)return ; -if (!tgt || (fcport->port_type !=FCT_INITIATOR )) +if (!tgt)return ;if (tgt->tgt_stop) {
Greg Kroah-Hartman
maintainerPATCH 118/123 drm/nouveau/fbcon/nv11-: correctly account for ring space usage
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilia Mirkin <[email protected]>
commit d108142c0840ce389cd9898aa76943b3fb430b83 upstream.
The RING_SPACE macro accounts how much space is used up so it's important to ask it for the right amount. Incorrect accounting of this can cause page faults down the line as writes are attempted outside of the ring.
--- drivers/gpu/drm/nouveau/nv04_fbcon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nv04_fbcon.c +1 -1
@@ -203,7 +203,7 @@ nv04_fbcon_accel_init(struct fb_info *inif (ret)return ret; -if (RING_SPACE (chan,49 )) { +if (RING_SPACE (chan,49 + (device->info.chipset >=0x11 ?4 :0 ))) {nouveau_fbcon_gpu_lockup (info);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 119/123 drm/nouveau/kms/nv50-: guard against enabling cursor on disabled heads
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Skeggs <[email protected]>
commit 697bb728d9e2367020aa0c5af7363809d7658e43 upstream.
Userspace has started doing this, which upsets the display class hw error checking in various unpleasant ways.
--- drivers/gpu/drm/nouveau/nv50_display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nv50_display.c +1 -1
@@ -979,7 +979,7 @@ nv50_crtc_cursor_show_hide(struct nouvea {struct nv50_mast *mast =nv50_mast (nv_crtc->base.dev); -if (show && nv_crtc->cursor.nvbo) +if (show && nv_crtc->cursor.nvbo && nv_crtc->base.enabled)nv50_crtc_cursor_show (nv_crtc);else nv50_crtc_cursor_hide (nv_crtc);
Greg Kroah-Hartman
maintainerPATCH 120/123 drm/nouveau: hold mutex when calling nouveau_abi16_fini()
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kamil Dudka <[email protected]>
commit ac8c79304280da6ef05c348a9da03ab04898b994 upstream.
This was the only access to cli->abi16 without holding the mutex.
--- drivers/gpu/drm/nouveau/nouveau_drm.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/nouveau/nouveau_drm.c +2 -0
@@ -863,8 +863,10 @@ nouveau_drm_preclose(struct drm_device *pm_runtime_get_sync (dev->dev); +mutex_lock (&cli->mutex);if (cli->abi16)nouveau_abi16_fini (cli->abi16); +mutex_unlock (&cli->mutex);mutex_lock (&drm->client.mutex);list_del (&cli->head);
Greg Kroah-Hartman
maintainerPATCH 121/123 drm/nouveau/drm/nv04-nv40/instmem: protect access to priv->heap by mutex
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kamil Dudka <[email protected]>
commit 7512223b1ece29a5968ed8b67ccb891d21b7834b upstream.
This fixes the list_del corruption reported
at <https://bugzilla.redhat.com/1205985>.
--- drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c +8 -0
@@ -50,7 +50,12 @@ nv04_instobj_dtor(struct nvkm_object *ob {struct nv04_instmem_priv *priv = (void *)nvkm_instmem (object);struct nv04_instobj_priv *node = (void *)object; +struct nvkm_subdev *subdev = (void *)priv; + +mutex_lock (&subdev->mutex);nvkm_mm_free (&priv->heap, &node->mem); +mutex_unlock (&subdev->mutex); +nvkm_instobj_destroy (&node->base); }
@@ -62,6 +67,7 @@ nv04_instobj_ctor(struct nvkm_object *pastruct nv04_instmem_priv *priv = (void *)nvkm_instmem (parent);struct nv04_instobj_priv *node;struct nvkm_instobj_args *args = data; +struct nvkm_subdev *subdev = (void *)priv;int ret;if (!args->align)
@@ -72,8 +78,10 @@ nv04_instobj_ctor(struct nvkm_object *paif (ret)return ret; +mutex_lock (&subdev->mutex); ret =nvkm_mm_head (&priv->heap,0 ,1 , args->size, args->size, args->align, &node->mem); +mutex_unlock (&subdev->mutex);if (ret)return ret;
Greg Kroah-Hartman
maintainerPATCH 122/123 xfs: remote attribute headers contain an invalid LSN
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Chinner <[email protected]>
commit e3c32ee9e3e747fec01eb38e6610a9157d44c3ea upstream.
In recent testing, a system that crashed failed log recovery on restart with a bad symlink buffer magic number:
XFS (vda): Starting recovery (logdev: internal)
XFS (vda): Bad symlink block magic!
XFS: Assertion failed: 0, file: fs/xfs/xfs_log_recover.c, line: 2060
On examination of the log via xfs_logprint, none of the symlink buffers in the log had a bad magic number, nor were any other types of buffer log format headers mis-identified as symlink buffers. Tracing was used to find the buffer the kernel was tripping over, and xfs_db identified it's contents as:
000: 5841524d 00000000 00000346 64d82b48 8983e692 d71e4680 a5f49e2c b317576e 020: 00000000 00602038 00000000 006034ce d0020000 00000000 4d4d4d4d 4d4d4d4d 040: 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d 060: 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d 4d4d4d4d
.....
This is a remote attribute buffer, which are notable in that they are not logged but are instead written synchronously by the remote attribute code so that they exist on disk before the attribute transactions are committed to the journal.
The above remote attribute block has an invalid LSN in it - cycle 0xd002000, block 0 - which means when log recovery comes along to determine if the transaction that writes to the underlying block should be replayed, it sees a block that has a future LSN and so does not replay the buffer data in the transaction. Instead, it validates the buffer magic number and attaches the buffer verifier to it. It is this buffer magic number check that is failing in the above assert, indicating that we skipped replay due to the LSN of the underlying buffer.
The problem here is that the remote attribute buffers cannot have a valid LSN placed into them, because the transaction that contains the attribute tree pointer changes and the block allocation that the attribute data is being written to hasn't yet been committed. Hence the LSN field in the attribute block is completely unwritten, thereby leaving the underlying contents of the block in the LSN field. It could have any value, and hence a future overwrite of the block by log recovery may or may not work correctly.
Fix this by always writing an invalid LSN to the remote attribute block, as any buffer in log recovery that needs to write over the remote attribute should occur. We are protected from having old data written over the attribute by the fact that freeing the block before the remote attribute is written will result in the buffer being marked stale in the log and so all changes prior to the buffer stale transaction will be cancelled by log recovery.
Hence it is safe to ignore the LSN in the case or synchronously written, unlogged metadata such as remote attribute blocks, and to ensure we do that correctly, we need to write an invalid LSN to all remote attribute blocks to trigger immediate recovery of metadata that is written over the top.
As a further protection for filesystems that may already have remote attribute blocks with bad LSNs on disk, change the log recovery code to always trigger immediate recovery of metadata over remote attribute blocks.
--- fs/xfs/libxfs/xfs_attr_remote.c | 29 +++++++++++++++++++++++------ fs/xfs/xfs_log_recover.c | 11 ++++++++--- 2 files changed, 31 insertions(+), 9 deletions(-)
fs/xfs/libxfs/xfs_attr_remote.c +23 -6
@@ -159,11 +159,10 @@ xfs_attr3_rmt_write_verify( struct xfs_buf *bp) {struct xfs_mount *mp = bp->b_target->bt_mount; -struct xfs_buf_log_item *bip = bp->b_fspriv; +int blksize = mp->m_attr_geo->blksize;char *ptr;int len;xfs_daddr_t bno; -int blksize = mp->m_attr_geo->blksize;/* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc (&mp->m_sb))
@@ -175,16 +174,22 @@ xfs_attr3_rmt_write_verify(ASSERT (len >= blksize);while (len >0 ) { +struct xfs_attr3_rmt_hdr *rmt = (struct xfs_attr3_rmt_hdr *)ptr; +if (!xfs_attr3_rmt_verify (mp, ptr, blksize, bno)) {xfs_buf_ioerror (bp, -EFSCORRUPTED );xfs_verifier_error (bp);return ; } -if (bip) { -struct xfs_attr3_rmt_hdr *rmt; - rmt = (struct xfs_attr3_rmt_hdr *)ptr; - rmt->rm_lsn =cpu_to_be64 (bip->bli_item.li_lsn); +/* +* Ensure we aren't writing bogus LSNs to disk. See +* xfs_attr3_rmt_hdr_set() for the explanation. +*/ +if (rmt->rm_lsn !=cpu_to_be64 (NULLCOMMITLSN )) { +xfs_buf_ioerror (bp, -EFSCORRUPTED ); +xfs_verifier_error (bp); +return ; }xfs_update_cksum (ptr, blksize,XFS_ATTR3_RMT_CRC_OFF );
@@ -221,6 +226,18 @@ xfs_attr3_rmt_hdr_set( rmt->rm_owner =cpu_to_be64 (ino); rmt->rm_blkno =cpu_to_be64 (bno); +/* +* Remote attribute blocks are written synchronously, so we don't +* have an LSN that we can stamp in them that makes any sense to log +* recovery. To ensure that log recovery handles overwrites of these +* blocks sanely (i.e. once they've been freed and reallocated as some +* other type of metadata) we need to ensure that the LSN has a value +* that tells log recovery to ignore the LSN and overwrite the buffer +* with whatever is in it's log. To do this, we use the magic +* NULLCOMMITLSN to indicate that the LSN is invalid. +*/ + rmt->rm_lsn =cpu_to_be64 (NULLCOMMITLSN ); +return sizeof (struct xfs_attr3_rmt_hdr ); }
fs/xfs/xfs_log_recover.c +8 -3
@@ -1887,9 +1887,14 @@ xlog_recover_get_buf_lsn( uuid = &((struct xfs_dir3_blk_hdr *)blk)->uuid;break ;case XFS_ATTR3_RMT_MAGIC : - lsn =be64_to_cpu (((struct xfs_attr3_rmt_hdr *)blk)->rm_lsn); - uuid = &((struct xfs_attr3_rmt_hdr *)blk)->rm_uuid; -break ; +/* +* Remote attr blocks are written synchronously, rather than +* being logged. That means they do not contain a valid LSN +* (i.e. transactionally ordered) in them, and hence any time we +* see a buffer to replay over the top of a remote attribute +* block we should simply do so. +*/ + goto recover_immediately;case XFS_SB_MAGIC : lsn =be64_to_cpu (((struct xfs_dsb *)blk)->sb_lsn); uuid = &((struct xfs_dsb *)blk)->sb_uuid;
Greg Kroah-Hartman
maintainerPATCH 123/123 xfs: remote attributes need to be considered data
In reply to Greg Kroah-Hartman4.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Chinner <[email protected]>
commit df150ed102baa0e78c06e08e975dfb47147dd677 upstream.
We don't log remote attribute contents, and instead write them synchronously before we commit the block allocation and attribute tree update transaction. As a result we are writing to the allocated space before the allcoation has been made permanent.
As a result, we cannot consider this allocation to be a metadata allocation. Metadata allocation can take blocks from the free list and so reuse them before the transaction that freed the block is committed to disk. This behaviour is perfectly fine for journalled metadata changes as log recovery will ensure the free operation is replayed before the overwrite, but for remote attribute writes this is not the case.
Hence we have to consider the remote attribute blocks to contain data and allocate accordingly. We do this by dropping the XFS_BMAPI_METADATA flag from the block allocation. This means the allocation will not use blocks that are on the busy list without first ensuring that the freeing transaction has been committed to disk and the blocks removed from the busy list. This ensures we will never overwrite a freed block without first ensuring that it is really free.
--- fs/xfs/libxfs/xfs_attr_remote.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
fs/xfs/libxfs/xfs_attr_remote.c +11 -4
@@ -451,14 +451,21 @@ xfs_attr_rmtval_set(/* * Allocate a single extent, up to the size of the value. +* +* Note that we have to consider this a data allocation as we +* write the remote attribute without logging the contents. +* Hence we must ensure that we aren't using blocks that are on +* the busy list so that we don't overwrite blocks which have +* recently been freed but their transactions are not yet +* committed to disk. If we overwrite the contents of a busy +* extent and then crash then the block may not contain the +* correct metadata after log recovery occurs. */ xfs_bmap_init (args->flist, args->firstblock); nmap =1 ; error =xfs_bmapi_write (args->trans, dp, (xfs_fileoff_t )lblkno, - blkcnt, -XFS_BMAPI_ATTRFORK |XFS_BMAPI_METADATA , - args->firstblock, args->total, &map, &nmap, - args->flist); + blkcnt,XFS_BMAPI_ATTRFORK , args->firstblock, + args->total, &map, &nmap, args->flist);if (!error) { error =xfs_bmap_finish (&args->trans, args->flist, &committed);
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.1.5 release. There are 123 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 Aug 10 22:06:48 UTC 2015. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 61 pass: 60 fail: 1
Failed tests:
mips:fuloong2e_defconfig
The qemu test failure is not new, but was discovered with a newly introduced test. A patch to fix the problem has been submitted [1].
Details are available at http://server.roeck-us.net:8010/builders.
Guenter
Greg Kroah-Hartman
maintainerQuoted 14 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.1.5 release. There are 123 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 Aug 10 22:06:48 UTC 2015. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 61 pass: 60 fail: 1
Quoted 7 lines
Failed tests:
mips:fuloong2e_defconfigThe qemu test failure is not new, but was discovered with a newly introduced test. A patch to fix the problem has been submitted [1].
Details are available at http://server.roeck-us.net:8010/builders.
Thanks for all of the results.
greg k-h
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.1.5 release. There are 123 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 Aug 10 22:06:48 UTC 2015. Anything received after that time might be too late.
Compiled and booted on x86_32. No errors in dmesg.
regards
sudip
Greg Kroah-Hartman
maintainerQuoted 10 lines · Sudip Mukherjee
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.1.5 release. There are 123 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 Aug 10 22:06:48 UTC 2015. Anything received after that time might be too late.
Compiled and booted on
x86_32. No errors in dmesg.
Thanks for testing all of these and letting me know.
greg k-h
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.1.5 release. There are 123 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 Aug 10 22:06:48 UTC 2015. Anything received after that time might be too late.
Quoted 7 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.1.5-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America (Silicon Valley) [email protected] | (970) 217-8978
Greg Kroah-Hartman
maintainerQuoted 13 lines · Shuah Khan
Quoted 12 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.1.5 release. There are 123 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 Aug 10 22:06:48 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.x/stable-review/patch-4.1.5-rc1.gzand the diffstat can be found below.
Quoted 5 lines
Quoted 3 lines
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
Thanks for testing all of these and letting me know.
greg k-h
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 12 lines · kernelci.org bot
stable-queue boot: 377 boots: 1 failed, 376 passed (v4.1.4-48-g9ff84d01f2f6)
Full Boot Summary: http://kernelci.org/boot/all/job/stable-queue/kernel/v4.1.4-48-g9ff84d01f2f6/
Full Build Summary: http://kernelci.org/build/stable-queue/kernel/v4.1.4-48-g9ff84d01f2f6/Tree: stable-queue
Branch: local/linux-4.1.y-queue
Git Describe: v4.1.4-48-g9ff84d01f2f6
Git Commit:9ff84d01f2f6dc7ff211ec3bc17dd0410f531638
Git URL:git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-stable.git
Tested: 92 unique boards, 23 SoC families, 27 builds out of 131
Quoted 6 lines
Boot Failure Detected: http://kernelci.org/boot/?v4.1.4-48-g9ff84d01f2f6&fail
arm:
multi_v7_defconfig+CONFIG_PROVE_LOCKING=y: rk3288-evb-rk808: 1 failed lab
This one is not a new failure, but a board that's starting to get flaky on me. :/
Kevin
Greg Kroah-Hartman
maintainerQuoted 15 lines · Kevin Hilman
Quoted 14 lines · kernelci.org bot
stable-queue boot: 377 boots: 1 failed, 376 passed (v4.1.4-48-g9ff84d01f2f6)
Full Boot Summary: http://kernelci.org/boot/all/job/stable-queue/kernel/v4.1.4-48-g9ff84d01f2f6/
Full Build Summary: http://kernelci.org/build/stable-queue/kernel/v4.1.4-48-g9ff84d01f2f6/Tree: stable-queue
Branch: local/linux-4.1.y-queue
Git Describe: v4.1.4-48-g9ff84d01f2f6
Git Commit:9ff84d01f2f6dc7ff211ec3bc17dd0410f531638
Git URL:git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-stable.git
Tested: 92 unique boards, 23 SoC families, 27 builds out of 131Boot Failure Detected: http://kernelci.org/boot/?v4.1.4-48-g9ff84d01f2f6&fail
Quoted 7 lines
Quoted 4 lines
arm:
multi_v7_defconfig+CONFIG_PROVE_LOCKING=y: rk3288-evb-rk808: 1 failed labThis one is not a new failure, but a board that's starting to get flaky on me. :/
Good to know, thanks for letting us know.
greg k-h