4.9.34-stable review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 4.9.34-stable review
This is the start of the stable review cycle for the 4.9.34 release. There are 60 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 Wed Jun 21 15:16:33 UTC 2017. 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.9.34-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.9.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.9.34-rc1
Hugh Dickins <[email protected]>
mm: larger stack guard gap, between vmas
Thomas Gleixner <[email protected]>
alarmtimer: Rate limit periodic intervals
David Miller <[email protected]>
crypto: Work around deallocated stack frame reference gcc bug on sparc.
Hon Ching \(Vicky) Lo <[email protected]>
vTPM: Fix missing NULL check
Paul Burton <[email protected]>
MIPS: .its targets depend on vmlinux
Paul Burton <[email protected]>
MIPS: Fix bnezc/jialc return address calculation
Shuah Khan <[email protected]>
usb: dwc3: exynos fix axius clock error path to do cleanup
Christophe JAILLET <[email protected]>
usb: gadget: composite: Fix function used to free memory
Thomas Gleixner <[email protected]>
alarmtimer: Prevent overflow of relative timers
Heiner Kallweit <[email protected]>
genirq: Release resources in __setup_irq() error path
Andy Lutomirski <[email protected]>
sched/core: Idle_task_exit() shouldn't use switch_mm_irqs_off()
Jean-Baptiste Maneyrol <[email protected]>
iio: imu: inv_mpu6050: add accel lpf setting for chip >= MPU6500
Yu Zhao <[email protected]>
swap: cond_resched in swap_cgroup_prepare()
James Morse <[email protected]>
mm/memory-failure.c: use compound_head() flags for huge pages
Alan Stern <[email protected]>
USB: gadgetfs, dummy-hcd, net2280: fix locking for callbacks
Alan Stern <[email protected]>
USB: gadget: fix GPF in gadgetfs
Corentin Labbe <[email protected]>
usb: xhci: ASMedia ASM1042A chipset need shorts TX quirk
YD Tseng <[email protected]>
usb: xhci: Fix USB 3.1 supported protocol parsing
Dan Carpenter <[email protected]>
drivers/misc/c2port/c2port-duramar2150.c: checking for NULL instead of IS_ERR()
Dan Carpenter <[email protected]>
misc: mic: double free on ioctl error path
Kalle Valo <[email protected]>
ath10k: fix napi crash during rmmod when probe firmware fails
Chris Brandt <[email protected]>
usb: r8a66597-hcd: decrease timeout
Chris Brandt <[email protected]>
usb: r8a66597-hcd: select a different endpoint on timeout
Johan Hovold <[email protected]>
USB: gadget: dummy_hcd: fix hub-descriptor removable fields
Arnd Bergmann <[email protected]>
pvrusb2: reduce stack usage pvr2_eeprom_analyze()
Johan Hovold <[email protected]>
USB: usbip: fix nonconforming hub descriptor
Anton Bondarenko <[email protected]>
usb: core: fix potential memory leak in error path during hcd creation
Johan Hovold <[email protected]>
USB: hub: fix SS max number of ports
Yoshihiro Shimoda <[email protected]>
usb: gadget: udc: renesas_usb3: lock for PN_ registers access
Yoshihiro Shimoda <[email protected]>
usb: gadget: udc: renesas_usb3: fix deadlock by spinlock
Yoshihiro Shimoda <[email protected]>
usb: gadget: udc: renesas_usb3: fix pm_runtime functions calling
Eli Cohen <[email protected]>
IB/mlx5: Fix kernel to user leak prevention logic
Dan Carpenter <[email protected]>
iio: adc: ti_am335x_adc: allocating too much in probe
Matt Ranostay <[email protected]>
iio: proximity: as3935: recalibrate RCO after resume
Marcin Niestroj <[email protected]>
iio: st_pressure: Fix data sign
Eva Rachel Retuya <[email protected]>
staging: iio: tsl2x7x_core: Fix standard deviation calculation
Dan Carpenter <[email protected]>
staging: rtl8188eu: prevent an underflow in rtw_check_beacon_data()
Tony Lindgren <[email protected]>
mfd: omap-usb-tll: Fix inverted bit use for USB TLL mode
Laura Abbott <[email protected]>
x86/mm/32: Set the '__vmalloc_start_set' flag in initmem_init()
Geert Uytterhoeven <[email protected]>
serial: sh-sci: Fix late enablement of AUTORTS
Christophe JAILLET <[email protected]>
serial: efm32: Fix parity management in 'efm32_uart_console_get_options()'
Eric Anholt <[email protected]>
drm/vc4: Fix OOPSes from trying to cache a partially constructed BO.
YYS <[email protected]>
drm/mediatek: fix mtk_hdmi_setup_vendor_specific_infoframe mistake
Emmanuel Grumbach <[email protected]>
mac80211: don't send SMPS action frame in AP mode when not needed
Johannes Berg <[email protected]>
mac80211: fix dropped counter in multiqueue RX
Rajkumar Manoharan <[email protected]>
mac80211: strictly check mesh address extension mode
Johannes Berg <[email protected]>
mac80211: fix IBSS presp allocation size
Johannes Berg <[email protected]>
mac80211: fix packet statistics for fast-RX
Koen Vandeputte <[email protected]>
mac80211: fix CSA in IBSS mode
Bin Liu <[email protected]>
usb: musb: dsps: keep VBUS on for host-only mode
Zhenyu Wang <[email protected]>
drm/i915: Fix GVT-g PVINFO version compatibility check
Mario Kleiner <[email protected]>
drm/amdgpu: Fix overflow of watermark calcs at > 4k resolutions.
Jason A. Donenfeld <[email protected]>
mac80211/wpa: use constant time memory comparison for MACs
Emmanuel Grumbach <[email protected]>
mac80211: don't look at the PM bit of BAR frames
Christophe JAILLET <[email protected]>
vb2: Fix an off by one error in 'vb2_plane_vaddr'
Tomasz Wilczyński <[email protected]>
cpufreq: conservative: Allow down_threshold to take values from 1 to 10
Arnd Bergmann <[email protected]>
ila_xlat: add missing hash secret initialization
Marc Kleine-Budde <[email protected]>
can: gs_usb: fix memory leak in gs_cmd_reset()
Nicholas Bellinger <[email protected]>
configfs: Fix race between create_link and configfs_rmdir
Christoph Hellwig <[email protected]>
fs: pass on flags in compat_writev
-------------
Diffstat:
Documentation/kernel-parameters.txt | 7 ++ Makefile | 4 +- arch/arc/mm/mmap.c | 2 +- arch/arm/mm/mmap.c | 4 +- arch/frv/mm/elf-fdpic.c | 2 +- arch/mips/boot/Makefile | 10 +- arch/mips/kernel/branch.c | 4 +- arch/mips/mm/mmap.c | 2 +- arch/parisc/kernel/sys_parisc.c | 15 +-- arch/powerpc/mm/hugetlbpage-radix.c | 2 +- arch/powerpc/mm/mmap.c | 4 +- arch/powerpc/mm/slice.c | 2 +- arch/s390/mm/mmap.c | 4 +- arch/sh/mm/mmap.c | 4 +- arch/sparc/kernel/sys_sparc_64.c | 4 +- arch/sparc/mm/hugetlbpage.c | 2 +- arch/tile/mm/hugetlbpage.c | 2 +- arch/x86/kernel/sys_x86_64.c | 4 +- arch/x86/mm/hugetlbpage.c | 2 +- arch/x86/mm/numa_32.c | 1 + arch/xtensa/kernel/syscall.c | 2 +- drivers/char/tpm/tpm_ibmvtpm.c | 17 ++-- drivers/cpufreq/cpufreq_conservative.c | 4 +- drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 7 +- drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 7 +- drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 7 +- drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 7 +- drivers/gpu/drm/i915/i915_pvinfo.h | 8 +- drivers/gpu/drm/i915/i915_vgpu.c | 10 +- drivers/gpu/drm/mediatek/mtk_hdmi.c | 2 +- drivers/gpu/drm/vc4/vc4_bo.c | 8 ++ drivers/iio/adc/ti_am335x_adc.c | 2 +- drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 39 +++++++- drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 + drivers/iio/pressure/st_pressure_core.c | 10 +- drivers/iio/proximity/as3935.c | 6 +- drivers/infiniband/hw/mlx5/main.c | 14 +-- drivers/media/usb/pvrusb2/pvrusb2-eeprom.c | 13 +-- drivers/media/v4l2-core/videobuf2-core.c | 2 +- drivers/mfd/omap-usb-tll.c | 2 +- drivers/misc/c2port/c2port-duramar2150.c | 4 +- drivers/misc/mic/vop/vop_vringh.c | 1 - drivers/net/can/usb/gs_usb.c | 2 + drivers/net/wireless/ath/ath10k/pci.c | 3 +- drivers/staging/iio/light/tsl2x7x_core.c | 2 +- drivers/staging/rtl8188eu/core/rtw_ap.c | 2 +- drivers/tty/serial/efm32-uart.c | 11 ++- drivers/tty/serial/sh-sci.c | 4 + drivers/usb/core/hcd.c | 1 + drivers/usb/core/hub.c | 8 +- drivers/usb/dwc3/dwc3-exynos.c | 4 +- drivers/usb/gadget/composite.c | 2 +- drivers/usb/gadget/legacy/inode.c | 9 +- drivers/usb/gadget/udc/dummy_hcd.c | 19 ++-- drivers/usb/gadget/udc/net2280.c | 9 +- drivers/usb/gadget/udc/renesas_usb3.c | 43 ++++++--- drivers/usb/host/r8a66597-hcd.c | 6 +- drivers/usb/host/xhci-mem.c | 7 +- drivers/usb/host/xhci-pci.c | 3 + drivers/usb/musb/musb_dsps.c | 6 ++ drivers/usb/usbip/vhci_hcd.c | 11 ++- fs/btrfs/hash.c | 5 +- fs/configfs/symlink.c | 3 +- fs/f2fs/f2fs.h | 5 +- fs/hugetlbfs/inode.c | 2 +- fs/proc/task_mmu.c | 4 - fs/read_write.c | 2 +- include/linux/mm.h | 53 +++++----- include/uapi/linux/usb/ch11.h | 3 + kernel/irq/manage.c | 4 +- kernel/sched/core.c | 2 +- kernel/time/alarmtimer.c | 14 ++- lib/libcrc32c.c | 6 +- mm/gup.c | 5 - mm/memory-failure.c | 5 +- mm/memory.c | 38 -------- mm/mmap.c | 149 +++++++++++++++++------------ mm/swap_cgroup.c | 3 + net/ipv6/ila/ila_xlat.c | 1 + net/mac80211/cfg.c | 2 + net/mac80211/ibss.c | 6 +- net/mac80211/rx.c | 10 +- net/mac80211/sta_info.c | 2 +- net/mac80211/wpa.c | 9 +- net/wireless/util.c | 10 +- 85 files changed, 440 insertions(+), 311 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/60 fs: pass on flags in compat_writev
4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
commit 20223f0f39ea9d31ece08f04ac79f8c4e8d98246 upstream.
--- fs/read_write.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/read_write.c +1 -1
@@ -1232,7 +1232,7 @@ static size_t compat_writev(struct fileif (!(file->f_mode &FMODE_CAN_WRITE )) goto out; - ret =compat_do_readv_writev (WRITE , file, vec, vlen, pos,0 ); + ret =compat_do_readv_writev (WRITE , file, vec, vlen, pos, flags); out:if (ret >0 )
Greg Kroah-Hartman
maintainerPATCH 2/60 configfs: Fix race between create_link and configfs_rmdir
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit ba80aa909c99802c428682c352b0ee0baac0acd3 upstream.
This patch closes a long standing race in configfs between the creation of a new symlink in create_link(), while the symlink target's config_item is being concurrently removed via configfs_rmdir().
This can happen because the symlink target's reference is obtained by config_item_get() in create_link() before the CONFIGFS_USET_DROPPING bit set by configfs_detach_prep() during configfs_rmdir() shutdown is actually checked..
This originally manifested itself on ppc64 on v4.8.y under heavy load using ibmvscsi target ports with Novalink API:
[ 7877.289863] rpadlpar_io: slot U8247.22L.212A91A-V1-C8 added
[ 7879.893760] ------------[ cut here ]------------
[ 7879.893768] WARNING: CPU: 15 PID: 17585 at ./include/linux/kref.h:46 config_item_get+0x7c/0x90 [configfs]
[ 7879.893811] CPU: 15 PID: 17585 Comm: targetcli Tainted: G O 4.8.17-customv2.22 #12
[ 7879.893812] task: c00000018a0d3400 task.stack: c0000001f3b40000
[ 7879.893813] NIP: d000000002c664ec LR: d000000002c60980 CTR: c000000000b70870
[ 7879.893814] REGS: c0000001f3b43810 TRAP: 0700 Tainted: G O (4.8.17-customv2.22)
[ 7879.893815] MSR: 8000000000029033 <SF,EE,ME,IR,DR,RI,LE> CR: 28222242 XER: 00000000
[ 7879.893820] CFAR: d000000002c664bc SOFTE: 1
GPR00: d000000002c60980 c0000001f3b43a90 d000000002c70908 c0000000fbc06820
GPR04: c0000001ef1bd900 0000000000000004 0000000000000001 0000000000000000
GPR08: 0000000000000000 0000000000000001 d000000002c69560 d000000002c66d80
GPR12: c000000000b70870 c00000000e798700 c0000001f3b43ca0 c0000001d4949d40
GPR16: c00000014637e1c0 0000000000000000 0000000000000000 c0000000f2392940
GPR20: c0000001f3b43b98 0000000000000041 0000000000600000 0000000000000000
GPR24: fffffffffffff000 0000000000000000 d000000002c60be0 c0000001f1dac490
GPR28: 0000000000000004 0000000000000000 c0000001ef1bd900 c0000000f2392940
[ 7879.893839] NIP [d000000002c664ec] config_item_get+0x7c/0x90 [configfs]
[ 7879.893841] LR [d000000002c60980] check_perm+0x80/0x2e0 [configfs]
[ 7879.893842] Call Trace:
[ 7879.893844] [c0000001f3b43ac0] [d000000002c60980] check_perm+0x80/0x2e0 [configfs]
[ 7879.893847] [c0000001f3b43b10] [c000000000329770] do_dentry_open+0x2c0/0x460
[ 7879.893849] [c0000001f3b43b70] [c000000000344480] path_openat+0x210/0x1490
[ 7879.893851] [c0000001f3b43c80] [c00000000034708c] do_filp_open+0xfc/0x170
[ 7879.893853] [c0000001f3b43db0] [c00000000032b5bc] do_sys_open+0x1cc/0x390
[ 7879.893856] [c0000001f3b43e30] [c000000000009584] system_call+0x38/0xec
[ 7879.893856] Instruction dump:
[ 7879.893858] 409d0014 38210030 e8010010 7c0803a6 4e800020 3d220000 e94981e0 892a0000
[ 7879.893861] 2f890000 409effe0 39200001 992a0000 <0fe00000> 4bffffd0 60000000 60000000
[ 7879.893866] ---[ end trace 14078f0b3b5ad0aa ]---To close this race, go ahead and obtain the symlink's target config_item reference only after the existing CONFIGFS_USET_DROPPING check succeeds.
This way, if configfs_rmdir() wins create_link() will return -ENONET, and if create_link() wins configfs_rmdir() will return -EBUSY.
--- fs/configfs/symlink.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/configfs/symlink.c +1 -2
@@ -83,14 +83,13 @@ static int create_link(struct config_ite ret = -ENOMEM ; sl =kmalloc (sizeof (struct configfs_symlink ),GFP_KERNEL );if (sl) { - sl->sl_target =config_item_get (item);spin_lock (&configfs_dirent_lock);if (target_sd->s_type &CONFIGFS_USET_DROPPING ) {spin_unlock (&configfs_dirent_lock); -config_item_put (item);kfree (sl);return -ENOENT ; } + sl->sl_target =config_item_get (item);list_add (&sl->sl_list, &target_sd->s_links);spin_unlock (&configfs_dirent_lock); ret = configfs_create_link(sl, parent_item->ci_dentry,
Greg Kroah-Hartman
maintainerPATCH 3/60 can: gs_usb: fix memory leak in gs_cmd_reset()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
commit 5cda3ee5138e91ac369ed9d0b55eab0dab077686 upstream.
This patch adds the missing kfree() in gs_cmd_reset() to free the memory that is not used anymore after usb_control_msg().
--- drivers/net/can/usb/gs_usb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/can/usb/gs_usb.c +2 -0
@@ -265,6 +265,8 @@ static int gs_cmd_reset(struct gs_usb *gsizeof (*dm), 1000); +kfree (dm); +return rc; }
Greg Kroah-Hartman
maintainerPATCH 4/60 ila_xlat: add missing hash secret initialization
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 0db47e3d323411beeb6ea97f2c4d19395c91fd8b upstream.
While discussing the possible merits of clang warning about unused initialized functions, I found one function that was clearly meant to be called but never actually is.
__ila_hash_secret_init() initializes the hash value for the ila locator, apparently this is intended to prevent hash collision attacks, but this ends up being a read-only zero constant since there is no caller. I could find no indication of why it was never called, the earliest patch submission for the module already was like this. If my interpretation is right, we certainly want to backport the patch to stable kernels as well.
I considered adding it to the ila_xlat_init callback, but for best effect the random data is read as late as possible, just before it is first used. The underlying net_get_random_once() is already highly optimized to avoid overhead when called frequently.
--- net/ipv6/ila/ila_xlat.c | 1 + 1 file changed, 1 insertion(+)
net/ipv6/ila/ila_xlat.c +1 -0
@@ -68,6 +68,7 @@ static inline u32 ila_locator_hash(struc {u32 *v = (u32 *)loc.v32; +__ila_hash_secret_init ();return jhash_2words (v[0 ], v[1 ], hashrnd); }
Greg Kroah-Hartman
maintainerPATCH 6/60 vb2: Fix an off by one error in vb2_plane_vaddr
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
commit 5ebb6dd36c9f5fb37b1077b393c254d70a14cb46 upstream.
We should ensure that 'plane_no' is '< vb->num_planes' as done in 'vb2_plane_cookie' just a few lines below.
--- drivers/media/v4l2-core/videobuf2-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/v4l2-core/videobuf2-core.c +1 -1
@@ -868,7 +868,7 @@ EXPORT_SYMBOL_GPL(vb2_core_create_bufs);void *vb2_plane_vaddr (struct vb2_buffer *vb,unsigned int plane_no) { -if (plane_no > vb->num_planes || !vb->planes[plane_no].mem_priv) +if (plane_no >= vb->num_planes || !vb->planes[plane_no].mem_priv)return NULL ;return call_ptr_memop (vb, vaddr, vb->planes[plane_no].mem_priv);
Greg Kroah-Hartman
maintainerPATCH 7/60 mac80211: dont look at the PM bit of BAR frames
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
commit 769dc04db3ed8484798aceb015b94deacc2ba557 upstream.
When a peer sends a BAR frame with PM bit clear, we should not modify its PM state as madated by the spec in 802.11-20012 10.2.1.2.
--- net/mac80211/rx.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/mac80211/rx.c +5 -1
@@ -1585,12 +1585,16 @@ ieee80211_rx_h_sta_process(struct ieee80*/ if (!ieee80211_hw_check (&sta->local->hw,AP_LINK_PS ) && !ieee80211_has_morefrags (hdr->frame_control) && + !ieee80211_is_back_req (hdr->frame_control) && !(status->rx_flags &IEEE80211_RX_DEFERRED_RELEASE ) && (rx->sdata->vif.type ==NL80211_IFTYPE_AP || rx->sdata->vif.type ==NL80211_IFTYPE_AP_VLAN ) && -/* PM bit is only checked in frames where it isn't reserved, +/* +* PM bit is only checked in frames where it isn't reserved, * in AP mode it's reserved in non-bufferable management frames * (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field) +* BAR frames should be ignored as specified in +* IEEE 802.11-2012 10.2.1.2. */ (!ieee80211_is_mgmt (hdr->frame_control) ||ieee80211_is_bufferable_mmpdu (hdr->frame_control))) {
Greg Kroah-Hartman
maintainerPATCH 8/60 mac80211/wpa: use constant time memory comparison for MACs
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason A. Donenfeld <[email protected]>
commit 98c67d187db7808b1f3c95f2110dd4392d034182 upstream.
Otherwise, we enable all sorts of forgeries via timing attack.
--- net/mac80211/wpa.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
net/mac80211/wpa.c +5 -4
@@ -17,6 +17,7 @@#include <asm/unaligned.h> #include <net/mac80211.h> #include <crypto/aes.h> +#include <crypto/algapi.h> #include "ieee80211_i.h" #include "michael.h"
@@ -153,7 +154,7 @@ ieee80211_rx_h_michael_mic_verify(struct data_len = skb->len - hdrlen -MICHAEL_MIC_LEN ; key = &rx->key->conf.key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY ];michael_mic (key, hdr, data, data_len, mic); -if (memcmp (mic, data + data_len,MICHAEL_MIC_LEN ) !=0 ) +if (crypto_memneq (mic, data + data_len,MICHAEL_MIC_LEN )) goto mic_fail;/* remove Michael MIC from payload */
@@ -1047,7 +1048,7 @@ ieee80211_crypto_aes_cmac_decrypt(structbip_aad (skb, aad);ieee80211_aes_cmac (key->u.aes_cmac.tfm, aad, skb->data +24 , skb->len -24 , mic); -if (memcmp (mic, mmie->mic,sizeof (mmie->mic)) !=0 ) { +if (crypto_memneq (mic, mmie->mic,sizeof (mmie->mic))) { key->u.aes_cmac.icverrors++;return RX_DROP_UNUSABLE ; }
@@ -1097,7 +1098,7 @@ ieee80211_crypto_aes_cmac_256_decrypt(stbip_aad (skb, aad);ieee80211_aes_cmac_256 (key->u.aes_cmac.tfm, aad, skb->data +24 , skb->len -24 , mic); -if (memcmp (mic, mmie->mic,sizeof (mmie->mic)) !=0 ) { +if (crypto_memneq (mic, mmie->mic,sizeof (mmie->mic))) { key->u.aes_cmac.icverrors++;return RX_DROP_UNUSABLE ; }
@@ -1201,7 +1202,7 @@ ieee80211_crypto_aes_gmac_decrypt(structif (ieee80211_aes_gmac (key->u.aes_gmac.tfm, aad, nonce, skb->data +24 , skb->len -24 , mic) <0 || -memcmp (mic, mmie->mic,sizeof (mmie->mic)) !=0 ) { +crypto_memneq (mic, mmie->mic,sizeof (mmie->mic))) { key->u.aes_gmac.icverrors++;return RX_DROP_UNUSABLE ; }
Greg Kroah-Hartman
maintainerPATCH 9/60 drm/amdgpu: Fix overflow of watermark calcs at > 4k resolutions.
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Kleiner <[email protected]>
commit bea10413934dcf98cb9b2dfcdc56e1d28f192897 upstream.
Commit d63c277dc672e0
("drm/amdgpu: Make display watermark calculations more accurate") made watermark calculations more accurate, but not for > 4k resolutions on 32-Bit architectures, as it introduced an integer overflow for those setups and resolutions.
Fix this by proper u64 casting and division.
--- drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 7 +++++-- drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 7 +++++-- drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 7 +++++-- drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 7 +++++-- 4 files changed, 20 insertions(+), 8 deletions(-)
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +5 -2
@@ -1290,8 +1290,11 @@ static void dce_v10_0_program_watermarksu32 tmp, wm_mask, lb_vblank_lead_lines =0 ;if (amdgpu_crtc->base.enabled && num_heads && mode) { - active_time =1000000UL * (u32 )mode->crtc_hdisplay / (u32 )mode->clock; - line_time =min ((u32) (1000000UL * (u32 )mode->crtc_htotal / (u32 )mode->clock), (u32 )65535 ); + active_time = (u32 )div_u64 ((u64 )mode->crtc_hdisplay *1000000 , + (u32 )mode->clock); + line_time = (u32 )div_u64 ((u64 )mode->crtc_htotal *1000000 , + (u32 )mode->clock); + line_time =min (line_time, (u32 )65535 );/* watermark for high clocks */ if (adev->pm.dpm_enabled) {
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +5 -2
@@ -1257,8 +1257,11 @@ static void dce_v11_0_program_watermarksu32 tmp, wm_mask, lb_vblank_lead_lines =0 ;if (amdgpu_crtc->base.enabled && num_heads && mode) { - active_time =1000000UL * (u32 )mode->crtc_hdisplay / (u32 )mode->clock; - line_time =min ((u32) (1000000UL * (u32 )mode->crtc_htotal / (u32 )mode->clock), (u32 )65535 ); + active_time = (u32 )div_u64 ((u64 )mode->crtc_hdisplay *1000000 , + (u32 )mode->clock); + line_time = (u32 )div_u64 ((u64 )mode->crtc_htotal *1000000 , + (u32 )mode->clock); + line_time =min (line_time, (u32 )65535 );/* watermark for high clocks */ if (adev->pm.dpm_enabled) {
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +5 -2
@@ -1054,8 +1054,11 @@ static void dce_v6_0_program_watermarks(fixed20_12 a, b, c;if (amdgpu_crtc->base.enabled && num_heads && mode) { - active_time =1000000UL * (u32 )mode->crtc_hdisplay / (u32 )mode->clock; - line_time =min ((u32) (1000000UL * (u32 )mode->crtc_htotal / (u32 )mode->clock), (u32 )65535 ); + active_time = (u32 )div_u64 ((u64 )mode->crtc_hdisplay *1000000 , + (u32 )mode->clock); + line_time = (u32 )div_u64 ((u64 )mode->crtc_htotal *1000000 , + (u32 )mode->clock); + line_time =min (line_time, (u32 )65535 ); priority_a_cnt =0 ; priority_b_cnt =0 ;
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +5 -2
@@ -1211,8 +1211,11 @@ static void dce_v8_0_program_watermarks(u32 tmp, wm_mask, lb_vblank_lead_lines =0 ;if (amdgpu_crtc->base.enabled && num_heads && mode) { - active_time =1000000UL * (u32 )mode->crtc_hdisplay / (u32 )mode->clock; - line_time =min ((u32) (1000000UL * (u32 )mode->crtc_htotal / (u32 )mode->clock), (u32 )65535 ); + active_time = (u32 )div_u64 ((u64 )mode->crtc_hdisplay *1000000 , + (u32 )mode->clock); + line_time = (u32 )div_u64 ((u64 )mode->crtc_htotal *1000000 , + (u32 )mode->clock); + line_time =min (line_time, (u32 )65535 );/* watermark for high clocks */ if (adev->pm.dpm_enabled) {
Greg Kroah-Hartman
maintainerPATCH 10/60 drm/i915: Fix GVT-g PVINFO version compatibility check
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhenyu Wang <[email protected]>
commit c380f681245d7ae57f17d9ebbbe8f8f1557ee1fb upstream.
Current it's strictly checked if PVINFO version matches 1.0 for GVT-g i915 guest which doesn't help for compatibility at all and forces GVT-g host can't extend PVINFO easily with version bump for real compatibility check.
This fixes that to check minimal required PVINFO version instead.
v2:
- drop unneeded version macro
- use only major version for sanity check
v3:
- fix up PVInfo value with kernel type
- one indent fix
--- drivers/gpu/drm/i915/i915_pvinfo.h | 8 ++------ drivers/gpu/drm/i915/i915_vgpu.c | 10 ++++------ 2 files changed, 6 insertions(+), 12 deletions(-)
drivers/gpu/drm/i915/i915_pvinfo.h +2 -6
@@ -36,10 +36,6 @@#define VGT_VERSION_MAJOR 1#define VGT_VERSION_MINOR 0 -#define INTEL_VGT_IF_VERSION_ENCODE (major, minor) ((major) << 16 | (minor)) -#define INTEL_VGT_IF_VERSION \ - INTEL_VGT_IF_VERSION_ENCODE(VGT_VERSION_MAJOR, VGT_VERSION_MINOR) -/* * notifications from guest to vgpu device model */
@@ -55,8 +51,8 @@ enum vgt_g2v_type {struct vgt_if {u64 magic;/* VGT_MAGIC */ -uint16_t version_major; -uint16_t version_minor; +u16 version_major; +u16 version_minor;u32 vgt_id;/* ID of vGT instance */ u32 rsv1[12 ];/* pad to offset 0x40 */ /*
drivers/gpu/drm/i915/i915_vgpu.c +4 -6
@@ -60,8 +60,8 @@*/ void i915_check_vgpu (struct drm_i915_private *dev_priv) { -uint64_t magic; -uint32_t version; +u64 magic; +u16 version_major;BUILD_BUG_ON (sizeof (struct vgt_if ) !=VGT_PVINFO_SIZE );
@@ -69,10 +69,8 @@ void i915_check_vgpu(struct drm_i915_priif (magic !=VGT_MAGIC )return ; - version =INTEL_VGT_IF_VERSION_ENCODE ( -__raw_i915_read16 (dev_priv,vgtif_reg (version_major)), -__raw_i915_read16 (dev_priv,vgtif_reg (version_minor))); -if (version !=INTEL_VGT_IF_VERSION ) { + version_major =__raw_i915_read16 (dev_priv,vgtif_reg (version_major)); +if (version_major <VGT_VERSION_MAJOR ) {DRM_INFO ("VGT interface version mismatch!\n" );return ; }
Greg Kroah-Hartman
maintainerPATCH 11/60 usb: musb: dsps: keep VBUS on for host-only mode
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bin Liu <[email protected]>
commit b3addcf0d1f04f53fcc302577d5a5e964c18531a upstream.
Currently VBUS is turned off while a usb device is detached, and turned on again by the polling routine. This short period VBUS loss prevents usb modem to switch mode.
VBUS should be constantly on for host-only mode, so this changes the driver to not turn off VBUS for host-only mode.
--- drivers/usb/musb/musb_dsps.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/usb/musb/musb_dsps.c +6 -0
@@ -213,6 +213,12 @@ static int dsps_check_status(struct musb msecs_to_jiffies(wrp->poll_timeout));break ;case OTG_STATE_A_WAIT_BCON : +/* keep VBUS on for host-only mode */ +if (musb->port_mode ==MUSB_PORT_MODE_HOST ) { +mod_timer (&glue->timer, jiffies + +msecs_to_jiffies (wrp->poll_timeout)); +break ; + }musb_writeb (musb->mregs,MUSB_DEVCTL ,0 ); skip_session =1 ;/* fall */
Greg Kroah-Hartman
maintainerPATCH 13/60 mac80211: fix packet statistics for fast-RX
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit 0328edc77d4f35014b35f32b46be0a7e16aae74f upstream.
When adding per-CPU statistics, which added statistics back to mac80211 for the fast-RX path, I evidently forgot to add the "stats->packets++" line. The reason for that is likely that I didn't see it since it's done in defragmentation for the regular RX path.
Add the missing line to properly count received packets in the fast-RX case.
--- net/mac80211/rx.c | 1 + 1 file changed, 1 insertion(+)
net/mac80211/rx.c +1 -0
@@ -3953,6 +3953,7 @@ static bool ieee80211_invoke_fast_rx(str stats->last_rate =sta_stats_encode_rate (status); stats->fragments++; + stats->packets++;if (!(status->flag &RX_FLAG_NO_SIGNAL_VAL )) { stats->last_signal = status->signal;
Greg Kroah-Hartman
maintainerPATCH 14/60 mac80211: fix IBSS presp allocation size
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit f1f3e9e2a50a70de908f9dfe0d870e9cdc67e042 upstream.
When VHT IBSS support was added, the size of the extra elements wasn't considered in ieee80211_ibss_build_presp(), which makes it possible that it would overrun the allocated buffer. Fix it by allocating the necessary space.
--- net/mac80211/ibss.c | 2 ++ 1 file changed, 2 insertions(+)
net/mac80211/ibss.c +2 -0
@@ -66,6 +66,8 @@ ieee80211_ibss_build_presp(struct ieee802 + (IEEE80211_MAX_SUPP_RATES -8 ) +2 +sizeof (struct ieee80211_ht_cap ) +2 +sizeof (struct ieee80211_ht_operation ) + +2 +sizeof (struct ieee80211_vht_cap ) + +2 +sizeof (struct ieee80211_vht_operation ) + ifibss->ie_len; presp =kzalloc (sizeof (*presp) + frame_len,GFP_KERNEL );if (!presp)
Greg Kroah-Hartman
maintainerPATCH 15/60 mac80211: strictly check mesh address extension mode
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rajkumar Manoharan <[email protected]>
commit 5667c86acf021e6dcf02584408b4484a273ac68f upstream.
Mesh forwarding path checks for address extension mode to fetch appropriate proxied address and MPP address. Existing condition that looks for 6 address format is not strict enough so that frames with improper values are processed and invalid entries are added into MPP table. Fix that by adding a stricter check before processing the packet.
Per IEEE Std 802.11s-2011 spec. Table 7-6g1 lists address extension mode 0x3 as reserved one. And also Table Table 9-13 does not specify 0x3 as valid address field.
--- net/mac80211/rx.c | 3 ++- net/wireless/util.c | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-)
net/mac80211/rx.c +2 -1
@@ -2471,7 +2471,8 @@ ieee80211_rx_h_mesh_fwding(struct ieee80if (is_multicast_ether_addr (hdr->addr1)) { mpp_addr = hdr->addr3; proxied_addr = mesh_hdr->eaddr1; - }else if (mesh_hdr->flags &MESH_FLAGS_AE_A5_A6 ) { + }else if ((mesh_hdr->flags &MESH_FLAGS_AE ) == +MESH_FLAGS_AE_A5_A6 ) {/* has_a4 already checked in ieee80211_rx_mesh_check */ mpp_addr = hdr->addr4; proxied_addr = mesh_hdr->eaddr2;
net/wireless/util.c +6 -4
@@ -454,6 +454,8 @@ int ieee80211_data_to_8023_exthdr(structif (iftype ==NL80211_IFTYPE_MESH_POINT )skb_copy_bits (skb, hdrlen, &mesh_flags,1 ); + mesh_flags &=MESH_FLAGS_AE ; +switch (hdr->frame_control &cpu_to_le16 (IEEE80211_FCTL_TODS |IEEE80211_FCTL_FROMDS )) {case cpu_to_le16 (IEEE80211_FCTL_TODS ):
@@ -469,9 +471,9 @@ int ieee80211_data_to_8023_exthdr(struct iftype != NL80211_IFTYPE_STATION))return -1 ;if (iftype ==NL80211_IFTYPE_MESH_POINT ) { -if (mesh_flags &MESH_FLAGS_AE_A4 ) +if (mesh_flags ==MESH_FLAGS_AE_A4 )return -1 ; -if (mesh_flags &MESH_FLAGS_AE_A5_A6 ) { +if (mesh_flags ==MESH_FLAGS_AE_A5_A6 ) {skb_copy_bits (skb, hdrlen + offsetof(struct ieee80211s_hdr , eaddr1), tmp.h_dest,2 *ETH_ALEN );
@@ -487,9 +489,9 @@ int ieee80211_data_to_8023_exthdr(struct ether_addr_equal(tmp.h_source, addr)))return -1 ;if (iftype ==NL80211_IFTYPE_MESH_POINT ) { -if (mesh_flags &MESH_FLAGS_AE_A5_A6 ) +if (mesh_flags ==MESH_FLAGS_AE_A5_A6 )return -1 ; -if (mesh_flags &MESH_FLAGS_AE_A4 ) +if (mesh_flags ==MESH_FLAGS_AE_A4 )skb_copy_bits (skb, hdrlen + offsetof(struct ieee80211s_hdr , eaddr1), tmp.h_source,ETH_ALEN );
Greg Kroah-Hartman
maintainerPATCH 16/60 mac80211: fix dropped counter in multiqueue RX
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit e165bc02a02c70e40d5c811c705ba269aeca0497 upstream.
In the commit enabling per-CPU station statistics, I inadvertedly copy-pasted some code to update rx_packets and forgot to change it to update rx_dropped_misc. Fix that.
This addresses https://bugzilla.kernel.org/show_bug.cgi?id=195953.
--- net/mac80211/sta_info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac80211/sta_info.c +1 -1
@@ -2148,7 +2148,7 @@ void sta_set_sinfo(struct sta_info *sta,struct ieee80211_sta_rx_stats *cpurxs; cpurxs =per_cpu_ptr (sta->pcpu_rx_stats, cpu); - sinfo->rx_packets += cpurxs->dropped; + sinfo->rx_dropped_misc += cpurxs->dropped; } }
Greg Kroah-Hartman
maintainerPATCH 17/60 mac80211: dont send SMPS action frame in AP mode when not needed
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
commit b3dd8279659f14f3624bb32559782d699fa6f7d1 upstream.
mac80211 allows to modify the SMPS state of an AP both, when it is started, and after it has been started. Such a change will trigger an action frame to all the peers that are currently connected, and will be remembered so that new peers will get notified as soon as they connect (since the SMPS setting in the beacon may not be the right one).
This means that we need to remember the SMPS state currently requested as well as the SMPS state that was configured initially (and advertised in the beacon). The former is bss->req_smps and the latter is sdata->smps_mode.
Initially, the AP interface could only be started with SMPS_OFF, which means that sdata->smps_mode was SMPS_OFF always. Later, a nl80211 API was added to be able to start an AP with a different AP mode. That code forgot to update bss->req_smps and because of that, if the AP interface was started with SMPS_DYNAMIC, we had:
sdata->smps_mode = SMPS_DYNAMIC
bss->req_smps = SMPS_OFF
That configuration made mac80211 think it needs to fire off an action frame to any new station connecting to the AP in order to let it know that the actual SMPS configuration is SMPS_OFF.
Fix that by properly setting bss->req_smps inieee80211_start_ap.
--- net/mac80211/cfg.c | 2 ++ 1 file changed, 2 insertions(+)
net/mac80211/cfg.c +2 -0
@@ -865,6 +865,8 @@ static int ieee80211_start_ap(struct wipdefault :return -EINVAL ; } + sdata->u.ap.req_smps = sdata->smps_mode; + sdata->needed_rx_chains = sdata->local->rx_chains;mutex_lock (&local->mtx);
Greg Kroah-Hartman
maintainerPATCH 18/60 drm/mediatek: fix mtk_hdmi_setup_vendor_specific_infoframe mistake
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: YYS <[email protected]>
commit 014580ffab654bb83256783a2b185cf6c06dffaa upstream.
mtk_hdmi_setup_vendor_specific_infoframe will return before handle mtk_hdmi_hw_send_info_frame.Because hdmi_vendor_infoframe_pack returns the number of bytes packed into the binary buffer or a negative error code on failure.
So correct it.
--- drivers/gpu/drm/mediatek/mtk_hdmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/mediatek/mtk_hdmi.c +1 -1
@@ -1061,7 +1061,7 @@ static int mtk_hdmi_setup_vendor_specifi } err =hdmi_vendor_infoframe_pack (&frame, buffer,sizeof (buffer)); -if (err) { +if (err <0 ) {dev_err (hdmi->dev,"Failed to pack vendor infoframe: %zd\n" , err);return err;
Greg Kroah-Hartman
maintainerPATCH 19/60 drm/vc4: Fix OOPSes from trying to cache a partially constructed BO.
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Anholt <[email protected]>
commit ca39b449f6d03e8235969f12f5dd25b8eb4304d6 upstream.
If a CMA allocation failed, the partially constructed BO would be unreferenced through the normal path, and we might choose to put it in the BO cache. If we then reused it before it expired from the cache, the kernel would OOPS.
--- drivers/gpu/drm/vc4/vc4_bo.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/gpu/drm/vc4/vc4_bo.c +8 -0
@@ -313,6 +313,14 @@ void vc4_free_object(struct drm_gem_obje goto out; } +/* If this object was partially constructed but CMA allocation +* had failed, just free it. +*/ +if (!bo->base.vaddr) { +vc4_bo_destroy (bo); + goto out; + } + cache_list =vc4_get_cache_list_for_size (dev, gem_bo->size);if (!cache_list) {vc4_bo_destroy (bo);
Greg Kroah-Hartman
maintainerPATCH 21/60 serial: sh-sci: Fix late enablement of AUTORTS
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit 5f76895e4c712b1b5af450cf344389b8c53ac2c2 upstream.
When changing hardware control flow for a UART with dedicated RTS/CTS pins, the new AUTORTS state is not immediately reflected in the hardware, but only when RTS is raised. However, the serial core does not call .set_mctrl() after .set_termios(), hence AUTORTS may only become effective when the port is closed, and reopened later. Note that this problem does not happen when manually using stty to change CRTSCTS, as AUTORTS will work fine on next open.
To fix this, call .set_mctrl() from .set_termios() when dedicated RTS/CTS pins are present, to refresh the AUTORTS or RTS state. This is similar to what other drivers supporting AUTORTS do (e.g. omap-serial).
--- drivers/tty/serial/sh-sci.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/tty/serial/sh-sci.c +4 -0
@@ -2366,6 +2366,10 @@ done:*/ udelay (DIV_ROUND_UP (10 *1000000 , baud)); } +if (port->flags &UPF_HARD_FLOW ) { +/* Refresh (Auto) RTS */ +sci_set_mctrl (port, port->mctrl); + }#ifdef CONFIG_SERIAL_SH_SCI_DMA /*
Greg Kroah-Hartman
maintainerPATCH 22/60 x86/mm/32: Set the __vmalloc_start_set flag in initmem_init()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laura Abbott <[email protected]>
commit 861ce4a3244c21b0af64f880d5bfe5e6e2fb9e4a upstream.
'__vmalloc_start_set' currently only gets set in initmem_init() when !CONFIG_NEED_MULTIPLE_NODES. This breaks detection of vmalloc address with virt_addr_valid() with CONFIG_NEED_MULTIPLE_NODES=y, causing a kernel crash:
[mm/usercopy] 517e1fbeb6: kernel BUG at arch/x86/mm/physaddr.c:78!
Set '__vmalloc_start_set' appropriately for that case as well.
--- arch/x86/mm/numa_32.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/mm/numa_32.c +1 -0
@@ -100,5 +100,6 @@ void __init initmem_init(void)printk (KERN_DEBUG "High memory starts at vaddr %08lx\n" , (ulong )pfn_to_kaddr (highstart_pfn)); + __vmalloc_start_set = true;setup_bootmem_allocator (); }
Greg Kroah-Hartman
maintainerPATCH 23/60 mfd: omap-usb-tll: Fix inverted bit use for USB TLL mode
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
commit 8b8a84c54aff4256d592dc18346c65ecf6811b45 upstream.
Commit 16fa3dc75c22 ("mfd: omap-usb-tll: HOST TLL platform driver") added support for USB TLL, but uses OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF bit the wrong way. The comments in the code are correct, but the inverted use of OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF causes the register to be enabled instead of disabled unlike what the comments say.
Without this change the Wrigley 3G LTE modem on droid 4 EHCI bus can be only pinged few times before it stops responding.
--- drivers/mfd/omap-usb-tll.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mfd/omap-usb-tll.c +1 -1
@@ -377,8 +377,8 @@ int omap_tll_init(struct usbhs_omap_plat* and use SDR Mode */ reg &= ~(OMAP_TLL_CHANNEL_CONF_UTMIAUTOIDLE - |OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF |OMAP_TLL_CHANNEL_CONF_ULPIDDRMODE ); + reg |=OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF ; }else if (pdata->port_mode[i] ==OMAP_EHCI_PORT_MODE_HSIC ) {/*
Greg Kroah-Hartman
maintainerPATCH 24/60 staging: rtl8188eu: prevent an underflow in rtw_check_beacon_data()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 784047eb2d3405a35087af70cba46170c5576b25 upstream.
The "len" could be as low as -14 so we should check for negatives.
--- drivers/staging/rtl8188eu/core/rtw_ap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/rtl8188eu/core/rtw_ap.c +1 -1
@@ -890,7 +890,7 @@ int rtw_check_beacon_data(struct adapterreturn _FAIL; -if (len >MAX_IE_SZ ) +if (len <0 || len >MAX_IE_SZ )return _FAIL; pbss_network->IELength = len;
Greg Kroah-Hartman
maintainerPATCH 25/60 staging: iio: tsl2x7x_core: Fix standard deviation calculation
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eva Rachel Retuya <[email protected]>
commit cf6c77323a96fc40309cc8a4921ef206cccdd961 upstream.
Standard deviation is calculated as the square root of the variance where variance is the mean of sample_sum and length. Correct the computation of statP->stddev in accordance to the proper calculation.
--- drivers/staging/iio/light/tsl2x7x_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/iio/light/tsl2x7x_core.c +1 -1
@@ -854,7 +854,7 @@ void tsl2x7x_prox_calculate(int *data, i tmp = data[i] - statP->mean; sample_sum += tmp * tmp; } - statP->stddev =int_sqrt ((long )sample_sum) / length; + statP->stddev =int_sqrt ((long )sample_sum / length); }/**
Greg Kroah-Hartman
maintainerPATCH 26/60 iio: st_pressure: Fix data sign
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcin Niestroj <[email protected]>
commit 1b211d48abaa0e12e6e6177c0316ff55d11fdfce upstream.
Datasheet of each device (lps331ap, lps25h, lps001wp, lps22hb) says that the pressure and temperature data is a 2's complement.
I'm sending this the slow way, as negative pressures on these are pretty unusual and the nature of the fixing of multiple device introduction patches will make it hard to apply to older kernels - Jonathan.
--- drivers/iio/pressure/st_pressure_core.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/iio/pressure/st_pressure_core.c +5 -5
@@ -227,7 +227,7 @@ static const struct iio_chan_spec st_pre .address = ST_PRESS_1_OUT_XL_ADDR, .scan_index = 0, .scan_type = { - .sign = 'u', + .sign = 's', .realbits = 24, .storagebits = 32, .endianness = IIO_LE,
@@ -240,7 +240,7 @@ static const struct iio_chan_spec st_pre .address = ST_TEMP_1_OUT_L_ADDR, .scan_index = 1, .scan_type = { - .sign = 'u', + .sign = 's', .realbits = 16, .storagebits = 16, .endianness = IIO_LE,
@@ -259,7 +259,7 @@ static const struct iio_chan_spec st_pre .address = ST_PRESS_LPS001WP_OUT_L_ADDR, .scan_index = 0, .scan_type = { - .sign = 'u', + .sign = 's', .realbits = 16, .storagebits = 16, .endianness = IIO_LE,
@@ -273,7 +273,7 @@ static const struct iio_chan_spec st_pre .address = ST_TEMP_LPS001WP_OUT_L_ADDR, .scan_index = 1, .scan_type = { - .sign = 'u', + .sign = 's', .realbits = 16, .storagebits = 16, .endianness = IIO_LE,
@@ -291,7 +291,7 @@ static const struct iio_chan_spec st_pre .address = ST_PRESS_1_OUT_XL_ADDR, .scan_index = 0, .scan_type = { - .sign = 'u', + .sign = 's', .realbits = 24, .storagebits = 32, .endianness = IIO_LE,
Greg Kroah-Hartman
maintainerPATCH 27/60 iio: proximity: as3935: recalibrate RCO after resume
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Ranostay <[email protected]>
commit 6272c0de13abf1480f701d38288f28a11b4301c4 upstream.
According to the datasheet the RCO must be recalibrated on every power-on-reset. Also remove mutex locking in the calibration function since callers other than the probe function (which doesn't need it) will have a lock.
--- drivers/iio/proximity/as3935.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/iio/proximity/as3935.c +2 -4
@@ -269,8 +269,6 @@ static irqreturn_t as3935_interrupt_handstatic void calibrate_as3935 (struct as3935_state *st) { -mutex_lock (&st->lock); -/* mask disturber interrupt bit */ as3935_write (st,AS3935_INT ,BIT (5 ));
@@ -280,8 +278,6 @@ static void calibrate_as3935(struct as39mdelay (2 );as3935_write (st,AS3935_TUNE_CAP , (st->tune_cap /TUNE_CAP_DIV )); - -mutex_unlock (&st->lock); }#ifdef CONFIG_PM_SLEEP
@@ -318,6 +314,8 @@ static int as3935_resume(struct device * val &= ~AS3935_AFE_PWR_BIT ; ret =as3935_write (st,AS3935_AFE_GAIN , val); +calibrate_as3935 (st); + err_resume:mutex_unlock (&st->lock);
Greg Kroah-Hartman
maintainerPATCH 28/60 iio: adc: ti_am335x_adc: allocating too much in probe
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 5ba5b437efaa7a502eec393c045d3bf90c92c4e9 upstream.
We should be allocating enough information for a tiadc_device struct which is about 400 bytes but instead we allocate enough for a second iio_dev struct which is over 2000 bytes.
--- drivers/iio/adc/ti_am335x_adc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/ti_am335x_adc.c +1 -1
@@ -484,7 +484,7 @@ static int tiadc_probe(struct platform_dreturn -EINVAL ; } - indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*indio_dev)); + indio_dev =devm_iio_device_alloc (&pdev->dev,sizeof (*adc_dev));if (indio_dev ==NULL ) {dev_err (&pdev->dev,"failed to allocate iio device\n" );return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 29/60 IB/mlx5: Fix kernel to user leak prevention logic
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eli Cohen <[email protected]>
commit de8d6e02efbdb259c67832ccf027d7ace9b91d5d upstream.
The logic was broken as it failed to update the response length for architectures with PAGE_SIZE larger than 4kB. As a result further extension of the ucontext response struct would fail.
--- drivers/infiniband/hw/mlx5/main.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/infiniband/hw/mlx5/main.c +7 -7
@@ -1105,13 +1105,13 @@ static struct ib_ucontext *mlx5_ib_alloc* pretend we don't support reading the HCA's core clock. This is also * forced by mmap function. */ -if (PAGE_SIZE <=4096 && -field_avail (typeof (resp), hca_core_clock_offset, udata->outlen)) { - resp.comp_mask |= -MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_CORE_CLOCK_OFFSET ; - resp.hca_core_clock_offset = - offsetof(struct mlx5_init_seg , internal_timer_h) % -PAGE_SIZE ; +if (field_avail (typeof (resp), hca_core_clock_offset, udata->outlen)) { +if (PAGE_SIZE <=4096 ) { + resp.comp_mask |= +MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_CORE_CLOCK_OFFSET ; + resp.hca_core_clock_offset = + offsetof(struct mlx5_init_seg , internal_timer_h) %PAGE_SIZE ; + } resp.response_length +=sizeof (resp.hca_core_clock_offset) +sizeof (resp.reserved2); }
Greg Kroah-Hartman
maintainerPATCH 30/60 usb: gadget: udc: renesas_usb3: fix pm_runtime functions calling
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yoshihiro Shimoda <[email protected]>
commit cdc876877ebc3f0677b267756d4564e2a429e730 upstream.
This patch fixes an issue that this driver is possible to access the registers before pm_runtime_get_sync() if a gadget driver is installed first. After that, oops happens on R-Car Gen3 environment. To avoid it, this patch changes the pm_runtime call timing from probe/remove to udc_start/udc_stop.
--- drivers/usb/gadget/udc/renesas_usb3.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/usb/gadget/udc/renesas_usb3.c +6 -6
@@ -1707,6 +1707,9 @@ static int renesas_usb3_start(struct usb/* hook up the driver */ usb3->driver = driver; +pm_runtime_enable (usb3_to_dev (usb3)); +pm_runtime_get_sync (usb3_to_dev (usb3)); +renesas_usb3_init_controller (usb3);return 0 ;
@@ -1724,6 +1727,9 @@ static int renesas_usb3_stop(struct usb_renesas_usb3_stop_controller (usb3);spin_unlock_irqrestore (&usb3->lock, flags); +pm_runtime_put (usb3_to_dev (usb3)); +pm_runtime_disable (usb3_to_dev (usb3)); +return 0 ; }
@@ -1761,9 +1767,6 @@ static int renesas_usb3_remove(struct pl {struct renesas_usb3 *usb3 =platform_get_drvdata (pdev); -pm_runtime_put (&pdev->dev); -pm_runtime_disable (&pdev->dev); -usb_del_gadget_udc (&usb3->gadget);__renesas_usb3_ep_free_request (usb3->ep0_req);
@@ -1948,9 +1951,6 @@ static int renesas_usb3_probe(struct pla usb3->workaround_for_vbus = priv->workaround_for_vbus; -pm_runtime_enable (&pdev->dev); -pm_runtime_get_sync (&pdev->dev); -dev_info (&pdev->dev,"probed\n" );return 0 ;
Greg Kroah-Hartman
maintainerPATCH 31/60 usb: gadget: udc: renesas_usb3: fix deadlock by spinlock
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yoshihiro Shimoda <[email protected]>
commit 067d6fdc558d2c43f0bfdc7af99630dd5eb08dc5 upstream.
This patch fixes an issue that this driver is possible to cause deadlock by double-spinclocked in renesas_usb3_stop_controller(). So, this patch removes spinlock API calling in renesas_usb3_stop(). (In other words, the previous code had a redundant lock.)
--- drivers/usb/gadget/udc/renesas_usb3.c | 3 --- 1 file changed, 3 deletions(-)
drivers/usb/gadget/udc/renesas_usb3.c +0 -3
@@ -1718,14 +1718,11 @@ static int renesas_usb3_start(struct usbstatic int renesas_usb3_stop (struct usb_gadget *gadget) {struct renesas_usb3 *usb3 =gadget_to_renesas_usb3 (gadget); -unsigned long flags; -spin_lock_irqsave (&usb3->lock, flags); usb3->softconnect = false; usb3->gadget.speed =USB_SPEED_UNKNOWN ; usb3->driver =NULL ;renesas_usb3_stop_controller (usb3); -spin_unlock_irqrestore (&usb3->lock, flags);pm_runtime_put (usb3_to_dev (usb3));pm_runtime_disable (usb3_to_dev (usb3));
Greg Kroah-Hartman
maintainerPATCH 32/60 usb: gadget: udc: renesas_usb3: lock for PN_ registers access
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yoshihiro Shimoda <[email protected]>
commit 940f538a100c84c6e72813e4ac88bd1753a86945 upstream.
This controller disallows to change the PIPE until reading/writing a packet finishes. However. the previous code is not enough to hold the lock in some functions. So, this patch fixes it.
--- drivers/usb/gadget/udc/renesas_usb3.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-)
drivers/usb/gadget/udc/renesas_usb3.c +25 -3
@@ -1401,7 +1401,13 @@ static void usb3_request_done_pipen(stru struct renesas_usb3_request *usb3_req, int status) { -usb3_pn_stop (usb3 ); +unsigned long flags; + +spin_lock_irqsave (&usb3->lock, flags); +if (usb3_pn_change (usb3, usb3_ep->num)) +usb3_pn_stop (usb3); +spin_unlock_irqrestore (&usb3->lock, flags); +usb3_disable_pipe_irq (usb3, usb3_ep->num);usb3_request_done (usb3_ep, usb3_req, status);
@@ -1430,30 +1436,46 @@ static void usb3_irq_epc_pipen_bfrdy(str {struct renesas_usb3_ep *usb3_ep =usb3_get_ep (usb3, num);struct renesas_usb3_request *usb3_req =usb3_get_request (usb3_ep); +bool done = false;if (!usb3_req)return ; +spin_lock (&usb3->lock); +if (usb3_pn_change (usb3, num)) + goto out; +if (usb3_ep->dir_in) {/* Do not stop the IN pipe here to detect LSTTR interrupt */ if (!usb3_write_pipe (usb3_ep, usb3_req,USB3_PN_WRITE ))usb3_clear_bit (usb3,PN_INT_BFRDY ,USB3_PN_INT_ENA ); }else {if (!usb3_read_pipe (usb3_ep, usb3_req,USB3_PN_READ )) -usb3_request_done_pipen (usb3, usb3_ep, usb3_req,0 ); + done = true; } + +out: +/* need to unlock because usb3_request_done_pipen() locks it */ +spin_unlock (&usb3->lock); + +if (done) +usb3_request_done_pipen (usb3, usb3_ep, usb3_req,0 ); }static void usb3_irq_epc_pipen (struct renesas_usb3 *usb3,int num) {u32 pn_int_sta; -if (usb3_pn_change (usb3, num) <0 ) +spin_lock (&usb3->lock); +if (usb3_pn_change (usb3, num) <0 ) { +spin_unlock (&usb3->lock);return ; + } pn_int_sta =usb3_read (usb3,USB3_PN_INT_STA ); pn_int_sta &=usb3_read (usb3,USB3_PN_INT_ENA );usb3_write (usb3, pn_int_sta,USB3_PN_INT_STA ); +spin_unlock (&usb3->lock);if (pn_int_sta &PN_INT_LSTTR )usb3_irq_epc_pipen_lsttr (usb3, num);if (pn_int_sta &PN_INT_BFRDY )
Greg Kroah-Hartman
maintainerPATCH 33/60 USB: hub: fix SS max number of ports
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 93491ced3c87c94b12220dbac0527e1356702179 upstream.
Add define for the maximum number of ports on a SuperSpeed hub as per USB 3.1 spec Table 10-5, and use it when verifying the retrieved hub descriptor.
This specifically avoids benign attempts to update the DeviceRemovable mask for non-existing ports (should we get that far).
--- drivers/usb/core/hub.c | 8 +++++++- include/uapi/linux/usb/ch11.h | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-)
drivers/usb/core/hub.c +7 -1
@@ -1334,7 +1334,13 @@ static int hub_configure(struct usb_hubif (ret <0 ) { message ="can't read hub descriptor" ; goto fail; - }else if (hub->descriptor->bNbrPorts >USB_MAXCHILDREN ) { + } + + maxchild =USB_MAXCHILDREN ; +if (hub_is_superspeed (hdev)) + maxchild =min_t (unsigned, maxchild,USB_SS_MAXPORTS ); + +if (hub->descriptor->bNbrPorts > maxchild) { message ="hub has too many ports!" ; ret = -ENODEV ; goto fail;
include/uapi/linux/usb/ch11.h +3 -0
@@ -22,6 +22,9 @@*/ #define USB_MAXCHILDREN 31 +/* See USB 3.1 spec Table 10-5 */ +#define USB_SS_MAXPORTS 15 +/* * Hub request types */
Greg Kroah-Hartman
maintainerPATCH 34/60 usb: core: fix potential memory leak in error path during hcd creation
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Bondarenko <[email protected]>
commit 1a744d2eb76aaafb997fda004ae3ae62a1538f85 upstream.
Free memory allocated for address0_mutex if allocation of bandwidth_mutex failed.
--- drivers/usb/core/hcd.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/core/hcd.c +1 -0
@@ -2535,6 +2535,7 @@ struct usb_hcd *usb_create_shared_hcd(co hcd->bandwidth_mutex =kmalloc (sizeof (*hcd->bandwidth_mutex),GFP_KERNEL );if (!hcd->bandwidth_mutex) { +kfree (hcd->address0_mutex);kfree (hcd);dev_dbg (dev,"hcd bandwidth mutex alloc failed\n" );return NULL ;
Greg Kroah-Hartman
maintainerPATCH 35/60 USB: usbip: fix nonconforming hub descriptor
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit ec963b412a54aac8e527708ecad06a6988a86fb4 upstream.
Fix up the root-hub descriptor to accommodate the variable-length DeviceRemovable and PortPwrCtrlMask fields, while marking all ports as removable (and leaving the reserved bit zero unset).
Also add a build-time constraint on VHCI_HC_PORTS which must never be greater than USB_MAXCHILDREN (but this was only enforced through a KConfig constant).
This specifically fixes the descriptor layout whenever VHCI_HC_PORTS is greater than seven (default is 8).
--- drivers/usb/usbip/vhci_hcd.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/usb/usbip/vhci_hcd.c +8 -3
@@ -235,14 +235,19 @@ done:static inline void hub_descriptor (struct usb_hub_descriptor *desc) { +int width; +memset (desc,0 ,sizeof (*desc)); desc->bDescriptorType =USB_DT_HUB ; - desc->bDescLength =9 ; desc->wHubCharacteristics =cpu_to_le16 (HUB_CHAR_INDV_PORT_LPSM |HUB_CHAR_COMMON_OCPM ); + desc->bNbrPorts =VHCI_HC_PORTS ; - desc->u.hs.DeviceRemovable[0 ] =0xff ; - desc->u.hs.DeviceRemovable[1 ] =0xff ; +BUILD_BUG_ON (VHCI_HC_PORTS >USB_MAXCHILDREN ); + width = desc->bNbrPorts /8 +1 ; + desc->bDescLength =USB_DT_HUB_NONVAR_SIZE +2 * width; +memset (&desc->u.hs.DeviceRemovable[0 ],0 , width); +memset (&desc->u.hs.DeviceRemovable[width],0xff , width); } static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
Greg Kroah-Hartman
maintainerPATCH 36/60 pvrusb2: reduce stack usage pvr2_eeprom_analyze()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 6830733d53a4517588e56227b9c8538633f0c496 upstream.
The driver uses a relatively large data structure on the stack, which showed up on my radar as we get a warning with the "latent entropy" GCC plugin:
drivers/media/usb/pvrusb2/pvrusb2-eeprom.c:153:1: error: the frame size of 1376 bytes is larger than 1152 bytes [-Werror=frame-larger-than=]
The warning is usually hidden as we raise the warning limit to 2048 when the plugin is enabled, but I'd like to lower that again in the future, and making this function smaller helps to do that without build regressions.
Further analysis shows that putting an 'i2c_client' structure on the stack is not really supported, as the embedded 'struct device' is not initialized here, and we are only saved by the fact that the function that is called here does not use the pointer at all.
--- drivers/media/usb/pvrusb2/pvrusb2-eeprom.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/media/usb/pvrusb2/pvrusb2-eeprom.c +3 -8
@@ -123,15 +123,10 @@ int pvr2_eeprom_analyze(struct pvr2_hdwmemset (&tvdata,0 ,sizeof (tvdata)); eeprom =pvr2_eeprom_fetch (hdw); -if (!eeprom)return -EINVAL ; +if (!eeprom) +return -EINVAL ; - { -struct i2c_client fake_client; -/* Newer version expects a useless client interface */ - fake_client.addr = hdw->eeprom_addr; - fake_client.adapter = &hdw->i2c_adap; -tveeprom_hauppauge_analog (&fake_client,&tvdata,eeprom); - } +tveeprom_hauppauge_analog (NULL , &tvdata, eeprom);trace_eeprom ("eeprom assumed v4l tveeprom module" );trace_eeprom ("eeprom direct call results:" );
Greg Kroah-Hartman
maintainerPATCH 37/60 USB: gadget: dummy_hcd: fix hub-descriptor removable fields
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit d81182ce30dbd497a1e7047d7fda2af040347790 upstream.
Flag the first and only port as removable while also leaving the remaining bits (including the reserved bit zero) unset in accordance with the specifications:
"Within a byte, if no port exists for a given location, the bit field representing the port characteristics shall be 0."
Also add a comment marking the legacy PortPwrCtrlMask field.
--- drivers/usb/gadget/udc/dummy_hcd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/usb/gadget/udc/dummy_hcd.c +3 -3
@@ -2009,7 +2009,7 @@ ss_hub_descriptor(struct usb_hub_descrip HUB_CHAR_COMMON_OCPM); desc->bNbrPorts =1 ; desc->u.ss.bHubHdrDecLat =0x04 ;/* Worst case: 0.4 micro sec*/ - desc->u.ss.DeviceRemovable =0xffff ; + desc->u.ss.DeviceRemovable =0 ; }static inline void hub_descriptor (struct usb_hub_descriptor *desc)
@@ -2021,8 +2021,8 @@ static inline void hub_descriptor(structHUB_CHAR_INDV_PORT_LPSM | HUB_CHAR_COMMON_OCPM); desc->bNbrPorts =1 ; - desc->u.hs.DeviceRemovable[0 ] =0xff ; - desc->u.hs.DeviceRemovable[1 ] =0xff ; + desc->u.hs.DeviceRemovable[0 ] =0 ; + desc->u.hs.DeviceRemovable[1 ] =0xff ;/* PortPwrCtrlMask */ } static int dummy_hub_control(
Greg Kroah-Hartman
maintainerPATCH 38/60 usb: r8a66597-hcd: select a different endpoint on timeout
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Brandt <[email protected]>
commit 1f873d857b6c2fefb4dada952674aa01bcfb92bd upstream.
If multiple endpoints on a single device have pending IN URBs and one endpoint times out due to NAKs (perfectly legal), select a different endpoint URB to try.
The existing code only checked to see another device address has pending URBs and ignores other IN endpoints on the current device address. This leads to endpoints never getting serviced if one endpoint is using NAK as a flow control method.
--- drivers/usb/host/r8a66597-hcd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/host/r8a66597-hcd.c +3 -1
@@ -1785,6 +1785,7 @@ static void r8a66597_td_timer(unsigned l pipe = td->pipe;pipe_stop (r8a66597, pipe); +/* Select a different address or endpoint */ new_td = td; do { list_move_tail(&new_td->queue,
@@ -1794,7 +1795,8 @@ static void r8a66597_td_timer(unsigned l new_td = td;break ; } - }while (td != new_td && td->address == new_td->address); + }while (td != new_td && td->address == new_td->address && + td->pipe->info.epnum == new_td->pipe->info.epnum);start_transfer (r8a66597, new_td);
Greg Kroah-Hartman
maintainerPATCH 39/60 usb: r8a66597-hcd: decrease timeout
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Brandt <[email protected]>
commit dd14a3e9b92ac6f0918054f9e3477438760a4fa6 upstream.
The timeout for BULK packets was 300ms which is a long time if other endpoints or devices are waiting for their turn. Changing it to 50ms greatly increased the overall performance for multi-endpoint devices.
--- drivers/usb/host/r8a66597-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/r8a66597-hcd.c +1 -1
@@ -1269,7 +1269,7 @@ static void set_td_timer(struct r8a66597 time =30 ;break ;default : - time =300 ; + time =50 ;break ; }
Greg Kroah-Hartman
maintainerPATCH 40/60 ath10k: fix napi crash during rmmod when probe firmware fails
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalle Valo <[email protected]>
commit 1427228d5869f5804b03d47acfa4a88122572a78 upstream.
This fixes the below crash when ath10k probe firmware fails, NAPI polling tries to access a rx ring resource which was never allocated. An easy way to reproduce this is easy to remove all the firmware files, load ath10k modules and ath10k will crash when calling 'rmmod ath10k_pci'. The fix is to call napi_enable() from ath10k_pci_hif_start() so that it matches with napi_disable() being called from ath10k_pci_hif_stop().
Big thanks to Mohammed Shafi Shajakhan who debugged this and provided first version of the fix. In this patch I just fix the actual problem in pci.c instead of having a workaround in core.c.
BUG: unable to handle kernel NULL pointer dereference at (null) IP: __ath10k_htt_rx_ring_fill_n+0x19/0x230 [ath10k_core] __ath10k_htt_rx_ring_fill_n+0x19/0x230 [ath10k_core] Call Trace: [<ffffffffa113ec62>] ath10k_htt_rx_msdu_buff_replenish+0x42/0x90
[ath10k_core]
[<ffffffffa113f393>] ath10k_htt_txrx_compl_task+0x433/0x17d0 [ath10k_core]
[<ffffffff8114406d>] ? __wake_up_common+0x4d/0x80 [<ffffffff811349ec>] ? cpu_load_update+0xdc/0x150 [<ffffffffa119301d>] ? ath10k_pci_read32+0xd/0x10 [ath10k_pci]
[<ffffffffa1195b17>] ath10k_pci_napi_poll+0x47/0x110 [ath10k_pci] [<ffffffff817863af>] net_rx_action+0x20f/0x370
--- drivers/net/wireless/ath/ath10k/pci.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath10k/pci.c +2 -1
@@ -1647,6 +1647,8 @@ static int ath10k_pci_hif_start(struct aath10k_dbg (ar,ATH10K_DBG_BOOT ,"boot hif start\n" ); +napi_enable (&ar->napi); +ath10k_pci_irq_enable (ar);ath10k_pci_rx_post (ar);
@@ -2531,7 +2533,6 @@ static int ath10k_pci_hif_power_up(strucath10k_err (ar,"could not wake up target CPU: %d\n" , ret); goto err_ce; } -napi_enable (&ar->napi);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 41/60 misc: mic: double free on ioctl error path
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 816c9311f1144a03da1fdc4feb2f6b0d3299fca0 upstream.
This function only has one caller. Freeing "vdev" here leads to a use after free bug. There are several other error paths in this function but this is the only one which frees "vdev". It looks like the kfree() can be safely removed.
--- drivers/misc/mic/vop/vop_vringh.c | 1 - 1 file changed, 1 deletion(-)
drivers/misc/mic/vop/vop_vringh.c +0 -1
@@ -292,7 +292,6 @@ static int vop_virtio_add_device(structif (ret) {dev_err (vop_dev (vdev),"%s %d err %d\n" , __func__, __LINE__, ret); -kfree (vdev);return ret; }
Greg Kroah-Hartman
maintainerPATCH 42/60 drivers/misc/c2port/c2port-duramar2150.c: checking for NULL instead of IS_ERR()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 8128a31eaadbcdfa37774bbd28f3f00bac69996a upstream.
c2port_device_register() never returns NULL, it uses error pointers.
--- drivers/misc/c2port/c2port-duramar2150.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/misc/c2port/c2port-duramar2150.c +2 -2
@@ -129,8 +129,8 @@ static int __init duramar2150_c2port_ini duramar2150_c2port_dev =c2port_device_register ("uc" , &duramar2150_c2port_ops,NULL ); -if (!duramar2150_c2port_dev) { - ret = -ENODEV ; +if (IS_ERR (duramar2150_c2port_dev)) { + ret =PTR_ERR (duramar2150_c2port_dev); goto free_region; }
Greg Kroah-Hartman
maintainerPATCH 43/60 usb: xhci: Fix USB 3.1 supported protocol parsing
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: YD Tseng <[email protected]>
commit b72eb8435b25be3a1880264cf32ac91e626ba5ba upstream.
xHCI host controllers can have both USB 3.1 and 3.0 extended speed protocol lists. If the USB3.1 speed is parsed first and 3.0 second then the minor revision supported will be overwritten by the 3.0 speeds and the USB3 roothub will only show support for USB 3.0 speeds.
This was the case with a xhci controller with the supported protocol capability listed below.
In xhci-mem.c, the USB 3.1 speed is parsed first, the min_rev of usb3_rhub is set as 0x10. And then USB 3.0 is parsed. However, the min_rev of usb3_rhub will be changed to 0x00. If USB 3.1 device is connected behind this host controller, the speed of USB 3.1 device just reports 5G speed using lsusb.
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00 01 08 00 00 00 00 00 40 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20 02 08 10 03 55 53 42 20 01 02 00 00 00 00 00 00 //USB 3.1
30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40 02 08 00 03 55 53 42 20 03 06 00 00 00 00 00 00 //USB 3.0
50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60 02 08 00 02 55 53 42 20 09 0E 19 00 00 00 00 00 //USB 2.0
70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
This patch fixes the issue by only owerwriting the minor revision if it is higher than the existing one.
--- drivers/usb/host/xhci-mem.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/usb/host/xhci-mem.c +5 -2
@@ -2123,11 +2123,12 @@ static void xhci_add_in_port(struct xhci {u32 temp, port_offset, port_count;int i; -u8 major_revision; +u8 major_revision, minor_revision;struct xhci_hub *rhub; temp =readl (addr); major_revision =XHCI_EXT_PORT_MAJOR (temp); + minor_revision =XHCI_EXT_PORT_MINOR (temp);if (major_revision ==0x03 ) { rhub = &xhci->usb3_rhub;
@@ -2141,7 +2142,9 @@ static void xhci_add_in_port(struct xhcireturn ; } rhub->maj_rev =XHCI_EXT_PORT_MAJOR (temp); - rhub->min_rev =XHCI_EXT_PORT_MINOR (temp); + +if (rhub->min_rev < minor_revision) + rhub->min_rev = minor_revision;/* Port offset and count in the third dword, see section 7.2 */ temp =readl (addr +2 );
Greg Kroah-Hartman
maintainerPATCH 44/60 usb: xhci: ASMedia ASM1042A chipset need shorts TX quirk
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Corentin Labbe <[email protected]>
commit d2f48f05cd2a2a0a708fbfa45f1a00a87660d937 upstream.
When plugging an USB webcam I see the following message:
[106385.615559] xhci_hcd 0000:04:00.0: WARN Successful completion on short TX: needs XHCI_TRUST_TX_LENGTH quirk? [106390.583860] handle_tx_event: 913 callbacks suppressed
With this patch applied, I get no more printing of this message.
--- drivers/usb/host/xhci-pci.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/host/xhci-pci.c +3 -0
@@ -201,6 +201,9 @@ static void xhci_pci_quirks(struct devicif (pdev->vendor ==PCI_VENDOR_ID_ASMEDIA && pdev->device ==0x1042 ) xhci->quirks |=XHCI_BROKEN_STREAMS ; +if (pdev->vendor ==PCI_VENDOR_ID_ASMEDIA && + pdev->device ==0x1142 ) + xhci->quirks |=XHCI_TRUST_TX_LENGTH ;if (pdev->vendor ==PCI_VENDOR_ID_TI && pdev->device ==0x8241 ) xhci->quirks |=XHCI_LIMIT_ENDPOINT_INTERVAL_7 ;
Greg Kroah-Hartman
maintainerPATCH 45/60 USB: gadget: fix GPF in gadgetfs
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Stern <[email protected]>
commit f50b878fed33e360d01dcdc31a8eeb1815d033d5 upstream.
A NULL-pointer dereference bug in gadgetfs was uncovered by syzkaller:
Quoted 40 lines
kasan: GPF could be caused by NULL-ptr deref or user memory access
general protection fault: 0000 [#1] SMP KASAN Dumping ftrace buffer: (ftrace buffer empty) Modules linked in: CPU: 2 PID: 4820 Comm: syz-executor0 Not tainted 4.12.0-rc4+ #5 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011 task: ffff880039542dc0 task.stack: ffff88003bdd0000 RIP: 0010:__list_del_entry_valid+0x7e/0x170 lib/list_debug.c:51 RSP: 0018:ffff88003bdd6e50 EFLAGS: 00010246 RAX: dffffc0000000000 RBX: 0000000000000000 RCX: 0000000000010000 RDX: 0000000000000000 RSI: ffffffff86504948 RDI: ffffffff86504950 RBP: ffff88003bdd6e68 R08: ffff880039542dc0 R09: ffffffff8778ce00 R10: ffff88003bdd6e68 R11: dffffc0000000000 R12: 0000000000000000 R13: dffffc0000000000 R14: 1ffff100077badd2 R15: ffffffff864d2e40 FS: 0000000000000000(0000) GS:ffff88006dc00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000000002014aff9 CR3: 0000000006022000 CR4: 00000000000006e0 Call Trace: __list_del_entry include/linux/list.h:116 [inline] list_del include/linux/list.h:124 [inline] usb_gadget_unregister_driver+0x166/0x4c0 drivers/usb/gadget/udc/core.c:1387 dev_release+0x80/0x160 drivers/usb/gadget/legacy/inode.c:1187 __fput+0x332/0x7f0 fs/file_table.c:209 ____fput+0x15/0x20 fs/file_table.c:245 task_work_run+0x19b/0x270 kernel/task_work.c:116 exit_task_work include/linux/task_work.h:21 [inline] do_exit+0x18a3/0x2820 kernel/exit.c:878 do_group_exit+0x149/0x420 kernel/exit.c:982 get_signal+0x77f/0x1780 kernel/signal.c:2318 do_signal+0xd2/0x2130 arch/x86/kernel/signal.c:808 exit_to_usermode_loop+0x1a7/0x240 arch/x86/entry/common.c:157 prepare_exit_to_usermode arch/x86/entry/common.c:194 [inline] syscall_return_slowpath+0x3ba/0x410 arch/x86/entry/common.c:263 entry_SYSCALL_64_fastpath+0xbc/0xbe RIP: 0033:0x4461f9 RSP: 002b:00007fdac2b1ecf8 EFLAGS: 00000246 ORIG_RAX: 00000000000000ca RAX: fffffffffffffe00 RBX: 00000000007080c8 RCX: 00000000004461f9 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 00000000007080c8 RBP: 00000000007080a8 R08: 0000000000000000 R09: 0000000000000000
Quoted 8 lines
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000000 R14: 00007fdac2b1f9c0 R15: 00007fdac2b1f700 Code: 00 00 00 00 ad de 49 39 c4 74 6a 48 b8 00 02 00 00 00 00 ad de 48 89 da 48 39 c3 74 74 48 c1 ea 03 48 b8 00 00 00 00 00 fc ff df <80> 3c 02 00 0f 85 92 00 00 00 48 8b 13 48 39 f2 75 66 49 8d 7c RIP: __list_del_entry_valid+0x7e/0x170 lib/list_debug.c:51 RSP: ffff88003bdd6e50 ---[ end trace 30e94b1eec4831c8 ]--- Kernel panic - not syncing: Fatal exception
The bug was caused by dev_release() failing to turn off its gadget_registered flag after unregistering the gadget driver. As a result, when a later user closed the device file before writing a valid set of descriptors, dev_release() thought the gadget had been registered and tried to unregister it, even though it had not been. This led to the NULL pointer dereference.
The fix is simple: turn off the flag when the gadget is unregistered.
--- drivers/usb/gadget/legacy/inode.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/gadget/legacy/inode.c +3 -1
@@ -1183,8 +1183,10 @@ dev_release (struct inode *inode, struct/* closing ep0 === shutdown all */ -if (dev->gadget_registered) +if (dev->gadget_registered) {usb_gadget_unregister_driver (&gadgetfs_driver); + dev->gadget_registered = false; + }/* at this point "good" hardware has disconnected the * device from USB; the host won't see it any more.
Greg Kroah-Hartman
maintainerPATCH 46/60 USB: gadgetfs, dummy-hcd, net2280: fix locking for callbacks
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Stern <[email protected]>
commit f16443a034c7aa359ddf6f0f9bc40d01ca31faea upstream.
Using the syzkaller kernel fuzzer, Andrey Konovalov generated the following error in gadgetfs:
Quoted 101 lines
BUG: KASAN: use-after-free in __lock_acquire+0x3069/0x3690 kernel/locking/lockdep.c:3246 Read of size 8 at addr ffff88003a2bdaf8 by task kworker/3:1/903 CPU: 3 PID: 903 Comm: kworker/3:1 Not tainted 4.12.0-rc4+ #35 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011 Workqueue: usb_hub_wq hub_event Call Trace: __dump_stack lib/dump_stack.c:16 [inline] dump_stack+0x292/0x395 lib/dump_stack.c:52 print_address_description+0x78/0x280 mm/kasan/report.c:252 kasan_report_error mm/kasan/report.c:351 [inline] kasan_report+0x230/0x340 mm/kasan/report.c:408 __asan_report_load8_noabort+0x19/0x20 mm/kasan/report.c:429 __lock_acquire+0x3069/0x3690 kernel/locking/lockdep.c:3246 lock_acquire+0x22d/0x560 kernel/locking/lockdep.c:3855 __raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline] _raw_spin_lock+0x2f/0x40 kernel/locking/spinlock.c:151 spin_lock include/linux/spinlock.h:299 [inline] gadgetfs_suspend+0x89/0x130 drivers/usb/gadget/legacy/inode.c:1682 set_link_state+0x88e/0xae0 drivers/usb/gadget/udc/dummy_hcd.c:455 dummy_hub_control+0xd7e/0x1fb0 drivers/usb/gadget/udc/dummy_hcd.c:2074 rh_call_control drivers/usb/core/hcd.c:689 [inline] rh_urb_enqueue drivers/usb/core/hcd.c:846 [inline] usb_hcd_submit_urb+0x92f/0x20b0 drivers/usb/core/hcd.c:1650 usb_submit_urb+0x8b2/0x12c0 drivers/usb/core/urb.c:542 usb_start_wait_urb+0x148/0x5b0 drivers/usb/core/message.c:56 usb_internal_control_msg drivers/usb/core/message.c:100 [inline] usb_control_msg+0x341/0x4d0 drivers/usb/core/message.c:151 usb_clear_port_feature+0x74/0xa0 drivers/usb/core/hub.c:412 hub_port_disable+0x123/0x510 drivers/usb/core/hub.c:4177 hub_port_init+0x1ed/0x2940 drivers/usb/core/hub.c:4648 hub_port_connect drivers/usb/core/hub.c:4826 [inline] hub_port_connect_change drivers/usb/core/hub.c:4999 [inline] port_event drivers/usb/core/hub.c:5105 [inline] hub_event+0x1ae1/0x3d40 drivers/usb/core/hub.c:5185 process_one_work+0xc08/0x1bd0 kernel/workqueue.c:2097 process_scheduled_works kernel/workqueue.c:2157 [inline] worker_thread+0xb2b/0x1860 kernel/workqueue.c:2233 kthread+0x363/0x440 kernel/kthread.c:231 ret_from_fork+0x2a/0x40 arch/x86/entry/entry_64.S:424 Allocated by task 9958: save_stack_trace+0x1b/0x20 arch/x86/kernel/stacktrace.c:59 save_stack+0x43/0xd0 mm/kasan/kasan.c:513 set_track mm/kasan/kasan.c:525 [inline] kasan_kmalloc+0xad/0xe0 mm/kasan/kasan.c:617 kmem_cache_alloc_trace+0x87/0x280 mm/slub.c:2745 kmalloc include/linux/slab.h:492 [inline] kzalloc include/linux/slab.h:665 [inline] dev_new drivers/usb/gadget/legacy/inode.c:170 [inline] gadgetfs_fill_super+0x24f/0x540 drivers/usb/gadget/legacy/inode.c:1993 mount_single+0xf6/0x160 fs/super.c:1192 gadgetfs_mount+0x31/0x40 drivers/usb/gadget/legacy/inode.c:2019 mount_fs+0x9c/0x2d0 fs/super.c:1223 vfs_kern_mount.part.25+0xcb/0x490 fs/namespace.c:976 vfs_kern_mount fs/namespace.c:2509 [inline] do_new_mount fs/namespace.c:2512 [inline] do_mount+0x41b/0x2d90 fs/namespace.c:2834 SYSC_mount fs/namespace.c:3050 [inline] SyS_mount+0xb0/0x120 fs/namespace.c:3027 entry_SYSCALL_64_fastpath+0x1f/0xbe Freed by task 9960: save_stack_trace+0x1b/0x20 arch/x86/kernel/stacktrace.c:59 save_stack+0x43/0xd0 mm/kasan/kasan.c:513 set_track mm/kasan/kasan.c:525 [inline] kasan_slab_free+0x72/0xc0 mm/kasan/kasan.c:590 slab_free_hook mm/slub.c:1357 [inline] slab_free_freelist_hook mm/slub.c:1379 [inline] slab_free mm/slub.c:2961 [inline] kfree+0xed/0x2b0 mm/slub.c:3882 put_dev+0x124/0x160 drivers/usb/gadget/legacy/inode.c:163 gadgetfs_kill_sb+0x33/0x60 drivers/usb/gadget/legacy/inode.c:2027 deactivate_locked_super+0x8d/0xd0 fs/super.c:309 deactivate_super+0x21e/0x310 fs/super.c:340 cleanup_mnt+0xb7/0x150 fs/namespace.c:1112 __cleanup_mnt+0x1b/0x20 fs/namespace.c:1119 task_work_run+0x1a0/0x280 kernel/task_work.c:116 exit_task_work include/linux/task_work.h:21 [inline] do_exit+0x18a8/0x2820 kernel/exit.c:878 do_group_exit+0x14e/0x420 kernel/exit.c:982 get_signal+0x784/0x1780 kernel/signal.c:2318 do_signal+0xd7/0x2130 arch/x86/kernel/signal.c:808 exit_to_usermode_loop+0x1ac/0x240 arch/x86/entry/common.c:157 prepare_exit_to_usermode arch/x86/entry/common.c:194 [inline] syscall_return_slowpath+0x3ba/0x410 arch/x86/entry/common.c:263 entry_SYSCALL_64_fastpath+0xbc/0xbe The buggy address belongs to the object at ffff88003a2bdae0 which belongs to the cache kmalloc-1024 of size 1024 The buggy address is located 24 bytes inside of 1024-byte region [ffff88003a2bdae0, ffff88003a2bdee0) The buggy address belongs to the page: page:ffffea0000e8ae00 count:1 mapcount:0 mapping: (null) index:0x0 compound_mapcount: 0 flags: 0x100000000008100(slab|head) raw: 0100000000008100 0000000000000000 0000000000000000 0000000100170017 raw: ffffea0000ed3020 ffffea0000f5f820 ffff88003e80efc0 0000000000000000 page dumped because: kasan: bad access detected
Quoted 8 lines
Memory state around the buggy address:
ffff88003a2bd980: fb fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff88003a2bda00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>ffff88003a2bda80: fc fc fc fc fc fc fc fc fc fc fc fc fb fb fb fb
^
ffff88003a2bdb00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff88003a2bdb80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================What this means is that the gadgetfs_suspend() routine was trying to access dev->lock after it had been deallocated. The root cause is a race in the dummy_hcd driver; the dummy_udc_stop() routine can race with the rest of the driver because it contains no locking. And even when proper locking is added, it can still race with the set_link_state() function because that function incorrectly drops the private spinlock before invoking any gadget driver callbacks.
The result of this race, as seen above, is that set_link_state() can invoke a callback in gadgetfs even after gadgetfs has been unbound from dummy_hcd's UDC and its private data structures have been deallocated.
include/linux/usb/gadget.h documents that the ->reset, ->disconnect, ->suspend, and ->resume callbacks may be invoked in interrupt context. In general this is necessary, to prevent races with gadget driver removal. This patch fixes dummy_hcd to retain the spinlock across these calls, and it adds a spinlock acquisition to dummy_udc_stop() to prevent the race.
The net2280 driver makes the same mistake of dropping the private spinlock for its ->disconnect and ->reset callback invocations. The patch fixes it too.
Lastly, since gadgetfs_suspend() may be invoked in interrupt context, it cannot assume that interrupts are enabled when it runs. It must use spin_lock_irqsave() instead of spin_lock_irq(). The patch fixes that bug as well.
--- drivers/usb/gadget/legacy/inode.c | 5 +++-- drivers/usb/gadget/udc/dummy_hcd.c | 13 ++++--------- drivers/usb/gadget/udc/net2280.c | 9 +-------- 3 files changed, 8 insertions(+), 19 deletions(-)
drivers/usb/gadget/legacy/inode.c +3 -2
@@ -1679,9 +1679,10 @@ static void gadgetfs_suspend (struct usb_gadget *gadget) {struct dev_data *dev =get_gadget_data (gadget); +unsigned long flags;INFO (dev,"suspended from state %d\n" , dev->state); -spin_lock (&dev->lock); +spin_lock_irqsave (&dev->lock, flags);switch (dev->state) {case STATE_DEV_SETUP :// VERY odd... host died?? case STATE_DEV_CONNECTED :
@@ -1692,7 +1693,7 @@ gadgetfs_suspend (struct usb_gadget *gaddefault :break ; } -spin_unlock (&dev->lock); +spin_unlock_irqrestore (&dev->lock, flags); }static struct usb_gadget_driver gadgetfs_driver = {
drivers/usb/gadget/udc/dummy_hcd.c +4 -9
@@ -442,23 +442,16 @@ static void set_link_state(struct dummy_/* Report reset and disconnect events to the driver */ if (dum->driver && (disconnect || reset)) {stop_activity (dum); -spin_unlock (&dum->lock);if (reset)usb_gadget_udc_reset (&dum->gadget, dum->driver);else dum->driver->disconnect (&dum->gadget); -spin_lock (&dum->lock); } }else if (dum_hcd->active != dum_hcd->old_active) { -if (dum_hcd->old_active && dum->driver->suspend) { -spin_unlock (&dum->lock); +if (dum_hcd->old_active && dum->driver->suspend) dum->driver->suspend (&dum->gadget); -spin_lock (&dum->lock); - }else if (!dum_hcd->old_active && dum->driver->resume) { -spin_unlock (&dum->lock); +else if (!dum_hcd->old_active && dum->driver->resume) dum->driver->resume (&dum->gadget); -spin_lock (&dum->lock); - } } dum_hcd->old_status = dum_hcd->port_status;
@@ -983,7 +976,9 @@ static int dummy_udc_stop(struct usb_gadstruct dummy_hcd *dum_hcd =gadget_to_dummy_hcd (g);struct dummy *dum = dum_hcd->dum; +spin_lock_irq (&dum->lock); dum->driver =NULL ; +spin_unlock_irq (&dum->lock);return 0 ; }
drivers/usb/gadget/udc/net2280.c +1 -8
@@ -2469,11 +2469,8 @@ static void stop_activity(struct net2280nuke (&dev->ep[i]);/* report disconnect; the driver is already quiesced */ -if (driver) { -spin_unlock (&dev->lock); +if (driver) driver->disconnect (&dev->gadget); -spin_lock (&dev->lock); - }usb_reinit (dev); }
@@ -3347,8 +3344,6 @@ next_endpoints: BIT(PCI_RETRY_ABORT_INTERRUPT))static void handle_stat1_irqs (struct net2280 *dev,u32 stat) -__releases(dev->lock) -__acquires(dev->lock) {struct net2280_ep *ep;u32 tmp, num, mask, scratch;
@@ -3389,14 +3384,12 @@ __acquires(dev->lock)if (disconnect || reset) {stop_activity (dev, dev->driver);ep0_start (dev); -spin_unlock (&dev->lock);if (reset)usb_gadget_udc_reset (&dev->gadget, dev->driver);else (dev->driver->disconnect) (&dev->gadget); -spin_lock (&dev->lock);return ; } }
Greg Kroah-Hartman
maintainerPATCH 47/60 mm/memory-failure.c: use compound_head() flags for huge pages
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Morse <[email protected]>
commit 7258ae5c5a2ce2f5969e8b18b881be40ab55433d upstream.
memory_failure() chooses a recovery action function based on the page flags. For huge pages it uses the tail page flags which don't have anything interesting set, resulting in:
Quoted 2 lines
Memory failure:
0x9be3b4: Unknown page state
Memory failure:0x9be3b4: recovery action for unknown page: Failed
Instead, save a copy of the head page's flags if this is a huge page, this means if there are no relevant flags for this tail page, we use the head pages flags instead. This results in the me_huge_page() recovery action being called:
Quoted 1 line
Memory failure:
0x9b7969: recovery action for huge page: Delayed
For hugepages that have not yet been allocated, this allows the hugepage to be dequeued.
--- mm/memory-failure.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
mm/memory-failure.c +4 -1
@@ -1176,7 +1176,10 @@ int memory_failure(unsigned long pfn, in* page_remove_rmap() in try_to_unmap_one(). So to determine page status * correctly, we save a copy of the page flags at this time. */ - page_flags = p->flags; +if (PageHuge (p)) + page_flags = hpage->flags; +else + page_flags = p->flags;/* * unpoison always clear PG_hwpoison inside page lock
Greg Kroah-Hartman
maintainerPATCH 48/60 swap: cond_resched in swap_cgroup_prepare()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu Zhao <[email protected]>
commit ef70762948dde012146926720b70e79736336764 upstream.
I saw need_resched() warnings when swapping on large swapfile (TBs) because continuously allocating many pages in swap_cgroup_prepare() took too long.
We already cond_resched when freeing page in swap_cgroup_swapoff(). Do the same for the page allocation.
--- mm/swap_cgroup.c | 3 +++ 1 file changed, 3 insertions(+)
mm/swap_cgroup.c +3 -0
@@ -48,6 +48,9 @@ static int swap_cgroup_prepare(int type)if (!page) goto not_enough_page; ctrl->map[idx] = page; + +if (!(idx %SWAP_CLUSTER_MAX )) +cond_resched (); }return 0 ; not_enough_page:
Greg Kroah-Hartman
maintainerPATCH 49/60 iio: imu: inv_mpu6050: add accel lpf setting for chip >= MPU6500
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jean-Baptiste Maneyrol <[email protected]>
commit 948588e25b8af5e66962ed3f53e1cae1656fa5af upstream.
Starting from MPU6500, accelerometer dlpf is set in a separate register named ACCEL_CONFIG_2.
Add this new register in the map and set it for the corresponding chips.
--- drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 39 ++++++++++++++++++++++++++--- drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 ++ 2 files changed, 39 insertions(+), 3 deletions(-)
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +36 -3
@@ -41,6 +41,7 @@ static const int accel_scale[] = {598, 1static const struct inv_mpu6050_reg_map reg_set_6500 = { .sample_rate_div =INV_MPU6050_REG_SAMPLE_RATE_DIV , .lpf =INV_MPU6050_REG_CONFIG , + .accel_lpf =INV_MPU6500_REG_ACCEL_CONFIG_2 , .user_ctrl =INV_MPU6050_REG_USER_CTRL , .fifo_en =INV_MPU6050_REG_FIFO_EN , .gyro_config =INV_MPU6050_REG_GYRO_CONFIG ,
@@ -205,6 +206,37 @@ int inv_mpu6050_set_power_itg(struct invEXPORT_SYMBOL_GPL (inv_mpu6050_set_power_itg);/** +* inv_mpu6050_set_lpf_regs() - set low pass filter registers, chip dependent +* +* MPU60xx/MPU9150 use only 1 register for accelerometer + gyroscope +* MPU6500 and above have a dedicated register for accelerometer +*/ +static int inv_mpu6050_set_lpf_regs (struct inv_mpu6050_state *st, +enum inv_mpu6050_filter_e val) +{ +int result; + + result =regmap_write (st->map, st->reg->lpf, val); +if (result) +return result; + +switch (st->chip_type) { +case INV_MPU6050 : +case INV_MPU6000 : +case INV_MPU9150 : +/* old chips, nothing to do */ + result =0 ; +break ; +default : +/* set accel lpf */ + result =regmap_write (st->map, st->reg->accel_lpf, val); +break ; + } + +return result; +} + +/** * inv_mpu6050_init_config() - Initialize hardware, disable FIFO. * * Initial configuration:
@@ -227,8 +259,7 @@ static int inv_mpu6050_init_config(strucif (result)return result; - d =INV_MPU6050_FILTER_20HZ ; - result =regmap_write (st->map, st->reg->lpf, d); + result =inv_mpu6050_set_lpf_regs (st,INV_MPU6050_FILTER_20HZ );if (result)return result;
@@ -531,6 +562,8 @@ error_write_raw:* would be alising. This function basically search for the * correct low pass parameters based on the fifo rate, e.g, * sampling frequency. +* +* lpf is set automatically when setting sampling rate to avoid any aliases. */ static int inv_mpu6050_set_lpf (struct inv_mpu6050_state *st,int rate) {
@@ -546,7 +579,7 @@ static int inv_mpu6050_set_lpf(struct inwhile ((h < hz[i]) && (i <ARRAY_SIZE (d) -1 )) i++; data = d[i]; - result =regmap_write (st->map, st->reg->lpf, data); + result =inv_mpu6050_set_lpf_regs (st, data);if (result)return result; st->chip_config.lpf = data;
drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h +3 -0
@@ -28,6 +28,7 @@* struct inv_mpu6050_reg_map - Notable registers. * @sample_rate_div: Divider applied to gyro output rate. * @lpf: Configures internal low pass filter. +* @accel_lpf: Configures accelerometer low pass filter. * @user_ctrl: Enables/resets the FIFO. * @fifo_en: Determines which data will appear in FIFO. * @gyro_config: gyro config register.
@@ -47,6 +48,7 @@struct inv_mpu6050_reg_map {u8 sample_rate_div;u8 lpf; +u8 accel_lpf;u8 user_ctrl;u8 fifo_en;u8 gyro_config;
@@ -187,6 +189,7 @@ struct inv_mpu6050_state {#define INV_MPU6050_FIFO_THRESHOLD 500/* mpu6500 registers */ +#define INV_MPU6500_REG_ACCEL_CONFIG_2 0x1D#define INV_MPU6500_REG_ACCEL_OFFSET 0x77/* delay time in milliseconds */
Greg Kroah-Hartman
maintainerPATCH 50/60 sched/core: Idle_task_exit() shouldnt use switch_mm_irqs_off()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Lutomirski <[email protected]>
commit 252d2a4117bc181b287eeddf848863788da733ae upstream.
idle_task_exit() can be called with IRQs on x86 on and therefore should use switch_mm(), not switch_mm_irqs_off().
This doesn't seem to cause any problems right now, but it will confuse my upcoming TLB flush changes. Nonetheless, I think it should be backported because it's trivial. There won't be any meaningful performance impact because idle_task_exit() is only used when offlining a CPU.
--- kernel/sched/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/core.c +1 -1
@@ -5469,7 +5469,7 @@ void idle_task_exit(void)BUG_ON (cpu_online (smp_processor_id ()));if (mm != &init_mm) { -switch_mm_irqs_off (mm, &init_mm, current); +switch_mm (mm, &init_mm, current);finish_arch_post_lock_switch (); }mmdrop (mm);
Greg Kroah-Hartman
maintainerPATCH 51/60 genirq: Release resources in __setup_irq() error path
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
commit fa07ab72cbb0d843429e61bf179308aed6cbe0dd upstream.
In case __irq_set_trigger() fails the resources requested via irq_request_resources() are not released.
Add the missing release call into the error handling path.
--- kernel/irq/manage.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/irq/manage.c +3 -1
@@ -1308,8 +1308,10 @@ __setup_irq(unsigned int irq, struct irq ret =__irq_set_trigger (desc, new->flags &IRQF_TRIGGER_MASK ); -if (ret) +if (ret) { +irq_release_resources (desc); goto out_mask; + } } desc->istate &= ~(IRQS_AUTODETECT | IRQS_SPURIOUS_DISABLED | \
Greg Kroah-Hartman
maintainerPATCH 52/60 alarmtimer: Prevent overflow of relative timers
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit f4781e76f90df7aec400635d73ea4c35ee1d4765 upstream.
Andrey reported a alartimer related RCU stall while fuzzing the kernel with syzkaller.
The reason for this is an overflow in ktime_add() which brings the resulting time into negative space and causes immediate expiry of the timer. The following rearm with a small interval does not bring the timer back into positive space due to the same issue.
This results in a permanent firing alarmtimer which hogs the CPU.
Use ktime_add_safe() instead which detects the overflow and clamps the result to KTIME_SEC_MAX.
--- kernel/time/alarmtimer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/time/alarmtimer.c +3 -3
@@ -354,7 +354,7 @@ void alarm_start_relative(struct alarm * {struct alarm_base *base = &alarm_bases[alarm->type]; - start =ktime_add (start, base->gettime ()); + start =ktime_add_safe (start, base->gettime ());alarm_start (alarm, start); }EXPORT_SYMBOL_GPL (alarm_start_relative);
@@ -440,7 +440,7 @@ u64 alarm_forward(struct alarm *alarm, k overrun++; } - alarm->node.expires =ktime_add (alarm->node.expires, interval); + alarm->node.expires =ktime_add_safe (alarm->node.expires, interval);return overrun; }EXPORT_SYMBOL_GPL (alarm_forward);
@@ -630,7 +630,7 @@ static int alarm_timer_set(struct k_itimktime_t now; now = alarm_bases[timr->it.alarm.alarmtimer.type].gettime (); - exp =ktime_add (now, exp); + exp =ktime_add_safe (now, exp); }alarm_start (&timr->it.alarm.alarmtimer, exp);
Greg Kroah-Hartman
maintainerPATCH 53/60 usb: gadget: composite: Fix function used to free memory
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
commit 990758c53eafe5a220a780ed12e7b4d51b3df032 upstream.
'cdev->os_desc_req' has been allocated with 'usb_ep_alloc_request()' so 'usb_ep_free_request()' should be used to free it.
--- drivers/usb/gadget/composite.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/composite.c +1 -1
@@ -2147,7 +2147,7 @@ int composite_os_desc_req_prepare(struct cdev->os_desc_req->buf =kmalloc (4096 ,GFP_KERNEL );if (!cdev->os_desc_req->buf) { ret = -ENOMEM ; -kfree (cdev->os_desc_req); +usb_ep_free_request (ep0, cdev->os_desc_req); goto end; } cdev->os_desc_req->context = cdev;
Greg Kroah-Hartman
maintainerPATCH 54/60 usb: dwc3: exynos fix axius clock error path to do cleanup
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shuah Khan <[email protected]>
commit 8ae584d1951f241efd45499f8774fd7066f22823 upstream.
Axius clock error path returns without disabling clock and suspend clock. Fix it to disable them before returning error.
--- drivers/usb/dwc3/dwc3-exynos.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/dwc3/dwc3-exynos.c +3 -1
@@ -148,7 +148,8 @@ static int dwc3_exynos_probe(struct plat exynos->axius_clk =devm_clk_get (dev,"usbdrd30_axius_clk" );if (IS_ERR (exynos->axius_clk)) {dev_err (dev,"no AXI UpScaler clk specified\n" ); -return -ENODEV ; + ret = -ENODEV ; + goto axius_clk_err; }clk_prepare_enable (exynos->axius_clk); }else {
@@ -206,6 +207,7 @@ err3:regulator_disable (exynos->vdd33); err2:clk_disable_unprepare (exynos->axius_clk); +axius_clk_err:clk_disable_unprepare (exynos->susp_clk);clk_disable_unprepare (exynos->clk);return ret;
Greg Kroah-Hartman
maintainerPATCH 55/60 MIPS: Fix bnezc/jialc return address calculation
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
commit 1a73d9310e093fc3adffba4d0a67b9fab2ee3f63 upstream.
The code handling the pop76 opcode (ie. bnezc & jialc instructions) in __compute_return_epc_for_insn() needs to set the value of $31 in the jialc case, which is encoded with rs = 0. However its check to differentiate bnezc (rs != 0) from jialc (rs = 0) was unfortunately backwards, meaning that if we emulate a bnezc instruction we clobber $31 & if we emulate a jialc instruction it actually behaves like a jic instruction.
Fix this by inverting the check of rs to match the way the instructions are actually encoded.
Patchwork: https://patchwork.linux-mips.org/patch/16178/
--- arch/mips/kernel/branch.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/mips/kernel/branch.c +3 -1
@@ -804,8 +804,10 @@ int __compute_return_epc_for_insn(struct break; }/* Compact branch: BNEZC || JIALC */ -if (insn.i_format.rs) +if (!insn.i_format.rs) { +/* JIALC: set $31/ra */ regs->regs[31 ] = epc +4 ; + } regs->cp0_epc +=8 ;break ;#endif
Greg Kroah-Hartman
maintainerPATCH 56/60 MIPS: .its targets depend on vmlinux
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
commit bcd7c45e0d5a82be9a64b90050f0e09d41a50758 upstream.
The .its targets require information about the kernel binary, such as its entry point, which is extracted from the vmlinux ELF. We therefore require that the ELF is built before the .its files are generated. Declare this requirement in the Makefile such that make will ensure this is always the case, otherwise in corner cases we can hit issues as the .its is generated with an incorrect (either invalid or stale) entry point.
Patchwork: https://patchwork.linux-mips.org/patch/16179/
--- arch/mips/boot/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/mips/boot/Makefile +5 -5
@@ -128,19 +128,19 @@ quiet_cmd_cpp_its_S = ITS $@ -DADDR_BITS=$(ADDR_BITS) \ -DADDR_CELLS=$(itb_addr_cells) -$(obj)/vmlinux.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S FORCE +$(obj)/vmlinux.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE $(call if_changed_dep,cpp_its_S,none,vmlinux.bin) -$(obj)/vmlinux.gz.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S FORCE +$(obj)/vmlinux.gz.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE $(call if_changed_dep,cpp_its_S,gzip,vmlinux.bin.gz) -$(obj)/vmlinux.bz2.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S FORCE +$(obj)/vmlinux.bz2.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE $(call if_changed_dep,cpp_its_S,bzip2,vmlinux.bin.bz2) -$(obj)/vmlinux.lzma.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S FORCE +$(obj)/vmlinux.lzma.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE $(call if_changed_dep,cpp_its_S,lzma,vmlinux.bin.lzma) -$(obj)/vmlinux.lzo.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S FORCE +$(obj)/vmlinux.lzo.its: $(srctree)/arch/mips/$(PLATFORM)/vmlinux.its.S $(VMLINUX) FORCE $(call if_changed_dep,cpp_its_S,lzo,vmlinux.bin.lzo) quiet_cmd_itb-image = ITB $@
Greg Kroah-Hartman
maintainerPATCH 57/60 vTPM: Fix missing NULL check
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hon Ching \(Vicky\) Lo <[email protected]>
commit 31574d321c70f6d3b40fe98f9b2eafd9a903fef9 upstream.
The current code passes the address of tpm_chip as the argument to dev_get_drvdata() without prior NULL check in tpm_ibmvtpm_get_desired_dma. This resulted an oops during kernel boot when vTPM is enabled in Power partition configured in active memory sharing mode.
The vio_driver's get_desired_dma() is called before the probe(), which for vtpm is tpm_ibmvtpm_probe, and it's this latter function that initializes the driver and set data. Attempting to get data before the probe() caused the problem.
This patch adds a NULL check to the tpm_ibmvtpm_get_desired_dma.
--- drivers/char/tpm/tpm_ibmvtpm.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
drivers/char/tpm/tpm_ibmvtpm.c +11 -6
@@ -295,6 +295,8 @@ static int tpm_ibmvtpm_remove(struct vio }kfree (ibmvtpm); +/* For tpm_ibmvtpm_get_desired_dma */ +dev_set_drvdata (&vdev->dev,NULL );return 0 ; }
@@ -309,13 +311,16 @@ static int tpm_ibmvtpm_remove(struct viostatic unsigned long tpm_ibmvtpm_get_desired_dma (struct vio_dev *vdev) {struct tpm_chip *chip =dev_get_drvdata (&vdev->dev); -struct ibmvtpm_dev *ibmvtpm =dev_get_drvdata (&chip->dev); +struct ibmvtpm_dev *ibmvtpm; -/* ibmvtpm initializes at probe time, so the data we are -* asking for may not be set yet. Estimate that 4K required -* for TCE-mapped buffer in addition to CRQ. -*/ -if (!ibmvtpm) +/* +* ibmvtpm initializes at probe time, so the data we are +* asking for may not be set yet. Estimate that 4K required +* for TCE-mapped buffer in addition to CRQ. +*/ +if (chip) + ibmvtpm =dev_get_drvdata (&chip->dev); +else return CRQ_RES_BUF_SIZE +PAGE_SIZE ;return CRQ_RES_BUF_SIZE + ibmvtpm->rtce_size;
Greg Kroah-Hartman
maintainerPATCH 58/60 crypto: Work around deallocated stack frame reference gcc bug on sparc.
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Miller <[email protected]>
commit d41519a69b35b10af7fda867fb9100df24fdf403 upstream.
On sparc, if we have an alloca() like situation, as is the case with SHASH_DESC_ON_STACK(), we can end up referencing deallocated stack memory. The result can be that the value is clobbered if a trap or interrupt arrives at just the right instruction.
It only occurs if the function ends returning a value from that alloca() area and that value can be placed into the return value register using a single instruction.
For example, in lib/libcrc32c.c:crc32c() we end up with a return sequence like:
return %i7+8
lduw [%o5+16], %o0 ! MEM[(u32 *)__shash_desc.1_10 + 16B],%o5 holds the base of the on-stack area allocated for the shash descriptor. But the return released the stack frame and the register window.
So if an intererupt arrives between 'return' and 'lduw', then the value read at %o5+16 can be corrupted.
Add a data compiler barrier to work around this problem. This is exactly what the gcc fix will end up doing as well, and it absolutely should not change the code generated for other cpus (unless gcc on them has the same bug :-)
With crucial insight from Eric Sandeen.
--- fs/btrfs/hash.c | 5 ++++- fs/f2fs/f2fs.h | 5 ++++- lib/libcrc32c.c | 6 ++++-- 3 files changed, 12 insertions(+), 4 deletions(-)
fs/btrfs/hash.c +4 -1
@@ -38,6 +38,7 @@ u32 btrfs_crc32c(u32 crc, const void *ad {SHASH_DESC_ON_STACK (shash, tfm);u32 *ctx = (u32 *)shash_desc_ctx (shash); +u32 retval;int err; shash->tfm = tfm;
@@ -47,5 +48,7 @@ u32 btrfs_crc32c(u32 crc, const void *ad err =crypto_shash_update (shash, address, length);BUG_ON (err); -return *ctx; + retval = *ctx; +barrier_data (ctx); +return retval; }
fs/f2fs/f2fs.h +4 -1
@@ -948,6 +948,7 @@ static inline u32 f2fs_crc32(struct f2fs {SHASH_DESC_ON_STACK (shash, sbi->s_chksum_driver);u32 *ctx = (u32 *)shash_desc_ctx (shash); +u32 retval;int err; shash->tfm = sbi->s_chksum_driver;
@@ -957,7 +958,9 @@ static inline u32 f2fs_crc32(struct f2fs err =crypto_shash_update (shash, address, length);BUG_ON (err); -return *ctx; + retval = *ctx; +barrier_data (ctx); +return retval; } static inline bool f2fs_crc_valid(struct f2fs_sb_info *sbi, __u32 blk_crc,
lib/libcrc32c.c +4 -2
@@ -43,7 +43,7 @@ static struct crypto_shash *tfm;u32 crc32c (u32 crc,const void *address,unsigned int length) {SHASH_DESC_ON_STACK (shash, tfm); -u32 *ctx = (u32 *)shash_desc_ctx (shash); +u32 ret, *ctx = (u32 *)shash_desc_ctx (shash);int err; shash->tfm = tfm;
@@ -53,7 +53,9 @@ u32 crc32c(u32 crc, const void *address, err =crypto_shash_update (shash, address, length);BUG_ON (err); -return *ctx; + ret = *ctx; +barrier_data (ctx); +return ret; }EXPORT_SYMBOL (crc32c);
Greg Kroah-Hartman
maintainerPATCH 59/60 alarmtimer: Rate limit periodic intervals
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit ff86bf0c65f14346bf2440534f9ba5ac232c39a0 upstream.
The alarmtimer code has another source of potentially rearming itself too fast. Interval timers with a very samll interval have a similar CPU hog effect as the previously fixed overflow issue.
The reason is that alarmtimers do not implement the normal protection against this kind of problem which the other posix timer use:
timer expires -> queue signal -> deliver signal -> rearm timer
This scheme brings the rearming under scheduler control and prevents permanently firing timers which hog the CPU.
Bringing this scheme to the alarm timer code is a major overhaul because it lacks all the necessary mechanisms completely.
So for a quick fix limit the interval to one jiffie. This is not problematic in practice as alarmtimers are usually backed by an RTC for suspend which have 1 second resolution. It could be therefor argued that the resolution of this clock should be set to 1 second in general, but that's outside the scope of this fix.
--- kernel/time/alarmtimer.c | 8 ++++++++ 1 file changed, 8 insertions(+)
kernel/time/alarmtimer.c +8 -0
@@ -624,6 +624,14 @@ static int alarm_timer_set(struct k_itim/* start the timer */ timr->it.alarm.interval =timespec_to_ktime (new_setting->it_interval); + +/* +* Rate limit to the tick as a hot fix to prevent DOS. Will be +* mopped up later. +*/ +if (ktime_to_ns (timr->it.alarm.interval) <TICK_NSEC ) + timr->it.alarm.interval =ktime_set (0 ,TICK_NSEC ); + exp =timespec_to_ktime (new_setting->it_value);/* Convert (if necessary) to absolute time */ if (flags !=TIMER_ABSTIME ) {
Greg Kroah-Hartman
maintainerPATCH 60/60 mm: larger stack guard gap, between vmas
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hugh Dickins <[email protected]>
commit 1be7107fbe18eed3e319a6c3e83c78254b693acb upstream.
Stack guard page is a useful feature to reduce a risk of stack smashing into a different mapping. We have been using a single page gap which is sufficient to prevent having stack adjacent to a different mapping. But this seems to be insufficient in the light of the stack usage in userspace. E.g. glibc uses as large as 64kB alloca() in many commonly used functions. Others use constructs liks gid_t buffer[NGROUPS_MAX] which is 256kB or stack strings with MAX_ARG_STRLEN.
This will become especially dangerous for suid binaries and the default no limit for the stack size limit because those applications can be tricked to consume a large portion of the stack and a single glibc call could jump over the guard page. These attacks are not theoretical, unfortunatelly.
Make those attacks less probable by increasing the stack guard gap to 1MB (on systems with 4k pages; but make it depend on the page size because systems with larger base pages might cap stack allocations in the PAGE_SIZE units) which should cover larger alloca() and VLA stack allocations. It is obviously not a full fix because the problem is somehow inherent, but it should reduce attack space a lot.
One could argue that the gap size should be configurable from userspace, but that can be done later when somebody finds that the new 1MB is wrong for some special case applications. For now, add a kernel command line option (stack_guard_gap) to specify the stack gap size (in page units).
Implementation wise, first delete all the old code for stack guard page:
because although we could get away with accounting one extra page in a stack vma, accounting a larger gap can break userspace - case in point, a program run with "ulimit -S -v 20000" failed when the 1MB gap was counted for RLIMIT_AS; similar problems could come with RLIMIT_MLOCK and strict non-overcommit mode.
Instead of keeping gap inside the stack vma, maintain the stack guard gap as a gap between vmas: using vm_start_gap() in place of vm_start (or vm_end_gap() in place of vm_end if VM_GROWSUP) in just those few places which need to respect the gap - mainly arch_get_unmapped_area(), and and the vma tree's subtree_gap support for that.
--- Documentation/kernel-parameters.txt | 7 + arch/arc/mm/mmap.c | 2 arch/arm/mm/mmap.c | 4 arch/frv/mm/elf-fdpic.c | 2 arch/mips/mm/mmap.c | 2 arch/parisc/kernel/sys_parisc.c | 15 ++- arch/powerpc/mm/hugetlbpage-radix.c | 2 arch/powerpc/mm/mmap.c | 4 arch/powerpc/mm/slice.c | 2 arch/s390/mm/mmap.c | 4 arch/sh/mm/mmap.c | 4 arch/sparc/kernel/sys_sparc_64.c | 4 arch/sparc/mm/hugetlbpage.c | 2 arch/tile/mm/hugetlbpage.c | 2 arch/x86/kernel/sys_x86_64.c | 4 arch/x86/mm/hugetlbpage.c | 2 arch/xtensa/kernel/syscall.c | 2 fs/hugetlbfs/inode.c | 2 fs/proc/task_mmu.c | 4 include/linux/mm.h | 53 ++++++------ mm/gup.c | 5 - mm/memory.c | 38 --------- mm/mmap.c | 149 +++++++++++++++++++++--------------- 23 files changed, 152 insertions(+), 163 deletions(-)
Documentation/kernel-parameters.txt +7 -0
@@ -3932,6 +3932,13 @@ bytes respectively. Such letter suffixes spia_pedr= spia_peddr= + stack_guard_gap= [MM] + override the default stack gap protection. The value + is in page units and it defines how many pages prior + to (for stacks growing down) resp. after (for stacks + growing up) the main stack are reserved for no other + mapping. Default value is 256 pages. + stacktrace [FTRACE] Enabled the stack tracer on boot up.
arch/arc/mm/mmap.c +1 -1
@@ -64,7 +64,7 @@ arch_get_unmapped_area(struct file *filp vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/arm/mm/mmap.c +2 -2
@@ -89,7 +89,7 @@ arch_get_unmapped_area(struct file *filp vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
@@ -140,7 +140,7 @@ arch_get_unmapped_area_topdown(struct fi addr =PAGE_ALIGN (addr); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/frv/mm/elf-fdpic.c +1 -1
@@ -74,7 +74,7 @@ unsigned long arch_get_unmapped_area(str addr =PAGE_ALIGN (addr); vma =find_vma (current->mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma))) goto success; }
arch/mips/mm/mmap.c +1 -1
@@ -92,7 +92,7 @@ static unsigned long arch_get_unmapped_a vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/parisc/kernel/sys_parisc.c +9 -6
@@ -88,7 +88,7 @@ unsigned long arch_get_unmapped_area(str unsigned long len, unsigned long pgoff, unsigned long flags) { struct mm_struct *mm = current->mm; -struct vm_area_struct *vma; +struct vm_area_struct *vma, *prev;unsigned long task_size =TASK_SIZE ;int do_color_align, last_mmap;struct vm_unmapped_area_info info;
@@ -115,9 +115,10 @@ unsigned long arch_get_unmapped_area(strelse addr =PAGE_ALIGN (addr); - vma =find_vma (mm, addr); + vma =find_vma_prev (mm, addr, &prev);if (task_size - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)) && + (!prev || addr >=vm_end_gap (prev))) goto found_addr; }
@@ -141,7 +142,7 @@ arch_get_unmapped_area_topdown(struct fi const unsigned long len, const unsigned long pgoff, const unsigned long flags) { - struct vm_area_struct *vma; + struct vm_area_struct *vma, *prev;struct mm_struct *mm = current->mm;unsigned long addr = addr0;int do_color_align, last_mmap;
@@ -175,9 +176,11 @@ arch_get_unmapped_area_topdown(struct fi addr =COLOR_ALIGN (addr, last_mmap, pgoff); else addr =PAGE_ALIGN (addr); - vma =find_vma (mm, addr); + + vma =find_vma_prev (mm, addr, &prev);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)) && + (!prev || addr >=vm_end_gap (prev))) goto found_addr; }
arch/powerpc/mm/hugetlbpage-radix.c +1 -1
@@ -65,7 +65,7 @@ radix__hugetlb_get_unmapped_area(struct addr =ALIGN (addr,huge_page_size (h)); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }/*
arch/powerpc/mm/mmap.c +2 -2
@@ -106,7 +106,7 @@ radix__arch_get_unmapped_area(struct fil addr =PAGE_ALIGN (addr); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && addr >= mmap_min_addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
@@ -142,7 +142,7 @@ radix__arch_get_unmapped_area_topdown(st addr =PAGE_ALIGN (addr); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && addr >= mmap_min_addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/powerpc/mm/slice.c +1 -1
@@ -105,7 +105,7 @@ static int slice_area_is_free(struct mm_if ((mm->task_size - len) < addr)return 0 ; vma =find_vma (mm, addr); -return (!vma || (addr + len) <= vma->vm_start); +return (!vma || (addr + len) <=vm_start_gap (vma)); }static int slice_low_has_vma (struct mm_struct *mm,unsigned long slice)
arch/s390/mm/mmap.c +2 -2
@@ -98,7 +98,7 @@ arch_get_unmapped_area(struct file *filp addr =PAGE_ALIGN (addr); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && addr >= mmap_min_addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
@@ -136,7 +136,7 @@ arch_get_unmapped_area_topdown(struct fi addr =PAGE_ALIGN (addr); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && addr >= mmap_min_addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/sh/mm/mmap.c +2 -2
@@ -63,7 +63,7 @@ unsigned long arch_get_unmapped_area(str vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
@@ -113,7 +113,7 @@ arch_get_unmapped_area_topdown(struct fi vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/sparc/kernel/sys_sparc_64.c +2 -2
@@ -118,7 +118,7 @@ unsigned long arch_get_unmapped_area(str vma =find_vma (mm, addr);if (task_size - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
@@ -181,7 +181,7 @@ arch_get_unmapped_area_topdown(struct fi vma =find_vma (mm, addr);if (task_size - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/sparc/mm/hugetlbpage.c +1 -1
@@ -116,7 +116,7 @@ hugetlb_get_unmapped_area(struct file *f addr =ALIGN (addr,HPAGE_SIZE ); vma =find_vma (mm, addr);if (task_size - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }if (mm->get_unmapped_area == arch_get_unmapped_area)
arch/tile/mm/hugetlbpage.c +1 -1
@@ -232,7 +232,7 @@ unsigned long hugetlb_get_unmapped_area( addr =ALIGN (addr,huge_page_size (h)); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }if (current->mm->get_unmapped_area == arch_get_unmapped_area)
arch/x86/kernel/sys_x86_64.c +2 -2
@@ -140,7 +140,7 @@ arch_get_unmapped_area(struct file *filp addr =PAGE_ALIGN (addr); vma =find_vma (mm, addr);if (end - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
@@ -183,7 +183,7 @@ arch_get_unmapped_area_topdown(struct fi addr =PAGE_ALIGN (addr); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
arch/x86/mm/hugetlbpage.c +1 -1
@@ -144,7 +144,7 @@ hugetlb_get_unmapped_area(struct file *f addr =ALIGN (addr,huge_page_size (h)); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }if (mm->get_unmapped_area == arch_get_unmapped_area)
arch/xtensa/kernel/syscall.c +1 -1
@@ -87,7 +87,7 @@ unsigned long arch_get_unmapped_area(str/* At this point: (!vmm || addr < vmm->vm_end). */ if (TASK_SIZE - len < addr)return -ENOMEM ; -if (!vmm || addr + len <= vmm->vm_start) +if (!vmm || addr + len <=vm_start_gap (vmm))return addr; addr = vmm->vm_end;if (flags &MAP_SHARED )
fs/hugetlbfs/inode.c +1 -1
@@ -191,7 +191,7 @@ hugetlb_get_unmapped_area(struct file *f addr =ALIGN (addr,huge_page_size (h)); vma =find_vma (mm, addr);if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) + (!vma || addr + len <=vm_start_gap (vma)))return addr; }
fs/proc/task_mmu.c +0 -4
@@ -299,11 +299,7 @@ show_map_vma(struct seq_file *m, struct/* We don't show the stack guard page in /proc/maps */ start = vma->vm_start; -if (stack_guard_page_start (vma, start)) - start +=PAGE_SIZE ; end = vma->vm_end; -if (stack_guard_page_end (vma, end)) - end -=PAGE_SIZE ;seq_setwidth (m,25 +sizeof (void *) *6 -1 ); seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu ",
include/linux/mm.h +25 -28
76 lines not on this page · raw message
mm/gup.c +0 -5
@@ -370,11 +370,6 @@ static int faultin_page(struct task_stru/* mlock all present pages, but do not fault in new pages */ if ((*flags & (FOLL_POPULATE |FOLL_MLOCK )) ==FOLL_MLOCK )return -ENOENT ; -/* For mm_populate(), just skip the stack guard page. */ -if ((*flags &FOLL_POPULATE ) && - (stack_guard_page_start (vma, address) || -stack_guard_page_end (vma, address +PAGE_SIZE ))) -return -ENOENT ;if (*flags &FOLL_WRITE ) fault_flags |=FAULT_FLAG_WRITE ;if (*flags &FOLL_REMOTE )
mm/memory.c +0 -38
@@ -2699,40 +2699,6 @@ out_release: }/* -* This is like a special single-page "expand_{down|up}wards()", -* except we must first make sure that 'address{-|+}PAGE_SIZE' -* doesn't hit another vma. -*/ -static inline int check_stack_guard_page (struct vm_area_struct *vma,unsigned long address) -{ - address &=PAGE_MASK ; -if ((vma->vm_flags &VM_GROWSDOWN ) && address == vma->vm_start) { -struct vm_area_struct *prev = vma->vm_prev; - -/* -* Is there a mapping abutting this one below? -* -* That's only ok if it's the same stack mapping -* that has gotten split.. -*/ -if (prev && prev->vm_end == address) -return prev->vm_flags &VM_GROWSDOWN ?0 : -ENOMEM ; - -return expand_downwards (vma, address -PAGE_SIZE ); - } -if ((vma->vm_flags &VM_GROWSUP ) && address +PAGE_SIZE == vma->vm_end) { -struct vm_area_struct *next = vma->vm_next; - -/* As VM_GROWSDOWN but s/below/above/ */ -if (next && next->vm_start == address +PAGE_SIZE ) -return next->vm_flags &VM_GROWSUP ?0 : -ENOMEM ; - -return expand_upwards (vma, address +PAGE_SIZE ); - } -return 0 ; -} - -/* * We enter with non-exclusive mmap_sem (to exclude vma changes, * but allow concurrent faults), and pte mapped but not yet locked. * We return with mmap_sem still held, but pte unmapped and unlocked.
@@ -2748,10 +2714,6 @@ static int do_anonymous_page(struct faulif (vma->vm_flags &VM_SHARED )return VM_FAULT_SIGBUS ; -/* Check if we need to add a guard page to the stack */ -if (check_stack_guard_page (vma, fe->address) <0 ) -return VM_FAULT_SIGSEGV ; -/* * Use pte_alloc() instead of pte_alloc_map(). We can't run * pte_offset_map() on pmds where a huge pmd might be created
mm/mmap.c +89 -60
321 lines not on this page · raw message
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.34 release. There are 60 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 Wed Jun 21 15:16:33 UTC 2017. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 122 pass: 122 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Hi Greg,
Quoted 11 lines · Guenter Roeck
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.34 release. There are 60 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 Wed Jun 21 15:16:33 UTC 2017. Anything received after that time might be too late.
Quoted 8 lines
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 122 pass: 122 fail: 0Details are available at http://kerneltests.org/builders.
Guenter
With arm64 defconfig, build and basic boot tested ok on hikey.
Best regards,
Sumit.