4.2.4-stable review
Subsystems (8)
Greg Kroah-Hartman
maintainercover 4.2.4-stable review
This is the start of the stable review cycle for the 4.2.4 release. There are 258 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue Oct 20 01:46:04 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.2.4-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.2.4-rc1
Christoph Hellwig <[email protected]>
3w-9xxx: don't unmap bounce buffered commands
Konstantin Khlebnikov <[email protected]>
sched/preempt: Fix cond_resched_lock() and cond_resched_softirq()
Akinobu Mita <[email protected]>
blk-mq: avoid setting hctx->tags->cpumask before allocation
Joonsoo Kim <[email protected]>
mm/slab: fix unexpected index mapping result of kmalloc_size(INDEX_NODE+1)
Raanan Avargil <[email protected]>
e1000e: Fix tight loop implementation of systime read algorithm
Uwe Kleine-König <[email protected]>
serial: atmel: fix error path of probe function
Mans Rullgard <[email protected]>
serial: 8250: add uart_config entry for PORT_RT2880
Jann Horn <[email protected]>
drivers/tty: require read access for controlling terminal
Kosuke Tatsukawa <[email protected]>
tty: fix stall caused by missing memory barrier in drivers/tty/n_tty.c
[email protected] <[email protected]>
staging: speakup: fix speakup-r regression
Joe Thornber <[email protected]>
dm cache: fix NULL pointer when switching from cleaner policy
Junichi Nomura <[email protected]>
dm: fix AB-BA deadlock in __dm_destroy()
Trond Myklebust <[email protected]>
namei: results of d_is_negative() should be checked after dentry revalidation
Bartlomiej Zolnierkiewicz <[email protected]>
clk: samsung: fix cpu clock's flags checking
Peter Ujfalusi <[email protected]>
clk: ti: clk-7xx: Remove hardwired ABE clock configuration
Ben Dooks <[email protected]>
clk: ti: fix dual-registration of uart4_ick
Srinivas Pandruvada <[email protected]>
cpufreq: acpi_cpufreq: prevent crash on reading freqdomain_cpus
Marcin Wojtas <[email protected]>
mmc: sdhci-pxav3: fix error handling of armada_38x_quirks
Nadav Haklai <[email protected]>
mmc: sdhci-pxav3: disable clock inversion for HS MMC cards
Nadav Haklai <[email protected]>
mmc: sdhci-pxav3: remove broken clock base quirk for Armada 38x sdhci driver
Kinglong Mee <[email protected]>
nfs/filelayout: Fix NULL reference caused by double freeing of fh_array
NeilBrown <[email protected]>
md/bitmap: don't pass -1 to bitmap_storage_alloc.
John Stultz <[email protected]>
clocksource: Fix abs() usage w/ 64bit values
Ben Hutchings <[email protected]>
genirq: Fix race in register_irq_proc()
Stefan Assmann <[email protected]>
igb: do not re-init SR-IOV during probe
Chas Williams <[email protected]>
net/xen-netfront: only napi_synchronize() if running
Roger Pau Monne <[email protected]>
xen/blkback: free requests on disconnection
Andreas Schwab <[email protected]>
m68k: Define asmlinkage_protect
Mark Salyzyn <[email protected]>
arm64: readahead: fault retry breaks mmap file read random detection
Li Bin <[email protected]>
arm64: ftrace: fix function_graph tracer panic
Ard Biesheuvel <[email protected]>
arm64/efi: Fix boot crash by not padding between EFI_MEMORY_RUNTIME regions
Eric W. Biederman <[email protected]>
vfs: Test for and handle paths that are unreachable from their mnt_root
Eric W. Biederman <[email protected]>
dcache: Handle escaped paths in prepend_path
Chaotian Jing <[email protected]>
mmc: core: fix dead loop of mmc_retune
Ulf Hansson <[email protected]>
mmc: core: Don't return an error for CD/WP GPIOs when GPIOLIB is unset
Nicholas Bellinger <[email protected]>
iscsi-target: Avoid OFMarker + IFMarker negotiation
Sudip Mukherjee <[email protected]>
net: via/Kconfig: GENERIC_PCI_IOMAP required if PCI not selected
shengyong <[email protected]>
UBI: return ENOSPC if no enough space available
Richard Weinberger <[email protected]>
UBI: Validate data_size
Richard Weinberger <[email protected]>
UBIFS: Kill unneeded locking in ubifs_init_security
Christian Engelmayer <[email protected]>
rsi: Fix possible leak when loading firmware
Paul Mackerras <[email protected]>
powerpc/MSI: Fix race condition in tearing down MSI interrupts
Kapileshwar Singh <[email protected]>
tools lib traceevent: Fix string handling in heterogeneous arch environments
Linus Lüssing <[email protected]>
batman-adv: Fix potentially broken skb network header access
Linus Lüssing <[email protected]>
batman-adv: Fix potential synchronization issues in mcast tvlv handler
Linus Lüssing <[email protected]>
batman-adv: Make MCAST capability changes atomic
Linus Lüssing <[email protected]>
batman-adv: Make TT capability changes atomic
Linus Lüssing <[email protected]>
batman-adv: Make NC capability changes atomic
Paul Burton <[email protected]>
MIPS: CPS: #ifdef on CONFIG_MIPS_MT_SMP rather than CONFIG_MIPS_MT
Paul Burton <[email protected]>
MIPS: CPS: Don't include MT code in non-MT kernels.
Paul Burton <[email protected]>
MIPS: CPS: Stop dangling delay slot from has_mt.
James Hogan <[email protected]>
MIPS: dma-default: Fix 32-bit fall back to GFP_DMA
Aurelien Jarno <[email protected]>
MIPS: BPF: Fix build on pre-R2 little endian CPUs
Aurelien Jarno <[email protected]>
MIPS: BPF: Avoid unreachable code on little endian
Alexander Sverdlin <[email protected]>
MIPS: bootmem: Fix mapstart calculation for contiguous maps
Guenter Roeck <[email protected]>
MIPS: Fix console output for Fulong2e system
Viresh Kumar <[email protected]>
cpufreq: dt: Tolerance applies on both sides of target voltage
Borislav Petkov <[email protected]>
cpu/cacheinfo: Fix teardown path
Thomas Petazzoni <[email protected]>
crypto: marvell - properly handle CRYPTO_TFM_REQ_MAY_BACKLOG-flagged requests
Yao-Wen Mao <[email protected]>
USB: Add reset-resume quirk for two Plantronics usb headphones.
Vincent Palatin <[email protected]>
usb: Add device quirk for Logitech PTZ cameras
Alexander Inyukhin <[email protected]>
USB: chaoskey read offset bug
Felipe Balbi <[email protected]>
usb: musb: cppi41: allow it to work again
Roger Quadros <[email protected]>
usb: phy: phy-generic: Fix reset behaviour on legacy boot
Mathias Nyman <[email protected]>
usb: Use the USB_SS_MULT() macro to get the burst multiplier.
Peter Chen <[email protected]>
usb: chipidea: udc: using the correct stall implementation
Bin Liu <[email protected]>
usb: musb: dsps: fix polling in device-only mode
Jann Horn <[email protected]>
security: fix typo in security_task_prctl
Mark Brown <[email protected]>
regmap: debugfs: Don't bother actually printing when calculating max length
Mark Brown <[email protected]>
regmap: debugfs: Ensure we don't underflow when printing access masks
Gabriel Krisman Bertazi <[email protected]>
ipr: Enable SIS pipe commands for SIS-32 devices.
Russell King <[email protected]>
pcmcia: sa11x0: fix missing clk_put() in sa11x0 socket drivers
Michal Kazior <[email protected]>
ath10k: wake up queue upon vif creation
Michal Kazior <[email protected]>
ath10k: wake up offchannel queue properly
Michal Kazior <[email protected]>
ath10k: fix peer limit enforcement
Michal Kazior <[email protected]>
ath10k: reject 11b tx fragmentation configuration
Michal Kazior <[email protected]>
ath10k: fix per-vif queue locking
Andy Shevchenko <[email protected]>
device property: fix potential NULL pointer dereference
Heiko Stuebner <[email protected]>
PM / AVS: rockchip-io: depend on CONFIG_POWER_AVS
Dan Carpenter <[email protected]>
hpsa: fix an sprintf() overflow in the reset handler
Boris BREZILLON <[email protected]>
mtd: nand: sunxi: fix OOB handling in ->write_xxx() functions
Boris BREZILLON <[email protected]>
mtd: nand: sunxi: fix sunxi_nand_chips_cleanup()
Antoine Ténart <[email protected]>
mtd: pxa3xx_nand: add a default chunk size
Hans de Goede <[email protected]>
extcon: Fix attached value returned by is_extcon_changed
Dan Carpenter <[email protected]>
extcon: Fix signedness bugs about break error handling
Mario Carrillo <[email protected]>
docs: update HOWTO for 3.x -> 4.x versioning
Marc Zyngier <[email protected]>
irqchip/gic-v3-its: Add missing cache flushes
Ludovic Desroches <[email protected]>
irqchip/atmel-aic5: Use per chip mask caches in mask/unmask()
Peter Seiderer <[email protected]>
cifs: use server timestamp for ntlmv2 authentication
Li Jun <[email protected]>
usb: chipidea: imx: fix a typo for imx6sx
Alexey Brodkin <[email protected]>
mmc: dw_mmc: handle data blocks > than 4kB if IDMAC is used
Dan Carpenter <[email protected]>
hv: util: checking the wrong variable
Javi Merino <[email protected]>
thermal: cpu_cooling: free power table on error or when unregistering
Javi Merino <[email protected]>
thermal: cpu_cooling: don't call kcalloc() under rcu_read_lock
Linus Lüssing <[email protected]>
batman-adv: Make DAT capability changes atomic
Linus Torvalds <[email protected]>
Initialize msg/shm IPC objects before doing ipc_addid()
Reyad Attiyat <[email protected]>
usb: xhci: Add support for URB_ZERO_PACKET to bulk/sg transfers
Mathias Nyman <[email protected]>
xhci: init command timeout timer earlier to avoid deleting it uninitialized
Mathias Nyman <[email protected]>
xhci: change xhci 1.0 only restrictions to support xhci 1.1
Roger Quadros <[email protected]>
usb: xhci: exit early in xhci_setup_device() if we're halted or dying
Roger Quadros <[email protected]>
usb: xhci: stop everything on the first call to xhci_stop
Roger Quadros <[email protected]>
usb: xhci: Clear XHCI_STATE_DYING on start
Roger Quadros <[email protected]>
usb: xhci: lock mutex on xhci_stop
Tomer Barletz <[email protected]>
xhci: Move xhci_pme_quirk() behind #ifdef CONFIG_PM
Mathias Nyman <[email protected]>
xhci: give command abortion one more chance before killing xhci
Johan Hovold <[email protected]>
USB: whiteheat: fix potential null-deref at probe
Dave Airlie <[email protected]>
drm/dp/mst: drop cancel work sync in the mstb destroy path (v2)
Dave Airlie <[email protected]>
drm/dp/mst: fixup handling hotplug on port removal.
Michel Dänzer <[email protected]>
drm/radeon: Restore LCD backlight level on resume (>= R5xx)
Daniel Vetter <[email protected]>
drm: Reject DRI1 hw lock ioctl functions for kms drivers
Jani Nikula <[email protected]>
drm/i915/bios: handle MIPI Sequence Block v3+ gracefully
Alex Deucher <[email protected]>
drm/amdgpu: Restore LCD backlight level on resume
Alex Deucher <[email protected]>
drm/amdgpu: Fix max_vblank_count value for current display engines
Leo Liu <[email protected]>
drm/amdgpu: make UVD handle checking more strict
Leo Liu <[email protected]>
drm/amdgpu: fix the UVD suspend sequence order
Leo Liu <[email protected]>
drm/amdgpu: Disable UVD PG
Christian König <[email protected]>
drm/amdgpu: fix overflow on 32bit systems
Fabiano Fidêncio <[email protected]>
drm/qxl: recreate the primary surface when the bo is not primary
Dave Airlie <[email protected]>
drm/qxl: only report first monitor as connected if we have no state
Steve French <[email protected]>
Do not fall back to SMBWriteX in set_file_size error cases
Steve French <[email protected]>
disabling oplocks/leases via module parm enable_oplocks broken for SMB3
Steve French <[email protected]>
Fix sec=krb5 on smb3 mounts
Trond Myklebust <[email protected]>
NFS: Fix a write performance regression
Peng Tao <[email protected]>
nfs: fix pg_test page count calculation
Trond Myklebust <[email protected]>
NFSv4: Recovery of recalled read delegations is broken
Kinglong Mee <[email protected]>
NFS: Do cleanup before resetting pageio read/write to mds
J. Bruce Fields <[email protected]>
nfs: fix v4.2 SEEK on files over 2 gigs
Johan Hedberg <[email protected]>
Bluetooth: Delay check for conn->smp in smp_conn_security()
Mark Brown <[email protected]>
regulator: core: Handle probe deferral from DT when resolving supplies
Chen-Yu Tsai <[email protected]>
regulator: axp20x: Fix enable bit indexes for DCDC4 and DCDC5
Charles Keepax <[email protected]>
regulator: core: Correct return value check in regulator_resolve_supply
Florian Westphal <[email protected]>
netfilter: nf_log: don't zap all loggers on unregister
Pablo Neira Ayuso <[email protected]>
netfilter: nft_compat: skip family comparison in case of NFPROTO_UNSPEC
Pablo Neira Ayuso <[email protected]>
netfilter: nf_log: wait for rcu grace after logger unregistration
Daniel Borkmann <[email protected]>
netfilter: conntrack: use nf_ct_tmpl_free in CT/synproxy error paths
Elad Raz <[email protected]>
netfilter: ipset: Fixing unnamed union init
Jozsef Kadlecsik <[email protected]>
netfilter: ipset: Out of bound access in hash:net* types fixed
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: Use 32 bit addressing register from nft_type_to_reg()
Pablo Neira Ayuso <[email protected]>
netfilter: nfnetlink: work around wrong endianess in res_id field
Bernhard Thaler <[email protected]>
netfilter: bridge: fix IPv6 packets not being bridged with CONFIG_IPV6=n
Mikulas Patocka <[email protected]>
dm raid: fix round up of default region size
NeilBrown <[email protected]>
md/raid0: apply base queue limits *before* disk_stack_limits
NeilBrown <[email protected]>
md/raid0: update queue parameter in a safer location.
Liu.Zhao <[email protected]>
USB: option: add ZTE PIDs
Shawn Lin <[email protected]>
staging: ion: fix corruption of ion_import_dma_buf
Chuck Lever <[email protected]>
svcrdma: Fix send_reply() scatter/gather set-up
Michal Kazior <[email protected]>
ath10k: fix dma_mapping_error() handling
Mike Snitzer <[email protected]>
dm crypt: constrain crypt device's max_segment_size to PAGE_SIZE
Mike Snitzer <[email protected]>
dm thin: disable discard support for thin devices if pool's is disabled
Bjorn Helgaas <[email protected]>
PCI: Clear IORESOURCE_UNSET when clipping a bridge window
Alex Williamson <[email protected]>
PCI: Use function 0 VPD for identical functions, regular VPD for others
Alex Williamson <[email protected]>
PCI: Fix devfn for VPD access through function 0
Rusty Russell <[email protected]>
tools/lguest: Fix redefinition of struct virtio_pci_cfg_cap
Filipe Manana <[email protected]>
Btrfs: update fix for read corruption of compressed and shared extents
Filipe Manana <[email protected]>
Btrfs: fix read corruption of compressed and shared extents
Jeff Mahoney <[email protected]>
btrfs: skip waiting on ordered range for special files
Andreas Dannenberg <[email protected]>
ASoC: tas2552: fix dBscale-min declaration
Gianluca Renzi <[email protected]>
ASoC: sgtl5000: fix wrong register MIC_BIAS_VOLTAGE setup on probe
Lars-Peter Clausen <[email protected]>
ASoC: db1200: Fix DAI link format for db1300 and db1550
Yitian Bu <[email protected]>
ASoC: dwc: correct irq clear method
Robert Jarzmik <[email protected]>
ASoC: fix broken pxa SoC support
Robert Jarzmik <[email protected]>
ASoC: pxa: pxa2xx-ac97: fix dma requestor lines
Takashi Iwai <[email protected]>
ALSA: hda - Disable power_save_node for IDT 92HD73xx chips
John Flatness <[email protected]>
ALSA: hda - Apply SPDIF pin ctl to MacBookPro 12,1
Laura Abbott <[email protected]>
ALSA: hda: Add dock support for ThinkPad T550
Takashi Iwai <[email protected]>
ALSA: synth: Fix conflicting OSS device registration on AWE32
Takashi Iwai <[email protected]>
ALSA: hda - Disable power_save_node for Thinkpads
Takashi Iwai <[email protected]>
ALSA: hda/tegra - async probe for avoiding module loading deadlock
Greg Thelen <[email protected]>
memcg: fix dirty page migration
Mel Gorman <[email protected]>
mm: hugetlbfs: skip shared VMAs when unmapping private pages to satisfy a fault
Joseph Qi <[email protected]>
ocfs2/dlm: fix deadlock when dispatch assert master
Sowmini Varadhan <[email protected]>
lib/iommu-common.c: do not try to deref a null iommu->lazy_flush() pointer when n < pool->hint
Naoya Horiguchi <[email protected]>
mm: migrate: hugetlb: putback destination hugepage to active list
Sudip Mukherjee <[email protected]>
spi: spidev: fix possible NULL dereference
Tan, Jui Nee <[email protected]>
spi: spi-pxa2xx: Check status register to determine if SSSR_TINT is disabled
Martin Sperl <[email protected]>
spi: bcm2835: BUG: fix wrong use of PAGE_MASK
Max Filippov <[email protected]>
spi: xtensa-xtfpga: fix register endianness
Guenter Roeck <[email protected]>
spi: Fix documentation of spi_alloc_master()
Greg Thelen <[email protected]>
memcg: make mem_cgroup_read_stat() unsigned
Tejun Heo <[email protected]>
Revert "sched, cgroup: replace signal_struct->group_rwsem with a global percpu_rwsem"
Tejun Heo <[email protected]>
Revert "cgroup: simplify threadgroup locking"
Christian Borntraeger <[email protected]>
s390/boot/decompression: disable floating point in decompressor
Martin Schwidefsky <[email protected]>
s390/compat: correct uc_sigmask of the compat signal frame
Peter Zijlstra <[email protected]>
sched/core: Fix TASK_DEAD race in finish_task_switch()
Ricardo Ribalda Delgado <[email protected]>
leds/led-class: Add missing put_device()
Takashi Iwai <[email protected]>
leds:lp55xx: Correct Kconfig dependency for f/w user helper
Vitaly Kuznetsov <[email protected]>
x86/xen: Support kexec/kdump in HVM guests by doing a soft reset
Stephen Smalley <[email protected]>
x86/mm: Set NX on gap between __ex_table and rodata
Thomas Gleixner <[email protected]>
x86/process: Add proper bound checks in 64bit get_wchan()
Lee, Chun-Yi <[email protected]>
x86/kexec: Fix kexec crash in syscall kexec_file_load()
Matt Fleming <[email protected]>
x86/efi: Fix boot crash by mapping EFI memmap entries bottom-up at runtime, instead of top-down
Dirk Müller <[email protected]>
Use WARN_ON_ONCE for missing X86_FEATURE_NRIPS
Andy Lutomirski <[email protected]>
x86/nmi/64: Fix a paravirt stack-clobbering bug in the NMI code
Andy Lutomirski <[email protected]>
x86/paravirt: Replace the paravirt nop with a bona fide empty function
Andy Shevchenko <[email protected]>
x86/pci/intel_mid_pci: Work around for IRQ0 assignment
Thomas Gleixner <[email protected]>
x86/ioapic: Force affinity setting in setup_ioapic_dest()
David Woodhouse <[email protected]>
x86/platform: Fix Geode LX timekeeping in the generic x86 build
Thomas Gleixner <[email protected]>
x86/alternatives: Make optimize_nops() interrupt safe and synced
Shaohua Li <[email protected]>
x86/apic: Serialize LVTT and TSC_DEADLINE writes
Ross Zwisler <[email protected]>
pmem: add proper fencing to pmem_rw_page()
Robert Jarzmik <[email protected]>
dmaengine: pxa_dma: fix initial list move
Ludovic Desroches <[email protected]>
dmaengine: at_xdmac: fix bug in prep_dma_cyclic
Andy Shevchenko <[email protected]>
dmaengine: dw: properly read DWC_PARAMS register
Ludovic Desroches <[email protected]>
dmaengine: at_xdmac: clean used descriptor
Maxime Ripard <[email protected]>
dmaengine: at_xdmac: change block increment addressing mode
Tejun Heo <[email protected]>
block: blkg_destroy_all() should clear q->root_blkg and ->root_rl.blkg
Jeff Moyer <[email protected]>
blockdev: don't set S_DAX for misaligned partitions
Jeff Moyer <[email protected]>
dax: fix O_DIRECT I/O to the last block of a blockdev
Felipe F. Tonello <[email protected]>
ARM: dts: fix usb pin control for imx-rex dts
Joonyoung Shim <[email protected]>
ARM: dts: Fix wrong clock binding for sysmmu_fimd1_1 on exynos5420
Timo Sigurdsson <[email protected]>
ARM: dts: sunxi: Raise minimum CPU voltage for sun7i-a20 to meet SoC specifications
Chanho Park <[email protected]>
ARM: EXYNOS: reset Little cores when cpu is up
Jarkko Nikula <[email protected]>
ARM: pxa: ssp: Fix build error by removing originally incorrect DT binding
Carl Frederik Werner <[email protected]>
ARM: dts: omap3-beagle: make i2c3, ddc and tfp410 gpio work again
Grazvydas Ignotas <[email protected]>
ARM: dts: omap5-uevm.dts: fix i2c5 pinctrl offsets
Doug Anderson <[email protected]>
ARM: 8425/1: kgdb: Don't try to stop the machine when setting breakpoints
Paul Bolle <[email protected]>
windfarm: decrement client count when unregistering
Ard Biesheuvel <[email protected]>
ARM: 8429/1: disable GCC SRA optimization
Russell King <[email protected]>
ARM: fix Thumb2 signal handling when ARMv6 is enabled
Guenter Roeck <[email protected]>
hwmon: (nct6775) Swap STEP_UP_TIME and STEP_DOWN_TIME registers for most chips
Dominik Dingel <[email protected]>
sched: access local runqueue directly in single_task_running
Ezequiel Garcia <[email protected]>
watchdog: imgpdc: Unregister restart handler on remove
Francesco Lavra <[email protected]>
watchdog: sunxi: fix activation of system reset
Vineet Gupta <[email protected]>
ARCv2: [axs103_smp] Reduce clk for SMP FPGA configs
Arnaldo Carvalho de Melo <[email protected]>
perf probe: Use existing routine to look for a kernel module by dso->short_name
Arnaldo Carvalho de Melo <[email protected]>
perf header: Fixup reading of HEADER_NRCPUS feature
Jiri Olsa <[email protected]>
perf tools: Fix parse_events_add_pmu caller
Ben Hutchings <[email protected]>
perf tools: Add empty Build files for architectures lacking them
Wang Nan <[email protected]>
perf tools: Add missing forward declaration of struct map to probe-event.h
Kan Liang <[email protected]>
perf stat: Get correct cpu id for print_aggr
Arnaldo Carvalho de Melo <[email protected]>
perf hists: Update the column width for the "srcline" sort key
Stephen Boyd <[email protected]>
ARM: 8401/1: perf: Set affinity for PPI based PMUs
Adrian Hunter <[email protected]>
perf tools: Fix copying of /proc/kcore
Peter Zijlstra <[email protected]>
locking/qspinlock/x86: Only emit the test-and-set fallback when building guest support
Peter Zijlstra <[email protected]>
locking/qspinlock/x86: Fix performance regression under unaccelerated VMs
Peter Zijlstra <[email protected]>
perf/x86/intel: Fix constraint access
Azael Avalos <[email protected]>
toshiba_acpi: Fix hotkeys registration on some toshiba models
Jenny Derzhavetz <[email protected]>
iser-target: Put the reference on commands waiting for unsol data
Jenny Derzhavetz <[email protected]>
iser-target: remove command with state ISTATE_REMOVE
Nicholas Bellinger <[email protected]>
target: Fix PR registration + APTPL RCU conversion regression
Nicholas Bellinger <[email protected]>
target: Attach EXTENDED_COPY local I/O descriptors to xcopy_pt_sess
Michal Hocko <[email protected]>
scsi: fix scsi_error_handler vs. scsi_host_dev_release race
Andy Grover <[email protected]>
target/iscsi: Fix np_ip bracket issue by removing np_ip
John Stultz <[email protected]>
time: Fix timekeeping_freqadjust()'s incorrect use of abs() instead of abs64()
Paolo Bonzini <[email protected]>
Revert "KVM: SVM: Sync g_pat with guest-written PAT value"
Paolo Bonzini <[email protected]>
Revert "KVM: SVM: use NPT page attributes"
Paolo Bonzini <[email protected]>
Revert "KVM: x86: apply guest MTRR virtualization on host reserved pages"
Gautham R. Shenoy <[email protected]>
KVM: PPC: Book3S HV: Pass the correct trap argument to kvmhv_commence_exit
Thomas Huth <[email protected]>
KVM: PPC: Book3S: Take the kvm->srcu lock in kvmppc_h_logical_ci_load/store()
Paolo Bonzini <[email protected]>
KVM: x86: trap AMD MSRs for the TSeg base and mask
Igor Mammedov <[email protected]>
kvm: svm: reset mmu on VCPU reset
Marc Zyngier <[email protected]>
arm: KVM: Disable virtual timer even if the guest is not using it
Jason Wang <[email protected]>
kvm: fix double free for fast mmio eventfd
Jason Wang <[email protected]>
kvm: factor out core eventfd assign/deassign logic
Jason Wang <[email protected]>
kvm: fix zero length mmio searching
Jason Wang <[email protected]>
kvm: don't try to register to KVM_FAST_MMIO_BUS for non mmio eventfd
Wanpeng Li <[email protected]>
KVM: vmx: fix VPID is 0000H in non-root operation
Marek Majtyka <[email protected]>
arm: KVM: Fix incorrect device to IPA mapping
-------------
Diffstat:
Documentation/HOWTO | 28 +++--- Makefile | 4 +- arch/arc/plat-axs10x/axs10x.c | 2 + arch/arm/Makefile | 8 ++ arch/arm/boot/dts/exynos5420.dtsi | 2 +- arch/arm/boot/dts/imx6qdl-rex.dtsi | 2 - arch/arm/boot/dts/omap3-beagle.dts | 2 +- arch/arm/boot/dts/omap5-uevm.dts | 4 +- arch/arm/boot/dts/sun7i-a20.dtsi | 2 +- arch/arm/kernel/kgdb.c | 8 +- arch/arm/kernel/perf_event.c | 4 +- arch/arm/kernel/signal.c | 15 ++- arch/arm/kvm/interrupts_head.S | 6 +- arch/arm/kvm/mmu.c | 6 +- arch/arm/mach-exynos/mcpm-exynos.c | 27 +++++- arch/arm/mach-exynos/regs-pmu.h | 6 ++ arch/arm/plat-pxa/ssp.c | 1 - arch/arm64/kernel/efi.c | 3 +- arch/arm64/kernel/entry-ftrace.S | 22 ++++- arch/arm64/mm/fault.c | 1 + arch/m68k/include/asm/linkage.h | 30 ++++++ arch/mips/kernel/cps-vec.S | 12 ++- arch/mips/kernel/setup.c | 10 +- arch/mips/loongson64/common/env.c | 3 + arch/mips/mm/dma-default.c | 2 +- arch/mips/net/bpf_jit_asm.S | 50 +++++++++- arch/powerpc/kvm/book3s.c | 6 ++ arch/powerpc/kvm/book3s_hv_rmhandlers.S | 1 + arch/powerpc/platforms/pasemi/msi.c | 5 +- arch/powerpc/platforms/powernv/pci.c | 5 +- arch/powerpc/sysdev/fsl_msi.c | 5 +- arch/powerpc/sysdev/mpic_u3msi.c | 5 +- arch/powerpc/sysdev/ppc4xx_msi.c | 5 +- arch/s390/boot/compressed/Makefile | 2 +- arch/s390/kernel/compat_signal.c | 27 +++++- arch/x86/entry/entry_64.S | 16 +++- arch/x86/include/asm/msr-index.h | 1 + arch/x86/include/asm/preempt.h | 4 +- arch/x86/include/asm/qspinlock.h | 19 +++- arch/x86/kernel/alternative.c | 5 + arch/x86/kernel/apic/apic.c | 7 ++ arch/x86/kernel/apic/io_apic.c | 5 +- arch/x86/kernel/cpu/perf_event_intel.c | 5 +- arch/x86/kernel/crash.c | 7 +- arch/x86/kernel/paravirt.c | 16 +++- arch/x86/kernel/process_64.c | 52 +++++++++-- arch/x86/kernel/tsc.c | 17 ++-- arch/x86/kvm/svm.c | 111 ++-------------------- arch/x86/kvm/vmx.c | 13 ++- arch/x86/kvm/x86.c | 2 + arch/x86/mm/init_64.c | 2 +- arch/x86/pci/intel_mid_pci.c | 24 ++++- arch/x86/platform/efi/efi.c | 67 ++++++++++++- arch/x86/xen/enlighten.c | 23 +++++ block/blk-cgroup.c | 3 + block/blk-mq.c | 9 +- drivers/base/cacheinfo.c | 10 +- drivers/base/property.c | 5 +- drivers/base/regmap/regmap-debugfs.c | 5 +- drivers/block/xen-blkback/xenbus.c | 38 ++++---- drivers/clk/samsung/clk-cpu.c | 10 +- drivers/clk/ti/clk-3xxx.c | 2 +- drivers/clk/ti/clk-7xx.c | 18 +--- drivers/cpufreq/acpi-cpufreq.c | 3 + drivers/cpufreq/cpufreq-dt.c | 3 +- drivers/crypto/marvell/cesa.h | 27 ++++++ drivers/crypto/marvell/cipher.c | 7 +- drivers/crypto/marvell/hash.c | 8 +- drivers/dma/at_xdmac.c | 20 ++-- drivers/dma/dw/core.c | 4 +- drivers/dma/pxa_dma.c | 1 + drivers/extcon/extcon.c | 10 +- drivers/firmware/efi/libstub/arm-stub.c | 88 +++++++++++++++--- drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 68 ++++++++------ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 2 +- drivers/gpu/drm/amd/amdgpu/atombios_encoders.c | 3 +- drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | 4 +- drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | 4 +- drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 4 +- drivers/gpu/drm/amd/amdgpu/vi.c | 3 +- drivers/gpu/drm/drm_dp_mst_topology.c | 41 +++++--- drivers/gpu/drm/drm_lock.c | 6 ++ drivers/gpu/drm/i915/intel_bios.c | 12 ++- drivers/gpu/drm/qxl/qxl_display.c | 14 +-- drivers/gpu/drm/radeon/atombios_encoders.c | 8 +- drivers/hv/hv_utils_transport.c | 2 +- drivers/hwmon/nct6775.c | 16 ++-- drivers/infiniband/ulp/isert/ib_isert.c | 47 +++++++++- drivers/irqchip/irq-atmel-aic5.c | 24 +++-- drivers/irqchip/irq-gic-v3-its.c | 6 +- drivers/leds/Kconfig | 2 +- drivers/leds/led-class.c | 7 +- drivers/macintosh/windfarm_core.c | 2 +- drivers/md/bitmap.c | 3 +- drivers/md/dm-cache-policy-cleaner.c | 2 +- drivers/md/dm-crypt.c | 17 +++- drivers/md/dm-raid.c | 3 +- drivers/md/dm-thin.c | 4 + drivers/md/dm.c | 6 +- drivers/md/raid0.c | 75 ++++++++------- drivers/mmc/core/core.c | 6 +- drivers/mmc/core/host.c | 4 +- drivers/mmc/host/dw_mmc.c | 109 ++++++++++++++-------- drivers/mmc/host/sdhci-pxav3.c | 6 +- drivers/mtd/nand/pxa3xx_nand.c | 3 + drivers/mtd/nand/sunxi_nand.c | 27 ++---- drivers/mtd/ubi/io.c | 5 + drivers/mtd/ubi/vtbl.c | 1 + drivers/mtd/ubi/wl.c | 1 + drivers/net/ethernet/intel/e1000e/netdev.c | 31 +++++-- drivers/net/ethernet/intel/igb/igb_main.c | 2 +- drivers/net/ethernet/via/Kconfig | 2 +- drivers/net/wireless/ath/ath10k/htc.c | 4 +- drivers/net/wireless/ath/ath10k/htt_tx.c | 8 +- drivers/net/wireless/ath/ath10k/mac.c | 85 ++++++++++------- drivers/net/wireless/ath/ath10k/mac.h | 6 +- drivers/net/wireless/ath/ath10k/pci.c | 8 +- drivers/net/wireless/ath/ath10k/wmi-tlv.c | 34 +++++-- drivers/net/wireless/ath/ath10k/wmi.c | 1 + drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 8 +- drivers/net/wireless/rsi/rsi_91x_usb_ops.c | 8 +- drivers/net/xen-netfront.c | 3 +- drivers/nvdimm/pmem.c | 2 + drivers/pci/access.c | 27 +----- drivers/pci/bus.c | 2 + drivers/pci/quirks.c | 20 +++- drivers/pcmcia/sa1100_generic.c | 1 - drivers/pcmcia/sa11xx_base.c | 3 +- drivers/platform/x86/toshiba_acpi.c | 8 +- drivers/power/avs/Kconfig | 2 +- drivers/regulator/axp20x-regulator.c | 4 +- drivers/regulator/core.c | 20 ++-- drivers/scsi/3w-9xxx.c | 28 ++++-- drivers/scsi/hpsa.c | 15 +-- drivers/scsi/ipr.c | 2 +- drivers/scsi/scsi_error.c | 11 ++- drivers/spi/spi-bcm2835.c | 6 +- drivers/spi/spi-pxa2xx.c | 4 + drivers/spi/spi-xtensa-xtfpga.c | 4 +- drivers/spi/spi.c | 3 +- drivers/spi/spidev.c | 3 +- drivers/staging/android/ion/ion.c | 6 +- drivers/staging/speakup/fakekey.c | 1 + drivers/target/iscsi/iscsi_target.c | 33 ++++--- drivers/target/iscsi/iscsi_target.h | 2 +- drivers/target/iscsi/iscsi_target_configfs.c | 14 +-- drivers/target/iscsi/iscsi_target_login.c | 8 +- drivers/target/iscsi/iscsi_target_parameters.c | 5 +- drivers/target/iscsi/iscsi_target_tpg.c | 15 ++- drivers/target/iscsi/iscsi_target_tpg.h | 2 +- drivers/target/target_core_device.c | 5 +- drivers/target/target_core_pr.c | 91 +++++++++++++----- drivers/target/target_core_xcopy.c | 6 +- drivers/thermal/cpu_cooling.c | 52 ++++++----- drivers/tty/n_tty.c | 15 +-- drivers/tty/serial/8250/8250_core.c | 8 ++ drivers/tty/serial/atmel_serial.c | 2 +- drivers/tty/tty_io.c | 31 ++++++- drivers/usb/chipidea/ci_hdrc_imx.c | 2 +- drivers/usb/chipidea/udc.c | 84 +++++++++-------- drivers/usb/core/config.c | 5 +- drivers/usb/core/quirks.c | 13 +++ drivers/usb/host/xhci-mem.c | 17 ++-- drivers/usb/host/xhci-pci.c | 90 +++++++++--------- drivers/usb/host/xhci-ring.c | 79 ++++++++++++---- drivers/usb/host/xhci.c | 29 +++--- drivers/usb/misc/chaoskey.c | 2 +- drivers/usb/musb/musb_cppi41.c | 6 +- drivers/usb/musb/musb_dsps.c | 7 +- drivers/usb/phy/phy-generic.c | 3 +- drivers/usb/serial/option.c | 24 +++++ drivers/usb/serial/whiteheat.c | 31 +++++++ drivers/watchdog/imgpdc_wdt.c | 1 + drivers/watchdog/sunxi_wdt.c | 2 +- fs/block_dev.c | 7 ++ fs/btrfs/extent_io.c | 80 +++++++++++++--- fs/btrfs/inode.c | 3 +- fs/cifs/cifsencrypt.c | 53 ++++++++++- fs/cifs/inode.c | 34 ------- fs/cifs/smb2ops.c | 8 +- fs/cifs/smb2pdu.c | 76 ++++++++++++--- fs/dax.c | 3 +- fs/dcache.c | 7 ++ fs/namei.c | 35 ++++++- fs/nfs/delegation.c | 8 +- fs/nfs/delegation.h | 2 +- fs/nfs/filelayout/filelayout.c | 31 +++---- fs/nfs/nfs42proc.c | 4 +- fs/nfs/nfs4proc.c | 81 +++++++++------- fs/nfs/pagelist.c | 2 +- fs/nfs/read.c | 3 + fs/nfs/write.c | 5 +- fs/ocfs2/dlm/dlmmaster.c | 9 +- fs/ocfs2/dlm/dlmrecovery.c | 8 +- fs/ubifs/xattr.c | 3 - include/asm-generic/preempt.h | 5 +- include/asm-generic/qspinlock.h | 4 +- include/linux/cgroup-defs.h | 27 +----- include/linux/init_task.h | 8 ++ include/linux/mm.h | 21 +++++ include/linux/preempt.h | 19 +++- include/linux/sched.h | 18 ++-- include/linux/security.h | 2 +- include/net/netfilter/br_netfilter.h | 2 +- include/net/netfilter/nf_conntrack.h | 1 + include/net/netfilter/nf_tables.h | 2 +- include/target/iscsi/iscsi_target_core.h | 1 - include/xen/interface/sched.h | 8 ++ ipc/msg.c | 14 +-- ipc/shm.c | 13 +-- ipc/util.c | 8 +- kernel/cgroup.c | 110 ++++++++++++++++------ kernel/fork.c | 4 + kernel/irq/proc.c | 19 +++- kernel/locking/qspinlock.c | 2 +- kernel/sched/core.c | 31 ++++--- kernel/sched/sched.h | 5 +- kernel/time/clocksource.c | 2 +- kernel/time/timekeeping.c | 2 +- lib/iommu-common.c | 6 +- mm/hugetlb.c | 8 ++ mm/memcontrol.c | 30 +++--- mm/migrate.c | 14 ++- mm/slab.c | 13 ++- net/batman-adv/distributed-arp-table.c | 7 +- net/batman-adv/multicast.c | 81 +++++++++++----- net/batman-adv/network-coding.c | 7 +- net/batman-adv/originator.c | 5 + net/batman-adv/soft-interface.c | 7 +- net/batman-adv/translation-table.c | 8 +- net/batman-adv/types.h | 15 +-- net/bluetooth/smp.c | 12 +-- net/netfilter/ipset/ip_set_hash_gen.h | 12 ++- net/netfilter/ipset/ip_set_hash_netnet.c | 20 +++- net/netfilter/ipset/ip_set_hash_netportnet.c | 20 +++- net/netfilter/nf_conntrack_core.c | 3 +- net/netfilter/nf_log.c | 9 +- net/netfilter/nf_synproxy_core.c | 2 +- net/netfilter/nfnetlink.c | 8 +- net/netfilter/nft_compat.c | 24 +++-- net/netfilter/xt_CT.c | 2 +- net/sunrpc/xprtrdma/svc_rdma_sendto.c | 10 +- sound/arm/Kconfig | 15 +-- sound/pci/hda/hda_tegra.c | 30 +++++- sound/pci/hda/patch_cirrus.c | 1 + sound/pci/hda/patch_realtek.c | 32 ++++--- sound/pci/hda/patch_sigmatel.c | 6 +- sound/soc/au1x/db1200.c | 4 + sound/soc/codecs/sgtl5000.c | 4 +- sound/soc/codecs/tas2552.c | 2 +- sound/soc/dwc/designware_i2s.c | 4 +- sound/soc/pxa/Kconfig | 2 - sound/soc/pxa/pxa2xx-ac97.c | 4 +- sound/synth/emux/emux_oss.c | 3 +- tools/lguest/lguest.c | 10 +- tools/lib/traceevent/event-parse.c | 23 ++++- tools/perf/arch/alpha/Build | 1 + tools/perf/arch/mips/Build | 1 + tools/perf/arch/parisc/Build | 1 + tools/perf/builtin-stat.c | 5 +- tools/perf/util/header.c | 4 +- tools/perf/util/hist.c | 3 + tools/perf/util/parse-events.y | 2 +- tools/perf/util/probe-event.c | 13 +-- tools/perf/util/probe-event.h | 2 + tools/perf/util/symbol-elf.c | 35 +++---- virt/kvm/eventfd.c | 124 +++++++++++++++---------- virt/kvm/kvm_main.c | 19 +++- 269 files changed, 2734 insertions(+), 1322 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 3/258 kvm: dont try to register to KVM_FAST_MMIO_BUS for non mmio eventfd
4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wang <[email protected]>
commit 8453fecbecae26edb3f278627376caab05d9a88d upstream.
We only want zero length mmio eventfd to be registered on KVM_FAST_MMIO_BUS. So check this explicitly when arg->len is zero to make sure this.
--- virt/kvm/eventfd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
virt/kvm/eventfd.c +2 -2
@@ -846,7 +846,7 @@ kvm_assign_ioeventfd(struct kvm *kvm, st/* When length is ignored, MMIO is also put on a separate bus, for * faster lookups. */ -if (!args->len && !(args->flags &KVM_IOEVENTFD_FLAG_PIO )) { +if (!args->len && bus_idx ==KVM_MMIO_BUS ) { ret =kvm_io_bus_register_dev (kvm,KVM_FAST_MMIO_BUS , p->addr,0 , &p->dev);if (ret <0 )
@@ -901,7 +901,7 @@ kvm_deassign_ioeventfd(struct kvm *kvm,continue ;kvm_io_bus_unregister_dev (kvm, bus_idx, &p->dev); -if (!p->length) { +if (!p->length && p->bus_idx ==KVM_MMIO_BUS ) {kvm_io_bus_unregister_dev (kvm,KVM_FAST_MMIO_BUS , &p->dev); }
Greg Kroah-Hartman
maintainerPATCH 5/258 kvm: factor out core eventfd assign/deassign logic
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wang <[email protected]>
commit 85da11ca587c8eb73993a1b503052391a73586f9 upstream.
This patch factors out core eventfd assign/deassign logic and leaves the argument checking and bus index selection to callers.
--- virt/kvm/eventfd.c | 85 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 35 deletions(-)
virt/kvm/eventfd.c +50 -35
@@ -771,40 +771,14 @@ static enum kvm_bus ioeventfd_bus_from_freturn KVM_MMIO_BUS ; } -static int -kvm_assign_ioeventfd (struct kvm *kvm,struct kvm_ioeventfd *args) +static int kvm_assign_ioeventfd_idx (struct kvm *kvm, +enum kvm_bus bus_idx, +struct kvm_ioeventfd *args) { -enum kvm_bus bus_idx; -struct _ioeventfd *p; -struct eventfd_ctx *eventfd; -int ret; - bus_idx =ioeventfd_bus_from_flags (args->flags); -/* must be natural-word sized, or 0 to ignore length */ -switch (args->len) { -case 0 : -case 1 : -case 2 : -case 4 : -case 8 : -break ; -default : -return -EINVAL ; - } - -/* check for range overflow */ -if (args->addr + args->len < args->addr) -return -EINVAL ; - -/* check for extra flags that we don't understand */ -if (args->flags & ~KVM_IOEVENTFD_VALID_FLAG_MASK ) -return -EINVAL ; - -/* ioeventfd with no length can't be combined with DATAMATCH */ -if (!args->len && - args->flags & (KVM_IOEVENTFD_FLAG_PIO | -KVM_IOEVENTFD_FLAG_DATAMATCH )) -return -EINVAL ; +struct eventfd_ctx *eventfd; +struct _ioeventfd *p; +int ret; eventfd =eventfd_ctx_fdget (args->fd);if (IS_ERR (eventfd))
@@ -873,14 +847,13 @@ fail: }static int -kvm_deassign_ioeventfd (struct kvm *kvm,struct kvm_ioeventfd *args) +kvm_deassign_ioeventfd_idx (struct kvm *kvm,enum kvm_bus bus_idx, +struct kvm_ioeventfd *args) { -enum kvm_bus bus_idx;struct _ioeventfd *p, *tmp;struct eventfd_ctx *eventfd;int ret = -ENOENT ; - bus_idx =ioeventfd_bus_from_flags (args->flags); eventfd =eventfd_ctx_fdget (args->fd);if (IS_ERR (eventfd))return PTR_ERR (eventfd);
@@ -918,6 +891,48 @@ kvm_deassign_ioeventfd(struct kvm *kvm,return ret; } +static int kvm_deassign_ioeventfd (struct kvm *kvm,struct kvm_ioeventfd *args) +{ +enum kvm_bus bus_idx =ioeventfd_bus_from_flags (args->flags); + +return kvm_deassign_ioeventfd_idx (kvm, bus_idx, args); +} + +static int +kvm_assign_ioeventfd (struct kvm *kvm,struct kvm_ioeventfd *args) +{ +enum kvm_bus bus_idx; + + bus_idx =ioeventfd_bus_from_flags (args->flags); +/* must be natural-word sized, or 0 to ignore length */ +switch (args->len) { +case 0 : +case 1 : +case 2 : +case 4 : +case 8 : +break ; +default : +return -EINVAL ; + } + +/* check for range overflow */ +if (args->addr + args->len < args->addr) +return -EINVAL ; + +/* check for extra flags that we don't understand */ +if (args->flags & ~KVM_IOEVENTFD_VALID_FLAG_MASK ) +return -EINVAL ; + +/* ioeventfd with no length can't be combined with DATAMATCH */ +if (!args->len && + args->flags & (KVM_IOEVENTFD_FLAG_PIO | +KVM_IOEVENTFD_FLAG_DATAMATCH )) +return -EINVAL ; + +return kvm_assign_ioeventfd_idx (kvm, bus_idx, args); +} +int kvm_ioeventfd (struct kvm *kvm,struct kvm_ioeventfd *args) {
Greg Kroah-Hartman
maintainerPATCH 6/258 kvm: fix double free for fast mmio eventfd
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wang <[email protected]>
commit eefd6b06b17c5478e7c24bea6f64beaa2c431ca6 upstream.
We register wildcard mmio eventfd on two buses, once for KVM_MMIO_BUS and once on KVM_FAST_MMIO_BUS but with a single iodev instance. This will lead to an issue: kvm_io_bus_destroy() knows nothing about the devices on two buses pointing to a single dev. Which will lead to double free[1] during exit. Fix this by allocating two instances of iodevs then registering one on KVM_MMIO_BUS and another on KVM_FAST_MMIO_BUS.
CPU: 1 PID: 2894 Comm: qemu-system-x86 Not tainted 3.19.0-26-generic #28-Ubuntu Hardware name: LENOVO 2356BG6/2356BG6, BIOS G7ET96WW (2.56 ) 09/12/2013 task: ffff88009ae0c4b0 ti: ffff88020e7f0000 task.ti: ffff88020e7f0000 RIP: 0010:[<ffffffffc07e25d8>] [<ffffffffc07e25d8>] ioeventfd_release+0x28/0x60 [kvm] RSP: 0018:ffff88020e7f3bc8 EFLAGS: 00010292 RAX: dead000000200200 RBX: ffff8801ec19c900 RCX: 000000018200016d RDX: ffff8801ec19cf80 RSI: ffffea0008bf1d40 RDI: ffff8801ec19c900 RBP: ffff88020e7f3bd8 R08: 000000002fc75a01 R09: 000000018200016d R10: ffffffffc07df6ae R11: ffff88022fc75a98 R12: ffff88021e7cc000 R13: ffff88021e7cca48 R14: ffff88021e7cca50 R15: ffff8801ec19c880 FS: 00007fc1ee3e6700(0000) GS:ffff88023e240000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f8f389d8000 CR3: 000000023dc13000 CR4: 00000000001427e0 Stack: ffff88021e7cc000 0000000000000000 ffff88020e7f3be8 ffffffffc07e2622 ffff88020e7f3c38 ffffffffc07df69a ffff880232524160 ffff88020e792d80 0000000000000000 ffff880219b78c00 0000000000000008 ffff8802321686a8 Call Trace: [<ffffffffc07e2622>] ioeventfd_destructor+0x12/0x20 [kvm] [<ffffffffc07df69a>] kvm_put_kvm+0xca/0x210 [kvm] [<ffffffffc07df818>] kvm_vcpu_release+0x18/0x20 [kvm] [<ffffffff811f69f7>] __fput+0xe7/0x250 [<ffffffff811f6bae>] ____fput+0xe/0x10 [<ffffffff81093f04>] task_work_run+0xd4/0xf0 [<ffffffff81079358>] do_exit+0x368/0xa50 [<ffffffff81082c8f>] ? recalc_sigpending+0x1f/0x60 [<ffffffff81079ad5>] do_group_exit+0x45/0xb0 [<ffffffff81085c71>] get_signal+0x291/0x750 [<ffffffff810144d8>] do_signal+0x28/0xab0 [<ffffffff810f3a3b>] ? do_futex+0xdb/0x5d0 [<ffffffff810b7028>] ? __wake_up_locked_key+0x18/0x20 [<ffffffff810f3fa6>] ? SyS_futex+0x76/0x170 [<ffffffff81014fc9>] do_notify_resume+0x69/0xb0 [<ffffffff817cb9af>] int_signal+0x12/0x17 Code: 5d c3 90 0f 1f 44 00 00 55 48 89 e5 53 48 89 fb 48 83 ec 08 48 8b 7f 20 e8 06 d6 a5 c0 48 8b 43 08 48 8b 13 48 89 df 48 89 42 08 <48> 89 10 48 b8 00 01 10 00 00 RIP [<ffffffffc07e25d8>] ioeventfd_release+0x28/0x60 [kvm] RSP <ffff88020e7f3bc8>
--- virt/kvm/eventfd.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-)
virt/kvm/eventfd.c +25 -18
@@ -817,16 +817,6 @@ static int kvm_assign_ioeventfd_idx(struif (ret <0 ) goto unlock_fail; -/* When length is ignored, MMIO is also put on a separate bus, for -* faster lookups. -*/ -if (!args->len && bus_idx ==KVM_MMIO_BUS ) { - ret =kvm_io_bus_register_dev (kvm,KVM_FAST_MMIO_BUS , - p->addr,0 , &p->dev); -if (ret <0 ) - goto register_fail; - } - kvm->buses[bus_idx]->ioeventfd_count++;list_add_tail (&p->list, &kvm->ioeventfds);
@@ -834,8 +824,6 @@ static int kvm_assign_ioeventfd_idx(strureturn 0 ; -register_fail: -kvm_io_bus_unregister_dev (kvm, bus_idx, &p->dev); unlock_fail:mutex_unlock (&kvm->slots_lock);
@@ -874,10 +862,6 @@ kvm_deassign_ioeventfd_idx(struct kvm *kcontinue ;kvm_io_bus_unregister_dev (kvm, bus_idx, &p->dev); -if (!p->length && p->bus_idx ==KVM_MMIO_BUS ) { -kvm_io_bus_unregister_dev (kvm,KVM_FAST_MMIO_BUS , - &p->dev); - } kvm->buses[bus_idx]->ioeventfd_count--;ioeventfd_release (p); ret =0 ;
@@ -894,14 +878,19 @@ kvm_deassign_ioeventfd_idx(struct kvm *kstatic int kvm_deassign_ioeventfd (struct kvm *kvm,struct kvm_ioeventfd *args) {enum kvm_bus bus_idx =ioeventfd_bus_from_flags (args->flags); +int ret =kvm_deassign_ioeventfd_idx (kvm, bus_idx, args); + +if (!args->len && bus_idx ==KVM_MMIO_BUS ) +kvm_deassign_ioeventfd_idx (kvm,KVM_FAST_MMIO_BUS , args); -return kvm_deassign_ioeventfd_idx (kvm, bus_idx, args); +return ret; }static int kvm_assign_ioeventfd (struct kvm *kvm,struct kvm_ioeventfd *args) {enum kvm_bus bus_idx; +int ret; bus_idx =ioeventfd_bus_from_flags (args->flags);/* must be natural-word sized, or 0 to ignore length */
@@ -930,7 +919,25 @@ kvm_assign_ioeventfd(struct kvm *kvm, st KVM_IOEVENTFD_FLAG_DATAMATCH))return -EINVAL ; -return kvm_assign_ioeventfd_idx (kvm, bus_idx, args); + ret =kvm_assign_ioeventfd_idx (kvm, bus_idx, args); +if (ret) + goto fail; + +/* When length is ignored, MMIO is also put on a separate bus, for +* faster lookups. +*/ +if (!args->len && bus_idx ==KVM_MMIO_BUS ) { + ret =kvm_assign_ioeventfd_idx (kvm,KVM_FAST_MMIO_BUS , args); +if (ret <0 ) + goto fast_fail; + } + +return 0 ; + +fast_fail: +kvm_deassign_ioeventfd_idx (kvm, bus_idx, args); +fail: +return ret; }int
Greg Kroah-Hartman
maintainerPATCH 7/258 arm: KVM: Disable virtual timer even if the guest is not using it
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Zyngier <[email protected]>
commit 688bc577ac42ae3d07c889a1f0a72f0b23763d58 upstream.
When running a guest with the architected timer disabled (with QEMU and the kernel_irqchip=off option, for example), it is important to make sure the timer gets turned off. Otherwise, the guest may try to enable it anyway, leading to a screaming HW interrupt.
The fix is to unconditionally turn off the virtual timer on guest exit.
--- arch/arm/kvm/interrupts_head.S | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/arm/kvm/interrupts_head.S +4 -2
@@ -515,8 +515,7 @@ ARM_BE8(rev r6, r6 ) mrc p15, 0, r2, c14, c3, 1 @ CNTV_CTL str r2, [vcpu, #VCPU_TIMER_CNTV_CTL] - bic r2, #1 @ Clear ENABLE - mcr p15, 0, r2, c14, c3, 1 @ CNTV_CTL + isb mrrc p15, 3, rr_lo_hi(r2, r3), c14 @ CNTV_CVAL
@@ -529,6 +528,9 @@ ARM_BE8(rev r6, r6 ) mcrr p15, 4, r2, r2, c14 @ CNTVOFF 1: + mov r2, #0 @ Clear ENABLE + mcr p15, 0, r2, c14, c3, 1 @ CNTV_CTL + @ Allow physical timer/counter access for the host mrc p15, 4, r2, c14, c1, 0 @ CNTHCTL orr r2, r2, #(CNTHCTL_PL1PCEN | CNTHCTL_PL1PCTEN)
Greg Kroah-Hartman
maintainerPATCH 9/258 KVM: x86: trap AMD MSRs for the TSeg base and mask
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
commit 3afb1121800128aae9f5722e50097fcf1a9d4d88 upstream.
These have roughly the same purpose as the SMRR, which we do not need to implement in KVM. However, Linux accesses MSR_K8_TSEG_ADDR at boot, which causes problems when running a Xen dom0 under KVM. Just return 0, meaning that processor protection of SMRAM is not in effect.
--- arch/x86/include/asm/msr-index.h | 1 + arch/x86/kvm/x86.c | 2 ++ 2 files changed, 3 insertions(+)
arch/x86/include/asm/msr-index.h +1 -0
@@ -311,6 +311,7 @@/* C1E active bits in int pending message */ #define K8_INTP_C1E_ACTIVE_MASK 0x18000000#define MSR_K8_TSEG_ADDR 0xc0010112 +#define MSR_K8_TSEG_MASK 0xc0010113#define K8_MTRRFIXRANGE_DRAM_ENABLE 0x00040000/* MtrrFixDramEn bit */ #define K8_MTRRFIXRANGE_DRAM_MODIFY 0x00080000/* MtrrFixDramModEn bit */ #define K8_MTRR_RDMEM_WRMEM_MASK 0x18181818/* Mask: RdMem|WrMem */
arch/x86/kvm/x86.c +2 -0
@@ -2388,6 +2388,8 @@ int kvm_get_msr_common(struct kvm_vcpu *case MSR_IA32_LASTINTFROMIP :case MSR_IA32_LASTINTTOIP :case MSR_K8_SYSCFG : +case MSR_K8_TSEG_ADDR : +case MSR_K8_TSEG_MASK :case MSR_K7_HWCR :case MSR_VM_HSAVE_PA :case MSR_K8_INT_PENDING_MSG :
Greg Kroah-Hartman
maintainerPATCH 12/258 Revert "KVM: x86: apply guest MTRR virtualization on host reserved pages"
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
commit 606decd67049217684e3cb5a54104d51ddd4ef35 upstream.
This reverts commit fd717f11015f673487ffc826e59b2bad69d20fe5. It was reported to cause Machine Check Exceptions (bug 104091).
--- arch/x86/kvm/svm.c | 7 +++++-- arch/x86/kvm/vmx.c | 11 ++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-)
arch/x86/kvm/svm.c +5 -2
@@ -1166,11 +1166,14 @@ static u64 svm_get_mt_mask(struct kvm_vcu8 mtrr;/* -* 1. MMIO: trust guest MTRR, so same as item 3. +* 1. MMIO: always map as UC * 2. No passthrough: always map as WB, and force guest PAT to WB as well * 3. Passthrough: can't guarantee the result, try to trust guest. */ -if (!is_mmio && !kvm_arch_has_assigned_device (vcpu->kvm)) +if (is_mmio) +return _PAGE_NOCACHE; + +if (!kvm_arch_has_assigned_device (vcpu->kvm))return 0 ; mtrr =kvm_mtrr_get_guest_memory_type (vcpu, gfn);
arch/x86/kvm/vmx.c +8 -3
@@ -8634,17 +8634,22 @@ static u64 vmx_get_mt_mask(struct kvm_vcu64 ipat =0 ;/* For VT-d and EPT combination -* 1. MMIO: guest may want to apply WC, trust it. +* 1. MMIO: always map as UC * 2. EPT with VT-d: * a. VT-d without snooping control feature: can't guarantee the -* result, try to trust guest. So the same as item 1. +* result, try to trust guest. * b. VT-d with snooping control feature: snooping control feature of * VT-d engine can guarantee the cache correctness. Just set it * to WB to keep consistent with host. So the same as item 3. * 3. EPT without VT-d: always map as WB and set IPAT=1 to keep * consistent with host MTRR */ -if (!is_mmio && !kvm_arch_has_noncoherent_dma (vcpu->kvm)) { +if (is_mmio) { + cache =MTRR_TYPE_UNCACHABLE ; + goto exit; + } + +if (!kvm_arch_has_noncoherent_dma (vcpu->kvm)) { ipat =VMX_EPT_IPAT_BIT ; cache =MTRR_TYPE_WRBACK ; goto exit;
Greg Kroah-Hartman
maintainerPATCH 14/258 Revert "KVM: SVM: Sync g_pat with guest-written PAT value"
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
commit 625422f60c55bbc368b8568ff925770b36bfc189 upstream.
This reverts commit e098223b789b4a618dacd79e5e0dad4a9d5018d1, which has a dependency on other commits being reverted.
--- arch/x86/kvm/svm.c | 10 ---------- 1 file changed, 10 deletions(-)
arch/x86/kvm/svm.c +0 -10
@@ -3255,16 +3255,6 @@ static int svm_set_msr(struct kvm_vcpu *case MSR_VM_IGNNE :vcpu_unimpl (vcpu,"unimplemented wrmsr: 0x%x data 0x%llx\n" , ecx, data);break ; -case MSR_IA32_CR_PAT : -if (npt_enabled) { -if (!kvm_mtrr_valid (vcpu,MSR_IA32_CR_PAT , data)) -return 1 ; - vcpu->arch.pat = data; -svm_set_guest_pat (svm, &svm->vmcb->save.g_pat); -mark_dirty (svm->vmcb,VMCB_NPT ); -break ; - } -/* fall through */ default :return kvm_set_msr_common (vcpu, msr); }
Greg Kroah-Hartman
maintainerPATCH 16/258 target/iscsi: Fix np_ip bracket issue by removing np_ip
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Grover <[email protected]>
commit 76c28f1fcfeb42b47f798fe498351ee1d60086ae upstream.
Revert commit 1997e6259, which causes double brackets on ipv6 inaddr_any addresses.
Since we have np_sockaddr, if we need a textual representation we can use "%pISc".
Change iscsit_add_network_portal() and iscsit_add_np() signatures to remove *ip_str parameter.
Fix and extend some comments earlier in the function.
Tested to work for :: and ::1 via iscsiadm, previously :: failed, see
https://bugzilla.redhat.com/show_bug.cgi?id=1249107 .
--- drivers/target/iscsi/iscsi_target.c | 33 +++++++++++++-------------- drivers/target/iscsi/iscsi_target.h | 2 - drivers/target/iscsi/iscsi_target_configfs.c | 14 +++++------ drivers/target/iscsi/iscsi_target_login.c | 8 +++--- drivers/target/iscsi/iscsi_target_tpg.c | 15 +++++------- drivers/target/iscsi/iscsi_target_tpg.h | 2 - include/target/iscsi/iscsi_target_core.h | 1 7 files changed, 36 insertions(+), 39 deletions(-)
drivers/target/iscsi/iscsi_target.c +16 -17
@@ -341,7 +341,6 @@ static struct iscsi_np *iscsit_get_np(struct iscsi_np *iscsit_add_np (struct __kernel_sockaddr_storage *sockaddr, -char *ip_str,int network_transport) {struct sockaddr_in *sock_in;
@@ -370,11 +369,9 @@ struct iscsi_np *iscsit_add_np( np->np_flags |=NPF_IP_NETWORK ;if (sockaddr->ss_family ==AF_INET6 ) { sock_in6 = (struct sockaddr_in6 *)sockaddr; -snprintf (np->np_ip,IPV6_ADDRESS_SPACE ,"%s" , ip_str); np->np_port =ntohs (sock_in6->sin6_port); }else { sock_in = (struct sockaddr_in *)sockaddr; -sprintf (np->np_ip,"%s" , ip_str); np->np_port =ntohs (sock_in->sin_port); }
@@ -411,8 +408,8 @@ struct iscsi_np *iscsit_add_np(list_add_tail (&np->np_list, &g_np_list);mutex_unlock (&np_lock); -pr_debug ("CORE[0] - Added Network Portal: %s:%hu on %s\n" , - np->np_ip, np->np_port, np->np_transport->name); +pr_debug ("CORE[0] - Added Network Portal: %pISc:%hu on %s\n" , + &np->np_sockaddr, np->np_port, np->np_transport->name);return np; }
@@ -481,8 +478,8 @@ int iscsit_del_np(struct iscsi_np *np)list_del (&np->np_list);mutex_unlock (&np_lock); -pr_debug ("CORE[0] - Removed Network Portal: %s:%hu on %s\n" , - np->np_ip, np->np_port, np->np_transport->name); +pr_debug ("CORE[0] - Removed Network Portal: %pISc:%hu on %s\n" , + &np->np_sockaddr, np->np_port, np->np_transport->name);iscsit_put_transport (np->np_transport);kfree (np);
@@ -3464,7 +3461,6 @@ iscsit_build_sendtargets_response(struct tpg_np_list) {struct iscsi_np *np = tpg_np->tpg_np;bool inaddr_any =iscsit_check_inaddr_any (np); -char *fmt_str;if (np->np_network_transport != network_transport)continue ;
@@ -3492,15 +3488,18 @@ iscsit_build_sendtargets_response(struct } } -if (np->np_sockaddr.ss_family ==AF_INET6 ) - fmt_str ="TargetAddress=[%s]:%hu,%hu" ; -else - fmt_str ="TargetAddress=%s:%hu,%hu" ; - - len =sprintf (buf, fmt_str, - inaddr_any ? conn->local_ip : np->np_ip, - np->np_port, - tpg->tpgt); +if (inaddr_any) { + len =sprintf (buf,"TargetAddress=" +"%s:%hu,%hu" , + conn->local_ip, + np->np_port, + tpg->tpgt); + }else { + len =sprintf (buf,"TargetAddress=" +"%pISpc,%hu" , + &np->np_sockaddr, + tpg->tpgt); + } len +=1 ;if ((len + payload_len) > buffer_len) {
drivers/target/iscsi/iscsi_target.h +1 -1
@@ -13,7 +13,7 @@ extern int iscsit_deaccess_np(struct iscextern bool iscsit_check_np_match (struct __kernel_sockaddr_storage *,struct iscsi_np *,int );extern struct iscsi_np *iscsit_add_np (struct __kernel_sockaddr_storage *, -char *,int ); +int );extern int iscsit_reset_np_thread (struct iscsi_np *,struct iscsi_tpg_np *,struct iscsi_portal_group *,bool );extern int iscsit_del_np (struct iscsi_np *);
drivers/target/iscsi/iscsi_target_configfs.c +7 -7
@@ -99,7 +99,7 @@ static ssize_t lio_target_np_store_sctp(* Use existing np->np_sockaddr for SCTP network portal reference */ tpg_np_sctp =iscsit_tpg_add_network_portal (tpg, &np->np_sockaddr, - np->np_ip, tpg_np,ISCSI_SCTP_TCP ); + tpg_np,ISCSI_SCTP_TCP );if (!tpg_np_sctp ||IS_ERR (tpg_np_sctp)) goto out; }else {
@@ -177,7 +177,7 @@ static ssize_t lio_target_np_store_iser( } tpg_np_iser =iscsit_tpg_add_network_portal (tpg, &np->np_sockaddr, - np->np_ip, tpg_np,ISCSI_INFINIBAND ); + tpg_np,ISCSI_INFINIBAND );if (IS_ERR (tpg_np_iser)) { rc =PTR_ERR (tpg_np_iser); goto out;
@@ -248,8 +248,8 @@ static struct se_tpg_np *lio_target_callreturn ERR_PTR (-EINVAL ); } str++;/* Skip over leading "[" */ - *str2 ='\0' ;/* Terminate the IPv6 address */ - str2++;/* Skip over the "]" */ + *str2 ='\0' ;/* Terminate the unbracketed IPv6 address */ + str2++;/* Skip over the \0 */ port_str =strstr (str2,":" );if (!port_str) { pr_err("Unable to locate \":port\""
@@ -316,7 +316,7 @@ static struct se_tpg_np *lio_target_call* sys/kernel/config/iscsi/$IQN/$TPG/np/$IP:$PORT/ * */ - tpg_np =iscsit_tpg_add_network_portal (tpg, &sockaddr, str,NULL , + tpg_np =iscsit_tpg_add_network_portal (tpg, &sockaddr,NULL ,ISCSI_TCP );if (IS_ERR (tpg_np)) {iscsit_put_tpg (tpg);
@@ -344,8 +344,8 @@ static void lio_target_call_delnpfromtpg se_tpg = &tpg->tpg_se_tpg;pr_debug ("LIO_Target_ConfigFS: DEREGISTER -> %s TPGT: %hu" -" PORTAL: %s:%hu\n" ,config_item_name (&se_tpg->se_tpg_wwn->wwn_group.cg_item), - tpg->tpgt, tpg_np->tpg_np->np_ip, tpg_np->tpg_np->np_port); +" PORTAL: %pISc:%hu\n" ,config_item_name (&se_tpg->se_tpg_wwn->wwn_group.cg_item), + tpg->tpgt, &tpg_np->tpg_np->np_sockaddr, tpg_np->tpg_np->np_port); ret =iscsit_tpg_del_network_portal (tpg, tpg_np);if (ret <0 )
drivers/target/iscsi/iscsi_target_login.c +4 -4
@@ -823,8 +823,8 @@ static void iscsi_handle_login_thread_tistruct iscsi_np *np = (struct iscsi_np *) data;spin_lock_bh (&np->np_thread_lock); -pr_err ("iSCSI Login timeout on Network Portal %s:%hu\n" , - np->np_ip, np->np_port); +pr_err ("iSCSI Login timeout on Network Portal %pISc:%hu\n" , + &np->np_sockaddr, np->np_port);if (np->np_login_timer_flags &ISCSI_TF_STOP ) {spin_unlock_bh (&np->np_thread_lock);
@@ -1302,8 +1302,8 @@ static int __iscsi_target_login_thread(sspin_lock_bh (&np->np_thread_lock);if (np->np_thread_state !=ISCSI_NP_THREAD_ACTIVE ) {spin_unlock_bh (&np->np_thread_lock); -pr_err ("iSCSI Network Portal on %s:%hu currently not" -" active.\n" , np->np_ip, np->np_port); +pr_err ("iSCSI Network Portal on %pISc:%hu currently not" +" active.\n" , &np->np_sockaddr, np->np_port);iscsit_tx_login_rsp (conn,ISCSI_STATUS_CLS_TARGET_ERR ,ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE ); goto new_sess_out;
drivers/target/iscsi/iscsi_target_tpg.c +7 -8
@@ -460,7 +460,6 @@ static bool iscsit_tpg_check_network_porstruct iscsi_tpg_np *iscsit_tpg_add_network_portal (struct iscsi_portal_group *tpg,struct __kernel_sockaddr_storage *sockaddr, -char *ip_str,struct iscsi_tpg_np *tpg_np_parent,int network_transport) {
@@ -470,8 +469,8 @@ struct iscsi_tpg_np *iscsit_tpg_add_netwif (!tpg_np_parent) {if (iscsit_tpg_check_network_portal (tpg->tpg_tiqn, sockaddr, network_transport)) { -pr_err ("Network Portal: %s already exists on a" -" different TPG on %s\n" , ip_str, +pr_err ("Network Portal: %pISc already exists on a" +" different TPG on %s\n" , sockaddr, tpg->tpg_tiqn->tiqn);return ERR_PTR (-EEXIST ); }
@@ -484,7 +483,7 @@ struct iscsi_tpg_np *iscsit_tpg_add_netwreturn ERR_PTR (-ENOMEM ); } - np =iscsit_add_np (sockaddr, ip_str, network_transport); + np =iscsit_add_np (sockaddr, network_transport);if (IS_ERR (np)) {kfree (tpg_np);return ERR_CAST (np);
@@ -514,8 +513,8 @@ struct iscsi_tpg_np *iscsit_tpg_add_netwspin_unlock (&tpg_np_parent->tpg_np_parent_lock); } -pr_debug ("CORE[%s] - Added Network Portal: %s:%hu,%hu on %s\n" , - tpg->tpg_tiqn->tiqn, np->np_ip, np->np_port, tpg->tpgt, +pr_debug ("CORE[%s] - Added Network Portal: %pISc:%hu,%hu on %s\n" , + tpg->tpg_tiqn->tiqn, &np->np_sockaddr, np->np_port, tpg->tpgt, np->np_transport->name);return tpg_np;
@@ -528,8 +527,8 @@ static int iscsit_tpg_release_np( {iscsit_clear_tpg_np_login_thread (tpg_np, tpg, true); -pr_debug ("CORE[%s] - Removed Network Portal: %s:%hu,%hu on %s\n" , - tpg->tpg_tiqn->tiqn, np->np_ip, np->np_port, tpg->tpgt, +pr_debug ("CORE[%s] - Removed Network Portal: %pISc:%hu,%hu on %s\n" , + tpg->tpg_tiqn->tiqn, &np->np_sockaddr, np->np_port, tpg->tpgt, np->np_transport->name); tpg_np->tpg_np =NULL ;
drivers/target/iscsi/iscsi_target_tpg.h +1 -1
@@ -22,7 +22,7 @@ extern struct iscsi_node_attrib *iscsit_extern void iscsit_tpg_del_external_nps (struct iscsi_tpg_np *);extern struct iscsi_tpg_np *iscsit_tpg_locate_child_np (struct iscsi_tpg_np *,int );extern struct iscsi_tpg_np *iscsit_tpg_add_network_portal (struct iscsi_portal_group *, -struct __kernel_sockaddr_storage *,char *,struct iscsi_tpg_np *, +struct __kernel_sockaddr_storage *,struct iscsi_tpg_np *,int );extern int iscsit_tpg_del_network_portal (struct iscsi_portal_group *,struct iscsi_tpg_np *);
include/target/iscsi/iscsi_target_core.h +0 -1
@@ -776,7 +776,6 @@ struct iscsi_np {enum iscsi_timer_flags_table np_login_timer_flags;u32 np_exports;enum np_flags_table np_flags; -unsigned char np_ip[IPV6_ADDRESS_SPACE ];u16 np_port;spinlock_t np_thread_lock;struct completion np_restart_comp;
Greg Kroah-Hartman
maintainerPATCH 18/258 target: Attach EXTENDED_COPY local I/O descriptors to xcopy_pt_sess
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 4416f89b8cfcb794d040fc3b68e5fb159b7d8d02 upstream.
This patch is a >= v4.1 regression bug-fix where control CDB emulation logic in commit 38b57f82 now expects a se_cmd->se_sess pointer to exist when determining T10-PI support is to be exposed for initiator host ports.
To address this bug, go ahead and add locally generated se_cmd descriptors for copy-offload block-copy to it's own stand-alone se_session nexus, while the parent EXTENDED_COPY se_cmd descriptor remains associated with it's originating se_cmd->se_sess nexus.
Note a valid se_cmd->se_sess is also required for future support of WRITE_INSERT and READ_STRIP software emulation when submitting backend I/O to se_device that exposes T10-PI suport.
--- drivers/target/target_core_xcopy.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/target/target_core_xcopy.c +4 -2
@@ -450,6 +450,8 @@ int target_xcopy_setup_pt(void)memset (&xcopy_pt_sess,0 ,sizeof (struct se_session ));INIT_LIST_HEAD (&xcopy_pt_sess.sess_list);INIT_LIST_HEAD (&xcopy_pt_sess.sess_acl_list); +INIT_LIST_HEAD (&xcopy_pt_sess.sess_cmd_list); +spin_lock_init (&xcopy_pt_sess.sess_cmd_lock); xcopy_pt_nacl.se_tpg = &xcopy_pt_tpg; xcopy_pt_nacl.nacl_sess = &xcopy_pt_sess;
@@ -644,7 +646,7 @@ static int target_xcopy_read_source(pr_debug ("XCOPY: Built READ_16: LBA: %llu Sectors: %u Length: %u\n" , (unsigned long long )src_lba, src_sectors, length); -transport_init_se_cmd (se_cmd, &xcopy_pt_tfo,NULL , length, +transport_init_se_cmd (se_cmd, &xcopy_pt_tfo, &xcopy_pt_sess, length,DMA_FROM_DEVICE ,0 , &xpt_cmd->sense_buffer[0 ]); xop->src_pt_cmd = xpt_cmd;
@@ -704,7 +706,7 @@ static int target_xcopy_write_destinatiopr_debug ("XCOPY: Built WRITE_16: LBA: %llu Sectors: %u Length: %u\n" , (unsigned long long )dst_lba, dst_sectors, length); -transport_init_se_cmd (se_cmd, &xcopy_pt_tfo,NULL , length, +transport_init_se_cmd (se_cmd, &xcopy_pt_tfo, &xcopy_pt_sess, length,DMA_TO_DEVICE ,0 , &xpt_cmd->sense_buffer[0 ]); xop->dst_pt_cmd = xpt_cmd;
Greg Kroah-Hartman
maintainerPATCH 20/258 iser-target: remove command with state ISTATE_REMOVE
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jenny Derzhavetz <[email protected]>
commit a4c15cd957cbd728f685645de7a150df5912591a upstream.
As documented in iscsit_sequence_cmd:
/*
* Existing callers for iscsit_sequence_cmd() will silently
* ignore commands with CMDSN_LOWER_THAN_EXP, so force this
* return for CMDSN_MAXCMDSN_OVERRUN as well..
*/
We need to silently finish a command when it's in ISTATE_REMOVE. This fixes an teardown hang we were seeing where a mis-behaved initiator (triggered by allocation error injections) sent us a cmdsn which was lower than expected.
--- drivers/infiniband/ulp/isert/ib_isert.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/infiniband/ulp/isert/ib_isert.c +8 -1
@@ -3012,9 +3012,16 @@ isert_get_dataout(struct iscsi_conn *constatic int isert_immediate_queue (struct iscsi_conn *conn,struct iscsi_cmd *cmd,int state) { -int ret; +struct isert_cmd *isert_cmd =iscsit_priv_cmd (cmd); +int ret =0 ;switch (state) { +case ISTATE_REMOVE : +spin_lock_bh (&conn->cmd_lock); +list_del_init (&cmd->i_conn_node); +spin_unlock_bh (&conn->cmd_lock); +isert_put_cmd (isert_cmd, true); +break ;case ISTATE_SEND_NOPIN_WANT_RESPONSE : ret =isert_put_nopin (cmd, conn, false);break ;
Greg Kroah-Hartman
maintainerPATCH 21/258 iser-target: Put the reference on commands waiting for unsol data
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jenny Derzhavetz <[email protected]>
commit 3e03c4b01da3e6a5f3081eb0aa252490fe83e352 upstream.
The iscsi target core teardown sequence calls wait_conn for all active commands to finish gracefully by:
- move the queue-pair to error state
- drain all the completions
- wait for the core to finish handling all session commands
However, when tearing down a session while there are sequenced commands that are still waiting for unsolicited data outs, we can block forever as these are missing an extra reference put.
We basically need the equivalent of iscsit_free_queue_reqs_for_conn() which is called after wait_conn has returned. Address this by an explicit walk on conn_cmd_list and put the extra reference.
--- drivers/infiniband/ulp/isert/ib_isert.c | 38 +++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-)
drivers/infiniband/ulp/isert/ib_isert.c +37 -1
@@ -3386,6 +3386,41 @@ isert_wait4flush(struct isert_conn *iserwait_for_completion (&isert_conn->wait_comp_err); } +/** +* isert_put_unsol_pending_cmds() - Drop commands waiting for +* unsolicitate dataout +* @conn: iscsi connection +* +* We might still have commands that are waiting for unsolicited +* dataouts messages. We must put the extra reference on those +* before blocking on the target_wait_for_session_cmds +*/ +static void +isert_put_unsol_pending_cmds (struct iscsi_conn *conn) +{ +struct iscsi_cmd *cmd, *tmp; +static LIST_HEAD (drop_cmd_list); + +spin_lock_bh (&conn->cmd_lock); +list_for_each_entry_safe (cmd, tmp, &conn->conn_cmd_list, i_conn_node) { +if ((cmd->cmd_flags &ICF_NON_IMMEDIATE_UNSOLICITED_DATA ) && + (cmd->write_data_done < conn->sess->sess_ops->FirstBurstLength) && + (cmd->write_data_done < cmd->se_cmd.data_length)) +list_move_tail (&cmd->i_conn_node, &drop_cmd_list); + } +spin_unlock_bh (&conn->cmd_lock); + +list_for_each_entry_safe (cmd, tmp, &drop_cmd_list, i_conn_node) { +list_del_init (&cmd->i_conn_node); +if (cmd->i_state !=ISTATE_REMOVE ) { +struct isert_cmd *isert_cmd =iscsit_priv_cmd (cmd); + +isert_info ("conn %p dropping cmd %p\n" , conn, cmd); +isert_put_cmd (isert_cmd, true); + } + } +} +static void isert_wait_conn (struct iscsi_conn *conn) {struct isert_conn *isert_conn = conn->context;
@@ -3404,8 +3439,9 @@ static void isert_wait_conn(struct iscsiisert_conn_terminate (isert_conn);mutex_unlock (&isert_conn->mutex); -isert_wait4cmds (conn);isert_wait4flush (isert_conn); +isert_put_unsol_pending_cmds (conn); +isert_wait4cmds (conn);isert_wait4logout (isert_conn);queue_work (isert_release_wq, &isert_conn->release_work);
Greg Kroah-Hartman
maintainerPATCH 22/258 toshiba_acpi: Fix hotkeys registration on some toshiba models
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Azael Avalos <[email protected]>
commit 53147b6cabee5e8d1997b5682fcc0c3b72ddf9c2 upstream.
Commit a2b3471b5b13 ("toshiba_acpi: Use the Hotkey Event Type function for keymap choosing") changed the *setup_keyboard function to query for the Hotkey Event Type to help choose the correct keymap, but turns out that here are certain Toshiba models out there not implementing this feature, and thus, failing to continue the input device registration and leaving such laptops without hotkey support.
This patch changes such check, and instead of returning an error if the Hotkey Event Type is not present, we simply inform userspace about it, changing the message printed from err to notice, making the function responsible for registering the input device to continue.
This issue was found on a Toshiba Portege Z30-B, but there might be some other models out there affected by this regression as well.
--- drivers/platform/x86/toshiba_acpi.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/platform/x86/toshiba_acpi.c +3 -5
@@ -2408,11 +2408,9 @@ static int toshiba_acpi_setup_keyboard(sif (error)return error; - error =toshiba_hotkey_event_type_get (dev, &events_type); -if (error) { -pr_err ("Unable to query Hotkey Event Type\n" ); -return error; - } +if (toshiba_hotkey_event_type_get (dev, &events_type)) +pr_notice ("Unable to query Hotkey Event Type\n" ); + dev->hotkey_event_type = events_type; dev->hotkey_dev =input_allocate_device ();
Greg Kroah-Hartman
maintainerPATCH 23/258 perf/x86/intel: Fix constraint access
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
commit ebfb4988f0378e2ac3b4a0aa1ea20d724293f392 upstream.
Sasha reported that we can get here with .idx==-1, and cpuc->event_constraints unallocated.
--- arch/x86/kernel/cpu/perf_event_intel.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/x86/kernel/cpu/perf_event_intel.c +4 -1
@@ -2102,9 +2102,12 @@ static struct event_constraint * intel_get_event_constraints(struct cpu_hw_events *cpuc, int idx, struct perf_event *event) { - struct event_constraint *c1 = cpuc->event_constraint[idx]; + struct event_constraint *c1 = NULL;struct event_constraint *c2; +if (idx >=0 )/* fake does < 0 */ + c1 = cpuc->event_constraint[idx]; +/* * first time only * - static constraint: no change across incremental scheduling calls
Greg Kroah-Hartman
maintainerPATCH 25/258 locking/qspinlock/x86: Only emit the test-and-set fallback when building guest support
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
commit a6b277857fd2c990bc208ca1958d3f34d26052f7 upstream.
Only emit the test-and-set fallback for Hypervisors lacking PARAVIRT_SPINLOCKS support when building for guests.
arch/x86/include/asm/qspinlock.h +2 -1
@@ -39,8 +39,8 @@ static inline void queued_spin_unlock(struct qspinlock *lock) }#endif +#ifdef CONFIG_PARAVIRT #define virt_spin_lock virt_spin_lock -static inline bool virt_spin_lock (struct qspinlock *lock) {if (!static_cpu_has (X86_FEATURE_HYPERVISOR ))
@@ -59,6 +59,7 @@ static inline bool virt_spin_lock(struct qspinlock *lock) return true; } +#endif /* CONFIG_PARAVIRT */ #include <asm-generic/qspinlock.h>
Greg Kroah-Hartman
maintainerPATCH 26/258 perf tools: Fix copying of /proc/kcore
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit b5cabbcbd157a4bf5a92dfc85134999a3b55342d upstream.
A copy of /proc/kcore containing the kernel text can be made to the buildid cache. e.g.
perf buildid-cache -v -k /proc/kcore
To workaround objdump limitations, a copy is also made when annotating against /proc/kcore.
The copying process stops working from libelf about v1.62 onwards (the problem was found with v1.63).
The cause is that a call to gelf_getphdr() in kcore__add_phdr() fails because additional validation has been added to gelf_getphdr().
The use of gelf_getphdr() is a misguided attempt to get default initialization of the Gelf_Phdr structure. That should not be necessary because every member of the Gelf_Phdr structure is subsequently assigned. So just remove the call to gelf_getphdr().
Similarly, a call to gelf_getehdr() in gelf_kcore__init() can be removed also.
Committer notes:
Note to [email protected], from Adrian in the cover letter for this patchkit:
The "Fix copying of /proc/kcore" problem goes back to v3.13 if you think it is important enough for stable.
--- tools/perf/util/symbol-elf.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-)
tools/perf/util/symbol-elf.c +12 -21
@@ -1260,8 +1260,6 @@ out_close:static int kcore__init (struct kcore *kcore,char *filename,int elfclass,bool temp) { -GElf_Ehdr *ehdr; - kcore->elfclass = elfclass;if (temp)
@@ -1278,9 +1276,7 @@ static int kcore__init(struct kcore *kcoif (!gelf_newehdr (kcore->elf, elfclass)) goto out_end; - ehdr =gelf_getehdr (kcore->elf, &kcore->ehdr); -if (!ehdr) - goto out_end; +memset (&kcore->ehdr,0 ,sizeof (GElf_Ehdr));return 0 ;
@@ -1337,23 +1333,18 @@ static int kcore__copy_hdr(struct kcorestatic int kcore__add_phdr (struct kcore *kcore,int idx,off_t offset,u64 addr,u64 len) { -GElf_Phdr gphdr; -GElf_Phdr *phdr; - - phdr =gelf_getphdr (kcore->elf, idx, &gphdr); -if (!phdr) -return -1 ; - - phdr->p_type =PT_LOAD ; - phdr->p_flags =PF_R |PF_W |PF_X ; - phdr->p_offset = offset; - phdr->p_vaddr = addr; - phdr->p_paddr =0 ; - phdr->p_filesz = len; - phdr->p_memsz = len; - phdr->p_align = page_size; +GElf_Phdr phdr = { + .p_type =PT_LOAD , + .p_flags =PF_R |PF_W |PF_X , + .p_offset = offset, + .p_vaddr = addr, + .p_paddr =0 , + .p_filesz = len, + .p_memsz = len, + .p_align = page_size, + }; -if (!gelf_update_phdr (kcore->elf, idx, phdr)) +if (!gelf_update_phdr (kcore->elf, idx, &phdr))return -1 ;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 27/258 ARM: 8401/1: perf: Set affinity for PPI based PMUs
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Boyd <[email protected]>
commit 8ded1e1a92daa96307e4b84b707fee5993bc6047 upstream.
For PPI based PMUs, we bail out early in of_pmu_irq_cfg() without setting the PMU's supported_cpus bitmap. This causes the smp_call_function_any() in armv7_probe_num_events() to fail. Set the bitmap to be all CPUs so that we properly probe PMUs that use PPIs.
--- arch/arm/kernel/perf_event.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/kernel/perf_event.c +3 -1
@@ -795,8 +795,10 @@ static int of_pmu_irq_cfg(struct arm_pmu/* Don't bother with PPIs; they're already affine */ irq =platform_get_irq (pdev,0 ); -if (irq >=0 &&irq_is_percpu (irq)) +if (irq >=0 &&irq_is_percpu (irq)) { +cpumask_setall (&pmu->supported_cpus);return 0 ; + } irqs =kcalloc (pdev->num_resources,sizeof (*irqs),GFP_KERNEL );if (!irqs)
Greg Kroah-Hartman
maintainerPATCH 28/258 perf hists: Update the column width for the "srcline" sort key
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
commit e8e6d37e73e6b950c891c780745460b87f4755b6 upstream.
When we introduce a new sort key, we need to update the hists__calc_col_len() function accordingly, otherwise the width will be limited to strlen(header).
We can't update it when obtaining a line value for a column (for instance, in sort__srcline_cmp()), because we reset it all when doing a resort (see hists__output_recalc_col_len()), so we need to, from what is in the hist_entry fields, set each of the column widths.
--- tools/perf/util/hist.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/util/hist.c +3 -0
@@ -151,6 +151,9 @@ void hists__calc_col_len(struct hists *hhists__new_col_len (hists,HISTC_LOCAL_WEIGHT ,12 );hists__new_col_len (hists,HISTC_GLOBAL_WEIGHT ,12 ); +if (h->srcline) +hists__new_col_len (hists,HISTC_SRCLINE ,strlen (h->srcline)); +if (h->transaction)hists__new_col_len (hists,HISTC_TRANSACTION ,hist_entry__transaction_len ());
Greg Kroah-Hartman
maintainerPATCH 29/258 perf stat: Get correct cpu id for print_aggr
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kan Liang <[email protected]>
commit 601083cffb7cabdcc55b8195d732f0f7028570fa upstream.
print_aggr() fails to print per-core/per-socket statistics after commit 582ec0829b3d ("perf stat: Fix per-socket output bug for uncore events") if events have differnt cpus. Because in print_aggr(), aggr_get_id needs index (not cpu id) to find core/pkg id. Also, evsel cpu maps should be used to get aggregated id.
Here is an example:
Counting events cycles,uncore_imc_0/cas_count_read/. (Uncore event has cpumask 0,18)
$ perf stat -e cycles,uncore_imc_0/cas_count_read/ -C0,18 --per-core sleep 2
Without this patch, it failes to get CPU 18 result.
Performance counter stats for 'CPU(s) 0,18':
S0-C0 1 7526851 cycles S0-C0 1 1.05 MiB uncore_imc_0/cas_count_read/ S1-C0 0 <not counted> cycles S1-C0 0 <not counted> MiB uncore_imc_0/cas_count_read/
With this patch, it can get both CPU0 and CPU18 result.
Performance counter stats for 'CPU(s) 0,18':
S0-C0 1 6327768 cycles S0-C0 1 0.47 MiB uncore_imc_0/cas_count_read/ S1-C0 1 330228 cycles S1-C0 1 0.29 MiB uncore_imc_0/cas_count_read/
--- tools/perf/builtin-stat.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
tools/perf/builtin-stat.c +2 -3
@@ -694,7 +694,7 @@ static void abs_printout(int id, int nr,static void print_aggr (char *prefix) {struct perf_evsel *counter; -int cpu, cpu2, s, s2, id, nr; +int cpu, s, s2, id, nr;double uval;u64 ena, run, val;
@@ -707,8 +707,7 @@ static void print_aggr(char *prefix) val = ena = run =0 ; nr =0 ;for (cpu =0 ; cpu <perf_evsel__nr_cpus (counter); cpu++) { - cpu2 =perf_evsel__cpus (counter)->map[cpu]; - s2 =aggr_get_id (evsel_list->cpus, cpu2); + s2 =aggr_get_id (perf_evsel__cpus (counter), cpu);if (s2 != id)continue ; val +=perf_counts (counter->counts, cpu,0 )->val;
Greg Kroah-Hartman
maintainerPATCH 30/258 perf tools: Add missing forward declaration of struct map to probe-event.h
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Nan <[email protected]>
commit 5a023b57a8e96327925a39312bccc443a7c540b6 upstream.
Commit 7b6ff0bdbf4f7f429c2116cca92a6d171217449e ("perf probe ppc64le:
Fixup function entry if using kallsyms lookup") adds 'struct map' into probe-event.h but not forward declares it. This patch fixes it.
--- tools/perf/util/probe-event.h | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/probe-event.h +2 -0
@@ -106,6 +106,8 @@ struct variable_list {struct strlist *vars;/* Available variables */ }; +struct map ; +/* Command string to events */ extern int parse_perf_probe_command (const char *cmd,struct perf_probe_event *pev);
Greg Kroah-Hartman
maintainerPATCH 32/258 perf tools: Fix parse_events_add_pmu caller
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
commit 5ad4da4302712fba10624d28cb6c269fee592b69 upstream.
Following commit changed parse_events_add_pmu interface:
36adec85a86f perf tools: Change parse_events_add_pmu interface
but forgot to change one caller. Because of lessen compilation rules for the bison parser, the compiler did not warn on that.
--- tools/perf/util/parse-events.y | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/parse-events.y +1 -1
@@ -255,7 +255,7 @@ PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF se list_add_tail(&term->list, head); ALLOC_LIST(list); - ABORT_ON(parse_events_add_pmu(list, &data->idx, "cpu", head)); + ABORT_ON(parse_events_add_pmu(data, list, "cpu", head)); parse_events__free_terms(head); $$ = list; }
Greg Kroah-Hartman
maintainerPATCH 33/258 perf header: Fixup reading of HEADER_NRCPUS feature
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
commit caa470475d9b59eeff093ae650800d34612c4379 upstream.
The original patch introducing this header wrote the number of CPUs available and online in one order and then swapped those values when reading, fix it.
Before:
# perf record usleep 1 # perf report --header-only | grep 'nrcpus \(online\|avail\)' # nrcpus online : 4 # nrcpus avail : 4 # echo 0 > /sys/devices/system/cpu/cpu2/online # perf record usleep 1 # perf report --header-only | grep 'nrcpus \(online\|avail\)' # nrcpus online : 4 # nrcpus avail : 3 # echo 0 > /sys/devices/system/cpu/cpu1/online # perf record usleep 1 # perf report --header-only | grep 'nrcpus \(online\|avail\)' # nrcpus online : 4 # nrcpus avail : 2
After the fix, bringing back the CPUs online:
# perf report --header-only | grep 'nrcpus \(online\|avail\)' # nrcpus online : 2 # nrcpus avail : 4 # echo 1 > /sys/devices/system/cpu/cpu2/online # perf record usleep 1 # perf report --header-only | grep 'nrcpus \(online\|avail\)' # nrcpus online : 3 # nrcpus avail : 4 # echo 1 > /sys/devices/system/cpu/cpu1/online # perf record usleep 1 # perf report --header-only | grep 'nrcpus \(online\|avail\)' # nrcpus online : 4 # nrcpus avail : 4
--- tools/perf/util/header.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/header.c +2 -2
@@ -1442,7 +1442,7 @@ static int process_nrcpus(struct perf_fiif (ph->needs_swap) nr =bswap_32 (nr); - ph->env.nr_cpus_online = nr; + ph->env.nr_cpus_avail = nr; ret =readn (fd, &nr,sizeof (nr));if (ret !=sizeof (nr))
@@ -1451,7 +1451,7 @@ static int process_nrcpus(struct perf_fiif (ph->needs_swap) nr =bswap_32 (nr); - ph->env.nr_cpus_avail = nr; + ph->env.nr_cpus_online = nr;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 34/258 perf probe: Use existing routine to look for a kernel module by dso->short_name
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
commit 266fa2b22294909ddf6e7d2f8acfe07adf9fd978 upstream.
We have map_groups__find_by_name() to look at the list of modules that are in place for a given machine, so use it instead of traversing the machine dso list, which also includes DSOs for userspace.
When merging the user and kernel DSO lists a bug was introduced where 'perf probe' stopped being able to add probes to modules using its short name:
# perf probe -m usbnet --add usbnet_start_xmit
usbnet_start_xmit is out of .text, skip it.
Error: Failed to add events.
#With this fix it works again:
# perf probe -m usbnet --add usbnet_start_xmit
Added new event:
probe:usbnet_start_xmit (on usbnet_start_xmit in usbnet)You can now use it in all perf tools, such as:
perf record -e probe:usbnet_start_xmit -aR sleep 1
#
--- tools/perf/util/probe-event.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
tools/perf/util/probe-event.c +7 -6
@@ -274,12 +274,13 @@ static int kernel_get_module_dso(const cint ret =0 ;if (module) { -list_for_each_entry (dso, &host_machine->dsos.head, node) { -if (!dso->kernel) -continue ; -if (strncmp (dso->short_name +1 , module, - dso->short_name_len -2 ) ==0 ) - goto found; +char module_name[128 ]; + +snprintf (module_name,sizeof (module_name),"[%s]" , module); + map =map_groups__find_by_name (&host_machine->kmaps,MAP__FUNCTION , module_name); +if (map) { + dso = map->dso; + goto found; }pr_debug ("Failed to find module %s.\n" , module);return -ENOENT ;
Greg Kroah-Hartman
maintainerPATCH 35/258 ARCv2: [axs103_smp] Reduce clk for SMP FPGA configs
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vineet Gupta <[email protected]>
commit 3ebb0540c20d6670396ccee9ff6794c095fa9311 upstream.
Newer bitfiles needs the reduced clk even for SMP builds
--- arch/arc/plat-axs10x/axs10x.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arc/plat-axs10x/axs10x.c +2 -0
@@ -402,6 +402,8 @@ static void __init axs103_early_init(voiunsigned int num_cores = (read_aux_reg (ARC_REG_MCIP_BCR ) >>16 ) &0x3F ;if (num_cores >2 )arc_set_core_freq (50 *1000000 ); +else if (num_cores ==2 ) +arc_set_core_freq (75 *1000000 );#endif switch (arc_get_core_freq ()/1000000 ) {
Greg Kroah-Hartman
maintainerPATCH 36/258 watchdog: sunxi: fix activation of system reset
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Francesco Lavra <[email protected]>
commit 0919e4445190da18496d31aac08b90828a47d45f upstream.
Commit f2147de33470 ("watchdog: sunxi: support parameterized compatible strings") introduced a regression in sunxi_wdt_start(), by which the system reset function of the watchdog is not enabled upon starting the watchdog. As a result, the system is not reset when the watchdog expires. Fix it.
--- drivers/watchdog/sunxi_wdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/watchdog/sunxi_wdt.c +1 -1
@@ -184,7 +184,7 @@ static int sunxi_wdt_start(struct watchd/* Set system reset function */ reg =readl (wdt_base + regs->wdt_cfg); reg &= ~(regs->wdt_reset_mask); - reg |= ~(regs->wdt_reset_val); + reg |= regs->wdt_reset_val;writel (reg, wdt_base + regs->wdt_cfg);/* Enable watchdog */
Greg Kroah-Hartman
maintainerPATCH 37/258 watchdog: imgpdc: Unregister restart handler on remove
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ezequiel Garcia <[email protected]>
commit 8a340dbbc4b10fe07a924e91979bfc93e966dd65 upstream.
Commit c631f20068 ("watchdog: imgpdc: Add reboot support") introduced a restart handler but forgot to unregister it on driver removal. Fix it.
--- drivers/watchdog/imgpdc_wdt.c | 1 + 1 file changed, 1 insertion(+)
drivers/watchdog/imgpdc_wdt.c +1 -0
@@ -316,6 +316,7 @@ static int pdc_wdt_remove(struct platfor {struct pdc_wdt_dev *pdc_wdt =platform_get_drvdata (pdev); +unregister_restart_handler (&pdc_wdt->restart_handler);pdc_wdt_stop (&pdc_wdt->wdt_dev);watchdog_unregister_device (&pdc_wdt->wdt_dev);clk_disable_unprepare (pdc_wdt->wdt_clk);
Greg Kroah-Hartman
maintainerPATCH 38/258 sched: access local runqueue directly in single_task_running
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dominik Dingel <[email protected]>
commit 00cc1633816de8c95f337608a1ea64e228faf771 upstream.
Commit 2ee507c47293 ("sched: Add function single_task_running to let a task check if it is the only task running on a cpu") referenced the current runqueue with the smp_processor_id. When CONFIG_DEBUG_PREEMPT is enabled, that is only allowed if preemption is disabled or the currrent task is bound to the local cpu (e.g. kernel worker).
With commit f78195129963 ("kvm: add halt_poll_ns module parameter") KVM calls single_task_running. If CONFIG_DEBUG_PREEMPT is enabled that generates a lot of kernel messages.
To avoid adding preemption in that cases, as it would limit the usefulness, we change single_task_running to access directly the cpu local runqueue.
--- kernel/sched/core.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
kernel/sched/core.c +11 -4
@@ -2614,13 +2614,20 @@ unsigned long nr_running(void)/* * Check if only the current task is running on the cpu. +* +* Caution: this function does not check that the caller has disabled +* preemption, thus the result might have a time-of-check-to-time-of-use +* race. The caller is responsible to use it correctly, for example: +* +* - from a non-preemptable section (of course) +* +* - from a thread that is bound to a single CPU +* +* - in a loop with very short iterations (e.g. a polling loop) */ bool single_task_running (void ) { -if (cpu_rq (smp_processor_id ())->nr_running ==1 ) -return true; -else -return false; +return raw_rq ()->nr_running ==1 ; }EXPORT_SYMBOL (single_task_running);
Greg Kroah-Hartman
maintainerPATCH 39/258 hwmon: (nct6775) Swap STEP_UP_TIME and STEP_DOWN_TIME registers for most chips
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
commit 728d29400488d54974d3317fe8a232b45fdb42ee upstream.
The STEP_UP_TIME and STEP_DOWN_TIME registers are swapped for all chips but NCT6775.
--- drivers/hwmon/nct6775.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
drivers/hwmon/nct6775.c +10 -6
@@ -354,6 +354,10 @@ static const u16 NCT6775_REG_TEMP_CRIT[A/* NCT6776 specific data */ +/* STEP_UP_TIME and STEP_DOWN_TIME regs are swapped for all chips but NCT6775 */ +#define NCT6776_REG_FAN_STEP_UP_TIME NCT6775_REG_FAN_STEP_DOWN_TIME +#define NCT6776_REG_FAN_STEP_DOWN_TIME NCT6775_REG_FAN_STEP_UP_TIME +static const s8 NCT6776_ALARM_BITS [] = {0 ,1 ,2 ,3 ,8 ,21 ,20 ,16 ,/* in0.. in7 */ 17 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,/* in8..in14 */
@@ -3528,8 +3532,8 @@ static int nct6775_probe(struct platform data->REG_FAN_PULSES =NCT6776_REG_FAN_PULSES ; data->FAN_PULSE_SHIFT =NCT6775_FAN_PULSE_SHIFT ; data->REG_FAN_TIME[0 ] =NCT6775_REG_FAN_STOP_TIME ; - data->REG_FAN_TIME[1 ] =NCT6775_REG_FAN_STEP_UP_TIME ; - data->REG_FAN_TIME[2 ] =NCT6775_REG_FAN_STEP_DOWN_TIME ; + data->REG_FAN_TIME[1 ] =NCT6776_REG_FAN_STEP_UP_TIME ; + data->REG_FAN_TIME[2 ] =NCT6776_REG_FAN_STEP_DOWN_TIME ; data->REG_TOLERANCE_H =NCT6776_REG_TOLERANCE_H ; data->REG_PWM[0 ] =NCT6775_REG_PWM ; data->REG_PWM[1 ] =NCT6775_REG_FAN_START_OUTPUT ;
@@ -3600,8 +3604,8 @@ static int nct6775_probe(struct platform data->REG_FAN_PULSES =NCT6779_REG_FAN_PULSES ; data->FAN_PULSE_SHIFT =NCT6775_FAN_PULSE_SHIFT ; data->REG_FAN_TIME[0 ] =NCT6775_REG_FAN_STOP_TIME ; - data->REG_FAN_TIME[1 ] =NCT6775_REG_FAN_STEP_UP_TIME ; - data->REG_FAN_TIME[2 ] =NCT6775_REG_FAN_STEP_DOWN_TIME ; + data->REG_FAN_TIME[1 ] =NCT6776_REG_FAN_STEP_UP_TIME ; + data->REG_FAN_TIME[2 ] =NCT6776_REG_FAN_STEP_DOWN_TIME ; data->REG_TOLERANCE_H =NCT6776_REG_TOLERANCE_H ; data->REG_PWM[0 ] =NCT6775_REG_PWM ; data->REG_PWM[1 ] =NCT6775_REG_FAN_START_OUTPUT ;
@@ -3677,8 +3681,8 @@ static int nct6775_probe(struct platform data->REG_FAN_PULSES =NCT6779_REG_FAN_PULSES ; data->FAN_PULSE_SHIFT =NCT6775_FAN_PULSE_SHIFT ; data->REG_FAN_TIME[0 ] =NCT6775_REG_FAN_STOP_TIME ; - data->REG_FAN_TIME[1 ] =NCT6775_REG_FAN_STEP_UP_TIME ; - data->REG_FAN_TIME[2 ] =NCT6775_REG_FAN_STEP_DOWN_TIME ; + data->REG_FAN_TIME[1 ] =NCT6776_REG_FAN_STEP_UP_TIME ; + data->REG_FAN_TIME[2 ] =NCT6776_REG_FAN_STEP_DOWN_TIME ; data->REG_TOLERANCE_H =NCT6776_REG_TOLERANCE_H ; data->REG_PWM[0 ] =NCT6775_REG_PWM ; data->REG_PWM[1 ] =NCT6775_REG_FAN_START_OUTPUT ;
Greg Kroah-Hartman
maintainerPATCH 40/258 ARM: fix Thumb2 signal handling when ARMv6 is enabled
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Russell King <[email protected]>
commit 9b55613f42e8d40d5c9ccb8970bde6af4764b2ab upstream.
When a kernel is built covering ARMv6 to ARMv7, we omit to clear the IT state when entering a signal handler. This can cause the first few instructions to be conditionally executed depending on the parent context.
In any case, the original test for >= ARMv7 is broken - ARMv6 can have Thumb-2 support as well, and an ARMv6T2 specific build would omit this code too.
Relax the test back to ARMv6 or greater. This results in us always clearing the IT state bits in the PSR, even on CPUs where these bits are reserved. However, they're reserved for the IT state, so this should cause no harm.
--- arch/arm/kernel/signal.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
arch/arm/kernel/signal.c +10 -5
@@ -343,12 +343,17 @@ setup_return(struct pt_regs *regs, struc*/ thumb = handler &1 ; -#if __LINUX_ARM_ARCH__ >=7 +#if __LINUX_ARM_ARCH__ >=6 /* -* Clear the If-Then Thumb-2 execution state -* ARM spec requires this to be all 000s in ARM mode -* Snapdragon S4/Krait misbehaves on a Thumb=>ARM -* signal transition without this. +* Clear the If-Then Thumb-2 execution state. ARM spec +* requires this to be all 000s in ARM mode. Snapdragon +* S4/Krait misbehaves on a Thumb=>ARM signal transition +* without this. +* +* We must do this whenever we are running on a Thumb-2 +* capable CPU, which includes ARMv6T2. However, we elect +* to do this whenever we're on an ARMv6 or later CPU for +* simplicity. */ cpsr &= ~PSR_IT_MASK ;#endif
Greg Kroah-Hartman
maintainerPATCH 41/258 ARM: 8429/1: disable GCC SRA optimization
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit a077224fd35b2f7fbc93f14cf67074fc792fbac2 upstream.
While working on the 32-bit ARM port of UEFI, I noticed a strange corruption in the kernel log. The following snprintf() statement (in drivers/firmware/efi/efi.c:efi_md_typeattr_format())
snprintf(pos, size, "|%3s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]",
was producing the following output in the log:
| | | | | |WB|WT|WC|UC] | | | | | |WB|WT|WC|UC] | | | | | |WB|WT|WC|UC] |RUN| | | | |WB|WT|WC|UC]* |RUN| | | | |WB|WT|WC|UC]* | | | | | |WB|WT|WC|UC] |RUN| | | | |WB|WT|WC|UC]* | | | | | |WB|WT|WC|UC] |RUN| | | | | | | |UC] |RUN| | | | | | | |UC]
As it turns out, this is caused by incorrect code being emitted for the string() function in lib/vsprintf.c. The following code
if (!(spec.flags & LEFT)) {
while (len < spec.field_width--) {
if (buf < end)
*buf = ' ';
++buf;
}
}
for (i = 0; i < len; ++i) {
if (buf < end)
*buf = *s;
++buf; ++s;
}
while (len < spec.field_width--) {
if (buf < end)
*buf = ' ';
++buf;
}when called with len == 0, triggers an issue in the GCC SRA optimization pass (Scalar Replacement of Aggregates), which handles promotion of signed struct members incorrectly. This is a known but as yet unresolved issue.
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65932). In this particular case, it is causing the second while loop to be executed erroneously a single time, causing the additional space characters to be printed.
So disable the optimization by passing -fno-ipa-sra.
--- arch/arm/Makefile | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm/Makefile +8 -0
@@ -54,6 +54,14 @@ AS += -EL LD += -EL endif +# +# The Scalar Replacement of Aggregates (SRA) optimization pass in GCC 4.9 and +# later may result in code being generated that handles signed short and signed +# char struct members incorrectly. So disable it. +# (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65932) +# +KBUILD_CFLAGS += $(call cc-option,-fno-ipa-sra) + # This selects which instruction set is used. # Note that GCC does not numerically define an architecture version # macro, but instead defines a whole series of macros which makes
Greg Kroah-Hartman
maintainerPATCH 42/258 windfarm: decrement client count when unregistering
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Bolle <[email protected]>
commit fe2b592173ff0274e70dc44d1d28c19bb995aa7c upstream.
wf_unregister_client() increments the client count when a client unregisters. That is obviously incorrect. Decrement that client count instead.
--- drivers/macintosh/windfarm_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/macintosh/windfarm_core.c +1 -1
@@ -435,7 +435,7 @@ int wf_unregister_client(struct notifier {mutex_lock (&wf_lock);blocking_notifier_chain_unregister (&wf_client_list, nb); - wf_client_count++; + wf_client_count--;if (wf_client_count ==0 )wf_stop_thread ();mutex_unlock (&wf_lock);
Greg Kroah-Hartman
maintainerPATCH 43/258 ARM: 8425/1: kgdb: Dont try to stop the machine when setting breakpoints
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Doug Anderson <[email protected]>
commit 7ae85dc7687c7e7119053d83d02c560ea217b772 upstream.
In (23a4e40 arm: kgdb: Handle read-only text / modules) we moved to using patch_text() to set breakpoints so that we could handle the case when we had CONFIG_DEBUG_RODATA. That patch used patch_text(). Unfortunately, patch_text() assumes that we're not in atomic context when it runs since it needs to grab a mutex and also wait for other CPUs to stop (which it does with a completion).
This would result in a stack crawl if you had CONFIG_DEBUG_ATOMIC_SLEEP and tried to set a breakpoint in kgdb. The crawl looked something like:
BUG: scheduling while atomic: swapper/0/0/0x00010007 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.2.0-rc7-00133-geb63b34 #1073 Hardware name: Rockchip (Device Tree) (unwind_backtrace) from [<c00133d4>] (show_stack+0x20/0x24) (show_stack) from [<c05400e8>] (dump_stack+0x84/0xb8) (dump_stack) from [<c004913c>] (__schedule_bug+0x54/0x6c) (__schedule_bug) from [<c054065c>] (__schedule+0x80/0x668) (__schedule) from [<c0540cfc>] (schedule+0xb8/0xd4) (schedule) from [<c0543a3c>] (schedule_timeout+0x2c/0x234) (schedule_timeout) from [<c05417c0>] (wait_for_common+0xf4/0x188) (wait_for_common) from [<c0541874>] (wait_for_completion+0x20/0x24) (wait_for_completion) from [<c00a0104>] (__stop_cpus+0x58/0x70) (__stop_cpus) from [<c00a0580>] (stop_cpus+0x3c/0x54) (stop_cpus) from [<c00a06c4>] (__stop_machine+0xcc/0xe8) (__stop_machine) from [<c00a0714>] (stop_machine+0x34/0x44) (stop_machine) from [<c00173e8>] (patch_text+0x28/0x34) (patch_text) from [<c001733c>] (kgdb_arch_set_breakpoint+0x40/0x4c) (kgdb_arch_set_breakpoint) from [<c00a0d68>] (kgdb_validate_break_address+0x2c/0x60) (kgdb_validate_break_address) from [<c00a0e90>] (dbg_set_sw_break+0x1c/0xdc) (dbg_set_sw_break) from [<c00a2e88>] (gdb_serial_stub+0x9c4/0xba4) (gdb_serial_stub) from [<c00a11cc>] (kgdb_cpu_enter+0x1f8/0x60c) (kgdb_cpu_enter) from [<c00a18cc>] (kgdb_handle_exception+0x19c/0x1d0) (kgdb_handle_exception) from [<c0016f7c>] (kgdb_compiled_brk_fn+0x30/0x3c) (kgdb_compiled_brk_fn) from [<c00091a4>] (do_undefinstr+0x1a4/0x20c) (do_undefinstr) from [<c001400c>] (__und_svc_finish+0x0/0x34)
It turns out that when we're in kgdb all the CPUs are stopped anyway so there's no reason we should be calling patch_text(). We can instead directly call __patch_text() which assumes that CPUs have already been stopped.
--- arch/arm/kernel/kgdb.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
arch/arm/kernel/kgdb.c +5 -3
@@ -259,15 +259,17 @@ int kgdb_arch_set_breakpoint(struct kgdbif (err)return err; -patch_text ((void *)bpt->bpt_addr, - *(unsigned int *)arch_kgdb_ops.gdb_bpt_instr); +/* Machine is already stopped, so we can use __patch_text() directly */ +__patch_text ((void *)bpt->bpt_addr, + *(unsigned int *)arch_kgdb_ops.gdb_bpt_instr);return err; }int kgdb_arch_remove_breakpoint (struct kgdb_bkpt *bpt) { -patch_text ((void *)bpt->bpt_addr, *(unsigned int *)bpt->saved_instr); +/* Machine is already stopped, so we can use __patch_text() directly */ +__patch_text ((void *)bpt->bpt_addr, *(unsigned int *)bpt->saved_instr);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 44/258 ARM: dts: omap5-uevm.dts: fix i2c5 pinctrl offsets
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Grazvydas Ignotas <[email protected]>
commit 1dbdad75074d16c3e3005180f81a01cdc04a7872 upstream.
The i2c5 pinctrl offsets are wrong. If the bootloader doesn't set the pins up, communication with tca6424a doesn't work (controller timeouts) and it is not possible to enable HDMI.
--- arch/arm/boot/dts/omap5-uevm.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/omap5-uevm.dts +2 -2
@@ -174,8 +174,8 @@ i2c5_pins: pinmux_i2c5_pins { pinctrl-single,pins = < - 0x184 (PIN_INPUT | MUX_MODE0) /* i2c5_scl */ - 0x186 (PIN_INPUT | MUX_MODE0) /* i2c5_sda */ + 0x186 (PIN_INPUT | MUX_MODE0) /* i2c5_scl */ + 0x188 (PIN_INPUT | MUX_MODE0) /* i2c5_sda */ >; };
Greg Kroah-Hartman
maintainerPATCH 45/258 ARM: dts: omap3-beagle: make i2c3, ddc and tfp410 gpio work again
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carl Frederik Werner <[email protected]>
commit 3a2fa775bd1d0579113666c1a2e37654a34018a0 upstream.
Let's fix pinmux address of gpio 170 used by tfp410 powerdown-gpio.
According to the OMAP35x Technical Reference Manual
CONTROL_PADCONF_I2C3_SDA[15:0] 0x480021C4 mode0: i2c3_sda CONTROL_PADCONF_I2C3_SDA[31:16] 0x480021C4 mode4: gpio_170
the pinmux address of gpio 170 must be 0x480021C6.
The former wrong address broke i2c3 (used by hdmi ddc), resulting in kernel message:
omap_i2c 48060000.i2c: controller timed out
--- arch/arm/boot/dts/omap3-beagle.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/omap3-beagle.dts +1 -1
@@ -202,7 +202,7 @@ tfp410_pins: pinmux_tfp410_pins { pinctrl-single,pins = < - 0x194 (PIN_OUTPUT | MUX_MODE4) /* hdq_sio.gpio_170 */ + 0x196 (PIN_OUTPUT | MUX_MODE4) /* hdq_sio.gpio_170 */ >; };
Greg Kroah-Hartman
maintainerPATCH 46/258 ARM: pxa: ssp: Fix build error by removing originally incorrect DT binding
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Nikula <[email protected]>
commit b692cb83b14d2f741f513221f5f78042c674c2a9 upstream.
Commit 03fbf488cece ("spi: pxa2xx: Differentiate Intel LPSS types") caused build error here because it removed the type LPSS_SSP and I didn't notice the type was used here too.
I believe commit a6e56c28a178 ("ARM: pxa: ssp: add DT bindings") added it accidentally by copying all enum pxa_ssp_type types from include/linux/pxa2xx_ssp.h even LPSS_SSP was for Intel LPSS SPI devices.
Fix the build error by removing this incorrect binding.
--- arch/arm/plat-pxa/ssp.c | 1 - 1 file changed, 1 deletion(-)
arch/arm/plat-pxa/ssp.c +0 -1
@@ -107,7 +107,6 @@ static const struct of_device_id pxa_ssp { .compatible = "mvrl,pxa168-ssp", .data = (void *) PXA168_SSP }, { .compatible = "mrvl,pxa910-ssp", .data = (void *) PXA910_SSP }, { .compatible = "mrvl,ce4100-ssp", .data = (void *) CE4100_SSP }, - { .compatible = "mrvl,lpss-ssp", .data = (void *) LPSS_SSP }, { }, };MODULE_DEVICE_TABLE (of, pxa_ssp_of_ids);
Greg Kroah-Hartman
maintainerPATCH 47/258 ARM: EXYNOS: reset Little cores when cpu is up
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chanho Park <[email protected]>
commit 833b5794e3303cc97a0d2d4ba97f26cc9d9b4b79 upstream.
The cpu booting of exynos5422 has been still broken since we discussed it in last year[1]. This patch is inspired from Odroid XU3
code (Actually, it was from samsung exynos vendor kernel)[2]. This weird reset code was founded exynos5420 octa cores series SoCs and only required for the first boot core is the Little core (Cortex A7). Some of the exynos5420 boards and all of the exynos5422 boards will require this code.
There is two ways to check the little core is the first cpu. One is checking GPG2CON[1] GPIO value and the other is checking the cluster number of the first cpu. I selected the latter because it's more easier than the former.
[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-June/350632.html
[2] https://patchwork.kernel.org/patch/6782891/
--- arch/arm/mach-exynos/mcpm-exynos.c | 27 ++++++++++++++++++++++++++- arch/arm/mach-exynos/regs-pmu.h | 6 ++++++ 2 files changed, 32 insertions(+), 1 deletion(-)
arch/arm/mach-exynos/mcpm-exynos.c +26 -1
@@ -20,6 +20,7 @@#include <asm/cputype.h> #include <asm/cp15.h> #include <asm/mcpm.h> +#include <asm/smp_plat.h> #include "regs-pmu.h" #include "common.h"
@@ -70,7 +71,31 @@ static int exynos_cpu_powerup(unsigned i cluster >= EXYNOS5420_NR_CLUSTERS)return -EINVAL ; -exynos_cpu_power_up (cpunr); +if (!exynos_cpu_power_state (cpunr)) { +exynos_cpu_power_up (cpunr); + +/* +* This assumes the cluster number of the big cores(Cortex A15) +* is 0 and the Little cores(Cortex A7) is 1. +* When the system was booted from the Little core, +* they should be reset during power up cpu. +*/ +if (cluster && + cluster ==MPIDR_AFFINITY_LEVEL (cpu_logical_map (0 ),1 )) { +/* +* Before we reset the Little cores, we should wait +* the SPARE2 register is set to 1 because the init +* codes of the iROM will set the register after +* initialization. +*/ +while (!pmu_raw_readl (S5P_PMU_SPARE2 )) +udelay (10 ); + +pmu_raw_writel (EXYNOS5420_KFC_CORE_RESET (cpu), +EXYNOS_SWRESET ); + } + } +return 0 ; }
arch/arm/mach-exynos/regs-pmu.h +6 -0
@@ -513,6 +513,12 @@ static inline unsigned int exynos_pmu_cp#define SPREAD_ENABLE 0xF#define SPREAD_USE_STANDWFI 0xF +#define EXYNOS5420_KFC_CORE_RESET0 BIT(8) +#define EXYNOS5420_KFC_ETM_RESET0 BIT(20) + +#define EXYNOS5420_KFC_CORE_RESET (_nr) \ + ((EXYNOS5420_KFC_CORE_RESET0 | EXYNOS5420_KFC_ETM_RESET0) << (_nr)) +#define EXYNOS5420_BB_CON1 0x0784#define EXYNOS5420_BB_SEL_EN BIT(31)#define EXYNOS5420_BB_PMOS_EN BIT(7)
Greg Kroah-Hartman
maintainerPATCH 49/258 ARM: dts: Fix wrong clock binding for sysmmu_fimd1_1 on exynos5420
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joonyoung Shim <[email protected]>
commit c7d2ecd9f64c351cb4d551f1f472d0fc09c3cae8 upstream.
The sysmmu_fimd1_1 should bind the clock CLK_SMMU_FIMD1M1, not the clock CLK_SMMU_FIMD1M0. CLK_SMMU_FIMD1M0 is a clock for the sysmmu_fimd1_0.
This wrong clock binding causes the problem that is blocked in iommu_map function when IOMMU is enabled and exynos-drm driver tries to allocate buffer via DMA mapping API on Odroid-XU3 board.
--- arch/arm/boot/dts/exynos5420.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/exynos5420.dtsi +1 -1
@@ -1118,7 +1118,7 @@ interrupt-parent = <&combiner>; interrupts = <3 0>; clock-names = "sysmmu", "master"; - clocks = <&clock CLK_SMMU_FIMD1M0>, <&clock CLK_FIMD1>; + clocks = <&clock CLK_SMMU_FIMD1M1>, <&clock CLK_FIMD1>; power-domains = <&disp_pd>; #iommu-cells = <0>; };
Greg Kroah-Hartman
maintainerPATCH 50/258 ARM: dts: fix usb pin control for imx-rex dts
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Felipe F. Tonello" <[email protected]>
commit 0af822110871400908d5b6f83a8908c45f881d8f upstream.
This fixes a duplicated pin control causing this error:
imx6q-pinctrl 20e0000.iomuxc: pin MX6Q_PAD_GPIO_1 already requested by regulators:regulator@2; cannot claim for 2184000.usb imx6q-pinctrl 20e0000.iomuxc: pin-137 (2184000.usb) status -22 imx6q-pinctrl 20e0000.iomuxc: could not request pin 137 (MX6Q_PAD_GPIO_1) from group usbotggrp on device 20e0000.iomuxc imx_usb 2184000.usb: Error applying setting, reverse things back
imx6q-pinctrl 20e0000.iomuxc: pin MX6Q_PAD_EIM_D31 already requested by regulators:regulator@1; cannot claim for 2184200.usb imx6q-pinctrl 20e0000.iomuxc: pin-52 (2184200.usb) status -22 imx6q-pinctrl 20e0000.iomuxc: could not request pin 52 (MX6Q_PAD_EIM_D31) from group usbh1grp on device 20e0000.iomuxcimx_usb 2184200.usb: Error applying setting, reverse things back
--- arch/arm/boot/dts/imx6qdl-rex.dtsi | 2 -- 1 file changed, 2 deletions(-)
arch/arm/boot/dts/imx6qdl-rex.dtsi +0 -2
@@ -35,7 +35,6 @@ compatible = "regulator-fixed"; reg = <1>; pinctrl-names = "default"; - pinctrl-0 = <&pinctrl_usbh1>; regulator-name = "usbh1_vbus"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>;
@@ -47,7 +46,6 @@ compatible = "regulator-fixed"; reg = <2>; pinctrl-names = "default"; - pinctrl-0 = <&pinctrl_usbotg>; regulator-name = "usb_otg_vbus"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>;
Greg Kroah-Hartman
maintainerPATCH 51/258 dax: fix O_DIRECT I/O to the last block of a blockdev
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Moyer <[email protected]>
commit e94f5a2285fc94202a9efb2c687481f29b64132c upstream.
commit bbab37ddc20b (block: Add support for DAX reads/writes to block devices) caused a regression in mkfs.xfs. That utility sets the block size of the device to the logical block size using the BLKBSZSET ioctl, and then issues a single sector read from the last sector of the device. This results in the dax_io code trying to do a page-sized read from 512 bytes from the end of the device. The result is -ERANGE being returned to userspace.
The fix is to align the block to the page size before calling get_block.
Thanks to willy for simplifying my original patch.
--- fs/dax.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/dax.c +2 -1
@@ -116,7 +116,8 @@ static ssize_t dax_io(struct inode *inodunsigned len;if (pos == max) {unsigned blkbits = inode->i_blkbits; -sector_t block = pos >> blkbits; +long page = pos >>PAGE_SHIFT ; +sector_t block = page << (PAGE_SHIFT - blkbits);unsigned first = pos - (block << blkbits);long size;
Greg Kroah-Hartman
maintainerPATCH 52/258 blockdev: dont set S_DAX for misaligned partitions
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Moyer <[email protected]>
commit f0b2e563bc419df7c1b3d2f494574c25125f6aed upstream.
The dax code doesn't currently support misaligned partitions, so disable O_DIRECT via dax until such time as that support materializes.
--- fs/block_dev.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/block_dev.c +7 -0
@@ -1241,6 +1241,13 @@ static int __blkdev_get(struct block_dev goto out_clear; }bd_set_size (bdev, (loff_t )bdev->bd_part->nr_sects <<9 ); +/* +* If the partition is not aligned on a page +* boundary, we can't do dax I/O to it. +*/ +if ((bdev->bd_part->start_sect % (PAGE_SIZE /512 )) || + (bdev->bd_part->nr_sects % (PAGE_SIZE /512 ))) + bdev->bd_inode->i_flags &= ~S_DAX ; } }else {if (bdev->bd_contains == bdev) {
Greg Kroah-Hartman
maintainerPATCH 53/258 block: blkg_destroy_all() should clear q->root_blkg and ->root_rl.blkg
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit 6fe810bda0bd9a5d7674fc671fac27b8aa8ec243 upstream.
While making the root blkg unconditional, ec13b1d6f0a0 ("blkcg: always create the blkcg_gq for the root blkcg") removed the part which clears q->root_blkg and ->root_rl.blkg during q exit. This leaves the two pointers dangling after blkg_destroy_all(). blk-throttle exit path performs blkg traversals and dereferences ->root_blkg and can lead to the following oops.
BUG: unable to handle kernel NULL pointer dereference at 0000000000000558 IP: [<ffffffff81389746>] __blkg_lookup+0x26/0x70 ... task: ffff88001b4e2580 ti: ffff88001ac0c000 task.ti: ffff88001ac0c000 RIP: 0010:[<ffffffff81389746>] [<ffffffff81389746>] __blkg_lookup+0x26/0x70 ... Call Trace: [<ffffffff8138d14a>] blk_throtl_drain+0x5a/0x110 [<ffffffff8138a108>] blkcg_drain_queue+0x18/0x20 [<ffffffff81369a70>] __blk_drain_queue+0xc0/0x170 [<ffffffff8136a101>] blk_queue_bypass_start+0x61/0x80 [<ffffffff81388c59>] blkcg_deactivate_policy+0x39/0x100 [<ffffffff8138d328>] blk_throtl_exit+0x38/0x50 [<ffffffff8138a14e>] blkcg_exit_queue+0x3e/0x50 [<ffffffff8137016e>] blk_release_queue+0x1e/0xc0 ...
While the bug is a straigh-forward use-after-free bug, it is tricky to reproduce because blkg release is RCU protected and the rest of exit path usually finishes before RCU grace period.
This patch fixes the bug by updating blkg_destro_all() to clear q->root_blkg and ->root_rl.blkg.
--- block/blk-cgroup.c | 3 +++ 1 file changed, 3 insertions(+)
block/blk-cgroup.c +3 -0
@@ -387,6 +387,9 @@ static void blkg_destroy_all(struct requblkg_destroy (blkg);spin_unlock (&blkcg->lock); } + + q->root_blkg =NULL ; + q->root_rl.blkg =NULL ; }/*
Greg Kroah-Hartman
maintainerPATCH 54/258 dmaengine: at_xdmac: change block increment addressing mode
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Ripard <[email protected]>
commit a1cf09031e641d3cceaca4a4dd20ef6a785bc9b3 upstream.
The addressing mode we were using was not only incrementing the address at each microblock, but also at each data boundary, which was severely slowing the transfer, without any benefit since we were not using the data stride.
Switch to the micro block increment only in order to get back to an acceptable performance level.
--- drivers/dma/at_xdmac.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/dma/at_xdmac.c +2 -2
@@ -878,14 +878,14 @@ at_xdmac_interleaved_queue_desc(struct dif (xt->src_inc) {if (xt->src_sgl) - chan_cc |=AT_XDMAC_CC_SAM_UBS_DS_AM ; + chan_cc |=AT_XDMAC_CC_SAM_UBS_AM ;else chan_cc |=AT_XDMAC_CC_SAM_INCREMENTED_AM ; }if (xt->dst_inc) {if (xt->dst_sgl) - chan_cc |=AT_XDMAC_CC_DAM_UBS_DS_AM ; + chan_cc |=AT_XDMAC_CC_DAM_UBS_AM ;else chan_cc |=AT_XDMAC_CC_DAM_INCREMENTED_AM ; }
Greg Kroah-Hartman
maintainerPATCH 55/258 dmaengine: at_xdmac: clean used descriptor
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ludovic Desroches <[email protected]>
commit 0be2136b67067617b36c70e525d7534108361e36 upstream.
When putting back a descriptor to the free descs list, some fields are not set to 0, it can cause bugs if someone uses it without having this in mind.
Descriptor are not put back one by one so it is easier to clean descriptors when we request them.
--- drivers/dma/at_xdmac.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/dma/at_xdmac.c +10 -1
@@ -455,6 +455,15 @@ static struct at_xdmac_desc *at_xdmac_alreturn desc; } +void at_xdmac_init_used_desc (struct at_xdmac_desc *desc) +{ +memset (&desc->lld,0 ,sizeof (desc->lld)); +INIT_LIST_HEAD (&desc->descs_list); + desc->direction =DMA_TRANS_NONE ; + desc->xfer_size =0 ; + desc->active_xfer = false; +} +/* Call must be protected by lock. */ static struct at_xdmac_desc *at_xdmac_get_desc (struct at_xdmac_chan *atchan) {
@@ -466,7 +475,7 @@ static struct at_xdmac_desc *at_xdmac_ge desc =list_first_entry (&atchan->free_descs_list, struct at_xdmac_desc, desc_node);list_del (&desc->desc_node); - desc->active_xfer = false; +at_xdmac_init_used_desc (desc); }return desc;
Greg Kroah-Hartman
maintainerPATCH 56/258 dmaengine: dw: properly read DWC_PARAMS register
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit 6bea0f6d1c47b07be88dfd93f013ae05fcb3d8bf upstream.
In case we have less than maximum allowed channels (8) and autoconfiguration is enabled the DWC_PARAMS read is wrong because it uses different arithmetic to what is needed for channel priority setup.
Re-do the caclulations properly. This now works on AVR32 board well.
--- drivers/dma/dw/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/dma/dw/core.c +2 -2
@@ -1591,7 +1591,6 @@ int dw_dma_probe(struct dw_dma_chip *chiINIT_LIST_HEAD (&dw->dma.channels);for (i =0 ; i < nr_channels; i++) {struct dw_dma_chan *dwc = &dw->chan[i]; -int r = nr_channels - i -1 ; dwc->chan.device = &dw->dma;dma_cookie_init (&dwc->chan);
@@ -1603,7 +1602,7 @@ int dw_dma_probe(struct dw_dma_chip *chi/* 7 is highest priority & 0 is lowest. */ if (pdata->chan_priority ==CHAN_PRIORITY_ASCENDING ) - dwc->priority = r; + dwc->priority = nr_channels - i -1 ;else dwc->priority = i;
@@ -1622,6 +1621,7 @@ int dw_dma_probe(struct dw_dma_chip *chi/* Hardware configuration */ if (autocfg) {unsigned int dwc_params; +unsigned int r =DW_DMA_MAX_NR_CHANNELS - i -1 ;void __iomem *addr = chip->regs + r *sizeof (u32); dwc_params =dma_read_byaddr (addr,DWC_PARAMS );
Greg Kroah-Hartman
maintainerPATCH 57/258 dmaengine: at_xdmac: fix bug in prep_dma_cyclic
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ludovic Desroches <[email protected]>
commit e900c30dc1bb0cbc07708e9be1188f531632b2ef upstream.
In cyclic mode, the round chaining has been broken by the introduction of at_xdmac_queue_desc(): AT_XDMAC_MBR_UBC_NDE is set for all descriptors excepted for the last one. at_xdmac_queue_desc() has to be called one more time to chain the last and the first descriptors.
--- drivers/dma/at_xdmac.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/dma/at_xdmac.c +1 -4
@@ -806,10 +806,7 @@ at_xdmac_prep_dma_cyclic(struct dma_chanlist_add_tail (&desc->desc_node, &first->descs_list); } - prev->lld.mbr_nda = first->tx_dma_desc.phys; -dev_dbg (chan2dev (chan), -"%s: chain lld: prev=0x%p, mbr_nda=%pad\n" , - __func__, prev, &prev->lld.mbr_nda); +at_xdmac_queue_desc (chan, prev, first); first->tx_dma_desc.flags = flags; first->xfer_size = buf_len; first->direction = direction;
Greg Kroah-Hartman
maintainerPATCH 58/258 dmaengine: pxa_dma: fix initial list move
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Jarzmik <[email protected]>
commit aebf5a67db8dbacbc624b9c652b81f5460b15eff upstream.
Since the commit to have an allocated list of virtual descriptors was reverted, the pxa_dma driver is broken, as it assumes the descriptor is placed on the allocated list upon allocation.
Fix the issue in pxa_dma by making an allocated virtual descriptor a singleton.
--- drivers/dma/pxa_dma.c | 1 + 1 file changed, 1 insertion(+)
drivers/dma/pxa_dma.c +1 -0
@@ -888,6 +888,7 @@ pxad_tx_prep(struct virt_dma_chan *vc, sstruct dma_async_tx_descriptor *tx; struct pxad_chan *chan = container_of(vc, struct pxad_chan, vc); +INIT_LIST_HEAD (&vd->node); tx =vchan_tx_prep (vc, vd, tx_flags); tx->tx_submit = pxad_tx_submit; dev_dbg(&chan->vc.chan.dev->device,
Greg Kroah-Hartman
maintainerPATCH 59/258 pmem: add proper fencing to pmem_rw_page()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ross Zwisler <[email protected]>
commit ba8fe0f85e15d047686caf8a42463b592c63c98c upstream.
pmem_rw_page() needs to call wmb_pmem() on writes to make sure that the newly written data is durable. This flow was added to pmem_rw_bytes() and pmem_make_request() with this commit:
commit 61031952f4c8 ("arch, x86: pmem api for ensuring durability of
persistent memory updates")
...the pmem_rw_page() path was missed.
--- drivers/nvdimm/pmem.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/nvdimm/pmem.c +2 -0
@@ -86,6 +86,8 @@ static int pmem_rw_page(struct block_devstruct pmem_device *pmem = bdev->bd_disk->private_data;pmem_do_bvec (pmem, page,PAGE_CACHE_SIZE ,0 , rw, sector); +if (rw &WRITE ) +wmb_pmem ();page_endio (page, rw &WRITE ,0 );return 0 ;
Greg Kroah-Hartman
maintainerPATCH 60/258 x86/apic: Serialize LVTT and TSC_DEADLINE writes
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shaohua Li <[email protected]>
commit 5d7c631d926b59aa16f3c56eaeb83f1036c81dc7 upstream.
The APIC LVTT register is MMIO mapped but the TSC_DEADLINE register is an MSR. The write to the TSC_DEADLINE MSR is not serializing, so it's not guaranteed that the write to LVTT has reached the APIC before the TSC_DEADLINE MSR is written. In such a case the write to the MSR is ignored and as a consequence the local timer interrupt never fires.
The SDM decribes this issue for xAPIC and x2APIC modes. The serialization methods recommended by the SDM differ.
xAPIC:
"1. Memory-mapped write to LVT Timer Register, setting bits 18:17 to 10b.
2. WRMSR to the IA32_TSC_DEADLINE MSR a value much larger than current time-stamp counter.
3. If RDMSR of the IA32_TSC_DEADLINE MSR returns zero, go to step 2.
4. WRMSR to the IA32_TSC_DEADLINE MSR the desired deadline."
x2APIC:
"To allow for efficient access to the APIC registers in x2APIC mode,
the serializing semantics of WRMSR are relaxed when writing to the APIC registers. Thus, system software should not use 'WRMSR to APIC registers in x2APIC mode' as a serializing instruction. Read and write accesses to the APIC registers will occur in program order. A WRMSR to an APIC register may complete before all preceding stores are globally visible; software can prevent this by inserting a serializing instruction, an SFENCE, or an MFENCE before the WRMSR."
The xAPIC method is to just wait for the memory mapped write to hit the LVTT by checking whether the MSR write has reached the hardware. There is no reason why a proper MFENCE after the memory mapped write would not do the same. Andi Kleen confirmed that MFENCE is sufficient for the xAPIC case as well.
Issue MFENCE before writing to the TSC_DEADLINE MSR. This can be done unconditionally as all CPUs which have TSC_DEADLINE also have MFENCE support.
[ tglx: Massaged the changelog ]
--- arch/x86/kernel/apic/apic.c | 7 +++++++ 1 file changed, 7 insertions(+)
arch/x86/kernel/apic/apic.c +7 -0
@@ -336,6 +336,13 @@ static void __setup_APIC_LVTT(unsigned iapic_write (APIC_LVTT , lvtt_value);if (lvtt_value &APIC_LVT_TIMER_TSCDEADLINE ) { +/* +* See Intel SDM: TSC-Deadline Mode chapter. In xAPIC mode, +* writing to the APIC LVTT and TSC_DEADLINE MSR isn't serialized. +* According to Intel, MFENCE can do the serialization here. +*/ + asmvolatile ("mfence" : : :"memory" ); +printk_once (KERN_DEBUG "TSC deadline timer enabled\n" );return ; }
Greg Kroah-Hartman
maintainerPATCH 62/258 x86/platform: Fix Geode LX timekeeping in the generic x86 build
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Woodhouse <[email protected]>
commit 03da3ff1cfcd7774c8780d2547ba0d995f7dc03d upstream.
In 2007, commit 07190a08eef36 ("Mark TSC on GeodeLX reliable") bypassed verification of the TSC on Geode LX. However, this code (now in the check_system_tsc_reliable() function in arch/x86/kernel/tsc.c) was only present if CONFIG_MGEODE_LX was set.
OpenWRT has recently started building its generic Geode target for Geode GX, not LX, to include support for additional platforms. This broke the timekeeping on LX-based devices, because the TSC wasn't marked as reliable:
https://dev.openwrt.org/ticket/20531
By adding a runtime check on is_geode_lx(), we can also include the fix if CONFIG_MGEODEGX1 or CONFIG_X86_GENERIC are set, thus fixing the problem.
--- arch/x86/kernel/tsc.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
arch/x86/kernel/tsc.c +10 -7
@@ -21,6 +21,7 @@#include <asm/hypervisor.h> #include <asm/nmi.h> #include <asm/x86_init.h> +#include <asm/geode.h> unsigned int __read_mostly cpu_khz;/* TSC clocks / usec, not used here */ EXPORT_SYMBOL (cpu_khz);
@@ -1013,15 +1014,17 @@ EXPORT_SYMBOL_GPL(mark_tsc_unstable);static void __init check_system_tsc_reliable (void ) { -#ifdef CONFIG_MGEODE_LX -/* RTSC counts during suspend */ +#if defined(CONFIG_MGEODEGX1 ) || defined(CONFIG_MGEODE_LX ) || defined(CONFIG_X86_GENERIC ) +if (is_geode_lx ()) { +/* RTSC counts during suspend */ #define RTSC_SUSP 0x100 -unsigned long res_low, res_high; +unsigned long res_low, res_high; -rdmsr_safe (MSR_GEODE_BUSCONT_CONF0 , &res_low, &res_high); -/* Geode_LX - the OLPC CPU has a very reliable TSC */ -if (res_low &RTSC_SUSP ) - tsc_clocksource_reliable =1 ; +rdmsr_safe (MSR_GEODE_BUSCONT_CONF0 , &res_low, &res_high); +/* Geode_LX - the OLPC CPU has a very reliable TSC */ +if (res_low &RTSC_SUSP ) + tsc_clocksource_reliable =1 ; + }#endif if (boot_cpu_has (X86_FEATURE_TSC_RELIABLE )) tsc_clocksource_reliable =1 ;
Greg Kroah-Hartman
maintainerPATCH 63/258 x86/ioapic: Force affinity setting in setup_ioapic_dest()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 4857c91f0d195f05908fff296ba1ec5fca87066c upstream.
The recent ioapic cleanups changed the affinity setting in setup_ioapic_dest() from a direct write to the hardware to the delayed affinity setup via irq_set_affinity().
That results in a warning from chained_irq_exit():
WARNING: CPU: 0 PID: 5 at kernel/irq/migration.c:32 irq_move_masked_irq [<ffffffff810a0a88>] irq_move_masked_irq+0xb8/0xc0 [<ffffffff8103c161>] ioapic_ack_level+0x111/0x130 [<ffffffff812bbfe8>] intel_gpio_irq_handler+0x148/0x1c0
The reason is that irq_set_affinity() does not write directly to the hardware. It marks the affinity setting as pending and executes it from the next interrupt. The chained handler infrastructure does not take the irq descriptor lock for performance reasons because such a chained interrupt is not visible to any interfaces. So the delayed affinity setting triggers the warning in irq_move_masked_irq().
Restore the old behaviour by calling the set_affinity function of the ioapic chip in setup_ioapic_dest(). This is safe as none of the interrupts can be on the fly at this point.
--- arch/x86/kernel/apic/io_apic.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/x86/kernel/apic/io_apic.c +3 -2
@@ -2522,6 +2522,7 @@ void __init setup_ioapic_dest(void)int pin, ioapic, irq, irq_entry;const struct cpumask *mask;struct irq_data *idata; +struct irq_chip *chip;if (skip_ioapic_setup ==1 )return ;
@@ -2545,9 +2546,9 @@ void __init setup_ioapic_dest(void) else mask = apic->target_cpus (); - irq_set_affinity(irq, mask); + chip =irq_data_get_irq_chip (idata); + chip->irq_set_affinity(idata, mask, false); } - }#endif
Greg Kroah-Hartman
maintainerPATCH 65/258 x86/paravirt: Replace the paravirt nop with a bona fide empty function
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Lutomirski <[email protected]>
commit fc57a7c68020dcf954428869eafd934c0ab1536f upstream.
PARAVIRT_ADJUST_EXCEPTION_FRAME generates this code (using nmi as an example, trimmed for readability):
ff 15 00 00 00 00 callq *0x0(%rip) # 2796 <nmi+0x6>
2792: R_X86_64_PC32 pv_irq_ops+0x2cThat's a call through a function pointer to regular C function that does nothing on native boots, but that function isn't protected against kprobes, isn't marked notrace, and is certainly not guaranteed to preserve any registers if the compiler is feeling perverse. This is bad news for a CLBR_NONE operation.
Of course, if everything works correctly, once paravirt ops are patched, it gets nopped out, but what if we hit this code before paravirt ops are patched in? This can potentially cause breakage that is very difficult to debug.
A more subtle failure is possible here, too: if _paravirt_nop uses the stack at all (even just to push RBP), it will overwrite the "NMI executing" variable if it's called in the NMI prologue.
The Xen case, perhaps surprisingly, is fine, because it's already written in asm.
Fix all of the cases that default to paravirt_nop (including adjust_exception_frame) with a big hammer: replace paravirt_nop with an asm function that is just a ret instruction.
The Xen case may have other problems, so document them.
This is part of a fix for some random crashes that Sasha saw.
--- arch/x86/entry/entry_64.S | 11 +++++++++++ arch/x86/kernel/paravirt.c | 16 ++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-)
arch/x86/entry/entry_64.S +11 -0
@@ -1219,7 +1219,18 @@ END(error_exit) /* Runs on exception stack */ ENTRY(nmi) + /* + * Fix up the exception frame if we're on Xen. + * PARAVIRT_ADJUST_EXCEPTION_FRAME is guaranteed to push at most + * one value to the stack on native, so it may clobber the rdx + * scratch slot, but it won't clobber any of the important + * slots past it. + * + * Xen is a different story, because the Xen frame itself overlaps + * the "NMI executing" variable. + */ PARAVIRT_ADJUST_EXCEPTION_FRAME + /* * We allow breakpoints in NMIs. If a breakpoint occurs, then * the iretq it performs will take us out of NMI context.
arch/x86/kernel/paravirt.c +12 -4
@@ -41,10 +41,18 @@#include <asm/timer.h> #include <asm/special_insns.h> -/* nop stub */ -void _paravirt_nop (void ) -{ -} +/* +* nop stub, which must not clobber anything *including the stack* to +* avoid confusing the entry prologues. +*/ +extern void _paravirt_nop (void ); +asm (".pushsection .entry.text, \"ax\"\n" +".global _paravirt_nop\n" +"_paravirt_nop:\n\t" +"ret\n\t" +".size _paravirt_nop, . - _paravirt_nop\n\t" +".type _paravirt_nop, @function\n\t" +".popsection" );/* identity function, which can be inlined */ u32 _paravirt_ident_32 (u32 x)
Greg Kroah-Hartman
maintainerPATCH 67/258 Use WARN_ON_ONCE for missing X86_FEATURE_NRIPS
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Dirk=20M=C3=BCller?= <[email protected]>
commit d2922422c48df93f3edff7d872ee4f3191fefb08 upstream.
The cpu feature flags are not ever going to change, so warning everytime can cause a lot of kernel log spam
(in our case more than 10GB/hour).
The warning seems to only occur when nested virtualization is enabled, so it's probably triggered by a KVM bug. This is a sensible and safe change anyway, and the KVM bug fix might not be suitable for stable releases anyway.
--- arch/x86/kvm/svm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/svm.c +1 -1
@@ -513,7 +513,7 @@ static void skip_emulated_instruction(ststruct vcpu_svm *svm =to_svm (vcpu);if (svm->vmcb->control.next_rip !=0 ) { -WARN_ON (!static_cpu_has (X86_FEATURE_NRIPS )); +WARN_ON_ONCE (!static_cpu_has (X86_FEATURE_NRIPS )); svm->next_rip = svm->vmcb->control.next_rip; }
Greg Kroah-Hartman
maintainerPATCH 68/258 x86/efi: Fix boot crash by mapping EFI memmap entries bottom-up at runtime, instead of top-down
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Fleming <[email protected]>
commit a5caa209ba9c29c6421292e7879d2387a2ef39c9 upstream.
Beginning with UEFI v2.5 EFI_PROPERTIES_TABLE was introduced that signals that the firmware PE/COFF loader supports splitting code and data sections of PE/COFF images into separate EFI memory map entries. This allows the kernel to map those regions with strict memory protections, e.g. EFI_MEMORY_RO for code, EFI_MEMORY_XP for data, etc.
Unfortunately, an unwritten requirement of this new feature is that the regions need to be mapped with the same offsets relative to each other as observed in the EFI memory map. If this is not done crashes like this may occur,
BUG: unable to handle kernel paging request at fffffffefe6086dd IP: [<fffffffefe6086dd>] 0xfffffffefe6086dd Call Trace: [<ffffffff8104c90e>] efi_call+0x7e/0x100 [<ffffffff81602091>] ? virt_efi_set_variable+0x61/0x90 [<ffffffff8104c583>] efi_delete_dummy_variable+0x63/0x70 [<ffffffff81f4e4aa>] efi_enter_virtual_mode+0x383/0x392 [<ffffffff81f37e1b>] start_kernel+0x38a/0x417 [<ffffffff81f37495>] x86_64_start_reservations+0x2a/0x2c [<ffffffff81f37582>] x86_64_start_kernel+0xeb/0xef
Here 0xfffffffefe6086dd refers to an address the firmware expects to be mapped but which the OS never claimed was mapped. The issue is that included in these regions are relative addresses to other regions which were emitted by the firmware toolchain before the "splitting" of sections occurred at runtime.
Needless to say, we don't satisfy this unwritten requirement on x86_64 and instead map the EFI memory map entries in reverse order. The above crash is almost certainly triggerable with any kernel newer than v3.13 because that's when we rewrote the EFI runtime region mapping code, in commit d2f7cbe7b26a ("x86/efi:
Runtime services virtual mapping"). For kernel versions before v3.13 things may work by pure luck depending on the fragmentation of the kernel virtual address space at the time we map the EFI regions.
Instead of mapping the EFI memory map entries in reverse order, where entry N has a higher virtual address than entry N+1, map them in the same order as they appear in the EFI memory map to preserve this relative offset between regions.
This patch has been kept as small as possible with the intention that it should be applied aggressively to stable and distribution kernels. It is very much a bugfix rather than support for a new feature, since when EFI_PROPERTIES_TABLE is enabled we must map things as outlined above to even boot - we have no way of asking the firmware not to split the code/data regions.
In fact, this patch doesn't even make use of the more strict memory protections available in UEFI v2.5. That will come later.
--- arch/x86/platform/efi/efi.c | 67 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-)
arch/x86/platform/efi/efi.c +66 -1
@@ -705,6 +705,70 @@ out: }/* +* Iterate the EFI memory map in reverse order because the regions +* will be mapped top-down. The end result is the same as if we had +* mapped things forward, but doesn't require us to change the +* existing implementation of efi_map_region(). +*/ +static inline void *efi_map_next_entry_reverse (void *entry) +{ +/* Initial call */ +if (!entry) +return memmap.map_end - memmap.desc_size; + + entry -= memmap.desc_size; +if (entry < memmap.map) +return NULL ; + +return entry; +} + +/* +* efi_map_next_entry - Return the next EFI memory map descriptor +* @entry: Previous EFI memory map descriptor +* +* This is a helper function to iterate over the EFI memory map, which +* we do in different orders depending on the current configuration. +* +* To begin traversing the memory map @entry must be %NULL. +* +* Returns %NULL when we reach the end of the memory map. +*/ +static void *efi_map_next_entry (void *entry) +{ +if (!efi_enabled (EFI_OLD_MEMMAP ) &&efi_enabled (EFI_64BIT )) { +/* +* Starting in UEFI v2.5 the EFI_PROPERTIES_TABLE +* config table feature requires us to map all entries +* in the same order as they appear in the EFI memory +* map. That is to say, entry N must have a lower +* virtual address than entry N+1. This is because the +* firmware toolchain leaves relative references in +* the code/data sections, which are split and become +* separate EFI memory regions. Mapping things +* out-of-order leads to the firmware accessing +* unmapped addresses. +* +* Since we need to map things this way whether or not +* the kernel actually makes use of +* EFI_PROPERTIES_TABLE, let's just switch to this +* scheme by default for 64-bit. +*/ +return efi_map_next_entry_reverse (entry); + } + +/* Initial call */ +if (!entry) +return memmap.map; + + entry += memmap.desc_size; +if (entry >= memmap.map_end) +return NULL ; + +return entry; +} + +/* * Map the efi memory ranges of the runtime services and update new_mmap with * virtual addresses. */
@@ -714,7 +778,8 @@ static void * __init efi_map_regions(intunsigned long left =0 ;efi_memory_desc_t *md; -for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { + p =NULL ; +while ((p =efi_map_next_entry (p))) { md = p;if (!(md->attribute &EFI_MEMORY_RUNTIME )) {#ifdef CONFIG_X86_64
Greg Kroah-Hartman
maintainerPATCH 70/258 x86/process: Add proper bound checks in 64bit get_wchan()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit eddd3826a1a0190e5235703d1e666affa4d13b96 upstream.
Dmitry Vyukov reported the following using trinity and the memory error detector AddressSanitizer
(https://code.google.com/p/address-sanitizer/wiki/AddressSanitizerForKernel).
[ 124.575597] ERROR: AddressSanitizer: heap-buffer-overflow on address ffff88002e280000 [ 124.576801] ffff88002e280000 is located 131938492886538 bytes to the left of 28857600-byte region [ffffffff81282e0a, ffffffff82e0830a) [ 124.578633] Accessed by thread T10915: [ 124.579295] inlined in describe_heap_address ./arch/x86/mm/asan/report.c:164 [ 124.579295] #0 ffffffff810dd277 in asan_report_error ./arch/x86/mm/asan/report.c:278 [ 124.580137] #1 ffffffff810dc6a0 in asan_check_region ./arch/x86/mm/asan/asan.c:37 [ 124.581050] #2 ffffffff810dd423 in __tsan_read8 ??:0 [ 124.581893] #3 ffffffff8107c093 in get_wchan
./arch/x86/kernel/process_64.c:444
The address checks in the 64bit implementation of get_wchan() are wrong in several ways:
- The lower bound of the stack is not the start of the stack page. It's the start of the stack page plus sizeof (struct thread_info)
- The upper bound must be:
top_of_stack - TOP_OF_KERNEL_STACK_PADDING - 2 * sizeof(unsigned long).
The 2 * sizeof(unsigned long) is required because the stack pointer points at the frame pointer. The layout on the stack is: ... IP FP ... IP FP. So we need to make sure that both IP and FP are in the bounds.
Fix the bound checks and get rid of the mix of numeric constants, u64 and unsigned long. Making all unsigned long allows us to use the same function for 32bit as well.
Use READ_ONCE() when accessing the stack. This does not prevent a concurrent wakeup of the task and the stack changing, but at least it avoids TOCTOU.
Also check task state at the end of the loop. Again that does not prevent concurrent changes, but it avoids walking for nothing.
Add proper comments while at it.
Based-on-patch-from: Wolfram Gloger <[email protected]>
--- arch/x86/kernel/process_64.c | 52 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 10 deletions(-)
arch/x86/kernel/process_64.c +42 -10
@@ -497,27 +497,59 @@ void set_personality_ia32(bool x32) }EXPORT_SYMBOL_GPL (set_personality_ia32); +/* +* Called from fs/proc with a reference on @p to find the function +* which called into schedule(). This needs to be done carefully +* because the task might wake up and we might look at a stack +* changing under us. +*/ unsigned long get_wchan (struct task_struct *p) { -unsigned long stack; -u64 fp, ip; +unsigned long start, bottom, top, sp, fp, ip;int count =0 ;if (!p || p == current || p->state ==TASK_RUNNING )return 0 ; - stack = (unsigned long )task_stack_page (p); -if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE ) + + start = (unsigned long )task_stack_page (p); +if (!start)return 0 ; - fp = *(u64 *)(p->thread.sp); + +/* +* Layout of the stack page: +* +* ----------- topmax = start + THREAD_SIZE - sizeof(unsigned long) +* PADDING +* ----------- top = topmax - TOP_OF_KERNEL_STACK_PADDING +* stack +* ----------- bottom = start + sizeof(thread_info) +* thread_info +* ----------- start +* +* The tasks stack pointer points at the location where the +* framepointer is stored. The data on the stack is: +* ... IP FP ... IP FP +* +* We need to read FP and IP, so we need to adjust the upper +* bound by another unsigned long. +*/ + top = start +THREAD_SIZE -TOP_OF_KERNEL_STACK_PADDING ; + top -=2 *sizeof (unsigned long ); + bottom = start +sizeof (struct thread_info ); + + sp =READ_ONCE (p->thread.sp); +if (sp < bottom || sp > top) +return 0 ; + + fp =READ_ONCE (*(unsigned long *)sp);do { -if (fp < (unsigned long )stack || - fp >= (unsigned long )stack+THREAD_SIZE ) +if (fp < bottom || fp > top)return 0 ; - ip = *(u64 *)(fp+8 ); + ip =READ_ONCE (*(unsigned long *)(fp +sizeof (unsigned long )));if (!in_sched_functions (ip))return ip; - fp = *(u64 *)fp; - }while (count++ <16 ); + fp =READ_ONCE (*(unsigned long *)fp); + }while (count++ <16 && p->state !=TASK_RUNNING );return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 71/258 x86/mm: Set NX on gap between __ex_table and rodata
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Smalley <[email protected]>
commit ab76f7b4ab2397ffdd2f1eb07c55697d19991d10 upstream.
Unused space between the end of __ex_table and the start of rodata can be left W+x in the kernel page tables. Extend the setting of the NX bit to cover this gap by starting from text_end rather than rodata_start.
Before:
---[ High Kernel Mapping ]---
0xffffffff80000000-0xffffffff81000000 16M pmd 0xffffffff81000000-0xffffffff81600000 6M ro PSE GLB x pmd 0xffffffff81600000-0xffffffff81754000 1360K ro GLB x pte 0xffffffff81754000-0xffffffff81800000 688K RW GLB x pte 0xffffffff81800000-0xffffffff81a00000 2M ro PSE GLB NX pmd 0xffffffff81a00000-0xffffffff81b3b000 1260K ro GLB NX pte 0xffffffff81b3b000-0xffffffff82000000 4884K RW GLB NX pte 0xffffffff82000000-0xffffffff82200000 2M RW PSE GLB NX pmd
0xffffffff82200000-0xffffffffa0000000 478M pmd
After:
---[ High Kernel Mapping ]---
0xffffffff80000000-0xffffffff81000000 16M pmd 0xffffffff81000000-0xffffffff81600000 6M ro PSE GLB x pmd 0xffffffff81600000-0xffffffff81754000 1360K ro GLB x pte 0xffffffff81754000-0xffffffff81800000 688K RW GLB NX pte 0xffffffff81800000-0xffffffff81a00000 2M ro PSE GLB NX pmd 0xffffffff81a00000-0xffffffff81b3b000 1260K ro GLB NX pte 0xffffffff81b3b000-0xffffffff82000000 4884K RW GLB NX pte 0xffffffff82000000-0xffffffff82200000 2M RW PSE GLB NX pmd
0xffffffff82200000-0xffffffffa0000000 478M pmd
--- arch/x86/mm/init_64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/mm/init_64.c +1 -1
@@ -1132,7 +1132,7 @@ void mark_rodata_ro(void)* has been zapped already via cleanup_highmem(). */ all_end =roundup ((unsigned long )_brk_end,PMD_SIZE ); -set_memory_nx (rodata_start, (all_end - rodata_start) >>PAGE_SHIFT ); +set_memory_nx (text_end, (all_end - text_end) >>PAGE_SHIFT );rodata_test ();
Greg Kroah-Hartman
maintainerPATCH 72/258 x86/xen: Support kexec/kdump in HVM guests by doing a soft reset
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vitaly Kuznetsov <[email protected]>
commit 0b34a166f291d255755be46e43ed5497cdd194f2 upstream.
Currently there is a number of issues preventing PVHVM Xen guests from doing successful kexec/kdump:
- Bound event channels.
- Registered vcpu_info.
- PIRQ/emuirq mappings.
- shared_info frame after XENMAPSPACE_shared_info operation.
- Active grant mappings.
Basically, newly booted kernel stumbles upon already set up Xen interfaces and there is no way to reestablish them. In Xen-4.7 a new feature called 'soft reset' is coming. A guest performing kexec/kdump operation is supposed to call SCHEDOP_shutdown hypercall with SHUTDOWN_soft_reset reason before jumping to new kernel. Hypervisor (with some help from toolstack) will do full domain cleanup (but keeping its memory and vCPU contexts intact) returning the guest to the state it had when it was first booted and thus allowing it to start over.
Doing SHUTDOWN_soft_reset on Xen hypervisors which don't support it is probably OK as by default all unknown shutdown reasons cause domain destroy with a message in toolstack log: 'Unknown shutdown reason code
5. Destroying domain.' which gives a clue to what the problem is and eliminates false expectations.
--- arch/x86/xen/enlighten.c | 23 +++++++++++++++++++++++ include/xen/interface/sched.h | 8 ++++++++ 2 files changed, 31 insertions(+)
arch/x86/xen/enlighten.c +23 -0
@@ -33,6 +33,10 @@#include <linux/memblock.h> #include <linux/edd.h> +#ifdef CONFIG_KEXEC_CORE +#include <linux/kexec.h> +#endif +#include <xen/xen.h> #include <xen/events.h> #include <xen/interface/xen.h>
@@ -1800,6 +1804,21 @@ static struct notifier_block xen_hvm_cpu .notifier_call = xen_hvm_cpu_notify, }; +#ifdef CONFIG_KEXEC_CORE +static void xen_hvm_shutdown (void ) +{ +native_machine_shutdown (); +if (kexec_in_progress) +xen_reboot (SHUTDOWN_soft_reset); +} + +static void xen_hvm_crash_shutdown (struct pt_regs *regs) +{ +native_machine_crash_shutdown (regs); +xen_reboot (SHUTDOWN_soft_reset); +} +#endif +static void __init xen_hvm_guest_init (void ) {if (xen_pv_domain ())
@@ -1819,6 +1838,10 @@ static void __init xen_hvm_guest_init(vo x86_init.irqs.intr_init = xen_init_IRQ;xen_hvm_init_time_ops ();xen_hvm_init_mmu_ops (); +#ifdef CONFIG_KEXEC_CORE + machine_ops.shutdown = xen_hvm_shutdown; + machine_ops.crash_shutdown = xen_hvm_crash_shutdown; +#endif }#endif
include/xen/interface/sched.h +8 -0
@@ -107,5 +107,13 @@ struct sched_watchdog {#define SHUTDOWN_suspend 2/* Clean up, save suspend info, kill. */ #define SHUTDOWN_crash 3/* Tell controller we've crashed. */ #define SHUTDOWN_watchdog 4/* Restart because watchdog time expired. */ +/* +* Domain asked to perform 'soft reset' for it. The expected behavior is to +* reset internal Xen state for the domain returning it to the point where it +* was created but leaving the domain's memory contents and vCPU contexts +* intact. This will allow the domain to start over and set up all Xen specific +* interfaces again. +*/ +#define SHUTDOWN_soft_reset 5#endif /* __XEN_PUBLIC_SCHED_H__ */
Greg Kroah-Hartman
maintainerPATCH 73/258 leds:lp55xx: Correct Kconfig dependency for f/w user helper
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 2338f73d407d5abe2036d92716ba25ef5279c3d2 upstream.
The commit [b67893206fc0: leds:lp55xx: fix firmware loading error] tries to address the firmware file handling with user helper, but it sets a wrong Kconfig CONFIG_FW_LOADER_USER_HELPER_FALLBACK. Since the wrong option was enabled, the system got a regression -- it suffers from the unexpected long delays for non-present firmware files.
This patch corrects the Kconfig dependency to the right one, CONFIG_FW_LOADER_USER_HELPER. This doesn't change the fallback behavior but only enables UMH when needed.
Bugzilla: https://bugzilla.opensuse.org/show_bug.cgi?id=944661
--- drivers/leds/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/leds/Kconfig +1 -1
@@ -229,7 +229,7 @@ config LEDS_LP55XX_COMMON tristate "Common Driver for TI/National LP5521/5523/55231/5562/8501" depends on LEDS_LP5521 || LEDS_LP5523 || LEDS_LP5562 || LEDS_LP8501 select FW_LOADER - select FW_LOADER_USER_HELPER_FALLBACK + select FW_LOADER_USER_HELPER help This option supports common operations for LP5521/5523/55231/5562/8501 devices.
Greg Kroah-Hartman
maintainerPATCH 74/258 leds/led-class: Add missing put_device()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo Ribalda Delgado <[email protected]>
commit e5b5a61fcb3743f1dacf9e20d28f48423cecf0c1 upstream.
Devices found by class_find_device must be freed with put_device(). Otherwise the reference count will not work properly.
--- drivers/leds/led-class.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/leds/led-class.c +5 -2
@@ -228,12 +228,15 @@ static int led_classdev_next_name(const {unsigned int i =0 ;int ret =0 ; +struct device *dev;strlcpy (name, init_name, len); -while (class_find_device (leds_class,NULL , name, match_name) && - (ret < len)) +while ((ret < len) && + (dev =class_find_device (leds_class,NULL , name, match_name))) { +put_device (dev); ret =snprintf (name, len,"%s_%u" , init_name, ++i); + }if (ret >= len)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 75/258 sched/core: Fix TASK_DEAD race in finish_task_switch()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
commit 95913d97914f44db2b81271c2e2ebd4d2ac2df83 upstream.
So the problem this patch is trying to address is as follows:
CPU0 CPU1
context_switch(A, B)
ttwu(A)
LOCK A->pi_lock
A->on_cpu == 0
finish_task_switch(A)
prev_state = A->state <-.
WMB |
A->on_cpu = 0; |
UNLOCK rq0->lock |
| context_switch(C, A)
`-- A->state = TASK_DEAD
prev_state == TASK_DEAD
put_task_struct(A)
context_switch(A, C)
finish_task_switch(A)
A->state == TASK_DEAD
put_task_struct(A)The argument being that the WMB will allow the load of A->state on CPU0 to cross over and observe CPU1's store of A->state, which will then result in a double-drop and use-after-free.
Now the comment states (and this was true once upon a long time ago) that we need to observe A->state while holding rq->lock because that will order us against the wakeup; however the wakeup will not in fact acquire (that) rq->lock; it takes A->pi_lock these days.
We can obviously fix this by upgrading the WMB to an MB, but that is expensive, so we'd rather avoid that.
The alternative this patch takes is: smp_store_release(&A->on_cpu, 0), which avoids the MB on some archs, but not important ones like ARM.
--- kernel/sched/core.c | 10 +++++----- kernel/sched/sched.h | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-)
kernel/sched/core.c +5 -5
@@ -2461,11 +2461,11 @@ static struct rq *finish_task_switch(str* If a task dies, then it sets TASK_DEAD in tsk->state and calls * schedule one last time. The schedule call will never return, and * the scheduled task must drop that reference. -* The test for TASK_DEAD must occur while the runqueue locks are -* still held, otherwise prev could be scheduled on another cpu, die -* there before we look at prev->state, and then the reference would -* be dropped twice. -* Manfred Spraul <[email protected]> +* +* We must observe prev->state before clearing prev->on_cpu (in +* finish_lock_switch), otherwise a concurrent wakeup can get prev +* running on another CPU and we could rave with its RUNNING -> DEAD +* transition, resulting in a double drop. */ prev_state = prev->state;vtime_task_switch (prev);
kernel/sched/sched.h +3 -2
@@ -1091,9 +1091,10 @@ static inline void finish_lock_switch(st* After ->on_cpu is cleared, the task can be moved to a different CPU. * We must ensure this doesn't happen until the switch is completely * finished. +* +* Pairs with the control dependency and rmb in try_to_wake_up(). */ -smp_wmb (); - prev->on_cpu =0 ; +smp_store_release (&prev->on_cpu,0 );#endif #ifdef CONFIG_DEBUG_SPINLOCK /* this is a valid case when another task releases the spinlock */
Greg Kroah-Hartman
maintainerPATCH 76/258 s390/compat: correct uc_sigmask of the compat signal frame
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
commit 8d4bd0ed0439dfc780aab801a085961925ed6838 upstream.
The uc_sigmask in the ucontext structure is an array of words to keep the 64 signal bits (or 1024 if you ask glibc but the kernel sigset_t only has 64 bits).
For 64 bit the sigset_t contains a single 8 byte word, but for 31 bit there are two 4 byte words. The compat signal handler code uses a simple copy of the 64 bit sigset_t to the 31 bit compat_sigset_t. As s390 is a big-endian architecture this is incorrect, the two words in the 31 bit sigset_t array need to be swapped.
--- arch/s390/kernel/compat_signal.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-)
arch/s390/kernel/compat_signal.c +23 -4
@@ -48,6 +48,19 @@ typedef structstruct ucontext32 uc; } rt_sigframe32; +static inline void sigset_to_sigset32 (unsigned long *set64, +compat_sigset_word *set32) +{ + set32[0 ] = (compat_sigset_word ) set64[0 ]; + set32[1 ] = (compat_sigset_word)(set64[0 ] >>32 ); +} + +static inline void sigset32_to_sigset (compat_sigset_word *set32, +unsigned long *set64) +{ + set64[0 ] = (unsigned long ) set32[0 ] | ((unsigned long ) set32[1 ] <<32 ); +} +int copy_siginfo_to_user32 (compat_siginfo_t __user *to,const siginfo_t *from) {int err;
@@ -303,10 +316,12 @@ COMPAT_SYSCALL_DEFINE0(sigreturn) {struct pt_regs *regs =task_pt_regs (current);sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15 ]; +compat_sigset_t cset;sigset_t set; -if (__copy_from_user (&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32)) +if (__copy_from_user (&cset.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32)) goto badframe; +sigset32_to_sigset (cset.sig, set.sig);set_current_blocked (&set);if (restore_sigregs32 (regs, &frame->sregs)) goto badframe;
@@ -323,10 +338,12 @@ COMPAT_SYSCALL_DEFINE0(rt_sigreturn) {struct pt_regs *regs =task_pt_regs (current);rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15 ]; +compat_sigset_t cset;sigset_t set; -if (__copy_from_user (&set, &frame->uc.uc_sigmask,sizeof (set))) +if (__copy_from_user (&cset, &frame->uc.uc_sigmask,sizeof (cset))) goto badframe; +sigset32_to_sigset (cset.sig, set.sig);set_current_blocked (&set);if (compat_restore_altstack (&frame->uc.uc_stack)) goto badframe;
@@ -397,7 +414,7 @@ static int setup_frame32(struct ksignalreturn -EFAULT ;/* Create struct sigcontext32 on the signal stack */ -memcpy (&sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32); +sigset_to_sigset32 (set->sig, sc.oldmask); sc.sregs = (__u32 )(unsigned long __force ) &frame->sregs;if (__copy_to_user (&frame->sc, &sc,sizeof (frame->sc)))return -EFAULT ;
@@ -458,6 +475,7 @@ static int setup_frame32(struct ksignalstatic int setup_rt_frame32 (struct ksignal *ksig,sigset_t *set,struct pt_regs *regs) { +compat_sigset_t cset;rt_sigframe32 __user *frame;unsigned long restorer;size_t frame_size;
@@ -505,11 +523,12 @@ static int setup_rt_frame32(struct ksignstore_sigregs ();/* Create ucontext on the signal stack. */ +sigset_to_sigset32 (set->sig, cset.sig);if (__put_user (uc_flags, &frame->uc.uc_flags) ||__put_user (0 , &frame->uc.uc_link) ||__compat_save_altstack (&frame->uc.uc_stack, regs->gprs[15 ]) ||save_sigregs32 (regs, &frame->uc.uc_mcontext) || -__copy_to_user (&frame->uc.uc_sigmask, set,sizeof (*set)) || +__copy_to_user (&frame->uc.uc_sigmask, &cset,sizeof (cset)) ||save_sigregs_ext32 (regs, &frame->uc.uc_mcontext_ext))return -EFAULT ;
Greg Kroah-Hartman
maintainerPATCH 77/258 s390/boot/decompression: disable floating point in decompressor
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Borntraeger <[email protected]>
commit adc0b7fbf6fe9967505c0254d9535ec7288186ae upstream.
my gcc 5.1 used an ldgr instruction with a register != 0,2,4,6 for spilling/filling into a floating point register in our decompressor.
This will cause an AFP-register data exception as the decompressor did not setup the additional floating point registers via cr0. That causes a program check loop that looked like a hang with one "Uncompressing Linux... " message (directly booted via kvm) or a loop of "Uncompressing Linux... " messages (when booted via zipl boot loader).
The offending code in my build was
48e400: e3 c0 af ff ff 71 lay %r12,-1(%r10) -->48e406: b3 c1 00 1c ldgr %f1,%r12 48e40a: ec 6c 01 22 02 7f clij %r6,2,12,0x48e64e
but gcc could do spilling into an fpr at any function. We can simply disable floating point support at that early stage.
--- arch/s390/boot/compressed/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/boot/compressed/Makefile +1 -1
@@ -10,7 +10,7 @@ targets += misc.o piggy.o sizes.h head.o KBUILD_CFLAGS := -m64 -D__KERNEL__ $(LINUX_INCLUDE) -O2 KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING -KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks +KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks -msoft-float KBUILD_CFLAGS += $(call cc-option,-mpacked-stack) KBUILD_CFLAGS += $(call cc-option,-ffreestanding)
Greg Kroah-Hartman
maintainerPATCH 78/258 Revert "cgroup: simplify threadgroup locking"
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit f9f9e7b776142fb1c0782cade004cc8e0147a199 upstream.
This reverts commit b5ba75b5fc0e8404e2c50cb68f39bb6a53fc916f.
d59cfc09c32a ("sched, cgroup: replace signal_struct->group_rwsem with a global percpu_rwsem") and b5ba75b5fc0e ("cgroup: simplify threadgroup locking") changed how cgroup synchronizes against task fork and exits so that it uses global percpu_rwsem instead of per-process rwsem; unfortunately, the write [un]lock paths of percpu_rwsem always involve synchronize_rcu_expedited() which turned out to be too expensive.
Improvements for percpu_rwsem are scheduled to be merged in the coming v4.4-rc1 merge window which alleviates this issue. For now, revert the two commits to restore per-process rwsem. They will be re-applied for the v4.4-rc1 merge window.
--- kernel/cgroup.c | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-)
kernel/cgroup.c +33 -12
@@ -2452,13 +2452,14 @@ static ssize_t __cgroup_procs_write(struif (!cgrp)return -ENODEV ; -percpu_down_write (&cgroup_threadgroup_rwsem); +retry_find_task:rcu_read_lock ();if (pid) { tsk =find_task_by_vpid (pid);if (!tsk) { +rcu_read_unlock (); ret = -ESRCH ; - goto out_unlock_rcu; + goto out_unlock_cgroup; } }else { tsk = current;
@@ -2474,23 +2475,37 @@ static ssize_t __cgroup_procs_write(stru*/ if (tsk == kthreadd_task || (tsk->flags &PF_NO_SETAFFINITY )) { ret = -EINVAL ; - goto out_unlock_rcu; +rcu_read_unlock (); + goto out_unlock_cgroup; }get_task_struct (tsk);rcu_read_unlock (); +percpu_down_write (&cgroup_threadgroup_rwsem); +if (threadgroup) { +if (!thread_group_leader (tsk)) { +/* +* a race with de_thread from another thread's exec() +* may strip us of our leadership, if this happens, +* there is no choice but to throw this task away and +* try again; this is +* "double-double-toil-and-trouble-check locking". +*/ +percpu_up_write (&cgroup_threadgroup_rwsem); +put_task_struct (tsk); + goto retry_find_task; + } + } + ret =cgroup_procs_write_permission (tsk, cgrp, of);if (!ret) ret =cgroup_attach_task (cgrp, tsk, threadgroup); -put_task_struct (tsk); - goto out_unlock_threadgroup; - -out_unlock_rcu: -rcu_read_unlock (); -out_unlock_threadgroup:percpu_up_write (&cgroup_threadgroup_rwsem); + +put_task_struct (tsk); +out_unlock_cgroup:cgroup_kn_unlock (of->kn);return ret ?: nbytes; }
@@ -2635,8 +2650,6 @@ static int cgroup_update_dfl_csses(struclockdep_assert_held (&cgroup_mutex); -percpu_down_write (&cgroup_threadgroup_rwsem); -/* look up all csses currently attached to @cgrp's subtree */ down_read (&css_set_rwsem);css_for_each_descendant_pre (css,cgroup_css (cgrp,NULL )) {
@@ -2692,8 +2705,17 @@ static int cgroup_update_dfl_csses(struc goto out_finish; last_task = task; +percpu_down_write (&cgroup_threadgroup_rwsem); +/* raced against de_thread() from another thread? */ +if (!thread_group_leader (task)) { +percpu_up_write (&cgroup_threadgroup_rwsem); +put_task_struct (task); +continue ; + } + ret =cgroup_migrate (src_cset->dfl_cgrp, task, true); +percpu_up_write (&cgroup_threadgroup_rwsem);put_task_struct (task);if (WARN (ret,"cgroup: failed to update controllers for the default hierarchy (%d), further operations may crash or hang\n" , ret))
@@ -2703,7 +2725,6 @@ static int cgroup_update_dfl_csses(struc out_finish:cgroup_migrate_finish (&preloaded_csets); -percpu_up_write (&cgroup_threadgroup_rwsem);return ret; }
Greg Kroah-Hartman
maintainerPATCH 79/258 Revert "sched, cgroup: replace signal_struct->group_rwsem with a global percpu_rwsem"
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit 0c986253b939cc14c69d4adbe2b4121bdf4aa220 upstream.
This reverts commit d59cfc09c32a2ae31f1c3bc2983a0cd79afb3f14.
d59cfc09c32a ("sched, cgroup: replace signal_struct->group_rwsem with a global percpu_rwsem") and b5ba75b5fc0e ("cgroup: simplify threadgroup locking") changed how cgroup synchronizes against task fork and exits so that it uses global percpu_rwsem instead of per-process rwsem; unfortunately, the write [un]lock paths of percpu_rwsem always involve synchronize_rcu_expedited() which turned out to be too expensive.
Improvements for percpu_rwsem are scheduled to be merged in the coming v4.4-rc1 merge window which alleviates this issue. For now, revert the two commits to restore per-process rwsem. They will be re-applied for the v4.4-rc1 merge window.
--- include/linux/cgroup-defs.h | 27 +-------------- include/linux/init_task.h | 8 ++++ include/linux/sched.h | 12 ++++++ kernel/cgroup.c | 77 ++++++++++++++++++++++++++++++++------------ kernel/fork.c | 4 ++ 5 files changed, 83 insertions(+), 45 deletions(-)
include/linux/cgroup-defs.h +2 -25
@@ -463,31 +463,8 @@ struct cgroup_subsys { unsigned int depends_on; }; -extern struct percpu_rw_semaphore cgroup_threadgroup_rwsem; - -/** -* cgroup_threadgroup_change_begin - threadgroup exclusion for cgroups -* @tsk: target task -* -* Called from threadgroup_change_begin() and allows cgroup operations to -* synchronize against threadgroup changes using a percpu_rw_semaphore. -*/ -static inline void cgroup_threadgroup_change_begin (struct task_struct *tsk) -{ -percpu_down_read (&cgroup_threadgroup_rwsem); -} - -/** -* cgroup_threadgroup_change_end - threadgroup exclusion for cgroups -* @tsk: target task -* -* Called from threadgroup_change_end(). Counterpart of -* cgroup_threadcgroup_change_begin(). -*/ -static inline void cgroup_threadgroup_change_end (struct task_struct *tsk) -{ -percpu_up_read (&cgroup_threadgroup_rwsem); -} +void cgroup_threadgroup_change_begin (struct task_struct *tsk); +void cgroup_threadgroup_change_end (struct task_struct *tsk);#else /* CONFIG_CGROUPS */
include/linux/init_task.h +8 -0
@@ -25,6 +25,13 @@extern struct files_struct init_files;extern struct fs_struct init_fs; +#ifdef CONFIG_CGROUPS +#define INIT_GROUP_RWSEM (sig) \ + .group_rwsem = __RWSEM_INITIALIZER(sig.group_rwsem), +#else +#define INIT_GROUP_RWSEM (sig) +#endif +#ifdef CONFIG_CPUSETS #define INIT_CPUSET_SEQ (tsk) \ .mems_allowed_seq = SEQCNT_ZERO(tsk.mems_allowed_seq),
@@ -48,6 +55,7 @@ extern struct fs_struct init_fs; }, \ .cred_guard_mutex = \ __MUTEX_INITIALIZER(sig.cred_guard_mutex), \ + INIT_GROUP_RWSEM(sig) \ }extern struct nsproxy init_nsproxy;
include/linux/sched.h +12 -0
@@ -754,6 +754,18 @@ struct signal_struct {unsigned audit_tty_log_passwd;struct tty_audit_buf *tty_audit_buf;#endif +#ifdef CONFIG_CGROUPS +/* +* group_rwsem prevents new tasks from entering the threadgroup and +* member tasks from exiting,a more specifically, setting of +* PF_EXITING. fork and exit paths are protected with this rwsem +* using threadgroup_change_begin/end(). Users which require +* threadgroup to remain stable should use threadgroup_[un]lock() +* which also takes care of exec path. Currently, cgroup is the +* only user. +*/ +struct rw_semaphore group_rwsem; +#endif oom_flags_t oom_flags;short oom_score_adj;/* OOM kill score adjustment */
kernel/cgroup.c +57 -20
157 lines not on this page · raw message
kernel/fork.c +4 -0
@@ -1146,6 +1146,10 @@ static int copy_signal(unsigned long clotty_audit_fork (sig);sched_autogroup_fork (sig); +#ifdef CONFIG_CGROUPS +init_rwsem (&sig->group_rwsem); +#endif + sig->oom_score_adj = current->signal->oom_score_adj; sig->oom_score_adj_min = current->signal->oom_score_adj_min;
Greg Kroah-Hartman
maintainerPATCH 80/258 memcg: make mem_cgroup_read_stat() unsigned
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Thelen <[email protected]>
commit 484ebb3b8c8b27dd2171696462a3116edb9ff801 upstream.
mem_cgroup_read_stat() returns a page count by summing per cpu page counters. The summing is racy wrt. updates, so a transient negative sum is possible. Callers don't want negative values:
- mem_cgroup_wb_stats() doesn't want negative nr_dirty or nr_writeback. This could confuse dirty throttling.
- oom reports and memory.stat shouldn't show confusing negative usage.
- tree_usage() already avoids negatives.
Avoid returning negative page counts from mem_cgroup_read_stat() and convert it to unsigned.
--- mm/memcontrol.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-)
mm/memcontrol.c +18 -12
@@ -806,12 +806,14 @@ mem_cgroup_largest_soft_limit_node(struc }/* +* Return page count for single (non recursive) @memcg. +* * Implementation Note: reading percpu statistics for memcg. * * Both of vmstat[] and percpu_counter has threshold and do periodic * synchronization to implement "quick" read. There are trade-off between * reading cost and precision of value. Then, we may have a chance to implement -* a periodic synchronizion of counter in memcg's counter. +* a periodic synchronization of counter in memcg's counter. * * But this _read() function is used for user interface now. The user accounts * memory usage by memory cgroup and he _always_ requires exact value because
@@ -821,17 +823,24 @@ mem_cgroup_largest_soft_limit_node(struc* * If there are kernel internal actions which can make use of some not-exact * value, and reading all cpu value can be performance bottleneck in some -* common workload, threashold and synchonization as vmstat[] should be +* common workload, threshold and synchronization as vmstat[] should be * implemented. */ -static long mem_cgroup_read_stat (struct mem_cgroup *memcg, -enum mem_cgroup_stat_index idx) +static unsigned long +mem_cgroup_read_stat (struct mem_cgroup *memcg,enum mem_cgroup_stat_index idx) {long val =0 ;int cpu; +/* Per-cpu values can be negative, use a signed accumulator */ for_each_possible_cpu (cpu) val +=per_cpu (memcg->stat->count[idx], cpu); +/* +* Summing races with updates, so val may be negative. Avoid exposing +* transient negative values. +*/ +if (val <0 ) + val =0 ;return val; }
@@ -1498,7 +1507,7 @@ void mem_cgroup_print_oom_info(struct mefor (i =0 ; i <MEM_CGROUP_STAT_NSTATS ; i++) {if (i ==MEM_CGROUP_STAT_SWAP && !do_swap_account)continue ; -pr_cont (" %s:%ldKB" , mem_cgroup_stat_names[i], +pr_cont (" %s:%luKB" , mem_cgroup_stat_names[i],K (mem_cgroup_read_stat (iter, i))); }
@@ -3119,14 +3128,11 @@ static unsigned long tree_stat(struct me enum mem_cgroup_stat_index idx) {struct mem_cgroup *iter; -long val =0 ; +unsigned long val =0 ; -/* Per-cpu values can be negative, use a signed accumulator */ for_each_mem_cgroup_tree (iter, memcg) val +=mem_cgroup_read_stat (iter, idx); -if (val <0 )/* race ? */ - val =0 ;return val; }
@@ -3469,7 +3475,7 @@ static int memcg_stat_show(struct seq_fifor (i =0 ; i <MEM_CGROUP_STAT_NSTATS ; i++) {if (i ==MEM_CGROUP_STAT_SWAP && !do_swap_account)continue ; -seq_printf (m,"%s %ld\n" , mem_cgroup_stat_names[i], +seq_printf (m,"%s %lu\n" , mem_cgroup_stat_names[i],mem_cgroup_read_stat (memcg, i) *PAGE_SIZE ); }
@@ -3494,13 +3500,13 @@ static int memcg_stat_show(struct seq_fi (u64)memsw * PAGE_SIZE);for (i =0 ; i <MEM_CGROUP_STAT_NSTATS ; i++) { -long long val =0 ; +unsigned long long val =0 ;if (i ==MEM_CGROUP_STAT_SWAP && !do_swap_account)continue ;for_each_mem_cgroup_tree (mi, memcg) val +=mem_cgroup_read_stat (mi, i) *PAGE_SIZE ; -seq_printf (m,"total_%s %lld\n" , mem_cgroup_stat_names[i], val); +seq_printf (m,"total_%s %llu\n" , mem_cgroup_stat_names[i], val); }for (i =0 ; i <MEM_CGROUP_EVENTS_NSTATS ; i++) {
Greg Kroah-Hartman
maintainerPATCH 81/258 spi: Fix documentation of spi_alloc_master()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
commit a394d635193b641f2c86ead5ada5b115d57c51f8 upstream.
Actually, spi_master_put() after spi_alloc_master() must _not_ be followed by kfree(). The memory is already freed with the call to spi_master_put() through spi_master_class, which registers a release function. Calling both spi_master_put() and kfree() results in often nasty (and delayed) crashes elsewhere in the kernel, often in the networking stack.
This reverts commit eb4af0f5349235df2e4a5057a72fc8962d00308a.
Link to patch and concerns: https://lkml.org/lkml/2012/9/3/269
or
http://lkml.iu.edu/hypermail/linux/kernel/1209.0/00790.html
Alexey Klimov: This revert becomes valid after 94c69f765f1b4a658d96905ec59928e3e3e07e6a when spi-imx.c has been fixed and there is no need to call kfree() so comment for spi_alloc_master() should be fixed.
--- drivers/spi/spi.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/spi/spi.c +1 -2
@@ -1437,8 +1437,7 @@ static struct class spi_master_class = {* * The caller is responsible for assigning the bus number and initializing * the master's methods before calling spi_register_master(); and (after errors -* adding the device) calling spi_master_put() and kfree() to prevent a memory -* leak. +* adding the device) calling spi_master_put() to prevent a memory leak. */ struct spi_master *spi_alloc_master (struct device *dev,unsigned size) {
Greg Kroah-Hartman
maintainerPATCH 82/258 spi: xtensa-xtfpga: fix register endianness
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Filippov <[email protected]>
commit b0b4855099e301c8603ea37da9a0103a96c2e0b1 upstream.
XTFPGA SPI controller has native endian registers.
Fix register acessors so that they work in big-endian configurations.
--- drivers/spi/spi-xtensa-xtfpga.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/spi/spi-xtensa-xtfpga.c +2 -2
@@ -34,13 +34,13 @@ struct xtfpga_spi {static inline void xtfpga_spi_write32 (const struct xtfpga_spi *spi,unsigned addr,u32 val) { -iowrite32 (val, spi->regs + addr); +__raw_writel (val, spi->regs + addr); }static inline unsigned int xtfpga_spi_read32 (const struct xtfpga_spi *spi,unsigned addr) { -return ioread32 (spi->regs + addr); +return __raw_readl (spi->regs + addr); }static inline void xtfpga_spi_wait_busy (struct xtfpga_spi *xspi)
Greg Kroah-Hartman
maintainerPATCH 83/258 spi: bcm2835: BUG: fix wrong use of PAGE_MASK
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Sperl <[email protected]>
commit 2a3fffd45822070309bcf0b1e1dae624d633824a upstream.
There is a bug in the alignment checking of transfers, that results in DMA not being used for un-aligned transfers that do not cross page-boundries, which is valid.
This is due to a missconception of the meaning PAGE_MASK when implementing that check originally - (PAGE_SIZE - 1) should have been used instead.
Also fixes a copy/paste error.
--- drivers/spi/spi-bcm2835.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/spi/spi-bcm2835.c +3 -3
@@ -386,14 +386,14 @@ static bool bcm2835_spi_can_dma(struct s/* otherwise we only allow transfers within the same page * to avoid wasting time on dma_mapping when it is not practical */ -if (((size_t )tfr->tx_buf &PAGE_MASK ) + tfr->len >PAGE_SIZE ) { +if (((size_t )tfr->tx_buf & (PAGE_SIZE -1 )) + tfr->len >PAGE_SIZE ) {dev_warn_once (&spi->dev,"Unaligned spi tx-transfer bridging page\n" );return false; } -if (((size_t )tfr->rx_buf &PAGE_MASK ) + tfr->len >PAGE_SIZE ) { +if (((size_t )tfr->rx_buf & (PAGE_SIZE -1 )) + tfr->len >PAGE_SIZE ) {dev_warn_once (&spi->dev, -"Unaligned spi tx-transfer bridging page\n" ); +"Unaligned spi rx-transfer bridging page\n" );return false; }
Greg Kroah-Hartman
maintainerPATCH 84/258 spi: spi-pxa2xx: Check status register to determine if SSSR_TINT is disabled
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Tan, Jui Nee" <[email protected]>
commit 02bc933ebb59208f42c2e6305b2c17fd306f695d upstream.
On Intel Baytrail, there is case when interrupt handler get called, no SPI message is captured. The RX FIFO is indeed empty when RX timeout pending interrupt (SSSR_TINT) happens.
Use the BIOS version where both HSUART and SPI are on the same IRQ. Both drivers are using IRQF_SHARED when calling the request_irq function. When running two separate and independent SPI and HSUART application that generate data traffic on both components, user will see messages like below on the console:
pxa2xx-spi pxa2xx-spi.0: bad message state in interrupt handler
This commit will fix this by first checking Receiver Time-out Interrupt, if it is disabled, ignore the request and return without servicing.
--- drivers/spi/spi-pxa2xx.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/spi/spi-pxa2xx.c +4 -0
@@ -643,6 +643,10 @@ static irqreturn_t ssp_int(int irq, voidif (!(sccr1_reg &SSCR1_TIE )) mask &= ~SSSR_TFS ; +/* Ignore RX timeout interrupt if it is disabled */ +if (!(sccr1_reg &SSCR1_TINTE )) + mask &= ~SSSR_TINT ; +if (!(status & mask))return IRQ_NONE ;
Greg Kroah-Hartman
maintainerPATCH 85/258 spi: spidev: fix possible NULL dereference
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudip Mukherjee <[email protected]>
commit dd85ebf681ef0ee1fc985c353dd45e8b53b5dc1e upstream.
During the last close we are freeing spidev if spidev->spi is NULL, but just before checking if spidev->spi is NULL we are dereferencing it. Lets add a check there to avoid the NULL dereference.
--- drivers/spi/spidev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/spi/spidev.c +2 -1
@@ -651,7 +651,8 @@ static int spidev_release(struct inode *kfree (spidev->rx_buffer); spidev->rx_buffer =NULL ; - spidev->speed_hz = spidev->spi->max_speed_hz; +if (spidev->spi) + spidev->speed_hz = spidev->spi->max_speed_hz;/* ... after we unbound from the underlying device? */ spin_lock_irq (&spidev->spi_lock);
Greg Kroah-Hartman
maintainerPATCH 86/258 mm: migrate: hugetlb: putback destination hugepage to active list
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naoya Horiguchi <[email protected]>
commit 3aaa76e125c1dd58c9b599baa8c6021896874c12 upstream.
Since commit bcc54222309c ("mm: hugetlb: introduce page_huge_active") each hugetlb page maintains its active flag to avoid a race condition betwe= en multiple calls of isolate_huge_page(), but current kernel doesn't set the f= lag on a hugepage allocated by migration because the proper putback routine isn= 't called. This means that users could still encounter the race referred to by bcc54222309c in this special case, so this patch fixes it.
--- mm/migrate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/migrate.c +1 -1
@@ -1068,7 +1068,7 @@ out:if (rc !=MIGRATEPAGE_SUCCESS && put_new_page)put_new_page (new_hpage, private);else -put_page (new_hpage); +putback_active_hugepage (new_hpage);if (result) {if (rc)
Greg Kroah-Hartman
maintainerPATCH 87/258 lib/iommu-common.c: do not try to deref a null iommu->lazy_flush() pointer when n < pool->hint
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sowmini Varadhan <[email protected]>
commit d046b770c9fc36ccb19c27afdb8322220108cbc7 upstream.
The check for invoking iommu->lazy_flush() from iommu_tbl_range_alloc() has to be refactored so that we only call ->lazy_flush() if it is non-null.
I had a sparc kernel that was crashing when I was trying to process some very large perf.data files- the crash happens when the scsi driver calls into dma_4v_map_sg and thus the iommu_tbl_range_alloc().
--- lib/iommu-common.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
lib/iommu-common.c +3 -3
@@ -21,8 +21,7 @@ static DEFINE_PER_CPU(unsigned int, iommstatic inline bool need_flush (struct iommu_map_table *iommu) { -return (iommu->lazy_flush !=NULL && - (iommu->flags &IOMMU_NEED_FLUSH ) !=0 ); +return ((iommu->flags &IOMMU_NEED_FLUSH ) !=0 ); }static inline void set_flush (struct iommu_map_table *iommu)
@@ -211,7 +210,8 @@ unsigned long iommu_tbl_range_alloc(stru goto bail; } } -if (n < pool->hint ||need_flush (iommu)) { +if (iommu->lazy_flush && + (n < pool->hint ||need_flush (iommu))) {clear_flush (iommu); iommu->lazy_flush (iommu); }
Greg Kroah-Hartman
maintainerPATCH 88/258 ocfs2/dlm: fix deadlock when dispatch assert master
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joseph Qi <[email protected]>
commit 012572d4fc2e4ddd5c8ec8614d51414ec6cae02a upstream.
The order of the following three spinlocks should be:dlm_domain_lock < dlm_ctxt->spinlock < dlm_lock_resource->spinlock
But dlm_dispatch_assert_master() is called while holding dlm_ctxt->spinlock and dlm_lock_resource->spinlock, and then it calls dlm_grab() which will take dlm_domain_lock.
Once another thread (for example, dlm_query_join_handler) has already taken dlm_domain_lock, and tries to take dlm_ctxt->spinlock deadlock happens.
--- fs/ocfs2/dlm/dlmmaster.c | 9 ++++++--- fs/ocfs2/dlm/dlmrecovery.c | 8 ++++++-- 2 files changed, 12 insertions(+), 5 deletions(-)
fs/ocfs2/dlm/dlmmaster.c +6 -3
@@ -1439,6 +1439,7 @@ int dlm_master_request_handler(struct o2int found, ret;int set_maybe;int dispatch_assert =0 ; +int dispatched =0 ;if (!dlm_grab (dlm))return DLM_MASTER_RESP_NO ;
@@ -1658,15 +1659,18 @@ send_response:mlog (ML_ERROR ,"failed to dispatch assert master work\n" ); response =DLM_MASTER_RESP_ERROR ;dlm_lockres_put (res); - }else + }else { + dispatched =1 ;__dlm_lockres_grab_inflight_worker (dlm, res); + }spin_unlock (&res->spinlock); }else {if (res)dlm_lockres_put (res); } -dlm_put (dlm); +if (!dispatched) +dlm_put (dlm);return response; }
@@ -2090,7 +2094,6 @@ int dlm_dispatch_assert_master(struct dl/* queue up work for dlm_assert_master_worker */ -dlm_grab (dlm);/* get an extra ref for the work item */ dlm_init_work_item (dlm, item, dlm_assert_master_worker,NULL ); item->u.am.lockres = res;/* already have a ref */ /* can optionally ignore node numbers higher than this node */
fs/ocfs2/dlm/dlmrecovery.c +6 -2
@@ -1694,6 +1694,7 @@ int dlm_master_requery_handler(struct o2unsigned int hash;int master =DLM_LOCK_RES_OWNER_UNKNOWN ;u32 flags =DLM_ASSERT_MASTER_REQUERY ; +int dispatched =0 ;if (!dlm_grab (dlm)) {/* since the domain has gone away on this
@@ -1719,8 +1720,10 @@ int dlm_master_requery_handler(struct o2dlm_put (dlm);/* sender will take care of this and retry */ return ret; - }else + }else { + dispatched =1 ;__dlm_lockres_grab_inflight_worker (dlm, res); + }spin_unlock (&res->spinlock); }else {/* put.. incase we are not the master */
@@ -1730,7 +1733,8 @@ int dlm_master_requery_handler(struct o2 }spin_unlock (&dlm->spinlock); -dlm_put (dlm); +if (!dispatched) +dlm_put (dlm);return master; }
Greg Kroah-Hartman
maintainerPATCH 89/258 mm: hugetlbfs: skip shared VMAs when unmapping private pages to satisfy a fault
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mel Gorman <[email protected]>
commit 2f84a8990ebbe235c59716896e017c6b2ca1200f upstream.
SunDong reported the following on
https://bugzilla.kernel.org/show_bug.cgi?id=103841
I think I find a linux bug, I have the test cases is constructed. I can stable recurring problems in fedora22(4.0.4) kernel version, arch for x86_64. I construct transparent huge page, when the parent and child process with MAP_SHARE, MAP_PRIVATE way to access the same huge page area, it has the opportunity to lead to huge page copy on write failure, and then it will munmap the child corresponding mmap area, but then the child mmap area with VM_MAYSHARE attributes, child process munmap this area can trigger VM_BUG_ON in set_vma_resv_flags functions (vma - > vm_flags & VM_MAYSHARE).
There were a number of problems with the report (e.g. it's hugetlbfs that triggers this, not transparent huge pages) but it was fundamentally correct in that a VM_BUG_ON in set_vma_resv_flags() can be triggered that looks like this
vma ffff8804651fd0d0 start 00007fc474e00000 end 00007fc475e00000 next ffff8804651fd018 prev ffff8804651fd188 mm ffff88046b1b1800 prot 8000000000000027 anon_vma (null) vm_ops ffffffff8182a7a0 pgoff 0 file ffff88106bdb9800 private_data (null) flags: 0x84400fb(read|write|shared|mayread|maywrite|mayexec|mayshare|dontexpand|hugetlb) ------------ kernel BUG at mm/hugetlb.c:462! SMP Modules linked in: xt_pkttype xt_LOG xt_limit [..] CPU: 38 PID: 26839 Comm: map Not tainted 4.0.4-default #1 Hardware name: Dell Inc. PowerEdge R810/0TT6JF, BIOS 2.7.4 04/26/2012 set_vma_resv_flags+0x2d/0x30
The VM_BUG_ON is correct because private and shared mappings have different reservation accounting but the warning clearly shows that the VMA is shared.
When a private COW fails to allocate a new page then only the process that created the VMA gets the page -- all the children unmap the page. If the children access that data in the future then they get killed.
The problem is that the same file is mapped shared and private. During the COW, the allocation fails, the VMAs are traversed to unmap the other private pages but a shared VMA is found and the bug is triggered. This patch identifies such VMAs and skips them.
--- mm/hugetlb.c | 8 ++++++++ 1 file changed, 8 insertions(+)
mm/hugetlb.c +8 -0
@@ -2974,6 +2974,14 @@ static void unmap_ref_private(struct mm_continue ;/* +* Shared VMAs have their own reserves and do not affect +* MAP_PRIVATE accounting but it is possible that a shared +* VMA is using the same page so check and skip such VMAs. +*/ +if (iter_vma->vm_flags &VM_MAYSHARE ) +continue ; + +/* * Unmap the page from other VMAs without their own reserves. * They get marked to be SIGKILLed if they fault in these * areas. This is because a future no-page fault on this VMA
Greg Kroah-Hartman
maintainerPATCH 90/258 memcg: fix dirty page migration
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Thelen <[email protected]>
commit 0610c25daa3e76e38ad5a8fae683a89ff9f71798 upstream.
The problem starts with a file backed dirty page which is charged to a memcg. Then page migration is used to move oldpage to newpage.
Migration:
- copies the oldpage's data to newpage
- clears oldpage.PG_dirty
- sets newpage.PG_dirty
- uncharges oldpage from memcg
- charges newpage to memcg
Clearing oldpage.PG_dirty decrements the charged memcg's dirty page count.
However, because newpage is not yet charged, setting newpage.PG_dirty does not increment the memcg's dirty page count. After migration completes newpage.PG_dirty is eventually cleared, often in account_page_cleaned(). At this time newpage is charged to a memcg so the memcg's dirty page count is decremented which causes underflow because the count was not previously incremented by migration. This underflow causes balance_dirty_pages() to see a very large unsigned number of dirty memcg pages which leads to aggressive throttling of buffered writes by processes in non root memcg.
This issue:
- can harm performance of non root memcg buffered writes.
- can report too small (even negative) values in memory.stat[(total_)dirty] counters of all memcg, including the root.
To avoid polluting migrate.c with #ifdef CONFIG_MEMCG checks, introduce page_memcg() and set_page_memcg() helpers.
Test:
0) setup and enter limited memcg
mkdir /sys/fs/cgroup/test
echo 1G > /sys/fs/cgroup/test/memory.limit_in_bytes echo $$ > /sys/fs/cgroup/test/cgroup.procs
1) buffered writes baseline
dd if=/dev/zero of=/data/tmp/foo bs=1M count=1k sync
grep ^dirty /sys/fs/cgroup/test/memory.stat
2) buffered writes with compaction antagonist to induce migration yes 1 > /proc/sys/vm/compact_memory &
rm -rf /data/tmp/foo
dd if=/dev/zero of=/data/tmp/foo bs=1M count=1k
kill %
sync
grep ^dirty /sys/fs/cgroup/test/memory.stat
3) buffered writes without antagonist, should match baseline rm -rf /data/tmp/foo
dd if=/dev/zero of=/data/tmp/foo bs=1M count=1k sync
grep ^dirty /sys/fs/cgroup/test/memory.stat
(speed, dirty residue)
unpatched patched
1) 841 MB/s 0 dirty pages 886 MB/s 0 dirty pages
2) 611 MB/s -33427456 dirty pages 793 MB/s 0 dirty pages
3) 114 MB/s -33427456 dirty pages 891 MB/s 0 dirty pages
Notice that unpatched baseline performance (1) fell after migration (3): 841 -> 114 MB/s. In the patched kernel, post migration performance matches baseline.
--- include/linux/mm.h | 21 +++++++++++++++++++++ mm/migrate.c | 12 +++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-)
include/linux/mm.h +21 -0
@@ -916,6 +916,27 @@ static inline void set_page_links(struct#endif } +#ifdef CONFIG_MEMCG +static inline struct mem_cgroup *page_memcg (struct page *page) +{ +return page->mem_cgroup; +} + +static inline void set_page_memcg (struct page *page,struct mem_cgroup *memcg) +{ + page->mem_cgroup = memcg; +} +#else +static inline struct mem_cgroup *page_memcg (struct page *page) +{ +return NULL ; +} + +static inline void set_page_memcg (struct page *page,struct mem_cgroup *memcg) +{ +} +#endif +/* * Some inline functions in vmstat.h depend on page_zone() */
mm/migrate.c +11 -1
@@ -734,6 +734,15 @@ static int move_to_new_page(struct pageif (PageSwapBacked (page))SetPageSwapBacked (newpage); +/* +* Indirectly called below, migrate_page_copy() copies PG_dirty and thus +* needs newpage's memcg set to transfer memcg dirty page accounting. +* So perform memcg migration in two steps: +* 1. set newpage->mem_cgroup (here) +* 2. clear page->mem_cgroup (below) +*/ +set_page_memcg (newpage,page_memcg (page)); + mapping =page_mapping (page);if (!mapping) rc =migrate_page (mapping, newpage, page, mode);
@@ -750,9 +759,10 @@ static int move_to_new_page(struct page rc =fallback_migrate_page (mapping, newpage, page, mode);if (rc !=MIGRATEPAGE_SUCCESS ) { +set_page_memcg (newpage,NULL ); newpage->mapping =NULL ; }else { -mem_cgroup_migrate (page, newpage, false); +set_page_memcg (page,NULL );if (page_was_mapped)remove_migration_ptes (page, newpage); page->mapping =NULL ;
Greg Kroah-Hartman
maintainerPATCH 94/258 ALSA: hda: Add dock support for ThinkPad T550
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laura Abbott <[email protected]>
commit d05ea7da0e8f6df3c62cfee75538f347cb3d89ef upstream.
Much like all the other Lenovo laptops, add a quirk to make sound work with docking.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -5306,6 +5306,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x2212 ,"Thinkpad T440" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x2214 ,"Thinkpad X240" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x2215 ,"Thinkpad" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST ), +SND_PCI_QUIRK (0x17aa ,0x2223 ,"ThinkPad T550" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x2226 ,"ThinkPad X250" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x3977 ,"IdeaPad S210" ,ALC283_FIXUP_INT_MIC ), SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
Greg Kroah-Hartman
maintainerPATCH 95/258 ALSA: hda - Apply SPDIF pin ctl to MacBookPro 12,1
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Flatness <[email protected]>
commit e8ff581f7ac2bc3b8886094b7ca635dcc4d1b0e9 upstream.
The MacBookPro 12,1 has the same setup as the 11 for controlling the status of the optical audio light. Simply apply the existing workaround to the subsystem ID for the 12,1.
[sorted the fixup entry by tiwai]
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=105401
--- sound/pci/hda/patch_cirrus.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_cirrus.c +1 -0
@@ -633,6 +633,7 @@ static const struct snd_pci_quirk cs4208SND_PCI_QUIRK (0x106b ,0x5e00 ,"MacBookPro 11,2" ,CS4208_MBP11 ),SND_PCI_QUIRK (0x106b ,0x7100 ,"MacBookAir 6,1" ,CS4208_MBA6 ),SND_PCI_QUIRK (0x106b ,0x7200 ,"MacBookAir 6,2" ,CS4208_MBA6 ), + SND_PCI_QUIRK(0x106b, 0x7b00, "MacBookPro 12,1", CS4208_MBP11), {} /* terminator */ };
Greg Kroah-Hartman
maintainerPATCH 96/258 ALSA: hda - Disable power_save_node for IDT 92HD73xx chips
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit c7e1008048a97148d3aecae742f66fb2f944644c upstream.
The recent widget power saving introduced some unavoidable click noises on old IDT 92HD73xx chips while it still seems working on the compatible new chips. In the bugzilla, we tried lots of tests and workarounds, but they didn't help much. So, let's disable the feature for these specific chips as the least (but safest) fix.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=104981
--- sound/pci/hda/patch_sigmatel.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
sound/pci/hda/patch_sigmatel.c +5 -1
@@ -4520,7 +4520,11 @@ static int patch_stac92hd73xx(struct hdareturn err; spec = codec->spec; - codec->power_save_node =1 ; +/* enable power_save_node only for new 92HD89xx chips, as it causes +* click noises on old 92HD73xx chips. +*/ +if ((codec->core.vendor_id &0xfffffff0 ) !=0x111d7670 ) + codec->power_save_node =1 ; spec->linear_tone_beep =0 ; spec->gen.mixer_nid =0x1d ; spec->have_spdif_mux =1 ;
Greg Kroah-Hartman
maintainerPATCH 98/258 ASoC: fix broken pxa SoC support
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Jarzmik <[email protected]>
commit 3c8f7710c1c44fb650bc29b6ef78ed8b60cfaa28 upstream.
The previous fix of pxa library support, which was introduced to fix the library dependency, broke the previous SoC behavior, where a machine code binding pxa2xx-ac97 with a coded relied on :
- sound/soc/pxa/pxa2xx-ac97.c
- sound/soc/codecs/XXX.c
For example, the mioa701_wm9713.c machine code is currently broken. The "select ARM" statement wrongly selects the soc/arm/pxa2xx-ac97 for compilation, as per an unfortunate fate SND_PXA2XX_AC97 is both declared in sound/arm/Kconfig and sound/soc/pxa/Kconfig.
Fix this by ensuring that SND_PXA2XX_SOC correctly triggers the correct pxa2xx-ac97 compilation.
--- sound/arm/Kconfig | 15 ++++++++------- sound/soc/pxa/Kconfig | 2 -- 2 files changed, 8 insertions(+), 9 deletions(-)
sound/arm/Kconfig +8 -7
@@ -9,6 +9,14 @@ menuconfig SND_ARM Drivers that are implemented on ASoC can be found in "ALSA for SoC audio support" section. +config SND_PXA2XX_LIB + tristate + select SND_AC97_CODEC if SND_PXA2XX_LIB_AC97 + select SND_DMAENGINE_PCM + +config SND_PXA2XX_LIB_AC97 + bool + if SND_ARM config SND_ARMAACI
@@ -21,13 +29,6 @@ config SND_PXA2XX_PCM tristate select SND_PCM -config SND_PXA2XX_LIB - tristate - select SND_AC97_CODEC if SND_PXA2XX_LIB_AC97 - -config SND_PXA2XX_LIB_AC97 - bool - config SND_PXA2XX_AC97 tristate "AC97 driver for the Intel PXA2xx chip" depends on ARCH_PXA
sound/soc/pxa/Kconfig +0 -2
@@ -1,7 +1,6 @@ config SND_PXA2XX_SOC tristate "SoC Audio for the Intel PXA2xx chip" depends on ARCH_PXA - select SND_ARM select SND_PXA2XX_LIB help Say Y or M if you want to add support for codecs attached to
@@ -25,7 +24,6 @@ config SND_PXA2XX_AC97 config SND_PXA2XX_SOC_AC97 tristate select AC97_BUS - select SND_ARM select SND_PXA2XX_LIB_AC97 select SND_SOC_AC97_BUS
Greg Kroah-Hartman
maintainerPATCH 99/258 ASoC: dwc: correct irq clear method
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yitian Bu <[email protected]>
commit 4873867e5f2bd90faad861dd94865099fc3140f3 upstream.
from Designware I2S datasheet, tx/rx XRUN irq is cleared by reading register TOR/ROR, rather than by writing into them.
--- sound/soc/dwc/designware_i2s.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/dwc/designware_i2s.c +2 -2
@@ -131,10 +131,10 @@ static inline void i2s_clear_irqs(structif (stream ==SNDRV_PCM_STREAM_PLAYBACK ) {for (i =0 ; i <4 ; i++) -i2s_write_reg (dev->i2s_base,TOR (i),0 ); +i2s_read_reg (dev->i2s_base,TOR (i)); }else {for (i =0 ; i <4 ; i++) -i2s_write_reg (dev->i2s_base,ROR (i),0 ); +i2s_read_reg (dev->i2s_base,ROR (i)); } }
Greg Kroah-Hartman
maintainerPATCH 100/258 ASoC: db1200: Fix DAI link format for db1300 and db1550
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit e74679b38c9417c1c524081121cdcdb36f82264d upstream.
Commit b4508d0f95fa ("ASoC: db1200: Use static DAI format setup") switched the db1200 driver over to using static DAI format setup instead of a callback function. But the commit only added the dai_fmt field to one of the three DAI links in the driver. This breaks audio on db1300 and db1550.
Add the two missing dai_fmt settings to fix the issue.
--- sound/soc/au1x/db1200.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/soc/au1x/db1200.c +4 -0
@@ -129,6 +129,8 @@ static struct snd_soc_dai_link db1300_i2 .cpu_dai_name = "au1xpsc_i2s.2", .platform_name = "au1xpsc-pcm.2", .codec_name = "wm8731.0-001b", + .dai_fmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBM_CFM, .ops = &db1200_i2s_wm8731_ops, };
@@ -146,6 +148,8 @@ static struct snd_soc_dai_link db1550_i2 .cpu_dai_name = "au1xpsc_i2s.3", .platform_name = "au1xpsc-pcm.3", .codec_name = "wm8731.0-001b", + .dai_fmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBM_CFM, .ops = &db1200_i2s_wm8731_ops, };
Greg Kroah-Hartman
maintainerPATCH 105/258 Btrfs: update fix for read corruption of compressed and shared extents
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit 808f80b46790f27e145c72112189d6a3be2bc884 upstream.
My previous fix in commit 005efedf2c7d ("Btrfs: fix read corruption of compressed and shared extents") was effective only if the compressed extents cover a file range with a length that is not a multiple of 16 pages. That's because the detection of when we reached a different range of the file that shares the same compressed extent as the previously processed range was done at extent_io.c:__do_contiguous_readpages(), which covers subranges with a length up to 16 pages, because extent_readpages() groups the pages in clusters no larger than 16 pages. So fix this by tracking the start of the previously processed file range's extent map at extent_readpages().
The following test case for fstests reproduces the issue:
seq=basename $0
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
rm -f $tmp.*
}# get standard environment, filters and checks . ./common/rc . ./common/filter
# real QA test starts here _need_to_be_root _supported_fs btrfs _supported_os Linux _require_scratch _require_cloner
rm -f $seqres.full
test_clone_and_read_compressed_extent()
{
local mount_opts=$1 _scratch_mkfs >>$seqres.full 2>&1
_scratch_mount $mount_opts
# Create our test file with a single extent of 64Kb that is going to # be compressed no matter which compression algo is used (zlib/lzo). $XFS_IO_PROG -f -c "pwrite -S 0xaa 0K 64K" \
$SCRATCH_MNT/foo | _filter_xfs_io
# Now clone the compressed extent into an adjacent file offset. $CLONER_PROG -s 0 -d $((64 * 1024)) -l $((64 * 1024)) \
$SCRATCH_MNT/foo $SCRATCH_MNT/foo
echo "File digest before unmount:"
md5sum $SCRATCH_MNT/foo | _filter_scratch
# Remount the fs or clear the page cache to trigger the bug in # btrfs. Because the extent has an uncompressed length that is a # multiple of 16 pages, all the pages belonging to the second range # of the file (64K to 128K), which points to the same extent as the # first range (0K to 64K), had their contents full of zeroes instead # of the byte 0xaa. This was a bug exclusively in the read path of # compressed extents, the correct data was stored on disk, btrfs # just failed to fill in the pages correctly. _scratch_remount
echo "File digest after remount:"
# Must match the digest we got before.
md5sum $SCRATCH_MNT/foo | _filter_scratch
}
echo -e "\nTesting with zlib compression..." test_clone_and_read_compressed_extent "-o compress=zlib"
_scratch_unmount
echo -e "\nTesting with lzo compression..." test_clone_and_read_compressed_extent "-o compress=lzo"
status=0
exit
--- fs/btrfs/extent_io.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
fs/btrfs/extent_io.c +11 -8
@@ -3131,12 +3131,12 @@ static inline void __do_contiguous_readpget_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw) + unsigned long *bio_flags, int rw, + u64 *prev_em_start) { struct inode *inode;struct btrfs_ordered_extent *ordered;int index; -u64 prev_em_start = (u64)-1 ; inode = pages[0 ]->mapping->host;while (1 ) {
@@ -3152,7 +3152,7 @@ static inline void __do_contiguous_readpfor (index =0 ; index < nr_pages; index++) {__do_readpage (tree, pages[index], get_extent, em_cached, bio, - mirror_num, bio_flags, rw, &prev_em_start); + mirror_num, bio_flags, rw, prev_em_start);page_cache_release (pages[index]); } }
@@ -3162,7 +3162,8 @@ static void __extent_readpages(struct ex int nr_pages, get_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw) + unsigned long *bio_flags, int rw, + u64 *prev_em_start) { u64 start = 0;u64 end =0 ;
@@ -3183,7 +3184,7 @@ static void __extent_readpages(struct ex index - first_index, start, end, get_extent, em_cached, bio, mirror_num, bio_flags, - rw); + rw, prev_em_start); start = page_start; end = start +PAGE_CACHE_SIZE -1 ; first_index = index;
@@ -3194,7 +3195,8 @@ static void __extent_readpages(struct ex__do_contiguous_readpages (tree, &pages[first_index], index - first_index, start, end, get_extent, em_cached, bio, - mirror_num, bio_flags, rw); + mirror_num, bio_flags, rw, + prev_em_start); } static int __extent_read_full_page(struct extent_io_tree *tree,
@@ -4205,6 +4207,7 @@ int extent_readpages(struct extent_io_trstruct page *page;struct extent_map *em_cached =NULL ;int nr =0 ; +u64 prev_em_start = (u64)-1 ;for (page_idx =0 ; page_idx < nr_pages; page_idx++) { page = list_entry(pages->prev, struct page, lru);
@@ -4221,12 +4224,12 @@ int extent_readpages(struct extent_io_trif (nr <ARRAY_SIZE (pagepool))continue ;__extent_readpages (tree, pagepool, nr, get_extent, &em_cached, - &bio,0 , &bio_flags,READ ); + &bio,0 , &bio_flags,READ , &prev_em_start); nr =0 ; }if (nr)__extent_readpages (tree, pagepool, nr, get_extent, &em_cached, - &bio,0 , &bio_flags,READ ); + &bio,0 , &bio_flags,READ , &prev_em_start);if (em_cached)free_extent_map (em_cached);
Greg Kroah-Hartman
maintainerPATCH 107/258 PCI: Fix devfn for VPD access through function 0
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Williamson <[email protected]>
commit 9d9240756e63dd87d6cbf5da8b98ceb8f8192b55 upstream.
Commit 932c435caba8 ("PCI: Add dev_flags bit to access VPD through function 0") passes PCI_SLOT(devfn) for the devfn parameter of pci_get_slot(). Generally this works because we're fairly well guaranteed that a PCIe device is at slot address 0, but for the general case, including conventional PCI, it's incorrect. We need to get the slot and then convert it back into a devfn.
--- drivers/pci/access.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/pci/access.c +6 -3
@@ -442,7 +442,8 @@ static const struct pci_vpd_ops pci_vpd_static ssize_t pci_vpd_f0_read (struct pci_dev *dev,loff_t pos,size_t count,void *arg) { -struct pci_dev *tdev =pci_get_slot (dev->bus,PCI_SLOT (dev->devfn)); +struct pci_dev *tdev =pci_get_slot (dev->bus, +PCI_DEVFN (PCI_SLOT (dev->devfn),0 ));ssize_t ret;if (!tdev)
@@ -456,7 +457,8 @@ static ssize_t pci_vpd_f0_read(struct pcstatic ssize_t pci_vpd_f0_write (struct pci_dev *dev,loff_t pos,size_t count,const void *arg) { -struct pci_dev *tdev =pci_get_slot (dev->bus,PCI_SLOT (dev->devfn)); +struct pci_dev *tdev =pci_get_slot (dev->bus, +PCI_DEVFN (PCI_SLOT (dev->devfn),0 ));ssize_t ret;if (!tdev)
@@ -475,7 +477,8 @@ static const struct pci_vpd_ops pci_vpd_static int pci_vpd_f0_dev_check (struct pci_dev *dev) { -struct pci_dev *tdev =pci_get_slot (dev->bus,PCI_SLOT (dev->devfn)); +struct pci_dev *tdev =pci_get_slot (dev->bus, +PCI_DEVFN (PCI_SLOT (dev->devfn),0 ));int ret =0 ;if (!tdev)
Greg Kroah-Hartman
maintainerPATCH 108/258 PCI: Use function 0 VPD for identical functions, regular VPD for others
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Williamson <[email protected]>
commit da2d03ea27f6ed9d2005a67b20dd021ddacf1e4d upstream.
932c435caba8 ("PCI: Add dev_flags bit to access VPD through function 0") added PCI_DEV_FLAGS_VPD_REF_F0. Previously, we set the flag on every non-zero function of quirked devices. If a function turned out to be different from function 0, i.e., it had a different class, vendor ID, or device ID, the flag remained set but we didn't make VPD accessible at all.
Flip this around so we only set PCI_DEV_FLAGS_VPD_REF_F0 for functions that are identical to function 0, and allow regular VPD access for any other functions.
--- drivers/pci/access.c | 22 ---------------------- drivers/pci/quirks.c | 20 ++++++++++++++++++-- 2 files changed, 18 insertions(+), 24 deletions(-)
drivers/pci/access.c +0 -22
@@ -475,23 +475,6 @@ static const struct pci_vpd_ops pci_vpd_ .release = pci_vpd_pci22_release, }; -static int pci_vpd_f0_dev_check (struct pci_dev *dev) -{ -struct pci_dev *tdev =pci_get_slot (dev->bus, -PCI_DEVFN (PCI_SLOT (dev->devfn),0 )); -int ret =0 ; - -if (!tdev) -return -ENODEV ; -if (!tdev->vpd || !tdev->multifunction || - dev->class != tdev->class || dev->vendor != tdev->vendor || - dev->device != tdev->device) - ret = -ENODEV ; - -pci_dev_put (tdev); -return ret; -} -int pci_vpd_pci22_init (struct pci_dev *dev) {struct pci_vpd_pci22 *vpd;
@@ -500,12 +483,7 @@ int pci_vpd_pci22_init(struct pci_dev *d cap =pci_find_capability (dev,PCI_CAP_ID_VPD );if (!cap)return -ENODEV ; -if (dev->dev_flags &PCI_DEV_FLAGS_VPD_REF_F0 ) { -int ret =pci_vpd_f0_dev_check (dev); -if (ret) -return ret; - } vpd =kzalloc (sizeof (*vpd),GFP_ATOMIC );if (!vpd)return -ENOMEM ;
drivers/pci/quirks.c +18 -2
@@ -1906,11 +1906,27 @@ static void quirk_netmos(struct pci_devDECLARE_PCI_FIXUP_CLASS_HEADER (PCI_VENDOR_ID_NETMOS ,PCI_ANY_ID ,PCI_CLASS_COMMUNICATION_SERIAL ,8 , quirk_netmos); +/* +* Quirk non-zero PCI functions to route VPD access through function 0 for +* devices that share VPD resources between functions. The functions are +* expected to be identical devices. +*/ static void quirk_f0_vpd_link (struct pci_dev *dev) { -if (!dev->multifunction || !PCI_FUNC (dev->devfn)) +struct pci_dev *f0; + +if (!PCI_FUNC (dev->devfn)) +return ; + + f0 =pci_get_slot (dev->bus,PCI_DEVFN (PCI_SLOT (dev->devfn),0 )); +if (!f0)return ; - dev->dev_flags |=PCI_DEV_FLAGS_VPD_REF_F0 ; + +if (f0->vpd && dev->class == f0->class && + dev->vendor == f0->vendor && dev->device == f0->device) + dev->dev_flags |=PCI_DEV_FLAGS_VPD_REF_F0 ; + +pci_dev_put (f0); }DECLARE_PCI_FIXUP_CLASS_EARLY (PCI_VENDOR_ID_INTEL ,PCI_ANY_ID ,PCI_CLASS_NETWORK_ETHERNET ,8 , quirk_f0_vpd_link);
Greg Kroah-Hartman
maintainerPATCH 109/258 PCI: Clear IORESOURCE_UNSET when clipping a bridge window
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjorn Helgaas <[email protected]>
commit b838b39e930aa1cfd099ea82ac40ed6d6413af26 upstream.
c770cb4cb505 ("PCI: Mark invalid BARs as unassigned") sets IORESOURCE_UNSET if we fail to claim a resource. If we tried to claim a bridge window, failed, clipped the window, and tried to claim the clipped window, we failed again because of IORESOURCE_UNSET:
pci_bus 0000:00: root bus resource [mem 0xc0000000-0xffffffff window]
pci 0000:00:01.0: can't claim BAR 15 [mem 0xbdf00000-0xddefffff 64bit pref]: no compatible bridge window pci 0000:00:01.0: [mem size 0x20000000 64bit pref] clipped to [mem size 0x1df00000 64bit pref]
pci 0000:00:01.0: bridge window [mem size 0x1df00000 64bit pref]
pci 0000:00:01.0: can't claim BAR 15 [mem size 0x1df00000 64bit pref]: no address assigned
The 00:01.0 window started as [mem 0xbdf00000-0xddefffff 64bit pref]. That starts before the host bridge window [mem 0xc0000000-0xffffffff window], so we clipped the 00:01.0 window to [mem 0xc0000000-0xddefffff 64bit pref]. But we left it marked IORESOURCE_UNSET, so the second claim failed when it should have succeeded.
This means downstream devices will also fail for lack of resources, e.g., in the bugzilla below,
radeon 0000:01:00.0: Fatal error during GPU init
Clear IORESOURCE_UNSET when we clip a bridge window. Also clear IORESOURCE_UNSET in our copy of the unclipped window so we can see exactly what the original window was and how it now fits inside the upstream window.
--- drivers/pci/bus.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pci/bus.c +2 -0
@@ -256,6 +256,8 @@ bool pci_bus_clip_resource(struct pci_de res->start = start; res->end = end; + res->flags &= ~IORESOURCE_UNSET ; + orig_res.flags &= ~IORESOURCE_UNSET ;dev_printk (KERN_DEBUG , &dev->dev,"%pR clipped to %pR\n" , &orig_res, res);
Greg Kroah-Hartman
maintainerPATCH 111/258 dm crypt: constrain crypt devices max_segment_size to PAGE_SIZE
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
commit 586b286b110e94eb31840ac5afc0c24e0881fe34 upstream.
Setting the dm-crypt device's max_segment_size to PAGE_SIZE is an unfortunate constraint that is required to avoid the potential for exceeding dm-crypt's underlying device's max_segments limits -- due to crypt_alloc_buffer() possibly allocating pages for the encryption bio that are not as physically contiguous as the original bio.
It is interesting to note that this problem was already fixed back in 2007 via commit 91e106259 ("dm crypt: use bio_add_page"). But Linux 4.0 commit cf2f1abfb ("dm crypt: don't allocate pages for a partial request") regressed dm-crypt back to _not_ using bio_add_page(). But given dm-crypt's cpu parallelization changes all depend on commit cf2f1abfb's abandoning of the more complex io fragments processing that dm-crypt previously had we cannot easily go back to using bio_add_page().
So all said the cleanest way to resolve this issue is to fix dm-crypt to properly constrain the original bios entering dm-crypt so the encryption bios that dm-crypt generates from the original bios are always compatible with the underlying device's max_segments queue limits.
It should be noted that technically Linux 4.3 does _not_ need this fix because of the block core's new late bio-splitting capability. But, it is reasoned, there is little to be gained by having the block core split the encrypted bio that is composed of PAGE_SIZE segments. That said, in the future we may revert this change.
--- drivers/md/dm-crypt.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
drivers/md/dm-crypt.c +15 -2
@@ -968,7 +968,8 @@ static void crypt_free_buffer_pages(stru/* * Generate a new unfragmented bio with the given size -* This should never violate the device limitations +* This should never violate the device limitations (but only because +* max_segment_size is being constrained to PAGE_SIZE). * * This function may be called concurrently. If we allocate from the mempool * concurrently, there is a possibility of deadlock. For example, if we have
@@ -2058,9 +2059,20 @@ static int crypt_iterate_devices(structreturn fn (ti, cc->dev, cc->start, ti->len, data); } +static void crypt_io_hints (struct dm_target *ti,struct queue_limits *limits) +{ +/* +* Unfortunate constraint that is required to avoid the potential +* for exceeding underlying device's max_segments limits -- due to +* crypt_alloc_buffer() possibly allocating pages for the encryption +* bio that are not as physically contiguous as the original bio. +*/ + limits->max_segment_size =PAGE_SIZE ; +} +static struct target_type crypt_target = { .name ="crypt" , - .version = {1 ,14 ,0 }, + .version = {1 ,14 ,1 }, .module =THIS_MODULE , .ctr = crypt_ctr, .dtr = crypt_dtr,
@@ -2072,6 +2084,7 @@ static struct target_type crypt_target = .message = crypt_message, .merge = crypt_merge, .iterate_devices = crypt_iterate_devices, + .io_hints = crypt_io_hints, };static int __init dm_crypt_init (void )
Greg Kroah-Hartman
maintainerPATCH 112/258 ath10k: fix dma_mapping_error() handling
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Kazior <[email protected]>
commit 5e55e3cbd1042cffa6249f22c10585e63f8a29bf upstream.
The function returns 1 when DMA mapping fails. The driver would return bogus values and could possibly confuse itself if DMA failed.
--- drivers/net/wireless/ath/ath10k/htc.c | 4 +++- drivers/net/wireless/ath/ath10k/htt_tx.c | 8 ++++++-- drivers/net/wireless/ath/ath10k/pci.c | 8 ++++++-- drivers/net/wireless/ath/ath10k/wmi.c | 1 + 4 files changed, 16 insertions(+), 5 deletions(-)
drivers/net/wireless/ath/ath10k/htc.c +3 -1
@@ -145,8 +145,10 @@ int ath10k_htc_send(struct ath10k_htc *h skb_cb->eid = eid; skb_cb->paddr =dma_map_single (dev, skb->data, skb->len,DMA_TO_DEVICE ); ret =dma_mapping_error (dev, skb_cb->paddr); -if (ret) +if (ret) { + ret = -EIO ; goto err_credits; + } sg_item.transfer_id = ep->eid; sg_item.transfer_context = skb;
drivers/net/wireless/ath/ath10k/htt_tx.c +6 -2
@@ -371,8 +371,10 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt skb_cb->paddr =dma_map_single (dev, msdu->data, msdu->len,DMA_TO_DEVICE ); res =dma_mapping_error (dev, skb_cb->paddr); -if (res) +if (res) { + res = -EIO ; goto err_free_txdesc; + }skb_put (txdesc, len); cmd = (struct htt_cmd *)txdesc->data;
@@ -456,8 +458,10 @@ int ath10k_htt_tx(struct ath10k_htt *htt skb_cb->paddr =dma_map_single (dev, msdu->data, msdu->len,DMA_TO_DEVICE ); res =dma_mapping_error (dev, skb_cb->paddr); -if (res) +if (res) { + res = -EIO ; goto err_free_txbuf; + }switch (skb_cb->txmode) {case ATH10K_HW_TXRX_RAW :
drivers/net/wireless/ath/ath10k/pci.c +6 -2
@@ -1546,8 +1546,10 @@ static int ath10k_pci_hif_exchange_bmi_m req_paddr =dma_map_single (ar->dev, treq, req_len,DMA_TO_DEVICE ); ret =dma_mapping_error (ar->dev, req_paddr); -if (ret) +if (ret) { + ret = -EIO ; goto err_dma; + }if (resp && resp_len) { tresp =kzalloc (*resp_len,GFP_KERNEL );
@@ -1559,8 +1561,10 @@ static int ath10k_pci_hif_exchange_bmi_m resp_paddr =dma_map_single (ar->dev, tresp, *resp_len,DMA_FROM_DEVICE ); ret =dma_mapping_error (ar->dev, resp_paddr); -if (ret) +if (ret) { + ret =EIO ; goto err_req; + } xfer.wait_for_resp = true; xfer.resp_len =0 ;
drivers/net/wireless/ath/ath10k/wmi.c +1 -0
@@ -2391,6 +2391,7 @@ void ath10k_wmi_event_host_swba(struct aath10k_warn (ar,"failed to map beacon: %d\n" , ret);dev_kfree_skb_any (bcn); + ret = -EIO ; goto skip; }
Greg Kroah-Hartman
maintainerPATCH 116/258 md/raid0: update queue parameter in a safer location.
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit 199dc6ed5179251fa6158a461499c24bdd99c836 upstream.
When a (e.g.) RAID5 array is reshaped to RAID0, the updating of queue parameters (e.g. max number of sectors per bio) is done in the wrong place.
It should be part of ->run, but it is actually part of ->takeover. This means it happens before level_store() calls:
blk_set_stacking_limits(&mddev->queue->limits);
and so it ineffective. This can lead to errors from underlying devices.
So move all the relevant settings out of create_stripe_zones() and into raid0_run().
As this can lead to a bug-on it is suitable for any -stable kernel which supports reshape to RAID0. So 2.6.35 or later. As the bug has been present for five years there is no urgency, so no need to rush into -stable.
--- drivers/md/raid0.c | 75 +++++++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 36 deletions(-)
drivers/md/raid0.c +39 -36
@@ -83,7 +83,7 @@ static int create_strip_zones(struct mddchar b[BDEVNAME_SIZE ];char b2[BDEVNAME_SIZE ];struct r0conf *conf =kzalloc (sizeof (*conf),GFP_KERNEL ); -bool discard_supported = false; +unsigned short blksize =512 ;if (!conf)return -ENOMEM ;
@@ -98,6 +98,9 @@ static int create_strip_zones(struct mddsector_div (sectors, mddev->chunk_sectors); rdev1->sectors = sectors * mddev->chunk_sectors; + blksize =max (blksize,queue_logical_block_size ( + rdev1->bdev->bd_disk->queue)); +rdev_for_each (rdev2, mddev) { pr_debug("md/raid0:%s: comparing %s(%llu)" " with %s(%llu)\n",
@@ -134,6 +137,18 @@ static int create_strip_zones(struct mdd }pr_debug ("md/raid0:%s: FINAL %d zones\n" ,mdname (mddev), conf->nr_strip_zones); +/* +* now since we have the hard sector sizes, we can make sure +* chunk size is a multiple of that sector size +*/ +if ((mddev->chunk_sectors <<9 ) % blksize) { +printk (KERN_ERR "md/raid0:%s: chunk_size of %d not multiple of block size %d\n" , +mdname (mddev), + mddev->chunk_sectors <<9 , blksize); + err = -EINVAL ; + goto abort; + } + err = -ENOMEM ; conf->strip_zone =kzalloc (sizeof (struct strip_zone )* conf->nr_strip_zones,GFP_KERNEL );
@@ -188,19 +203,12 @@ static int create_strip_zones(struct mdd } dev[j] = rdev1; -if (mddev->queue) -disk_stack_limits (mddev->gendisk, rdev1->bdev, - rdev1->data_offset <<9 ); -if (rdev1->bdev->bd_disk->queue->merge_bvec_fn) conf->has_merge_bvec =1 ;if (!smallest || (rdev1->sectors < smallest->sectors)) smallest = rdev1; cnt++; - -if (blk_queue_discard (bdev_get_queue (rdev1->bdev))) - discard_supported = true; }if (cnt != mddev->raid_disks) { printk(KERN_ERR "md/raid0:%s: too few disks (%d of %d) - "
@@ -261,28 +269,6 @@ static int create_strip_zones(struct mdd (unsigned long long)smallest->sectors); } -/* -* now since we have the hard sector sizes, we can make sure -* chunk size is a multiple of that sector size -*/ -if ((mddev->chunk_sectors <<9 ) %queue_logical_block_size (mddev->queue)) { -printk (KERN_ERR "md/raid0:%s: chunk_size of %d not valid\n" , -mdname (mddev), - mddev->chunk_sectors <<9 ); - goto abort; - } - -if (mddev->queue) { -blk_queue_io_min (mddev->queue, mddev->chunk_sectors <<9 ); -blk_queue_io_opt (mddev->queue, - (mddev->chunk_sectors <<9 ) * mddev->raid_disks); - -if (!discard_supported) -queue_flag_clear_unlocked (QUEUE_FLAG_DISCARD , mddev->queue); -else -queue_flag_set_unlocked (QUEUE_FLAG_DISCARD , mddev->queue); - } -pr_debug ("md/raid0:%s: done.\n" ,mdname (mddev)); *private_conf = conf;
@@ -433,12 +419,6 @@ static int raid0_run(struct mddev *mddevif (md_check_no_bitmap (mddev))return -EINVAL ; -if (mddev->queue) { -blk_queue_max_hw_sectors (mddev->queue, mddev->chunk_sectors); -blk_queue_max_write_same_sectors (mddev->queue, mddev->chunk_sectors); -blk_queue_max_discard_sectors (mddev->queue, mddev->chunk_sectors); - } -/* if private is not null, we are here after takeover */ if (mddev->private ==NULL ) { ret =create_strip_zones (mddev, &conf);
@@ -447,6 +427,29 @@ static int raid0_run(struct mddev *mddev mddev->private = conf; } conf = mddev->private; +if (mddev->queue) { +struct md_rdev *rdev; +bool discard_supported = false; + +rdev_for_each (rdev, mddev) { +disk_stack_limits (mddev->gendisk, rdev->bdev, + rdev->data_offset <<9 ); +if (blk_queue_discard (bdev_get_queue (rdev->bdev))) + discard_supported = true; + } +blk_queue_max_hw_sectors (mddev->queue, mddev->chunk_sectors); +blk_queue_max_write_same_sectors (mddev->queue, mddev->chunk_sectors); +blk_queue_max_discard_sectors (mddev->queue, mddev->chunk_sectors); + +blk_queue_io_min (mddev->queue, mddev->chunk_sectors <<9 ); +blk_queue_io_opt (mddev->queue, + (mddev->chunk_sectors <<9 ) * mddev->raid_disks); + +if (!discard_supported) +queue_flag_clear_unlocked (QUEUE_FLAG_DISCARD , mddev->queue); +else +queue_flag_set_unlocked (QUEUE_FLAG_DISCARD , mddev->queue); + }/* calculate array device size */ md_set_array_sectors (mddev,raid0_size (mddev,0 ,0 ));
Greg Kroah-Hartman
maintainerPATCH 123/258 netfilter: ipset: Fixing unnamed union init
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Elad Raz <[email protected]>
commit 96be5f2806cd65a2ebced3bfcdf7df0116e6c4a6 upstream.
In continue to proposed Vinson Lee's post [1], this patch fixes compilation issues founded at gcc 4.4.7. The initialization of .cidr field of unnamed unions causes compilation error in gcc 4.4.x.
References
Visible links
[1] https://lkml.org/lkml/2015/7/5/74
--- net/netfilter/ipset/ip_set_hash_netnet.c | 20 ++++++++++++++++++-- net/netfilter/ipset/ip_set_hash_netportnet.c | 20 ++++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-)
net/netfilter/ipset/ip_set_hash_netnet.c +18 -2
@@ -131,6 +131,13 @@ hash_netnet4_data_next(struct hash_netne#define HOST_MASK 32#include "ip_set_hash_gen.h" +static void +hash_netnet4_init (struct hash_netnet4_elem *e) +{ + e->cidr[0 ] =HOST_MASK ; + e->cidr[1 ] =HOST_MASK ; +} + static int hash_netnet4_kadt(struct ip_set *set, const struct sk_buff *skb, const struct xt_action_param *par,
@@ -160,7 +167,7 @@ hash_netnet4_uadt(struct ip_set *set, st {const struct hash_netnet *h = set->data;ipset_adtfn adtfn = set->variant->adt[adt]; -struct hash_netnet4_elem e = { .cidr = {HOST_MASK ,HOST_MASK , }, }; +struct hash_netnet4_elem e = { };struct ip_set_ext ext =IP_SET_INIT_UEXT (set);u32 ip =0 , ip_to =0 , last;u32 ip2 =0 , ip2_from =0 , ip2_to =0 , last2;
@@ -169,6 +176,7 @@ hash_netnet4_uadt(struct ip_set *set, stif (tb[IPSET_ATTR_LINENO ]) *lineno =nla_get_u32 (tb[IPSET_ATTR_LINENO ]); +hash_netnet4_init (&e);if (unlikely (!tb[IPSET_ATTR_IP ] || !tb[IPSET_ATTR_IP2 ] || !ip_set_optattr_netorder (tb,IPSET_ATTR_CADT_FLAGS )))return -IPSET_ERR_PROTOCOL ;
@@ -357,6 +365,13 @@ hash_netnet6_data_next(struct hash_netne#define IP_SET_EMIT_CREATE #include "ip_set_hash_gen.h" +static void +hash_netnet6_init (struct hash_netnet6_elem *e) +{ + e->cidr[0 ] =HOST_MASK ; + e->cidr[1 ] =HOST_MASK ; +} + static int hash_netnet6_kadt(struct ip_set *set, const struct sk_buff *skb, const struct xt_action_param *par,
@@ -385,13 +400,14 @@ hash_netnet6_uadt(struct ip_set *set, st enum ipset_adt adt, u32 *lineno, u32 flags, bool retried) { ipset_adtfn adtfn = set->variant->adt[adt]; -struct hash_netnet6_elem e = { .cidr = {HOST_MASK ,HOST_MASK , }, }; +struct hash_netnet6_elem e = { };struct ip_set_ext ext =IP_SET_INIT_UEXT (set);int ret;if (tb[IPSET_ATTR_LINENO ]) *lineno =nla_get_u32 (tb[IPSET_ATTR_LINENO ]); +hash_netnet6_init (&e);if (unlikely (!tb[IPSET_ATTR_IP ] || !tb[IPSET_ATTR_IP2 ] || !ip_set_optattr_netorder (tb,IPSET_ATTR_CADT_FLAGS )))return -IPSET_ERR_PROTOCOL ;
net/netfilter/ipset/ip_set_hash_netportnet.c +18 -2
@@ -142,6 +142,13 @@ hash_netportnet4_data_next(struct hash_n#define HOST_MASK 32#include "ip_set_hash_gen.h" +static void +hash_netportnet4_init (struct hash_netportnet4_elem *e) +{ + e->cidr[0 ] =HOST_MASK ; + e->cidr[1 ] =HOST_MASK ; +} + static int hash_netportnet4_kadt(struct ip_set *set, const struct sk_buff *skb, const struct xt_action_param *par,
@@ -175,7 +182,7 @@ hash_netportnet4_uadt(struct ip_set *set {const struct hash_netportnet *h = set->data;ipset_adtfn adtfn = set->variant->adt[adt]; -struct hash_netportnet4_elem e = { .cidr = {HOST_MASK ,HOST_MASK , }, }; +struct hash_netportnet4_elem e = { };struct ip_set_ext ext =IP_SET_INIT_UEXT (set);u32 ip =0 , ip_to =0 , ip_last, p =0 , port, port_to;u32 ip2_from =0 , ip2_to =0 , ip2_last, ip2;
@@ -185,6 +192,7 @@ hash_netportnet4_uadt(struct ip_set *setif (tb[IPSET_ATTR_LINENO ]) *lineno =nla_get_u32 (tb[IPSET_ATTR_LINENO ]); +hash_netportnet4_init (&e); if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) ||
@@ -412,6 +420,13 @@ hash_netportnet6_data_next(struct hash_n#define IP_SET_EMIT_CREATE #include "ip_set_hash_gen.h" +static void +hash_netportnet6_init (struct hash_netportnet6_elem *e) +{ + e->cidr[0 ] =HOST_MASK ; + e->cidr[1 ] =HOST_MASK ; +} + static int hash_netportnet6_kadt(struct ip_set *set, const struct sk_buff *skb, const struct xt_action_param *par,
@@ -445,7 +460,7 @@ hash_netportnet6_uadt(struct ip_set *set {const struct hash_netportnet *h = set->data;ipset_adtfn adtfn = set->variant->adt[adt]; -struct hash_netportnet6_elem e = { .cidr = {HOST_MASK ,HOST_MASK , }, }; +struct hash_netportnet6_elem e = { };struct ip_set_ext ext =IP_SET_INIT_UEXT (set);u32 port, port_to;bool with_ports = false;
@@ -454,6 +469,7 @@ hash_netportnet6_uadt(struct ip_set *setif (tb[IPSET_ATTR_LINENO ]) *lineno =nla_get_u32 (tb[IPSET_ATTR_LINENO ]); +hash_netportnet6_init (&e); if (unlikely(!tb[IPSET_ATTR_IP] || !tb[IPSET_ATTR_IP2] || !ip_set_attr_netorder(tb, IPSET_ATTR_PORT) || !ip_set_optattr_netorder(tb, IPSET_ATTR_PORT_TO) ||
Greg Kroah-Hartman
maintainerPATCH 127/258 netfilter: nf_log: dont zap all loggers on unregister
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
commit 205ee117d4dc4a11ac3bd9638bb9b2e839f4de9a upstream.
like nf_log_unset, nf_log_unregister must not reset the list of loggers. Otherwise, a call to nf_log_unregister() will render loggers of other nf protocols unusable:
iptables -A INPUT -j LOG
modprobe nf_log_arp ; rmmod nf_log_arp
iptables -A INPUT -j LOG
iptables: No chain/target/match by that name
--- net/netfilter/nf_log.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/netfilter/nf_log.c +6 -2
@@ -107,11 +107,15 @@ EXPORT_SYMBOL(nf_log_register);void nf_log_unregister (struct nf_logger *logger) { +const struct nf_logger *log;int i;mutex_lock (&nf_log_mutex); -for (i =0 ; i <NFPROTO_NUMPROTO ; i++) -RCU_INIT_POINTER (loggers[i][logger->type],NULL ); +for (i =0 ; i <NFPROTO_NUMPROTO ; i++) { + log =nft_log_dereference (loggers[i][logger->type]); +if (log == logger) +RCU_INIT_POINTER (loggers[i][logger->type],NULL ); + }mutex_unlock (&nf_log_mutex);synchronize_rcu (); }
Greg Kroah-Hartman
maintainerPATCH 128/258 regulator: core: Correct return value check in regulator_resolve_supply
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Keepax <[email protected]>
commit 23c3f310e897837aeb8ffe8700b803cb58e7b35d upstream.
The ret pointer passed to regulator_dev_lookup is only filled with a valid error code if regulator_dev_lookup returned NULL. Currently regulator_resolve_supply checks this ret value before it checks if a regulator was returned, this can result in valid regulator lookups being ignored.
--- drivers/regulator/core.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/regulator/core.c +8 -8
@@ -1376,15 +1376,15 @@ static int regulator_resolve_supply(strureturn 0 ; r =regulator_dev_lookup (dev, rdev->supply_name, &ret); -if (ret == -ENODEV ) { -/* -* No supply was specified for this regulator and -* there will never be one. -*/ -return 0 ; - } -if (!r) { +if (ret == -ENODEV ) { +/* +* No supply was specified for this regulator and +* there will never be one. +*/ +return 0 ; + } +if (have_full_constraints ()) { r = dummy_regulator_rdev; }else {
Greg Kroah-Hartman
maintainerPATCH 131/258 Bluetooth: Delay check for conn->smp in smp_conn_security()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hedberg <[email protected]>
commit d8949aad3eab5d396f4fefcd581773bf07b9a79e upstream.
There are several actions that smp_conn_security() might make that do not require a valid SMP context (conn->smp pointer). One of these actions is to encrypt the link with an existing LTK. If the SMP context wasn't initialized properly we should still allow the independent actions to be done, i.e. the check for the context should only be done at the last possible moment.
--- net/bluetooth/smp.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
net/bluetooth/smp.c +6 -6
@@ -2311,12 +2311,6 @@ int smp_conn_security(struct hci_conn *hif (!conn)return 1 ; - chan = conn->smp; -if (!chan) { -BT_ERR ("SMP security requested but not available" ); -return 1 ; - } -if (!hci_dev_test_flag (hcon->hdev,HCI_LE_ENABLED ))return 1 ;
@@ -2330,6 +2324,12 @@ int smp_conn_security(struct hci_conn *hif (smp_ltk_encrypt (conn, hcon->pending_sec_level))return 0 ; + chan = conn->smp; +if (!chan) { +BT_ERR ("SMP security requested but not available" ); +return 1 ; + } +l2cap_chan_lock (chan);/* If SMP is already in progress ignore this request */
Greg Kroah-Hartman
maintainerPATCH 139/258 Do not fall back to SMBWriteX in set_file_size error cases
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steve French <[email protected]>
commit 646200a041203f440fb6fcf9cacd9efeda9de74c upstream.
The error paths in set_file_size for cifs and smb3 are incorrect.
In the unlikely event that a server did not support set file info of the file size, the code incorrectly falls back to trying SMBWriteX (note that only the original core SMB Write, used for example by DOS, can set the file size this way - this actually does not work for the more recent SMBWriteX). The idea was since the old DOS SMB Write could set the file size if you write zero bytes at that offset then use that if server rejects the normal set file info call.
Fortunately the SMBWriteX will never be sent on the wire (except when file size is zero) since the length and offset fields were reversed in the two places in this function that call SMBWriteX causing the fall back path to return an error. It is also important to never call an SMB request from an SMB2/sMB3 session (which theoretically would be possible, and can cause a brief session drop, although the client recovers) so this should be fixed. In practice this path does not happen with modern servers but the error fall back to SMBWriteX is clearly wrong.
Removing the calls to SMBWriteX in the error paths in cifs_set_file_size
Pointed out by PaX/grsecurity team
--- fs/cifs/inode.c | 36 +----------------------------------- 1 file changed, 1 insertion(+), 35 deletions(-)
fs/cifs/inode.c +1 -35
@@ -2034,7 +2034,6 @@ cifs_set_file_size(struct inode *inode,struct tcon_link *tlink =NULL ;struct cifs_tcon *tcon =NULL ;struct TCP_Server_Info *server; -struct cifs_io_parms io_parms;/* * To avoid spurious oplock breaks from server, in the case of
@@ -2056,18 +2055,6 @@ cifs_set_file_size(struct inode *inode, rc = -ENOSYS ;cifsFileInfo_put (open_file);cifs_dbg (FYI ,"SetFSize for attrs rc = %d\n" , rc); -if ((rc == -EINVAL ) || (rc == -EOPNOTSUPP )) { -unsigned int bytes_written; - - io_parms.netfid = open_file->fid.netfid; - io_parms.pid = open_file->pid; - io_parms.tcon = tcon; - io_parms.offset =0 ; - io_parms.length = attrs->ia_size; - rc =CIFSSMBWrite (xid, &io_parms, &bytes_written, -NULL ,NULL ,1 ); -cifs_dbg (FYI ,"Wrt seteof rc %d\n" , rc); - } }else rc = -EINVAL ;
@@ -2093,28 +2080,7 @@ cifs_set_file_size(struct inode *inode,else rc = -ENOSYS ;cifs_dbg (FYI ,"SetEOF by path (setattrs) rc = %d\n" , rc); -if ((rc == -EINVAL ) || (rc == -EOPNOTSUPP )) { -__u16 netfid; -int oplock =0 ; - - rc =SMBLegacyOpen (xid, tcon, full_path,FILE_OPEN , -GENERIC_WRITE ,CREATE_NOT_DIR , &netfid, - &oplock,NULL , cifs_sb->local_nls, -cifs_remap (cifs_sb)); -if (rc ==0 ) { -unsigned int bytes_written; - - io_parms.netfid = netfid; - io_parms.pid = current->tgid; - io_parms.tcon = tcon; - io_parms.offset =0 ; - io_parms.length = attrs->ia_size; - rc =CIFSSMBWrite (xid, &io_parms, &bytes_written,NULL , -NULL ,1 ); -cifs_dbg (FYI ,"wrt seteof rc %d\n" , rc); -CIFSSMBClose (xid, tcon, netfid); - } - } +if (tlink)cifs_put_tlink (tlink);
Greg Kroah-Hartman
maintainerPATCH 140/258 drm/qxl: only report first monitor as connected if we have no state
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Airlie <[email protected]>
commit 69e5d3f893e19613486f300fd6e631810338aa4b upstream.
If the server isn't new enough to give us state, report the first monitor as always connected, otherwise believe the server side.
--- drivers/gpu/drm/qxl/qxl_display.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/gpu/drm/qxl/qxl_display.c +7 -5
@@ -886,13 +886,15 @@ static enum drm_connector_status qxl_condrm_connector_to_qxl_output (connector);struct drm_device *ddev = connector->dev;struct qxl_device *qdev = ddev->dev_private; -int connected; +bool connected = false;/* The first monitor is always connected */ - connected = (output->index ==0 ) || - (qdev->client_monitors_config && - qdev->client_monitors_config->count > output->index && -qxl_head_enabled (&qdev->client_monitors_config->heads[output->index])); +if (!qdev->client_monitors_config) { +if (output->index ==0 ) + connected = true; + }else + connected = qdev->client_monitors_config->count > output->index && +qxl_head_enabled (&qdev->client_monitors_config->heads[output->index]);DRM_DEBUG ("#%d connected: %d\n" , output->index, connected);if (!connected)
Greg Kroah-Hartman
maintainerPATCH 152/258 drm/dp/mst: drop cancel work sync in the mstb destroy path (v2)
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Airlie <[email protected]>
commit 274d83524895fe41ca8debae4eec60ede7252bb5 upstream.
Since 9eb1e57f564d4e6e10991402726cc83fe0b9172f drm/dp/mst: make sure mst_primary mstb is valid in work function
we validate the mstb structs in the work function, and doing that takes a reference. So we should never get here with the work function running using the mstb device, only if the work function hasn't run yet or is running for another mstb.
So we don't need to sync the work here, this was causing lockdep spew as below.
[ +0.000160] =============================================
[ +0.000001] [ INFO: possible recursive locking detected ]
[ +0.000002] 3.10.0-320.el7.rhel72.stable.backport.3.x86_64.debug #1 Tainted: G W ------------
[ +0.000001] ---------------------------------------------
[ +0.000001] kworker/4:2/1262 is trying to acquire lock:
[ +0.000001] ((&mgr->work)){+.+.+.}, at: [<ffffffff810b29a5>] flush_work+0x5/0x2e0
[ +0.000007]but task is already holding lock:
[ +0.000001] ((&mgr->work)){+.+.+.}, at: [<ffffffff810b57e4>] process_one_work+0x1b4/0x710 [ +0.000004]
other info that might help us debug this:
[ +0.000001] Possible unsafe locking scenario:
[ +0.000002] CPU0 [ +0.000000] ---- [ +0.000001] lock((&mgr->work)); [ +0.000002] lock((&mgr->work)); [ +0.000001]
*** DEADLOCK ***
[ +0.000001] May be due to missing lock nesting notation
[ +0.000002] 2 locks held by kworker/4:2/1262:
[ +0.000001] #0: (events_long){.+.+.+}, at: [<ffffffff810b57e4>] process_one_work+0x1b4/0x710
[ +0.000004] #1: ((&mgr->work)){+.+.+.}, at: [<ffffffff810b57e4>] process_one_work+0x1b4/0x710
[ +0.000003]
stack backtrace:
[ +0.000003] CPU: 4 PID: 1262 Comm: kworker/4:2 Tainted: G W ------------ 3.10.0-320.el7.rhel72.stable.backport.3.x86_64.debug #1
[ +0.000001] Hardware name: LENOVO 20EGS0R600/20EGS0R600, BIOS GNET71WW (2.19 ) 02/05/2015
[ +0.000008] Workqueue: events_long drm_dp_mst_link_probe_work [drm_kms_helper]
[ +0.000001] ffffffff82c26c90 00000000a527b914 ffff88046399bae8 ffffffff816fe04d
[ +0.000004] ffff88046399bb58 ffffffff8110f47f ffff880461438000 0001009b840fc003
[ +0.000002] ffff880461438a98 0000000000000000 0000000804dc26e1 ffffffff824a2c00
[ +0.000003] Call Trace:
[ +0.000004] [<ffffffff816fe04d>] dump_stack+0x19/0x1b
[ +0.000004] [<ffffffff8110f47f>] __lock_acquire+0x115f/0x1250
[ +0.000002] [<ffffffff8110fd49>] lock_acquire+0x99/0x1e0
[ +0.000002] [<ffffffff810b29a5>] ? flush_work+0x5/0x2e0
[ +0.000002] [<ffffffff810b29ee>] flush_work+0x4e/0x2e0
[ +0.000002] [<ffffffff810b29a5>] ? flush_work+0x5/0x2e0
[ +0.000004] [<ffffffff81025905>] ? native_sched_clock+0x35/0x80
[ +0.000002] [<ffffffff81025959>] ? sched_clock+0x9/0x10
[ +0.000002] [<ffffffff810da1f5>] ? local_clock+0x25/0x30
[ +0.000002] [<ffffffff8110dca9>] ? mark_held_locks+0xb9/0x140
[ +0.000003] [<ffffffff810b4ed5>] ? __cancel_work_timer+0x95/0x160
[ +0.000002] [<ffffffff810b4ee8>] __cancel_work_timer+0xa8/0x160
[ +0.000002] [<ffffffff810b4fb0>] cancel_work_sync+0x10/0x20
[ +0.000007] [<ffffffffa0160d17>] drm_dp_destroy_mst_branch_device+0x27/0x120 [drm_kms_helper]
[ +0.000006] [<ffffffffa0163968>] drm_dp_mst_link_probe_work+0x78/0xa0 [drm_kms_helper]
[ +0.000002] [<ffffffff810b5850>] process_one_work+0x220/0x710
[ +0.000002] [<ffffffff810b57e4>] ? process_one_work+0x1b4/0x710
[ +0.000005] [<ffffffff810b5e5b>] worker_thread+0x11b/0x3a0
[ +0.000003] [<ffffffff810b5d40>] ? process_one_work+0x710/0x710
[ +0.000002] [<ffffffff810beced>] kthread+0xed/0x100
[ +0.000003] [<ffffffff810bec00>] ? insert_kthread_work+0x80/0x80
[ +0.000003] [<ffffffff817121d8>] ret_from_fork+0x58/0x90v2: add flush_work.
--- drivers/gpu/drm/drm_dp_mst_topology.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_dp_mst_topology.c +3 -2
@@ -804,8 +804,6 @@ static void drm_dp_destroy_mst_branch_destruct drm_dp_mst_port *port, *tmp;bool wake_tx = false; -cancel_work_sync (&mstb->mgr->work); -/* * destroy all ports - don't need lock * as there are no more references to the mst branch
@@ -1991,6 +1989,8 @@ void drm_dp_mst_topology_mgr_suspend(strdrm_dp_dpcd_writeb (mgr->aux,DP_MSTM_CTRL ,DP_MST_EN |DP_UPSTREAM_IS_SRC );mutex_unlock (&mgr->lock); +flush_work (&mgr->work); +flush_work (&mgr->destroy_connector_work); }EXPORT_SYMBOL (drm_dp_mst_topology_mgr_suspend);
@@ -2753,6 +2753,7 @@ EXPORT_SYMBOL(drm_dp_mst_topology_mgr_in*/ void drm_dp_mst_topology_mgr_destroy (struct drm_dp_mst_topology_mgr *mgr) { +flush_work (&mgr->work);flush_work (&mgr->destroy_connector_work);mutex_lock (&mgr->payload_lock);kfree (mgr->payloads);
Greg Kroah-Hartman
maintainerPATCH 156/258 usb: xhci: lock mutex on xhci_stop
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roger Quadros <[email protected]>
commit 85ac90f8953a58f6a057b727bc9db97721e3fb8e upstream.
Else it races with xhci_setup_device
--- drivers/usb/host/xhci.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/host/xhci.c +4 -0
@@ -677,8 +677,11 @@ void xhci_stop(struct usb_hcd *hcd)u32 temp;struct xhci_hcd *xhci =hcd_to_xhci (hcd); +mutex_lock (&xhci->mutex); +if (!usb_hcd_is_primary_hcd (hcd)) {xhci_only_stop_hcd (xhci->shared_hcd); +mutex_unlock (&xhci->mutex);return ; }
@@ -717,6 +720,7 @@ void xhci_stop(struct usb_hcd *hcd)xhci_dbg_trace (xhci, trace_xhci_dbg_init,"xhci_stop completed - status = %x" ,readl (&xhci->op_regs->status)); +mutex_unlock (&xhci->mutex); }/*
Greg Kroah-Hartman
maintainerPATCH 158/258 usb: xhci: stop everything on the first call to xhci_stop
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roger Quadros <[email protected]>
commit 8c24d6d7b09deee3036ddc4f2b81b53b28c8f877 upstream.
xhci_stop will be called twice, once for the shared hcd and again for the primary hcd.
We stop the XHCI controller in any case so clean up everything on the first call else we can timeout waiting for pending requests to complete.
--- drivers/usb/host/xhci.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-)
drivers/usb/host/xhci.c +5 -15
@@ -655,15 +655,6 @@ int xhci_run(struct usb_hcd *hcd) }EXPORT_SYMBOL_GPL (xhci_run); -static void xhci_only_stop_hcd (struct usb_hcd *hcd) -{ -struct xhci_hcd *xhci =hcd_to_xhci (hcd); - -spin_lock_irq (&xhci->lock); -xhci_halt (xhci); -spin_unlock_irq (&xhci->lock); -} -/* * Stop xHCI driver. *
@@ -678,15 +669,14 @@ void xhci_stop(struct usb_hcd *hcd)u32 temp;struct xhci_hcd *xhci =hcd_to_xhci (hcd); -mutex_lock (&xhci->mutex); - -if (!usb_hcd_is_primary_hcd (hcd)) { -xhci_only_stop_hcd (xhci->shared_hcd); -mutex_unlock (&xhci->mutex); +if (xhci->xhc_state &XHCI_STATE_HALTED )return ; - } +mutex_lock (&xhci->mutex);spin_lock_irq (&xhci->lock); + xhci->xhc_state |=XHCI_STATE_HALTED ; + xhci->cmd_ring_state =CMD_RING_STATE_STOPPED ; +/* Make sure the xHC is halted for a USB3 roothub * (xhci_stop() could be called as part of failed init). */
Greg Kroah-Hartman
maintainerPATCH 171/258 irqchip/atmel-aic5: Use per chip mask caches in mask/unmask()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ludovic Desroches <[email protected]>
commit d32dc9aa10c739363c775baf4499416b2e0dc11f upstream.
When masking/unmasking interrupts, mask_cache is updated and used later for suspend/resume. Unfortunately, it always was the mask_cache associated with the first irq chip which was updated. So when performing resume, only irqs 0-31 could be enabled.
--- drivers/irqchip/irq-atmel-aic5.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)
drivers/irqchip/irq-atmel-aic5.c +16 -8
@@ -88,28 +88,36 @@ static void aic5_mask(struct irq_data *d {struct irq_domain *domain = d->domain;struct irq_domain_chip_generic *dgc = domain->gc; -struct irq_chip_generic *gc = dgc->gc[0 ]; +struct irq_chip_generic *bgc = dgc->gc[0 ]; +struct irq_chip_generic *gc =irq_data_get_irq_chip_data (d); -/* Disable interrupt on AIC5 */ -irq_gc_lock (gc); +/* +* Disable interrupt on AIC5. We always take the lock of the +* first irq chip as all chips share the same registers. +*/ +irq_gc_lock (bgc);irq_reg_writel (gc, d->hwirq,AT91_AIC5_SSR );irq_reg_writel (gc,1 ,AT91_AIC5_IDCR ); gc->mask_cache &= ~d->mask; -irq_gc_unlock (gc); +irq_gc_unlock (bgc); }static void aic5_unmask (struct irq_data *d) {struct irq_domain *domain = d->domain;struct irq_domain_chip_generic *dgc = domain->gc; -struct irq_chip_generic *gc = dgc->gc[0 ]; +struct irq_chip_generic *bgc = dgc->gc[0 ]; +struct irq_chip_generic *gc =irq_data_get_irq_chip_data (d); -/* Enable interrupt on AIC5 */ -irq_gc_lock (gc); +/* +* Enable interrupt on AIC5. We always take the lock of the +* first irq chip as all chips share the same registers. +*/ +irq_gc_lock (bgc);irq_reg_writel (gc, d->hwirq,AT91_AIC5_SSR );irq_reg_writel (gc,1 ,AT91_AIC5_IECR ); gc->mask_cache |= d->mask; -irq_gc_unlock (gc); +irq_gc_unlock (bgc); }static int aic5_retrigger (struct irq_data *d)
Greg Kroah-Hartman
maintainerPATCH 172/258 irqchip/gic-v3-its: Add missing cache flushes
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Zyngier <[email protected]>
commit 5a9a8915c8888b615521b17d70a4342187eae60b upstream.
When the ITS is configured for non-cacheable transactions, make sure that the allocated, zeroed memory is flushed to the Point of Coherency, allowing the ITS to observe the zeros instead of random garbage (or even get its own data overwritten by zeros being evicted from the cache...).
--- drivers/irqchip/irq-gic-v3-its.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/irqchip/irq-gic-v3-its.c +5 -1
@@ -921,8 +921,10 @@ retry_baser:* non-cacheable as well. */ shr = tmp &GITS_BASER_SHAREABILITY_MASK ; -if (!shr) +if (!shr) { cache = GITS_BASER_nC; +__flush_dcache_area (base, alloc_size); + } goto retry_baser; }
@@ -1163,6 +1165,8 @@ static struct its_device *its_create_devreturn NULL ; } +__flush_dcache_area (itt, sz); + dev->its = its; dev->itt = itt; dev->nr_ites = nr_ites;
Greg Kroah-Hartman
maintainerPATCH 173/258 docs: update HOWTO for 3.x -> 4.x versioning
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Carrillo <[email protected]>
commit e4144fe5d47c91c92d36cdbd5f31ed8d6e3a57ab upstream.
The HOWTO document needed updating for the new kernel versioning.
--- Documentation/HOWTO | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-)
Documentation/HOWTO +14 -14
@@ -218,16 +218,16 @@ The development process Linux kernel development process currently consists of a few different main kernel "branches" and lots of different subsystem-specific kernel branches. These different branches are: - - main 3.x kernel tree - - 3.x.y -stable kernel tree - - 3.x -git kernel patches + - main 4.x kernel tree + - 4.x.y -stable kernel tree + - 4.x -git kernel patches - subsystem specific kernel trees and patches - - the 3.x -next kernel tree for integration tests + - the 4.x -next kernel tree for integration tests -3.x kernel tree +4.x kernel tree ----------------- -3.x kernels are maintained by Linus Torvalds, and can be found on -kernel.org in the pub/linux/kernel/v3.x/ directory. Its development +4.x kernels are maintained by Linus Torvalds, and can be found on +kernel.org in the pub/linux/kernel/v4.x/ directory. Its development process is as follows: - As soon as a new kernel is released a two weeks window is open, during this period of time maintainers can submit big diffs to
@@ -262,20 +262,20 @@ mailing list about kernel releases: released according to perceived bug status, not according to a preconceived timeline." -3.x.y -stable kernel tree +4.x.y -stable kernel tree --------------------------- Kernels with 3-part versions are -stable kernels. They contain relatively small and critical fixes for security problems or significant -regressions discovered in a given 3.x kernel. +regressions discovered in a given 4.x kernel. This is the recommended branch for users who want the most recent stable kernel and are not interested in helping test development/experimental versions. -If no 3.x.y kernel is available, then the highest numbered 3.x +If no 4.x.y kernel is available, then the highest numbered 4.x kernel is the current stable kernel. -3.x.y are maintained by the "stable" team <[email protected]>, and +4.x.y are maintained by the "stable" team <[email protected]>, and are released as needs dictate. The normal release period is approximately two weeks, but it can be longer if there are no pressing problems. A security-related problem, instead, can cause a release to happen almost
@@ -285,7 +285,7 @@ The file Documentation/stable_kernel_rul documents what kinds of changes are acceptable for the -stable tree, and how the release process works. -3.x -git patches +4.x -git patches ------------------ These are daily snapshots of Linus' kernel tree which are managed in a git repository (hence the name.) These patches are usually released
@@ -317,9 +317,9 @@ revisions to it, and maintainers can mar accepted, or rejected. Most of these patchwork sites are listed at http://patchwork.kernel.org/. -3.x -next kernel tree for integration tests +4.x -next kernel tree for integration tests --------------------------------------------- -Before updates from subsystem trees are merged into the mainline 3.x +Before updates from subsystem trees are merged into the mainline 4.x tree, they need to be integration-tested. For this purpose, a special testing repository exists into which virtually all subsystem trees are pulled on an almost daily basis:
Greg Kroah-Hartman
maintainerPATCH 175/258 extcon: Fix attached value returned by is_extcon_changed
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit f4513b065f7dbd37224226ef6e44b09eff742776 upstream.
is_extcon_changed should only check the idx-th bit of new, not the entirety of new when setting attached.
This fixes extcon sending notifications that a cable was inserted when it gets removed while another cable is still connected.
--- drivers/extcon/extcon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/extcon/extcon.c +1 -1
@@ -159,7 +159,7 @@ static int find_cable_index_by_name(strustatic bool is_extcon_changed (u32 prev,u32 new,int idx,bool *attached) {if (((prev >> idx) &0x1 ) != ((new >> idx) &0x1 )) { - *attached = new ? true : false; + *attached = ((new >> idx) &0x1 ) ? true : false;return true; }
Greg Kroah-Hartman
maintainerPATCH 183/258 ath10k: reject 11b tx fragmentation configuration
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Kazior <[email protected]>
commit 92092fe528e79c9bd25784ca0ef341d5a1d1b642 upstream.
Even though there's a WMI enum for fragmentation threshold no known firmware actually implements it. Moreover it is not possible to rely frame fragmentation to mac80211 because firmware clears the "more fragments" bit in frame control making it impossible for remote devices to reassemble frames.
Hence implement a dummy callback just to say fragmentation isn't supported. This effectively prevents mac80211 from doing frame fragmentation in software.
This fixes Tx becoming broken after setting fragmentation threshold.
--- drivers/net/wireless/ath/ath10k/mac.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/net/wireless/ath/ath10k/mac.c +16 -0
@@ -5542,6 +5542,21 @@ static int ath10k_set_rts_threshold(strureturn ret; } +static int ath10k_mac_op_set_frag_threshold (struct ieee80211_hw *hw,u32 value) +{ +/* Even though there's a WMI enum for fragmentation threshold no known +* firmware actually implements it. Moreover it is not possible to rely +* frame fragmentation to mac80211 because firmware clears the "more +* fragments" bit in frame control making it impossible for remote +* devices to reassemble frames. +* +* Hence implement a dummy callback just to say fragmentation isn't +* supported. This effectively prevents mac80211 from doing frame +* fragmentation in software. +*/ +return -EOPNOTSUPP ; +} +static void ath10k_flush (struct ieee80211_hw *hw,struct ieee80211_vif *vif,u32 queues,bool drop) {
@@ -6376,6 +6391,7 @@ static const struct ieee80211_ops ath10k .remain_on_channel = ath10k_remain_on_channel, .cancel_remain_on_channel = ath10k_cancel_remain_on_channel, .set_rts_threshold = ath10k_set_rts_threshold, + .set_frag_threshold = ath10k_mac_op_set_frag_threshold, .flush = ath10k_flush, .tx_last_beacon = ath10k_tx_last_beacon, .set_antenna = ath10k_set_antenna,
Greg Kroah-Hartman
maintainerPATCH 189/258 regmap: debugfs: Ensure we dont underflow when printing access masks
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Brown <[email protected]>
commit b763ec17ac762470eec5be8ebcc43e4f8b2c2b82 upstream.
If a read is attempted which is smaller than the line length then we may underflow the subtraction we're doing with the unsigned size_t type so move some of the calculation to be additions on the right hand side instead in order to avoid this.
--- drivers/base/regmap/regmap-debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/base/regmap/regmap-debugfs.c +1 -1
@@ -432,7 +432,7 @@ static ssize_t regmap_access_read_file(s/* If we're in the region the user is trying to read */ if (p >= *ppos) {/* ...but not beyond it */ -if (buf_pos >= count -1 - tot_len) +if (buf_pos + tot_len +1 >= count)break ;/* Format the register */
Greg Kroah-Hartman
maintainerPATCH 191/258 security: fix typo in security_task_prctl
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jann Horn <[email protected]>
commit b7f76ea2ef6739ee484a165ffbac98deb855d3d3 upstream.
--- include/linux/security.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/security.h +1 -1
@@ -946,7 +946,7 @@ static inline int security_task_prctl(inunsigned long arg4, unsigned long arg5) { - return cap_task_prctl(option, arg2, arg3, arg3, arg5); + return cap_task_prctl(option, arg2, arg3, arg4, arg5); }static inline void security_task_to_inode (struct task_struct *p,struct inode *inode)
Greg Kroah-Hartman
maintainerPATCH 193/258 usb: chipidea: udc: using the correct stall implementation
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Chen <[email protected]>
commit 56ffa1d154c7e12af16273f0cdc42690dd05caf5 upstream.
According to spec, there are functional and protocol stalls.
For functional stall, it is for bulk and interrupt endpoints, below are cases for it:
- Host sends SET_FEATURE request for Set-Halt, the udc driver needs to set stall, and return true unconditionally.
- The gadget driver may call usb_ep_set_halt to stall certain endpoints, if there is a transfer in pending, the udc driver should not set stall, and return -EAGAIN accordingly.
These two kinds of stall need to be cleared by host using CLEAR_FEATURE request (Clear-Halt).
For protocol stall, it is for control endpoint, this stall will be set if the control request has failed. This stall will be cleared by next setup request (hardware will do it).
It fixed usbtest (drivers/usb/misc/usbtest.c) Test 13 "set/clear halt" test failure, meanwhile, this change has been verified by USB2 CV Compliance Test and MSC Tests.
--- drivers/usb/chipidea/udc.c | 84 +++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 40 deletions(-)
drivers/usb/chipidea/udc.c +44 -40
@@ -656,6 +656,44 @@ __acquires(hwep->lock)return 0 ; } +static int _ep_set_halt (struct usb_ep *ep,int value,bool check_transfer) +{ + struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep); +int direction, retval =0 ; +unsigned long flags; + +if (ep ==NULL || hwep->ep.desc ==NULL ) +return -EINVAL ; + +if (usb_endpoint_xfer_isoc (hwep->ep.desc)) +return -EOPNOTSUPP ; + +spin_lock_irqsave (hwep->lock, flags); + +if (value && hwep->dir ==TX && check_transfer && + !list_empty (&hwep->qh.queue) && + !usb_endpoint_xfer_control (hwep->ep.desc)) { +spin_unlock_irqrestore (hwep->lock, flags); +return -EAGAIN ; + } + + direction = hwep->dir; +do { + retval |=hw_ep_set_halt (hwep->ci, hwep->num, hwep->dir, value); + +if (!value) + hwep->wedge =0 ; + +if (hwep->type ==USB_ENDPOINT_XFER_CONTROL ) + hwep->dir = (hwep->dir ==TX ) ?RX :TX ; + + }while (hwep->dir != direction); + +spin_unlock_irqrestore (hwep->lock, flags); +return retval; +} + +/** * _gadget_stop_activity: stops all USB activity, flushes & disables all endpts * @gadget: gadget
@@ -1051,7 +1089,7 @@ __acquires(ci->lock) num += ci->hw_ep_max /2 ;spin_unlock (&ci->lock); - err =usb_ep_set_halt (&ci->ci_hw_ep[num].ep); + err =_ep_set_halt (&ci->ci_hw_ep[num].ep,1 , false);spin_lock (&ci->lock);if (!err)isr_setup_status_phase (ci);
@@ -1110,8 +1148,8 @@ delegate:if (err <0 ) {spin_unlock (&ci->lock); -if (usb_ep_set_halt (&hwep->ep)) -dev_err (ci->dev,"error: ep_set_halt\n" ); +if (_ep_set_halt (&hwep->ep,1 , false)) +dev_err (ci->dev,"error: _ep_set_halt\n" );spin_lock (&ci->lock); } }
@@ -1142,9 +1180,9 @@ __acquires(ci->lock) err =isr_setup_status_phase (ci);if (err <0 ) {spin_unlock (&ci->lock); -if (usb_ep_set_halt (&hwep->ep)) +if (_ep_set_halt (&hwep->ep,1 , false))dev_err (ci->dev, -"error: ep_set_halt\n" ); +"error: _ep_set_halt\n" );spin_lock (&ci->lock); } }
@@ -1390,41 +1428,7 @@ static int ep_dequeue(struct usb_ep *ep,*/ static int ep_set_halt (struct usb_ep *ep,int value) { - struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep); -int direction, retval =0 ; -unsigned long flags; - -if (ep ==NULL || hwep->ep.desc ==NULL ) -return -EINVAL ; - -if (usb_endpoint_xfer_isoc (hwep->ep.desc)) -return -EOPNOTSUPP ; - -spin_lock_irqsave (hwep->lock, flags); - -#ifndef STALL_IN -/* g_file_storage MS compliant but g_zero fails chapter 9 compliance */ -if (value && hwep->type ==USB_ENDPOINT_XFER_BULK && hwep->dir ==TX && - !list_empty (&hwep->qh.queue)) { -spin_unlock_irqrestore (hwep->lock, flags); -return -EAGAIN ; - } -#endif - - direction = hwep->dir; -do { - retval |=hw_ep_set_halt (hwep->ci, hwep->num, hwep->dir, value); - -if (!value) - hwep->wedge =0 ; - -if (hwep->type ==USB_ENDPOINT_XFER_CONTROL ) - hwep->dir = (hwep->dir ==TX ) ?RX :TX ; - - }while (hwep->dir != direction); - -spin_unlock_irqrestore (hwep->lock, flags); -return retval; +return _ep_set_halt (ep, value, true); }/**
Greg Kroah-Hartman
maintainerPATCH 194/258 usb: Use the USB_SS_MULT() macro to get the burst multiplier.
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit ff30cbc8da425754e8ab96904db1d295bd034f27 upstream.
Bits 1:0 of the bmAttributes are used for the burst multiplier. The rest of the bits used to be reserved (zero), but USB3.1 takes bit 7 into use.
Use the existing USB_SS_MULT() macro instead to make sure the mult value and hence max packet calculations are correct for USB3.1 devices.
Note that burst multiplier in bmAttributes is zero based and that the USB_SS_MULT() macro adds one.
--- drivers/usb/core/config.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/usb/core/config.c +3 -2
@@ -112,7 +112,7 @@ static void usb_parse_ss_endpoint_compan cfgno, inum, asnum, ep->desc.bEndpointAddress); ep->ss_ep_comp.bmAttributes =16 ; }else if (usb_endpoint_xfer_isoc (&ep->desc) && - desc->bmAttributes >2 ) { +USB_SS_MULT (desc->bmAttributes) >3 ) { dev_warn(ddev, "Isoc endpoint has Mult of %d in " "config %d interface %d altsetting %d ep %d: " "setting to 3\n", desc->bmAttributes + 1,
@@ -121,7 +121,8 @@ static void usb_parse_ss_endpoint_compan }if (usb_endpoint_xfer_isoc (&ep->desc)) - max_tx = (desc->bMaxBurst +1 ) * (desc->bmAttributes +1 ) * + max_tx = (desc->bMaxBurst +1 ) * + (USB_SS_MULT (desc->bmAttributes)) *usb_endpoint_maxp (&ep->desc);else if (usb_endpoint_xfer_int (&ep->desc)) max_tx = usb_endpoint_maxp(&ep->desc) *
Greg Kroah-Hartman
maintainerPATCH 195/258 usb: phy: phy-generic: Fix reset behaviour on legacy boot
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roger Quadros <[email protected]>
commit 762982db33b23029e98c844611e2e8beeb75bc0d upstream.
The gpio-desc migration done in v4.0 caused a regression with legacy boots due to reversed reset logic. e.g. omap3-beagle USB host breaks on legacy boot.
Request the reset GPIO with GPIOF_ACTIVE_LOW flag so that it matches the driver logic and pin behaviour.
--- drivers/usb/phy/phy-generic.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/phy/phy-generic.c +2 -1
@@ -230,7 +230,8 @@ int usb_phy_gen_create_phy(struct device clk_rate = pdata->clk_rate; needs_vcc = pdata->needs_vcc;if (gpio_is_valid (pdata->gpio_reset)) { - err =devm_gpio_request_one (dev, pdata->gpio_reset,0 , + err =devm_gpio_request_one (dev, pdata->gpio_reset, +GPIOF_ACTIVE_LOW ,dev_name (dev));if (!err) nop->gpiod_reset =
Greg Kroah-Hartman
maintainerPATCH 198/258 usb: Add device quirk for Logitech PTZ cameras
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vincent Palatin <[email protected]>
commit 72194739f54607bbf8cfded159627a2015381557 upstream.
Add a device quirk for the Logitech PTZ Pro Camera and its sibling the ConferenceCam CC3000e Camera.
This fixes the failed camera enumeration on some boot, particularly on machines with fast CPU.
Tested by connecting a Logitech PTZ Pro Camera to a machine with a Haswell Core i7-4600U CPU @ 2.10GHz, and doing thousands of reboot cycles while recording the kernel logs and taking camera picture after each boot. Before the patch, more than 7% of the boots show some enumeration transfer failures and in a few of them, the kernel is giving up before actually enumerating the webcam. After the patch, the enumeration has been correct on every reboot.
--- drivers/usb/core/quirks.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/usb/core/quirks.c +7 -0
@@ -54,6 +54,13 @@ static const struct usb_device_id usb_qu { USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT }, { USB_DEVICE(0x046d, 0x0843), .driver_info = USB_QUIRK_DELAY_INIT }, + /* Logitech ConferenceCam CC3000e */ + { USB_DEVICE(0x046d, 0x0847), .driver_info = USB_QUIRK_DELAY_INIT }, + { USB_DEVICE(0x046d, 0x0848), .driver_info = USB_QUIRK_DELAY_INIT }, + + /* Logitech PTZ Pro Camera */ + { USB_DEVICE(0x046d, 0x0853), .driver_info = USB_QUIRK_DELAY_INIT }, + /* Logitech Quickcam Fusion */ { USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME },
Greg Kroah-Hartman
maintainerPATCH 202/258 cpufreq: dt: Tolerance applies on both sides of target voltage
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
commit a2022001cebd0825b96aa0f3345ea3ad44ae79d4 upstream.
Tolerance applies on both sides of the target voltage, i.e. both min and max sides. But while checking if a voltage is supported by the regulator or not, we haven't taken care of tolerance on the lower side. Fix that.
--- drivers/cpufreq/cpufreq-dt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/cpufreq/cpufreq-dt.c +2 -1
@@ -255,7 +255,8 @@ static int cpufreq_init(struct cpufreq_prcu_read_unlock (); tol_uV = opp_uV * priv->voltage_tolerance /100 ; -if (regulator_is_supported_voltage (cpu_reg, opp_uV, +if (regulator_is_supported_voltage (cpu_reg, + opp_uV - tol_uV, opp_uV + tol_uV)) {if (opp_uV < min_uV) min_uV = opp_uV;
Greg Kroah-Hartman
maintainerPATCH 206/258 MIPS: BPF: Fix build on pre-R2 little endian CPUs
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aurelien Jarno <[email protected]>
commit b259e51f2e29390518021f9b8df55a3de42f371b upstream.
The rotr, seh and wsbh instructions have been introduced with the R2 ISA. Thus the current BPF code fails to build on pre-R2 little endian CPUs:
CC arch/mips/net/bpf_jit.o
AS arch/mips/net/bpf_jit_asm.o
/home/aurel32/linux-4.2/arch/mips/net/bpf_jit_asm.S: Assembler messages:
/home/aurel32/linux-4.2/arch/mips/net/bpf_jit_asm.S:67: Error: opcode not supported on this processor: mips32 (mips32) wsbh $8,$19' /home/aurel32/linux-4.2/arch/mips/net/bpf_jit_asm.S:68: Error: opcode not supported on this processor: mips32 (mips32) rotr $19,$8,16' /home/aurel32/linux-4.2/arch/mips/net/bpf_jit_asm.S:83: Error: opcode not supported on this processor: mips32 (mips32) wsbh $8,$19' /home/aurel32/linux-4.2/arch/mips/net/bpf_jit_asm.S:84: Error: opcode not supported on this processor: mips32 (mips32) seh $19,$8' /home/aurel32/linux-4.2/arch/mips/net/bpf_jit_asm.S:151: Error: opcode not supported on this processor: mips32 (mips32) wsbh $8,$12' /home/aurel32/linux-4.2/arch/mips/net/bpf_jit_asm.S:153: Error: opcode not supported on this processor: mips32 (mips32) rotr $19,$8,16' /home/aurel32/linux-4.2/arch/mips/net/bpf_jit_asm.S:164: Error: opcode not supported on this processor: mips32 (mips32) `wsbh $19,$12' /home/aurel32/linux-4.2/scripts/Makefile.build:294: recipe for target 'arch/mips/net/bpf_jit_asm.o' failed
Fix that by providing equivalent code for these CPUs.
Patchwork: https://patchwork.linux-mips.org/patch/11098/
--- arch/mips/net/bpf_jit_asm.S | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)
arch/mips/net/bpf_jit_asm.S +42 -0
@@ -64,8 +64,20 @@ sk_load_word_positive: PTR_ADDU t1, $r_skb_data, offset lw $r_A, 0(t1) #ifdef CONFIG_CPU_LITTLE_ENDIAN +# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) wsbh t0, $r_A rotr $r_A, t0, 16 +# else + sll t0, $r_A, 24 + srl t1, $r_A, 24 + srl t2, $r_A, 8 + or t0, t0, t1 + andi t2, t2, 0xff00 + andi t1, $r_A, 0xff00 + or t0, t0, t2 + sll t1, t1, 8 + or $r_A, t0, t1 +# endif #endif jr $r_ra move $r_ret, zero
@@ -80,8 +92,16 @@ sk_load_half_positive: PTR_ADDU t1, $r_skb_data, offset lh $r_A, 0(t1) #ifdef CONFIG_CPU_LITTLE_ENDIAN +# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) wsbh t0, $r_A seh $r_A, t0 +# else + sll t0, $r_A, 24 + andi t1, $r_A, 0xff00 + sra t0, t0, 16 + srl t1, t1, 8 + or $r_A, t0, t1 +# endif #endif jr $r_ra move $r_ret, zero
@@ -148,9 +168,22 @@ sk_load_byte_positive: NESTED(bpf_slow_path_word, (6 * SZREG), $r_sp) bpf_slow_path_common(4) #ifdef CONFIG_CPU_LITTLE_ENDIAN +# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) wsbh t0, $r_s0 jr $r_ra rotr $r_A, t0, 16 +# else + sll t0, $r_s0, 24 + srl t1, $r_s0, 24 + srl t2, $r_s0, 8 + or t0, t0, t1 + andi t2, t2, 0xff00 + andi t1, $r_s0, 0xff00 + or t0, t0, t2 + sll t1, t1, 8 + jr $r_ra + or $r_A, t0, t1 +# endif #else jr $r_ra move $r_A, $r_s0
@@ -161,8 +194,17 @@ NESTED(bpf_slow_path_word, (6 * SZREG), NESTED(bpf_slow_path_half, (6 * SZREG), $r_sp) bpf_slow_path_common(2) #ifdef CONFIG_CPU_LITTLE_ENDIAN +# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) jr $r_ra wsbh $r_A, $r_s0 +# else + sll t0, $r_s0, 8 + andi t1, $r_s0, 0xff00 + andi t0, t0, 0xff00 + srl t1, t1, 8 + jr $r_ra + or $r_A, t0, t1 +# endif #else jr $r_ra move $r_A, $r_s0
Greg Kroah-Hartman
maintainerPATCH 208/258 MIPS: CPS: Stop dangling delay slot from has_mt.
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
commit 1e5fb282f8eda889776ee83f9214d5df9edaa26d upstream.
The has_mt macro ended with a branch, leaving its callers with a delay slot that would be executed if Config3.MT is not set. However it would not be executed if Config3 (or earlier Config registers) don't exist which makes it somewhat inconsistent at best. Fill the delay slot in the macro & fix the mips_cps_boot_vpes caller appropriately.
Patchwork: https://patchwork.linux-mips.org/patch/10865/
--- arch/mips/kernel/cps-vec.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/mips/kernel/cps-vec.S +2 -2
@@ -39,6 +39,7 @@ mfc0 \dest, CP0_CONFIG, 3 andi \dest, \dest, MIPS_CONF3_MT beqz \dest, \nomt + nop .endm .section .text.cps-vec
@@ -226,7 +227,6 @@ LEAF(mips_cps_core_init) #ifdef CONFIG_MIPS_MT /* Check that the core implements the MT ASE */ has_mt t0, 3f - nop .set push .set mips64r2
@@ -310,8 +310,8 @@ LEAF(mips_cps_boot_vpes) PTR_ADDU t0, t0, t1 /* Calculate this VPEs ID. If the core doesn't support MT use 0 */ + li t9, 0 has_mt ta2, 1f - li t9, 0 /* Find the number of VPEs present in the core */ mfc0 t1, CP0_MVPCONF0
Greg Kroah-Hartman
maintainerPATCH 209/258 MIPS: CPS: Dont include MT code in non-MT kernels.
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
commit a5b0f6db0e6cf6224e50f6585e9c8f0c2d38a8f8 upstream.
The MT-specific code in mips_cps_boot_vpes can safely be omitted from kernels which don't support MT, with the default VPE==0 case being used as it would be after the has_mt (Config3.MT) check failed at runtime. Discarding the code entirely will save us a few bytes & allow cleaner handling of MT ASE instructions by later patches.
Patchwork: https://patchwork.linux-mips.org/patch/10866/
--- arch/mips/kernel/cps-vec.S | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/kernel/cps-vec.S +2 -0
@@ -311,6 +311,7 @@ LEAF(mips_cps_boot_vpes) /* Calculate this VPEs ID. If the core doesn't support MT use 0 */ li t9, 0 +#ifdef CONFIG_MIPS_MT has_mt ta2, 1f /* Find the number of VPEs present in the core */
@@ -330,6 +331,7 @@ LEAF(mips_cps_boot_vpes) /* Retrieve the VPE ID from EBase.CPUNum */ mfc0 t9, $15, 1 and t9, t9, t1 +#endif 1: /* Calculate a pointer to this VPEs struct vpe_boot_config */ li t1, VPEBOOTCFG_SIZE
Greg Kroah-Hartman
maintainerPATCH 227/258 vfs: Test for and handle paths that are unreachable from their mnt_root
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
commit 397d425dc26da728396e66d392d5dcb8dac30c37 upstream.
In rare cases a directory can be renamed out from under a bind mount. In those cases without special handling it becomes possible to walk up the directory tree to the root dentry of the filesystem and down from the root dentry to every other file or directory on the filesystem.
Like division by zero .. from an unconnected path can not be given a useful semantic as there is no predicting at which path component the code will realize it is unconnected. We certainly can not match the current behavior as the current behavior is a security hole.
Therefore when encounting .. when following an unconnected path return -ENOENT.
- Add a function path_connected to verify path->dentry is reachable from path->mnt.mnt_root. AKA to validate that rename did not do something nasty to the bind mount.
To avoid races path_connected must be called after following a path component to it's next path component.
--- fs/namei.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
fs/namei.c +25 -2
@@ -560,6 +560,24 @@ static int __nd_alloc_stack(struct nameireturn 0 ; } +/** +* path_connected - Verify that a path->dentry is below path->mnt.mnt_root +* @path: nameidate to verify +* +* Rename can sometimes move a file or directory outside of a bind +* mount, path_connected allows those cases to be detected. +*/ +static bool path_connected (const struct path *path) +{ +struct vfsmount *mnt = path->mnt; + +/* Only bind mounts can have disconnected paths */ +if (mnt->mnt_root == mnt->mnt_sb->s_root) +return true; + +return is_subdir (path->dentry, mnt->mnt_root); +} +static inline int nd_alloc_stack (struct nameidata *nd) {if (likely (nd->depth !=EMBEDDED_LEVELS ))
@@ -1296,6 +1314,8 @@ static int follow_dotdot_rcu(struct namereturn -ECHILD ; nd->path.dentry = parent; nd->seq = seq; +if (unlikely (!path_connected (&nd->path))) +return -ENOENT ;break ; }else {struct mount *mnt =real_mount (nd->path.mnt);
@@ -1396,7 +1416,7 @@ static void follow_mount(struct path *pa } } -static void follow_dotdot (struct nameidata *nd) +static int follow_dotdot (struct nameidata *nd) {if (!nd->root.mnt)set_root (nd);
@@ -1412,6 +1432,8 @@ static void follow_dotdot(struct nameida/* rare case of legitimate dget_parent()... */ nd->path.dentry =dget_parent (nd->path.dentry);dput (old); +if (unlikely (!path_connected (&nd->path))) +return -ENOENT ;break ; }if (!follow_up (&nd->path))
@@ -1419,6 +1441,7 @@ static void follow_dotdot(struct nameida }follow_mount (&nd->path); nd->inode = nd->path.dentry->d_inode; +return 0 ; }/*
@@ -1634,7 +1657,7 @@ static inline int handle_dots(struct namif (nd->flags &LOOKUP_RCU ) {return follow_dotdot_rcu (nd); }else -follow_dotdot (nd); +return follow_dotdot (nd); }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 234/258 igb: do not re-init SR-IOV during probe
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Assmann <[email protected]>
commit 6423fc34160939142d72ffeaa2db6408317f54df upstream.
During driver probing the following code path is triggered. igb_probe
->igb_sw_init
->igb_probe_vfs
->igb_pci_enable_sriov
->igb_sriov_reinitDoing the SR-IOV re-init is not necessary during probing since we're starting from scratch. Here we can call igb_enable_sriov() right away.
Running igb_sriov_reinit() during igb_probe() also seems to cause occasional packet loss on some onboard 82576 NICs. Reproduced on Dell and HP servers with onboard 82576 NICs.
Example:
Intel Corporation 82576 Gigabit Network Connection [8086:10c9] (rev 01)
Subsystem: Dell Device [1028:0481]
--- drivers/net/ethernet/intel/igb/igb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/igb/igb_main.c +1 -1
@@ -2851,7 +2851,7 @@ static void igb_probe_vfs(struct igb_adareturn ;pci_sriov_set_totalvfs (pdev,7 ); -igb_pci_enable_sriov (pdev, max_vfs); +igb_enable_sriov (pdev, max_vfs);#endif /* CONFIG_PCI_IOV */ }
Greg Kroah-Hartman
maintainerPATCH 235/258 genirq: Fix race in register_irq_proc()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 95c2b17534654829db428f11bcf4297c059a2a7e upstream.
Per-IRQ directories in procfs are created only when a handler is first added to the irqdesc, not when the irqdesc is created. In the case of a shared IRQ, multiple tasks can race to create a directory. This race condition seems to have been present forever, but is easier to hit with async probing.
--- kernel/irq/proc.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
kernel/irq/proc.c +17 -2
@@ -12,6 +12,7 @@#include <linux/seq_file.h> #include <linux/interrupt.h> #include <linux/kernel_stat.h> +#include <linux/mutex.h> #include "internals.h"
@@ -323,18 +324,29 @@ void register_handler_proc(unsigned intvoid register_irq_proc (unsigned int irq,struct irq_desc *desc) { +static DEFINE_MUTEX (register_lock);char name [MAX_NAMELEN ]; -if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip) || desc->dir) +if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip))return ; +/* +* irq directories are registered only when a handler is +* added, not when the descriptor is created, so multiple +* tasks might try to register at the same time. +*/ +mutex_lock (®ister_lock); + +if (desc->dir) + goto out_unlock; +memset (name,0 ,MAX_NAMELEN );sprintf (name,"%d" , irq);/* create /proc/irq/1234 */ desc->dir =proc_mkdir (name, root_irq_dir);if (!desc->dir) -return ; + goto out_unlock;#ifdef CONFIG_SMP /* create /proc/irq/<irq>/smp_affinity */
@@ -355,6 +367,9 @@ void register_irq_proc(unsigned int irq,proc_create_data ("spurious" ,0444 , desc->dir, &irq_spurious_proc_fops, (void *)(long )irq); + +out_unlock: +mutex_unlock (®ister_lock); }void unregister_irq_proc (unsigned int irq,struct irq_desc *desc)
Greg Kroah-Hartman
maintainerPATCH 239/258 mmc: sdhci-pxav3: remove broken clock base quirk for Armada 38x sdhci driver
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nadav Haklai <[email protected]>
commit 5de76bfcb1e5ac66c57b99e8e193dacac7416f0e upstream.
shci-pxav3 driver is enabling by default the SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN quirk. However this quirk is not required for Armada 38x and leads to wrong clock setting in the divider.
--- drivers/mmc/host/sdhci-pxav3.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/sdhci-pxav3.c +1 -0
@@ -135,6 +135,7 @@ static int armada_38x_quirks(struct platstruct sdhci_pxa *pxa = pltfm_host->priv;struct resource *res; + host->quirks &= ~SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN ; host->quirks |=SDHCI_QUIRK_MISSING_CAPS ; res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"conf-sdio3" );
Greg Kroah-Hartman
maintainerPATCH 240/258 mmc: sdhci-pxav3: disable clock inversion for HS MMC cards
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nadav Haklai <[email protected]>
commit fa7964147da57b2d40c2db2b6ed98fb7dc934bff upstream.
According to 'FE-2946959' erratum the clock inversion option is needed to support slow frequencies when the card input hold time requirement is high. This setting is not required for high speed MMC and might cause timing violation.
drivers/mmc/host/sdhci-pxav3.c +3 -0
@@ -291,6 +291,9 @@ static void pxav3_set_uhs_signaling(struct sdhci_host *host, unsigned int uhs) uhs == MMC_TIMING_UHS_DDR50) { reg_val &= ~SDIO3_CONF_CLK_INV ; reg_val |=SDIO3_CONF_SD_FB_CLK ; + } else if (uhs == MMC_TIMING_MMC_HS) { + reg_val &= ~SDIO3_CONF_CLK_INV ; + reg_val &= ~SDIO3_CONF_SD_FB_CLK ; } else { reg_val |=SDIO3_CONF_CLK_INV ; reg_val &= ~SDIO3_CONF_SD_FB_CLK ;
Greg Kroah-Hartman
maintainerPATCH 241/258 mmc: sdhci-pxav3: fix error handling of armada_38x_quirks
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcin Wojtas <[email protected]>
commit 2162d9f41e7c4778b96b8e3b97adcedbadc861f1 upstream.
In case of armada_38x_quirks error, all clocks should be cleaned-up, same as after mv_conf_mbus_windows failure.
drivers/mmc/host/sdhci-pxav3.c +1 -1
@@ -402,7 +402,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)if (of_device_is_compatible (np,"marvell,armada-380-sdhci" )) { ret =armada_38x_quirks (pdev, host);if (ret <0 ) - goto err_clk_get; + goto err_mbus_win; ret =mv_conf_mbus_windows (pdev,mv_mbus_dram_info ());if (ret <0 ) goto err_mbus_win;
Greg Kroah-Hartman
maintainerPATCH 243/258 clk: ti: fix dual-registration of uart4_ick
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Dooks <[email protected]>
commit 19e79687de22f23bcfb5e79cce3daba20af228d1 upstream.
On the OMAP AM3517 platform the uart4_ick gets registered twice, causing any power management to /dev/ttyO3 to fail when trying to wake the device up.
This solves the following oops:
[] Unhandled fault: external abort on non-linefetch (0x1028) at 0xfa09e008 [] PC is at serial_omap_pm+0x48/0x15c
[] LR is at _raw_spin_unlock_irqrestore+0x30/0x5c
--- drivers/clk/ti/clk-3xxx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/ti/clk-3xxx.c +1 -1
@@ -163,7 +163,6 @@ static struct ti_dt_clk omap3xxx_clks[]DT_CLK (NULL ,"gpio2_ick" ,"gpio2_ick" ),DT_CLK (NULL ,"wdt3_ick" ,"wdt3_ick" ),DT_CLK (NULL ,"uart3_ick" ,"uart3_ick" ), -DT_CLK (NULL ,"uart4_ick" ,"uart4_ick" ),DT_CLK (NULL ,"gpt9_ick" ,"gpt9_ick" ),DT_CLK (NULL ,"gpt8_ick" ,"gpt8_ick" ), DT_CLK(NULL, "gpt7_ick", "gpt7_ick"),
@@ -308,6 +307,7 @@ static struct ti_dt_clk am35xx_clks[] =static struct ti_dt_clk omap36xx_clks[] = {DT_CLK (NULL ,"omap_192m_alwon_fck" ,"omap_192m_alwon_fck" ),DT_CLK (NULL ,"uart4_fck" ,"uart4_fck" ), +DT_CLK (NULL ,"uart4_ick" ,"uart4_ick" ), { .node_name =NULL }, };
Greg Kroah-Hartman
maintainerPATCH 249/258 staging: speakup: fix speakup-r regression
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: "[email protected]" <[email protected]>
commit b1d562acc78f0af46de0dfe447410bc40bdb7ece upstream.
Here is a patch to make speakup-r work again.
It broke in 3.6 due to commit 4369c64c79a22b98d3b7eff9d089196cd878a10a "Input: Send events one packet at a time)
The problem was that the fakekey.c routine to fake a down arrow no longer functioned properly and putting the input_sync fixed it.
--- drivers/staging/speakup/fakekey.c | 1 + 1 file changed, 1 insertion(+)
drivers/staging/speakup/fakekey.c +1 -0
@@ -81,6 +81,7 @@ void speakup_fake_down_arrow(void)__this_cpu_write (reporting_keystroke, true);input_report_key (virt_keyboard,KEY_DOWN ,PRESSED );input_report_key (virt_keyboard,KEY_DOWN ,RELEASED ); +input_sync (virt_keyboard);__this_cpu_write (reporting_keystroke, false);/* reenable preemption */
Greg Kroah-Hartman
maintainerPATCH 257/258 sched/preempt: Fix cond_resched_lock() and cond_resched_softirq()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Khlebnikov <[email protected]>
commit fe32d3cd5e8eb0f82e459763374aa80797023403 upstream.
These functions check should_resched() before unlocking spinlock/bh-enable:preempt_count always non-zero => should_resched() always returns false. cond_resched_lock() worked iff spin_needbreak is set.
This patch adds argument "preempt_offset" to should_resched().
preempt_count offset constants for that:
PREEMPT_DISABLE_OFFSET - offset after preempt_disable() PREEMPT_LOCK_OFFSET - offset after spin_lock() SOFTIRQ_DISABLE_OFFSET - offset after local_bh_distable() SOFTIRQ_LOCK_OFFSET - offset after spin_lock_bh()
--- arch/x86/include/asm/preempt.h | 4 ++-- include/asm-generic/preempt.h | 5 +++-- include/linux/preempt.h | 19 ++++++++++++++----- include/linux/sched.h | 6 ------ kernel/sched/core.c | 6 +++--- 5 files changed, 22 insertions(+), 18 deletions(-)
arch/x86/include/asm/preempt.h +2 -2
@@ -90,9 +90,9 @@ static __always_inline bool __preempt_co/* * Returns true when we need to resched and can (barring IRQ state). */ -static __always_inline bool should_resched(void) +static __always_inline bool should_resched(int preempt_offset) { -return unlikely (!raw_cpu_read_4 (__preempt_count)); +return unlikely (raw_cpu_read_4 (__preempt_count) == preempt_offset); }#ifdef CONFIG_PREEMPT
include/asm-generic/preempt.h +3 -2
@@ -71,9 +71,10 @@ static __always_inline bool __preempt_co/* * Returns true when we need to resched and can (barring IRQ state). */ -static __always_inline bool should_resched(void) +static __always_inline bool should_resched(int preempt_offset) { -return unlikely (!preempt_count () &&tif_need_resched ()); +return unlikely (preempt_count () == preempt_offset && +tif_need_resched ()); }#ifdef CONFIG_PREEMPT
include/linux/preempt.h +14 -5
@@ -84,13 +84,21 @@*/ #define in_nmi () (preempt_count() & NMI_MASK) +/* +* The preempt_count offset after preempt_disable(); +*/ #if defined(CONFIG_PREEMPT_COUNT ) -# define PREEMPT_DISABLE_OFFSET 1 +# define PREEMPT_DISABLE_OFFSET PREEMPT_OFFSET#else -# define PREEMPT_DISABLE_OFFSET 0 +# define PREEMPT_DISABLE_OFFSET 0#endif /* +* The preempt_count offset after spin_lock() +*/ +#define PREEMPT_LOCK_OFFSET PREEMPT_DISABLE_OFFSET + +/* * The preempt_count offset needed for things like: * * spin_lock_bh()
@@ -103,7 +111,7 @@* * Work as expected. */ -#define SOFTIRQ_LOCK_OFFSET (SOFTIRQ_DISABLE_OFFSET + PREEMPT_DISABLE_OFFSET) +#define SOFTIRQ_LOCK_OFFSET (SOFTIRQ_DISABLE_OFFSET + PREEMPT_LOCK_OFFSET)/* * Are we running in atomic context? WARNING: this macro cannot
@@ -124,7 +132,8 @@#if defined(CONFIG_DEBUG_PREEMPT ) || defined(CONFIG_PREEMPT_TRACER )extern void preempt_count_add (int val);extern void preempt_count_sub (int val); -#define preempt_count_dec_and_test () ({ preempt_count_sub(1); should_resched(); }) +#define preempt_count_dec_and_test () \ + ({ preempt_count_sub(1); should_resched(0); })#else #define preempt_count_add (val) __preempt_count_add(val)#define preempt_count_sub (val) __preempt_count_sub(val)
@@ -184,7 +193,7 @@ do { \#define preempt_check_resched () \ do { \ - if (should_resched()) \ + if (should_resched(0)) \ __preempt_schedule(); \ } while (0)
include/linux/sched.h +0 -6
@@ -2909,12 +2909,6 @@ extern int _cond_resched(void);extern int __cond_resched_lock (spinlock_t *lock); -#ifdef CONFIG_PREEMPT_COUNT -#define PREEMPT_LOCK_OFFSET PREEMPT_OFFSET -#else -#define PREEMPT_LOCK_OFFSET 0 -#endif -#define cond_resched_lock (lock) ({ \ ___might_sleep(__FILE__, __LINE__, PREEMPT_LOCK_OFFSET);\ __cond_resched_lock(lock); \
kernel/sched/core.c +3 -3
@@ -4499,7 +4499,7 @@ SYSCALL_DEFINE0(sched_yield) int __sched _cond_resched(void) { -if (should_resched ()) { +if (should_resched (0 )) {preempt_schedule_common ();return 1 ; }
@@ -4517,7 +4517,7 @@ EXPORT_SYMBOL(_cond_resched);*/ int __cond_resched_lock (spinlock_t *lock) { -int resched =should_resched (); +int resched =should_resched (PREEMPT_LOCK_OFFSET );int ret =0 ;lockdep_assert_held (lock);
@@ -4539,7 +4539,7 @@ int __sched __cond_resched_softirq(void) {BUG_ON (!in_softirq ()); -if (should_resched ()) { +if (should_resched (SOFTIRQ_DISABLE_OFFSET )) {local_bh_enable ();preempt_schedule_common ();local_bh_disable ();
Greg Kroah-Hartman
maintainerPATCH 1/258 arm: KVM: Fix incorrect device to IPA mapping
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Majtyka <[email protected]>
commit ca09f02f122b2ecb0f5ddfc5fd47b29ed657d4fd upstream.
A critical bug has been found in device memory stage1 translation for VMs with more then 4GB of address space. Once vm_pgoff size is smaller then pa (which is true for LPAE case, u32 and u64 respectively) some more significant bits of pa may be lost as a shift operation is performed on u32 and later cast onto u64.
Example: vm_pgoff(u32)=0x00210030, PAGE_SHIFT=12
expected pa(u64): 0x0000002010030000
produced pa(u64): 0x0000000010030000The fix is to change the order of operations (casting first onto phys_addr_t and then shifting).
--- arch/arm/kvm/mmu.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/arm/kvm/mmu.c +4 -2
@@ -1792,8 +1792,10 @@ int kvm_arch_prepare_memory_region(strucif (vma->vm_flags &VM_PFNMAP ) {gpa_t gpa = mem->guest_phys_addr + (vm_start - mem->userspace_addr); -phys_addr_t pa = (vma->vm_pgoff <<PAGE_SHIFT ) + - vm_start - vma->vm_start; +phys_addr_t pa; + + pa = (phys_addr_t )vma->vm_pgoff <<PAGE_SHIFT ; + pa += vm_start - vma->vm_start;/* IO region dirty page logging not allowed */ if (memslot->flags &KVM_MEM_LOG_DIRTY_PAGES )
Greg Kroah-Hartman
maintainerPATCH 10/258 KVM: PPC: Book3S: Take the kvm->srcu lock in kvmppc_h_logical_ci_load/store()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Huth <[email protected]>
commit 3eb4ee68254235e4f47bc0410538fcdaede39589 upstream.
Access to the kvm->buses (like with the kvm_io_bus_read() and -write() functions) has to be protected via the kvm->srcu lock.
The kvmppc_h_logical_ci_load() and -store() functions are missing this lock so far, so let's add it there, too.
This fixes the problem that the kernel reports "suspicious RCU usage" when lock debugging is enabled.
--- arch/powerpc/kvm/book3s.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/powerpc/kvm/book3s.c +6 -0
@@ -827,12 +827,15 @@ int kvmppc_h_logical_ci_load(struct kvm_unsigned long size =kvmppc_get_gpr (vcpu,4 );unsigned long addr =kvmppc_get_gpr (vcpu,5 );u64 buf; +int srcu_idx;int ret;if (!is_power_of_2 (size) || (size >sizeof (buf)))return H_TOO_HARD ; + srcu_idx =srcu_read_lock (&vcpu->kvm->srcu); ret =kvm_io_bus_read (vcpu,KVM_MMIO_BUS , addr, size, &buf); +srcu_read_unlock (&vcpu->kvm->srcu, srcu_idx);if (ret !=0 )return H_TOO_HARD ;
@@ -867,6 +870,7 @@ int kvmppc_h_logical_ci_store(struct kvmunsigned long addr =kvmppc_get_gpr (vcpu,5 );unsigned long val =kvmppc_get_gpr (vcpu,6 );u64 buf; +int srcu_idx;int ret;switch (size) {
@@ -890,7 +894,9 @@ int kvmppc_h_logical_ci_store(struct kvmreturn H_TOO_HARD ; } + srcu_idx =srcu_read_lock (&vcpu->kvm->srcu); ret =kvm_io_bus_write (vcpu,KVM_MMIO_BUS , addr, size, &buf); +srcu_read_unlock (&vcpu->kvm->srcu, srcu_idx);if (ret !=0 )return H_TOO_HARD ;
Greg Kroah-Hartman
maintainerPATCH 11/258 KVM: PPC: Book3S HV: Pass the correct trap argument to kvmhv_commence_exit
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Gautham R. Shenoy" <[email protected]>
commit 7e022e717f54897e396504306d0c9b61452adf4e upstream.
In guest_exit_cont we call kvmhv_commence_exit which expects the trap number as the argument. However r3 doesn't contain the trap number at this point and as a result we would be calling the function with a spurious trap number.
Fix this by copying r12 into r3 before calling kvmhv_commence_exit as r12 contains the trap number.
--- arch/powerpc/kvm/book3s_hv_rmhandlers.S | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/kvm/book3s_hv_rmhandlers.S +1 -0
@@ -1171,6 +1171,7 @@ mc_cont: bl kvmhv_accumulate_time #endif + mr r3, r12 /* Increment exit count, poke other threads to exit */ bl kvmhv_commence_exit nop
Greg Kroah-Hartman
maintainerPATCH 13/258 Revert "KVM: SVM: use NPT page attributes"
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
commit fc07e76ac7ffa3afd621a1c3858a503386a14281 upstream.
This reverts commit 3c2e7f7de3240216042b61073803b61b9b3cfb22. Initializing the mapping from MTRR to PAT values was reported to fail nondeterministically, and it also caused extremely slow boot (due to caching getting disabled---bug 103321) with assigned devices.
--- arch/x86/kvm/svm.c | 101 ++--------------------------------------------------- 1 file changed, 5 insertions(+), 96 deletions(-)
arch/x86/kvm/svm.c +5 -96
@@ -865,64 +865,6 @@ static void svm_disable_lbrv(struct vcpuset_msr_interception (msrpm,MSR_IA32_LASTINTTOIP ,0 ,0 ); } -#define MTRR_TYPE_UC_MINUS 7 -#define MTRR2PROTVAL_INVALID 0xff - -static u8 mtrr2protval[8 ]; - -static u8 fallback_mtrr_type (int mtrr) -{ -/* -* WT and WP aren't always available in the host PAT. Treat -* them as UC and UC- respectively. Everything else should be -* there. -*/ -switch (mtrr) - { -case MTRR_TYPE_WRTHROUGH : -return MTRR_TYPE_UNCACHABLE ; -case MTRR_TYPE_WRPROT : -return MTRR_TYPE_UC_MINUS ; -default : -BUG (); - } -} - -static void build_mtrr2protval (void ) -{ -int i; -u64 pat; - -for (i =0 ; i <8 ; i++) - mtrr2protval[i] =MTRR2PROTVAL_INVALID ; - -/* Ignore the invalid MTRR types. */ - mtrr2protval[2 ] =0 ; - mtrr2protval[3 ] =0 ; - -/* -* Use host PAT value to figure out the mapping from guest MTRR -* values to nested page table PAT/PCD/PWT values. We do not -* want to change the host PAT value every time we enter the -* guest. -*/ -rdmsrl (MSR_IA32_CR_PAT , pat); -for (i =0 ; i <8 ; i++) { -u8 mtrr = pat >> (8 * i); - -if (mtrr2protval[mtrr] ==MTRR2PROTVAL_INVALID ) - mtrr2protval[mtrr] =__cm_idx2pte (i); - } - -for (i =0 ; i <8 ; i++) { -if (mtrr2protval[i] ==MTRR2PROTVAL_INVALID ) { -u8 fallback =fallback_mtrr_type (i); - mtrr2protval[i] = mtrr2protval[fallback]; -BUG_ON (mtrr2protval[i] ==MTRR2PROTVAL_INVALID ); - } - } -} -static __init int svm_hardware_setup (void ) {int cpu;
@@ -989,7 +931,6 @@ static __init int svm_hardware_setup(voi }else kvm_disable_tdp (); -build_mtrr2protval ();return 0 ; err:
@@ -1144,42 +1085,6 @@ static u64 svm_compute_tsc_offset(structreturn target_tsc - tsc; } -static void svm_set_guest_pat (struct vcpu_svm *svm,u64 *g_pat) -{ -struct kvm_vcpu *vcpu = &svm->vcpu; - -/* Unlike Intel, AMD takes the guest's CR0.CD into account. -* -* AMD does not have IPAT. To emulate it for the case of guests -* with no assigned devices, just set everything to WB. If guests -* have assigned devices, however, we cannot force WB for RAM -* pages only, so use the guest PAT directly. -*/ -if (!kvm_arch_has_assigned_device (vcpu->kvm)) - *g_pat =0x0606060606060606 ; -else - *g_pat = vcpu->arch.pat; -} - -static u64 svm_get_mt_mask (struct kvm_vcpu *vcpu,gfn_t gfn,bool is_mmio) -{ -u8 mtrr; - -/* -* 1. MMIO: always map as UC -* 2. No passthrough: always map as WB, and force guest PAT to WB as well -* 3. Passthrough: can't guarantee the result, try to trust guest. -*/ -if (is_mmio) -return _PAGE_NOCACHE; - -if (!kvm_arch_has_assigned_device (vcpu->kvm)) -return 0 ; - - mtrr =kvm_mtrr_get_guest_memory_type (vcpu, gfn); -return mtrr2protval[mtrr]; -} -static void init_vmcb (struct vcpu_svm *svm,bool init_event) {struct vmcb_control_area *control = &svm->vmcb->control;
@@ -1276,7 +1181,6 @@ static void init_vmcb(struct vcpu_svm *sclr_cr_intercept (svm,INTERCEPT_CR3_READ );clr_cr_intercept (svm,INTERCEPT_CR3_WRITE ); save->g_pat = svm->vcpu.arch.pat; -svm_set_guest_pat (svm, &save->g_pat); save->cr3 =0 ; save->cr4 =0 ; }
@@ -4195,6 +4099,11 @@ static bool svm_has_high_real_mode_segbareturn true; } +static u64 svm_get_mt_mask (struct kvm_vcpu *vcpu,gfn_t gfn,bool is_mmio) +{ +return 0 ; +} +static void svm_cpuid_update (struct kvm_vcpu *vcpu) { }
Greg Kroah-Hartman
maintainerPATCH 17/258 scsi: fix scsi_error_handler vs. scsi_host_dev_release race
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Hocko <[email protected]>
commit 537b604c8b3aa8b96fe35f87dd085816552e294c upstream.
b9d5c6b7ef57 ("[SCSI] cleanup setting task state in scsi_error_handler()") has introduced a race between scsi_error_handler and scsi_host_dev_release resulting in the hang when the device goes away because scsi_error_handler might miss a wake up:
CPU0 CPU1scsi_error_handler scsi_host_dev_release
kthread_stop()
kthread_should_stop()
test_bit(KTHREAD_SHOULD_STOP)
set_bit(KTHREAD_SHOULD_STOP) wake_up_process() wait_for_completion()
set_current_state(TASK_INTERRUPTIBLE)
schedule()
The most straightforward solution seems to be to invert the ordering of the set_current_state and kthread_should_stop.
The issue has been noticed during reboot test on a 3.0 based kernel but the current code seems to be affected in the same way.
--- drivers/scsi/scsi_error.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/scsi/scsi_error.c +10 -1
@@ -2169,8 +2169,17 @@ int scsi_error_handler(void *data)* We never actually get interrupted because kthread_run * disables signal delivery for the created thread. */ -while (!kthread_should_stop ()) { +while (true) { +/* +* The sequence in kthread_stop() sets the stop flag first +* then wakes the process. To avoid missed wakeups, the task +* should always be in a non running state before the stop +* flag is checked +*/ set_current_state (TASK_INTERRUPTIBLE ); +if (kthread_should_stop ()) +break ; +if ((shost->host_failed ==0 && shost->host_eh_scheduled ==0 ) || shost->host_failed !=atomic_read (&shost->host_busy)) { SCSI_LOG_ERROR_RECOVERY(1,
Greg Kroah-Hartman
maintainerPATCH 19/258 target: Fix PR registration + APTPL RCU conversion regression
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 3ccd6e83df8a0d4a664edeecc453c4fa046395fb upstream.
This patch fixes a v4.2+ regression introduced by commit 79dc9c9e86 where lookup of t10_pr_registration->pr_reg_deve and associated ->pr_kref get was missing from __core_scsi3_do_alloc_registration(), which is responsible for setting DEF_PR_REG_ACTIVE.
This would result in REGISTER operations completing successfully, but subsequent core_scsi3_pr_seq_non_holder() checking would fail with !DEF_PR_REG_ACTIVE -> RESERVATION CONFLICT status.
Update __core_scsi3_add_registration() to drop ->pr_kref reference after registration and any optional ALL_TG_PT=1 processing has completed. Update core_scsi3_decode_spec_i_port() to release the new parent local_pr_reg->pr_kref as well.
Also, update __core_scsi3_check_aptpl_registration() to perform the same target_nacl_find_deve() lookup + ->pr_kref get, now that __core_scsi3_add_registration() expects to drop the reference.
Finally, since there are cases when se_dev_entry->se_lun_acl can still be dereferenced in core_scsi3_lunacl_undepend_item() while holding ->pr_kref, go ahead and move explicit rcu_assign_pointer() NULL assignments within core_disable_device_list_for_node() until after orig->pr_comp finishes.
--- drivers/target/target_core_device.c | 5 + drivers/target/target_core_pr.c | 91 ++++++++++++++++++++++++++---------- 2 files changed, 70 insertions(+), 26 deletions(-)
drivers/target/target_core_device.c +3 -2
@@ -427,8 +427,6 @@ void core_disable_device_list_for_node(hlist_del_rcu (&orig->link);clear_bit (DEF_PR_REG_ACTIVE , &orig->deve_flags); -rcu_assign_pointer (orig->se_lun,NULL ); -rcu_assign_pointer (orig->se_lun_acl,NULL ); orig->lun_flags =0 ; orig->creation_time =0 ; orig->attach_count--;
@@ -439,6 +437,9 @@ void core_disable_device_list_for_node(kref_put (&orig->pr_kref, target_pr_kref_release);wait_for_completion (&orig->pr_comp); +rcu_assign_pointer (orig->se_lun,NULL ); +rcu_assign_pointer (orig->se_lun_acl,NULL ); +kfree_rcu (orig, rcu_head);core_scsi3_free_pr_reg_from_nacl (dev, nacl);
drivers/target/target_core_pr.c +67 -24
153 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 4/258 kvm: fix zero length mmio searching
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wang <[email protected]>
commit 8f4216c7d28976f7ec1b2bcbfa0a9f787133c45e upstream.
Currently, if we had a zero length mmio eventfd assigned on KVM_MMIO_BUS. It will never be found by kvm_io_bus_cmp() since it always compares the kvm_io_range() with the length that guest wrote. This will cause e.g for vhost, kick will be trapped by qemu userspace instead of vhost. Fixing this by using zero length if an iodevice is zero length.
--- virt/kvm/kvm_main.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
virt/kvm/kvm_main.c +17 -2
@@ -3080,10 +3080,25 @@ static void kvm_io_bus_destroy(struct kvstatic inline int kvm_io_bus_cmp (const struct kvm_io_range *r1,const struct kvm_io_range *r2) { -if (r1->addr < r2->addr) +gpa_t addr1 = r1->addr; +gpa_t addr2 = r2->addr; + +if (addr1 < addr2)return -1 ; -if (r1->addr + r1->len > r2->addr + r2->len) + +/* If r2->len == 0, match the exact address. If r2->len != 0, +* accept any overlapping write. Any order is acceptable for +* overlapping ranges, because kvm_io_bus_get_first_dev ensures +* we process all of them. +*/ +if (r2->len) { + addr1 += r1->len; + addr2 += r2->len; + } + +if (addr1 > addr2)return 1 ; +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 31/258 perf tools: Add empty Build files for architectures lacking them
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 93df8a1ed6231727c5db94a80b1a6bd5ee67cec3 upstream.
perf currently fails to build on MIPS as there is no tools/perf/arch/mips/Build file. Adding an empty file fixes this as there are no MIPS-specific sources to build.
It looks like the same is needed for Alpha and PA-RISC, though I haven't been able to test those.
--- tools/perf/arch/alpha/Build | 1 + tools/perf/arch/mips/Build | 1 + tools/perf/arch/parisc/Build | 1 + 3 files changed, 3 insertions(+)
tools/perf/arch/alpha/Build new file +1 -0
@@ -0,0 +1 @@ +# empty
tools/perf/arch/mips/Build new file +1 -0
@@ -0,0 +1 @@ +# empty
tools/perf/arch/parisc/Build new file +1 -0
@@ -0,0 +1 @@ +# empty
Greg Kroah-Hartman
maintainerPATCH 48/258 ARM: dts: sunxi: Raise minimum CPU voltage for sun7i-a20 to meet SoC specifications
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timo Sigurdsson <[email protected]>
commit eaeef1ad9b6ea6df1d1220c254d9563da60cb9d1 upstream.
sun7i-a20.dtsi contains a cpufreq operating point at 0.9 volts. The minimum CPU voltage for the Allwinner A20 SoC, however, is 1.0 volts. Thus, raise the voltage for the lowest operating point to 1.0 volts in order to stay within the SoC specifications. It is an undervolted setting that isn't stable across all SoCs and boards out there.
--- arch/arm/boot/dts/sun7i-a20.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/sun7i-a20.dtsi +1 -1
@@ -107,7 +107,7 @@ 720000 1200000 528000 1100000 312000 1000000 - 144000 900000 + 144000 1000000 >; #cooling-cells = <2>; cooling-min-level = <0>;
Greg Kroah-Hartman
maintainerPATCH 24/258 locking/qspinlock/x86: Fix performance regression under unaccelerated VMs
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
commit 43b3f02899f74ae9914a39547cc5492156f0027a upstream.
Dave ran into horrible performance on a VM without PARAVIRT_SPINLOCKS set and Linus noted that the test-and-set implementation was retarded.
One should spin on the variable with a load, not a RMW.
While there, remove 'queued' from the name, as the lock isn't queued at all, but a simple test-and-set.
arch/x86/include/asm/qspinlock.h +12 -4
@@ -39,15 +39,23 @@ static inline void queued_spin_unlock(struct qspinlock *lock) }#endif -#define virt_queued_spin_lock virt_queued_spin_lock +#define virt_spin_lock virt_spin_lock -static inline bool virt_queued_spin_lock (struct qspinlock *lock) +static inline bool virt_spin_lock (struct qspinlock *lock) {if (!static_cpu_has (X86_FEATURE_HYPERVISOR ))return false; -while (atomic_cmpxchg (&lock->val,0 , _Q_LOCKED_VAL) !=0 ) -cpu_relax (); +/* +* On hypervisors without PARAVIRT_SPINLOCKS support we fall +* back to a Test-and-Set spinlock, because fair locks have +* horrible lock 'holder' preemption issues. +*/ + +do { +while (atomic_read (&lock->val) !=0 ) +cpu_relax (); + }while (atomic_cmpxchg (&lock->val,0 , _Q_LOCKED_VAL) !=0 );return true; }
include/asm-generic/qspinlock.h +2 -2
@@ -111,8 +111,8 @@ static inline void queued_spin_unlock_wait(struct qspinlock *lock)cpu_relax (); } -#ifndef virt_queued_spin_lock -static __always_inline bool virt_queued_spin_lock(struct qspinlock *lock) +#ifndef virt_spin_lock +static __always_inline bool virt_spin_lock(struct qspinlock *lock) {return false; }
kernel/locking/qspinlock.c +1 -1
@@ -289,7 +289,7 @@ void queued_spin_lock_slowpath(struct qspinlock *lock, u32 val)if (pv_enabled ()) goto queue; -if (virt_queued_spin_lock (lock)) +if (virt_spin_lock (lock))return ;/*
Greg Kroah-Hartman
maintainerPATCH 61/258 x86/alternatives: Make optimize_nops() interrupt safe and synced
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 66c117d7fa2ae429911e60d84bf31a90b2b96189 upstream.
Richard reported the following crash:
[ 0.036000] BUG: unable to handle kernel paging request at 55501e06 [ 0.036000] IP: [<c0aae48b>] common_interrupt+0xb/0x38 [ 0.036000] Call Trace: [ 0.036000] [<c0409c80>] ? add_nops+0x90/0xa0 [ 0.036000] [<c040a054>] apply_alternatives+0x274/0x630
Chuck decoded:
" 0: 8d 90 90 83 04 24 lea 0x24048390(%eax),%edx
6: 80 fc 0f cmp $0xf,%ah
9: a8 0f test $0xf,%al
>> b: a0 06 1e 50 55 mov 0x55501e06,%al
10: 57 push %edi
11: 56 push %esi Interrupt 0x30 occurred while the alternatives code was replacing the initial 0x90,0x90,0x90 NOPs (from the ASM_CLAC macro) with the optimized version, 0x8d,0x76,0x00. Only the first byte has been replaced so far, and it makes a mess out of the insn decoding."
optimize_nops() is buggy in two aspects:
- It's not disabling interrupts across the modification
- It's lacking a sync_core() call
Add both.
--- arch/x86/kernel/alternative.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/x86/kernel/alternative.c +5 -0
@@ -338,10 +338,15 @@ done: static void __init_or_module optimize_nops(struct alt_instr *a, u8 *instr) { +unsigned long flags; +if (instr[0 ] !=0x90 )return ; +local_irq_save (flags);add_nops (instr + (a->instrlen - a->padlen), a->padlen); +sync_core (); +local_irq_restore (flags);DUMP_BYTES (instr, a->instrlen,"%p: [%d:%d) optimized NOPs: " , instr, a->instrlen - a->padlen, a->padlen);
Greg Kroah-Hartman
maintainerPATCH 91/258 ALSA: hda/tegra - async probe for avoiding module loading deadlock
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 83510441bc08bee201c0ded9d81da6dfd008d69a upstream.
The Tegra HD-audio controller driver causes deadlocks when loaded as a module since the driver invokes request_module() at binding with the codec driver. This patch works around it by deferring the probe in a work like Intel HD-audio controller driver does. Although hovering the codec probe stuff into udev would be a better solution, it may cause other regressions, so let's try this band-aid fix until the more proper solution gets landed.
--- sound/pci/hda/hda_tegra.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-)
sound/pci/hda/hda_tegra.c +25 -5
@@ -73,6 +73,7 @@ struct hda_tegra {struct clk *hda2codec_2x_clk;struct clk *hda2hdmi_clk;void __iomem *regs; +struct work_struct probe_work; };#ifdef CONFIG_PM
@@ -294,7 +295,9 @@ static int hda_tegra_dev_disconnect(strustatic int hda_tegra_dev_free (struct snd_device *device) {struct azx *chip = device->device_data; + struct hda_tegra *hda = container_of(chip, struct hda_tegra, chip); +cancel_work_sync (&hda->probe_work);if (azx_bus (chip)->chip_init) {azx_stop_all_streams (chip);azx_stop_chip (chip);
@@ -426,6 +429,9 @@ static int hda_tegra_first_init(struct a/* * constructor */ + +static void hda_tegra_probe_work (struct work_struct *work); +static int hda_tegra_create (struct snd_card *card,unsigned int driver_caps,struct hda_tegra *hda)
@@ -452,6 +458,8 @@ static int hda_tegra_create(struct snd_c chip->single_cmd = false; chip->snoop = true; +INIT_WORK (&hda->probe_work, hda_tegra_probe_work); + err =azx_bus_init (chip,NULL , &hda_tegra_io_ops);if (err <0 )return err;
@@ -499,6 +507,21 @@ static int hda_tegra_probe(struct platfo card->private_data = chip;dev_set_drvdata (&pdev->dev, card); +schedule_work (&hda->probe_work); + +return 0 ; + +out_free: +snd_card_free (card); +return err; +} + +static void hda_tegra_probe_work (struct work_struct *work) +{ + struct hda_tegra *hda = container_of(work, struct hda_tegra, probe_work); +struct azx *chip = &hda->chip; +struct platform_device *pdev =to_platform_device (hda->dev); +int err; err =hda_tegra_first_init (chip, pdev);if (err <0 )
@@ -520,11 +543,8 @@ static int hda_tegra_probe(struct platfo chip->running =1 ;snd_hda_set_power_save (&chip->bus, power_save *1000 ); -return 0 ; - -out_free: -snd_card_free (card); -return err; + out_free: +return ;/* no error return from async probe */ }static int hda_tegra_remove (struct platform_device *pdev)
Greg Kroah-Hartman
maintainerPATCH 92/258 ALSA: hda - Disable power_save_node for Thinkpads
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 7f57d803ee03730d570dc59a9e3e4842b58dd5cc upstream.
Lenovo Thinkpads with recent Realtek codecs seem suffering from click noises at power transition since the introduction of widget power saving in 4.1 kernel. Although this might be solved by some delays in appropriate points, as a quick workaround, just disable the power_save_node feature for now. The gain it gives is relatively small, and this makes the situation back to pre 4.1 time.
This patch ended up with a bit more code changes than usual because the existing fixup for Thinkpads is highly chained. Instead of adding yet another chain, combine a few of them into a single fixup entry, as a gratis cleanup.
Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=943982
--- sound/pci/hda/patch_realtek.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-)
sound/pci/hda/patch_realtek.c +19 -12
@@ -4188,6 +4188,24 @@ static void alc_fixup_disable_aamix(stru } } +/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */ +static void alc_fixup_tpt440_dock (struct hda_codec *codec, +const struct hda_fixup *fix,int action) +{ +static const struct hda_pintbl pincfgs[] = { + {0x16 ,0x21211010 },/* dock headphone */ + {0x19 ,0x21a11010 },/* dock mic */ + { } + }; +struct alc_spec *spec = codec->spec; + +if (action ==HDA_FIXUP_ACT_PRE_PROBE ) { + spec->parse_flags =HDA_PINCFG_NO_HP_FIXUP ; + codec->power_save_node =0 ;/* avoid click noises */ +snd_hda_apply_pincfgs (codec, pincfgs); + } +} +static void alc_shutup_dell_xps13 (struct hda_codec *codec) {struct alc_spec *spec = codec->spec;
@@ -4562,7 +4580,6 @@ enum {ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ,ALC292_FIXUP_TPT440_DOCK , -ALC292_FIXUP_TPT440_DOCK2 ,ALC283_FIXUP_BXBT2807_MIC ,ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED , ALC282_FIXUP_ASPIRE_V5_PINS,
@@ -5029,17 +5046,7 @@ static const struct hda_fixup alc269_fix }, [ALC292_FIXUP_TPT440_DOCK] = { .type = HDA_FIXUP_FUNC, - .v.func = alc269_fixup_pincfg_no_hp_to_lineout, - .chained = true, - .chain_id =ALC292_FIXUP_TPT440_DOCK2 - }, - [ALC292_FIXUP_TPT440_DOCK2] = { - .type = HDA_FIXUP_PINS, - .v.pins = (const struct hda_pintbl []) { - {0x16 ,0x21211010 },/* dock headphone */ - {0x19 ,0x21a11010 },/* dock mic */ - { } - }, + .v.func = alc_fixup_tpt440_dock, .chained = true, .chain_id =ALC269_FIXUP_LIMIT_INT_MIC_BOOST },
Greg Kroah-Hartman
maintainerPATCH 93/258 ALSA: synth: Fix conflicting OSS device registration on AWE32
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 225db5762dc1a35b26850477ffa06e5cd0097243 upstream.
When OSS emulation is loaded on ISA SB AWE32 chip, we get now kernel warnings like:
WARNING: CPU: 0 PID: 2791 at fs/sysfs/dir.c:31 sysfs_warn_dup+0x51/0x80() sysfs: cannot create duplicate filename '/devices/isa/sbawe.0/sound/card0/seq-oss-0-0'
It's because both emux synth and opl3 drivers try to register their OSS device object with the same static index number 0. This hasn't been a big problem until the recent rewrite of device management code (that exposes sysfs at the same time), but it's been an obvious bug.
This patch works around it just by using a different index number of emux synth object. There can be a more elegant way to fix, but it's enough for now, as this code won't be touched so often, in anyway.
--- sound/synth/emux/emux_oss.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/synth/emux/emux_oss.c +2 -1
@@ -69,7 +69,8 @@ snd_emux_init_seq_oss(struct snd_emux *estruct snd_seq_oss_reg *arg;struct snd_seq_device *dev; -if (snd_seq_device_new (emu->card,0 ,SNDRV_SEQ_DEV_ID_OSS , +/* using device#1 here for avoiding conflicts with OPL3 */ +if (snd_seq_device_new (emu->card,1 ,SNDRV_SEQ_DEV_ID_OSS ,sizeof (struct snd_seq_oss_reg ), &dev) <0 )return ;
Greg Kroah-Hartman
maintainerPATCH 64/258 x86/pci/intel_mid_pci: Work around for IRQ0 assignment
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit 39d9b77b8debb4746e189aa5b61ae6e81ec5eab8 upstream.
On Intel Tangier the MMC host controller is wired up to irq 0. But several other devices have irq 0 associated as well due to a bogus PCI configuration.
The first initialized driver will acquire irq 0 and make it unavailable for other devices. If the sdhci driver is not the first one it will fail to acquire the interrupt and therefor be non functional.
Add a quirk to the pci irq enable function which denies irq 0 to anything else than the MMC host controller driver on Tangier platforms.
--- arch/x86/pci/intel_mid_pci.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-)
arch/x86/pci/intel_mid_pci.c +22 -2
@@ -35,6 +35,9 @@#define PCIE_CAP_OFFSET 0x100 +/* Quirks for the listed devices */ +#define PCI_DEVICE_ID_INTEL_MRFL_MMC 0x1190 +/* Fixed BAR fields */ #define PCIE_VNDR_CAP_ID_FIXED_BAR 0x00/* Fixed BAR (TBD) */ #define PCI_FIXED_BAR_0_SIZE 0x04
@@ -214,10 +217,27 @@ static int intel_mid_pci_irq_enable(struif (dev->irq_managed && dev->irq >0 )return 0 ; -if (intel_mid_identify_cpu () ==INTEL_MID_CPU_CHIP_TANGIER ) +switch (intel_mid_identify_cpu ()) { +case INTEL_MID_CPU_CHIP_TANGIER : polarity =0 ;/* active high */ -else + +/* Special treatment for IRQ0 */ +if (dev->irq ==0 ) { +/* +* TNG has IRQ0 assigned to eMMC controller. But there +* are also other devices with bogus PCI configuration +* that have IRQ0 assigned. This check ensures that +* eMMC gets it. +*/ +if (dev->device !=PCI_DEVICE_ID_INTEL_MRFL_MMC ) +return -EBUSY ; + } +break ; +default : polarity =1 ;/* active low */ +break ; + } +ioapic_set_alloc_attr (&info,dev_to_node (&dev->dev),1 , polarity);/*
Greg Kroah-Hartman
maintainerPATCH 66/258 x86/nmi/64: Fix a paravirt stack-clobbering bug in the NMI code
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Lutomirski <[email protected]>
commit 83c133cf11fb0e68a51681447e372489f052d40e upstream.
The NMI entry code that switches to the normal kernel stack needs to be very careful not to clobber any extra stack slots on the NMI stack. The code is fine under the assumption that SWAPGS is just a normal instruction, but that assumption isn't really true. Use SWAPGS_UNSAFE_STACK instead.
This is part of a fix for some random crashes that Sasha saw.
--- arch/x86/entry/entry_64.S | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/x86/entry/entry_64.S +4 -1
@@ -1281,9 +1281,12 @@ ENTRY(nmi) * we don't want to enable interrupts, because then we'll end * up in an awkward situation in which IRQs are on but NMIs * are off. + * + * We also must not push anything to the stack before switching + * stacks lest we corrupt the "NMI executing" variable. */ - SWAPGS + SWAPGS_UNSAFE_STACK cld movq %rsp, %rdx movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
Greg Kroah-Hartman
maintainerPATCH 114/258 staging: ion: fix corruption of ion_import_dma_buf
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shawn Lin <[email protected]>
commit 6fa92e2bcf6390e64895b12761e851c452d87bd8 upstream.
we found this issue but still exit in lastest kernel. Simply keep ion_handle_create under mutex_lock to avoid this race.
WARNING: CPU: 2 PID: 2648 at drivers/staging/android/ion/ion.c:512 ion_handle_add+0xb4/0xc0() ion_handle_add: buffer already found. Modules linked in: iwlmvm iwlwifi mac80211 cfg80211 compat CPU: 2 PID: 2648 Comm: TimedEventQueue Tainted: G W 3.14.0 #7 00000000 00000000 9a3efd2c 80faf273 9a3efd6c 9a3efd5c 80935dc9 811d7fd3 9a3efd88 00000a58 812208a0 00000200 80e128d4 80e128d4 8d4ae00c a8cd8600 a8cd8094 9a3efd74 80935e0e 00000009 9a3efd6c 811d7fd3 9a3efd88 9a3efd9c Call Trace: [<80faf273>] dump_stack+0x48/0x69 [<80935dc9>] warn_slowpath_common+0x79/0x90 [<80e128d4>] ? ion_handle_add+0xb4/0xc0 [<80e128d4>] ? ion_handle_add+0xb4/0xc0 [<80935e0e>] warn_slowpath_fmt+0x2e/0x30 [<80e128d4>] ion_handle_add+0xb4/0xc0 [<80e144cc>] ion_import_dma_buf+0x8c/0x110 [<80c517c4>] reg_init+0x364/0x7d0 [<80993363>] ? futex_wait+0x123/0x210 [<80992e0e>] ? get_futex_key+0x16e/0x1e0 [<8099308f>] ? futex_wake+0x5f/0x120 [<80c51e19>] vpu_service_ioctl+0x1e9/0x500 [<80994aec>] ? do_futex+0xec/0x8e0 [<80971080>] ? prepare_to_wait_event+0xc0/0xc0 [<80c51c30>] ? reg_init+0x7d0/0x7d0 [<80a22562>] do_vfs_ioctl+0x2d2/0x4c0 [<80b198ad>] ? inode_has_perm.isra.41+0x2d/0x40 [<80b199cf>] ? file_has_perm+0x7f/0x90 [<80b1a5f7>] ? selinux_file_ioctl+0x47/0xf0 [<80a227a8>] SyS_ioctl+0x58/0x80 [<80fb45e8>] syscall_call+0x7/0x7 [<80fb0000>] ? mmc_do_calc_max_discard+0xab/0xe4
--- drivers/staging/android/ion/ion.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/staging/android/ion/ion.c +3 -3
@@ -1179,13 +1179,13 @@ struct ion_handle *ion_import_dma_buf(stmutex_unlock (&client->lock); goto end; } -mutex_unlock (&client->lock); handle =ion_handle_create (client, buffer); -if (IS_ERR (handle)) +if (IS_ERR (handle)) { +mutex_unlock (&client->lock); goto end; + } -mutex_lock (&client->lock); ret =ion_handle_add (client, handle);mutex_unlock (&client->lock);if (ret) {
Greg Kroah-Hartman
maintainerPATCH 115/258 USB: option: add ZTE PIDs
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Liu.Zhao" <[email protected]>
commit 19ab6bc5674a30fdb6a2436b068d19a3c17dc73e upstream.
This is intended to add ZTE device PIDs on kernel.
--- drivers/usb/serial/option.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
drivers/usb/serial/option.c +24 -0
@@ -278,6 +278,10 @@ static void option_instat_callback(struc#define ZTE_PRODUCT_MF622 0x0001#define ZTE_PRODUCT_MF628 0x0015#define ZTE_PRODUCT_MF626 0x0031 +#define ZTE_PRODUCT_ZM8620_X 0x0396 +#define ZTE_PRODUCT_ME3620_MBIM 0x0426 +#define ZTE_PRODUCT_ME3620_X 0x1432 +#define ZTE_PRODUCT_ME3620_L 0x1433#define ZTE_PRODUCT_AC2726 0xfff1#define ZTE_PRODUCT_MG880 0xfffd#define ZTE_PRODUCT_CDMA_TECH 0xfffe
@@ -544,6 +548,18 @@ static const struct option_blacklist_inf .sendsetup = BIT(1) | BIT(2) | BIT(3), }; +static const struct option_blacklist_info zte_me3620_mbim_blacklist = { + .reserved =BIT (2 ) |BIT (3 ) |BIT (4 ), +}; + +static const struct option_blacklist_info zte_me3620_xl_blacklist = { + .reserved =BIT (3 ) |BIT (4 ) |BIT (5 ), +}; + +static const struct option_blacklist_info zte_zm8620_x_blacklist = { + .reserved =BIT (3 ) |BIT (4 ) |BIT (5 ), +}; +static const struct option_blacklist_info huawei_cdc12_blacklist = { .reserved =BIT (1 ) |BIT (2 ), };
@@ -1591,6 +1607,14 @@ static const struct usb_device_id option .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist }, + { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_ME3620_L), + .driver_info = (kernel_ulong_t)&zte_me3620_xl_blacklist }, + { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_ME3620_MBIM), + .driver_info = (kernel_ulong_t)&zte_me3620_mbim_blacklist }, + { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_ME3620_X), + .driver_info = (kernel_ulong_t)&zte_me3620_xl_blacklist }, + { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_ZM8620_X), + .driver_info = (kernel_ulong_t)&zte_zm8620_x_blacklist }, { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) },
Greg Kroah-Hartman
maintainerPATCH 117/258 md/raid0: apply base queue limits *before* disk_stack_limits
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit 66eefe5de11db1e0d8f2edc3880d50e7c36a9d43 upstream.
Calling e.g. blk_queue_max_hw_sectors() after calls to disk_stack_limits() discards the settings determined by disk_stack_limits().
So we need to make those calls first.
--- drivers/md/raid0.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/md/raid0.c +6 -6
@@ -431,12 +431,6 @@ static int raid0_run(struct mddev *mddevstruct md_rdev *rdev;bool discard_supported = false; -rdev_for_each (rdev, mddev) { -disk_stack_limits (mddev->gendisk, rdev->bdev, - rdev->data_offset <<9 ); -if (blk_queue_discard (bdev_get_queue (rdev->bdev))) - discard_supported = true; - }blk_queue_max_hw_sectors (mddev->queue, mddev->chunk_sectors);blk_queue_max_write_same_sectors (mddev->queue, mddev->chunk_sectors);blk_queue_max_discard_sectors (mddev->queue, mddev->chunk_sectors);
@@ -445,6 +439,12 @@ static int raid0_run(struct mddev *mddevblk_queue_io_opt (mddev->queue, (mddev->chunk_sectors <<9 ) * mddev->raid_disks); +rdev_for_each (rdev, mddev) { +disk_stack_limits (mddev->gendisk, rdev->bdev, + rdev->data_offset <<9 ); +if (blk_queue_discard (bdev_get_queue (rdev->bdev))) + discard_supported = true; + }if (!discard_supported)queue_flag_clear_unlocked (QUEUE_FLAG_DISCARD , mddev->queue);else
Greg Kroah-Hartman
maintainerPATCH 118/258 dm raid: fix round up of default region size
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 042745ee53a0a7c1f5aff191a4a24213c6dcfb52 upstream.
Commit 3a0f9aaee028 ("dm raid: round region_size to power of two") intended to make sure that the default region size is a power of two. However, the logic in that commit is incorrect and sets the variable region_size to 0 or 1, depending on whether min_region_size is a power of two.
Fix this logic, using roundup_pow_of_two(), so that region_size is properly rounded up to the next power of two.
--- drivers/md/dm-raid.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/md/dm-raid.c +1 -2
@@ -329,8 +329,7 @@ static int validate_region_size(struct r*/ if (min_region_size > (1 <<13 )) {/* If not a power of 2, make it the next power of 2 */ -if (min_region_size & (min_region_size -1 )) - region_size =1 <<fls (region_size); + region_size =roundup_pow_of_two (min_region_size);DMINFO ("Choosing default region size of %lu sectors" , region_size); }else {
Greg Kroah-Hartman
maintainerPATCH 119/258 netfilter: bridge: fix IPv6 packets not being bridged with CONFIG_IPV6=n
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bernhard Thaler <[email protected]>
commit 18e1db67e93ed75d9dc0d34c8d783ccf10547c2b upstream.
230ac490f7fba introduced a dependency to CONFIG_IPV6 which breaks bridging of IPv6 packets on a bridge with CONFIG_IPV6=n.
Sysctl entry /proc/sys/net/bridge/bridge-nf-call-ip6tables defaults to 1, for this reason packets are handled by br_nf_pre_routing_ipv6(). When compiled with CONFIG_IPV6=n this function returns NF_DROP but should return NF_ACCEPT to let packets through.
Change CONFIG_IPV6=n br_nf_pre_routing_ipv6() return value to NF_ACCEPT.
Tested with a simple bridge with two interfaces and IPv6 packets trying to pass from host on left side to host on right side of the bridge.
--- include/net/netfilter/br_netfilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/netfilter/br_netfilter.h +1 -1
@@ -59,7 +59,7 @@ static inline unsigned int br_nf_pre_routing_ipv6(const struct nf_hook_ops *ops, struct sk_buff *skb, const struct nf_hook_state *state) { - return NF_DROP; + return NF_ACCEPT; }#endif
Greg Kroah-Hartman
maintainerPATCH 120/258 netfilter: nfnetlink: work around wrong endianess in res_id field
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
commit a9de9777d613500b089a7416f936bf3ae5f070d2 upstream.
The convention in nfnetlink is to use network byte order in every header field as well as in the attribute payload. The initial version of the batching infrastructure assumes that res_id comes in host byte order though.
The only client of the batching infrastructure is nf_tables, so let's add a workaround to address this inconsistency. We currently have 11 nfnetlink subsystems according to NFNL_SUBSYS_COUNT, so we can assume that the subsystem 2560, ie. htons(10), will not be allocated anytime soon, so it can be an alias of nf_tables from the nfnetlink batching path when interpreting the res_id field.
Based on original patch from Florian Westphal.
--- net/netfilter/nfnetlink.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/netfilter/nfnetlink.c +7 -1
@@ -444,6 +444,7 @@ done:static void nfnetlink_rcv (struct sk_buff *skb) {struct nlmsghdr *nlh =nlmsg_hdr (skb); +u_int16_t res_id;int msglen; if (nlh->nlmsg_len < NLMSG_HDRLEN ||
@@ -468,7 +469,12 @@ static void nfnetlink_rcv(struct sk_buff nfgenmsg =nlmsg_data (nlh);skb_pull (skb, msglen); -nfnetlink_rcv_batch (skb, nlh, nfgenmsg->res_id); +/* Work around old nft using host byte order */ +if (nfgenmsg->res_id ==NFNL_SUBSYS_NFTABLES ) + res_id =NFNL_SUBSYS_NFTABLES ; +else + res_id =ntohs (nfgenmsg->res_id); +nfnetlink_rcv_batch (skb, nlh, res_id); }else {netlink_rcv_skb (skb, &nfnetlink_rcv_msg); }
Greg Kroah-Hartman
maintainerPATCH 121/258 netfilter: nf_tables: Use 32 bit addressing register from nft_type_to_reg()
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
commit bf798657eb5ba57552096843c315f096fdf9b715 upstream.
nft_type_to_reg() needs to return the register in the new 32 bit addressing, otherwise we hit EINVAL when using mappings.
--- include/net/netfilter/nf_tables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/netfilter/nf_tables.h +1 -1
@@ -125,7 +125,7 @@ static inline enum nft_data_types nft_drstatic inline enum nft_registers nft_type_to_reg (enum nft_data_types type) { -return type ==NFT_DATA_VERDICT ?NFT_REG_VERDICT :NFT_REG_1 ; +return type ==NFT_DATA_VERDICT ?NFT_REG_VERDICT :NFT_REG_1 *NFT_REG_SIZE /NFT_REG32_SIZE ; }unsigned int nft_parse_register (const struct nlattr *attr);
Greg Kroah-Hartman
maintainerPATCH 122/258 netfilter: ipset: Out of bound access in hash:net* types fixed
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jozsef Kadlecsik <[email protected]>
commit 6fe7ccfd77415a6ba250c10c580eb3f9acf79753 upstream.
Dave Jones reported that KASan detected out of bounds access in hash:net* types:
[ 23.139532] ================================================================== [ 23.146130] BUG: KASan: out of bounds access in hash_net4_add_cidr+0x1db/0x220 at addr ffff8800d4844b58 [ 23.152937] Write of size 4 by task ipset/457 [ 23.159742] ============================================================================= [ 23.166672] BUG kmalloc-512 (Not tainted): kasan: bad access detected [ 23.173641] ----------------------------------------------------------------------------- [ 23.194668] INFO: Allocated in hash_net_create+0x16a/0x470 age=7 cpu=1 pid=456 [ 23.201836] __slab_alloc.constprop.66+0x554/0x620 [ 23.208994] __kmalloc+0x2f2/0x360 [ 23.216105] hash_net_create+0x16a/0x470 [ 23.223238] ip_set_create+0x3e6/0x740 [ 23.230343] nfnetlink_rcv_msg+0x599/0x640 [ 23.237454] netlink_rcv_skb+0x14f/0x190 [ 23.244533] nfnetlink_rcv+0x3f6/0x790 [ 23.251579] netlink_unicast+0x272/0x390 [ 23.258573] netlink_sendmsg+0x5a1/0xa50 [ 23.265485] SYSC_sendto+0x1da/0x2c0 [ 23.272364] SyS_sendto+0xe/0x10 [ 23.279168] entry_SYSCALL_64_fastpath+0x12/0x6f
The bug is fixed in the patch and the testsuite is extended in ipset to check cidr handling more thoroughly.
--- net/netfilter/ipset/ip_set_hash_gen.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
net/netfilter/ipset/ip_set_hash_gen.h +8 -4
@@ -152,9 +152,13 @@ htable_bits(u32 hashsize)#define SET_HOST_MASK (family) (family == AF_INET ? 32 : 128)#ifdef IP_SET_HASH_WITH_NET0 +/* cidr from 0 to SET_HOST_MASK() value and c = cidr + 1 */ #define NLEN (family) (SET_HOST_MASK(family) + 1) +#define CIDR_POS (c) ((c) - 1)#else +/* cidr from 1 to SET_HOST_MASK() value and c = cidr + 1 */ #define NLEN (family) SET_HOST_MASK(family) +#define CIDR_POS (c) ((c) - 2)#endif #else
@@ -305,7 +309,7 @@ mtype_add_cidr(struct htype *h, u8 cidr, }else if (h->nets[i].cidr[n] < cidr) { j = i; }else if (h->nets[i].cidr[n] == cidr) { - h->nets[cidr -1 ].nets[n]++; + h->nets[CIDR_POS (cidr)].nets[n]++;return ; } }
@@ -314,7 +318,7 @@ mtype_add_cidr(struct htype *h, u8 cidr, h->nets[i].cidr[n] = h->nets[i -1 ].cidr[n]; } h->nets[i].cidr[n] = cidr; - h->nets[cidr -1 ].nets[n] =1 ; + h->nets[CIDR_POS (cidr)].nets[n] =1 ; } static void
@@ -325,8 +329,8 @@ mtype_del_cidr(struct htype *h, u8 cidr,for (i =0 ; i < nets_length; i++) {if (h->nets[i].cidr[n] != cidr)continue ; - h->nets[cidr -1 ].nets[n]--; -if (h->nets[cidr -1 ].nets[n] >0 ) + h->nets[CIDR_POS (cidr)].nets[n]--; +if (h->nets[CIDR_POS (cidr)].nets[n] >0 )return ;for (j = i; j < net_end && h->nets[j].cidr[n]; j++) h->nets[j].cidr[n] = h->nets[j +1 ].cidr[n];
Greg Kroah-Hartman
maintainerPATCH 124/258 netfilter: conntrack: use nf_ct_tmpl_free in CT/synproxy error paths
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
commit 9cf94eab8b309e8bcc78b41dd1561c75b537dd0b upstream.
Commit 0838aa7fcfcd ("netfilter: fix netns dependencies with conntrack templates") migrated templates to the new allocator api, but forgot to update error paths for them in CT and synproxy to use nf_ct_tmpl_free() instead of nf_conntrack_free().
Due to that, memory is being freed into the wrong kmemcache, but also we drop the per net reference count of ct objects causing an imbalance.
In Brad's case, this leads to a wrap-around of net->ct.count and thus lets __nf_conntrack_alloc() refuse to create a new ct object:
[ 10.340913] xt_addrtype: ipv6 does not support BROADCAST matching [ 10.810168] nf_conntrack: table full, dropping packet [ 11.917416] r8169 0000:07:00.0 eth0: link up [ 11.917438] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready [ 12.815902] nf_conntrack: table full, dropping packet [ 15.688561] nf_conntrack: table full, dropping packet [ 15.689365] nf_conntrack: table full, dropping packet [ 15.690169] nf_conntrack: table full, dropping packet [ 15.690967] nf_conntrack: table full, dropping packet [...]
With slab debugging, it also reports the wrong kmemcache (kmalloc-512 vs. nf_conntrack_ffffffff81ce75c0) and reports poison overwrites, etc. Thus, to fix the problem, export and use nf_ct_tmpl_free() instead.
--- include/net/netfilter/nf_conntrack.h | 1 + net/netfilter/nf_conntrack_core.c | 3 ++- net/netfilter/nf_synproxy_core.c | 2 +- net/netfilter/xt_CT.c | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-)
include/net/netfilter/nf_conntrack.h +1 -0
@@ -292,6 +292,7 @@ extern unsigned int nf_conntrack_hash_rnvoid init_nf_conntrack_hash_rnd (void );struct nf_conn *nf_ct_tmpl_alloc (struct net *net,u16 zone,gfp_t flags); +void nf_ct_tmpl_free (struct nf_conn *tmpl);#define NF_CT_STAT_INC (net, count) __this_cpu_inc((net)->ct.stat->count)#define NF_CT_STAT_INC_ATOMIC (net, count) this_cpu_inc((net)->ct.stat->count)
net/netfilter/nf_conntrack_core.c +2 -1
@@ -320,12 +320,13 @@ out_free: }EXPORT_SYMBOL_GPL (nf_ct_tmpl_alloc); -static void nf_ct_tmpl_free (struct nf_conn *tmpl) +void nf_ct_tmpl_free (struct nf_conn *tmpl) {nf_ct_ext_destroy (tmpl);nf_ct_ext_free (tmpl);kfree (tmpl); } +EXPORT_SYMBOL_GPL (nf_ct_tmpl_free);static void destroy_conntrack (struct nf_conntrack *nfct)
net/netfilter/nf_synproxy_core.c +1 -1
@@ -378,7 +378,7 @@ static int __net_init synproxy_net_init( err3:free_percpu (snet->stats); err2: -nf_conntrack_free (ct); +nf_ct_tmpl_free (ct); err1:return err; }
net/netfilter/xt_CT.c +1 -1
@@ -233,7 +233,7 @@ out:return 0 ; err3: -nf_conntrack_free (ct); +nf_ct_tmpl_free (ct); err2:nf_ct_l3proto_module_put (par->family); err1:
Greg Kroah-Hartman
maintainerPATCH 125/258 netfilter: nf_log: wait for rcu grace after logger unregistration
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
commit ad5001cc7cdf9aaee5eb213fdee657e4a3c94776 upstream.
The nf_log_unregister() function needs to call synchronize_rcu() to make sure that the objects are not dereferenced anymore on module removal.
--- net/netfilter/nf_log.c | 1 + 1 file changed, 1 insertion(+)
net/netfilter/nf_log.c +1 -0
@@ -113,6 +113,7 @@ void nf_log_unregister(struct nf_loggerfor (i =0 ; i <NFPROTO_NUMPROTO ; i++)RCU_INIT_POINTER (loggers[i][logger->type],NULL );mutex_unlock (&nf_log_mutex); +synchronize_rcu (); }EXPORT_SYMBOL (nf_log_unregister);
Greg Kroah-Hartman
maintainerPATCH 126/258 netfilter: nft_compat: skip family comparison in case of NFPROTO_UNSPEC
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
commit ba378ca9c04a5fc1b2cf0f0274a9d02eb3d1bad9 upstream.
Fix lookup of existing match/target structures in the corresponding list by skipping the family check if NFPROTO_UNSPEC is used.
This is resulting in the allocation and insertion of one match/target structure for each use of them. So this not only bloats memory consumption but also severely affects the time to reload the ruleset from the iptables-compat utility.
After this patch, iptables-compat-restore and iptables-compat take almost the same time to reload large rulesets.
--- net/netfilter/nft_compat.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-)
net/netfilter/nft_compat.c +18 -6
@@ -619,6 +619,13 @@ struct nft_xt {static struct nft_expr_type nft_match_type; +static bool nft_match_cmp (const struct xt_match *match, +const char *name,u32 rev,u32 family) +{ +return strcmp (match->name, name) ==0 && match->revision == rev && + (match->family ==NFPROTO_UNSPEC || match->family == family); +} +static const struct nft_expr_ops *nft_match_select_ops (const struct nft_ctx *ctx,const struct nlattr *const tb[])
@@ -626,7 +633,7 @@ nft_match_select_ops(const struct nft_ctstruct nft_xt *nft_match;struct xt_match *match;char *mt_name; -__u32 rev, family; +u32 rev, family; if (tb[NFTA_MATCH_NAME] == NULL || tb[NFTA_MATCH_REV] == NULL ||
@@ -641,8 +648,7 @@ nft_match_select_ops(const struct nft_ctlist_for_each_entry (nft_match, &nft_match_list, head) {struct xt_match *match = nft_match->ops.data; -if (strcmp (match->name, mt_name) ==0 && - match->revision == rev && match->family == family) { +if (nft_match_cmp (match, mt_name, rev, family)) {if (!try_module_get (match->me))return ERR_PTR (-ENOENT );
@@ -693,6 +699,13 @@ static LIST_HEAD(nft_target_list);static struct nft_expr_type nft_target_type; +static bool nft_target_cmp (const struct xt_target *tg, +const char *name,u32 rev,u32 family) +{ +return strcmp (tg->name, name) ==0 && tg->revision == rev && + (tg->family ==NFPROTO_UNSPEC || tg->family == family); +} +static const struct nft_expr_ops *nft_target_select_ops (const struct nft_ctx *ctx,const struct nlattr *const tb[])
@@ -700,7 +713,7 @@ nft_target_select_ops(const struct nft_cstruct nft_xt *nft_target;struct xt_target *target;char *tg_name; -__u32 rev, family; +u32 rev, family; if (tb[NFTA_TARGET_NAME] == NULL || tb[NFTA_TARGET_REV] == NULL ||
@@ -715,8 +728,7 @@ nft_target_select_ops(const struct nft_clist_for_each_entry (nft_target, &nft_target_list, head) {struct xt_target *target = nft_target->ops.data; -if (strcmp (target->name, tg_name) ==0 && - target->revision == rev && target->family == family) { +if (nft_target_cmp (target, tg_name, rev, family)) {if (!try_module_get (target->me))return ERR_PTR (-ENOENT );
Greg Kroah-Hartman
maintainerPATCH 129/258 regulator: axp20x: Fix enable bit indexes for DCDC4 and DCDC5
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
commit 6b3600b4ba0810c84437cf76556d9afbd55c1bfc upstream.
The enable bit indexes for DCDC4 and DCDC5 regulators are off by 1.
We haven't run into any problems with this since either the regulators aren't defined in the DT and aren't used, or all the DCDC regulators have the "always-on" property set, as they are almost always used for system critical loads.
--- drivers/regulator/axp20x-regulator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/regulator/axp20x-regulator.c +2 -2
@@ -192,9 +192,9 @@ static const struct regulator_desc axp22AXP_DESC (AXP22X ,DCDC3 ,"dcdc3" ,"vin3" ,600 ,1860 ,20 ,AXP22X_DCDC3_V_OUT ,0x3f ,AXP22X_PWR_OUT_CTRL1 ,BIT (3 )),AXP_DESC (AXP22X ,DCDC4 ,"dcdc4" ,"vin4" ,600 ,1540 ,20 , -AXP22X_DCDC4_V_OUT ,0x3f ,AXP22X_PWR_OUT_CTRL1 ,BIT (3 )), +AXP22X_DCDC4_V_OUT ,0x3f ,AXP22X_PWR_OUT_CTRL1 ,BIT (4 )),AXP_DESC (AXP22X ,DCDC5 ,"dcdc5" ,"vin5" ,1000 ,2550 ,50 , -AXP22X_DCDC5_V_OUT ,0x1f ,AXP22X_PWR_OUT_CTRL1 ,BIT (4 )), +AXP22X_DCDC5_V_OUT ,0x1f ,AXP22X_PWR_OUT_CTRL1 ,BIT (5 )),/* secondary switchable output of DCDC1 */ AXP_DESC_SW (AXP22X ,DC1SW ,"dc1sw" ,"dcdc1" ,1600 ,3400 ,100 , AXP22X_DCDC1_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(7)),
Greg Kroah-Hartman
maintainerPATCH 130/258 regulator: core: Handle probe deferral from DT when resolving supplies
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Brown <[email protected]>
commit 06423121d9eba0a56b9341cf82b88479017bce14 upstream.
When resolving regulator-regulator supplies we ignore probe deferral returns from regulator_dev_lookup() (such as are generated for DT when we can see a supply is registered) and just fall back to the dummy regulator if there are full constraints (as is the case for DT). This means that probe deferral is broken for DT systems, fix that by paying attention to -EPROBE_DEFER return codes like we do -ENODEV.
A further patch will simplify this further, this is a minimal fix for the specific issue.
--- drivers/regulator/core.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/regulator/core.c +4 -0
@@ -1385,6 +1385,10 @@ static int regulator_resolve_supply(strureturn 0 ; } +/* Did the lookup explicitly defer for us? */ +if (ret == -EPROBE_DEFER ) +return ret; +if (have_full_constraints ()) { r = dummy_regulator_rdev; }else {
Greg Kroah-Hartman
maintainerPATCH 101/258 ASoC: sgtl5000: fix wrong register MIC_BIAS_VOLTAGE setup on probe
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gianluca Renzi <[email protected]>
commit e256da84a04ea31c3c215997c847609af224e8f4 upstream.
--- sound/soc/codecs/sgtl5000.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/codecs/sgtl5000.c +2 -2
@@ -1377,8 +1377,8 @@ static int sgtl5000_probe(struct snd_soc sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT);snd_soc_update_bits (codec,SGTL5000_CHIP_MIC_CTRL , -SGTL5000_BIAS_R_MASK , - sgtl5000->micbias_voltage <<SGTL5000_BIAS_R_SHIFT ); +SGTL5000_BIAS_VOLT_MASK , + sgtl5000->micbias_voltage <<SGTL5000_BIAS_VOLT_SHIFT );/* * disable DAP * TODO:
Greg Kroah-Hartman
maintainerPATCH 132/258 nfs: fix v4.2 SEEK on files over 2 gigs
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: "J. Bruce Fields" <[email protected]>
commit 306a5549355966e480e0dcacdc6b9321d153e0c0 upstream.
We're incorrectly assigning a loff_t return to an int. If SEEK_HOLE or SEEK_DATA returns an offset over 2^31 then the application will see a weird lseek() result (usually -EIO).
--- fs/nfs/nfs42proc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/nfs/nfs42proc.c +3 -1
@@ -175,10 +175,12 @@ loff_t nfs42_proc_llseek(struct file *fi {struct nfs_server *server =NFS_SERVER (file_inode (filep));struct nfs4_exception exception = { }; -int err; +loff_t err; do { err = _nfs42_proc_llseek(filep, offset, whence); + if (err >= 0) + break; if (err == -ENOTSUPP) return -EOPNOTSUPP; err = nfs4_handle_exception(server, err, &exception);
Greg Kroah-Hartman
maintainerPATCH 133/258 NFS: Do cleanup before resetting pageio read/write to mds
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kinglong Mee <[email protected]>
commit 6f29b9bba7b08c6b1d6f2cc4cf750b342fc1946c upstream.
There is a reference leak of layout segment after resetting pageio read/write to mds.
--- fs/nfs/read.c | 3 +++ fs/nfs/write.c | 3 +++ 2 files changed, 6 insertions(+)
fs/nfs/read.c +3 -0
@@ -72,6 +72,9 @@ void nfs_pageio_reset_read_mds(struct nf {struct nfs_pgio_mirror *mirror; +if (pgio->pg_ops && pgio->pg_ops->pg_cleanup) + pgio->pg_ops->pg_cleanup (pgio); + pgio->pg_ops = &nfs_pgio_rw_ops;/* read path should never have more than one mirror */
fs/nfs/write.c +3 -0
@@ -1351,6 +1351,9 @@ void nfs_pageio_reset_write_mds(struct n {struct nfs_pgio_mirror *mirror; +if (pgio->pg_ops && pgio->pg_ops->pg_cleanup) + pgio->pg_ops->pg_cleanup (pgio); + pgio->pg_ops = &nfs_pgio_rw_ops;nfs_pageio_stop_mirroring (pgio);
Greg Kroah-Hartman
maintainerPATCH 102/258 ASoC: tas2552: fix dBscale-min declaration
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Dannenberg <[email protected]>
commit e2600460bc3aa14ca1df86318a327cbbabedf9a8 upstream.
The minimum volume level for the TAS2552 (control register value 0x00) is -7dB however the driver declares it as -0.07dB.
Running amixer before the patch reports:
dBscale-min=-0.07dB,step=1.00dB,mute=0
Running amixer with the patch applied reports:
dBscale-min=-7.00dB,step=1.00dB,mute=0
--- sound/soc/codecs/tas2552.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/codecs/tas2552.c +1 -1
@@ -551,7 +551,7 @@ static struct snd_soc_dai_driver tas2552/* * DAC digital volumes. From -7 to 24 dB in 1 dB steps */ -static DECLARE_TLV_DB_SCALE(dac_tlv, -7, 100, 0); +static DECLARE_TLV_DB_SCALE(dac_tlv, -700, 100, 0);static const char *const tas2552_din_source_select[] = {"Muted" ,
Greg Kroah-Hartman
maintainerPATCH 103/258 btrfs: skip waiting on ordered range for special files
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Mahoney <[email protected]>
commit a30e577c96f59b1e1678ea5462432b09bf7d5cbc upstream.
In btrfs_evict_inode, we properly truncate the page cache for evicted inodes but then we call btrfs_wait_ordered_range for every inode as well. It's the right thing to do for regular files but results in incorrect behavior for device inodes for block devices.
filemap_fdatawrite_range gets called with inode->i_mapping which gets resolved to the block device inode before getting passed to wbc_attach_fdatawrite_inode and ultimately to inode_to_bdi. What happens next depends on whether there's an open file handle associated with the inode. If there is, we write to the block device, which is unexpected behavior. If there isn't, we through normally and inode->i_data is used. We can also end up racing against open/close which can result in crashes when i_mapping points to a block device inode that has been closed.
Since there can't be any page cache associated with special file inodes, it's safe to skip the btrfs_wait_ordered_range call entirely and avoid the problem.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=100911
--- fs/btrfs/inode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/btrfs/inode.c +2 -1
@@ -5051,7 +5051,8 @@ void btrfs_evict_inode(struct inode *ino goto no_delete; }/* do we really want it for ->i_nlink > 0 and zero btrfs_root_refs? */ -btrfs_wait_ordered_range (inode,0 , (u64)-1 ); +if (!special_file (inode->i_mode)) +btrfs_wait_ordered_range (inode,0 , (u64)-1 );btrfs_free_io_failure_record (inode,0 , (u64)-1 );
Greg Kroah-Hartman
maintainerPATCH 104/258 Btrfs: fix read corruption of compressed and shared extents
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit 005efedf2c7d0a270ffbe28d8997b03844f3e3e7 upstream.
If a file has a range pointing to a compressed extent, followed by another range that points to the same compressed extent and a read operation attempts to read both ranges (either completely or part of them), the pages that correspond to the second range are incorrectly filled with zeroes.
Consider the following example:
File layout
[0 - 8K] [8K - 24K]
| |
| |
points to extent X, points to extent X,
offset 4K, length of 8K offset 0, length 16K[extent X, compressed length = 4K uncompressed length = 16K]
If a readpages() call spans the 2 ranges, a single bio to read the extent is submitted - extent_io.c:submit_extent_page() would only create a new bio to cover the second range pointing to the extent if the extent it points to had a different logical address than the extent associated with the first range. This has a consequence of the compressed read end io handler (compression.c:end_compressed_bio_read()) finish once the extent is decompressed into the pages covering the first range, leaving the remaining pages (belonging to the second range) filled with zeroes (done by compression.c:btrfs_clear_biovec_end()).
So fix this by submitting the current bio whenever we find a range pointing to a compressed extent that was preceded by a range with a different extent map. This is the simplest solution for this corner case. Making the end io callback populate both ranges (or more, if we have multiple pointing to the same extent) is a much more complex solution since each bio is tightly coupled with a single extent map and the extent maps associated to the ranges pointing to the shared extent can have different offsets and lengths.
The following test case for fstests triggers the issue:
seq=basename $0
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
rm -f $tmp.*
}# get standard environment, filters and checks . ./common/rc . ./common/filter
# real QA test starts here _need_to_be_root _supported_fs btrfs _supported_os Linux _require_scratch _require_cloner
rm -f $seqres.full
test_clone_and_read_compressed_extent()
{
local mount_opts=$1 _scratch_mkfs >>$seqres.full 2>&1
_scratch_mount $mount_opts
# Create a test file with a single extent that is compressed (the # data we write into it is highly compressible no matter which # compression algorithm is used, zlib or lzo).
$XFS_IO_PROG -f -c "pwrite -S 0xaa 0K 4K" \
-c "pwrite -S 0xbb 4K 8K" \
-c "pwrite -S 0xcc 12K 4K" \
$SCRATCH_MNT/foo | _filter_xfs_io
# Now clone our extent into an adjacent offset. $CLONER_PROG -s $((4 * 1024)) -d $((16 * 1024)) -l $((8 * 1024)) \
$SCRATCH_MNT/foo $SCRATCH_MNT/foo
# Same as before but for this file we clone the extent into a lower # file offset.
$XFS_IO_PROG -f -c "pwrite -S 0xaa 8K 4K" \
-c "pwrite -S 0xbb 12K 8K" \
-c "pwrite -S 0xcc 20K 4K" \
$SCRATCH_MNT/bar | _filter_xfs_io
$CLONER_PROG -s $((12 * 1024)) -d 0 -l $((8 * 1024)) \
$SCRATCH_MNT/bar $SCRATCH_MNT/bar
echo "File digests before unmounting filesystem:" md5sum $SCRATCH_MNT/foo | _filter_scratch md5sum $SCRATCH_MNT/bar | _filter_scratch
# Evicting the inode or clearing the page cache before reading # again the file would also trigger the bug - reads were returning # all bytes in the range corresponding to the second reference to # the extent with a value of 0, but the correct data was persisted # (it was a bug exclusively in the read path). The issue happened # only if the same readpages() call targeted pages belonging to the # first and second ranges that point to the same compressed extent. _scratch_remount
echo "File digests after mounting filesystem again:" # Must match the same digests we got before. md5sum $SCRATCH_MNT/foo | _filter_scratch md5sum $SCRATCH_MNT/bar | _filter_scratch
}
echo -e "\nTesting with zlib compression..." test_clone_and_read_compressed_extent "-o compress=zlib"
_scratch_unmount
echo -e "\nTesting with lzo compression..." test_clone_and_read_compressed_extent "-o compress=lzo"
status=0
exit
--- fs/btrfs/extent_io.c | 65 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 8 deletions(-)
fs/btrfs/extent_io.c +57 -8
@@ -2798,7 +2798,8 @@ static int submit_extent_page(int rw, stbio_end_io_t end_io_func, int mirror_num, unsigned long prev_bio_flags, - unsigned long bio_flags) + unsigned long bio_flags, + bool force_bio_submit) { int ret = 0;struct bio *bio;
@@ -2816,6 +2817,7 @@ static int submit_extent_page(int rw, st contig =bio_end_sector (bio) == sector;if (prev_bio_flags != bio_flags || !contig || + force_bio_submit ||merge_bio (rw, tree, page, offset, page_size, bio, bio_flags) ||bio_add_page (bio, page, page_size, offset) < page_size) { ret = submit_one_bio(rw, bio, mirror_num,
@@ -2909,7 +2911,8 @@ static int __do_readpage(struct extent_iget_extent_t *get_extent, struct extent_map **em_cached, struct bio **bio, int mirror_num, - unsigned long *bio_flags, int rw) + unsigned long *bio_flags, int rw, + u64 *prev_em_start) { struct inode *inode = page->mapping->host;u64 start =page_offset (page);
@@ -2957,6 +2960,7 @@ static int __do_readpage(struct extent_i }while (cur <= end) {unsigned long pnr = (last_byte >>PAGE_CACHE_SHIFT ) +1 ; +bool force_bio_submit = false;if (cur >= last_byte) {char *userpage;
@@ -3007,6 +3011,49 @@ static int __do_readpage(struct extent_i block_start = em->block_start;if (test_bit (EXTENT_FLAG_PREALLOC , &em->flags)) block_start =EXTENT_MAP_HOLE ; + +/* +* If we have a file range that points to a compressed extent +* and it's followed by a consecutive file range that points to +* to the same compressed extent (possibly with a different +* offset and/or length, so it either points to the whole extent +* or only part of it), we must make sure we do not submit a +* single bio to populate the pages for the 2 ranges because +* this makes the compressed extent read zero out the pages +* belonging to the 2nd range. Imagine the following scenario: +* +* File layout +* [0 - 8K] [8K - 24K] +* | | +* | | +* points to extent X, points to extent X, +* offset 4K, length of 8K offset 0, length 16K +* +* [extent X, compressed length = 4K uncompressed length = 16K] +* +* If the bio to read the compressed extent covers both ranges, +* it will decompress extent X into the pages belonging to the +* first range and then it will stop, zeroing out the remaining +* pages that belong to the other range that points to extent X. +* So here we make sure we submit 2 bios, one for the first +* range and another one for the third range. Both will target +* the same physical extent from disk, but we can't currently +* make the compressed bio endio callback populate the pages +* for both ranges because each compressed bio is tightly +* coupled with a single extent map, and each range can have +* an extent map with a different offset value relative to the +* uncompressed data of our extent and different lengths. This +* is a corner case so we prioritize correctness over +* non-optimal behavior (submitting 2 bios for the same extent). +*/ +if (test_bit (EXTENT_FLAG_COMPRESSED , &em->flags) && + prev_em_start && *prev_em_start != (u64)-1 && + *prev_em_start != em->orig_start) + force_bio_submit = true; + +if (prev_em_start) + *prev_em_start = em->orig_start; +free_extent_map (em); em =NULL ;
@@ -3056,7 +3103,8 @@ static int __do_readpage(struct extent_i bdev, bio, pnr, end_bio_extent_readpage, mirror_num, *bio_flags, - this_bio_flag); + this_bio_flag, + force_bio_submit);if (!ret) { nr++; *bio_flags = this_bio_flag;
@@ -3088,6 +3136,7 @@ static inline void __do_contiguous_readpstruct inode *inode;struct btrfs_ordered_extent *ordered;int index; +u64 prev_em_start = (u64)-1 ; inode = pages[0 ]->mapping->host;while (1 ) {
@@ -3103,7 +3152,7 @@ static inline void __do_contiguous_readpfor (index =0 ; index < nr_pages; index++) {__do_readpage (tree, pages[index], get_extent, em_cached, bio, - mirror_num, bio_flags, rw); + mirror_num, bio_flags, rw, &prev_em_start);page_cache_release (pages[index]); } }
@@ -3171,7 +3220,7 @@ static int __extent_read_full_page(struc } ret =__do_readpage (tree, page, get_extent,NULL , bio, mirror_num, - bio_flags, rw); + bio_flags, rw,NULL );return ret; }
@@ -3197,7 +3246,7 @@ int extent_read_full_page_nolock(structint ret; ret =__do_readpage (tree, page, get_extent,NULL , &bio, mirror_num, - &bio_flags,READ ); + &bio_flags,READ ,NULL );if (bio) ret =submit_one_bio (READ , bio, mirror_num, bio_flags);return ret;
@@ -3450,7 +3499,7 @@ static noinline_for_stack int __extent_w sector, iosize, pg_offset, bdev, &epd->bio, max_nr, end_bio_extent_writepage, - 0, 0, 0); + 0, 0, 0, false);if (ret)SetPageError (page); }
@@ -3752,7 +3801,7 @@ static noinline_for_stack int write_one_ ret =submit_extent_page (rw, tree, p, offset >>9 ,PAGE_CACHE_SIZE ,0 , bdev, &epd->bio,-1 , end_bio_extent_buffer_writepage, -0 , epd->bio_flags, bio_flags); +0 , epd->bio_flags, bio_flags, false); epd->bio_flags = bio_flags;if (ret) {set_btree_ioerr (p);
Greg Kroah-Hartman
maintainerPATCH 97/258 ASoC: pxa: pxa2xx-ac97: fix dma requestor lines
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Jarzmik <[email protected]>
commit 8811191fdf7ed02ee07cb8469428158572d355a2 upstream.
PCM receive and transmit DMA requestor lines were reverted, breaking the PCM playback interface for PXA platforms using the sound/soc/ variant instead of the sound/arm variant.
The commit below shows the inversion in the requestor lines.
--- sound/soc/pxa/pxa2xx-ac97.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/pxa/pxa2xx-ac97.c +2 -2
@@ -49,7 +49,7 @@ static struct snd_ac97_bus_ops pxa2xx_ac .reset = pxa2xx_ac97_cold_reset, }; -static unsigned long pxa2xx_ac97_pcm_stereo_in_req =12 ; +static unsigned long pxa2xx_ac97_pcm_stereo_in_req =11 ;static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_stereo_in = { .addr =__PREG (PCDR ), .addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ,
@@ -57,7 +57,7 @@ static struct snd_dmaengine_dai_dma_data .filter_data = &pxa2xx_ac97_pcm_stereo_in_req, }; -static unsigned long pxa2xx_ac97_pcm_stereo_out_req =11 ; +static unsigned long pxa2xx_ac97_pcm_stereo_out_req =12 ;static struct snd_dmaengine_dai_dma_data pxa2xx_ac97_pcm_stereo_out = { .addr =__PREG (PCDR ), .addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ,
Greg Kroah-Hartman
maintainerPATCH 135/258 nfs: fix pg_test page count calculation
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Tao <[email protected]>
commit 048883e0b934d9a5103d40e209cb14b7f33d2933 upstream.
We really want sizeof(struct page *) instead. Otherwise we limit maximum IO size to 64 pages rather than 512 pages on a 64bit system.
Fixes 2e11f829(nfs: cap request size to fit a kmalloced page array).
--- fs/nfs/pagelist.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/pagelist.c +1 -1
@@ -508,7 +508,7 @@ size_t nfs_generic_pg_test(struct nfs_pa* for it without upsetting the slab allocator. */ if (((mirror->pg_count + req->wb_bytes) >>PAGE_SHIFT ) * -sizeof (struct page ) >PAGE_SIZE ) +sizeof (struct page *) >PAGE_SIZE )return 0 ;return min (mirror->pg_bsize - mirror->pg_count, (size_t )req->wb_bytes);
Greg Kroah-Hartman
maintainerPATCH 147/258 drm/amdgpu: Restore LCD backlight level on resume
In reply to Greg Kroah-Hartman4.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 74b3112e95073b351e3b0b9799795bc76f8415fa upstream.
Instead of only enabling the backlight (which seems to set it to max brightness), just re-set the current backlight level, which also takes care of enabling the backlight if necessary.
Port of radeon commit:
drm/radeon: Restore LCD backlight level on resume (>= R5xx)
--- drivers/gpu/drm/amd/amdgpu/atombios_encoders.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/atombios_encoders.c +1 -2
@@ -1279,8 +1279,7 @@ amdgpu_atombios_encoder_setup_dig(structamdgpu_atombios_encoder_setup_dig_encoder (encoder,ATOM_ENCODER_CMD_DP_VIDEO_ON ,0 ); }if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT )) -amdgpu_atombios_encoder_setup_dig_transmitter (encoder, -ATOM_TRANSMITTER_ACTION_LCD_BLON ,0 ,0 ); +amdgpu_atombios_encoder_set_backlight_level (amdgpu_encoder, dig->backlight_level);if (ext_encoder)amdgpu_atombios_encoder_setup_external_encoder (encoder, ext_encoder,ATOM_ENABLE ); }else {