4.4.5-stable review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 4.4.5-stable review
This is the start of the stable review cycle for the 4.4.5 release. There are 74 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 Thu Mar 10 00:02:56 UTC 2016. 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.4.5-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.4.5-rc1
Alex Deucher <[email protected]>
drm/amdgpu: fix topaz/tonga gmc assignment in 4.4 stable
Rusty Russell <[email protected]>
modules: fix longstanding /proc/kallsyms vs module insertion race.
Gerd Hoffmann <[email protected]>
drm/i915: refine qemu south bridge detection
Gerd Hoffmann <[email protected]>
drm/i915: more virtual south bridge detection
Ming Lei <[email protected]>
block: get the 1st and last bvec via helpers
Ming Lei <[email protected]>
block: check virt boundary in bio_will_gap()
Michel Dänzer <[email protected]>
drm/amdgpu: Use drm_calloc_large for VM page_tables array
Javi Merino <[email protected]>
thermal: cpu_cooling: fix out of bounds access in time_in_idle
Wolfram Sang <[email protected]>
i2c: brcmstb: allocate correct amount of memory for regmap
Richard Weinberger <[email protected]>
ubi: Fix out of bounds write in volume update code
Frederic Barrat <[email protected]>
cxl: Fix PSL timebase synchronization detection
Maciej W. Rozycki <[email protected]>
MIPS: traps: Fix SIGFPE information leak from do_ov' and do_trap_or_bp'
Govindraj Raja <[email protected]>
MIPS: scache: Fix scache init with invalid line size.
Yegor Yefremov <[email protected]>
USB: serial: option: add support for Quectel UC20
Daniele Palmas <[email protected]>
USB: serial: option: add support for Telit LE922 PID 0x1045
Bjørn Mork <[email protected]>
USB: qcserial: add Sierra Wireless EM74xx device ID
Patrik Halfar <[email protected]>
USB: qcserial: add Dell Wireless 5809e Gobi 4G HSPA+ (rev3)
Vittorio Alfieri <[email protected]>
USB: cp210x: Add ID for Parrot NMEA GPS Flight Recorder
Peter Chen <[email protected]>
usb: chipidea: otg: change workqueue ci_otg as freezable
Takashi Iwai <[email protected]>
ALSA: timer: Fix broken compat timer user status ioctl
Takashi Iwai <[email protected]>
ALSA: hdspm: Fix zero-division
Takashi Iwai <[email protected]>
ALSA: hdsp: Fix wrong boolean ctl value accesses
Takashi Iwai <[email protected]>
ALSA: hdspm: Fix wrong boolean ctl value accesses
Takashi Iwai <[email protected]>
ALSA: seq: oss: Don't drain at closing a client
Takashi Iwai <[email protected]>
ALSA: pcm: Fix ioctls for X32 ABI
Takashi Iwai <[email protected]>
ALSA: timer: Fix ioctls for X32 ABI
Takashi Iwai <[email protected]>
ALSA: rawmidi: Fix ioctls X32 ABI
Simon South <[email protected]>
ALSA: hda - Fix mic issues on Acer Aspire E1-472
Takashi Iwai <[email protected]>
ALSA: ctl: Fix ioctls for X32 ABI
Dennis Kadioglu <[email protected]>
ALSA: usb-audio: Add a quirk for Plantronics DA45
Hans Verkuil <[email protected]>
adv7604: fix tx 5v detect regression
Robert Jarzmik <[email protected]>
dmaengine: pxa_dma: fix cyclic transfers
David Woodhouse <[email protected]>
Fix directory hardlinks from deleted directories
David Woodhouse <[email protected]>
jffs2: Fix page lock / f->sem deadlock
Thomas Betker <[email protected]>
Revert "jffs2: Fix lock acquisition order bug in jffs2_write_begin"
Filipe Manana <[email protected]>
Btrfs: fix loading of orphan roots leading to BUG_ON
Gabor Juhos <[email protected]>
pata-rb532-cf: get rid of the irq_to_gpio() call
Steven Rostedt (Red Hat) <[email protected]>
tracing: Do not have 'comm' filter override event 'comm' field
Manuel Lauss <[email protected]>
ata: ahci: don't mark HotPlugCapable Ports as external/removable
Todd E Brandt <[email protected]>
PM / sleep / x86: Fix crash on graph trace through x86 suspend
Ard Biesheuvel <[email protected]>
arm64: vmemmap: use virtual projection of linear region
Alexandra Yates <[email protected]>
Adding Intel Lewisburg device IDs for SATA
Tejun Heo <[email protected]>
writeback: flush inode cgroup wb switches instead of pinning super_block
Ming Lei <[email protected]>
block: bio: introduce helpers to get the 1st and last bvec
Harvey Hunt <[email protected]>
libata: Align ata_device's id on a cacheline
Arnd Bergmann <[email protected]>
libata: fix HDIO_GET_32BIT ioctl
Arindam Nath <[email protected]>
drm/amdgpu: return from atombios_dp_get_dpcd only when error
Chunming Zhou <[email protected]>
drm/amdgpu/gfx8: specify which engine to wait before vm flush
Christian König <[email protected]>
drm/amdgpu: apply gfx_v8 fixes to gfx_v7 as well
Alex Deucher <[email protected]>
drm/amdgpu/pm: update current crtc info after setting the powerstate
Alex Deucher <[email protected]>
drm/radeon/pm: update current crtc info after setting the powerstate
Timothy Pearson <[email protected]>
drm/ast: Fix incorrect register check for DRAM width
Mike Christie <[email protected]>
target: Fix WRITE_SAME/DISCARD conversion to linux 512b sectors
Joerg Roedel <[email protected]>
iommu/vt-d: Use BUS_NOTIFY_REMOVED_DEVICE in hotplug path
Suravee Suthikulpanit <[email protected]>
iommu/amd: Fix boot warning when device 00:00.0 is not iommu covered
Jay Cornwall <[email protected]>
iommu/amd: Apply workaround for ATS write permission check
Michael S. Tsirkin <[email protected]>
arm/arm64: KVM: Fix ioctl error handling
Paolo Bonzini <[email protected]>
KVM: x86: fix root cause for missed hardware breakpoints
Michael S. Tsirkin <[email protected]>
vfio: fix ioctl error handling
Yadan Fan <[email protected]>
Fix cifs_uniqueid_to_ino_t() function for s390x
Pavel Shilovsky <[email protected]>
CIFS: Fix SMB2+ interim response processing for read requests
Justin Maggard <[email protected]>
cifs: fix out-of-bounds access in lease parsing
Jean-Philippe Brucker <[email protected]>
fbcon: set a default value to blink interval
Owen Hofmann <[email protected]>
kvm: x86: Update tsc multiplier on change.
Michael S. Tsirkin <[email protected]>
mips/kvm: fix ioctl error handling
Helge Deller <[email protected]>
parisc: Fix ptrace syscall number and return value modification
Murali Karicheri <[email protected]>
PCI: keystone: Fix MSI code that retrieves struct pcie_port pointer
Keith Busch <[email protected]>
block: Initialize max_dev_sectors to 0
Oded Gabbay <[email protected]>
drm/amdgpu: mask out WC from BO on unsupported arches
Qu Wenruo <[email protected]>
btrfs: async-thread: Fix a use-after-free error for trace
Zhao Lei <[email protected]>
btrfs: Fix no_space in write and rm loop
Filipe Manana <[email protected]>
Btrfs: fix deadlock running delayed iputs at transaction commit time
Geert Uytterhoeven <[email protected]>
drivers: sh: Restore legacy clock domain on SuperH platforms
Al Viro <[email protected]>
use ->d_seq to get coherency between ->d_inode and ->d_flags
-------------
Diffstat:
Makefile | 4 +- arch/arm/kvm/guest.c | 2 +- arch/arm64/include/asm/pgtable.h | 7 +- arch/arm64/kvm/guest.c | 2 +- arch/arm64/mm/init.c | 4 +- arch/mips/kernel/traps.c | 13 +- arch/mips/kvm/mips.c | 4 +- arch/mips/mm/sc-mips.c | 13 +- arch/parisc/kernel/ptrace.c | 16 ++- arch/parisc/kernel/syscall.S | 5 +- arch/x86/kernel/acpi/sleep.c | 7 + arch/x86/kvm/vmx.c | 14 +- arch/x86/kvm/x86.c | 9 +- block/blk-settings.c | 4 +- drivers/ata/ahci.c | 6 + drivers/ata/libahci.c | 3 +- drivers/ata/libata-scsi.c | 11 +- drivers/ata/pata_rb532_cf.c | 11 +- drivers/dma/pxa_dma.c | 8 +- drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 8 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 6 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 7 +- drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 13 ++ drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 3 +- drivers/gpu/drm/amd/amdgpu/vi.c | 12 +- drivers/gpu/drm/ast/ast_main.c | 2 +- drivers/gpu/drm/i915/i915_drv.c | 5 +- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/radeon/radeon_pm.c | 8 +- drivers/i2c/busses/i2c-brcmstb.c | 3 +- drivers/iommu/amd_iommu_init.c | 63 +++++++-- drivers/iommu/dmar.c | 5 +- drivers/iommu/intel-iommu.c | 4 +- drivers/media/i2c/adv7604.c | 3 +- drivers/misc/cxl/pci.c | 2 +- drivers/mtd/ubi/upd.c | 2 +- drivers/pci/host/pci-keystone-dw.c | 11 +- drivers/sh/pm_runtime.c | 2 +- drivers/target/target_core_device.c | 43 ++++++ drivers/target/target_core_file.c | 29 ++-- drivers/target/target_core_iblock.c | 56 ++------ drivers/thermal/cpu_cooling.c | 14 +- drivers/usb/chipidea/otg.c | 2 +- drivers/usb/serial/cp210x.c | 1 + drivers/usb/serial/option.c | 5 + drivers/usb/serial/qcserial.c | 7 +- drivers/vfio/pci/vfio_pci.c | 9 +- drivers/vfio/platform/vfio_platform_common.c | 9 +- drivers/vfio/vfio_iommu_type1.c | 6 +- drivers/video/console/fbcon.c | 2 + fs/btrfs/async-thread.c | 2 +- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 5 +- fs/btrfs/extent-tree.c | 13 +- fs/btrfs/inode.c | 4 - fs/btrfs/root-tree.c | 10 +- fs/cifs/cifsfs.h | 12 +- fs/cifs/cifssmb.c | 21 ++- fs/cifs/smb2pdu.c | 24 ++-- fs/dcache.c | 20 +-- fs/fs-writeback.c | 54 ++++++-- fs/jffs2/README.Locking | 5 +- fs/jffs2/build.c | 75 ++++++++--- fs/jffs2/file.c | 39 +++--- fs/jffs2/gc.c | 17 ++- fs/jffs2/nodelist.h | 6 +- fs/super.c | 1 + include/linux/ata.h | 4 +- include/linux/bio.h | 37 ++++++ include/linux/blkdev.h | 23 +++- include/linux/dcache.h | 4 +- include/linux/libata.h | 2 +- include/linux/module.h | 17 +-- include/linux/trace_events.h | 2 + include/linux/writeback.h | 5 + include/target/target_core_backend.h | 3 + kernel/module.c | 112 ++++++++++------ kernel/trace/trace_events.c | 14 +- kernel/trace/trace_events_filter.c | 13 +- sound/core/control_compat.c | 90 ++++++++++--- sound/core/pcm_compat.c | 177 ++++++++++++++++++++++++- sound/core/rawmidi_compat.c | 53 ++++++++ sound/core/seq/oss/seq_oss.c | 2 - sound/core/seq/oss/seq_oss_device.h | 1 - sound/core/seq/oss/seq_oss_init.c | 16 --- sound/core/timer_compat.c | 18 ++- sound/pci/hda/patch_realtek.c | 1 + sound/pci/rme9652/hdsp.c | 4 +- sound/pci/rme9652/hdspm.c | 16 ++- sound/usb/quirks.c | 1 + 91 files changed, 1000 insertions(+), 413 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/74 use ->d_seq to get coherency between ->d_inode and ->d_flags
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit a528aca7f359f4b0b1d72ae406097e491a5ba9ea upstream.
Games with ordering and barriers are way too brittle. Just bump ->d_seq before and after updating ->d_inode and ->d_flags type bits, so that verifying ->d_seq would guarantee they are coherent.
--- fs/dcache.c | 20 +++++--------------- include/linux/dcache.h | 4 +--- 2 files changed, 6 insertions(+), 18 deletions(-)
fs/dcache.c +5 -15
@@ -269,9 +269,6 @@ static inline int dname_external(const sreturn dentry->d_name.name != dentry->d_iname; } -/* -* Make sure other CPUs see the inode attached before the type is set. -*/ static inline void __d_set_inode_and_type (struct dentry *dentry,struct inode *inode,unsigned type_flags)
@@ -279,28 +276,18 @@ static inline void __d_set_inode_and_typunsigned flags; dentry->d_inode = inode; -smp_wmb (); flags =READ_ONCE (dentry->d_flags); flags &= ~(DCACHE_ENTRY_TYPE |DCACHE_FALLTHRU ); flags |= type_flags;WRITE_ONCE (dentry->d_flags, flags); } -/* -* Ideally, we want to make sure that other CPUs see the flags cleared before -* the inode is detached, but this is really a violation of RCU principles -* since the ordering suggests we should always set inode before flags. -* -* We should instead replace or discard the entire dentry - but that sucks -* performancewise on mass deletion/rename. -*/ static inline void __d_clear_type_and_inode (struct dentry *dentry) {unsigned flags =READ_ONCE (dentry->d_flags); flags &= ~(DCACHE_ENTRY_TYPE |DCACHE_FALLTHRU );WRITE_ONCE (dentry->d_flags, flags); -smp_wmb (); dentry->d_inode =NULL ; }
@@ -370,9 +357,11 @@ static void dentry_unlink_inode(struct d __releases(dentry->d_inode->i_lock) {struct inode *inode = dentry->d_inode; + +raw_write_seqcount_begin (&dentry->d_seq);__d_clear_type_and_inode (dentry);hlist_del_init (&dentry->d_u.d_alias); -dentry_rcuwalk_invalidate (dentry); +raw_write_seqcount_end (&dentry->d_seq);spin_unlock (&dentry->d_lock);spin_unlock (&inode->i_lock);if (!inode->i_nlink)
@@ -1757,8 +1746,9 @@ static void __d_instantiate(struct dentrspin_lock (&dentry->d_lock);if (inode)hlist_add_head (&dentry->d_u.d_alias, &inode->i_dentry); +raw_write_seqcount_begin (&dentry->d_seq);__d_set_inode_and_type (dentry, inode, add_flags); -dentry_rcuwalk_invalidate (dentry); +raw_write_seqcount_end (&dentry->d_seq);spin_unlock (&dentry->d_lock);fsnotify_d_instantiate (dentry, inode); }
include/linux/dcache.h +1 -3
@@ -409,9 +409,7 @@ static inline bool d_mountpoint(const st*/ static inline unsigned __d_entry_type (const struct dentry *dentry) { -unsigned type =READ_ONCE (dentry->d_flags); -smp_rmb (); -return type &DCACHE_ENTRY_TYPE ; +return dentry->d_flags &DCACHE_ENTRY_TYPE ; }static inline bool d_is_miss (const struct dentry *dentry)
Greg Kroah-Hartman
maintainerPATCH 2/74 drivers: sh: Restore legacy clock domain on SuperH platforms
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit 0378ba4899d5fbd8494ed6580cbc81d7b44dbac6 upstream.
CONFIG_ARCH_SHMOBILE is not only enabled for Renesas ARM platforms (which are DT based and multi-platform), but also on a select set of Renesas SuperH platforms (SH7722/SH7723/SH7724/SH7343/SH7366). Hence since commit 0ba58de231066e47 ("drivers: sh: Get rid of CONFIG_ARCH_SHMOBILE_MULTI"), the legacy clock domain is no longer installed on these SuperH platforms, and module clocks may not be enabled when needed, leading to driver failures.
To fix this, add an additional check for CONFIG_OF.
--- drivers/sh/pm_runtime.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/sh/pm_runtime.c +1 -1
@@ -34,7 +34,7 @@ static struct pm_clk_notifier_block platstatic int __init sh_pm_runtime_init (void ) { -if (IS_ENABLED (CONFIG_ARCH_SHMOBILE )) { +if (IS_ENABLED (CONFIG_OF ) &&IS_ENABLED (CONFIG_ARCH_SHMOBILE )) {if (!of_find_compatible_node (NULL ,NULL ,"renesas,cpg-mstp-clocks" ))return 0 ;
Greg Kroah-Hartman
maintainerPATCH 3/74 Btrfs: fix deadlock running delayed iputs at transaction commit time
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit c2d6cb1636d235257086f939a8194ef0bf93af6e upstream.
While running a stress test I ran into a deadlock when running the delayed iputs at transaction time, which produced the following report and trace:
[ 886.399989] =============================================
[ 886.400871] [ INFO: possible recursive locking detected ]
[ 886.401663] 4.4.0-rc6-btrfs-next-18+ #1 Not tainted
[ 886.402384] ---------------------------------------------
[ 886.403182] fio/8277 is trying to acquire lock:
[ 886.403568] (&fs_info->delayed_iput_sem){++++..}, at: [<ffffffffa0538823>] btrfs_run_delayed_iputs+0x36/0xbf [btrfs]
[ 886.403568]
[ 886.403568] but task is already holding lock:
[ 886.403568] (&fs_info->delayed_iput_sem){++++..}, at: [<ffffffffa0538823>] btrfs_run_delayed_iputs+0x36/0xbf [btrfs]
[ 886.403568]
[ 886.403568] other info that might help us debug this:
[ 886.403568] Possible unsafe locking scenario:
[ 886.403568]
[ 886.403568] CPU0
[ 886.403568] ----
[ 886.403568] lock(&fs_info->delayed_iput_sem);
[ 886.403568] lock(&fs_info->delayed_iput_sem);
[ 886.403568]
[ 886.403568] *** DEADLOCK ***
[ 886.403568]
[ 886.403568] May be due to missing lock nesting notation
[ 886.403568]
[ 886.403568] 3 locks held by fio/8277:
[ 886.403568] #0: (sb_writers#11){.+.+.+}, at: [<ffffffff81174c4c>] __sb_start_write+0x5f/0xb0
[ 886.403568] #1: (&sb->s_type->i_mutex_key#15){+.+.+.}, at: [<ffffffffa054620d>] btrfs_file_write_iter+0x73/0x408 [btrfs]
[ 886.403568] #2: (&fs_info->delayed_iput_sem){++++..}, at: [<ffffffffa0538823>] btrfs_run_delayed_iputs+0x36/0xbf [btrfs]
[ 886.403568]
[ 886.403568] stack backtrace:
[ 886.403568] CPU: 6 PID: 8277 Comm: fio Not tainted 4.4.0-rc6-btrfs-next-18+ #1
[ 886.403568] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS by qemu-project.org 04/01/2014
[ 886.403568] 0000000000000000 ffff88009f80f770 ffffffff8125d4fd ffffffff82af1fc0
[ 886.403568] ffff88009f80f830 ffffffff8108e5f9 0000000200000000 ffff88009fd92290
[ 886.403568] 0000000000000000 ffffffff82af1fc0 ffffffff829cfb01 00042b216d008804
[ 886.403568] Call Trace:
[ 886.403568] [<ffffffff8125d4fd>] dump_stack+0x4e/0x79
[ 886.403568] [<ffffffff8108e5f9>] __lock_acquire+0xd42/0xf0b
[ 886.403568] [<ffffffff810c22db>] ? __module_address+0xdf/0x108
[ 886.403568] [<ffffffff8108eb77>] lock_acquire+0x10d/0x194
[ 886.403568] [<ffffffff8108eb77>] ? lock_acquire+0x10d/0x194
[ 886.403568] [<ffffffffa0538823>] ? btrfs_run_delayed_iputs+0x36/0xbf [btrfs]
[ 886.489542] [<ffffffff8148556b>] down_read+0x3e/0x4d
[ 886.489542] [<ffffffffa0538823>] ? btrfs_run_delayed_iputs+0x36/0xbf [btrfs]
[ 886.489542] [<ffffffffa0538823>] btrfs_run_delayed_iputs+0x36/0xbf [btrfs]
[ 886.489542] [<ffffffffa0533953>] btrfs_commit_transaction+0x8f5/0x96e [btrfs]
[ 886.489542] [<ffffffffa0521d7a>] flush_space+0x435/0x44a [btrfs]
[ 886.489542] [<ffffffffa052218b>] ? reserve_metadata_bytes+0x26a/0x384 [btrfs]
[ 886.489542] [<ffffffffa05221ae>] reserve_metadata_bytes+0x28d/0x384 [btrfs]
[ 886.489542] [<ffffffffa052256c>] ? btrfs_block_rsv_refill+0x58/0x96 [btrfs]
[ 886.489542] [<ffffffffa0522584>] btrfs_block_rsv_refill+0x70/0x96 [btrfs]
[ 886.489542] [<ffffffffa053d747>] btrfs_evict_inode+0x394/0x55a [btrfs]
[ 886.489542] [<ffffffff81188e31>] evict+0xa7/0x15c
[ 886.489542] [<ffffffff81189878>] iput+0x1d3/0x266
[ 886.489542] [<ffffffffa053887c>] btrfs_run_delayed_iputs+0x8f/0xbf [btrfs]
[ 886.489542] [<ffffffffa0533953>] btrfs_commit_transaction+0x8f5/0x96e [btrfs]
[ 886.489542] [<ffffffff81085096>] ? signal_pending_state+0x31/0x31
[ 886.489542] [<ffffffffa0521191>] btrfs_alloc_data_chunk_ondemand+0x1d7/0x288 [btrfs]
[ 886.489542] [<ffffffffa0521282>] btrfs_check_data_free_space+0x40/0x59 [btrfs]
[ 886.489542] [<ffffffffa05228f5>] btrfs_delalloc_reserve_space+0x1e/0x4e [btrfs]
[ 886.489542] [<ffffffffa053620a>] btrfs_direct_IO+0x10c/0x27e [btrfs]
[ 886.489542] [<ffffffff8111d9a1>] generic_file_direct_write+0xb3/0x128
[ 886.489542] [<ffffffffa05463c3>] btrfs_file_write_iter+0x229/0x408 [btrfs]
[ 886.489542] [<ffffffff8108ae38>] ? __lock_is_held+0x38/0x50
[ 886.489542] [<ffffffff8117279e>] __vfs_write+0x7c/0xa5
[ 886.489542] [<ffffffff81172cda>] vfs_write+0xa0/0xe4
[ 886.489542] [<ffffffff811734cc>] SyS_write+0x50/0x7e
[ 886.489542] [<ffffffff814872d7>] entry_SYSCALL_64_fastpath+0x12/0x6f
[ 1081.852335] INFO: task fio:8244 blocked for more than 120 seconds.
[ 1081.854348] Not tainted 4.4.0-rc6-btrfs-next-18+ #1
[ 1081.857560] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 1081.863227] fio D ffff880213f9bb28 0 8244 8240 0x00000000
[ 1081.868719] ffff880213f9bb28 00ffffff810fc6b0 ffffffff0000000a ffff88023ed55240
[ 1081.872499] ffff880206b5d400 ffff880213f9c000 ffff88020a4d5318 ffff880206b5d400
[ 1081.876834] ffffffff00000001 ffff880206b5d400 ffff880213f9bb40 ffffffff81482ba4
[ 1081.880782] Call Trace:
[ 1081.881793] [<ffffffff81482ba4>] schedule+0x7f/0x97
[ 1081.883340] [<ffffffff81485eb5>] rwsem_down_write_failed+0x2d5/0x325
[ 1081.895525] [<ffffffff8108d48d>] ? trace_hardirqs_on_caller+0x16/0x1ab
[ 1081.897419] [<ffffffff81269723>] call_rwsem_down_write_failed+0x13/0x20
[ 1081.899251] [<ffffffff81269723>] ? call_rwsem_down_write_failed+0x13/0x20
[ 1081.901063] [<ffffffff81089fae>] ? __down_write_nested.isra.0+0x1f/0x21
[ 1081.902365] [<ffffffff814855bd>] down_write+0x43/0x57
[ 1081.903846] [<ffffffffa05211b0>] ? btrfs_alloc_data_chunk_ondemand+0x1f6/0x288 [btrfs]
[ 1081.906078] [<ffffffffa05211b0>] btrfs_alloc_data_chunk_ondemand+0x1f6/0x288 [btrfs]
[ 1081.908846] [<ffffffff8108d461>] ? mark_held_locks+0x56/0x6c
[ 1081.910409] [<ffffffffa0521282>] btrfs_check_data_free_space+0x40/0x59 [btrfs]
[ 1081.912482] [<ffffffffa05228f5>] btrfs_delalloc_reserve_space+0x1e/0x4e [btrfs]
[ 1081.914597] [<ffffffffa053620a>] btrfs_direct_IO+0x10c/0x27e [btrfs]
[ 1081.919037] [<ffffffff8111d9a1>] generic_file_direct_write+0xb3/0x128
[ 1081.920754] [<ffffffffa05463c3>] btrfs_file_write_iter+0x229/0x408 [btrfs]
[ 1081.922496] [<ffffffff8108ae38>] ? __lock_is_held+0x38/0x50
[ 1081.923922] [<ffffffff8117279e>] __vfs_write+0x7c/0xa5
[ 1081.925275] [<ffffffff81172cda>] vfs_write+0xa0/0xe4
[ 1081.926584] [<ffffffff811734cc>] SyS_write+0x50/0x7e
[ 1081.927968] [<ffffffff814872d7>] entry_SYSCALL_64_fastpath+0x12/0x6f
[ 1081.985293] INFO: lockdep is turned off.
[ 1081.986132] INFO: task fio:8249 blocked for more than 120 seconds.
[ 1081.987434] Not tainted 4.4.0-rc6-btrfs-next-18+ #1
[ 1081.988534] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 1081.990147] fio D ffff880218febbb8 0 8249 8240 0x00000000
[ 1081.991626] ffff880218febbb8 00ffffff81486b8e ffff88020000000b ffff88023ed75240
[ 1081.993258] ffff8802120a9a00 ffff880218fec000 ffff88020a4d5318 ffff8802120a9a00
[ 1081.994850] ffffffff00000001 ffff8802120a9a00 ffff880218febbd0 ffffffff81482ba4
[ 1081.996485] Call Trace:
[ 1081.997037] [<ffffffff81482ba4>] schedule+0x7f/0x97
[ 1081.998017] [<ffffffff81485eb5>] rwsem_down_write_failed+0x2d5/0x325
[ 1081.999241] [<ffffffff810852a5>] ? finish_wait+0x6d/0x76
[ 1082.000306] [<ffffffff81269723>] call_rwsem_down_write_failed+0x13/0x20
[ 1082.001533] [<ffffffff81269723>] ? call_rwsem_down_write_failed+0x13/0x20
[ 1082.002776] [<ffffffff81089fae>] ? __down_write_nested.isra.0+0x1f/0x21
[ 1082.003995] [<ffffffff814855bd>] down_write+0x43/0x57
[ 1082.005000] [<ffffffffa05211b0>] ? btrfs_alloc_data_chunk_ondemand+0x1f6/0x288 [btrfs]
[ 1082.007403] [<ffffffffa05211b0>] btrfs_alloc_data_chunk_ondemand+0x1f6/0x288 [btrfs]
[ 1082.008988] [<ffffffffa0545064>] btrfs_fallocate+0x7c1/0xc2f [btrfs]
[ 1082.010193] [<ffffffff8108a1ba>] ? percpu_down_read+0x4e/0x77
[ 1082.011280] [<ffffffff81174c4c>] ? __sb_start_write+0x5f/0xb0
[ 1082.012265] [<ffffffff81174c4c>] ? __sb_start_write+0x5f/0xb0
[ 1082.013021] [<ffffffff811712e4>] vfs_fallocate+0x170/0x1ff
[ 1082.013738] [<ffffffff81181ebb>] ioctl_preallocate+0x89/0x9b
[ 1082.014778] [<ffffffff811822d7>] do_vfs_ioctl+0x40a/0x4ea
[ 1082.015778] [<ffffffff81176ea7>] ? SYSC_newfstat+0x25/0x2e
[ 1082.016806] [<ffffffff8118b4de>] ? __fget_light+0x4d/0x71
[ 1082.017789] [<ffffffff8118240e>] SyS_ioctl+0x57/0x79
[ 1082.018706] [<ffffffff814872d7>] entry_SYSCALL_64_fastpath+0x12/0x6fThis happens because we can recursively acquire the semaphore fs_info->delayed_iput_sem when attempting to allocate space to satisfy a file write request as shown in the first trace above - when committing a transaction we acquire (down_read) the semaphore before running the delayed iputs, and when running a delayed iput() we can end up calling an inode's eviction handler, which in turn commits another transaction and attempts to acquire (down_read) again the semaphore to run more delayed iput operations.
This results in a deadlock because if a task acquires multiple times a semaphore it should invoke down_read_nested() with a different lockdep class for each level of recursion.
Fix this by simplifying the implementation and use a mutex instead that is acquired by the cleaner kthread before it runs the delayed iputs instead of always acquiring a semaphore before delayed references are run from anywhere.
--- fs/btrfs/ctree.h | 2 +- fs/btrfs/disk-io.c | 5 ++++- fs/btrfs/extent-tree.c | 9 +++++---- fs/btrfs/inode.c | 4 ---- 4 files changed, 10 insertions(+), 10 deletions(-)
fs/btrfs/ctree.h +1 -1
@@ -1572,7 +1572,7 @@ struct btrfs_fs_info {spinlock_t delayed_iput_lock;struct list_head delayed_iputs; -struct rw_semaphore delayed_iput_sem; +struct mutex cleaner_delayed_iput_mutex;/* this protects tree_mod_seq_list */ spinlock_t tree_mod_seq_lock;
fs/btrfs/disk-io.c +4 -1
@@ -1796,7 +1796,10 @@ static int cleaner_kthread(void *arg) goto sleep; } +mutex_lock (&root->fs_info->cleaner_delayed_iput_mutex);btrfs_run_delayed_iputs (root); +mutex_unlock (&root->fs_info->cleaner_delayed_iput_mutex); + again =btrfs_clean_one_deleted_snapshot (root);mutex_unlock (&root->fs_info->cleaner_mutex);
@@ -2556,8 +2559,8 @@ int open_ctree(struct super_block *sb,mutex_init (&fs_info->delete_unused_bgs_mutex);mutex_init (&fs_info->reloc_mutex);mutex_init (&fs_info->delalloc_root_mutex); +mutex_init (&fs_info->cleaner_delayed_iput_mutex);seqlock_init (&fs_info->profiles_lock); -init_rwsem (&fs_info->delayed_iput_sem);INIT_LIST_HEAD (&fs_info->dirty_cowonly_roots);INIT_LIST_HEAD (&fs_info->space_info);
fs/btrfs/extent-tree.c +5 -4
@@ -4100,11 +4100,12 @@ commit_trans:if (ret)return ret;/* -* make sure that all running delayed iput are -* done +* The cleaner kthread might still be doing iput +* operations. Wait for it to finish so that +* more space is released. */ -down_write (&root->fs_info->delayed_iput_sem); -up_write (&root->fs_info->delayed_iput_sem); +mutex_lock (&root->fs_info->cleaner_delayed_iput_mutex); +mutex_unlock (&root->fs_info->cleaner_delayed_iput_mutex); goto again; }else {btrfs_end_transaction (trans, root);
fs/btrfs/inode.c +0 -4
@@ -3142,8 +3142,6 @@ void btrfs_run_delayed_iputs(struct btrfif (empty)return ; -down_read (&fs_info->delayed_iput_sem); -spin_lock (&fs_info->delayed_iput_lock);list_splice_init (&fs_info->delayed_iputs, &list);spin_unlock (&fs_info->delayed_iput_lock);
@@ -3154,8 +3152,6 @@ void btrfs_run_delayed_iputs(struct btrfiput (delayed->inode);kfree (delayed); } - -up_read (&root->fs_info->delayed_iput_sem); }/*
Greg Kroah-Hartman
maintainerPATCH 4/74 btrfs: Fix no_space in write and rm loop
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Lei <[email protected]>
commit e1746e8381cd2af421f75557b5cae3604fc18b35 upstream.
I see no_space in v4.4-rc1 again in xfstests generic/102. It happened randomly in some node only.
(one of 4 phy-node, and a kvm with non-virtio block driver)
By bisect, we can found the first-bad is:
commit bdced438acd8 ("block: setup bi_phys_segments after splitting")'
But above patch only triggered the bug by making bio operation faster(or slower).
Main reason is in our space_allocating code, we need to commit page writeback before wait it complish, this patch fixed above bug.
BTW, there is another reason for generic/102 fail, caused by disable default mixed-blockgroup, I'll fix it in xfstests.
--- fs/btrfs/extent-tree.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/btrfs/extent-tree.c +3 -1
@@ -4086,8 +4086,10 @@ commit_trans: !atomic_read(&root->fs_info->open_ioctl_trans)) { need_commit--; -if (need_commit >0 ) +if (need_commit >0 ) { +btrfs_start_delalloc_roots (fs_info,0 ,-1 );btrfs_wait_ordered_roots (fs_info,-1 ); + } trans =btrfs_join_transaction (root);if (IS_ERR (trans))
Greg Kroah-Hartman
maintainerPATCH 5/74 btrfs: async-thread: Fix a use-after-free error for trace
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qu Wenruo <[email protected]>
commit 0a95b851370b84a4b9d92ee6d1fa0926901d0454 upstream.
Parameter of trace_btrfs_work_queued() can be freed in its workqueue. So no one use use that pointer after queue_work().
Fix the user-after-free bug by move the trace line before queue_work().
--- fs/btrfs/async-thread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/async-thread.c +1 -1
@@ -328,8 +328,8 @@ static inline void __btrfs_queue_work(stlist_add_tail (&work->ordered_list, &wq->ordered_list);spin_unlock_irqrestore (&wq->list_lock, flags); } -queue_work (wq->normal_wq, &work->normal_work);trace_btrfs_work_queued (work); +queue_work (wq->normal_wq, &work->normal_work); } void btrfs_queue_work(struct btrfs_workqueue *wq,
Greg Kroah-Hartman
maintainerPATCH 7/74 block: Initialize max_dev_sectors to 0
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keith Busch <[email protected]>
commit 5f009d3f8e6685fe8c6215082c1696a08b411220 upstream.
The new queue limit is not used by the majority of block drivers, and should be initialized to 0 for the driver's requested settings to be used.
--- block/blk-settings.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
block/blk-settings.c +2 -2
@@ -91,8 +91,8 @@ void blk_set_default_limits(struct queue lim->seg_boundary_mask =BLK_SEG_BOUNDARY_MASK ; lim->virt_boundary_mask =0 ; lim->max_segment_size =BLK_MAX_SEGMENT_SIZE ; - lim->max_sectors = lim->max_dev_sectors = lim->max_hw_sectors = -BLK_SAFE_MAX_SECTORS ; + lim->max_sectors = lim->max_hw_sectors =BLK_SAFE_MAX_SECTORS ; + lim->max_dev_sectors =0 ; lim->chunk_sectors =0 ; lim->max_write_same_sectors =0 ; lim->max_discard_sectors =0 ;
Greg Kroah-Hartman
maintainerPATCH 8/74 PCI: keystone: Fix MSI code that retrieves struct pcie_port pointer
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Murali Karicheri <[email protected]>
commit 79e3f4a853ed161cd4c06d84b50beebf961a47c6 upstream.
Commit cbce7900598c ("PCI: designware: Make driver arch-agnostic") changed the host bridge sysdata pointer from the ARM pci_sys_data to the DesignWare pcie_port structure, and changed pcie-designware.c to reflect that. But it did not change the corresponding code in pci-keystone-dw.c, so it caused crashes on Keystone:
Unable to handle kernel NULL pointer dereference at virtual address 00000030 pgd = c0003000 [00000030] *pgd=80000800004003, *pmd=00000000 Internal error: Oops: 206 [#1] PREEMPT SMP ARM CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.2-00139-gb74f926 #2 Hardware name: Keystone PC is at ks_dw_pcie_msi_irq_unmask+0x24/0x58
Change pci-keystone-dw.c to expect sysdata to be the struct pcie_port pointer.
--- drivers/pci/host/pci-keystone-dw.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/pci/host/pci-keystone-dw.c +3 -8
@@ -58,11 +58,6 @@#define to_keystone_pcie (x) container_of(x, struct keystone_pcie, pp) -static inline struct pcie_port *sys_to_pcie (struct pci_sys_data *sys) -{ -return sys->private_data; -} -static inline void update_reg_offset_bit_pos (u32 offset,u32 *reg_offset,u32 *bit_pos) {
@@ -108,7 +103,7 @@ static void ks_dw_pcie_msi_irq_ack(strucstruct pcie_port *pp; msi =irq_data_get_msi_desc (d); - pp =sys_to_pcie (msi_desc_to_pci_sysdata (msi)); + pp = (struct pcie_port *)msi_desc_to_pci_sysdata (msi); ks_pcie =to_keystone_pcie (pp); offset = d->irq -irq_linear_revmap (pp->irq_domain,0 );update_reg_offset_bit_pos (offset, ®_offset, &bit_pos);
@@ -146,7 +141,7 @@ static void ks_dw_pcie_msi_irq_mask(struu32 offset; msi =irq_data_get_msi_desc (d); - pp =sys_to_pcie (msi_desc_to_pci_sysdata (msi)); + pp = (struct pcie_port *)msi_desc_to_pci_sysdata (msi); ks_pcie =to_keystone_pcie (pp); offset = d->irq -irq_linear_revmap (pp->irq_domain,0 );
@@ -167,7 +162,7 @@ static void ks_dw_pcie_msi_irq_unmask(stu32 offset; msi =irq_data_get_msi_desc (d); - pp =sys_to_pcie (msi_desc_to_pci_sysdata (msi)); + pp = (struct pcie_port *)msi_desc_to_pci_sysdata (msi); ks_pcie =to_keystone_pcie (pp); offset = d->irq -irq_linear_revmap (pp->irq_domain,0 );
Greg Kroah-Hartman
maintainerPATCH 9/74 parisc: Fix ptrace syscall number and return value modification
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
commit 98e8b6c9ac9d1b1e9d1122dfa6783d5d566bb8f7 upstream.
Mike Frysinger reported that his ptrace testcase showed strange behaviour on parisc: It was not possible to avoid a syscall and the return value of a syscall couldn't be changed.
To modify a syscall number, we were missing to save the new syscall number to gr20 which is then picked up later in assembly again.
The effect that the return value couldn't be changed is a side-effect of another bug in the assembly code. When a process is ptraced, userspace expects each syscall to report entrance and exit of a syscall. If a syscall number was given which doesn't exist, we jumped to the normal syscall exit code instead of informing userspace that the (non-existant) syscall exits. This unexpected behaviour confuses userspace and thus the bug was misinterpreted as if we can't change the return value.
This patch fixes both problems and was tested on 64bit kernel with 32bit userspace.
--- arch/parisc/kernel/ptrace.c | 16 +++++++++++----- arch/parisc/kernel/syscall.S | 5 ++++- 2 files changed, 15 insertions(+), 6 deletions(-)
arch/parisc/kernel/ptrace.c +11 -5
@@ -269,14 +269,19 @@ long compat_arch_ptrace(struct task_strulong do_syscall_trace_enter (struct pt_regs *regs) { -long ret =0 ; -/* Do the secure computing check first. */ secure_computing_strict (regs->gr[20 ]);if (test_thread_flag (TIF_SYSCALL_TRACE ) && -tracehook_report_syscall_entry (regs)) - ret =-1L ; +tracehook_report_syscall_entry (regs)) { +/* +* Tracing decided this syscall should not happen or the +* debugger stored an invalid system call number. Skip +* the system call and the system call restart handling. +*/ + regs->gr[20 ] =-1UL ; + goto out; + }#ifdef CONFIG_64BIT if (!is_compat_task ())
@@ -290,7 +295,8 @@ long do_syscall_trace_enter(struct pt_re regs->gr[24 ] &0xffffffff , regs->gr[23] & 0xffffffff); -return ret ? : regs->gr[20 ]; +out: +return regs->gr[20 ]; }void do_syscall_trace_exit (struct pt_regs *regs)
arch/parisc/kernel/syscall.S +4 -1
@@ -343,7 +343,7 @@ tracesys_next: #endif comiclr,>>= __NR_Linux_syscalls, %r20, %r0 - b,n .Lsyscall_nosys + b,n .Ltracesys_nosys LDREGX %r20(%r19), %r19
@@ -359,6 +359,9 @@ tracesys_next: be 0(%sr7,%r19) ldo R%tracesys_exit(%r2),%r2 +.Ltracesys_nosys: + ldo -ENOSYS(%r0),%r28 /* set errno */ + /* Do *not* call this function on the gateway page, because it makes a direct call to syscall_trace. */
Greg Kroah-Hartman
maintainerPATCH 10/74 mips/kvm: fix ioctl error handling
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael S. Tsirkin <[email protected]>
commit 0178fd7dcc4451fcb90bec5e91226586962478d2 upstream.
Returning directly whatever copy_to_user(...) or copy_from_user(...) returns may not do the right thing if there's a pagefault:
copy_to_user/copy_from_user return the number of bytes not copied in this case, but ioctls need to return -EFAULT instead.
Fix up kvm on mips to do
return copy_to_user(...)) ? -EFAULT : 0; and return copy_from_user(...)) ? -EFAULT : 0;
everywhere.
--- arch/mips/kvm/mips.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/mips/kvm/mips.c +2 -2
@@ -702,7 +702,7 @@ static int kvm_mips_get_reg(struct kvm_v }else if ((reg->id &KVM_REG_SIZE_MASK ) ==KVM_REG_SIZE_U128 ) {void __user *uaddr = (void __user *)(long )reg->addr; -return copy_to_user (uaddr, vs,16 ); +return copy_to_user (uaddr, vs,16 ) ? -EFAULT :0 ; }else {return -EINVAL ; }
@@ -732,7 +732,7 @@ static int kvm_mips_set_reg(struct kvm_v }else if ((reg->id &KVM_REG_SIZE_MASK ) ==KVM_REG_SIZE_U128 ) {void __user *uaddr = (void __user *)(long )reg->addr; -return copy_from_user (vs, uaddr,16 ); +return copy_from_user (vs, uaddr,16 ) ? -EFAULT :0 ; }else {return -EINVAL ; }
Greg Kroah-Hartman
maintainerPATCH 11/74 kvm: x86: Update tsc multiplier on change.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Owen Hofmann <[email protected]>
commit 2680d6da455b636dd006636780c0f235c6561d70 upstream.
vmx.c writes the TSC_MULTIPLIER field in vmx_vcpu_load, but only when a vcpu has migrated physical cpus. Record the last value written and update in vmx_vcpu_load on any change, otherwise a cpu migration must occur for TSC frequency scaling to take effect.
--- arch/x86/kvm/vmx.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
arch/x86/kvm/vmx.c +9 -5
@@ -595,6 +595,8 @@ struct vcpu_vmx {/* Support for PML */ #define PML_ENTITY_NUM 512struct page *pml_pg; + +u64 current_tsc_ratio; };enum segment_cache_field {
@@ -2062,14 +2064,16 @@ static void vmx_vcpu_load(struct kvm_vcprdmsrl (MSR_IA32_SYSENTER_ESP , sysenter_esp);vmcs_writel (HOST_IA32_SYSENTER_ESP , sysenter_esp);/* 22.2.3 */ -/* Setup TSC multiplier */ -if (cpu_has_vmx_tsc_scaling ()) -vmcs_write64 (TSC_MULTIPLIER , - vcpu->arch.tsc_scaling_ratio); - vmx->loaded_vmcs->cpu = cpu; } +/* Setup TSC multiplier */ +if (kvm_has_tsc_control && + vmx->current_tsc_ratio != vcpu->arch.tsc_scaling_ratio) { + vmx->current_tsc_ratio = vcpu->arch.tsc_scaling_ratio; +vmcs_write64 (TSC_MULTIPLIER , vmx->current_tsc_ratio); + } +vmx_vcpu_pi_load (vcpu, cpu); }
Greg Kroah-Hartman
maintainerPATCH 12/74 fbcon: set a default value to blink interval
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jean-Philippe Brucker <[email protected]>
commit a1e533ec07d583d01349ef13c0c965b8633e1b91 upstream.
Since commit 27a4c827c34ac4256a190cc9d24607f953c1c459
fbcon: use the cursor blink interval provided by vt
two attempts have been made at fixing a possible hang caused by cursor_timer_handler. That function registers a timer to be triggered at "jiffies + fbcon_ops.cur_blink_jiffies".
A new case had been encountered during initialisation of clcd-pl11x:
fbcon_fb_registered
do_fbcon_takeover
-> do_register_con_driver
fbcon_startup
(A) add_cursor_timer (with cur_blink_jiffies = 0)
-> do_bind_con_driver
visual_init
fbcon_init
(B) cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);If we take an softirq anywhere between A and B (and we do), cursor_timer_handler executes indefinitely.
Instead of patching all possible paths that lead to this case one at a time, fix the issue at the source and initialise cur_blink_jiffies to 200ms when allocating fbcon_ops. This was its default value before aforesaid commit. fbcon_cursor or fbcon_init will refine this value downstream.
--- drivers/video/console/fbcon.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/video/console/fbcon.c +2 -0
@@ -709,6 +709,7 @@ static int con2fb_acquire_newinfo(struct }if (!err) { + ops->cur_blink_jiffies =HZ /5 ; info->fbcon_par = ops;if (vc)
@@ -956,6 +957,7 @@ static const char *fbcon_startup(void) ops->currcon =-1 ; ops->graphics =1 ; ops->cur_rotate =-1 ; + ops->cur_blink_jiffies =HZ /5 ; info->fbcon_par = ops; p->con_rotate = initial_rotation;set_blitting_type (vc, info);
Greg Kroah-Hartman
maintainerPATCH 13/74 cifs: fix out-of-bounds access in lease parsing
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Maggard <[email protected]>
commit deb7deff2f00bdbbcb3d560dad2a89ef37df837d upstream.
When opening a file, SMB2_open() attempts to parse the lease state from the SMB2 CREATE Response. However, the parsing code was not careful to ensure that the create contexts are not empty or invalid, which can lead to out- of-bounds memory access. This can be seen easily by trying
to read a file from a OSX 10.11 SMB3 server. Here is sample crash output:
BUG: unable to handle kernel paging request at ffff8800a1a77cc6 IP: [<ffffffff8828a734>] SMB2_open+0x804/0x960 PGD 8f77067 PUD 0 Oops: 0000 [#1] SMP Modules linked in: CPU: 3 PID: 2876 Comm: cp Not tainted 4.5.0-rc3.x86_64.1+ #14 Hardware name: NETGEAR ReadyNAS 314 /ReadyNAS 314 , BIOS 4.6.5 10/11/2012 task: ffff880073cdc080 ti: ffff88005b31c000 task.ti: ffff88005b31c000 RIP: 0010:[<ffffffff8828a734>] [<ffffffff8828a734>] SMB2_open+0x804/0x960 RSP: 0018:ffff88005b31fa08 EFLAGS: 00010282 RAX: 0000000000000015 RBX: 0000000000000000 RCX: 0000000000000006 RDX: 0000000000000000 RSI: 0000000000000246 RDI: ffff88007eb8c8b0 RBP: ffff88005b31fad8 R08: 666666203d206363 R09: 6131613030383866 R10: 3030383866666666 R11: 00000000000002b0 R12: ffff8800660fd800 R13: ffff8800a1a77cc2 R14: 00000000424d53fe R15: ffff88005f5a28c0 FS: 00007f7c8a2897c0(0000) GS:ffff88007eb80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: ffff8800a1a77cc6 CR3: 000000005b281000 CR4: 00000000000006e0 Stack: ffff88005b31fa70 ffffffff88278789 00000000000001d3 ffff88005f5a2a80 ffffffff00000003 ffff88005d029d00 ffff88006fde05a0 0000000000000000 ffff88005b31fc78 ffff88006fde0780 ffff88005b31fb2f 0000000100000fe0 Call Trace: [<ffffffff88278789>] ? cifsConvertToUTF16+0x159/0x2d0 [<ffffffff8828cf68>] smb2_open_file+0x98/0x210 [<ffffffff8811e80c>] ? __kmalloc+0x1c/0xe0 [<ffffffff882685f4>] cifs_open+0x2a4/0x720 [<ffffffff88122cef>] do_dentry_open+0x1ff/0x310 [<ffffffff88268350>] ? cifsFileInfo_get+0x30/0x30 [<ffffffff88123d92>] vfs_open+0x52/0x60 [<ffffffff88131dd0>] path_openat+0x170/0xf70 [<ffffffff88097d48>] ? remove_wait_queue+0x48/0x50 [<ffffffff88133a29>] do_filp_open+0x79/0xd0 [<ffffffff8813f2ca>] ? __alloc_fd+0x3a/0x170 [<ffffffff881240c4>] do_sys_open+0x114/0x1e0 [<ffffffff881241a9>] SyS_open+0x19/0x20 [<ffffffff8896e257>] entry_SYSCALL_64_fastpath+0x12/0x6a Code: 4d 8d 6c 07 04 31 c0 4c 89 ee e8 47 6f e5 ff 31 c9 41 89 ce 44 89 f1 48 c7 c7 28 b1 bd 88 31 c0 49 01 cd 4c 89 ee e8 2b 6f e5 ff <45> 0f b7 75 04 48 c7 c7 31 b1 bd 88 31 c0 4d 01 ee 4c 89 f6 e8 RIP [<ffffffff8828a734>] SMB2_open+0x804/0x960 RSP <ffff88005b31fa08> CR2: ffff8800a1a77cc6 ---[ end trace d9f69ba64feee469 ]---
--- fs/cifs/smb2pdu.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)
fs/cifs/smb2pdu.c +14 -10
@@ -1109,21 +1109,25 @@ parse_lease_state(struct TCP_Server_Info {char *data_offset;struct create_context *cc; -unsigned int next =0 ; +unsigned int next; +unsigned int remaining;char *name; data_offset = (char *)rsp +4 +le32_to_cpu (rsp->CreateContextsOffset); + remaining =le32_to_cpu (rsp->CreateContextsLength); cc = (struct create_context *)data_offset; -do { - cc = (struct create_context *)((char *)cc + next); +while (remaining >=sizeof (struct create_context )) { name =le16_to_cpu (cc->NameOffset) + (char *)cc; -if (le16_to_cpu (cc->NameLength) !=4 || -strncmp (name,"RqLs" ,4 )) { - next =le32_to_cpu (cc->Next); -continue ; - } -return server->ops->parse_lease_buf (cc, epoch); - }while (next !=0 ); +if (le16_to_cpu (cc->NameLength) ==4 && +strncmp (name,"RqLs" ,4 ) ==0 ) +return server->ops->parse_lease_buf (cc, epoch); + + next =le32_to_cpu (cc->Next); +if (!next) +break ; + remaining -= next; + cc = (struct create_context *)((char *)cc + next); + }return 0 ; }
Re: [PATCH 4.4 13/74] cifs: fix out-of-bounds access in lease parsing
Quoted 77 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Maggard <[email protected]>
commit
deb7deff2f00bdbbcb3d560dad2a89ef37df837dupstream.When opening a file,
SMB2_open()attempts to parse the lease state from the SMB2 CREATE Response. However, the parsing code was not careful to ensure that the create contexts are not empty or invalid, which can lead to out- of-bounds memory access. This can be seen easily by trying
to read a file from a OSX 10.11 SMB3 server. Here is sample crash output:BUG: unable to handle kernel paging request at ffff8800a1a77cc6 IP: [] SMB2_open+0x804/0x960 PGD 8f77067 PUD 0 Oops: 0000 [#1] SMP Modules linked in: CPU: 3 PID: 2876 Comm: cp Not tainted 4.5.0-rc3.x86_64.1+ #14 Hardware name: NETGEAR ReadyNAS 314 /ReadyNAS 314 , BIOS 4.6.5 10/11/2012 task: ffff880073cdc080 ti: ffff88005b31c000 task.ti: ffff88005b31c000 RIP: 0010:[] [] SMB2_open+0x804/0x960RSP: 0018:ffff88005b31fa08 EFLAGS: 00010282
RAX: 0000000000000015 RBX: 0000000000000000 RCX: 0000000000000006
RDX: 0000000000000000 RSI: 0000000000000246 RDI:ffff88007eb8c8b0
RBP:ffff88005b31fad8R08:666666203d206363R09: 6131613030383866
R10: 3030383866666666 R11:00000000000002b0R12:ffff8800660fd800
R13:ffff8800a1a77cc2R14:00000000424d53feR15:ffff88005f5a28c0FS: 00007f7c8a2897c0(0000) GS:ffff88007eb80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0:000000008005003b
CR2:ffff8800a1a77cc6CR3:000000005b281000CR4:00000000000006e0Stack: ffff88005b31fa70 ffffffff88278789 00000000000001d3 ffff88005f5a2a80 ffffffff00000003 ffff88005d029d00 ffff88006fde05a0 0000000000000000 ffff88005b31fc78 ffff88006fde0780 ffff88005b31fb2f 0000000100000fe0 Call Trace: [] ? cifsConvertToUTF16+0x159/0x2d0 [] smb2_open_file+0x98/0x210 [] ? __kmalloc+0x1c/0xe0 [] cifs_open+0x2a4/0x720 [] do_dentry_open+0x1ff/0x310 [] ? cifsFileInfo_get+0x30/0x30 [] vfs_open+0x52/0x60 [] path_openat+0x170/0xf70 [] ? remove_wait_queue+0x48/0x50 [] do_filp_open+0x79/0xd0 [] ? __alloc_fd+0x3a/0x170 [] do_sys_open+0x114/0x1e0 [] SyS_open+0x19/0x20 [] entry_SYSCALL_64_fastpath+0x12/0x6a Code: 4d 8d 6c 07 04 31 c0 4c 89 ee e8 47 6f e5 ff 31 c9 41 89 ce 44 89 f1 48 c7 c7 28 b1 bd 88 31 c0 49 01 cd 4c 89 ee e8 2b 6f e5 ff <45> 0f b7 75 04 48 c7 c7 31 b1 bd 88 31 c0 4d 01 ee 4c 89 f6 e8 RIP [] SMB2_open+0x804/0x960 RSP CR2: ffff8800a1a77cc6 ---[ end trace d9f69ba64feee469 ]---Signed-off-by Justin Maggard <[email protected]>Signed-off-by Steve French <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>---
fs/cifs/smb2pdu.c | 24 ++++++++++++++----------1 file changed, 14 insertions(+), 10 deletions(-)fs/cifs/smb2pdu.c +2
-1@@ -1109,21 +1109,25 @@ parse_lease_state(struct TCP_Server_Info { char *data_offset; struct create_context *cc; -unsigned int next =0 ; +unsigned int next; +unsigned int remaining; char *name;
data_offset= (char *)rsp + 4 +le32_to_cpu(rsp->CreateContextsOffset);
fs/cifs/smb2pdu.c parse_lease_state(struct TCP_Server_Info · line 1117
Quoted 1 line
fs/cifs/smb2pdu.c +1
-0+ remaining =le32_to_cpu (rsp->CreateContextsLength);
What if remaining is > the response length?
Quoted 10 lines
cc = (struct
create_context*)data_offset;fs/cifs/smb2pdu.c +1
-2- do { - cc = (struct create_context *)((char *)cc + next); +while (remaining >=sizeof (struct create_context )) {name =
le16_to_cpu(cc->NameOffset)+ (char *)cc;fs/cifs/smb2pdu.c +0
-5-if (le16_to_cpu (cc->NameLength) !=4 || - strncmp(name, "RqLs", 4)) { - next =le32_to_cpu (cc->Next); -continue ; - }
fs/cifs/smb2pdu.c parse_lease_state(struct TCP_Server_Info · line 1128
Quoted 10 lines
fs/cifs/smb2pdu.c +8
-2-return server->ops->parse_lease_buf (cc, epoch); - }while (next !=0 ); +if (le16_to_cpu (cc->NameLength) ==4 && + strncmp(name, "RqLs", 4) == 0) +return server->ops->parse_lease_buf (cc, epoch); + + next =le32_to_cpu (cc->Next); +if (!next) +break ; + remaining -= next;
What if next > remaining?
This change seems to be only scratching the surface of the security failure here.
Ben.
Quoted 5 lines
fs/cifs/smb2pdu.c +2
-0+ cc = (struct create_context *)((char *)cc + next); + }
return 0;
}
Signature · 2 lines
Ben Hutchings When in doubt, use brute force. - Ken Thompson
Re: [PATCH 4.4 13/74] cifs: fix out-of-bounds access in lease parsing
Quoted 77 lines · Ben Hutchings
Quoted 76 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Maggard <[email protected]>
commit
deb7deff2f00bdbbcb3d560dad2a89ef37df837dupstream.When opening a file,
SMB2_open()attempts to parse the lease state from the SMB2 CREATE Response. However, the parsing code was not careful to ensure that the create contexts are not empty or invalid, which can lead to out- of-bounds memory access. This can be seen easily by trying
to read a file from a OSX 10.11 SMB3 server. Here is sample crash output:BUG: unable to handle kernel paging request at ffff8800a1a77cc6 IP: [] SMB2_open+0x804/0x960 PGD 8f77067 PUD 0 Oops: 0000 [#1] SMP Modules linked in: CPU: 3 PID: 2876 Comm: cp Not tainted 4.5.0-rc3.x86_64.1+ #14 Hardware name: NETGEAR ReadyNAS 314 /ReadyNAS 314 , BIOS 4.6.5 10/11/2012 task: ffff880073cdc080 ti: ffff88005b31c000 task.ti: ffff88005b31c000 RIP: 0010:[] [] SMB2_open+0x804/0x960 RSP: 0018:ffff88005b31fa08 EFLAGS: 00010282 RAX: 0000000000000015 RBX: 0000000000000000 RCX: 0000000000000006 RDX: 0000000000000000 RSI: 0000000000000246 RDI: ffff88007eb8c8b0 RBP: ffff88005b31fad8 R08: 666666203d206363 R09: 6131613030383866 R10: 3030383866666666 R11: 00000000000002b0 R12: ffff8800660fd800 R13: ffff8800a1a77cc2 R14: 00000000424d53fe R15: ffff88005f5a28c0 FS: 00007f7c8a2897c0(0000) GS:ffff88007eb80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: ffff8800a1a77cc6 CR3: 000000005b281000 CR4: 00000000000006e0 Stack: ffff88005b31fa70 ffffffff88278789 00000000000001d3 ffff88005f5a2a80 ffffffff00000003 ffff88005d029d00 ffff88006fde05a0 0000000000000000 ffff88005b31fc78 ffff88006fde0780 ffff88005b31fb2f 0000000100000fe0 Call Trace: [] ? cifsConvertToUTF16+0x159/0x2d0 [] smb2_open_file+0x98/0x210 [] ? __kmalloc+0x1c/0xe0 [] cifs_open+0x2a4/0x720 [] do_dentry_open+0x1ff/0x310 [] ? cifsFileInfo_get+0x30/0x30 [] vfs_open+0x52/0x60 [] path_openat+0x170/0xf70 [] ? remove_wait_queue+0x48/0x50 [] do_filp_open+0x79/0xd0 [] ? __alloc_fd+0x3a/0x170 [] do_sys_open+0x114/0x1e0 [] SyS_open+0x19/0x20 [] entry_SYSCALL_64_fastpath+0x12/0x6a Code: 4d 8d 6c 07 04 31 c0 4c 89 ee e8 47 6f e5 ff 31 c9 41 89 ce 44 89 f1 48 c7 c7 28 b1 bd 88 31 c0 49 01 cd 4c 89 ee e8 2b 6f e5 ff <45> 0f b7 75 04 48 c7 c7 31 b1 bd 88 31 c0 4d 01 ee 4c 89 f6 e8 RIP [] SMB2_open+0x804/0x960 RSP CR2: ffff8800a1a77cc6 ---[ end trace d9f69ba64feee469 ]---Signed-off-by Justin Maggard <[email protected]>Signed-off-by Steve French <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- fs/cifs/smb2pdu.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)fs/cifs/smb2pdu.c +2
-1@@ -1109,21 +1109,25 @@ parse_lease_state(struct TCP_Server_Info {char *data_offset;struct create_context *cc; -unsigned int next =0 ; +unsigned int next; +unsigned int remaining;char *name;
Quoted 4 lines
fs/cifs/smb2pdu.c parse_lease_state(struct TCP_Server_Info · line 1117
Quoted 2 lines
fs/cifs/smb2pdu.c +1
-0data_offset = (char *)rsp +4 +le32_to_cpu (rsp->CreateContextsOffset); + remaining =le32_to_cpu (rsp->CreateContextsLength);What if remaining is > the response length?
Do you want to do the followon patch to check for that, or do you want me to write up a small patch for that?
Quoted 37 lines
Quoted 10 lines
fs/cifs/smb2pdu.c +1
-7cc = (struct create_context *)data_offset; - do { - cc = (struct create_context *)((char *)cc + next); +while (remaining >=sizeof (struct create_context )) { name =le16_to_cpu (cc->NameOffset) + (char *)cc; - if (le16_to_cpu(cc->NameLength) != 4 || - strncmp(name, "RqLs", 4)) { - next = le32_to_cpu(cc->Next); - continue; - }fs/cifs/smb2pdu.c parse_lease_state(struct TCP_Server_Info · line 1128
Quoted 10 lines
fs/cifs/smb2pdu.c +8
-2-return server->ops->parse_lease_buf (cc, epoch); - }while (next !=0 ); +if (le16_to_cpu (cc->NameLength) ==4 && +strncmp (name,"RqLs" ,4 ) ==0 ) +return server->ops->parse_lease_buf (cc, epoch); + + next =le32_to_cpu (cc->Next); +if (!next) +break ; + remaining -= next;What if next > remaining?
This change seems to be only scratching the surface of the security failure here.
Ben.
fs/cifs/smb2pdu.c parse_lease_state(struct TCP_Server_Info · line 1133
Quoted 5 lines
fs/cifs/smb2pdu.c +2
-0+ cc = (struct create_context *)((char *)cc + next); + }return 0 ; }--
Ben Hutchings
When in doubt, use brute force. - Ken Thompson
Signature · 3 lines
Thanks, Steve
Re: [PATCH 4.4 13/74] cifs: fix out-of-bounds access in lease parsing
Quoted 17 lines · Steve French
Quoted 16 lines · Ben Hutchings
Quoted 14 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Maggard <[email protected]>
commit
deb7deff2f00bdbbcb3d560dad2a89ef37df837dupstream.When opening a file,
SMB2_open()attempts to parse the lease state from the SMB2 CREATE Response. However, the parsing code was not careful to ensure that the create contexts are not empty or invalid, which can lead to out- of-bounds memory access. This can be seen easily by trying
to read a file from a OSX 10.11 SMB3 server. Here is sample crash output:
[...]
Quoted 11 lines
Quoted 11 lines
Quoted 11 lines
fs/cifs/smb2pdu.c +2
-1@@ -1109,21 +1109,25 @@ parse_lease_state(struct TCP_Server_Info { char *data_offset; struct create_context *cc; - unsigned int next = 0; + unsigned int next; + unsigned int remaining; char *name;
Quoted 5 lines
Quoted 3 lines
fs/cifs/smb2pdu.c parse_lease_state(struct TCP_Server_Info · line 1117
Quoted 2 lines
fs/cifs/smb2pdu.c +1
-0data_offset = (char *)rsp + 4 + le32_to_cpu(rsp->CreateContextsOffset); + remaining = le32_to_cpu(rsp->CreateContextsLength);What if remaining is > the response length?
Do you want to do the followon patch to check for that, or do you want me to write up a small patch for that?
[...]
I'm not likely to find time to dig into cifs, so please do work on the complete fix.
Ben.
Signature · 2 lines
Ben Hutchings When in doubt, use brute force. - Ken Thompson
Greg Kroah-Hartman
maintainerPATCH 14/74 CIFS: Fix SMB2+ interim response processing for read requests
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pavel Shilovsky <[email protected]>
commit 6cc3b24235929b54acd5ecc987ef11a425bd209e upstream.
For interim responses we only need to parse a header and update a number credits. Now it is done for all SMB2+ command except SMB2_READ which is wrong. Fix this by adding such processing.
--- fs/cifs/cifssmb.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
fs/cifs/cifssmb.c +18 -3
@@ -1396,11 +1396,10 @@ openRetry:* current bigbuf. */ static int -cifs_readv_discard (struct TCP_Server_Info *server,struct mid_q_entry *mid) +discard_remaining_data (struct TCP_Server_Info *server) {unsigned int rfclen =get_rfc1002_length (server->smallbuf);int remaining = rfclen +4 - server->total_read; -struct cifs_readdata *rdata = mid->callback_data;while (remaining >0 ) {int length;
@@ -1414,10 +1413,20 @@ cifs_readv_discard(struct TCP_Server_Inf remaining -= length; } -dequeue_mid (mid, rdata->result);return 0 ; } +static int +cifs_readv_discard (struct TCP_Server_Info *server,struct mid_q_entry *mid) +{ +int length; +struct cifs_readdata *rdata = mid->callback_data; + + length =discard_remaining_data (server); +dequeue_mid (mid, rdata->result); +return length; +} +int cifs_readv_receive (struct TCP_Server_Info *server,struct mid_q_entry *mid) {
@@ -1446,6 +1455,12 @@ cifs_readv_receive(struct TCP_Server_Infreturn length; server->total_read += length; +if (server->ops->is_status_pending && + server->ops->is_status_pending (buf, server,0 )) { +discard_remaining_data (server); +return -1 ; + } +/* Was the SMB read successful? */ rdata->result = server->ops->map_error (buf, false);if (rdata->result !=0 ) {
Greg Kroah-Hartman
maintainerPATCH 15/74 Fix cifs_uniqueid_to_ino_t() function for s390x
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yadan Fan <[email protected]>
commit 1ee9f4bd1a97026a7b2d7ae9f1f74b45680d0003 upstream.
This issue is caused by commit 02323db17e3a7 ("cifs: fix cifs_uniqueid_to_ino_t not to ever return 0"), when BITS_PER_LONG is 64 on s390x, the corresponding cifs_uniqueid_to_ino_t() function will cast 64-bit fileid to 32-bit by using (ino_t)fileid, because ino_t (typdefed __kernel_ino_t) is int type.
It's defined in arch/s390/include/uapi/asm/posix_types.h
#ifndef __s390x__
typedef unsigned long __kernel_ino_t;
...
#else /* __s390x__ */
typedef unsigned int __kernel_ino_t;So the #ifdef condition is wrong for s390x, we can just still use one cifs_uniqueid_to_ino_t() function with comparing sizeof(ino_t) and sizeof(u64) to choose the correct execution accordingly.
--- fs/cifs/cifsfs.h | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
fs/cifs/cifsfs.h +4 -8
@@ -31,19 +31,15 @@* so that it will fit. We use hash_64 to convert the value to 31 bits, and * then add 1, to ensure that we don't end up with a 0 as the value. */ -#if BITS_PER_LONG ==64 static inline ino_t cifs_uniqueid_to_ino_t (u64 fileid) { +if ((sizeof (ino_t)) < (sizeof (u64))) +return (ino_t )hash_64 (fileid, (sizeof (ino_t) *8 ) -1 ) +1 ; +return (ino_t )fileid; + } -#else -static inline ino_t -cifs_uniqueid_to_ino_t (u64 fileid) -{ -return (ino_t )hash_64 (fileid, (sizeof (ino_t) *8 ) -1 ) +1 ; -} -#endif extern struct file_system_type cifs_fs_type;extern const struct address_space_operations cifs_addr_ops;
Greg Kroah-Hartman
maintainerPATCH 16/74 vfio: fix ioctl error handling
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael S. Tsirkin <[email protected]>
commit 8160c4e455820d5008a1116d2dca35f0363bb062 upstream.
Calling return copy_to_user(...) in an ioctl will not do the right thing if there's a pagefault:copy_to_user returns the number of bytes not copied in this case.
Fix up vfio to do
return copy_to_user(...)) ? -EFAULT : 0;
everywhere.
--- drivers/vfio/pci/vfio_pci.c | 9 ++++++--- drivers/vfio/platform/vfio_platform_common.c | 9 ++++++--- drivers/vfio/vfio_iommu_type1.c | 6 ++++-- 3 files changed, 16 insertions(+), 8 deletions(-)
drivers/vfio/pci/vfio_pci.c +6 -3
@@ -446,7 +446,8 @@ static long vfio_pci_ioctl(void *device_ info.num_regions =VFIO_PCI_NUM_REGIONS ; info.num_irqs =VFIO_PCI_NUM_IRQS ; -return copy_to_user ((void __user *)arg, &info, minsz); +return copy_to_user ((void __user *)arg, &info, minsz) ? + -EFAULT :0 ; }else if (cmd ==VFIO_DEVICE_GET_REGION_INFO ) {struct pci_dev *pdev = vdev->pdev;
@@ -520,7 +521,8 @@ static long vfio_pci_ioctl(void *device_return -EINVAL ; } -return copy_to_user ((void __user *)arg, &info, minsz); +return copy_to_user ((void __user *)arg, &info, minsz) ? + -EFAULT :0 ; }else if (cmd ==VFIO_DEVICE_GET_IRQ_INFO ) {struct vfio_irq_info info;
@@ -555,7 +557,8 @@ static long vfio_pci_ioctl(void *device_else info.flags |=VFIO_IRQ_INFO_NORESIZE ; -return copy_to_user ((void __user *)arg, &info, minsz); +return copy_to_user ((void __user *)arg, &info, minsz) ? + -EFAULT :0 ; }else if (cmd ==VFIO_DEVICE_SET_IRQS ) {struct vfio_irq_set hdr;
drivers/vfio/platform/vfio_platform_common.c +6 -3
@@ -219,7 +219,8 @@ static long vfio_platform_ioctl(void *de info.num_regions = vdev->num_regions; info.num_irqs = vdev->num_irqs; -return copy_to_user ((void __user *)arg, &info, minsz); +return copy_to_user ((void __user *)arg, &info, minsz) ? + -EFAULT :0 ; }else if (cmd ==VFIO_DEVICE_GET_REGION_INFO ) {struct vfio_region_info info;
@@ -240,7 +241,8 @@ static long vfio_platform_ioctl(void *de info.size = vdev->regions[info.index].size; info.flags = vdev->regions[info.index].flags; -return copy_to_user ((void __user *)arg, &info, minsz); +return copy_to_user ((void __user *)arg, &info, minsz) ? + -EFAULT :0 ; }else if (cmd ==VFIO_DEVICE_GET_IRQ_INFO ) {struct vfio_irq_info info;
@@ -259,7 +261,8 @@ static long vfio_platform_ioctl(void *de info.flags = vdev->irqs[info.index].flags; info.count = vdev->irqs[info.index].count; -return copy_to_user ((void __user *)arg, &info, minsz); +return copy_to_user ((void __user *)arg, &info, minsz) ? + -EFAULT :0 ; }else if (cmd ==VFIO_DEVICE_SET_IRQS ) {struct vfio_irq_set hdr;
drivers/vfio/vfio_iommu_type1.c +4 -2
@@ -999,7 +999,8 @@ static long vfio_iommu_type1_ioctl(void info.iova_pgsizes =vfio_pgsize_bitmap (iommu); -return copy_to_user ((void __user *)arg, &info, minsz); +return copy_to_user ((void __user *)arg, &info, minsz) ? + -EFAULT :0 ; }else if (cmd ==VFIO_IOMMU_MAP_DMA ) {struct vfio_iommu_type1_dma_map map;
@@ -1032,7 +1033,8 @@ static long vfio_iommu_type1_ioctl(voidif (ret)return ret; -return copy_to_user ((void __user *)arg, &unmap, minsz); +return copy_to_user ((void __user *)arg, &unmap, minsz) ? + -EFAULT :0 ; }return -ENOTTY ;
Greg Kroah-Hartman
maintainerPATCH 17/74 KVM: x86: fix root cause for missed hardware breakpoints
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
commit 70e4da7a8ff62f2775337b705f45c804bb450454 upstream.
Commit 172b2386ed16 ("KVM: x86: fix missed hardware breakpoints", 2016-02-10) worked around a case where the debug registers are not loaded correctly on preemption and on the first entry to KVM_RUN.
However, Xiao Guangrong pointed out that the root cause must be that KVM_DEBUGREG_BP_ENABLED is not being set correctly. This can indeed happen due to the lazy debug exit mechanism, which does not call kvm_update_dr7. Fix it by replacing the existing loop (more or less equivalent to kvm_update_dr0123) with calls to all the kvm_update_dr* functions.
--- arch/x86/kvm/x86.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
arch/x86/kvm/x86.c +4 -5
@@ -2736,7 +2736,6 @@ void kvm_arch_vcpu_load(struct kvm_vcpu }kvm_make_request (KVM_REQ_STEAL_UPDATE , vcpu); - vcpu->arch.switch_db_regs |=KVM_DEBUGREG_RELOAD ; }void kvm_arch_vcpu_put (struct kvm_vcpu *vcpu)
@@ -6545,12 +6544,12 @@ static int vcpu_enter_guest(struct kvm_v* KVM_DEBUGREG_WONT_EXIT again. */ if (unlikely (vcpu->arch.switch_db_regs &KVM_DEBUGREG_WONT_EXIT )) { -int i; -WARN_ON (vcpu->guest_debug &KVM_GUESTDBG_USE_HW_BP ); kvm_x86_ops->sync_dirty_debug_regs (vcpu); -for (i =0 ; i <KVM_NR_DB_REGS ; i++) - vcpu->arch.eff_db[i] = vcpu->arch.db[i]; +kvm_update_dr0123 (vcpu); +kvm_update_dr6 (vcpu); +kvm_update_dr7 (vcpu); + vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_RELOAD ; }/*
Greg Kroah-Hartman
maintainerPATCH 18/74 arm/arm64: KVM: Fix ioctl error handling
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael S. Tsirkin <[email protected]>
commit 4cad67fca3fc952d6f2ed9e799621f07666a560f upstream.
Calling return copy_to_user(...) in an ioctl will not do the right thing if there's a pagefault:copy_to_user returns the number of bytes not copied in this case.
Fix up kvm to do
return copy_to_user(...)) ? -EFAULT : 0;
everywhere.
--- arch/arm/kvm/guest.c | 2 +- arch/arm64/kvm/guest.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm/kvm/guest.c +1 -1
@@ -155,7 +155,7 @@ static int get_timer_reg(struct kvm_vcpuu64 val; val =kvm_arm_timer_get_reg (vcpu, reg->id); -return copy_to_user (uaddr, &val,KVM_REG_SIZE (reg->id)); +return copy_to_user (uaddr, &val,KVM_REG_SIZE (reg->id)) ? -EFAULT :0 ; }static unsigned long num_core_regs (void )
arch/arm64/kvm/guest.c +1 -1
@@ -186,7 +186,7 @@ static int get_timer_reg(struct kvm_vcpuu64 val; val =kvm_arm_timer_get_reg (vcpu, reg->id); -return copy_to_user (uaddr, &val,KVM_REG_SIZE (reg->id)); +return copy_to_user (uaddr, &val,KVM_REG_SIZE (reg->id)) ? -EFAULT :0 ; }/**
Greg Kroah-Hartman
maintainerPATCH 19/74 iommu/amd: Apply workaround for ATS write permission check
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jay Cornwall <[email protected]>
commit 358875fd52ab8f00f66328cbf1a1d2486f265829 upstream.
The AMD Family 15h Models 30h-3Fh (Kaveri) BIOS and Kernel Developer's Guide omitted part of the BIOS IOMMU L2 register setup specification. Without this setup the IOMMU L2 does not fully respect write permissions when handling an ATS translation request.
The IOMMU L2 will set PTE dirty bit when handling an ATS translation with write permission request, even when PTE RW bit is clear. This may occur by direct translation (which would cause a PPR) or by prefetch request from the ATC.
This is observed in practice when the IOMMU L2 modifies a PTE which maps a pagecache page. The ext4 filesystem driver BUGs when asked to writeback these (non-modified) pages.
Enable ATS write permission check in the Kaveri IOMMU L2 if BIOS has not.
--- drivers/iommu/amd_iommu_init.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
drivers/iommu/amd_iommu_init.c +29 -0
@@ -1016,6 +1016,34 @@ static void amd_iommu_erratum_746_workar }/* +* Family15h Model 30h-3fh (IOMMU Mishandles ATS Write Permission) +* Workaround: +* BIOS should enable ATS write permission check by setting +* L2_DEBUG_3[AtsIgnoreIWDis](D0F2xF4_x47[0]) = 1b +*/ +static void amd_iommu_ats_write_check_workaround (struct amd_iommu *iommu) +{ +u32 value; + +if ((boot_cpu_data.x86 !=0x15 ) || + (boot_cpu_data.x86_model <0x30 ) || + (boot_cpu_data.x86_model >0x3f )) +return ; + +/* Test L2_DEBUG_3[AtsIgnoreIWDis] == 1 */ + value =iommu_read_l2 (iommu,0x47 ); + +if (value &BIT (0 )) +return ; + +/* Set L2_DEBUG_3[AtsIgnoreIWDis] = 1 */ +iommu_write_l2 (iommu,0x47 , value |BIT (0 )); + +pr_info ("AMD-Vi: Applying ATS write check workaround for IOMMU at %s\n" , +dev_name (&iommu->dev->dev)); +} + +/* * This function clues the initialization function for one IOMMU * together and also allocates the command buffer and programs the * hardware. It does NOT enable the IOMMU. This is done afterwards.
@@ -1284,6 +1312,7 @@ static int iommu_init_pci(struct amd_iom }amd_iommu_erratum_746_workaround (iommu); +amd_iommu_ats_write_check_workaround (iommu); iommu->iommu_dev = iommu_device_create(&iommu->dev->dev, iommu, amd_iommu_groups, "ivhd%d",
Greg Kroah-Hartman
maintainerPATCH 20/74 iommu/amd: Fix boot warning when device 00:00.0 is not iommu covered
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suravee Suthikulpanit <[email protected]>
commit 38e45d02ea9f194b89d6bf41e52ccafc8e2c2b47 upstream.
The setup code for the performance counters in the AMD IOMMU driver tests whether the counters can be written. It tests to setup a counter for device 00:00.0, which fails on systems where this particular device is not covered by the IOMMU.
Fix this by not relying on device 00:00.0 but only on the IOMMU being present.
--- drivers/iommu/amd_iommu_init.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-)
drivers/iommu/amd_iommu_init.c +22 -12
@@ -228,6 +228,10 @@ static int amd_iommu_enable_interrupts(vstatic int __init iommu_go_to_state (enum iommu_init_state state);static void init_device_table_dma (void ); +static int iommu_pc_get_set_reg_val (struct amd_iommu *iommu, +u8 bank,u8 cntr,u8 fxn, +u64 *value,bool is_write); +static inline void update_last_devid (u16 devid) {if (devid > amd_iommu_last_bdf)
@@ -1170,8 +1174,8 @@ static void init_iommu_perf_ctr(struct a amd_iommu_pc_present = true;/* Check if the performance counters can be written to */ -if ((0 !=amd_iommu_pc_get_set_reg_val (0 ,0 ,0 ,0 , &val, true)) || - (0 !=amd_iommu_pc_get_set_reg_val (0 ,0 ,0 ,0 , &val2, false)) || +if ((0 !=iommu_pc_get_set_reg_val (iommu,0 ,0 ,0 , &val, true)) || + (0 !=iommu_pc_get_set_reg_val (iommu,0 ,0 ,0 , &val2, false)) || (val != val2)) {pr_err ("AMD-Vi: Unable to write to IOMMU perf counter.\n" ); amd_iommu_pc_present = false;
@@ -2312,22 +2316,15 @@ u8 amd_iommu_pc_get_max_counters(u16 dev }EXPORT_SYMBOL (amd_iommu_pc_get_max_counters); -int amd_iommu_pc_get_set_reg_val (u16 devid,u8 bank,u8 cntr,u8 fxn, +static int iommu_pc_get_set_reg_val (struct amd_iommu *iommu, +u8 bank,u8 cntr,u8 fxn,u64 *value,bool is_write) { -struct amd_iommu *iommu;u32 offset;u32 max_offset_lim; -/* Make sure the IOMMU PC resource is available */ -if (!amd_iommu_pc_present) -return -ENODEV ; - -/* Locate the iommu associated with the device ID */ - iommu = amd_iommu_rlookup_table[devid]; -/* Check for valid iommu and pc register indexing */ -if (WARN_ON ((iommu ==NULL ) || (fxn >0x28 ) || (fxn &7 ))) +if (WARN_ON ((fxn >0x28 ) || (fxn &7 )))return -ENODEV ; offset = (u32)(((0x40 |bank) <<12 ) | (cntr <<8 ) | fxn);
@@ -2351,3 +2348,16 @@ int amd_iommu_pc_get_set_reg_val(u16 devreturn 0 ; }EXPORT_SYMBOL (amd_iommu_pc_get_set_reg_val); + +int amd_iommu_pc_get_set_reg_val (u16 devid,u8 bank,u8 cntr,u8 fxn, +u64 *value,bool is_write) +{ +struct amd_iommu *iommu = amd_iommu_rlookup_table[devid]; + +/* Make sure the IOMMU PC resource is available */ +if (!amd_iommu_pc_present || iommu ==NULL ) +return -ENODEV ; + +return iommu_pc_get_set_reg_val (iommu, bank, cntr, fxn, + value, is_write); +}
Greg Kroah-Hartman
maintainerPATCH 21/74 iommu/vt-d: Use BUS_NOTIFY_REMOVED_DEVICE in hotplug path
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joerg Roedel <[email protected]>
commit e6a8c9b337eed56eb481e1b4dd2180c25a1e5310 upstream.
In the PCI hotplug path of the Intel IOMMU driver, replace the usage of the BUS_NOTIFY_DEL_DEVICE notifier, which is executed before the driver is unbound from the device, with BUS_NOTIFY_REMOVED_DEVICE, which runs after that.
This fixes a kernel BUG being triggered in the VT-d code when the device driver tries to unmap DMA buffers and the VT-d driver already destroyed all mappings.
--- drivers/iommu/dmar.c | 5 +++-- drivers/iommu/intel-iommu.c | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/iommu/dmar.c +3 -2
@@ -329,7 +329,8 @@ static int dmar_pci_bus_notifier(struct/* Only care about add/remove events for physical functions */ if (pdev->is_virtfn)return NOTIFY_DONE ; -if (action !=BUS_NOTIFY_ADD_DEVICE && action !=BUS_NOTIFY_DEL_DEVICE ) +if (action !=BUS_NOTIFY_ADD_DEVICE && + action !=BUS_NOTIFY_REMOVED_DEVICE )return NOTIFY_DONE ; info =dmar_alloc_pci_notify_info (pdev, action);
@@ -339,7 +340,7 @@ static int dmar_pci_bus_notifier(structdown_write (&dmar_global_lock);if (action ==BUS_NOTIFY_ADD_DEVICE )dmar_pci_bus_add_dev (info); -else if (action ==BUS_NOTIFY_DEL_DEVICE ) +else if (action ==BUS_NOTIFY_REMOVED_DEVICE )dmar_pci_bus_del_dev (info);up_write (&dmar_global_lock);
drivers/iommu/intel-iommu.c +2 -2
@@ -4367,7 +4367,7 @@ int dmar_iommu_notify_scope_dev(struct d rmrru->devices_cnt);if (ret <0 )return ret; - }else if (info->event ==BUS_NOTIFY_DEL_DEVICE ) { + }else if (info->event ==BUS_NOTIFY_REMOVED_DEVICE ) {dmar_remove_dev_scope (info, rmrr->segment, rmrru->devices, rmrru->devices_cnt); }
@@ -4387,7 +4387,7 @@ int dmar_iommu_notify_scope_dev(struct dbreak ; else if(ret < 0) return ret; - }else if (info->event ==BUS_NOTIFY_DEL_DEVICE ) { + }else if (info->event ==BUS_NOTIFY_REMOVED_DEVICE ) {if (dmar_remove_dev_scope (info, atsr->segment, atsru->devices, atsru->devices_cnt))break ;
Greg Kroah-Hartman
maintainerPATCH 22/74 target: Fix WRITE_SAME/DISCARD conversion to linux 512b sectors
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Christie <[email protected]>
commit 8a9ebe717a133ba7bc90b06047f43cc6b8bcb8b3 upstream.
In a couple places we are not converting to/from the Linux block layer 512 bytes sectors.
1.
The request queue values and what we do are a mismatch of things:
max_discard_sectors - This is in linux block layer 512 byte sectors. We are just copying this to max_unmap_lba_count.
discard_granularity - This is in bytes. We are converting it to Linux block layer 512 byte sectors.
discard_alignment - This is in bytes. We are just copying this over.
The problem is that the core LIO code exports these values in spc_emulate_evpd_b0 and we use them to test request arguments in sbc_execute_unmap, but we never convert to the block size we export to the initiator. If we are not using 512 byte sectors then we are exporting the wrong values or are checks are off. And, for the discard_alignment/bytes case we are just plain messed up.
2.
blkdev_issue_discard's start and number of sector arguments are supposed to be in linux block layer 512 byte sectors. We are currently passing in the values we get from the initiator which might be based on some other sector size.
There is a similar problem in iblock_execute_write_same where the bio functions want values in 512 byte sectors but we are passing in what we got from the initiator.
--- drivers/target/target_core_device.c | 43 ++++++++++++++++++++++++++ drivers/target/target_core_file.c | 29 +++++------------- drivers/target/target_core_iblock.c | 56 ++++++++--------------------------- include/target/target_core_backend.h | 3 + 4 files changed, 69 insertions(+), 62 deletions(-)
drivers/target/target_core_device.c +43 -0
@@ -826,6 +826,49 @@ struct se_device *target_alloc_device(streturn dev; } +/* +* Check if the underlying struct block_device request_queue supports +* the QUEUE_FLAG_DISCARD bit for UNMAP/WRITE_SAME in SCSI + TRIM +* in ATA and we need to set TPE=1 +*/ +bool target_configure_unmap_from_queue (struct se_dev_attrib *attrib, +struct request_queue *q,int block_size) +{ +if (!blk_queue_discard (q)) +return false; + + attrib->max_unmap_lba_count = (q->limits.max_discard_sectors <<9 ) / + block_size; +/* +* Currently hardcoded to 1 in Linux/SCSI code.. +*/ + attrib->max_unmap_block_desc_count =1 ; + attrib->unmap_granularity = q->limits.discard_granularity / block_size; + attrib->unmap_granularity_alignment = q->limits.discard_alignment / + block_size; +return true; +} +EXPORT_SYMBOL (target_configure_unmap_from_queue); + +/* +* Convert from blocksize advertised to the initiator to the 512 byte +* units unconditionally used by the Linux block layer. +*/ +sector_t target_to_linux_sector (struct se_device *dev,sector_t lb) +{ +switch (dev->dev_attrib.block_size) { +case 4096 : +return lb <<3 ; +case 2048 : +return lb <<2 ; +case 1024 : +return lb <<1 ; +default : +return lb; + } +} +EXPORT_SYMBOL (target_to_linux_sector); +int target_configure_device (struct se_device *dev) {struct se_hba *hba = dev->se_hba;
drivers/target/target_core_file.c +9 -20
@@ -160,25 +160,11 @@ static int fd_configure_device(struct se" block_device blocks: %llu logical_block_size: %d\n" , dev_size,div_u64 (dev_size, fd_dev->fd_block_size), fd_dev->fd_block_size); -/* -* Check if the underlying struct block_device request_queue supports -* the QUEUE_FLAG_DISCARD bit for UNMAP/WRITE_SAME in SCSI + TRIM -* in ATA and we need to set TPE=1 -*/ -if (blk_queue_discard (q)) { - dev->dev_attrib.max_unmap_lba_count = - q->limits.max_discard_sectors; -/* -* Currently hardcoded to 1 in Linux/SCSI code.. -*/ - dev->dev_attrib.max_unmap_block_desc_count =1 ; - dev->dev_attrib.unmap_granularity = - q->limits.discard_granularity >>9 ; - dev->dev_attrib.unmap_granularity_alignment = - q->limits.discard_alignment; + +if (target_configure_unmap_from_queue (&dev->dev_attrib, q, + fd_dev->fd_block_size))pr_debug ("IFILE: BLOCK Discard support available," -" disabled by default\n" ); - } +" disabled by default\n" );/* * Enable write same emulation for IBLOCK and use 0xFFFF as * the smaller WRITE_SAME(10) only has a two-byte block count.
@@ -490,9 +476,12 @@ fd_execute_unmap(struct se_cmd *cmd, secif (S_ISBLK (inode->i_mode)) {/* The backend is block device, use discard */ struct block_device *bdev = inode->i_bdev; +struct se_device *dev = cmd->se_dev; - ret =blkdev_issue_discard (bdev, lba, - nolb,GFP_KERNEL ,0 ); + ret =blkdev_issue_discard (bdev, +target_to_linux_sector (dev, lba), +target_to_linux_sector (dev, nolb), +GFP_KERNEL ,0 );if (ret <0 ) {pr_warn ("FILEIO: blkdev_issue_discard() failed: %d\n" , ret);
drivers/target/target_core_iblock.c +14 -42
94 lines not on this page · raw message
include/target/target_core_backend.h +3 -0
@@ -94,5 +94,8 @@ sense_reason_t passthrough_parse_cdb(str sense_reason_t (*exec_cmd)(struct se_cmd *cmd));bool target_sense_desc_format (struct se_device *dev); +sector_t target_to_linux_sector (struct se_device *dev,sector_t lb); +bool target_configure_unmap_from_queue (struct se_dev_attrib *attrib, +struct request_queue *q,int block_size);#endif /* TARGET_CORE_BACKEND_H */
Greg Kroah-Hartman
maintainerPATCH 23/74 drm/ast: Fix incorrect register check for DRAM width
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Timothy Pearson <[email protected]>
commit 2d02b8bdba322b527c5f5168ce1ca10c2d982a78 upstream.
During DRAM initialization on certain ASpeed devices, an incorrect bit (bit 10) was checked in the "SDRAM Bus Width Status" register to determine DRAM width.
Query bit 6 instead in accordance with the Aspeed AST2050 datasheet v1.05.
--- drivers/gpu/drm/ast/ast_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/ast/ast_main.c +1 -1
@@ -227,7 +227,7 @@ static int ast_get_dram_info(struct drm_ }while (ast_read32 (ast,0x10000 ) !=0x01 ); data =ast_read32 (ast,0x10004 ); -if (data &0x400 ) +if (data &0x40 ) ast->dram_bus_width =16 ;else ast->dram_bus_width =32 ;
Greg Kroah-Hartman
maintainerPATCH 28/74 drm/amdgpu: return from atombios_dp_get_dpcd only when error
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arindam Nath <[email protected]>
commit 0b39c531cfa12dad54eac238c2e303b994df1ef7 upstream.
In amdgpu_connector_hotplug(), we need to start DP link training only after we have received DPCD. The function amdgpu_atombios_dp_get_dpcd() returns non-zero value only when an error condition is met, otherwise returns zero. So in case the function encounters an error, we need to skip rest of the code and return from amdgpu_connector_hotplug() immediately. Only when we are successfull in reading DPCD pin, we should carry on with turning-on the monitor.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +1 -1
@@ -77,7 +77,7 @@ void amdgpu_connector_hotplug(struct drm }else if (amdgpu_atombios_dp_needs_link_train (amdgpu_connector)) {/* Don't try to start link training before we * have the dpcd */ -if (!amdgpu_atombios_dp_get_dpcd (amdgpu_connector)) +if (amdgpu_atombios_dp_get_dpcd (amdgpu_connector))return ;/* set it to OFF so that drm_helper_connector_dpms()
Greg Kroah-Hartman
maintainerPATCH 29/74 libata: fix HDIO_GET_32BIT ioctl
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 287e6611ab1eac76c2c5ebf6e345e04c80ca9c61 upstream.
As reported by Soohoon Lee, the HDIO_GET_32BIT ioctl does not work correctly in compat mode with libata.
I have investigated the issue further and found multiple problems that all appeared with the same commit that originally introduced HDIO_GET_32BIT handling in libata back in linux-2.6.8 and presumably also linux-2.4, as the code uses "copy_to_user(arg, &val, 1)" to copy a 'long' variable containing either 0 or 1 to user space.
The problems with this are:
* On big-endian machines, this will always write a zero because it stores the wrong byte into user space.
* In compat mode, the upper three bytes of the variable are updated by the compat_hdio_ioctl() function, but they now contain uninitialized stack data.
* The hdparm tool calling this ioctl uses a 'static long' variable to store the result. This means at least the upper bytes are initialized to zero, but calling another ioctl like HDIO_GET_MULTCOUNT would fill them with data that remains stale when the low byte is overwritten. Fortunately libata doesn't implement any of the affected ioctl commands, so this would only happen when we query both an IDE and an ATA device in the same command such as "hdparm -N -c /dev/hda /dev/sda"
* The libata code for unknown reasons started using ATA_IOC_GET_IO32 and ATA_IOC_SET_IO32 as aliases for HDIO_GET_32BIT and HDIO_SET_32BIT, while the ioctl commands that were added later use the normal HDIO_* names. This is harmless but rather confusing.
This addresses all four issues by changing the code to use put_user() on an 'unsigned long' variable in HDIO_GET_32BIT, like the IDE subsystem does, and by clarifying the names of the ioctl commands.
--- drivers/ata/libata-scsi.c | 11 +++++------ include/linux/ata.h | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-)
drivers/ata/libata-scsi.c +5 -6
@@ -675,19 +675,18 @@ static int ata_ioc32(struct ata_port *apint ata_sas_scsi_ioctl (struct ata_port *ap,struct scsi_device *scsidev,int cmd,void __user *arg) { -int val = -EINVAL , rc = -EINVAL ; +unsigned long val; +int rc = -EINVAL ;unsigned long flags;switch (cmd) { -case ATA_IOC_GET_IO32 : +case HDIO_GET_32BIT :spin_lock_irqsave (ap->lock, flags); val =ata_ioc32 (ap);spin_unlock_irqrestore (ap->lock, flags); -if (copy_to_user (arg, &val,1 )) -return -EFAULT ; -return 0 ; +return put_user (val, (unsigned long __user *)arg); -case ATA_IOC_SET_IO32 : +case HDIO_SET_32BIT : val = (unsigned long ) arg; rc =0 ;spin_lock_irqsave (ap->lock, flags);
include/linux/ata.h +2 -2
@@ -487,8 +487,8 @@ enum ata_tf_protocols { };enum ata_ioctls { -ATA_IOC_GET_IO32 =0x309 , -ATA_IOC_SET_IO32 =0x324 , +ATA_IOC_GET_IO32 =0x309 ,/* HDIO_GET_32BIT */ +ATA_IOC_SET_IO32 =0x324 ,/* HDIO_SET_32BIT */ };/* core structures */
Greg Kroah-Hartman
maintainerPATCH 30/74 libata: Align ata_devices id on a cacheline
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harvey Hunt <[email protected]>
commit 4ee34ea3a12396f35b26d90a094c75db95080baa upstream.
The id buffer in ata_device is a DMA target, but it isn't explicitly cacheline aligned. Due to this, adjacent fields can be overwritten with stale data from memory on non coherent architectures. As a result, the kernel is sometimes unable to communicate with an ATA device.
Fix this by ensuring that the id buffer is cacheline aligned.
This issue is similar to that fixed by Commit 84bda12af31f ("libata: align ap->sector_buf").
--- include/linux/libata.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/libata.h +1 -1
@@ -718,7 +718,7 @@ struct ata_device {union {u16 id[ATA_ID_WORDS ];/* IDENTIFY xxx DEVICE data */ u32 gscr[SATA_PMP_GSCR_DWORDS ];/* PMP GSCR block */ - }; + }____cacheline_aligned ;/* DEVSLP Timing Variables from Identify Device Data Log */ u8 devslp_timing[ATA_LOG_DEVSLP_SIZE ];
Greg Kroah-Hartman
maintainerPATCH 31/74 block: bio: introduce helpers to get the 1st and last bvec
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
commit 7bcd79ac50d9d83350a835bdb91c04ac9e098412 upstream.
The bio passed to bio_will_gap() may be fast cloned from upper layer(dm, md, bcache, fs, ...), or from bio splitting in block core.
Unfortunately bio_will_gap() just figures out the last bvec via 'bi_io_vec[prev->bi_vcnt - 1]' directly, and this way is obviously wrong.
This patch introduces two helpers for getting the first and last bvec of one bio for fixing the issue.
--- include/linux/bio.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
include/linux/bio.h +37 -0
@@ -310,6 +310,43 @@ static inline void bio_clear_flag(struct bio->bi_flags &= ~(1U << bit); } +static inline void bio_get_first_bvec (struct bio *bio,struct bio_vec *bv) +{ + *bv =bio_iovec (bio); +} + +static inline void bio_get_last_bvec (struct bio *bio,struct bio_vec *bv) +{ +struct bvec_iter iter = bio->bi_iter; +int idx; + +if (!bio_flagged (bio,BIO_CLONED )) { + *bv = bio->bi_io_vec[bio->bi_vcnt -1 ]; +return ; + } + +if (unlikely (!bio_multiple_segments (bio))) { + *bv =bio_iovec (bio); +return ; + } + +bio_advance_iter (bio, &iter, iter.bi_size); + +if (!iter.bi_bvec_done) + idx = iter.bi_idx -1 ; +else /* in the middle of bvec */ + idx = iter.bi_idx; + + *bv = bio->bi_io_vec[idx]; + +/* +* iter.bi_bvec_done records actual length of the last bvec +* if this bio ends in the middle of one io vector +*/ +if (iter.bi_bvec_done) + bv->bv_len = iter.bi_bvec_done; +} +enum bip_flags {BIP_BLOCK_INTEGRITY =1 <<0 ,/* block layer owns integrity data */ BIP_MAPPED_INTEGRITY =1 <<1 ,/* ref tag has been remapped */
Greg Kroah-Hartman
maintainerPATCH 32/74 writeback: flush inode cgroup wb switches instead of pinning super_block
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit a1a0e23e49037c23ea84bc8cc146a03584d13577 upstream.
If cgroup writeback is in use, inodes can be scheduled for asynchronous wb switching. Before 5ff8eaac1636 ("writeback: keep superblock pinned during cgroup writeback association switches"), this could race with umount leading to super_block being destroyed while inodes are pinned for wb switching. 5ff8eaac1636 fixed it by bumping s_active while wb switches are in flight; however, this allowed in-flight wb switches to make umounts asynchronous when the userland expected synchronosity - e.g. fsck immediately following umount may fail because the device is still busy.
This patch removes the problematic super_block pinning and instead makes generic_shutdown_super() flush in-flight wb switches. wb switches are now executed on a dedicated isw_wq so that they can be flushed and isw_nr_in_flight keeps track of the number of in-flight wb switches so that flushing can be avoided in most cases.
v2: Move cgroup_writeback_umount() further below and add MS_ACTIVE
check in inode_switch_wbs() as Jan an Al suggested.
--- fs/fs-writeback.c | 54 ++++++++++++++++++++++++++++++++++------------ fs/super.c | 1 include/linux/writeback.h | 5 ++++ 3 files changed, 47 insertions(+), 13 deletions(-)
fs/fs-writeback.c +41 -13
@@ -223,6 +223,9 @@ static void wb_wait_for_completion(struc#define WB_FRN_HIST_MAX_SLOTS (WB_FRN_HIST_THR_SLOTS / 2 + 1)/* one round can affect upto 5 slots */ +static atomic_t isw_nr_in_flight =ATOMIC_INIT (0 ); +static struct workqueue_struct *isw_wq; +void __inode_attach_wb (struct inode *inode,struct page *page) {struct backing_dev_info *bdi =inode_to_bdi (inode);
@@ -317,7 +320,6 @@ static void inode_switch_wbs_work_fn(strstruct inode_switch_wbs_context *isw = container_of(work, struct inode_switch_wbs_context, work);struct inode *inode = isw->inode; -struct super_block *sb = inode->i_sb;struct address_space *mapping = inode->i_mapping;struct bdi_writeback *old_wb = inode->i_wb;struct bdi_writeback *new_wb = isw->new_wb;
@@ -424,8 +426,9 @@ skip_switch:wb_put (new_wb);iput (inode); -deactivate_super (sb);kfree (isw); + +atomic_dec (&isw_nr_in_flight); }static void inode_switch_wbs_rcu_fn (struct rcu_head *rcu_head)
@@ -435,7 +438,7 @@ static void inode_switch_wbs_rcu_fn(stru/* needs to grab bh-unsafe locks, bounce to work item */ INIT_WORK (&isw->work, inode_switch_wbs_work_fn); -schedule_work (&isw->work); +queue_work (isw_wq, &isw->work); }/**
@@ -471,20 +474,20 @@ static void inode_switch_wbs(struct inod/* while holding I_WB_SWITCH, no one else can update the association */ spin_lock (&inode->i_lock); - -if (inode->i_state & (I_WB_SWITCH |I_FREEING ) || -inode_to_wb (inode) == isw->new_wb) - goto out_unlock; - -if (!atomic_inc_not_zero (&inode->i_sb->s_active)) - goto out_unlock; - +if (!(inode->i_sb->s_flags &MS_ACTIVE ) || + inode->i_state & (I_WB_SWITCH |I_FREEING ) || +inode_to_wb (inode) == isw->new_wb) { +spin_unlock (&inode->i_lock); + goto out_free; + } inode->i_state |=I_WB_SWITCH ;spin_unlock (&inode->i_lock);ihold (inode); isw->inode = inode; +atomic_inc (&isw_nr_in_flight); +/* * In addition to synchronizing among switchers, I_WB_SWITCH tells * the RCU protected stat update paths to grab the mapping's
@@ -494,8 +497,6 @@ static void inode_switch_wbs(struct inodcall_rcu (&isw->rcu_head, inode_switch_wbs_rcu_fn);return ; -out_unlock: -spin_unlock (&inode->i_lock); out_free:if (isw->new_wb)wb_put (isw->new_wb);
@@ -849,6 +850,33 @@ restart: wb_put(last_wb); } +/** +* cgroup_writeback_umount - flush inode wb switches for umount +* +* This function is called when a super_block is about to be destroyed and +* flushes in-flight inode wb switches. An inode wb switch goes through +* RCU and then workqueue, so the two need to be flushed in order to ensure +* that all previously scheduled switches are finished. As wb switches are +* rare occurrences and synchronize_rcu() can take a while, perform +* flushing iff wb switches are in flight. +*/ +void cgroup_writeback_umount (void ) +{ +if (atomic_read (&isw_nr_in_flight)) { +synchronize_rcu (); +flush_workqueue (isw_wq); + } +} + +static int __init cgroup_writeback_init (void ) +{ + isw_wq =alloc_workqueue ("inode_switch_wbs" ,0 ,0 ); +if (!isw_wq) +return -ENOMEM ; +return 0 ; +} +fs_initcall (cgroup_writeback_init); +#else /* CONFIG_CGROUP_WRITEBACK */ static struct bdi_writeback *
fs/super.c +1 -0
@@ -415,6 +415,7 @@ void generic_shutdown_super(struct super sb->s_flags &= ~MS_ACTIVE ;fsnotify_unmount_inodes (sb); +cgroup_writeback_umount ();evict_inodes (sb);
include/linux/writeback.h +5 -0
@@ -198,6 +198,7 @@ void wbc_attach_and_unlock_inode(structvoid wbc_detach_inode (struct writeback_control *wbc);void wbc_account_io (struct writeback_control *wbc,struct page *page,size_t bytes); +void cgroup_writeback_umount (void );/** * inode_attach_wb - associate an inode with its wb
@@ -301,6 +302,10 @@ static inline void wbc_account_io(struct { } +static inline void cgroup_writeback_umount (void ) +{ +} +#endif /* CONFIG_CGROUP_WRITEBACK */ /*
Greg Kroah-Hartman
maintainerPATCH 33/74 Adding Intel Lewisburg device IDs for SATA
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandra Yates <[email protected]>
commit f5bdd66c705484b4bc77eb914be15c1b7881fae7 upstream.
This patch complements the list of device IDs previously added for lewisburg sata.
--- drivers/ata/ahci.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/ata/ahci.c +6 -0
@@ -367,15 +367,21 @@ static const struct pci_device_id ahci_p { PCI_VDEVICE(INTEL, 0xa107), board_ahci }, /* Sunrise Point-H RAID */ { PCI_VDEVICE(INTEL, 0xa10f), board_ahci }, /* Sunrise Point-H RAID */ { PCI_VDEVICE(INTEL, 0x2822), board_ahci }, /* Lewisburg RAID*/ + { PCI_VDEVICE(INTEL, 0x2823), board_ahci }, /* Lewisburg AHCI*/ { PCI_VDEVICE(INTEL, 0x2826), board_ahci }, /* Lewisburg RAID*/ + { PCI_VDEVICE(INTEL, 0x2827), board_ahci }, /* Lewisburg RAID*/ { PCI_VDEVICE(INTEL, 0xa182), board_ahci }, /* Lewisburg AHCI*/ { PCI_VDEVICE(INTEL, 0xa184), board_ahci }, /* Lewisburg RAID*/ { PCI_VDEVICE(INTEL, 0xa186), board_ahci }, /* Lewisburg RAID*/ { PCI_VDEVICE(INTEL, 0xa18e), board_ahci }, /* Lewisburg RAID*/ + { PCI_VDEVICE(INTEL, 0xa1d2), board_ahci }, /* Lewisburg RAID*/ + { PCI_VDEVICE(INTEL, 0xa1d6), board_ahci }, /* Lewisburg RAID*/ { PCI_VDEVICE(INTEL, 0xa202), board_ahci }, /* Lewisburg AHCI*/ { PCI_VDEVICE(INTEL, 0xa204), board_ahci }, /* Lewisburg RAID*/ { PCI_VDEVICE(INTEL, 0xa206), board_ahci }, /* Lewisburg RAID*/ { PCI_VDEVICE(INTEL, 0xa20e), board_ahci }, /* Lewisburg RAID*/ + { PCI_VDEVICE(INTEL, 0xa252), board_ahci }, /* Lewisburg RAID*/ + { PCI_VDEVICE(INTEL, 0xa256), board_ahci }, /* Lewisburg RAID*//* JMicron 360/1/3/5/6, match class to avoid IDE function */ { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
Greg Kroah-Hartman
maintainerPATCH 34/74 arm64: vmemmap: use virtual projection of linear region
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit dfd55ad85e4a7fbaa82df12467515ac3c81e8a3e upstream.
Commit dd006da21646 ("arm64: mm: increase VA range of identity map") made some changes to the memory mapping code to allow physical memory to reside at an offset that exceeds the size of the virtual mapping.
However, since the size of the vmemmap area is proportional to the size of the VA area, but it is populated relative to the physical space, we may end up with the struct page array being mapped outside of the vmemmap region. For instance, on my Seattle A0 box, I can see the following output in the dmesg log.
vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000 ( 8 GB maximum)
0xffffffbfc0000000 - 0xffffffbfd0000000 ( 256 MB actual)
We can fix this by deciding that the vmemmap region is not a projection of the physical space, but of the virtual space above PAGE_OFFSET, i.e., the linear region. This way, we are guaranteed that the vmemmap region is of sufficient size, and we can even reduce the size by half.
--- arch/arm64/include/asm/pgtable.h | 7 ++++--- arch/arm64/mm/init.c | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-)
arch/arm64/include/asm/pgtable.h +4 -3
@@ -34,13 +34,13 @@/* * VMALLOC and SPARSEMEM_VMEMMAP ranges. * -* VMEMAP_SIZE: allows the whole VA space to be covered by a struct page array +* VMEMAP_SIZE: allows the whole linear region to be covered by a struct page array * (rounded up to PUD_SIZE). * VMALLOC_START: beginning of the kernel VA space * VMALLOC_END: extends to the available space below vmmemmap, PCI I/O space, * fixed mappings and modules */ -#define VMEMMAP_SIZE ALIGN((1UL << (VA_BITS - PAGE_SHIFT)) * sizeof(struct page), PUD_SIZE) +#define VMEMMAP_SIZE ALIGN((1UL << (VA_BITS - PAGE_SHIFT - 1)) * sizeof(struct page), PUD_SIZE)#ifndef CONFIG_KASAN #define VMALLOC_START (VA_START)
@@ -51,7 +51,8 @@#define VMALLOC_END (PAGE_OFFSET - PUD_SIZE - VMEMMAP_SIZE - SZ_64K) -#define vmemmap ((struct page *)(VMALLOC_END + SZ_64K)) +#define VMEMMAP_START (VMALLOC_END + SZ_64K) +#define vmemmap ((struct page *)VMEMMAP_START - (memstart_addr >> PAGE_SHIFT))#define FIRST_USER_ADDRESS 0UL
arch/arm64/mm/init.c +2 -2
@@ -319,8 +319,8 @@ void __init mem_init(void)#endif MLG(VMALLOC_START, VMALLOC_END),#ifdef CONFIG_SPARSEMEM_VMEMMAP -MLG ((unsigned long )vmemmap, - (unsigned long )vmemmap +VMEMMAP_SIZE ), +MLG (VMEMMAP_START , +VMEMMAP_START +VMEMMAP_SIZE ),MLM ((unsigned long )virt_to_page (PAGE_OFFSET ), (unsigned long)virt_to_page(high_memory)), #endif
Re: [PATCH 4.4 34/74] arm64: vmemmap: use virtual projection of linear region
Quoted 2 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
Please hold off on this one. We are seeing some breakage on 64k pages systems
Quoted 76 lines
------------------
From: Ard Biesheuvel <[email protected]>
commit
dfd55ad85e4a7fbaa82df12467515ac3c81e8a3eupstream.Commit
dd006da21646("arm64: mm: increase VA range of identity map") made some changes to the memory mapping code to allow physical memory to reside at an offset that exceeds the size of the virtual mapping.However, since the size of the vmemmap area is proportional to the size of the VA area, but it is populated relative to the physical space, we may end up with the struct page array being mapped outside of the vmemmap region. For instance, on my Seattle A0 box, I can see the following output in the dmesg log.
vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000 ( 8 GB maximum) 0xffffffbfc0000000 - 0xffffffbfd0000000 ( 256 MB actual)We can fix this by deciding that the vmemmap region is not a projection of the physical space, but of the virtual space above
PAGE_OFFSET, i.e., the linear region. This way, we are guaranteed that the vmemmap region is of sufficient size, and we can even reduce the size by half.Signed-off-by Ard Biesheuvel <[email protected]>Signed-off-by Will Deacon <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- arch/arm64/include/asm/pgtable.h | 7 ++++--- arch/arm64/mm/init.c | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-)arch/arm64/include/asm/pgtable.h +4
-3@@ -34,13 +34,13 @@/* * VMALLOC and SPARSEMEM_VMEMMAP ranges. * -* VMEMAP_SIZE: allows the whole VA space to be covered by a struct page array +* VMEMAP_SIZE: allows the whole linear region to be covered by a struct page array * (rounded up to PUD_SIZE). * VMALLOC_START: beginning of the kernel VA space * VMALLOC_END: extends to the available space below vmmemmap, PCI I/O space, * fixed mappings and modules */ -#define VMEMMAP_SIZE ALIGN((1UL << (VA_BITS - PAGE_SHIFT)) * sizeof(struct page), PUD_SIZE) +#define VMEMMAP_SIZE ALIGN((1UL << (VA_BITS - PAGE_SHIFT - 1)) * sizeof(struct page), PUD_SIZE)#ifndef CONFIG_KASAN #define VMALLOC_START (VA_START)@@ -51,7 +51,8 @@#define VMALLOC_END (PAGE_OFFSET - PUD_SIZE - VMEMMAP_SIZE - SZ_64K) -#define vmemmap ((struct page *)(VMALLOC_END + SZ_64K)) +#define VMEMMAP_START (VMALLOC_END + SZ_64K) +#define vmemmap ((struct page *)VMEMMAP_START - (memstart_addr >> PAGE_SHIFT))#define FIRST_USER_ADDRESS 0ULarch/arm64/mm/init.c +2
-2@@ -319,8 +319,8 @@ void __init mem_init(void)#endif MLG(VMALLOC_START, VMALLOC_END),#ifdef CONFIG_SPARSEMEM_VMEMMAP -MLG ((unsigned long )vmemmap, - (unsigned long )vmemmap +VMEMMAP_SIZE ), +MLG (VMEMMAP_START , +VMEMMAP_START +VMEMMAP_SIZE ),MLM ((unsigned long )virt_to_page (PAGE_OFFSET ), (unsigned long)virt_to_page(high_memory)), #endif
Greg Kroah-Hartman
maintainerRe: [PATCH 4.4 34/74] arm64: vmemmap: use virtual projection of linear region
Quoted 5 lines · Ard Biesheuvel
Quoted 2 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
Please hold off on this one. We are seeing some breakage on 64k pages systems
If this problem is also in Linus's tree, I'd like to keep it in to keep things "bug compatible". Please let me know what fix that I should apply to resolve this.
thanks,
greg k-h
Re: [PATCH 4.4 34/74] arm64: vmemmap: use virtual projection of linear region
Quoted 11 lines · Greg Kroah-Hartman
Quoted 5 lines · Ard Biesheuvel
Quoted 2 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
Please hold off on this one. We are seeing some breakage on 64k pages systems
If this problem is also in Linus's tree, I'd like to keep it in to keep things "bug compatible". Please let me know what fix that I should apply to resolve this.
I am about to send out the patch that should fix this, so I will put you on cc.
Thanks,
Ard.
Re: [PATCH 4.4 34/74] arm64: vmemmap: use virtual projection of linear region
Quoted 6 lines · Ard Biesheuvel
Quoted 5 lines · Greg Kroah-Hartman
Quoted 4 lines · Ard Biesheuvel
Quoted 2 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
Quoted 9 lines
Quoted 6 lines
Quoted 1 line
Please hold off on this one. We are seeing some breakage on 64k pages systems
If this problem is also in Linus's tree, I'd like to keep it in to keep things "bug compatible". Please let me know what fix that I should apply to resolve this.
I am about to send out the patch that should fix this, so I will put you on cc.
Not sure what happened here, but this patch is in 4.4-stable now, but the fix is not.
Greg Kroah-Hartman
maintainerRe: [PATCH 4.4 34/74] arm64: vmemmap: use virtual projection of linear region
Quoted 14 lines · Ard Biesheuvel
Quoted 13 lines · Ard Biesheuvel
Quoted 11 lines · Greg Kroah-Hartman
Quoted 5 lines · Ard Biesheuvel
Quoted 2 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
Please hold off on this one. We are seeing some breakage on 64k pages systems
If this problem is also in Linus's tree, I'd like to keep it in to keep things "bug compatible". Please let me know what fix that I should apply to resolve this.
Quoted 5 lines
Quoted 2 lines
I am about to send out the patch that should fix this, so I will put you on cc.
Not sure what happened here, but this patch is in 4.4-stable now, but the fix is not.
Because the fix came out _after_ I released that kernel? I can't go back in time...
Re: [PATCH 4.4 34/74] arm64: vmemmap: use virtual projection of linear region
Quoted 17 lines · Greg Kroah-Hartman
Quoted 14 lines · Ard Biesheuvel
Quoted 12 lines · Ard Biesheuvel
Quoted 10 lines · Greg Kroah-Hartman
Quoted 5 lines · Ard Biesheuvel
Quoted 2 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
Please hold off on this one. We are seeing some breakage on 64k pages systems
If this problem is also in Linus's tree, I'd like to keep it in to keep things "bug compatible". Please let me know what fix that I should apply to resolve this.
Quoted 8 lines
Quoted 4 lines
Quoted 1 line
I am about to send out the patch that should fix this, so I will put you on cc.
Not sure what happened here, but this patch is in 4.4-stable now, but the fix is not.
Because the fix came out _after_ I released that kernel? I can't go back in time...
I kind of got the whole chronology thing. I am just surprised you pulled only that patch (and not the fix) anyway, since you knew it would break things, and that a fix was on the way.
Greg Kroah-Hartman
maintainerRe: [PATCH 4.4 34/74] arm64: vmemmap: use virtual projection of linear region
Quoted 22 lines · Ard Biesheuvel
Quoted 22 lines · Greg Kroah-Hartman
Quoted 18 lines · Ard Biesheuvel
Quoted 6 lines · Ard Biesheuvel
Quoted 5 lines · Greg Kroah-Hartman
Quoted 4 lines · Ard Biesheuvel
Quoted 2 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
Quoted 7 lines
Quoted 5 lines
Quoted 1 line
Please hold off on this one. We are seeing some breakage on 64k pages systems
If this problem is also in Linus's tree, I'd like to keep it in to keep things "bug compatible". Please let me know what fix that I should apply to resolve this.
I am about to send out the patch that should fix this, so I will put you on cc.
Not sure what happened here, but this patch is in 4.4-stable now, but the fix is not.
Quoted 7 lines
Quoted 3 lines
Because the fix came out _after_ I released that kernel? I can't go back in time...
I kind of got the whole chronology thing. I am just surprised you pulled only that patch (and not the fix) anyway, since you knew it would break things, and that a fix was on the way.
That way I knew you all would work quickly to get the fix in :)
We do this all the time, nothing new here, being "bug compatible" is good...
thanks,
greg k-h
Re: [PATCH 4.4 34/74] arm64: vmemmap: use virtual projection of linear region
Quoted 30 lines · Greg Kroah-Hartman
Quoted 27 lines · Ard Biesheuvel
Quoted 24 lines
Quoted 13 lines · Greg Kroah-Hartman
Quoted 10 lines · Ard Biesheuvel
Quoted 8 lines · Ard Biesheuvel
Quoted 6 lines · Greg Kroah-Hartman
Quoted 3 lines · Ard Biesheuvel
On 8 March 2016 at 07:02, Greg Kroah-Hartman <[email protected]> wrote:
4.4-stable review patch. If anyone has any objections, please let me know.Please hold off on this one. We are seeing some breakage on 64k pages systems
Quoted 8 lines
Quoted 5 lines
Quoted 3 lines
If this problem is also in Linus's tree, I'd like to keep it in to keep things "bug compatible". Please let me know what fix that I should apply to resolve this.
I am about to send out the patch that should fix this, so I will put you on cc.
Not sure what happened here, but this patch is in 4.4-stable now, but the fix is not.
Because the fix came out _after_ I released that kernel? I can't go back in time...
Quoted 9 lines
Quoted 3 lines
I kind of got the whole chronology thing. I am just surprised you pulled only that patch (and not the fix) anyway, since you knew it would break things, and that a fix was on the way.
That way I knew you all would work quickly to get the fix in :)
We do this all the time, nothing new here, being "bug compatible" is good...
Do you get many requests from stable tree users for this bug compatibility with mainline?
Greg Kroah-Hartman
maintainerPATCH 35/74 PM / sleep / x86: Fix crash on graph trace through x86 suspend
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Todd E Brandt <[email protected]>
commit 92f9e179a702a6adbc11e2fedc76ecd6ffc9e3f7 upstream.
Pause/unpause graph tracing around do_suspend_lowlevel as it has inconsistent call/return info after it jumps to the wakeup vector. The graph trace buffer will otherwise become misaligned and may eventually crash and hang on suspend.
To reproduce the issue and test the fix:
Run a function_graph trace over suspend/resume and set the graph function to suspend_devices_and_enter. This consistently hangs the system without this fix.
--- arch/x86/kernel/acpi/sleep.c | 7 +++++++ 1 file changed, 7 insertions(+)
arch/x86/kernel/acpi/sleep.c +7 -0
@@ -16,6 +16,7 @@#include <asm/cacheflush.h> #include <asm/realmode.h> +#include <linux/ftrace.h> #include "../../realmode/rm/wakeup.h" #include "sleep.h"
@@ -107,7 +108,13 @@ int x86_acpi_suspend_lowlevel(void) saved_magic =0x123456789abcdef0L ;#endif /* CONFIG_64BIT */ +/* +* Pause/unpause graph tracing around do_suspend_lowlevel as it has +* inconsistent call/return info after it jumps to the wakeup vector. +*/ +pause_graph_tracing ();do_suspend_lowlevel (); +unpause_graph_tracing ();return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 36/74 ata: ahci: dont mark HotPlugCapable Ports as external/removable
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manuel Lauss <[email protected]>
commit dc8b4afc4a04fac8ee55a19b59f2356a25e7e778 upstream.
The HPCP bit is set by bioses for on-board sata ports either because they think sata is hotplug capable in general or to allow Windows to display a "device eject" icon on ports which are routed to an external connector bracket.
However in Redhat Bugzilla #1310682, users report that with kernel 4.4, where this bit test first appeared, a lot of partitions on sata drives are now mounted automatically.
This patch should fix redhat and a lot of other distros which unconditionally automount all devices which have the "removable" bit set.
--- drivers/ata/libahci.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/ata/libahci.c +1 -2
@@ -1142,8 +1142,7 @@ static void ahci_port_init(struct device/* mark esata ports */ tmp =readl (port_mmio +PORT_CMD ); -if ((tmp &PORT_CMD_HPCP ) || - ((tmp &PORT_CMD_ESP ) && (hpriv->cap &HOST_CAP_SXS ))) +if ((tmp &PORT_CMD_ESP ) && (hpriv->cap &HOST_CAP_SXS )) ap->pflags |=ATA_PFLAG_EXTERNAL ; }
Greg Kroah-Hartman
maintainerPATCH 37/74 tracing: Do not have comm filter override event comm field
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt (Red Hat) <[email protected]>
commit e57cbaf0eb006eaa207395f3bfd7ce52c1b5539c upstream.
Commit 9f61668073a8d "tracing: Allow triggers to filter for CPU ids and process names" added a 'comm' filter that will filter events based on the current tasks struct 'comm'. But this now hides the ability to filter events that have a 'comm' field too. For example, sched_migrate_task trace event. That has a 'comm' field of the task to be migrated.
echo 'comm == "bash"' > events/sched_migrate_task/filter
will now filter all sched_migrate_task events for tasks named "bash" that migrates other tasks (in interrupt context), instead of seeing when "bash" itself gets migrated.
This fix requires a couple of changes.
1) Change the look up order for filter predicates to look at the events fields before looking at the generic filters.
2) Instead of basing the filter function off of the "comm" name, have the generic "comm" filter have its own filter_type (FILTER_COMM). Test against the type instead of the name to assign the filter function.
3) Add a new "COMM" filter that works just like "comm" but will filter based on the current task, even if the trace event contains a "comm" field.
Do the same for "cpu" field, adding a FILTER_CPU and a filter "CPU".
include/linux/trace_events.h +2 -0
@@ -568,6 +568,8 @@ enum {FILTER_DYN_STRING ,FILTER_PTR_STRING ,FILTER_TRACE_FN , +FILTER_COMM , + FILTER_CPU, };extern int trace_event_raw_init (struct trace_event_call *call);
kernel/trace/trace_events.c +8 -6
@@ -97,16 +97,16 @@ trace_find_event_field(struct trace_event_call *call, char *name)struct ftrace_event_field *field;struct list_head *head; - field =__find_event_field (&ftrace_generic_fields, name); + head =trace_get_fields (call); + field =__find_event_field (head, name);if (field)return field; - field =__find_event_field (&ftrace_common_fields, name); + field =__find_event_field (&ftrace_generic_fields, name);if (field)return field; - head =trace_get_fields (call); -return __find_event_field (head, name); +return __find_event_field (&ftrace_common_fields, name); } static int __trace_define_field(struct list_head *head, const char *type,
@@ -171,8 +171,10 @@ static int trace_define_generic_fields(void) {int ret; -__generic_field (int, cpu,FILTER_OTHER ); - __generic_field(char *, comm, FILTER_PTR_STRING); +__generic_field (int,CPU ,FILTER_CPU ); +__generic_field (int, cpu,FILTER_CPU ); + __generic_field(char *, COMM, FILTER_COMM); + __generic_field(char *, comm, FILTER_COMM);return ret; }
kernel/trace/trace_events_filter.c +7 -6
@@ -1043,13 +1043,14 @@ static int init_pred(struct filter_parse_state *ps,return -EINVAL ; } -if (is_string_field (field)) { +if (field->filter_type ==FILTER_COMM ) { +filter_build_regex (pred); + fn = filter_pred_comm; + pred->regex.field_len =TASK_COMM_LEN ; + }else if (is_string_field (field)) {filter_build_regex (pred); -if (!strcmp (field->name,"comm" )) { - fn = filter_pred_comm; - pred->regex.field_len =TASK_COMM_LEN ; - }else if (field->filter_type ==FILTER_STATIC_STRING ) { +if (field->filter_type ==FILTER_STATIC_STRING ) { fn = filter_pred_string; pred->regex.field_len = field->size; }else if (field->filter_type ==FILTER_DYN_STRING )
@@ -1072,7 +1073,7 @@ static int init_pred(struct filter_parse_state *ps, } pred->val = val; -if (!strcmp (field->name,"cpu" )) +if (field->filter_type ==FILTER_CPU ) fn = filter_pred_cpu;else fn = select_comparison_fn(pred->op, field->size,
Greg Kroah-Hartman
maintainerPATCH 38/74 pata-rb532-cf: get rid of the irq_to_gpio() call
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gabor Juhos <[email protected]>
commit 018361767a21fb2d5ebd3ac182c04baf8a8b4e08 upstream.
The RB532 platform specific irq_to_gpio() implementation has been removed with commit 832f5dacfa0b ("MIPS: Remove all the uses of custom gpio.h"). Now the platform uses the generic stub which causes the following error:
pata-rb532-cf pata-rb532-cf: no GPIO found for irq149
pata-rb532-cf: probe of pata-rb532-cf failed with error -2
Drop the irq_to_gpio() call and get the GPIO number from platform data instead. After this change, the driver works again:
scsi host0: pata-rb532-cf ata1: PATA max PIO4 irq 149 ata1.00: CFA: CF 1GB, 20080820, max MWDMA4 ata1.00: 1989792 sectors, multi 0: LBA ata1.00: configured for PIO4 scsi 0:0:0:0: Direct-Access ATA CF 1GB 0820 PQ: 0\ ANSI: 5 sd 0:0:0:0: [sda] 1989792 512-byte logical blocks: (1.01 GB/971 MiB) sd 0:0:0:0: [sda] Write Protect is off sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't\ support DPO or FUA sda: sda1 sda2 sd 0:0:0:0: [sda] Attached SCSI disk
--- drivers/ata/pata_rb532_cf.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/ata/pata_rb532_cf.c +10 -1
@@ -32,6 +32,8 @@#include <linux/libata.h> #include <scsi/scsi_host.h> +#include <asm/mach-rc32434/rb.h> +#define DRV_NAME "pata-rb532-cf"#define DRV_VERSION "0.1.0"#define DRV_DESC "PATA driver for RouterBOARD 532 Compact Flash"
@@ -107,6 +109,7 @@ static int rb532_pata_driver_probe(strucint gpio;struct resource *res;struct ata_host *ah; +struct cf_device *pdata;struct rb532_cf_info *info;int ret;
@@ -122,7 +125,13 @@ static int rb532_pata_driver_probe(strucreturn -ENOENT ; } - gpio =irq_to_gpio (irq); + pdata =dev_get_platdata (&pdev->dev); +if (!pdata) { +dev_err (&pdev->dev,"no platform data specified\n" ); +return -EINVAL ; + } + + gpio = pdata->gpio_pin;if (gpio <0 ) {dev_err (&pdev->dev,"no GPIO found for irq%d\n" , irq);return -ENOENT ;
Greg Kroah-Hartman
maintainerPATCH 39/74 Btrfs: fix loading of orphan roots leading to BUG_ON
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit 909c3a22da3b8d2cfd3505ca5658f0176859d400 upstream.
When looking for orphan roots during mount we can end up hitting a BUG_ON() (at root-item.c:btrfs_find_orphan_roots()) if a log tree is replayed and qgroups are enabled. This is because after a log tree is replayed, a transaction commit is made, which triggers qgroup extent accounting which in turn does backref walking which ends up reading and inserting all roots in the radix tree fs_info->fs_root_radix, including orphan roots (deleted snapshots). So after the log tree is replayed, when finding orphan roots we hit the BUG_ON with the following trace:
[118209.182438] ------------[ cut here ]------------ [118209.183279] kernel BUG at fs/btrfs/root-tree.c:314! [118209.184074] invalid opcode: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC [118209.185123] Modules linked in: btrfs dm_flakey dm_mod crc32c_generic ppdev xor raid6_pq evdev sg parport_pc parport acpi_cpufreq tpm_tis tpm psmouse processor i2c_piix4 serio_raw pcspkr i2c_core button loop autofs4 ext4 crc16 mbcache jbd2 sd_mod sr_mod cdrom ata_generic virtio_scsi ata_piix libata virtio_pci virtio_ring virtio scsi_mod e1000 floppy [last unloaded: btrfs] [118209.186318] CPU: 14 PID: 28428 Comm: mount Tainted: G W 4.5.0-rc5-btrfs-next-24+ #1 [118209.186318] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS by qemu-project.org 04/01/2014 [118209.186318] task: ffff8801ec131040 ti: ffff8800af34c000 task.ti: ffff8800af34c000 [118209.186318] RIP: 0010:[<ffffffffa04237d7>] [<ffffffffa04237d7>] btrfs_find_orphan_roots+0x1fc/0x244 [btrfs] [118209.186318] RSP: 0018:ffff8800af34faa8 EFLAGS: 00010246 [118209.186318] RAX: 00000000ffffffef RBX: 00000000ffffffef RCX: 0000000000000001 [118209.186318] RDX: 0000000080000000 RSI: 0000000000000001 RDI: 00000000ffffffff [118209.186318] RBP: ffff8800af34fb08 R08: 0000000000000001 R09: 0000000000000000 [118209.186318] R10: ffff8800af34f9f0 R11: 6db6db6db6db6db7 R12: ffff880171b97000 [118209.186318] R13: ffff8801ca9d65e0 R14: ffff8800afa2e000 R15: 0000160000000000 [118209.186318] FS: 00007f5bcb914840(0000) GS:ffff88023edc0000(0000) knlGS:0000000000000000 [118209.186318] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [118209.186318] CR2: 00007f5bcaceb5d9 CR3: 00000000b49b5000 CR4: 00000000000006e0 [118209.186318] Stack: [118209.186318] fffffbffffffffff 010230ffffffffff 0101000000000000 ff84000000000000 [118209.186318] fbffffffffffffff 30ffffffffffffff 0000000000000101 ffff880082348000 [118209.186318] 0000000000000000 ffff8800afa2e000 ffff8800afa2e000 0000000000000000 [118209.186318] Call Trace: [118209.186318] [<ffffffffa042e2db>] open_ctree+0x1e37/0x21b9 [btrfs] [118209.186318] [<ffffffffa040a753>] btrfs_mount+0x97e/0xaed [btrfs] [118209.186318] [<ffffffff8108e1c0>] ? trace_hardirqs_on+0xd/0xf [118209.186318] [<ffffffff8117b87e>] mount_fs+0x67/0x131 [118209.186318] [<ffffffff81192d2b>] vfs_kern_mount+0x6c/0xde [118209.186318] [<ffffffffa0409f81>] btrfs_mount+0x1ac/0xaed [btrfs] [118209.186318] [<ffffffff8108e1c0>] ? trace_hardirqs_on+0xd/0xf [118209.186318] [<ffffffff8108c26b>] ? lockdep_init_map+0xb9/0x1b3 [118209.186318] [<ffffffff8117b87e>] mount_fs+0x67/0x131 [118209.186318] [<ffffffff81192d2b>] vfs_kern_mount+0x6c/0xde [118209.186318] [<ffffffff81195637>] do_mount+0x8a6/0x9e8 [118209.186318] [<ffffffff8119598d>] SyS_mount+0x77/0x9f [118209.186318] [<ffffffff81493017>] entry_SYSCALL_64_fastpath+0x12/0x6b [118209.186318] Code: 64 00 00 85 c0 89 c3 75 24 f0 41 80 4c 24 20 20 49 8b bc 24 f0 01 00 00 4c 89 e6 e8 e8 65 00 00 85 c0 89 c3 74 11 83 f8 ef 75 02 <0f> 0b 4c 89 e7 e8 da 72 00 00 eb 1c 41 83 bc 24 00 01 00 00 00 [118209.186318] RIP [<ffffffffa04237d7>] btrfs_find_orphan_roots+0x1fc/0x244 [btrfs] [118209.186318] RSP <ffff8800af34faa8> [118209.230735] ---[ end trace 83938f987d85d477 ]---
So fix this by not treating the error -EEXIST, returned when attempting to insert a root already inserted by the backref walking code, as an error.
The following test case for xfstests reproduces the bug:
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()
{
_cleanup_flakey
cd /
rm -f $tmp.*
}# get standard environment, filters and checks . ./common/rc . ./common/filter . ./common/dmflakey
# real QA test starts here _supported_fs btrfs _supported_os Linux _require_scratch _require_dm_target flakey _require_metadata_journaling $SCRATCH_DEV
rm -f $seqres.full
_scratch_mkfs >>$seqres.full 2>&1
_init_flakey
_mount_flakey
_run_btrfs_util_prog quota enable $SCRATCH_MNT
# Create 2 directories with one file in one of them.
# We use these just to trigger a transaction commit later, moving the file from
# directory a to directory b and doing an fsync against directory a. mkdir $SCRATCH_MNT/a mkdir $SCRATCH_MNT/b touch $SCRATCH_MNT/a/f sync
# Create our test file with 2 4K extents.
$XFS_IO_PROG -f -s -c "pwrite -S 0xaa 0 8K" $SCRATCH_MNT/foobar | _filter_xfs_io
# Create a snapshot and delete it. This doesn't really delete the snapshot # immediately, just makes it inaccessible and invisible to user space, the
# snapshot is deleted later by a dedicated kernel thread (cleaner kthread) # which is woke up at the next transaction commit. # A root orphan item is inserted into the tree of tree roots, so that if a # power failure happens before the dedicated kernel thread does the snapshot # deletion, the next time the filesystem is mounted it resumes the snapshot # deletion. _run_btrfs_util_prog subvolume snapshot $SCRATCH_MNT $SCRATCH_MNT/snap _run_btrfs_util_prog subvolume delete $SCRATCH_MNT/snap
# Now overwrite half of the extents we wrote before. Because we made a snapshpot # before, which isn't really deleted yet (since no transaction commit happened
# after we did the snapshot delete request), the non overwritten extents get # referenced twice, once by the default subvolume and once by the snapshot. $XFS_IO_PROG -c "pwrite -S 0xbb 4K 8K" $SCRATCH_MNT/foobar | _filter_xfs_io
# Now move file f from directory a to directory b and fsync directory a. # The fsync on the directory a triggers a transaction commit (because a file
# was moved from it to another directory) and the file fsync leaves a log tree # with file extent items to replay. mv $SCRATCH_MNT/a/f $SCRATCH_MNT/a/b $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/a $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/foobar
echo "File digest before power failure:"
md5sum $SCRATCH_MNT/foobar | _filter_scratch
# Now simulate a power failure and mount the filesystem to replay the log tree. # After the log tree was replayed, we used to hit a BUG_ON() when processing
# the root orphan item for the deleted snapshot. This is because when processing # an orphan root the code expected to be the first code inserting the root into # the fs_info->fs_root_radix radix tree, while in reallity it was the second # caller attempting to do it - the first caller was the transaction commit that # took place after replaying the log tree, when updating the qgroup counters. _flakey_drop_and_remount
echo "File digest before after failure:"
# Must match what he got before the power failure. md5sum $SCRATCH_MNT/foobar | _filter_scratch
_unmount_flakey
status=0
exit
fs/btrfs/root-tree.c +9 -1
@@ -310,8 +310,16 @@ int btrfs_find_orphan_roots(struct btrfs_root *tree_root)set_bit (BTRFS_ROOT_ORPHAN_ITEM_INSERTED , &root->state); err =btrfs_insert_fs_root (root->fs_info, root); +/* +* The root might have been inserted already, as before we look +* for orphan roots, log replay might have happened, which +* triggers a transaction commit and qgroup accounting, which +* in turn reads and inserts fs roots while doing backref +* walking. +*/ +if (err == -EEXIST ) + err =0 ;if (err) { -BUG_ON (err == -EEXIST );btrfs_free_fs_root (root);break ; }
Greg Kroah-Hartman
maintainerPATCH 40/74 Revert "jffs2: Fix lock acquisition order bug in jffs2_write_begin"
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Betker <[email protected]>
commit 157078f64b8a9cd7011b6b900b2f2498df850748 upstream.
This reverts commit 5ffd3412ae55
("jffs2: Fix lock acquisition order bug in jffs2_write_begin").
The commit modified jffs2_write_begin() to remove a deadlock with jffs2_garbage_collect_live(), but this introduced new deadlocks found by multiple users. page_lock() actually has to be called before mutex_lock(&c->alloc_sem) or mutex_lock(&f->sem) because jffs2_write_end() and jffs2_readpage() are called with the page locked, and they acquire c->alloc_sem and f->sem, resp.
In other words, the lock order in jffs2_write_begin() was correct, and it is the jffs2_garbage_collect_live() path that has to be changed.
Revert the commit to get rid of the new deadlocks, and to clear the way for a better fix of the original deadlock.
--- fs/jffs2/file.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-)
fs/jffs2/file.c +18 -21
@@ -137,39 +137,33 @@ static int jffs2_write_begin(struct filestruct page *pg;struct inode *inode = mapping->host;struct jffs2_inode_info *f =JFFS2_INODE_INFO (inode); -struct jffs2_sb_info *c =JFFS2_SB_INFO (inode->i_sb); -struct jffs2_raw_inode ri; -uint32_t alloc_len =0 ;pgoff_t index = pos >>PAGE_CACHE_SHIFT ;uint32_t pageofs = index <<PAGE_CACHE_SHIFT ;int ret =0 ; -jffs2_dbg (1 ,"%s()\n" , __func__); - -if (pageofs > inode->i_size) { - ret =jffs2_reserve_space (c,sizeof (ri), &alloc_len, -ALLOC_NORMAL ,JFFS2_SUMMARY_INODE_SIZE ); -if (ret) -return ret; - } - -mutex_lock (&f->sem); pg =grab_cache_page_write_begin (mapping, index, flags); -if (!pg) { -if (alloc_len) -jffs2_complete_reservation (c); -mutex_unlock (&f->sem); +if (!pg)return -ENOMEM ; - } *pagep = pg; -if (alloc_len) { +jffs2_dbg (1 ,"%s()\n" , __func__); + +if (pageofs > inode->i_size) {/* Make new hole frag from old EOF to new page */ +struct jffs2_sb_info *c =JFFS2_SB_INFO (inode->i_sb); +struct jffs2_raw_inode ri;struct jffs2_full_dnode *fn; +uint32_t alloc_len;jffs2_dbg (1 ,"Writing new hole frag 0x%x-0x%x between current EOF and new page\n" , (unsigned int )inode->i_size, pageofs); + ret =jffs2_reserve_space (c,sizeof (ri), &alloc_len, +ALLOC_NORMAL ,JFFS2_SUMMARY_INODE_SIZE ); +if (ret) + goto out_page; + +mutex_lock (&f->sem);memset (&ri,0 ,sizeof (ri)); ri.magic =cpu_to_je16 (JFFS2_MAGIC_BITMASK );
@@ -196,6 +190,7 @@ static int jffs2_write_begin(struct fileif (IS_ERR (fn)) { ret =PTR_ERR (fn);jffs2_complete_reservation (c); +mutex_unlock (&f->sem); goto out_page; } ret =jffs2_add_full_dnode_to_inode (c, f, fn);
@@ -210,10 +205,12 @@ static int jffs2_write_begin(struct filejffs2_mark_node_obsolete (c, fn->raw);jffs2_free_full_dnode (fn);jffs2_complete_reservation (c); +mutex_unlock (&f->sem); goto out_page; }jffs2_complete_reservation (c); inode->i_size = pageofs; +mutex_unlock (&f->sem); }/*
@@ -222,18 +219,18 @@ static int jffs2_write_begin(struct file* case of a short-copy. */ if (!PageUptodate (pg)) { +mutex_lock (&f->sem); ret =jffs2_do_readpage_nolock (inode, pg); +mutex_unlock (&f->sem);if (ret) goto out_page; } -mutex_unlock (&f->sem);jffs2_dbg (1 ,"end write_begin(). pg->flags %lx\n" , pg->flags);return ret; out_page:unlock_page (pg);page_cache_release (pg); -mutex_unlock (&f->sem);return ret; }
Greg Kroah-Hartman
maintainerPATCH 43/74 dmaengine: pxa_dma: fix cyclic transfers
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Jarzmik <[email protected]>
commit f16921275cc3c2442d0b95225785a601603b990f upstream.
While testing audio with pxa2xx-ac97, underrun were happening while the user application was correctly feeding the music. Debug proved that the cyclic transfer is not cyclic, ie. the last descriptor did not loop on the first.
Another issue is that the descriptor length was always set to 8192, because of an trivial operator issue.
This was tested on a pxa27x platform.
--- drivers/dma/pxa_dma.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/dma/pxa_dma.c +7 -1
@@ -583,6 +583,8 @@ static void set_updater_desc(struct pxad (PXA_DCMD_LENGTH &sizeof (u32));if (flags &DMA_PREP_INTERRUPT ) updater->dcmd |=PXA_DCMD_ENDIRQEN ; +if (sw_desc->cyclic) + sw_desc->hw_desc[sw_desc->nb_desc -2 ]->ddadr = sw_desc->first; }static bool is_desc_completed (struct virt_dma_desc *vd)
@@ -673,6 +675,10 @@ static irqreturn_t pxad_chan_handler(intdev_dbg (&chan->vc.chan.dev->device,"%s(): checking txd %p[%x]: completed=%d\n" , __func__, vd, vd->tx.cookie,is_desc_completed (vd)); +if (to_pxad_sw_desc (vd)->cyclic) { +vchan_cyclic_callback (vd); +break ; + }if (is_desc_completed (vd)) {list_del (&vd->node);vchan_cookie_complete (vd);
@@ -1080,7 +1086,7 @@ pxad_prep_dma_cyclic(struct dma_chan *dcreturn NULL ;pxad_get_config (chan, dir, &dcmd, &dsadr, &dtadr); - dcmd |=PXA_DCMD_ENDIRQEN | (PXA_DCMD_LENGTH | period_len); + dcmd |=PXA_DCMD_ENDIRQEN | (PXA_DCMD_LENGTH & period_len);dev_dbg (&chan->vc.chan.dev->device,"%s(): buf_addr=0x%lx len=%zu period=%zu dir=%d flags=%lx\n" , __func__, (unsigned long )buf_addr, len, period_len, dir, flags);
Greg Kroah-Hartman
maintainerPATCH 44/74 adv7604: fix tx 5v detect regression
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Verkuil <[email protected]>
commit 0ba4581c84cfb39fd527f6b3457f1c97f6356c04 upstream.
The 5 volt detect functionality broke in 3.14: the code reads IO register 0x70 again after it has already been cleared. Instead it should use the cached irq_reg_0x70 value and the io_write to 0x71 to clear 0x70 can be dropped since this has already been done.
--- drivers/media/i2c/adv7604.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/media/i2c/adv7604.c +1 -2
@@ -1960,10 +1960,9 @@ static int adv76xx_isr(struct v4l2_subde }/* tx 5v detect */ - tx_5v =io_read (sd,0x70 ) & info->cable_det_mask; + tx_5v = irq_reg_0x70 & info->cable_det_mask;if (tx_5v) {v4l2_dbg (1 , debug, sd,"%s: tx_5v: 0x%x\n" , __func__, tx_5v); -io_write (sd,0x71 , tx_5v);adv76xx_s_detect_tx_5v_ctrl (sd);if (handled) *handled = true;
Greg Kroah-Hartman
maintainerPATCH 45/74 ALSA: usb-audio: Add a quirk for Plantronics DA45
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dennis Kadioglu <[email protected]>
commit 17e2df4613be57d0fab68df749f6b8114e453152 upstream.
Plantronics DA45 does not support reading the sample rate which leads to many lines of "cannot get freq at ep 0x4" and "cannot get freq at ep 0x84". This patch adds the USB ID of the DA45 to quirks.c and avoids those error messages.
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1124,6 +1124,7 @@ bool snd_usb_get_sample_rate_quirk(struccase USB_ID (0x045E ,0x076F ):/* MS Lifecam HD-6000 */ case USB_ID (0x045E ,0x0772 ):/* MS Lifecam Studio */ case USB_ID (0x045E ,0x0779 ):/* MS Lifecam HD-3000 */ +case USB_ID (0x047F ,0xAA05 ):/* Plantronics DA45 */ case USB_ID (0x04D8 ,0xFEEA ):/* Benchmark DAC1 Pre */ case USB_ID (0x074D ,0x3553 ):/* Outlaw RR2150 (Micronas UAC3553B) */ case USB_ID (0x21B4 ,0x0081 ):/* AudioQuest DragonFly */
Greg Kroah-Hartman
maintainerPATCH 46/74 ALSA: ctl: Fix ioctls for X32 ABI
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 6236d8bb2afcfe71b88ecea554e0dc638090a45f upstream.
The X32 ABI takes the same alignment like x86-64, and this may result in the incompatible struct size from ia32. Unfortunately, we hit this in some control ABI: struct snd_ctl_elem_value differs between them due to the position of 64bit variable array. This ends up with the unknown ioctl (ENOTTY) error.
The fix is to add the compat entries for the new aligned struct.
--- sound/core/control_compat.c | 90 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 16 deletions(-)
sound/core/control_compat.c +74 -16
@@ -170,6 +170,19 @@ struct snd_ctl_elem_value32 {unsigned char reserved[128 ]; }; +#ifdef CONFIG_X86_X32 +/* x32 has a different alignment for 64bit values from ia32 */ +struct snd_ctl_elem_value_x32 { +struct snd_ctl_elem_id id; +unsigned int indirect;/* bit-field causes misalignment */ +union { +s32 integer[128 ]; +unsigned char data[512 ]; +s64 integer64[64 ]; + } value; +unsigned char reserved[128 ]; +}; +#endif /* CONFIG_X86_X32 */ /* get the value type and count of the control */ static int get_ctl_type(struct snd_card *card, struct snd_ctl_elem_id *id,
@@ -219,9 +232,11 @@ static int get_elem_size(int type, int cstatic int copy_ctl_value_from_user (struct snd_card *card,struct snd_ctl_elem_value *data, -struct snd_ctl_elem_value32 __user *data32, +void __user *userdata, +void __user *valuep,int *typep,int *countp) { +struct snd_ctl_elem_value32 __user *data32 = userdata;int i, type, size;int uninitialized_var (count );unsigned int indirect;
@@ -239,8 +254,9 @@ static int copy_ctl_value_from_user(struif (type ==SNDRV_CTL_ELEM_TYPE_BOOLEAN || type ==SNDRV_CTL_ELEM_TYPE_INTEGER ) {for (i =0 ; i < count; i++) { +s32 __user *intp = valuep;int val; -if (get_user (val, &data32->value.integer[i])) +if (get_user (val, &intp[i]))return -EFAULT ; data->value.integer.value[i] = val; }
@@ -250,8 +266,7 @@ static int copy_ctl_value_from_user(strudev_err (card->dev,"snd_ioctl32_ctl_elem_value: unknown type %d\n" , type);return -EINVAL ; } -if (copy_from_user (data->value.bytes.data, - data32->value.data, size)) +if (copy_from_user (data->value.bytes.data, valuep, size))return -EFAULT ; }
@@ -261,7 +276,8 @@ static int copy_ctl_value_from_user(stru }/* restore the value to 32bit */ -static int copy_ctl_value_to_user (struct snd_ctl_elem_value32 __user *data32, +static int copy_ctl_value_to_user (void __user *userdata, +void __user *valuep,struct snd_ctl_elem_value *data,int type,int count) {
@@ -270,22 +286,22 @@ static int copy_ctl_value_to_user(structif (type ==SNDRV_CTL_ELEM_TYPE_BOOLEAN || type ==SNDRV_CTL_ELEM_TYPE_INTEGER ) {for (i =0 ; i < count; i++) { +s32 __user *intp = valuep;int val; val = data->value.integer.value[i]; -if (put_user (val, &data32->value.integer[i])) +if (put_user (val, &intp[i]))return -EFAULT ; } }else { size =get_elem_size (type, count); -if (copy_to_user (data32->value.data, - data->value.bytes.data, size)) +if (copy_to_user (valuep, data->value.bytes.data, size))return -EFAULT ; }return 0 ; } -static int snd_ctl_elem_read_user_compat (struct snd_card *card, -struct snd_ctl_elem_value32 __user *data32) +static int ctl_elem_read_user (struct snd_card *card, +void __user *userdata,void __user *valuep) {struct snd_ctl_elem_value *data;int err, type, count;
@@ -294,7 +310,9 @@ static int snd_ctl_elem_read_user_compatif (data ==NULL )return -ENOMEM ; -if ((err =copy_ctl_value_from_user (card, data, data32, &type, &count)) <0 ) + err =copy_ctl_value_from_user (card, data, userdata, valuep, + &type, &count); +if (err <0 ) goto error;snd_power_lock (card);
@@ -303,14 +321,15 @@ static int snd_ctl_elem_read_user_compat err =snd_ctl_elem_read (card, data);snd_power_unlock (card);if (err >=0 ) - err =copy_ctl_value_to_user (data32, data, type, count); + err =copy_ctl_value_to_user (userdata, valuep, data, + type, count); error:kfree (data);return err; } -static int snd_ctl_elem_write_user_compat (struct snd_ctl_file *file, -struct snd_ctl_elem_value32 __user *data32) +static int ctl_elem_write_user (struct snd_ctl_file *file, +void __user *userdata,void __user *valuep) {struct snd_ctl_elem_value *data;struct snd_card *card = file->card;
@@ -320,7 +339,9 @@ static int snd_ctl_elem_write_user_compaif (data ==NULL )return -ENOMEM ; -if ((err =copy_ctl_value_from_user (card, data, data32, &type, &count)) <0 ) + err =copy_ctl_value_from_user (card, data, userdata, valuep, + &type, &count); +if (err <0 ) goto error;snd_power_lock (card);
@@ -329,12 +350,39 @@ static int snd_ctl_elem_write_user_compa err =snd_ctl_elem_write (card, file, data);snd_power_unlock (card);if (err >=0 ) - err =copy_ctl_value_to_user (data32, data, type, count); + err =copy_ctl_value_to_user (userdata, valuep, data, + type, count); error:kfree (data);return err; } +static int snd_ctl_elem_read_user_compat (struct snd_card *card, +struct snd_ctl_elem_value32 __user *data32) +{ +return ctl_elem_read_user (card, data32, &data32->value); +} + +static int snd_ctl_elem_write_user_compat (struct snd_ctl_file *file, +struct snd_ctl_elem_value32 __user *data32) +{ +return ctl_elem_write_user (file, data32, &data32->value); +} + +#ifdef CONFIG_X86_X32 +static int snd_ctl_elem_read_user_x32 (struct snd_card *card, +struct snd_ctl_elem_value_x32 __user *data32) +{ +return ctl_elem_read_user (card, data32, &data32->value); +} + +static int snd_ctl_elem_write_user_x32 (struct snd_ctl_file *file, +struct snd_ctl_elem_value_x32 __user *data32) +{ +return ctl_elem_write_user (file, data32, &data32->value); +} +#endif /* CONFIG_X86_X32 */ +/* add or replace a user control */ static int snd_ctl_elem_add_compat(struct snd_ctl_file *file, struct snd_ctl_elem_info32 __user *data32,
@@ -393,6 +441,10 @@ enum { SNDRV_CTL_IOCTL_ELEM_WRITE32 = _IOWR('U', 0x13, struct snd_ctl_elem_value32), SNDRV_CTL_IOCTL_ELEM_ADD32 = _IOWR('U', 0x17, struct snd_ctl_elem_info32), SNDRV_CTL_IOCTL_ELEM_REPLACE32 = _IOWR('U', 0x18, struct snd_ctl_elem_info32), +#ifdef CONFIG_X86_X32 + SNDRV_CTL_IOCTL_ELEM_READ_X32 = _IOWR('U', 0x12, struct snd_ctl_elem_value_x32), + SNDRV_CTL_IOCTL_ELEM_WRITE_X32 = _IOWR('U', 0x13, struct snd_ctl_elem_value_x32), +#endif /* CONFIG_X86_X32 */ };static inline long snd_ctl_ioctl_compat (struct file *file,unsigned int cmd,unsigned long arg)
@@ -431,6 +483,12 @@ static inline long snd_ctl_ioctl_compat(return snd_ctl_elem_add_compat (ctl, argp,0 );case SNDRV_CTL_IOCTL_ELEM_REPLACE32 :return snd_ctl_elem_add_compat (ctl, argp,1 ); +#ifdef CONFIG_X86_X32 +case SNDRV_CTL_IOCTL_ELEM_READ_X32 : +return snd_ctl_elem_read_user_x32 (ctl->card, argp); +case SNDRV_CTL_IOCTL_ELEM_WRITE_X32 : +return snd_ctl_elem_write_user_x32 (ctl, argp); +#endif /* CONFIG_X86_X32 */ }down_read (&snd_ioctl_rwsem);
Greg Kroah-Hartman
maintainerPATCH 47/74 ALSA: hda - Fix mic issues on Acer Aspire E1-472
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon South <[email protected]>
commit 02322ac9dee9aff8d8862e8d6660ebe102f492ea upstream.
This patch applies the microphone-related fix created for the Acer Aspire E1-572 to the E1-472 as well, as it uses the same Realtek ALC282 CODEC and demonstrates the same issues.
This patch allows an external, headset microphone to be used and limits the gain on the (quite noisy) internal microphone.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -5386,6 +5386,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1025 ,0x080d ,"Acer Aspire V5-122P" ,ALC269_FIXUP_ASPIRE_HEADSET_MIC ),SND_PCI_QUIRK (0x1025 ,0x0740 ,"Acer AO725" ,ALC271_FIXUP_HP_GATE_MIC_JACK ),SND_PCI_QUIRK (0x1025 ,0x0742 ,"Acer AO756" ,ALC271_FIXUP_HP_GATE_MIC_JACK ), +SND_PCI_QUIRK (0x1025 ,0x0762 ,"Acer Aspire E1-472" ,ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572 ),SND_PCI_QUIRK (0x1025 ,0x0775 ,"Acer Aspire E1-572" ,ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572 ),SND_PCI_QUIRK (0x1025 ,0x079b ,"Acer Aspire V5-573G" ,ALC282_FIXUP_ASPIRE_V5_PINS ), SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
Greg Kroah-Hartman
maintainerPATCH 48/74 ALSA: rawmidi: Fix ioctls X32 ABI
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 2251fbbc1539f05b0b206b37a602d5776be37252 upstream.
Like the previous fixes for ctl and PCM, we need a fix for incompatible X32 ABI regarding the rawmidi: namely, struct snd_rawmidi_status has the timespec, and the size and the alignment on X32 differ from IA32.
This patch fixes the incompatible ioctl for X32.
--- sound/core/rawmidi_compat.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
sound/core/rawmidi_compat.c +53 -0
@@ -94,9 +94,58 @@ static int snd_rawmidi_ioctl_status_compreturn 0 ; } +#ifdef CONFIG_X86_X32 +/* X32 ABI has 64bit timespec and 64bit alignment */ +struct snd_rawmidi_status_x32 { +s32 stream; +u32 rsvd;/* alignment */ +struct timespec tstamp; +u32 avail; +u32 xruns; +unsigned char reserved[16 ]; +} __attribute__((packed)); + +#define put_timespec (src, dst) copy_to_user(dst, src, sizeof(*dst)) + +static int snd_rawmidi_ioctl_status_x32 (struct snd_rawmidi_file *rfile, +struct snd_rawmidi_status_x32 __user *src) +{ +int err; +struct snd_rawmidi_status status; + +if (rfile->output ==NULL ) +return -EINVAL ; +if (get_user (status.stream, &src->stream)) +return -EFAULT ; + +switch (status.stream) { +case SNDRV_RAWMIDI_STREAM_OUTPUT : + err =snd_rawmidi_output_status (rfile->output, &status); +break ; +case SNDRV_RAWMIDI_STREAM_INPUT : + err =snd_rawmidi_input_status (rfile->input, &status); +break ; +default : +return -EINVAL ; + } +if (err <0 ) +return err; + +if (put_timespec (&status.tstamp, &src->tstamp) || +put_user (status.avail, &src->avail) || +put_user (status.xruns, &src->xruns)) +return -EFAULT ; + +return 0 ; +} +#endif /* CONFIG_X86_X32 */ +enum { SNDRV_RAWMIDI_IOCTL_PARAMS32 = _IOWR('W', 0x10, struct snd_rawmidi_params32), SNDRV_RAWMIDI_IOCTL_STATUS32 = _IOWR('W', 0x20, struct snd_rawmidi_status32), +#ifdef CONFIG_X86_X32 + SNDRV_RAWMIDI_IOCTL_STATUS_X32 = _IOWR('W', 0x20, struct snd_rawmidi_status_x32), +#endif /* CONFIG_X86_X32 */ };static long snd_rawmidi_ioctl_compat (struct file *file,unsigned int cmd,unsigned long arg)
@@ -115,6 +164,10 @@ static long snd_rawmidi_ioctl_compat(strreturn snd_rawmidi_ioctl_params_compat (rfile, argp);case SNDRV_RAWMIDI_IOCTL_STATUS32 :return snd_rawmidi_ioctl_status_compat (rfile, argp); +#ifdef CONFIG_X86_X32 +case SNDRV_RAWMIDI_IOCTL_STATUS_X32 : +return snd_rawmidi_ioctl_status_x32 (rfile, argp); +#endif /* CONFIG_X86_X32 */ }return -ENOIOCTLCMD ; }
Greg Kroah-Hartman
maintainerPATCH 49/74 ALSA: timer: Fix ioctls for X32 ABI
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit b24e7ad1fdc22177eb3e51584e1cfcb45d818488 upstream.
X32 ABI takes the 64bit timespec, thus the timer user status ioctl becomes incompatible with IA32. This results in NOTTY error when the ioctl is issued.
Meanwhile, this struct in X32 is essentially identical with the one in X86-64, so we can just bypassing to the existing code for this specific compat ioctl.
--- sound/core/timer_compat.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
sound/core/timer_compat.c +13 -0
@@ -88,12 +88,21 @@ static int snd_timer_user_status_compat(return 0 ; } +#ifdef CONFIG_X86_X32 +/* X32 ABI has the same struct as x86-64 */ +#define snd_timer_user_status_x32 (file, s) \ + snd_timer_user_status(file, s) +#endif /* CONFIG_X86_X32 */ +/* */ enum { SNDRV_TIMER_IOCTL_INFO32 = _IOR('T', 0x11, struct snd_timer_info32), SNDRV_TIMER_IOCTL_STATUS32 = _IOW('T', 0x14, struct snd_timer_status32), +#ifdef CONFIG_X86_X32 + SNDRV_TIMER_IOCTL_STATUS_X32 = _IOW('T', 0x14, struct snd_timer_status), +#endif /* CONFIG_X86_X32 */ };static long snd_timer_user_ioctl_compat (struct file *file,unsigned int cmd,unsigned long arg)
@@ -122,6 +131,10 @@ static long snd_timer_user_ioctl_compat(return snd_timer_user_info_compat (file, argp);case SNDRV_TIMER_IOCTL_STATUS32 :return snd_timer_user_status_compat (file, argp); +#ifdef CONFIG_X86_X32 +case SNDRV_TIMER_IOCTL_STATUS_X32 : +return snd_timer_user_status_x32 (file, argp); +#endif /* CONFIG_X86_X32 */ }return -ENOIOCTLCMD ; }
Greg Kroah-Hartman
maintainerPATCH 50/74 ALSA: pcm: Fix ioctls for X32 ABI
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 513ace79b657e2022a592e77f24074e088681ecc upstream.
X32 ABI uses the 64bit timespec in addition to 64bit alignment of 64bit values. This leads to incompatibilities in some PCM ioctls involved with snd_pcm_channel_info, snd_pcm_status and snd_pcm_sync_ptr structs. Fix the PCM compat ABI for these ioctls like the previous commit for ctl API.
--- sound/core/pcm_compat.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 176 insertions(+), 1 deletion(-)
sound/core/pcm_compat.c +176 -1
@@ -183,6 +183,14 @@ static int snd_pcm_ioctl_channel_info_coreturn err; } +#ifdef CONFIG_X86_X32 +/* X32 ABI has the same struct as x86-64 for snd_pcm_channel_info */ +static int snd_pcm_channel_info_user (struct snd_pcm_substream *substream, +struct snd_pcm_channel_info __user *src); +#define snd_pcm_ioctl_channel_info_x32 (s, p) \ + snd_pcm_channel_info_user(s, p) +#endif /* CONFIG_X86_X32 */ +struct snd_pcm_status32 {s32 state;struct compat_timespec trigger_tstamp;
@@ -243,6 +251,71 @@ static int snd_pcm_status_user_compat(streturn err; } +#ifdef CONFIG_X86_X32 +/* X32 ABI has 64bit timespec and 64bit alignment */ +struct snd_pcm_status_x32 { +s32 state; +u32 rsvd;/* alignment */ +struct timespec trigger_tstamp; +struct timespec tstamp; +u32 appl_ptr; +u32 hw_ptr; +s32 delay; +u32 avail; +u32 avail_max; +u32 overrange; +s32 suspended_state; +u32 audio_tstamp_data; +struct timespec audio_tstamp; +struct timespec driver_tstamp; +u32 audio_tstamp_accuracy; +unsigned char reserved[52 -2 *sizeof (struct timespec )]; +} __packed; + +#define put_timespec (src, dst) copy_to_user(dst, src, sizeof(*dst)) + +static int snd_pcm_status_user_x32 (struct snd_pcm_substream *substream, +struct snd_pcm_status_x32 __user *src, +bool ext) +{ +struct snd_pcm_status status; +int err; + +memset (&status,0 ,sizeof (status)); +/* +* with extension, parameters are read/write, +* get audio_tstamp_data from user, +* ignore rest of status structure +*/ +if (ext &&get_user (status.audio_tstamp_data, + (u32 __user *)(&src->audio_tstamp_data))) +return -EFAULT ; + err =snd_pcm_status (substream, &status); +if (err <0 ) +return err; + +if (clear_user (src,sizeof (*src))) +return -EFAULT ; +if (put_user (status.state, &src->state) || +put_timespec (&status.trigger_tstamp, &src->trigger_tstamp) || +put_timespec (&status.tstamp, &src->tstamp) || +put_user (status.appl_ptr, &src->appl_ptr) || +put_user (status.hw_ptr, &src->hw_ptr) || +put_user (status.delay, &src->delay) || +put_user (status.avail, &src->avail) || +put_user (status.avail_max, &src->avail_max) || +put_user (status.overrange, &src->overrange) || +put_user (status.suspended_state, &src->suspended_state) || +put_user (status.audio_tstamp_data, &src->audio_tstamp_data) || +put_timespec (&status.audio_tstamp, &src->audio_tstamp) || +put_timespec (&status.driver_tstamp, &src->driver_tstamp) || +put_user (status.audio_tstamp_accuracy, &src->audio_tstamp_accuracy)) +return -EFAULT ; + +return err; +} +#endif /* CONFIG_X86_X32 */ +/* both for HW_PARAMS and HW_REFINE */ static int snd_pcm_ioctl_hw_params_compat(struct snd_pcm_substream *substream, int refine,
@@ -469,6 +542,93 @@ static int snd_pcm_ioctl_sync_ptr_compatreturn 0 ; } +#ifdef CONFIG_X86_X32 +/* X32 ABI has 64bit timespec and 64bit alignment */ +struct snd_pcm_mmap_status_x32 { +s32 state; +s32 pad1; +u32 hw_ptr; +u32 pad2;/* alignment */ +struct timespec tstamp; +s32 suspended_state; +struct timespec audio_tstamp; +} __packed; + +struct snd_pcm_mmap_control_x32 { +u32 appl_ptr; +u32 avail_min; +}; + +struct snd_pcm_sync_ptr_x32 { +u32 flags; +u32 rsvd;/* alignment */ +union { +struct snd_pcm_mmap_status_x32 status; +unsigned char reserved[64 ]; + } s; +union { +struct snd_pcm_mmap_control_x32 control; +unsigned char reserved[64 ]; + } c; +} __packed; + +static int snd_pcm_ioctl_sync_ptr_x32 (struct snd_pcm_substream *substream, +struct snd_pcm_sync_ptr_x32 __user *src) +{ +struct snd_pcm_runtime *runtime = substream->runtime; +volatile struct snd_pcm_mmap_status *status; +volatile struct snd_pcm_mmap_control *control; +u32 sflags; +struct snd_pcm_mmap_control scontrol; +struct snd_pcm_mmap_status sstatus; +snd_pcm_uframes_t boundary; +int err; + +if (snd_BUG_ON (!runtime)) +return -EINVAL ; + +if (get_user (sflags, &src->flags) || +get_user (scontrol.appl_ptr, &src->c.control.appl_ptr) || +get_user (scontrol.avail_min, &src->c.control.avail_min)) +return -EFAULT ; +if (sflags &SNDRV_PCM_SYNC_PTR_HWSYNC ) { + err =snd_pcm_hwsync (substream); +if (err <0 ) +return err; + } + status = runtime->status; + control = runtime->control; + boundary =recalculate_boundary (runtime); +if (!boundary) + boundary =0x7fffffff ; +snd_pcm_stream_lock_irq (substream); +/* FIXME: we should consider the boundary for the sync from app */ +if (!(sflags &SNDRV_PCM_SYNC_PTR_APPL )) + control->appl_ptr = scontrol.appl_ptr; +else + scontrol.appl_ptr = control->appl_ptr % boundary; +if (!(sflags &SNDRV_PCM_SYNC_PTR_AVAIL_MIN )) + control->avail_min = scontrol.avail_min; +else + scontrol.avail_min = control->avail_min; + sstatus.state = status->state; + sstatus.hw_ptr = status->hw_ptr % boundary; + sstatus.tstamp = status->tstamp; + sstatus.suspended_state = status->suspended_state; + sstatus.audio_tstamp = status->audio_tstamp; +snd_pcm_stream_unlock_irq (substream); +if (put_user (sstatus.state, &src->s.status.state) || +put_user (sstatus.hw_ptr, &src->s.status.hw_ptr) || +put_timespec (&sstatus.tstamp, &src->s.status.tstamp) || +put_user (sstatus.suspended_state, &src->s.status.suspended_state) || +put_timespec (&sstatus.audio_tstamp, &src->s.status.audio_tstamp) || +put_user (scontrol.appl_ptr, &src->c.control.appl_ptr) || +put_user (scontrol.avail_min, &src->c.control.avail_min)) +return -EFAULT ; + +return 0 ; +} +#endif /* CONFIG_X86_X32 */ /* */
@@ -487,7 +647,12 @@ enum { SNDRV_PCM_IOCTL_WRITEN_FRAMES32 = _IOW('A', 0x52, struct snd_xfern32), SNDRV_PCM_IOCTL_READN_FRAMES32 = _IOR('A', 0x53, struct snd_xfern32), SNDRV_PCM_IOCTL_SYNC_PTR32 = _IOWR('A', 0x23, struct snd_pcm_sync_ptr32), - +#ifdef CONFIG_X86_X32 + SNDRV_PCM_IOCTL_CHANNEL_INFO_X32 = _IOR('A', 0x32, struct snd_pcm_channel_info), + SNDRV_PCM_IOCTL_STATUS_X32 = _IOR('A', 0x20, struct snd_pcm_status_x32), + SNDRV_PCM_IOCTL_STATUS_EXT_X32 = _IOWR('A', 0x24, struct snd_pcm_status_x32), + SNDRV_PCM_IOCTL_SYNC_PTR_X32 = _IOWR('A', 0x23, struct snd_pcm_sync_ptr_x32), +#endif /* CONFIG_X86_X32 */ };static long snd_pcm_ioctl_compat (struct file *file,unsigned int cmd,unsigned long arg)
@@ -559,6 +724,16 @@ static long snd_pcm_ioctl_compat(structreturn snd_pcm_ioctl_rewind_compat (substream, argp);case SNDRV_PCM_IOCTL_FORWARD32 :return snd_pcm_ioctl_forward_compat (substream, argp); +#ifdef CONFIG_X86_X32 +case SNDRV_PCM_IOCTL_STATUS_X32 : +return snd_pcm_status_user_x32 (substream, argp, false); +case SNDRV_PCM_IOCTL_STATUS_EXT_X32 : +return snd_pcm_status_user_x32 (substream, argp, true); +case SNDRV_PCM_IOCTL_SYNC_PTR_X32 : +return snd_pcm_ioctl_sync_ptr_x32 (substream, argp); +case SNDRV_PCM_IOCTL_CHANNEL_INFO_X32 : +return snd_pcm_ioctl_channel_info_x32 (substream, argp); +#endif /* CONFIG_X86_X32 */ }return -ENOIOCTLCMD ;
Greg Kroah-Hartman
maintainerPATCH 51/74 ALSA: seq: oss: Dont drain at closing a client
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 197b958c1e76a575d77038cc98b4bebc2134279f upstream.
The OSS sequencer client tries to drain the pending events at releasing. Unfortunately, as spotted by syzkaller fuzzer, this may lead to an unkillable process state when the event has been queued at the far future. Since the process being released can't be signaled any longer, it remains and waits for the echo-back event in that far future.
Back to history, the draining feature was implemented at the time we misinterpreted POSIX definition for blocking file operation. Actually, such a behavior is superfluous at release, and we should just release the device as is instead of keeping it up forever.
This patch just removes the draining call that may block the release for too long time unexpectedly.
--- sound/core/seq/oss/seq_oss.c | 2 -- sound/core/seq/oss/seq_oss_device.h | 1 - sound/core/seq/oss/seq_oss_init.c | 16 ---------------- 3 files changed, 19 deletions(-)
sound/core/seq/oss/seq_oss.c +0 -2
@@ -148,8 +148,6 @@ odev_release(struct inode *inode, structif ((dp = file->private_data) ==NULL )return 0 ; -snd_seq_oss_drain_write (dp); -mutex_lock (®ister_mutex);snd_seq_oss_release (dp);mutex_unlock (®ister_mutex);
sound/core/seq/oss/seq_oss_device.h +0 -1
@@ -127,7 +127,6 @@ int snd_seq_oss_write(struct seq_oss_devunsigned int snd_seq_oss_poll (struct seq_oss_devinfo *dp,struct file *file,poll_table * wait);void snd_seq_oss_reset (struct seq_oss_devinfo *dp); -void snd_seq_oss_drain_write (struct seq_oss_devinfo *dp);/* */ void snd_seq_oss_process_queue (struct seq_oss_devinfo *dp,abstime_t time);
sound/core/seq/oss/seq_oss_init.c +0 -16
@@ -436,22 +436,6 @@ snd_seq_oss_release(struct seq_oss_devin/* -* Wait until the queue is empty (if we don't have nonblock) -*/ -void -snd_seq_oss_drain_write (struct seq_oss_devinfo *dp) -{ -if (! dp->timer->running) -return ; -if (is_write_mode (dp->file_mode) && !is_nonblock_mode (dp->file_mode) && - dp->writeq) { -while (snd_seq_oss_writeq_sync (dp->writeq)) - ; - } -} - - -/* * reset sequencer devices */ void
Greg Kroah-Hartman
maintainerPATCH 52/74 ALSA: hdspm: Fix wrong boolean ctl value accesses
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 537e48136295c5860a92138c5ea3959b9542868b upstream.
snd-hdspm driver accesses enum item values (int) instead of boolean values (long) wrongly for some ctl elements. This patch fixes them.
--- sound/pci/rme9652/hdspm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
sound/pci/rme9652/hdspm.c +4 -4
@@ -2261,7 +2261,7 @@ static int snd_hdspm_put_system_sample_r {struct hdspm *hdspm =snd_kcontrol_chip (kcontrol); -hdspm_set_dds_value (hdspm, ucontrol->value.enumerated.item[0 ]); +hdspm_set_dds_value (hdspm, ucontrol->value.integer.value[0 ]);return 0 ; }
@@ -4449,7 +4449,7 @@ static int snd_hdspm_get_tco_word_term(s {struct hdspm *hdspm =snd_kcontrol_chip (kcontrol); - ucontrol->value.enumerated.item[0 ] = hdspm->tco->term; + ucontrol->value.integer.value[0 ] = hdspm->tco->term;return 0 ; }
@@ -4460,8 +4460,8 @@ static int snd_hdspm_put_tco_word_term(s {struct hdspm *hdspm =snd_kcontrol_chip (kcontrol); -if (hdspm->tco->term != ucontrol->value.enumerated.item[0 ]) { - hdspm->tco->term = ucontrol->value.enumerated.item[0 ]; +if (hdspm->tco->term != ucontrol->value.integer.value[0 ]) { + hdspm->tco->term = ucontrol->value.integer.value[0 ];hdspm_tco_write (hdspm);
Greg Kroah-Hartman
maintainerPATCH 53/74 ALSA: hdsp: Fix wrong boolean ctl value accesses
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit eab3c4db193f5fcccf70e884de9a922ca2c63d80 upstream.
snd-hdsp driver accesses enum item values (int) instead of boolean values (long) wrongly for some ctl elements. This patch fixes them.
--- sound/pci/rme9652/hdsp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/rme9652/hdsp.c +2 -2
@@ -2879,7 +2879,7 @@ static int snd_hdsp_get_dds_offset(struc {struct hdsp *hdsp =snd_kcontrol_chip (kcontrol); - ucontrol->value.enumerated.item[0 ] =hdsp_dds_offset (hdsp); + ucontrol->value.integer.value[0 ] =hdsp_dds_offset (hdsp);return 0 ; }
@@ -2891,7 +2891,7 @@ static int snd_hdsp_put_dds_offset(strucif (!snd_hdsp_use_is_exclusive (hdsp))return -EBUSY ; - val = ucontrol->value.enumerated.item[0 ]; + val = ucontrol->value.integer.value[0 ];spin_lock_irq (&hdsp->lock);if (val !=hdsp_dds_offset (hdsp)) change = (hdsp_set_dds_offset (hdsp, val) ==0 ) ?1 :0 ;
Greg Kroah-Hartman
maintainerPATCH 54/74 ALSA: hdspm: Fix zero-division
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit c1099c3294c2344110085a38c50e478a5992b368 upstream.
HDSPM driver contains a code issuing zero-division potentially in system sample rate ctl code. This patch fixes it by not processing a zero or invalid rate value as a divisor, as well as excluding the invalid value to be passed via the given ctl element.
--- sound/pci/rme9652/hdspm.c | 8 ++++++++ 1 file changed, 8 insertions(+)
sound/pci/rme9652/hdspm.c +8 -0
@@ -1601,6 +1601,9 @@ static void hdspm_set_dds_value(struct h {u64 n; +if (snd_BUG_ON (rate <=0 )) +return ; +if (rate >=112000 ) rate /=4 ;else if (rate >=56000 )
@@ -2215,6 +2218,8 @@ static int hdspm_get_system_sample_rate( }else {/* slave mode, return external sample rate */ rate =hdspm_external_sample_rate (hdspm); +if (!rate) + rate = hdspm->system_sample_rate; } }
@@ -2260,7 +2265,10 @@ static int snd_hdspm_put_system_sample_r ucontrol) {struct hdspm *hdspm =snd_kcontrol_chip (kcontrol); +int rate = ucontrol->value.integer.value[0 ]; +if (rate <27000 || rate >207000 ) +return -EINVAL ;hdspm_set_dds_value (hdspm, ucontrol->value.integer.value[0 ]);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 55/74 ALSA: timer: Fix broken compat timer user status ioctl
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 3a72494ac2a3bd229db941d51e7efe2f6ccd947b upstream.
The timer user status compat ioctl returned the bogus struct used for 64bit architectures instead of the 32bit one. This patch addresses it to return the proper struct.
--- sound/core/timer_compat.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/core/timer_compat.c +3 -2
@@ -70,13 +70,14 @@ static int snd_timer_user_status_compat( struct snd_timer_status32 __user *_status) {struct snd_timer_user *tu; -struct snd_timer_status status; +struct snd_timer_status32 status; tu = file->private_data;if (snd_BUG_ON (!tu->timeri))return -ENXIO ;memset (&status,0 ,sizeof (status)); - status.tstamp = tu->tstamp; + status.tstamp.tv_sec = tu->tstamp.tv_sec; + status.tstamp.tv_nsec = tu->tstamp.tv_nsec; status.resolution =snd_timer_resolution (tu->timeri); status.lost = tu->timeri->lost; status.overrun = tu->overrun;
Greg Kroah-Hartman
maintainerPATCH 56/74 usb: chipidea: otg: change workqueue ci_otg as freezable
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Chen <[email protected]>
commit d144dfea8af7108f613139623e63952ed7e69c0c upstream.
If we use USB ID pin as wakeup source, and there is a USB block device on this USB OTG (ID) cable, the system will be deadlock after system resume.
The root cause for this problem is: the workqueue ci_otg may try to remove hcd before the driver resume has finished, and hcd will disconnect the device on it, then, it will call device_release_driver, and holds the device lock "dev->mutex", but it is never unlocked since it waits workqueue writeback to run to flush the block information, but the workqueue writeback is freezable, it is not thawed before driver resume has finished.
When the driver (device: sd 0:0:0:0:) resume goes to dpm_complete, it tries to get its device lock "dev->mutex", but it can't get it forever, then the deadlock occurs. Below call stacks show the situation.
So, in order to fix this problem, we need to change workqueue ci_otg as freezable, then the work item in this workqueue will be run after driver's resume, this workqueue will not be blocked forever like above case since the workqueue writeback has been thawed too.
Tested at: i.mx6qdl-sabresd and i.mx6sx-sdb.
[ 555.178869] kworker/u2:13 D c07de74c 0 826 2 0x00000000 [ 555.185310] Workqueue: ci_otg ci_otg_work [ 555.189353] Backtrace: [ 555.191849] [<c07de4fc>] (__schedule) from [<c07dec6c>] (schedule+0x48/0xa0) [ 555.198912] r10:ee471ba0 r9:00000000 r8:00000000 r7:00000002 r6:ee470000 r5:ee471ba4 [ 555.206867] r4:ee470000 [ 555.209453] [<c07dec24>] (schedule) from [<c07e2fc4>] (schedule_timeout+0x15c/0x1e0) [ 555.217212] r4:7fffffff r3:edc2b000 [ 555.220862] [<c07e2e68>] (schedule_timeout) from [<c07df6c8>] (wait_for_common+0x94/0x144) [ 555.229140] r8:00000000 r7:00000002 r6:ee470000 r5:ee471ba4 r4:7fffffff [ 555.235980] [<c07df634>] (wait_for_common) from [<c07df790>] (wait_for_completion+0x18/0x1c) [ 555.244430] r10:00000001 r9:c0b5563c r8:c0042e48 r7:ef086000 r6:eea4372c r5:ef131b00 [ 555.252383] r4:00000000 [ 555.254970] [<c07df778>] (wait_for_completion) from [<c0043cb8>] (flush_work+0x19c/0x234) [ 555.263177] [<c0043b1c>] (flush_work) from [<c0043fac>] (flush_delayed_work+0x48/0x4c) [ 555.271106] r8:ed5b5000 r7:c0b38a3c r6:eea439cc r5:eea4372c r4:eea4372c [ 555.277958] [<c0043f64>] (flush_delayed_work) from [<c00eae18>] (bdi_unregister+0x84/0xec) [ 555.286236] r4:eea43520 r3:20000153 [ 555.289885] [<c00ead94>] (bdi_unregister) from [<c02c2154>] (blk_cleanup_queue+0x180/0x29c) [ 555.298250] r5:eea43808 r4:eea43400 [ 555.301909] [<c02c1fd4>] (blk_cleanup_queue) from [<c0417914>] (__scsi_remove_device+0x48/0xb8) [ 555.310623] r7:00000000 r6:20000153 r5:ededa950 r4:ededa800 [ 555.316403] [<c04178cc>] (__scsi_remove_device) from [<c0415e90>] (scsi_forget_host+0x64/0x68) [ 555.325028] r5:ededa800 r4:ed5b5000 [ 555.328689] [<c0415e2c>] (scsi_forget_host) from [<c0409828>] (scsi_remove_host+0x78/0x104) [ 555.337054] r5:ed5b5068 r4:ed5b5000 [ 555.340709] [<c04097b0>] (scsi_remove_host) from [<c04cdfcc>] (usb_stor_disconnect+0x50/0xb4) [ 555.349247] r6:ed5b56e4 r5:ed5b5818 r4:ed5b5690 r3:00000008 [ 555.355025] [<c04cdf7c>] (usb_stor_disconnect) from [<c04b3bc8>] (usb_unbind_interface+0x78/0x25c) [ 555.363997] r8:c13919b4 r7:edd3c000 r6:edd3c020 r5:ee551c68 r4:ee551c00 r3:c04cdf7c [ 555.371892] [<c04b3b50>] (usb_unbind_interface) from [<c03dc248>] (__device_release_driver+0x8c/0x118) [ 555.381213] r10:00000001 r9:edd90c00 r8:c13919b4 r7:ee551c68 r6:c0b546e0 r5:c0b5563c [ 555.389167] r4:edd3c020 [ 555.391752] [<c03dc1bc>] (__device_release_driver) from [<c03dc2fc>] (device_release_driver+0x28/0x34) [ 555.401071] r5:edd3c020 r4:edd3c054 [ 555.404721] [<c03dc2d4>] (device_release_driver) from [<c03db304>] (bus_remove_device+0xe0/0x110) [ 555.413607] r5:edd3c020 r4:ef17f04c [ 555.417253] [<c03db224>] (bus_remove_device) from [<c03d8128>] (device_del+0x114/0x21c) [ 555.425270] r6:edd3c028 r5:edd3c020 r4:ee551c00 r3:00000000 [ 555.431045] [<c03d8014>] (device_del) from [<c04b1560>] (usb_disable_device+0xa4/0x1e8) [ 555.439061] r8:edd3c000 r7:eded8000 r6:00000000 r5:00000001 r4:ee551c00 [ 555.445906] [<c04b14bc>] (usb_disable_device) from [<c04a8e54>] (usb_disconnect+0x74/0x224) [ 555.454271] r9:edd90c00 r8:ee551000 r7:ee551c68 r6:ee551c9c r5:ee551c00 r4:00000001 [ 555.462156] [<c04a8de0>] (usb_disconnect) from [<c04a8fb8>] (usb_disconnect+0x1d8/0x224) [ 555.470259] r10:00000001 r9:edd90000 r8:ee471e2c r7:ee551468 r6:ee55149c r5:ee551400 [ 555.478213] r4:00000001 [ 555.480797] [<c04a8de0>] (usb_disconnect) from [<c04ae5ec>] (usb_remove_hcd+0xa0/0x1ac) [ 555.488813] r10:00000001 r9:ee471eb0 r8:00000000 r7:ef3d9500 r6:eded810c r5:eded80b0 [ 555.496765] r4:eded8000 [ 555.499351] [<c04ae54c>] (usb_remove_hcd) from [<c04d4158>] (host_stop+0x28/0x64) [ 555.506847] r6:eeb50010 r5:eded8000 r4:eeb51010 [ 555.511563] [<c04d4130>] (host_stop) from [<c04d09b8>] (ci_otg_work+0xc4/0x124) [ 555.518885] r6:00000001 r5:eeb50010 r4:eeb502a0 r3:c04d4130 [ 555.524665] [<c04d08f4>] (ci_otg_work) from [<c00454f0>] (process_one_work+0x194/0x420) [ 555.532682] r6:ef086000 r5:eeb502a0 r4:edc44480 [ 555.537393] [<c004535c>] (process_one_work) from [<c00457b0>] (worker_thread+0x34/0x514) [ 555.545496] r10:edc44480 r9:ef086000 r8:c0b1a100 r7:ef086034 r6:00000088 r5:edc44498 [ 555.553450] r4:ef086000 [ 555.556032] [<c004577c>] (worker_thread) from [<c004bab4>] (kthread+0xdc/0xf8) [ 555.563268] r10:00000000 r9:00000000 r8:00000000 r7:c004577c r6:edc44480 r5:eddc15c0 [ 555.571221] r4:00000000 [ 555.573804] [<c004b9d8>] (kthread) from [<c000fef0>] (ret_from_fork+0x14/0x24) [ 555.581040] r7:00000000 r6:00000000 r5:c004b9d8 r4:eddc15c0
[ 553.429383] sh D c07de74c 0 694 691 0x00000000 [ 553.435801] Backtrace: [ 553.438295] [<c07de4fc>] (__schedule) from [<c07dec6c>] (schedule+0x48/0xa0) [ 553.445358] r10:edd3c054 r9:edd3c078 r8:edddbd50 r7:edcbbc00 r6:c1377c34 r5:60000153 [ 553.453313] r4:eddda000 [ 553.455896] [<c07dec24>] (schedule) from [<c07deff8>] (schedule_preempt_disabled+0x10/0x14) [ 553.464261] r4:edd3c058 r3:0000000a [ 553.467910] [<c07defe8>] (schedule_preempt_disabled) from [<c07e0bbc>] (mutex_lock_nested+0x1a0/0x3e8) [ 553.477254] [<c07e0a1c>] (mutex_lock_nested) from [<c03e927c>] (dpm_complete+0xc0/0x1b0) [ 553.485358] r10:00561408 r9:edd3c054 r8:c0b4863c r7:edddbd90 r6:c0b485d8 r5:edd3c020 [ 553.493313] r4:edd3c0d0 [ 553.495896] [<c03e91bc>] (dpm_complete) from [<c03e9388>] (dpm_resume_end+0x1c/0x20) [ 553.503652] r9:00000000 r8:c0b1a9d0 r7:c1334ec0 r6:c1334edc r5:00000003 r4:00000010 [ 553.511544] [<c03e936c>] (dpm_resume_end) from [<c0079894>] (suspend_devices_and_enter+0x158/0x504) [ 553.520604] r4:00000000 r3:c1334efc [ 553.524250] [<c007973c>] (suspend_devices_and_enter) from [<c0079e74>] (pm_suspend+0x234/0x2cc) [ 553.532961] r10:00561408 r9:ed6b7300 r8:00000004 r7:c1334eec r6:00000000 r5:c1334ee8 [ 553.540914] r4:00000003 [ 553.543493] [<c0079c40>] (pm_suspend) from [<c0078a6c>] (state_store+0x6c/0xc0)
[ 555.703684] 7 locks held by kworker/u2:13/826:
[ 555.708140] #0: ("%s""ci_otg"){++++.+}, at: [<c0045484>] process_one_work+0x128/0x420
[ 555.716277] #1: ((&ci->work)){+.+.+.}, at: [<c0045484>] process_one_work+0x128/0x420
[ 555.724317] #2: (usb_bus_list_lock){+.+.+.}, at: [<c04ae5e4>] usb_remove_hcd+0x98/0x1ac
[ 555.732626] #3: (&dev->mutex){......}, at: [<c04a8e28>] usb_disconnect+0x48/0x224
[ 555.740403] #4: (&dev->mutex){......}, at: [<c04a8e28>] usb_disconnect+0x48/0x224
[ 555.748179] #5: (&dev->mutex){......}, at: [<c03dc2f4>] device_release_driver+0x20/0x34
[ 555.756487] #6: (&shost->scan_mutex){+.+.+.}, at: [<c04097d0>] scsi_remove_host+0x20/0x104--- drivers/usb/chipidea/otg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/chipidea/otg.c +1 -1
@@ -158,7 +158,7 @@ static void ci_otg_work(struct work_struint ci_hdrc_otg_init (struct ci_hdrc *ci) {INIT_WORK (&ci->work, ci_otg_work); - ci->wq =create_singlethread_workqueue ("ci_otg" ); + ci->wq =create_freezable_workqueue ("ci_otg" );if (!ci->wq) {dev_err (ci->dev,"can't create workqueue\n" );return -ENODEV ;
Greg Kroah-Hartman
maintainerPATCH 57/74 USB: cp210x: Add ID for Parrot NMEA GPS Flight Recorder
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vittorio Alfieri <[email protected]>
commit 3c4c615d70c8cbdc8ba8c79ed702640930652a79 upstream.
The Parrot NMEA GPS Flight Recorder is a USB composite device consisting of hub, flash storage, and cp210x usb to serial chip. It is an accessory to the mass-produced Parrot AR Drone 2. The device emits standard NMEA messages which make the it compatible with NMEA compatible software. It was tested using gpsd version 3.11-3 as an NMEA interpreter and using the official Parrot Flight Recorder.
--- drivers/usb/serial/cp210x.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/cp210x.c +1 -0
@@ -164,6 +164,7 @@ static const struct usb_device_id id_tab { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */ { USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */ { USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */ + { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */ { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ { USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */
Greg Kroah-Hartman
maintainerPATCH 60/74 USB: serial: option: add support for Telit LE922 PID 0x1045
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniele Palmas <[email protected]>
commit 5deef5551c77e488922cc4bf4bc76df63be650d0 upstream.
This patch adds support for 0x1045 PID of Telit LE922.
--- drivers/usb/serial/option.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/option.c +3 -0
@@ -270,6 +270,7 @@ static void option_instat_callback(struc#define TELIT_PRODUCT_UE910_V2 0x1012#define TELIT_PRODUCT_LE922_USBCFG0 0x1042#define TELIT_PRODUCT_LE922_USBCFG3 0x1043 +#define TELIT_PRODUCT_LE922_USBCFG5 0x1045#define TELIT_PRODUCT_LE920 0x1200#define TELIT_PRODUCT_LE910 0x1201
@@ -1183,6 +1184,8 @@ static const struct usb_device_id option .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg0 }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG3), .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg3 }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG5, 0xff), + .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg0 }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), .driver_info = (kernel_ulong_t)&telit_le910_blacklist }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920),
Greg Kroah-Hartman
maintainerPATCH 61/74 USB: serial: option: add support for Quectel UC20
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yegor Yefremov <[email protected]>
commit c0992d0f54847d0d1d85c60fcaa054f175ab1ccd upstream.
Add support for Quectel UC20 and blacklist the QMI interface.
--- drivers/usb/serial/option.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/option.c +2 -0
@@ -1133,6 +1133,8 @@ static const struct usb_device_id option { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9003), /* Quectel UC20 */ + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003),
Greg Kroah-Hartman
maintainerPATCH 62/74 MIPS: scache: Fix scache init with invalid line size.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Govindraj Raja <[email protected]>
commit 56fa81fc9a5445938f3aa2e63d15ab63dc938ad6 upstream.
In current scache init cache line_size is determined from cpu config register, however if there there no scache then mips_sc_probe_cm3 function populates a invalid line_size of 2.
The invalid line_size can cause a NULL pointer deference during r4k_dma_cache_inv as r4k_blast_scache is populated based on line_size. Scache line_size of 2 is invalid option in r4k_blast_scache_setup.
This issue was faced during a MIPS I6400 based virtual platform bring up where scache was not available in virtual platform model.
Patchwork: https://patchwork.linux-mips.org/patch/12710/
--- arch/mips/mm/sc-mips.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
arch/mips/mm/sc-mips.c +9 -4
@@ -164,11 +164,13 @@ static int __init mips_sc_probe_cm3(void sets = cfg &CM_GCR_L2_CONFIG_SET_SIZE_MSK ; sets >>=CM_GCR_L2_CONFIG_SET_SIZE_SHF ; - c->scache.sets =64 << sets; +if (sets) + c->scache.sets =64 << sets; line_sz = cfg &CM_GCR_L2_CONFIG_LINE_SIZE_MSK ; line_sz >>=CM_GCR_L2_CONFIG_LINE_SIZE_SHF ; - c->scache.linesz =2 << line_sz; +if (line_sz) + c->scache.linesz =2 << line_sz; assoc = cfg &CM_GCR_L2_CONFIG_ASSOC_MSK ; assoc >>=CM_GCR_L2_CONFIG_ASSOC_SHF ;
@@ -176,9 +178,12 @@ static int __init mips_sc_probe_cm3(void c->scache.waysize = c->scache.sets * c->scache.linesz; c->scache.waybit =__ffs (c->scache.waysize); - c->scache.flags &= ~MIPS_CACHE_NOT_PRESENT ; +if (c->scache.linesz) { + c->scache.flags &= ~MIPS_CACHE_NOT_PRESENT ; +return 1 ; + } -return 1 ; +return 0 ; }void __weak platform_early_l2_init (void )
Greg Kroah-Hartman
maintainerPATCH 63/74 MIPS: traps: Fix SIGFPE information leak from `do_ov and `do_trap_or_bp
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej W. Rozycki <[email protected]>
commit e723e3f7f9591b79e8c56b3d7c5a204a9c571b55 upstream.
Avoid sending a partially initialised siginfo_t' structure along SIGFPE signals issued from do_ov' and `do_trap_or_bp', leading to information leaking from the kernel stack.
--- arch/mips/kernel/traps.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
arch/mips/kernel/traps.c +6 -7
@@ -690,15 +690,15 @@ static int simulate_sync(struct pt_regs asmlinkage void do_ov(struct pt_regs *regs) {enum ctx_state prev_state; -siginfo_t info; +siginfo_t info = { + .si_signo =SIGFPE , + .si_code =FPE_INTOVF , + .si_addr = (void __user *)regs->cp0_epc, + }; prev_state =exception_enter ();die_if_kernel ("Integer overflow" , regs); - info.si_code =FPE_INTOVF ; - info.si_signo =SIGFPE ; - info.si_errno =0 ; - info.si_addr = (void __user *) regs->cp0_epc;force_sig_info (SIGFPE , &info, current);exception_exit (prev_state); }
@@ -874,7 +874,7 @@ out:void do_trap_or_bp (struct pt_regs *regs,unsigned int code,const char *str) { -siginfo_t info; +siginfo_t info = {0 };char b[40 ];#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP
@@ -903,7 +903,6 @@ void do_trap_or_bp(struct pt_regs *regs,else info.si_code =FPE_INTOVF ; info.si_signo =SIGFPE ; - info.si_errno =0 ; info.si_addr = (void __user *) regs->cp0_epc;force_sig_info (SIGFPE , &info, current);break ;
Greg Kroah-Hartman
maintainerPATCH 64/74 cxl: Fix PSL timebase synchronization detection
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frederic Barrat <[email protected]>
commit 923adb1646d5ba739d2a1e63ee20d60574d9da8e upstream.
The PSL timebase synchronization is seemingly failing for configuration not including VIRT_CPU_ACCOUNTING_NATIVE. The driver shows the following trace in dmesg:
PSL: Timebase sync: giving up!
The PSL timebase register is actually syncing correctly, but the cxl driver is not detecting it. Fix is to use the proper timebase-to-time conversion.
--- drivers/misc/cxl/pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/cxl/pci.c +1 -1
@@ -414,7 +414,7 @@ static int cxl_setup_psl_timebase(struct delta =mftb () - psl_tb;if (delta <0 ) delta = -delta; - }while (cputime_to_usecs (delta) >16 ); + }while (tb_to_ns (delta) >16000 );return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 65/74 ubi: Fix out of bounds write in volume update code
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Weinberger <[email protected]>
commit e4f6daac20332448529b11f09388f1d55ef2084c upstream.
ubi_start_leb_change() allocates too few bytes. ubi_more_leb_change_data() will write up to req->upd_bytes + ubi->min_io_size bytes.
--- drivers/mtd/ubi/upd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/upd.c +1 -1
@@ -193,7 +193,7 @@ int ubi_start_leb_change(struct ubi_devi vol->changing_leb =1 ; vol->ch_lnum = req->lnum; - vol->upd_buf =vmalloc (req->bytes); + vol->upd_buf =vmalloc (ALIGN ((int )req->bytes, ubi->min_io_size));if (!vol->upd_buf)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 66/74 i2c: brcmstb: allocate correct amount of memory for regmap
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wolfram Sang <[email protected]>
commit 7314d22a2f5bd40468d57768be368c3d9b4bd726 upstream.
We want the size of the struct, not of a pointer to it. To be future proof, just dereference the pointer to get the desired type.
--- drivers/i2c/busses/i2c-brcmstb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/i2c/busses/i2c-brcmstb.c +1 -2
@@ -562,8 +562,7 @@ static int brcmstb_i2c_probe(struct platif (!dev)return -ENOMEM ; - dev->bsc_regmap =devm_kzalloc (&pdev->dev,sizeof (struct bsc_regs *), -GFP_KERNEL ); + dev->bsc_regmap =devm_kzalloc (&pdev->dev,sizeof (*dev->bsc_regmap),GFP_KERNEL );if (!dev->bsc_regmap)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 67/74 thermal: cpu_cooling: fix out of bounds access in time_in_idle
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javi Merino <[email protected]>
commit a53b8394ec3c67255928df6ee9cc99dd1cd452e3 upstream.
In __cpufreq_cooling_register() we allocate the arrays for time_in_idle and time_in_idle_timestamp to be as big as the number of cpus in this cpufreq device. However, in get_load() we access this array using the cpu number as index, which can result in an out of bound access.
Index time_in_idle{,_timestamp} using the index in the cpufreq_device's allowed_cpus mask, as we do for the load_cpu array in cpufreq_get_requested_power()
--- drivers/thermal/cpu_cooling.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/thermal/cpu_cooling.c +8 -6
@@ -377,26 +377,28 @@ static u32 cpu_power_to_freq(struct cpuf* get_load() - get load for a cpu since last updated * @cpufreq_device: &struct cpufreq_cooling_device for this cpu * @cpu: cpu number +* @cpu_idx: index of the cpu in cpufreq_device->allowed_cpus * * Return: The average load of cpu @cpu in percentage since this * function was last called. */ -static u32 get_load (struct cpufreq_cooling_device *cpufreq_device,int cpu) +static u32 get_load (struct cpufreq_cooling_device *cpufreq_device,int cpu, +int cpu_idx) {u32 load;u64 now, now_idle, delta_time, delta_idle; now_idle =get_cpu_idle_time (cpu, &now,0 ); - delta_idle = now_idle - cpufreq_device->time_in_idle[cpu]; - delta_time = now - cpufreq_device->time_in_idle_timestamp[cpu]; + delta_idle = now_idle - cpufreq_device->time_in_idle[cpu_idx]; + delta_time = now - cpufreq_device->time_in_idle_timestamp[cpu_idx];if (delta_time <= delta_idle) load =0 ;else load =div64_u64 (100 * (delta_time - delta_idle), delta_time); - cpufreq_device->time_in_idle[cpu] = now_idle; - cpufreq_device->time_in_idle_timestamp[cpu] = now; + cpufreq_device->time_in_idle[cpu_idx] = now_idle; + cpufreq_device->time_in_idle_timestamp[cpu_idx] = now;return load; }
@@ -598,7 +600,7 @@ static int cpufreq_get_requested_power(su32 load;if (cpu_online (cpu)) - load =get_load (cpufreq_device, cpu); + load =get_load (cpufreq_device, cpu, i);else load =0 ;
Greg Kroah-Hartman
maintainerPATCH 69/74 block: check virt boundary in bio_will_gap()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
commit e0af29171aa8912e1ca95023b75ef336cd70d661 upstream.
In the following patch, the way for figuring out the last bvec will be changed with a bit cost introduced, so return immediately if the queue doesn't have virt boundary limit. Actually most of devices have not this limit.
--- include/linux/blkdev.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
include/linux/blkdev.h +11 -5
@@ -1367,6 +1367,13 @@ static inline void put_dev_sector(Sectorpage_cache_release (p.v); } +static inline bool __bvec_gap_to_prev (struct request_queue *q, +struct bio_vec *bprv,unsigned int offset) +{ +return offset || + ((bprv->bv_offset + bprv->bv_len) &queue_virt_boundary (q)); +} +/* * Check if adding a bio_vec after bprv with offset would create a gap in * the SG list. Most drivers don't care about this, but some do.
@@ -1376,18 +1383,17 @@ static inline bool bvec_gap_to_prev(stru {if (!queue_virt_boundary (q))return false; -return offset || - ((bprv->bv_offset + bprv->bv_len) &queue_virt_boundary (q)); +return __bvec_gap_to_prev (q, bprv, offset); }static inline bool bio_will_gap (struct request_queue *q,struct bio *prev,struct bio *next) { -if (!bio_has_data (prev)) +if (!bio_has_data (prev) || !queue_virt_boundary (q))return false; -return bvec_gap_to_prev (q, &prev->bi_io_vec[prev->bi_vcnt -1 ], - next->bi_io_vec[0 ].bv_offset); +return __bvec_gap_to_prev (q, &prev->bi_io_vec[prev->bi_vcnt -1 ], + next->bi_io_vec[0 ].bv_offset); }static inline bool req_gap_back_merge (struct request *req,struct bio *bio)
Greg Kroah-Hartman
maintainerPATCH 70/74 block: get the 1st and last bvec via helpers
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
commit 25e71a99f10e444cd00bb2ebccb11e1c9fb672b1 upstream.
This patch applies the two introduced helpers to figure out the 1st and last bvec, and fixes the original way after bio splitting.
--- include/linux/blkdev.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
include/linux/blkdev.h +9 -4
@@ -1389,11 +1389,16 @@ static inline bool bvec_gap_to_prev(strustatic inline bool bio_will_gap (struct request_queue *q,struct bio *prev,struct bio *next) { -if (!bio_has_data (prev) || !queue_virt_boundary (q)) -return false; +if (bio_has_data (prev) &&queue_virt_boundary (q)) { +struct bio_vec pb, nb; -return __bvec_gap_to_prev (q, &prev->bi_io_vec[prev->bi_vcnt -1 ], - next->bi_io_vec[0 ].bv_offset); +bio_get_last_bvec (prev, &pb); +bio_get_first_bvec (next, &nb); + +return __bvec_gap_to_prev (q, &pb, nb.bv_offset); + } + +return false; }static inline bool req_gap_back_merge (struct request *req,struct bio *bio)
Greg Kroah-Hartman
maintainerPATCH 71/74 drm/i915: more virtual south bridge detection
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerd Hoffmann <[email protected]>
commit 39bfcd5235e07e95ad3e70eab8e0b85db181de9e upstream.
Commit "30c964a drm/i915: Detect virtual south bridge" detects and handles the southbridge emulated by vmware esx. Add the ich9 south bridge emulated by 'qemu -M q35'.
--- drivers/gpu/drm/i915/i915_drv.c | 3 ++- drivers/gpu/drm/i915/i915_drv.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/i915_drv.c +2 -1
@@ -531,7 +531,8 @@ void intel_detect_pch(struct drm_device dev_priv->pch_type =PCH_SPT ;DRM_DEBUG_KMS ("Found SunrisePoint LP PCH\n" );WARN_ON (!IS_SKYLAKE (dev)); - }else if (id ==INTEL_PCH_P2X_DEVICE_ID_TYPE ) { + }else if ((id ==INTEL_PCH_P2X_DEVICE_ID_TYPE ) || + (id ==INTEL_PCH_QEMU_DEVICE_ID_TYPE )) { dev_priv->pch_type =intel_virt_detect_pch (dev); }else continue ;
drivers/gpu/drm/i915/i915_drv.h +1 -0
@@ -2614,6 +2614,7 @@ struct drm_i915_cmd_table {#define INTEL_PCH_SPT_DEVICE_ID_TYPE 0xA100#define INTEL_PCH_SPT_LP_DEVICE_ID_TYPE 0x9D00#define INTEL_PCH_P2X_DEVICE_ID_TYPE 0x7100 +#define INTEL_PCH_QEMU_DEVICE_ID_TYPE 0x2900/* qemu q35 has 2918 */ #define INTEL_PCH_TYPE (dev) (__I915__(dev)->pch_type)#define HAS_PCH_SPT (dev) (INTEL_PCH_TYPE(dev) == PCH_SPT)
Greg Kroah-Hartman
maintainerPATCH 73/74 modules: fix longstanding /proc/kallsyms vs module insertion race.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rusty Russell <[email protected]>
commit 8244062ef1e54502ef55f54cced659913f244c3e upstream.
For CONFIG_KALLSYMS, we keep two symbol tables and two string tables. There's one full copy, marked SHF_ALLOC and laid out at the end of the module's init section. There's also a cut-down version that only contains core symbols and strings, and lives in the module's core section.
After module init (and before we free the module memory), we switch the mod->symtab, mod->num_symtab and mod->strtab to point to the core versions. We do this under the module_mutex.
However, kallsyms doesn't take the module_mutex: it uses preempt_disable() and rcu tricks to walk through the modules, because it's used in the oops path. It's also used in /proc/kallsyms. There's nothing atomic about the change of these variables, so we can get the old (larger!) num_symtab and the new symtab pointer; in fact this is what I saw when trying to reproduce.
By grouping these variables together, we can use a carefully-dereferenced pointer to ensure we always get one or the other (the free of the module init section is already done in an RCU callback, so that's safe). We allocate the init one at the end of the module init section, and keep the core one inside the struct module itself (it could also have been allocated at the end of the module core, but that's probably overkill).
[ Rebased for 4.4-stable and older, because the following changes aren't
in the older trees:
- e0224418516b4d8a6c2160574bac18447c354ef0: adds arg to is_core_symbol
- 7523e4dc5057e157212b4741abd6256e03404cf1: module_init/module_core/init_size/core_size become init_layout.base/core_layout.base/init_layout.size/core_layout.size.
]
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=111541
--- include/linux/module.h | 19 ++++---- kernel/module.c | 112 ++++++++++++++++++++++++++++++------------------- 2 files changed, 79 insertions(+), 52 deletions(-)
include/linux/module.h +10 -9
@@ -302,6 +302,12 @@ struct mod_tree_node {struct latch_tree_node node; }; +struct mod_kallsyms { +Elf_Sym *symtab; +unsigned int num_symtab; +char *strtab; +}; +struct module {enum module_state state;
@@ -411,15 +417,10 @@ struct module {#endif #ifdef CONFIG_KALLSYMS -/* -* We keep the symbol and string tables for kallsyms. -* The core_* fields below are temporary, loader-only (they -* could really be discarded after module init). -*/ -Elf_Sym *symtab, *core_symtab; -unsigned int num_symtab, core_num_syms; -char *strtab, *core_strtab; - +/* Protected by RCU and/or module_mutex: use rcu_dereference() */ +struct mod_kallsyms *kallsyms; +struct mod_kallsyms core_kallsyms; +/* Section attributes */ struct module_sect_attrs *sect_attrs;
kernel/module.c +69 -43
209 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 74/74 drm/amdgpu: fix topaz/tonga gmc assignment in 4.4 stable
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
When upstream commit 429c45deae6e57f1bb91bfb05b671063fb0cef60 was applied to 4.4 as d60703ca942e8d044d61360bc9792fcab54b95d0 it applied incorrectly to the tonga_ip_blocks array rather than the topaz_ip_blocks array. Fix that up here.
Bug:
https://bugzilla.kernel.org/show_bug.cgi?id=113951
--- drivers/gpu/drm/amd/amdgpu/vi.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/gpu/drm/amd/amdgpu/vi.c +6 -6
@@ -1082,10 +1082,10 @@ static const struct amdgpu_ip_block_vers }, { .type = AMD_IP_BLOCK_TYPE_GMC, - .major = 8, - .minor = 0, + .major = 7, + .minor = 4, .rev = 0, - .funcs = &gmc_v8_0_ip_funcs, + .funcs = &gmc_v7_0_ip_funcs, }, { .type = AMD_IP_BLOCK_TYPE_IH,
@@ -1129,10 +1129,10 @@ static const struct amdgpu_ip_block_vers }, { .type = AMD_IP_BLOCK_TYPE_GMC, - .major = 7, - .minor = 4, + .major = 8, + .minor = 0, .rev = 0, - .funcs = &gmc_v7_0_ip_funcs, + .funcs = &gmc_v8_0_ip_funcs, }, { .type = AMD_IP_BLOCK_TYPE_IH,
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.5 release. There are 74 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 Thu Mar 10 00:02:56 UTC 2016. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 96 pass: 96 fail: 0
Detaila are available at http://kerneltests.org/builders.
Guenter
Greg Kroah-Hartman
maintainerQuoted 9 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.5 release. There are 74 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 Thu Mar 10 00:02:56 UTC 2016. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 96 pass: 96 fail: 0Detaila are available at http://kerneltests.org/builders.
Thanks for testing all of these and letting me know.
greg k-h
A message that is not in the archive (sent off-list or not yet received): [email protected]
Greg Kroah-Hartman
maintainerQuoted 44 lines · kernelci.org bot
stable-queue boot: 205 boots: 14 failed, 190 passed with 1 offline (v4.4.4-74-gcc3ba9c14b31)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-queue/kernel/v4.4.4-74-gcc3ba9c14b31/
Full Build Summary: https://kernelci.org/build/stable-queue/kernel/v4.4.4-74-gcc3ba9c14b31/Tree: stable-queue
Branch: local/linux-4.4.y.queue
Git Describe: v4.4.4-74-gcc3ba9c14b31
Git Commit:cc3ba9c14b31161587ce85e9b5d642e730a2d0e8Git URL:git://server.roeck-us.net/git/linux-stable.git
Tested: 47 unique boards, 13 SoC families, 18 builds out of 132Boot Failures Detected: https://kernelci.org/boot/?v4.4.4-74-gcc3ba9c14b31&fail
arm:
mxs_defconfig:
imx23-olinuxino: 1 failed lab
omap2plus_defconfig:
omap4-panda: 1 failed labmulti_v7_defconfig+CONFIG_LKDTM=y:
imx53-qsrb: 1 failed lab
imx6dl-riotboard: 1 failed lab
socfpga_cyclone5_socrates: 1 failed labmulti_v7_defconfig+CONFIG_SMP=n:
imx53-qsrb: 1 failed lab
imx6dl-riotboard: 1 failed lab
socfpga_cyclone5_socrates: 1 failed labmulti_v7_defconfig+CONFIG_THUMB2_KERNEL=y:
socfpga_cyclone5_socrates: 1 failed lab
imx_v6_v7_defconfig:
imx53-qsrb: 1 failed lab
imx6dl-riotboard: 1 failed labmulti_v7_defconfig+CONFIG_PROVE_LOCKING=y:
imx53-qsrb: 1 failed lab
imx6dl-riotboard: 1 failed lab
socfpga_cyclone5_socrates: 1 failed lab
Quoted 6 lines
Offline Platforms:
arm:
mxs_defconfig:
imx28-duckbill: 1 offline lab
I really don't know what these mean, any chance you can distill these down to "all is fine", or "there is a problem with this arch" type emails?
thanks,
greg k-h
Quoted 47 lines · Greg Kroah-Hartman
Quoted 46 lines · kernelci.org bot
stable-queue boot: 205 boots: 14 failed, 190 passed with 1 offline (v4.4.4-74-gcc3ba9c14b31)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-queue/kernel/v4.4.4-74-gcc3ba9c14b31/
Full Build Summary: https://kernelci.org/build/stable-queue/kernel/v4.4.4-74-gcc3ba9c14b31/Tree: stable-queue
Branch: local/linux-4.4.y.queue
Git Describe: v4.4.4-74-gcc3ba9c14b31
Git Commit:cc3ba9c14b31161587ce85e9b5d642e730a2d0e8Git URL:git://server.roeck-us.net/git/linux-stable.git
Tested: 47 unique boards, 13 SoC families, 18 builds out of 132Boot Failures Detected: https://kernelci.org/boot/?v4.4.4-74-gcc3ba9c14b31&fail
arm:
mxs_defconfig:
imx23-olinuxino: 1 failed lab
omap2plus_defconfig:
omap4-panda: 1 failed labmulti_v7_defconfig+CONFIG_LKDTM=y:
imx53-qsrb: 1 failed lab
imx6dl-riotboard: 1 failed lab
socfpga_cyclone5_socrates: 1 failed labmulti_v7_defconfig+CONFIG_SMP=n:
imx53-qsrb: 1 failed lab
imx6dl-riotboard: 1 failed lab
socfpga_cyclone5_socrates: 1 failed labmulti_v7_defconfig+CONFIG_THUMB2_KERNEL=y:
socfpga_cyclone5_socrates: 1 failed lab
imx_v6_v7_defconfig:
imx53-qsrb: 1 failed lab
imx6dl-riotboard: 1 failed labmulti_v7_defconfig+CONFIG_PROVE_LOCKING=y:
imx53-qsrb: 1 failed lab
imx6dl-riotboard: 1 failed lab
socfpga_cyclone5_socrates: 1 failed labOffline Platforms:
Quoted 8 lines
Quoted 4 lines
arm:
mxs_defconfig:
imx28-duckbill: 1 offline labI really don't know what these mean, any chance you can distill these down to "all is fine", or "there is a problem with this arch" type emails?
All is fine.
These failures are are on newly added boards coming from a new lab and they're failing in other trees also, so we'll ignore them for now and check with the specific lab owner.
Kevin
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.5 release. There are 74 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.
Quoted 7 lines
Responses should be made by Thu Mar 10 00:02:56 UTC 2016. 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.4.5-rc1.gzand the diffstat can be found below.
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America (Silicon Valley) [email protected] | (970) 217-8978
Greg Kroah-Hartman
maintainerQuoted 9 lines · Shuah Khan
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.5 release. There are 74 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 Thu Mar 10 00:02:56 UTC 2016. Anything received after that time might be too late.
Quoted 6 lines
Quoted 4 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.5-rc1.gzand the diffstat can be found below.
Compiled and booted on my test system. No dmesg regressions.
Thanks for testing all of these and letting me know.
greg k-h